buzztard-0.6.0/0000755042355400116100000000000011675570702010403 500000000000000buzztard-0.6.0/TODO0000644042355400116100000001076511642666170011023 00000000000000$Id: TODO 3669 2011-10-04 20:28:40Z ensonic $ * run 'make todo' to get a list of todo comments from source * when releasing do: * make check * cd po;intltool-update -M * make dist * new tests * load songs and lookup the parts (e.g. bt_machine_get_pattern_by_id) * add test for trigger params * for ui tests we should have the main-loop under our control: * check g_main_context_set_poll_func()g_main_context_set_poll_func * or really *run* the main-loop (not just iterate) * new stats * http://www.chris-lott.org/resources/cmetrics/cyclo-2.0.tar.gz mcstrip tools.c | cyclo -c | sort -k2 -n * quality checks for file in src/lib/core/*.c; do gtkdoc-depscan -v --book gstreamer-0.10:0.10.8 $file; done * check translation markup podebug --rewrite=xxx buzztard.pot aa.po LC_ALL=aa ./buzztard-edit - this creates a translation with all strings wrapped by 'xxx' (Help -> xxxHelpxxx) - it is easy to see what is not marked for translation * sparse make CC=cgcc * design issues * sim syn uses a string property for notes * these cannot be interpolated, we could use a uint like buzz or an enum * controller api * allow to modify interpolation control sequence inplace (scale time or value range) - we need a gst_interpolation_control_foreach(cs, callback, user_data) - the callback will be called for each controlpoint and can change the timestamp and/or value - need a way to do it without exposing GstControlPoint internals - void callback(GstClockTime *timestamp, GValue *value, gpointer user_data); * or have a BtPatternControlSource - then we never need to update the timeline controller - the individual instances should be relative lightweight and use a central controller for some global state - we want to pre-cache the tracks for each machine to speed up finding the patterns that apply at a given time * special patterns - break works as in breaking patterns - mute, solo, bypass don't work at all - the mute-pattern wold need to control the mute-parameter of a machines output-volume (input-volume for master) - solo would be interpreted as mute on all other generators - bypass would need a (controlable) gobject property - break would need to be able to undo mute, solo, bypass - for now we would need to handle the special patterns in bt_sequence_repair_global_damage_entry - we could see if we can make BtMachine::state controlable - we would need a pad-probe to call gst_object_sync() - break would set the BtMachine::state=NORMAL - we need to avoid setting the song to unsaved when controlling BtMachine::state - in sequence.c we need to do handle intern_damage (like global_damage) and we need BtMachine::bt_machine_intern_controller_change_value() * undo/redo/journaling - links http://www.buzztard.org/index.php/Undo,_redo http://www.buzztard.org/index.php/Song_autosaving - we do that on the ui level (also the journalling and the replay of it) - singleton journal object - each undo/redo capabale object registeres with its name there - on replay we can take the prefix og the entry and dispatch - on journalling we can probably add the prefix - it is a stack of journal entries - pending parts that need undo/redo - machine view - machine/wire parameters - wavetable view - info view * CPU load per machine - as we alway plug the tee-elements on each machine and each wire starts with a queue we could do CPU load per thread - sources start their own thread - effects and the sink live in the thread of one of the incomming wires - a hackish way would be to run a pad_probe before the machine and send a message to the bus with the thread-id<->machine association - ideally we show it on the machine view - bar under machine name? - extra dialog from tools menu? - enable/disable from the view menu * Allow disabling level-meters - we could iterator over machine, check which levels are activated and set the 'message' property true/false - this could be api on song/setup - the recorder would use it for extra speed - on slow platforms we could offer that in the UI (where) - the view menu? * eventually merge machine-rename dialog with machine properties * improve recording dialogs - either integrate the progress bar into the recording settings - gray out the dialog or progress-bar area depending on phase - or use a notebook with hidden pages - switch to 2nd page for rendering buzztard-0.6.0/docs/0000755042355400116100000000000011675570700011331 500000000000000buzztard-0.6.0/docs/Makefile.in0000644042355400116100000005216611675570633013335 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/version.entities.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.entities CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = help reference BUILT_SOURCES = version.entities EXTRA_DIST = version.entities.in \ buzztard.xsd all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .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 docs/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): version.entities: $(top_builddir)/config.status $(srcdir)/version.entities.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile all-local installdirs: installdirs-recursive installdirs-am: install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local check check-am clean clean-generic \ clean-libtool ctags ctags-recursive distclean \ distclean-generic distclean-libtool distclean-tags 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 installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # this is a hack to make sure gtkdoc find the file during "out of source build" all-local: @if test "$(top_srcdir)" != "$(top_builddir)"; then \ chmod u+w $(srcdir); \ cp version.entities $(srcdir)/; \ fi; # 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: buzztard-0.6.0/docs/help/0000755042355400116100000000000011675570700012261 500000000000000buzztard-0.6.0/docs/help/Makefile.in0000644042355400116100000005067111675570633014264 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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/help DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = bt-edit all: all-recursive .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 docs/help/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/help/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # 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: buzztard-0.6.0/docs/help/bt-edit/0000755042355400116100000000000011675570700013611 500000000000000buzztard-0.6.0/docs/help/bt-edit/Makefile.in0000644042355400116100000005243011675570633015607 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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/help/bt-edit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = C DOC_MODULE = buzztard-edit EXTRA_DIST = C/aspell.pws all: all-recursive .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 docs/help/bt-edit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/help/bt-edit/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-local check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am check-local clean clean-generic \ clean-libtool ctags ctags-recursive distclean \ distclean-generic distclean-libtool distclean-tags 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 installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am @WITH_ASPELL_TRUE@check-local: @WITH_ASPELL_TRUE@ @echo "Spellchecking C/$(DOC_MODULE).xml..." @WITH_ASPELL_TRUE@ @if test 0 -ne `cat $(srcdir)/C/$(DOC_MODULE).xml | aspell list --lang=en_US -p $(PWD)/$(srcdir)/C/aspell.pws --mode=sgml | wc -l`; then \ @WITH_ASPELL_TRUE@ echo; \ @WITH_ASPELL_TRUE@ echo "C/$(DOC_MODULE).xml doesn't pass spellchecking, please fix with" >&2; \ @WITH_ASPELL_TRUE@ echo " aspell check --lang=en_US -p ./C/aspell.pws --mode=sgml C/$(DOC_MODULE).xml" >&2; \ @WITH_ASPELL_TRUE@ echo; \ @WITH_ASPELL_TRUE@ false; \ @WITH_ASPELL_TRUE@ else \ @WITH_ASPELL_TRUE@ echo " done"; \ @WITH_ASPELL_TRUE@ fi @WITH_ASPELL_FALSE@check-local: @WITH_ASPELL_FALSE@ @echo "Aspell is needed for 'make check'" # 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: buzztard-0.6.0/docs/help/bt-edit/C/0000755042355400116100000000000011675570700013773 500000000000000buzztard-0.6.0/docs/help/bt-edit/C/buzztard-edit-C.omf0000644042355400116100000000220011675570642017365 00000000000000 buzztard-devel@lists.sourceforge.net (buzztard developer team) Buzztard Music Editor 2011-12-25 User manual for the buzztard music editor user's guide buzztard-0.6.0/docs/help/bt-edit/C/figures/0000755042355400116100000000000011675570700015437 500000000000000buzztard-0.6.0/docs/help/bt-edit/C/figures/preset-properties.png0000644042355400116100000001216511675570700021566 00000000000000‰PNG  IHDRÔr¤ùh¼î¾_wß/òrAåelû]®ÙØuØX`Ï×ï0çž{ÎÙ»»¿svï½ûƒÿH?ô¯|D(`ú|ÏŸ?Ÿžžžœœœ˜˜!"ò!àH€ €6€$¿áC7ôÇ@Ñårõ÷÷÷ôôØív‘@T °<@ ù °EgàŒ±œN'†Öjµ2™L@DäCÀlH~Ãf/†Î4Mc\>ŸÏf³k‰ˆ|x `€ àBÉoø¶<0¢(ªµµµ¾¾¾¢¢¢ˆˆÈ‡€ *Ø ü†ä"„d ®Y,Vnnn&‘@T °<@ ù –-˜<"…#g jÂbƒ˜Ø›£æ”–––““T °<@ ù ²5Ò6øE"G8Ô†ÄkÖ»æþ€ €6€$¿áÃRaKDQ¤sÕ€?Câ5ë·çþÿ€ €6€$ñ šÀG0øˆfŸÉh7lƒ•xl3ø|ZgÖ54×-ÈÌÌ>–yx9}2ûXAI¶TMYœŸ·‰ZŽžŠÊe¼R“M¼Ì®¾p2/!¯ø¬½ÛNàóâzÎÍØú\]³Ïfˆ—×3Ϧy²¦¸ôpGƒÀçÅuì¯âNp¸\.¥R¹”'L´t ÕÍ1©½¾—Âg0JKKWæ-^ø|ÓÏh3ê-z½Y¯3éP`*±˜§Í4Œ³‰]ØÄ_f—§%ìînÑcߪiƒÀw½êzBrB|b|è¾ÐôÌt¥V©Ð*r r#"#öº?ûb¶ŠV•^+M>–r<¥ðR!vÅÆÇ $×Ìk>züè±Ôcwšï0¤øVA¾¢â¢w·½{íÆµV~+hã¶s¹mÜ‹ù›Û›kêjöìÝÓÂoÉÉËÙ½wwmCíá¨Ã¡‡Ö7Ö'&'²®±€éÖv ›ÓÊ).-PßêhãÀ—œ’¬5hQF<F(ˆe⊪ŠÓçNÿýÝ¿£ð9¹õ|ÎyT"¡´ñ¼OÂ>9{ÄÕÔÖøVG>€Å”øøB>pÌÉϹQs#dw_^a ÿe>S|-¼–È#‘uu wÙ„¾ÕÑÆï\ö¹ùð•W–gfeRr HýkÇ¿ø<Ì͇O,£ ”•:e§I¦–øVG¾Ë%—/\¼À”’8mœ¶Ž6,/bâbââ¶m߆šÜÂÜ¢B4˜_()+Á²Ñ ,Y¾8ó’5ou´AàC®ôD,У3é0¥£ÖX@tˆ;P#×ÈwJ_@´CAkÔò„<ðŠšùÃøVT¾2oEEà[|ccc‡ceÞ‚àïe¾Å­Í8àì3M<}D¼¼~üt¬YT›qˆœÕâÝÒŽ’ÒsbN&/³ SNfUÙ»m>/6ÚŒ”Bt³©²êV9ñòºúVySK½Þª·8Í>/6;̧ÅÚe%^;­x…aŸwlüïdÎy!^f[õF»Ñ×+ìðéÌ:vûëRAqñòº°¸°¬²L®‘“ ˆ¼»CÒqåêµVmsØì;ñ2Új·v;®×\'«]ïæò¹å•åSSSKyªDþjbbâRé%g¯“Àç >·¢ªbfffe^ü`×äÔdQIQ×Ý.ß‹sñ |«&ß·ÉDå7Ê |«¦µ ŸÖ¨UëÕžP„‚šV£†¹Æ{a­Òu:“N¥Sa“i¦1hÐ i3(3—­F^{®'ro4J´©m¨ŽÆ¦ç2"ߊjÂ' '3"£#KÊJÀ€`]cÅÆÇFDFܼuÜK;–x41üPxRJRÖ鬰añ‰ñ”‚b•³Py$òô¹ÓŸG|þÙçŸ5óšÁÓmîíä”døfýMÚDsÛ¸{÷íKŒÛ÷ñ¾ðˆpv ûÀÁ}ó¯ÃJURß*h—›]][ÝÖÑVzµíjÅÕ//} &ê›êS3RÌŽÄI>–Ìiåì Ý“˜œØÖÙöégŸ6Üi(*.Úº$²Oö‚™§2 ‹ ZÅå’ËhÖ!êÀ˜­üV°øö;o_»~ ÃO?~¥ì ºÇ&ÄêÍßNû|+ªµ¢âV'Õé©@•_U¢€4zèð!SõUB % ¦¹³çoݾøNž:‰úÂK…ç²Ï¡€šü/ó;Å;wíŽû?ݲ'¤¢²ð!ÔcÓ7çÓ£&>)žÌùVMk>D ‘Tä©FÈ• |¡‡Ê5r5sóá;{á¬iîªæB ¦Àñ’Ú;ÛÁ4r:¦z@ Ù™ß_BRoÕ´áƒ Š ÙW׫¯cÝ€ysm§)üópL_s%Ñøäjyn~.²­D)©¬©‹áC²ŽKˆSjÉ‚c•´Fák´cI80QÃ$ ‹Ù¼Â<äbÀük°Rާ€´\PÀ%·Àý (])ò±˜EVÅ ç³ÏK•RL“Ž&1‡IaYyb-iÝs9oEµFáCìÁ:@,w_ ÄÔ¨iµH&BÜb>|Qhˆˆ‹ îÏYh÷4^3¿€½…D,3óšÁƒÊT2 è¹coEµFá[#&ð­¨|¾€‰À÷2·t¶”]/[âoù+׈«¸¬˜œÕâÝRµ´¢ºâVÓ-n+—xy_um5§CnîÓX—`‚…ñ²kD‹ÃB®áðnæò‹ÓB¼B&¯EøˆfqÀLà#˜ |Ä38`&ðÌAŸÑf\GøËEà[ë­zµA-ÕH¥êuc%í>ãuñ'´«AE«$J ¥ Ö…q¨JrÁåÒÁŸÁfPhx; ƒÙn^6Z8f­Qkë¶Í‡õ2µLª’Úö®Þ®ua{—]¡Qà˜çÿêX°À§3éðŸÏâ´8{]w»Ö…q¨¶. óá£M´X&~0üõó¯ÿóßÿ¬ ãPGÇF™_ .ø4F žyß`_àï”è{ú{yâ|ø ßì³ÙçëJàOª”b¶Œð‰•â¾¡ï Ÿç rd ™Z.QH)·%Z£neáð ß³gϾö¦g³³ƒ2™ %¥-*ŠqgRR?E¡ÞkûUø vø¾÷y&÷É/µ^CÉ%r5¦/r1 ÅŠž â+ò‰d"D¾g‹433}W hÿðCSHH÷n‡…™wîä½÷Þ]AçÌôÔâ.«&ðÄð)Äwï~¿Óð~K”îɲR§¢äî°'”R")…(èiƒ¥4Æc½“6бwÛ™MÚBkMZ¿ÎÝz |3³3 =3Ý'ñ>üкkWÏöíÖ×_·¼öšuË–î­[-ÿügû޽àofši<5=ewØy|^§ ³¯¿oú›úÿßJ•òáØÃÅõøßìð1[,Ý&÷5o¹N±™Z!”ˆaD„ø˜f•„ÍcwH:°>PéT*½ KTAÃng 4 Í4Àh3zNn[Š_pYàA'bž}÷îž;m©©–;̯¾j}ï½î¬¬ž÷ß·lÛÖöíw)1ZNNO „‚²«e¥¬Ò¬¬,‡ÓÁÔOŒáßãñÉ©IÔ`sâÉj?bj¦f¦PéiO²³Ùöº:ûáÃýl¶K"±‡„ØÞzKýÎ;Ò çÑÒÑåÈËÏSkÔ  ‹ÐÚúZøéÔS•ZuúÌé#ÑG’&SRêñÄã„Ä„‚‚èèèȨHÄHÐÙÕÓu!ûBƉ ¡Hˆ.=¬®©NMM½QycèÞÄÇÇ[l–Ç#øI”’à…¯w wé]h³^¢”‰d¦w JMkœÎHëÍz‹ÝbsÚøÐa´9zž`‰ÇRè:“ðaÝÐ&hC™aÈ× ½^í>©yïô| 3O˜vï¶½ñ†;à…‡÷ÊdCÝÝÃ4팋£_}U¿e‹nëVñ§ÐRL‰‹‹‹Ç¹;NM"h3ümhlŠ…=w{*®W¤¦¥"Ú}ðÁ¹y¹½w{Ù6ˆDÀc±X2¹L£Õ 1‚"%¡»‘¸%R ·™‹š¸ø8‹Õ²àØ`üo nøúý€O¡UòEs«Z„>¹T)j Ðh5Y•NÍüb4ÈH€Œéˆ‡M™Z†€WÏ©…b¹˜RRžK7°C÷  y2ùd¾'2^À÷§?Yß@.Õë­!!š?þQó‡?hÞxCt* -[Û[ÿ]ôodO¦£¾'Q@Sª•ˆaGSŽ"þa3,,Ìh6b—Áh@|ððr yq-Ñ>)9 »Ð%..Îd1-86üIA ¦PKÿ^yS:Á\’Ë¥…Ìß֨ÓtX‚¼¸ÿFÆóŒÖo;vPZƒÑ®¦±˜ÚºlB™¯»û{ ¾ÛEšö ŸP*|òô‰{î5ÏéÆ> òuk_CÃ=¥²¿¤dÜh|$iß|“úéOU¿ùàd&Z"¥>0Ät4˜ "±)øFÕS_œšõ õ1±1÷Gïüìàà½A´Ñéu˜Ì<I9–âéŸÏ>ÏiæèzÐiwÚ1ù‹Å€ Ž=¨áCà t©¶h‹^®Q`mþÂÈÂ"9%VH$*©’V3´Ô™uXjȵræ7OêùÖ¿wÚîàAv£Z¯‘Ô°½Œæ>$Jà2ߢ³gdo½å|í5ÓŸÿÜ“Ÿo UmÚdÛ·o¨´TþûßËö3ñ¦M‚SYhéìv^̽x‡s§·¯íD扦;M ¡‹×ÁÃ^Ì£ŽD ß>xðàÀкhtäS´))-j6» óÅÆÛÜ.pÔôR™5111´ž^pl0‚+¥ ‚>¼‹îŸòÇ´û~©ªNJÐÚÑÝw„™»S/€c~[vcj¢‘|›;š±æEC´ÃÓ5ƒèÅ´ÁÔ¯¾§×RŒAٽ‡ó`ìÁ|w©ä­{÷hÿòÛ¯­þÕ¯$¯¼"ú᯼"þå/å?ÿ¹bÓ¦Ûo¾iéä¡åý‡÷ÅRqöÅì´ô´ôŒô¢ËEXŠ ?®úª "‡ÆÄÅ Š8„]è¢Ö©Q92:‚Ž™Y™˜VÕT¡‹½ËŽÌ‹M Åiá #;kõÚÇ〃>ÀáæÀŸßm¢-4R'ú"±‚?LãÜŸ¤Ð*„4ø+QK`´m̽ˆTz•û$«Áýýl·Íó+P˜öùõ#[ön»WøÁè£Q××wi”Í»C”¯o1nÞ¬úÉOä?þ±ôG?RüâÒÍ›oo}ÇÌk½724à ä”@,`7³oÖݬk¨kã· )¡Õiíê3˜ ˜0)Ì0 Éjºwÿ è…e ƒÃƒ‹AoÒ£1ó 8HІ >èÄ&:¢ñâcÅÜ7¨áO~Ø<`¢Ur­B®‘…„5Ø…6(´t¶pùÜFDÜšËÝßȽt\ds¯ð!– -0ȰIÅœ];y¿ûè·¿b’·ys;bÞöm¦ŽöA×Ú€•ÔôÔ„¤„FÜZ<à2úþØý †4 Pùm“ÛÌ}ñÝÏô¢†Ù D3|}#ìÆ÷{<â7Æ Þ+|È€ý÷ú½Úª”J¯±ÄW.1–”•Xdâþ¡>_íWÇÈÑbYÇ÷Ò‘I».ŒCsÈæ N©rÃG ãzzבqÀ"©ˆ¹ibpÁ‡(B))ÌÕLÓªÝ#âÿ´û»“«Ý…çó™i,8ôf}ÿP?ÞQ¤Úµn× “B¶ç. Aóñ¦k$0rÙ7sœ Ééß9“ÙfÄÁ‰,†¥Ãº0f{©Ogñ…)>ØòÍiÌÝ}ÝëÂÌÉÌ Èóð‡‚†)Ôº0ìõ’¨Ÿ¿'³¬)üÕ[Qo|øˆ×¬ |Ä38`&ðÌ+ÆÅèoù(`Z6øFGGív»L&c³Ù¹¹¹iii»ˆˆ|x `€ àBÉoøÆÆÆzzz´Z-ŸÏ¯¯¯g±X999:ŠˆÈ‡€ *Ø ü†o||¼¿¿aü¶¶¶"ŠbP@IDäCÀlH~Ã711ár¹œN'MÓEa8àŒpZDDäCÀlZâ’}¾ÉÉIdk‹´2)y-‘@T °<@ ù ßôô4&–*#„"…c\‘@T °<@ ù ßìì,˜EgÀ‹à‰±0yÎ&""€¨`x€@ò¾çÏŸ£°E¤m „e F!"ò!àH€ €6€$¿á#"ZMøˆ&QÀDà# ˜|D(`"ðL>¢€‰ÀG0øˆ&QÀDà# ˜þ¢4$>vIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/main-window.png0000644042355400116100000011005511675570700020320 00000000000000‰PNG  IHDRxâôà&Õ IDATxœì½\“Y¾ÿîï÷»—hön;»wûl›™-StvtFÅŽAcEÐ¥Kï=zï½ÒH½WiRËØ MÅ2»{÷þÿŸ‡G²Q40ã<ÇÏ+¯“óœçœï)ù¾Ï7 ‘öÿQ‰JT¢•¨D%¥%Úr@%*Q‰JT¢Òëœ(ÐR‰JT¢•¨¤ÄD–JT¢•¨D%%¦¯€öŸÿüçßÿþ÷/¿üòÑ£GSSS÷îÝ›œœ¿C%*Q‰JT¢Ò·8…"°8‘%p h.´¸ ÷£!´xëÖ­«W¯^ºtéܹsT¢•¨D%*}‹P ‹€# P—€æ‚A Dãf m?Mwww·µµÕS‰JT¢•¨ô-N@!€,Ž@$@ \š -ø P£  »··íÖÔÔH¥Ò"*Q‰JT¢•¾Å (EÀˆ(K@sÁ ššBP \£¡æææŠŠ >ŸŸ••G%*Q‰JT¢Ò·8…"°8‘%p h.´„Ai„Æ€6šÃSSSÃÃý©D%*Q‰JTú' @G  .̓vrròÒ¥KÝÝÝn4ú>•¨D%*Q‰Jßâd9ÜÝݹ\.°8‘%p h.´ãããçΫ¥R)Âd|¹H%*Q‰JT¢Òr¦ƒÓÉÌÌ ¬G  .̓öÎ;‡ëëëÇÅÅ!X^î>#}ðÁËm•¨D%*QéÛ’6M'°q-°8‘%p h¾ž }šµýë_)âR‰JT¢•”–´`Û–-[¸\nØL X»v­®®.“ÉÄ¥cÇŽÉù· ~òÉ'~~~òfÑTlçÈ‘#dGUSSsvvþðÃ_Ø,î500€…L'”¬ZµÊÐÐÅb¡Å™úÌ^äÓêââ‚§($m~^òŒÝÊÊ Ã™mÏó,ÄS ŒkAv*Ú3»ÓÙ-SG*Q‰J_·¿doo/‡…§§§††Æ3}æü‘4·¯[Ђ©B¡Ðd&Züñž={6oÞŒKÑÑѨ÷½fÍšO?ýô£>š³Fõë××ÕÕ™™™É[Þ°aÊW¯^½v:EFF’…{÷îÕÔÔ”Éd˜\´ÿ–=<<Œ?˜IÚÚÚááá:::hg¶©@8HL¢kdÔÕÕ_HtÅi155õòò †ÍØ(!ãot±nÝ:´fñ(·³‡©“H$èuä—Èã<Â$”à‘œ Ò0>Ÿ¿mÛ6²æ<ã{Òù„—””-ºè–B¶ŒBƒrLYí…íS‰JT¢’²||b-x3ssóØØXp —H·)wYpË111¤#ý*À³‘í CD~œð3™² o“4}ªÐ××÷øñãrЄ)))§|Ts'¹ßW,Äøò¤¤¤ôôôÊÊJLëþýûƒ‚‚¢¢¢.]º„úûöí›»YƒŽœë÷§ÃYWWW¬Í¡C‡Ÿ2u•"ØÅœ6…ÁrŒt¡ýò±#aQ333OlXB77·ÜÜ\±X¯§§ûI{°¨8Ž8qsŽÙÎÊÊÂ-8…aà¸1##ðÎËË;pàö‰‰‰©©©8£a $X„æ˜üVqÂ?ûì3؃±q1R9h±¦0½c'À€§–†JT¢•–%É}ÔûÓîÞî> ~NP„ÅS‘HÄáprrr\\\àŠAx~²[¸ iiiv~~>ò³{\žˆ¶¡¡á©7xINÂPaãÆFFF@Ú|æ~¿­­ ±¦bËÛ·oVµ´´€–®®.yàBÀù„qdȈ)°‘ߺu+bM4ûLS>ŒšNNNúúú¯±<`Xhh(ÀùÂ^È£vV bFÉi½°<ØQaa!ò‰Æ;vÀ ¬ßéÓ§yà ;;;GGG†j»víÂê >ŽZ°%h¦’ ÅÌ Nã43Ðbz‹‹‹ÉÆúÖÔÔÀZ„û˜^X‹á[XXÈŽÊUUUØ—0CC…ù¬#•¨D%*)5)‚öýi÷KzZÒ¢ÞÚÚ¸e¸V6›M~´W&ˆÞŸÁ _‡r¸}’2³{\þ·ŽÉhO´85ˆ¦æ1‚¹NÜóÞ:†—GËû€Iä]<3ü£ñ½{÷úùù!tÃŒ¥äÁg¶©îîî˜JˆÁé=~'OžœÏÔh°··í¥ha+FN ¶–™äkGGƈE ~£†a ¯“ëâF• ‹q8e¥R)8ãqj“¿=€6a6ΈõAßy¾¯ {Èwà‘°#+**`dRRº€åXVĵ(!71*ûûûã4³fÍô`Þ|º •¨D%¥¦§"Ú÷g„ ±ü®–••!ƃ[†Û$ßI†_EÔ«øÖ#y×¾}ûZÄ6 Lvvö×´ï?ç­cEÐ’oœÂûo›NóüÂÎ3Ù ÐNà¢,´H˜h___Ì2&” ÁŸg*莱ÇÇÇ[YY!“––(Îch•ÑÎGh„üÄ—œ–Í›7£AÀûóÏ?'%€1ZNHH8pà†S^^N¾m‹xÃxØ#Gޏºº’ EûØ dwä§€%ÖÈÖÖö…G2Í~ëX… ˆhÉÐÐÐobò[h³‡8ãšçlS‰JT¢’òÒS-œ<$<‹ÅŠŠŠ‚‡'ý0¼%ÜrFFÜ)êÁÑÉù…DSä]…šš*c@‹Q9;;ƒ‘À°¡­­=Ÿ¹#ý>Üú‡3‰|§6lß¾g“öövyë֭ñ·Ì?¨522JIIÃÈo6=ÏTj@t‰D‚9MMM•Édó´ŽiÁB&''ch³±±%0ãB( vb1S§Na 1.©`<ìÉËËÃ;vì›ÉϘ^cáXB“oð¢Mš åîÝ»÷-vÛ‰'ŒAS̸®øÖ1"]tGNÅ|>¨¦•¨D%e'´ð~äGuÀ'"¦`ÜÜÜ4550Àáãn¹¹¹Á PB~ÿæðáîà`þÖÔÔÀ‚ ðÆðó¸?¼ü %Ãmt†H‹tërçŽðËÐм„ÁÃïãvc“Ÿ;æHhŒÁŒþtÂÄíÝ»“¨§§G¾‹‹˜OÞ¨ªÁHLÜ [&H"##1›äÓç™ Òc©ðtãÆ...ä’̧‹9¦C ÌÏÏV.”àÒž={***,,,ȱWWWƒ»¨ƒq ¯½½}ÎtÂ!+44ü#‡D~F #Éw›±öèhî¯F“&‘öÈ'¼  í`¤0­؈¹å-´8Íÿ¥ùNø בJT¢•”HÐ’x"‘ÈÔÔ>>Š ¨à·]]]áºá3ÄNˆ[¨¬]»ž N·$&&¿Á’_¹Å](AdÅf³g÷¸Ô-ù=.@º ÌÀ§c¨ä_¬ÂY#`ÂùCçŸ÷à|ammm§b¢A±`€GÅ.È)“¿•:GˈÉH;1ƒ2˜/p÷™¦’áa-‘ùì³Ïæó׺sO ùÇBèC@_ä·ÌqìB˜‹Bò/jpøB§xJöH~‡ £ÆêÂ0ÒTô‚òšHR’_aÇœà®Î3‚uÌùåp$¯æææä¡ tM¾C oá/V=¢]SÞC%*Qéëà‹àK·Í$8Iò³3Ò’n“ü;I—¥•¨ôz§U«Vmß¾ýرc‡^¿~ý3}2Z*Q‰JT¢•”˜”Z k KkKJ”(Q¢DéÛ&R:hù¥|L@‰%J”(}ÛBJ­ L@‰%J”(}kµ – )Q¢Dé›%„#éé©y©”(Í­lÍa#oéo`ì®g¶Eïz¾úÈØqØlg]›@C;”±ÛsØö!lk3w=‡öIôè¡gí«ÌIXè¬khèˆ|°‘©óa'Û øXºë9‡°]У‡ž¯>2.¶…³®S ¡kÛ9ØÈÂù°+‡íÂvô7°q×saC¶z޾ú!lÛÊY×-Ðy÷`#+çÞ¶ñ7°w×óaCz.¾ú>Èsضκž†È{Ù:öå°}q£¿£»ž_ròÐs÷Õ÷aûsØκ¾†Ál¿@#ÇÃlÈËÛÀÙY/ÀŸ ¹8éyºéø²|ضº¾†Þl?#ëÞ춗³³^€;;Àíb£çé à†,t}O8±ýN9˜8Ɇ¼¬ œÍôìÙvlS=OKý[v€ ÛÁP×÷„a€ÛÏÒÈáøáK6äebàl de–ÁIÍMyîF*#¤|Т§Š'Êg…¤¹û$Øø$X/­l8in¹%YrK(Q¢DinH 4-4 ‹ñƒ¡±ò;š+¿Ëb|O×®øÞ.Æ÷YŒïïfüçš?d1~Äbü€Éøþ†•o°ÿ…¼ÆÊi®|“Åø1‹ñõ+~¼‹ñã'»?Z³â§,ôßLÆ›VþœÅøÊ5VþLså¯X èÇkWüjã-ã­ÝŒÿ^³â7,ÆoYŒ_3¿Ø°ò÷,ÆXŒ_j¬üæÊ·Y èkW¼½‹ñ.‹ñÎnÆ/׬ø‹½ÃdüvÃÊ¿°ï±¿×Xù®æÊ÷YŒÐÎÚïíb|ˆünÆïÖ¬XÍb|Äb¼ÏdüqÃÊYŒOp¯ÆÊ4Wª±лkW|¼‹±ùÝŒ?®Yñ)‹}Âd|°aå:úPc¥šæÊ ,†:Z»bÝ.ÆFäw3>X³b3‹±…ÅXÏd|¼aå6RÓX¹^s¥&‹}´vÅÖ] &ò»]³B‹ÅØÉble2>ݰr‹­×X¹Us¥‹­Y»B[›ÁÒaìÞÉXóÉ ÖNK‹ÁÜÄØ ¾’µÁÚÊÐødåöµ+Y, ÆÚ¿¬Øµ–ÁúŒ±{ cÍW°Ô,5scû+Y1X«ï¬ÜþÇ•¬÷¬÷k½b×; Ö»ŒÝo3Öü|ë÷ ÖïÌ_36ül%ë-ëW Ÿ¬Üþß+Y?g°~ÊXû£»~Ì`½ÉØýcÍ÷V°~È`ý€Áü.ccåÁ7~hÆNhŸ·‘¦q«|ÐVE"R±yœÐtÏ´âøt~ÒR*­8!,Ó':7XnÉë!áWµìöP¢ô:©@Z°Åt‹ŠºŠ “ý›:íß4hÿ‡Iû¿LÚÿYMûÛhÿΤý»&íÿ­¢ý“¦ m¢ý‡m“ª:m…Á¤}‡I£¯¦}gí?™´ïjÒV¬¢}Iû>ò›hßQ£ýIè»ê´hÐÞ`úîjÚÛho2iojÒ¾¿Šö&í¿‘ßDû‘ígLBÿ¥Nû‰íLBo¬¦ýbíWLÚ/5iÿµŠö“öä7Ñ~ªFû“ÐÏÕi¿Ö ýIèg«i¿ßF{‡I{[“öóU´?2iBù&Ú[j´¿0 ýVöŽí}&¡_¯¦½·ö!“ö&í­U´ÕLÚGLÚ{›ho«Ñ>fzWö¾MIè«io£­A^“öÎ*Ú§LÚg¨³‰öžm“¶¨Ó>Ñ m`Ò4ÐÑjÚºm´MÈkÒþ²Š¶…IhÝ&ÚGj´mLÚv&íuÚ: š&“¶ƒI[µš¶m+©IÓÜB[õ>¹…ÆÜLÛ´–¦ö¹Æ\GS¦±ŠÆT§1Õh«OÛ†üG4Íi«Þ¢1Qç}Ú¦whj¿¦1ÿDc¾KSÿ%Må¿§1K[ýcÚ¶_Ò˜¿¢iþ‚¶êG4æÏhÌŸÒ6½ISûù&ùMý»4ïјߧ1¿G[½‚¶í;4&ƒ¦¹‚¶êßiÌÿ 1ÿ¶éÿÒÔþ¦³BÕÏð"Úçí"·J-zWŠ Uˆ£²¢²ƒ2ù)™‚i=/ÃOÉà'§%Í¡ŒâÄlA|– 1SüäÞ9ŒÍ Èò%ÍÛ3ßLÅs´Ðv^Iæ‰DéÅ9Ž1)Çý“ù2ç$q3’x¥<Å §2ÏÌ»¿œ8ÿýk}¿†Q™yfx^jn*¿”¯Ä¬J )ÐR ´*rÐÎám ¥ƒ¶¤¢¤¤ò‰¢²cr‚³©/TzaRJfbnAÖ³•Ÿ"ÕW»ÕTz¤9”6Ÿ™å'·d¡È)Ùi i‰ñ JËËÊ„‹nóeT\ÊwŽË<Ì)bÇV˜%Ö[¤·&Ôõ÷ˆåI‹–Ťoxb^JVJnq®°L¨¸?)}S”S”£±YÃÍÛ /Låõ“ò(ÐÎí_)ÐΊhÓrSŸ»‘*)´•%’J ©è€–“-H{¡Ró릦¦&§ÓÝétïIx·õˉÄGw¥woóû|²Ølá LÈ‹Ìö—[²P¥æ¤Էзð6°ôÑ3óÚÏöÐ6p=ȶ•‰È©$]ö¢»˜¿Dâ°Œ$‹È «èL‡è ]ßxGd”Öq8¶^Û#Ý-6ǨWÙc•ÒG´ÄÊãç¹zº@1É1Âqù+.J¯Z¢r– p•+>-þ½ÞÛ´y£“»S¾ _P*¨k©“ÕÈ^v¯~õö¢Ò¢­¦[ Ðj©Ì€Ve´*3 UyZ-•' ÕR™­Ê hUf@«ò´Z*O@«¥2Z•Ъ̀Vå hµTž€VKe´*3 U™­ÊÐj©<­–Ê hUf@«2Z•' ÕRyZ-•Ъ̀Ve´*O@«¥ò$¢ÕR™­Ê hUf@«ò´¨C‚VKe´*3 U™­ Ú­Z*O@«¥2Z•Ъ̀V…­Öf´ZTf@«2Z•Ъ Õz_…­ÖŸTf@«2Z•Ъ Õú© Z­7Uf@«2Z•Ъ Õúw•¯€6/íy›ŠÄ­ÒA‹½+­’’ŠÎ ŠÍåP|‘Róëoß¾}åʕ˗/_™NW¯^½víÚë#“7³Ž%<šºòàÞ™küʪÃr^Ô`B~xT¶¿Ü’…*!#ùˆ™·gx•'·ÒÆ_rÈ©i›»ß.v¯žáçGõŽ?Æ6‚Œ,ÌÒó2ÝË<Å/9„EpÓs9ÅÒ¢˜¬ä=îq{¹e‡bê?ª2 ŒJ.H‡ë±a¥ÝÖCsG³´ú•6a¢I„•rÛˆBÙLaÕâ ž§Z'»Ò2iDt¸?ÇÑm±¤˜8$)¿ë§¦‚WÂ#k™PÞ52E%EO.½pVã—ò‹¥ÅÏùžíÒX‚ƒlpxð¶Û>QÿD®>þè7¿yËÓÓ}ï>–úZõ»v K„½²ZÙ¢×böV/’iZhÒ×ÓW袯W]¹ÎСG‡¾R]õ?wÒÿS‡þ]m:CMõ{:ôïëп§Iÿî:ÕèЈüzÕl£¿¡Cè{êªo줿©CS›þ5ÕŸèС75éo¬Sý©ýgȯWýÉ6úÏuè¿Ð¡ÿ—ºêÏwÒ¥Cÿ¥6ýÇjª¿Ö¡¿…¼&ýgëT£Cÿ­ýçëU½þ{B?SWýÝNúÛ:ô?hÓ®¦úŽý]ä5éo­Sý“ýϨ¿^õímô¿èÐßC;êªÞIymúoÔT?Ô¡¯Ò¡ÿE“þÎ:ÕtèлëUßÛFÿX‡ÐÛêªí¤«!¯MGMU]‡¾F‡þWMú{ëT?Õ¡C¬Wýx}}=QWýt']ymú{jªuè›tèŸiÒ?Z§ºE‡}¼^õ³môm:„V««nÙI×D^›¾ZM•©C×Ò¡oÖ¤¯Y§ºS‡®׫nÞFߥCß­CWSWÝ©E×ÙE×fÒÕþªªÃ¤ëì kjÐ×}¢ª³•®³™¾þ¯ª[Õé:è:ëéêV݉üZº¶]íUOè:Ó5ß§¯{[Ug]çCúúß«n}‡®óºÎŸèê¿TÝùºÎÛtíßÑÕ~ªªó[ºÎoèš¿¤¯û‰ªÎ/é:¿ ¯Suëé:ÿM×ù1]ýª;ß ëüˆ®ýCºÚªê|®ó]º&ƒ¾n…êþ~?ÀÔ ckAJ-±qg“›ÇÉ¥½P©hÑàªHÙëׯ߼qiü–ìÁèG“ÒÉ[¼>wqET΋L(ÊñW4fAJÈH:ná›Z#uõŽ4µ²·:éjëärÂÆÚÒÊÒÙÕ9"22>!ÁØÜ<">jѽÌSˆhýãÃ"bCcâ¢%DîsŽ`…ÊFÕ´Ç“mýƒÉKQ±2Þ°ÄSßÅß®©­«ž'ÇØå!&¶.z¾\Sä=ÙŽžú~\3È ]øúsÍü¹¦®z¾ãäCL\ô¹¦Ah$íâ©L0×ÌÍSßÛß0˜È›:¹êsBÍ9&ŽÎzÁSÇÌ×—íæªÏ 2ãš!ããiÈ 0 ö7urÐ ð6æøšz›8Úê{›r¼Í|]ÙnöúO3ÈÍNßÇÑãnìfêd©àdÌq1 t2q4× v2å8™ùÚ±Ý,ô9'Í 7s}+C޽Y°©[/ÀÚ˜ckhmâh¨lmʱ2ó5c»ê‡ÚX¦DqÓóÓçÞ]KÚš'ŠÉ›­8í…’ƒd_¯ÍPöÆ›H·o]¿Ýò`¬x¸7Z( É—¤ä¼¨Á„ÂiÐÖH'€ÖÂÚ&!!!::ÆÅŹ ° ¬¼L"•”””´µµ „|O/Œ×ü„UX\Ä¢{™§$U%‰±’RñÔÔÔÝ»wÇÇ'ND±BJ÷‡WŒª=QQX5>1qûÎmmé¹iŠK°P—wöM{Ÿ—µ™ˆÞ"ã#‚Cƒró²câ£ãRb‰ï›ˆ £"CøÂbwO×ÄôDeÏ”/hnÞº1:~çî½É/._âpü¼)™Iõ ugÎ_>^¨åœŒˆ–Å-#@Y³Ï3ýd,àìyÔIÍNAýEö%÷>‹5•l„/ã'e%„øgd¥ŸèÞ¢b Dñ òÉÊÍì?Ówê^DdJÈ £Ô9,8{ ½=zóÎè­ñɱ‰Éq–™“{3 K %ÕÓlSêRÖHSsS‚CïÝ¿;0ØŸWKôžž€®ˆÏÈÌN÷çø'e&òKù„IÊ´GqáD"€¶¥«¥±½±¡½òLsG3@Knª%ØêNN;vhnذ~`h £¯££—P{Oûzõ{X{ªj+ó‹ó׬YsàÀ~¡Hоª­ +ˆˆ–úÁ ê+^øƒí[ R>hgº„bòƒb 8$çÖ4h‰ˆöÞ½{ +IY‚±O(;:6D‡k IDAT6†K-­M)ùñói0ÐÈ-Y¨2“ŒLÍ‚ƒƒ}}}ml­EbaEE¹´TZ^^vþÂyØÖÓÓsÒÑÞÐØ$,>bѽÌSâJQ|rìÐЦ¢ó̹ƒŸG׎kÜÍ‘ì «8U³[~œ“wöâå Îg榋*„‹î«X6í}êy{IuIvQvX 7<ŠÛ~ªõÎèí±‰;wÆnóE^þ^Ñá§€º±ñÛh£Â’³’7Œ’T$-rór½uëæøÄ(¡Éщ»cmÁ¶–¶æÈ؈ðØð,^–¨R¤lcÒóÓƒC‚0öÑéiÁl –õ ô⌎ݾ3†-…Ña˜Ã,^¦ṳ̈l!˜CpO€öTãSjîlÎ)Êõ—À ìD´$h{û{eu2¬ˆ¸Š¦MÌM*k*++bRbÔÔÕàÂжÖ,º¯Ù[_Îßa¹ƒúÁ ê+^øƒ$hŸ)òЦtТ'Y­ ¯<ÆäÇ„ä–d¼PimSýøøø­™D2v”dìØØøøÄýû÷§A›0Ÿyѹ¤r{曩•=ÚRYi{{{K BÚf¨µµµ··×ÞÁÎÈÄ­â_y†ðÒ☸(ÌæáÖí[¢º¦#!ÅgµE»‚Ä{8Rv8¯¡³stô&0%-¹P\H˜´¨¾ŒvõuOgji±o OjzÊØØèÔÔ½É{“÷Æ>ò Ò3ÓFÇîà)IÀ&2:¡ÒâL]PFX.ôðq¿uû&‹pÀÿè8a‚Kœ“ã\òJxÊ^Ê|A‡<õàþØaÃÝ{ãã¹ù9ù¹ˆûoÞ¾~ýÖÕéÓÀXZFª—¿g‘¤h æ‡ \UI¾ ¿µ«µ‰ä+Ñ64L‹-P§l3 àœ|ëXÚ|a¾‹§KëéV@±²©¦Æ¦Äª¯Q?tès‘HTÛZ»è!ÏÞêíV³­ÔŸ÷PGûÂ?ïhçØZÒA‹žÊêÊHÅæsâ BóJ2_¨ôÂdD´ êÄ*²€ÇÄÄÄäääÔÔ@›šŸ8Ÿ“x‘ѹrK$ !.5Ѫ¿¿¿§—§•õ ‰¤ät÷éήN¤üëììéé¶³·546‰âÊjd‹ëh^ª-Ë-ÊÉÊÉÄ„ò`jóörËX¡¥ÇC ê;;'&Æqu€´ì‚,ܵ¸¾2ÁéþÓ‹¶VZ-ÍÌÏŒˆ‰¨¬®ø<˜šzpïþý»"±0$ŒSVYÖ‚mwïO>|ô *:‚'â)qêäVUI½ý<Ñ‚mÄûÆwǡɻãjoÞº! ¢ã£2ó2$U’EÎÛ¼% BÃ8N±D\;6ZU]Z,(š>”LÜ›º‹H·¶®&2:"#7–/ÁüST (hëjk:ÕÔ4ý¾qc¡†¶†–Ž–¼¢<ånò•V—ºz¹ji17lØÐÝÛ “öìÛ³~ýú¡‘!\‚°Áb“c׬Q?|ø0@[×Z·È¾žµÕ ´hçóƒÏÛZ$t•ZôT^WN*Ž-7¿$ë…Ê @[744ÐÞ™Nc€ì8AÙÉiÊ‚"<hÓòçÓ`2/2&/HnÉ‚$®;º8:»:yy{xz¹»y¸„…‡**”âîéæäâdïd'DÈ´¨Žæ#ÌgZvjm]íôñãùîúèøhI}ó¡à"𢆮®ÉÉ ”߸qãÚµ«¨™’‘¬¸ é}Êë_ÂàÚ2Q™(%3%1%¡ÿLÿ½û÷=zXZ&ÍÈËHNOJÍHéíëEáßÿþ·¨ØHa©§NÑ$ßï[·oðˆ&=~øøËÇ“]q‰±É™É¢2!ê,%’ŠnxÈ—{|ïÞÝ3g¶&¦%à`T"?xø€(<ÓŸœ–””‘„9\“H•Ö” Ou··_€šþ&TGs3tª¹µ³5¯8oÑ;j¡f¸y»ikkmÞ¼)&.F÷¨®¥¥…ššZL|Œ«·+ìâåbac¡¡±AWW ­o«_t_³·º°BH–úÁŠùD´íóö‰[¥ƒ–è¬þ‰âóCZIÖ •Q˜ÒÐT ‚"c ìÄ4bQxÿþý‡Mƒ6i> &ó¢bÚúòE¨Þ0"ôÒ¥K7_”.^¼É%@»¨Žæ¥ºò¨¸ÈsçοÜ1&¦Óí;·+ÚNŸê@T„§(ǤMÞ¼xébLB´â*,¨/a™Þ§¢¾â%m&™T—WPTÐÛÛ# ¼¢Y¾„—SÄç  †G†•”‰_¶¯y¨²¾Ò/ÐÇ”{÷'AÙGÁ¤¼‚ÜØ¤X¾¢®b l€Ð b2Nh0Æ^,(ŽMŒÁls‚ˆ¶¯¯·¨˜‡ÃÓE.ßK¨¬¦Œ'äuôt´Ÿno?݆жørkkGK[g[>?iLÂZ¤d¤°öî177Ý·o¯‹‹sVVÆ‘#ºûöíÛ¿ßû<€XÖÑñäÖžšÚÜ‹ìëY[]T!zZê+¨¬˜ó+2Úço-h)@‹½Kj å=íWß.¾+§ìÔÔÔ£ÇÚ"´rK$i•ÁVGgðvöùidd¤³³#"&¢h^TGó7"dppÆ âGÃ3IÑž'OÏE}ÅUXà}ºÏtW6T¾Ë“ ’ã‚ýŠKŠÉf‰B~~Br¼³›£¤B¢Ô©#UÕXåä7 Ú»×®_ã"jä 1K`ð —¬Fæä꟟±F†Ì `ïè— žar–Ò¹ÊkËÚiÊþKÓ¸mkéh)à,X©ÞÞ´Œ4míðSÖÖVéé©›7oÞºuËÖ­[·mÛº}û6HK‹éëç{fðL]KÝ¢ûš½ÕÅ•â;¨¬ ~°â…?X‘Y˜ùÜ—ÒÒ€–è¬á‰â B ¹ùÒ¬J´eÁX’²÷§)û`êÁƒÙÒÚœV4Ÿ ÐæÉ-Yv„G‡Á····>?á*_À‘TJ×ѼT_Á9Ý}º··“œž‘ÎçK¥ÒêêêÆÆÆ®.øÂ¶ÎÎÎÓ§áÛ‘éîé çÁÁ¢º•‰žxŸWa<Ú0Ÿ8‹T5T‘Í’(D_p¬¯ª¯9TÝTíèƒ#H]C]lBl./<#m[‚Þg–`Ô»|ðˆ™))'~wI^¸Ä"aS(,Ä©è™â‰xKcziho>?<8<Ø?ПÖnܸqhx¨ïL©ÞþÞž¾ž³ç϶vµV6.ÞªÙ[]Z-µ ¢~°‚úÁŠÿ`E/ó¹[k·Êmcv?©øÂ· 4û…Ê(Nih¬{ôè€úðáCdéK2ým:ýãÿ "Ú¤ù4˜ÌŠ-’[² •Õ•Å$Ÿ¸:‡G„……sŸ'\usw —ÕÉ×Ñ|„ù$A‹TV&ãóù ¬L&«©©inn–ƒ¶»»[žh+Ê×—¨\Ô=Ð]ÙôªÒTùt›MÏ*TŽª›«ýƒ}ã“â’3“JkJ—¬ßçÎÃ3§bYì™mØZZKj[kû†û"¢"<0òÅÈ«5é™[½¼¡<‡Ÿ“ÉˤDi²|Ž­)´Ø¸UMU¤x¡‰Eá…²œ*G”‘‘›Z,äÍ­ôœ”,~Ú|LåGÇpä–,H‚¸Bœœ™Ÿ› èÎÊqŽ[(*ù• s#CêûúúÔöôtCDêéÆÓþ~¢—úûûÉLSS#ÀŒõ^\wxÏ`OU³²†³,ªm©—‰ÅåbZv{(ÍS`-Xˆ­оòÆ_Ë­NiÙE•Z8²šæR‰Þi|b¼XT¼d¯PJ_s‘¸U:hÑö.)´ÂQUѲs¶62;ž/ÉF>Oœ©«¸û–ù M.—[òBI+¥^~^Ç Ž±MÙ¾¾Eâ"Å,‹ø¾“›L217 â¿rµÂû œ˜»Î"ZÚZ>?pðÐÁÃz‡M-LS³Sá¦çÓ>fÕÓ×4š»Ž±¹qIyÉË $» {ëö­ø\÷s#c£„”@ÅÃÇ#1=Qy³'ï”Ön¤=œÆé3œ¨\Dü¯·•ÌLKWKEñÃL}Ê3øyƼür/BÏÛêµÍµ<ojjJÑÑýóŸÿ¼{÷îÿþïÿÞ½w÷þç/=~ü¸ ¨ PTX,-¦ôzKX&Äk/–¹÷3¤tТ§æÎfR©‚¨ta¬¨ºh™Û˜0µw„Ä޹¢ }»„•2)Œ_^ž”‡Lp¤?òÈ„'„¤&ÍÑlvIR2?\nÉÜBdʺ{»çç#_\RŒ§B™/¹`nptB´O€Of^&94Ä»±œ€"Qù²DؤXTƒcg§s -Û8Ø„E‡U5T!¢û‘G¡¸LèêéŠÃú­¨« o‘TH² ²ÚR³R} ƒ¿…ö+«•ÁûÌ]á,(BDB호”8œN½áR>?ß/È/>%ÛæÁT+Æ$Æ PHy˜=D0iÙiqÉq¨ìèêˆj8bt9¼ÿ`L8kKT&z™ LÏM·¶·nœÔ 8¬ Ä<é|3†ÂÜ¢\L‘›—LÉDx$°@q/¢S¹È6Ñ``H ‹¾ðcOLKÄ:¢„'âÁB€µC—„¥BÅUƱ{ŒÎÁt…„‡Ô4Õ BpX0J0íÎ"ìÄl d‚ÎÞξ¡>⿊«‘µvµIŠòy’*IGo*`'ˆ+Ä`pëéVò?ÉA‰´JŠAÁѼ’M.ßêºzºO-7 À„xû{‡D„àˆ9»w…Ç„'¤% 3ƒÝõª¶:bÓB~áÔƒ©ÿUH ium5[[_ ?u)+/+2!2:9šÒë­ÈÄÈÌÂÌî3ÝsïgHé %þß®'JFgˆbÅ5ÅsÈÂÖÔÞÕÆÌÚ8oúhuöíVñ³cÜüœý¹Þî~αi‘^AîÎ^'3‹S÷ÜcdfQ”bfm‚ò9šÍ‘$¥"ä–Ì-øAw—ÊúJò)\It|tXTXy]ùú ëá£ñچ׆q)-' >´@!Žá¨£±Qã„í n×ÒÆ¬g§s fekåÏñÕàD òs çð³F`žÂT† Ï@5„¿QñQ¨œ,´_øÓÁ‘AøÖ9ê`Ȉe±™H;1oæ'̉ÿ¬RŠ9‰Œ‹ä„q’3’]{G{à<Ûw`ŸºGu1oÎÚ»µ1Œâð‘Ã8 ðKøѸ‘\ +‹O?ûu^fÁK[[2®›[™£‹“.'á”ѲÝI;Ìz?¤{“û@"ª«¯€aمًîÆËÿDÈÝ€Óƒ—¿¢y¼?rôHDLæÃÇÖ;Œ-DL‹“X«¸ÊXV4µuÛVð“ (,.Äþ‘TJ(½Þ*–GÄGtõwáÕñÜ­5ýŸ_)´° ít)€6S'©Ì!K[3®ää‘+ÌØ³7B['ï ÷ˆ„ÐÀp?['«¸ô(S+cIJûí=¨»?*)  Íæ§ÏÑl®$9U)·dnåòráûšO5“O1„´¬4àÁ¢&S¯p„‰d\ g„×y|r<¼!^íQqQ¨£¥­…à ™ÁƒÏ³Ó¹xBž‘‰<2ðzÕ5×aý*j+¤R\r÷r·s´ûQ§º¡~ÊÔÂWýýpD€Íp=p@ä§nóíôt+|úÐÈÐÜÕ0äÝ{v£‹ÌÜLÁ=h™ÀL]rz²“«S±¸³ŠÀÚÔÜôsÝÏÉÉÁDaD’r‰£‹#@ˆ€4hQ‚ùDŒ‚©ÎÊÏ´£äe&ýêèã1#7-# „…èkZ”U—aÆòŠòôŽéÅ$Ä€[œÀæŽæœÂ V-ºÓÏÖöùáÏ! «ƒBûÃ,¯-·²±*¯)‡ &F ÀÚìül˜qôøQÜŽ§X_ÅUF &\‡¥ÃÂ"Q QÇ gq¦Âžbi1p‹pyðq3PІ¬È¨¸ŠÀ—òÄ…8È#ØEÈ{ªû.½’}a‹’[Bqóco`öp ãµ¶³ÆÀg—øüöŒG¹™…Ù«Úêõ­õíØÄØý÷å-«(»{ÿnEuÅ­;·/ɹ…¹Y…Y¹Å¹”^o¥æ¤&e&õ ô̵µºZ!¥ƒ–è¬û‰2D1™âxI`YÚ™Gúç‰2mOD&qZquñ‘ã‡õÙGWAm‘,% 1žÒ;èîçbigÏÑl®4%  ín› …665ȧ8•Àùú"VÛ»/1(pþÞÍÚÞ³w²Gt‹«ïéâF‚íü:}¡à àDàmCÂC Ø8ËÕoÎnΈüP×§€ÔÂqÃé ¸ §ƒBXÌ F# ê®vøüp{wûu0ä­Û·¢wc3c­ZˆÌàˆQŽƒÈ±ãÇÈ®ÁxDE@vÜè8h#o¯ H8º:‚p¤Ë#K0(ÄgxZÕPµÿà~”¼Ììa-vhí€%X5L`YMúB§8 `ÒpqõpÆvîÚ‰–6–B©ÐËÏ P|™Nåa4D¾¼|½RH¶a~J+KaŽA¸öc½` ìÔ7ÔÇ\á8÷Ô*“{ hÁ-¹E¹8xa¡±å=ÃøE؉õ2IQÕD|X pbÑñcIÍ5[‘AMQ™¨£§£®µNZ%hQ",¢`~…ûœÜŠ%ØZâ21ò²*®âûtIG3Îg8¡Q>Jˆ [xÑ x·GoMŽÉ…§Ý}Ý££=ý=7oßT¼$çæáù¼ÿ’Òk#TÐÖÕ†Î\r·J-,hïy¢ qlVI‚´N(­ŸÖ³2@&'*1hpd€“•ÖnfI ßÁÕ69‡…E•E 2&–Fzº@,bÙƒGö{¸>¯Aò1¯45M%·dnÁ #öâ‰x$–àˆáò@VxüÚ;1¿xGÅG¸äâA¼ÉL¾ QŽ:_p#ÚÉ.Ȇǜg§/Pw{pXpiUiÛ4øR‰Ï¢j[jM,L¢á0Ä "¡;08¾„§¨V$.B†üX~¡ýV6V:Õ{jŽ:ò! ‰é‰ (&å8 $¦%Ê?cƒ !!FÆFVvV¡‘¡ˆØNØœÀXŽ;Ïèäæ„Aá.T#KP‡üÄ! ø‡’—™Àg®Ù)UkK,·¬ZΡÁ± ç<%Çò ;MŒMÉLÁÀ1oX¦ÒêRűã„gljŒý€aœ f¯²âƒñ0 †ºzºd; šfz{ÀËÎþN@Ðg£Þ¡^âC¦SMÝVÉrq á/vn$ß^Æ]¯fŸ+lÅÚÈýŒñ’]‚9 ‹C¯P¼Èùyù­Nì@aÑ•ëWnÞ¹‰àun¡Îõ[×b˜OJ¯½NœžÛ=ìnW:hq4Æa™T¦86»$¡´^4‡N  DFP^hdf°Ms‹¤F—åâåâäáàì)­zºoÚº1&%—ã¹q‹*ÌÝl~iZº0JnÉܼ¤e§!òHJK‚ƒC¤N|ÕX½Acƒ½ "@p£­]­`IhD(\§§'Ô¨sH÷Ž0h'§ ¡Û<;[˜FDÕp©è(%#¶eæeÂ½ÚØÙÀÃ<Ö>\0jVÔVàh†á€»òŠò@> .bMÅå˜çTÀÎ]GqȘ%ÿ âS´ŽfI¹$˜”ž„§èÖææj25ƒCƒa•æMXŽ»ôŽéáˆ-15‘ì‘,))/áp9(ĸ>[÷J^fŸ¹d§ŒZD®0r½Æz”³ dzí½ÂN% <9#Ó‚«ˆéåcG¿a‘aÛ5·ãF,Ö6Ím˜¨Ù«¬8á‚Ç%Åùú®Û°Žlg» fÔLÿ’0ñ3è •ÄºœjÂ!ÇGD®È×·Õßh«–¿êÐVŸžO|F Kð8pv «¿ë•ìsr`ãE‡I …˜5¿8“–žîãïãéë‰:O•`6öا{TSáíç9yU[¯ñ’²’æ¶æ‘ #ç/žŸ[¨Óvª­DV‚»^Õ„PúF ûR:hÑqàVVI\¶$QÖ žC‘‰ÜŒÂ2ŸšŸèèL"¨ ‹ ±s±ñ ñæ—àRŽ á,ò¹ÂLWPyîf di¢h¹%/Ìæ—ðáÝ||#(¬iªÙ³w\X¦’CkhmˆŒôòóJÍLÅ«5ñ”¼„ÈŽ`þÎ-4žŸ '‚³<ˆ…#3ÖO,ûûÃÐ4E5¢SOÚ€»Ò²Òà‰ ÷U£(Å!“Ÿíá€ÒÔÞ„’BA!&¼,«.ÃSN|;ðàFpA¢0:>sˆsÜ9ód 2B©¨†åp©(y#Ÿ¹d§˜"¬&VäÃ@H3*ë*Á{Lã+ïã*à!a!å5åx*;qKuÂYLTym9¶87{•Ÿšp­¸‘Ü Ð ÐEÞÎBuúÌé–ά˜ p´ˆ\Ú€Þ‘K#è ¬ZßPßàÈ ò%%0•QsàÚWµÐÂÁÉA.Ì!ñaMf*βäÞèœÞØŠ%x9Ö;Œ³öξ--¯ÐâÌQY*æ#i…«¦è÷(}›EâVé EOx’Ê–ÄçH“ÊK–^…eéâ¹%‹S]sÝ¡#‡0k/Ù¥¯¹ˆ·4p:ññ„Ç\vc–Fmï`/¨ ¦xJ” %}ÃÄSÊóDàÛP5|a%¨ƒ’e·~æ¨þQ\”Ôþ‚‚E§Gé[.·Jm×ôk˜TniR¦8VÖ(.o’,¥ÊÅ|¶$AnÉâ·kïhß9}ü§ô 1·™¥Y±¸˜Zëg ±,„@vÙ-‘ ~ÆÑÕ±¦±fÙ-¡DIQ$n•ZôDü_ÍÓªh–Äó‚Š‚‹C–TEœ¸Â@àVnÉ¢…){ùF(}ÍE¾<·.%E!ºùb¤¸Ù-QÔé~j½(}íDâVé EOÿú‚Ö™®ºöª²F‘¬A¸”Bµm•è}Ù¿¢F‰%J”¾="q«tÐööâüK‰%J”(}ÛBJ-ÑÙ0%J”(Q¢ôíÓ4n•Úþáþþ³”(Q¢D‰Ò·OÄ–â­ãWø;¨Ë®®þ.ò)Q¢D‰¥¹EþÉœÒA[ÕXÕÐÖ@üìø7_m]mÕÕíÝí˾x”(Q¢Dé›"¥ƒ¶¤¼äÞý{ŠÿÔ7W_þíËó—Γÿ1mmË7Oõmõu-ußP㟡æÚúÖzèõÑW…ÅÂ’-»ÊUsmc{cÏ@ϲ»BJ””'¥ƒV\.Ÿÿíñk äúÍë5Í5×n]ûféú­ëWn\!~³¦·sÙy…ƒ:{ñl]kÝÅ+‘_v{^ùè.]½ Ž ¾~£“ñÚÍkýÃýæ²»BJ””§¥í—}ùèÑã‡_J¾|ôðñC¹}I¢ò×Vp 8ƒ_¾~ù‹k_|³váò…öîöo¢ñÏróÎÍæS;¸°ìƼúÑ]»ŒÍÖ}¦ûÌÙ3ËnŒò„óùšZvWH‰’ò´ %(ûøÑý›#—3L/Fî!µçj¡óƒ‰›§¯T…×éV퇂«?/éyøø*Mõå#D´ÕÕ5 pëì…³gÏ?C†G.ž#«}MÇȯµ«•xzùüų§ÿ¥sÝ—®\¸tqè+…#}Ënó uãöæŽæsÓS}þ‹óÈkþ IDATg†Ïô ö=GýC#Øe·yþºzãj÷@wï`¯báÅ«—Î^<æÜ¹Þá³x¾xþâ•å7uÑk)ÐRzíµD E´:>X5zÛ£Z‡GUVk/¯»wýlAW@l÷‘Ü/,s.™çœ·ò­Ø5õð¾bŒûµX‹¸°ª±Šô- ¼â‚bï™*Ÿ^vG¦èÑ.^~Ú‘¶’A—¿Œ¬%5à¶úÂ@ëp¡ç°Çªÿ5#þjg}>Ö¼xùü²›=·à£›N5ḂòÅVöv†¦¦†&¦„L›'dŒ¼w€Gwç²Û<!ÚCD«Ús—.”5uù$–vÍÝn™zÐ9Ç#^*kìz—ÝÚE ¯) ´”^o-hÁ§‡Ž©¹¹aŠ¿õ^ÖûSâ=ü?¾{m8ç”wX'Ë«o•K÷»±ÜeÛï?¼‡Ê/¯”HKnݹ¥X")•ܾsûeš%@ÛP·•–KFΟ»ÿÞÝ»“““ãããcÐØØ( …b>,²æ‚„øl`x@1óJti:oélA~¤©øzìÖ4Úü£Öè-ŽÕÏ÷5 eÚMò þQkò· ½‡åÆCë/~1òªzW’HÐ_ÆÐl“S’SS3x‰ÙÒ¸¸Ä„˜øøè¸¸¨˜˜ÈèèèØØ¶v‰HÙ&!zFlýÌK0ò…%Šº|ý2@Û3ØC>¾0W½Ë6SÃ"{»}ñNñGÁ«ü]vÙ¡™#çæÓ£â¥¹{_÷êB›½zó*ZJ¯·–´€ÜؙڋA«Fó™wr6ÝÉgžóþ`òÚpn‡ŸG­†ûfŸV€M÷Òí÷ÜCe¹îÞ¿ XÞºMhbrâæí›7nݸ7u¼„§×n\C²äþÔ}²æ½û÷î?¸oai104€ú¨3qwbêáTcSãèØèØøØ±;DùõkÈ£÷¢q” 7â)¼y‹h|t|têÁÔ{=@ @K:)i™äܹá«Wñd:72|öÜÐðÙÁÁ¡37n^ˆŠû‡úÉš RM}MlB¬bæ•èÒâÍU€ùsME8ô<i>ÊûèqéóþŸïkh'xG¯»ê¾hÿÿº _Œ¼ªÞ•$œ{ОÆÐÌ­­SÓÓ½ý¼£Ê­N™¸y¹y9:¹9Ù9Ø›Ÿ°°¶µ1±°à ‹•jÌðñóéêézæ¥ÀàÀ®Þ®9JžÒåk—O÷Ÿîè™®|!GÒ¤i™¾Å–§é$>\“[3bÓ¼Ë]Ætn?‘‘¯ùâé²ó²+k*g·Ü7Ї®Ý<Üp,x%—ïÕÆ–ÆŒìŒùßH€öÆÕšæšew…”()OKZ‚€Ùä• ±O»}Tkñ»ó߼7zµå|‰Eæšc‰ï¤þÅQ´± 3œCe¹Nuœ/=½<íìì“]\]Ì-Ì›š›&ïNÊÊdxjfnæààÐ~ª”íéíññõñðô¨­«k£¢£ÜÜÝ sórQ‚ü…‹Ð2'Ož400 CŒ;>1.‹P;84ˆ¦ZÛZOœ8annùÅå/HcÀZ8…ʆ'žKZV24<Øßß[*“vuuÈÊJêjk«Å%¢/._â ‹úgy1 ·®©®¶¡¶ª¶ªw %#—F:{:+ª+J+J›Û›Ï Æ%Æ™š™–”–DÆD"SZ^ àÆêºêÚÆÚ³pÐxZß\_×X×ØÚØÖÙÖÜÖ *‘IGƒh¤²¶7¶u´!Ô{49hÏ6]U»[°n2ýO÷øÌs>Žô6 fÚŽå˜ÊW¿›ñçÉ¢]ƒ~Ÿ¿tNÑx4ÕÐÜ )“`0 %x„Kw7——TÔT´´·´v´ž½p¶¾©ž¼›aÏì»Pnº©µIZ&Å<`€¨342TÓPƒò3ÃgÈY½¸zêô©‘‹ÿÂ?– :?„ fVV1qñNÞöñÝÇÏêÙyðã=f®»uçöõ[6i³XzÇ x‚¯€¶£»6à^Ì<ò`{g; S«êª0X)Û`‰Æ3Cg:Nw<Ï yß} 2¸ÃD#X¬5nÁ>Ĩ!¬#®%lÖS-hötïiTÃ:’Kê‹«_ÿ# òm=gޏån°ÈÙb/ØéZÊŽh´\qLéÜç[§Ûí‹ö;f·v?}°ÃÂÂ'»®±;ËNJMbícÅ'Å#a#•W•cÎÞZ; Ã#æup;Öëy›ƒmïjÇÔ]˜þú†SVUÖÔÖ„úÏ\eRW®_¡@KéõÖø$4u·¯ï´‡‡³³‹ƒ@X<>9~áõ~^>î‰)ñ×o]»÷àÞ“š3SèéèêHIMÑ=¢{ªó¯ˆÌ ›•ˆzû{/~q1.>.,<ìöèíè˜èž¾žîžîŠÊ Ä»ðkááˆAq—ÛA-˜}nä\hX(Œš.]@sçϵw´KJ%—¯\ƽh!2š 9?".Ÿ9KÖ ­¯„?‚$²’3ýí§Zsórëó òJe’‰(;'óì¹áb>|QQÀ§æMk[k/ØøØž3=ðƒ^>^.n.6v6Æ&ÆpUvvÚ»´Ý=ÝMLMñ ðƒË/ÌG& ( €W×vöí߇’Ä”Do_oÌŒ£³£••Å ‹Ó}§3s2áÁO:D!œ&Ù5‰«æŽf‚m¼‹ïlÍY;ÎÛqÖóOçz3lïdï™ÌZ=šü‡±¼í¾Ÿž¿xVÑx4…fíìaa‘ X*¯.‡I0#)% ‘œ©X*FLéàè wTC@¡¾>j’cǨgßí`î@›N®NFÆF©©h‡/äc\˜–ÄäD˜ l‡E„ùúûFFGÊG]¹q¥±½‘„@ã—aR¡Ѧ랦0¸æsçu‡½Ö蘮Ûs`¯žA¡ HqD MBrBgw§©¹)ºÃ<Ãøbaqxd¸“‹&ÐÀÈ =+A!º1·ÉiÉϳ‡/âoܸÑÖΖÇç·hCÀÞóôÇ °“íOÚ“Ë“—ƒ© @ÛÞÒÓ߃a¢5N(5ÉÖ.]½Dü·ŒgˆãHfIã6ËŒõ–ù[„:žG8&1F‘§5h»—m?)Üj™•*¨j¿¡Í¼Â<̼––#†Ça¶wjïÄà`‘›ìêîŠ3ðÔÖ:np£€vXvGÜN/ž¹iq6*V™Ü x¡yz{¢;{•åF^¾~™-¥×[J­¨LtoêÞĽ RÀa^AŽ·¯§¯¿OO_7_È ôkïh“×QT]CÂÙ;cwjêjðF% æåk—ËÊËbbcðâ÷ðÇñ ¸yû&y#(Ž`·ót'ò/_d³ïŒßA4<8<’‘•1:>Š:dIfvæ1ýcÈ[XX æù‹çÑ <ˆ—·W}CýèÄ(Ùæä½ItZQ_Ÿ IdâžÞÓí-Íu Mµu Õ5u•Õµ•Ueݽ]…Eùd£(‘T‡  ® `Œ@ž  €[D77²2™AЃ >=!)¡ .Á"à@0áåëeie‰ ÝÕ?ŠþÚÙÕ¹±¥QV)wÉ®áÑàÙZMü~»_ »¿;­wúN¾}®·q ÃæV†ÖhêŸoÆýúV¦Æ€ïÚ‘ ÊÆÃŸ7<Žh±5Âð>*6 Æ#p)(*(,.„ÞˆaØ ëð݈{`‘Ù}êhíÔÂÀåää‚jh5¦q-ÌÛ€öÖS­˜±¸„8”&ÁGizn%f¶–é^Ý{=R ¼D¬“2µ“mïXHþhUùŽEéÛ¦Q›Žð‹¾²‘¿f §°ñö‚9°½B .PQ,* a Ø ,{ž=; 14ä1ˆÿ0º|^>Ž8 èêé‚|8]!ν€m²2ð œ#ƒ`7*& Ü%[»xåbW_‚Zä9éeëM3>µÈßb/ÜíYnÛ^Ù}Ë#»ïóÀzmwÙf{Ázó,¿$éSû ¤ÌÉÏÁÌïÝ»—Œ#±10Éò­…éÅ¡FbŸ ƒ%VÜZ¸»Aª­ êcÓ’·¿pÓbñˆˆåÆk ›vö*ËüâÚh)½ÞZ Ð"¸›“«o°ß7$ÜΓãΉuöô ‰KLK»5zK±Ž\µõµ€èìÌõ[×á’pd€Ó2Òp”¾tå’³‹óÛ7ÈAG€öÌàäÏ_:¨]%CgÀ!DÃÿª3t&%-çúþ~ä‡Î É·ÇnÃfçeã €˜lsüî8A÷Ú²Á‘AH$vt¶×ÔW––‹%2¡HR,ñŠùE¹õµ8OÀK’5åâ‹ùæ–æ(ïîw÷rÏ)Èéê—й\xÞ-[·dæf¢‚²2™‘–KwíÞuäè½czˆŠJd%¸tÒù䙳gp$ˆOŽ' Œ+k+MMÌL’Ò’‘]‚¯oho ž÷ tVtV=QWÍàÙþþ4«)Ûn&üájäO¯¥¨÷{«£PÑx8V„#`R@pœ/ÜîÁÏ"˜&¬:z$.1€+¸l¸W‹ÎnÎð×` i'‚B gö]¨sH÷Pgo§|Èí§Ûa|Ï@Ù/Æ…“ÄÁCq ZCXgM^B˜^ßVß;Ô‹:Æ–æ>¡û µ5YÛŽ„~ätæ­Ãaï;öýƸð݃þ«Ìâ79Êåå+ލµ£‚´Ì4pA[rz2ûq”‰Ž‹Æ¡S ãBèVÈ/_ž¾¡¾çÙ#_ä1®”ô€œmÂÞ½g7î:vü˜ D€K8¦à‡¥'+cõY{Yh b£›níìų§zNuôv ˜"Ýd‘½Æ,Wæ˜éRjßvmô¡^/Ë»JÓI¢a]ô©I†w¼ø©ý†½Aî(„’0@±„ÜZØ{8a½°FÀjnaîS[ CÀ pþ@ Š yû 7-V;G Ü‚yóñó™½Êr#q¬i¢@KéuÖ’€vê+ =åšgJ­yDm\#dRQPÙùLÊÎZ`§l"Œëïu8éàçïwíæµä”d<íêîÂq°$!úLЊ%bEÐ"~Í+ÈCµîÞnY¹ \p@½”HKž-9w"‰ ¥µI,då¦åd¥e$¥e&§¤%Ä%DÉÊ%Ù¹™p+OM7b#“vµ"ðàmU]•µ­uV^œ»•­UFNêÀ ‘•ÉŒ¬J„Ȇü—àq #Û„£Ä]Ó¿^X/2--E¢"#c#Ô$«NíÜ`C[Q³«¦/ͪ/uFY'úÛûRO\MÜt3óÓ«I^IRïóúd`¸ï)û;z:ÿÁ½†E†™à.ÆBZ…£®ÂÃ¥öö†G‡c€ hJ^Ï`óì»È:ðÝäQçT÷)øzŒw`æ'¹1FDò[äöŒ|1RßZß3؃:FffV¶¶›¶mݸ}ó¿º]üåõ£ñ9¼jã¶Í:ûX‡ŽÍ)ÌWš²±·qtq k±¡á¡X5„­± ±Õ ÕÄqÁÕ‚Á`­‘‰‘°D8‡=Ä>Yÿ@¿@¿òêr¡Dxèð!Ì ‚û‚â\Biko‹{ÉõŠIˆ«°%Èå­ _&~d»çò)ümûÜuykÍó7Ù L#ê¯>pOïe7Úð?³Èßh–žPXõÔz‘{cön‘—`;ù_fbY³r³ž¹µžÊ̽iÉUvqwA‹Á¢MD·³Wù_‹xi¤º©zÙ]!%JÊÓ2€vø‹k~ÙmA¼~ÜÿÂ~÷ŒSe=£Ïmcs#7œ;;sóÎÍœ¼„›ööŽÎŽ¡ÜPµ±¥ÑÕÍ*-+ÅS¸ÎÁ³ƒ¸åâ­m¬oÞ&K ƒ¦$hÉ’«7®fåd9:9"&Š…h¼ótg@`€¹…¹­mOIY´²éý…A]CMjF’ƒ£]tløI';_/Oo·ÖæÅ‚ÂŒ¬4€‡¬)W‘°hƒÆ†¸¤88_ðЂà³ð453uó–ÍÙ"©ñGu}5ˆ ÓØÖnÁÅKÊ% \mS-Ú«z!/Ü… <>ÂMø>Ÿ‡HQZ&Ô³ó³ÿÿöîÄ©­ì@ø25U/©šLê½¼š$3o^e’t’N:ÝíŽíö¾oÝÞ÷ÝÆû¾ã /ìû¾ $¡H„±cl¼ÆîtwÒ“¼÷É·#ÓhctŽùNýšºÝåÜs¯Îw ±²R×Aë]³$¹ëÌ¿?ÏýìyÎj|õùIc¡!a{ß›ÿkSØ¿4îÿõÇÕØÒ0¼ñÊÜ«°¨ùså;Ñw°ƒÉpóöMÌÕêÝõ É h FÒEK!Àªj«° R«0 _óù åþ[á™@ c¥p^ˆXL(qú˜`!ðp^x"A§!Ÿ¢ã£‘y¨Qš„1ÚTeBD¡A»c×Î>þðýqÞö_í,ûÑÌU¿¹âýYk~‡š¹ æ/ñmêˆ+‚dýdæ'8Pøõðg|œ–•†lÄ5hÌÒåKÑf¬†ÐÅ„ óu<"àÛ±Úƒ…M[¼¥âiÁƒ³PëÔÈÔ™³g"É-^´mÇ6}‰'Ž''œ²r½°ÎÕ›W‘y8úµˆkHzeo-í-6§ íÁr©µfiXÊŒ½Ùÿµ)õÓ–ŸÑ¹»úwÜ4ÿz[æ/6¥þrcò¬ñÅ•Õ#ÎN¹7üï_ :ÿzÄõ|M>.+Ú‰ûpÔ[kÄÂ87mFv6ÇUŽŒ‰D?à*ãnÁ!ü¯²rÜ“­­ Zz·ég´#‚öpŒeW¤uíõŠ-·*7ß0Çiœc-2¯»·{Ô…¾G}žvà[¥æñ³Ç­­mmÊÑ݈[%P;º:|5Kl«ìß·²¶¥­›cÿø•]=]È`l¨¬à›Ñ¾Ú‚ƒQ—‘—}'êÖ¨ˆˆ;7®Þ¸’ž™Uã9ðaˆÁäfïþ½»÷íÆ¨Š„@_¿u#8¼¿d”—…XÅà¾qóF^£,TØ*H»öîB`hs4804#ó”}^½q[yGùf¦ؼ¬²ìô¹Óʯ±”W•ûF4·Ç]f-ÃrCqòƒ¿ýF·àÕï¿)^Ý~ú?\ÕW}•«ZÿšÝÔøüP ©Hˆuë×­Û° @¨`6vøèa´ðÂå H ÔTX+N9µuÇVLI•X½vóÚÒeK0ç.Cªùoe³ÛpîʬœÖÁD½ ¡ñmµ£õè¥ÃÇc:å 6ŒÑZ§Û‰Í×nÚ´nã¦?ùÓg|òÉâíýÝGŸ~üÁŒ|òñϘ=oþ¼EÞŽ‡Ÿöƒ„@4âÚ¼m3z ÈÑ­Û·ÂÉ3'Ñf¬‰9é|lb,òߎÕ, wÑ?·£n`6¼~ãúsÎmßµâº{?IÞ° H ´Y¹^¸ pYqqq‰ñx¡šÛš´à½dÍ®;™†Y»SfÌûõ–ô_mIûdî{[Ó±1õ½-©¿ß5©¨¾Ù5â~Sî ÿ»ÅWƒ6àˆ;÷ìô~„ž‹GœQo­ ãÜ´©™©ÊÄã &²è[̘G½Ê¾F2hé‚ í|ððhlù‚ãÚ%§t‹O-8¦Î-kë£c¡ø‚Vù·| 4ùI) ™YiˆÕ´ŒäÔ´¤äÔĤ丄¤8Lg‘¸æÊ2eMŸÌÜLŒGÊ'uÊ§Ž€¥ÆW©,#8¿]¶Ž²‚ïCË‘ËM#÷é;ô·³Ò*o“ŒI=þ2括߿TÍõû_ 6ýˆ¦ŽÊ·#ÎÅ·NFN¦ì#Zî[mÄV¾ú¯3ΡÁû Tš‚xõâÕ+ËW¯^±fÍ+XXo—¯^µ|Õªe«V-]±bågŸê4£ž‘3üÛ<|y¬öøê‡_Gß!|˯佚_睊­Éæ°ò­ÝUw1N3oʬýÙ³äýiþG{²?Ø‘6sWâ©È‚êzç¨×Ëgœšï½µF]õ¦èUö^ă–Þm!øèøÉÀ3§§§ÈÚ¢0Öxºû†6…¾µDÓVpƒÖXµQ]b6öôvÿå/_ÿ÷?Êß¼Å÷Ý7/^ Õ¹œÈ¹Ý^Wû|èùÿMiÞÈò׿þåÞýSE Î(TÖ™µ‘èÕ/'¹3q˜*MŸ5öã Ú/ÿŒ”}öìIq‰ÁívaÙV]•–žòàÁ=TŒE ®º§Oa¹ç^·7hn?¦†:“N_¦ÕUA Úæææ””—Ë¥Óé<Ovv¶Õj5gΜþÉÿþÉÙKgCÞN¢i.xAÛÔÖ¤.VBS¬Á4ë믿®¬´Ä%ÄÄÆGÇÆÇ Øª­Q1wcã¢SÓSúúúž>{¢/- ðXЕ=|Ô÷Í7ßüõUùꫯúûúŸ?®Ôà%Ä›½®FS¢ U#•ÎÄ#‹¯þ/Mngf«³këk?k•δCCÏ<è½w¯[[¤©µW÷öö”••Æ'Äz<ÍÝÝ…r·««½§§««»3.9&ðöçëòK,%¦*S¨®Ú•µ•¶êê¸ÄÔË×n݉Nˆ¸›˜v1üƪÕköíÛ·ÿþÿøÇçÃχ¼DÓ\u]uƒ¶D ÐÈ@br|­£Æá´GܾñèÑ#Œ³…j•£Îžœ–äjt >ЕjhAÛÞäa€æš+MÚ¬œŒ„¤øÒ²’WI†èìïéiméxV¨Wx¬@àèõ =·Ùª’’bã¢KM%_~ùç;wo¥¦%'§&"ðmUµE]RªF*‰f<}ú8-= .)%±²ªbhhðÙ³§“Õ™êRu¶öUКÝ•Êà ÚþžžÎÎζBÊj«ììj/.Ñãy«ÑÝ€¬Í/ȱTš=­Í힎Îö¸”˜ÀOÇU‚6TWm„JGeTaÃÿÝz>µ&ËÔ:ÿh¡ÊÒñáæ;ë·yn4~QVV¿uúÍ;6€¡D IDATǥǩŒ*\‚·™h’,h %:LžìKÏLEh +Í-M£§ðèÑÃIìLL­ì v­Ià~ Úú'žZ“ã/^>ëÎM<Ó\½vùȱC1±Q ‰±ç/ž½yëz|B #ššãRbo?‚¶´²´ÌVª«6B•£ Aû«ÍéñEîD]Óª³ºË鵟ŸHQ‚öÿY,¯¨x Ó…Ÿ:¹zÍÊ ×. ÿCÞf¢i(xAÛÜÞŒ6êbu:o`à¦/%&£³Î~ï^wOO—÷·]º:Ìå&T¶¶¶ôöö¤ç¤x¬@dä¦a õøñÃ*«M²{?Õ¼ÿÍãj¬Çrvn惽˜‚éÕ…†‚P5Ò×™˜|çäe¢aŽº×ÊÊM•fœÂ½IìÌRm®6A[d* pW…†Bm{{«±X¯7EÅDff¥cùzáÒ¹‚Âü"únÔ­´ŒdmQ¡¡X‡ç†ø”ØÀOoª4™mæP]µ¬«ªÄñ›M ÿ±6þýÕ×Ì<ûmÐVT k_–——$%­X´ðçÿñó3—Ψôª7›hº©©¯ ^ÐêLº@¨êŒì´§Ïžjò­ÕU†â¢öŽ6¤lgWGs‹;¿ WIߎ®ö¤ô„ˆäŒDŒì÷ï÷ö=|àimAnÕ580׋”?¡àˆ?~”«ÊÆÀªF*ùøñ£'O+êa„¾¾û÷ôâ‰a²:ùŠ u¸º²Ih<‚wBGg[k[K¡:¿²ª¼­½EoÐFÇÜ­op4{Üyªl³ÅÔÔìjñ¸±N|J\à§Ph,DЖÛÊCuÕF@ÐÚl¶“—#÷¾½÷Ô­°óQÎÞ]»ëTØÁ#ƒFã_ËËÿn±¸rr~ó›÷þë×ÿ5gþœSNáòfM7µõµA Ú–ö–ÛŠá519~` ¿¸Ô€4Õµ…Z¦\5v›V§6W˜ªk­Þ? ÔÖ›Â>KŠq56Ü»×Ós¯»÷þ=ÄU]ƒýñ“GÖj "¶çÕ, ‡¨(Ð…2hÑ™hFwO—·Ic@âNbgæå!hõeú÷£ñm2.}­Ýf«©ÊÌNÓ´XÈÎͼqójYyI•­"5#Y£+¨¬2Ûj*ñÜ“0A‹N3U™Ê«E Z›ÓV]]ít:£££¯]»†…‚‚‚œœœã‡WgdÄݾýÐ`èÓjÏ›»`ñ‚«·®¦ç¦kŠ5!o6ÑtSÛÄ Å sѱ‘ƒƒT‹µÜÝÜX\ªGta¾ˆL¥: ¾ÈÚȸ»+Ñ ‘GíÇ}ˆXÌ û1ÙjëhéîéÄS*<èÅ<2!)®@§ U#•Î|òäs >p»]“Ø™Zg£3ðý -£î†{ª7êâ•Q5ÃÐ΄Ôxµ¶Pi x/zè¹A‹´s¬¨ØÈB}ahÚùÎÄCɳWÕ£Çô†ÉìLÜZƒÙà~´ÚôäÞû=u v‡³:;7ÃX¢s8kòTÙ·®[*Í5µUY):ƒÓÙZ‡­©¹%ðö+Ak©±„à’Æj·–––b:›’’qéÒ%,Ÿò*Êê …E¦"ƒÙP\бÞ^E1Ž^TZTøêoÐÕND¬¾L3 M#CÔ™Èìú¦ú’Ê’÷ƒ€‰KŽMÏLÍÈJûŽÌÔô‘RÒ2Râ“âb’bp.)e¶™«U¡ºj…KŒÄ]¾zùŠÕ+Nž;™­ÎÆSNÈ[E4Ý8Á ZŒ°²¼™À4ÚôF šJ+Ko¹Æ¨ÉÈÏÈ.ÈÂíëU˜=\vde©¼R³SS²’ñè€Ç…‹Ü*·•[Ö_¸‰tžù2ò2Ð º¤lè›D4ý5hK«Ji:+0447„¼o 3éòêr«Óò–‘Dœng‚¶­»Íd5ÑtVh,tµ¸Êle!oÉÛ1”*ª+lu¶·„ˆ$âl Vжw·›mfš¶¯êb5‚6ä-ykÆ cEMEM}MÈ[BD©kª VÐö´—W—oDã¾w}…Ál(±”Œ³eWÊWÿ•'jäžmo¿«» |SÑ0ÿµNie©¡Ì0ÎN4%šFOcÚã_x÷îK¥¶¡öÍ/â›w*Ú<)gMDªoªRÐvôt`60¾ á.^¸dù’•kVî9¸'» MüÞ­Î]>—7ê~;÷î,³–?}\[¢õ_yBО‡(»]¼tñ’eK¢£ßzoÃ]¼z1!-AÀ†aÏè·3άݰvÇž‘ÅÅ£®™–“vúüéqöã ÚÖÆÛƒK‰S[µf•r²ë7¯÷¿O®Ýº–’•2‰Ý«ðm­7hÇ:ÁgN܉¹£4_³TYûí/*-úÞ=gäeàÎ^ƒ“ ¿à…SîùÏšˆTß´ ½×Aj|{ì9{ñl¾6?3?óäÙ“[vlQT:ÆÍBC!–½. LŸ˜ž˜”‘TTRd4׬]sðÈAŒò8ŸûQhŒ¼Ÿÿ•'[i‹µÊn1šoؼZ¥6ª“3“1\šªLXmD ¶Â˜›§ÉC÷§)R%¦%è ”ÓñµùæÝ›Ær#ÖÄéǧÄcAùó¡mš´/lßÎ=;£¢²UÙZì“WÔc}el‚áÏW¬^=(Ç¥…¥Zw«û-º}8äåòU˯ܸ‚3Í)Ì9vúئ­›po ='t]®:7#75XÙ`6¤ç¦ãd·îÜŠî ðÐ8ëÊÚJ»Ë>ê«è´y çáC²âÛ²ª2Üÿüõ/ÑK˜Y¢µ¸cý¯$±Ú öÞÕzï]—·yûf´ˆ}ó¶Í{ìÅ:ãO3/[Œ¹^¾ßI¢_—­\†¹¬ÿÊo ¢ƒö“•ŸuòÜIÌ]6mÛ„  ÎbÁ¢ë6­[·qB-Çì#²Î¤ûιGF`<ýÃÿ€äÀ:KW,MËN yÃnGßFwa¼FÆà[½IøØat;šºkï.e\«7¯nܲñÃ>[µ~ÓzC™Á†éï®}»vï߯ã)]‡{ÛÎmÊuWºâ÷üMxPÀ ¬ÌqlxXÄEÄ4Ýw¥Ð!;÷z†,¯B÷úíëx›à~ÀÓÆ…ð ûÃö9~IÍ÷ì߃‡T¼¡/]Œ¤¿~æâßYŒuKŒØŽ‚~ž»`î–í[°²²®zÞ÷ŽÃÑìs¢w@CKЂ¶·³ÊQ5>çÇŸ|ŒfÑ’EÍøèÊõ+Üñ5:!Z­Wc´:ù¼¥Æ²æó5ú u…x¸.·•#ñÞu?ðùúÏ1®a?ËVxßöþ+¿Ì0Ha<­¨®@'bÔÃ=Z‚bC GÔ`pÄ!Šp³çÌÆè&¡§àÛ§Ò0 ¯šõ'LbÌVóö]ÛoGÝyÃ𔃧t ò-öv$,61MÅÈ>¢ñ¾šQØ«07·5[Ö@:ÿõ´W•T” ø1±ÃáèK–-Ñ5¾["·0MÅD?3/øuÇ4uº£¾Š.Zº|éõ[ב—¥–Ò¸¤¸ã§Ž#Ép×i <âèKõHйóæz³íFøµˆkh?¦}˜}¢ñˆ·|M>¯\w¥3qv|ø‰p?à‰Ñ‹‰ò™ gÒsÒ Š ð0éëÞ˜ÄýWž(ŒAÈ•oϘÁäkó±¬*RaRåJލÁÓý«£ûšá[ÑæÄôÄ]ûvu!iæL˜—V–*ߡŽÊReùšŠÇ‚­;¶¢©˜%ïÞ·{œêÍú–Ž–@:®g/žE˽w&ñU&¤Ë¨]—‘—v4 yƒ‰þgk? ðºCyµ÷ÏBÕ7×úªÒu˜Ã!DÑÏë7®Çq•μy÷&229Óûª0‰DÍ…ð x8PÞ„ØÖ¿ñJÑlDª)·½Rƒ ™nqE1*}ïÞ7îÜÀ¤P˜°â%åècÌ}}?+Á1'Æ3+ú =¹aóðíÇÿNð-ŒØÏð[ôõû+l?‚5%–’‹ ¿‘ˆ¦­àm÷ýîêúêñ!ñ€Œs]‰Ú˜`öƒYšòAVDd,Ôàoøäôä¹óçj‹µ˜Ã»tÑ[]÷z?wcîß3¶Z¾r9BÈå ÁÜYq7# Ú å¶rLïúSÐæ»w`,QƒQL9º¯¾…áçŽ6+Y5ÖY„¤aH‹gNàê ‘"˜‡aØ9æ‹k>_ƒãƒ?@SÓsÒ‘¸X µ‘HGG£ã-º}¸„Ô„•«Wb|Ç™â1 £?B´ ¨À¿ë0åµNËNC·¼÷›÷Þ¼3Çâý÷_ëªí.ûX¯*]Ÿ?kö¬#Ç ”4‘Ÿ­Ê>~ú8f´¨Aâ6FÍùËçÑ«þWjp-]¤ô§RƒœÃ†ÑñÑxTº|ý2®Âð6`‰Éîçë?/­(õµ'+?ë• yê<4ìbøEÌïã’âf|2ãÄéñÉñÍøèäÙ“ÞSûîYø/øïÇw‹úÖ9|ü0žÃÐ œ×o÷Ûá7Ñ´ånu+ht×6ÔŽocdç⥋W®Y‰w¬®TçýãV3†Ëµë×b*ƒ¸EMNAΞý{0!;sþ æ+9›¶lÚ{`/Ae?’3’‡ï[ac™Ñå IJKZ¸x!Æ24RB 13@ 1Ñ4J›‡×àXÊÑ}Íð-øö¬´§†“ë,BÒ0Ô”T”„_ß¼uóö]ÛZHYÔ#Ú±&®®…wº–‘ŒäC¬Û°£ü[ôíBêà٠úršHÙ̼Lœˆ×y+U9hä–í[6oÛüæùv|]g®2ïØµíñu/ñÔˆ¦9qdÝÆu¨©¬©¼|õòúMëñă‹âßx¥¦¬ª }«Ü«J Ž‚½á½°vÃZÜÿx ÞLjOŸ;ðCòùÚƒÃ,sãæ¸|xìÀKúR=¦³iƒÉ€pFnVqþ þûñÝ¢¾uØÊãê ¼1Q~#M[Á Úž=˜ Œ¯öÕ;Våõµõ¯k†¯ãÛjøúÃ7ÿ¶²~ô•'dx ýÛ0¼…#jÆYÞæá-õ,‚ß°ûÿÎu©]©ÔÒ·o}ü»køò¨wÔT5¬þõAGöªÒí¯¾Ž¨µñût¬“õŒ¾³«ï}ø&¾eÿýŒwo|w?£Ë·Bî")4µ5/h""¢i%xA{¯ïžÓí$""šVšÛ›ƒ´½}½uî:""¢i¥¥½%XAû°·¾©žˆˆhZiéVÐÞx¿¡¥ˆˆhZñtx‚´î»<.""¢iÅÓ¬ õþ2T£“ˆˆèájq5µ55µŽ§µ«5HA[YS••ž˜žHDô&âSãcSb9n˜bScK*JzôŒ£û~wç½Î ­¹Ê\XTØÒÚÒÖÑFDô&œuÎ KÇ “Ín3”î?¼?ôrèåŸ_Žj`h «·+xAk,5>~úøÙà3"¢7ÑÑÕáp:8n˜šÛšfãøA;84È %"q1hId£íóχ¾bБ´$2ÿ íÞ_[_[ç®C¾2h‰H ZÙˆ x>PSW£Ò©yˆ[Lm´D$:-‰lDÐ6z‹Ë‹[;[{î÷”ZJñ*ƒ–ˆDÇ %‘Ú¾Ç}÷úî½øâ–Ÿ<{ÒÛ׋e- AK"ão‘ô´$2-IAK"S‚¶÷a¯ò{O£ÿÁŠçAýËP Z"š-‰ Ak(3äkó£¢¢¢XöŠÿVd|¤Ád`Б ´$2%h¥ŸmülÅg+–­^¶tåÒÅ+/Z¶hÁ’óÍ›³pÎÒUK³UÙ Z"ƒ–Dæ Ú•kWzÃué‚y‹çÍ]8÷ÓùŸÎš;kæ§3?™ýÉÂ¥ ´D$.-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰ŒAKDÒcÐ’È´D$=-‰Ì´k6¬Y¶zÙ’UK¯X¼pÙÂKÌ[4o³çÏ^²b ƒ–ˆÄÅ %‘)A‹½q÷†××ï\ÿÖm¯k·¯AQqƒ–ˆÅ %‘!hfco_ïà‹Á_¼UÿóþÎ{ Z"ƒ–D¦íý‡÷‡^½üóËQ  võv1h‰HP Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç Í”ÈuÄIDAT%‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Zƒ–ˆ¤Ç %‘1h‰Hz Z™ˆAk(1ô=î{Òÿ„ˆèM´µ·ÙvŽ$&·Ç-\Ðæäá=ã¬w½‰ÊªÊ’ÒŽ$&S¹ÉPf+hÕEjO«§­£ˆèM`,³TZ8n˜ªíÕÂ-FKDŸђÈDü-ƒ–ˆ&„AK"cБô´$2-IAK"cБô´$2-IAK"cБô´$2-IAK"cБô´$2-IAK"cБô´$2-IAK"cБô´$2-IAK"cБô´$2-IAK"´øúâ‹J¾bA©dБд$²Ak«±Õ»ê‡¾¨¶W»š\ Z"ƒ–D6"h-VËÙógó òÓ2Ó.\ºànq3h‰Ht Z™ÿGÇU;ví8tôP]CFKD`Ð’Èüêù‹çv§½¹µÙ÷ÃZ- AK"ão‘ô´$2ƒ6_“ßØÒˆ–½‰jGu©¹”㉩²¦ÒPfè}ØÛ?Ø@ÕÓ§Á Ú–ö4á?ƒÙ€ˆˆ†Ó›ô!oƒ¼Ær)pèaW³ëᓇ?Ó£÷úî)h‘êˆ}L±Ç‚‡ÖèÄèÈøH"" \BZB[WÛ8£.¡†”ýÞO˜ûžô)h?{Œ¬z94–æÖæûv¬\»’ˆˆ´jݪ#§ŽôöõŽ3êR€úû1g+hûŸ÷õãbð´{¶îÞºhù¢Eˈˆ( ‹W,>tâЃGÆu)@ƒCƒBí‹/^tÝëjéhyþò¹/h·ìÚ²`é"" ÐÂe ´“óW[Íbµ ÿc¡ƒ)Û}¿Ûh6Úìƒ/}A»yçæù‹çÏ[<ˆˆ±`É‚°ãa ÚɂتwÕŸ=¶¢ªâù‹ç-®½¶X[n+:ðÔwÚM;6Í]8—ˆˆ4oÑ<íäúb(¿0Ç®v§]‚ }ôôQQIQeM%Zù Ý¾éÓŸ~:Ÿˆˆ2gÁœƒÇ2h'ÑÀÐ@ZFÚ¡£‡š[›%Zèíë5–›Z›|Ÿw#h7nÛ8{ÞìYsgQ µ2h'Í‹/^TÛ«/\ºP×P7üï ´JÖ"h‡ÿŒvÃÖ 3çÌœù)dÖœYŽ`ÐNÌ ]M.å_¾ó‘ h•¦û–´ë·¬ÿdö'DD ?}ú§ýGö3h§”XA›W”÷èé£'ýOÆúkàö¸7ïܼpéB"" \Øñ°žû=㌺ §Oñ(óýAû¸/G„ Õæy:<]½]Ý÷»Ç‚ Í)ÌÉ.È&"¢À©´ªÖÎÖqF] œ÷¯0>}8ž'ÛºÚò‹ò§ ÖëŽ?zâô õÈfÜÜ»÷îÆsVcK#Ž…ïÚ»ënô]{ƒ]y[U;«q— …¾¢7Ä ?hcâc®Þ¸Š1ƒÉác‡1^ù×Ä&Īuê7\yB{góI„ý:rsJg£3)-éVä­QkÎ_:ÑõMVžèžÇÚ|MÆc'•[Ëkêjp"ÕG­A²¼áÊݳÿæJT…"h›Ì•æ½û÷Zª-†R" ·orzrlb,®AZV²3_;êö’¥KÐh,£Ñ¹¹¸ù«_&¦$"ê*¬îWóK<)8ìaÛŽmØyYeÙÅËñ*r[éJt¾þBÍÌY3‘îx¤Â>·j½:.1O”HS¼zõæUÔŸ¿|Þ`2àÛ‡ ×ðËÈÉ@Ë´4Q Zñƒöâ•‹x"Ç‚÷ø¶Ûxþ5”x½ÉÊÚó8›O"Ìa6mÝd¯·cCÜ™sgükÐ%æßdå íyœÍ'¦pˆ:t#Näì…³Hÿ̯jœ5o¸ò„öì_S×Tçt;[:Z‚´}ü2ïȱ#a‡Ã0§Ä…ùè¨;[¶mA=¬Û°®²ºMÄÄMÄ͇MLÓ•«W¢ã£ÒHå9sç(SRÌqqÓŸ:{ ƒJ~»_…¨’‚8a¬ƒ¬“™“éë/¬ƒi®ò†A¢#A±9ž¶vìÚð¾~)>9Þ÷a²²2*Ï]<§…AKÅ ?hOœ>‘’à~õ)("<©û×LÝÊãl>‰0!YýÙjÄ€ûÕåÈñ#þ5S·ò8›O"D8¦^ßöü©˜:û×LÝÊß©9}"9-Ùû{ãÝø¯9xAûéœO1ã¼zãêšÏ× G®oŸ 1•ŒOŠGpzóß]‡Ý¶ÿÒÕK‘±‘³?mª0áÑ+ ù¬µÖÅK£7eØ‘0¤é¾û0ïôõÅð Åy⮜ybjâðu„P–´I©In¹»æ³5e–2L‡w.VÆDünÌÝ=û÷à‰ÌÍ ¥‰cЊ´x’V¢æÛwm/·–û×LÝÊãl>‰0‚mؼA™c ê0®ú×LÝÊãl>‰Tæ”ö•9ezvºÍÔ­<¼&·0©Wß\ïp9‚:£U>:V~ýØ÷Ãpd>ÒM©vT—V”âÕðëáÈ?Kµ%¯0oÖìYˆÕè¸h„®½ÁŽ3ùxÆÇ¨ÁÊ·lĹá9bøÏ_qý¢¨)-/½q—¶ÆY³{ïîÔŒTß:Ó2%=÷7"‹§-s•9.1.9=íÁQ”ŸÑ"b±€VÝŽ¼ökôš+×®LÅ-Bï*­øA{7ú. *l+1^ù×LÝÊãl>‰jëj>ˆ‘ #$F¹;Ñwük¦nåq6ŸDúý©³§0ò×Ö×^ ¿XPTà_3u+¯1YL­­ˆXå¥ ^Ð._¹\ùô_£ã£OŸ;®¯ª©º|õ2î-$&»H¸ÌÜÌ=ûö wìÚñþïßGs±í[7Í›·mþÝû¿C vrãöù ç#YGôòúë±7ܯQqQ˜+9~š+;u¼A{øÛ ÅÑ‘šX?ìpš@-«,CÌ+e#­}+›‹÷îß«/ÕcWÃsˆ¾ƒVü -1—;qÌ; ÃÃ7ÂÀ¿&+/K™¼ÉÊX-6!¶¦®æMVuóI‡i š„¡CâÉ3'1”ù× ì1±Q~Zü½+»_ý_IÊ/¯|ïÊ£n>é0³ºxå"Fï£Ç^»y ýï_£´ù WÆjÊu“•QséÊ¥ôœtd^B Î]¼Žqëh_? P‹ŒEÊo±£ÇqÚˆÌjgµûÕ/㥴Ì4­Q‹I­òQ&¸8Û¢ÂÜ‚\¥Fù½åÿ϶UiUÞ ëlvb±­üÚ”Ž2üÓf$kFvv«ô)î0c™5è)<øVF!űOL¦‡oNô½´â-ÞìF“ÏЈ0µ£-ÍßpePëÔ¬ÞdåQ7Ÿ å0Öa„ÄœaÔšáõ÷®ì6œ¾ÉÊþ5“Ïã.·–cØG¦`º5jÍëxƒ•__÷7YÙãFÜà 6·5£¦ó^'"¶µ«ÕÓá‘ò/C™*L§ÏžÆ“×ÔÝ‘D“…A+~Ю®©ÉZß\ßÒÑ‚¹–ݯ&oMmMR-f·×o]ŸÒG?¢É eÐÒ;¯±µAÛÑÓáht`.[ç®kënSþïO§œ3Z"‰¤ä¤ÜM¸••LŠLŠLÌLœêKF4Q˜¶"P1—õtx¼ í-øŠI-¾cF‹ýbï¿caaaaa™Æ…AËÂÂÂÂÂ2…eÒ‚¶¿¿¿µµÕjµªÕêÄÄÄðððÇoܸq! Ë4.ˆB"bለDP".šÚÁÁÁ®®.§ÓYRR’““sùòeìz Ë4.ˆB"bለDP".šÚ¡¡¡ÞÞ^L‡‘Õz½³cì~œ……………eD!±ˆpDD"(—Í íË—/=zÔÞÞ^__o±X°;D7¦É·XXXXXX¦qA"‹GD$‚q‰ÐœpÐ~ùå—ýýýHéÖÖVì¡ ²Z­Îbaaaaa™ÆQˆ@D,"‘JÄ%BsÂAûõ×_c"üäÉìq©±ÓéÄ~ËXXXXXX¦qA"‹GD$‚q‰ÐœpÐþõ¯E>cc5&ÅØWWW¢ÛÍÂÂÂÂÂ2 ¢ˆXD8""”ˆK„愃öoû6CDcû—/_bGƒƒƒØã–i\…DÄ"‰ D\"4'´,,,,,,,“[´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SX´,,,,,,SXþ?yX]§8 IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/machine-properties.png0000644042355400116100000005115111675570700021666 00000000000000‰PNG  IHDR|Ëâ=¿ä IDATxœí½÷W›[šïÙÀ¬5?ÌÌšuç®{{Ý»fîLÏšž™Û«§§{ªº«ººOUwÕ©ìlç0“ÁÆäœs !‚@9 %$È 2Ø›œ 8Ûç¸z¾bsäטhƒx?þšµõ¼ûÝïÖ~÷ûÙÏ£ðêÏþ5jÔœhæêP£FíÓ2 jÔ¨9Õ(t¨Q£æT{:oÞ¼yýúõË—/Ÿ?þäÉ“¥¥¥………ùùùjÔ¨Qc°8phȶ¡ƒÝ°?B‹SSS£££ÃÃÃ=Ô¨Q£Æ0`p" àÐ:mC¸ÂÎÀÚº{÷.šnoo·Z­FjÔ¨Qc°8phȶ¡VZhëììD»:N&“US£FÀÀˆ(€ @è@¶ ¤g–€.4d±XÔj5ŸÏg³ÙÙÔ¨Q£Æ0`p" àÐ:mCˆ… CsàYQQQJJJ5jÔ¨1 X€€¸4€dÛÐYXXFª†À C£|9M ‚)lQëµ€¿[)l÷èÎyRtl?þIê =ƒ=kÊÔhrù)þȱ]o]û¤Ü—-888))ÉŽ>¸4€dÛÐAV†ô ÜB†ð 0ã+Vž<Õ”¡a#踼{L ttÙ®]»îphȶ¡333ƒ0Éh4"jBÚ† J •½+Õ:ÕÖ 7²i³ëi»‡Û›Úc»tšL®ý9¶ë òf‡  ^6pñP€Ð€ìt6ŸTT®“ÑjÜ:®îÞAÓ2}v:*¡H%‚P¨QTð2Ó9Ñiì('(SXÅWÖl0 ¤c\Ø¥f×+8Frg ëiUM'‚sÆv蘛ÌNÛõy_íûó–h÷¡£ŠÔ"¢^FLa`zYl&7Þ J/‹‰- dÕä8:@EµJA§Ùìòî0ЮC‡yÈô²è4Nt ¿À.AÁ6 ü-lZK©ìÈìòDûÑ5?wcUA³Va¹Bµ¬º\À-ço¤ a_Á_c|×;Ü [—F$Ö¼·ãG}ÃnˆÕ52yšXU±ùáÖÛuF{ƒ°£OÊØø¡ÐqÎ)þȱ]o]ú¤v:bµX¬Y« N\© p»bó¡<üÝîŽÈ°²Ëغ –p‹ FÉlÜ@êZ»¢ôÚߪÔb Å)\OœŠ<±4]¦È¨Ê%»×·ýÊ¥Fî–Ë’výXNQ]cÝÐqy÷šÔví:t$‰T#%B¾“Yϰ¶©"^u²êËòšÄíî›Q›]‘èèÀÖ%V‰ÙÜ’Å¥…Ééñ‰©±©é‰é™ÉéÙ©™¹éY»ffçgç'&Ç‹J > ý-J¤–U°‡‡ï¯h„hxY÷G†;Gï–LÜO»›ÒÕ[k¬2F{$TH#:ÕÕ£ü÷ yÒnÈyÚ:–f‹Ë»wÀ@»ûÁjW”Q“ÅçYÛWeàÿ¶ßtHV}ªLP°­}3Ëâr*’غ$j;tõôu6µ6@ÍmÖ¨½‘¨­³yt|d:Ûo‹)E<îâââØ²/ÛÄÄÄ¤ÝÆæ§ ÏgSŸ/5={<4;–ÕÔ”#¯•ìVg4";qTÿÇÓû9¤ÿ÷áU¹,Eª(‰vïé;A¦FÓºÐi±ìÈ!¸bIW˜ÉVHvíìì-£g÷¡S+•ieD™ÜجòxŽˆµu•‰X‚š½–“s#)ªo*±eÛÙ=“—[™äèÀÖèôötØZ;ºZ;»ÛlÝí]=D=}6D@“EìÂh‹B–è,,,]êš~ØÜœ-×Iv¥'µb…,¢KóÏîþ‡W¿Ÿëþ¯#æ?ïÖý•NtX)ò’¨«vov[¦¦u¡SßR¿#‡ðÏ໥ê¯$kïäð]þ|]+‚ž]‡Žý`º­@GÌÚº¸¢l ÿë©Á𥉤{M—D|·2QáÖw_ŽN¶]I—¡ƒôjøá½{Ãwï õöö õÝ»?8:626ñpn~v’@gûíoQH€+xå‹‹ $Ò}¸;ãÓSý Óâ§³Æs[£ô¦ ù.ôA®«шqýÕËñÏ^M~ûjò›—_?ùýtÏ/‡ÌU+:-Q•ïÞ ìžä:¹¹É¼tvà(r¯~–¤'©Æ˜ÉwùSv±–ѳûÐùùìâofylVE|™¸˜a­ËQ(³'KÈ¿Þ]wli"ýéTüÂXv½üKž ´LœïØ ×+Ø¡S—[•„£“¼_pôY€¤µ+ÐA8óðþ`kM¥NX­PJ•*™±²l@W»ðhöñ“%t6hmã­)GéééFX‘ ‹¤WSSSÓÓS³3£æúÜ7•órz©ü½>¦@FI¡)­ývªý~úàŸž}õ|üÐÒýžíÿÛ±öÿe¸éœ´ý¯ý–_)D^2-+cûƒ°KcK ææõ¡ÓZ¿Ý™³V7ä^©ï@g½·UøÈÑØ‘éñaÍB΀Ž\/'Zޤx3±ÊÅYþ ÿK›áðìýèg3é/çs^-ÖLôE´h*øGª…·¹’Ôܸ©ÌŠeèüÜ­Kª]ÎøØˆ9=Å2ªRL<¼?H‡Ë1úùöˆ…OŸ>žœ²CçÚߢÄ;t”ŸæV€3==33;;7ûèÑ£ááûÅÜ¢]ë†L®Î¯—þf®ë›ø¯Ó=ñ¨ÿ¿Lwÿç±¶ÿé^Ã3Üôß>lÿ;“ðïåê¼Ý‡ÝÓ&ÐùÐfËeÒ€L>p}{«*Kқķ ®"ЧJ!uùsw¾œæ!€¬Ê„M‰S#¼mþ®»îëQÛùÙ»‹£þϦ£_/‚;O§ÓFS'bl¦sÁáJQÒÆ­q¹¼ä©V è,--vÖ׃ƒæ òï]½"/Î×§&Nøû"Ã'ONM²8»‰F\É+_ZZše~p¦í÷˜µgnùF³ËÐaíæt‘)Ôù ²ßL¶ý‡©Îÿn´áßuJÿc³øÏ›å~·þëüËvõß(Õ™ ƒ\npýÌÞ† »¬J±G†!GÖ›-íÍ‘õU™”פ‹{R…v]J¬-¨‘¸þé»H΀ŽB¯Pø›U—]™È•”l rIªú«>ãïÆ{/OöîÿvîîÉ¥Qï§SO&n/>ôz4â³0š45שùƒ¨Æ+)Þ 5@'—b?úrÖ(è×*èÈ< t´:U_sÃ@~ŽáÚ•»mÍ=2‰ÅÝ QO½¡¶¯¿gj:k7²•Âzú¹‚D#t?~LXã Ž8sÎ<œÅÅE@§„ËÚäI}@á~"Ï*²ˆ=gûOCº§VDÉÕ,¥àd‹â¿Œ¶ÿï­Ê¿¬­MÒÔ‰Vú°£ƒ°KcK @§¡µaÛ3ççBv¥är²6„ÓXÜÀjNõ‡Vt{ä6]Ïn¼™×|2ZUÈ—¬ÛòV 9;5O¶Ù¬“ £Ô+US™T!ao¨Rž8EÎ?Õ ýÇ^ã?užöž»wfþþ¹…‡>‹c ãÝž½Æ¯ŒâÏ%üë•’<Ôß µìŠ„|^ª£[RP·téñ¢L!ê·˜uõ&=ùm µL44ÔWß`²uu:Åœ¢h‹’ÕJñññFìÑÍôÌì p3»Œhaqaáñã¥á@§x÷º¡4(!…N!WæY$Ÿµ þ{•"E®•ËT=ÿÿëü «ø?ªÕ©j£LePî^7vC–˺Ðikøàf«ŠÐ<á­laP¶ðH0/¢Üv.¥þ‡^P– ËòU —?wç 4€v:ÌCf#ÙÙ:RûßJIqµ(Y,ð¨þæ~󱙡³S}_ÌÜêÑÿA+<$Ü≳*é;{½_È©H\ŽqYïÖ”A… Œ@G¯S÷u|žæV@Sc‡DdHMm¬¯WJûW ³fËk [+ü,Y­ Ð!?Ö¿ÌÄ8ä<Ò­@g[}x·3J«D"I¶¦ü×RIŠH!)ª‚_´þŸÞ’Ë3ß.0ŒíÖµÅ!ýб%ªo©_:Ö6ë6®¨õä“&H¨étne ·=þÛš·{llד3 £6ª‰r*ìБ²·¢JHRR#Œj”ýãD﹉žÏ´ŸÔ ¿¨gWJK·Ø SÀKut`ëÂõÃ)·C§«ÁÜpáÜ£´´Á‚¼ZaI,˜’˦bbüf'Ç t> ý-J^+t€•ܬg12¯§OŸèì^70è‰H)âËøÕbOXZ)àV*xüà·}õ-eÿß"I.ê0O÷¾ÐÆÐùøö—¡#Ì’ô¹g7:.¾®•“ c?XÝŠr*—¡#co®ed”‰JJkò$_·Ÿ¹{£K÷»ÊÊ›lA!W\²‚•ÍÚÉ©L,¨Nst`ër@gjr´%+£ùÈ÷üÊÉñ‡£#wS’~86¢­}ýúÕ2tXÌ縳RhW ƒtýÌ8ÀÍ“'Ÿ>yúìÙóá‘áÒò’]êƒz:s„ !OÌk8Uœ’òVY¿â²UùI+~QVê^)`‹UbÔÜ½ÑØ´ŸìJv!»Ð¾Ÿ=¥¥ÅeÅtiè|t— à‘[ŠöLŒ*²P¼âtÉøì‚$*INQ_Ê_yRF5V¦œÂDÁ ÈîCG2­(§*!——T!go J9Ëe¥eâbVu^6;-¯ÀÝ*ýçñ/yùgY…!yÜÌ~!WZbÇÊ»{½_È©J,¨Iá5& ô~aMa«lùÝ+„só33£ý*…AP#‘ å ‰µ†7ÙÑþêŋׯ_:E¥J£rƒC0 ¤¼iÁ!…ÞÄ2ŽŸC´³æñxž={úìù³çÏŸ¿xùrЩ(YµïûÚV˜Aü,×ÉE*Q¬¦JTÅ©f—T–•‡i¿rÅá°«Š*E•bµXix;©-)sl3ó3/_»œ]”mʨ,*+ºzýjbz¢ªNõþØÕ·®vë¦Cº•±å«•,Œ%” 5ÊíŽÿ¶æí®ŽíšBàíïp;@ Àƒâ~Ó½ZR½ö@-£g÷¡ƒÎ™5DËÐI®Tp6xèUåf§$d…ó‹ÿ¹EöEyÇ’óbs8%ü‚ri)°²i;`\aMš£[_Îg•ôöv @}(wwwu÷tõõöÀ3twjimÎ/ΓÖJ?à[‘Ò àVrûHO~ÖàC õ\g—úá$âˆÅj‘@Á¯‘°k„É55á¼*ßJ~N•¸¢ZV 0Oö™ºk=ÙXè@\JÜ…ËâSâ“3“ ˆ‰F²Á. m ëA§±½ÑUOd¿£¬ºìºÇuß@_°>08ðŠÛV‹yÕ¯ªí:tj͵Z‹–(—”_ÂSp·¢*yÒ¨’š‚ÂòlVYT%÷Z7¹¨*#d!±ªR”m¥‘<^r?ÃÑ­K¦•qªØy¬ÜÜ¢œ âTðËÏÀ!¶"Œ’šŠnyõFªTàzÛ¥>üܺN¥6*•z…B+Ph82M•´VL¾[§ÐÙß‹ÑÔi˜§Û%BŒâ|óÝ7_þ:,: YáÆõ‘C­¦Ž&×>—ý¢JA%Xó‡ÏÿÜ#ÃÝ``´ëÐÑYtºú:Õ©ÕÊò­JQΓs¡*YY +CN»¶ÖB>/…ÅÏpt`ëÂ9^÷ÚX¸Ò˜Ïq·dÙL»ÝFVæ™!‹ÖyÝØL8)IéI1‰1r­|ÓÊÈ¡6€ŽËŸËþEW^S â`2l\Ú}èÔëô z¢üê䂚´U…ÓƱ™ŽP}""‹êVj"‡Z:ÍÍ."ûE¸Ì1àÌ‹}½jЮCG2X Dù5)…ü4¾ºÒi*¨I-f9:@EµJëCÇÖìòî0ôì:tŒV£±qE@@?¯©tšÀ¸Q¶£TT«„j=è´ØZ\Þ½ƒ&«]»ºÆ:S“‰¨d'CXËÛ UÊÊšªUN0®T”ãèÕ*!‡Ú:.ïÞhí:tp$s³™¨ˆŸÆfŠj«™B—æW%+ÃC€åJ)gUµ…½¼=H L 2JÅ9Žl*`826RoÑ“‡ì v1·øýj2,1-qëÍ~€øR~hd¨J¯Bc“£Ô+wõˆL•ה箌f ÆDkÒn}Üö‘C­Ö®ÖhP¢’ܽ]Á¯`Î|¢ôœôjqõ*P.tù 8M=»æ!‹éŀ޶š)®°äÄÙŽœø>§4ÃŽuÕáï¿.,ÏeUæ—Vâ!ê f)••ç–ð–=µÕ¥ÕEB ›øªJvMôû?þkZ^R…˜Íl[œ»õA14¾?ö}m]-y˜’Müb¥X¤‘ëŠ'â]ºz Ã'RŠdµ2bljP\VüË¿ÿenQ.®y<}æÒ©,Vâš#'¾«°ÑB1¯àøécaqÁý7ýýß&fÅ2ÛG`Å‘ä9:°©°bãÜ Sbàb.)/¹é{ó¦ÏMP—:Ö+@…/¾úâÒµKÐíÛRµtëÚT%Ü’ï~+PÞ8}¶Î¢C„åîé~ëέ*A–Ó€[j£:"&âÌù3 BJf (ùñGÏÈÍÀ¡IOÿèGA™ë×Ï]þè8J`p )€ž#È‚áèâxe\?pbâc>ûÝg:³½ÊÈÉ@ŒƒQòöó66wpLvC@§½»}{­µ6”U•áŒ(j˜6 © ˜ü8;ÁaÁºþöw¿-bÆxpÖ\>NAÏ®CÇÚfu¨D”Y*Αêrs¿ÿá»Ô¼¤_ÂtpEþö0`„¬][?ЦbW°ÑÔkÑôÐò¢ã£¿:ôb1ôäøÉã¥Äÿ–?qþÒy„©™©è•J§úø£gçgÝ "eK³å‡?hë´8D^Q.-Œ:ÖàCD†:b…øð7‡‘{úøû`(à€Îž? .ïà˜ì†ά žöm5…|*<*Ü?È¿ZT”–äîá.c¶Ü½1Ô›õç.œcqXÄSßRO<à”ËÁÉÚ}è´[;‰¶$Gf! õÿîØ7à蜽t Ö¡ïìÐA…âÊü WÏ!Kºæy…+,…ªLß9\%ã“S’¬ žÃßMDM¦“ÝȲt:z;¶Þ†=+?+,*leü;šÒ³Ó™ ¤ò7+/ëóH©0¤ðåBâ!Cú‰ˆ gסÓÜÙì[’Í‘æ)Œb"äVÁ‘AàyˆÀyVtrÄÉsÇ¯ß¼Šˆæòõ‹%U…`OÆõ ð@’åîíÆ®fRQIሎŸ>æ{Ëëü•³Ó­ðäYI™qŽö!VŠBf6r7w7ä!² Ì L *A•§—ç¥+—SëêdjYÀ­TûãDBqåÚ•˜„°iëÚTH©‚CƒI¹F\sâÔ \ÉX03r2Cáú'YŒ¢V½œW®Ô)Ï_<_ůڑ££ev9ÛÛ×ûâå‹!!HÙàD샞¬ŒÒ 7 $Br‡§h Âa/OoO< ÝŽÉn¨£§c=ètövn½°&,2 ÃáAlx'ìLœ//ŒØ™óg°Z &<â!CúIiסÓbkiíj%bKsÊdùJ“„HQЈ!¹Q  Hõ{ò¥ã£€:d°²ìHZÁƒš¨f÷Dx(·AŽ4·RÁrt`+œp”ícÔÑŒž…=mµâ*"Q­¾¹ > l"þÝÔ¾Ò&9:Iݰ?ìlqlBef‘ý9¶5’§LšÅS&])/;1>8.â/Ù„ú ÒÎvf÷²¬ ¾Îm5å“Užæeˆ¡LN®ÃãÒOA hסƒ#µu·qd¹ X 2K ;t$9UÊbGvV - §ÏžÆ¶KíS9A ËzбõÙ\Þ½&‚ž]‡Ž„´™H¤«Ì­Ž¯R•Ôh8Np“Ë“kØYaøt&ó Rí;,ëB§ßæòî0ôì:tp$¤ÍDMV~mK˜R(Hr‚XÂT~-·¹³ÉÑ*ªUYÖƒNW—Ë»wÀDгëÐÁ‘6SQíM,@ÇåÝ;`"èÙuè |ÅbBEµ7Õ=нt°ÉåÝ;hê³k÷¡ÓoÊAEµ7µt»]Þ½&‚g¤W½TT{T]¦W.ïÞA“sÒ«ÜÒ\N5‡Šjª¤²D¬¯…NÁ­áVKª©vJ<1¯€S°ëÐ)â‘ –Šj¯ÉÜdæËøëA<º?ôãO?Rí”^½~ÅñœõN*•kei¶l‰Jrwøîj;gà‚§B§»¿»ÖP+QH$òw¥Ô5Ô¹| ~v®ÿÉzª=¥M¡34<ôµ³×?¾v6t:{:oßþê믎=rôgûþÈ÷_ú:#;HZïô·ÚZ9åœ÷ý¸ÂK8%ëg¯gùå@ÔqLV«”…BCsCEu…˯+ª ´1tv=½úÑõùÎ'‘^!®9uú”ÇMo_o"7w·«×®-Ff5Ф­«­ÍÖF^î65˜Î_<ß½üî&¶t¶`+Úúl'O´4Y@%âqìkÿ¢¦­µkùC¥'OŸÄ.ŽÆÛ»Û!G#ăj¨O>ï8©núLºÁÓÚÙêø½½«Ýðð¼«nWqt@§FTó¶²ímeÐÞ½ÎÖ Þ:¡r‚6…Îà½A,ÎÐâÒâü£yèÑ£'OŸàâ!þÖ³çÏŽ>üÈFö^¾zY%ªr6tp%‡„…œ9{æ†Ç ÈÝÃýÔ™SY¹YÌ0 PÖ*}ü}¼|¼‚â“âÐ1[ÍÉiÉà6©õj\Æ”PóòÇ^¨ÃãóÀ²sçÏ]¸t¡¤¬ä}èa÷ËW/ÝRëÔ==·‚o…„‡Üô¾ L̆„”„kׯùúkZð=ô ð»âv%&>ÆÚbÿZô',2 -,.léhAÓgO‡G…{z{~wä»_üò/_äVqo¢2xŠÊž^ž¨ ô€8± ±?ÿáʵ+l.»{ýωPí¶6…ÎÀ½—¯_¾xùÂÛÇû⥋×Ü®yÞôÌÎÉ…ÿc4´Âý IDATò`$44-d;ûKx¾.€$ì\ºr P‚‹(aV@UTZ$” ;J ƒ¸ 1%sc[#R˜¸Ä8@ç˯¾ô ô3X Åœb\ö¨STRÄó-–ôÌt\ØïCÇÝÓýÄ© T¯¬Aàì‚€,•5•ÖVkN~NRj(ùûÏ'ô`”‘“uõu¡o"™VYeY¿ uÐ 8Zph0ÑÖk“($@*Ö ²¹ÑŒÊ€bœ#ÇŽ ’©dùEù:.Ô¦Ðé¿ÛÿâÕ‹g/žÝ¸qãþÈýÇOOMO•²KË+Êçæ%R‰±Î(SÈ/"¡@¡RLNOb—…¥¥JYÄ*Òê´Žà™™›uî ßCƒØôÅ_ää_Øú‰OÜ5ÐÁõzâä D"GŽÁ5¹ê›¾õMõ¸nqqÂË>,"Œ@€ Œ:ˆA;àÚ>úÃQ\Þð ð¹áy£gù \Ò@–&å}è`ÇÌœLà dA³¨…¤B` ˆ ,UJm(¦@(x„2¡¯¿/Ò(2Î]8z‚t¨ƒÈÄAÂG#ærTŽKˆÃ!€TxÐC¤`.¿ð>em ¾¡¾ç/Ÿ?}þÐy8öå'Ïž¨Ôªâ’⑇#_}ýØQ«­IDB±°FP/MÍMäÁ¦ÄÄDTXz²¤3èxÕ<‘XTï¿Ä1T45=;f?a$+…•®yËœ/âŸt€ éÀ„F;tÔ²žå·º²ó³‘"!ÎÊÎ˼€’Ï¿ø<6!ÉTzV:Éé²r³ÀMäbö,I)#ÐA;h|¹~ã:vËÅöôª§Ï•áAe…FÝ9å]8ñ}Ý…Ú:ÝýݸN=]¸páNȸø8À¥ÎT÷hñÑÝûw¯^½Š$ LfÓù ç£c¢cbc“Ä/%%%AAAQÑQ=}=ÆOŸ92* “ÅÔ×߇è -c÷OGx¾‚ —}8P$yÜô¨«_ãã9ˆAäj¹_€XàvÃ-":ÂÜhÆ• ?è‚ä 8Àå  ”·¯·ý6½¾Þ¸¤Q§˜] ¬ †òöó¾|å2.ûKW.dŽöoܼ Þ D…]P ‡㸷CnÃi½æë/ÑwO÷ÈèH’ܡέ;·ÐBpH°F¯A‚@ð¼pô²JûO õ ô ‚£2vDŸóYùhÿøÉã‰)‰4Òq¡6…ò÷GKææÜ®»!¨AÙ¡»fÍ¢ÜÜÚ\Â.™˜šÀÃñ©ñ¹Gs( ÿêè‰ò òGFGRÓS4…jÓsÓˆ†Üo¸“Ý?áé—óË]°Wàš/£â²Ä…ª­Ó¢r¥ôìtòúKÏ2›àÂÆC²/r1x× W"0b‡ú¦z“ÕÔÜÞL%lb©àU˜­f4Bvijkr¼®„šðãh–¼û~üÄq´†úˆVVÕÁޤeò‚svD =ËÑӪʾ€Q·½kÝŸ" r‚6…θ03?sÍíZÿP?Êõô^¹zø@ùÞȽâÒâAM ¿péíïm·µ'&'Ât+¨°¨pbz¢š_Íár¤riJZ "ìîáé!‹À#f³[I.Ÿ»¿ÑÚÙx;AÍÐ;z³~g§š——P*Übe°Ù‰b¨˜6…Î>°25;U^Y>üpe‡î?¸Ï­àNÎL’ ­í­¹ù¹Y9Y pŽNŒª4ª¤”$8A+T@ÎUÊ)MKOSª•c“cÇò…ü„Ä„î¾nf³[nÍž„„*Õ‚jž€g°v|ª©´*A[¬Œ8E¢Ð7¶¤6…NKg ‚ªh[V]¶¡CEåm ÆöƇ©vJÆpx ·êîï&·S¤:Àêê{{·ÀM¡ÓÐÚ026BµSºÿð>»ŠM¡³¢Žžò+÷:“ŽêËXollk´-¿o°)tÌMæ¡á!ªÒàýÁÒÊR »ºú»ê›ê;º;/¾xù‚êkzvÚÚbµ¿±8@¡ãl Ü ÐYQgo'ÀÇO¿ùÓ›?Q;ÐöÓ›ŸÆ&ÆŒ#’¬Mï§säþV®j[´7oÞT‹«)tV c°^½~åê;«Qs†ÍÍÏ!ÏBx»9tPèì¤ú:«¡ãò»Qí¶~úé§ÙùY —…Îjè¼|õÒåw9¢r‚(t\e:«¡óâå ;D÷îß[z¼äxI³³³L϶„þù‹ç¼;ÕN Й™›¡Ðq‰Qè¬Ç-Î"""zz{˜7={òôI«èɳ'vÏ´ààà¡»C.¿uÛÁÖ‹W/fçf—™ÎgÏŸMÏLãô‘‡à…Ž«lC§Š_¥Ö©;z: XR¥N§®¡θĸ;¡w²r³LVS~Q~KÇÊ-j¶w·³JY± ±B©ÐƸs"r³N[ççŸîëç+ $R‰V§e±X]Ý]U¼*@Sδô´Ü¼\8Ÿ¿|އ*µ*+;+1)±µ½•ÜêÉd6±ŠYuæºòŠr<ôöñîèǦήNÀK*—âJpùܘ?}\QYÁ«æÍ/Ì;nU×ÔÒ”ž‘>xwÐQmznšBÇ%¶¡“™“™–•¦«Ó?y<4<((8 ÉÈÎÈÎϾ|å2þâa1»¸gù^…1ñ1@êdçe³ËÙ 0ô>tÈýÍÆÆÇΟ?_Æ-ëîéöñõ ÑÔjúúû._¾¼°¸  Á¹Bž”œ¸øxÑÛÛûºûuŠÍa£Œ•¶¹¥9.>®²²20(ð›o¾Á^𣅑‡#5üµZÊhûºüfnIOŸ?µ6Z±Z`y@ÈóøÉãÖ¶Vœ‚âÒb<$uÈGu(t\bû:b¹8ðv`EuÅ…K®º]EÑMCKCS{“¶N[#ªññóAÈ#”oxÞ€1Ž_€_S[SXDXZfZaq!þ¢:z³S #Q@`@{g; þþþJ•Kèìü, ƒ%;Ú;ÚŽS§Ná!fyuM5‚Ù|éò%xRRS F<ˆ€Nœ8—·Wo/@ƒU—ÜÚ2&6flbÌqDªΔ¥Á‚3’‘™Á.c#ÀÄß¹GsÌ:S³S:.±} æŽæ+×®¤f¤†„‡œ¿x>1%1*6ª­«ÅfÝ »› !‡jlkô ðE°ƒjHµ@–óÎß ¾^Ê-]$AŸ=&òðG¢D Í­Í( «P€ž®ž®Ô´Ôœ¼œÔôԣǎƒ:¶fÐûîO÷ôöœ;wž›^7»{»9eÐ'%-ûæäOÍL9ŽHµSZz²d²˜0{¸Uˆ•€¹gyrf’BÇ%¶¡ƒéš\¾z9¯0AÍ™sg X&«éúëR•Ôl5#±tºº!àéìù³õÍõ¶>’¬ZC-v¶˜70%ÐYzº´ød‘‘޵Ùúh鑟¿ fêÅK±H&§&—•—ݹg4Ož: êtvw2ë°JYZƒvf~ͱŽÁãyÓu”j%<¸ ày0öí;ŽHµƒš_œ·6Y1ÔãSãïo˜ž Ðq‰ícè€&Y_~õ¥D!A¼ƒ‚B£°¶Xýý’ââ¾:ô ƒš³áØñcáQá öâ‹ùñ‰ñˆzé02”@gáñ&+Qbr"‚½Q@½±¹ž±É± /LLM \-å”âp‡‚uÚmíÌ:M­ö/Á&Aß|ó f¹‡§êôõcí-¯,Ï/ÌÏÊÉu‘jge¿OÝÜÌû~€$¢Ðq‰ícè@u uÈ›ÚlmÆzc §¤½»sQLV^˜Âðäj9ÁÏC²WGOGEuEzV:þ2®“@3ræÑ QGWà"SÊTÕÐð<ˆbÄRñäì$&¢D.!± _ȇuàdÖŸ7˜ .G$]w¿ÉUrR§¥½þJ^eï@/B!Ç©œ£Ù…Yœ —Øþ†ÎÎ ÐÑ™us sSsS;"`¡¹Áœ›ˆfljl§Z¦úHMÏM?œxH¡ã£Ðy:&âD(;¢¦¶¦¤”$¿?§g g§š¥úxMÌL<{@¡ã£ÐY ,ƒ'RlNŽŒPè¸Ä(tVCIÐÈøÕÁÖƒ‰÷Fîátoé~::;j:oeë³Õ5Ôá/&åèäèØäÕN÷š;š-M ç…Î[aþ5w6ŒÖkS[ÕV}S}µ®½ÇþCf:N6 ÕÜiïjojojlk´¶Y©¤præ8~?žBÇÉF¡Cõ©‹BÇÉF¡Cõ©‹BÇÉF¡Cµ¹un].ïívE¡ãd£Ð¡ÚDm]mF‹Q£×lEuõuÌo–ì Qè8Ùö=t$ IIY‰Ë'îA•­Ï¦Ñi¬ÖÁ¡MÔ?Ðo®7ëê쟸{¿©Zcmv^ö*'"£òªòÀÛaa*­ŠÄJLÏÛ:·Þñ°ËÙÄSk¨ez£™ž€ ‡g=Qè8Ùö4tZm­öß`üyvÖ7Õc6·w·ëÚ:msG3ü¬RVXd® ³ÕÌÜ ƒÅ`j0éMúæöfì‚IE›4ei´àÚhjoZó¸ÛÊ&¶0bb™øñãÇ[œOsss"™ÈñÆC&«ÉÇÏçÂ¥ «ü8 8}ÜJn1§86!¶¡¥áÓƒSI<å¼ò5=q‰qLOQiñ(k•ðTÖTó&:®µ= QMdL$ Ò³ü…òÛ!·ÍfN9'84øúë‰)‰àŽÞ¬¿êv•¼ PZVš”šÏׇ¾ö ô;w᜿—ש3§2s2Q0ŠˆŽÀ5ž•^ß\¿ê €šD%Ê+ÉÎ.Ê ÊÌO+«({ùò%óü¾~ýzzzSgrjò§Ÿ~bnžø"~gOgïP/sTqšÒ³Ó/]¹´j´¹UÜ”ôŒ9t'ìŽÖ¨-f3=X-ˆYÓƒSI<·‚o1= $ñäæÁü¥ÉB¡³GlOC¡¯¿/VNÐ$%#Á9_ÌŽ‹)°r†„…(4 Iwþâyxââàtd*bì/¾üB"—`ßËW/#VÊÉÏA›˜…ÕÂj›µ*Æ)çn~û÷ß}ï÷·TGü~‘[’è0“wéñ’Þ¨ÿñÇkuµ/^¼`nt}à ÜX´Ê5ò+×®¬:ÅÅÙ$ªÂ€ð¤`z€¡5=ùEùÄsÃóÆš,<ðs O]}…α= L—ä´ä¨˜(dF~~ §‚ƒØà@ötëÎ-„BïC§¨¤ˆ@ç̹3Xè0ÿP°õÚàÁ¤‡ç⥋Ç~8vâÔ‰ã'ìwt_uÄNîa·_œú‡3‘¿¢:þ›7„ŸLNßšž|Ö PÜ=Ü×ôÄ'Å3=:{Çö4t ;M.œGNŽÜªµ³± "mìðöõ®âW­‚x„ J ÏJ ?tséMzÀ¯zõ- ·:ïyäçÿöçÿ†êË —Uº¸´¸ôdÉ¡‰© µV½°´ P+fçg™›fçfKÊJ¬-ÖU‘ÎzÐ)å–fæfâ¬áDàcu)˜£Å¸¦§€U@<·™dXăØœPâ±4Òôj¯Ø^‡¦Qphð·ß[±¿Ee0Àµ^ÄÊ㦇T)u¼¦süäqLY™ZvúÌ騄Øõ ƒ ‹ Ù\6f!f<°õ~x¥7븼Rv‹ª¸¬[Y6÷hnöѬC“3“}ƒ}3ó3½½ÓsÓïlšžËÄ}C}}wû6†x¡ÆÄÉ WË› ¡HLOck#ñàÔ3=(¬é‘(%ÄÃðP@€C<äm ½`{:R«D&OÞÆ2€ O/O/`¨£»£²¦2-3­ÕÖt 5C#BsòsL ¦À[Ø…YÀ:‰B}s}Dt.€°ˆ08ß9ÜPOïPoÿÝþþ{Tv!¨IE£ã£S³S[®O@{­z!™@ŸŒ?gƒÅÐÖÕ†äúë8¡|1©\ÓãvÃéIÍH%±\Ìôxz{OKG‹ÝãþÖC¡³Gl@Ó…™‘€"éîï&¿Ò‰¿H—àGlrìå(ØzmŽ‚½f¯íƒ{õ‰ƒ‰¸Ò`2´v´¶u´m¬ÖöVQ·Þçtpâ˜Nn’ß³¼êàÂV<ØýWE„•£”[êèU «m½¶ÖÎVo?ï£?=qêÄÙógÍV3êddg\¹vÅã¦GeM%ùÌNJz ñ`/¦ÇÓÛ“x€þUžõºG¡ãdÛÐÑ›ô¹…¹¬RÖU·«˜‚ðÔÕ×aN—pJ¬­VRG­WgæfVTWttw,­AŸ•—•œÀ.g#l)ç•;æ½F¯QÖ*™íÛ?ÃÖgëìë´«·³®¡NoÔc˜¶8 ½}½ŠZ®•>=‘Oý1?‘,UJãÂqj µÑÒ·—´B’”šO¨Æ7À¼VëÔÁ!Á8Ë$]E„‘1‘Æzû&´SßTOt\4ñ„E†1=|âá xð˜¬&âilm¤ÐÙ#¶Ï Sß\9šš‘t;è×ÿøk@AxAqAVnVzvz1»¸ÍÖfn4'§%§e¦…„‡ B¨‚B\b\|Rü¹ ç²ó²}ü|EÏr›»êƃMíYEin¾ç/ß< Ýð¿‚H‡Œ”ÃøŒOŒ?}ú´ ŸéGµ¾¾ŒÜŒÌ‚ÌÌÂOQ9¬û<ÐÃüîb™Ä”DòIqœ €þíßd1X €Tc[£§—'V , —¯^€§<° Ò³ÒÉ­‚‚ƒ f<¹¹ÄƒiMOfN&Óã¸Ç…ŽËmŸAëatltKG ÖÌïŽ|èÈT²ÈèHÌÔ ^VQ]K\RZ¢ëæŽfüŴú‡%5Pl"7ÔÖi½}½™ß?ÆìçÖ°¸}v&êïÏÇÿäÿ…Z«Ä0½aÂàfþѼ¹Þüæ]ëëï+-/­–T×Hk>AU‰ª²‹²q0om‘_”0“”ýüñWI,ca@¬Ê­äL¥¤Š_…¬ çÄH5€iåFË÷ÊÜÜݘœAâ±ßÚ‚áA—(töˆí3èpÊ9 8‚ 3 ÐnŽ; vxûyûù#ÕâTp 9^UAˆŽ:aQaˆÌ?è äöðò@ÔÅS“Ù>ö**Ë?tå—'CÿáTô«Ëa_(kå/^½xöâ™C]]=]“Ó“F“‘éþòywo7—Ç•¨%Rô”X%Î-έ5Ö2¡ƒP‘ÞÀÛä>ÇL!Ì5äj9©C^Á‚qûÎmr“ŠŒœ•ûéøøû`]!·­ `ˆéÁ¾Äƒ#2=ÌœŽBǵ¶Ï ƒHë¡ý÷ êÇOt°B"“Â%o‚`"¥ÊÉÏkÈírm¹{¸Ã‰;848.!N,¼Hø¯]¿†%qtŒ †[QÞ_þÍÿtìâr•ìñÓÇ K utuغm£ã£u–:¦éÉRWwWjVjrvrJvÊ'¨ÔÜTÓÕ×Õ¯ß1ªÜ*.bÏŽžœ {4jÒ1ò ‰BBÖ ¡DÈ.g£2U¤¦S1§!y+*4"ø€'·0—xpN™ìEœ˜Á˜¦ð`ÆÄÇð%|T@”•—…µôó?~ŽHí€A§Îœ  èè^ý{)}wûz±ÌvµµÙZ!ƒY¯Ñiæç§ç¦Ÿ‡¦f§F'F™þÙG³¶µVÝÝßÝ;Øûijðþààð ó…d§¦´¬!OjFjs»ýÖ6FÈâáî鎅É_̇Q*£&¨ÅµN An^QNbkg+Óƒ‡é¿ˆq^HòA%¨oZ9具)er•|+RÖ*ÉJNµ_D¡ãdû¡ÓÐÒàáåQÎ+ßâš;z:Û­­ÖM…ªÍÖF?¸¿D¡ãdû¡Ó³üú¥Ëû@µGD¡ãdûD¡CEå…Ž“Bç= Пþ$D¡ã*£ÐyG¶>[c[£±Þ¨·è©°LVùT…ŽóBç­ºû»í¯·XŽ=œšžšš¡:˜šœž¼;|Üiél¡Ðq¾Qè0œ^[]}ÝÜ£¹7oÞü‰Ú¶×?¾JêêìPè8ÙþD¡ãPgo§ÁbxõêÕjŸ€ÍÎÏêLöŸè¢Ðq²Qè¼ׯ~¢vàíÍOsós:.1 ÕÐyùê%boªƒ­ú‘F:®²ƒîŸo‰ÐýóÕöØïÈÕÄüIâ­@çÅ«vˆ^¼|[¦:Hwfæg(t\b:m]mI©Inînb…8!9ÁÖk¿Å\KGKt\ôª»‘nhòòòîÞ»ëò+„j[B¬úôÙÓç/ž3XKž<{Â<¹3s:®±bNñï?ÿ}dL¤Ál¨Õtôtœ<}R­SŸ8y".1Nª”ö,ßJ™/ækZ ©gùîÈ( ¥BÇVtž¿|Ž JØÙÕ‰Âôìt[{›µÉ:15±°´008ðìų©™)[· S[‡îõöõÂom´v÷vÛç÷«KO–P6×››±#i§¾¡z8öBS-m-&‹iph׉ã¸T# ¾V¯­·Ö“³`×Ë÷†ï‰Ä" ;ñL:®²ƒäSˆh>ûígá‘á Î…KtÁç_|îîážÏÊ77šS3R£b£â“âÉý¢Æ ½?|?:6:>1~tl”Ô†°Pè¸Ät ÌžóÏ%¤@ ÓØÚxÓû&ù™šN «”¥­ÓŠåâÄ”DTððò@FÖÞÕÎü™$½YXع³¬€À€ŽÎc‘ÍaÏÎÍ4€EKkKjZ*â—¸ø¸óÎëôºôŒt­N è$$&LNO"&ŠˆŒX\Zº7404€‰ŽÙšß Î/ÈGXÔaë@˜Ã)ã„„†ôõ÷dØÑq\ª‚P 5¯†îHdÄ•‘Q‘ Îðƒaû-eIµ—Ï)t\eŸ tî„Þ9vü6A^¾^ÝØDnèåbr‡üüÛ:ÚD·œ»ôt ˜¸| Q!«¼ÀœNLJd³P¸?rßÏßOgÐai½~ýúÜ£9ÌòŠªŠŒÌ ÿ@ÿo¿ûvöÑlSKB›€€¹RŽ ãîý»wBîx{{—²Kæ¡©>Ró ó5‚šSgNaäcbcFŽ0·>}þÙ1…ŽKì CÇg:ˆnya†ÁãàÑ*è.‹O‰À FkÐò…üùÅù©Ù)/¯ÖöVHt;HªæW#]B@43?ô Ú£¥G}ƒ}×ݯOÏMgçfgfg"¨iliþ>U5U(¯ÚËÖgÃ^Äßjku÷p÷ô—($¤°êkŸR…F1twèÍ›7[9Ož†xŒ#<‰)‰ÄÓÖÕ¶n÷(tœkû :X$CÃCoxÞ(å–võua‰d"rEyùxq«¸¿úÕ¯¾:ôUXDs/$iYi×®_ ¸`¬7&¥&ýõÿó×ß|ûÍ'~ 6—ͬßÙ×Yg­SheòZé‘T-.«*›˜œXuîŸ>{ =ñüÇdn‚S®”+uJC½a[26V`1èêu )¢\ù@pÐÆ± §|ÁJPß\ïåë…ˆÁKbr"*7µ7¦ñ Óc§Ï²'84˜éilk$Ä8ð€5Äã¸6…ŽËmß@ósd‘*¥X;º;üƒü+k*{–™“§O.Þ¾ÞÕj˜+<ÖÏÒ²R¬„Y¹Yhóþ‡ã?`R6´4¹O»ã(µuï;W¿¾ø÷_^øÿ’¼C®è8~ZdA2õüùóÖöÖÉ©Iæ¯îb“H*JÌHLÎNÞ–RrRŠÊŠpvúïõ;F×?"òFuPpJ«rlBü…³ŸX&ðv Nbv~vFv©ìà‹¼lMO~Q>ñÜô¾ÉôàŒÎ;ÓS×PG¡³Glß@SÙØáð¼Sö[vÁ#Pë„| )ØU·«uõö §¬Uúú‘û{µt¶8 «ÐVX–wØíçã~u>þ×Gq¿¾“v}l|Œùƒs/_½Ôh5K—¬MÖ‡£WýT!åãŸFº-‰UâÜâ\A3pÀ1ªy…yH|HÔh›Ô:µ‡—GDTÎÝ­;·%¥e¦¥g§“­ž^žZ£vM€B~â¸:ȹNœ:!Ït0MÉ‹—ŠZ’¬M¡S!à¹ò/ßyýâ{Ÿ$ï_Ä\{0ú€yŸà¥'K*jfnÆÒ`¹7|¹éÙógb™¸ŒWV%ªªoY¢ªrAy+k:,6+)- c‹åáNØæ‹h%e%ñÉñí]í Í 8SØ”S“™›I*#öÑ›õkz Š ˆÇ/ÀéÁ'žÔÌT¦Çl]÷ 'Û¾ff,’ H¨³ ˆÉ+ÊC2UVYöÅ—_:X*IzE„ÙT!«J…xXÌ.öõ÷Ý:j–ó9w¢‚¼ŒC½c“¢îÜ´øh~ažhîÑ\s[³ý×»zl#G~hññ"Ò«â²bNg[âVsµuÚÁûƒ}wûCÊóããÈ÷ÚbâcÒ:6áT¦g¥c“Ál 6X XHSáA|…e†xšÚ›˜dÊ+žØw<À ñp*8ð´t´¤ÐÙ#¶o )µÊ ÛAžÞžiYi rúìéë7®:|³*Ÿ•åÚ•ø¤xæ^ˆ´CÂC¼|¼o"êìéo†ö5ûÈC}PéTïßÛÉþ-sCm§­s‹÷ùñ§ upªk Ëåwß;Z5ª8Ýá‘áUü*n7:.šù:0±B ôDDEX-DXd*s*8ØÔØÖH<ÕÂj¦ OL| ÓSÊ-%L xøb>ñ0oâC¡ãZs*tZ¾üêËð,k¸à1c° Ù?ÿ^ÉíèîÀ¼9ñ¼»‡»§·'_ÄbjD5¨éèx+×d5ýþ¿¿é}ÓÓËóìù³˜LÀVlB,V3ìuî¹r^9Ðì@SVQt;È7À &¹"c"oݹ•š‘ÊüÚ:á‘}UìíYõôÆÇÇ_¼x1ÿhþÑ£G«6:ÅÜbn — ªT¨ jŒ$ó»We•eñIñäKÿÀVÇ&6—saÿUC‡—ˆOîƒC*cz`Õ!²¢8«œE•å²r­-Ö{o¿e^P\œ@‚ ,!]›À,§ÏžþáÄ8¡--™9™éÙ餲—Vâ!q¨Ãã¸mv_Ó“˜’ÈôÛ›Pèìs6tN9E’)DðÕ×_öû–ZŒä¸«Þx"Ðé°u<~úxéÉ’C:£îÁ؃öÎöŽ®¦ÿé³§Z½6« +·8— Êaåä—æ#`aF:H„“Ó’1¶ï§WŜ⌜ ljélñòõRëÕ¬‚ÌÜLx°ÞdjM€B<$™rx°Þv§{ùkÀ4½ÚSæ2è€HÔåj9b,Sf«é äUèبö®öÜ‚ÜQ 8Aî„° :hÐÍÝ uxÞwG¾#‘Î*è4w4#BÊÆ­â–”•ØßÔ(ea®cé+*)ªàU0g Ú:ÛæægÍ:4tohbzbdtbú–´-ž…ÁbÀD§Bº„74<Ä|MƒªÑkPˆOŽ'/$ƒmx’R“°I$!êD2V#xÄ 1dÙău…éA8¼¦‰3ñ`VÀƒôœxè É{Çœ &AÁA„ø‹Ù€ Æã¦G1»KÖº¬Ü¬ËW.ƒ#*ý=NÌ;HŽÈݘ€˜à`2@8X9–»{º#êq°f‚eÌ:ä.¹R•ô¦ÏÍÛwn“5ÖÚjŽ‹¾výZdtäû¿ˆb¿WF“ujfjjvsMÎLjtšÆÖF\cýwû© EïP/ó~:à NrOoO°€L€”ôg°Š_…H$<*œ¼eŽØ *ã”%¨L<îîL.â‘*¥LÂ%âA &ÃC¡³GÌÙŸÓa¦3ä]pæšž·ùNŸý‹Ñ޽û ýÝÌ]ìñXö¼Sçç–™ôüü}ë5?Ô´aö×7Ö7µ6m¢–&S½ •1¿×›²TëkæiZu.6˜o=ý«§ÊVŸ_TT”””„¦Ý©Q£FaÀàDÀ t Û†ÎÒÒÒèè(Â$pK­V#jB£€Y5jÔ¨1 X€€¸4€dÛÐyòäÉÔÔÔÝ»w;;;- šÆ>eS£FÀÀˆ(€ @è@¶ çÏŸ#+±ž¡! ¶jjÔ¨Qc°8phȶ¡óòåKH333hèBÈ„T í©Q£FaÀàDÀ t Û†ÎëׯÁ*ì h!XB[ÃÃÃÀX5jÔ¨1 X€€¸4€dÛÐyóæ v®°?Ò34´°°€g¨Q£FaÀàDÀ tlñgþló*Ô¨Q£¶sF¡C5§…5jÔœj:Ô¨QsªQèP£FÍ©F¡C5§…5jÔœj:Ô¨QsªQèP£FÍ©F¡C5§…5jÔœj:Ô¨Qsªýÿ{ÎS±fô,IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/page-sequence-view.png0000644042355400116100000014366611675570700021577 00000000000000‰PNG  IHDRxâôà&Õ IDATxœì½X\G–6Ü|a—–zv¢×3;ã žÙYÛ3;–-{ll!”j@B-Y¶„Ðd‘EN"79çœsM›œDÎ$P’@9xfvÿï/%z1 ˆ[¾‡÷é§nݺU§N{Þ:·ŒÿG -´ÐB -´HLë­-´ÐB -´¼ÎB--´ÐB -´HPh¢¥…Zh¡… Ê7ˆö¿ÿû¿ÿþ÷¿ýõ×OŸ>}ôèуîÝ»755u›Zh¡…Z¾Ç*!‚AŽ H%褹l¢Åe¸¡Ç‰‰‰«W¯ŽŒŒ ÐB -´ÐBË÷X@… DÐ"È ¢]‚4—M´ h\ êF_.\@×]]]---µ´ÐB -´Ðò=P!´rE‚(A— Íe-øD.@Ý===èW$ ‚Zh¡…Zhù ¨„Z9‚"A” K沉öÑ£GHŠA×許±±¼¼ùäàÁƒ»ví©´AøÞ²eËgŸ}öñÇ/%X£œœ\MM¾¾¾¸çíÛ·£þ£>Ú:-AAA¤òСCŠŠŠB¡ÆEÿ/íÙÑÑQGGçƒQQQ PUUE?óU…ƒ‰I%†FAVVö¥Œ>Û,zzzÎÎÎÞÞÞÐN€’cˆmÛ¶¡t‹W±>°LW\\ŒÐF|ŠL—à*¡¯ÄD±¼¼<Òr‰ù=ÑGlð¢¢"Ò3HCCbÒ3*¡ êa Òì¥ýÓB -´HZ£»k!š„……wÐpŠ„MqÈBX %qŒÄ74@d#ý @D|‚ð‚œ²Ž ›Î©tuu=uꔘhA„±±± Nñ¬qÜŸ]‰ùƒÈ£££***`Ö/¾øÂËË+88x||í>¼x·P9±õ¦étÖÎÎksôèQOOÏ9ª¢ ²R$»°)È©0¸3»¿TñÜ!XÔ¤¤$Ð'!6,¡½½}ZZZaaaDD„ºº:ô'ú`Q±;}ú4lk'''ãìÂ0q\˜˜˜òNOO?rä| ›ƒ¨¨¨¸¸8ìÑ0B‡ X¤æ0þ²ˆv¶Á?ÿüsè…Ḙ©˜h±¦P£Ã Àœ¥¡…ZhYǨMÓáÑá1 qA¤ˆ(ŠC>ŸÏãñRSSmmmŠÁ ˆü¤B[¸ ¯ñññ 쌌 ”ç¸>m]]Ýœ¼$‚²ÁÆÁÔÔ¬°cÇmmmPÚRl‡¸ßÒÒ‚\svÏ{÷î­*))Z:::ÄC€ÿ.%#)#L ÂFyÏž=È5Ñ킪;v -­­­544^cyÀa¾¾¾ ΗŽB¶Nð¬.:ÄŒ³€½°óUupp€)±!B»Œò;sæÌRP£Ãžžô*EH[ÁaÄ,p ,3á×¶¶6Ì+Š4üJ(†%D¾NÞÖÅ… T’cs–à9(]›øñú„ÚØ ×û.ñ¹.ô!Oà!ðÈòòr(! 9–y-jˆ£±»»;v3[¶lÁFê-eZh¡…‰ÊœŒvÓ ! An€8†³¥¥¥Èñ–6É“dÄUd½³=’«> ¢En–IIIùVí¦<:žM´äÁ)¢¿Â´,ñ; r'ˆäžÁ€QVF´ÚÕÕV†AI þ"UÁî˜{DD„±±1 ñññ Å¥Ð:Dct‚ý:!ïø³ìÚµ ‚¼¿úê+²¨£çÈÈÈ#GŽ`:eeeä±-rhÐæ Šõññ9~ü¸!Zôo Ñw)@–X#33³—nˆÌt Z…Èh‰äååÅNL>e€ža=äÁ˜×­M -´Ð"9™“Ñ"ˆ!B"²q8œàà`Dx‡-–NÑÆËË NÌ_¨A6E®âñxÈ(dddÐø;C´˜• 84ÚPQQYŠíHÜGXÿpFÈ“^è°wï^ìMZ[[ÅClÛ¶ Û\²ô¤V[[;66F>Ùô"U±©£æqqqB¡p‰ú/b,dLL f>ëëëQµ1/¤’àN,0&rîÜ9,!æ…$}ÒÓÓqá¾}ûÀÍä=f¤×ð!l ÀÐä/úD¢ ¦}ZGGl ;€×g?:F¦‹áˆ)–òF5-´ÐB‹¤…-¢y«ô‰L‰){{{EEE$ øxEXnllD2*!Ÿ¿9vì’+X¤¿"‘ñ ŠhŒ8SˆÃëO´$ÝÆ`È´HXw¤_ZZZä&¸ËÁ˜›xß±ˆ p ,’ŸŸŸ7-0Ü¡C‡`Duuuò9Ÿx°X JÂp/í™( " ‚5Éá‹TÓc©p¸cÇ[[[²$Kb³`jžžž UPjpêàÁƒåå円†dîUUUà]´Á¼À`_ ‹ÔiÁ&Ë××üGBÞ£…’äi3Ö-þÑh¢ÑGlðÌÌLôƒ™B=ôÂFÎ-îD‹Ý ù—äIøKבZh¡EÒBˆ–¼áÊàóùzzzˆ™ˆQ$¡Bܶ³³CèFÌq wBÞ‚DeëÖ­ˆlª¸$** ñ ñ|äW¡™—Ë?âZg´äs\H€Ôf 8@žŽ©’o¬"X#aÂþS]â×{°¿0111Ÿ%H1Ñ!˜¹ȯ³‡ &?J]¤gädDOX„ìÞ]PUò Ö…Ï?ÿ|)ßÖ]Ü,äËBSÀXäSæØv!ÍE%ùF 6_‡dDò.Ì« ňª5äKM„)ÉGØa\õR;#Y‡ȇÃ!H^ È„0†&OÄ=#ýÅŠ`DÔchúë=´ÐBË·A‹KfA’¼wF‚! ›ä{’8DKÄLÄ7@lßÈ|( Ì~úé§HÀ•••CCCç¸ÖD ý„|S–ÂF‹îÌ™3sºE‚¸ÜdXËžgËrÍ‚-vO 1øÁ*ª±¸À·‚ƒƒç(©©©ù¢öHñ|ŠB -´ÐòÚ81((( àìÙ³ ~½â{úŒßuÍcß´Ät½„ÍfÓïËÒB -¯·lÞ¼yïÞ½'OžDùëß·løˆÃú˜ÃÚÄfýiûÆO8¬Oq­üÆ7ÊpXÀ{[7|²Ÿµå¬?mÙð‡|Êf}°}ã6 øP~£ŒâÆí–<ÚºaÛ~Ö”°>زa‡µ›Ã’c³>Ù¾QÃdä7Ê)nTä°€·nسŸÅFùë¯[6(qXÊÖ6ë³í÷sX€œüÆ=ŠU9,`ËÖ **,Ž*ë€2k˧8Ê,Ž‹½“µ]v#g/‹³‡%ÿ鯽[7rv°8ò¬­Ù°+‹ó9ëÀÖ–?màȲ82,öfÖö÷6r>fq>bÉ¿»qïŸ6r6±8ï³¶þnÃþwYœ÷XÞamykç,ο³Ø¿cmÿÕFÎÛ,ÎoYò¿Ø¸÷ß6rÞbq~ÉÚú³ ûÎâ¼É:ðkË6p~Êâü„Åþ!k;kã—oüÌSŸ ¢}‘#Mӭ䉶¼€_Χ! |ë® ¯2™»õvKÉJI±Àÿ’eü/yÆÿf3þ›ñ¿?bü_Æ?±ÿ¤Èø¿›ÿÌfH;ÿ,ÃØÀ¦ -ËØ Ï`±?`3˜1~ Àø6㇊Œ ›?b3~ŒòNÆd?eSø¡,ã'òŒ7Ø~øã Æ›lÆ›ŠŒofü‚Íø7”w2~&Ãø›Â¿Ê2~!Ïø5›Â1~­Àø-›ñEÆ¿nf¼ÍfüåŒ_Ê0þMá-YÆïäÿÁ¦ð«T`¼Ëf¼£Èxk3ãOlÆŸQ¿“ñ¶ ã/l e¼+ÏØÄ¦ð»ï+0>d3>Pd¼½™ñ›ñ1›ñþNÆ;2ŒOØÞ“el’gȰ)üÇGŒO[PVd¼»™ñ›ñ9Úìd¼/ÃØÆfÈ¡YƧòŒíl†<úˆ±M±eEÆ_63v³)lÛÉøX†¡Àfìe3>•el“g(²ûØŒÍ1ö0ØŠ Å݌͛ìÝ ö.ÆÎ­ ™ìí ö6†ìû ùÍ ¶,ƒ-Ãøè ”?f(~ÈØü6ƒ6›;ßeÈüŽÁþ3ƒýCö7 yÔÿ‘Áþ㣟3~Ã`ÿ–¡økÆæŸ1Ø¿b°ÉØù&Cæ' ö› ö Ù2äÄ`ÿ˜Áþ㣠…0Ø,†âÆæb°ÿ™Áþ'ÆÎÿÃù_ Õ ÒnZ'‘ѾȋÝJœh1RaE!…òÂ¥Ê qU~i~ž0ïE((Í-*Ï),Ï-÷¿¬!–©ÏÂè /*<?!7Õ*4ö”{ÌI7 ¼h¿Äèì’ì•ü{V ¼¿ŒÚÿýÏú~;£ K,dgÇ¥Åå•äIpË ³Y4ÑÒD»(ÑJ‰‰v‘hHœh‹Ê‹Š*–, Û¨ÕQ¶]{¤ç¥Û9Ù¡1¡™™…e«j.« ~Ër#">âýÞß¹k‡µƒuF~F~I~MSP$|U_ýæå9%9{ôöPD«$5C´R3D+5C´RωVIê9Ñ*IÍ­Ô ÑJÍ­Ôs¢U’zN´JR3D+5C´R3D+õœh•¤ž­’Ô ÑJÍ­Ô ÑJ='Z%©çD«$5C´R3D+5C´RωVIê9Ñ*IÍ­Ô ÑJÍ­Ôs¢U’zžÑ*IÍ­Ô ÑJÍ­Ôs¢EB´JR3D+5C´R3D+Eˆv’Ôs¢U’š!Z©¢•š!Z)B´J»¤Ñ*m—š!Z©¢•š!Z)B´J›¤Ñ*ýYj†h¥fˆVj†h¥Ñ*ýRŠ­Ò›R3D+5C´R3D+EˆV韤¾A´éñ/r*B·'Zø® R°\dƒhjoݺuåʕ˗/_™–«W¯^»víÆõÑ{7SžLF>}tåñƒþ‰KÞ Mñ‚²tD&Æ×wq ¨tò«0u/>jÅ6KûÂ<ìºÖW'Ôkž:ÉÕ´ õÒ%ª WÊ·ôôKˆJÍOÍä„&Çt?äWz4´ö«àJmÏà˜Ì„VzÅaí14¶5 ªVMyô ­M"­ëFU g*%¼”ˆÖÒÚ¼¤TàÎsGv›[œKm’$?ôSdeS‰µ°@<4 9E9s*ר«å•äå ryf»6š`#ëà­°OáSÙOÅøø“ÿû·œæÈn•UÞ¯\PTÐÞÓ.¬®x-æ»zŽ0GÑP‘)ÇÜ J)'½QÉReþ@•¹QVú_”™ÿ¢Êü¡ “%#ý#UæU™?Rdþp›ôOT™?EYNú' Ì7T)üHVú e曪Ì7U˜?‘‘þ…*xS‘ùÆ6é_ª2…²œô/˜o©2­ÊüWYé·”™¿UeþF…ùséß©2ßFY‘ù«mÒ¿WeþA•ù–œôï˜T¥ð+YéWf¾£Êüæ[2Òïª2ßCY‘ùö6é?«2ÿíå¤ßQ`þE•ù>ú‘•þOeæ&”U˜¿—‘þP•¹Y•ùEæ»Û¤?VeïÉI¿¯ÀüD•Â;²Ò+3ePVa¾+#-«ÊÜ¢Êü«"óýmÒŸ©2ä¤?Q`nSeÊ¡YéÏ”™ò(«0ß—‘Þ¡ÊÜ©Êü\‘ùñ6éݪLà9éϘ ª>’•Þ­ÌTDY…ù‘Œ4[•©¤ÊÜ¥ÈܲMZY•©‚ å¤w)0÷«2¨2ed¥••˜ªû™*l¦Ì_¥UÙLÕ}LEyæ¶O¥U÷0Uw1åþ*½G–©º©*Ç”ýOie”·2Ud˜2ïJ«~ÊTý„©¸‰¹íiÕÍLÕ™r”Þó.Sõ/LÕ?3e#­üLÕw˜*ÿΔù¥´ê˜ª¿g*þ†¹íÒª¿aªþš)÷¦ôžŸ3Uÿ©ús¦ìO¤•ß`ªþŒ©òS¦Ì¿H«þˆ©úC¦"‹¹mƒô?ý±‡ž6ˆv×$N´”ã.¸ ZôrͲׯ_¿yc|jBøøvÈÓ{‚{Ù£ƒî5 i%+eéˆLŒ>eèWæ*°s Ò3¶0>cgfm{ÚÔÄÈØÈÆÎ&0(("2RÇÀ 0"X¢šÈhÝ#üÃ|CÃ)D¶ äø ¿ hOzƘ¹{“SÁaÙ…Y¯2¢*âW‰¨dU4GÒ ññwqwŽIŽ·¡!;=/- ÔßÎÙ.6%VÒÖÙ8XÝœ¸ „ž¯—_ˆ_RVvk0úl$¤'Ø;Ùù‡ú§æ¦RÔUEÝ–ñ©ñ.Î~Á¾HÝŠ¦+×0ERFbZNÚ|@«¤Œ¤Â²µP Ö‰Q9 l` ÇåjiiCOO'<<ÄÍí¬¡¡¾©©±W³¾©¾²¾rÅcÍwõ‚²3O3 ' }?}à”“†¶»–Ÿ¾ŸÞI;u=žUöÑ=i«nè§g䧯çÉÕrÒ@á´Ÿ¾¶“†ž»–±Ÿ¾±Ÿž¦ºOÇõ>ºš¶ê&~z(zruœ4LýôÍüôu4 ݵ̩²×NÝ„§c².×VÝÂOeO®¾“†¥Ÿ>`è¤aâ®uÆOÿŒŸžžºOÇ e]=[u+?=k?}sO®‘“†Ÿ>`ì¤aî®eë§oë§gh§nÍÓ±C½®¡­ºŸž½Ÿ¾•'×ÔIÃÁO@ÁÊ]ËÑOßÑOÏØNÝž§ã„z]c[u'?=g?};O®…“ .ÐÄIÃÖ] …³~zfvêN<WÔûèšÙª»úé¡ìèɵrÒpóÓ¬1„»–»Ÿ¾»Ÿž¥º+OÇe]K[uO?=/tâɵuÒ@ÁÛOßÞIÃÅ]Ë›*ëYÛ©{xëð|õ=yºV6êÞ<=OßÕ•ko§ÁóÒçyê£pÖI‹ç¡ïí®gm©îá¢ÃsÕ÷tѵ2S÷vÑã¹è»Úqí-4xNú€½¹ÆY+-žƒ¾·½žµ‘º‡µÏVßÓZ×Ê@ÝÛZg­ïjε7ÔàÑì 4Îkñ,ô½Íõ¬¹ê&:<3}O]+-uo=ž±¾«>×^KÃ×Ô(6Ø/!#aqïZ¢-Øé¢³‚_¯Í°ì7!·&Ƨn5=žÌî ©¨Š*­.,YþˈÖÐÄ4222$$ÔÖÖ&3+³´¬´XP\TTÔÒÒ’_çäìˆùœ6ö”¨&@qeQTbXqIá£Gîß¿?5u÷tPǧ䋀Š/ƒ«VfUNݽ{ëö-$m iñ+[‚Ü’ÜöÞéèóª:SÙ[PD ·¯WZzJhDHxlõy“¬àÈ O¼‚\'»¨„(I[È(ÑZßœ¸qgêöý÷.]ÏÎÍòใðÒóÓ)“¼±©±6vV˜»—¯G`x¬QXQ•”‘™Îóó‚ÅPI¥¶k¥ˆysGss{SÓ,4·77µ5¥d§@Ï5P£¨²ÈÆÉ†ÍVzäâ0µa&?ÓÆ‘"Ú[wnÞ¾31uoòî½)(–”š}¢’¢²Š²Š«¦¹M¢K)Ä¥Åzûx>xx`°/=3=!9\N^öäÔÁ¡¤”wž{tRT^I¥’„]]¼pür>ˆ¶©£©¾µ¾®µ¯âBc[#ˆ–8Õ¸ºµ£õ¾}ŠÛ·Ë ´õ¶µõPhín•“—;È9XY]‘‘›±eË–#G¾(à€hWËÕ‚r*£¥°‚þÁŠ—þ`ˆv×$O´3C. 9ÅÏ3Ú€] ËRûœeïLNNâTSsCfAÆ ú_."“¢µõô½½½]]]MÍLø…ååe‚AYYé…‹ [ww÷+ -]ÿˆ@I+SXÁˆ ‚)ÚûG¾ôÈü*¤æXxý^ñ!ÿò/ƒE‡ýÊNñÒÏ]¾xñBRZ¿¼`Åcå §£OÍ //ª*JÉIñõ ök=×|ûέɻ·oOÞÊËÏqvw hk?ª›œºEm°LrÌÊfYÈäØ;ÛMLÜœº{‡Â½;wïO"µ·5µ4…„$gHe2 IDAT'ó+ø’V&!#ÁÛÇ s¿3mX¹ìYOçìÜÌ;“·nOÂåo 20Ä6LÎNï™$ $sHî)¢=W?í©9©`ý5PþƒŒ–mO_°Fˆ)¬¤’i]Ý QEy}yhl¨Œ¬ BE´Í¢5ßÕóÊòöí£°‚þÁŠ—þ`!ÚA6m'ZŒ$¬â¡^—X¨æçÔ7ÔNMMMÌáØ;„c''§¦î>|ø°©¹D»ŒžWV¨Î!ÚaIkkkSRÚF ¹¹¹§§ÇÂÒ\[WíJ¦¼ä¹¡áÁ°ì0qk‚_ÓpÜ'鬊'¿WáAž€]×Þ~çÎm06>&«0‹RiEc!íèí W¦jI®«çÙ¸„ØÉÉ;=¸÷àî½SH³²3’âïLÞÆ!aMPHR¥•©º¬BAYãY‡‰[7A±Hgñ ú¿3E©ä»¨˜$—ÙEÙ’^ÊŒütžŸ÷£Ç'ïR:ÜpwêîTZFjFfòþ›·®_Ÿ¸:½˜ŒOŒsvwÂ}±ö¡®²(#?£¹£¹ð+•ÑÖÕMƒ-¨NÒj sòèXL´¶N¶ÍÍ ÅŠ† ¨&»Eöèѯø|~usõЧ<ßÕA´{ô÷Ð_ï¡¿GûÒ¯÷€hq-@âD‹‘JkJ—‹Üâ\-Xõ9ÅÎJdAwïÞ½wïÞ£G@´Y™+èYÀÂã"­º»»;9;›œ...êìêlïh‡´á¯½½»»ËÜÂLKGÇ'ØO(ZÉ”—ŠêÒ´œÔäÔ$„|å „‘_]wÌ;û_)Ç·ä”ofm{ûÝ»S8‹6 ´”Ìd\µ²±ò…ù}+ÖVP%HÊH ¬¨*ñ?~üèÑãÞçøøóJ+JÁµà¶ûï=yú88$0›Ÿ-éÕ¤´ª¸¸9!£·QÏïO÷îO!©½9q£€Ÿœ”žX\Y¼B»-ù‚|_Þã'@±T^;y§²ªÂ?È77?gzSr÷Á£ûÈt«kDA!‰i Ð| ìCL”™ŸÙÒÑÒp®¡aú¹q} …º–º¦¶¦ôœtÉ:ù JªJìœí””ØÛ·oïêé‚J”““Â)¶e‹ì±cÇ@´5Í5+k!WÏ/ϧ‰–&Ú¥ü`Ebfâ‹\‹®Ä‰#•Õ”-yŹuõµCCC ÚÛÓ2 ’¢XöÞ4Ë‚E?~ ¢Íæg­ ÿe¡°¼ÐÊÖÊÆÎÚÙÅÑÉÙÁÞÑÎÓËÃ?Àw6|ý|œì­m­-¬Í 2ILØ3>%®º¦zzû1Až®ß™ºSTÛxÔ;GË?§®£ãÞ½»¨¿qãÆµkWÑ261fe«èSVû W—òKù±I±Q±‘}ý}>xúôII© 1=1&!:.1¶§·•ÿû߂ J$hºÙ*¹z¸LÜšÁ#›|úìɳ¯ŸÝ½w·½£-<*,&)†_Z€6k Iqy‘_€Ï×{öàÁýþ~¤­Qñ‘Ø>~ò˜ªìŽNŒ† ×F%‚QIVAÖ¹®ÖfêPÓŸ„jklÎ56·7§ç¦¯Ø£–«†½‹½ŠŠÒ®];CÃCÕN¨ÊÈÈ„F„ڹ؃mm M åå·«©©hk[jW<Ö|W/(/ ‰–þÁŠ¥d´ Úù¡[‰-5Xí²‘_œ‡Œ„ ™œ•ÈÞ¦XT>|øðÉ“§ÓD›½‚þ—…"DÃ@ßñññ›/“±±‹þA~ÑJNŸš²àð ‘‘ê—;¦åî´Üº}«¼¥ó\ß²"¢F»wÿÞØøXhdÈÊVŠ5¥ˆ>åµå¯¨3Èùá1á™9™==Ý…X8t›Wœš“—=84ä_TZøªc-µnž®Ø¦ÏGΣýÊV@ôéê直«XÍ‘“eægFÆ„{x»åå’n©Ê¼ŒÈ˜{«âòbI¯&PY_éîå6M´÷¯]¿–“…¬1»€z4^ÄŠ„ÖvV1ÈEBÔÀ& {wO×ðè0ðŒ³–úˆQV]¢fÙÿÁ4ݶ4µ5eæe®X©žžøÄxeÄ)ã„„¸]»víÙ³{Ïž= {öîU””Ø®n®ýƒý5M5+k¾«Vî3ÜGÿ`ýƒ/ýÁФ¬¤ÞJkC´Ô`uËF~I¾˜h)–Ç–}8Ͳ=~üøÙ³¯Ÿíòû_v„ø#·¶¶6¿Xp6/?Ï7Ч¸¢X‚úÔ–ûò:»:{zz`ä„Ä„¼¼\@PUUU__ßÑXØÒÞÞÞÙ‰ÐØŠBWw—oJV4¿”ÿ<ú¬†òè€=±©¬«$Ý’WTb,ÖÕkT5T¹yžÅ¤¦®&,2,-;|Ft[ƒÑg[š`Ö˜»Øx…eŠÊ¨ß]W®1ÙddaW´ ²ùÙk£F©k­¾0<8<Ø7ЮݱcÇÐðPo/AO_Owo÷ù ç›;š+êW®Õ|WT ̼謠°âå?X‘œôBך¦[Ém}9¼¹Èæ×Õ×>}ú„úäÉžQò5‘¿MË?þñ¦æ†œ¢ìô¿,”Ö”†F‡ÚÚÙúûø½8kï` ¬JNØ“-¤´T˜——– …"‘¨±±QL´]]]∶¼®lecñËø]] «=‘†Š¹}6,T)T5V¹{»FD‡Ç$E—ˆJÖlÜÚaAS¬‹>ó[k«Iusuïpo`pà‘/Œ^]]•tõ²º²Ô¼Ô¤ì$4X6O˜·ˆk'Z8neCårí|jfJ>?wq¤f¤–® ÿeSÀ(1I1qa1a Ýù@=Î"p V6å¥+ãäSWWÛÛÛ‹¤¶»»  ¤» ‡}}T%Nõõõ‘BCC=ˆë½²á0ñîÁîÊFÉZxQÝT]XZXXVÆÖ]K¸\WÑ®z篥«ÓXw- Ä‰LÔ(Z.pUYM™P„L­d ׬jXIÿ+ЇŠÈõ•Ô&¥n!€Éê+I3Ik’šâè³td䦯x}z{DM·ðZD[Ó\óšMê{,\c{c]kÝêvûºº:u!‰-5XÕÆôâ-hù*Uõõ‚™ÖÊ«Lç5›WÇkéê4ÖÓt+q¢­n®¦ñÝEQ%}jZjÖ]4$ ÚÕiH'Z8nmK-ï"°vÅUÅ}Ã}µ­ë¯ ’íê40âôÏÈ–¾EåEhŒKï®Hœh1RÝ̯¤ÒøÎAP%èî_w5hÐ4hW§Q^[^$,jlnlëh{)šZšÐ\»8Ǻ•8Ñb¤ùÿdT5TUÕW‘2®­¨­XÖå«Q£¨¬šú¹>è³ÜYH•õ•¥¢RhÝÖfÄQIÿùþ†¶†EÚÀ8Њüö¬púWàXK‚|WòÕÛ,Žšæa•Ò°Jˆ{‡õÓÎVÓT#9ë‰G¢ŽôŠÓ¡vßÍ5âµC¡©½©¥³Er ¿¯¾Ü+ÀR\Æk ¸œ B–ýûßÿ¾æûÇ?þÑr®¥¨¬hq_%t+q¢ÅHðÝ¥Ãñ¬ãiÓÓàW”ArZ:ZÐrY=¬ `qg7瓚'¹z\WOלœåNdÕ‘Wœgmo •t t½ü¼Àgk0(¢ÏÀÈÀâm°LJ*JG¾:òåÑ/©Ó3Ô‹K‰C˜^Jÿ°ª“«Øhñ6::pèW™HJfÊž½{Ž=ò•ÚWÚ:Ú‘±‘ 8[TB”ä¬'”k·øL_+žNýôŽ_ƧþëmE1,ÓÔÑT^Gý0S{o»ä~‘2¯¾Ü+À‹\}Ú8éù©ñé±qi14^cD%D´µ·Ía¸Çýõ×`ßGÍ9ÕÙÝYPRÐØÞ¸¸?'ZŒ=–KkKUŽjtB4.Dž„ØM6qÉqg=Ï&¥'!‚'g&gó³Qˆˆ@…ø”x¾¿¬2°¬ƒ‹CFnʹE¹8,T7V{ûy‡D†œõ 4!SC¾èÁóÈáç †´ ‹³u´E3ÖUQ =›Zšú‡øWÖU"£÷£ŒÊÂÒBO_O;';ß@_l0nyM9¹¤¸¼Æ©kù†é–;®°Zˆè³x,X„Ê„ZëaðØpìN½áTF^†›—– !êA4Ë*È ­nªÎä'¦'ÂzÈ`°‚á1áhleg…fdw•šêîíƒssø¥¯´¾ i &&õÓ‰Zf~&6+H1ÏØœÅP™–“Ù;ÛCU8^Éââ–ëÆsƒô‰=}<1YŒ…CÌ=*> 눚ùŽ;yö*c[ãð`.ŸQƒ ¼ý½Q³c:+ÐÖÎæ·÷´÷õRÿ*N$lîhÎ)ÎIÏO/®,nëiCxBay!8¸¹³™ü“Ô*˜XyUœ\ìêjêjs– À .î.>>ØbίÁU¡‘ñ‘¨eà]«åê( ’÷…îîŸÐx½qÒRù\û9Ùÿ7Kºº»®\½2qk¢½³}v=!ZÄÕξÎÅý8ÑRÿ÷£c8c{¬famA~"D -š‘ÃG#  &úû#þ‚H?6;Í/è9-;mY-ÄA[[dÕä¡$$"ƒB¹írˆÑ¸·õ@Ã8Ÿ¶@%4AùòÐÊ/ØÏÈÔ\»**aÁŒÍŒÝyî`5‚/ „ÎaMmM؇У½|½ÀgsL·ÜqOG[i#^&¢'ìfpÚ€úfØ$(<ˆçÏ‹IŒéZXY`ÕÀg‡ÓƒÚ 5jm,U¨`.˜Å±ãǰAÉ+ÊCŠæäghløÙ矡ͫ|ifiFÊàuc gCPFÏægÌa%Œ~Tí(ŒýATVW[ÅR²RV<(”ÿlDˆwyøx`÷àìîŒlL ¾?~âx`h ì3ß±Áµ³WËŠ®ö(ì9ë~| #ƒžaaxìçÛ>ÇtV 'Ö.¿$¿áµ™Àá¹îsÇkšj(öímýÀbÔÿ¦mk€ApÛ¦„ÌŠÞÎ5`'ŠšÅ=d¹®N\bveBjŒ†¥±q°ÁnƒÚÄ|³ºa7† ìƒ-26Ë €Â±:¨ÀO0Ͳê2cSã2QÔkb¦ :6Öwö*£W娂¡a? ÑÛLgeªBŸ\A.èé,ÊàWäÍ Rä¸P ÌŠg‘øŠEY…Y]ý]Hv‘òžë:‡S«âç\”¸Älç‡oÀz8…ùš˜›`âókŽ|uþåQ¯o¨¿Z®N=“÷°>¨³c,Kã5Æ!cYMëÍ­ÍŸ>~øø¡-çZΞ»<ÖÔÒ4»þñ“Çmm‘q‘¸s­Žf@âDK Öµ XÙY!@#Ù;Ù#ТyàÎA\—xûy# üC - „E\…fËhdåg™Zš"Õ ‡Ø• ~¹zº"W;ôÅ!¼bRà ÄG8D7 h‚,Ù-Î’Çݸ Aí*i…X€ ‚hëà£ÉÕÄ^¡ôfcoƒÌ5=µÍµI-7‚Ì1:YÖ µÃ†[»Ziƒ)ïÙ»£ëèë()+!3C F=6"'O$Cƒã‘°X§´O-ÀÇ(`)UAXA0 y¤“B~†ÃʺÊ/¾ü5¯b=¬Å>¥}Ы–ŠJ1q6 ¾dçhSÞ¯Œ$F¦F‚g7gâ« *N£r/8»:GÆFnƒ}J*J ¶A8îŸïØà¹9«L|Œ8|ZN6^Xh¸²g(¿=±¾ ÌînhUÙ@½Y âÄ"b êÇ’EH[Q@K~)¿­»­¦¹FP) âKWKAij@Ì«èçÄf×Àµ K QV q»Ø¹5mØŸac„dù¨¡ ¾®>}ßÕE&„zø¹¸û:Óxáéç6½÷àÞä½I1†F†.]¹tåú•Áóƒ³ëï>¸ÛÚÞŠM0n„Å"ä4ÝJœh¡Ak÷2`mo=ôCÈ@yððAÜ0.î.9…9¨$ï-£"ÔÑÓA$½!Z!t.k”Å(ŒÜ+›ŸMh Yñ•U”3ó3qŸGƒ>Ú:ÚÆæÆ¾A¾ÈØN›žÆ\ŽŸ<ŽÈHÖW¡©AòŽ#Rðj^Å€ ®”¢U#,·°JžC &¿Â¾‡d.«8hXTXlR,&»a™JªJfÏ}¾cÏ_åÙ>åAÀPzª©«‘~– tšéì_¶÷µƒDQ›boÔ3ÔC½Ét®¡k€¢UòV.N!ý…WàBòxW­ŽŸÏr€Ù5Ø´Æ| ‰Î¯MüCüQÀŠ[€ØgU\½£¯Æ¡ñz.ª545Üš¼uóö͉Û‹ nݹVFNø×ê¢ q¢ÅÖ›å¥;÷¨¸(êó-uÆfÆJ*Jؤç¤#|ǧÄ#KC½ýƒü÷*îMÍLÅ¡‚¢,k”Åþ12èøh8dZ!ÔÛQõUÛå·›Z˜"#A„0ÚÜÑ .ñ ôEèt:ë„ 5ÚU; ÑÔCê¶**ÁŒÈªR1Plb,tCº™š›"C=ÎaB0Zb‡…­=8 ›\5ÇtË]˜atñ6³§ +¹{¹S5—{ò<£¢qˆÑ¡mZVš"[ÑÛ×Z)îS„æ¸Jý¤:6âuLj¤¦¨¬ˆçÇC%æõù¶ÏQó*\p-È HŒ@´È\¡¤œ¼jˆµ¸±—"ÙÞ*Z\^ IŒYp9½xîw¾cÏ_åÙGŒ 8<:ÜÕÓuÛöm¤ŸxÔMÿ’0õ3èuÔ]Î5`€í#6ì(×¶ÔRŸh«P¿êÐR›A½G Mð:p~T´*~NŒ›F @Κ‘›£%¤$œu?ëäê„6sj`ÃG«Pƒ)\Ü\`I¸:×ä.– ûû/Œ]x)†J+¨/.îi8 Hœh1µá]2ÀE¥E¤\ (ð òC¸‹â“ãq;!‚?pª´ª»~”±¡@ "ï*­"0h^QzvõpEŽÚ@¥¨AtðÐA„p 8•L­®¹.(,ÈÙÍ9.)z¢%É)dÆ«¥:OÉHAÁ^ŒÕÖM-a¡°ÐÝÛú€}Á¦h†J å‰óM·ê˜=eòÞ6( ­ ¨ÉÊÏ‚Á—X/BßêÓÑ ¿@?d¨ ‰ Åë.®Aª†æ©¨y%\ 2(L„ÕÄ ‚ù0¢FEMøf\õA1¯Ì¼LЃ¿O™¨ ‡³}~¾cÏ_å9ÇÖ ·‰—¯ØEÜÏrÑÙßÙÔÞ„µ§‚8A´È\ëZë@½£ã£ ¬ZïPïàè ÊEåEPÑr`„"ÚÕr'Œ……°´¶6¤Þ¬IŠÃ^–øFû´cÏ®ÁípLýö"ð7ì}›ÚšVÝÏi¼öÀf«ª®Š_ÂÏ/Î)ø~emekgëâ}º•8Ñb$Ü„¯jkŽ? «­»&4$ ê‘v'gÀsë®ÌÚDÛ3ØÖÀ¦8¤j†¨šÞaê•â2•øÖU_F Ú fÝõGœ9¡q—uׄÆwíËyª±v#t+q¢í˜¾‡_ ìZXY´Ooÿi¼Æ@έo¤Ÿ[˜K¯õ‚@. ‘]wMÄ@œ±²³Õ‹Ö]4fƒÐ­Ä‰#Qÿ«ùuL¶î:Ð4Èíñš¹î*Ùíè¥Ñ¾á¾u×d6:ûèõ¢ñ­¡[‰-FZ÷“Ñ Aƒ kB·'ÚžÁìiРAƒïÀ€€Ä‰–l˜ 4hÐøþašn%N´}Ã}}çiРAƒï†)HœhÉ×ìh|Ð;ýsµ«õ›´ß`:=C=ënX4hÐXä+s'ÚuŸ' ìªjš¨ß ~þu¦#jõ÷®»yiРAãEüVô´×6×V7VW7½¨m©]}§SU_U\QüàáƒÙÿé黎EŠºŠu7¯$Oƒ¿­»’Ecu}k}÷@÷º‡B4$‰-n¤á‹Ã×&®}×q}âú•W¨_éi_weV üØ•±ÒêÒ¯ÿöõ³¿={m€é€eGÇG1Áu7òª/ÙøÕqÐàèàë7;ñ¯Ý¼Ö7܇i®{(¤ACr8ÑŠD7oß¼|ýò¥k—¾ë@P¸xùbkWëwq:Ðü9Ñ~ýìé×OŸ>{ò P5s+Ÿ}ý¿Í D;26²îæ]u\¾v<ÔÕßվݕ‘°yÅ4±_÷PHƒ†ä y¢mݸu{óñ+ÇF{ÆÎwŒ_è¿:váÊÈÀXwÿXç4ºÎ_¤Z~[؇¼°¹£™‚ºÎ_<þÂð¸8<:6²î ÏبTTJ±ì³§÷Ç».ø«Œ$¸räáíËu‰P© \ Ü9ùô“§¦Ù÷Û $µµÔ7Ã/\ºÐ?Üß;Øûô cùÖ}!–Ž«7®v tõ öÌ®»:~~ìBÿÈHÏðy¼]»²þª®àZšhi¼öX ¢½~‹zv±K4ÌÛ3êñÁP çâp¿#ʶd—u‰`S²=´Úèâ•‹ë~ó/Æ.ÿÑÖ7Õeçfææg/ˆœü¬á Ã뮳çÇÎ EBí“gO¦ú«¯Ê?«6VyúYµåEw™׆¯æ:M¦{Viô¤TûA¡ÆïOž0:²”gŸzÅÛaA§}餿ãêÍ«4ÑÒx½±DKÞÚiȹðÙƒœ]÷’6=Èß?âºùBo}d%c×f›ö÷‚z9Ö…;.\%!à`çéíÙÑÓ1»&0$°«¯kÅ}Ž_¡žO‚hÉ¡ ´xddøêUŒ#£ÃçG††Ïõ߸y=ŸŸÛ7Ô·‚QDµ¢°È°Ù…UÒkB´Ÿ<¾Ó'ºâ¿åa¶üƒ¤¿<*P¹èöñ½«CWr§2¿zœ¹•÷sUG½w>zôÅxôøÑ­;·®]¿vëö­‡¢¯(ßœ¸y÷þ]Ò†ª¹sëÆÄ;“wîLÝ! È©ûï£fþU8œ¸5q{òöµ×nܼñ`zЇ¨JàÁCêðÑ“G“S“èvòî$Êb•0ê `] LLâ\Ü\‚ËŒ#ÏéÚ;Û;zYYÛ[›[Zœ6413Õ54Ì.È]-{¾ÈëκíèîXðÔ|‡œS3—¯]ϳ•Ü IDATîìëìèžn|1µ¸AÑ(a·Y¶¢uá oQšhÔ(´q¿ƒmU°÷tbl^í襹=¤¤§Tˆ*æ÷Ü;Ћ¡íí±-X•‰‹}µ¾©>1%qéRD{㪨Q´î¡ Éa-ˆ;VÜQ#Mù£®ïߌÝq#FîFŒüÓ¦ÑÞ†Ø:{«2Y§ºíµÛªåì F/̾ÁU5õ5¢:îd„¤ªšªòªòóT`ũʚʒ²’êºj’Ó ‘–H%GÇG5µ5Ë*ËÊEåh~Å%ÅÂb\ÛÚÞÚØÒˆ„Öö´Ä©ÎžNÔ „„®ÐaEu.likÁn]¾I´ECÃ}}=%BAGG›°´¤®®¦ººª°ˆéòx^ANß¼(FM§¡ WVWö ô £·w·cR%å%­7<*\O_¯¨¤((4è•p!æ^]_-ž{mc-,Sß\)̙΂Ê]V ‘‚¨îôU{ožJß6™øÁT¶Â¨Ë¦{WA´·S9÷S>žŠ}g2sߨ—ü£G÷ÑXŒñKãööö:::Î.ÎÝ=Ý Èá‘a_'g'A‰Ì vìè÷æy›[˜£MhXèõ×­m¬A–¸ü\Û¹°ð°ùW¡¶¶¶§—§¾~CcúAÿg]Ï::9V×Tã´‰Oˆ·µ³MMK½|å2(Ÿ¨ôœhÏ`ÖúÆÆ¡áÖ.]§¢Î«›;ŸvË;qÒ@mò^¹Ý;U8õSšÙùß Ú¶®68®…åQ†­à ¡Ù®_jhn€kjìêoëlÃ%°-Ví\ç¹Ñ±ÿÙ6·5>rLƒ.Á¡, Ö—hikaݬ#ÎR5\­¦sMóÝàÒÕKä?Ò ÜÒÝÜ>m»aên‹|e»n`C~Ó«ØöîU8Ük‘ó…UJs×ÜîhøÜëê«á!µ µ0Wt\4ç0'":eŽ„;~8ßµ0w(†WØmpùù‹ç_ä´˜lkG+Lwqúã ˜NieiCKÚãÊ A©€ÜÂb%¯\¿B-×'Úª†ª+7®àlÌt¬ñ8œ¢/›¬'Ók5:ÒW×[b¦¢å+§¼ËW [Ô?z‰¢=1À7ûì·s°ãêpM­m­µu´ããpoàðŒõ*vó ò\\]lím£b¢px\ý¸¹¥¹›‡·£³#jÐ ârµãjV6VèÐð´agogw_7.quwåùò,Ð2)5 A£âQ†ðbc[#9,õôµžkNKO­¯¯ÍÈL/óSR“Î çæe“§ˆs¦£¸OÑÄÌú„E„u÷w#:Ÿu†Î¦æ¦:º::«ìWqprÐÕÓEú#Æede àáå‘™‰Ð~q5Q±Q˜òœé,¨<";!ZðˆvÈü—cž!´|ûîÕÁË9IÊ“ ïOD¼}+eLj×ö‡Í-ͰäÀà@m]mSs’Ëܼܮž®ñËãååÍÈeA¥M-M I𱇧ǕkW0)䲸 êåí5ÿ*´QRVƒ^¿y='7<~BBCº{»»º»Ð9niYiMmÍÕëWš ‹ QCTzòì ˆ¶ÿ|?!Úà°P·DCŸrÀ5‡xuÁ-_Ùl;æ¼EUoÛÁ#‡Ô55³òsf/˜&2&²½«]Ï@f„‘çäÎv­„ä¬*1X¶‰ijmòô‡Ã…‰- äñóvìØafn–— ºE'XYm®¶»§;qH‹3d¹SÓSÁëѶ6Íw?ÒÛøÕqêß2öS{Ĥ¢z£D9£ŒÝ–ªNåÇyõº¡íÚAçŽzÕ©8”î=S°Ç(9.¿vŽ¿¡Ïô¬tx‹’’’¥•%f²/ÂÇ”U”á?ØX¤¤¥xûxãCŽ Ìq­Sš§0 è‰ÍzÀåd{± Óâ*8*¹×0Н¿¯“‹š‘]ò>ö>4³¶{~ ‹•¼|ý2M´4^o¬ÑâFB"ÀNßÁÙÞÖÞ:":œÚ;7Ô¸¸:uuŽŠ$yÉð| M l±W?©Ž]vZfBnx°&"Â"îg$ ¨G ¢òZÜê'Nžˆˆ¢öì…ê'ÔÁ4èÊÙÕÙÈØ .9¡q[rÄGÄSœB¶ŒÀ‡gcgSßT/¬‚ºˆ2 Ž ZrX,,ìîélmkªo¬©k¨®©«ÕTTU—WT–võtdåd?;'?#3'­¶¾:=3Qrþt Œ P;@s˜»Â’B(€È»{Ï$2AÒ˜e¤õÇO‡zÈŠŠ„E”YlÎ` 8;: *ß3Ô#¨ ¹KÝ™¸|£«ìFWésôTNNÞË´½½ëF̦+¡¸-3ìþùäÝ[h,Æ»wzû{ @uyyãWƱ4àžþ¡þ¡Ë×.ƒ ]œQÑ"³q÷p¿0~öÄ!®-)-AÍü«H›[“ÔXÕµÕ¤­Í[7Äã¢Û Q.FÇFÅ*aßPV]†9bî:Fg}k©(rŽû~lÝÿö1ÿMV½¿×ÉzïK÷Íú;´­Ž¦egÌ^lûN›œŽOŠ"i‹Iˆ€r温[V^øÄGÂΧ°ðLä!ö:²ÄëbbAä\]îƒpÕÉS'ó‹òqª¡¥» ,ý‹Üôv~ìü¹îsm=m({Æ v¦lÑO“7ÍeÛ–˜D´\»óÄ=½‡ãR©h],o’ó™n¢KDáƒoB* f×ׂï9º8âþ‚ÿ€VÓ²Òæ¸¦€IaÿrùK7#<[ \»u;‹IU;ÚÞÓ>Û± °5ÐDKãu†Ä‰¶¢®7Òì!Ï5ÛzGœ°Q· 9aªïžü¢ÿ=€dÂÆÞf~w,r‹°È°ªºªˆè*vC€Àö`æwœ±1ãñ,Õ3ØCjYSI3RŠ`’&ÿÒˆœjjkÊáçhëhcD¢ FëZêÈ!¿8¿©¹¡PŸœŸž™ŸŸ,,+NIK‚’ó§CEÒŽŒA´Ø ˜˜™$§'#¸›C1´!; qAX)ôòñÂÔˆzÐMl `þtT¾{°›"ÚGÑ‚eGìÞ½±¸®8ló§[c= Úó¼àùþ¨Û{ç?ä²eÑ‚BÁùÑóѱÑÈ~®O\OLJlji¿VŠ*;º:nÞ¾™•“U[_ÛÓßctÚÙÛÅñ‹'5N #Åqsw›•˜ŒÅD{íæµ˜Ø˜ž¾œEæ¢ÍÍË-.)¾rý ²IQhÑÂ2˜²¶¾¾±™ÙN…=;öî:âøWû±ß4•=ñ—cÞ›w(ìR=Ì9zâDjVÆìåÀvÇÔÂÔÊÖÊÇß\‹…ð ðïZ°98\«­«]PT€±`sd¥d9Љ¸Cj ´ž/z7O·²ª²‚₣ǎÂýNhœÈÌÍÄ)ä‘ffÔÎïîG0|q˜úIçîs(Çæ‰T,Ò¶¦o5ÈØiž¯X{íÎc‡„6°ìÓ¼Ï 3vè'DfUÎñ7âó½E\ƒY`îä_f‚5“Ó’t­9…Å—#÷µu°E‹É¢O,=¹Áгïe$µU Uë iÐÖ‚hq#æ#hì첋®rNn÷ÎîÌÂë#rkûf5˜œ‚Ü“ó @È*°Ç¡šºb¢-²l–Q‰(‰€…Œ€°!ZRƒíybJ"ê"I RÆÀÐ@ŒœŒ ° „Úì¼ìð¨pA©’‘B”ËÂd ZrXPœ_S'ŠKŒ¶´2 8cmîêîìäbÚÄ 7?+19¾­»mþt¶ËoGðµ¶³VÄ,Æ%ÅíÚ½ Šñ|äUµU$A¡¾¥> $!¾¸¬Ø?È¿º¡Zl *èϛ΂Ê#ŽÏ"ÚÒë¡»ÿ«Zë¿ÊÿWј—ì­±î‰ÑvñÃdmf³,0vi,84ØØÄÙXYÅíí®n®–g,}|}k¢Mï@¯7Ï5¦f¦„Vy¾'Ú¢¼ŠÊ²¬ÜŒ¸„è„äØÈ˜ðȘ°°ÈÀÿÌìô¸„˜¶®¹ã"¹9c}ÆÂÊQれƒÃƒÁ¡!”GèƒAõ õKÊKH¡¡µ!¿(ºACèÙÙÛ)¶0: *Ø¢3¢½ê/û„¯ô$ëó'Ň.¸mÑΡÕœrhdêÄ ‚‘"[EzJ fìòxQX&DnJ.@Íå«—I³9Wz‘ø’Ë‘“Ê[“·F.ŽŒŽ’Ðõú⥋„’¿A´½Xn®Ž¾¢²Ê^%e壊_Ù¹ï [AIIA™­ÀVR=üÅᯨGdz—>†5Ö6ÖÂg a½ù®E¬çíëŸßÀá¹Îs°?VÍÁÙéÝl¢ïêèéDÄD•!ÖÕ×õây™˜›àB¬;õ$Y‹ $vÑùîGzÑ(÷õEfW°HÛo[ g”¹Í(CÙ:ûéÌ­úéÛÒw$¦”ö ͽ‰ˆoÌ÷q tÀˆf–fÔ#ôäxìVt­9…Eœ6=;—ÃØ"‘…m‘1cwBîAB´³‡h¢¥ñÚcMˆvl„üó[‚Ú¶N‹°*³Èf£°&ÓÈfÝÀêÀÌZÄ‘ÙmÄ?[°@y‰kRóüÚÁ^q?¤’ÔÌn/n#î­o¨onÍL'$.Ô6גâ~JZRvNh5#+5=#%5=9%51)%é,·®©vÎt²ó³ÄjÏH\)ÖD¬ÀìÉÎÂâÓ™º³¿s6Ñ[¾u‰÷Á%o`Ó åÛ·Æz–B´KGu]µ‡§Çêö9„hÛ{Û1_Ÿ@õS§NhjN…S8T?¥¡®¡q\CCíĉ“ZZÅe%óLl¥ÿñœ…\kvyA Ï®Ÿ½Žâ!Äåù.:ßý€ÁÑÁÖÎV€vôuû$”¶N;`{À¦@Åš¿Ï2WÁ4c¿y²[tѹž®Ý>óg1§æ¥®µÈÝ7²snÆÙ‡ ZòüÅó4ÑÒx½!y¢­­À4ûöníévŒ®8äPxØ©è°cÑ'~ziÓìßZPŸ¦ˆ–Ö5×eåeædçòsr rPÈÉÏΦ•™“‘œž„\gNÈœÎ:­‹òT²2óèøÎ‹s>u|çÿgïMÀÚ¸Ò¼_üÝç~Ÿ™{gîÜ;óÍ$_âééoºg¦§§»g:^’Ìt'N:ŽCœŒÛ‰/ñ¶Y̾cö}ß7³ƒÍ’û.I $±ï‹Á6^ï_Vd 0¶AQåÿÃsêÔ[§Þ·ªÎù·$«Æ6=Ò—£&жÉ@[Ïlˆ¹ …‡É‚Jß@ÿ˜„X¤V¿‹Ö¯ŽÎâýöò°6ƒZm’Ò6ýQâ×Öiæ¹i”*·UãÞ¾œZ¡XH‚–”vK J„Š] [‡SÙÄ"TÅdcøÐx‡_ç U1ªˆÕÖöVÐKö“<D”åÂèÏás”Z`sÙ C#γyl9hµFh›[›‰û '|µË3ÉS®m¡vQ» ´ÏNZÛÛšZ[j˜Í f5³¹‘Ó‚»ú*"AKJëµé -©.t äO™¶µdãB·ª¡Jãž¼„X\–üѱֈ-³•©ñÓ»â ù 6Ò¸'›ªŽ®ŽòZ´¤´SÄ—{6´9”œÂ’Âüâ|­QVa–Æ}x åÒr‹J‹&g&5NÇ Âhs©¹?½›¡zº¤qO6;Ì[…·ð—)íµœŠL`ÓA›GËëêïêí"¥quK»¥CR¿mc%îküÄ’"EŠ”ªDÝ"V Φƒ3Vž‡tŠ)R¤H‘ÚQj`5äPsÔÚâ\R¤H‘"EjG‰ÁfäPÔÚ¼â|øX- 461VQ[CÃõDºZ%MþæÚ••Ÿ…”}+¸JÈY Û¥ÐØÒ¨&ж‹Ú K Õ§’Â\jn[{›Ú(»ÌÚGy“«Öx7B²wÿµói4ZII þà/eiÉÏÏÏËË;~üxx\8έÆ]%EŠ©í¢&N“º@ÛÙ^TZ¤6!¶ëZ@––ÆãñètºH$ÊÎÎnll,++óðpÿÍ¿ýÆÓÏSã~’"EŠÔ6’ú@ÛÑÕA)§¨S²†…ü‡ªoy$“ ´´¼Õ¼Ê¦d³ÚXÔ ªšÏÆzÔÀjhb2o$§ûGDÅ%…G'$$gø†ž9ûƒ•••µµõ/ùKï@oûIŠ)RÛHÌV¦A[AQŸ@ûàᵉ--;¿+9–M} Zužõ  ­¬kþ¯k ï&Éõ«¯Üðè±/¾8vìØÏþó€°€ÕB#EŠ)RªR+håtQCʧçó|uR–Ð2hWqLZ.‹ZIUçÙXg¡ÝWÄýOÃ ÇøûØú¯ ýË¿4‹¿hì(ÊÏw57ÿÍo~sõÚÕZŽü$kÜg²@ÈYØâf›Ú@+îÑE]¢TþÚûî«MË ¥çýʦ-¶J}§býjhiˆ-â¾kîÞœUÕyÜ©¨ ^rèJÔ%cÇ™²²ùêêÚÄD#ƒ‹WL¯ÜȼQPV°bŒ¤H‘"EJQZ Z¨ ¤ U'e utv´«y…tÍeÓªh¿öªb´0Ú÷®d&·'Ó;ÎxÒý3Yç]ÒÐ>©¯\W7H§º¹žýá´O°bѸϤH‘"µÅ¥>Ð ÄÐE}ª¤– ]¼¿¨6É@+ê( Ë~üaE¯ri¹mqU±ZÏÆúÔØÒXPÑòÁå¤R¡ýKö…ç2hëêÀÚÛµµ))§N|³ïÀ>?Ìf4î6)R¤Hme5·5«´ô*ús%#P%m=–Ïmg´÷ïß[¼§&áP÷ÚBz!XÑ+€¶…×B¯~Õ7CmSS“«Œ•{¤¥[„w¬gô37;[Çé²²ûµµëëy99|ð‡ß½ÿ»¯Žåæã†+«q·I‘"Ej+‹ÕÆRh…b¡êá‹+‹Ó³ÓccâSâ³ ³QC)£DÄFlHlE%E<äSdá»wº$]sósÄêüyI¤…Ó"î£üê¬]mIáj^åç´%Õ%¿öªjâ41™L‡ŒBaaaNNÎuæÍ›7"#‡KK‡h´“ÇŽ~}òë ˆ ÌÜLj9Uãn“"EŠÔV‹«FЂ.J 7252ºftÍòš¥­% ›]”}ü›ã´ a@x)·Wt]©Fµñ¢Rh‘eÞ]¼KháîB3«ùÔ©S=½=Xt¹<®—·—·7ÔÔÜ$·\Y÷žjõJ°VZU— €–Ã笸Iã"@ÛÕÕÅf³³³³qY,Ö7¾úê«OúùÏ~–þ ¾>ÍÇçÈWG"ã#1OҸϤH‘"µÅ¥FÐJ„%5%Š¢WÓ/\ @V(zùy¹y»›ïÝ·÷›o¿‘å¸EÙ–v–—/#ÇŘ^@/¸xù¢•öòò÷Œ!O?Ïß0¸b—' IÞ¾hïÜ»C¨»§;*&êĉÈb±:53A-¦¢Ð)îì•öÊ-WÔäô$‹ÍV¬³9mœ¹ÛsÄ*Z$ÓÏ8£ œ €¶´¦tÅ­šU#»±²²élZZZxx¸ŸŸÊ®®®ï¼óö/~ñχ}râØ±! e¢¤ä·'qiËja’"EŠ)Bjm·°¤¶äÕ”˜Y™›G'FgægæPs J ’o&~äóôœô‚’‚ÀðÀè¸Ô8`5)3 ¿{ïw—M.G݈²v° Evxäè‘€°Ÿ [G[z ]±ý¢2he™ëS(ŽOŒ ;…W®^w‹±:26bfnVS[Ãiåôõ÷Íß™_´Ò©‹«K|BüÐÈ’c¨»·ÛÇ×'4,t|rœ°ÁáÚE²›Tö©òéùœvNi]éjñK†—öîß‹¹Î[ûÞ"ôÛ½¿ýÙÏöwÿw¿ø—_|ôñG7ŒHŸÿúê¿3•Î9)R¤H‘R‹§.ЊºE ‹’plG›ÓçNŸ9æêµ«Y…Y¹´Ü£_Åð]XZˆÊ+&WL,LÈ:{8cÓ§‡?qAè ˆ [ ðìü¥óØH)§(5Ž^ïî½» Ý^¸}Õè*@‹òàð bööñ Œ‰u‰-U·ñÚììíÂÂúº»¸|.öõòñn±‰°k ЖÖ*K(¿$¿µ½µ¬®lÅ­šN,NrF^Ff^fznºL9é©Ù©˜Ùà„Ç$ÅÄ¥Äéû³…ùÁO´˜!WkÜmR¤H‘ÚÊbóØjmgOgy}¹’dŸÅbp§æÆ&Ç›»y˾Åzì›c ²«ßð ö Â(Ÿ‘›MÜóhy Tht¨©…) Ãu‡sϹz¹bU±qj %)×Üü@Û%îB 500`±Ycc…E…©é©Š–+ œnmkµµ³5¼bh`hàæá&é‘ Rn€Ãµ Û©åTÕ` !Soëh«h¨XÍ`+‹^MǵÐ?«êì)œðlJ¶Ò9'EŠ)RJjá·¨´ Ë3ª¯°q°ILO,YúNS`h £‹c½àë“_WƒÁvNv·òoakvQ6¸‹MòqXL6¹û¸Û;Ûc”GîUP\zü›ãXUlfÜ.W¹foÏ^¹zÉ+Ê#c#!a!}ý}£ã£7oÝ W´\M3s3-m-×̯]w½N´£(Ž-PŽwIÈÔáUeCåŠ[·ºê+pinæÝLÏN/¤>sÂI‘"EŠÔJR+h+•Jº‘vÃÜÚ²°±°²·ÊÈÉ@ŠôôªéÕ´ì´¸ä83+3Ùç¸fÆI™I`íþøl5³63·1ÏÌÍD‚Ü™9'{òŒx€´¹…¹™Û3rMÍN]1º"ì¢<9ªÇO IDAT3É`2ÀWOoO{û:F¢åšž›v {û{QPÚÖò…|0^ɹ Ë ¹H‘"EŠ”ö‰ÓÎQh»z»ª«”nÜŠJˆŠ¾´UVÓP‰$5<6¼¨Tö1gRF¶fäf€[¨ùòØ—É™É1‰1Y…YD ¨Ä*ìóéùJ#Knko›Ÿåh›š›FÆGˆÕщQ&‹YZ^ÊneOLO(Z¾œ1óüâŠbÕ`—.+â yÕMÕ«"EŠ)m§C] ÷Škšj^E”RÊ×'¾›×c\ÝX]RUЙ«ÚÖò>Åŧ8macA+§á  %ÑŽøñ'›˜›œ9w"¾.nfi¦ÚjŽs[¯6🈋h‡8ºZï(R¤H‘z)q…jm7£…¡>±ÈÉ8<ÎèÄèÐèÚ4:>ÚÖÞ†d¬è !è4¶4®è6òW k‹o¿ÿȉŒ‹D&‡]R‚#‚Á˜[y·Ü½Ý1‰ñ ôÅQ¢Â>üÓ‡2ÐÚÊ@‹0Ãøþ” Hª{YÚXÌÔ2*Î̉oOÑ‹C‘7cÉ" (%O_ÏÜ¢Üñ|qE±°tB´üY4̰˜1(<_ý’RJA Ðb¦_Ÿü5ª{Á&*> 4ŠÃÆ'Ð'>9ž8ê‘×^w¿^ÓTcÅPififçdwúìi$åH¦e¨c7 M$¾Ä!ˆ¹Ûã+¦¦n^nF׌._½ ÞË!ö‚RAµ¹‡ò½ˆGâDM.E–ÃL­w)R¤H½”ÔÚÞ^fS}je"hA¾¾Á>µi`d ­¨«€+:†<¬…ß²šÛÔR*“”žD-£&¤$XÙZ¡)$v>>y”¼Ä´Dß@_d„Eô"Ô ÞÙÍù½÷߃±Ãu{g{p×Ûßûþ5ª{YÛ[GÇGã(˜…èŸÖ‡MÚ­´àðàì‚lìUH/,¯)G‰,2W/?/(žÏ˜„¤È¶¶Ø)û‰ïN ÝŒOŠG‚K)¡ ËÃ&¤Å É hêЧ‡SåÈ÷R-(µƒÂCù^`ÿ™΄E…XX[|þ_ŸÃF­w)R¤H½”Ú;ÛÕÚÁ^—¥65·5W3ªÚážþµ©¨ŸÃãTÖW—p ÊÌÉ´´±üáÂ6ö6ùÔ|DA¶jxÅÐÄÌ„ t#åÆU“«vŽv‡¿8L+§¨— /N®ž®W ʪËT÷n‘.'‡€MCsƒÿ¥Ë—B@b –°Ç^QqQ˜(úVÃ%µ¹E¹Ä¹EöØ H¾pé¼&±éVÞ-4XRY~Ë<©)“· ßKµ Ôjå{ÁÌ<๠ç`idjuÞQ¤H‘"õrRh‘í±yluª¶©–ÙÂìíïí–v«M`m3§LÂÉ}9·YK $¤Z)o–¨lôÏèÓ+訑ÈwTÚ‹¸ä˛ڞiG©YÅšg|kû±Ré(J ÊÊ\¶bJ{©”ÛQ9–¢oª-“"EŠÔÖTGW‡ú@ÛÂoQ›ñÅ¢¶ö6Ù]µ|J:$å x8(ƒÍ€jÈA"[ZUªÎsKŠ)R¤Ö/õâ´sÔ) ®ÕPQWQV]VZ]ªá@8ŠC«'F\B"{Vó¹%EŠ)Rë”@,Phû‡ú[Û[Õ,ÎnÙ\5j ±ê”)R¤HmM ÅBuv¸¿­£)R¤H‘ÚQJÔÚá®KŠ)R¤Hí(‰$"uvd€'â‘"EŠ)R;J¢nuvhtH l)µw¶wtu௶Š'ä‘nk‘nwi}€Šâ‹øŠ,¸P,JvºÄ½b5vznzlrlëhtr´­£ ø×ânPǬë–v“n_‘nwi}€r²>gjfJ>Æ s;¸ wï/îpMNOª ´3·gƧÆåš˜žÐ¸ÚÚÛFÇG5~ƒnžjkzú{4îÆö ã…ÆãR P‹‡i2@­:N ¯eöö¬|€%3ÀÌ£Çv¸¦g§Õ—Ѻ{º_2¸tùÊe3s³„Äé t+€6262¯(oí{(2fclÔ,¢“¯'Àõ÷¥ÜÂÜè¸h‡¶bPH¿•nçhçîå^VU¶ˆ»Îaš^N‹ [OƒUõUnžn[!´ PQpÞÕݵ¡¹!!)B§¼ÄAYm,o?oÕ“ oY³nS­Ú{‹÷>zøÒºÿàþƒ‡^¥…­ $úêíì4([Y]Éð™,fHXHVN.ÆÈø¯WϨçò¹c“cHvEbQumuSsÓf“˜­Óu§¤Ô$Å;†'äa<* @õMõ¸¯;Æ$Ä”T–PK¨¬VaÆ`1ÐÏ+j+p3a6hûbŒ`LÔkPD'_óª55Œ”QSRQÂás´`pÙÀÆÞFã½z3ÄU DMxT¸“‹“ÃÜ"b˜V §®©®¨¸¨¶±–/ägçg›[™c+B(­,å ¸0À¨‡Ð i…õÌzb—ZF-ÎÕWǾÂ]ªñÐTíq¸:òóEDÝÀlÀIÀªþ)ýªºªâ²âºÆº#U’R¯„pÆpœ+´“OÉÇD­‘-{—ÙÙsgQƒ]Ø\6£™±WPã§z³µhAÊ—ÖøäøíùÛ>|•F4.µ‚Öð²!(‹ š–V”†E„áJ½á‘á^Þ^.®.Í-Í€«­¥•¥½]l|ì¦>d^ ´èuV¶VÖ¶Ö .š\3ijirtv<óÃg+« Ð ÜO¨ ‹ svuöðö€=†6´èÏ諦f¦Ò#ÍÞúËZ‡óª58-Ǿ>fbf‚ /1%‘éÀ3dN[´ FyŒ×/0Â^1öH€Ì¦’óào€¯ƒ½“}em%°qøóÃ.î.–6–¸ýŠèEà>/ÜÆ®®nåÞº‘rãÛï¾Ýj Uíq˜è$¥Éz%.Çç†1±@êàäpÕøê‡}6+Fª$¥^‰YË©3§p¿ýþ[ÑÒÚq2yZ0>öFlNAÎF¸“A{wñ.²Rhÿ– +®®&dbhóǽAnˆøìsÅ]î,LÏL+4®Éu}F Ð445ˆ{ÄÜvnüxZ ­o ÏÍà «ƒÃƒÙ¹Ù)i)Ý}ÝgÏž¥—ÒÛxmHj5’ÑbÃd£-2†oN|S]_¡üÂ¥ èí²7ØX˜¡3ß̹w#}’VJ @Ï$@‹ÁúôÙÓH­Ð15Ö äz®ó+„ã숮²®³~ì…d¢})uÈÊ˲µ·Õx¯Þ¤ !7rqsÞ¶H€ªÎGÇEÇ&Ä6·6ÓËéÍœf€Ì(¯.omokqÒ+èà.ˆh¹º»"iCkØ \}êû­Z¤ÚÊ=n©7µ/ ßüp0ÉCì˜+üä j›#U’R¯„1NZw/w §î;ýïPƒ›ì]Qáà1ñ``CÜÑ ½w—€bn^.›Í&Êà_EEE» ý¹_#ž›]þJÑÔ¤¹¹¹±±±‰©‰£“cEe’]Õ]@ŸôŒtłƅ³¡>О>}ú{ýï1&š[˜£‡ôõ«8eƒ#ƒð9n@`æ/I)I?œûÁÝý¥­E# EÇKËLóòõ2¾füÇÿHti¤Jèxª .Ô4Ôøùuô+tWèÜ…s#ˆnÞŽ™5º+’Fv£fo}ù“Õç:¿b8¨Ä^è<ç/ž¯n¨&Úƾå@»¡²ÚX!!š·Â™D€ªÎ{úx Ÿü¢ -#ðI܇à f¨ §ÝL#, Æl5Ðâ¨ö8¢WÂUô&Ô ä„ä\L¤NœÞ×Ì®¡Ò?Ø_RV‚BXxXYy|`41p_¡æVö-ìŽÀÕÍÕÎÞÎÚÚ8ŒŒŒ\\]P) ÿ_Eœ>£•kxlq—·r[CÂBË"»Oˆ¯®«ÎÊɺpñäMúV”´1èi„˜fXd˜‹› µ„Š)öü]ÑÁÙᛓß`‘‚îέÁaÁôrzfv&F=$ÁD·ÇxžL¡SÜ<Ýвfo}ù“Õç:¯Zƒ|u$#+™“­ƒ-hD´¹A»AÖ5Ö¹¸»Ä%ÆÕ2j‰¯Æl‘U“¢â¢h¥4¤òåÕ媠Åм·â5ókòoeoMЪö8WW\‹Šš þÑŸ>BM!­e$ ÈJßÿÃûrЮé3Gy¶W®ÚåÏh[˜V6VÙyÙàN-2Â…»2´yùyùùÈD»{»Q3g>;'»²º™(ÐôŒtF#ÈÁQdÀÔb*@;5;E´004"Jû¥0@ Ðv:Æ&ÆZ8-}ý}¢.‘…¥’æzF=( {yí§¦¥"ˆ™73ÛíØtùÊåž¾¤×­µuOop‹%âè˜hww4Èja»ÄÑ_E™úþ{Î`§¸S‰v‰,NPL\ Òv\zaääÁ” ÝŒoE EïýúÄ×Äs9s^ô4tæK†—Ð-/_½\ßT{'û«ÆWMs r0Naúœœ`dbdne޾šàð`Œw‘\4¸ˆÝ1phöÖ':ùzœW­½L®™˜š™HâåÔAPÏÔ7)@¤PÇ¿9ŽŒ ·® ß-  ä<‡Ï]®_ÁÍÆjc)^â>D8°D~s’˜’ØÊo%¶b‰;|+Ì!•zòÔËF—=o?oŽœ$ñˆÈÞÑÞಬW®©¢”z%qxž£Ú‘ŸÅPIí«ÏHHÐÎ/̃š€¿›»X‹TŠJ£‚p0¶±µ9}æôÅK± }5¯»\GÒÉãóÅÝâþ¡þÉ™Id±hÉë'‡>A†œÍÁÑ¡¼¢|jz í42€F===°¹®¾,‡½¼^?~üÂ… 8vojnÂ&8337C8†|eøsåêðGG6lfn–“——ÿ_E8jýÁЇzùÃdBÄãeEƒÍËhÛ—>’‹ƒð—(ËWeò•F(¹}»Â,ï+ÔüX&ÿ=‡ç:¯Z#{v—’(?J=Jã¡mF€Ä…“Kãѵ?;L+…#¿E•.Š’ê}¸u.ßvv(õ¸v•>øcD ½rÅHå6JÆŠ½rÅV¬ÙÀ+¨ÝZ ´À ²,È×ß7$,ddl¤SÒ ¶~ ¨Ÿ¿_KkËÄÔ„LÓH^KÊJììcbc“1>÷ôbüÑÐó΃|°œœž„1*¹|.ìÁWälvövEÔ¢êÚj$uÓ³Óò›ÃŽŒŠÆQÐØŒMž„cð¡ˆR„üAš‹¬ȹacbbRSWC˜½Š†Ç‡ÕÚ̀嫃V‹ûÀ«trw/÷´Ì¾W²¥D¸Ýµá"¿7¾fŒTX.¤ÈüZ¢Ö_A¹V­¼ÆÇϧ ¨@VžšÃüüzû{©tjzf:·‹Ü1;7”ôJMš˜šÔÖ׸[Ú=:9 ¢,î´hVqg²™àkmCmn~î¡Oá(#nãµUÕVa—)oM} rßøñ|¿²º°’cÈîdŸovðË+Ëጌ(Å”WgÍÐèZ3Úá®î.‘X¤A‰{Ń#ƒpFžÑߣAoÔ5sš[Û[eÿë_¡“«NóW”¼Ûà„ Û<ÇX$³ä ¸õÍõQy]9àj®g—m þ2ØŒ¬mª- äQòäʧå£#l…µ[« % PWVYF”û‡ú³r²Ê*ʺûºcâb@VooN›08Ç&ÄZÙX!§Ä*†ë‘ñ‘ñÉq”Áàë®×‡Ç†‰FõH{“MÍL¯»\wptÀ!7Ù™D ­ª©rpr°´¶ÌÎË–Jšp\%Çp wOwd´í‚öàÐ`@»wˆ:÷rBPêûŒóV+‹×ÁƒëøÊæ²û‡ûA#œYü­m¬e·±Û…íšulC„(8\"âð9ÕÕèä舷®©®ª¾ª²¾r5ak=³^þ#P8- Í kìRÕP¨£#U7U›{š›û™Û[A×<Œm-í‚­ì‚,ÍÝ‚­ƒ­ìý-¬½L¯[AvÞ¦Ž~ænÁV‡±[ ¥G°•G¥ƒ»±w°äáoáâeêdå`åênêáaîëmåëiåloìíbéëbåãléjo˜MÉ&Üb@w q1õ2µ^rØÌÛÔÒÏÜ6ØÊvÉyÛ@Kû§Î;.9o·ä¼s°dëmêàgîlÙx»Z" × K[wcwx޲¿…“—©W°äìmêægîl9y{X"(Kgc_?+__+O gS„æëaåê`êádŽè|¯[9[û»ÚËÜ(Ð Ä‚¾Á>¡Dˆ6»zº6°fó@;534B€ ;¢Œ‚\¨GFl…@S$é7Ó ãÎîNüÅ@Mì%3DÞ”¼y#DbBA^&6©:¦Ô‚â¦Wp£&Ð"÷oá¶`þrÿÁýÇOkLß½wy-O ûFÉÈØ#”î,ȶiб °£³CR£JöŸ¹-5ŒšNIçðè0â]MC#Cà4ÝÊoÅ\œ–¡á¡Õì†0;ÁÙ£TSœ<ðæÑ7~zjÏÏô÷üÝÁ×þé䛿<µç_¿{óç¿öïú{öÚóÖñ7~óÙëÿyjÏïOíÙwøõÿ<úÆG§öÔßóöÁ×>9ùæç§ö|þÝ›¿ÿøµcú{¾>µçÈñ7>Õ{]ÿäýc{>ûàõ¯>xCÿ£=úïíùøW¯øí›ú¿Þóí?¿yäß~èæU”E¸l`75?úÆgÿë'§öÀç¿;üúO¾ñ§öü³þžŸ|í_N¾ù«S{~µäüoõ÷ì=µçß¿ñëÏ^çÔžÿ8µç·‡_ûèïŸÚóý=o|탓o~|jÏŸ¾{óí_ÓÓßsAãƒÏ^ÿòÔž£¨?üúá£oœ8µç¤þž?}üÚ‰oÞÔ?±çÛ/ßüÓï^ûþ³=ú‡ö{ÿ ½}¯ëÿ~þ»{>ûÕë_ýëˆNÿ{>þÉköþ&èi€¯ZìN´(NLMtõv<ÝÒî ¬Ù<Т̬SÒ!© ?rS$ D fA×ßȦ5j-®k}SýÜí¹G[`›c¶0q[`®Q]_=8<¨i6x­¬“¥,èEHDñÇ«/ØzçÞÓÄnbr˜‚1ùXmâ•3s3 ̆ܲÜþüŸÿÛ:ÿ]Og·žÎÿØ«óçuþROçÿ;¤óo鼦§ó¦žÎê¼þŽÎÏôtþIOç'ïêüã:¿ÑÓù­žÎÏöêì;¨ó®žÎÒùå[:èé|¤§óÞ‡:o¿££wPGï:ïþZçƒ_éèýZGïŸtöþÎÁ×uôþZçПë|ðÆßúØ[`#ÜVÔWºr追»ëÿÐÓù?õtþû»:»?Ðù¿ôtþ\OçÏöêüåA¿ÒÓùëC:ù–Îëð\OçõuþöŸêéübyWç ó =_êéüÝ^=¨óïz:ÿ~HçgoéÐÓyGOgï‡:¿~Gç==?èé¼õ®Î| ó±žÎ'(ïÕ9ø'½?ézOç­_èè½­£÷–·¿Ðyç':z?×Ñû©Î»£óÁ_ëèý•ŽÞ_èìý:Çž¸!-ZÀ‰Bv…™ÖäôdÿP?Z~õ°MÐ%Ø<ÐŽO÷ô®_˜#b‚(_…·}}Ð 5²¥>Ðb*:¿0¯ñ)@p¦‘ÝH€¶ª¾ óh»´áVÔU E€HÖIhA§©°ì¶ÛŸkŒ1šÙ%Ùj¦w)Ód€;-ÀÒÚÒ-Ú] ZX€ìã'H6=;)”ì}£“ã¯^ƒ¬YãæíKú$;\¸ÉÕ ÚÛ ·5þ"⊠E'׸K "h—gÏ]=T¦Ÿ¿ †iÖ–¦ÉwT€;´hAÔ-›CŠ«U³!!¯ÚÁ‘Áu~ÍM‹ÕÙÝ©^ÐÎßÖø‹ UЮa|oñæ}ÏmSö“˜÷îj<4y€J-èûܽ`£8L?wh(ÒQ͇ÈwN€Û´üèX("ÅX„dTö{„wïisós¯^ƒfEÑæVþR¬Éiu½½‡-®±üØŒFFpH0– ü 왉KR\\<95©ä¥´_ZW_·aMŒ)Vq«P$LIMINI¸#»{ºKËJŸÛfEeE‡ CãWT h,B8ÿôúàРÌì̲³«³¼¢\öÚ©²wNߢÂ0Íò±JØ`zT]SŸ––Æåq cÂ~ë£÷Š‘‰Jú$èÝ=Òž ¬ÙÔŒ—l=ÑîefnF½ ½=G¼MBÿ))-‰ŒŠ¼rå MwîÝi`4LÍLa+<Ãß»‹w±É×ו 1.äÂÝ…Ù¹ÙáÑaÜ(ówæå ʦiwæ¹|nwo7,‰ìŽôŽÝž˜œX6»O ´ƒÃƒ¨$¶ŽŽFÇDGEGË>œ× IDAT%$$„G„£)trW7ב±ÙqoÏÂ+”á$¼Åá0-@h¨ôòöÊÉËŸÇ]ÚX­?@EЎȆ-ÔÃó/¿üsÌg±Šp|||NŸ9‰-Vaóã0- ÓÄiÉËÏ £P)T5"2‚ÓÊ‘Õcã–¦É×·Š¡¡aFf–ŸŸïááQL/ÞÖî@ÐB@ãÈøHgw'Q·hk6D$h×XÔ Z\t{E!¯õñõ!Ê ™£“£ìMI“éé6¶6qñqCÃC„ z6QŠº$]Àóùóç­¬¬k¢^ÞÚÌì æì`lÐj€œÔôÔë.×%=’e³Å»ª •½Ìhi+¿ƒùÊåsçÎ]¼tñä·'Ѿ¡ÁG}dnnÞ)îLNMÆA /zxzôôõo¨÷öñvptøøã=ŠCÇÝ$­?Àg@‹™Äâò{¦à$.ŠX"Æ*‹Íòó÷ûþûï‰WAÁ¦Côã0A •8½ŽŽË¯~„jêjp ˆw?ÉKld€khdlÔÝ#›œMÏLcV‘œœ¼­Ü ÝàGÇ K ”ÑñwkHÐnö¢vÐÎÍÊ^t÷G546`ÆJ”‘®Iº%˜zgçd÷öõ"ÓÏ`˜õôö`VÎoç½§OŸnb6µ¶µ"ATl°°ß×ß×ÍÍ y Ø,YÛXsÚ8?šÝ»ƒ´U´ÃÄÇP3»yÿþýà:öµ³³hëê¶Û ·ÑraQ!êE¢kf×éÂ1xÒÞÑ>:6@+¦a®èÌfh*‚v9À¥÷La‚ƒ¸Ð%’R’nÞºyáââÍSÈäÃ4OÀ“Ñ÷0¼-ÀÆÒÊ„p9p™ˆw?aÔkhnØ ùà"œ .¸¸ºº{¸£“³9ìmàvíÆg´[\[´÷îÝz?~¬Îƒ>wQ7h§g§Ñ팢Dyn~îªÑUäjèf4: ]Kncem…a"*&Jv!§&‚‚ƒ n$€:J B+}ý| . 7µ°²`²˜ò¦Œ(‚¶¨ŸxgÄhbèŸÒ¿dpÉÅÅÅÀÀ ¤¬DîáÜœ¸[\PXO>ÿâsxˆM0ÃIÄÖ€ÀÔ¨:³ZO€rÐVÖW Èß3…ÐÊÊËÂ#Â"AhX(ЂœylÅ@Ö.j—Ó„ ñ‰ñʪʰð0[333.ŸKÔcdÜ Ã4àÚâÞ€AZz&‚73Е0‹ÝÖ’ Ý‚Ò hYcccÀ›zzz6Õ½e¯Ô ZFíØÄØè䨢F$}ùjgwçÐØ è]È1½™‘Û ,é•È~¦y¨=]®o°O©ÁçjljL–ž*€GÁ`$7èèÅÈ‹qJ$ C(`=8:Kx% 1TI‡¤ŠÎ£ÜÑÙ©À‹ú³á"T­ì‹ÜS²yŒìký’Nd¯Åto†"jdÙô$fËÃ4¿ ãQO¼‹Šx»&%D%4=;]ߤ‘aZùÁ#àÚŠÄ"n;j´#AÜînÐ’ŽÕÚ®®®ÌÌLUÐ=ÈhG––©©)d´ååå‘‘‘¬¥ÅÚÚ †±uSÝ[öJ ­aÔÈÞv´„. >H¥Š Ôp;¶±*‚c+1`­- d‹‰aº•ߊÉÇÚöõêšê¶B>D¸£Ü %3Z5¤¤R©@"‘ÈA[SSÓØØ¸°°€”—ÇãÄáááõõõ“““¦¦¦Ú Z€ ™Ÿf…Ä´o O´È’eo+Ô´c "h1“½jqtpma CO ÓÞÒK˜×´Ç8¾E†i2À Ú-¨m]]X,^åýû÷ÁÿØØØÞÞÞÙÙYOOO`•ªŸŸ²ØŽŽd´l6;$$ÄËË 5Œ}}}×I¸W\ÔýèXÆ€¡>ÍJ:,ííïU­¸WÜ?Ò¯qÇ60@ômÅÿG‹`étma¶4ˆ¦qr†Æ†Ö¶GGªkÔÈ0­üsd€;*ÀíZòÑñ+v~~^þßrž»Ü»w- ¾ÿǨ¿}ûöøø8V‰ËHa§§§QƒÆ‰ï!»¼„{/º¨´Ó Í èT==—H"bµ²Ð"ÏnµkÜ¥•P,¬n¨&@K¸ž7&ö öá´`Œnj‘½Ð«ÏµÇä)§4gi˜Þõt˜Þõt˜Þµ×ý÷wv<¢ûéÝéþþ½ÝGë9¨ûþÞÝ¿¥{dŸî‘_ë¾»g÷áŸêyS÷ó¿Ñýøïñs´–bd€;/ÀÚæÚÏŒ?û³÷uÿï#2ŸÿüýÝyP÷¯ŽèþOøÿîî×ë¾qD÷ÍÏuÿöÝ?…çGtzH÷'ïíþ¼Åêû»qP÷ߎèþöˆîÏßÝýÖaÝ·è¾ý¹î¿¼³ûwGtß?¢û‡t÷¾·û£#º#À÷wÿá îgGt?GùÝ݇õtèé~þ‘î;¿Ù}ä÷ºGÞÕ=ôoºïýãî#¿Ò=ò Ý÷÷ìþø Ý#Ðßê¾û»OþÃO–$A»ãõG"~¶¦¦¡½E#¡Í tiâÃüå y˜þWÕW•×”k‡*ë*1“à ¸ ¬IŸdý"ÆG¼@C0N×Úöѵ*çíÏŸw?wÅßðª¿ÁY;ý«>Mü M|/·Õ7÷7°ð7¼æyáªÓC[Ô;±t?çàoèèo`b§ïèsÑÕßðºï%3[}wOCÏ vNg|| }¼ ímϸ؟óq6ôv0°¾¢ïayÑÇÂÐÓô’ãÕ‹Q¸¯Èw`€,.ËÂÇâŒÓ™Ëþ†ðùœÓ™KîçŒü ý ~°Ó7ò¹hêohªà¼©ç…+Ng¬ü ­ý œÎ˜¹Ÿ³ó7´÷7¸j§oësÑÑßÐÁ÷’‰­¾³¿ Êž,θùºûÚ8qr?çåoèåo`m§ïá}ÑÇÇÐÓã’•…¾·›‹¡«Ý{³3>†>v†öÆg\LÎ!:o3ëóú~–¦òIÐîðE} ])YÙÝî°¡fXZÍ@©Ôž%DMWk•õ¬­Ý<íf)“?9Âk1e±¨žW. y¸44]b^n¦zlÓš+FÃÞîì¶éX‹1§ÄÇÔlØÈdØÓ…9ÐxyiȤ¸_5î¿l4àáÒ¤TãéÊn6k1j¡{›\ºb<¤j#¯i¦¸™ ›Ž¸8Ö×dªÍ<˜vöÓ/ª>9\sîlº¬æærÍ¡Ïe5ÕŠ5r›¥½ô–mÒT÷zÆFy¯ês%>-#¬U® EùüÀÆäÚ°ñµ1Îp³ÉpóUy§KóÓh”mÜï¢÷EÍ¡ÏkÏÍ¨Éø´6󓌰sŠ5u7¡æÓ/ªk2 ›ÃÏØ(íµdSý£Mæ'?îu&£6S¯§öÜÒ12ñte=÷N€Í0Ë„¸îˆôŠñðÚw‹‘é±é¨‹cCM¦^-< GO=Ìü´v9.…Ø—mªl>AžÂ^O#­VÜKùld.Ÿs»q-pGÖ{½ˆ¸.]È®ÎXÉÃÌ•|^©FÑŸÚ•®ÎŠ-«Úè}®ÐN泑fêuË® /® q×)ôJm«f[¶qkTA+û ö¯ñÉq5öþ\Ç“I*$æuR©O Î6±kDmâŽöê¹ié“Iê§û4š¬žQ;ýdB{jF»Òâbbb®f¥ßßöÜŸóöÅÆ^Ñšš‚L›Ç)OºR¦9Zê$5eŠ‘/yÒ•ª55ã>¶Ã542¨.Ðn½s·ç4íÅæ.wïr;;÷‹Doi«¤â“O†ž i«îO kÜ 2ÂWÐÄ„¦Gµ,áyB Z´O/-òÕíÚÛ·o?÷ûèˆfDù)h÷.a ÷ …{‰‚ ´ÖÞú£\Ïš©bÅÞZ©‘mgY{•@ûÔüàºQ~Cƒˆíñ ¢…jÍvÓ°vƒvx˜- ÚÚ‡–——ÅÇÇ÷õõ¸Ýv …ÛIIISSSk›ÍÏÏ#L"F9h‚½4Ú>ÿ..’“÷³ÙÊxãñöÞ¼¹ßÕõ@PÐþÆÆ•Iìí}àÚµ·ÍÍ—•–¶ÿY@î­®Þ²‡ÈÉÙ×ѱ2Ëkjöâ(ff²¬­ß.,Üß^°@û°¿¿½¦&9,,ÔË«<+kF$RöîK¥Å] š€×;Nÿˆ!î706Ð=ÈýfÉ;žk¶¡HÐjɲõA;::ÂçóHÐnâ" ÓÒÒD"“ɼuëPôd;€°œœœÄÉ”H$wîܽvíZMM ÷ïßïïïb±˜È_±Š3Õææf###.—‹z´H éô}¾¾àÖ~ÀËØØý|þ3xËÍÝŸšº¿²r_XØ~ŸKÙä3TC (K¥îc0öjm}ƆÅÚ¿¿¸x_~þ>‡¥¥ûTÑÈdîut<€CÔÖîmhØ›‘±¬-+Û÷¢í(=:F^'¨­M a£T”šºØ×§8æ=`—”\½p¡‘JÕü¼nGS S²Ë³›$M(”²KUk4ïë«D¨y?6K$h5ŽXB==Ý®®.À- ÚÍZ¨T*üA^»¸¸z=Ù \‘…ûûû‡„„°Ùìï¿ÿ5, ¸Å¹E,®®®©©©ÍÞÞ«(GFF~ûí·±±±@/Z.wo@À –ÈA»¬¬}HaA ª57ïmkÛ‹|©äŠ E :®òèXH`üFÎêät ´jF‹J‡·qÂä²EEû(eÐ>¯åŒönOOrx8KŒmíí •ŠÞ½ÞÞÒ›7ü¼°Ió£ï:õ4ßß{†z §…C‡jÚk’ò“Tk4íë«E¨i?6+<2£ÝdÐ"‰ÊËËËÉÉÎÎÎb±š‘G¥¥¥ŠÅ]ƒƒ……cc£„MUUeFFú‰'""Ây\Ý^ž®Z£i__-BMû±Yá‘ ÝdÐÖÕÕž={6%%ÙÝÝÝÜÜ,))ÉÏÏ/%%¥»[biiI䯰 .//?þFëìÕÔTÌ 1-t Ý˜%==-2¿mZà·…­­-‘ž>~üXZ ImZZš‡‡‡‘‘,qžaóäé‹¢”@kg÷#hL”[[eù%ÈWQAdºo!¿¬¯ßx`µŒVéÑ1š­ª’µ¡L…‚‚}Àpqñ ™¨"hÓÓ÷›˜¼}éÒÛAA^´¥GÇ­ïõë OAûxpp¡»{^,æWWó«ª$MMò‘/),l;vèGÐÚºÙJHQUͯŽH‰P­Ñ¼¯¯¡æýØ,‘ ÝlÐ^¿îÜÓÓ]\LsttDBRYY¬ZŤ³ÑÑQtzquu@‹Ô–íÆ,EEE-Øs÷îÝèèèíòèøÉÒ»)†††rrr‚‚‚0K @ âf.-}}}Y¯â+ŸTA‹”ÑßÿÀÒG¡Ë_GŠ‹“}ëãsØ‹‰‘}ˆ ª!£ÅVÔ;:¾½Ú£cðU1!NLÜ ÚÚ}ÈM)Ùw—øü½~~ W$Ðîèx€HaÑ`{»,sÅî/ÚŽRF{§»;9,¬ s©¥±MÊfSRS{˜Ìø  ¸ÀÀÂädùW‘·h‡xJæ%ƒ«øUɅɪ5šöõÕ"Ô´›™Ñ¾ hsssAÈÈ»NÐŽ.¥­AªXE òWÅšÞÞžk×® 244¤ªªŠíÆ,­­­`¾¶¶¶ÂÂÂ………'Û´÷î݃·8™˜¬´~~~l6{vv6..ŽN§cúJd´rÐÎÍÍ¡ÜÓÓƒÝå_†®€1p®´tŸ›Û7örJj££÷×ÕÉ ÉÉ+?:63“}q‰ÍÞKèÙOyßjjÚ‹l*/ß¾¿¾~…G¾È­ßÚaŒòó÷YZ¾¿/ÚŽh ´–•©HaEõõ>>Å÷¥RÕ‘o›‚¶÷^o|v<½™Þ:ÔšIϬäVªÖhÚ×W‹PÓ~lVx$h_´ FrMH"¯´à¥jXµ°°‚²³³‚ƒe5VVVX•JûÑŠÅ]ÀóààjHÐn̲R(ÿððph»ü÷µ¥¥%00ÐÙÙ¹¾¾n×ÖÖzyyUTTˆÅb°ÖÛÛ;;;;$$–ñññD¦¾¸¸ˆY¡››[WW—ü+fgïóô<àät(miQþï=Î^Ð ÆÖ¥ç·+|ÂêârÀÈèm“eÁRÑ@ ØK|¥˜#ŸýO;?Ò›ìíß66–µ`júvfæ~¥ÿÀ³žv”?Yúüµ‘Jö÷rw/ËÊšíì\q䣥§ó«ª4?¯[†¶6J}#}¯û^O.Hî[ìS­Ñ¼¯¯¡æýØ,‘ ÝT†­Z¤­ÖÖÖyy¹ù­¬,ƒ‚‚PãääD£Q;;Eù­[·Ê0;‹ƒ= Ú [@)âm…òš­Zby´´(®QÈ#’¯ÊmˆMOžùe¨nb}?XñÌÏJõø ìÉ¥úxYéJ-(Ö+´°²3+~±yµŒV>ª=|48øxõao›ýœ…êVÐnµ—%aá x¸ 4îɦj~ªk‚ï8ÁsÐVÍ´?é=éìÔVÝ•jÚ2ÂWSoï#Œ6 6[ss³Ü˜'x³c êíÌì´Æ§Jjå·NMOÊψöib|lfpà ›ý„Å"µ-ÅfÍ YZ}ý´ïÁø¸Ö2rŒ·µ·©‚vvnvrrb‡khdˆ­6÷´Û]Z¡áíâýÅG;~™žÞA UüYK­íÌh/Iãnl˜´<ßÓþÉŒv ~;GýËÌÜŒv‚@mh¨ÏÏÏ—¯2 AAuuuÄÏ… Õ&=d2Û³³“==CííËcbfª«Umî75GFvåçkÜÛõJË1¤ý’ %AûD‹AËf³pÜàà`bþ,ý¨t”””Ø××;¾@;¾c@û¸¹Y““àæÆLM俯¹¸…†.66*Ú€Äìôô«§O7&'kÜáõK«1´#"$A»9ðÚN‹Ö‚¶°°G—ƒ677çÆ„þ~©âÓc­íÎÉhï64 —k‰Õ‰Š FR*mî1¥ÑÑaööŒmZ-Ï÷´?B2£ÝlÐ7­­­¯Ò—ËØ(V\´´ƒƒµµ5Ä/rA ñAAAAA±±1<—`- Z­Ñ\m­Ÿ•Õ|]ÝÚf`m¢‡ Ú­$-ífƒ–ÏçÇÄÄܽ{÷öíÛ‹‹‹O–~¹vai¹sçΓ¥÷²` 俇òÜÒBØ'%%É_¢JÔlø¢µ WøéK(&&ÚÞÞ¾ººª¬¬©-ùèXËÐúZZ.Ô׫››QwùYY¤°Pn™´½@«ýVµ?B´›.ùÐ:99¥¦¦úúúR(”ùùy‘Häé雓“sïÞ=)VFFÒV°vxx8%%ÅÃÃÃÁÁáæÍ›€1ZPV"‘ÔÕÕa— wr§€6##½¸˜F¼ ÉÅÅE$ŽïÐöÎң㮂bUJ£QÂÂzŠŠâ]]ã\\ CBä_EÞf Õò|Oû#$3Z5€öÌ™3MMMà) QcaaÑÛÛK@·¾¾~jjª»»»¼¼Xíêêb2™¨VVVÄ^°eét:ê7ÃÉZ&³)??ŸÃi¡PŠàXÜ5N‚V‹ô¨¹¹53LEþ*ÊË‹pt,ŽŒ¼ÿì—¡‘ ÝbÒòIЪ´ÞÞÞ HIÓÒÒØl6jÂÃÃ>|ˆ­T*4½¾´ØÛÛƒ£¨ƒKJJ"##OŸ>=22’˜˜˜™™‰]1bl΢͠e³Y8ïË7ÁÈpEE¹——'–ÚÚšòß{Æw hŸ,}þÚ˜œíìdcS3[S³¢-<0Ö¸·ë—VchGDH‚vsർ«÷îÝA3228jbcc‰­………ÈS‡‡‡T\À[ꪪÑZZZ ½qãƒÁHMME¼Nj3hÇ—þû¬Ò*ùƒÚ­ÇÍÍÈn×øÍŠmösZžïi„dF«Ð^¾|Y$ŽŽ&''‹ÅbÔÄÅÅÉ·–••ÍÌÌô÷÷³0¿wèÍÎΞœœkÏ;Ð&%%544ܹs‰’ÚG ï$ݨEËA»¶HÐ’ÚêÒr i„$h_´  عKâ£Ö   //¯üü|¤¤¨III!¶ŸÅÅÅ0Mïß¿ßÓÓƒ|×ÓÓ322òÚµk Ufffss3ÑTBBÂìììK8¼öB‚V›A;N‚vûK«1´#"$AûdBfÙÝݽK°szzzjj §XþÿyŸß½{wbb¨²ôxæææ`Œ¿Ø«0–ÿ¿ Pv{g´ wæ¶Ö2O¼&OÓnlîrwzú &†¤¶­îJEw‚ŒðÔÓóHÓÀ:–ÙÙ™_“÷r ÙŒÌRS‹ú@»ˆk'¼ø³»'ÃZýZmíÖ°Ö¿]Ë#DçÛá/~ß‚#¿ú´$hImii5†vD'=q[ IDAT„$h5íšæmíã¥ešÚÇÐàࣶ>^c+aðTkج=ö<·‘u¶³Q{m]iy¾§ý’íÂ…;;^ã“ãZÚGñx¼øøø˜˜±XŒÕ°ÙlÔdff?Äõd‡öa{MMrXX¨—WyVÖŒH¤4$Üëí­+, óöN‹ŒãóUÇ 0,.0ÐÙÊÊÅÚšPeNÎ3ƒƒR+#::ÌË‹Y\ü@*]±)›£\_jÁÓÁ¡µ¼üÑÀÀ‹¶£ªçÝ—J‹32º4?¯wœÖn i„$hgfg4þE-khdP A ¸K$’ÒÒÒÀÀÀ™™™ŽŽŽÂÂBÔ—””$''ß¾}ûÉN-Ð%¨­M ·Pˆ *JM]ìëSšét€³‡É¼¤š¢”åWUp¹„n‹ÅŠÓB!5=½£¦†]ZêïêÚ¹Ï&;:\]oÅÅõ·´ …šü|OGÇ.ãEÛQõí¹>`—”\½p¡‘JÕü¼ni5†vD„$h5Î9K;AÛÕÕ%•J9ŽÏÔÔ”H$B Y@5ãããOvhïöô$‡‡ƒ@DןhogP(¨TZJK§‚;ÝÝ¥·n!•\´HC‡ÛÚV{ê;%òªª€7ä¬nnÈ/UG~u5ع ‘«HC¹¼ÊÊmGIë ){éÍ› ›4?ú®SZžïi„dFK‚VkA‹”ÍÌÌ422ÊÍÍU|óQgggjjêNËh纺ü\\æŸâm5O!žžÆ—.­˜ó¬Ö&&6¦¦«=:&T‘mkjŠvV|x‹„8.0(ƒ|°Aþ º¿h;JZg€8bbh( Ú­$-­ÆA;66*•ö‘ Ý”Éëää$Nwss›žž&*Š‹‹‘Ýî´ÏhÁ!ßë×åy$¹ÐÝ=/#¿ù$MMD=òK$¬)¡«d´ªŽ{››QÝîê"ÌPà”•¹ØØÈóKE)‚¶:/ÏÁÜÜìÊ•´¨¨mGIë J ÛN Õþ«Ú! ZÍB®§§ÛÍÍ•ø}{´¹tuuõöö‚¦@¬¿¿ÿÄÒÊÖÕÕµ¶¶oux²“@‹”19,LþQ¨”ͦ¤¦ö0™ñAAÀ^ar2ȪMvt`+ê\]­Zd±à«b%=3-Äõ·´ 7åUV>èï'ÇÖòrÕQäCãD ‹ïK¥åÙÙháEÛQÒz$6m3Ðjy¾§ý’ífƒvpp€B¡DGGä™k¿´´´$))qéuCÝÝKKK€vdd˜Á`¤¤$çææôöö }Õ…ÇãeddˆÅb‹•ŸŸÄ‚µ©©©555ããã³³³;-£}40ÐZVä€s¢úúŸâŒŒûÏ~›·";;?)i€ÃA¡<+Kõ?ùmgCÃŒHDèno¯¢Á8ŸŸ.ŠŒ¬øx$ǪÏŸïãì\œ<ÞÞŽØ%%îvv-¥¥/ÚŽ’Ö !´[LZ! ÚÍ-›Í²±±ÉÌÌŒˆ§Ñ¨ +þfgg„‡‡×ÕÕÊA[[[.P©TP9''[é•3$h_xY\\ÄÌ%22”V±jaaëáàààéé933ód'öÉÒÇ“¸ÃüýƒÜÝ˲²f;;•†„¹®.À ˆhçž>¿U@êåe{횃¹9!ðXÑ´ÖÕ!+M‰ˆ46*ý§y#âÆFû¥œ,-ë ”þÏzÚQÕs$DKOçWUi~^·´C;"B´›Ê0«;Rض¶Vd´}}½>>>bqòWTfd¤ ÅjpppSSˆËᴠݘEñç)Px¤°•; ´„À¹G«ÿ$…ÒVÅŸ• ½Ê äZñ§!¿¬Ô‚¼þ‘B;«OkÿœÅ{­à“m÷sZžïi„dF«†GÇ7oÞôðp÷õõk{zº‡†±©ºº i®´îîî|>õ"‘ÐÎÎVŸÚj3hŸ»ì@Ю_µòo¯ñã5t§»É¥b ¾×¯¯–h’ZYZŽ!íífƒ¼\ÁÎØØØ¸¸¸þ~ill àŠz*•ÉA›””ˆ\‰lK I0 Z5-$h×мD"ÿvñŠ?Oñ\!wooWlaŒÏ_çs`Rri5†vD„$h7•aAGTT$…RtãÆ â‰qNNvYYYddF•FË`4dd¤WVV$&ÞˆÓÎGÇ[í/±¯ÉÓ¸'›ª{3ÓOD’Ú¶º+Õ´d„¯¦Þ^Ùkò4>l¶ææfW|MÞfƒd­««E: |vuu¢¦·· MHˆ/++ÅÖþÜÜ\`uxx¨´´4..6??¯¯¯Wm”U+hÉ¿«_ä‹ß·»ØZÿZt-o‡¿ø} {zº‘}Ê…Uu&›*´Ú Úq´Û_Z¡! Úõì.•ö¹¹¹Z*,NNNÀ­ÆãÚí,Ð*Í´´;0£}¼$»±aÒò|Oû#$3Z€V>Æ®Q_úZ“’ž»×v)h3h{zºÃÃÃŒ†ñ¥ß ¡ÑhAAññq­­‚¸$hµI™ÌöììdOÏP{ûò˜˜™êjU›ûMMÅ‘‘]ùù÷v½Òr i„$hgçf'''v¸†F†´´##ÃÅÅ´³gÏÒéÅX---IIIæpZªª*£££‰ßßÒzÐŽïÐ>nnää$¸¹1SS¹¹q..E¡¡‹Š6 1;=ýêéÓÉÉwxýÒj íˆw8hï/>ÚñËôì´v‚‰l||œŸŸÚŒŒô´´T©´Ë庹¹_NÓzÐönCrY°–X¨¨`$%¡RÑæƒQfoÏØF Õò|Oû#$3Ú-ø;Õ¿ÌÌÍh!hE"attò׈ˆp´mm­ŽŽŽÆÆFHmÆIÐj‘æjký¬¬æëêÖ6k=ÑJÐ ô§¦¦‚¯##Ã8:Z …ÚØØXPïïï×ÓÓ=¾@;¾“@ëki¹P_O¬þÿíÝëSTw¾ïñ¿cªö©y0uNíýôœ:Î6ÁÌ®ÉTJ¦jÇ$cn“Ä;Þ£âAE¢"A”ûý&A„F.‚wcÔÄ1Ę8bư?Í2=Œ¿ÀþÑÀûUߤpõêÕ‹ûÝ?hðçæf½­îv<¨¹\RâÙ3mb…vòauò¿‡„Ö7ñšH&ahÏžm^´(P5ÕM†……]¿~=##£²²ò›o¾¾víê¶mÛz{{îNÐNíÃÁ/_<|Øùãòò²˜˜«¥¥I[¶$†…•DG{^Š<ÁB;É×{“ÿ=dE;ªÐÞ¸qã°C‡]»víyû“òAúÈ=ïLnÞtÿšeç:íû÷ïû555MÂïÑ*¥•nš ‚ãâât'êdrrr\®¶ÚÚš””çׂÚI3Oš›ÛrsÕT­_{Š‹÷…†VÄÅ=þçC9Ch_°™äï!¡yh¿ÿþûüüüÒÒÒªª*µcØö¨²ÍÍÍΩ¢¢"22²§§gè*ëÙ³g;V]]«½òÝwß-_¾¼¾¾þô/úúú†îpûöm¼®®.+++))éÁƒÞQe#""ÒÓÓ´§B£³zfOç8çÏŸŸ„¡:yy¹uu§îþ UUÇôQINN>¾}ŠüxÏÝ)ÚÁï¿6¦§Ø´)jݺªøøû'O»[yl¬b<îg;ò™Ôšï!¡IBD«XµJ¹íïï×z´««Ë{ÝZ>^¼xññ ­\µèôü+mƒËY¥Z)ýᇴ2.,,ô>ˆ. yòË?ãæMKá¶¶6†nèóÏ?ÿëp¿®ZkYUÖSVU/33óÊ•+ÞÇùé§Ÿüú¥ã¿þò!ñÛÏü† ýqèOhýb~{cê„Ö™Ÿ››õŒ×ð;+&ܯ³p2äùNÂ7ßÖ_ÞãÉ÷†Úq(ðõö¡½pá‚"êô/77W Sï}.]º¤?zôȳehe=[®^½šªRzD¡]°`AJJŠáKǪ¸Ö7nÌÉÉQ¼½¢ki-ë¹E¶®âomìèèðߊö~ßí{w.¸çfォ—ÜóeïønqoþöÛ¯Ÿn¿Õótûõ‹“iËýkçNÕœ¬¨«h®rÏ™êS5l™([~ì¨vݯqσ×ã*÷<ªv}?‰¶|Ýä:{×Õ|×u毮S}®“}®º>÷'Ë–î¶;/Ôc‚¶|ýU—«³Õ&´ZÂ*~N8³²²ššš¼÷QŒSSS=ßyÕÎz[Ýýn§ˆZƒÖÔÔlÛ¶­®®Îû Þ_:þöÛoµ’Ööû÷ï;' Ãvww'%%EFFê"ïƒ(´º¢ó¶Î6,,,88Xï‚÷qnݺå¿Ð>º²ëIý¿¸gïÿ~òÑÿwOäÿ×-ÿ·ëLÌý['žÔÿÖ½½ð=ùxpûêéONýI³åç‚ÿ9ðÁ«ïÿq`ÅK5¿¨ýÍ@ÞïØ2¶ü|ðw?}µÿ“?ö¯y©¿á7ý§Óèwý“iKÐËý5¿í¯ýmÞ¿õðZÿû¯÷¯øÉ´åqþ¿¾P >Úò¨þßλ*lBÛÛÛ›™™©2i]XPPàr¹¼÷¹~ýºöñ”O+Ñ––55dPuuµ®{ûömä§Ÿ~:~ü¸Ö£ÞñþÒñ?þ¸{÷nmܾ}».íëësJ©–©ÖþJ¡ÕñšjÉž={tÞÇð竎ß=:p%Ø='w ¤Çº§&||·t¹Š¿ÿkçÀÕ÷v׿ŒÁíÅ‘O÷d [ØÂ¶ŒlËãË›ÎwÔÙ„V­ÊÎÎþú믵¾,..ö…Ç?üðCnnnUU•Ö¬_~ùåÞ½{Ï/`Rö´¨ÍÈÈhooWá*++½¢nذA%þùƒ/³rèí3gΩ¯j¿NiØCévÃÃÃ/]ºä¬ª[[[·lÙ¢ý½sïÞ=?†öÅûiª)ñ¿€ï=ï~ù#ÿ£G”ÆÈÈȈˆˆ'Nô÷÷»›úš——}øðág*¨ì)~‰‰‰ñññZq*ÌÞGPƒ-Z¤0… R u•¡;è˜111ŠúåË—‡}ÙÔÇKKKƒƒƒuœM›6…††644<~üØû8ùùùß~÷-¡X±íÀàk†µþÓjuèËž¡”þøãÚM ßac¬.*¥ºôyÑ´Z½3„÷qt]A¥4¼8Y×Rìœ#蜵DöÞGÇq×–íxŸLxcZ_¨®®NûgÞ¯16S•ÓÓÓ‡ᙟ)úU„–Ѐ­6´ÝÝݧÿÙ3¿žâWi]ÛØØ8ô£:¡%´`ë… í‹€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°Eh -¡[„Ö€ÐZ°å m{wûé–Óš+7®Z¡%´`ËÚK×/u]ìÒܸuƒÐ:-¡[žÐ^»yíâÕ‹š›wnZ¡%´`Ëڶζúæz _:ö ´„lyB{çî[ßÜÒܾ{›Ð:-¡[žÐžn9]q¢¢²¦²÷J/¡uZB ¶†þxÏݾ»~¼ÇƒÐZ°ÅÏÑZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­¡%´`‹ÐZB ¶­ŸB[\^üðo}ó.ü÷ݼ}SŸã}0áýýï¿~ózßý>Ohï~{÷Ê+ú÷©?Ý-…G|Ú’£%Ý»¿ºóÕ 5׿º®÷Ó`†™síæ5ï¹qëÆ¸ŸØ¸OWoWéÑRŸ‡¶álÃÁÒƒÙEÙ 3Õ&÷PnQyQfAfjn*3V“q0C÷ªîÛqÿøút Ê Ë Çý4|:Î_ ú¡tN¾¸¼Ø<¥U¥ç}ZW—K7Ã0SpšÛš;z:² ³2’²’’³“ÿ19É)9)ÌhGw]z~ºîÕfWó¸|}:zälïn÷Óðé¸ÿ‚ôNÔ¥N¾³·óWGŸ«=>m×Å®Þ+½½WfÊMÏ•ýMË)ÊÙ—¶wnÐÌyëÞ™·n¦{Ö¾³jK ûépE13ª)Þ÷)à §¡]3mö®ésvNŸ·ç•À¸ßZBËLñShÛ»Û9\p¨@S\Z|ôøÑÖŽÖÿÆéVÕT¹º\Ï»´ñlã‘£GÆðÞiqµÔ6Ôš·0Œyþڪ콿Üç«ÐææÄ§Ækr‹rã'¦'îÝ¿W››ž›®jUrf²ç*™ù™ù‡ó‡=Zñ‘⤌¤¸¤¸ì‚ì¡g«#¤d¥ÄÆÇæçé…e…i9i=´'OŸ,)/)¯*?wþÜó¶øngÃÕÇpÚ:Ûʕ롸¶¾öy[|·³áê~8yçØ‰ce•euuϬÇüpò~ íé³§_ÿÓëkƒ×®ß°~]ðºeŸ-‹ÝÛÖÑæ\ê½ Õ–g6êç/œŸ=wvM]ÍóÞU<84øWìyþ·çWnËy£ðpapHðЋ¼·0Œy<¡° jú½¯î{eöš±í”ËW-_´tQàÒÀ‹¤f§ê&f¼5ã“9Ÿ,\²páâ… /ˆOq7ø­wÞ*©|zëK?[º3rç°IÛ¾{ûüEóu¨%+–(Òž‹TÙwf½óöÌ·uCº‰­á[ƒ‚ƒü³@÷QhëÎÔm Û¸>d½ Sõ¨ê½Åw;®>†£ÇϬ¼¬•«WnظaóÖÍÕµÕÞ[|·³áê~8y-Ï’Ò’¶|¾eëö­á»ÂµÒóçÉwú3´þåC®Þnïj×s·EKÕŸ©×–ìüìÕkWGFGêºô̹3_Ä|±tùR휠Ï9­†Ó2Ó‚Ömß>ãÍñÉñºËœêÒ;O>¥·ÏºÎ~òé'¿ÿßëŠ Í º+u·.ÿlyJFÊÐEpeuåÆÍö…éµ]mÖ'÷ª UzªÒq¡C·¥ƒ¯ Zy ñ@K{‹s©®ÕÔÚ¤;ZgèÙÂ0#'´ï­iÞžés#¦/øâ•…±cZåS•ݽ[ËSMðÆàõ¡ë•¥wÞ}Çidqyñö]ÛƒÖiÏ7ß~ÓZE4|O¸Ú©^=`F^†ò¬ålAiAbZâÁÃ=i}¬xïOÞ¯ŠkAßñ¹÷ƒ“ù‘ì<ª#®î‡“ת)8$XÏf”I%C¥ðçÉwú3´¯½þššº)Tï°Ö”úÄÒztÂþ%Ë–h»fþÂù M º³´pTnõɧ«ÔÔ×ì‰Ú“˜š¨H«Êo½ý–³$ÕWŸô[·oÕ“A§ßƒu*¨³öÑ‚U£}ò ó=ï°öÑ2×ù £¢« ººž°¬X¹BñÞ¹;53ÕóÅdggmܱk‡s+„–í8¡µvÚìðéo ˜§EíÞ±í¾„}‹—/V‡†nÔM¼ñæsæÏQMÕÅ«W¤f§ºCûçgCë}@%öµ?½¸4p銥¡[Bóåy.RV·ìØ¢í»¢v-Z¶hGÄŽ•kVjA\XZ8AC¶-,-+­sð ‰z Ò3uï-¾ÛÙpõ1-H>ó©ZÞ9¸D Ýê½Åw;®î‡“Wk´Š3oŽçõç+~;ùN†öÍ·ÞÔó=§˜=w¶:ÚzþésC-%S3RNmÔÝ¡Ž® ^»;jw|rüŒ7gÔÔÕlß¹];¨|gßûà=mÑ'eph°jºfÝ­;=ïÌÐÐêsWŸµ=IÏNºÏºàuÎÛ mFvFgûûä³çÌ®­¯ÕÒYOy†î¬…ø¤«×®Ö“šNBËŒ~ž~6hÚÇ[>Üðé-j§yhR–¯\^PZàü1·8WëNÝ„šª§Rº'fOJVжäçÍz–EukégK#¢#†)wâ¾þòAZNZþ¡|­•Õ]ïæ)±k‚×|<ûãùóg¾7ìÿç”5IDAT3:.z‚†VϤÔ驹îÆS§¼·øngÃÕÇpô¶pñBg¡ZèqÕ{‹ïv6\Ý'ßt®)pqàñSǵ1.!nWÄ.?œ¼óë,œ5›¿¿tì¼üØóýäÌ÷WŒÏ?§;âDÝ ]©þÕ7Õ—¿1ã e51%QÑÕÚ?· ÷õ?½®-î{mI ÞÛ°­aC¿ÿª»@Õ–§NDÇFëÞinm^´*;/Û³ÏÐRfåféó[ÉWbõ„åäé“)é)™¹™:ÝŠó=Z%Voè¬ââãtþGŽÙóÅ_ü5`&ë8¡¹zÚ_Â> øxKÀ¼È±mvaö²Ï–}÷EaY¡VŸ«Ö® Ù2ô{´ž)()Pcb‹Ë‹µÀÕ’4.)Îû€É™ÉÁƒµ³ÂÚð~ðËm ˜»{ú§AcÿªãèýÑ‹—/^²b‰ó㬃YîïÑÎz6´jUdLä¼…ó–,_¢ÿ‡†…ªÍ™ù™Q±QCw+:R´3rçŠÕ+´Ï‚Å ÒóÒŸ¹¹ÍÛ6¯ Y§£)ðºåvÒþ Úã'o Ûä~( Ö“o=žzo9X|ÐYŒdgí–œ–¬Ç÷‘ì<ìÕÇ|´ŒÑ)é¡U‰[>ߢ‡2ï-н6Îw‹uçÎÁŸJr^¼ò«;{už|v~¶¢³c׎ݑ»õØîŸ“ï¾Ô}éšþëöShõ©SR^â¹yµ¢ªÂy»NZï­’ÙÔÚÔ9øBb]”“ŸS^U®E­³Z×WŸå¥¥E%EÎçuËÏüÌ™®{¸ü°ûKÐmgZÎ(“ʶó²)ÏèV†~µYeÍ+ÈÓaß­RUm•¶è#¡'žuG«â:¦ÓC¯Î0¿:NhßY9íÃЗß[÷Òû^žî“Ð*Bi9iÑqÑ1ñ19…9Îñ$ð~¥Ò¡ŠC‰é‰Ê­Ò¨5«¶äÎ÷~åðÁ’ƒ:TdldF~†÷Íiççhs‹r#¢#t¨Cå‡&hhõ—½ª¦JÏ¡õ@tÖuvØ-ª¬žšpgMYe™¬F²ó°W÷ÅèQNuz„ÔšaØ-C¨uçÎ!§#ÙÙ{‹?OÞùAXEA}u¾œëÓ“ojsçÌÕíR¤ü·¢ÛÑ~Ûömzòâ»ÏH†«qBûçÓ”Øw×¼4kíËo øt5¿ê -ÃŒí(®W¾¼¢ÿ_¾~y¢†V«Ûè}Ñ>}êÇ0c5Nhß^þïï­iæj÷|´ùeBKh™I9Z˪¬-íîŸjïnoíhõß—ŽfÊÎÓÐ.û÷Yë^ž¹ê%͇¡/Bh -3‰fè?™§µ¬ûÿ7®(±îPïr¡eߎÚÿoÖÚ—f­y:Ÿ¬|ƒÐZf2M[W›ÊêêviE«µ¬Þî|ÝLhÆ·£Ð&ç$¬ß±<8|…g¶ïÝTrŒÐZf’LGo‡B{ùúåsç´–mël»xí¢óª«ž+¬hÆÇ“U˜u í@BFBB&c;ññéùé¾þ1ÌhGËVUkÙžË=î7.]Ðÿµ¨Õÿý±¢Õquô?0…Z|hÌB{ïÞ½ÞÞÞÆÆÆ²²²ôôôÈÈÈÀÀÀw˜Â”BQYT•H…R¹T4GÚ¾¾¾«W¯¶¶¶?~¼°°0)))""B‡^À¦*ˆÊ¢â¨D*”Ê¥¢9êÐÞ¿ÿË/¿ÔrX­>zô¨VÇ:¨¾€)L)T•EÅQ‰T(•KEsÔ¡}ðàÁ;w.]ºär¹êëëu8¥[Ëä}LaJ¡‚¨,*ŽJ¤B©\*š£íÇïÝ»§J÷ööê@жÈeee˜Â”BQYT•H…R¹T4GÚGi!üÍ7ßèʵ–Æ­­­:n-S˜R¨ *‹Š£©P*—Šæ¨CûøñcõYWV¨µ(Ö±®^½ªtw0…)… ¢²¨8*‘ ¥r©hŽ:´Ož<ÑÕ”h]ÿÁƒ:P__ŸŽø S˜R¨ *‹Š£©P*—Šæ¨C Æ¡À‡->Dhð!B €Z|ˆÐàC„"´ø¡À‡->Dhð¡ÿüªbèù~ŸIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/settings-audio.png0000644042355400116100000006570411675570700021040 00000000000000‰PNG  IHDRÓ±‰5¦ IDATxœì½gpH–ï9/&öÃë˜xûac#vãEìöëžè™î™˜î™vÕÕ…)Óå-…·!^ o7 /ä½÷Þ;ä¯tå½CBIÈ!‡Uû»Êª[·ÊÐRWeÆ?nä=yòäI{þyí?|!“L2É$“L2Éô·Jÿ°ÑÈ$“L2É$“L?¢$™‡L2É$“L2Éô·K’yÈ$“L2É$“L»ôWÌãÑ£G†°8>>><<<00ÐÓÓÓ.“L2É$“L2ÉôU‚Àà °8Ìþ‹øÆÌÎBe¸ ¶úúú0ÝØØXSSsC&™d’I&™d’é«7€!À` p˜üñ™„æ‚ ¸Lss3v‹‹‹³²²e’I&™d’I&™¾Jp<¶g€9À`ߘy,,,ŒÃ_0TYY™ŸŸŸœœq]&™d’I&™d’é«7€!À` p˜üñ™ÇÜÜ´¥½½ƒ9HMpp°››Û™d’I&™d’I¦¯܆O€-À`ðXÄ7f³³³ÅÅÅpŒ¶÷´KHHHHHHHœ]Mæææ×®]ƒ'Àà 0ø,â3éééžžÈKVVVDDŒfÃ{(!!!!!!±y°g5:u òO€-À`ðXÄ7fwîÜioo¿qãFbbâõëׯ\¹²á=”ØÎž= O€-À`ðX„dß'$óøÛa˜Gc[cCkƒÄ&S³á+RBBBB⇿5óhjoòñô qurö‹ôö }®Œ[ ÓwÏx‡º}ûL„ׯf|Â<¾{Æ7ÜsÌõ0˜à–Ζ _”?`lóuõI´ºè¹Û.씙ߑ¿Îœ~,£*2ðÜõÝ3G¿uÆ6T÷{ÈxìüÖË@íïž±9±NæJÐ ßH/É<$$$$$^(6€yx„:úïÖvÙ¢í¼õ¸Ó«Ç_;îðúI›ÎZí¿`¡­o¦sÁâù“ÖwxCUêô*š*}‰‰«qz1×%óx¡Øæííuú˜Óm»¿\ºrÊÞÅꊋá×KÞ!.¡Qþ1!ÁQ¾žÁ¶ž†6.f¶N–†Ög´íß@_â…Â8`¿w˜ës2üâü˜ø˜œ‚œo´Úr s“Ò’Z»ZÕ™gV©¬­ŒŽˆOŽÏÌͬo©ÿF¶uµ%§'çåmøf“hßæq=ÂÝ2äØQ‡­Ç¯¼ët½ (?(8ÐÁÁÞÌÌÔÐÐÐÈÈÐÄÔäŠõo樂ÄòÊòàЀãWÞAÿ¨Ã‰«mßÏça5Êšƒ‡þ¯Ÿý¯»vVÕU=ÿjÓÖÑ~eË+Êf¥ÎI­Û¶’yf•ë×úÓŸþìg?ûùÏþË_þòå?¿ldbTV]öü6´6¼öúkº§u7|³IHHHH´oÌ»-!Η|vµÛzÖzŸ§‹‹‹‘‘‘±±±™™™………••µlV“³³s\\lxxèIóèkÙoYmÇíçÜÞ×qzíñ¢Çqêê[Ç^CY×åÍuÔŽ9l»àñ‘¾ç'g\ß9æð„¦‡ŽÓëë[ÞäpŽºý\ï¶$¦&þù•?¿ùÖ›/¿ürTl”Ö5ÖUÕVµw«ò­­5 - äÛºÛêšê*•(Õ>JEGrzrhd¨h‹GEƒ¢²¶²¶±å5m]÷¿þÏÿüÏî^î± ±!ÇOÿõo~íàìÀBukêk¨+^iíj…aGÔ%Cis{sXTXJFŠ¢‰>raAxˆ¦ððq$$$$$¾_lóðö¶ ;¥e³ÍÒñR@€¿‰‰ œÂÕ°··wtttrrrù*ùøø¤¦§۞ײÙ~Äö•50ÔR´y&šhÙmy¼t_ËŠýlÃtMý¹Å®)ÒÄy÷»o5U·€ÚŽâºDªhÙm}Üà‰eбÇ,?Of³Àðú>¯çx·¥¹£™ÀÿÛßþÖÛ׿aqÅ òËF—ßy÷Á K _úÓKnžnòìülñR‡Ö1­·ßy[0sÎ å–Ž–ˆ=ûölݺõБCIiIkb?Ìã¿øEV~Vû*E(­(ݽg÷GTVUÏÿdÇ'[·m½xù"¨äæø‰ã,³Æ¶Æ“§NjצÊû¾¯g ‡… EÅ%ÃKÛ¶oûè“®¹_SyÛÝž•—¥uT ©›™›)ɇ„„„Ä Å0Ÿwó€£ZW¶›Yzx¸›››[[[Ã9\]]Å?çzyyyzzz¯&??¿Ü¼\Gs­+¯¶yEGí¶‡ç\K,ñÏ­‰Óqü ’ËÞ{œ£ôD©cÄù‹^»ØlA’å˜nw£1Ó!âìeï½çë:¿í‘`[èígxÌþkãÜ?†shÙn;b»õ„ã_B3‹•)'œÞä©UÐñÈ<÷k±—N:¿eâwÈ.ì´–íÖÃ6[¨îwÙ2H[X>ïöQp¦c@ºÝ9×yªmÿU¨x%Xç˜Ýv$æZÉ¥±Þ&¾W-¼²`pìz„Ç3™G¥¢r×î]((-Ð=­ûáÇ–W—#?sîŒ`äóŠòþõ_ÿÕÑű¦¾æ¸Îñ_ÿú×ÇŽÛpÿ/ùK¡ÃS‘ILI|õµWßzû-ÝSº¯¼òʇ}X\V¬Ùœ&óh_å=–Ö–øÃò‹ó˪ËvîÚ¹ãӧΜúÓËBN©±™ñÖí[óŠór s·¿ºÝÔ´¾¹~Û¶m:'u`*ž>žÿù_ÿyDëÈÎÝ;¡ñÉñø`pÉ࿼qöüÙ×ßxý˜ö±Ú†Ú ß–?`lópv6ðØuÄjû;³`ñR‡››[HHHLLLxx¸¿¿?œƒÇ   èèè‚ÂK[Ó#V¯¶~E[ôÜ?M½b¤C· 9…Ä1â¡Xìo~öÌÕB³\¼Ìc |F' _è«mÿºW¢9òk1—Ѽ|Bmù¼ëÇÕ­G¬·Š§'Þªí(9åò®ç.ßä+.Qד¬ 5ÖÁ'i eÚ½¤Wxýz²–Û¿á›bí“d’éâ—b}Äf+]TôM¶6ó;¢e³­´!=:ßË?Õ6©$à¸Ã_þº_FæyÞmIJKú¯ÿú/3“âòb{'ûßüço`íÝOfЈ—ÿü2Ἤª,» †±†y˜[™ÿñ¥?†*êvŽvЂЈPÍæÖ0Øjÿñÿ±ˆIˆ¡.éµ×_ûÕ¯~õÉŽOX]qIqÛ¶o»ê~Õùšó–­[â“âZóhno¦ÝO>ý¤ðFáÊI©IÕÊê’Š’wÞ{ç7¿ù ´ƒGLiEé†oK ‰06€yøEzYé¶Ünëh•ŸŸ½pww÷ðð ,^ö /þ9·¸´ÀÂÆèˆå«‡¬^QfàiPäÜþ/®1—ã ®µyÕ1\Å<„Bb‘¿}èY‹m8:ç]?©ï,C‚N\¡ïi—÷s«ãO:¾£e³ýZô%ÿµåó×TÌãð•-â©–õ¶êÖÂSNïBS¢ó<=âL¼ÌÓËÂÏ^ý(¥4äZôeû¿$ù9Eè¹Ç ËYQ'ÞÂm»×ñ3&ß;(ÝÁ=Î$ Í Ì«‰O,¸xâ´óûê†6†^û½CŸñn ßØÔøçÿüó_üË/þíßÿí_þõ_~ö³Ÿš6w4Ã< ÔÒ²Ò(‚yÝ(‚˜š›¢ lRîÝ·w ó8¯wžZùÅùmÝmQqQÿþïÿ~=àºf‹k˜GCKƒžÜ˾¾¿üÕ/ß|ëÍ]{víÞ³SªVš•Ÿîütÿý{öíùàÃxªfmï½ÿÞá#‡5¿ƒùíï~ûÊ+¯ìܽ;G´ŽT(*6|[JHHHü€±ï¶„»›új2ßfëh©P(*++ÓÒÒbbb"""üüü|}} %………UUUÕÕÕh6ß~Ðâ5tìÞÌ«Nh讀ÜhÈlèªÐwÛåv6@é!Ë-IÅv!gl‚O'¶ÚzÌæµ‚Úd$è@SÎ8PT›¢e½ýå+ÎQ¹žjËg]>ªj)À‚xz䊊yè:¾ç] HŠË¿›=8Ýé¨õk.‘sªâlƒOgVD]pýÔ5ÚPXFZ¢:M—Ög¤–†Æª*ú C‹FÞÓn„(’½,´®üU¿6f×^Æ»-ŠÅ;ï½óæÛoZZ[ZÙXñøþ‡ï¿õö[•ŠÊK†—~ÿûßGÇEWÔT@5`'0ªºª‡|üÉÇÉéÉ‘±‘[¶nYÃ<œþð‡?Ø9ØA>Î럇¦Ä$Äh¶(˜GFNŽÕ5ÕEÄDluû©3§ð$.)î•-¯XXYä—ä;]uòñó¡fïhÿëßüš„{­­_¿æÑÑ|AÿÞ&¦&ÒŠ™¥YNAŽêS ¼Tûh^Qžo€¯ƒ³­lø¶”øc#Þm rºpmç³­gLÛ9Z»\u¾zÕùúuŸØØ˜”””ŒÌŒäääȨHO/O;;[;{[[ë³&‡šm=`þç¯ðŠ¡çÁâºtûÐó¶AglƒÏÈà ÃôÈ´ØzÂþÂÚÛà3&>Z‘ÙžÇlÞ8ëòI]Ç $TèØ½™ãyÂþÝÃVÛ½â-#²=ÔÆÏ8TÕ\pÐ| ùƒ[°PÛ^оG¬™CèùÖ۴®¼vÜöM|б{«´>3§*6<Ë ùµ(C,ÓtLž¶í›¨iÛüg"²Ü/ºïÅnQQ×á½+ºŠÖb,kôk#ar> êï¶DÅEÁììÕo$AaA^¾^¿ûÝï ï¼û?ýéOa{çkÎÿñÿ±uëÖ×ßxýWÿö«5ÌÂñÉŽOþø’ê“ßýþw:'t š-Â<0EÝ÷ÞËp¨CBJB[w[yMùÁCÿ‡ßSú§?ý ÚºTÍÌÍüÍoTÔºÓ¾ú­ZÁ<¨J+Û¶oÃCì¤g§×·Ô›˜™ü×oÿ #/ýé%CcCñ• ‰„y·ÅÒïä~Ó?ï1ü³Ö…!!Áqqqþnn× öövdÜÜ\}||ŒL.>óɧzÚgògª0{%4ãšsø%2Bbìu$.ß×.ø|yc®O‚5¥½C­6AgŽÛ¼åkîo—ï74Þ˜¼ë‡,¶;„ê¤8xÄš'YœV?íøQKoíµ(£«‘†> WJ”ÞñWYl»pugpš úa®A©N‡-_=`¶Å;Ϊ¥Waâ­EEô±|ÄòU÷hSß$Û°L7¯8+tÌ®Ã÷Ó˜\—|Þœæ–á†BYC¶¶õ›ê¦7Ýö{=ëÝ–€àÝÓºš¿ÊURQrúìiOOBøU·«Ú:Úô/„„‡8x€0Bµ² rTû¨£±©ñ©3§ÛííE6[˜kjaJE{›ŠšµïtÄ'ÇïÚ³Kõ~ÊÞ݇µc!» [üuñÄØÌ—||•M_þ:HmC­‘‰Ñe£Ë4-–ÜÙógñ|}s½¿mQŠeÑÙ E…ƒ³ÔÄ骓ø´¬„„„„Ä‹ÃF¼ÛæfìydŸÑËŸêýñЙýü}£££!<†‡‡‡……úûû»»»›™™\ÒÛòÃNýv¯áËûŒÿ,°ßäÛÀ³Ç¬þ¢–4Ýjtî„í».a—"³<]#B/žuü„"]»eÿáõxøÇqë·yzÈ|»}ÐùàTÇ}­US(xÆZ⧉×Ñ&_7½±0ñ<êöìï¶<'¾Çï¦bJ`Ãw‹„„„„ÄwÇ0·@§³ŽŸî1|yÇ…?~zòU}ó*¦áïsÝÇÃÃÃÕÕÕÁÁŠæ†F†§Îéì8öÚ‡§~·çòˉ»À Ï|·EBBBBBâ;b˜‡o„—¹÷‰Ý—^Þeð§uÿéñ×Ï蟰²¶´¶±²¼bannjd|Ùàâ…sNÓ=°ãèïjÿöS½—Зx¡ÐsÞçò¼ÿÛ"!!!!!ñí°ÌÃ;Ôí²ë‘]_ÞuñO;õ_úèôvœÜº_÷ýÝÇÞÝ©õö§GT çxçÈïÞ?ñÛO/¼„æª¾Ä „¡«Ö÷øn‹„„„„„ıÌÃ5Àé´íŽ#¦Ùo´ýñë‡Mÿ²ïÒ¶}·ïÕuÇ™—wœye×ù­Ÿžûó^ƒí^ßo¨ÒQ+—ÌAã×¾uæÀ$óê:§àËþ‘òÝ–õÐÜÑ\ßR¯lVJHHHH< œ“ÍíÍë|8o˜GtrdZID~Urt–ÏšLT–Ojñ—Í¢‚ê”ïžI) ûÖ™˜œëß=SX“ú­3‰Áß=—ë¿N&¥(üzØsýWí,Ý EEu]µ¢^!!!!!ñ4pNrZ6´>õ 6€y¤å¤}þùçÙùüþÔ­ÑlסÈóƒ©ö÷Æû‘KÊL’Ìã‰hëj«¬­lïn_^Yþü‹Ï%$$$$ž†ûî÷ô÷”×”‹_@ؼÌãÁÌÈ­€Cý–?í7û¿»ŒÿgŸçÎ{7¿· *Ós¤ÏIæñT°JÊKfïÎ>"}.!!!!±—K*JžP6 󘮌¼iõóa§ŸöZÿ¿Íÿgß•Ÿäù|oAU¦çH’y¬Ï<ŠÊ‹ææ% ‰õ±¼²\\QÜÜѼ©™ÇD–s¯áÿÕcù?;LÿŸJí²ûéhÊ•ï-¨Êôé3É<žÅ<ææ~öPBBBBb}Ü[¾W\¾é™ÇlmB¿å/šÎüïÕÚÿÔxöÿ°ûådyÄ:­>zôhvvö‰E>|××Oj;4ô¤¦<#QennŽ¡úƒž³Öýû÷Ÿ©¶²²²´´ôÙgŸÝ½{÷›:ö´$™Ç³™Çü܃‡¾؇÷ÜÿÖÕ_Vî¯p/Ù¨ê?°H¾ûÊg± ñçŸs£É6ßðß$øû`Ÿ-LÄ6Ùýá–Íÿ×jûŸCÑzç×k~jjÊÞÞþ±FŽeä333Ïãú:‰ .ì`0==}yyùU§V[[[XX˜»»»ŸŸ_~~>”ây*Ž;;;?“èTWW§¥¥¡ìääô['ý€™GS[SrzrPhPL|L¥¢²}õ¿]Ò³ÓŸÈ0SÿT”`wçïr¸|;MNM~ëêjÔ)ëîÎ=ÁÙ»³7Ên(jÐÏ4ÒÝÝ=2:2<2\QYñ­=¡z¢æ»÷´w´ãÏí±Ûìšçѯ­­_˜¢±ñ±'VaК[šñ §¦§Jo”"!Ï  õõ÷}/ÝùÞÑÚÚ:qgbxx¸³³óùkÑÍšššÅ¥ÅÇ‹šš›0ø¸n]YUYV^&ˆò÷‚òŠòñ‰ñïh¤³«³­]µ6úoö?Sÿ«kªy¬o¨g¢Ÿ§ fÿ‰–YQì¬ç±°°¸›—ûÌ¡ãhhløÖCAuVòÒ½%:(Vòs‚]ëÖ­ÇåÌÕO±ÌSΓï8eØÙÔÌöðÙjš›¼âÚg›àc5u{@ç"MNNZZZ¢@¦¹   €€€ÞÞ^Ž$:CðfËì+++£¢¢ššš¦¿¿?,<$>!V ó ¿ ˜QVOO~P__Ÿ™™éää„\__¿¡¡ZxRRRBȇ'_¼x‘à-úFœÆO˜Š««kvv6Ü"''^ ƒ‚°355eaaEà¶AÔE–@°‡.\ºt @Œ777‡d¨ÝËÍÍ---¥Å/V_ÿ¸{÷î"[ìÞ=ä(Ä"##›››¡„»‡A/_¾Ü××_9~ü8mAT!:Ð#jáþÓGMæ}ÍñHO¡&pšóçÏÓÁŽŽý‘3hÄÉS'3ó2aõÍõž>žqIqyÅy–Ö–?qÜÊÆJë˜ÖQí£ ) jæbcÓ²Ò4™Çìܬˆ@€=lddtæÌ/o/ÎO©™)Š ………QÑQ:'tŒKJKŠŠ‹^þóËÌuhX(jœì¦f¦Ae¨(ZdÌ” JNF/¯æÖfZAÂhpŒ Ï½–èÞÝÛÍF¦-—ìâ’bs s†‘8ÝÞÙ>z{nÇicbj’˜”Hsš’”´$Œ0F®¹^£Sp ¢>:/]ô¹îÃø…?w&ï0ûtñaýŒßÇmŒ(¥ï-­-Œ’%xœ=zÎ$t34Á 2Út8÷õ¬ÍL3G &ªUÖ²H®X_A&p‰æ(¯èé8CAkäöȮݻˆ†††Ô‚:¹8Q++'‹‘d<ííí¥¤ä$Áÿ@ßÍ>Æ\O_qHMKÅ=íìÖi¥°¸pÛ¶mû÷ïÇaÜËÌδ°´037khj #8FõK—/‘aÏ?çîî>qg‚ CÎø@5víÚõÞûï±àÓ3ÓUñÞ"›ŽøÂ 2S˜bñXÛXŸ;wŽõ@×ffg Ì›”µÍF}D‚'ìfJEOï-Aæè®ž×;©–¶G'G ¨S°r8K·lÙröÜYv–f‘ å´‹ìÜðôòüãÿȹÍбËX½˜e§°#hޱâ”`ãÛ9Øá¤zÖ0RY]‰&MP ? Qž²(eá1§¢:[IT§T­ÃL¥¥§!«TôKlvð©Ó§˜x3(Îv"Ëbÿr¤ôß쯮©fèÐgÀf`p5fDóÒšqÔÅ” \ª½\QδÒñ¯ûµ´¸I™ÇÔÔdQIa{{ÛÈÈ0AôÖ­Áܼl˜GJJÒàà;vhhˆ5WXT@øóàdW(=š˜˜V§ +Üfpƒà––FÀ¦ˆ“«§§çóÕDH!ÒC МõôôD] ró(숌xqB4ðòò‚Iøùù!|°š„ŽÚ=ˆ…R©|Ügš "6"ø ½æàÆ ü)++£–šL111¡-ò ””Zî„„„ܼyS“y`-,,,99™ž¢á@“ý†Ú7úxÊ•y°ô-®X›‡E…åç×Ô×ÐÇŒœŒ³çÏÂ3Þ|ëM+k«ÒŠR?Ÿ úóP4(¢ã£CÂCX®<(õ IDATÅ<îªB‹@\|ƒßÞÑN†“Ž“}Žœ}Ë1Äf>zì(÷†êêj¢ç §*g%—oq¿/-+åTbŠèNøß`?'icS#×5˜º­šÚšàà`ö³Ïvå° ]6_MsîpúpêÌùH8bzz{n”ÝÐÖÖ¼5ÈQKTP™Z¾§o Ou$1P"íÔôg(us€ZÄõÖ¶V"„ÁE4 ùâxœ€¢:¼êœ‰„@”Û:Ú("jR'ªÓqQ®©«ÓqG*ç,yóÍ7‘0€èÐB/gñÍ›D# $CKK‹qñ‰ñœ¶Nvb9t„»;£AOá7XæÖí`Rn ¨^|Zm‘™F" Žk‰mTg‚8@‰(¸J_„#GŽÀ<˜Ñ±Qn~Äo¢”“³BÔÞxã v=Íá!B÷† 1†î0ÑÝ=Ý™Y™ª¡üä“O8ñŽiáOWwƱL;}ú4ƒ“Í ŠR!ñŒH†M,é_ãu$BòÀ’èéëaØ™eõ¬1³ZGµFfIwXH*nØÐYZai1PX ×,ÑÖöV– Ã"ŠÁ‰Ž‰†:Õšš›|8}aqÂ![ÄÔæ–fNfu‹ô+#+ƒuˆo'Nœ`1`™ºêÐ:´Œ¶Ø;¬úÂ8P‹Ž°X~„@ºÆ°3þ¸‡Ÿt™¥Îb¦u*–˜ »àyb$ƒ@C˜ó óÌ8Á1ñð·³³cÑ:ÓAŒgºR毶*KEøõgâ@AAÁ|€e‡ÍB7Ñgg± Ù˜Ð/Â0ÊšELñ­¡[LnÐn`ö˜ö±‘Ñö{Nn7zM/˜ Ø‹\Y¯Ä1X£z ¨˜Ø<¹r0ÚSh‘Rf}'ªÓ„¨N¤ûRg~Ž^qì0,Eñb›Øì†F†Xf<©;19!Îvâ[o¿E† d…+ØÚL+k¦FQÃ2  0*jž š€2ÎÐüa+±/^ŠÕçQV45;5¿4ÏŽÓw§+ª*ÂÂÃ8Yêëûû9ljµÓù…ùs‹s„œôÌt.^>^(ëéëqŤ"jii(ÊFe{W;["Ž0ªuF4Â"ÂTqqA„8nup¿¿ºú:Œ4µ6aŸ(…Ê8ÃaÄñT|£øˆÖ”ÕE œB5ádáS·¢ œw¾êLÔ‡ p€j*ÏÎÏrƒG'G$¸ÁÙ:37Ã9èä┓—CuŠDuƒ‹šÊêê7*n®¨515afa†„HŒ×YØ!G-‡,ñÏåª ™žþž”ô R…óôæ­›D²Â’B†‹‘y ¹êzÕÕÝ•àä}ݳêîˆy¡"yÎ\ÎJøç,Jüà–É‘ÝÑÝÂIÝ“L%jTg„¯¹]c6±IêèÓ:ªÉ£¹ô¬t8mmm!¡Q$ÄK.ÕŠj楾©þÖÈ-ts4‡·«·ËÎÁ.$,zAieMeFVMP„Ä$´‹A† ‡ HjÞ›½ŒÃäÌ$6“ƒÕf‘`™¹&:†G†3ݬÖ ãÉZe Ôè‹îLßQ[ˆKˆcÖÈ0‘´ÎÒb/Ð#ŠŒhvº`yÅ2)5‰¹c+A²i‹HÑèøè1ícHm!q÷t犌Š @cwTÊu uHØDìtÄnjëlcãÐÖ0FÀá"¢"„‡dØ8(°Þ„ ZTL”½£=k­ÏqãtMe¹Q õdSbmlmšZšÔþÃï±CO––›[›MÌLjêjÄ B’àl”/‹Yíýbxi”®]¼|‘®Òl¬g 0/^dmà XÕе„y6¸£³cnA.f_eGG9#SVQÆt‹ê·'n‹êj0ÔÇÐä¾qêÔ)ú¢¶ŒPp77ú>26"Îv"ÕÅ<ª% 2ëíŠÍV—O_$O<Ä<²ŠØ >ûeÍÚ`ÛnF摞™ÚÓÛÓÖÜØÚPÛÖT ¼5(y$í«©­­­£³#5-ùy˜aØÇÇ'66–ð k!ºçååEDDÀ4™ÇââbpppÜjâHÈ'ZÎÓÒÒ¨KM;‚UÀ„(ÍÍ͵`ë0¬¥¦¦Âi233iûð„ …>”Mëp‘Ç™î9::ÒPgg§ºÂKYYYØ ššZó9”EO¡8ÕÕÕ’y¬YrpYyYMmMGÇð( æñÕçIÕ’ý÷+›•iYiF¦FŠz…&óàxâ, q9S8ؽœé”œÜ†F‡8ªUÝ}Ý%e%ìL‚·:Î,,$$'äæOŽ·u´qÚrRpoàì`·¯É¨Ûâà<ä`}ÿƒ÷‰‘jñ‰ñ÷‡¹ÍT×V§9~(s ' •qŸF™ÌÑ@øÙ¹k'8¿8qˆ O*ÒðU[ ¥‚`ÌVû¸6Ê7ÊoÿPÆmÎ)QÝÖÞIgO'Gvÿ@ÿÀÐ ‹ ©Îé&ª>rXT‡^hVoliäÎÔÛßKTؽ{7’¼‚<‚:„C¨ç,Ýù)Za1`¶NQ@ jp˜7'ÒWÕT!Ç%füY·´% ¢@ô…ªB@5w1ú\ ˜âÆæFh:– ½4ÄaxY™4Á<bŠ©\S‰‡ù‘កÈY?<k˜A#Ã`Í〗·Zdkp¨}``ç± îææØáÐ`Â\ášHDuAbT/—Z˜¡#¨‡ü8 ËX³wè·v´¶´·`>Š#‚ˆ¡ –ˆ&[–6oßöôòD¾fºóËú¤îK7#óHKO©SÖ)VÁ²ªªª²²~PVVFõ’’’âââ‚‚jeUeJj’&óXYYijjB£øÂªZk¡:ÄB@H&ßÜÜL©¦2ù‰‰ š£Ñ®®®þþ~„óóó¸¡T*ÅgE…ŠÄWc¾XýÆJii©ê}óó<…Ù#,¯ùѨœ‰¾´´´¨?| ã©««CˆYñY|Eøƒ.ÕÑÑAÇÇÆÆÔE¢T|”UÌŠønŽº:µÄÇia3tá…=ÿˆü°™G[w¬‚à¡g wÉè’»·{²"¢wQž¡uLK056 Å7ÀW“ypðÌ` ¡©ÁÎÞŽ#ãÔéSÜ‘°Ï‰²‘Q‘l]¶"ÁØÄÔ„“ˆpÈS¿@?@È­ÔÓÛ“£Ÿ —2Ç—',<ž ØÀ3¸œ]6ºüÑÇqá‚è`û(“‚ Ä eE‚‹šœ&ŸìøeŽ{ÝSºÇܳ HP&ÒCn .pŠqvˆºjpÈr݇jpÉã.‹2G˜ž¾”ˆ@"ÈÕ‰ÍT'8¥e¦ÁÀhËœÝTw¾ê,ªïÝ·WT?á¼fubÁ‰ÈGlÀ+ó(Ìãäe@ðNƒ5Œpp£ÉùndbÄ`à™…ózçi‚àDÇ[NÛ3gÏhJŠJŠ Î/'«¹§¾â)¡‘Nqß%[Â1âs„ea9Gª ?ÃH»îëT÷½wyÊÁM¸¢×*É»_Jè8œ/-+eü™_æþÄt3nx¨9¼ÄKüa|˜>ú‡Sãsg‰Ö¶Öø†„€Ä˜0ŒÑ ƒìá哚`| X ¬æ:ñ ð#Lž8y‚BØcq™ª£ð¸ú…Ÿ´%,¨^óX})ˆî³äè­nIu‘&g%–Áî=»ÅB¥u|`±1õHXŸ¬üàÐ`¢&Ó‡¾…•ꃢtDõAWe-vŒM53Dq:Îø0Œ°g$„U†bÊt„ÁaS³œˆ»˜‚Ñ.Kš þ³æé—Úrvn6eMÿ©AgÕ1È ;–YWnÿL˜tö {›pŽ5E¬ÌÔôTÜ@ˆešcúØ‚8:89à?ãMap>PËÐÈ5†5µô%,BõÒ)BúȘ`‡Zº§u©Î"^⢺›»›¨ŽR‚Þ~yžX˜©>ÍZ§¹Òè2£ Å2ë\ð œ k$]´‹ç0*––²Q¹fº¿8*‹Ê‹6óHMK&ð«éEnnnvvvfffzz:7ûääd,ÄÇÇÇÄÄDEE!LJNø?ç%Óó§*󼡢¦"¯(¯ðFa]S]ûê^ÊkÊ!%¥•¥â-•Ç%uuêzæÁ>¿3s‡è¢zAurŒ“Ã)yûÎí‰é ŽŽ ‚yÀÑPß\_SWÔ§÷Ü#9ÅÆ§Æ»úºØÞÍíÍ££‡FÆGψ†’á,s}ilmµúoõs4 ¼5z‹§=7{hBu_¹s»£§ûm]ªë ʘjhiÀ“öîv®ãHPÆ š--µ µ˜¢Šº9sš‡@à0Z;[Q¦¿xŽ©íK ÕéÕ1(:‹?˜Âª«^Z­N¢:1R³:­ ÝB¡±¥;HGCäÄOª3P˜Ruh@Ù¤ä^H†§˜¢uJiWŒ­hJ8»ñ‰è#Ct!Æix:<6Œ}\=eRnݳ&ì›Åëê ¬µcÚǘ$  HtNê a máç!Ó÷ž~ÀÌã{á.0n'lÎ'‚@Ë…& 8€Cçi:NäÔŒTw/w¢é·6BtÑ9¡ƒ)Mɩӧ4%›pnóñIñðƒ wf“æ¡úéĸ︰!œ™›‹yÀ!æççÚÚÚJJŠsórÒÒRãã㢢#Ã#ÂBÃBÂÂB#"¢c¢`!ÙÙ™EEJeÝììwýYR™ÖO’y<“yp“/!<î ± ±\›žX*±áàYP\Àõý[[à ˜•›µF’—½á]“x&JEbJ"Wü ÷dóæÁNá*õíLLNlFæñÅêÇ#îß¿¿¼¼¼´´´°°0777 ¿˜™áñîÝ»óóó‹‹‹”Š.¼`+“F’Ìã™Ìcdldhlhè¶„„„„Äz»3¶I™‡L›*Iæ±>ó(©(áŽ;02 !!!!±>G‹Ë‹ŸP$óéË$™Ç:hën«VVȇxÏEBBBBâ PÔ+*j+ÿ÷MÉ!Ó÷ž$óx&Ŀڲ†%$$$$žÎɧ½Ú±Y˜‡êg¯š³²³ÄOž?¤\YYY^MdÄ_ŸPýáÇÏS÷[,¯ãÜ_Mߨ “““ÏÔg¬„·/šœIæ!!!!!ñ7À¦`¥¥%§NŸ¼zÕ¹¼¢|jjêyÞ‹™™™¹pá‚©©©¹¹¹££caa!ü£­­-!!á™uiÑÃÃã›þ¡Z\\\GGÇÓœÉÊÊrssóôôÌÏÏÎ?¦Ç WWWõÏ›>-1¤>>>ðì?Sù»$É<ž Vo]S¢A!!!!!ñ4Ô5Ö5µ5©ÿ÷j32Õ?ˆ¿ÚÜÒäíã¨ú£Þ¥¥õ[œœ„sã———GFTÿ˜Üß߯T*ƒ‚‚(ÿl’››[WW7==-~S\T¤¨§§ÇÌ̬³³³¬¬ AÄïšS¡úÿl›››y:11ÁSõ¿´ yëÖ-õk»X/Iæ±>ó(*/š_˜g”$$$$$ÖÇòÊrqEñ¦þ Ó––æôŒ´™Ù©Á›¹yÙ…Eùåå{ë\â5ßmQ'Á<Ïð òSSSiiiÄø¼¼¼ØØX˜Joo/‘ÞØØ¸¾¾ûýýý(  b&AŒG/¡ ñÿ¢¢¢¾¾¾ÍOT ÂfàV¿YSRR‚yèj4A‹jžñ…ó°°°¸{÷®`¢Ö³¸¸HiNNFÖ0ììlñ^ø6 U`Oûèë7JŸIæñ,æ1·0÷ð³‡ëãÞò½âòÍÍ<à Iqå7Ò3R›[šæççŸùÆÁ:̃êÞÞÞЈââb===(E7oÞD9A˜­¯¯ïêêÚØØ)Á<#%%¥¦¦ÆÞÞÞÀÀ‰B¡ÀByyyBBÂÊÊŠøœuÓÓÓ ÿê9­‰ŠŠª­­¥Q—ááaü‡äææ¶¶¶&%%%''kÒ A& ÌXñT]DCeee¥¥¥ (þ¬atšššh433ò!™Çw‡ª×ÝÏfwçï>xø@BBBBb}ü0žÞn_?ï¢ânüžï÷0Àkì B°ÐÝÝ “ˆŒŒ,**BBÑÒÒTƒ N)µ`‰ÔÔTñáÐÑÑQ„œ‡(|±ú¥B;FúûûÅ{CCC¢D}(‚ºÝ{÷îAh‘^÷õõ‰. @999˜BH[ËËËÑbVV–x{êêêÔE_¬~ûí€pehŠÐ!ƒ~pp0ÞŠ/Ý@`'Ï3hë§Á<Ûã“ã}ü|B"BnTÞøŽÖZ;[£ã£!‰©‰ŠÅ÷ègxTxM}Íó0ûîkbaq¡ªºªÿfÿ:’Ûc·ëêÕOÛÚÛRÓRsórÇÆÇž&‘ø»ÆÒ½¥ÍÎ<nß}NÎñ-Í À ¾—ýCMß;ó Z{úxZÛYûøB>llYˆí«/0Ô7×+›”­mÝm ¡¥¡¡µ¡qG3ye³Rüþy¸ OY6ª§­ @"˜Êä©U×T§þ™^•ñ–zž¢¬ùmrµ2¦«Ì6)±Œ>E'tO¤g§ #(¨[\Ë<æî®¬uXÿ¢~Ñ¢¢²¢#G¢ìâê¢IŸ¢ˆ˜4j5139yú¤óUçešy˜˜›äçûú»pîìù³ûöïC¢¨Wq‘ˆszç®Ø^ÑÖÑFGí Ê— /\6@ŽÙcÇiÓÂ«ÈØÈ—þôÒŽ;hjâîíŽÍkîתj«Ö0Ù¹ÙåûËË+_âÖð-ookkëÔ´Ô§IââýüýŒMŒÅÓ¢BèÅôìôÉ;®n®ƒCƒYÙYk$jû› ܯÒ3ÓÍ,Ì”õJè’ùÅù’ÒS“EZmqéGÏ<¾Xý]/ù7uë§ñš‡£äÀÃÇ#-;­º®º­»­Qö—U IDAT¶¡özÀõ‚’‚â²â‹—/^÷¿žW”÷îûï&¦&z^÷|÷½w’B#BOž: ÏxûÝ·LJ+J½|½Ü<ÝÔÌâ’•Ÿåêáúñ'§d¤TÔTÀ]²ó³3r2,®XÀu|ü|¶mÛ†ŽÚ”¡%%Ê&elBlLB Ä~sðÐAÌêžÖÍ)ÌÁa¸QL| ®¦d¦‡«ÿzàKæqw–]'W ).- …g$§'«?£*˜Çäôäìü,èî붺beaiaae±wß^:Š:ÅÉÍ[7…rMm‘±‘È•…„‡Ü¾ÕÖÑ;éìÏÍÏ]#š›eƒÚñ„Ò¹ÙÍË<–†‡[ÍÍ«öí«Ú»$ë\¸àœ®w5\öÈɯî}øÙ‹ú‹LkÒ‹xÍ#;?ÛÒÚòÜ…sú—ôݽÜUÿaØTçtÕ òðÈÑ#>~>%äQ^“g¼ÿáûdÎ럇v°ˆ‘;~ ¢ g —S˜ãéãIuÑPäè«wQÏÐÄðÃ?Ì.ÈV{¢©Ÿ¯Q_÷´îÅËwïÙM-¯ë^:'u "Ð{'{áp|Rüæ11515;µaaI)IëH`00‘ïè÷ôö465613sŒOŽ÷ô÷¬‘<Þ„„„„ÄߦïN•mRæÑãí­xé¥ömÛ@ë¶m‘ìÓ÷ÈwInŽñMÇlSgæžëçeúîéE0ÕGJkË«Ë+ð!$S^S^Y[ ©o©W½9R¯¯‘hfPÛ`ÿÊ5ðQfÀ#Å·gÕÿ…($µ µyÅy%å%0ž ú oª=ÑTF;x…oUuª/°ˆÿ¡¿B[U×U«?^ªfЂ;3w&¦'4182xkôÖ:’щѾ>‘Ÿ¿9t³½»½³§sd|ä‰ ‰¿wLÍLm^æÑfkÛðÊ+ÿôOõÿøµÿø×ÿù7&¾Å>9½Æ‘-.i]{L&g×i{||œ¶rss»ººžö/ÏÙ“yÚl¿a*Þ[Q6+Ÿ¿JFN†‘©‘µµ¹¥¹›§Û7ª»>ó»366)!!!!ñ Ü™¾Ã™¹‰™Ç–- ?ùIýûoÊÿþß+Îh—†T¥¹„tæqgæ©Ìcpp0<<<++«°°ÐÇÇGü=r(ÈÂjOÑillübõ‹µ‹‹‹óóó‚£<|øðÞ½{H–——=z„þÜÜœæ/“þØÒfc{˜„æ Ï«¼ ¤ .1.-+Mý2É÷ÈíÕŽMÁ<ƺ܇•/ÍônY5êI=xGá=©ð¼Ûà;×<«ôž(·½}ÃaèÆÕ'6 «ÈÊÊòòòruu…R|±úÉS„×®]óð𨩩yøð!줵µ•Luu5BhGNNÎââ" '…)hJ@@Þ^½z*óí£÷ßs’ÌCBBBBâo€ fËó=ƒuº]Åo Ô®v¸™¥7­ô©õ˜©u›©v™®õ¸•g4Õ‘ñ´¶WVVfff¦§§!j›ä§¦¦Ã6x É_£½ÿþôj_åéÒÒ’¨òèÑ£ùùyœŸ››ûÑþ²»dÏDS[SmcmM}„„„„ÄÓ hP4¶5ªzÓ1Õôè‹Ï?ûâóGÞoˆ¼™}±?ýLÚéþ´Sý©º£U>ŸÝ_ïÇÄdú¾’dëCüô*䣣»CBBBBâihio©PT¨~˱{ó2¯ÓçŸÝ_ºÓ9ÛW2ÓS0ÓS87XõÙòÜ÷TezŽ$™Ç:hëj«¨©è½Ù{ÿÁýÏ¿ø\BBBBâixððÁàð`yuykç“ rs1™60Iæ±Z»Z‹Ë‹ïÎÝ}$“L2É$Ó³ÒÒ½¥’Š’Mú{2mž$™ÇúÌ£¨¼h~ažQ’XË+ËÅÅÍ›ó7LeÚ<é3É<žÅ<ææ~öPBBBBb}Ü[¾W\.™‡LÏJ’y<“yÜ¿ûàáƒ'båþÊÂâÂÓJ%$$$~TXZ^ú;`=ºwïÞÒÒ’$%•6!óP6)#b"\\]BÂC*j*Ô(k¼ˆ¶*•ëXV3ûî?CÃCO+•øQaéÞ¦g CCC“““wïÞžžpΣü*ÏoÿóÕôBÙð´Ù˜´ÃÞÉÞùš3´Ã骓±©qM}M^QÞé³§)ªPTðB€fc[cU]’ÚÆÚ¶®¶ÖÎVñ…rÈŠÐQKÊkÊÕµè©øê¹Ø9gÏŸm_ýö,1¨¹g¾dswW¬¬ÜWF?6>6<:<9=IþFÙ ƒ‹Ã#Ë÷—Ç&ÆÆ'ÆT¯…,-LÜ™˜˜œ¸3ygùþ2ôåöØíÉ)U-aj~aýѱQ2(¡„„„ÄæDgWgSsZ±VW_784¨–pnjæñðáþ¾¾ùùù@8x\\\äéÒÒ’ø°§¥•••þþþæææÞÞ^ª|±úg.êryžÔÝÝ Ñy͉‰ Úz~Ëi³1A8êëˆúð/_¯¬¼,˜Ç'Ÿ~bco£­£}üÄñìü솖wowèÈ‘£GÎ]8‡Baiáž½{ .Ñ:"tÔ’ÃZ‡…›iYi†Æ† .1Že)˜Ý·u°Ýw`ß Ý!‚£¨™ÇìÜìòʲïü…ól'g§ŽÎ}}ýmÛ¶]¼xqðÖ ²^igoçàèPV^6·0×ÒÚ¢««ëâââà?=3•eieéåíÕÖÞÆæœš™ÊÍϵw°¿|ùrfVæÜüœº ‰Í†{+÷8ÄŒŒ**+¸\!áÔÊÎÉæ,­­«U«ÁK65󘛛ƒyÀ?>ÿ*=Zý_7×y™áþýûEEE¡¡¡QQQâÑëë냃ƒ¿xì%Š'>%Q½±±Q]´NsÑÑÑBA]ýyFçï(m6æayÅ2)-Iý+x"±xçÝwâ’âêšêÌ­Ì=}<¡&P„â²âÒŠÒ ú|ü}Ðyý×C#Bkk…Î×’†/%5ÊßߢE¥•¥AaA(æÑÐÚ°{ïîØ„Øüâüà°àµÌãî,»îÞ² ±±±¶¶¶ý7ûóòóºzº`&&& K £·G“’“zûz)ÊÈÊèîénhlØ»w/ücâÎDk[kfvæðÈpk{krr2’’%‘Q‘#£#Í­ÍÎ.ÎCÃC¾„„„ÄæÄÌìLL\̥˗8¾To4gf\4ÈÎ͆ˆ|©³rÃp“2åååEuBb\\|LJZRjZòã((Ì㸼ÕÙÙYGGÇ[·nÁQîÞ½700 T*mllhšÇäÐäááá×®]«ªªzðàAww7Eð//¯ýû÷Óí°°0xLaa¡‡‡Gqq1^¡SPP ÊÈÈhhh0008|ø0×Ö‘‘‘   kkkˆÈäääw÷›(m6æqÙørZVšú)Žþ¡'O«ÙÕÃÕÃÛFRVUhqÅâ½÷ßC‚޶Žv}K½ZçqIAIÁ§;?=xøàa­Ã{ö퉈ŽP¿æáèâ¸ÿà~k;ë²ê2uë*æQV4=;­z3e…3gϘš™ÂÖØØÃ§­‡’¦ ‡:dÐ!P¿²†y SQQ!$ýýýt ãP™ýØ¿qÚlÌ#·0J‘˜šX¡¨‹ ;wá\IEÉ㢤¼ä̹3ù%ùP‡Ow}úœÌ£º®ÚÍÓ&*j*à7XÌ£µ³54"^’œž¼{ïîÆ¶FMæ͇"@@SKSnAnWo—…•Ebrbm}íe£ËƒÃƒ}}!á!-=ý=Y(ÔÔÖ‰Zu uQ1Q¡Àv¥ò èèwtwM ‰Mމ©‰ÖöVhÇãE³s³›‘yûµŠÆÆ†ÂùÍÕÔ¿šòóó•ÊŠööê¶¶òêêŠ„Äø±±±5­bAü íäädSS“››[__Œ!00P(À3` К˜˜ñc®¾¾¾h>Î*È ÓÜܬ6®Ö¡–&ó€ÁÀfRRR`<ÿ–A~S¦ÍÆ<öqIq¦æ¦§Îœ2³0‹MŒmën+,-42ùÿÛ;Ó˜8¯{«ýÔOm?t•ÚFé­*Ý+µQ“æJM?TªÒJi㨷R[¥qoo’6‹ñÛñ‚±1`ÇK‚±c³Œ ج ÛÀìû¾ïûÂ0Ç̀1nîÞ@1ಠ‹¡™3ç=ïû}2Àp„™PXRXRVb°>(øà­oQ7¼ùö›4²|ÎòZœÚâÀ»2vgÐájƒšÃãЧn ”yåo¯¼áý…_:À”ý5£¿cŒv—ýüç3vfìÝ·×h6RaÐV÷íßçt;ERQÖñ¬ƒï,-+ F‚½&÷T.sT¼?^[_Krøèá–ÖºKÄfG:zì(3²p !ܤ  d‚ WwÅbÊŽx<Fc±ØÂ j‡ãóùÜn7‡ÓIåAM²ä¬£££7nÜH$”t»ªªÊãñP1”——3˜òèíí¥¥hÂÈÈÈÅ‹©—MÖjµ333R©Ôh4NLLÐè#S0”5´~ff&­£T*iAæçn"‘H*•¢3ÖÖÖ~æËýb£•s½×™u*½JoÖ3_v¡³¿ÿpîQ“Ýļ&AiŽÆ ¡Ét{ùœ¢gª1jè@“íã»Ìú«B!¢Ô*^ðX(Ä`b`h ¨ŸL$¡hˆ‚Ãòõ öÑCHÀíwÇâT4è x"±ͤ»Áž sG½¯/è£æ`Fzâ=4yv¤?¶0 B7¯ÉÛÉX}‰>.¯‹rA Ð|‘H$ ™\.·¦¦†j c«Q«ÕPa,>ÝÕh4Tô‘¦-ül Ae`6›§¦¦d2 RIÔ××S1М[·n1sx<^~~~kkkCCCii)EÉàà`8ÎÍͽ|ù2-N.´5ÐÙ³g©u‚Á ®°°žåÈçqÅß(lÀòØ82åA A‘1ÛBbß@ýOý›¹ÑÊã¾ÃéP*åN§“ÃáX,Ç.|]&‘H, RßP: 3w©3˜9t›Æ•P<§Í$“IºMY …hWô‘*„¦Ý½{—šƒ&Ð :œNJ{£¬ùl×úÊã‘åKÄz½B?ÙÄ`bÕÇýû÷¹ün›Í¦Õj)2x‹èšƒr„ËåÒCííí4XSwktlô‹¹à‚Ay<²<¢}ÑžxO$Bø Æâ±<4u[{k »©¹…ÕÔL6²šÈ²‘EÖ74’uŒœ®Îå¯y€Ï”Ç'—‡H.ò…|¡Þ„ÂO6ÐÉD» ¬Û÷yŒŒŒ¸=n‡ÃþHNÇàààûÖ Êã´{ì̯}ñ¼=±žh< !„p¹ô/¤?äWhJ½ráM¨7Jy0ßN±J¶Þ[•o@PŸ,óæDr_ʇBø0…2!eÇþԲžåñÅ\=Á§åñH©ßm.ýA!|˜ôïäÃ^í@y€@y@!Lƒë\ƒƒ*V*WÌ)—+”áHßÒ±. < „¦Áu.Ææ–×ß8òVÆé7wœ~3ãÔ›¹gÎ_é‰F§ç™™™ùü¯±`%PBÓà:—GÕÍšCGŠOd·ËjÎ<Ö”“Ë>’yyÇî}{ö’;÷¬\ñK3÷ïßO$ñyR©óJ ó®_kºâŽŽŽÒR«™¶Ö•7(!„ipýË#;çbQQý¥K5.Ü,.®/)­»~£êÚ…EEGŸXñ‹/CCCo¿ývnnn^^^vvöÙ³g}>-«P("‘Èš®¸f³¹¡¡á‘ÓÄbñZWÞ\ < „¦Áu.º††½ïì=rôðá#‡–HƒG3ìÞ»Çn·-?ëàà %SSS<âcllL£ÑD£ÑžžžŽŽŽÖÖV©TJsl6Û­[·d2ÙøøøGs¯—ètº›7oÆT*uúôé;vPèУñxœŽª¬¬¤gAÓh‡C#4r¹œV¦ÃiJ¥³³3™L~4÷*K[[=ÙîînæýÚ7)(!„ipË£¹¥¹¾¡N§Ój—©›³…ÝÂnmY~ÖÅåñÑ\|dee 1¿¢V¯×ïܹ“ZÁçóõõõñù|Š ±XLÁqïÞ=—ËÕÞÞ®T*)>(#Ølv~~¾×ëíï阮ÐjµÔ(Ì/Â¥uöîÝKëÒÒRZydd„Ö¡9Ô"”5”´r^^Í¡Õhü³]ý×”„Â4¸ÎåÑÂn–+ätï[ ×h5Í-MËϺ¤¨ªªêîîæp8………Ô ,‹&ÌÌÌLOOÓº]]]M‹ÐÎëêêîÎA#‡ºrå ­C2åAƒ%%%´-X\\ é(zš\.7/ù…º› ”„Â4¸þå!“I™¯Dçé'‹©TʦfÖò³.)º±¤<®^½Ê<ÔÔÔtùòeÚåÂÔÔU…Ùl^Xj¡<¬Vk}}ýý9¨3, =DÕÂLcÊÃ`0äææ2«±Ùìd2I …BÊjе]í7(!„ip˃ÝÚÂð=‹ðÎá›Ãï÷‹Å"ª“åg]\ô‘&;v,•J-”Gyy93S¡PètºéééÉÉÉÑÑQ:5ŸÏ§ª ‘‘‘‘{÷îQLPyÐ"Ô ”&4mbbâÒ¥K" QòÑ|yЉ:;;ïܹÃμprûömJëׯSŽ|ê ÿºƒò€B˜×½<Øíím†Eç0ÍÓÖÞ& —Ÿ•ÊcÏž=\.—Çãµ¶¶ž9sF(RF,/ÚRss3‡Ã©­­mkk›ššŠD"l6›ùNÒD"A¹“ŸŸOKQ@ÐjíííôPEEó}KÊcllŒê„Ö¡5kjj(8h5šLwÏŸ?O‹|ú+ÿzƒò€B˜×½;(!„ipËCoЗ\-¾ZVº¢¥e%Ô"ÓÓÓŸÿe,å!„0 âwÕ‚Ay@!LƒëPmÉ¡äPjn(’õ-õ(!„_¨é.º°5´54´Â(«esÛÖý?J!„[Øt—„BgQB!LŸ(!„¦O”„BÓ'ÊB!„éå!„Âô‰ò€BaúDy@!ܲÚ=öÍåVz:{(!„[Pºò,z¡LÀtn¹¢n¥Nau®ð^Ò§EmPËÔ2©Jº)¤­jÚßå!„p JÙÑÁk)z‹Ö`Õm UE;·Uª–Úݼ`@-"×ÈVc(ŠD#›Â`8Hå¡Ô+m®¥oò€B¸Õ´{ìB™@¢¢žžD0ºIŒôùískW‹ÅaYütô½Î¤»ÿ¯ûÿÚ$ÐVS#)…Va´—|vPB·šTA§Þ¢éIBqï&²7fµÕ›ì¦ÅOGkÒZì–û`æAן™™•NEٴ䳃ò€B¸Õœ/m¤ÏŒy>µžˆ‹-U©êÎ­àœ¼Æ9SÙeñÙ?Ë‚´·?ÒØº´<4FÅa™yw'&œ55¯¾Ú¾}û¬¯¼ÂËȈkµ÷¦§vHÚ@y@!|,\xÍ#÷ù{]k6êríV¿Íâ³²„uòYÚ–~߇µÝüi\^w4~XyÜ›¹7M5ñ “ããΛÕÂmÛ¯½yãð?ÿ~ýuÛÿ(üË_fÓôôÝ凤MÚ0ÊBác!S:‹&÷ú¢ÎµjñY¯µ «»Ä:—ù Kx¾F~¼Bvâ†jWA§ÊfbæØ|¦æŽ†ÒëE5¬*…^ìíqРHÁ•iEÌOÄ.VñzÉšNÝ“­\v ]ËïNß]ìäqW]èŃ۷û~ýk×3ÏÌú쳡ßýÎþâï¯ü5n2-L¾3qÇh2¶µ· „‚ÞXï’¥>‹2¹,5œZ>NFy@!|,ü¸<Ìê`¯‡š`õR.h¦¢fñÑ’îó7»;ª³UÝYeÂw …§ªU‡ »THLFË gIDAT6#M³yïÏÛÿW>¨¬¹V\~E(ïöFì— óË+Kf× Û:y좲•zÉš6ÐÓ|Xyе|êîÔ"'­U•¢mÛBÛ·û_~Ùsê”ó…œ?ÿ¹÷õ×C99¡?üÁú ¼?ÿ9nµÐäñ‰q6›]XTXSWs­âÚ{ï½×ÓÛCãw&ïܾJR:LLNLNMÒÝáÑaJ Ñ£4gbj‚¥qæîäÝÉ‘±ztt|”n“{öî †ƒîmVÚ0ÊBácáBy¢.Š€Uê X:M~­0¿QWÞåÈ»!É©d—ór+„WXj™%|¡Vª²hfmSõϪ R‡ßä X8üÖ.ž3ØÕ¯ä—ß(q-Ý¢öâ²Ë”«?;é Û#ñÀŠåa¶›§¦§¨ ¤ è|õUÿk¯ù~õ+×ox%oe¥ïàÁ¸JçpÜ/½äûÍoDÏ=go¨§É£á⥋ÁPptlt 9P[WËãó(G"Á‰ì»vï:šyT«×&;wíÌ¿¿k×®={ö(T ª ‡Óqæì™œÜ…rönÿ`UuÕ±¬cuõuñDœ¶Aåï‘6¬Ô)QB·¾LyhM*Ó¶®FgÐÒ ”åU NÕ>ls—s}µ‹Âß­ Ê-aï +œ¸P#QZõîõDî±^‹+daŽ595‡2Ê4‚‚+”V¶v±²óމ•<š¹Ê³/Žù[ëV.¹—þíäöí¯„ÿñçÓO;Ÿ}Ö“™±X‘HŸLæÙ¾Ýü³Ÿ9~ùKÉ/~a­¹E“Y¬&ÖØøØÜãwÆÉ‘Ñ‘æ–f£É ‡ ‹ Ï?ë‹m{iÛµŠktƒ9uúTòv²¸¸˜æ]Ý]t_À—H%±xŒB„ÓÅ»3FØÛœ´a”„ÂÇÂùòPz#vgм­>SÞõÎÃeÒ÷§çš-ö«Ž[g›ÂíöÜÑ‚Z±Êª£ÉïÙ߯mrḺf·v÷¾ ¡¢ûÂåóY'^*ÊÏ;“ÝÐZc÷WyöC½¾•ËÃf¦kùøÄø¿½3ÖöÊ|y<óŒoçÎ>—ëvÿ LæÜ¶ÍðÔS–§Ÿÿä'–[Õ4¹²ª²©¹‰Êƒ9vt|”¤ýƒý™¤¬¼lGÆŽìììh,úÚk¯ÃAzˆÂ"'7‡äðáÃ4má¼y§ò2vfì?°ß¾}™Ç2‡G‡wïÙí øØÛœ´a¥å!„ð1)IéYí~Ãj´ù Ýjù¹›Üã7”9µ¶Ó öü&ka«õz—­^ä Sq_çÔÑäsN•hñê˜c%þᬃô1ÿÃs{ì’hx]¢¶œ÷NˆT\Ûêξ` êY±ù¤©ºŠf²ÛØ7oÝLÞNÒmjƒÉ ÕkénÉÕ’ó×+²OfG¢‘·Þz‹™&“ËN朤¡¼ òX8) rù\«Ýj³Û(8hµ]»wy¼ž%{#)>PB ™òP΀ÉêÕ­R³G+1* ›xÇ+¤gê Ye¼sÕÜü^A¯%¨ìuršC3;xMY9G[»Y:›\iݨ¹ZTvIk“¿éLaÙE‹Wkñh¯U—œÍ?EV¿ÒßãjX©<ŒV#]ËS#©oßî|㟖çŸ÷ýô§ÎçŸØ~û[ýOø22"çÎ)ŸxÂðïp¾ÿ}ãÍjšìp9Ξ;+‹Â=aNs4ó¨T&õÅöد֪éQÊ‹¬ãYÁpðÍ·ÞHÐ!©„Z$žˆ_-»J‘A©!–ˆ‡RC¬Æ®î®x_œÚE®ÓÈÎ];nçâ½1ŽŽ*´ ”„­ïÇåaÛü“[½znµÂ"/oãîÊo>YÖÔ¥4"‘N,5JÕ6…Ñ5?Í©ªk®Ê>•µ÷ÀÎ#Ç^¹Z Õñiü•s%—™9*³øÜ…S•µåkÚ€/âl`¯\©ÑÔ`jp±n¿ûþ`{î9ç~ ÿÖ·_þ²ìK_’~å+²o|CÿíoËøÃÎ?ÿ)d1ÎN¾=( Ξ?{äè‘ìœì›57ãýñ¾¾ëU×ß=ôî¡Ã‡öÜŸ“—ãùwïÙMãtˆD&9uúT²_,ŸÈ>A]Âng ¸¼®‹—.ήs2›Ö¤‘w¼ãp;–ìFy@!|,dÊC¥—Y¼Z½S±z56©Ü àÊ;‹êê?¼y‹ÍcuŠZ¸²6‘ºKnjl2š#Prn5ݨn¬¸ZYHÍQtíÒõšRauÔÊô|¥I´°šÂ$¢£Ö´OØÞÀ®]^«!9œL$8wKEœ—¶™þûYÛ÷¾§ÿú×µ_ûšú«_5|÷»Òýçï X ‰Á¾`O+à6·6×Ö×667r¸¾ˆï x"±ˆÃã ©9|!_| îñ{˜Å£}Q¡½‰^§×éò¹èÝíìó‡ý6—fR¾Ð­ë-Ý[2q{ä¶\#Gy@!Üú2å¡ÔKMnµÖ.[µR¥Y$ÕóøÊŽasKw»»¾Ïê’°ªNWYÄ4íVÓõ=û3–›}ú˜Ê"ZËéVд®\ÃÀЕÁc‰^—ÓþâïÿõŸ¢ÿXø£ ž|²óÉ'9ÿ÷¿~«‘‚€æ-ÆãÙÇ3³2{,ë˜L)[¾àçh2•Dy@!|,dÊC¡“œJµU¼&©”f¡ÜÈ—éyT2OnЯu©O¡3`Y±<ôf}bpöuˆŒ÷ØÅEùUùÕbFÕk^³>_ir¥T’«QB©<º…©Z¨µIfÁf‘úÆâÖ/ÿÙ­I«5jéZî o"{½2•Ì`5,ùì < „n9=™JÚÎkUÅ&·ÆìÑn õ%_ÖÕÁk·8-‹ŸŽÑf”©e³ßiÑ×ëm±h-½`j*êªj*ꪈ5—ÇÈÈH4u8/\.·±±‘¥¢É˜‡Ú€ :jšÊú*bÍå166–H$ü~¿ÅbQ(´µLUUUÀ<ÔTÔ T Ô TÔTk.‰‰‰¡¡!ʯ×K QÅ…ÂŽŽŽF€y¨ ¨¨¨¨¨¨¨"Ö\SSS###´õ‹Ãá0™L´®`j*êªj*ꪈ5—Çôô4 Lå’H$h­P(D-㘇ڀ :jšÊú*bÍåqÿþ}:Œš…Ž£…R©­80µuÕ5•õUÄšËà å€ôò@ú@y } <>PH(¤”ÒÊéå€ôò@ú@y }ü?\‰O6ÑyÚ¨IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/page-pattern-view.png0000644042355400116100000013405511675570700021434 00000000000000‰PNG  IHDRxâôà&Õ IDATxœì½X[W¶6,¾r/²5wjnfîôLK2s'ÅÉ$`'Ƹa,ŒeDZ±1 º©¦÷Žè½÷^DGôÞ{uo¸`Üâd&Ïýÿï=l£!`0`ç,¿ÏÖ>ûì½öZë¬w/ dÆÿO -´ÐB -´HL­-´ÐB -´¼ÊB--´ÐB -´HPh¢¥…Zh¡… Ê7ˆöþçþñ|õÕWOŸ>}üøñǧ§§§¦¦îÐB -´ÐBËwX@… DÐ"È ¢]‚4WL´¸ ÷c"Ì899yíÚµK—. ÒB -´ÐBËwX@… DÐ"È ¢]‚4WL´ hÜ êÆ\˜º»»»¥¥¥–Zh¡…Z¾Ã*!‚AŽ H%褹b¢?ƒ¨1¨»··óŠD"¡P˜C -´ÐB -ßa‚A‹ GP$ˆt Ò\1Ñ>~üE1è566–——óùüäääpZh¡…Zhù ¨„Z9‚"A” K抉…0X¥1HÓÃãââœi¡…Zh¡å;, B"häŠQ‚.Aš+&ÚéééK—.uww£@ucÒwi¡…Zh¡å;,†3booïççZ9‚"A” K抉vjjjll \- Q&ƒÀ7zƒ´ÐB -´Ð²‘òùŒèéékA‹ GP$ˆt Ò\1ÑÞ¹såpmm-ªãððp˽ÁçÈ{ï½·Ñ*ÐB -´Ðò]‘]3®E] Z9‚"A” Kæ«I´ïÎpíßþö7šqi¡…Zh‘´¬7Ñ‚ÛöìÙãççç?+Û¶mSUUe³Ù¸tæÌ1ÿ­ˆ?þøc777ñ´XÎçÔ©Sd‰Ó§OËÈÈX[[¿ÿþû/œ÷jhh@Ã÷f=[¶lÑÔÔäp8˜guª>w±Y|}}mllðDçÅ–÷`ïFFFØÎB}Ó/ °¯é9WŸ…‹.œ™>ÊÐB -ÿj‚¼dnn.& GGGyyùçæÌåSÒÒ¹nˆœšŸŸ¯3+ ­>úèðáûwïÆ¥ŒAúÞºuë'Ÿ|òá‡.'YcŒœœ\MMžžžxæ;v ÿƒ>Ø6#AAA¤óÈ‘#ŠŠŠ%%%0.æáÌÚÚÚïÍŠ²²r@@€ŠŠ æY¨*(LL:±4²²²/dô¹fÑÕÕurròöö†ÎôúKlß¾ócZüëëÁtEEEXcÄ—ÈÆq ~B%ôà'1QŒÏç+((‘ˬï‰>bƒ’™AºXšƒ™Ñ eÐSa/œŸZh¡EÒ‚…Ü…Z ÙL__?,, ¼ƒ„†K$mŠSÒrhh(Éc$¿a2™  ⻄ŸË)ðÖ1aÓy®®®gÏž-ˆ000066Ä)ÞÕÒ"Îûs;±ytttBBBEEÌúÙgŸyyy_ºt ã=ºô´P5±õ»3嬭­-|sâÄ OOÏyªb ªR»°)È¥0¸;»¿PñÞ!pjRRè“\hgg—––VPP¡¦¦ý‰>p*Žcç΃ÍaíäädÜ‚S6ŽAÞéééÇŽCláp‡36Bè‹ÒÆ_ÑÎ5ø§Ÿ~  0;-| °:" Ìs -´ÐBˆˆ8G½;“á‘®‘]‘®‘£‡‘$‘ðAŠÈ¢x)x<^jjª R1™ŸÌCh wág||<;##í…+nLE[WW7ï ^’Á Ùàà`bbVعs§––(m9¶CÞoiiA­9wæ}ûöV•””@-â%À(—SÆ‘’&a£½wï^Ôš˜ö¹ªžÖÅ TRãp– …à9(S›øíÌ µq&@­ö]æûºÐ‡¼AD–——CÉèèh,ÍáVÔµè!AŒÁîîî8Ílݺ=¨·œ%h¡…Z$*ó*Úwg Ejä1\---E‡´Œ´IÞIF^EÕ;÷­Gr×Ñ£GA´¨mÀ2)))ÿDûî"oÏ%ZòÆ)²¿ÂŒ,óvžË ZxFYÑB`hWWWX%%øbª‚ݱ÷ˆˆ###4âããAŠË¡1LˆÁ˜ç#LB>ñ%fÙ½{7&y?~œ8= cÌyìØ1l§¬¬Œ¼m‹ô†ý‚b}||N:ekkKˆó#ÈräS %|djjú£‘…oƒV¡*Zbyyyq“ß2À̰ê`ìk™Ö¦…Zh‘œÌ«h‘Ä!‘Ù8Npp02<ÉÃÈ–Hˉ‰‰H§ãåå…D'æ/ô š"wñxœMZ[[ÅKlß¾Çܲü¢VKK+66F~³i1Uq¨£Á¦qqq%%%ËÔ ³À‘111Ø欯¯GÔÆ¾PJ‚;á`l¤­­ .ľP¤‚ã¡Ozz:nÜ¿?¸™|ÆŒò1„cš¼Á‹9Qh‚):´ºÏhmçÎÓÖÖ›Âàõ¹o£ÒÅrÄËù šZh¡EÒBˆÙ|TúD%€ÂŒ¢¢" $|üDZnllD1*!¿sòäIWH°(E"ò!Ùy—‡7žhI¹ÅPi‘´.Nî(¿455É%ly·ƒ!°7ñ¹c Á<àX$//?#0Ü‘#G`D555ò..j>ñ`°”„á^83QDk’—‹© ¦‡«ðrçÎ666Ä%ËYb ³`kžžž UPzpéðáÃååådïUUUà]ŒÁ¾À`_ssóÔÁ!Ë××üGB>£…’äÝfø -ý«ÑD%¢Øà™™™˜;…z˜ „š[<3ˆ§ò_JwÂ_èGZh¡…I !Zò(C èêê"g"G‘‚ yÛÖÖ©9ÄÚ u •mÛ¶!³!©â–¨¨(ä7äCò+·¸ =¨¬¸\îÂ×»¢%¿Ç…HuŽ€3°ÔéØ*ù‹U$kL8_`«Ëüóœ/ŒÍæJLLæC-2ÀϹK“‰ßJ]bfÔdDOX„ìÞ}®ªä/|@Bð%Ÿ~úérþZwi³?ÂØÖ"¿eŽcÊ\t’¿¨Áá ‹â%Y‘üv ïB1¢*VAù£&”äWØaÜõB;£X‡È/‡CP¼êëë“?ÂXš¼C žå/<‚Ñ¥é?ï¡…Zþ¹¹TaV$Égg$’´IþN/19ù $[ä7òH³ü1 0$䄆†"1.\q½‰:¡ú ù¦ØÛÛ/‡–6œ……żiQ ®ô Ösæ¹²R³àˆ€Óh q°†j,-ˆ­àààyJjhh,6%þsßE¡…ZhyeŒÄàââòÜ?¯øŽ~ã·]@ó87-³Üß(a³Ùôç²´ÐBË«-[¶lÙ·oß™3gNž<)''÷ÜœL--´ÐB -´HP$N´Æ†Æ†4hРAƒÆw `@@âDË/æç•äÑ Aƒ ß5€‰m^i 4hРñÅzm~Y> 4h|»€r$!3!.=Ž¥‘žŸ¾h­Ñæ—nüCƒ +E¶0ÛÄÓDÍ^ëÃÕöážvP;몮ãÃÕáqOY«r=5ÑÖöÖ:e}R—ÇÕõáj¹k¨Û«éùp³j\Wu}®>{ÆZU×SÓmo­3Ö' y\C®®»†¦½Ú9. å ¦ëªnäÃ5âq5¬U =5ÑöÖÒ°>iÌã¢m计m¯fâÃ5Åêj®êh˜ñ¸\kUOM3ô{kq­Ošó¸æ>\cw ={µó>\ ¬è f쪎†4´V5÷Ô´DÛ[K×ú¤k…IÜ5 íÕ¬}¸6XÑAÍÌU ×ÀZÕÊSÓÖ‡kí­e`}ҖǵóáZºk˜Ø«ÙûpS5KWu®kd­j穉¶½·–‘õIG× “¸k˜Û«9ûpój6®ê.hó¸¦ÖªŽžšh;yk™ZŸtåq]q£»†¥½š›°rP³wUw÷áºó¸ç­U]=5=¼¹nžZç-Ozxr'g kk5w.`c¥æh§îáÊõpáž7UuuÐôpæº9h7>éáÈõpà:YkX›¨yØs=ì¸6&jŽçÕ=l¸ÀyUW M+®›…ÖyÝ“\ÀÉXÃZOÍÜëaƵÑUs4T÷0åz˜pÏkªºžÓô0âºj?{Òà 8éhXk¨yéEòâÒb ¤R ’'Z¬TNƒ ß2de*(²äY,ë{K~ó÷7ŸÃú^nÛôƒƒ¬rX?<Äú­›~Ìaý„Ãú›õÛ_ã°þmùÍ?QÜü:‡õSëÇÛ6ýô ëgÖϱ~²uÓÏ9,à¿Ø¬×wlþ%‡õ+ôËoþ…âæßpXÀO·múÍAÖÖ‡XÿµuÓï8¬ßsX¿e³~µcó9¬?qX¿–ßü;ÅÍorXÀ¯¶mzó ëmë­C¬_oÝô x‹ÍúýŽÍå°Þá°þ(¿ùmÅÍïrXïažm›Þ9ÈzíC¬?lÝô‡õ!‡õ.›õç›?â°>ƽò›ßSÜ,ÃaooÛôÑAÖV´±þ¼uÓ'ð1›õÞŽÍÛ9,à}ùÍ2Š›wpXòXhÛ¦íY;Ñ>Äzoë¦ÝÖKŽÍúhÇf ‘ß,§¸Y‘Ã>ܶiïAíC¬¿mݤÄaà°ö²YŸìØ|Ãää7ïUܬÂa[·mRVfqTX‡°¶~¼‰s€ÅQb±w±vÈnæìcqö²ä?Þ¼oÛfÎNGžµí¯›ncq>eÚÊÚúçMYG†ÅÞÂÚñöf·,Î,ù·6ïûófλ,Î;¬m¿Ýtð-çmÖ¡7Y[¹‰óGç,öoY;~±™ó‹ó–üÏ6ïû¯Íœ_²8?gmûɦƒ?eq^gzµõ›8?fq~ÄbŸµƒµùó×~â©ÇÑ.H3t+y¢-Ï” hHùßĆëCƒÆ«„LaæÝ=R²RRlð¿dÿKžñ¿ÙŒÿÃfüïÿWñolÆ¿)2þïÆ¿³ÒÀ.Æ¿Ë06±)HË26É3XlÆ÷Ø æŒï)0þƒÍø¾"cÓÆØŒ¢½‹ñ=ÆÙ¾/Ëø‘<ã56…ïÀxMñ:›ñº"ã‡[?c3þ í]ŒŸÈ0~Á¦ðŸ²ŒŸÉ3~ŦðÚŒ_)0~ÃfüZ‘ñŸ[o°¿C{ãç2Œ?°)üR–ñ[yÆŸØ~ñã Œ·ØŒ7¿ÜÂø3›ñôïb¼!Ãø+›ÂïeoÉ3ÞeSøíŒwï³ï)2ÞØÂø€ÍøÍxgãMÆGl oË2Þ•gȰ)üéÆG Œ­h+2ÞÚÂø„Íøcv1Þ‘alg3ä0‰,ãcyÆ6C }ÀØ®ÀØ…¶"ã¯[{ضïb|(ÃP`3ö±Ë2¶Ë3ÙŒýlÆ– {lE†âÆ–wì= önÆ®m ™÷ì öv†ì; ù- ¶,ƒ-Ãøà ´?d(¾ÏØòƒ1ï2v½Åù-ƒýûm†ì¯òèÿ#ƒý{Æ?e(üšÁþ CñWŒ-?a°Á`ÿœ±ëu†Ìì×ìײßgÈÿ€Áþ!ƒýÆ› ßc°Y ÅMŒ-ÿÆ`ÿ;ƒýoŒ]ÿ‡!ó¿*›¤Ý4Ï ¢],ŠÝJœh±RAE…ò‚å6Ê pW^i¿„¿òKs Ës Ês Äó¯h‰êó|HtÑÅÏ HÈMµ =ësÆ‚>/Ú/1:»8{5ÿŽ5¨è/£Îÿôᅥbtc™ì¢ì¸´8~1_‚,/ÈfÑDKí’D+%&Ú%² q¢-,/,¬X1øB~RjBFVÚ"ˆ/ðêEu"× Q‚°¢`K¬y%y±)ñ‘ñQsŸž˜_’/饟‹Üb¾uxÒI^7¬\/ªÖ ¡U3²ú´{„CXX¶0gCTú!» ;696-7-¿4uñIcc‘š“*¿[ÞÎÙ¦äVÉfÓD»hÿF킊6>-nÑ@*§ y¢­(,ª(Z)²Yuõ5?žž‘3òð™L}ñ ù«ûQOÜÉžæUÕfU®x‰!.5þsuug C5=§Ï¸Ê¶Ÿs"‚¥bJ’²%ª ¼À?1Ú (Ñ($é|H¢ªk‡'Њo?V«ì`…cÔZ®(aÛ®?Òùé¶Ž6@hLhf~fAÙšš‹ÆZCP&€›@®bDÄG¼óÞ;»vï´²·ÊÈËÈ+Ϋiª)•¼l¬~óöœâœ½º{)¢U’š%Z©Y¢•š%Z©gD«$õŒh•¤f‰Vj–h¥f‰VêÑ*I=#Z%©Y¢•š%Z©Y¢•zF´JRψVIj–h¥f‰Vj–h¥ž­’Ô3¢U’š%Z©Y¢•š%Z©gD«$õŒh•¤f‰Vj–h¥f‰VêÑ*I=«h•¤f‰Vj–h¥f‰VêÑb !Z%©Y¢•š%Z©Y¢•"D»WIêÑ*IÍ­Ô,ÑJÍ­!Z¥ÝR„h•vHÍ­Ô,ÑJÍ­!Z¥w¥Ñ*ýEj–h¥f‰Vj–h¥Ñ*ý\Š­ÒëR³D+5K´R³D+EˆVéߤ¾A´éñ‹¡[‰-bWX)\)²A´ µ·oß¾zõê•+W®Îȵk×®_¿~óÆøô­”/îE>}|õÉÃÉËÞ MñÂU­²|D&ÆœÒsv ¨tô«0q/:a•Å6MûÌ,숚æñÓj§4ΞájZz é‰Õà— Îûú%D¥æ¥æ sB“cÛ‡ñ+=Z{<¸RË38&3©@ÅO¯z!øCc{£°j͔ǜРÕ$ÊJ±nTgÉl§„] €hÏ[™— CÜyî¨ns‹r©C’ä—žgŠìÂlª°.É/FNaμÎõÎjüb~®0÷¹ ïÙ®&8Èzx+ìWøXöc1>üèÃßýî GGû#G9²Ûd<_˜ßÑÛQR]²j_, õœ’EE¦s“ ¦œôf&K…ù=æfYéÿ8Àüæ÷•™,é¨0¨Âü"óûÛ¥¤Âü1ÚrÒ?R`¾¦Bá²Ò¯`¾®Â|]™ù#韩0×™¯m—þ¹ óhËIÿLùKæ¯T˜ÿ)+ýËÌߨ0­Ìü©ŒôoU˜o ­ÈüÅvéß©0¯Âü¥œôo˜T¡ð Yé?`¾©Âü“2ó—2Òo©0ßF[‘ùÆv鿨0ÿãå¤ßT`þU…ùæ‘•þïÌwÑVfþNFú}ææ_™om—þP… ¼-'ýŽó# oÊJx€)ƒ¶2ó-iYæVæß™ïl—þD… ¼''ý‘s» S“ÈJr€)¶2óé*Ì]*ÌO™n—Þ£Â>’“þT© BáYé=˜Šh+3?‘f«0•T˜»™[·KPa*ãF9éÝ Ìƒ*ÌC*LYéJL•ƒLe6SæoÒ*l¦Ê~¦¢,®Ì?Thë¤kdndakjesÎÄØÐÈÐÚÖ:0(("2R[_?0"X¢š¨hÝ#üÃ|CÃ)Dµäø–|,ÑžñŒ1u÷&—‚ó ²^f-dUä¯bQñšhŽ¢ââïìî“nC'Rv:?- ÔßÖÉ66%VÒÖPYÛ[Þš¼K„<_/¿¿¤¬$œÖaõ¹HHO°s´õõOÍM¥¨«Šz,ãSã=œü‚}QºÎt®?`ФŒÄ´œ´…€VIIe롬¢|耾¾.—«©©yV ]]íðð77=#M®F}S}e}åª×Zêùeù¦ž¦êŽêz~zÀYGu-wM}?=}?Ý3¶jº|v%,Kqì3–½{ïÞ=\jjnÈÌÏXÅü+EdR´–®ž···«««‰©±  ¿¼¼LX,,++¸0Ýzzz,,Í5µuü#%­LA… "&lxx¦èûÜ#óxHÍÉðúC¼¢#þ埋Žú•å¥^¼ráÂDRZ‚ <Õkå–ÌdŸšUÞ^XU˜’“âêì×ÚÖ|çîí{÷ïܹw›Ÿ—ãäîÐÞѪ»7u›"Ú`ÿ˜ä˜ÕÌŠ#̱s²œ¼5uÿ.…é»÷ÜCi nkji  H΄¼Îù IDATNT$­LBF‚·ö~wÆ,°jYO§ìÜÌ»÷nß¹‡¿‰ÎÀØ09;I|f’4PÌ¡¸§ˆ¶­~;SsRÁúë â-!ÚÞþÞ’šx¤ ’*¦uôu*Dåõ塱¡2²2HaÑ6‹V½ÖÂPç—ñ÷î§¿°‚þŠ~a!Úç‚Ú$N´X©¤ºOõs™ê’œ¢œú†Ú©©©ÉY!{—pì½{SS÷=zÔÔÜ¢]ÁÌ«kT—Ì#Úâ’âÖÖÖ¦&”´@sssoo¯ùy3-T´«Ùò²TF憆ðÃäíIAMÃ)Ÿ\”³Êž‚ƒ^‡yBn@v]GÇÝ»w`ÀØø˜¬‚,J¥U­…b´³¯“z¹:U‹s]=]âbïÝ»ûøñÃé‡÷§N¡|ÌÊÎLHŠ¿{ï^FÙ… TZª+jä—å;¸ØOÞ¾ŠE9‹Ÿ ÿ»S”(.qˆŠ‰@q™]˜-iWfä¥óü¼?ytï>¥Ãƒ‡÷§îO¥e¤fd¦¡î¿uûÆÉk3§{ñ‰qNîŽx.ÖÁ>ÃUfäe4w67~¥*Úºº¢ÕIZ tNÞ:mF~†£MsW3H±¢¡ª†Å†Én•=qâ¸@ ¨n®^õ–†:ˆv¯Þ^úÏ{è¿£}áŸ÷€h—-@âD‹•JkJWŠÜ¢\-XõÅÎ)dA÷ïߟžž~üø1ˆ6+?só¯ØBx\ªUwwwG'G#ãsEE…]Ý]vüëèèéé637ÕÔÖö ö+­fËËEuiZNjrj Bþä „‘W]wÒ;ûˆ_)Ç·ø¬ofmGÇýûS¸Š1 ´”ÌdܵºµòJòºú»V­­°J˜”‘XQUâòäñã'=z (È÷ñç•V”‚kÁmMñôIpH`¶ [ÒÞ¤´ª:»9¢¢·Qï?˜¦L¡¨½5y3_œ”žXTY´J»-yÂ<_Þ“/ƒb©ºöÞÝʪ ÿ ßܼœ™CÉý‡ Ò­®…&¦%@óu°1Qf^fKgKC[CÃÌûÆõ-êZêšÚ›ÒsÒ%ä³(®*¶u²URbïØ±£»·*>zXNNnx|—XXLØÖ­²'OžÑÖ4׬r­ç…z^yM´4Ñ.ç +3 -Bº'Z¬TVS¶Rð‹rëêk‡‡‡A´wfäHvŠbÙé–‹}úEq©01=1&!:.1¶·¯ÿøÇ߃Âò‹%hº¹*¹z8OÞžÁ£š|úå_~õåýéûíáQa1I1‚Ò|ŒYMŠÊ ý|¾úû—>@Ù‰ƒQaQÁ“/žPý1ñÑщѰáú¨DP,*ÎÊÏjënm¦~jæ7¡Ú¶ÆæŽæôÜôUGÔJÕ°s¶SVVÚ½{Whx¨êiUCC™ÐˆP[g[p°“‰¼üUUUmmKíª×Zêùåù4ÑÒ_X±œŠD»X\º•8ÑR‹Õ®yE|T´ T°È½9…ìýŠEç£G¾øâé Ñf¯bþ¡Ù0Ð÷Ò¥K·^$/^ðò£ˆVrúÔ”‡QßÜ1#÷gäöÛå-]mýƒ¨Šðý0Úôƒé‹—.†F†¬Î T®)ÍGö)¯-I©D&Ì ÏÌÉìííÉ/ȇã0-¿ˆšÃÏ ò/,-xÙµ–ŠÚ 7OWS>šË>ýò)TJÏL ‹Ó—×”¯ƒVAMÆóõÆÞsórâBa bT´}}½9¹Ù°^®Ò}/RQiv~v{O{kWkkW JÛê7››Û›Z:Z2øë£|›Ë9rX__÷èÑ#66ÖÉɉ§N©=zô³ÏŽ;öÙçŸC-kiiq˜sXT-BÁ½Êµžê‚rÁ3¢¥¿°‚þŠ%¿°" D»xhëA´ˆÝ•"OøŒh¿ùvñ1Ë>~üøé—_‚hs ²W1ÿŠ ¬¢Øjïh½..ãããí¡… fIêãè344ePñ£Ÿ#³2WŸg/ÇF1~u^}ºº+ê*ÖDsÔd™y™‘1áÞn¹…¹dZª“ŸamgYT^$io•õ•î^n3DûàúëÙ9Y¨³ó©·FÀÁë €%¢+[ˈ˜ˆ Ôˆ¢ôÀ& {wO×ðè0ðŒ³žúˆQV]¢aÙb†n[šÚ›2ù™ë£<Õ;ØŸ¯¬|yÊØØ(!!n÷îÝ{÷îÙ»w¯‚ÂÞ}û%%¶«›ëÀÐ@MSͪ×Zêû öÓ_XAaÅ ¿°")+iÑGi}ˆ–Z¬nÅÈ+Î-ŲàX²fXöÉã'Ož|ùåWψvåó¯(;Bü‘Ž[[[›\åçñ}}Š*Š$¨Om¹o ¯«»«··FNHLàós…BaUUU}}}g'raKGGGWRc+Ý=ݾ<ª8XÕr‚RÁ³ì³ÊcöÄY¤²®’LK~¢k!±®ÕZK ª¡ÊÍÓGšºš°È°´ìTðÑmVŸk h‚]cïb;à',SXF}ï’¸sAÈ&+? §¢ç"[½>Ša•ºÖº‘‰‘¡‘¡þÁþˆÈpíÎ;‡G†ûúzû{{úzF'F›;›+êW¯ÕÂPV M½è/¬ ¿°âÅ_X‘œ´hhÍЭ䉶¾Ñ¿Rä•äÕÕ×>}ú„úÅ_ ñ%%_ùûŒ|ýõ×MÍ 9…Ù«˜E(­) µ±µô÷ð[ ¸jgoPRS"9e`OB´ÒÒ>Ÿ–-))‰Db¢íîî7@´åue«[KP&èì®hXë4TÌŸ³áy’AUc•»·kDtxLRt±¨xÝÖ]ÔÏ5ņè³P±%°¾šT7W÷ôûüØøåñµU鹡^VW–ÊOMÊN¢Ac €eù%ü%B 8Ñ"p+*W çS3Sò¹K#5#¥ ¼`ó¯ØV‰IЉˆ‹‹ é.úq‰;¿$u[^¾2~A>uuµ}}}(j{zºJzºñ²¿ŸêÄ¥þþ~Òhh¨1Ãß«[ïê©l”¬…×ÕMÕ¥e`\`Ãõ¡±L€kÁ…uíšOþJ†: 9Jœh‘ÈD¢•w•Õ”•ˆP©/ÔšU «™úP¹¾’:¤Ô=`²úJ2LÒš¤f§øú,¹é«ö²OïP¯¨Iâ^O€hkšk^±M}GÇ5v4ÖµÖ­í´¯j¨ÓØpR8ÑR‹5ÑXkÌ8o9ÀÈ—Y¨°¢°o¸Ì´ñ[^;`;¯ØŽh¼<^ÉP§±ñ˜¡[‰mus5o/ +©ìSÓR³ášÐ !QСNCr8Ñ"pk[ji|ßUõô×¶n¼24hHt¨ÓÀˆ3_#STPVðB–b0nYzN„ q¢ÅJu³ß’Jã[a•p`d`ÃÕ ACÒ CFymyaIacsc{gû ÑÔÒ„ÁàÚ¥9ŽÐ­Ä‰+-ü@–@UCUU}iãÞŠÚŠݾ†5ŠÊª©¯ëƒ>+Ý…„PY_Y**…VÐm}V,Œ4´7,1ÆVä»gKf¾uµü%ÈßJ¾ü˜¥QÓ\SRUBiXU‚g/ëg‚­¦©FrÖ/*6ŽDé%·C¾›kľC£©£©¥«Er /†—w÷*°œP§ñ !'¬‚eÿñ,‡ù¾þúë–¶–²¥c•Эĉ+!v—‡s&çÀ¯hƒä4µ5¡åŠfXÀâNnNg4Îpu¹®ž®99+ÝÈšƒ_Ä·²³‚J:ú:^~^à³uXÙgplpé1p“’²Ò±ãÇ>?ñùIµ“ººq)qHÓË™Vutu-=F[_ý2IÉLÙ»oï±ÇŽ«×ÒÖŠŒ© Ø¢¢$g=ñ¢ðÝÒ;}I¬z;õ3g8A™€ú_o+Š`™¦Î¦ò:ê‹™:ú:$§ðbʼ¼»WÅB}Æ8éy©ñé±qi14^aD%D´w´Ïc¸'Ož|õÕW`ßÇOÏ»ÔÕÓ•_œßØÑ¸t<'Z¬=–óVçU8*Ñ Ñ¸ur79Ä%ǹxº$¥'!ƒ'g&g ²Ñˆˆ@ø”xA‰`E -T`Y{gûŒÜ ´s sñ2¿$¿º±ÚÛÏ;$2ÄŃ҄l õn`X Ï#Gƒ2&,:ÌÆÁÃX×D%ÌlrÞÄ?Ä¿²®-¸mt”xúzÚ:Úúúâp€uËkÊÉ-EåE0N]Ë7L·ÒuKªK}–7E¨J¨µÖ ÇéÕ.eð3ܼÜà&¤l¨M0,+?+4*´º©:O˜—˜žë¡‚ÃcÂ1ØÒÖÃÈé*5;ÕÝÛçåJ_Ê¿ i ÆæÆõ3…Zf^&+(1-¬-`1t¦å¤ÁDvNvP„ŸÄ¹ø + ãy‹ŠAæÄ„ž>žØ,ÖÂKì=*> ~DÏÂÀÆ“<×Ë8Ö Æx<˜Ë'ÀGÔ ÂooôÀìØÎ*ô„µóJò:z;ú†û¨ÿ*NTÒÜÙœS”“ž—^TYÔÞÛŽˆ„‚òppsW3ùOrÐ#¬bS`å5 rq¨«ª©Îs7€AœÝ}}pÄ\؃»B"ã#ÑË ºÖ*Ô±P@$ï3=‡ô?¢ñjãÌùmm ²ÿoŽt÷t_½vuòödGWÇÜ~B´È«]ý]KÇ3 q¢¥þßÎÀÂÆ¬fneN¾"D -‘šQÃG#¡ 'úû#ÿ‚HP?3=‡Ã/è9-;mE -äA{TÕä%RIHD…>r;ä£ñl#ë†q)>59lNh‚1ò;å¡•_°Ÿ¡‰!¸vMT‚ÃŒLÜyî`5$’/„Îa - Ø/¡ #G{ùzÏæ™n¥ë"Ÿ!·.1Fì&¢'ì¦NŸú/Ì*„°IPxÏŸ“Ò5·4‡×ÀgGÓƒêiUʃÖç•)c/ØÅÉS'q@áòQ¢ùù|òé'ó2_šž7%m𺾑>–@°!)cf3 3X «ŸP=£AP UÕÕ–C±”¬”U/ åÅÿ"$º<|ÒÚÞò¯ÿñ÷ü]ŒŽÎŽ‹—.^¿q½µ½un?†zy<œMñt,Z3ÿù•ĉ´tµ,–6–`5Bl¥U¥ÇOolotótÃK7°áß¹^F ®ÂQCÃA(bŽ/ØÎêT…>¹Â\Ð-ÊY´Á¯¨›A¥¨q¡˜ *®¢ð5в ²ººQì¢ämënÃ¥5‰s!JBbnð#6`=\Â~ÍŒ±ñ…=ÇŽC¼Ayôëè­U¨SïÉ{XÖÞÎ1’¥ñ ㈑¬†Õ¡æÖæ'OŸ>\ œå‘J@oÖvÖ¨üЃÔSÛ\‹QÔ"q#é`À<Óa’-ŠT;21ÒÚݺÄlyï¾½X][O[é€*3$bôã ræì²48U(Î:«ul>F®DVIÀƒ`8’òH6…ú /+ë*?ûü3ô¼Œõà‹ýJû¡ ¼–ŠJ± 6 ±dë` ;pðzPtšæ óÜœ@Š/³¨¸ŒȳàäêI¸ ö)®(†8á¸a`ƒçæy™Ä ø´œ4¼àh„ªg(¿ =á_PfÏ`´ªl >¬q‰Xˆú²¤FÊV40RP*hïi¯i®V ©üÒÝ’_šóÆ9 €¹=­‚Ò´K*Kp§Øù=í8Ÿá`„Tùè¡ ¾¡>óÜÕE&„zø9»û:Ñx…áéç6~8}oúžÃcׯ^¾zãêÐèÐÜþûï·v´âŒa© 9C·'ZhÐÚ³XÙYáŒý2PD>zŒ³»sNA:ÉgËh€µuµ‘‰@oÈVH+Zei £öÊdZB"ÆB`VdüÊ2ó2ñœGƒÝþ)z^Æ€ÏõY…ˆ•+””“—C±67ÎR¤Ú[ÃE‹Ê‹@á1‰10 ®¢¦ïë. ì…^žkpÁ¨€Ã£Ã]=]·ïØNæYEtA ÑÌ7 S_ƒ^WAý¡K[8>âÀŽvmK-õmUBê[Zj2¨Ïh¡ ~Ž‚ŠÖ$ÎI €ñÐÁ¨Y3r3`´„”wGWGŒ™×k=vTõ´*Láìæ ›H"Ôi¼Â OAIyÉÀÐÀÄʼnbpd°´‚úãÏ¥# W‰-V¢¼Ëø£°´´ó…ù~A~˜OQ|r<'dCð.•V•âÔ6ÈAäS¥5åò1³«‡+jDÐ:E ¢ÃG#€KÀ©dkuÍuAaANnNqIqÐ#ñ’\BeŒD°V*aò”Œ$œåÁXí=” J ܽݡØlŠaèÄ¢Pžè°Ðtk޹[&Ÿíá€ÒÐÚ€ž¬¼,| á%ð  ~;äáè‡ !!°¡Øïâ4 jhŽ”Šž—Qò¹¾ ‹ÂDð&<æÃFˆ5à{˜qÍž2ù™ Ÿ2Q^Îù…½ÐËó Ž£/_/°‹xž•¢k «©£ ¾§‚8A´¨\ëZë@½ã—ƱðZßpßÐøÚ…å…Pƒ1rpŒ"Úµ '¬Gœ·:/lH}X“‡³,‰Ž™ÀžÛƒÇá¤ÚIœEo8û6µ7­yœÓxåÃVU]• XW”÷B„‚ÊÚÊÖ®Ö¥ç$t+q¢ÅJx_ Ô4Öœ8uVÛpMhHÔ[8¸8‚ç6\™õˆ¶w¨¬ €Mñ’ê¦zúF¨—跩·®räÂz0=®?òÌiõÓ8¸l¸&4¾ÕèXÉ»Ëa7B·'ÚΙgøÕÒ®¹¥yÇÌñŸÆ+ ÔÜz†z¹¹´¯Ÿ Ô² Ù ×D äK[KQ½hÃ5¡Ac.ÝJœh±õ5¿*€É6\’y<^±Ð]C º¿<Þ?Ò¿ášÌEW?í/ÿr t+q¢ÅJþëd4hРAƒÆúƒÐ­Ä‰¶w¨ç_4hРAã»0 q¢¥¡Aƒ 4¾{˜¡[‰mÿHÿ( 4hРñÝÉ-ù3»W}3ßøºV_ëºÎèìï|ÅÜAƒ ÿÊ 2'q¢Ýð}®!p0©i¢þlŸúõoZ:[ªê«Z»[7ÜŒ4hРñ‚ä¿°¢·£¶¹¶º±ººé[UQEÑÃGçþgIß|õ÷¯&.MÿUwÃ-¹6h¬Fh½2ѵ8ÕÕ¶Ôn¸’Ecu}k}Ï`φ§B4$‰-¤‘ #×'¯ÛqcòÆÅ«K«KÁX_þýËo ö[7D¢ ·äzdôâhMs ü‚ö†ë³æ»»tíHhh|èÕÛx×o]ïéÇ67<Ò !9HœhE ¢[wn]¹qåòõËßv\¸ráÑ~õ%ðô«§O¿\_=%#ÿE€¼†sÏ«á Ah5¶5^¸|aÕYûÝ]¿utŒl¸2’ÃÕ›WIXnx*¤ACr<Ñ6ŠnÞ¾‰³ù¥«.Ž÷^í"¸4ÑéÚʼn«cƒ{.vÍ {ôò5ò_cÇJE¥ÅÎðèøÄ˜°¤PP˜?ƒ¼y¨®­š~8ý&^O|õmU}µ—+bGPë†w.]þFçx߆ü…@h5¶7Â/hO\žèê[ýÃã#¨}7\çåãÚÍk݃ݽC½s;/^»4zqb`l¬wd?G.N\¼ºñª®àZšhi¼òX¢½q›zìB·h„·wÜã‚á@Î…‘NAg”Mñn«b9ÀºxGhµádü~øÃèÅÑQ ˆö‹/¿êëûïÝ»{÷.ö}¸}{˜œ¼uçîmAAÞí;·ÉÈáñ>z8·±&×^¿u½²¾o)²ùë¸Ç6‚A». 6d9Ž8lwß:î.3êòá ·âÅ+nó¥ÝÐÖ0za š—kdn¦©««©£«AA‡‚¶ÎY Úh;{¸·wwl¸Î˪=T´s‰vìÒ…Ò†N—¨â“¶iû ã>·Nuˆ–Ôw€z7\ÛUaI-WëñÖ1ùts¼!÷zؾ¿×™|U¥ùU½Å„çÖ‰¾†¨‹È~õäkšñWÔ2/›Øí¸2ŽÁk‚ W.¼°gE@BÑ‚±¾xúP[_36>zãÆµ+W.^º|áâʼn‰ cã£(3Àµ(j'oß"#W„±ñ±Ò²Ò¹µE´u•Ä7Âö~]oòuµÖ×M–|ü°¼¢ÜÙÅùÚk`Y4®ß¼þèñ#܈Ù&ïL¢Æ}6ÏÝÛxyçî{S÷îÜ»ƒ®ß¸Ž6U?~ˆùqãÝ©»Ÿ<~¶úÓ'èÑ_\ Úñ¥@ñiú‡_›pÿ¾ÑÞÏ>õe®Ü“´-Ÿ »o¿°F¾ZÑNŒÀ¹úÆÆq ÎnÎÁeF‘m:vNv^–VvVfçÍõÏ›šèdççJT¨áâæÒÙÓùÜK RwNâ IDATr^Ï<\¹~¥«¿«g°gfð…Ô¢EÄ=¦ÙŠV§½Ei¢qÃÐÆƒö%lËü}çcùµã—çÏ’žR!ªX8sß`–¶s°Ã±`M6.ª…E†¡QßTŸ˜’¸ü)¢½yMÔ(ÚðTHƒ†ä°D‹+ž¨±¦¼q×wnÅî¼#w3F~ØñÝñ¾†Ø:;Ë2YǺöµÛí«ål Æ/Í}û‡ûkêkDu"<ÉHIU5UåU僣ƒHR¸TYSY\V\]W=46„ÁÃãÃdäÀÈÀø¥q -²Ê²rQ9Æ€_qKQIîmíhmliDÂË–ŽŒÄ¥®Þ.ô YSaŠê ÜØÒÞ‚Ó:Qfxb¸¤ª¥!È ¨©«hjnŒŠŠ¨­­Ž‹Éðsr³#"ÃÇ'ÆòòsoMÞ$#ÅhkoÓÕÓµ±µ±µ³-.-žº?úLLJöù14LÍL/_¹ÜÐØàâââéåÙÒÚ2ý`ó /£c¢###íìí,,,444üýýAäÍ-ÍçÎÓ×× ½dip-2ZE•vGës®øÊ<ÈÜ>ð—‡|ö˜Ëûã½uCI¦÷2Ž=Î}øßÓ9‡Ü>¸ô _ÀuuE¥E5 5ÄJøYÛX[Y]IÌ+îÍ›Z›šÛ›G/ŒÖ6Ô’KðŒ¹ð.ŒËš„¥BâÜy®ÄKø÷âj[WÛøÅÒ?v¢…_0@ÏÈ(4<ÂÊÙ<¢ûlÔ¨š™Ó97þé3úª{ì“Û³K™ÃQ;«‘÷ ¢mïn‡¸·±µml±šZPºABÃí]í‹éƒ-=vLƒnÁ61 âªw°·hjib×@u}5®R=\ͦ¶¦…áGpùÚeò?Ò ÝÒ3pÊ.m‡Aêó¼¶ÅÜÀ†¼¦«–±G]«ðrŸyÎg–)ÍÝý ùRQC EÀðpt\4ç('":mž”ŽžòXAmôÔ7×ãéÀÞ¡~Â>ƒÛá/hŽÁØ~qy1L‡‡%<*ŒÍ¶v¶ÂtTŒ]ÅvJ+KZ0þ¹^&¸zã*M´4^mHœh«ª®Þ¼Šx|¨}(Ó¡ÆãhŠžl²®LC¬åøX]_±q˜²¦¯œnðn_¡NaGüøeŠöÄ(,.1^PX€Ádip-E´µ·Õg_ô|÷^æî»©Û¦²÷:þe¬§n(ÑôNÊáéäîÆüé^ú¾A×O&.ŽÎõ웘Ÿ7‡Usòr@KeUe^°ptl4ŽA°[°5åyËój§ÕìíÑ©®¡Ž‘Ä•ð»€ýìý˜ÓÊö™sç¹i´íè…‰Ý ´ê[ë ihƒÃBÝ |ÊÕ[TíãÕ<†¶·Þ~Òi«ŠîöÃÇŽ¨ihdååÌݘ&2&²£»CW_ËK |n~îÜÐJHNÀFЉ%À‚Œ˜ø˜Åôá ø;wîÄ(›Ÿ ºÅ$Ø‚WËÝÓ¤¹…¹“‹:SÓSa Šh[›†™íÒµKÔË8@G’ ë å 3öœÏWq,?Å«× íÐ j;áU§l_ºÏ"¯ar\^íÜݘ3=+–WRR‚S°#D|kP>à`‘’–âíãG 5.,€ÁG?;ŠKQ±Q°ÉY³Øô4ƒÛ-Ïãvr¼ »013Á‰:cBåƒÊ¸+#+ƒ ª©ìèl«­¯*«–”• „ü¼‚œÜü̆¦º¬ìtÕÉH1jêjŒMŒ¯\»rgêχWZ^:õ`jdl¼‚¬„ÜW(,ÄO2˜4Ú;ÛO:…ã‚¡úYõº†:\rtrÄ$¸êã듘œxwêîÔô”¾>W‘þœœjëjïÞ¿K–ž~8}åú•òÚrŠ0øýf¿±{oõY¼9Ö[?˜h2™¨t7î¿o…ÿv2I~ÐuÛø…‘¹¾@>=«yÕjUMÊ”zÁaÁ¨r`·ÌœÌ¬Ü,ØÓÁÙU *¡sÆç»Q÷À¤‚+íìÞ…1J”Àðqîp7‚32:r¡—ÅJ^¾~™&Z¯6$N´•õÔûHCãCý#ý©™© WЭ@˜êçïãêáRÓP#3ü>Žáx\QR ¸@ÎÈP½º¾:$<ÄÞÉþóŸãùoíjÕÑÓéì!7b²geM%ÚÈÈt}Ã}à .RgDLùÖ_ÒãèÇ9ÂÁp9ꌯ¨®ÐÖÕÆ„ÑñÑ()Èœ½Ã½ÂJ!JÌ{Ó÷€ªêŠ–Ö¦â²Âl~:–™”šž˜”—U^Y’ž™råúe2RŒêÚjT„ àÉ»“ Qa‰,‹\úª¶Ž62 Œ¢-­.¥ö2Ò3ØQ5ØQù ¢¡Ñþþx£›± ·"ÿt-èç×ceûeÑ9×H¬(G`Uo$_¤ÝÏ®zJF;uúTxT8€®²á/‹ÖvÖÄò05n‡ḅwaÌ Õ½ÄݳЕ8Á˸³!¬É%„VmK-ü‚1Ú†ú.¾G5•9 §|?´xã¤ÿ»–}¿ÓÎzûs÷-z;µ,O¤egÌÝŽ}8Ä'ŃGQ´Å$Ä€ ÿ¼Ð¾Pºeñ³À¯pi1}ÄE¢.6!DÎÕá:|w9{&¯0—pLÁIÍÅÂÌ6zq´­§­½·mÏXá.ƒ”­ziò&¹l›b㈖ëw¿pOïå8W*ZÉç|¢“èQ0ïñA¨'¥%Áª(%¡ÀÜØ/ Š p6‚¿à#ÐjZVõÄY[—a0¶€Máü r;4ÇPÇ…={÷ÌPìA<>8RàØÍÅÍe¡—ÅJ¢¨5ÐDKãU†Ä‰¶¢Žz¯rî’mÍ6Þ§­BÔ,CN[†ê9Ç„'$/öe÷(&¯6ðÄ¢¶‹ «ª«¢r:²awŽÿƒ³ß㌃9ø/‘O‘Ó{‡zI2Kbj"FzB#C‘,ÙÉiD.5µ7år´´µ°"Q¦g¨‡"ÚÇÿ$Úºúê¤Ôx{GÛˆ¨{G/ž»›‡³…¥Yž '%-ñ¹D«¤¤T^YÞ?ØïìâŒ#?H”ªó†êë= ¢㺸º€QZ‘Æðèp\Bn»0n¿8>hq×\¢¹ŠjDÃcÃ(DP"Ï#Zjw¢¾x£¾¸Y$[ ö·öÅ»µëVÒ'ע߿-ÛçôñàHß+'‹ú}ìË‚‚ƒ¶Ð545JÊJ@º(m†æÒ-.-¦~ãÉÒŒ{ùêe°²_€™384w¢[ utu \Ö7Ð753íéï!,Kˆ¶DTBm\”zÉãoò4ðÏâç¨Ã;í}Iç-ÿ0lÿöí›V¿ëuÞ>0Ò7פö**- á¢ÐŒ„q*j*B#BQ«õö&¥&Á¶È¤ÇO5w4£Q ,(,)ÔÐÒ€›ÞE¼‰;Ï•ä]ðèpðSlb,8=D%„VMs ü‚­‰™©[qïþ}G·›Ö¾uP}çÁÓ»iìBÏ‘cŸ¤ˆ6}^€Y<€…‚ØJlÀÂÐÂ0. 2Ôë8"àåbú ¡oH½•ŠÓˆ»@hSªDø?qÜÈĨ\TŽ{ùx‰Ctaø‘ÙF&FZ»[¡ÚÕ-íª¶iJ¹Ÿè§oÓËPó(¼4eZ'g”½M?ýS½ÔC¦‰UMmóvGB]üì,ìñƒÃ‚ŸzâL°pðÂ[ˆX ŽKŠÛ½g7zBŠæªÚª¬Ü,Ü/GÇEÃð2¢K,ô2Y9hìâM´4^m¬ÑŽ]›ûð×utÙÅÔ:¥vG·Y'vZÆ4gÕ‰SÕ< !¹/l §#Ù3>¸z¸"]bTxÚQ !­ã‘Æ™º¾¥·´v¶ZZ["Ó‘žÀ@<êTZî'=ÈÔHH¯ffÈïYÛTëîåN~¤¾¹ž(ƒô¢}øøá,kVå ø¥eBaqA¡úr(~~N?++'#;73&.jâÒÄB¢urqBIŠÚôæí›„¯Þ¸:26Býòêå 7'oÞ™ºƒQÞºs‹4Ѓ6n7ã.¼¼|틃>qic .]¹ƽp‰z9·¢%DÛW•z#dç×eǾ.ØóuÕÙ ÷úÛ*ú{›ûÛÊÿ‰Îšo:+B[G[[W^ þ/£†{G{==ž „ž†–7·s&çàB«A¡Aª§TA0^¾^ÄMóî"Þ!)˜8wž+ñ²­« ýà9{'{”SâhAŽÑvvãv®¾¾¶ž¾âå}JœP1…¥…8<éèéxñ¼ŒÍŒq£…•õN².G08D†™mx|D P.îÌ®8džvÐ&_Î0s»aÆ«¼ç2·é¥ï0LߣŸ˜RÚ;<ÿ!"¡.~vö@¬hzÞ”z =9Gœ…ƒ6 ÁáÁØ>Gýf\~vwçéÙéÄƒÕ Õ(da[TÌÏõ²XIšhi¼òX¢½8Fþó[‚Úö.ó°*ÓÈfð&“ÈfÀêÀÌZ䑹cÄ¿;÷ÜyËKÜžg÷õ‰ç!¤gîxññlýÃýó{f'éèšK´}½ Õl~ù r##+=#+T“ß ÚºjÔšó:×b¢¥¶V™rÅçÃÇ‚ƒrö<.82êô×¾ÖòçÚ¡;æÙDì‚yc²øYV¶VK»iîËyîžçÊç. Pÿ©@S XW}ýÕΞ=­¡14Îâ¥ÚYu5uõSêꪧOŸÑÔ,*+~±Pç¹íÅô÷“‘âIÈ0q{aˆ. ?`h|¨µ« /;û{|ŠZ¥²Ê=d¯l%Ø>WÁ$ã Y²[ta[o÷bÏÂ]Ìë™ëŽçnùÿ±÷¦Ám¤gžçרóiöÓnÌDìnÄLlLÌlD{z;&bÛµÕ¶»]nÛ]n»»ÊU¶|è¨Ò-‘"%ŠÅûOñïS¼oo<’oo‰—n‘ÔÑû§²„b3E13éÿÄ/‰™o¾ïó¾ùüó@`Ÿ«Ïq°¯5ËÛ“89J¡%o7ò ms=.¤—wg¿Ù+©þ×WÊsµâ7^_-Ë­5ìÜÁiÙ¾ßßñÒñÒòŠQ”˜ß±ð-ðOÙ¶¿·h—ÚYg¬¦“**+mµ®z{,ú\˹ÿ8êõ¼`àÂèª?ÜX¡NºêsUîÁÒ‚ÐâÛí]†¤´”k±QÑñ±Ñ×c£@\Lä6Ñp†^ OÒ$Ûßv †Æ†Œ}F`÷@kóª›/E—ýÖ#÷§'Ó?vÏ9­$§ª©gÀ¬zo„vdb„BKÞn”Ú‘É‘—nl;L¦ÆÎ¦®^¤Õ/x)ôöîZ×â{B;ØÓo¬ûŽÎú¯¾f¬z;z:äžäèFC#æEXW(m·¿áaа±ôØK.—àæèÍm¡ýþÍùf§¹¯¥«[ßÑÕÜÕm4õÁ£zWßp)´äíFv¡Õ6k‡Ç‡í¯2¹4==;_:v-¡EÿUã!‚¥ÕØÞ((èÛ‡eÄÒÑÛT éZ)´äíDøÄŸìB[\U\¡­(«-{ (©)©¬¯„b©®šÚ©™©‚²ÕÃxˆ”וߨ¸yQ½'2—P½'r³°¢ yû¨ÖUw™»dÚÒšÒÙ…Ùñéñ·hÕÌÂŒê¿,v0ÐyÕH!ï£S£=ý=(ÏdZܱŽ ¢æ „BÞ) =†âêb¥„¶¶„By§èèí(®RJhKkK !„w …vt°´®”By§èèSPhË´e¥ÚRüu’ üݦ®¥}qMqqõ;.¬Õç‚ó%‰š—Sö2 ªOÊwóòrvœ|j\hÍ+UІKo(-´Nˆ¸µMÚÆ¶Æ¦ö¦w}«¾ª¡jûJ{¹ \‚wv¾šÚšt-ºrm¹ÓNÙöÔÔ”Ôèkœvj\qÍËUWŒ†‹¢œÐZF-åõåHÛ8Ɇ¶!ØþHX·aýîú³gÏž¿K¶õdËj³Vëªq¥!Î2)œ¯WÛãÇ–aKy]9’¯³LJýŽ©©-Á­Àâ­Å§OŸªª½ÍåÖ¼¬QU!ZùOá”Æ>£BB{sôfE}…³”T—ÌÌÏ<{þÎemØæ“ÍÖŽÖÒšRÕ'‚ó%Ñî=¸WÓPƒ Jõ¹Ø¶SÓ³ßiUV0[ó2GU…h¼n—±¡~x•¢ÓÔ©”Ўݬ¬¯t6„YÇÝ"÷»È³gíí¸ÌTŸΗD666juµ(jUŸ‹ÝSS_QZ]zsä&Ò·êQÚ—Zó²GUñh”TGÇE…E†àB<åÚÊÒº ÕC-+Ê mC¥ÓQ_‰u¼¸ßUÃe†ÙyUppëÛôêOçë¥}'´{Å7"uMuÚf­*³ƒ| IP;BâæZk^î¨* ¬OMVjeUyhxHAYàÌ«¨L-)¬ªx£Æoâv¢œÐU骜 ao¿ÿñìé»hÏžâ2CÖ~Up„wTŸ&Î×·öìéãÇZä”=ãSVW¦o×7u4©2;Ûű8ûÔ¸Úš—7ªòG£üå—u—Ô”$¥'úø{7è´á×Â Ë ·GW_u£¦òbtQ°¦´¼þàgq‰ÛI—¹KA¡ÕW9º*$î…[ XpOž>y×øî2Û+8ß­]Õ§‰óõ’m¡Õ¿Ú½âS¦})´jL]TÒ>¸Øš—9ª D#<:ÌíÒwO·sÏDD…këkô v¡È*½–UšZ\~<äFVùÞ«Z N7qßGQ¡­ÖW gu’*ýËĽ´ úõ¯Û—™¶|ÏøTê*ËëË&#çËyxôøÑ¶Ð6T쟲ú2½AßdlRevPO[†-ª‡H×ZórGU¾h€‚òüÓçOUWWB\¿ñ½:>16>>ªoÔAh³K ²+*³+*.Dá¯{LQhFéål·k£«_1¡ªn¬v6‚ÒÚo÷Ö“­wo/³úò=ƒS©¹vÕž&Ηo…VW±g|0_‚Ъ05ßI‚êQÚ×ZórGUÖh óÉYÉú£±c` ?+'óÁÃ#£Cõ Ú°ˆÐô¢‚ôÒìÊŠMITNTöR\ñ¶2è\Î6q» Ðn¿2ƒÄ­úõ¯¸Ì*ê÷ÎÚŽðÁtÕ§‰óeGZÜ¿ïäšFCcsg³*³ƒÂ’ zˆDq­5/wTeFÊ ¡mÐi m‰Iñ“SãÆÎöں갠ܲÂàôÒ´ÒŠÈœ²MiÒŠ¯ÂnTôDN8q;QNh‡'†kšjœ}¸7·6ßA„ˬ²¾²¦qàT뫱v»L]êOçë%=„ÐVéªöŒæ«ÉÐÔÒÙ¢ÂÔ4ÖTh+IP=Jûàbk^æ¨ÊÆšÔ¬myE)´6îzÌÀ ¹©YWYUY\˜V–]QšQv-«<*»übtqõ^Ý‚ÓMÜ÷éîïVNhëšêœÚÆÚòÚòùÅy¬¹Íw­­íˬª¾jÏàà:ÁØeîzà £Ú¦Úœ¯²µ!-ÒÊžñ©l¨„жv¶ªp)5Õ~+ [[àãÇ7Kßù§PfÍ#hÊI¢ªV4Ðùôœ´ß}þi~aÄ5"2¬³«C[_[V^äŸSr#£¬ª°¦Æ=¶WJƒÓËœkâd¢§¿G!¡™q<}nQ.Noˆ%•U˜U­Û;‰ì¤¼®<¯$o¤¥ð2qo§°µùõ±öµáæ=Yn¹7?²ñ" ¬®¯NÛ¦k­ß{po|b\z~9D WmmU {_fw·¹ûUÑË/É¿žr$¤&däg ÌÚs·øÔxáÿ;ífç|íL¸ó óƒ–ÁËÀâÒâ£G»†yÿáý‰É “Ù45=åø,xððA¯©×Øiü–.ãíåÛßËé›oݾ…S ÞÄìï9YpÞ^¹ÝÓ×#4Ò?Ð÷Þ]Ç}DÛÙŸ@hQÙïLeSGSk×ÞB{£ü†ýr+­)Õdk›„¨æ—æã"}ÃlR©­Üy„XnZúL}V›Õ®‹?ŸDzwÝÍ¡›3s3Râ°xkaT~Í ûäç%§'#€é«&âzòõ7Œç«¢j_HC#Co˜7Þ<ûƒdîðMtLdRJÂW'çåçTU—úùûW×4ÖÅåU¤–T×|Z”V²w7¤ðæ]••ž…VÛ¬Ý NÿÙï?;uö&CxöÓŸý´ ´@xhǾ¿ý!Rö×§¿ÞéAÒŽÞó@»sW?z;qãÒÕFÛ"Þ_Høç…x;?›¿þÓù¸š‹ýÇÙ¨°^ÿôñãXÙH£aaaHÙHø+܆ãïöÃÇ/:z^>ܹÏý÷ËÊËŽ=ŠúíQ‡ÅÆK/Ú/3ÇÈÜ]â©îþî=Ÿ§ÏŸþøÓ¿:ý8zâhxt¸äñÇðÛÏ~‹;*ȃ°á¸Ï®‡{Πã|ÙGd0Ç] Çœ„mßµì#ÛÛ×›œ’Œg}}}!·Ž±ZXZø×ý×ààÐ:2:²sè÷¢ñññW½¯¦g¤¯­¯íÑÈâBxDø¹óçÐB`Pàé3§ó ò×﮿F;¯š¯ïGÚ=g—RsGs[W۞τxûy YÕ/ÈïúqÉqð—Õ”½pÊá8»‚ï8q;lCpômW>hlnôñõAXbccÇÆÇà|øøawO÷_|a¶:®Ø¨è(m½V¸@ö¼¾p¸àé0v`Æñð{“ÍcàXçüóÿrì/nžn>>é¹éŽy¦¨²è£O>²OÓ!FUë*>!þóÏ?ß/oÈ )¤ekü‚}ý‚|C®ûùÅ^Î/ÈýÆ×»¤ªÏÞ¨©-©«óN,óM.«Òï1|‰JWåCA¡Ѷhw‚Uõá¯?üóÑ?§e§á!n±±pøÞQ˜b«ùË?~„ô%r-ä¯ÇÿˆªBû»Ïwå›+Ÿ}ñ/¶±z IDATÙÙ‹g1†Œ¼ Ÿ@d῞øë%¯KðùË‘¬‚,aÑ_ô¼xâÔ Üc"ï¯Íß&n¬¹Ùbïµ¢?¯¦ÿìvÒ_ð£Û‰?º•ðþRü{K×ÿß;åšýÉ£G÷qã"w¿äž•“õÏ7µÚÚ;÷îà‚G9…+?:6zxt=–! R0’Ä ³»Wšjni¾ýË/¿"¨ PI¬ÝY³{pŠ›Ã7‡†‡ì\½ííÛ7:ߟûaíöô÷ìù,€Ð"é`«<5+Ç!¹Å¹.]øâ_`fQìGÿà¿ÿýño?6ëê«üCü1›˜SÌ&æèÌ…3ÈYÇOOÎHÞ=ƒ¯˜/aØŽ‰Ñ7êo-ßÂ=>&%#+CHÇ(¡²“S“ØÚ–’šâ+hä±cÇö™‚]CMmÍÊÚŠ©ßtæìÛ¬ÍqŸìœlù¤uÛèäË£°_z;£c£¨ÒvvK w;wóuúº]ËØŽ ´íÝí{>›™Ÿùõ™¯…¢öØWÇ —½/#ø2â_X^˜’™râä‰Ï¿ü»á‚ò¼ê‰û×íc›µÌ5’þ÷&ngû;$AèêÊê ÖÿÀàT/*.‚sÊ:•”ðé§Ÿ ÚÉÈØÈ?ûàãO>ÆQ¨w›š›üü³²³fçg·ƒ3> ;pñn_¦g¦¿úú«ŸüãOpâ&IÉ5°œ9 9 IIˆRaY!LÔ$ÿú¸ûew”¹§Îú›üÍ'¿û!=ܨ~»êëp»öåöË DCœ7¸fKªK‡3òÒC1§™W¿ñ‚Gا°¦öJ|þü,‡ÒUÉ#BŽŠKг_ƒØ€%h¶5õG)(´S#ÚVíNêZê>úô£«~W¯ø\AMËMC‚þ—ý—¼Ò¼˜Ä«É™Éþ¡þ¿úͯ + 1 oïÄôDø³ndÅkâß{ÿ½ÈM®æ÷ø}TB<¨«Š«‹ÿþ½¿?ëvV“£q»ìvÎí\Mc͵¸kщÑ)Ù)AáAù»úP®-Ÿ[œÃš›-ºº’÷ù¤×^Îúd9ûÓïÈúÄêû/j~1òã‡îaOƒÑðãÿ8'7§£³ÂÙ?пxk±´¬´³«OacvnÖу÷ß?-=­µ­5:&ie;ïLO ÞDE{ÿáýÃZÔ —<.UTV Íá!ÚGawùÊåÂ…ö‹r…ûÙj}õ®©±§JW…%²ç³àô…Óá±ážøWg¾ªm®õ òñ òMÍNu»âö»/~WRSqÅìä–ä eue˜MÌ]Z^ZhThLR f³ Ù†'§8g× ¾j¾=-DTxˆ´²t{i§Ðb°ð YWUW¹»»ëuޱ‚Zÿþ÷¿o3´aŽn¤pÈÎ ¨cĵˆ   ûévr-òZEU…ýÔ8Nº3ÍíßÄdyxz`â 3‚Ê¢¼ƒ–;öÝÐ,*ZÄyÏ©n¬n66·÷´ïù,®…£_Í(È(ª*úó±?‡E‡: ñŒMŽu¿â^Q_€GÄFà*Ãn¸7½â{åò7—óʆJ<…ÝvMÜ®ö±$Á~„K+pyuC3và\^YÆÊ‡LNLMì Æ )ÍÉËB •”• P ú†êšj„1)9 º‹+.îzn_ªjª®x]Áå³óÂQ`Íãn·þ5M5ßYW‰@!bÈQžÞžXÞ¾Á¾Ñ Ñ™™¿øð¸éÄú?ܨ"˜¸qÇÍJWO×þyChˆ"´€KþFÕü²|­‹½â}¹¬®Tا¶E[¡¯«;è)««Ò‰KŽC…Ë +j…‡‘×#÷9¤gP)¡­o«ß N;>H 2,ÄË7 4LžB.ˆMŠõüÆóG?ùšmÒÇþüh0vC©äཫ¸…œ[x)´¹¿ºúŸb´÷cüˆù‡I8S~:üÞÃB7tNž:‰£qÙãÖÕêù çq'ŽŠ›n¤GŽ:ñÕ $¬{8›…Âí=vM  4ˆ$uî¹Å7P@EÜÜÝ4éšÛ+·íû—òﮩù68/*¤ÞÁÞ=ŸÝŽüùÓŸ~ö) ]DI„€×·ÖC5¡©˜‘3Ïüó/ÿ’`ŸSaûà@Ì„6ãF‡ Þ…6£MÇ|Õ| C@ºA0wEyi`Cðàf($4q†Ž:Æ þˇÿ,¼€ŒDooDس† …À­ÕÎÚÐÖÖÕ gGõ†‡9Qz;(¾!3Ý.bm Š-)-9wþeçèÐN]c"¶çŒà²o1¶´÷¶ï=e­õ¸ÄpóŠ‹î’×¥¬ÂíBV“­Á.®5ì€ÄtüÇ¿ü—L^Iîb1e¸é0#ãïš8¬í#Ó  >Þx,t·/¸L„×{vDÃ>„¯O~ ¡Ý'†Å%Åž—=1³×îS‡“'O¦g¤ !ÅÕ„™R~ÍC!‡B˜Ü "žX½çÜÏÕ6Õ"ÈËø×ÿÙÿУzëö­Ä¤ÄöŽvѼ¡@4Äi­GLp;­EL¶ûöÅ1"\u͵oVŽ®J“Ž{©#>‚‹Âtä/GÂcÂ_CtL!¡³ŽéÚu;ihk@šÎ*È:{ñ,Öîñ“ÇóKòá),/Ì.ÌÆšóòõÂÞ?ÿ²¸ƒ°‹ÛC¤`a‡£f…ç䙓8Ö7‚.ìò2ÚDû‘q‘¸éÀ*ßÕ‡ÊúÊÙ…Y\º37¼Vs?ZMý[[ô³Eý—¥¨ÿs1òŸ þÓ¾ÿÛLÐÿº”ùãAïßp{¶Úq7´x÷þ]”S(’zúzP-¡fª©­©«¯C)ãèÁQ¨WpƒÔŠbM<…;S4%<ߌŽâj‚Ð*¿æýBüp_‚Ð};d]5„69cûƒQç/Çá‚Ëø7ŸüF¸ï<Ĩ"’yyyñ ñX9¸•ÿã‘?b¡ª˜$‚v„]ÆkÒ!rX]•¦“õÑ'ýú£_o_J¯ tL9¡Õô;ѵé„Ì‹ÕöùŸãžÓÏòÞþÞW¾¹RZSŠe÷Á?ϵØkÈæXߨ¿F_“”ž„µ+´¡Å˜Oy]9Ö7‚¿àÁΛ(›µÐÝïõ¡]·¸çg±‚m7®¬dýËxÚO¾¾péŠÇ©é„ÿv;ñÿèþäßWüçÿ¹ÿè¿_Ho,ð½{÷Ö‘&ZÛ[üéÈÈØÈö„q1ȪØFŸ™ŸA:À¶ðw—G}öÙgµ~þ~Í­Íh àá_þuýEˇÒtum5®±ë ×qízW/.³º¦º]ScŸ DÏd1íù¬=ò»âyìëcp"Îa‘aZHÂï¾ø]nqnCkƒ}œ’‘‚§0ÅÅ•ÅÂJÀ,£Ç|Õ| C°Ú¬‘Q‘-m-È8P²øÄø¬œ,Ì r1ÀÆÒí¥èØè›Ã71ee…ŽQrœÜ ¡äB ã“ãÈV¼âÒâÅÛ‹˜J¾(76øø#bš3ž9{"ñºí ÃHˆ(V*ª*VÖWv=‹–!´ˆáž3‚뿵³ÕØg|Õ”A¾<òå¯~ó«´œ4}»eÖ/þå'NžÀ °x*#/£´ºô⥋ì€ ðãß~ ¶g§]¿kâàù®ñv=VËÀЀ ¥ë cÄØ!“Ú-ê*û÷áw;¦jŠ@á6w-·Vn S æ& \ܹ¢¤ \½³ªðšÇ %–}NQ‚€”’[”‹Lu£âŠŸ„ÑCºÃ2Fж? «=̨"tH_|ù–ëþø‡¿û»¿Ûs=+×£]ÿ½¡*‡ÜU `¾b“b£®Gaˆî¬¨Ð6v4î§ÿíç¿ÅE)óó_þ÷H£‚'1-.’,îµßûÿÞƒ½D‘Ž «Z‹[HÔRB;¸£D±+xß?úô#´¿àÁ6–5öx˜‘Ÿ±«UõUûîN^¾•öSsÂO~yÔ÷Ë“ž#Ñÿe!ö?4ÿèßåü/ÿSç'ÿn&éoGþþÎÝÕ;÷ï ­ÿü?÷ ðÃ¥99½ýA›â’âðká(UQ`O;zpÔ?ûàª÷Uܶ§¤¦LÏN£)€ \6HÂÃC-÷[ú‘¾Ÿºÿè>.3,”]S#€ÐÕ4Ö˜nšö|Öù]ñÄm´s÷Å‘/~ö‹ŸA2±ª(,Ja%/ê*7O·óîç‘wp#oŸw´à8ƒ¯š/aPG6$,$,",($( 0¡Þ5üz}=vHHJHËHƒà9ÆSðá¯> Å\E„ÌÊ…;ŒMŽAÂ1×h¤Aß°¼¶ìØÈ”m* (`ûý‚ˆ°ÐÓgN'&'.ÜZxÝvÆñý…œ_´'þ¾3áã9Í{ó©ÿc"ø÷ÿ:ú_­±? øá²Ç½uÛœÍ`4´´· ƒ cÉd"UפC2ÅÅàèÁ¶çeÏ¶Ž¶æ¶f$eì p{õ6jbá…ÁÕ‹Ë ·fŽS«Ú¦ZóyÏgí‘ßåÄ<¦ç¦cî|l4u4á> J ¾Ý(+@˨°ú³cŸwlì9ƒ{Η}+k+([[Û[‘}„éØÉÒòRWoæ õОqÆhuZT•Õ•Hô;wÀQPhL\Ÿ¹­½*ž˜V[ÛTWèuЀ];Hlg?î®Ch·¢g¯A ÛºÚ:ͯš2€)Ãe%\HO˜#áÒÃLᩤŒ$è®!òÛ×]i®_û’Ø5q;AaÔ³÷@öÁÎ.Ìn_&ºzó€Ùyl@)÷>®¬¦–&Ì#öA ¡¯¸¯ÂCÜ|ôšzkêjp±`ttv å× ã®yad!D wðE•Eˆ›à/«+C‚Ê.ÌÞ¾ 24"€¸§DH7ª‡›7Þ<N‚“wÕ4¤”ÐNLO´t¶8¸Hªªqyc½ÎwÜ üÑÀÕ¿ðþ»í¿WÿŸ~/ð·ý^ÿÝ|å=s3ýìêú²p;yApK~àÃåWo›±­¡¥áUÁپȇúUŸ¦=çëÀ£î5÷b.¾£µ ·D¯Õô·M;+3e¸¶QÛØÞ¸g|âÛºÛºû»•Ÿšfc³¶I IJ(§ÅµÖ¼ÜQu­h샓wwJ ­m¢µ«ÕÙ@jt5Bž]Y[žž™Ÿ™˜ÛfrT`|btl|x`ÐlµM®¬¯T]¸“\½¸Ìt­º=ƒ³}‘7k†TŸ¦½çë@C^^[ÎÌÎôðÿŽ@S¿éõ¦räf@`ÀÎF’S“ѲS†Ch…¯r•n{w{Ï@ ³ÓÙZß\I@Í­úÂ~{Ö¼ÌQ}Ãhì’»óu‡)r€wâ¾îÚIÛ$îµ !q[g­ËëË·×n¿k¬ß[o5¶êÛôm]{g{íŽ ¨>Mœ/;HŽÚí¯Ú+>ÛBÛ³-´ÊO ² $ÁlÙ~kYõ(íƒk­y¹£ú†Ñ¹òÉo?ùÝï÷å¿t¿ì^^[ŽC.]¹TÝP-}Œ¥AáAõ-õW}¯âðƒÊÙ&nýÊ íÌ$R€³u¼¸g¬XsK+Kïkw×p™5¶7¾*8Xýƒ#ƒªOçËêfíö?ËîŸFC£¡ÇÐ;Ø«üÔ ›4´4@p+ z”öÁµÖ¼ÜQ}Ãh\¸t!04°¬¦¬¨¢((,Z Áûì÷ŸÁƒ üÍ*ÈUõUµÛ_‘hTIU Öªð0-;íÌ…3MMš,MEÝö÷ÄaøQ¤–V—b»F_“{#Û—±¸ÄÄí¥¶BB;53eè58A­¾vÊ6ukåÖâòâ»Æêúêöe†ì¼Wp°Äë[ë-£Õ§‰óegûs[MÛ-Þ3>MƦŽÞŽ>KŸ ³ÓcеễfÜ ¨¥}p±5/sTß0=.Æ%Å ÛÐÈ¿ÿ+Væg_|V^Wž•ŸuêÜ©3çÏüáO€?61•®p¢ÊúʯN}U©­LÏM?{ál]SÝ'¿ûÄ?Ä‚ A…-¸{ºÃº^ßxA³_µònâ¾Jm¥„vvª£¯ÃÙÀ:÷âíÅ…[ ï¸zq™á^ÙÙ18Pµ†Ö†›c7UŸ&ΗÛ+ÛBÛÖÕ¶g|¡0•¦›&f§·Cߦ7 šp¤z”öÁÅÖ¼ÌQ}Ãh¸y¸…G…cAV7TGÆE¢ºmïnÿü‹Ï!ºÕõÕ7ÊnhµyEy¿þͯ¡šPSlCu£Ã}}›;š…F2r3Î^<‹F ´EåEPåŠÚŠÖÎÖsÏ¥g§£Ìº… K ýƒýqÛ±gOœnâ¾Jm…„Ö:k5šŒÎ–W]cÝäôäü­ù¹Å¹w ”G¸Ì°â÷ . ]›nh|Hõiâ|ÙYZ^BJB:Û3>--Æ>£yȬÂìôõíÛ’€ª¥}p±5/sTß0ÚúàŸ>ýݧ_ùg®W(„Õ*ÚLNOööó>þÕñ¾÷Ch§__@Hn”Ï»‡¸bhB#™y™ÐÔúæz´ƒ;H¯쬼¬SgOa©C\ùá/¡Áxö‹?~Ý\câ¾Jm¥„vÎÚiît6‚º¦º‰é‰¹¥¹™…™w Ü&ã2CvÞ38¸Û^»CªOçËJyd¤•=ãÓÚµýµPýÃý*ÌŽ©³ÑÐØ7зp{Aõ(탋­y™£ú†Ñ€(^O¾.m¸6…+ôó/?¯ª¯ŠMŒ…|ff ßõOIU ªÕ¸ä8Ô¯hÖÞHf~æ9·s - RètAiðó©ÑÛåoTx¢&«ðì«zât÷}”Úé¹é®þ.gëikÂ:1»0k›·½kà6¹µcû_ºÌ{ÅÇÜ%¼á§ú4q¾ì@hë›ê1/¯Šf­w°W…Ù1w5š ó·æUÒ>¸Øš—9ªo ÷Ë‰»Vàï¿ü}uC5ÒóªgQyÑ7þß ¢…M¡–ýÓ_þÝyº¬ü,øu­ÛßÊÛÄcˉ“'>úä£âŠb<{£ìFHDHiUizNzèµP<ûª@9×Ä}Ÿ›c7•ÚùéžgÓƒ´5>5Ž5gµ¾kl³]GK[W›êÁù’îVç—æä#ÕçbÝýÝÍÍ„¹Å9Õµ®µæåŽêFÊ—]½«Ã/]lhn¨Ó×yûyCV½|¼Pȃ§2r3>úø£Z]íÎC ¨Û€êhF¼-Àæ®Ì¼Ìoü¾1tð,–z|Jüñ¯ŽŸ>w:¯(B®ú¤å„™7ÚÎB€;©›#7±æ¦f¦Þ5¸[ -Â?„¸ïø|mc›BÎÊVgc»0êëšžV?J¯ÆåÖ¼¬Q}Ãh*²ÛÙßcâ*üÅC,ÚÔŒTè®ðб»W³B BSªOÇÁRNhQ×;A{W{³¡yx|xvqVõOj(‹k¬ÛÜÝØÞˆ @õ‰à|I™²IÛ¤¡Ë€á#ã¨>ŽSƒâ£±­±ÿf?.vÕÃõv¬yù¢ª|4S}¼¼¦ƒR=° £œÐÎ,̘nšœ „9«­kûKÈP(Ô7׿;`¼MíM¸ŒÕ'‚ó%iÊZš;š…´¨ú\8‚ŠÚHߦwÚ©qÅ5/_TŽF{w;N‡á¨RåžVHhgfÍ7ÍΉɲ½š{Þ9úûT>çëõ¦ÌâÔS&ƒêQÚ/€.¸æå‹ª+FÙQJhgû‡ú !„wŠ‘I¥„vnqn`d€By§UJh—æG !„wŠÑ)¥„vþÖüͱ›„BÈ;ŘuŒBK!„È…ÒBkµØ±w¢¼º¼©­éU]ÌÉÏéíï=ð…•W•‡†‡†„‡”T”ì³³è¹ÐU)íB! íÒ|DTÄÙóg¿:ùÕ©Ó§°‘™“)t"2&²¨´hÏþA&±g«±õu†õ-úЈPËaa7Jnäå_‹¾°Ï!¢ç h;„BˆE+Zc¯2öï7Éšdlôô÷ Ž ÖÔ׺ ö>uõuÕ6ÔÖéêºL]vñ3YLNü•80(¢»‡{l|l¶&§ §¨l[È+j*ƒíû ñC vhnoFOðð̹3Ø]j6l{„ÝŒ=Fxtͺþ›ý‚gW;Ã--ès}c}¹GõI%„â<¨ðmhx(ŠBa‰röÈŸžÖŽV¿¿+ÞW dI©IP;-$ÛA†.ƒÄ¡Ùè¸h»X ìȆ¦†Kž—<¯xº_r‡LBhO|}âÜ…s—½.{xz@é±ÙbF;þAþpfädìÙT<8,8$,enbJâÎWÅ !„¼ã¨,´Ž$¢öíèC¹ Ñ:uæTTl”—·×>ïãîGy\ö(­,v›º…Rx—@&$'@;{;SÓSQûB•¿>ù5Î&C—‡vP­BqÛŒmy7ò.¸]DtW;~~Ù(ÄQûê[õªO*!„çÁ¹„2†³¬ºÌþ<ÇOÿâ_xûxwöuJ• ´õMõØîèE‘z-êÚÍï $öA›(d±­kÖ¡`{º°¸û@Æú‡ú% Êš—- eUe‚.VÖVbÃþÒnPhžÂÃjm5ªRˆ(ªç¥7à©ÑÖÀƒó¢ÞEMŒúøøWÇ¡ÝÕœ†nCAq ¿¯¿/_:&„bGe¡E¹‰:"—–•† “Å”W˜çvÉ­¤¼DÛ¨Í-ÈÞ£míhmjo‚Cá$L«×¢ÊLJMBmªÉЄ„‡Ü|Q§úøùà)á#K9ù9ÐŲÊ2$:€sAJQRCS¡²™¹™ÌðkáI)I(sQòÚ+Ú]í¤g¥—£‡ÉšdìO¡%„bG¡…UÔTÛaa'OŸüË_ÿrìÄ1l@± µÙùÙP;[aI!D ugGO6 ÑqÑÃRE¬¬©¼úÍÕ n‚„O6¡qœìä»ÍÝ×¢¯¿x~û]á#<~~á‘á8$"2Bx¥º±µ14"ýIHIðöõDtW;alx\öˆŠj64«>©„Bœ5¾jô»ÓC¥ ˆvìµàÎo´ØY ¾n±èøåŽïùp×I…‡ÒÛ!„BÚ¡ñ!œßdã`¼áI¹á¢„¢:Ê íâíÅÑÉÑ7gxbXÊÀvÖ¦`x|øPÎN\ ‰«…BäC9¡]]_]8 ›²M‰Žj`xÀd1ídlrìPÎNs-“²Z!DV”Úµõ5$¾™™™ñññ‰‰‰ÙÙY!¾®G¢Ðö öõôvtw´u¶º #ã#ŽYxnnnjjjlllrr§P$ó¿…6?? aDHì‘Ã(´„ÕQ´¢…R¦¥¥¹¹¹yxxBÛà›„¶ÛÜ_”ïyÅóôÙÓW®^Ñ5ê³°N§‹ˆˆ¸råJxxxNNÎðð°Léþ-6ÜúÔ××ûûû_ºt)((¨½½ý`™ºG¡%„¨Ž‚B»¶ZZZŠÜj0´Z­v8€GÛ „¶¤¢Äã²GN~N‹¡¥²®²±©Ñ1 ×ÖÖ"ÅCÈÐÏŒŒ ™Òý[l---˜ššš‘‘£Ñˆi:˜G¦îQh !ª£œÐ®¬­„††êõz©6›­¤¤uê< É ¢£êê Ê)ÈéìxÕ{´(­PÈ"„ITþ) IDAT \–)ݿŋû•7÷ÈdZBˆê((´«+^^^½½½¨`u:]LLÌ>^Ô“`Ošh­¨¤HtTZš`ZBˆê(*´^^^}}}(UQ¡êtº˜˜QOll¬1¡²©©©qqq7GÄGE¡¥ F¡%„¨Ž‚B»¶ÒÔÔ´ðâOeeeFÔ“––†m‹ÅÅ…  ñSÇ4éF¡%„¨Ž¢ïÑuvvêõz???ªÑhôõõE;###óóóQÑQ B+ȳðÑeÁ¤xM¾£\±egëÏþ -!DuÚõÕ±±±„„777ww÷¬¬¬ééi)žÀÀÀ_ýêW'Ožta™Ù™–QËþ£„¶µµõƒ>¨««³§`)G“ï(WlÙÙú³¿‡BKQ¥¿°Âjµâ©¡¡!›Í&¤EQ Ù684(:*AhgffíÍJô8š|G¹bËÎÖŸý=ZBˆê(*´‹‹‹B*|“ ‰ïÑʹ¸áêZBˆê((´wÖ–ì3VÑQYmÖC9ÍÕMÊj!„YQNh767ž†Iùá÷¥å¥C9ÍÕMÊj!„YQágòž¿°û‹zž¿´ãïÑÒ^Çø{´„ÕQTh777 CDDDlll? )á›áÉÌÌìììœ]˜…–&…–¢:Ê íæÖ¦ÙlöõõÕëõ¥¥¥333R<ÕÕÕSSS‹%11± ¨@tTZš`ZBˆê(øíÖ†F£1(R·¶¶jkk«ªªD=PYáEã§OŸ.--eee¥¤¥ˆŽŠBKŒBKQE? b³ÙP›b‡¾¾¾ÌÌLQ” ÎÍÍùøøœ?ÞÏÏoàæ€è¨(´4Á(´„ÕQThƒƒƒgff677Ÿ333>>>111;;+ün¨`“““pJÚ¿GKq”ÚÕõUÈdZZš›››‡‡Gaa!UŠGȘf³íœ;wnÂ:!:* -M0 -!DuÚµÕÒÒRƒÁ Õj}||°ƒ¨§¥¥éꜜ|êÔ©‰) -MªQh !ª£œÐ®¬­„††êõz©6›­¤¤•«¨'==ÛÅÅÅQQQ½½½çÏŸ§ÐÒ¤…–¢: íꊗ—ÄÒh4êtº˜˜QOlllkk«¯¯/œ£££ZÚk…–¢:Š ­OWWÒßüü¼V«ÅS¢žøøxHïÉ“'¡ÁaaaèbEU…è¨(´4Á(´„ÕQô=Z¨&<6›MøÄ¶¥xPÑV½°ÂÂÂ#GŽ´ZEG%íìì,Šà]–âq4ùŽrÅ–­?û{(´„ÕQThÛÛÛ=<<4Mll¬··÷àà =¾îKÇhêÃ?¬¯¯·· ÅãhòåŠ-;[ö÷Ph !ª£èÿÑÎÍÍ! &%%¡TíííE”â±Ûôô4œœž• ´ék×®ílDŠÇÑä;Ê[v¶þìï¡ÐBTGé/¬xsãVФ…–¢:ZÚÛlZBˆê('´÷Þ?›_œÕÜÂÜᜌæâ&eµBˆ¬ðgòho³ñgò!ª£´ÐÞ¹sglllrrÕ†°³¨gzzÚòÒà\^¥ÐÒ¤…–¢:Ê íæ“Í[·nEGGûûûk4šˆz µžžž‘‘‘)/¬¢¢"*:* -M0 -!DuÚ­ÍÊÊÊìììååe›Í–œœÜÙÙ)Åãíí=11qïÞ½gÏžñ¥cšt£ÐBTG9¡ÝØÜ@©:22‚"õÑ£Gƒ¡  @ŠçêÕ«îîîaaaÅÅÅ&“IÊÇ[(´4Á(´„ÕQThçæææçç×××ÍfsZZš¨'==½¯¯ovvöÎ;xRSW#:* -M0 -!DuÚÈÈȱ±1ìðìÙ3£Ñ˜ŸŸ/êAEkoöéÓ§uuuQ1Q¢£¢ÐÒ£ÐBTGÑ÷hËÊÊàAmº¸¸˜‘‘a0D=·nݺwïÞ“'O–——QòfdgˆŽJÚG¡ö3Kô8š|G¹bËÎÖŸý=ZBˆê(ú©ã¥¥%¬aaaÉÉÉH…¢HlMM 6 ºYYY¹¹¹#ã#¢£„}xÿý÷QÛ;&ÅãhòåŠ-;[ö÷Ph !ª£èÿÑ>þU©Éd@ÍŠ=¥x µCCC}}}SSS>”þ´mdÛõõu{ǤxM¾£\±egëÏþ -!DuøÍP´·Ù(´„ÕqA¡å7CÑ$›”ÕB!²¢œÐÞ½wwí0lfnFtT¶9Û¡œ‹æê&eµBˆ¬ðgòho³ñgò!ª£¨ÐÎÍÍÆ´´´ììl“É„<(Å-))INNFƒæ³è¨(´4Á(´„ÕQNhW×V¡ žžžqqqaaa>>>CCCR<ÃÃÃÁÁÁñññÐÚŒŒŒ’òÑQQhi‚Qh !ª£¨Ð&%%åååY­VT¨(O!œR<¹¹¹±±±“““(v§§§‡G‡EGE¡¥ F¡%„¨ŽrB»²º‚ µ³³Ól6ŒŒÔÕÕ¡H•âñóóËÉÉIKKËÏÏÇS“ÖIÑQQhi‚Qh !ª£¨Ðzyyõõõ¡TššÒét111RyòÄd2eddˆz¡}þüyCCC^^Þ£G¤¤N -M0 -!Du}é855µ«« ª¹µµ¥Õj+++E=ÂKÇ+++hgttTbê´ í®3Kô8š|G¹bËÎÖŸ}<ZBˆê(úa¨žžž€€£Ñ ´Z­RmmmÍÍÍE™+1u B;==}áÂ…ááa{ǤxM¾£\±egëÏþ -!Duý÷ž ½^ CÙ •âyüøqQQÑää¤Ð¸t¡Å!ÇŽ³X,öŽIñ8š|G¹bËÎÖŸý=ZBˆê¨ð…ÂWöìÜ_Ô³óµÁ×zéxW³=Ž&ßQ®Ø²³õg…–¢:*í? E“nZBˆê('´7o†--/‰Žjñö⡜‹æê&eµBˆ¬(ý3yonÒ&FãÏäBTGé~Ÿ™™Ÿ˜˜˜~7TÔ3???==-x¶¿ËBÚ¿ONNŽî0´°à`sssSSScccØ'uÜæêF¡%„¨ŽrB»º¾ ¥LKKsssóðð(,,„¶Iñ˜L¦„„4âïï¯ÑhÌfÑQMZ'/_¾|úôéó/ =qÌÂ:.""âÊ•+ááá999ÃÃÃÊ+MV£ÐBTGA¡][---…X ­Vëãヤxbcc³³³GFFÓ3ÓEG5apww7›Ís/ e±c®­­moo‡´£eô3##Cy% ÉjZBˆê('´+k+¡¡¡z½EªÍf+))Aå*êIOOONNFEÛÝÝÝÖÖ•_(þ3yZÔÄPëý_:†ÍÎ΢mii A­° Ðä6 -!DuÚÕ//¯ÞÞ^£Ñ888¨ÓébbbD=(g»ººPžž8qâØ±c¨q{ͽ¢£‚О>}ƒÙÿ¥cÎ…g=êááa±X–šÜF¡%„¨Ž¢B ™„j.¼ø|“V«ÅS¢žøøx8¡‚===×®]ËÊÉÕž/£¨MMM…r'%%MNNÚs1ªg”Ëááá¯cšë…–¢:оG Õ„Çf³ Ÿx¶OHHHMM ÄJYPPœ :*AhvæÜÙÙÙúúúªªªºº:´„ÊBƒ­VkVVxÏdGGGíŠÞÓs°£\±egëÏþ -!DuÚöövFƒ²ÒÛÛ{ppPŠÒ­-///**†¾Y/:*í… JKK›^ÚqÌãÙÙÙ¹¹¹ÐÝÂÂB???N·gºG—>üðCˆô>žƒåŠ-;[ö÷Ph !ª£èÿÑ¢*EDáˆRµ··wáŲŠzP}B)ñ0''Ç`0@DEG59= ½¶Ã´Z­c·X,Ø„„üíêêÚó“É0ˆ4Z:ó*ÏÁŽrÅ–­?û{(´„ÕQú +ÞÜ$~3Ô¡œ‹æêF¡%„¨…–ö6…–¢:Ê íý‡÷ÅæçEG5·0w8'£¹¸IY-„"+ü™<ÚÛlü™>^Ô“033“““õ­¨¨€ˆŠŽŠBKŒBKQE…ÖËË«¯¯¥êÔÔ”N§‹‰‰õ@\'''µZ-Z‹ˆˆ˜°NˆŽŠBKŒBKQ…vm%$$¤©©iáÅ'žÊÊÊ4¨'--Íd29räÌ™3èÜÉ“'‡EGE¡¥ F¡%„¨Ž¢ïÑuvvêõz???ªDOBBÂìììÄÄDddd¶FtT‚ÐZ,Äö.Kô8š|G¹bËÎÖŸý=ZBˆê((´ë«cccL777ww÷¬¬¬ééi)$͆†$MhmiiiZfšè¨¡mmmýàƒêêêì)XŠÇÑä;Ê[v¶þìï¡ÐBTGé/¬°Z­xjhhÈf³ iQÔ3>>>33#<ݽ9">*AhqÔàà ½Y‰G“ï(WlÙÙú³¿‡BKQE…vqqQH…o²!ñß{å\Üpõ -!DuÚ;kK‡a֫訬6로‹æê&eµBˆ¬('´›ÏÃn¯ÜÕÒòÒ¡œ‹æê&eµBˆ¬¨ð3yÏ_ØÎý÷÷<ßaÿÆß£¥½Žñ÷h !ª£¨Ðnnn †ˆˆˆØØØþþ~¢ž§OŸ¦¤¤x{{ûûû'''·¶¶Î.ÌŠŽŠBKŒBKQå„vskÓl6ûúúêõúÒÒÒ€€€™™QÍfƒÊZ,–……´™žž^US%:* -M0 -!Du|vkC£ÑF”­[[[µµµUUUR<8|qq¥-šÍÉÉIÖ$‹ŽŠBKŒBKQE? ‚ ujj ;ôõõeffJñ¸»»_ºt uíùóçñ×4`…–&…–¢:Š mppðÌÌÌæææ“'OL&SFF†ðÒñÜÜœÁ`€ —W•‹ŽŠBKŒBKQE_:NMMíêêzþüùÖÖ–V«­¬¬”âñññYZZB³^NŸ/:*»Ðîú0³D£Éw”+¶ìlýÙÇC¡%„¨Ž¢†êéé 0PÐÀÀ@«Õ*ꙚšBE;66¶ºº:44–ò£‚ÐNOO_¸paxxØÞ1)G“ï(WlÙÙú³¿‡BKQEÿ½gccC¯×CGÃÂÂP¶>}úTÔƒ*6&&ÆÃÃr›ÐÔÔ4;/õß{&'';f±Xì“âq4ùŽrÅ–­?û{(´„ÕQá +„¯ìÙ¹ÿþžçÏŸ ð…»š•èq4ùŽrÅ–­?ûx(´„ÕQAhßÐøÍP4éF¡%„¨ŽrBûxãñÖaØÒò’è¨o/ʹh®nRV !„ÈŠÒ?“÷æ&ýgòh4þL!Du”þá÷™™™ñññ‰‰‰ÙÙYáwC¥xæçç'''ÇÆÆðwbjBtT¿ÏÍÍÙÂö‚ƒÁ955%ì`ÿmyÚÁl{j&&„íƒÍ²F¡%„¨ŽrB»º¾Š¬š––ææææááQXXˆT+ŃD\__ïïïéÒ¥   ]“NtTZ¥ÕjqÚ 1 ŽYX§ÓEDD\¹r%<<<''gxxX¾Œÿv›ÙlÆ,Ÿ;w÷.›e™:F¡%„¨Ž‚B»¶ZZZ åƒæA}||°ƒ¨§å…ÁSSS322b4õMzÑQMNO¢©«W¯ÖÖÖ Gí)´x¶½½I``ýÌÈÈ)ݿ݆FGG'''Ÿ:u B{°Y–©oZBˆê('´+k+¡¡¡z½å‹Íf+))AM#Å E|­Ô9iŒŠŠÊÊÊšŸŸß?£ðE!‹Dª¥•Léþ-6ÌTqq1¢ÝÛÛ{þüyÄ󳜞ž.S÷(´„ÕQPhWW¼¼¼ŽQ_êtº˜˜)ooïžžž×JÖ ”³­­­ /¤e+ZÛ3 òpôèQáÇøh¯e²¯¯/Â8::*íf÷R2uBKQE…ÖÇǧ««káŇ›´Z-žõÄÇÇttt¼VêDEëçç'5==xíÚ5l¤¦¦"§'%%MNNÚD]ÕÝÝŽÞÊ”îßVÃA2Ož< í Ã^ ~ÝYNHH©‡ZBˆê(ú-T›Í&|ÛR<999YYYV«I¢8:1*:ªÉéÉŒŒ ûQz½B+|¨ªªªª®®í/¼Ð`4ˆ°v†ï™¬q ʵŽuôì(Wly—¡¢­za………GŽÁ-Ëf¹¨¨H¦‘Rh !ª£¨Ð¶··{xxh4”•ÞÞÞƒƒƒR9@AlïÌžžƒåŠ-¿Ê¦§§1݈ágYŽ‘Rh !ª£ôV¼¹Iüf¨C9ÍÕBKQ -ím6 -!Du”ÚûïŠÍ/΋ŽjnaîpNFsq“²Z!DVø3y´·Ùø3y„ÕQZhïܹ#|‰?ª agQÏôô´ÅbgiiééÓ§Zšt£ÐBTG9¡Ý|²yëÖ­èèèàà`FóàÁQ´ÖÓÓ322ÛÉɰ°*¸IDATÉõõõK·Åa”BKŒBKQ…vk³²²2;;{yyÙf³A5;;;¥x|||766¬VkRRRK{‹è¨(´4Á(´„ÕQNh767PªŽŒŒ H}ôè‘Á`(((âÐ.--¡Ù§OŸ¶¶¶¦hRDGE¡¥ F¡%„¨Ž¢B8777??¿¾¾n6›ÓÒÒ¤xìB 3™LQ¢£¢ÐÒ£ÐBTGQ¡ŒŒÃÏž=3ùùù¢ž¼¼<»ÐÂÓÞÞž˜’(:* -M0 -!Du}¶¬¬ ž;wî,..fdd Q”Uxvkk e®F£Ñ7‹ÿð» ´=B7ìf–èq4ùŽrÅ–­?û{(´„ÕQôSÇ(LQ°†……&''#ŠzîÝ»çéé—™™™’’R[[»x{QtT‚Тï¿ÿ>Êb{ǤxM¾£\±egëÏþ -!Duý?ÚçÏŸ///›L¦Ô¬ØSŠgxxI›ÍöäÉéÿG ÙÆëëëöŽIñ8š|G¹bËÎÖŸý=ZBˆêð›¡ho³Qh !ªã‚B»J¡¥I5)«…BdE9¡½{ïîÚaØÌÜŒè¨ls¶C9ÍÕMÊj!„YáÏäÑÞfãÏäBTGQ¡››3iiiÙÙÙ&“ yPÔ3??_XXûÒ*«+EGE¡¥ F¡%„¨ŽrB»º¶ þW',,ÌÇÇghhHÔc±X.\¸››[õÒÚ;ÚEGE¡¥ F¡%„¨Ž¢B›”””——gµZGGG“““KJJD=ÅÅÅîî:)´4Á(´„ÕQNhWVWP¡vvvšÍæ‘‘‘ºººøøx)ž³gÏó¥cÚŒBKQE…ÖËË«¯¯¥êÔÔ”N§‹‰‰‘âáKÇ´…–¢: íÚJHHHSSÓ‹O<•••i4)¾tL;°Qh !ª£è{´ÅÅÅAAAz½ÞÏÏ‚*êill„Ðö÷÷Ï¿4ˆ¨è¨¡µX,±±±Â‡™“âq4ùŽrÅ–­?û{(´„ÕQPh×WÇÆÆÜÜÜ YYYÓÓÓ¢«ÕŠsçι¿´œ¼ÑQ BÛÚÚúÁÔÕÕÙS°£Éw”+¶ìlýÙßC¡%„¨ŽÒ_XáÄSCCC6›MH‹¢ž‘‘‘f²ˆŽJÚ™™™ÁÁA{³=Ž&ßQ®Ø²³õg…–¢:Š íâ⢠ßdCâ{´‡r.n¸ú…–¢: íµ¥Ã0ëŒUtTV›õPÎEsu“²Z!DV”ÚÍg‡a·Wn‹ŽjiyéPÎEsu“²Z!DVTø™¼ç/lçþû{žßn¯Š§NþLM0þ-!DuÚÍÍMƒÁÛßß‚CÔóôéÓ””oooŸ—VXT(:* -M0 -!Du”ÚÍ­M³Ùìëë«×ëKKKfffD=6› *k±X^ë]7 -M0 -!Du|vkC£ÑF”­[[[µµµUUUR<8|qq‘/Ó`ZBˆê(úa¨T¨SSSØ¡¯¯/33SŠÇÝÝýÒ¥K|é˜v£ÐBTGQ¡ ž™™ÙÜÜ|òä‰ÉdÊÈÈâáKÇ´…–¢:оtœššÚÕÕõüùó­­-­V[YY)Ń*úúZ©Ó.´»>Ì,ÑãhòåŠ-;[öñPh !ª£è‡¡zzzŒF#400ÐjµŠz¦¦¦,´ÓÓÓ.\¶+ÅãhòåŠ-;[ö÷Ph !ª£è¿÷lllèõzèhXXÊÖ§OŸŠzž¿2256<1üÖ'O\ £‹N¥Ðy‰‰’]hUÿÐ!ê’WšþñÅÿq<î‡_'¿÷Uâ{ǯÿðˆÛ‡åuåÚ òZüÿíùO×Åÿ®W”ª}¿$•H!!) °Ù7³›=¬Æ`ãÛ`cƒY ö}³!8’öå—*RU‘ªªR¥wÌ ?+&~Ï3}À÷èÄ2wî½s=Œïçžñ˜ =b@K&Ÿ#hÉdv} Ú¦»¢ÐÔΈTy¯5"U‘P lŒ>%d¬N´äsç‹Z÷ñ¿û˜’ÉÞf@'åw|Ão‹àÉܸ%ÐhÉ—Çvwwxl¸¨œœžtì9þ‹áNÍNí¼ØùÜÖÕÍձɱ ­­¹å9ÿ%d²{-H´ü¶@k¶™•]J¸w —é_mP·v¶ÂíªvC¯…`•¶[ëiÒmí¶[OímplPcÔÈ5rS¿É{´èA×£kW¶[-øÑf·éÍúóÚù•ù‘ñ‘ñ©ñíçÛŸ+a¯²ŸæA´Óå:Ž©xniîs%ìUöÓœƒÁƒ8OgžÚ'ì‹«‹Ÿä1ÏhW6W®}­PXX\R\$,ÊÌÉlïlwî9™­¾1%ŸâÇç/Ÿ'à|a_ÌÛ°M(zoò-!“ýû´%¡)-á)Íá¼Ö¯™ÏhƒZ…N‘•—•š‘ÊÏ৤¦t™º°‹È‘ðÒy¼4^JZŠRçfðè#'{ÏÈɨ—ÖŸŠ´šÆšäÔdt•žH{6²Ñ±Ñ7cnbGØEU]•@(à& ³ÚŵÅÒŠÒbQ1&(µNYÕ·„½Ê~šј?{,=¹ù¹%¥%åUåÏæžù–°WÙOsx¦Ñk*WVÕTÕ5Ô!éq9x— ½÷ã= Ïw_ìbí–šžº´¶„“Õ”_˜/•Iñ#¶®m¯µ´µdde ‚J«Â9‡4¬ïÖ Š5u5‘Q‘J­‡Œa!¶ÖKêVð|sgóÁÃßD áòÆ2%kVN–ΨóÁÏ&JËK+ª+°G”ƒÍ8¹óyXªì½ÜþÐy® W¡Vlín1[ÑjݱŽzJÈä3šíahRSø#IxJË×¼öàƒøeeˆ§°°TX,.–¢oG3Œ¬i¨ P3êf”´€h]SØ ^zwh´gÄÙþÑ~µ^Ý7ÜçÙ„| xwj;Aqâ$~’wD> Õtiš[›1‡`2•‰0_ù–hõZä¡3V¨g?̓hô_".A,C¶3šÊŽSKêë0»ž¥r =®9ƒÇ¦Ì,Î Ýa)#i–p9x×ßÚýÝùåyA¡`i} YHÃéÛÝÛ­5hñ2Ì}f°sÈ>$WÉïÆÝ]X]Às¾‘œ‚aáa†P‡øï:ΗXb¬n­ºŽc(zÈÌÎDçsËs ’lÑjbzÂó‚QòÃõ@w¬JÐ'pkŸ´ë :¬(ñËÀÖæ¶f”×IêžÎ>ÅE%EÎ ¼Ç,6 FN %êЇ‚²‰õáÉÍ_óÚ‚ZµA Ðöœàp`l¸Å.< PEå¢SA‹­Þ(…ÁQдMÙ¦ìRúnЉÉÌÍŒ‹-­Â"¿»;× mhjÀŠsÞã™9™žo ææ¯³T¨g?̓hd˜ÔŒÔ­-<Ç÷¸ö±o ÆÀ`þ,•êÙOsÔ$ ±š& ‚ËÁ»¸íÕkWÁ U¨0fÒŵŲÊ2ÌW¾%ìUöÓ<ˆÞtn‹Š1³a†Ä,שîô-a¯²Ÿæ ~ù4,o,#ËéŒ:ЛÁ;_8.ÇË£—Üö~ü}æê+Õ]êêÚjŒ~ec‰çŽÂ.g°æäƒ…Èøßýó»Ù¥Y´míh›Ó2Ó¾ýî[” “Vy+fÕûUMNO¦ðSÐÎW•N…¬ŒŒ†óËóž:nЊN@‹½ƒš¨/ 1 uny˜g.eƒÖžÊÏæŸ “3“è ¼gãm@¾¨>m^Èý²°»Â+÷KÃ5†?ÿ®cY§,-+-=;¹Ç¸§¯Çýmì§ «¤mÒ$^RzV:Åb°¹ÛÚÝÜÞì]m`l ^ZŸŸ:)i)‹á“Ý•W—‰ŠÐ½·šÎs Úéù鲊2÷T bñùÔ·¤o°‰g©ŒjZ½óûY*ŸÚ<èFŒÁ0µbJ¬|\‰©Ì·°G°a>-þbe×ñ·’˜›W¾XùÔæ\Þd5:µ µÒFÌíÜ ~ÿÕþ«ŸñoŸ#ÐâÔñì@}2õ„¹‹ƒÆ«2×ë®ã‰±Él5O#Ô2igùè“Ñ‘¦„¹où“íðø°ûôžsmk ˜¶™Û¦<Æ^¼¯6ƒ¬–~ ºeþB4~ISsS(Áo OehP}"L{7'“¿h´Ñ¹!÷ÄWî…Þ-¹’PÇ h!½Y/“ËÚ”mf›™é_¡UøÞ©4ôdHmP·@#2+J¬ÃVß;‡ûFúЕ´]j´}w‡úÌ÷h{z%2 º:§ Å›}jv khLD›;›§–€²XšŸ±2lŸ°c²:KåS›³aÌr˜ë0C"3œZâ=Q±²Ëk:=Keß.Ï|P_™Ë¹¬~ÝéÆÙÎþ Å]¢ ®á«kª±xaïŒ$“ƒe´·²C€ØÛ¡±…Wâ«ÃæÓ_†ú?-™\®¯ß¾ÆãÑ/Gç´H·²«K?29Xf@{3ë«;Å¡1ùnß/¿B %Ð’/¤‘eAÖ­]÷wv÷w{î.“É—Ö' Íü*¶èJL^(Œhû ï:–@K¾0öþ/óeÝÿz ĺÿC½£-™Ì®ÐFòÿ[[z[óU|–@K¾Pv¾p‚¬;û;H´È²xî:¾ï &Ð’Éì ÕšUŵYºlkZËFžh ´ä â½Ã=€öè—£í½mdY§ËùÓÏ?1w]¼¦DK&³ì[B¯PUªnòÿj¥Qi°Øþ•‘ɱ@E–=8:p?yõµxä"Ñ¢_ôþ-‰D"‘H—XZ‰D"‘XTÐ@ûþýûÃÃÃÕÕU»Ýn0¤R©H$âóù·I$‰DºÄ D`p"JàÐ ´>|xóæÃᘞž¶ÙlF"‘ ët‰D"‘.±€BXH€¸4ío¿ýööí[Äa°zrréàå$‰D"]b…"°8‘%p h Ú?þú믯^½ÚÙÙYZZBw@7br‰D"‘H—X@!€,Ž@$@ \šƒö÷ßÿþ=(}xxˆŽmd»ÝÞG"‘H$Ò%P ‹€# P—€fÀ ýã?„ß½{‡.€kDc‡Ã~çH$‰DºÄ D`p"JàÐ ´þù'øŒÆ5B1úzóæ Ðí"‘H$é (EÀˆ(K@3`Ðþõ×_hD£ýÇÑчÐã;‰D"‘.±€BXH€¸4-‰D"‘H¤àŠ@K"‘H$‹"Ð’H$‰Ä¢´$‰D"±(-‰D"‘H,Š@K"‘H$‹"Ð’H$‰Ä¢´$‰D"±(-‰D"‘H,Š@K"‘H$‹"Ð’H$‰Ä¢´$‰D"±¨iª›L›â>IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/missing-song-elements.png0000644042355400116100000003726311675570700022327 00000000000000‰PNG  IHDR^þý"ú IDATxœíxUe¶þï3ϽÓËu®wæÎŒÎ8*öѱ÷QÀ†£Ž])Šé]B 5$„BHï½·“žÓOšÐÁÊ ŠŽåïÿ—|ÎvsÎ&$H„˜õ>ëáÙÙç+ë[{½ï·¾“œÃ|%øóí€@ ¸!Ò  Ò  pŠ4|ùå—Ÿ}öÙ§Ÿ~zòäÉ'N?~üرcï¿ÿþ; òBaˆ !5Ô†àмÛÒ@7ú3#=zôÀmmm---.@Ð y¡0D†ÎjCphÞmi@TèŒØ0Vkk+C[,–ªªª@Ð y¡0D†ÎjCphÞmi@Q†@ll6ãfddÄ ‚^È …!2t†ÔP‚CónK †L&SnnnbbbDDÄf@Ð y¡0D†ÎjCphÞmi Ø@W(?†CuÂÂÂÖ®]»D ôB@^( ‘¡3¤†Úšw[Ž;ÖÖÖÆá„"±aPW‹KLL¬×Ù”x{{ûûûCdè ©¡6‡æÝ–Î!HPŽ(”"HÎy_¡˜˜ØYØàLœ8u€ÈÐRCmÍ»- ï¼ó%GII  ’ó¾B11±³°‡:€:P;@dè ©¡6‡æ" bb}ÔDÄÄÄ L¤ALLÌÀDÄÄÄ L¤ALLÌÀú®4Øí•u•UõU\¨;¶›ºãlvZuÑÅÑhYm®6;ÌçÖÉîºqÖÆÚ­.ëy\©Ø…f}WR3Sïºû®û?›ËŽ&Gphð]wÝ5pàÀ²Ê²«V¨‹.Ž[=>héò¥çÖÉîºqv†(ø­ñÛ¸á<®TìB³¾+ ) W\qÅ5×\3gþvÂz{ýëc_çÎM7ÝT\^í½Ø»ÆR£ÓÀsëÖßd]â³$*:JÝ?]/íN'…€þ%ïEÞÊà G3ôÓóGýPµwÞuçœys w³.®ôtê䦧cžKø (1e}]î»ÿ¾ç_x¾ÎVWT^ôÈcÜq犊›·lþÚp8¶GnŸ1sƤ)“‚B‚hI_Îì±ã'ŽŸ5{VTLG­µvô˜ÑÜT>+|V®Y9êõQÓߘžž®Ò=%#eꌩ'OŒØ1bÔÏ]ºØT¼`Ñ^Z忊)\:i {ZVÚ´ÓЯ­Û·rÐàÎ<¯yøà¿ÞŸ‰|Vúdçg/ZºhÌØ1aáa6—Íp@Ö5ìÕaÛ"¶M™6eÔèQkÖÔYëfÍ™uõÕWßsÏ=,Y³3®Tߨ3PÜ´8-á‘ᓦN;nlȶu6ñt¬ÞVÏ}ÔyuÀjÆ_¾r9«Pž÷äé Ö§¥áÊ+¯3nÌ#>’˜š´5ˆ‹—‡¼¬¨¨q’„øÐÀ<ôðC÷Þw/LöS~ßsï=´ç<òècBZ8€¬P€¨‹›o¹™W><ð¯ý+_U_UPRðìóÏÞzÛ­Œó÷'þ~ÕÕWÑXï„aßf Ü}Ïݾ~¾V§Us> :äoü gø7<*š=ÿâóT=?ò0wn½õV†Å™;3`ééDÛÝô(79@qŒ‚ýúõ»íöÛPISµÉsÉz?ϸR}cÏ@áöލ8ÜŽþv÷ÝwÚ힎…„…Øìk7¬½å–[îÿÛý=þCék(±µ¾. ìH$îòË'Lœ1Ø?ݤĽýŽÛ!Ϧ M‹—.Þºm«³ÉÉHî.^¶˜-qá’…”n„yêO!7EeE¯¾öêwÜQRQ²~ÓúÛn»Ík¡Wai!¯»î:7i lyò©'ÿûã“&O‚3O<ù„©Æ¤W( œ—¿„–Áá±ãÇB'¤á®»ïŠŽŽMŒ…¢Ï½ðН½öZ þÓ ˆšàº=ôæ›oæNEMNΞ;[íêžKÖûyÆ•j-ÑPÏ@Qƒ¼2ü•AâÈÆ#@Ξyö„ÏбZK-zJ›¸¤8ÕX¤á;³¾. Á[ƒ)ÑÉN¢@ºC]7i ×)›Éo¶PÊZh@_Rüégž†–¤8…7ÍÜCåok°©šÿ¦¿ÞDaOáMº«îé9é·Üz‹›4°£þõæ¿Âêoº‘©™®¬ªLsÃÏ¿ð7Üp?ªýYIºVo¯‡NOØf‘ JvæÓ ø—ÿ’‘“ÁŒ¥¥ôš;®æ¼òÄpÉšq¥úÆžª®¯8pà„Ép›ºfêô©¼Š'†ŽQƒPGLœ2‘C‡j,ÒðY_—†°aìçð±3s2w“Ò”ê2PèrüfkÍÊËâT¼9dóøIã¡[¢a¨äÕ,Ú8ìÀm}àzÎö[¡›4dçgS°Í²ó³çGFGêt¿ó®;ý×ùCžíÛq^( úIÕº†Nd“wJrŽ!oÎySý×sÉúwθRý¢<E!@uCù“W”‡C† á ´:Vk­}ñåÌqŒj‹ ‘†ïÌúº4À˜Ãʼn]¿KkígÝ[o!)a<™9{&Tœ -µ^Ôê8sï}÷‡ªº*Ã%kvÆ•ê{Š›5Tg(]ÿý95 Ènݵ‘Õ¯uÐ…û￟sßÈÑ#)ܦë!ë»ÒÀ ™ýV¤¬ú*X2Oý2R]¸:~wÀŒ‚ ÚïÞÕ Ÿ,W¿{ãŒbíB͢Æ ¦½1óËì¹³©SÖm\çæ’"9T¡êVéÝÀa¦Ã ¦Ví+j+ðA?»~]gPß‹1K+KP5ó\²fg\©[c·@)ãšÁqL[‹¡c¾P«§Ÿyzåê•«V?ùÔ“ˆ#C÷äé Öw¥á;¶Â²BJâ[n¹åšk®¡B1r„:W‹uböF{PHUÏõ×_Ýu×=ØÿÁMA›ÔŸlˆõ´‰4|GÆNÈA:6162:2&!FÞKë¢Q_¤f¦FÅDaiYiòÙïÌDÄÄÄ L¤ALLÌÀDÄÄÄ L¤ALLÌÀDÄÄÄ L¤¡¯˜|ÓAo´óøÔú®4ÔÛêSR”%§'Ûl¥•¥ÚßðôœÙíyEyß9 Sγ.ýÇ5c±güÍŸ§ùÅù„¥ó^]ióXWÜ8'q648\^]žš™êöõúIÏ"˜ÙùÙåUåw9»¤=c¯¾+ ðÇËÛkæ›3Ûÿ\×kî’eKj-µ‹–.ÚµÃÕlüÍH§Ë Ã6§û#WÇg^ù£µ´Á[ƒ;ÿz¨ÎÇÚß¹£ÄT²+n—[3G“ãõ±¯•n@u§²¶Ý1í/¹3zÌhõE2§óçë6&ãï¡:£u¾RáܾØJ» á v>fWãÜÜmWk­µS§O5{–ú‹ÕXÿp‰ª[ <Çwkƒ-^º˜„ìüÛ´ÔsÿúG£Ô5¼sJ/#ë»Ò  –¾úÚ«.Y¸xÙâ¥Ë—Žz}ÔÆÍ-N /Á´7ç¾¹vÃZõWÉš…ùúù’ +V­ /§Í˜¦>&`uYÃ#ÃߘõÆø‰ãW¬®®¯æI$¥%Í™7gÅê¦m^xñ…Í!›§L›2uÆÔÜ¢\‹$`®EKù¯óŸ4eÒ˜qcvÆîT‰ÅD3gÏ U;R|r<#Ó7rW¤~‡ÁyÒ(§ §ýOl[B·gxž–•º=ôî»ï:lè–°-žòï†À ¨äÊÕ+_ü²^P Æ™;.™¤þ|Ó­;mˆ|@é(¾æ/˜O@Ø<Ù'ƒ `LBÌò•ËY uYØŽoþ{dFóYá3qÒÄ3gÄ'Å«d%æÌÅÎYQ[Al‘츤8í{}UÀéµuûVF ŠîË–/£W~I> á&Cј‘§9f줿¬²¬ó8n œ=o6«cÏÐÓ©Þ^¿=b;Ô{±7¼usõëà/^xÛí· 6„µp<ÇÆ),-T“² (ÏŒâ%S¯ð[ñÜ ÏiÇà?òðÓÏ<íµÐ‹¤Ò‡×Ùät{îx•[˜»ÌwÙô7¦oÜ®¾Ø3é»`á gÚwA‘†.JÏž§K¦ò†½:¬´¢”‡9Q1QÛ"¶©Ï&hÙ0rôÈÈèÈ£F°'“a*MÙ·yBä40bäˆØÄØ²ª2ž cn Þ´+v“>òè#«üWedC€%>K”¤È¡CÆM‹È{Ç1aáa™y™Ûvl‹‰áŽzÒPŽŽÕæj·Q D l ôõ[ãWU_żUÜ$]¸X·q]bJ"#ÿã™è¥aðÐÁ,­ý[°B‚à!w<ýQö‘ë¹íŸ‡9)) -€¨xõò—)Œ¡"j¢y µ°ôìtx®¾™fØ+ÃiV^VU]UÄÎÇÐ\úêŸ× Ç!dëžxò‰uÖ‡(xŒëp’G@G˜ÀÓAL×oZO:‰3:‹«;cvNœ<6ê? ÂzY>šË¼«Ú?󪹪 åK/¿„j| òäÍ9or­Mª<ôÌ(bÅ3¢=é÷ÀhÒ½‘` ÒÐ i ʤ,?¶o†£Û$¥ û3±ÆH&ýg{h¬öçùÞóIž½zH®Žo4äYò*ÕúVh¬¾òDMJjªïJSLֲ絯©MŒÚ^Ýa^6 F¦û!¾©­’ôrû ‘^êmõìtŒØÁ¦§ííœî6:ÈàÌÜLÚ@ h¬—†á#†³qAžMž:ÙÓ-ãQ:Ä‚¾°…-ZÒz«7h¬?çÓ±°¬0<*œ œ(ñ#&P¼Tg­›2uʼó˜…^pCÿ¼‚ÈQWùQ ”r²q åçávAI?R2ÀõéõÓÅ™ ´ïÆÍNˆä„é3§£ ®ŽÂU½«†‰Û‰gȶ2‡U¸IƒgF¬ @4éK|žáyýÑkå^ýª þIr #Câã<ó!¦~Á=ˆâ‹4tOØ[TB¨ÉþŒHs“8FÇGëÿ³C›¯{E…k‰›"vÙŠe$9Ärn©ÏRý{ *W<¥ŒG߆s [:ã3NrZ²«ã—6o •Éxý›^zi`.¸ó€i¬ííÜw;dª*ŒÙ‡¾2TÏ üÇy®©Æ'Lšàé62¹ËÆ‹ôy£_Ý~^ðõa?i<~r¦?a¼ÕùMô&Û;eÌiðKíÌ=JYH\ÆäÄl¿Ðû”ç5üUõˆ¨çF<³Ý Í8Ù¡)ŒÆ}¶MJ3ÖHíÐIœÛùÿïOÜ»*–´7.©(! zW= fnÞ²™Ý‚r†Ì™çå. žÅNÎLD¹ÄÔ§“}xQjOi ëp£^C‹=óò„Æ4`Ò³fˆ4tOT¼4iˆŠn¯ú8ˆÖ˜kŠÊ‹ôç^­±Ûµ"û*I>ÎêÜ!¹¡4.¯.g›ÒOê& _ïíº”…9?¦[e{‚šJ8¡@cÎ>ú_Fè¥Á J „óÎð׆Óó6›÷Ýd¥¾«|Õï/x‰íEÏŠW†¿BAD&©‚awå34¶8,¸Ç^¢®aùœ·IM2^ –62!B_((é¿–†¯2‡îµÿΨ¢TÿU´nŠà) üØþÝ\•¥V¬"|b!‰Oçq†¨( OJWÇÙ}¤ * }wOÇØ¨'Lž@P½ÃLOiðÌ(D±jJ}NIú‘QÕ°a´ñ ¯Ûsg(žªZki;†zÍ3IdH}‰11i8ƒ4P3ky ½mÛþÆûëíï“UT§ìByÿìóÏê¥J?Ö{‘7›0»–[÷ö7Õÿ(ÎÿÜG Ô·EQTÿãé ¨@y¶ÖYsfŠ‘çžN¿võ ³"FËÈÎð|^nZw–ÏzçÌ›C]ÀFІ².â@ýÔYœKòqžgD}á& ,™#!§V¡-Ù0‘`/%Òìy³‰ª¤A?©gFÑõaüÉÓ&?ôðCú‘‰um?wœ^·çÎGd¹f …¤zæ!m¨sY˳ÞxlÐc*iIH}]&Òðµ±/éj‡Q׈®zÓ‘(Ç&Æ’¬n¿Ö»]ìx1ñ1l2œîÔKì! [ÔiP›”1©üÕ¨¨MªµQGP64†R9iÁNyI6ëß©V³«U²RK«¯±ruœ„,÷y9E³eeåg1²~øŸ p_ûz·îšÏ”0± ±ÔµÖö_"r“°G©¢CÿŽ©«ã×"lÅŒÃh¼ª_»«ã?Ôbj^Í-ÊÕ³T ‹Û…ÖqX}‚›kõ,ðŸà3c'qæUžA /Û¾~R®s s¿^²ë”%&O!>)žàÓ‹ÕyNê™Q”`P”ñ‰ž~d* ÄŽ›ˆ²[x=ó™W½a˜‡ô%Ú4#ønÙ+Ò &f`(Ö¬]³3v'[®úßFλKç×DÄÄÚEà,Ρà¼ûsÞM¤ALLÌÀDÄÄÄ L¤ALLÌÀú®4X¬V—˜˜X»‰4|£ ;bv$¦'&fˆ‰õmKO ÷üÀ~_•—•ˆ|ñåÿO èÛøòË/S³SõCÕç¥!#ñä''ÿ©Ã‰'θÚO>ùä½÷ÞS×Ä”.ªïñãÇ?ÿüó®Äë, ŸT 8çHËIi8EŠŠŠ¼½½gΜ9nÜ8.BBBÑÎWÛÜÜÍÅ_|a±X–-[æååEßùóççææþë_ÿ:ëÇÓ•I‚ž€Hƒ»4|ٻݎ(¨k–°{÷î´´´ššš?þ˜©222`¦ÕjýðÉTLLLSSº`2™:Ò+ €^t9yò$ÈÌÌÜ·oZóé§ŸæääTVVîÚµ+%%åƒ>0lƒ²TWWçåå}ôÑG---´dÄmR^zÿý÷Q´¤¤$ô‚y 8ãp‡ñÏ}ÊúDÜ¥AÕN§344Tùÿî»ïBÎÒÒRˆZ__ÿÙgŸ¡ þþþÙÙÙÁÁÁ0611qÑ¢Eµµµ¼ºqãF¨Ž u¨T6›î¡Ž= ·GŽTPP@L’““ ÛP¹0xUUb?YYY´d.”K›÷𤸸­Ù±cÇ‘#Gp~òäÉüÈ€ç4[}" g–˜ÉvÍI¡®®.""âøñãéééëÖ­£ÍáÇ­±¾«æG‡ÃÉ)¢¢¢ØÃ©2”Ê@û©S§Re°É32½ ÛÌš5‹î´ùüóÏ) ¸¦.ðññÁ%m.j“ÈÈHºòÉ'2„š—üüüNœ8¡Jà, Òpfi`†[·nåÜ£€?vìlä°°sçN¬—š©^0œk___^âÐ1wî\J ®ÃÂÂÐzyyy©·!TwÃ6 ,PodBûüü|´¦M›†‚h“¢/–:ûP5pÜà%NCç,G}" g–6pvéÏ;Ei@¥@í°ÿþ•+WšÍfÕ˜û Üa{W?ýôÓÔÔTèúñÇ#%ŠzîÐÞÛÛ[íêª{çmÚÚÚ6mÚÔÚÚJ0W­Z¥I8@ƒcôBY”4hÎ g‘†3KáC‡8PTWWs¤OJJ‚Ãõõõ111eeeË–-£:€±k×®å¸Á±_mûìù%Ъ ~4q¡{mm-Û>ƒ{JCçm<ˆ4'''>iÐ&ýàƒ8€àŒÉdbvDD¤Aðí!Ò`, o¿ý6¬Sþs‡>γ9sŸ;¨CEEe|AA‡|~¤ÚW¿,€¨°7´Ô è‚„—hË®®ªúºÍÕI~Dkx íà&‹~ÒÇ#^|Ð ÚëÎ" ÆÒ ôqˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0@o•snfñ’…E æÕ¥&ºš" Á¹E¯”KIAþÁU#E¤A 8·è}Òàl°•ûùV èºõVç 7T Pi0çeåzÌÕ¿¿åg?3ÿøÇ®{ïÍ¿ÿþš¸]" Á9Do“†F{Ñô©µ>ê¸üòúÿüÏúÿú/ûÿX?`@Þ°!N‡Y¤A 8WèeÒP›_ôä Ôÿð‡¶{î±u\¸î¾»x@ÿªa" Á¹Bo’‡­¾pê$ó A¶?üÁüÛß6mÝÚk¾ôRëÅ[û÷ÏþнÆ$Ò œô&i¨MŠ+~äaçÝw›òÇ‹/¾UW×êp8GŽ4ÿøÇοü¥äþû*·¹š" Á·G¯‘‡µ®hê¤ú‡²ýþ÷æßÿ¾iÛ¶Ý­­{vïn‰µöëg½è"ó=÷ ~ÉVY&Ò |{ôi¨Þ¹£ðÁî¼³½dxî¹V—kBKKÃøñæŸýÌyýõÅwÜn X}Ö%Ò hèÒà°Öæ½2Ô6hí7¿¡dh‰‰Ù½{7²ÐÖÖ¼<ë5×X~õ+ë=÷ä zÌVQ*Ò |KôihvV–=ö¨ëöÛëøC爻m¶†††êêêšššÆÆÆ½ÍÍMsçÖÿèGö+¯4Ý}W©ï2W£]¤A ø6èÒ`«*/6ÔöðÃÖ‹.²\yeKbâžÝ»£££Ÿ|òÉÇ|çÎûöík+)±Ýtg ëm·å=þ˜9/K¤A ø6¸à¥¡ÉQ¹5¸lÀÇ 7˜úSçøñ»].AAA¿ýíoýë_oÚ´ iØ×ÚÚìåeþÅ/løCÙm·–.[ìtZD‚³Æ…. ¶êòü_°=ø€õ׿¶ôë×’šÚ¶§ý-†íÛ·_rÉ%¿ùÍoBCC÷w`oI‰ýŽ;ë7æÜ¯97S¤A 8k\ØÒÐì,_µ¢ì\7ÜPÿ“Ÿ¸&MÚÓÚŠ.ìÝ»—Åe—]ö»ßýŽÅA`ùÙÏlwܱ»°PÓ…ýû÷ßxãEEE_ëÂáÃGŽ9d·»{¬þ?ÿÓzå•ùwÝY%Ò œ.Pipº¬eË—V>ø ýòËÍ¿üeãÂ…mo½¥é°ÙlÓ§OŸ8q"š.‡·mÞlùÍo,¿úUÅ5׎m7W‹4ÝÅ* æüìÜý÷ÞkùùÏm·Ü²ÇdÒëÂìvû¦M›6lØàt:5]x»GÜü£Yÿ|YÎ_n¨Ž iº‹ Qœ ¶Â©“«ôw\v™ùç?oZ¾|o[›^<pÑEý÷ÿ·¿¿¿^˜ëÝwÞÙ¿k—õ·¿µüâÕW_óìÓKm¥aGìŽÊºÊªº*1±¾l° "6â‚“†ÚÄØ‚GvÞw;¿ýþû÷TVºé@.¾øâ_ÿú×~~~§èBÞÙ½»yÈöw.¹¤à/7TlÞØ•Ï\9›eÕeÅÅbbb¥U¥¯88ŸÒà°×NžX7p@û÷µüò—-ëÖíÛ½ÛM:äp8V­Zµ|ùr.Ütá=ðRS­ÿ÷æŸü¤¦_¿ÜŸ·Užåg®ÄÄÄ4;oÒàlrTÅí*0ÀqûíæÿØñøãm55û;J½.þ78JxêÂûï¿ÿÁ¼¿oß[£FÕÿð‡–ÿýß‚«¯6mX{vŸ¹ÓìüHƒ½Ñ^]U–=öõšûî³ýþ÷õ?ýiãÌ™{Íæ½Vë>›m¿ÝŽp8°ƒNç!—ëpCv¤±ñhSövsó;XKË»o½õ^k+¶/ Àò?ÿƒÄTýñY>bùßò"&&æ:/ÒÀ9¿ÖZF ÏnIDAT›Ÿ™’zï=Îûî³üìgõ?øù¢‹,øÃ7vÉ%ʬإ—b¶³\|qû·NÿàÖßý.íŠË«r2Î{dÅÄzµip49*j+2Sy¸þþûn¿½áæ›þúW×M7¹n¼Ñõ—¿¸n¸ÁuýõÎk¯m·«¯v^u•£_?Ç•W:®¸ÂqùåŽ?ÿÙ~Ùeö?ýÉþÇ?Ú/½Ô~É%¶?üÒÃö»ß¡ T É·ßVž›áù¶Š˜˜X×íüT ÕõÕ¹ùÙ ~¾‰÷Ý›výõv]Úu×¥]{mêµ×¤^sMêÕW§^}UêUW¥öë—ÚïÊ”+±+R®¸"åòËS.ÿsÊŸÿœrÙe)—ý)ùOJF °K/ÅR.½4é–[²V.¯®19Ïô{ 5•u•šUÕWÑÅâ´Ølçý©hšf¼ª3ú»Ê«Ë)¾Î8}õ¡èÊ/ tÑ ·žCcöjsµÕi=ݤgÌz{}YÕN»ê¹w×Û³ëÕ‰Ÿ÷VEME^Avjtdâ¶ø­Á±!›¿Å‡'†…¤FlËKޝ¨,ëJJåå½6òµ¡¯ }èá‡^þê¸ ã¿Õ~ÑqÑ=‘gga©™©>+|ÈB_?_Ïì_¹zå®3ýG^ôšöÆ´2Ý;/]Yà„Ðí¡iYiglæ·Æ×l Ý2bÔˆÈ]‘§›ô,‚©žiç]ºÒæ\õêÄÎÛo((ø9öjSµ©¤¢¤Äô­¬´¢”]”b„1»~” ¥©ÆôÊðWÕká’…þëüɉÅËÇ%ÅÙ;~Ó‘™›°>€ÑïÞL›Kƒì‚ìðÈp6‡‚’‚¤´¤s 9½|årº > ) ùÅùª ;FTLtu$[·qÏ5&!Æêúf¢ïüóYÑ–°-ôÊ/ÉG#HJº—?÷Âs£ÇŒ^¸Þs@ R­Ý¸v{ÄöÁCÓX“nܲ-„‹Ê‹\Í.ÏÒfGÔ.x4L½Êi‡ó,÷ˆX`p  ÏŽfšf±»"U0ÍJÉH!2ñIñ;cw2]zv:?.bKˆÜ„g ³Ä'ÇÇÄÇù¸Ä8BG`ÃÂÖú, aR#,ñY‚ÿ¤ Ý·nßÊ}ºDìŒØ°xé7.+/‹øÕÍ!›Ý*, ޱêö ´¸ô®ª 2ð¡ÃG gQúgŠK,YMªŠôÛ´1xk0S݋ʊ6m Ü8eÚÕÆÕQAÌœ=óégžf(ºëëOZõÜUÂDFGòÄwìÜ¡‚Fªãäò˃B‚ªêª¸Sk©Ýºm+ÑÀ·y æ}¤AQ&(<ÈooŒs…%´|õµWµã½Ø{ðÁÄ}통ìð¿´²&<é]±»l®¯Ó:§0gÁ¢d'© Jçä°."ʘ0AŸDoúÓQ½—‡¼üƬ7 ŠŠ¼rÙâÇõ›Öó#JWc©aL?4Ò‚ñàø‘².´ruÀjÖ¥ºÃyüáΜùsúè¯Bna.º¹mÇ6XG D½«_kGqf^ëŸé3ßàY¨I•‡<\Ä‹í„gMÑŽ!ˆ ù€¢1µ& л}u#GìŒÙI)§/RâöÜiŒ‡<˜Ïê¸É&¬ˆŽ&MÀ7Ú0#s­Y»æùžŸ;î÷Gλ¹I‰œãt2ŒÇ`û¯õgçaW!éÙ*UKRŸÌãM1•½…𖽚̀llJäÙaCÐŽÉS'C òÄbS"QÜD¦Í˜–˜šXXZèY5è¥-Š¢8¬mYž’Od*{c>õ§N©/œ5{¹‹¡\Pȳ»ÆÉ%Ë–ÔÛê‰F{EëØ-ÉN"CB(~ÔFV§h–›û‹/›Ú™‡qoÉ]¨ÅVŒ²°éi‚ÂǺèøhâ†FP¹Ð^E^scä葨*zG •40{v~vEmÝ¿féâ…(&¯"mª;"…肊=õô)A€TðMjßœó&uæªÞ152×nÏÔMX21AU jÅÂ7êœa ½& .]EàÞDÝލ6tçá!Ó¶\ª¬­$£H'bèåí…²ã?¾qÁ>ADzPØšô™Ì;†R§Å#ÔêR–ä7a¢m¸ I e¹ßr6+„œf°bÑ’E »`áž·ç€ì•an º3Ä΃ÊxvW#s(@)T-ÆÊuʈҵW. æMœ<‘U•]ŒÀZ=>H1g[Ä6LÜFþ˜ƒ™zÂ|Š ö€Åæù Û;Ü`¥lÚS¦OAQüá 1uúTê,´L«hLI¢ph캆A RP¡#cÆÀš«šé¥Áó™ê=d?2tÈ\¯¹,Ý‚ú‘бϫ SJƒ[x98¸µ¡j?q¼zá&ò4æPF/ˆ—˜‘6cÇmW´&'åÃ÷ê@qÞÍSÔƒÔ2ƒ„ƒì0˜ÙnÖŸYÐèñæÜ77o¢¼g7fd‚ýª¼ªý2†;ì*¯x–¨Cû#ô"}a>âÂþy:i 1×Èù‘r” ‚Ã?Ý=„üa;Âø‘­éÙçžu«Èrv*4hö¼Ùl˜žÝU8T#´$ó8J»lV,A!SáóØqcÙ·µ‘™]€äø¥Á/iÌQ¯BTœQ‹µ8¾ùš_-Ξª; §Àac\æ»L½Í†x1/eŠæÆRý€ù,騯Ÿyö}%½úÕÈQ#Ù‡õ®z:æöLÝ&åèAIOÑ„«ê߬ü,\åš=ŸF?2ÕÏ´ý#ðº=w¶–\UWÅt8Ì\,MÄT˜J!à}‰F{é±ÒGª†ïTÈu<-BÀ«'’ÇüäSOò€)YŸxê 67zQé!꜒’’——רØxcýá‡&%%ñï2ŽöîÝ›““ãyÿË/¿äñ™L&·ûjçÎÇŽóìR^^ÞÚÚÚõ) DÜ¥& HÃöíÛ öíÛ§–­ª ¹gÏòþã?VKCGø‘ßÿý–––|þùç¼tòäIZÒý“O>Qq°Ùl‘‘‘tyûí·Õwß}÷ĉ_|ñÅÁƒ™eÿþýª/ÿ2ÎîÝ»ÿi©˜‚¹VãüóŸÿtëÅK´innæ_VÁ ¢&Â&åN[[Û¡C‡Þzë­O?ý”—>ûì3F`.È¿uëV–ÉB–;ô¢ÍbcckkkivôèQ֨ƧåÒ¥K¹ãfyï½÷èN@§ÓúU‡Ü )ÿú׿”{GŽaÜ£ñG}Ä«Lc´ÁOš„ϵš'Õ\‚‚Hƒ»4üë³mܸ ‹-Úµk×ÚµkW¯^}üøqÒ‘M;›6mÊÊÊ"›wìØAIÖ¯_Ï}.`i]UUÙWkjjHkr:11±¨¨b‡……©ÈDDDÐ †ÓkCêëë!| #Ý©v`Ò¤I4NHH€9jdBß ^A<"¼mÛ¶-[¶@Nz-\¸Ñ˜ˆ—˜”;cÇŽÅÏ   eË–1¯Z­VVÊyóæ…„„ÀçuëÖùûû3ljj*nðÁkÖ¬áßùóçóìh]髤Á3,j]L:~üxnª°(i #ºÃì„ô«Žêß q˜6m÷zc-ÄßÇÇÇb±àê@D!&&<Çlè Òà. l\8  y HDooo8PXX˜ŸŸÏÙÓ`{mH_¸Aú²år'88¸²²’%gffªÿVÚ°yRÐFi;'@YhÜÔÔ´xñbØŸ™j¥¥¥A ®‘•ºº:|˜>}: ØfÙŸÕ8n½ppŒî¥¥¥LJ/ÜÖ¤I¹3a„êêj¥\Ü¡R‚{lò,Šñѳٌç oÑZ"=Ügj‰ w”4x†E­‹IqEÀmîЀ;eMËFàˆDƒ9sæ øóq‰ ÐŒaýüü(j²³³iƼ7‘Ç“sG;DN•†ôDÒ”ÄUûªc[S ®®¨¨àGrde]´a]Ü!SUcÅ ²ŸØ-X°rò/ûŠ It½4ЋưÂÆg#%ãgϞͭúªÂÁËËK•ßÚ8n½ÀŠ+Ô2GEEé¥Án·#ÜÞªWn0½`5Í8=ц²ŸŸÙ¹FÚÔ ¬šÔGŒC_BAÑAËN¢„€Í_v´;Ë—/G_(1`¸–!FÐVÒƒ¹ð‡y ¬ùãY C£F¢;"HEÿ´¤Á9HÁé!ÒpŠ4D'ES ³QõïlþJ' °”— ìbÇæô®µq»Pé«(÷EØÿÉx†‚°î«ŽC>•¶êÅ1.Pzk. ºêKä@dzû-Žñuò¡ïU^^®¤Á­Ž@† }™(##CsŒšc /ÑÒRá3,ÇFæyB´ªátaÑVú•NV®\É¡€©Ùùµ A¡ ÊÚøúúÒÆápP¶p‚`F¦àÄKÄ“Å"œ/ôE‡ ' ÒpŠ4o †`êÝ;Oi ÀV§ÎöF«œ¿òÓ(ûé’žž—à³Rn’ú ÂãÆS§NõÑÑÑt‡™l‰HÜÈÍÍ¥½FiõŽ dzWqq1ŽÑ‹jœÚq¡F `¡,‡KÊSØç±¡âܹsi£Ž3 Ïñƒ>8cX´)´°hwð— ?‚‚2>#08å“Â| DqV­ZÅáPáU%s“þ‚ÓC¤áiHLOTÌùªC´%h×\¨ßÛyÞ7ìuºÑÔ nÃj»2Q{©Ú\/J»£ «oCÀÉât^u1,ݽpsÌm ‚žƒHÃ©Ò  y–Õ«Wwññ ¾iiè*Ô;£çÛ Áw‘‘À" Ò Ÿ¡ÐãtŸ¡|¿!Òà. òŠN>CqäÈÖˆÛŒ†njaÁ‚À«ÊÏ;Z ˆöÑ @pÔ œVp  È{gW8Ït!*Pª 2l·3]ÐMˆ4¸Kƒ|†âtŸ¡ðòò"Ë—/g¥\¨°@ÝÜÜ\Ü‹‹‹ƒÌxây‡@Íš5‹©q¯¢¢‚ø¨ žÌ~ìØ1´˜H’*x•žž^ZZJTƒƒƒñ“q¸“™™©z1 wä]ž†Hƒ»4Èg(N÷ Fƒ·Ô æ# *,4àárÏñœ•zÞ!PœÝž¹«"@9ÀrX r̼ø íív;Íp‡ñIBqñg×sÊDN•ù Åé?CÁ\0V]¨—TX׌3Ôb}||˜Åó+å&ƒ3E‡–F*ÎÅÅÅ+W®D2P^*–.Ä“©}}}§NŠ"ÐŒÚD"… ¿$Bpn!ÒpŠ4Èg(¾:ýg(TBÎÔ!‹˜sðá)è?š%è!ˆ4œ" òŠN>Cq:i`,–5Z,æ=yò¤ç¤3£©ƒŒz{•û ÂMòŒÜ ñ¤I“$<¤ ¡fT êÄ‘œD Ï)Æi8Eä3|†BÁó‚°ÐŒ.¬W…Åóƒ¯ï"êoŸP«wß}—–dÈ{ï½G¢¾ É#>,66lP.m³ÙpUÿ AÏA¤áiÏP¨;žŸ¡8ãbõózÞ¡®QoXt}@ùÅù…HÃ©Ò  Ù3àŒS[[{¾½t" " ß>úè#9ô.ˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤A¤A 0€HƒHƒ@`‘‘À" " DDˆ4ˆ4ii Ò Ò @¤áiˆNŠ>xäàᣇÅÄú²:r(.5N¤ák³7ÙÓóÒS²SÄÄÄÒrÓl 6‘11±3›Hƒ˜˜˜‰4ˆ‰‰˜Hƒ˜˜˜‰4ˆ‰‰˜Hƒ˜˜˜‰4ˆ‰‰˜Hƒ˜Ø¹4g³s49z…)o "Ò &vάÞ^_PšŸ–“ššÒ+,=7­ØTdqZ<×"Ò &vnÌâ°dæg› ìVW³½W˜ÍeÎ-ÊÊ/É•¿†ë)3Õ˜òг[÷7í?º{ÿÑ=½ÂöÙÝÒÖž›Rk©q[ŽHƒ˜Ø¹±’Ê’’ŠÂo·µnù–¶çÐ7öíGëÜ¿»?-'¹ª¾Êm9" bbçÆJ*‹;¤aÏžCÍgg»6·hÊ­®]ž½pkæ‚Ì…!eVóYØ;$Ò &Ö£¦¤ÓDëÁÆnÛÆÆ6—¥ÙÞ°ÇžY²fWY`ríÚ„ºÙAù¦ê³°Ëvð½iÙ" bb=fHCqEÁÞ#­ohè®9w;"³K6ÅçÖ5Y·eûE•. /Ÿjš¾!7­¼JµiØcKH‹ñ_¿*0dCVaZó>'7+Í¥‰é±ªAË~WQE^Nq]ŸšPªHƒ˜XÏY»4˜ ö~ fvÝ`x}£54­dÉö‚ÅaYéåk£s½B fzo+_R^^I³†Ý¶uþ3fM[¿9`W|DèŽ`¡©Íž’•°`ñ¼öqö: ËsCÖ™r[ö9»îÀ£" bb=iJÚµ4ïutÑ÷ØK͵ëã ý¢«¶ç6®ˆ*_²­pɶŸíEâ* êv‡¦Öd˜*i™š°bµOYuë-KÓ{yM‘Ÿ¿oIe^rf¼×¢yhDIeþæ è×]wÛdwjv’Hƒ˜XOÒPdÊßs°rvÑÒÊL¾ùË¢jצ4mÉnÙYÜšXÞš]³§ÔÚÖ¼ïæ}ooI®Ê0UÐ2`ãªð[v[UGGK½ïªe‰i1I±óÎÉ/Í¢vHÏMêúÔší;Ò*Ò &ÖƒÖ. åù­öX»b®ÝÖ ñ¹³‚ò}ã>q +\þIΠ gd~CrY£¥åí­CA‰¦œÊ ¯X½lkx³Õ¬úÚ[êûxG'F$¤Ç¼>nçÿ ~›·nà~g׬íÐ[" bb=hHCayç|gk}WÌÑZ_f©Ü”·`[é’]6ŸXçšû†dkh¦}W¾#¯¦%¥Ô±)¾ ÜZEã-Û}W/­sV¨¾Õ¶²Å˽S²ãâSw }upniFYmß’ä¬8û[u]t@eNŠHƒ˜XÏ™’Jt{KmÍÖRSå¨Üž‘¿ ¬`ELý‚­ù+#s¢óÖÅæ&ä‡gäU—YšjhYX‘½h™WTÜö*kI¥¥8692`Ó*S]alJÔ¯YŒƒ%eÆ,öYPZ“Çu×} ÌIÉJië)C Êr)Ñ-MUݲ*‡)&/v`Ê›ãÓKò kŠŠj‹KÍ¥•v“¹±Rk–‘ŸDá0õIoÌž°É¯À”Å͸ÔÞKç©u.S`èú[ô½Îh-û\" bb=hÒãl5×5˜ºn5Ž2“¹° "{{ršð¨Äœ„ŒÂ¤œÒÔÂʬ²ú‚jG)mÊë v%…ïLØ´iëºÀÐuaQÁ;ÃcR"iSZ›§Vi+.«Ëï–M{ÉY " bb=eHC~i%z³¬ËVÚNæú|„ «$%%7>%7.-?낊ŒÒÚÜJ[m²Š“ßœ?cÖ¼én6ñìâêœîLg` {lÉ™" bb=fHC^I¶µ©ºÊ^Ü-ƒÿÖB“¹ ¬>¯Ãò¹æ÷»;ÔY˜«Õ"Ò &ÖƒVZYš[œÉßd-èEfmªAªÍ" bb=cÕæê´œä²ÚBKSµ­ý·¼5ך«Š*rÓrRäÿ¼ë)³7Ú‹+ŠR³“’2â{eÆ£ ¦ÚrG“Ãm9" bbçÌP‡:[çöÞbœ#¨CQ茴Px0V[[bã½ Cdè ©¡6‡æÝ–†/¿ü’nˆ ý90бcÇñ@Ð y¡0D†ÎjCphÞmi‘@`‘@`‘@`‘@`‘@`‘@`‘@`‘@`‘@`‘@`‘@`€ÿP¡^àTýZ IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/signal-analysis.png0000644042355400116100000002117111675570700021165 00000000000000‰PNG  IHDRéàiZÖ| IDATxœítTç•ÇídSOœdíôx“ì:ñ&YŸdsNrRw8dÇ”`bÓ›°PdIHB¨êõÞËH3šfF#** ¢ƒe&fwÿâ™7ã÷f@óÞC÷úùÍ×Þýî÷{÷»OÀ7ý ‰4å1¡ !™£»$Rb—Dªò1vïܹsûöí[·nݸqczzúúõëW¯^½|ùò’ùÐÆ@xu`‚C»ÙE7ôÇ@qjjj|||tttpp°‡„d~t1Þ@ØàÐnvA=:ãiÀXCCCZ¯×«T* Éüèc ¼:°Á¡Ýìy°!ð4 ŒÛØØXQQ‘OB2?ºÀHo ì@ph7»È9ºñ` …BQ[[[XX˜žžKB2?ºÀHo ì@ph7»×φÃc‘””tèС`’ùÐÆ@xu`‚C»ÙÅgäãx0hÞÓHIçA]¿ÿ@xu`‚C»ÙEªœø# A0Ç3!ø IU]uWœ/Ho ì@ph7»xËCÐÆÛb8r„tÁgHú¨ê¢»|}Axu`‚Cb—T¼êPvÆ¶Ž¶úÖúº–:RÒÙ+˜‘käÝÝ‚±+Sʪ«ÔzµÆ Y°*o—+µJÁÍ–.ÈQh‚±¾/<· ·o¨o!ëþèýä{Ð3Ð#SÉjeµ‚±—Ý{ª·¶±öÀáК†ÁÓ&+œ–™Æ\kôš”Œ¤RÌG¾[fS"Ee SÈŽ'9ÓØÚÈøÁÚ”ƒ÷gåg™"»íúöˆý‡ß9—ÙÒÖ"¸+Y6­A»/zßë«^ïîŸIãÔ:5Ç-³)|:âµV}$æHBRf$k“Y›ò¡£‡¢G'¤$˜"»xŒ‚CƒaSgOgÔÁ¨¢²"Á]éøeÃEfN&–dÕ«vf8n™M‰àÓy' ÖÆÆÇêºušNÍžÀ=yEyÖ¦¬ÒªšM¥5¥æƒÀniei`H ³`aaY'³Š;¤¢,»X0ì˜kÖ­a\QRQÂqËlJŸÎ:É+æUVUfmÊ]}]­êÖê¦jóA`·¸¼Ø?П) AøÜ•‚,TÙ¡dÙEŒá¸e6%‚OçÁ€é‰wbßA¶6e vkš>–â Ànyu9Ì“£‘ða§Ü•B-›9»ˆ:·Ì¦Dðé< e]S²^¥Fià †>ƒL%«¬¯4Dv›Z›BÃC›ÍŠvrI¿/?Ȳõ|œÝÆ–FŽ[fS"øtÄ †^CN^".ÞɘäÁê”åÍUõUÙÙæƒÀ®Þ¨‰‹qÛáæâîŸßiìÜ•Ž_6æ¯ No91ìbÇä¸e6%‚OçAœÐÐÒ°âµÐ ›6lÚ¼©¢¦ÂÚ”]Ý]7;m>–pÌ|a~¿ ƒäjy«ª‚ûQec®lzÙ*¾[fS"Eeã.".bêŒ*šÔ¬MËjÊÊëỀݙ?&™õ$1·Ü‚\»ü¢ïÖŸH>ÁþÂ^{%¥&i:5sX6»ºÌÁ ŽtcœPYW)üïwíb· ¤Àw¯]“4O"çµÖxãæˆó½lsp‚Ã\ç0'dçgûìñ1/!v%°lÄn±+Ñe#v{ÄÌn\B\qy±] PÓPƒ7P»iYPHÅ|ÎZ/4 mÓ´ÙµlÖ¦c{Ù¢lôr˜lôšƒÄË®µÉØX6kU6ØC•íµ±VecmæP5'<\ÿÌÍ ×?Ä.±Kì»ÄîBc737³÷Tï¼.±ûÐý# vóe708ðXü1]·®³§“£~~‰©‰üòÜ‚\oo~¹ªeË›kÞÔvkJ•Ψ[¿q}]s¿‹*kÓ™[Õœðpý37'õï|çG?ú.øµŸýìgŸ{}ík‡ýÊW¾ò“Ÿüm,Ö¢ãÓO?MöHžÏ}îs^‚±ëºÃõ1+òéOúûßÿþg>ó~Õã?Ž)Á‰¸à×~ò“Ÿ„§¾øÅ/Zì÷»ßÅÌ-ÞŸ|òI²G*ö8½å$FvñŒ~ûÛ߯O‹SúÒ—¾ôÕ¯~Õš/¾þõ¯#œ[ë7¾ñ ´±X‹ŽHöˆÓ‘²‹mâg?ûL·è‹o}ë[?øÁ,úÏ(¶'kááË_þòüc‹.†üð‡?üæ7¿IöHÅ‘²K{"ÙC9ÃÇDZ{"ÙC9ƒI¤µ'’=”3˜:JkO${(g0‰´öD²‡r“HkO${(g0u”ÖžHöPÎ`ií‰då &‘ÖžHöPÎ`ê(­=‘졜Á$ÒÚÉÊL"­=‘졜ÁÔQZ{"ÙC9ƒI¤µ'’=”3˜DZ{"ÙC9ƒ©£´öD²‡r“HkO${(g0‰´öD²‡rSGií‰dxs†]ž»`&Ìüëgó <Á˜LçWÁMð ¶\ð»£O96)‹#ã9†ÑÆâM±y¡#Ù#{„d÷Øñcxª~õ«_a×à\`§X¼xñïÿ{‹U¿øÅ/~÷»ßñ«˜‹çŸþ·¿ý­Åª_|ñ•W^±vSdíÙæ¼M0vÝvºa_øÄ'>ñø]1¿ÀS… Y¿ ÂìAL!§;žHL ϱőŸxâ‰ï}ï{hcñ¦ÌžHöHÅ‘æ»ôMöÜב²KïÑdÏ}í)»ôMöÜב²K{"Ùs_{DÊ.í‰dÏ}í)»´'’=”3|L¤µ'’=”3˜DZ{"ÙC9ƒ©£´öD²‡r“HkO${(g0‰´öD²‡rSGií‰då &‘ÖžHöPÎ`ií‰då ¦ŽÒÚÉÊL"­=‘졜Á$ÒÚÉÊL¥µ'’=”3˜DZ{"ÙC9ƒI¤µ'’=¢ÎØùp.Ì÷ N•ùÄïÎîAGæìAœ6æ{"Ù#~{„d×s·ç??ùÏ[̳ÿþ,~Z¬}ú_žþ×ûWø‘_õÔSO=óÌ3;bzæûÏ ÅZt„‹É©Øã¾Ë]0vÕ:u½¬ž”tnªÒªc—”ô!*±K*U%vI¥ªÄ.©T•Ø%•ª»¤RUb—TªJì’JU‰]R©*±K*Uu4»Ýý݆>ƒ¡—ôãÚg€gÈ?÷õ`ìêúZYmY]YY-éÇ´¤¦¤ª©J©U’løGgÔ ÆnZVZqeqßpßÀÈ€´¸¬¸YÞ,¸P•yCä¡Hò5ÿU%§' Æn@p@öÉì¾S}¸6µ]Z¶ ûB»®Š k%]aOZf.tÝ:e‡’Qæv¸;G[Õ­62þqüÝÅïŸì¼lŸ=>æ%g7/»o¨à–T–¸ít3öQÞÕו˜šèìâ¼Ýuû‰äH-ø%ó·6=Á{ƒWþmåšukÖ®_[VU昻s´µý.»yÙˆ1Ž¿»øý“/v1ÿ={V¬\Á$àMò¦ Ð º¦ºVUkøþðÊÚJ~Éü­M[{[`H`EM–Äš=X–ÝfE³ãï.~ÿˆ…ÝʺÊÂ’ÂÕkW3¾(¯.Ç“çñx_ô¾“…'ù%ó·6Xƒ-N[vzì ­m¬Åsw޲ìVÔV8þîâ÷Xزxš±1ì—ûúø ÉÌÉä—ÌßÚ`=¼}¼‹ÊŠJ*JŽÄiQ¶8æîeÙ…Ž¿»øý#vq¬ŸeNÁ®_@Ã"Øõã”ÌßÚôÜý­jÏÝ´;2:2¿8ß1wç(Ënie©ãï.~ÿˆ”ݪºª½{ñ2‹m(êPk~Éü­M³¼ùxâqm—ïQ£°0޹;GYv«ë«wñûG¤ì" OLI„§> WÉù%ó·6°$bD\B\JFÊј£mš6ÇÜ£,»JÒñw¿DÄ.žZ¸ƒÉ™ŒýÆŠêŠýöGFEâ5ÎbÉü­ .ZŽ;zðÈA¼A;ìîeÙŵãï.~ÿˆˆ]¾v:”ùŠrÔÚ[Õs7EÃCrßµƒ=,»sðÏÜL}ÿ °ñ§óaxÙÅ”Üw¹·*[-Ú­Ö©·»mçÿm ÛUP¼÷ 3›ÃÚ8ÞÛìÚ°gΦ>ˆöEíËÉËy¸®³m¨Ùݸy#ö&‹v›'dz¯‚”øîñÃÚ8Þžû²kÍž9›ú þ™×Ù¶‡Ø%v‰Ýf™M]Sµ k ZY›ÌÚ„[”-íúvk¾¨o®gS1Ž/875_Áíá°;{{ø¬ÌÙó*Ûþá°;g{Ì«lÛ#"v1‡uÖ±sàL¸°´ÐÏßÏ+!iYi«0Φ-›šÍ}Á¹©ùn‡ÝÙÛÃgenöpªlû‡Ãîœí1¯²m¸ØåøÔ|Âü56oÌñé£1ŸÝYŽÃgenöØ5‡]ŒCìŠwb—Ø•ê8Ä®ØÙMIOa~k­ÔÌÌoL&³aÓæm˜9˜ÊiŒqR3S-VItø¤EÕ²ÉiÓüéš³=vc^å€qà“¬“YB²{8æpHxHæÉLù”™Ìþãœ;Šyœ~÷ì™6§Äàçþí;˜§Êã<ûïÏžH9!»6¾çgËã?öëÿxìÆÇ.?öݯ mXE¤ßQEBìÞWˆ]1 ÅÝÙ±+F!vg#Ä®H…ؽ¯»bŠ»³bWŒBìÎFˆ]‘ ±{_!vÅ(wg#Ä®…Ø»"b÷¾"$»))¸=©EÝèt^ãtFáäå)¼1âÔÄÔDÁØ%%}ˆJì’JU‰]R©*±K*U%vI¥ªÄ.©T•Ø%•ª»¤RUb—TªJì’JU‰]R©*±K*U%vI¥ªÄ®”ù¾…©Ä®T‹§íÒÊÕòfEs“¢iA)¦ÜªjÅô­LìŠZu]ºeËàðà¹óç¦.L-(Å”‡F‡|‰]‰)â "îÀðÀ­n^›¾2qatìüðQLöÚôånß>= |-†^bW¼Šþyvêìµw/WÊs “Kdi D‹š’+ä9—®¿xùb“¼Éâ÷»âU°‹´[çØÔpAcÒà˜qtrp話ž¢¦ü¼tù±+=eØEÜ=}v°¨9ux¢Ai©,½ÿ´A¼q×ö/A¸²ì"!a9‡Æû>Ò±™Ÿ‚ã5¯Z"Kïí#»†^C|b¼«»«ù7Î=zšœ–\QSñ ìNNMŽL6¥ÖFyíñÄc]ºGöžé1¡,A=5Þ;pÚșũ±ÞþQ#~âºX–Ö;ÚyáÒѱ[TVôêÒW÷F앵ɪª[«ë«»úº´mU]UMC û}Þ†Žªú*Ô‚òv}»ùW(²ßŠÈé…µMµøXXZˆ^Ì7s eEmEƒ¬mp»®Þ.v|ŒÃ†öpVYUY«²U¦—·´µ#¸oN¥•¥P…Z1óí&ÊŒ4kkõF=c§fËUr‹öh»´˜x]sL2ÿnG.»ç&‡'û ›’±¢%U{‚|{‡ ¸8clj«Shš+êKÊk‹µFÕàXÚHEûFºòJrªÊúG»™p¬Ôµfä¦vt«ð±¸9µwD'Fv>ðüïŸ÷ñó)()xuÉ«!û¢÷)5Êô¬ôà½Á!a!Ù€ Ÿïäï¾ÓýåW^NËJ3ÿ Eæ[;{:9½Ðfñ+‹wyîòðôظycyM9@‰MˆÝ¸ÇÛ×m<½=Ë«Ë{î~ÕhRjŒa²ü\½vµÛN7·n›·nFwwggU‡ £ïnßÝNo9íØµC­S®üÛÊ;üüR3R±“X(¹k!ßžNcç±ãÇ<¼<0æ’¥KÌ¿ÛÑ»}…ÉXÚ’Ê‚=¾]Ê ›Öõ w­Y÷æ[.N»ý¼ðÓ?Øo`t&ŒIEñ&$ǹít-­.êéF‰B# ñ ÐÚð±¸)µgXwá¢øØe¿g ËW,¯¬­‚ˆsGbŽ 2ÕËêcâbp‘rµ –,[’–™fþ\Ì·s! sz¡Í_Wüñczùx¡ aXd˜J«‚#ÐþDò‰½!¸{»®#f³¸Àª„¤´YùúJà….(AÄELEÅÓèWý}L  Ø´eÄe[{›…’»òí©x Ñ óZ¶|™Åï•fØ8; ´ !iðtOqeþž@,íº kz‡ `7":ÌÐßÑÜV¿fýjD2´‘Âò£q‡oV^zym‰_€_ o›¶e&—8ÝSÔ”jÖž¿x^Ôì®^³šÙaÅÒeKùP…ŸÌåGtD4E,ä°‹åG ¿Ú È1_£ÌÐSRQ‚Ⱥ›þv×í(· ×k·û…ËÀeæ @Šùr¯úæzöê¹³r³"£"Ýw¹ÿqÑQ‚‘°Û¶8mîK›9öÀHÿ@”`âлãgÇ‘ ä7$bo-ªÈó Ø­î”¯Ý°ÚxJ¿aóúê¦ò¾Ñ.¦¤g¸m$¤°\ß×~øØÁ7×¼ýÊÇß»¥½…L-¶šîSš© S¢f—ý¢C6À…ÇG&)D¼Œ>îèìØ¶}Ãóq†ÃÛ^o£„ßËü+æV*ë*÷ØÏ~% A¨ŽŒŽDÐÍÉË1Ç…!•‘”–„ izCKÃo¾Á°‹XŽPŠüaó–ÍH‹-–˜ÛÌÚ›Ã÷…ÃfM§Iˆ vÇ&ÇúOwŸ¬;Ñ;b((Ëõ ðVê[e»µ·¬oVÖ£œ)é>¥Ãµ´Ï›¾·=öDLpxPk{#>²UØj ƒêsÎIƒ]ìȇß9\R^‚—ªCGa§ÆKLÌñ¬}rz2¢Öy'¡1ëd’H”ð{ñó ¼09v N¤œ8Yx可þŽè«hW̆]d#H3°Åã9yá/ QÙNN~²U__ðÊ/aÙåØƒYGŒÊ/ÎÇ#ÁÌË»g&Î`!sk㻇ty¥Ù»ý½ÚæÕëÞÔ÷·oؼ®QQƒr¦Ä0Рۻ€…Rm¯ZÕÙÊ1;¯>Qׯšœš»€ï=Xö‚Y- ù¶÷ÛHRÒSðBƒB$£Zž»=×®_‹5FŠw5\ŽÝ~»¿;xä s# ‹6˜»æ¸a°£´¦0êpd›®ÅË×C׫öñ÷’©êQΔ€fÜÙ¯A¡Ôõdm‚¶·mâÜD£¼Q\ìö˜ýÁçO(fþâf?¯ä.L|b~cÅùûœ^Gö#Þÿ‚Bƒø¿|åw4¿0¿ïÌwáf¤š›Á/±v¸‹ØŒ§¨AÖàíëô×»£c£]§:²ªc¦®O­íSéúÕÚ^>â'®gÊï•°€æÔÄkzäH÷ÅÈ®½ŠToKe(¼xyxz åÕwë¢=³·PÕ¡ ‹svqFœ>~â8ûËl>»#gF:Ú3+Ê¥ÙÕqêî¤û»x­a~ñà ,°é[û‹¡s¶Ç. ; ˆ»0ƒI¬±;|zA(µüˆÒ k7*ˆªºZÒ+ÞÁO¤û» MvOžê1fVÅߌʘŒÊc @cÒÊdVÆvŸêÝ»élØE`Æ«äðØp×€^¡olÕÕ·h€êêåúFÀÇ+J«’þî¹Y¬MÖÕۅ̉ï‚Òá3ÃÝ}ÝÍmÍH®,:‡Øµ2ÿÖÑû&Ò¾¥˜r‹²àÒ¿µ”°2¿›[€JÿÆôÑTb—TªJì’JU‰] ¨à+ ¨Ä®TÕHg:Ñ™NU:Ó‰Ît’¤ïéôÁíþwAÊíܦ3$©Æ{g:ÝYÀ"ÆóHgÃ.s¦Ó‡w>\ rçC:ÓI’j¼w.Î?>üvϨ˜ø#w±®í: çq}–xïöÆã7ýþô›7FFGöG튎š˜œ`›‰îL§ˆýX<Ä›²ª2K¬è_^ý ¢T›¦Í?ÈŸ WœcšÌejik±x$˜æƒ€‘ÁˆŒKˆ[³v b Ù6 »/½ü6tÄ{@yôØQÛgLY4ì¾åüÖÁ#™ÃöБ?AÜ´£³ÃÇÏ…xS1 º¿ò—WÒ³ÓÑeæH3ÃXv'ÎN ˆbi¡­ÆÅÅ¥³«³ÛØ=4<4yvrÛ[ÛÁÖ­[Ç¿tåàvrrBcÊš9ù9¸pßåŽá#‚¸©Z«F!ó/“OžD8G÷7V¿¦9Æ›³;~vqtúÆ4,†G„owÙw<LOŽ;msºzý*Jô=¢[â·ÇÏÐm@‰V§Ý´yJ°ÀƒCƒ)©)@m î;Ü‘Q0# £ïOÍ”´Ä—¿¿ñ÷аPXˆB¶&.¾3fV«…Íû).°ábi~™2s3ùÇ4qeB÷µë×rŽÕá÷ÄÁ¿`ÇymåkH^1BjFjPHí3¦øf0¡È°¿±õϴÛ nŠ\™ók‘9pŒ·ÈîØäØõ÷®3zmú^Ýtº°ˆ°äÔäÓã§à¥«—\\]qÑ€)¹|írôÁhNsõÝ«È)×oX϶ÉÎÍFByñÊE´b@vpAL]œ‚UäÛ#º3òŠò°‰WÔTYŠeûà @ ²°[U_Å?¦‰s(@%` Û:»üüãžfÃî¢?-Â$aoÄÞ”ôÛgLqÌ`s¤ªØô1øÌ‘m2þqS<™€Ñ0wbß™ »g&ÎÁ+ׯ@ûOõ'¥$©;ÔGcŽFˆÆ»ž —/ îöö÷¢S4± #žµw´ûúù¾þ·×Ù6(IMOýõõé™éç&˜‘…UWLóÊ5n9&.º3°G‡ï ÇÛ Þ¢äj9– ['öt¼K,8 Œ¼cš8‡2ƒ¨ƒQ›·nÎ-Èe„â÷ĦĿ`ÙEVˆ¦ØøX¤ ¶Ï˜â˜Á4F!sðn «§9do ¬ýý·»mÇ»&úšß‹cË.Bé¥k—.^½E ÎÈÊØ±sÇÎ];UÕèØhÈÞÄ-¤‰§Ѐ)9é¾>1Çb¶lݶA+*)ÂÞ)e­²©KSÌÈâTlb<ÓÉxï|$v¯çÿ}M#ÿp'³C™˜z8§6ñŽ{²qÁnúÌÓb±ÁlÌàÏÈâGÛåïËœétáÊ…ó—ÏCÚ¹‹çÎ^8 Å5ó‘ýÉ6ÀÏêºêEËÐèb šÚ\œBw@Ì|¹ŠýL'ĶàPaþô¡i†E×®Æ{g:±¼ÎRZ*Ô4IDAT'ÏO–V”"Ùå±+to¨²]iWwñ(&.ö3 ½ö$ÏÇÌŸ&© v‡OƒÅñ©q;ôÜøèøhw_·¾[ß;Ø;vv̾î¢Ñ‰© :ÓI’j¼w¦Óع±3gÏ,@ÅÄéL'IªñÞ™N#ã#££ P1q:ÓIªJg:Ñ™NRU#éDg:IZt¦±Kú()±K*U%vI¥ªÄ.©T•Ø%•ª»¤RÕygãbôE$$ó#Ä.‰T塱{ùòåÁÁA•JUQQ‘žž~èÐ!ggçU$$ó#  Œ4ðêÀ‡v³{õêÕÑÑQ½^ߨØXXX˜””tàÀ íJB2?ºÀHo ì@ph7»×¯_GÐþµµµˆáÏD0 Éüèc ¼:°Á¡ÝìNOOOMM  …Báð4 ˜Ç’Ì€.0ÒÀ¨{ ÚÍî7j|äÏÂ8²|’ùÐÆ@xu`‚C»Ù½uëÂ5Þò0žpäWFB2?ºÀHo ì@ph7»·oßòè öº1g< =$$ó#  Œ4ðêÀ‡v³{çÎtõèœá#^ !™]` ¤7Pö@ 8´›] ±K"U!vI¤*Ä.‰T…Ø%‘ª»$Rb—DªBì’HUˆ]© ±K"U!vI¤*Ä.‰Tåÿâã=!¯J]²IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/machine-preferences.png0000644042355400116100000000763411675570700022002 00000000000000‰PNG  IHDRÛQÔÊD©cIDATxœí÷S[g†÷¯Úý-mM6»)k;ÅIlcÇ‚+½ƒ1$:‹fz± ˆ&!¨èÅ6.¸`B˜µ½žq²¸»Å&rsÃ|gÞa®>ÝïèêÞGï9º úQ„9ÅŸ¶úDˆøI"EÈ+‘"ä?!òùóçÏž={úôéãÇ×ÖÖVWWWVV–——ï‹áIÀ äÀÁDÁtyL$Ó˜O"2.---...,,LOOÛEˆð$`ràŠ` ¢à º<&–™ ãäš%µÕjµX,z"< ˜ø"X‚(¸‚.‰dˆ&ŒŒŒW§Ó©ÕêZ"< ˜ø"X‚(¸‚.‰¤êc³pM"“ÉÔÞÞ^___ZZš#B„'3?PKWÐå1‘X+8c¶ÐM:`W©T …"Z„Of ~ – ® Ëc"YÑÒ`¹0îÀ1OQXQ($´©Tå*ežÒw=ÂÃÃSSSáŠ` ¢à º<&’bOÕjúŒ×Az¹jljÌÎj[Hè¥-ª,Ú³ÞÞÞ@ ?PKWÐå1‘¬‰0XÖJø-Ýö ‘[þV…þ¹ rÇz%N ?PKWÐ%ˆz}D ÉK‚H!yI¹e´u5eõÅÅÕ—¶«šµMZƒV£×¸‹qcŸþÆgÆ‘²ÞÒ‘èçšä»]•Qjè1ôôºËÜgnëhëꜛDÊBW[êübŽN.Œ¬|ÿ`[êÑ÷š5ê»÷î®®­ºë»ï¿›š™Òti¦¦‘²P½º:à±¥å[kÿþÎ:eš4þJÍÝÿ%—êu†¶S{çÞG«–W—?x êíý‘oþJ¥•ýøã¿Z¯yûîí‡Þ{p¯ÇÒsæì™àÐàaÛðý‡÷œ¿>¿m‰´Mغ-Ý¿yZÎŽÁlØôÛ¦>kŸ¶K;h¤+bchtÈS"FÿõLÚg™ûú—êõÖYÅç®#û"Þ»#±ïÿ'ÛÒÃcq°ÛÉäd'‘·îܺ÷ðc\BÜÕ†«ÕµÕI)IÃcÃ÷—ïÏ]ŸÛ¶Dv;OøœøÍÓÂ֡ǬcÖ—ì3l‹ ;î}¼±¥1(4ˆ vO‰©îჵ¹s Am,?÷wŸ¤{l×ø;û^i³²¸)U"’}ò¯\¸¦/n0”œWù(+CåF¤¦S³x{‘V²¥­¥ÓйxgñÆ­­í­:½néþÒìül›®MFDêMúð³~g ¬£ÖûHYUYH˜c$÷bîÀÈ×8>)þ|Üy~VÔTDÆDFDG°v3÷›£ÎG¥¥§…G†WÕUñtݺCG‘£ÊÎËrŒŒðTíÕÚSgN‡7µ6ñg³ò²x]e¦Ò2h±¯ûëåÊË¡¡ª/ÊHzVúÅ‹¼ÜÕ¦«{¾Üó$ÌÈÎè·öCgbJ"™Ù­ËØÅqòðÏùó>¯}G•6šz{ÉO†kM×ÈOژؘœ‹9¼é%6Sp¢Z›ç“øñ71•JpÔÅcUš\×\3§.¦Í\øDdze¨¢"øÈ…÷#ò4›*rëbdH$ÞZºµxw‘ŸNñðö½Û3ó3ò"2)5) 8 #¢"(vZ½–KÈ准ý^û¹®…%…}òQþ¥ü“§O~ñåyy쟜– o¼ùFPHscãbÕmj‰H‰¿KE—ê®Õå]ÊkjiÃGGAQLàg¾§|?ßó9Á±Cs{3™ëêù`TÖT’䨉c¼I:»;ß{ÿ=¿?Æ!Ý€rïþ½’kò9ç®EÓ²k÷.Ž–ýwº› @/¯*/,-¬¹ZÃ,Ó<`þà(2×Ô×$š7™SÝmmi³Ô”¨ÓN§îÞùVVM¤a¨Ùu(Cs*+CœDžHø'Eœñ3iŸjzërëÏËÈë‹×±Æ›wnnPNÏMË‹HPãÚç«òuÇèÃp2U±ê³/>Ãä Ò?Пҙ[‹qÙ†._ŠŽ†¿»w¶j[¹ºÙùÙ™9™‘¸Qhx(žš¢Hágl|,#d¯Šê º=^¿LU¦2‡£Ââ© Ž×2%!9ÂxÊû[ïš+5ÏBÛ•Æ+lƒlXDØF"ÎI#Ìbƒ0y.$\ '¦Ž—C䞯ö{/ªÚ‰%g3«Ã¿Mþ$"ïpÁµªs|Ñ)ª°ëˆä” ŧDþß;ßN+„ÔŒª0I³8{}Ö]s7æ&¦'äEdÿp?¶.´_¦^•..1’Ò³Ó±1‰È¨˜(öd#ú|ôÿ6։ܻo/ørô`Í…—ˆ„†#ÇŽ`f˜E¿dJ‡¡#æB .›‘“ §ÏžÆY™Hé÷:èE „iJÑå¢ÑÉQ_:n©„$iÍ„½º ©çN$9½xqTŽœ9¸&DRÍqèùMÌi¹}8öo-=UÞ ˆ~gÈ„à"½"ß ÊÜ—W‹_Êpe‘S³SãÓãö)ûMÌLŒMŒÉ‹Hb%+yôдk”}Ǿýû$"áÏ ¢+‘~ô!U’kÃa“Nä!U’žþ8` }'ÛÐóÕÞ¯GñHzP> ˜1‹!|7'?§º¾’8£ÅacÉ©”ˆü×®9ZRûHiE)mØ}½÷kê2Oñq¹݉„ׄ¤ŒŸÃÀIË‘HO½ˆH`¢#¾S)»*ÛsXA§”ù'_öw‘(t%’õuXî7ÙµQ'SvÊó·?œFŒ¹Ãq†z9!/@g³ÛäE$Piï:H/HI…Å#YÜìxwÇˉ|û·Ïœ;ƒ2‚}dcs#ÅbýK¥æ\P41ÚàÐ`8cý„Y‚&¯—´œ ¦£ÂFE°î‘<ÒIäûÿô¹ÓtÚV>6ŒPÓ1u¦Ð¡r îD’·ÆaHýå~S"ýÒ¿,kÍ(V§²”Ž+:y0ú³Š/ÊÛ²\G܉Œ+ôž6×ê “á’º/;"uû¤ã×ÅeÅ)Ê”.S—¦KŸ/­;‡Ç†åE$JE ŒãjeIy ^ºŠ8–T=7l8ªöþ½Ì‚9:TUiáLNÞ??%øhVÖVÒ€:öœ²SµYSS¸Ù_*£œçëb¢RƒHi_¿Ÿ¶ /;’ܱ®7èX<±ÃŒÕíj9ZÇ'~Â&uœLÄ&Ù&'ë’p$Χ~–HjôéÔO¡%ö¡óï®Wä·Î¤}æ:ò¿ßø$~ñµ´Í†Ô>¢äË~rì#ušÑ‰Q®µB‘©`Y‰#°èäârŠ(Pò"ò•åtÄW˜‹«±¸þ 敵á;©/t®W6Ýp¶’Î Vm>ê4<ý#ý}Ã}z³^™¥d‘jì3òpÀ6Àç›ÉˆÞñÕæbÉR³¸år¹´¼XÑ–UÞšù+¥Rÿ>\½z@$^h²HêèAÒvŸµ>g›¹=t¥¥ÆÿüÑ›wgÿóìÉvU«¶•Òl4» (©Ý +îý‘‹4ÝmA±¾űªZ…ªV¹-•W’e0,ƒwõô÷´h[L}¦©ù)A¤,ÄŠ§­«9·H™~1i»ª®±F«×þ¬:ô–Ëäܤ¸‡\.âJp=¨Y4RÛU¼»½AÆqÇ 8 "…d'A¤¼$ˆ’—‘²—atj”µÎO45ºå¶%§B¹ù9zùÐãüù ²MÚ̃æc‡Æ q•Þ¢·MØ&f'¶ü ¼æ³-ˆ|™:»;•™Ê—ì0hôòEŠt·‘§êî5õ›n/Ý^^YvêᣇãÓã$œ¹>ó 9ÿ¸Dn¢ÞÁÞú†zûúŸò_.®ª­² X\wpÞûSs¥¦ËØÕ¦ksžÙÖŽÖá±á>kŸtïˆt˰»ŒýFÛ¸í‡6~%½öï5½Y?wsnËOÂë” r5¶4úžò¶ûœôñ ô ¹pGtîà$òèñ£E¥E!Ò÷æºn]xd¸Þ¤/-wÜX™”–TXRèü#WûŒ££îçôÉ“'9s~ËOÂë” rIDZǬ^¼ò/åK_6¸v–®D6·7GDG@ž—‘‘™“©íÒ‚cSkO¥g¥ÿìŸ) "]%ˆÜD‘œ¦ÒŠÒCG:{Šú«éÒdçe£†æW"©Úìæà×ÔÖÀ\´k÷®c'Ž÷>îý­w‹¦Åý%‘®Dn"‰HûúýÅ”ã¬Ü,ðb01%Ñ;n ²o¨ï„ωÈèÈÀàÀ¡Ñ!L1>)‹•néýÙeû‹ˆ|üä± R¹Q‘TaøS«2s3|sÀõo¸6ÉÞùÉÎOJÊJìëw°S»Ë*Ë*k+ããY¹¿„qÀHB÷®¶º¶j°ænˆ• ÒE0”žÎiR·©Ã£Â¡¶\­#ŒKŒÃÿR•©Ò2ÜÜoŽKˆƒTi‡öÎöȘÈà°àŠš ×%‘Sý¶~SŸiz~úÆ­N]_¼Ž³²ÚpCë¶— Ršrt è*𚟿!D¾nÏŒƒÝäÜäFÍ:ît¿_k{K)$/ "…ä%A¤¼$ˆ’—‘Bò’ RH^z}DŠÿ+ôKôšˆTä)x™âÊb!¡— N”ùÊßHò’}‡ž„ R„¼â7#ryyyzzÚb±¨ÕêÒÒR…Bîíí½G„Of ~ – ® Ëc"WVV¬V«N§«¯¯W©T©©©¤ö!“€È(‚%ˆ‚+èò˜ÈÕÕÕÅÅE ¨ÛÛÛñ[’Bz´žÌ@ü@,A\A—ÇD®­­---ÍÎÎŽŒŒ˜L&ÒÁ8Æ›#B„'3?PKWÐå1‘?¦Øƒ3UŸDÐåÒÔŠáIÀ äÀÁDÁtyLäÓ§O±VÖD¤€kÌ–€¼z"< ˜ø"X‚(¸‚.‰|öì 3¢±YrѸ]„Of ~ – ® Ëc"Ÿ?Î4Xf>UŸD¬Èx_„Of ~ – ®ÜÿDns"EˆØòDŠW"EÈ+‘"ä‚Hò A¤y… R„¼B)B^!ˆ!¯DŠW"EÈ+‘"äÿÍÊ| Ì/†IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/recording-settings.png0000644042355400116100000002654111675570700021707 00000000000000‰PNG  IHDR¥ó•J IDATxœíglYvïmðG†áõ·µwmÀ€¿x×»k†÷y<ãõ<{gFÒ(xg”s–F¢˜)RÌ9çœsìfn²sÎ97sÎ9ˆ’ö½«´½&‰´4RsîÁDõ©{oWUŸ_sÉæ­?øĈ;ýÁû>bÄÜÕ<ĈÐ<ĈоÏ‹/666Ö××WWW—––æææfff&‰;¤†ðF#Ôð{?û†ÝÐaÄñññ¡¡¡¾¾>›Íf$FìÂAŽPGÀ#ìü@ ì`‡ÎÀc9 ­V«% —±Cjo9B°Gð€°oxÀàÃÀQ«Õb\‹ÕÚÚZGŒØ!5„7‚¡Ž€GØ#ø@Ø7<(û¼€  … £¡¡¡´´4“±Cjo9B°Gð€°ox°@R@Äpಠ  )))„±Cjo9B°Gð€°oxæææ0yB ˆD1¨Ñf$":”º÷Òêx„=‚„}ÃjeøC!ˆt(ßû½#}õÒnß¾ ~êx„=‚„}Ã399‰´Åår‘ÅP"©½÷3$"zGú—~êx„=‚Ñ®"ðP"¢ŠÀóJ«ˆh‹ŒVÏë¤6¨RGÈa ÙDD”¸"®L-Ó™užÝÉÑ«ybž­Ç695953EDäÔôÔðè°D!‘¨$‹À³³Ä ±Þ¤_{º¶°<Û?fë1}ÏÕ;bŸzº±>15ü£3íœ|[kÒxv_Êwô9&gGËÚReZÒ ýd›¦wÄÚ7b#ú^©gØÂWw0e´µõ5–€EàÙž^ÇøÌp`Òƒó·ÎýæúñSW¿¾Wâ~Õ/ùrpú½àÔ‰© ñ ‰Pdtôõ»·M=Úw÷울¤hk¿á½‡Î÷A¸Î–>ýf}ÐuýÅzV»¨feÕmáá‹ùgÏŸBR¥”•|djYcscem%WÄÅËÂ’Âpç)uʦ–¦ÚÆÚĔʸxTzZ‚%±\ìzÙÜÑŒfÈi›á™xvñ–Ç•àhŸÀÏÇž‘^^ÁQ¾/åpþÖiެ—ÒZôŽZ{½Ê(µ 5fysgc[7½¬¦~ƒ]mîÓuqÛð~M….¦^-SÐYÓXÑÁjÁ^Ýœ¶Šº’š¦ Œ`êÕÕ7W[ –~üØ«øxI½#Ñ[>2|.%•…:«ÒåTeù%¹¸òØé˜í¢êåÕe7† ‡NÕlT%&UIs rbâc£ÂAÖ¨-./ öñó9~âxt\4ºÔÓê#¢# œütÄ…øìóÏÂ"ÃR3R]¿tÂÓc™x{öAäé„Rß„R¿ßÉ—z™øRá9ß$>Feerhk›*£ã#bâ#‹+ Ô&y;³ùÓÿûŸÞ~ƒý¯^¿\G«âKÙ×n\ñ ðöò}TX–géÕ7µÖ%¤ÄFÄ„ú=öi念ׯ?ÿß< }|ëÎôìdx.^>Á춨¸ðà°@4Ö˜xG¢·®–NÚ½w³ó3t¥­ß¨6Ê’Ò<¼2yØ+Ò2Û„ÕË+î ÏÇ|îü¹sœ*(vþkxˆŒŽ”kä¥$84˜ÁbPðeBÿÇþ½nÞ¾ x@ ò­•ÖÑÝ‘[‹Œ„ ñÕ×_q„œÍ—ðØzlÃý±gR+›åÙ ’”qJ½(¥Š›PÃO¬Ç¶8¥A’JæÅæù!­Ë4¸䘶.z§-+/½¹Ã™s¾9¦©­><:ätó:¨ÊM¨ínT--/¹1<›Ë6µA gYUYDT„Áb@Ýå÷ØÞF§àwîÝÑ4H8ñIñÀ†'â8yâòÕËW®]¹zíjEM.Äõ×]› kup¼×#ötR¹_1+$»Ó'³Ý+¶ún@ÆÅÐÂë©tìNï†_;%*Çå[Ôõ剣W®]ºzã2„úªµ‹vëÞ ½]…½Iéñ©YIj“,&1òòµ‹!\ Si”Þ¸}MiPÕZÀ_…AræÜ×”Ý=}=àoz›ê¡×7x ª´#zw2öhÛê®ßºvìø±»î´³šQZS»F ¿raiÁá¹xùâ–ß›aÒ’’ž‚óÑ5žH,~5äSÿ‚S!•gª=‹ƒ@‹L'LÍN*­.lh­‰NˆhcÑiõwÜÆ.(>%ɇ'eFĆÖ4U„E µEVXž›[’Eg4†E‡¤d&H4ü3çO«Í2tAwïðœ»xFe–aä¼’¬ªÆ²¨øp‰F@ Kôޤµ)$ZήÜìä(ÚhܲمYw…¥&÷[œ` 0øúûB˜Æ HC.Ê-Ì¥¸ŠMˆõòõŠˆŽ(.+†S à°`0–“ŸƒŒ„yQL|ÌvxÌv³cÐx%ò/>éäzÔœñýå•ðOƒOÒ¥Ë~¿¾øÙ•ÇЯ·é³o"Îð”Ý “˜èЋ!¦Õ3 '¦'˜<Ïžð,S¯>»>ªKÜÌ‘3¸»äHõ™AHt¸%ÑñiœŠFVÉøÔ8g/ ¤½Yï´50Kò›â è‰DßwÑŠ›SÄZîÈÄg/I™ZÖ3Øcé5)M¹ADô=—Â(ÖYU=ƒ³ÃÌrvûF2Ǩ1jxbžB£0YMf»™ˆÈ)›YgÒqÅ\©ZºÛ7ô g½÷UŽˆ>@í3§ôV½Î¢#"Ú"ç·ºl»"Dà1ªjz=»(;#?ƒˆÈ¥ÌüÌÒšR™Zfv˜ <;«Õ^XV¨T+f#‘K“¡³»³¼¦ÜÞg'ðì Ôµµ´ZZ íéÓ§¿%FìÛ677—•Ÿåèwxv†§†VÓÜÖüìÙ³79[bß+[Z^ÊÌËìè!ðxˆíÏ>Px*j*2s2]jílUÔõ´zD3~j ±÷n"<Ù¯¾þ*2&2%=…Rs{³J¯*¯.×™u.]J…h¦7ëA”ë›EØ€àAK×7&œ½NêY®6Ô²!ØåêŽN¿Q»ù÷÷{Àóüùó§/ µïf~nllìæ!v˜ì…ÇEˆK"¹ÈÓÇÓƨÉ/Ê¿ÿð~l|,OÄCƒ¨˜¨€À€[wn>s:6!Tp…Üðk7®]¾r9#;´ D›  ØÄØ+×®øú;—r·èkj<¼<‚Â;™®?ïÏêê*ÇKyi6› ü¬­­µµµ%%%544DGGƒ–ÍžØØXÂÏ᳞ß|ý›°È°„䨸Üù_ŸÔ?] z½¨´ˆ/á7µ6åæ!cxùz»p®½«Áf|}æk©JZÛX[XZÈóP‚(™Jæíëíéí‰û@áÙ\¶•U–m‡'19/oß½ ]ºrI¡Qøøù¤g¥S ð¢T)Åv» 0 #ý×ÿ±­619‘]M¾U½«ØBvqE1“ÈDD.ñEüzZ=½nëµxv•\-gñXL.“ˆh³Éf2ÙMž…Kcv˜-="¢­rXž=eÝúØm""ê™N{„ Çù 7…VÁóX|“Ï$"¢Ä°%JÉnkíxœRéT| ¿¨qiqiy‰ˆˆÒôÌ4&Ãb…Ø`!+†î"‘\d²šž={öâ·/ÞózÄ>$C<ÌÎÏ:ת6‘µªw‘@*pô9^#¶ÍÖÖר|6yJ®âKù€çù‹çÏž?#"Ú,Àøç3I¿;xz¸RÏ6ˆˆ6kumÕÍèëüõ—F¹Ú+í¹Rý~%SË$JÉxì½v\©§O¿{-¯,¯¬®ìí!z_ZY[q3x„2á‘cGÎ]8wþÂyè⥋Ýo ž‚â‚”ô”íðàJ­o¬÷*¯(gt16{ºººdrÙ{9˜ï•ææÖŸnr>]ŸŸ]\Ztyps3xøbþ…‹4F µŽDý­J(:C?#,ÁÃä1Ë*Ëò ójkëëªêªÒ2Óªëªi­´Ä”ÄŠš Œ 3ëèmtÐ’œÐ@oËÅ×o^?söLrZ²ëŠPðàJ­=]£49=Éd3+*+$2Éòê2<“ííOÀ3˜ ðŒMŒmñPŠ„¸ca?EbÑÔôÔÄÔDgWgEU…\)‡sdl¤ƒÑÑÉèd²˜YÙY¥e¥ŒnF]}]O_ÏêúªB©0YLó‹ó,+¿ ¿£³cjfÊ5>ÑÛ‡ËÁ Ÿìï?»‘¡Â¢B©\êòàÓw?xΞ?+’‹Ä 1Dýœ@*HÍHÍ+Ê Á¡Á<1¯°¤ðËã_fæf667zùz]½q5.1ïÜ»T.^¾ØÞÕÞÉìôôOÏJŽ‹¾péBs{³Ÿ€4W)è„§ÇŽ©!šž™nhjhht*1)Ñ`4ÌÎÍÖÔÖ¤¥¥åæå;v PÁSQQ±ÙCõ…¬6kdd¤ÅfÁ¶ÙjNNI6[̃F§á'´X-*µêĉUÕU<>/3+óëÓ_—ãƒLOOŸœšÌÎÉn¢5iuÚ;wîÀ™œœŒ¾®ñ‰Þ–ð¹âæ5<2¼´²Ô×ß—˜… W”ÐîÏÇŸ|ì*Ûmà¬m¨ˆŽPéT˜‡·t´žûï+´ ƒÅ$²r³° o÷ÜTZ£V P« œ9w¦©¥)3'3&.fKÙfë±áJ!'@)"2bl| ¼ª¦ ù !2*²·¿wpxðáÇ@žè˜èͪ/437““›SYUéì^]`´zmLl ¨À®’ÒÜð”*å7¾]Z^‡÷8ðñðèðøäxhhèÀà@VNVcS£F«<ÈlF³‰Ë5>ÑÛÀÀGŸßÒÚæèu Û¸Úàr?x%¨/¹¾_TVU Nàñõ÷u®ØVRø$ô ÕÅÇß§¾©žÚ@yfüݺr<9=9424,2ì³/>ƒgGx¬=V\2Ü~ +nH¨†–ý<ˆo„>xHJN*+/ƒ'$4Äå)*.Ê/ÌGVIMKB±Ð?À_,£Z«†BÃBQ†a@TH#(Þž?YX^ÀÛ!óÀ‰·›]˜õó÷ÇO}c=JµšºŒƒA4: ulDoWøt¯Ï‘£GPÎXÖÅåÅo5XZp?xPtmùN*.LiR”:%À à qÁC­•³eõœzZ½_€Š7Ž€ƒ1áA‚B ·ypÀcqXpç—æ!Ì2³3‡Ç†'g&sòr*«+áINMîìôòö*)+'5=Õå)*)©¥­¥½³}lr ~aa`ƒ xÃ8££Ó)i)Mô&TÕOBžPo—ž™˜±w`x¯§¿'#3£®¡nf~ƒ;ß(-·Fª1Ñ[×ÜâøÁý •6¶·6ÀÌóÀƒ¹>¦.…¥…y…y(Òº9ÝoóòñÊ/ÊGÖú·þ žÒŠRLªë«7ÏyÌv3.âÁ¿º¶º¹µÕ—Ï…õ[yeyqiñ‘#Gð¼Üì¡úº„ôrêÔ)z ÛC£CÈ!/Qˆ¤"$¥ à ªeZzÚ©ÿ9…·Ã ˜ ˜´Œ4´7ZŒ(Á1û„‰É‰[Æ'z‹šž›ÆÍkÇ](Ü L]ròs¶ûL|R¦þéš+䦤§DDGÐÚhÔ÷)U|R|ZfÚ¥+—¨6]쮸Ä8ôÉEÛáYÿݺm#c#¥å¥õ õEÅEr¥¼¢ª"#3Ãæ°-./ÖÔÖMF‘D´°´0>9ÎèbLL9Wý®ðˆðÏ?ÿÁ=:>Ši™Y™<Zöí•Öƒ×7Öc—P,Ä®¡ÊªJ W]S=9=‰fýýååxÙ7à\‰ê;;?xìØ±ä”dNSSWƒ^­m­ˆ€®î®ôŒtH,ƒmj±¸Ü¼\¾€ãdsرq±Ô •‚:`"¨‹Ù…«4<:ìútzû{qqõÜxݶÝäãç‚‚M¬?~òøêõ«ƒ'â%¥&UÔTäæ…ñ%|ž˜‡4UTZöËÿóK´‘($9ù9åÕå%B£Ø ­Ç¶ö»uÛ€0(-+‰9{ö,6ÒÓÓÁÆÌÜÌ7½ÜÈ5Z èÊËËí˹º×êr­éæÍ›r…|`ÐÉCGgG'£3)9 £¹ŸÇ. ‡]‰I‰Ø¥R«>ýôÓìœìnf···70?-­- †³ F¦ú"ï§û÷ï+UJ.{âĉæ–flƒ ÆÌ/È¿}çöÐðÆ,++Ãà°M‹Í<3³3ï²°¸ðÞLû@„2;,< ŸQo_/î2Î÷¢"“]×Ü-×mÛŸÜ‚\ ÄⱚZ›@rÀ¨®¯FÎÑ5¨è‚Â;º;jkcbUz[À>õ›SÔJ OÑ=·0×/À¯›Û½׺m£áæ­›#£#™äÚõk¸3áNïéå N¢™':&úqàcµF´NõB8»› QÑQ``n~à±8,×"`Ô®©™)ìB¬cz]¿q7ï}µ´G¸åáj‡‡E„UVW"±ÇÄÅ pïuÛö€§¬²,1%1=+=4"„$€Q^U‰j  mPסàü\¿ym*k*/]¾´BÂCÐX(n†Çêp®Û¶¸²i Z„æüÒ¼V¯}äùñ6¬t„>*Ÿ»÷îúùûa›ê¡À“ØPkÕ¸ŸQ˾aŽÔDorµyµkѹ ¨`z= Â{a/µ\›L!»rí îÉ©Éii³ÁÕ/䇄†PÔ²oئÖyÃhY_~ù%Êˬœ¬F›ê…lƒ{ê””8×hDN-/-FÿÇþG ÇÅÜÒÀýÖmÛžªºªšúš›·o ‰RB-4ÕÚÙ œÀ‰\#àñ€ÞF‡Œ!1yÌ“ÿs/[:Z2²3àA‚BÇÍ¿£Û²n›Z§<qjÃå›C"ÂÏ.V -Ä"2€k¥/©B œfæg,6K^AÞÐèZb~B\‹€YìÎ]ÃcÃØ]¹dónu uz“éqhdhêå<“3“®î×Õ«¤¬$3;#+ÔŠ³çΚmf$F7©îÝAÁAýCýŸÞBŸ]˜}ïK¥}PÂ'ˆ %qOÏöuÛà9<ð Bã‹ùç/žÇܧDÁ#UJFFNFJz î"˜Á“žž™“øÑ¿DµÁ^81;ŠˆŠÉ~ÿ;ƒWë¶-¼Z·M©V>ôx¸}AõÚU”pI)IHJ­í­G(ÕË ˜§²?*@$âÒâòÊr¼‘L)s-†° áîÜéÜ%’Šy¨½Ôrmƒ#ƒU5Uè^Z^𔀤çꎤäéí‰6íí®^ͭͨ:0&’Ò¯þóWF³Q¥U¡B+«(‹OŒÇÑ" á0¦ç¦:òžÕn}ïë¤}hÂÅ™˜žØyݶyw[·m75Ð@j3l˜öPªã9Y¹YÙyٔ߉„„Ÿ_”_P\PXZHµÁü 6Ÿ½eÅPçºmsÓ“³“î@íŒöíH´šF¯ËÄ£“Î>™fßPÕ ©¦µ£QÛ;Økí±ÖÖ×"|‘Xð©P (aWu]5vÉUrìiÝìnj—P"DÜS«Æ!»¢ èŸwõWÍmÍE¥Ehæp' IDATê'òLaq!2L]c]ÿp?†å ¸%å%ÇŒÂÃã %ÐÅ#Çn>¢½EÖm{^­Û6³ëºmDß[aZKy <{¯ÛFô½Y·íõðPë¶9Wc#"Ú$²nÛkDÖm#ÚMCcCž½$SÉDr‘½ßþÞ×§$ú Ô?ܯ1jxbÞn_>&ð8¿&' „R¡T)HDD”Ä 1WÌUè»EÇ)ÜZ”Z¥L-#"rI®‘#óuÛˆˆÞ¾t!ÚRZ¯îèp õôõ€v‰R²åáPz³^$É5òÞþÞ÷~o(*n"…Oàq3!Ôðá-¯,¿øí‹ßº‰=ñ|zv÷l­ñ[_æWéUb…x~qÞÎ…zЈP&ÄÁxÜL¸k Ú·õÌŒç¿Ó»¶g|1_mPo>…VÁó×¼ÿóoëýX,ãà Ç-EÁóÚ' ì¨Å•Õn¹­ž­›˜Y¨céb+øÁÅ‚€BÑô.µmØõ …RÑØØØÙÙiµYן®ÃÙ×ß§Óë\ãôöõ:zû}wž˜·#<ÛÏe}mÕÚØÀ<òEÏ™3Ž_ýÊüóŸ›ö3üìýôSãçŸw?>,—ýþ±«+­¦¹¥¹«»kph:à·"¡H87?·Ý&𸥨9ÏÓ—zs­®¯MÎ-4ñŒáÅÜØržÂ2ˆšíqóQ&;¨HËTÛ†Ðlqy±´¬40(°°¨°­½­¡©A®”¯®¯¶w´;LâgÕd6UUWÙö}´#<2•ìé³­çbijd}á$§ç7¿±†‡›¿øÂôóŸ[Ϝ鋈è;vÌøë_wÿrX)GKÓÚÖš‘™QYUYT\Þ7Ðçô¯­ÌÎÏNÏLSëqSO…XX\€gfvê\ÀÕ/ÑÆ¹¢÷ÜÌâÒ"õL„Gžzû{·Ÿ˜Àã–<ƒÆù”7~ŒóòêŠ}h¢¤CW#/ì4E• PH+¤€™\#b*zòé2­}-ÅqvN¶½Ç>¿8¿¼ºlµ[óòóŽ ð ÈÌVsumµÅfÙ÷£ÂŸ®í ÏÆÓ-»=ùÄ|ñ¢É´ÕÔØ=04ÐØÔSËËË“+ä¨QéÍtœ2—ÇesØ(üBA'£Gaû¹à€ |øÐj³n?0Ç-å„G§ÆGˆ´ð†B0õŽ7ru¡%˜Up7¹F˜Ù În”›FŽFg˜ž›EK½QŸ9Š~Ãár0 h¢7"ŒQŸÃÞ7?êñD\wGx+¶4îöñV}ò‰ã§?5~ôQ_R’áÈÅh½xq(9Yôã+þâ/?ü¡,7-1o‰‹íbvõö#¥øø³Ø¬ñ‰qÌõ"óaU!Áž^žƒÃƒ×®]0èº0ÏŸG NpG`qX3s3´ÆŽÎŽÑ±QŒƒÊ ž˜,¦íç‚Ê„÷àQéT³ ³SsSûÐìÔÐøCjôÏa<ÉëÄÇnîé3÷öÛÇG'gßL$¥e¤R*1ÙLp"󤦧RmÆ&ÇJËKjS³û8€¹Å¹áÁéà¿¥±C"ì2>=Ž„ƒªÌËÛ QýCýwïÝF±L>93Éñƒž<h 5à¥ÕaEÕêëç '“Ä#-ÆíçB}=‡Àã~B´)uÊé¹é}-ï?21‚2Ù-Í,aac—X!:“Îâ°ôöb/Úôô÷t³»,FSsSUmUu]5½•ÞÅîâ8hÓ3Ðãmpdž}€ó!\;£`×ÖöSc6¿ãÔIÕ?ýÂðW¥ü³?“ýéŸJþäOÿoþ¦õÄq‡R†6#L.“Ád4ÒqÀµ µíŒvœ‚Ùn4YM}G¿ÃÖk›Ùâ'Bö>;uMpk€†Æ†¨÷Ec½Y–££xië±QWfë¹,̤ûÉ V‰ûâèäèʹhýè ¢Q¥ÖkÄ BV®–kô„"{ÑF¦”ø?öߢˆ¨ òæo·£"8BÎvxÄ 1vípÌã#f>§åèÝÿ÷ì¿û;Ößþ-óG?êøÑÚNe•Kp´hc´‘m¶0‹Ëú_íkÏ…Àã–< 7Ñý.µ Bp«îêE?±Ý?Üÿw°Ð3hß¹xbzbç^£ƒF>[T'ÈÍ¢$*Ê·*eCßÉï!°@BàqCIUδ©uÇÝH(–Æ Ù&ØõÞo¿çÂóQ<xÜLøÌøç#‡‡Ç†ßûÞÞHã΢QkÔ:Ÿ/`úÖ?`‚%8Q}á^€fïÿPßà\†F‡ {Ë€ÀãÒ[ôH>ÎÿóA‘Hüê_¬·×9ˆB™Zöê\Üât^ž WÌ•käÛ3 ð¸À&J­áèB¶ÜíùpâŽïý ÷q.†Ï…ÀCDt@xˆˆ(ÑEà!": >îp8´Z­P(ÄpÀé,“±Cjo9B°Gð€°oxVWWQí<”} "‘¡¬#FìÂAŽPGÀ#ìü@ ìžõõu$¬ÉÉI ‘ÂPb\.1b‡ÔÞr„:aàaßðlll€9t|H^ “'àh$FìÂAŽPGÀ#ìü@ ìž/^ °C”}hnn#N#vH á G¨#àö~ ö 1bÄÞÜ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐ<ĈÐþ?GÇGh'1AÙIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/page-info-view.png0000644042355400116100000013162111675570700020706 00000000000000‰PNG  IHDRxâôà&Õ IDATxœì½X[Gºÿ/~å^dkïÖÜìÞíÙ–d÷nœØÙìØ7Œ…±±Ü±1 ºé½›.zï½Ñ{½w\â’¸÷´çþÿ¿ïaŒ–Ð ÁÆ9ãïÃ3gΜ™wŠÞϼÈŒÿŸNt¢èD':I,1ÖÚ:щNt¢^çDƒ–Nt¢èD' &´t¢èD':I0} ´ÿó?ÿóõ×_ùå—ÏŸ?òäÉ£G&&&îß¿‡Nt¢èD§ïq D`p"JàÐ\2hñžGChñÖ­[ׯ_¿råÊØØØ èD':щNßãˆÀ"àD”À% ¹dÐÑxèF[/^DÓÝÝÝ---ut¢èD':}P ‹€# P—€æ’A >ÔhèîííE»ÕÕÕB¡0‡Nt¢èD§ïq D`p"JàÐ\2hŸ?999œNt¢èD§ïq D`p"JàÐ\2hƒÒm4†ÇÅŸЉNt¢èô=N@!€,Ž@$@ \šKíÄÄÄ•+Wº»» ÝhtèD':щNßãd8™üüü€EÀˆ(K@sÉ ½ÿþØØX- &àk=@:щNt¢Ö2ŸLzzz`-°8‘%p h.´wîÜA8\WW‡è8<<ÁòZpŽôþûﯵ t¢èD§ïKÚ9™ÀZĵÀ"àD”À% ùz‚vÃ$kÿñÐÄ¥èD':I:­6hÁ¶Ý»wûùùùO%-[¶¨ªª²ÙlÜ:{ö¬˜KáÇìææ&n] Áéíœ>}štqæÌ›>øà¥ÍâY XøþdBÉÆ5559ÚYž©sö"ž___[[[\¢Ø<_âŒÝÈÈÙmÏ|âÒÀÀãZ’Óí™Ýéì–é£ èD§µ¿dnn.†…“““¼¼üœ>sñHZØ×­hÁÔüü|©h}ôÑG‡Úµkn…„„ Ü÷æÍ›?ùä“?üp1ÎuäääjkkõôôÄ-oß¾å›6mÚ2™‚‚‚HááÇKJJ0¹hÿ¥-;::jkk¿?•”••TTTÐÎlSp˜¢kddee_JôéÓ¢««ëìììíí ›± PBâot±mÛ6´fñSlfSWTT„ŽPG|‹ à'LB ~’© †ñù|Rs‘ñ=±G<á………¤e@]Ã2!¤e”c*Hµ—¶O':щN’NðQð]ˆµàÍôõõÃÂÂÀ84Ü"nSì²à–CCC‰#þ àÙH;È‚ˆŸ‚ž“)kðÖ1¡éŒBWW×sçΉA ÆÆÆœâQ-œÄ~z!ÆGGG'$$TTT`Z=êåå|åÊÔ?räÈÂÍÂÄpd®7L†³vvvX›“'OzzzÎ0u•"ØÅœ6…ÁrŒt©ýâ±#aQ“’’€O6,¡½½}ZZZAAADD„ššì'ö`Qq;þ<泜œŒGp ÃÀñ`bb"àžž~ìØ1ì-¢¢¢âââpFÃ@X„æ˜ü%vú„oݺ6À`l\ŒT Z¬) @ïØ 0`ÆÒЉNt¢Óš$±Ú0éáá®á]á®á£à‡á$áðExQ\ —ššjkk W ‚Àó“v¶ð~ÆÇÇØÈÏîqm"ÚúúúoðN`ƒƒƒ‰‰ ¨°cÇ--- m1s¿ßÒÒ‚XszË{÷îV•””€–ÎÎNqàBÀÅ„q$dÄØÈïÙ³±&šÓÔS§N¡¦µµµºº:Âk,æëë p¾´rtÂÀê¢A Á(™Р˃meee!Ñ4îÛ·f`ýºººyà 333+++†jÀêzxx >ŽZ°%h¦Ðbf§qšY h1½¹¹¹d†±¾ÕÕÕ°á>¦Öbøb„£ree%ö%ÌÃÐPa1ëH':щNMÓA»aÒýOKü'Êáá‘[†kår¹ä£=¸2qD´a [€|Êáö ef÷¸öo“ho:hqjL&Ìb&s/¸ùÞ:†—GËû€IÄ]Ìþ.ÐøáÇÝÜܺaÆRrð™mªƒƒ¦"dpºA€Ÿ¥¥åbÞ Fƒ½½½h(E [Á02-ØXfÂ×öövŒ+Š0üF! Ã"^'ëâA•„Å8€²B¡œƒñ8µ‰ß@›0gÄú ï"ß×…=äx$ìÈòòr.`9–q-JÈ&Fewwwœf6oÞŒƒÌ[Lt¢è$Ñ4#¢Ý0 !ˆ àÇp·´´1Ü2Ü&y'~Qïô·ÉSGŽhÛ€2)))ÿ Ý0Ï[ÇÓAKÞ8…÷W˜L‹ü…9Ù ÐNà¢,´H˜hWWWÌ2&”„àó™ ºcìFFFÈÄÇÇŠ‹ÁDe4‚ó!Ÿø’iÙµk¼Oœ8A%€1ZŽŒŒvéŽ|JXbLMM_z iö[ÇÀ*l@DKf@^^^¼‰Éo eÌâ`Œk‘³M':щN’K3"Z81xHx6‡ Oü0¼%Ürbb"Ü)êxyyÁщù…DSä)‡ˆBFF•¿3 Å¨lllÀH` ØPVV^ÌÜ¿·þÁT"ïô†½{÷âlÒÚÚ*îbÛ¶m8¶à‘ŵZZZ±±±`ùͦùLÅ¡D/**œÆÅÅ•””,Òþ¦ ƒQ Í††”ÀlŒ ¡$؉Æ@ÚÚÚ°„‚T0ö¤§§ãÁ}ûöÍä3f„רC8€Ðä ^´‰@¤£Ån;þ¼¶¶6hŠy×§¿uŒHÝ‘©XÌÕt¢è$éD@ ïG>ª> 0Ecoo¯¨¨ˆ€?á–›ššÌ%ä÷oN:…à áouu5ü! o ?[ðÃkZn£3DZÄ­‹;Â/MMMr ƒ‡ßÇã Æ&>w,ЃÉËËãO&LÜáÇ1‰jjjä]\Ä|â.@P Fbâ^Ú21 Âl’ËùLé±T¸Ü±c‡­­-Y’Åt±À´`hžžžÀ*Ð…Ü:tèPyy¹{UU¸‹:Ø úš››§N&²|}}Á?<$ò-Œ$ï6cíÑÑ¿ML"öˆ'<33í`¤0­؈¹Å-´8ÍÿR‚¼þÒu¤èD'I'Zò!tuuá3á£H@¿mgg× Ÿ p vBÜ‚@eË–-ðlpªx$** þ þüÊ-žB "+.—;»ÇÕŽhÉïq!R–À q:†JþbÎÎê"ÿ¼ç ccc³i !&ùKø9½ 2eâ·Rh1±3` ƒùwç4•ü… „µDfëÖ­‹ùkÝ…§…ü±ºÀÐù-s»æ¢üE _è—¤Gò;\5V†SÑ JÈ5R’_aǜ੗Î3‚uÌùåp$¯úúúä„к&ïˆ[Fø‹A(G×ôŸ÷ЉNtúWHðEð¥ S N’|vFœ!q›äï$q‰šð™ðop€ÄÙ¿‘ø›ýøã€Á!ïß¿?44Žqv« ZØ„è'äÛÉÁÁa14Zxâ,--g4‹q©_Ȱš-OOKpzưVÐŒ…öVppð #544æ«ÎwQèD':ÑéµI`0cPPP@@À… æüóŠïéW0~×0sÓ"ÃýµJl6›þ\–Nt¢Óë6nܸwïÞ³gÏž:uJNNnNŸLƒ–Nt¢èD' &‰ƒÖÀØÀÐØ-Z´hÑú¾ „$Z~1?¯$-Z´hÑú¾ „$Ú¼Ò-Z´h}·„p$!3!.=Ž­…•žŸ>ï.ZÐæ—®ý †-Z´–ªla¶‰§‰šƒׇ«íÃ=ã¨vÎU]LJ«Ããž¶Qåzj"¯í­uÚæ”.«ëÃÕr×PwPÓóáBçÕ¸®êú>\}÷¬ª®§¦òÞZgmNò¸†>\]w Mµó>\HËQM×UÝȇkÄãjبzj#ï­¥asʘÇEÞÐ]CÛAÍćkŠÞÕ \Õ‘1ãq¹6ª&žšf(÷ÖâÚœ2çqÍ}¸Æîzj>\Kôè¨f쪎Œ%,´Q5÷Ô´BÞ[K׿”5kFÜ5 Ôl|¸¶èÑQÍÌU[×ÀFÕÚSÓ·kã­e`sʎǵ÷áZ¹k˜8¨9øp!SG5+WuG®#kd£j爫¼ƒ·–‘Í)'׸k˜;¨¹øp! G5[Wõ Èó¸¦6ªNžšÈ;{k™Úœråq]ñ »†•ƒš›²vTspUw÷áºó¸6ª®žšÞ\7O- «Sž\ÈÙEÃÆFÍà ÙZ«9Ù«{¸r=.p-LU]5=\¸nŽZƧ<œ¸Ž\g 5®‡=×ÖDÍÉBÝÖ Y¨ºZjzXsÝ,µ,tOyXr!gc =5s®‡×VWÍÉPÝÔëaµÐTu=¯éaÄu3Ô²8wÊà 9ëhØh¨yéEòâÒbçÝH¥”$ZôTN‹-Zß1ee*(²äY,ëK~ý×ÿÃú.·¬ûÑÖ9¬dýÇæu?å°~Æaý„ÍúñöõopXÿ‰¼üúŸ)®“Ãú9‡õÓ-ë~~€õ ëY?Û¼î—ô_lÖ›Û×ÿšÃú Êå×ÿJqýï8,èç[Öýîë-ë­ƒ¬ÿÚ¼îÖ9¬ß³Y¿Ù¾þÏÖ_8¬ßʯÿƒâú·9,è7[Ö½}€õ.‡õÎAÖo7¯û‡½Ãfýqûú¿sXïqX–_ÿ®âú Öûhg˺÷°>@þ ëO›×mâ°>ä°6°Yݾþ#ëc<+¿þ}Åõ2ôî–u`mFþ 믛×}ÂaA³Yïo_¿Ã‚>_/£¸~;‡%޶¬Ûv€µùƒ¬÷7¯ÛÅaíæ°äØ¬¶¯Wà° ùõrŠë9,èÃ-ëö`±‘?ÈúÇæuJÖ~k›õÉöõ8,HN~ýÅõ*´yË:eeG…up?kóÇë8ûY%{'k»ìzÎ^gKþãõ{·¬çì`qäY[þ¾îÀg+ëàfÖæ¿®ãȲ82,öFÖöw×s>dq6±äßY¿÷¯ë9Xœ÷X[~¿îÀ;,묃o³6ÿzçÏ,ΟXìß³¶ÿj=ç-çw,ù_¬ßû_ë9¿fq~ÉÚò³u~Îâ¼É:økóÖq~Êâü„Åþ!k;kýñ7~æ©ÇhçÛH“¸•d3ÞÛÉx[†ñ›Ò»²Œ ò 6¥¿lb|¤ÀØŒ¼"ãŒOØŒ­¨³“ñž c›!‡FdË3¶³òèhc›c'òŠŒ¿odìfSÚ¶“ñ¡ CÍØËf|,ËØ&ÏPd3ö±71ö0ØŠ ÅÝŒìÝ ö.ÆÎ- ™÷ìí ö6†ì{ ù ¶,ƒ-ÃØôg†ò2?`l|‹ÁF Œï0d~Ï`ÿÁ~—!û[†<ÊÿÌ`ÿ‘±éç …ß2Ø¿c(þ†±ñg ö¯ì_2v¾Éù ƒý&ƒýCö‡ ù1Ø?f°ÄØ´Ž¡ð›ÅP\ÇØøo ö¿3ØÿÆØù2ÿ‹¡²NÚMó,"ÚùvÁ­ÄA‹ž * (•,6S^€§òJóø%üù”_š[XžSPž[ nI],Ñž¹%ÑNç˼ !7Õ*4öœ{ÌY7Jú¼h¿ÄèìâìåLø÷,Cíþ2êü÷Ïõý×0ŒÎ,2“]”—Ç/æKpË ²„Y4hiÐ.Z)1hð6ÄA[X^XX±dñ…ü¤Ô„Œ¬´y_(à5T;ÖW»VT'+ –ÑÅ’”W’›1Mñé‰ù%ù’îzNåóm“Nñr¸aåzQu ­š‘5gÜ#ò…9kbÒwHÙٱɱi¹iù¥ùËÛŸ´ÖV©9©ò»äí]ìñ”\/ÙÂl´³Aû´³"Úø´¸y7R9%Ƀ¶¢°¨¢h©ÊdÕ7Ô>yòdb2=œL^¤ûÏо|õü¡ðáì‹Ã¼ªºŒ¢Ê%w±$Å¥ÆW7P7pÑ0¼ ¦ç|”먬awœk,(©$.[¢f Ê ü£ ‚B’,BU]#8…e?ëÃ>üÃÞrrr8|„#»Evÿýù…ù½%5%Ë^‹Ù[=§$GÑ@‘)Ç\§B‰)'½^ÉRaþ@…¹^Vú?ö3ÿC…ùCe&KFúG*Ì«0¤Èüá6韨0мœôO˜o¨Pú‘¬ôû™oª0ßTfþDFú*LèMEæÛ¤©ÂüòrÒ¿P`þZ…ùæÊJÿz?ów*Ìß*3.#ý{æ[È+2µMú*Ì?ª0-'ý{æŸU(ýJVúOû™o«0ÿ¢ÌüµŒô;*Ìw‘Wd¾µMúo*ÌÿF}9é·˜Wa¾‡vd¥ÿ{?sòÊÌ?ÈH ÂܨÂü»"ómÒª0¡wå¤ßS`~¤BémYé÷3eWf¾##-«ÂܬÂü‡"ó½mÒŸ¨0¡÷å¤?R`nSaÊ¡YéOö3å‘Wf¾'#½C…¹S…¹U‘ùá6éÝ*Lè#9é­ LJ›d¥wïg*"¯ÌÜ$#ÍVa*©0w)27o“Þ¯ÂTƃrÒ»˜T˜U˜2²Òû•˜*˜Êl¦Ì?¤UØL•}LEyæ¶¥Uö0Uv1åþ!½G–©²©"Ç”ýoéýÈoa*Ë0eÞ‘Vù˜©òSqsÛÛÒ*™*0åþ,½ç¦Êß™*cÊþVzÿ_˜*o3•ÿÄ”ù¥´Ê™*`*þ–¹íÒ*¿eªü†)÷¦ôžŸ3Uþ‹©òs¦ìO¤÷¿ÁTùSù§L™ÿVùSå‡LEsÛ:é£?ý±‡®@»ÀÖ‚$Zjã.]p¸-Z\§Sö³Ï>»ùù•û·JžÞ y>!œ¸•=>ä^Û˜V¼¬^¯ÈÄèsaqeþ¡B;— ]#s#K;SkÛó&ƆF†6v6AA‘‘ÚúúÁµBDëáæL)2èˆM Ç·äxp5@{Ö3ÆÔÝ›Ü  Ì.Èz•¾àUῊ«‹WÄrý@ˆˆ¿‹»sLr ؆B¸ìt~Z@¨¿³]lJ¬¤gB dã`uóÖMHX"äùzù…ø%e%á° ½OWBz‚½“¨jn*…®*êeŸïâáìì‹Ð­p²põ…©HÊHLËI›-X•”‘TP¶†a6B¢C”î×××år555ω¥««âævÁÀ@ÏÄÄH“«ÑÐÜPÙP¹ì¾foõü²|SOSu'u=?=蜓º–»¦¾Ÿž¾ŸîY;5]ž6•÷Ñ9k«fà§kè§§ëÉÕtRG漟ž–“º®»¦‘Ÿž‘Ÿ®†š!OÛå>:¶jÆ~ºÈxrµÔMüôLýôtœÔ Ü5ͨ¼.×N͘§m޼×VÍÜOycO®ž“º…Ÿdà¤nì®ié§gé§«k§fÎÓ¶BÞGG×VÍÊO×ÚOÏÌ“kè¤nã§9©›¹kÚúéÙú騩Yó´íPî£c`«fç§kï§gåÉ5qRwðÓƒ±r×tôÓsôÓ5²S³çi;¡ÜGÇÈVÍÉO×ÙOÏΓkŒ ,qR·u×D悟®©šOÛå>:¦¶j®~ºÈ;zr­œÔÝüô ktá®éî§çî§ka§æÊÓö@ÞGÇÂVÍÓO× xrmÔ‘ñöÓ³wRwq×ô¦òºÖvjÞÚ<_=OžŽ•š7O—ÇÓsuåÚÛ©ó¼ôxžzÈ\pÒäyèy»ëZ[¨y¸hó\õ<]t¬LÕ¼]ty.z®v\{suž“do¦~ÁJ“ç çm¯km¨æa­Í³Õó´Ö±ÒWó¶ÖåY빚qí Ôy–z½¾ú#Mž¹ž·™®5WÍÃX›gªçi¬c¥©æm¬Ë3ÒsÕãÚkªûšÆû%d$,¼»V´ÕKNú´ +øzcвŸ~éö­+÷o7?½—;ÒRQUZSP¼ô.–$€ÖÀØ$222$$ÔÖÖ&3+³´¬´HXTXXØÒÒ’—ÏwrvÄxõÏù‡JÔ¨¨²0*1¬¨¸àÉ“'>¼ÿÁù ŽOñÑ€ŠãÁ5Ç+³*ï?xpûÎmm iñË[¢ÜâÜŽ¾Iïóª6SÑ[PD ·¯WZzJhDHxlõû&YÁ‘Až>üü\'»¨„(IÏ”‘ÐZß¼õùÝûw>šøôê•ìÜ,ž;€—ž—NOò6ŦÆÚØYaì^¾á˜‚Š‚¨Ä¨à° ŒÌtžŸf …Th»Z&´ˆûE"QGsó4‰:DÍíÍ)Ù)°sÌ(¬,´q²a³<`fffï`Odgo÷ÁØÙÙèêꘚš(+ï?zôˆ@ ¨n®^v_³·:ÆÀ áÍ%ïyòtåoUö™Ô·óÞÓósUàÍ®°Æ•ƒ§UžV9x²0Ô'!3aÞ­µJ ­×CšÅfð“mCÝÐðÙÏ(ر“Œ½yëÖíÛèåîÝ[Þ‰ª²iÅ‹nyyühuô üýý½¼¼ÌÌMóy¢QSsS³¨ùÒ¥KEE….œµõô(ÐJÒÞ'6)º®¾öÁƒ¯žÈR²‰ADËñ+¥@T}Ä)Á2Œ?8zuâRbQ™}‰½ÏrM%ðKøÑÉÑ>î‰É ƒýÀ[ž Q\½.$§%õô=~ò(0È%dÃHt3™6Žhoß½yçî­û÷L܇aI©‰°'*)*«0«¨j’m]Êja\Z¬·ç£Ç‡úÓ3Ó¨Þ"Ãåð³ïÝ¿;4<˜”’àÎsNŠâó)“$¼ÕÅ '(´ÍÍ ­ õ­õø)Î4µ7´dS­ÂV·v´Þ·Oqûv¹ÁáÁö¾öö^J­=­ròr‡8‡*k*2r36oÞ|ìØÑ|A>@»R[Ê/§"Zú +è/¬xéV´ l-Hò êrIÊ)zÑ>zôt%”¥û‚²wïÝ»‡[Í¢ÆÌüŒe´¿TE&Ekéêy{{»ººš˜ òËË˄Ų²Ò‹—.¶žžK+sMmÿˆ@ISP!ˆˆ ÆTt Œ÷È<R{*¼á ¯è°ùñàê#~eçx飗¯^ºt1)-APž¿ì¾rK&½Oí2/¬*LÉIñõ ökmݹ{ûÞƒ;wîÝæçå8»;†´w´u÷îߦ@쓳¼ ³$åsìínݺyÿÁ]Jw<¼‡Ðlkni  HÎNT$mLBF‚·/EH¯ IDATÆ~wrZ0ˆe/x:gçfÞ½wûÎ=lùÏQâ9LÎNŸ™$-sî)ж5ÌPSGSjN*¨¿ f`ÿ ¢% ííï-©-ÁŠTRÁ´Ž¾NEuEyCyhl¨Œ¬ \ZQõ²ûš½Õùeü}†ûè/¬ ¿°â¥_XA@;§È¡Mâ EO%5%x…P?™©)É)Êih¬»ÿþ­©D{—0öÞ½û÷<~ü¸YÔÐ.¡ååejJf€¶¸¤¸µµµ¹!m$‰z{{Í-Ì´ttÑ.gÈ‹ÎPA˜ŒùÀ<ܺ}KPÛxÚ'ᬲ§à€WÁ!ž]ßÑq÷îL`l|LVAeÒ²úB0ÚÙ×I].ÏÔâ\WÏ q ±÷îÝ}òäÑÄ£î#|ÌÊÎLHŠ¿{ï. Q› „JË3uI™ü²|Ç ·nßbÎâ'ð÷>e‚Kœ¢b"\ffKz)3òÒy~ÞOž>¾÷€²áá£÷ÜOËHÍÈLCÜóögŸÝº>y¸Ÿçìî„×Å*ÌE¸ÊÂŒ¼ Q§¨‘ð•Šhëë'E@ ÔIÚ 8'o‹A›‘Ÿaëd+êŠ05,6Lv³ìÉ“'A¨fÙCž½ÕÚ=z{è?ï¡ÿŽö¥ÞÐ.°µ ‰ƒ=•Ö–.U¹E¹-¨ú±ÓYÀãÁƒOž<h³ò3—Ñþ’„!„ÇE Zuwwwrv22>_TTØÕÝÕÑÙÔŽ==Ýf榚ÚÚ>Á~%ÕËòbUSš–“šœš„ !ò`äÕÔŸòÎ>ìWÊñ->ç›Y×ÑñàÁ}ÜE -%3O-¯¯¼’¼®þ®e[+¬&e$†VT•üOŸ>yòôÑãÇù>þ¼ÒŠR°l{øxâÙó§Á!Ù‚lI¯&eU¥ÐÅÍ -ØF½oüð>4ñð>‚Ú›·>Ïä…D'¥'U-sÞ­"Z¹7-}0‰X>~üøÙ³ç“ Í^FûKR!¼a ï•+Wn¾,]¾|É?È­äì©- £¾¹c2=˜L·ïÜ.oéjëDT„K”cÒ&N\¾r942dy«@ùšÒ|xŸòºòW´™rd¼ð˜ðÌœÌÞÞžü‚|,šåñãBsøÙCÃCAþ…¥¯Ú×"TQWáæéŠcʣǠìó/žÃ¤ôÌ´°è0¾¼¶|l€Ð b2ž¯7Æž›—ŠÙ s‚ˆ¶¯¯7'73†Ëe.ß+¨´º4;?»½§½µ«µµ«¡m õÈ"Q{sKGK?cuLÂZÄ&ÆrÒ××=rä°­­MrrâéÓªGŽ9zôȱcG?†XÖÊÊòçPuM5îeö5×V” ^€–þ ú +üŠ$€vþ­­h±w—ª<á Ð~ûíâ‡bÊ>yòäù_´9ÙËhIV lµw´o£ó§ñññŽŽöÀÐÀB Y’öøú ÁDüÈàçÈTšnϋ˱QÔ_Þ*@ð>ÝÝõ+b9b²Ì¼ÌȘpo·ÜÂ\Ò,UÈψŒ‰°±·**/’ôjB• •î^n“ }xã³Ù9Yˆ³ó©·FÀàU0@¬’êk;«ˆ˜ˆ ĈÕ%(Áœöîž®áÑaà&g5í«¬¦  ¤ì?5‰Û–æöæL~æê˜•êìOŒWVÞ?ell”·k×®={vïÙ³GAaÏÞ½ ’ÛÕÍu`h ¶¹vÙ}ÍÞêû öÑ_XAaÅK¿°")+iÞ—Òꀖê¬~ÉÊ+΃–¢,K(ûx’²OŸ<}úô‹/¾|Ú¥·¿$!ìñ‡;nmmÍŸp—ŸÇ÷ ô)ª(’ =uå¾¼®î®ÞÞ^LrBbŸŸ+ «ªª:;á [:::ººà[‘éîéö àQÁÁ²º” ^xŸ•0í@˜OœE*ë+I³ä' ÑëJõµ€ª«Üᮽƒm@X@Im‰äŒÁ|Ð"•––ðù|P¶¤¤¤ººº©©I Úîînq -¯/[^_‚2A÷`wEãJ¤±bf›sJFUMUîÞ®Ñá1IÑÅÕÅ«Öï¼ó0çT¬‰=³ [@«kI¨¦o¤/08ðØñc㟎¯¬Isnõ²ú²T~jRv-Z ”å—ðØZÄA‹[ÙX¹Tá8Ÿš™’'È]X©)åËhIÂÐKLRLD\DXL ;[(Ç]8îü’üå yñÆøùÔ××õõõ!¨íé醨ÔÓËþ~ª·úûûI¦±±`Æz/¯; ¼g¨§²I²3¼Êªi®)(-((+q¡5·‡Ö"Ö‚…ØêíŠ7þZnuZk.r”8háȪ›ª—*½C½ÕÍŸáÕ@[+ª}Íõ=®©£©¾µ~e›}]·:­5‚ÄAKuÖLk¥5¹x‹j¾JG……}Ã} ÓÚyå„á¼f#¢õêz-·:­µ×$n%ÚQ ­ï® +)ïSÛR»æ–Т%QÑ[–ä$qÐbãÖµÔÑú. kWTUÔ?Ò_׺öÆÐ¢%9Ñ["N~LQAYÁKUX^ˆÊxdá6±µ ‰ƒ=ÕO}K*­ïœ„U‘57ƒ-I‹Þê´ÊëÊ K ›DMíí/UsK3*ƒµ 3ŽàVâ EO³ÿTÕXUÕPEòx¶¢®bI¯ ª›ªËj¨¯ëƒ=K…„TÙPYZ] «`ÛêôX\]<0:ÐØÞ¸@L¬"ß=[2ù­ ØX‹ï‚ü­ä«×YXµ¢Ú’ªʪ¼6pÙ0¹Ùj›k%7{âNÅ“#ÑôŠÃ¡NߢZñÚ!ÓÜÑÜÒÕ"9ƒçÓ«/÷2´˜­Në5¶œ°BÊ~ýõ׋!ß7ß|ÓÒÖRXV¸ð^%¸•8hÑöîâåxÁñ¼Éyðy@NS[V.©…fÜÙÍù¬ÆY®.×ÕÓ5§ g©Yqñ‹øÖöÖ0IG_ÇËÏ <[…Ná}Ç®ƒeRRV:vâØñ“ÇO©Ò5ÐK‰ƒ›^Lû˜U'W'Ðhá:ÚúÚØÐ¯2”Ì”={÷;yì„ê -m­ÈØH@›-*!Jr³'î”k·ðH_QËNÃäNP& þ×ÛŠ"ÌLsgsy=õÅL}’3x>c^}¹—¡ù¶úääT¤ç¥Æ§ÇÆ¥ÅÐz•ÑÞÑ>ƒpOŸ>ýòË/Aß'OŸÌ¸ÕÕÓ•_œßÔÑ´ð~†$Zô;/ k ŽJtB4DœßMqÉq ×Á2"T$ÔÚ€Ù ÇéÑneð3ܼܰLpÙ0– ZV~VhThMsMž0/1=³‡+ŽÊVvV¨FNW©Ù©îÞî˜pÎŽ ô•Ö7!-ÁØÜ¸a2PËÌËÄa!¦¥%f …i9i˜"{g{˜Š„Ÿdqñb,uÏèT,Ò&ôôñÄ`Ñ.1ö¨ø(¬#Jfol¼’§¯2Ž5Øc¼¦Ë'À§º±¼ý½Q‚iÇp–a'f;¯$¯£·£o¸ú¯âªKD¢œ¢œô¼ô¢Ê¢öÞvTÀN((/ƒE]"òŸä DX)Ä @åÙäâ­®ª¦:c¹a&ÄÅÝÅ'ÐGÌÙ%x* 4 2>%˜쮕Úêè( ’wTg÷Aýh½Þ:k±¿­£ ûÿ¦¥îžîkׯݺ}«£«cz9-üjW×Âû’8h©ÿ÷£s ²´µÕÌ­ÍÉWD´°®1\pD0 |¢°?ü/@‚øé¼éy~ç´ì´%u´€àmlU“K¸’ˆt {ä¶ËÁGãµ ¯ ãV|j<|hBX‚:ò;äa•_°Ÿ¡‰!X»"&aÁŒLÜyî œ ç‹ Á9¦ECKs‚KX‚ÊðÑ^¾^àÙŒ©[j¿ð§CãCð­ Ô/±ó¦^Ÿú/Ì*„˜“ ð ž?/&1Ð5·2ǪgGŽãAõŒ*µ‚6Ê•1ŒâÔéS8 ð ùÑü‚ü Œ >Ùú ê¼Ê‚—¦¦$®ëé£ l68e´lfi†YBï'UObÒ`?HEuuå0,%+eÙÂxñÿãƒÙ]>8=8»;#š)ÁûÓgN†b~fol°vú*cYÑÔ…=Ü/€Ç˜dà3Œ»uÛV gvbíòŠóÛ¨Ã.ÛzÚF.Ô6×Rôíë~0cÔÿMÛÞˆ Á]›2(¼µ5â$Š’…wÈR·:ÙÓ R0iXœ6¨CÌ·K`Nc8ða~pDÆc©žg¾­ÐrMN«:n9çµíœ'­×Xrç½·¶·|ýÍ×_}ý•X—¯\¾ñÙÖöÖéå¨ôòy8›âÕ1ïÖšüϯ$ZXÐÒÕ²xYÙZjl¥U¥'NhjorótÃ%^ZxýàU”ž“—”’‘¢vVí̹38Sಸ²xI- 0¾¯©­‰\bñÉñÀ‚EE¶"Ì@˜HâZ8#¼Î#b"à ñjF%e%´_€È |EL‚ ÙùÙZ:ZðÈÀèUÛT‹õ+¯)– qËÁÙÁÌÊ ìGªú*ø)]]Ü1uäS·ÅvÚ%‚O^¸†|ðÐAt‘”– "¸-03À€©‹Iˆ±¶³Î-ÈŬb±tõuO¨ž “ƒ‰ÂˆŠÊаî!õñ|k@‹Ì'bLurF2¦%¯2èW]C?ÓÑ2JXˆN±v vf û ;*42Üòäybã¥f¥u°jÙn•ÛŠ= áX‚Ø'fYM™‘‰QYuÌ51Ò976Öwú*£®ÂQaaŽ ˆ……¨€ã †³‡°EÉ–˜¾ù±70{¸…ñ›cà³KŽ8†ýãQ®g ·R[zOÞÃúö6Ž‘,­×X‡d5¬ŠZEOŸ?}üô±X-m-£ã£—¯^nniž^þôÙÓöÎöȸH¼ÚZ"Hâ ¥:ë^‚¬ì¬à áƒììáhh¼rà—Áo?o¸”€¸T×T‡[ÄS¨¶¤ŽPV^–‰… B r‰S ü—«§+bµÃGã'NÀ?ÂÁÁ»›ÃDáˆnq—¼ÝA ´+d|œ¼­O€Wgy¸àÍÆÞ‘JàzêDuèA-7œ*̘:4²¤NájG.Ž´v·.PCÞ³wz×ÖÓVÚ¯„È Žå8ˆœ=w–t Æ#*°Xç´Îà12XJxU@+—GJ0(Äg¸¬¬¯JæÜçdL/ÁÖ*(-@¾¤²wqŠYÒÞ„óF(A”jÂWb«O¾îê#B=ü\Ü}i½ÆòôsM'MÜ›¸'ÖðØð§×>½öÙµ¡Ñ¡éå=híhÅ!/„…<ä$n%ZXÐÚ³YÛ[ãŒûà2D:r/w—œ‚’Ï–‘µuµá‰€7x+¸Î%õ²°à…{e ² –àˆÑÈ ¿_yf^&^çÁÁ€nÙ:Ro2£ü&ÊQ‡<ˆvR2Sà1WƪîVoo*jŸ?¦sRÓ\£c ƒ ‡q/?/uØ €ÁÑð‹ø¸œ1uKí·¢¡bøâp[oÛuÄC¢¢@PLÊqˆŠÐ|}´´µŒÌŒ|ƒ|±79±œ>{ž‘¬;žB5R‚:äG„,àJ^eç\ Ò)…UcC,wIU 8‡ û ç\’±¬`§aQa±I±8æ ËT\U<}ì³7öìUž¾Ç`< ƒa§ªš*ig©BSÀLÏPxÙÑ߈"šâlÔ;ÜK}ÈÔÖØ=Ha•|”‹[±+ð y{O­Ì>Ÿ¶¦—àÐFö3ÆK :»sââ ^¡x ùY‘­ÞÙ߉ɡõz ;¼º¡º±¹ñö½Û7ïܼuçÖB…ÛwoƒÊˆ _²µº)I´8ã°¼xáäEýþEK½‘©‘’²Žé9épßñ)ñˆÒ0Ánÿ ÿ½Š{S3Sq© ¨€ Kêea¡}ô…È#:>‘V@HõqTCÕvùí&æ&ˆHÁŠ:E`‰o /\§Ó'¨Qç¤êIØŒv`B·1 Óˆ¨.Å&ÆÂ6„û˜"3øb˜Ç9 FMœ°p´ÃpÀS3¦n©Ë©€]¸Îô!c–ܽܩOÑÚ›ŠÊŠUZA¡S~!-»z¸"F6PXÝX}èð!¸°L%C«Õ…9»9Ç%ÅÁNÔÄ%¹…ÈŽ`¥LBã))p"8˃Xí=Ô”¸{»ÃÐ4E5¢SOl˜=u+®éC&Ÿíá€ÒØÚˆ’¬¼,L x‰õÂ% ð  ~;ðð ôC‰ÂˆÌ¡xÝÅ%È`Õ°.%¯bäœkA:Åa5±‚ B̨¨­ï1+Þ)Æ•ÉÏ|ü}ʪËp9}ÏÏÞØ³WyÆ„ãh…—‰—¯è"ng©êèjîhÆÚ©'@‹Èµ¾µè¿2޾Áªõ ÷ !_X^3P5Ç(ЮÔvB_X k ±0‡Ô‡5Iq8Ë’½Ñ1¹±§—àåpJíÎ"Øo8û6·7¯ø>§õÚ ‡­ªú*A± ¯(凌u•­]­ ·Ip+qТ'¼_Õ6Õž<}³¶æ–Ð’¨¨·4p:¹àέ¹1«#€¶w¨Ô„@S\R%ÃTIßu‰Bqž |ë+G. uP²æöÃÏœQ?ƒƒËš[Bë;­Ž¥¼«±ºÜJ´“¯á×Cp»æVæ“ÇZ¯±sëêåäÒk=§ËBd×ܱàg¬ì¬ªª×ÜZ´¦‹àVâ EOÔÿÕüºS¶æ6Ð’´ÈËã5Ûº+(D·ãŸŽ÷ô¯¹%ÓÕÕO¯­9ÜJ´èiÍŒ-Z´hÑZ}ÜJ´½C½8ÿÒ¢E‹-Zß7€ÄAKu6B‹-Z´h}ÿ4‰[‰ƒ¶¤¿”-Z´hÑúþi„’ÄAKþÌŽ-ZËPÏ`õín+ô5Âÿšjïm‡'Zó©¦EK"2'qЮù8iÑúŽ ”­j¨jjk¢¾µÿ5UkWkMSM}kýšÏ6-Z’“ä¿°¢·£NT‡×RMóë º–ºÚæÚïèp¾ÓÆÏ¡¦l­×iwÍPiM)(ûìù³éÿ9×ë§Ûwo +…kî iÑ’œ$Z8Á‘K#7nÝø®ë³[Ÿ]ûüõm ½knÌ÷Êø5zy´VT{ùÚeä×Üž]ÿH[WÛW_}õôù“ë·._º1réÆðk£Ë7Fï<¸ùÅW_<~ú¸°¼pÍ]!-Z’“ÄA[ÝX}óÎÍ«Ÿ]ýôƧßuݸyãÒÕK­Ý­ßÅá|§ŸS¶b¾KŸ^ZscV~t7®R ínûò«/¯Ýº”\œ[Ç¯Ž‡r&%.üÎ)»"FP—ôì‹gmAyÁš»BZ´$'Ƀ¶©úóÛŸ_¹~åʵK—Ç{/v]¹Øåúå‹×Æ/÷ \îšT÷è§CTÍUÁ÷!xuŠÈ%¸5zitôâȺ42~ylÍ ž×ø«Å Ai¬«såòð· ÇûÖÜæ— [«©½ilrª/~zq`d o¨oõ`Öܿūg°-b¾‹×‡ÀÔÑOF® ˆz;£r+LýrÎ8¦ûd‡g•7÷v¢|ìÓÁï–úÆÚSKB¨ÿdû ZZ¯¹V´ŸÝþ ^ãRwõoϸÇ'DÜK#‚Î(Ûâ]ÖÅrMñöÐÃKðøkíàæâŒËWÿ Ú†æúìÜÌܼì9•“—5rqdÍmžÓøñ–Â!Û¿{l!´ßtiP4’å4â¸qÜ}ó¸»Ìè…½/_½¸æf/¬Ïn}ÖØÖˆãš—kdn¦©««©£«AI‡’¶Î9JÚÈ»x¸·ww¬¹Í‹õJwµ~ñåã׆¹_îϯiPwNÛm¨`’¡h‘»×,kÏùä³NiÙuƒ—úAâµÒð•þÁ‹=Kz¤o¼# }öäÑ“G4hi½ÞZ·Žá áÇso„íýªÞäË*Í/,/zn¾Ø×UkÙ¯ž|]3þªZæ§&¶E{.^Gå"Η–,IW&£ØæŽfrY\V4~qìñãGNLLœžYM7kñYØžoL¾©Ñú¦Ùê’§,Öb8Él‚¯ñMÎWåjÏÊ´‡=ä.ºbk!!ÐŽ\ÁÐL­¬¢bbcââ³£R„ááQ‘¡!ááÁ¡¡A!!!aaçMÍòŠ’6 Ñ3bë9o-uCÐ>ÿâùØÕÁœªØ‚ºFe“ø]FéŠV‚ã®å^ݾµì‹÷šç°²+ëF®Ìdmž0»¦¹bÈv&¤ÆGô ·¯hëZªR2iê¨Ë)È\Ì#½cí)Å!OhËhÐÒzµ %ŸŽ5æ\ øäQή‰¤ òŒ¹n¼Ø×YkÁkSvìÞhÓñnPǺ`ÇÅOÇQùÕgçéíÙÙÛ9½$0$°»¿{Ùm^¹F½? V‘KaiÑØØÈõë¸‡ÆÆGFdžGF‡††>¿ùYž ·¸½T×U‡E†MϬˆ¦µ¸´ý âóô¿(>vÑý#¬@û ûô¹rOÓ6>vßvi…ÖBrÂÖ¢@{qCÓ76ŽKHpqs .3ŠlÓ±w¶wô²²¶·6³0×?o`lj¢c`Ÿ+Q{`Æ· =sÞš½!g”ÌPW×hâ "tÜÓå ’÷˜ç)Ù u‚«{nÚÆwr\*öÛ L3Ï:¥¶t‚µÓUZ]ÔØ^‹X³k°jëmê6ê( IDATj¼ÔÃ/ÊRU;Ô;ÒKÜjï¾ÃWú¨ÊCm(éjÃÝîáöŽ~~â.êàÖÐå^TëëDy{_3P=x©7-;ÉÜÚ—¢®†âÊt=|¹·Úû¨gQ—-ÝÃmm½Íxö޵¥?~úøáã‡4hi½ÞZ Ð^¿yrîÍyã®ïÝŒÝñyŒÜç1òÃNÆûcëí­Êdê·;Ôms¨‘³+Pÿtlº¯«jj«ë«A¸¤ªÚªòªòÁÑA8)ܪ¬­,.+®©¯BåáñaR¡äø•q -²Ê²òêrÔ_ñHQIžmíhmjiª¨®ÀeKG jâVWoJP¯¦Ð`EMlioAdIŒAñmÐ õ÷÷—;;ÛKJ‹ëëkkjª Ÿ^½ÂÏÏéê›á:©á4ÖÂàÊšÊÞÁ^” ÷Žž ª¸¼¸©µ ý†G…ëêé…!`ÄØkjÄc¯kªÃÌ4ˆ0„Ãy©ñ£ 9W}efn›HøÛ#>{ìÂã½õCI¦÷2Ž=É}˜øß9†Ü¶^¼ò­µ@SõMõE¥E™%ü„ ™^q æ¼¹µYÔ.½4Z×XGnÁfØ3û)ÔÁ’5Š…¥B²¸3–’ÌžÅݶ®¶ñËÿÄÿõϯ´Ã‡QAÏÈ(4<ÂÚÅ<¢û\Ô¨š™óy7þ™³úª{öï•Û½S™ÃQ;§‘÷-жw·Ã<‹™GÄÞè웾µ`lƒ=Ãí]íóÙƒ!9v$1%<‚a¢, ÖhjibÔÖw©®fs[óìí7´Ïž?Cügæ½Ï8Aî|Æn‹üƒNe§y ÆQ]Üà¶žuÊ%{-óöžOL-®¦6M<Ï̼Ô²ö>´im÷bqg,%̶ýý±@A!AâAØZ ­ ZmpX¨[¢O¹z`‹ªC¼šÇÐæ6ÛN9oVÑÝvèØa5 ¬¼œé#ŠˆŽˆŒ‰ìèîÐÕ×Ew˜gŸ›Ÿ;}k%$'` (D  æ6&>f>{øþŽ;LÍL³ùÙÀ-Á´¸ZîžîdCš[š“åNMOÅTP mmž½ýHk}íÓçOG?í?ëä(§›°Õ€­ŠS¹N°(¡òŠU|ÏI¯ze‡ÒÝæyÛõ“=â nN—“«}RF<¨¶wŸB?¥­¯ÙØü|rf|NA†ƒåÀÅrwžk­¨²¾µÊÙÍAX!@å£'Ž”×#ît¼`gdjX^[ ‚‚ÐUe“'ˆºêc“£êZªª›Ê¸zši9Iâñ¸­£u×P««§3Zkím ‰ ŒNˆhéiܳwwpdlˆŒ³s²émM.zDƒ–Ö÷@«Ú«Ÿ]…“"ÂIßÁÙÞÖÞ:":œ Ëk]\.¸:GÅF"”WK ÀS㤭vV \Zf\â P!Ü¢“‹‚”£èB0ouæì™ˆ¨4 W¿wŒM9»:""Á#gÔÏ š„?Å-DÁ¡Áp|py6v6 Í %%@1¾Î¬"—E%=½]­íÍ Mµõ5µõUÕµU5啥ݽY9$Ž™1œýÊû§Ãá"ŒvÃf Mß@?=+uìíIe’Á B#BGb ‘Ñ‘ˆ‡pëœÆ9į8pÌÎKiä÷›ýnÄáÝI½ÓgùöXoÃ`¢É­D¥»qÿ}3ü÷·’ä]·Œ_™n<pNó¢UÄÖ-à}pX0ŒÇ¼eædfåfÁGGD0ì¼ñy¬Ã$¬…x8³ŸB¥ýJ8VŠ,„Ù`Ð.jaÆÂ#ÃQBLÂÖh1 (Ñ35Lhpì>ì«á,àX–ÈX¶¼cPôW£Šw ŠßÆINËât&?ç[ËQ$¸à~³„=Ö—ã(PÛP;ckå rH˜$ã w>{(vNî1ä1ˆæ1ºŒì ²ýTÕTASœ®J+KÁ`ìaRyöö#­uôuˆ:E@Ñफ़ã6¶òúÉ[ôÓv˜ò•ìKL#[¯Ýyæ‘ÑwصjŸ­PÞ$w«n’CXnÿÅ®éB4™“]n`¬×1 š^bí`‰Ëü’”ôŒ´÷Œ¶»x8¦å&á–©¥q÷H©Ò;ÚaçdŽÌXy¼o¬³FT+(î™Þ É4w׃ÍíýÍ}㼫—sSgí±“G;jÄu:†š‹ï?¼wâ> ZZ¯·$ÚʆJêØñ!¢þ‘þÔÌTÀ¸óâBýü}\=.€"â:ÓÅ/à#°€wFHøl`t%`:xâàìpüäqpg=žÁò *À{VÖV"¿O×7ÜN€Up1äK˜I‰_ ç0uÀrĨ_QS¡­«£ã£»ºI›Ã‡á.ë[ëÉ%ìoïh­®«(.+(*Éåæ ²sò22sÒêjÒ3S‘Ì޾¡>Ê1°SÓFAq €çݽgwRZ ©L2Â2!ÂúÓgNÃU¸ù—ëA¿¼+Ûï"‹ÂéÆ{:1«Þ­­8+?qÁ4eÕ™ÓáQá¨\íX/‹6ö6dæ‰XA göS¨sRõdGo‡xȳ—' ¬2AkØ`¹…­U×R×;Ü‹:Ú†ú|h*+rNû~h=ðÖ)ÿ V}ÐÎz÷¸ûF½ˆZV'Ó²3¦Ç>â“âÁQ—1 1<쟱µ0.3“,~øŠã6Ò|öˆ—€ìºØ„X€œ«Ã=xè ž:{îl^anᘢ­£¥Ÿoû‘Ö0¢ÑÄ㉋]ºž.lÓÔ-zi[ ³öXôƒnÜ{æ”Ô¡dW¼Ë,›a¦œN¼j!X8]ö.¶ñ©ÑY‚4+;‹%ÖöTIAßÍÛ¥{¸ dü€Lª²ý?+Ç¥D‹Ÿg@YskŸ ¯Ü¢ =Cé ’ @‹Ø EIrV‚­£«zæ$:×ilL( ¸ûàî½÷hÐÒz½%qÐVÔW –šÞeS›ÈÖ;âŒuˆšUÈ«P=—˜ð„äùþïð׳3ðˈ-Â"êê«(ŸoØÝötõw N}3b>ð—ð§ðé½C½¤QWbj"©FJB#CA8xvò_‘[ÍíÍ9‚-m-ôHŒ¡ÜߨP}Ë‹ïeå5‹ „yÉiñé™Éñ‰ÑñI1±ñ‘á‘Á%eE)iI0röp(OÚÙ‚¾`3@‹£€±©qrz2œ»‘© Cr’gJ*K¼|¼04blÏ4{8/5~ ³º/Þ¨/nJÉ–ƒý­}qç¯Gí¼™ôÉõè®EËö9<8Ò7ÃþöžvÄ8øù™à.ÆB¬ÂÑwA}pS€’™'wÁ3Ø<û)RÔ/îì¥ÄŠÛ3þéx¨®g¨u´ôôŒLMw*ìÙ±w×1ÇØ_þí!Ù3?å½q‡Â.•#œ“gΤfeLš217±²µòñ÷k±¾¾³·:ƒÁZ-­üÂüì¡–@óŸ{º»yº•U•ååŸ37·¦›š›R'¿y¶QKW "ZZï$¿£Ö)Šæ9²ºiŸdžãU^½ýÄ2ªIÞ„Ë­ú©ûŒâµµóÖÚ~nÐÖ¶T†ùU5•Ff†y)³+ÏΔ傣•¥¹E™Ê•P’S˜aacÚÒÓ™ŸJAt 9(ܯ œßÜ]çèåéëö´#sv‚-­×\«Úñ+ãÄ]5uuÛEW9'wxg÷B¦á ¹uýÓ*LWN~<ïì |1¢Š´¬4\ªª©ÂõÃ/# AH„BxI8,Ä^ ¡-)qtvLLID9\$)AÈ×™‘“W›ÍÏF°%,‚‹))Ä€ SV‘Ëü¢¼Úúê¸Äh +³°Kk3Wwg'ûóÆú¹yY‰ÉñÏìál—ßç ÞZü;.ã’âvíÞÃB™…YU]ÆB2 - à\|QYWÓX#ž ÊéÏÎKï¯N½âñ‡yšùçðsÔñ½öо$‹A«? ;¼;d÷ö€õz]¶ ŒôM7žÄ^E¥EàHƒX926íWÔV„F„"VëìMJM‚1àå‰S'0dÈ …khi`™f?EV‡ ȸf,%y“>Å&Æ‚y(!&akÕŠj(”´&f¦ lÅ=ûö1ÞfZ÷ÎõÎì:¨±%‡=E6}ÆŠ€¬ûìGGÁl%66Àì­…j€.ÂnÄë8"àr>{Ñ7¤ÞÿÇi‡$Œ[ L= rÛïÄÉF&FåÕå8NNâ-:{û‘Ö@Y1h“‹#<âÊéJVy›õÒvgëúU*ZðÁÝmé;ôÂùCí3@ëê圜:¹ÚÏYÒ5Üš”Äêëùóš»êfWž5/x:qõ4 MôOž>Ž’ÊÆ]Cm½ó:ˆ‰ñxÏh»°J`ac†GW; ¹©³VKWƒ€–tAƒ–Ö÷G«Ú±+cÓ][}G—}Lsj·qt›Mb§UŒ(8«^ìªf>Î}v>Îî¼ñyÈÕÃî- z™ Á­Ã‹Ù:ØQx¤µ³ÕÊÆ žŽ”†‡Rnq¸Ÿ”ÀSƒsp¯f–fðï¨Y×\çî厀~¶AÔ@Œ¡¦lt°®¥îh ù•eY¹q Ñ É±‘1á‘1aa‘!!þ™Ùéq 1íÝm³A‹àÆÒÚÒÜÊ^ýÆÁáÁðà°ú%£ü؃Nõ ôŠË‹I¦±µ@‚m°vvõu‰gš=œ—ßW•úYÈŽoÊŽ}S°û›ªsÝ?êo«èïõ·•ÿSµß^˜ BhëhkëjÃL8¢1'XÈóã@(ilitóp;or«@°¤zZ€ñòõ"Ë4ã)²:´d\3–’|å/Ê1KΕµ•âÝ2vy  íìÆã\}}m=}ÅýÊ{•öï?©xÂrç¾Cl%%…ýl¶’Ê‘£GNPoOÚÁ±hÄ`öfo-ÔÄ@¼}½ã“ã±7p9Ÿ=È€»˜Ÿˆ˜ˆÂÒBDÃ:z:^Š«žJ†Y{É+É«××K.Ú,U ‰a˜§Èäô$âtJ;wœ~¨fÅ3|gØÔjR)%-æwïÝ{ˆa˜§ŠÓE(iœ~xF¢àôÌÈËxF¢uz13 Ã0Ì3ÎСŒ\Š–a†a¤ EË0 Ã0†¢e†a CÑ2 Ã0Œ„¡h%‰ø?ñ†a˜uŠvÁô öÅÈc´zí“®ÅÞô¸éú«C×ŽŽæåçåæç:ý2 Ã0Ï í‚©®©~á… Å']~Ý»oï¦Í›îLܱ¿µçvÏ{ßóðòpúd†ažAV…hÑäÕ7Ö'$% ƒTkÔ#c#ãóºjëhKJI “…© TC£C˜ÙÚÞêëï‹eÒ3ÓCBC2³3ûúÆç¿S¦AÛ ‹”¥¤¥`S¾~¾†fƒõ]”U”VUWEDF$§&wtw”–—†G„ãÂÝ ß..+ MËHëéë¼rõʯ~õ«ã'ŽËãåØ,†ûŽÆ½ kY§·¿7+' [(*)Ú±c‡ Zûµðÿø¿ܶ}[Э Û·±å&}&VÄÃÁ§Ÿ Ã0Ì fUˆ½ãž½{^ýõW_}õ“O>¨0–=qòæ¼ôÒKÞÞ VTUüú׿þè£Þ~ûí¿üå/X%4<®jljܹs'æ¼µá-l ‚ÌUý×k³Þ¾Þÿó?ÿƒ_~ùåW^y嫯¿úø“_|ñż÷üÂ|lÞ}ï½÷^úëK8Þ>Þ-­-ï¾ûî/~ñ‹?üñhO¡L,°yËæ¿ýíoýë_7¾¿î·Þ>ÄìàÿÚk¯a›ï¿ÿþŸ_øóœhÇmׂ×9üË_þòw¿ûÝ[o½…qƒ±ÙxèÐ!<,€» â›» Ã0k)«B´qñq/¿ò²»§;zÇC‡¡ÕƒØÐáA?^ÙŠl¸ó“MŸ4êÑîÚ½ ÆJMO…«ö¶ ±§—'dæãç“£ÌÁ‡¢ýío‹&+¾·ñ=¸æFwûâK/ ]v÷pÿðÃýý!BWS§Á¦p_q q]ZÒƒ_ÄŸ~þ~°i`p õöuFÖB#‹½õ ˜[¢ÅŽÙ®Ødh‚ì/\¼ËâaBó¾8€‡ŒNwÆ ŸøÜá Î Ã0ÌsšU!Ú†¦¸òÛ·Tg0 6´³ïð¾¹Í ]%$%üéO*,.D oaæÀÐÀÎ];Ñ/ŽŽýê(†º„…±Œ½hÿôç?Õ5Ô¡-Þ½g÷~ÐÛ×Ûji…žoºßìíïýtÛ§h4±"$ýÇ?þQ¸/4Áâv°qìDˆ&Ë`-ëíW×Vc!‘¶ö6ì•ðÒ±ýZ]½]˜v»é&¬x{àvl\ì×Ç¿FŽ»Û¼y3EË0 ³–²*DÛ7ØWTZ& ;vüØk¯¿ A6g]΢õÔê´ƒ#ƒè Ñ–”•òC¯9>ÿ¾¬ð™#ÈÕå¼ËÆ÷7ê :,îP´/¼ðBsk³ðI%ôÇXKtD»}Çv8%-%=3=95¹½«]¸/E®bîµÜÉq´ËXøØ±c%œ*šRºí7ßzóVÈ-è_oÒôñGÂŽÙ¯%Üé ·ÂKÄY9Yo¼ùv ½ûÛï¼½i“ãP1 Ã0ÏiV…håñò¼÷w÷ˆ¨ˆwÞyçô™ÓMŒ<æõ×_?wþÚDH -¯±ÙhÝeŠî…ÏÐã¾úÚ«—\/EEGA™_:†h[ÚZ¬?,Šz¾výÚ»ï¾ Iwå;4 z£¾JSõûßÿÞÓ˳AÛ€µ ~#Œ®Ý¸ö¿ÿû¿X ÷+n¿«§ëð‘Ãï¿ÿ~hXèåï.éŽٯ…¿µá­ÃGWª+ÑþFÇD¿ôÒK؇ [AãïüñÀð€ÓO †af¥²*D “}{úÛ·ß~û•W^ÙÿÙþÒòRÌì¾Ýíæî†n‚ܲuKž*j¬PWüæ7¿E»ÿþÍ[æ^k…AŸ8Ž®}-Üö»ßýÎæÃJ>¾>yñ/æ6³õZík¯½†^3ÕõÎ]s§Ú¸q#?÷ ‚fœýçþ|éò%,\P\°cçläÃ>öõË/¿ ûbâýÞ¯ª®rúiÁ0 ìTV…h‘ÎîNM­¦¬¢ z;ÅÛý·á¿âÒbØHxAµ·¿7/?¯³§SX º¦=.4Œ>Õ?Ð?95ùÆÍ¯üí•òÊrëíš EÂÿÖÂÊ¢’"4¯ãóÿÅËà¾jjû‡ú…9ºÆÂâB­nî;+ ^AWRVR¯­omoÅ®ö öýסº…%…z“ݪpökáAµZZq¿Ø ì€0JÀ|uÍ.&,§Ÿ Ã0ÌJeµˆv™IËH{çwþ6ºCt·mímN?¸ Ã0 ³FD;82˜›Ÿ‹ŽÖËÛ+"*ÂØltú‘e†a˜ñ5#Z†a†Y¡h—|¤F‡Œ-Æ:mÃ8+ZƒVø’Ή»N¯ˆÕ“‘ñs»¹¾©ÞéO³†ƒ¬¹­Ùh6:Œ©ÕÔÛß;69æ°6)Ú%etb´´ª4:>:)-‰aœy¢\‘§¡hÅÌ}«¾1616!%ÁéO³†“˜š˜˜ž¨®Q«k¤¢º¢¬ªl`x€¢}ú ß7˜ >|Dˆ3xøèáääd”<ª¨Ÿ¢sgâN†"£¨´hvvÖÙOYËܾ›[;{vfvÆ>SÓS•šJK—…¢}ú@´ÁáÁÝ=ÝK9„HÄ¿þõ¯¨¸¨¾Á>ŠV D›œ‘\]SýÏþÓÙÏYË|ÿý÷íô½éÉéIDøŸ™ƒ#ƒÓøsjfJS¯iëh£hŸ>-Y ̉VNÑþWþ-ÚZŠ–H‹ Zôµã“ã#wFTªCG…ÉÂúúÆ&Æ&ïNjê4­­íÓç©EûàÁ\_æñãdzóüøãOº}²®X\´c“c6_¢²”ŒŽ>ûÿ‡ý\âÏAZ:-‹ÿH³CÑ>|øeeýç½{÷p¡‹…933³”ò$D@-„ ””—ܸy#)%É×ß76>¶w §bu]5E»¬>¾¿¿_˜#“ÉÜÜÜ"""„9„ü,­²@‰v¶·¿Wž WkÔýCýͭͱq±:£îÎøœ„ëE´ƒ#ƒq q9Ê¿¿ðˆðŽî¹Ÿ’mik‰•Çúú'&'võvay¼<+'K)áIÏL lljŸÝ—Ë"dU«CÑBjµÕÛÞÞ^YY™’’ÒÛÛ‹›Ð’êõúììl³Ù eâ²xåÊ•‘‘L žU*•B¡¶>V:®¸¸øîÝ»ìÏtÁ IDATF£ñÆ+wbµÆâ¢íìéÜ·N]œØÊ<¥pcáôŒôèØh­N‹Z°)¬õÆ›oxxz4š*Õ•Þ¾Þ˜cn3[o95=UU  Åf…ï1µ¯”´Œ´¢’"¬ÛÚÞ*£ÃBÃ>`a\­JÊJyŠÈ¨H/¯â²bl‚Þ¤VÏÈÊhhjض}ÛÑ¯ŽÆÈc°V]c]DT„R¥´nÜmDûèÑ£üüü“'OÖÔÔ EW__?==]VVƒÅrssKJJàcÈÅ˦–,…9Ñæ+q¾ Œ ô õá_!˜îîVת׋hqáxû·¿»òšúËß]“…  » øãä7'cbc°Ì{߃‰¯»]ß¹k'®,Þ>Þßž™kêë±*ÿªkÔE )~þù牉‰Ÿ:u Ã丸8ô£(àîînØ´ªª ¥n±X0Gm__ŸR©„›322RSSQáâ±B¿;99955UXXˆA7.+{rµÄÏŠöwß¹vã гº ¨`N]e%z¦¥§Å'ÆcômS°ªPõÑÇe)²0*?rôHHXHPpP@`€øÒ.&öìÝóùϱp@P@¶"sl*µ³ÿ³ýW®^ÉÌÎìèê÷Ça¡a¯9Œq÷t‡GQ¤pí¡Ã‡,/áG0qX¦¦¾æè×GÝÜÝÊ*ÊÌ3l‡“_˜/ŽƒmDûÃ?`ð.ŠÕ‡K$&ººº|||0 éééÁ”^@@ßÜ%KAíèØ(Yû`ŠBXG¢Ý²u šz”_aq!*ÛÙ݉z½¶£ø7o`”=êCømÛ¶aÝji=ðÅÔ?š`\¤0¸Æ0ÜúZc#ZøúD“zâĉ<Þ . €ÑËb¤Œaruuurr2æ¢ÍËËÃÑÀ%BE‘£¼­Zä„„úôôtŒÇWðÌ kŒŸí¦M›à¤‘±è34,õ½A]E¥E°úH‡å€“õ‚¢…ÆÐGvtwˆ›Å*°,JU ©Óœ;ξR0çà— Š ¬;r¡BÃî ¢Eaî[þòЗssþ[´Ös¹ 4ÐhšÑ[{z{v÷v;íOó/,ÅÆÆŠ¢À­¥ó`ÂÝÝ}hh3Q×®]£hÉR€hùŠÁ‘Áî¾nû *+5•ëH´¸(¯náŠsýÆuT>®2¨L ÆO|sâÚõkÂ2¨vჄ Ì9uú”Ëy¬C ¯V9-´úøñcaU‰‹/bÂÓÓ]©L&C³ ¹Š-ºX¡ìáÚë×¯ŽŽÚ>¬k2™\]]ÇÇÇWè¬ kŸíÞ}{»oϨ¤¼ŠíéëÙ·MœÒp*,å°Ñ"Å¥Åg]Ξ>s-£µhaÁJu%¦[ÚZà? êm*ëb¾±Åh_Œ M”(zb‡ZÅÂèq­ç Õþêë¯ fÜ£€¿ø )‡†²-Ž[{{{~~þìì,¦½¼¼ÑbÈëááAÑ’¥Ñæ¨rPSæv³}Ú»ÛËÕåëH´ÂUCííþÛg\Îàcé´DÅD¡PÅel&PÛÁ·‚ëêPöP5F.âfmD ­¢8m& K<Þ®®.T2Sô©â{´UUU ‚›/_¾l-Z­V«Óé à‰‰‰   ¾GKágE»mû¶&}ÎäÜüܨè¹%¡[á“ ƒÃƒ8íË¡«§ë‹ƒ_@~XöÂÂ)i)Pšøñ(ÌGu ÅfÑÑ?qܾRDS:,F› kÑÚ÷¯™Ù™øÓl1ïÙ»s¼¼½„«Ó3Ó•¹J¬‹ ˆƒàŸ- ³»»»¨¨HøXâÜ1ŒŠêììÄt‹i¾GK–œhórºz»Œ­ÆF}£¡Å`j3ÍMõ-ú¶Î¶²ª²õ+Z\k¾»òÝ I »vïºzýê"¢Å°]!Ãp>4<W–…:Ú…Dk6›³³³áÎÌÌÌ’’±£E=çææÖ××cL~wffF1sl*Eèh—/ÚpYøåï.coýü6¼½s"¢"|ü|*ª* &ƒð!/<œÐ°PñóP?+ÚÆÆF77·ÊÊJ“É$ŒƒQn¸4éõz¥RYWWç¤'“.ÔÛß‹s; (ö¹3b__â_ooA‡„„…xùxÕ5Ö‰›Å*¿<¿BÀh.…Wzì+÷‹ûrXŒ6P£°paIa“¡IXX˜ƒ~:Lc|+Åœ9ûF„ ¯NW×T‡£SGi‹÷âP´:®¯¯O˜Æ…(""BxC…†cˆBÃLÔ)ÊVøœ!?Ëœhs³Ñ¹¢…ÍQ圻xÎõŠë™sg"å‘uMuhm‹Ë‹×‹h% ¿ЬœòÍP_^=á7C‘gD›•›en77êtué9éÇN Õ4j0GߢG_KÑ.+-Y 8K´n7ÝÚ;Û^†CÑ’gƒ ZS›©¶©©ÑÖ”V•ªëÕŸZ“¶°¬¢]VæD+ îìî”æ$dIÀ%NùQ%~]¢S2'ÚÌdµFÍo0%’Ñf*3 fZXû4è J ø£ËÊÈØHBjB…ºbfff–gpoö^GW‡÷ƒ!üQÿ ù%ùÙÊì±ñ1g?Ed-3>1ž–f4uÍ:û@´y…y]½]í²ŠC•”Œ”ðèð°¨0†qJbb„OQ´ÖéíïU¨²™ÓŸ f ÿĴĬÜ,‡Qæ+›ŒMccí²‚Ã7÷£ƒÓS ãÄLÞÄ©HѲ6™gáwg n]¨6)Z†a†‘0í’Ôè±ÅX§­cgEkÐ _=ÈŽÖ:#ã#ævs}S½ÓŸ f 'Xs[³ÑltS«©·¿wl’//#££¥U¥ÑñÑIiI ã¬ÈåŠ<ÅÈØE+—¶F}clblBJ‚ÓŸ f '1511=Q]£V×:HEuEYUÙÀðEûô¾3n0>|øˆgððÑÃÉÉÉ(yTÿP?E+æÎÄ EFQiÑì쬳Ÿ"²–¹;}7· wöþìÌìŒ}¦¦§*5•–. EûôáVÕÀÜV8ãÿÑ®æüû +jø…DZ¾ÿþ{ˆvúÞôäô$‚¯¥­eîÿÚMO’ÒÔkøÿh—Š–¬œòÍP«<üf(òlD‹¾v|r|äΈª@uèÈ¡0YXß@ߨĨäÝIM†ß µ¬,.ÚØüÒ–ýœäÇäü¬OžwÑbÏŸâK¦L-¦‘±‘…nu(ZLÏÎÿô¬Ÿ,²ÆD ¡B%å%7nÞHJIòõ÷í˜û9êºjŠvYYD´(f???á§.Å9éééwïÞ]æóºýýý¥¥¥mœ¬fžkÑB±.ç]ZÛ[Ÿx­s‹­e/Z%\Î;g]•„,ˆVY D;ÛÛß+O«5êþ¡þæÖæØ¸XQwgüNÂõ"Úzm}Œ<¦°¸019QøuuQJ•RøË’²Ež"2*ÒËÇ«¸¬xt|sT*¬…Æ—Ë"dU¯Œ9í½{÷ŠæGU_¾|¹®®N¡P$%%õööb;ÔF£±¶¶V©T–••MOOÛ²òòòúúúÌÌL“ɤÓé’““ ºU¬500 ,SUU…íÀÙ¹¹¹Ø¸^¯ÿá‡px›ššlvc¹'yxÞE{èð¡Â’ÂèØh´=·ç~\ϾâzúzÒ3Ó‚P¶z“·nذá’ë%5þ ºz E-þ\®½hQ(–ƒŽŒŒ8÷ù"k‰9Ñæ+q¾ Œ ô õá_!˜îîVתׅhMf“»‡{hxè•kWÞ|óMŒ50ŽOŒGÝÆ%Äå棒Ý=Ý·mß& ƒkQö–N æ9z$5-µQ×XßXáIFVþUרŠªÃCS©T+ÊûìÙ³^^^jµ:11¥ð{ï111‡NIIÉÎÎÆòÖ¿|‰+¦‹‹‹¿¿?n=}útPP¶aOLLˆ¿Ye„íÀ²ÞÞÞùùù¡¡¡===ÍÍÍ6»ÁWÉÖÏ»h÷îÛ{ìø±„¤„ [AQ1Q˜cSq˜ƒ!¯¯Ÿ/Êë…‹´zíæÍ›1˜sãæ Tîõ×»ow;-ª •‚ ruu¥hÉ "ˆvtl¬}†F‡p¯ Ñ¢€Q®}}²éˆV‘«À`¹¨¤=«§·gwo·‡§Çµ×ÐûÃ_úËxxy„„…à0¡bÃ#ÂQáèt³r²Ä÷“¬E‹388êÇ…u¿tézSÔùØØØ… ?~,Š6 Kb¾$*"¬… SlÆECŒ­A´XË^´è‰ýüüàס¡!øU­Ín¬èEV)Ï»h??ð9üŠjÒuç/žG;k_qèh1>Öt©é©óÈØˆðk¸¸é¢ëE/o¯Ú†Z³Åì°£ÅñÑjµ¸ìàš(ÔŽ³Ÿ1²vÀI¥ÈW Ž v÷uÛUY©©\¢  ÎÌÎDAB¨û?Ûâ„A¿úú+˜õºÛuÿÿÛ·¡U ŸÇ­~ÎsPäœS§O¹œwÁxËcíP´pÛÍ›7!<áÁ¢¶ñ¡@Lß½{÷âŋ֢ÍËË>»tíÚ5R.—ãhCqQÀZƒƒƒÂêÃÃâVEÑbEA½SSSqqqPuBBîB­ÍnõÀó.Z maDL[:,hm!ZûŠkhjðñó  ¸ríʶíÛDÑb­&C“ëw®X%.>#c{Ñvww£|P2¨¡¬œýŒ‘µD›£ÊÁ@ÐÜn¶O{w{¹º|]ˆ6=3AÖÔ×lÙºʼn?•¹JÔ*20<€2†Vs”96¢çß ®k¨Ã6‚‘‹¸ekÑÞ¿Å¿*½(ÈŸ‰FÄ’ãããׯ_ÇU ¶¶…)qQ–W·­Z­ÆŸ8Œ§OŸÆØZíëëƒYÑ ¢µÙ )N,²ÚxÞEûÅÁ/0¨…uW¯]…hm*0nBRB[G[Qi‘ÐÑýꨱň- „;{:KËK|q@üx”µh³³³9âêêŠkΦM›‚ƒƒù– Y)æD›—ÓÕÛel56ê -S›inÚШoÑ·u¶•U•­ Ñ¢…¦Öí¦Û›o¾ÙÒÚbh6È"eÊ<¥<^Š+Ô"¢E*Õ•²Y~a~hxhbr¢ÃŽVxs´¼¼©ðí"¢=zôh~~>úÚÔÔTHQÅwÐ,”§-zÍæææ'Z…E híCÑ’gƒ ZS›©¶©©ÑÖ”V•ªëÕŸZ“¶°¬p]ˆv|þÕcÞ *VÈœheÁÝOôÄð}S²²À%üQ›Ì‰63Y­QÿøãÎ~~ÈZ¢ÍTfÌ´°öiÐ7”ðG–•‘±‘„Ô„ uÅÌÌÌ,!ÎàÞ콎®y’|îC(Úÿ FÕù%ùÙÊì±ñ1g?Ed-3>1ž–f4uÍ:û@´y…y]½]í²ŠC•”Œ”ðèð°¨0†qJbb„îQ´ÖéíïU¨²™ÓŸ f ÿĴĬÜ,‡Qæ+›ŒMccí²‚Ã7÷£ƒÓS ãÄLÞÄ©HѲ6™gáwg n]¨6)Z†a†‘0í’Ôè±ÅX§­cgEkÐ ¿IÅŽÖ:#ã#ævs}S½ÓŸ f 'Xs[³ÑltS«©·¿wl’//#££¥U¥ÑñÑIiI ã¬ÈåŠ<ÅÈØE+—¶F}clblBJ‚ÓŸ f '1511=Q]£V×:HEuEYUÙÀðEûô¾3n0>|øˆgððÑÃÉÉÉ(yTÿP?E+æÎÄ EFQiÑì쬳Ÿ"²–¹;}7· wöþìÌìŒ}¦¦§*5•–. Eûôyº/¬ de™û þ?Úÿο¿°¢†_XA¤åûᅦh§ïMONO"8ñZÚZæþ¯Ýô„ð!)M½†ÿvY¡hÉj€ß e~3y6¢E_;>9>rgDU :täP˜,¬o olblòN³^¾j¡X:-§H0¿Ž|é±-JúþýûÓÓÓ³³³Â÷Ñà9Xè›ýqq|ðàðñKR…_±ÿ|üøñR~zv‘Ý k€•íÀЀð8£ã£Ãö àŽVüKÖ¬ótÅ(Ö²‡¢~ɇ_ÍFVA´*tPR^rãæ¤”$_ߨøØÞ^œŠÕuÕë]´Á!ÁùEù˜¸z« ¨àIW·-j¸µµ544ôÆø·±± ´X,IIIÍÄÄ„ŸŸ_PPÐý–ˆõñWWW ¿Ø³ôµÈÚceE«®QûøaBgÐ%§&ÛÜ ÅºœwöUŠ<]1е,Ä^´8J¸þœ;wnll̹ÏYKà:¬,P¢ííï•'ÈÕuÿPsksl\¬Î¨»3~'áZíÐèÊõVÈ-T`•¦ Ãs 7ô&½pkFVFCSöíÛŽ~u4Fãîá.‹á²âíã]\VŒ…qAÁ…7EFEšÌ&üYRV¢*PaަNc/ZŒ”}||ðq܇‡‡###›››ƒƒƒqì’““q+~~~~IIÉää$ºRÝ»wGDD nooÏÎÎÆbõõõXK–••aÉøøx.4¾â1~tVxvÕjuMMÍ£Gpéïï~€wýÓü/àæææB®z½~ffÆz7Vò#«ƒ-ºÉK®—6oÞP¯­/(ž^O_OBRB|b<:]ñ›1º­k¨ëì‰òô/*)7e¶˜QPX1:6ÚÐlgÊãåò·w¶ ¦e¤a1ñ·Ÿ/\¤RÓS±Y¡ô0³®±."*B©RâaÚW7kYXÞ^´ãã㨈ƒ ¿MÈŠ0'Ú|%η‘¾¡>ü+ÓýÃýÃcÃêZõZ-êð¦ÇMÔ¹§·ç‘£G:º;l~ݽ¦¾æè×GÝÜÝÊ*Ê Ú={÷$%'EFG:|ÈÒiÑ굨óÌìLŒ¯ƒo£¼Ý=ݱԴT­Nk/Z4¦7oÞlhh€Øpèa>ô¬®®®˜955UUUU:Oee%\+ÞÔ××wB“YYY˜c6›aÓ½{÷²EEE×®]3™Lâ1ÄM2™Lèe5ð22¶ T*á]lSø%yXÖÛÛ^Go ‹‹÷+¯è9FV+(Ú‘±‘°/}‰1e~aþõ×q’Ã…0æË"eƒ¢v 6s›9>!¾ÉЄ29}ö´Þßßh­UŒÊq±°mVN–µƒ1GyÏ¿Hõõ±¯1~—cóa(Ôóìì,czzº››[ww·h8´•gÏž ÇŸÑÑуƒƒÖ/£…ž;­â&t¢ÂG6l~%7>}º®®®µµ511†ÆLt±Â2pêõë×GGGaܸ¸8ØýîÝ»íÚfåEëöÑBx'NžÀ©.ÜŠ9ðÅ[!·.^º¹âÏΞN”Ø™³g QL[oç¬ËÙÁáA8Ýg®*WS«Ù»oïµë×°Y¨×`2`™«×¯Ú|´ …†&káN¿9õÙbF!õõW×n\ÃŽ¡¢oÜ^¤ºíE‹JDÁ¯Ôâ²#¼½BÈŠ€ xŽ*ƒBs»Ù>íÝíåêòµ,ZÔ*êÐÐlhÒ7ad-”bfv&ª¥»gïÌñòöÊVdcŽ}³›‘•‘W726ÒÕÓ+ ¢µ®dÑÎàª÷ðáØ˜½^/Nx5;;·¢ì±$þå×ÓÓƒ&µ³³ÇÇÃÃC­èE{Ñúúúbûh—‹ŠŠJKK=zTUU…fsàT´Ô-Œ;==Ý×ׇöº©©IÜ;¹ÈjbeE }Âg(A´°ZLü‹³}`xó¿<ô¥Z£.(*€ä aÌG¿Ûdh‚…÷tEÑBɨµþ¡þ«×®byA‡Æ‚¿b÷ü_¢õô€³q_Ýß]ù®½«==3]™«D1"Â>ØW·XËö¢Eé9rÄÕÕלM›6³ÈJ1wåÏËA [úFC‹ÁÔfš›64ê[ômmeUekY´0å ·0+®ãï(ÅpYøåï.çåçùømx{æDDEøøùTTU ¶mDkl6FÅDaŽ’Æµ çvÏ⢅ð”J%\ ±UWW£Ý‚>áÅÆÆF´žùùùxìjµ7aL-Út``¢-//ÏÊÊÚ½{÷ÏŠV¼ *EÛŠÖýqnnn}}=îB&“ÍÌÌhµÚäädøêÕ«ð½¸|vM²²¢­­¯={@5ŠïѦ¦§Î}00:Rx24:„ŠÈÈÎPªƒQnGŽ).ýÏ[­(.ÁÐ$,hj™ûÒWTSzF:ªÒÏßÏd69íÜ{´;¶ãqwp<„*‹”)ó”X=4,Ô¾ºÅZ¶íìììÈ<¨;‹ÅâìgŒ¬ Úì¼lt® ºÿ ÿäôäz]}AI—¯WQyQ‹¥¥¤²d-‹õ‰.œš•“"ïèî“…áê ÈUÄÊc1gξḂàš"ü¢'’’–"| 4†íA·‚¢c¢1*ÇüÂ’Bq{Ñ‚û÷ïÃmð(t } sŠ‹‹…û¢È EzzzGGŠ}§ð?sЉšL¦””á3ÉhCÅ›€N§ÃñZß XƒÁ€ël[[[jj*t‹„ûÕh4r¹Dm½Ë:§ÈªdeEÛ7З”P×X—_8÷fP8ÐÊDøÔ±P ˜ol1¢Ä0¥È‚J“…‹¢=~òxl\ldT¤Î¨fB·ØÔ­Ð[5õ5ÂwèwaÂâB¸98$84<w{Dªkª1'*: «8¬n±–úÔ±@YYÙý‡:BgN´¹Ùè\ÑÂæ¨rÎ]<çzÅõ̹3‘òȺ¦:´¶ÅåÅkY´Ï üf(²Xß å°[}fá7C‘gD›•›en77êtué9éÇN Õ4j0GߢG_KÑ.+-Y ¬NÑ ÿóÕY÷NÑ’gƒ ZS›©¶©©ÑÖ”V•ªëÕŸZ“¶°¬¢]VæD+ îìî”æ$dIÀ%«óG$ý¦ÆÅ3'ÚÌdµF-|*!Ñf*3 fZXû4è J ø£ËÊÈØHBjB…ºbfff–gpoö^GW‡÷ƒ!«L´NWlÀ IDAT Ÿ_’Ÿ­ÌsöSDÖ2ããiÙiF³Q׬³D›W˜×ÕÛEÑ.«˜1TIÉH ‹ c§$&!Fø˜EkÞþ^…J!‹‘9ý bÖppñOLKÌÊÍre¾²ÉØ461FÑ.+8|s?:8=Å0NÌäÝIœŠ-k“yö~wv¡àÖ…j“¢e†a CÑ.ùH[ŒuÚ:†qV´­ðS¬ìh­32>bn7×7Õ;ý bÖmt =c“|éx-­*ŽNJKbgEž(Wä)FÆF(Z1¸´5êccRœþ1ë6ñÉñÉéÉ=}=íÓgøÎpxt¸Ádxøðá#BœÁÃG'''£äQýCý­˜;w2E¥E³³³Î~ŠÈúåÞì½,E–Ψ£hŸ>ü ²˜ûŠUùÿh˜aE ¿°‚8U‘ªQ×HÑ>}(Z²Xß åÜð›¡È*¢ý¯˜ZL#c#‹/369fýµéö¿GûàÁƒ{÷î=zôïÉ~9dffæáÇ ÍÁZßÿ=æà_û_ïzüøñ½y~øáq¦pG ôüQÜøOó?R‹{¼ÿ¾ýÇþ¦E¶ß2¦…oê°_3ïÎ3==-<(¬+<<¢…öœ<ÎíàÈàÏÎøü@›’î Ž€ÃŸÉŽNWœ~ÖU†" ,ü´åBsP˜ã°"ìkYÜÈB?ÃgS¹( l±/ û›YØ~˯8wÿaSx Ø2ˆxá"+Eû_u9çÒÚÞºøbÝ·»¿=ý-jXøÓZ´8Ñoß¾ççç—““#¦³³ÓÇÇÇÝÝ=55Õáá°Èår77·˜˜˜ÁÁAë#†Òª¬¬ôðððòòÂqêYø­Ü‹C¢rÊËË322„?Q?eeeÁÁÁááá8øÖ_GgÓ" ÛoUžž~óæÍ€€“Éd½0*ó]\\.^¼ˆÇ%Ô³F£ñõõõööÆ#²/~²œ+Ú[¡· Š ~v1ÔΩӧÄÚ‘¤„Ïÿ§„mD;>>ŽªDÕÄÇÇ÷÷÷ sd2Îψˆˆ…æ "rssq2£(p’ÛsûZþi¾œq’cSŸ&ëÊEQèt:Üc```uuµµ­íoZdaû-;¼n ôpN:…Ú¼téR{{»°nHH¦páZ™“’ükM´Ðž2O©ÕkQf%e%ªUŒÅ…±‡4`;(xa'QϸF`É\&p–t†’¥á\Ñ ¿ÓŒ¢@¡…G„£¦rós†Ðé¢^|ü|„ŸÕ‹Š‰zãÍ7<<= &ƒèÂJu¥·¯7n2·™mª²ÉÐTZQª7ê……û‡úóòó°Šð[J•R|m 6ŠŽÊÊÉÚ»oosk³CÑ¢Êêëëq–b(‰“3aP)Tj0RRRÎÁè066'9N`œðÖÇܾ–1K¢N<822bÿ4ÙTîÐÐÆ’ ‡……á.Ä%ío²Ÿ366†:u¸eû놸0ö7aˆ Ö&ê4::º©© ãñbI‰ÎÒuËZmaq!\ÚFa»{º9z$5-²¾±>6.eÕ5j ~!`_?ßÄäDÈõÂÅ póæÍ›1³Ißd¿0œt+(.!îèWG7oÙìP´8qQÂé«V«ñïÝ»‡1¦ðã—f³ýŸÃ9u¢N¬_pA=`ø ãJ «¡þ1³»»»¹¹ùüùóE‹Ê¯ªª‚ÕÄcŽBúi¾ÀpGÖmû›ìç@œÂû-cð‹‡‰}ÀXã}ë…ñ£-ÀL\¹&&&0'//Ó ½(M–ÃjmKkË ·±òØ0YØÁ/ u u‡B=B®™Ù™ªBÕG”¥ÈêìîVD‘¢BCÂB‚‚ƒPVÖUyþÂù¤”¤à[ÁP,Æ:8$¸¥­%>12F1ææ£ácÔfbRâÅKqµZH´°Ž0¼ƒu|||P§èázzz~š?ÛÎÒ`P‡oëØ×2&06Å%¢CÑÚT.júÄfÑqBu¢5Þd?w-´Ýö[¶¿nˆ ãßëׯãÑa”€c‚°.JÅË·u$bM‰:Dc´‹Úë¾Ý2Cý£†‡F‡06ª·¸¬Ã^”4ÆØ¹µ½UgÐ¥¦§b Œžõð‘ÃB•Ú,ŒÕáì õ\w›”°c燢yðàAVV)†ÏW¯^^&ÅŸ;œóí·ßb4Šâ‡–l^·A£¨„ OHHÀü§ù7Tೋ/.ô6*:ˈˆ›ù(¶ììl‡ïìÚßäpa›-£PÑã ûsóæMëMCrr2®hEEEB¯ïëëëïïO·¶¶òUV–Õ ZT¥Ó‚ ÂØãQE®B-‰Á+ö­³§óÀ¬_:D e645ttwŒÏw´ÖU‰6÷ÛÓß6húú ÞšºÜ‘,BVTR¤*Pyz{v÷vÇ%Æ%§%£{.¯*ÿø“­¦KçÁ„»»;ÔõÓ|KwíÚ5œ“ösð/NxoooœÀ6oëØ×²ðDÀUW®\q(Ú…* £v¸ŠýM¶Ù²Ãë†äŠÑhkkÃðe‹z¼pá°omm­Í‹Òdù¬5Ñž>{ÚÔb²®˜R¸éÔéS.ç]®ß¸~Ýí:F͘ƒÚFãpåÚ•mÛ·‰¢µ_‹j×uØj~ÿgû-NtœÖc¥xãÆ ±a&‡sN:UWW‡:)..†¢JJJbçAa£0ñ¯y .­V+Ü ÎBQ¡*0”Æ2¸uvvV¸c[Ѣ݄҇‡íŸ!û›YØz˨v”åOóï'a”`ýŠ“°Ã?Í¿¼†F#‹ëTPP®b>cTÁ÷V–Õ Úá CQSþþ[·nÅÈ/6.öŒË8®µ-¦‹K‹Ïºœ=}æ4ÚSûªŨ×ÓË…ìæî1cèüÕ×_]»q µ‰;º=p;08]2ÖíêíBm."Z¥öööüü|T ¦½¼¼­¢õðð€Víç@´èQ›MMM0úH¡6u:}-‹÷"ŠÖº–…[ÅÊŸ;ÔÃìŸVû›YØzË ]7Ä÷qqé0X­°ÅbÁõÝðÓž†Ä1kM´~~z£ÅÙ?Ô?…ún ¾Œñ5&Ðà¢þ1BÅu¡­£­¨´Hèh1 7¶.ŒŽ¶¦¾[ÎVdïÚ½k!ÑB{8§«ªªîß¿ÿÓü'o…w:qf£G*Ü~Ô%|’°ººåŠó¾f”7´E¡ºPÏè’q“pGbQa-\°pCCƒøÊ³µQi8ìh+{zzl^û²¿i‘…í·ŒW«ÕÂg‰áNñf€ƒ€Kö #Œ¬q¶‰=Ęvssãû@+Ëj-Æ /]¬­¯5[ÌßœúFx×¶ûvw«¥…éèßÕÓõÅÁ/l>Ÿ S¢—MIK>Q_6U‰-š Xë›o¿kñgzfº2W‰ P;j qfv&*±®±në§[-Î=TÎCáÜ›;bQQ & WLcû9r¹¼¿¿[Àº7oÞD;(Ô&&ìkY|.DÑZײp«hgffp=„¶í_㱿i‘…m¶¼Ðuã§ù† =nÂå7¡¯E±gffâOÌDuÛX™,Ÿ5%Z¤ ¨U‡¢EUcð+Š©TWÊ"d5‡†‡&&'¢Œ¬Œߜؼe3ê— ô¯PµÍÂ(æ uEtl4êùø‰ã ½G‹s ¿¿?ÚS“É4::Šs7//O¥RáÜÅ9ÝÕÕe?6B\^^=ã˜à_ë#†‘5¤èQ«999â;¬öãbk¬uØÛÛ‹±¹R©Äµõfýq_û›ìçàª$¼ e¿e4@ŸÅó`!.ŒÇ…¡1Æ ˜§z``×8tÀDã’±”³‡,‘Õ Z*Õöæ[o ïÚzùx¡Ä®^»ŠÁkO_Ê'3'­§°"L‰LJIºrëøÉã­MU¢Ð0ÒE/ûùÏ1Æ*ð®,R¦ÌSÊãå¡a¡xÈ“!:&wwíúµEÞ£mllÄ¥„ÚÄù‰#¦Ñhp!ˆ'íkY|.zéø§ÿ®\ CCCCãââ0VFeYšýMösûð›¡Èj€ß e~3Y%P´Ë EKV­}(Z²J h—›9ÑÊ‚;»ù9=âLàþ¨€MæD›™¬Ö¨ùɈsQªõí2226’šP¡®¾ò—gϽÙ{]ò$ùàÈ E+flr,¿$?[™=6>æì§ˆ¬SP›Ã#Ã))Í­Íí²Š¹­£ Ç1<:<,*Œaœ’˜„ás­uzû{*…,Fæô'ˆY·‰”G–«ËGÇG)Úe‡orzrjzŠaœ˜É»“8)ZÖ&³Ú‚“p¡Ú¤h†aFÂP´ Ã0 #a(Z†a†‘0-Ã0 ÃHŠ–a†a$ EË0 Ã0†¢e†a CÑ2 Ã0Œ„¡h†aFÂP´ Ã0 #a(Z†a†‘0-Ã0 ÃHŠ–a†a$ EË0 Ã0†¢e†a CÑ2 Ã0Œ„¡h†aF¬"ÑŽMŽ!N?"wl)ˬÎg†aœ›U!ÚŽ®ŽÀàÀ£_½pñ‚¡Ù°Ì‡Ô7Ø#Ñêµ+²Vß@߉“'âãŸÍÎ3 Ã0k,«B´±òØ—^zé½ïýê¨Î [æCª®©~á…òòóVd­Ûý·¿8øEdtä³Ùy†afÅù¢mmoݳgÏï~÷»SßžÊUå&&'FDE¨ T!a!Ec“cmímñ ñááµõµ£ã£ãó¯Ó6ê1'6.¶ÙÜl½µÁ‘Á+W¯üêW¿:~â¸<^.¼¢k³p{g{¸,¼¤¼äÎÄ–Ö– [Aå•å—¿»l½–õo…Þ*,)ÄDhx(ö{… ô¸mm­–ÿì<$ bfRJR˜, ahtÈéO0Ã0 ãÜ8_´êõþð‡_þò—úÓŸ¼}½÷îÛû‡?þáÿøÇßþö7(³·¿×åœË«¯¾ú׿þuë§[Õ5VinmÆb˜ƒeÐGZ:-âÖºow¿ûøÅ/°,óÙ/ÜÙÝyìø±ýŸí‡¹¯\»²ió&8òwÞ±^KÜ`WoîÝí¦›0ñæ[o¾ÿÁûØÚ‹/½xÉõ¤+Ÿ/,{âä ,†wÃÛÐßvúsÌ0 Ã81Î-TôÝÕï ªŠªŠž¾xîOþS@P€¦VÓdhªTW~ðÁ§Ïœöôö|ãÍ7°$,˜”œ´aÃwO÷ —.¼öúk)i)âÖÐŒæ(s~ýë_Ç%Äutu`ŽýÂX-ì;ï¾sèð!è0*& û`³–ÑÂÇ ‰ E%E;vî€tM-&qç1& }ýõ×=¼<²Ù{öîùdÓ'h¦þ3 Ã0NŒóE‹ ‘}á…ZÚZ @ˆvãûÛ»Ú…›¢c£ÿøÇ?þêW¿úõ<ûöï={îìo~óa&üü­·çýÏÿüO®*w|Þ»ž{…ùÚü¹cÇØÝf-ëØˆöü…óXûpÝíú_þòs›ÙzçÑ΢ßÅL,”:ý9f†aœ˜Õ(Ú?ùX|Å5FóòË/ûúûfåd%¥$ £=wþÜ[o½%—gfgbfƒ¶Ázk‚2¹ á Z‡ Úǎûío»qãÆúÆz›µ¬·f#ZøU˜ïåã%ì³õΟu9ûÞÆ÷´:-d,‹”½øâ‹%e%Nކa'f5ŠvÓ¦M⻤eeï½÷:E´¶;wí  ÆMò8ùo¼áéå°mû¶üÂ|ë­Uiª~ÿûßãV8´_[ÈÈÊxåo¯>zøõ¿¿ŽÖ¶o°Ïz-ë­Ùˆ6û,NŒÏ ^ýu¨=2:rÓæM»vï26þ3 Ã0N̪­¯Ï_^œ{^Ü¿ÿæ-›EÑB^Þ^o¼ùúÚÃGëMzÌ4[̧¾=õÒ__‚A]¿s½=pÛzk&³iûŽí~áÏ—._Âínnm†³=bh6 W~ó­7sU¹“Áz-qkðëk¯½vÓý¦8a³ÏâÄøüG±ÜÜݰ·Pï–­[òTyÖŸ«b†aÖaV…h!¼‚¢á?ÃT×TWTUXßÚÛß‹v­-”)x "lïj/-/­ª®êêé²ÙÚèøh£®±°¸P«Ó:\®-*)‚³qÔˆýèðaëµÄŒŒÌ-lÔ‹6ûl½óãóÿïV­Q—kõZZ–a†Y¢e†a˜µŠ–a†a$Ìó$Ú¹ÿ횟“¥Êb†a˜gȲ®©npt°¸`xÀap“ý÷=O¢ÌPfܹ;so†a†aže:º;Š+‹¡Ò©é©é{Ó315?ߢÍVeÿë_ÿZh'>óš/ñ¹!„²|lD‹[,-Âç¤Z;Z×”h!T4‹ð($wæÌü)ÞolllMM $9¡ƒ tqqinn†ÕŒF#Œˆ!T³Ù ‹­0ÚM˜ ªÃMƒ¡´´BýþûïÑ5B–¸/aËPurr2St½xŒpžB¡Àn`ÝúúúÆÆFqO ÚcÇŽ¡Ån9rÿâ^Ο?N·¤¤¤©© «c7 TØZ­ýVVV¢‡Öh4Ÿþ9)æãî°çXƒAº„Bž6¢mël+ª(Ò5ë [Ltöv®ÑÞpJÖѹ¢Ï^ttý`¢¼¼M$ºC8ÉÓÓsrrÒÛÛäOóíà7`8a-ÈË+•Jì3ö†KIIÛà³G¹»»ãá[†/álqE(ðôéÓçλxñâ… ÐqŠ{ÑB«Øl Øæ`1ܤ޵„UÐébŽ Zû;MMM­®®^ñ>{ö,œ••µ£9FK½Ì“†BÈÒ±mw_7YáȽ½íÝí˜X#¢EŸ'“ÉТaµ-&rrrp¿þþþÐ’ï<ð)ˆ+ºººŠ¾h/_¾ íA–XÿÂåXàþýû˜¦YØrwwwFFÖšE‹‰Kb¦õ§´­b¾Í„ utäÂ*ÖïÑÚß)v¢Å4ЧNÂ2h©1\ÀLܯͻ„B$e}ê8???>>ÎÃÆwïÞm-Z´€hLѰjµZ<, ÓéŽ9;Âg˜‰6Ò‚ÒBCC­½øàÁX]#ˆ?»ºº úúú° $-¾tŒV2//¯³³M¯×ÿðÃ¥¥¥õõõðwaaakk«¸ÁED ›¢ÉF{ZUU…AƒøÒ±ýZ,Ü)šÝ]»va¬~׺{&„ò XG¢E«ñܼy3))ÉËËKü .hkkóó󋌌Ä2pöjÄ ·¢SD§ëááÖž³ÞaH×`0`³Âçx?~ úøø Ç…>áB•JÕÜÜŒ h[NLL>„ŒGƒÝÈÊÊ?ºüÓü«Êh:±¼ýv­*vòÆnà®±Ãxöw*X9(((** Ë ‚Ç€ÀúiB!Ï€u$ÚÍ#¼èjÿj…ù?Í»S˜c½Œ¸¢ÃǰȒÖ7Ùla¡mÚ¯k=ápã7eýH¡^4ÐÐü"ÿ™˜Bˆ¢­ÔT”–:L~q¾Ö ] ¢•æ>TWW£åíííuöŽBȺ¢-ª(’ÅÈ;tàðÏ}¶ÿàþ}_ìÛ{`ïîÏvïÚ·kÇÞ˜£ÈWP´Ï1÷ïߟšš²þ!„gƒ Úð˜ð½_ìݶkÛÖ[·lß²éÓMoùø£M}ðñ?ÚøéÎO)ZB!äi°íæí›Ñ~¸éCŠ–BY-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-»Þ jIDAT!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!-!„"!¢h÷Ü·}ÏöOw}ºuÇÖÍÛ6²õ“9×~òáû¿OÑB!O‰ ÚØ¤ØK×.]¸r9ÿÝyäÜåsç\Ϲ¸ºœ½tªŠU-!„òÄ@´Å•Å=ýCýð‘ÃܸÝÓßCÑB!OŒ Úáé{Ó÷îßs˜©é©ÁÑAŠ–Byb(ZB!DBlD{wæîÌìŒà×éÙi8Ž¢%„BžѶv´6·5Cm“Ó“F³ÑÒmw)ZB!ä)±-&JªJÔõêÊÚÊ¢Š¢îÛÝìh !„§Çþ=Úþ¡þüÒü¼âýäбCÖ¢EZ,-Yª¬fKó:-ÒÖÙ–[”ÛÞÝný-Dûé®O?ÚüÃ0 Ã,1oùøÐ×ÿ%ÚÉéɺ¦:U‰ª£§cýбtYÐÚ÷ÿç=ZYŒl뎭núa†a–ž/¿úÒú=ZtqEE°ìâßc¼öE‹c!|I‡µh7oÛüÁÇ0 Ã0ÌÒóÅÑ/lÞ£µþµ€õ+Zû@´ŸlýdãG†afé9pä€Í{´Kùã5(Ú¾¡¾…¾aÁ$<&íÿÆafé9yöd}Sý"Šqø=ÆkM´ˆ`ÓEÒÒÖ¢5h†aæIÓ;Ðû¤ßc¼EË0 Ã0ÏW(Z†a†‘0-Ã0 ÃHŠ–a†a$Ì3m–*Ëé•a†až}†F‡2ò¤­¢PÑÜÖÜÓßÓ;ÐË0 Ã0ë$Ÿ©Í¤,TJ.ZM£&M™–˜™È0ë-ÉÙÉ™ªÌøôø˜äf¥—‡£ŠcëôçWÒ¤ç¦gäf8}7$P ÏéS)ì|–*kñ(‹•µMµ’‹Ö`6ànf¦AßÐliNÈHÅË""££þ“¤¨è¤hæIƒC'O•ã¨6œþüJ\9­F§ï†¤™+öçõ©Äη´·ülp®¶XZ$­¹ÃÜÞÝÞÞÃ0ë.–n *-)3éVlà3[žûw¾pÙzêêá¹áp~óDÉÈˈOÇQµtYœþüJ˜îöÖÎÖ5ñDà1>§O¥°óKq-"¹h—¸ ³V“”•é½ýüK_É^ý*âÕ£a¯ þÛþ3åä( Ì%;?[-Ã;ó´¡,R2OŒN(Zæ¹ËZíÜ âÎ>¦ c‹öÒK‡o½v(ðÕÏ=_ùÜëåý§)ZŠ–Y/yF¢5¶sòrÒ³Ó‘,eVai¡®Y÷»[\^l0ºµ¶±6¯0oŽÖ ­ÐT,>‡a Ú_B/û¹×+ŸÝ|ùsO©D›”‘Ž$g& ÛG†"Á²`y²3᪨ø(q•øÔøÔœT‡[ËÊËŠŒ‹ ‰ ILO´Þ[l!:!:8<8%+fäfÄ&Å>¬©T¨ªbU“©i¡9Ò-¼Èê+}‹^U¤úÿÛ;óŸ¦Ò5Žÿ[÷"ÌÍÜÌÜ_t’—Qeß¡,¥ìÈN±²·P(ûŽˆ(*;ˆ€²Hq\f®¿LLŒ™˜L&“Lr?å˜ÞÆ"ÒÜžÞ Ï7MyÎó¾çíáôý¼ßÓSd*žY˜ùTF½â}š{`ðçîÔݱ;cóKóù1 ÞC }°úàÄw'Òµé™Y™ÚŒø¤øÚ†Úõ­ue«³ %óQ’Ÿ<}z9tz~úS/Šk³µÿm¸óiƒ»ó™})Oo juZÇMÎ ‰ýCí™Ìcð5䪠 -óQ´æÆ„”„è¸è¨¸¨ˆèˆÖ®VváëïÑd¶1Ø?Ðô·½Ç%Å•éËöDZqEqxt8]Å&Æiû&(x*è;b…¥…­Æ3]%ÐÎ?œÏÉÏÉÔe2A™Ì&fUçŒzÅû4wc0vöv&§&gådåæÝŸ¹ïœQ¯xŸæ<ö¬¹­¹àjAaqaiy)NÏ“ƒ·z´ç/œg¸<ßüq“µ[tlôÂÃ2]}]©é©zƒžÙúðñÃk5×ââ(0¶9çpÃmmš Mqi±¯ŸoSK‡La![Ë*ËæÌñ|uc5äRÈ×ÿüš†‹+‹JkBR‚¹Ýìh‚ïÜ¿““—“_”ÏÉÃfNîM K•­§[ì‹Î“5ɦÆG›”­´Z^[æ@3B{FB‡€6Hsìb‘Ï…ŸKW¿ºTê~ЂO([a¨ÀžÚmfv&X <¨0rx|¸¸¼X“©¡Ò´@´´ªvÂKÇÛ{ÛÁ3vvàæ€©Íԣ߾  ¼Z 8†øJÔG‹|AÛÜÚ\}½š9„ÉD—«c¾rδ´µà‡XìRÏû4wcÐVv¶ o×ÞÝ^×T·g¦´¢”Ùõ Å®öü©æ<8L™šŸÂݱ”©¬®ôäà­ÿÐnoÎ.ÎjÒ5 Ë xyÆéÛÑÓÑbiáet÷wÃΑ±‘zcýÙsgç–æxÎáâüê_Y:- ûoÝõ—,1–-Ywm(=Ä'ÆÓùÌâLye9[á"­îLÞ±¿`2ߟüº³*¡Op;61f¶˜YQòË`kuM5ùÒÊÒ»Ówù1#+ce}…÷Xï`/#ÐJ¸ hS¼ ì¹>!WUq´&‹ Ðö~ÀáЭ!pË.ì ¨º<Ýž e«#J 8 MkšjšZ›œ7Å'ÇŸ Î)d‘ŸÅî5hË«ÊY‘3‡ðOŠxÎæå¯ƒ»Ôó>ÍÝx˜è¸èGxÎwµäªs†1(˜?H±K=ïÓ܃Ç5iuZV3`d@ OÞêIÐ?qæeçfó‚ñ”œXøÑcCl|,y"<2|qy‘ƒ…q·œ|4™^˜®ª®2µš€4Tö?å¯XR<.'}aq!‹A…ßÖ]ˆ*Ä1Sƒa%¨é쳿`j°¹Ê¢CPš³`ILNÞúŠÖŽVûÅd¥˜dIy‰²­„«¡€6 Ùë|ŽÏÙ,o›©-ñ¹”zÒ½ ­3ÖÅ$ÄÀ!Ç$»8éw2,< šÂÅÄÔÄÖ®Vh>­s‡ öøwÇ£â¢âã² ²{Gzí›ÀjAIùòêòèøè’Ê’ä´d ñàÍÁC Úü¢ü¶Î6ëî…D&"VêÎõŠ÷iîÆÀ\ »Ë­»%;/Û9£^ñ>Í=0xXƒ‹ »Æ<Ï£reÂcƒ·z´~þ~¬#XS„^…£kO>¬ ±’­í­€“$‡ަkÓ+ª+šZš|ý|§ç§‹ËŠ)€|K«KgÎ!ÃI©ÍÖBÓ´Œ4|§ýÅ8‚–s—³–`ýbé²8Ödh3”瀶½«Ýºcûœ<4,tfaë̒DZ#ÞØÜ˜šžÊ¢Æ* •p=ОJô‚²§Ó½ÏgcjÝZc«1!9aàæ€òcÏp¾“]ÀT'(­ª©2wšÉô÷Ÿ V ·â’â* •{ÛTwî¹¶î¶¾‘>¼2ÜufˆMÓ¦] ½t&ÈPo8¤ e%­ Ž¥9‡qniÎ9£^ñ>ÍÝÌ`‘1‘ŠÇ€Ì«ÎõŠ÷iîÁ/?^ŽŠ‰šœ›$Yo¬/¯,÷Àà•?g¡x6O_:Vn?¶žÜÑm»büøÉcÄÔü[õ=ü[X^¾9|Ò÷$X5™M@ïß3Ðsâ»dlG-6ŠW›_˜ïøù+‡ˆ’™š›2Ô8:+k+)š”®Þ.{#);{:9¿A>ˆeÁ2û`Öl1wôt0ö¢|F by¨ê›êÿ­‰[UתÔxH|©ñ´ ^g2½ƒR½Ïh½/z»´]ƒ]ñIñ×ê¯ Ž â>SÒSty:ÇÏhí10:kµÃãÃ\,i}s½s‡--Ú-Å€ùräe8í¼Çðèðæöæ€Ó55ÔìéŒhM3éüÃùÜ‚\æ+çŒzÅû4wc¬®¯fê2™Ù˜!™åL ÎõŠ÷iîÁ¯¬¯€†Å•E¼œ¹Ý <3øõ×׬kO_<õh¸øƒrõ•GS«©¨¤ˆÑ?Xy€£çÜâ(`v!\ßP_jZ*,Äãû¯o§¦i{½î:lމùæÛoÈÐÉõúëÌ ÕñUMLNDDEÐç«ÑlÄ+ãñi8»8k¯±V÷´ìjR¯Õi@YœóÊ¥lhm/¾?{_“®™˜š +x¯ÆÛ@âK ÷ N÷L9v:ÍûBûAK 1 1±‰±Ê=Æý¶Ïhƒ?-¬Ò×è¯D^‰Mˆå1;?6wôuT×V;– Ý*Ó—%¦&Raéµ|´»¼¢¼ ]½xönš)h'g'sósmSA¶–Å7ó©s¦¸_±)¦¬¥­…ùý Å{6w{`cS+SbÁÕ¦2ç °ÇØ(Ÿ¶Øºû­$åæ•ÏïÙÜ“ƒïêë:%å%ú ævÏ ~ûùöóŸù·í!ÐrꌎÚwPoß»­ÜÅΠyµ symÙº{#1›ºûºÇïcj·ŽÁå,¿yûæÐè’Qî[þè;g´½1~Ãv zkýᣇ`l+·MÙƒ½8^m†¬½½t«ü…h~I÷fî‘á7Á‚À^̆âô‰™vl.!ñÙP@ëçuZs, É+(åØùï@ „ÚºÛ õ†š¦šîÁn¥ÿÆ–Fç;•Fn˜,&p ñ¬dúnô9ß9Ü?ÚOWúZ}{_»óî¨W¾GÛ3ÔSi¨¤«‘ñ‘C ZÞì÷¦ï±†f"ZÝXÝ3eYš°˜»3Æduâ=›«ÌrÌuÌx†=3Žõg‹­ÓéAŠ3ž¼òEX _•˹ª~y݆³í å9GëÞÀ±xQpW( õ‹µ!öT‚W@â±³YÞ!)îíQùËP‡"€ëË×/y|ñˋà ZÜ­¡Î êÒOBÂ]ñ´1LòÂ×ÁZ­Ä—xYÈúhÓö] Íí͵­5Ï]:–8²¡€Ö7úïIÇüvA{Zã’, ÐJ|9áø_æáemÿ~ bmÿ¡Þ‹­„„º¡€öûð¿$zÙãb’€V@+ñEÅúëuc{G‹—å¹u÷¾, •P7mK·1³$A[šhâë¹£w´Z‰/$¶žmÚ¿¼x¼õ/»n]ÿé矔»®v^Š£•P9:;ÛíFc‡ÄÿMíM–>‹Ú¿2 WÛ Pñ²;/vlOž?åSË£'-ýÒû7"‘H$a hE"‘H$RQníÛ·oŸ={¶´´466f±Xôz½N§‹ŠŠ:-‰D"Ñ(ˆ`8‚H@ .¦Ë }÷îÝ«W¯ÖÖÖ&''›››+++é:V$‰D¢#,PÁ"p‘€\M—AûÛo¿½~ý; «'&&pÇt ÀóD"‘H$:Â…,G (Á%Ðt´ïß¿ÿõ×_Ÿ?¾±±±°°@w ›\'‰D"Ñ(ˆ`8‚H@ .¦Ë ýý÷ßß¾} ¥Ÿ={FG@ƒ<66Ö/‰D"Ñ(ˆ`8‚H@ .¦Ë ýã?0ÂoÞ¼¡ p5^[[£ß‘H$‰Ž°@!@‹ÀDJp 4]íŸþ Ÿi ¨1ÅôõêÕ+Ðm‰D"‘è D°A$ —@ÓeÐþõ×_4Ñ´ÿþ=½{÷Ž߈D"‘Ht„ "XŽ P‚K é2hE"‘H$¹WZ‘H$‰T”€V$‰D"% ‰D"‘HE hE"‘H$RQZ‘H$‰T”€V$‰D"% ‰D"‘HE hE"‘H$RQZ‘H$‰T”€V$‰D"% ‰D"‘HEýÄGø¶ÝÈIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/crash-recovery.png0000644042355400116100000004315111675570700021025 00000000000000‰PNG  IHDRc™uÞÌ} IDATxœí…{\G¶íßß2sù›7wðÞĘØNâ˜â81“lIf¶˜™™™™™™¥î–ZÌ`[’í˜Í{¿V9Ž$K¦‰,§*ëówN]»vÕ©µjWKêüŸÿ'‹,²È²\ù?+€,²È² ŠT Yd‘eù"•BYdY¾üD)¾ÿþûo¾ùæñãÇ_~ùå£GB ‰—Ç;s± ³€×°ŽÃtøë¥RHHHh •BBBbyH¥XR)$$$–‡T ‰åñËU U·ª¶©VÕ£Z¢æç„²[Iï=+>3š©èQ5¶5Ö5×µ(Z^­ç®Þ®º¦ºŽ®Ž£Äsá—«©™©þŸ?§g§/Qós".)ŽÞs sW|fÔýê Ð ­n}ëí·.\º T+_¡ó²ª²¿ýýoø_ñaJ<~¹J‘’ð¯ÿú¯ÉiÉ‹ÖtövB˜®¾.À…ÖF[©ëjž¥¸Õ}¤µ\ÂaDL½gæf΋sÑ0uµlÌš‹Þ¥‚P¨lý™¸f|-,*lQ·óÇÕû䑸Xt–DMQYÑý×ùøû¬øx.H¥XD)r rvìÜáäwþÒù}û÷™˜™0cÀéÀÉÕéèñ£ì´‰)‰‚ åÕåÖ¶ÖÐ7ÔŠjWµûúééëUÕWñ4:.ú˜Þ12Œ“Ò’NèŸ8|ô0¢ÀYƒ§íí!œ>{rîÚ½ MiîhæÚÝË}¡R”×”£&°Ê!%ÈÎ?Úý‡#m«ßþö·9…9D ;ZANR„cüòé'œb0Fk„RÐöºÉõ·Þ~‹°÷|º'26R÷3”býúõ4ïžû’›SÙ¦lCw;) JAsñ“DDW)¸I;~L¨ ‰Æ(óÀÜr´‘J±êðËU XÇ&åúN×â'”lþ°‚zq IJKêžû˜äŸ\€Už–•ÂYýÜ…sX„4¶5nÚ²éƒ?€±W®ButV1ñ1ЛÍXz 1ÁaÁ¤¡¡ˆ\ºrí »4ÉyuC5>*EAIM`²™…Ñ^½~•xô õ9¤g¥ãY“_¬YEQ ¡ÝsT‡ÏPc$‰ƒõìçd¦¶±–àV¯ß¸žÑéþØRW)PC\‘R¡Y¤H[·mÝw`ÆäDœ¹ò‹ò9ayùzýû¿ÿ»V)©ð£wRO(…›§A2ê†Ö;G;bJ±êðËUŠúæúCG‘ìÝ¿÷Ìù3Ýþ˜Þ1êu?Âèêíât —`Á)ÒlöÜÿ÷·þNþßÜÞÌöNþÒà$Û8Y|@S[ß{ÿ=˜Or!>¼Ì-È…~FÈÞ9…a›û‡?þáý­ïÉÿüïÿ,T [Û?üá{÷í=~â8JÁ-­B"Bþú·¿’Ûsš@°8%±·/ªê>5)Ïïÿðûí$7Y»n-6Y¹Y¤4DdFzDºJÏMÌLþôç?!d@Lç 4Žcg¨Ý{vž6$1ùÕ¯~¥U ­ h•"¿8ŸãÒú ëII¸ŸS¬Für•Ê‘Z“GÀ"Ö:›?IAYu™È‚Ì ë`œKÔ—T–°·oß¹ê²ÖáòëP$ÀÄÜäô™ÓHŒ-¬,¨ŒIˆÝ©ºU¡}¬98@3qÂoU´²Ç²çs@021¢S2yÝ Ét`à§û>åacgÃm÷Ü3à?,¥!YFMCM÷ÜDZo¿ý¶hΡù#I!ŒÂÒBÒ ŽB'NžÀø·ÿýÛÜÂ\Τ*H+ŽQØèþ¬”æ»?ÞMsm ÖvÖX2Ed"òºæ:Ò "ŽB Eð ðå|ÁL"d¢!ž ›h»?ÍÑ& k Œµ6«¿\¥€Õ­ÊVÎíü+~þ×=w⟈[x%èÑ=·ßb)4BÔ %dàp^©V’–s­õ,>ÐöÅ5®h>ïC1Ã!öd(ó~¡{Ž·<¥•î¶/\Ñðǘ{41k›cE1;{þìÆw6ÂOg’‚wÞ}§´²TxÀ€°…®ÍëT4×ÞjF­h¹¢K3@QIרÐ;Zá_0–bº6«¿t¥x³!ò#Î)ÿýßÿý›ßü†üßÓÇSþ&µÄ @*Å6óŠÚ N99%%R&$^R)$$$–Ç/Z)HÎ9ÞsfÖý4aýˈEÍZtkð©­YÂÿφ×!†ìçÿe û·0¯ÃŸ½ÕÓü<­^óa\—âÅæù—«D|rü•kW N8º8’¢/:SnžnäíËzCŒÍŒukjkEMmS­™…ÙÊA¼n|ý5ü„B©V^3¾¶D`ÑQ±Qÿ¼J+Kíì~Î!·w¶3äç Z]7¹®Ûja¦æ¦õÍõ ë‚R3Sõïíç–•¶D¿\¥È/·|ôpAIAXdX\Rœø1 ¯™w–’P×\'nSÓ³Ó1¨¨©HÉH‰ˆ‰´`M•EÆF¦e¦‰X$§'?nã…16tGüâ"µm•Ýʃ‡–Æ&Ħg¥ µ?˜ wF¡ûw¢è&Nâ“âÅoaò{ÌüË’Š’èøh¦qÞ2ˆ-+/‹¢ã¢«ë«©áöIóð'Íc¡ †¼wß^í–Dïøä‘ÐnOOĝ‚x)‚ - L½×4ÖˆVÔ0™ÚšŽÎ B#B‰\„Ç@’Ò’¯{Þ2¸|õ2ny¤ùõÔDñ3.t¹àÕ†ø Ÿ4ŒŒ‰ÌÌÍdn™síª mqy± ø{sFNk€SVUv\ï¸î¤aŒ`1]t*~ä¤5Ö¦¥ø×;©G+6⌉a)8x@Ô”ÐoDôuüÄñª:ÍïûUÖU2“Ì?/…!œÐ×ü¤\üÍ‘x$Vo÷Üoî0@©‹ 3'óâå‹•µ•ì·¼ä€)C‰}|]=]I%X¼¡,e67WWÙX.Ì»¿ÉùïŒë-ïmqqw!•·¾ió&k;k''}Cýð^'2Á#¼Á=V¬Ø¼e³…µÅé³§?ŠÏsÎq«»˜ðãîíNBB³X ;ví8uæïøüÅó‹Õ© ÒÓÕÛß›¡é*ÅÎ];¯\¿BÀæ–æÖÆÞ†…(H ǸÕþ„•Uëåëåáíabf"þ$ÿGޱ²µb#0&ŠabCGî^îXW•Ð2’){Gû3çβaLÖ&š_3º&šÃ%{'{$Àð´á{ï¿§«0ÄÉÕÉÖÑ{f¥Ø½g7sÅ!ƒBQajœÝœaæ¼¼Å%ÆaŒ€Æ ?!9AL8ÖÒñã×ó ©ÔÃCd{Þ£FttŒ5?0Vµóš\Ì,Íà3•’žÂÀ±165F>x¹ŒZs˜íí¤ [7/”È™¦‘ñè˜Þ±Ë×.ÓŠ[¶%Ý\€Ìx„7ñx“wPö!lH»,­-i…1oœÙc-ñNQвê2šÓ=²èK(ES{ÓB=`‰¢Ú‡⥠ ­â«”G¸eKCP¤R,‚æŽfKKæ>0wâ—šP˜Ì:fy¹¸¹ðz„Rðxl#€ –¼+¬®©ŽWBs$_—0¬QÃÅîw‹½%04NÒ5Îy1TÒubJ"6{>ÝÃ+çµ}´û#¶ü’|½zZo´…~¬.°±¶µfõC!^0k…zŒ9o³VH4Š+ŠÙx¤«}ü5l˜ô˚É‘‰ oá¿î*!„„[†‰ M.\º`ko«ù ŽŽ–ý÷CE¶S@G4Ä^÷w=˜ Ÿ›êˆäÓ½ŸbŒˆæ,PÑ\#¸‰±L/™Â¶íÛt•™ ¥"0Öºª[ň.]¹„.ÓŠÃHÙN) ê[êM-L5éÏ\ ÞD iĆäP¼Jbæíð²Ø?©!ºƒßîÅ{d2s‹r¹¥9Æy…y˜ œy`© I({ ûÙ(ïHü5=ëÏ( N Ñ9S¦°É£#°ò³ÈþopÞÑ€%Á¾%T€ƒ“#`¬›è‰/ptvd›a°liÄL ~~L&}QO0ô%”‚[„ž5†”³Þ˜ö æª{îK›Ä#"ÀÒ‡Ó_®Rþ0¿¼TvrxÈâCªÉèX‘,î«FWµJ‘”šÓD=K]—%Â;Ӿȥ•‚lSì!°ËÆÎ†c ÚÁž€·S§O±bÃ6BvÃÂk­h®» é]¬0b&`q ɶ0Æ'\à@Ý‘BQ̸.­*%™B ØoS³R3²3ØêuW d_½ †•Õ¯ý=ñƒ‡RÏî}øÈaÑöó”‚ÙÎÑŽ^>ØúƧÏÍéE4gnŧ?Œ÷Ó}Ÿê*Áèþ¢*JÄ53€úûûø‰ œd§°¬p^ Ä&/``ÆÐ¦¶&ôb×î]O&üÌ)†õ¼ß+eCfE–T–pxþdï' †ë*é:SJsœ°1ê*m1Ö~=iÿHDøá˜-¾‰ eg­CcQƒ½¨a·§9)Æg/œetå5圆x*^ߢ¿“J`âÄ.Œ UkL®‡ð‰O€æ `cIúÀ#r722q‚c Áp¡‰¬˜gÝïþ╉ߎ]äLÑö%”‚³ ‰!ˆEËÜ’ªp±ðÑjU Ö_sGkaYyx\š«O¤½k°ƒ[°›odd|:•9ž÷ 9õ!Ì$Øä{)™)lb¼]’:í¢'q5fžR°Ô4“ŽÜp®†-Ë*Èk4ŸhŽEN.N •B¬WÉ8$xNRºJ±}ÇvÆÂЈŸÑuÏýí†Øfá†ḭ̂Ä}}³ò³èŽdþ,T lÒxŽì纟ϡL&'ù+ׯlyoË¢JACfɹtõÒæ-›u•ùÆ'SͲFª*…Ø-iË»#-B=EMZvš¨áe1LlRZM˜j„€iá)Î>oy ¥ÆÌž0Fw8]²…à^àÔ§TF¦`,&“ì ãî¹OÁX0„áÇô@à%”"+7‹cM¬l­ÄŸ ?M)X3ø$¶sÏíØ¹ƒ™OËÔ|LF_„DZK{ú +aö°gÕ¹{¹3É0"„†A‰G,BñHëŸL÷ù_k¥èèRdäz&:ù¥{Å5dö…æ † †çõ†¤5û†gù…%gåu<å'ÃÏ*Fs=Åqƒì‹“¤øœ‚YF `Y³I S/>%‚¤Üff̯H%X¬œYxÇl_JµÒ'ÀçÂå ¢•`…¨'yQÉjൠ lG¤¬,PÒNa³ðB Îù¼iÒ`Ö“ø³<ˆ—ª5æ•óôêõ«ÐX÷kµ5)‰5• &‹ô ½ƒøÈC·#Œá§/²–¦ø)†è”€¹ˆŒ¼f|ÍVüY½4! CØ{Å—ýˆæªn•¶9Z`bn‚Î2«Ú¿^ó-™XÈ Ø´‘cñHøî"a8'K9545ÜÂväæÂ¥ ŒZï¡ {¯±©1{)aÌ[ Š.iõNó‡vÖOŒ{TâíÓ#¤Þ®>c¯€0`ÑŠ])%Íáe!XâCnìçý0K Œ‰cí7b<ïg4ZyKÔÓד]‡î˜½àð`š3íâ|êêîJsÍî’–$¦E$,NRÔM|Á"¦x¤õÏñ¤ ¤`(Ec[spd’sP‘W’Ú-uØ;s(0(¬x(¢t(¢d(¤p ¤ ?¶H_•„ñˈÅ/œ¹Ðv¤DâõÇë¥Mm-ቮaU)Þ#)5“¥Š[Õêéºîéúžéš®[¥Š©ôúQßœîØÒ„œÆÐèä¦öWü?¤ø…€]íÅÍËMw?—x^#¥ # ‹Iq .sM +œ(SL7ôÌ6õÍ4÷϶ôπ澙ÆÞ™:õ­ÔÚaçTetÉ@Bv}LRºrA2)ñ,@#ä_K<#^#¥((-³óNC&‹'«:gzg ¢m`VƒA.4·½ÓÕ7‚ º]RUuc!q¹%e+>o6^¥PõtzƸÅ*=3ÆŠÚnÕukÒL Îv Í*æÀEû •Ó=·’ª=3Tþ¹=…õaqª×ãÒ'!ñ¦â5QŠžŠÚ×ÀLçÄÁðⱪ.ͧ$¤C3ÊáÙΑÛ#³ªáYåÐLÇàtKÿ­ì†á µW¦*·q,&µ¤¼¦zŧRBâ Æk¢Ý)Yy®a•¶qý Uc5ê[ =ÈÁ „ õ˜í3ªaäVnÓPtiOP~Wlù@A¥"9cù?÷”xa¼.J“˜êYk£N¬A){§ÛfÃ3¤ÈDÏøíÞqþèEkÿͼ¦¡äª¾¨Òî¨Ò¾Ê†îèøäž ‰eñº(ET\’[TI´"¦| V}³©oš„B52£E#ú&n÷OÞ훘UN7t¶ fÖ$VöÆW êÈØÄŸJ ‰7¯‹RÄ&¥¹GWšF·æwWª¦šû¦;†f:Gg{ÆfˆÁ©Ûƒ7nMÍLÌ(§j;GÊÛ‡ šÓkûÓjª›z¢RV|*%$Þ`¼.J‘‘[àUìØáž®Êªi蹉LôOÞA&¦nkdbfprºkx²½o´¹{¤F5\Ö>”×8PØ ‰W‹×K)æ¾2¸&<&­ª}°J9ÜÚ;Ö58ªéÕÈÄàØðàèÈàø8ÂÑ?z³¬ª¹ ¤TÊ„„ÄÏ€×K)ºçÄ"1-«²¹§F5ÒÔ=Ò¨èêèî%¡íêíVv©ÆFúPŠ‘›‰©¹òã ‰Ÿ¯R€¢òòœâ†ú®Ñ:eoim]Aia›ª¡MY[X’]ÓP­îïéE)’3Ôý+?ƒ¿¼ŽJÑÜÑZÕÒ•[Q’˜ãì’WQXn—“\\žÜÑ©¬ªmÏ/Yü[ ŸÊeJNJjNª„„Ä<¤d§ÌûÂÄ×T)4_Q™•SR]›[’í—_WVŸ•¤Ptv××Ô7EÅ&·©ù^ÐgDGWGznúý÷<| !!¡¤ÈÈÏXø¥»¯£R¨ûÕYy F&GƒÃ‚óŠËêšë]-Ý}m=Ê®öœü"[Ûüâü—I¥PЬ‚¬ï¾ÿîû|/!!¡¤È)ÊY5J‘’fmó~F–YjFHDtD@HD@pDHXxh¸·›Û•óç·ç¥¿¼R|ûݷ̈oøo¥cX½€«F)@^QйŶæÿ™ÛãSeC£ù=}éÍ-¹¹vÞžzçÎm-­Ì{1Ï?Q Êwo¾züÕôìôwß}·â‘H¬R|óí7ÙEÙ«C)Ôý]Éi¡NNôöÅõxò‹Çí÷TŽgµ´†deZúz¿xakQÙRÿ·ÕgQŠÌ‚̯¿ùšyùß|ó“ÛUˆ/¾úâÆô ñ¾_ ŸñùÃGW| +H‘]¸J”B“S¦˜šnmlò¾÷@ñÙƒÚÛwËÆ&²;á%Å!Á†gÏnÎ/~©ÿK…F)ò3ý˜yùâË/]Ý\ÍÍÍcbc&§&EýË ·¯×ÚÆ:%5%''ghx¨¥µ%;'û%}> >ÿòó©[Sâ}ƒ¸¸¸¾þ¾çòP]S—Ÿ·„ÁøøxXXØão^vŠ–FYyYeUåÏ0cóÀâ_5J¡ù¿Îg„9:~Ðןüøë›_|ÕqÿaõÔ͆X*ÎÜž153½nt½¶¾–æø),*ôó÷ãуG‘®î®Ù;³ÂøÕâÑ&oM~ýí×âµjik™g€rµµ·u(;nNߤæ³{Ÿ1(j&¦&î=¸çííM+jHO´­nÍÜRv*‡G‡cOoÏ¥K—FÇF[ÛZ#b*2#mmoíìøùÃûïw÷t#RÍ­ÍØ¤à„Êž¾†?2:¼‰ÌÔÝêÛwo‹Ž†šð“ÿS$± •U˜õº+¡êQeFv¬…åÎÌl£á‘œ›3Ec9ʨ‚BçèèKövŸ^¸¸--+®¹£¹]Õ.þ7óÏ+(EF~d`•765ÂñÉqhÀ’-(,@FÇG“’“üýmlmÒÒÓàƒ“““¡¡¡½ƒ=*`ffvç³;S7¦à¿££#•;wî„Nxpéã?¾rõJjZ*DBO_?_(ÔÔÜäàO+R ­ý+]LÞœd÷VÖVpU×€”ÁÑÉ‘¨._¹Lä÷Üg£ ^ IDAT˜.^°³³srvêTwž9{æÐáCaáaÐX4AP ­»‡»‹« “·ïØÎp¸=á|yE9R€[º£¦©¥ ÝܶmSÇÌPƒb2Å%Ŷv¶ÎÎÎÇõŽãPëê™ ›Ÿ‹tÒ#錧—'f{>Ù“˜ðÊçGbY@Š×Z) ºÐø_ßR_^]àê~ÅÂò…Å~+ëC&¦Ÿž;÷áé3;,¬N‡y”äWÖVÖ6Õ6¶5¶*ZaþsýˆP ¤yá¸sΞ;ëãëSZVzãæ êáù’ÁˆF°Ž¬¬¬P®¯¯Ï®˜™ÃVœ“›³cÇjð&míE~A>Ô¢atl´B¥`㥦¦¶FkÿªpÿÑý‰ì âêŠ0´`Ÿº9…>=v”qAx>8ÚýQcsãg÷?ÃÎMŒq¾#1!­8uúT|B<1pÖÃ’TŽ ¤wI i9¬£F8745h/rórq 8pRÿ¤¡¾~Vv–ÖþUfŽOó¾Å­¥•¥C ŽB¤Æ&Æ[?ÜŠxqˆàÝs[PT@¢”’šÂ<è6A1#¢"¦¸å”qñÒE:âZ3!J•26.Áýä“Oââã°9wþÞ„ 5dææÔ +dUÔ ûöíCs5³¡¯ÏlcÂÁàîgw‘l^ùüH,‹Ÿ?È,È|}•’ÃÞEKCKCMCMyuy~q>rÊÆèââB*kdläà““œžœŸ]\^\YWY×T×ÔÖÔ¦jãòìgúJËMûìÁg÷Þc‡‡Nwïß}}—¯^fsc»«¬®Äc)s6!‘.«(ÞånxÊplrŒ¶°¸• 1<@ O0®«¯Ó^@6±[Â%öü;÷îÜþì6Ýií_p;:9úè‹GârŠ0´ˆKˆsuwmik!µ9räÈÔ­) °¢’"V@‡²#)%)8$òk›ð(!)aj¦ëÁ=rr¤A!Aä#–é™éÝ}ݨ'S7φttƒ<mrrq5nînh4óIØL5JA ÆY^76¯|~$–oùuÿMĶÃy2 ¡µ%šä‚$"6!6-+-¿$(«.«ª«B#8z .Ð^ü¯ëŸëôR°@!­¢Sy*ª*Ô½êü¢|7t¡¾©>>1žl9¯ ÏØÔ˜¬ÛÖÞ¶¤¬û™;3hÇðØ06Á¡ÁË9ZoÞ¼™ž `\][­½àœâáéF@TˆG®Î1„æZûW…éÛÓÃÜAÄ­©¹)ñ  zAÁÍmÍîîïð>5pâ¨o¬gc¯k¨ƒðÌ€ºG-&´+Ûcãci„`Цh»xù¢x„‚0o×®—W–çæïùdOTLÔ<j˜RŽ!Œ&Ô ¬¸¥UkG+·ô2:1YQ]ͶíÛ¨|åó#±,xï¤Û¯µRtÿðEgo'’™ —cEKGKs{ót4# TòTüx_ìû)hžš“ çÁ­Ù[ÙÑÙ‘mÐÓÛu€o7¦o¤f¤^7¾nïhÏy›šðÈðºÆ:aOj@ÞMFV†™…Ü;rô;³p0fßÖ^”U–A3œ Jl­$Gbhí_nÌÜb·~~z'ôÐ5n•]J/¯+W¯³©™)JÑ©î¤æô™ÓüË1Šmíl­l¬8L=ñ9}#+'‹ãIXDØàÈ`gw'ù‘xÄ•™¼9‰b`mcíáå‘“—3φÆNÂBÊààäÀ™ˆáSƒ 0½4DMÐbªfæfÔÓê•ÏIJà-°‰®¥XT;æáå}¢)Ù)7gnB{À| ç_Qysv~ÍæŒù}).-îê/,)$Ï'§ÞtÅ…h²hG¯v`t€|^}i!:Õ ›ö©öV7¼›Ó7çèΛ¨\èSk²t !vus%‘Y|ÚÿÉó#±,˜v6ÑU©ÿ  ÉÙÉðjòÖ‹£²¦’]ô⥋¤E¥Eã7Æ_ÆÛ+ÁØÔØÀÈ;ÊG2è)ç”K—/]3ºÄ튇$±(&nNH¥ø©Rd%ë—ÁÈÄHw·R­T÷©¹~Io¯ £“£hÖŠ‡±H˜ª[ÅÁ„‹Fâi%Ý–Jñ£R$e& KHHÌ›¨TŠ•":%ªEÕÔ¤hhëlyÚEë ]´ªš_â¢y…/:WãEË _´¨Vø¢í¥.šæ_(›bR¢¥Rü¨^ᮡ™Î6¡†AévžñÆ‹^¦Ù¼ð…uÈ‹_x'š¾ð…ŠÕË_X…¼ð…o²Å _ø$™¿ð…õK\ø§Z¿ð…W¢É«¸0|á‹À4Û¾ðˆ7šwšáäæ,•âG¥ˆõ48tÂm„„„‘‡ýc=¤Rü¨¡ þö±†z.k%$$´pˆ;’à/•âG¥ð‰r½°ç¸ÓZ -®~â)O:Jáãirð˜ãÚiÈ!çøsÿì^ôœÖû¦›íÓÖ\ ØiqÒeã󺢉GòU¼é»¾óÂñwZgmi9¯þ¢ÏÎàl›èBWóÐÃÄLÍïí™–‰e>ö1†zÎëçÙŸrß‚“ÎÄí%ß]4*tÑ6×≟Òý\ÜWì™Xæk¥Ot”‚Ë6Òà¨ÃpÊí½Î¹8æ°öŒÇÇ×QsÚýýó^Û/úì2tÝL½žÓn/xï4tÛÂ-0pÝ,j4Í6bO¥pbèº{=Çõg=¶žóÜvÒù¹G'¢& Ã"µ"Hô~tÎÛ)·-ôuÎóClæjÖÑÑïg<¶g=?¤£‹Þ;©Ä¡°¡oDHØGçz×fÃMi•Áú.ïrË㊽§ºÄ¨$~šŸ˜ë‘øO¹¿‡sÂ0pÙtì'ÞÖ^òù¨ª#§F™Åïc0ñÌMÑŽS?Lˆˆ‡ |^$ m+Ú3ºŠuëiœmë›fa™Qft€‰õO7÷I5¡¦¸9Ù&ò$sB_žÁFä9õŒµ‹AÑ<4ÇžæYÖ¢¹Ö˜GÂOP¦µðC}L¡{xž#•ñ%>kÃ8ãþ~¨~®ìÆ¢cjDïTªGZžL©ÓFÏäk“Fûòêƒ]”aH‚ŸTŠ•Â'ÒíŠïž#¶k@Ze¨}Ôi.ŽÛ¯¯îÈ=ç±=£*¬¢-«²=»¥§"«:â¤Ó»®ñ—Õ¥µÊŒÏ{î %¾åm™T6%ÙFäÕÅÒ'.[⊽MšͬŽÈ­‹õL¼¦ï¼ç¶‘†9µ1e­ê²”ò Ñ;8åúA^}\swyY[†{•£vk¯ú}•ïVÒœZؘhrTÏñÖÞªü†øE>!…dÙaCüø/iNË®¦þˆÝZ­CŽït5Ñ‘u¸>·Æ“ËûÆ•†.ïuߘa]ÐÀÚ1ûõyuqe­é•í9-=•Éeô¨õsÔn6™Õ‘ÔÆzŽuÅM)ÌRR©ß%ïÝØ·õU§VçÔD39?DÆy…å8Ö(òtŸžõØ”i£ï´‰IŽ/ööI1%6¿4 f ?9µÑ^ÉFÆç=w ?½v ?×ý÷eUGžqÿPÏac`†{ÂUm¼vᇄ·„+Âø´ÛÂØ)æü“Þ3m;úëDï½> ÏuâÕìŸ7ù«k¯úrúp‘Jñ£RøG{t”"$>À:Ìà°Õ]ãuŽ‹c¶ë»ÊιíÈ©‰ñI6;b½öè\Í)—­Öaú\6$³Ùn8j³þºß–>–c·ú£ÎQŸ_ŸpÅû“¸Bo$ã‚Ç.å@DmVW´÷Ö¤Y]ôÜÍÒ?á°é¸ÝÆØBïäÒ Ñ;€{°®¹»"¦ÀóŒë‡°²Ï¹ï2tü³y‡k ôlß=jC:à™T(z‡,×8~`b@¿‰ÅþG­7äÖÄžuÝA½±ÿ‘êŽüc6Î:m%¤Kž{j…ØäÕ%p}Èr­SÔ…zU ÆZ‡¢Õi—íYUÑaYÎ95±IÍIû-qÞ–Á'E¿M]å'í7Ö'Y…èã®U%6ÂÉa«uq…¾m½µt ȰÐ=»M}õŒ„]Ò”>¯Õ¼0ŠS3*Â=Œ£ò<º†Z˜Ÿžjb>l¹öšÏþà {£æ¸í»×}±^Üöø"?Ÿ$óyé¾0{ÒÜjns­çv›~ðó®ðÃ[ˬŠ"š¤Y{Äé„OÖùÔúƼ,aìuQ³H~èýÉ»«jÏcm,ø*„fuy…ËÓ‡ŽRøEy^õ>pÀìmY˜fwÒî=ïD³Á õiçPË.ü,[®oè,3pøÀ<ð„]ØÙ n°´È6ì €xÝ÷8F^˜èÒ›¯ Lµmï­K. :h¾ö„Ý– G³€ã§œ¶¹D_¾ê½ÿ¤ýû‘9î&þGMüŽB¼¤’ Ñ;гÝìo|ÑýÏSü²XçhŽÏ“öïù$YäTÇµÚØÔUAÓi¢ß$ xã n#@-ê*Ð:82×ê„íßdKˆ‘ívô‡œÓVßþ}ëS­9Çm6Ô'Y­`6ÂÉy×ÝtÊ Ày·ÝY•Ñ×}õ©’ŠƒÎºì ÉpˆÉ÷>úÓVº`C2œ‹‹‘סÉ#ßúO‰!4Ó‰.¸¦‹SNÛSJCÌõκìŠÊõ4 Ðch‡,Öj›-}³~W4g,4'0Ñ\kLsá‡!?ç\wïW<÷vô~œ+Ë ø ÎpÐúÆ—=÷ cãbfh{×À\£W¼ö-øjÄ5Qòô¡£!qþúûMÞVA†µEµŠâ„BÿU©ý‡q~âéA³µE ©'lß»ì±/µ4¬QUž_›xÚi§¡Ã‡Ñ¹^UmyИ¶Âø”ãöòæìk^÷›2ék®{ʪŒ)kΊÊñÀçÓ58I..kÉ.nLÏr½ƒ#–ïø$Z”·d7u–{ÄÓü´ÓŽÄ¢jRKC/{ì=l±ž&„ñYç]yµ‰ØÐ7¤¥–…ÕtR£u( Z³ÞtÆigU[¾Ö5Ç­7§;mnM¼eÁ³µ)%!ƾGD«’Æ l4NLß¶>å—luÈb½ðyÈ|=õP[VULiS$4tÜö“VOj˜]«[Ã(TexC¾mèÙƒfë,O"ßéåܱÜHüD«mrÔòú¢^4‡·ºÍÏ»~,Œ™?ñ“V.ü¶Øà}•ZÖ”å—d%<œsù?]ƒ­Â/T3½Â˜[ayÜzsIcúmMßf \pݳôÀW X Áqòô¡£Þá®çœ?Þgô8`²ö¸Õ–Öï1ç˜å¦ýÆk¸8`ºnî)ërÓ>ã·©$$$V;¤RHHH,©oÔýêÕ‚7j,ýoÎX–x5R)V7z{x»]õ-õ55«DÛÞÙ¾èºT¨­+á³£®¹®UÙÚÕ×µp,ªUS{SmSíŠùŒ Ô–Ž–ÎÞÎ…c‘J±êåjšjzzÇ&ÇÆ'ÇWúûX”mª¶ycQª•Œ¥«§klbÕŒepd°¡µ¡YÑ©«¬N(78:øõ7_ÿƒòÿVþño¾ýftb”MLÝ÷v‘M@°/¿úòû|¿òq>ÛX¾ûþ»[3·˼­¸]Õë>z¸ŠÆòý÷ßß½w—ŒOÑ¥˜·Ò¤R¬nôVÔVܹ{çûÕVî?¸OäºI;ªߨW:´ç.?®ª«â¬¡ûjZ-*µj¥C{îòÝwß¡× Ó=©«B)î~v÷»ÕV<|P^S¾P)8w¬thÏ]ý¸²®ržR4w4«ºU‚{‹–þþ¾Ò²â¢â‚y¨¬ª¸}ûöÏÿ¼"•â Ä“œâ³;ß~û-)ýjÑÞxQ¥àTòíw«i,€œâiJ±èX¾züxxòvrzFWWgÿ@?¥¯¿O€ë¢â²š¦é;^IlK9Í=Ç«ùî[©o „Rܾ{›±Øô†G‡;”íd¢fzfº­£mêÆÔWŠñQ±¾Ÿè²²²:::¾züÕ+ï¹@‹+…ZµèXF¦nëÙf˜:ù«TJâo×)J¥23+ÃÀ*Â!¼â˯¾úü‹Ï323Äxããã+*+˜·EcPw«Ç'ÆÖSYU]õìc!`©o ´Jñ˜íë§â‹/¿ˆKˆ ñË+ÈÅøÆ­©éÉÁ¾¹ù9ºf·fn…„„‡GÇD»¸¸¤§§?úü+5<"œ§ðááçY©¾x¤¹ýú+.î=¸÷àу/ù¤æóG$ ŸùùÁhðÍc.ª#ã#BÚž8sõêÕĤĄ¤„°ð0[[Û†ÆÑ»&¼‡÷¬°Ôüè!Ç6UQC`hjɵ6N9ÿÒüÐVØS=Œ]"$ü?M)‹¢oò€U–±sHN~Q|Br\BRl|¢×®^VÁù‡-S}ñ/ëÓ½Ÿ2dÆyõÚÕä”dÂïT7ÔÐ’ÒM0¿$`ñRQMmµ5³™î£§…€¥R¼J1{g–5ÁRx¾øê‹ÊêŠð¨àèØð´Œ”„¤¸ÐˆÀ°ˆàvE›ÖV° “R’8˰þÔ=êàÐ`’ŽôŒt”‚§]Ý]þþ×®]ƒŸÓ³Ó3·g<½<õõõ­¬¬ZÚZX|SAÁA–––¹y=Z"¢ýìþgOS Aò§!6.몗{ûxs=6>Fxô^PX@êDMß@Ÿ«««…¥lW³·g3²2Ì-ÌA»¢=/?/3+±Ã‰L@`Ç›¥•¥Ÿ¿mi‚‹«‹½]NnÎ2Ó»˜R(ÕJ4q¡}GßJ±ß"eó©wõŸÀà Öéù] ¨D)~þ9oöÔ©SèxAJ•’Û±‰1j•¡öàÐ  ïÔ`CªhooOØ-­-dˆ†§ 7lØpåʕɓºÄÀ‚€Z¤R¼iÐ*ÄX _} 3KÊŠã£ADthXdp]c-Š µa«,;Œ¹eñ±aKZzÒ€d ÊŽ¡‘!eeUeo_ïq½ãPŽä6¿0Ÿ]·°¨íÆ–U”AÎ¥CzªRŒxbccV@~:%bçÏ/Èoni¦÷Ò²Òú†z†ÖÔÜÔ¡è€çdegq1usª¼¢ÜÏϯµ­ÕÁÁa|rœ‘ÆÄÆ $ðhÜèØ(„ÄçôEþÒ?Ð2.³ôT¥˜Ûäç¡£w¥°JP_ S,¥cŠú°eʃGŸ#ÇHƒÈDtùòåá‘á.u¡2XFÇQJÁèóv¨á,‰öqD)t1ÌEÇBÀR)Þ@¥`=‰\z °‡°OFÅDç$¥ÅEÅFè ’ÜêV²@i•š–ÊòbƒÞÈ5$Ã,J+k+.IÛû•«WΞ;{ùÊåsçϹ{¸/ÏÝ{wUŠá±a¨»DÃèØèÝï¦_úºntœ>àíÂÅ ôKïÔ“@žÞœ¾©mèàè P)P48cddùÝÜÝàÌÀÐarл'O\º| '’¾ÈüÑÓeçvq¥èRj9ºhïÛg‘a—Üe§\ɪ#–)÷>Ô$††¼mG |px#¡6T¤½CÇ ‹ •ÊãÇ_¼t‘ú“ú'šM[M>²àÑ¢c!à†©o`Zym9‹žÕ ±—ÀøäXjzrrZBt\现€¬ÜŒ[3·´ÍÕÍ•¬AÜÞš¾ÅÞ{ãÖäÔdÎÀ(Lƒ~¬ÚØøX² ¤¡°Ÿd:ñÈÈĨ®¡ŽíŽs [ÖÁ-ⲨR i>xzÛ¨è(/o/8Føûûw÷v YºÐØÔ(z'?§ÆÄÔ¥Ð6D¼Tª¹©‡~ø2 äðÌ!g“ðÈpU— '=}=L}‘R-=±šáZt,ˆ…TŠ7B)nÎÜ„ÀK§¤%ÅÄEDÇE–W–凇úåkm FQq‘‡§Lc—†üNÎN*)9‰ýŠD—$¿SÝÉ‘òrŠ’Ò6ä”Ô67º  ¹.‹»¾±¾¥­eé ê¢J182ó—h·¹€6džÞžä\s‚¨«¯£wþå@ŽäŒ"UTi~œWW\ZŒAum5û*Ò€Pr¡§§W^YÙ8¼$&'¢q}ý} Pú"Zz €€+ê**EG§FvÚÓ×ìÝ;áQ¤c^žžá‘‘~þîžî‘QQÉi)<½óÙ],Iñô ôa5M˜©¾pá4™PDFGð<òðÏËÏC»Pd†ÝIDATÀ¿(É £&iš÷hѱ âõ-õR)Þ4¥¸1}ãν;·ïÝ~fîÌÄ%ƆøWÕVÞœ½9uk² 8ß/Ð';/K×lâÆDL\ [‘±‘³«3Ëqö³Ù”´”ÐðÐéÛÓÕI°ŠñãÜ¢A½½Üöör½D0DËš^T)ú‡ûáÉm‡Ç‡övtrtptPôÞ3ÐCï}C}·nߢ†Á2¨ÎîΉ›Âx`xuŸj‰(G´Â^ŒH©VªºUbDt„ÿ¥' |‹*E{gûûwmÒÙ­JÏHmimŽOŒ‹Œomk).)LIMjjj,-/Ѱ]ÕÎé/>)^€WÃKiU´°&Ô.¥vt¼”±¹·É-•<Niw7£æbÞ£EêÕ5×I¥xÓ ”‚ÍâA•—ARj’©¹é<¸y¸±þ^Òó☹¹¨RÀsAûUÎ>‹+…ªÜaÑ&- ¥¥ÅY9U5•‰Éñå¥äwhD^AneU…º· ¸±ð¥øúû¢Úÿ¤± zR)Þ@¥`dÿdõ¬-yТJ¡ÉGfn®x„ÏŽ‹*E›²SÛ¢M†FÛm(פ0\÷ôpÍ¡CÕN¾°RcAÚꚤR¼q ‘®¬«ät€X°ù¯íèÄè¿%­mªeD$É+ás‚-TŠEKKG V<¼ç"^ÛX+ÿ¿¤o`—ækT:šÙ…nLß _]˜¾L@$²ÜyßþÂ@ê[ëGWÑXƧÆ] ²¡yßþÒÑÕð‘"‘=­|œÏ6ޱŒ‚±(ÕÊy+M*Ū‡²[Y×R§ùj³ÆZ–æ*@£æÛâj›kÝó¿.¥³·³¡­aÕ¥¦©¦½kþ&Lº„ð=˪ÎÜXª«[•­ ¿¸P*Å›€ÎžNv0Ζ«‹~Y#`Oc‹^ñŸ$êóÎ?Ž¥¯K¡V`°âA>ûXØxý~S©ËC*…„„ÄòJ!!!±<¤RHHH,©Ë㟮øÅû;²È"Ëê/R)d‘E–åË+SŠ»wï 455åççÇÆÆzyyYXXœ>}z¯,²È²ú \†ÑðvÃq˜ßaýs+Ž{÷FGG EEEEFFFDD„‡‡®ÏÉ"‹,«¿Àe ¯a7‡éðÖ?·R´åÌ™3xlÎs€?À"vm·nÝjkkkll,++KII tùA±wxÓÈÇùóçá °8Ìþ‹ ó ‚ âiBæAA„ópy˜¬&£ÅHìAðGãò¿‘AÄ‹³Í£¥­%¯8¯BPÁð‰=EEmE^I^kG«ËÿRA/0.0hÇÝ{w?ûbî}vokPGqbîܹíæ’yAϘ~½Æ>‡Æø¹ººÂ|½\k«¹VPË*ÈÏÌÊÀÏZAÙÜ2==½¸¸°²²Â´§<Ó@É<‚ ˆg+ÍcêÖ$#-=•]Ì®®®‰jjªù|~]}T&mhæåå&§$å³ò¦§w´Ê“„̃ ‚p®4îî.+_&“ææå†G„ûúúxxxxzzøøx¥¤¦TWW755ôôö<“Í–â2‚  ¸Ì<îÞ½«V«rr³£££===½¼¼|}}ýýý¯_¿Ž^Á¶DEE•””²dÒ;wî>~}}5£££z½ž9j0ÆÇÇ™ÊÊÊÊÚÚZLa2™ðÐh4¢ Ëål6ºàø‚Êôô4´ãÁ{k>û â/ž„‡G£Ñ@ƒÌf3c$èŽA:;;™‘gffªªª Lsssx¸¹¹©V«Ñݱæû6aÊÍÍÅÔdïÜ&ú7½¢Ëââ"žtßÜÜÜa¯Û·o~e³ÕÕÕ»wï>Åo»%ó ‚ œÀ^1»Ë3£¥-¡ÿg(øKÈ·‡‹.ÝYzÜô333aaaÛ?Ø#£~nnn'KL°©3ã`ÀÊÊJæ›Þvô²Z­yyy7oÞLKK …PŠtœœœŒŠŠúJÑÑh4|>###wµ°Ç„̃ ‚p®7ØÃ][§Çy9±m%!œäë3ãLå—}h:ó²h€ Óeeeeddôôôèt:œ 6簾&lö*•ª°°°¥¥…ù‚78„Z­.--šš*))IOOG%c*³³³<â,”J%3Ž^¯¯©©y`%ÝÝÝŶŒÝ·}EœD"a±XIIIhæ¸T žÝÙÙ¹¼¼<00ù€ˆÜ·}Ï‹X,†‘( , 9¼$55Ãb^ôÚ¿bb"æâr¹hŒÙq"£££ùùùaj¾o{ D.—Y,–;wîàiAcœ;ß¹„‘yANÀÅæ1=3-ÕsË9€SVRRÊîëëËËÏ)å3• ¢zÁö×óÀ.{éÒ%øÁ`¨®®ŽŒŒD½»»»ÑhD/¬D*•bˇ ŒýøÊ•+ؼ™sÃ>uÂTbcckkká^@ ˜qfffüýý¡˜}Ñ–€ÍºpõêUHöx???Çﻯ««“ÉdÌ·Üañ +++kkk¨Gc˜PAAÙl†:6<Ÿ ‡|||º»»™+Ö<::Š–óóó ¨„.`çÆOf¦À¼8ÁLHLL„I¤¥¥¡rÓ¦}y‹æææíkÆèˆ1ñÁopÖ—/_Æ2°¹\Ž^v™@ÁÛÛs¡ *//Ç,Мœœþþ~GóÀhyyy<gŠf´ôôôD³]ÝžBæAA8—™vz±¤ÁªˆbL2tÔ4©a===\G¥VNNNâ÷~ˆˆÅÒ*–ˆææfiØò™…:Ö0æ-;4veµZÍ8šÝ·}_ŒJ¥ÊÍÍ…”ÄÆÆbËG—èèhæUŠû¶û<¶˜ìš‚Cëëë8¯¥¥¥ôôt½^ooìh0€¦¦&fãÇÏY[àF˜ S£OQqq1ÔC1“B&¶˜GPPs³`¨ÄC¸Kgg§£y`À‹Åœ)ôæáëë»Û›OÉ<‚ 'àóÀ* ¡ÍÅQê«ß6$Ÿ™œïîé*ã•–ñ8Å%EÝÝ]Œytw£[[k«YØPçøüÏp¬Á¤Øã1¶ÿÞÞ^ìë°h]&л2<–ƒ‡EEEØòцÍf///¯®®â(3ã0S »B¡0 xˆÊëׯ3æÁ¸Èvó0›Í ƒ3_‰—ŸŸo±XÐråº}ûvUU‡Ã±{†Ý<&&& PÇCÐ/±X ãÁònܸÑÕÕµå5”ñ\á”—laÌÃq=dAÄÁeæQY]ÑÝÓm5›,FµÅ d‚2jÚl±Z­íí|ÞNÌÛprrrqq1¶gX v÷úúz‹op4•••ììì[ÜÝݱåc·ÆvÎçóÑ]Ça¬&„£uuuL/ØÃcÌ£UTTÀiª««1;Ƈ7 R«Õ‡jkk1;\d»y`y˜¨££Ã~Â%ÕÔÔ`ÌÜÜÜ™™™-÷y 1s¦PFCæAAìY\füÊr}³^k 6KµZ­R©àr¹Ý¥R©D"‰D ØPUjUy×Ñ<666ZZZPƒŸÌVí5°t‡¸@°%£l6›qÔ±1ÊSSS˜“vvvöõõ¡rii ËhnnfîeÆÁ!æ­1÷mïX‘Éd:-ñfÃx 3ò–í€jÀ™p.­­­ö›Oaò|ç;åÆÆÆº-(0_}‚îwîÜÙI߯!:ù1ËÃnÛ²«S˜žžþÊöx®˜Õ>k9#ó ‚ œÀž0™Lzæì©7¢JÅÌÌÌN®ÅÌÍ͹¹¹ùøøøùùEDDˆD"ø‡Õjåp8_Ù3ÆÇÇïö ÕJJJÚÛÛ¿l1555qqq B¡p‡_LeÄÆÆÚ?ÞôË‚§499Þƒñ¿²ñ“„̃ ‚p®7ÛÄ7æåçš[[’’²²3›´M«««ŸuzzÎ=~}}}tt4##£¯¯¯¹¹9++ G™o6©««Óëõ³³³ÌgŠ3q¨»»Û××·££C.—£# Ì皣 *íßgk6›ñpjj íßÒ‚–CCCö×*ðËå ,c``– V«ïÛ^ééé‹Å:Žùìv­V w©¯¯‡` xÒÑ£GKKK±êììT(p ¬§µµ.…bæËY¿Š³Èd2e^Á8L߉‰‰ü}YÈ<‚ '°'ÌC¥V±‹‹ÖÖWggg”*ENnvqIñðððc.0ßÇlÿØ€KJJ°3滨¨¨°°°¸¸8$$¤¦¦+éêêbZÂ-°÷»»»ÇÄÄðù|‹%•J1Nmmmnn.Ç‹ŽŽÎÉÉÁª PŠ-ßÏÀ3°›¼sÙ_A™œœìííEw<•••0,©©© §8** c&%%¡ Ž;†‡ÁÍÍ “bmxU*Uuu5Ö–¡¶˜ÔÚRUUÁ2ââânܸøÐ.eã !ó ‚ œÀž0NË)+]\šŸ›Ÿ™™½52:¤iRååç¶w´ÙÍ 0k×®áw}懃Æ<°ÏÌÌ`%؉á¨Ñh4Ø×™/¬OHHÀ^޾p Þßßub óóóè266ñóóƒ(dffnllàÀ<à¥Ré¨Dz½ŠÃÜhbÖ€öèŽV˜——‡.—/_–Ëå( 2#èëáá@+LMMÅŒp‰DÒÐаşŸ™™‰=¾¾¾¾¸¸¦ÒÓÓƒÞËËË`0`ü¾¾>4@ E$aX˜öxÔ°X,x ¦`îIOO‹Å½½½999ŽwT ÂfàÌ;k¤R)š¡ A3LÃÃÃížqßÁ<üýýó`ÁZØlöÊÊ Ž  ²Åø±›»[£ª-ñkº¯¿ï©Ó§S±Ú+4 ÷+îP /¡Dˆ±\ìwÝÝ Š °Ý^¹våŸþ÷?a¨ß}ø»…O>†v\º| cž>{-?Š£Ùè«ÑkB#B/¸]‹ ;{þ,v÷´¬4Åz°a;úÖ[ëvÙ ÍJy¥hrÍóÚ©3§>:ðQhd(þ¯³7Æ!,‡¼|¼ lÿR…Ô?ÐÿÄɇŽOЇaÀP8ñ<€%éL:GjFêy·óÑrµ|Ë³Ô m€@:rÈnX«ˆ•™“ɘdËÛÏ[©U>8ß+—||1µ²IùÛ÷ûæ[ož»pÎñi$gòR˜Ç}ÛçzÑ×Ô=>dÄ¡¨´è'?û ¼A­W_¼t»)vYìÇâF1 ¨©¯±7.á–>zXÔ(*,.,«(ƒj¤g¥£\#Ï/̇¯ÈT²O‚}]ª”2ìâØï±Ù¿ÿÁûðìÍœr¶plØ É 7ânÔ‰êÜ.¹}ð»ðÏõ HIK±¿ I©Išf ¯’çãïƒ]üªçU4J…¹ò¡5híqè÷ý¾FXƒ‰`ÆV#z° TZ¬å£ýéŒ:v)‚9€g¼ýöÛèŽÅãÜñ$T ª FŽ*/ A¨ãkµÂZ?èÊéÙé 6†¾êFœäI­Sgæf«è_:áB\`¼ÞÆíµÛë›wnßÞÜ Â)¬m¬r«È<×ó8wñ¶g”ýý!eåe(0—‚Cƒ™k% R…ôÔ™S”¼Â<ÈDSsôâØ‰c'O„ÄÆÇ*šð XÅ–üÉÇØÔ1SƒÁ/¸]`^8Ðà(c„ƒŸÄV ƒq\d`H`QIQ›í>’³çÏB 1)é)ÖÎW7>äh8¡ÁøhvâÓð Œ ¿INKÆ¡Ÿþì§h µbsØÖ.+Äåýß½tÁÔhŽ?ÖÜòùõ‘ÖöÖÔŒTøNáÒåKŽæ¯òöõ.,)ÄÞð¸Î‡}ˆð„ìÿx½¸>'?Fâò?eâeÆæŸ]PWä]T—˜Î ÝI!¶ÐóÉ ™_»P(HxòBL¡Ç×.äTF?yU÷˜BnåÜÒl2ÂåÀ<¼|¼˜2cØ\±1cGÇßOüNÏb³ì±… ¥BlÃç.œË+ÈSëÕð€êºjüŠ/’‰°?°Š£…ãèÌ~À¼<`7÷+î¢Fj°gc×p_jK3„˸æuÍñÞlÞ¥¼Ò6›y@q´F-vzæÆÕGšGRj¦Ö›ôGŽAcûU÷ÌÜ̲Š2Æ3£Â9<f”kä¿ûðw¨‰ˆŠÈÈÎÀÙá\dJ™ýØÒù‹ç Ø(`´´Ì4Ç÷ªäå{úxBÎ|ü}ðl@¡ I "nãàVNäH—ÿ)/3.0Ô‚ø`ÖÉѯŸ¼ñú ý£…hÇêß` 'Q¸ñºCc×N¼…À¼c)¬x2ÂåÀ<ð‹;SfÌûnBr¶äwu\vg¶|†›kY‰J§ ‡”Z q q5õ5ú=—Ï…|À-Ž?ŠÝ™B£ºÑn*­ªí¡y`ÿNÍLÍ-ÈUëÔX¶ÔÀ „¡ AðÁï?`3”rK±…C;jêjNœ<¥€y`%m2kž×Ž8†³€B]¼t½à‰)‰½nñ‹w~ÆP„äôdœê™WA0Zv^6N2TV^fÿ·) `H—¯^¾|íòÛ?yû‚Û“ÅdŸ íOŸ= OJNK†¬àÀS§Ô*ÄQ<Ÿ!á!ŽWŽÂɸÀ<Ò‹C N‹ÜÎxýŸˆ·¿™ðÿÄàýú«ûŽ»ï;y¼~êò¿x|x$âu¦%ñŒù‘OæÁäü82Âå` `ÊÁaÁ…Å…°›å~ÕÝÍÝíFÜ&C“½1>Ëß IDATlmN9uèÈ!´Ä^[%¨òôöÄ~|=èºD.Á^{åÚ•“§Nb×g ÿÓÓŸâ¯:Ê ‚]5è )¹|³\ñ¸Â\mÁ>}éò¥O‚1 æ?Ü’ ÕˆMˆ…F`UPŒæàÇ)ç´Ù^†ÁÈZãÌãȱ#ç/žÇ hƒ•µ•˜Š€Ÿ¿ùíoÐ댎ÆÔž>ž¿úõ¯P£3éPƒ)Ü.»áôùoÓÃËC9Öà,à.øHÜ(n³ý—›™›yéÊ¥ —.$&'Bzj…µxºðT0׳Âù¸âjKNÔµ”ß ßüõ÷òï¾ÚöúëÀòúë¿Üï/ŒæY@x©éçnqƒßbZÏšhö¥Lv*™árð¿öu¦ŒýØd51• (ÂÖ_Ö»\ïkä8Äüíž®iÖ(šèÛfÛ‰±…ËÕrŒÃ0BSówÁOæ:~25R…T$É”2ìôØ›ÛlïkUëÕªÆíoC…ˆ`eæ}ðn”‡7b4ûÅàáí‘W˜‡ba˜ÑФÐ(tFF@c•N%” 15¿†îÂ9fñ˜ôÁ:õ—ýÃD÷-o3fÞmëëïkíüÃÛw™×<˜gÒÒaÁŒÊ&¥ã ™¸Àø êo–z 4l©Qp‡Ê¤áùç…ý84ïlEcŽÌX™V|2â'!¹g$†Š*E~Nu$©-õj‹ÝtîÆ{Û§{ ØÉrË(J¡ÿ°‚ ˆgŠk®¶ø¥;ø?ñŠúò¾Ú÷¾QóÓÿ«ñÐÿî.õëáÔ¥½#byIKÃ.y\9àû&Ór g£ß¨‹ñóóš }G‚_?¸/²À=•t.ú—ÇËeY§"~^&IË;-qAÝM÷›\Iø=W’á‘| ‚åfèTx&|:òïã¦Ìú$Ñæ’ÓêÔ_vó/Äü#ÓØ‘Sá¿(—å^Šý|œ3ïEæ» z3³"<8ëìAÿ}Ç‚ßR·ŠÎFþ’#JÉ>~"§*úPÀ]½JQˆ6á¹K„©ý_C÷Ã×ßðI9’Ê ë*®Üühût/¯…çºeÒÕ‚ âÙâóHÊ‹óJ<|À÷‡ 6Ön´ÿr¸1¦£òÚdSâ|÷–6¥«âü¨4,>à™ÆŽ øq|±_AmÂÅïŸú »>9›}øú›þi'c =O†üÜ3ñÌP}*ìÒ†ôà¬s¢›R|.ê×¢S¯)óM9–s±¸>…Í;éH@ú§GagžÝ>ÝË€Oò±”ü2‚ â™âŠ«-Ii§ö{ÿDDÿ—>Íwæzö-yvW¼¥MšÖ&,S[²ç›“¦!c²°XÿÿÎ4Þ§!ï¤qêl˜«6á\ÄoPyäúÛ¨¬×pk•Źî}_gÕÄcºOü^Ì»R«,©SsR8Áǘ~6¯*ŽÊ#þ“rI®ÒT/lâüí#§{áqù(1‡®¶AϘG\fäùˆ÷?òü8íÿœä¿©Ìù+aÙdœO¬Üã3ú”9]üœ.nN=«½ÙRvÂÏçU¦ñ6~xÈïÍOƒß;òËÃþoï÷|©<âÿöéÐ_¡þcï×ñðhÀOú¼Â'¾?FKpÈ÷Mæ!1CðÚw<ðçgÃ~}"ðû½^û’é^l~’y‘®¶AÏW\mÉóˆ;ôáµ0|tíûy|¿Çzü ÜÿÕ†´w:y'{*N÷”Ÿ2~wýՃ׾goL<;¼â%çÑ{[‚ ˆg‹+¾1Ž•è—ôéï¯|߯ û¯|ïôµï^¹ö?¯^ûÖÕkÿóÒµW^ùç‡ ¶6Þ}áIx©÷Háq¸E|”MW[‚ ˆg‹k®¶œ ýàLðoŽøþìäõ÷vTy …×ßýÚ…£~O¡p6ä·_»p<à'/óÿùc q,¿ôºÚBA<[\`¥üâ&³ÄÔ©‘ꪛZwThéjzò‚ºEôµ 2}Í“Ì]Ú¯]Pš„O^hl<¦ 0Ôg¥‘yAϘ_Àÿì³Ïv24Å™¹{ï.·šKæAAº MAA3Qzz:sè éì쬩©AýÓØñ÷JÈ<‚ 'à2ó€(˜[ÍÚjµê¢Ó骫«››+L¦4£1ZÖX[U] ÏØ2+F€¸Àbcc£££¹\îêê*Œ:ÂÜ’——g2™`ùùù˜ëÎ;(@SÐÁ´AmP())FØ/ l1´Q*•LM__N ƒCežõ °N™Aá\fØûµ:­ÉdÀvÞoKŸ-B¡°¹YÙÖ¦±Z’SV:11±eVŒ°²²‚A¦§§[ZZâââz{{a ™™™LxŒZÃf³ïÙ’ššŠ–Û­´1›ÍöÁímÐ+99ÙÑ<`0°™òòrÿš›üž ™Aá\f««+2™ Ú1>>>22266f/À!AOOOgg§@P ó€“l™uii)//orr*€2‹Åêêê‚1dee1 óÅPh°¸¸xóæM¸‚£y ±N§»{÷®\.7kkkX~2­ÁøÞÞÞG­Vc@æ}7CCCóó󘱸¸ø‰·û=2‚  ¸Ì<&&'„ uбXŒöR©T"‘0¡PÈf³a5¶p¹e:†á8jµÚœœØ~¢Ùòò²ý½-Ì ¥¥eccC¡P &QZZ c@›¢¢"¦MCCCLLLeeåÔÔ‡ÃIOO‡”LOO%&&bpïvæÂEpö¢[N~þ#/ÍÜ»worrrüaæçç™WJ˜OýÚÕŽ»´´„¡vÒl·#?_!ó ‚ œ€ëÍ# ðfJJi|<;6¶05µ4-½$7•mKrJŠ—Ÿÿ#/¾ÌÎΞ:u*(((888 ""¢§§êTª¡¡¡]í¸---ç+›Éd²ÝŽü|…̃ ‚p.6ç⥋ž^ž×¶€J/oÏó/X­–í³NOOC8)ÙØØhhh€|,//kµÚ‘‘‘ááášššÊÊJ¹\Ž6‹¥¨¨H¡P¬¬¬Ü·½^¢×ë Fãüü|hhèéÓ§!:8:>>Ž^ùùù8 4Ã85¥R‰‘Ñ•0•ÚÚÚ™™™û¶WYªªªp²õõõÌçµ?§!ó ‚ œ€‹Í£¼¢¼”S¢×ëtÛÐÛ¨àWð++¶Ïêh÷mòáëë;;;Ë|EmssóÙ³gá ==="‘’!“É wîÜéè訮®V«ÕhŸÏ‰‰éîîžšš‚Cèt:8 óE¸çâÅ‹§¯¯/==#/..b´‹@k 988m0êŸl÷weÈ<‚ 'àbó¨à—+UJìñ êµ:myoû¬[Ìúûû;šdb}}õð‹U__/’““á \. îÞ½»¹¹‰(`¬¼¤¤ä¶-¨éêꡤ¤$Œƒ£Œy 2-- CaÀÔÔÔþþ~ôÂi …ÂÁÁÁ-_¨û|…̃ ‚p®7…BÎ\y˜Ñ‡ÓhÔ¼rîöY·˜ [Ì###ƒ9Äãñ±taccVÑÒÒbÊn­­­¥¥¥÷lg˜Íf‚µ0Íó0 AAAÌh|>ffJ$èò±»Ý~/…̃ ‚p.6~e…H,êrH·-=¶ôööÊdRØÉöYÍ?ÑØÇÇg~~ÞnYYYLK•J¥×ë777×××—––0µH$‚U fqqñÎ; ˜7@MÐlmm->>"b—’ûÍÕÖÖ®®®2Ý™Næææ  ¹¹¹Ð‘¯½ñ»ƒ¹Y¢ ÄµÏ Bi½Z¯jmÄgI›ÛÍM†&E“B®‘?`©:£î‘Ÿ‹MæAA¼€@;jª¥*q³YghÕ?h ªja¥¼Iníü p¥Vil5 =ôöÃ<ÔÍjKÇÖÆ&ó ‚ ^4¬]V‰Bܨ–ôt Oö<' MôZ»Z*ë*ÌmfÇÓi67ëMúå•å{ŸÝûì9 –:¿8¯Ò©Œã–?2‚ âEæ!×6›µÃ“}ãÝÏ£“ƒÜªR“Õäx::“Îl5ßûŠÜý"®ÏÝ»w5z ´iËŸ™Añ¢ñÐxô¨å׿–üîw“-¦ÍÍÛÛ»8 ,˜Ìƒ ‚x)`ÌCoÖöw÷Œ´ïsOkv•¤ N¦ïhIâJ¢ØJ¿…žæ\\­ÆbbÚXzLå5œôÜ6—¥j–u·¡Rª*tR¦A×U¦©šw5õðäÀ£ÍÃjÆ^~{ó¶#ë«+%%ÒwÞé?p ç7:¾ýí|÷»?ÿ¹õ_ˆ÷4n2Ù¯®­Mƪê*±D<:6ºe¨'A¡TÌ/Ìo¯Ç‚É<‚ ˆ—‚ÏÍ£¥©´ N°s  º6SJ¹Ì+­>ª°¾F¥‰`ÕûfJ.%KB 4×’ë4#šYºaQÁîWÝn&ÝÈgg§f%I”õÝCÖøä˜¬ü´ã Zjø)™ êæÆ]-`x¢ÿËÌ{ùÆí Ö[YùÒwß8p ÷ûBBÚö³öï|§ûèÑÀÀ_ýªõg?køàƒñV3¯¬­ðùüä”dv ;;';,,lxtõ«ë«s s3³3P‡µõµõu<\XZ@Íìü,Ž¢ÍÚÆŽ¢žy¸~{}qyG—V–P.^èìÿâÚ€“yA/vóèé€ìö¾V±^S,‰)ÓgÕµç5戲‚r$IÜ&…y0¶X®i5 e1¯àÆÍAÞÖkjï3 D•7nF¬M7“b²òÒ:úÍõÒêÔÌDhÇÎg݃֡ñ¾GšG‹µecsf`BP{øpï‘#=ûöuœ8ÑÝØØŸßsåʸF3.t¾÷^Ï[oI¿÷=+§ FÃÍø›ýýKËK·fn—7ˆ #b©Ø?ÀÿÜùs^Þ^ºfÝä­É³çÎÆÄÆœ;wîÂ… * ¶ÑÖÞ¨R?x85=Å*`ùøú””–ŒOŽc0¾>ǵ1`Áj½šÌƒ ‚xñaÌCgÒô·w¶î„ö~3G¢Î‡° UYžâÆÞ Uo½¾_iìe7ª[›;Zýƒ|j*:ÌL_S»öš÷…V—t#='¹²Žì#S7 åg·38Ö[VYòhó°½üðÖW«ìs: `dläÈ‘#ýƒý8± „‚xxx ™}Þàà3gϸ_vwssóöñ^XZ8á|O_ÏÖf VëÈ<‚ ˆ—Æ<´&uç@«µ×°,½†ú&ed¡Ð/OXl åXcx­É•­¹u–Ri›ÌØÇ›Ry"}»#cCS²ÌÝz¦o£Väá{?c"/^>רm¨“V†ùK5BËÎf·Ó7ÒõHó0YL^¥X^t¤ò£>ù¤ý[ßê|ÿý1•j¼±q4'g¥¯ošËm~õUí_ü…ä•WL,´äWñ ‹ gæfP†+L]³Ó2Ò¢¢£ÄRqNnNÀõ€¡‘¡O?ý”i¦P*®^‡‹@/`öIQ) [­­«ÂÑÎ?×ÕݵemòAæAA¼0æÑdTµ÷™Z»õ;¤¥K×hT%óüräá%ß̆Èa »!®¤!™+ίKôJ´AËšžo We=WoQªÒ¿8ogna®öÄqó›oöüÿÑþæ›qq–·ßnþÛ¿í9sf(2Rý·køÿAð×m,,@ã¶Ž¶ˆÈ©L:8<¨Õk½¼½ä ùØÄ˜ûe÷&]ŽB/|ý|ûûO~zòÖÌ-ti”7ÂEÆ'Ç323 P Y£lv~¶Œ[VW_7>1wQª”¨9{îl{g»ãÚ–V–T:™Añâó¹y”–^ƒ©³iç;›TfeV•ð\LùõL^J,ÖJ¥z™Ü(o²¨Œ›µkJÊY!¾/Ÿõô»’”'׋P›™–“È´Ñ´È"cCò‹³vµ€ž¡vÿÑæ1¿4?=?íH§TTÿ/¿²|ï{íó7Íÿþß«þÕ¿RüñËÿõ¿Vü»×ü—©üæ7k?xÀl|ÐxnZ,GDExzy² ǧÆ'nMä²r¯^»zÍãšû÷ÀàÀÞÞóΣ]!¡!S3S2…Ì?À^¯æßš½ÕÑÝq3þæƒq®`LÔ\º|©­³mËÚÀÂÒ™AñRÀ˜‡¦YaîÖ5·«vŽÖ"WÄBemJIiBa¿[+­*ª¤MuJ£DkQ X-(âå”ådä'Ã9R²ãsÙé¨áÖ+šEj“Ô>šÊ$E¯]- kÐÊáo7C«afafrfò Üï”Kï½kú§ïZþónþ·ÿV÷çÞôgfø«¿’ÿÝ|òqŸÙ09=Ñ?ÜEŠ…å•åÅ¥Åeåe¡@$uõu µuµ8GÏ@Ïø­ñ®Þ.fð‘‰Ô 0:9ÚÞÝÞÑÓNLOôöZ:,h }A ƛۺ¶™É¹Å9¥VIæAA¼ø0æ¡n–›:›tVÅŽ‘«[¤ò摺¦FR^QÏá×—V‰¸u|±¦õ³ ÍŠx¹ÜÏl' ÔGc–îfºGÐÑßúhó0nÍÞ‚lalrÔ"T¿ó ñÿ÷ÿJÿá$÷wâW^©}åÁ¡ƒ½­FÚÍF¿?o_oG||}jÅöŸ"3ó3dAÄKc*}£¡]ÝÔ*Û°u‹Di)š` CƒÒ(F êw;Ô× ½ÏüHóhnižœ~ð:Ä#¶Êά eF*ƒ&/»»¥ydüQTIÙDæAA¼À<ê%y“Dg‘«ZÄÏ ðsgóö÷¶èL:Q‡½|ptð9btrT¡QZ [þtÈ<‚ ˆŽ®6…F^ÝP©6ÊLÚ–.ÝsAs›Z¤¨«i¨6·›OÇh1*šî´˜›{˜±tXäy‹µeËŸ™AñÒÒÖ"–‹ø‚òòš²ç†ZnMC•Ö¨Ýr.–N *±‹+4 (Ès€FÕ6jõ-zk—uËéyA/&­ífì|M†¦çÛ'†·oÕm6ù0YM†VC³¹ù¹K…ü=ò\È<‚ ‚pdAA82‚ ‚ œ™AA΃̃ ‚ pvV IDATçñÌÍãbô7) …B¡P†ÌƒB¡P(ŠóòÔÌcvv¶»»»©©©¦¦†ÅbÅÅÅùùù9sæC …B¡P(”‡Àà °8Ìþ‹ØµyÌÏÏ ˜L&‰DÂãñ²³³cbb0ôy …B¡P(”‡Àà °8Ìþ‹Øµy,..ŽŒŒ´µµA^„BaYY…ÑR( …B¡< ܆O€-À`ðXÄ®Ícyyyrr²··×l6«T* —a±X) …B¡P(7€!À` p˜ü±kóX[[›…¶twwc XŒD"©©©)£P( …By¸ ž[€3Àà°ˆ]›ÇÆÆÆâââ­[·0ü¥­­Íd2aÜF …B¡P(”‡Àà °8Ìþ‹ØµylnnBXÐæ299‰±à2m …B¡P(7€!À` p˜ü±kó¸wïºÁYÐyyÍÏÏcÄ[ …B¡P(7€!À` p˜ü±kó P( …By¦!ó P( …â¼yP( …Bq^È<( …B¡8/d …B¡Pœ2 …B¡P(Î ™…B¡P(ç…̃B¡P(ŠóBæA¡P( Åy!ó P( …â¼yP( …Bq^È<( …B¡8/ÿ?¾Ï.Ô}êbIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/missing-gstreamer-elements.png0000644042355400116100000004261311675570700023345 00000000000000‰PNG  IHDR=¿šú¬ IDATxœíx”eº÷¿ë+çìÙ³»ç|gÝo‹ë±® wU,ˆib£ˆ…"½÷Þ{'Ô@ H ! !$!!½OÚd’I™Lˤ@ T•U×UwY¿ß̃¯¯@‚(rß×ÿâzyß§—û÷Ü3“™ÿñ•˜˜˜˜˜˜ïØÿ¸Ù k† ·ÄÄÄÄÄ|É„[bbbbb¾dßâÖÅ‹¿üòËÏ?ÿü³Ï>»páÂ'Ÿ|òÑG?þ}11111±g¾@XqàôAÍæÙÈOA”xöìÙ“'O666:tÈ%&&&&&vã ²À(k Ü>0¨ÙÜ‚xd†„”ÕÐÐ@ÑV«Õl6Љ‰‰‰‰Ý8ƒ,ðÊÀˆw  j6·ÀÜ£Hh·Û)7///--퀘˜˜˜˜Ø3È_  ¬8púÀ fsëÂ… „lЂL&SvvvBBBddäv11111±g¾@XqàôAÍæaÐ#pƒCCC7oÞ¼\LLLLLìÆd/PÖ@¸}`P³¹õÑG566Z­VÂ7HH¡®C.‘H$‰n”&{lñâÅþþþPÖ@¸}`P³¹uþüùC‡¾´´4‚8xxÓ{(‰D¢[Iý=6aÂÐe` Ä;Ð5›[ï¿ÿ>ÁZaa!±ÛöíÛ ånzE"‘Ht+©«Ç@Q”5î@$܉D"QË’pK$‰D¾$á–H$‰|IÂ-‘H$ù’„["‘H$ò%µ^nÙ\6c©±¸¬ØQëPwªœUÜ1•™ªë«+m•êâKsÖ9)Êb·|ÏVQN…­¢¤¢¤¤¼„ {]{ĵÙb¦Y—*RM%×MÏ«‹A6šŒðPãvÓû+‰~8µ^níÝ¿·ím;¼Ø!)-Éå¡ÂzÿõÜéÜ¥syUùâe‹ÕÅ5–V`*x¡Ã k7¬ý>M*­, Þ´ðزm‹þ©–‹ ú¨ÏÒtˆšŽ§j³j€–kà 8켺í¡³H$jájíÜz±ã‹ƒ† ‚„/:wzúé§·6nÞ8`ЀJ[e¥½fŒ?vôØÑ„ ꕮ’Bp2lİé3§GÇF« ûöë´3H]¬X½bÑÒEï|wÊ´)éÙéÊ/ï‹ÝrÆNKÕïô}gWØ.}{2s3 ³Þ|ëMB(›ËFEPJ·m%ï‚E h×°ª¨´h朙/¿òòþ¸ýd¡ü»pÉBGcÔ˜Q'M$ñ Áƒh- ‹Ú5bÔˆaÇEDE¨WKÊKÖm\7dØÈ°5€Š%Ü:cêáCHIQDrÄIªñ”CÉÂSþK I@d3wþ\êÚ½g·¾/Œç¦-›@¤e¥Q‚ž[´ß=8Þ]²l #É={÷ô~³7Á%M4eRbjb@`Àà!ƒIVZQêò„›î~S`nA.cå¿ÅÎü9ýôŸ9{&wvîÞùèc>ôÐCÝ{v9C;ã“â9ÐYf¤åG¥"‘èZÔª¹uï}÷Nœ<$$'øø¿Þýu£¸5kî,uòü Ï÷èÙ£{îÏ=ÿ\ph00˜»`î3Ï<ƒ«¯¼úJrzrž1ïúã²ËÔÅã?îÎÒ³ûc=6tØPüxRZR×—º¶oß¾g¯žÔxß}÷y½¨K«×®Ö^ãÂ;Zû /´¶= Þµg+­,5–i3Ü¢Lü2,éÔ©^›òéÀSÓ<â6’Aå˜ø¿jÍ*B·^½{‘ì™öÏ@Ó,CqçSO?Õë^Ï>÷,êör7O/A'P§œ×^ QÃEèëá6S8umÙ®u„fïÞK!´ŠÐ§ß»ý Š 4nQÚ’åKRÀxÂ9zѱcG²<Þöqª "ƶím‰zi3ÝwøÆ¥!Ÿ*sm¦ Œ3”e²Ã6mÚÐ$¨ßèý¥1S gˆ «¼õ%ù¼Z5·€güŽ:‚á#†>׿Å-þ8G‘Àí«×¬ÆËãFÇOÅÿòÒ”xq«Oß>î›EyÄ1^ìPVUWžzê)œ8ñ>׋[øúGydïþ½.ÏK[<5gZ¶r@BÄOmÛ¶¥|µð½á -(8èþûï'qy>iKŸÊ­åDŠ;víxºÝÓä"¦|ìñÇæ-˜GÉÄy~ký¶íØ6fÜ GŒ¨¸5nÂ8¼tÅÒ?üáÄ^99o½ý¬µØ-[‚¶PÎÀA ¡(géò¥Š[ %>1žºôH¡UŒ^»vížàÐO>Aˆ¦q ä0&4’p­cçŽ\@¸E¥ëý×çó! Ø›K¥„_ nÊô)8rÔHUàþûUÄ£„Y 5èBv—]½NÈPкÃõ[ï¼Å¡dýÆõLcrÓžH$úžjÕÜÂW†F„:oøbÇ×®w£Â‹[øÙ±Æàañþ„ä=˜rðÍ·ßä&Ž{òÔÉx[/nÍ_8ßýîK]5„#¦¡œÙsg¢'‘=î`\›GÚxq‹ø7 A ®Ø‘€†\xÛ [E~q>Ì#n[³~M—®]ˆÿðËÛƒ·{q‹ŒÚÇöæ/šÿàƒ>ùÔ“õì³ÏÒ;w0´/l€ÖTG”K·6lÚ@ÕðŒ,t“”€ç…/PûŒY3¸ NT9 /TÜ6|˜z P/îô~«7D„4¤g”d[Œåüñ$æã)H§àå§f¦R)h¤dF =÷ÜscÇ¥¯÷x]_`TL”*Ñf"Ôw¾Ë˜0nTª%ëü×.Ž µüh‰D?´Z;·ð€ë6¬ÃõsŠOÎHnÊ-|úÎ];Ã"È®pµÊõÇÆÇïÞ¾{ü¤ñxa‚/nµ¨ZåL´¶=ÁMie)qnÚ‹[9ù9D P'Ó‰Ã-)/Á»éåá|êör·Á;*m•ÆRãô™Ó¡¸"£ñ‰©‰ê='<þࡃµÏ ÞáåwïÙM/hprz20àÇQ®ŸˆSq+`[Y¨ˆ¶)Ž=Rqkåê•”C„—‘›A9ýúø­ó{ôÑGqî^MœÄ43fÍ ®n¯t:|(=ߘïªwØ!&>†;»t~íõ׈·Ò³Ó!á ®ÿåW_¦F¼öÛï¼=yêd­@¼àöÀÞoõFþþU÷«dD-øqZ2eÚ”‹Œ›0¼ÁÔàP7ˆ,¡cv^6×´¤÷›½- ”¢ú«Þ+¢XD]³çÎ¾ìØ–T”,ZºèÕ×_6|XÔþ(ÚɈäQÉÈɘ8y"ÑÏä)“é½#j¤RO^õéÛ3ªÄXªŠbs±»À×¼ ŒˆŠP5ª\.r_$m~óí7é&…€2b'M¤›-ÿ´E"ÑwªõrËQã(«*S6d±[Ôû4D60Fáò|Ð@½Ã¤ÞíWâš;ÜWÿ£J£íB%Ãã«rà gÿ©Ó§À<ÝîiÕ´U8Vj¸?ìà°èÿ~ÖÝN‡…x¼©Š¾¹i-·U»ÛFFí«4.uÓóýú¯ÞpLÑánm#W¥ÍÝÚ¬ð/×Ê¿S”ö'© zAbžªkw¥_á…;Í×U\¥@}.­¿„Å*µÐ ý_t‰D"ŸVëåÖ,C¡aäè‘O>õd›6mÚµkG(SZYzÓ[%‰D>'áÖ$ûÅæâ´¬´¤´¤ôìts¥ù¦7I$‰|QÂ-‘H$ù’„["‘H$ò% ·D"‘HäKn‰D"‘È—$܉D"‘/I¸åúž¿‚(?¢ØÚtÝ3®~䬅7RtsõCüš]sCëå–±Ô¸=x»¦Ý{vÛkìiYi%%×]&ÙÍ–ü÷ […ú’ø+‰5tàà&>%#Eû[iMe–²«gW*(.Ðÿ1žî\i³ SU]™†Ìëk§µÚª¾~ú*bU3°7}H]Ë6iš&·074<u-U°÷ÉÎx6tvHp ñ€þDRR^²'rO–!ë:zDÙùîïÓ¹Ž=¥©´²”mkwÙi,<*œA¸öì­—[…%…[¶mY½võëÝ_ عk'~jÑqÑêgµ#€³ÖýÚW3x­ý#²L9èò°„û”£&¬÷o‘T»ŽD•¦ÿ õèÒªªw1Ó©¾Ì‚§YyYcÆŽ©rTU×US‘ûþ×Å*ñßACUÚ+YŠšªýªU,ŽKÙ=?Á¬~…¢T^­öm;¶i?FŒXÐcÇU½ÓÿØ¥ìžÚI£}§u©þªkí[0T§´;—ÆÓó Z µbéµö´éhÓ U ÉTÃTul€ø¤x•€2ÝëéÿZV¤¾8Om(4hu©aôêåë÷6ç€ÁC¯÷_ÏØj ´j3øMÃj¾Õ0­p}_H ‰¾›Z÷×Û×8Ôžê‹**)R‡ õèRg¿nƒ¶`xJ³9…¨aW%¥:&6ÔTfb¡ÆˆÑ°š žFDE,^¶Øý}˜%…t_?¹ú¦zÕî%£Ù8rôÈoåªw©É½ÔÁZ«zøÈá‡å² ãR¯ë¿5ê©×âW÷UµP½¶¤vÇk«Ñö¦*YíMU…¶*TJu¡U­z§­–oÆÄ醣†×6ѯ±¦i\¨7fþ¢ùê(yÙñן¥2r2† ÂBÕ-ŽZiL"%s¡}‰ûwh/˜/‚wë)n1CÌÊŒÙ3–,[‚sç¿øˆ©3¦NŸ9}ÚÌi0rÒ”Iã&ŽcžØ™¬XC³çÎŽ‰¡º¢Ò¢QcF-\¼ÿ2aò4å·oß~èð¡hÙÊeœ6cšæS\:n±žròsòŒyS§O%ý’åKX÷ã&ŒSÙóùœ¨‹>B8õW”9wþ\ 7~œ·úè¿aÓ†‰S&nܼ±ÂZ¡¾WpÞÂyd§n×ó5·ŠËŠ7lœ0iÍf<É•˜–Hœçþ1è¸hBÀ•~+Õ÷:º<_ µ+lY©óÌ£UŒy—._ê·Î•I{ÔÏëqHXÈœysØlŒÕ¦-›è×ùÅîì«Ö¬Â×3° ÎÄÉ÷Åî#cTŒûšÌm;·±Øiì“‘.2˜ZÈNJ`0kî,æ}ÖœYZlJ¼ÿ3íŸ6|Ò`†×À €’II›™2Æ!pG Ü2ûþþðžYfU9tPý‚šòÛâÆQïšõkÆOÏ#¸Ë¡˜Õ¢pËØR wð\ô‹Jµß6Ó±b™\zGšäŒdm통 d©N±&Ÿ~úé¾ýûnÞÎüÒ¶‘£FÒ*õ½Žzn±f¶m¥#µ|årOÿwûwê܉!bO‡åÄÙnü„ñ4¸¬ªŒ(mÔèQ‹–.bE‘ì²ñsÝ·_ßÍ[73&ë6¬3Wš Æ\=¥^¦¦¶{¦Þ6· WsRD ܧ1ê׫Ý?!4~ìòUË—­Xæþrç„XýžÒª#×ìy³éýe(è> ƒE«¶$©Ž–° Ijao’˜ÁU•²7Ù2N— –ë„å7j¬{'r‡ûÌ8 Žvy‚Ö*¹(A}Eœ»+—“€Æ«42–®XJ½,r6²Ê¥~Rœ\*0jšF‰¡~âÉ'ÞéûÎþ¸ý ‚Ú\œ'XU Ø ê» (jĨíÚµc¡’^û% ö ‹ù²Ü ßþÌ3ÏôèÕƒ~AG‚lnґ鳦³DL =v4»)(8ÈýÅu–2ÖÀ¤©“عÌx·—»½úÚ«L(ƒ*˜ Æþe=°œ8‹°ê¸fŸª]F¸I`ÀÀ2> )CqK­üÝá»iŸ¾}H¯EꜜXäWz©C¸õmnÍ›ƒ/P_%þîÀwÙ¨ÅÔì|±ûµD×7Gwl¡¤¸Åˆ³yðM™†L.J+JÃ"Â(Ó s¹`Ýãß™ÎÐx€w#Mfn&n¢K×.ì1œ N4À†5Äšãn……È&qSnÁ‰´ì4 dO‚C±¤Tv–Q¿fšSƒÇÄ3Ò‹ØøØ={xq«c§Ž4ƒÄkׯe?°ôwîÞÉ}îìÚ³‹ìŠ[ì|œ)%°-ƒvnÄ}೨ú>ï°(7§}©ŽÅMOq dß²ƒõ|£'ë•ÊÎÏf$ÙÏt„Öj_Tˆð>@ˆÄ¸\'ýš¿p>}ä ÒVÙïÝ~Œ õ‚(õÛždaé§@w}©+û„Y#Ù¥îï;Þ½—©|ùå—µ/˜w{ØøvCæ{¿Ù›ÝH/¨bK û×/ݳ¹d!®Û­OOÉü‹ØØ”ŒßW…0/tÿÀÁn†ç/X´€–¯Y·†uB(C±0RùbIîtïѧ`*7i‹S{DÜ~¹¬LR8P G  ¥Ö+Š©¡ƒÌ‹œyaôðJznš +– £C¡›8qü#Îb_Ì>1£ê·Ö/9-™þ®Û¸Ž§ÅúÄßQ©ßz?ñe÷ðÛ°ym`³ZXºÚ.céR2«zøˆáúó5sÍÂ`ôh>‘‘!ƒæYZøV¶~OiÕ±Þè/«‘Ýʨº·dY1,$úË¿d¤Ì»v0˜L¢úíV*Z´d+ììMV)~–½É<²h6¾ÞýuÆœ–Ð †‘Ž0¿L¡¦›œ`FzA€Ê˜Dêe‚˜>Ö9‡-­R¹Ô û^i´qÔ£%,Zu"Q›‹Áa©«g¯ž0‰IÔàM±€ÄôB‹ÛXüjÁ_6Þb:X‡ê÷Ôï0¨4ÜáD`|ÜÍà‹„õÌÞd·’ÌoíÜÆ2cmPƒÉ`^8j0³ì –"K4<*\í2òrAû©(#7¤1ªŠ[jåÓ)*eI°6V®^©~Ü•aW''áÖws‹ ÃØ¹ß®uŸLY:›6±¥Yw©–Gœ°ô·˜Ž*êàÆ ‚ @™@ˆå‚aWpÁV$ŒZ˜HRROY.L$õª IîpÂry^ªÆeSlph°þ×½¸ÅräüÅ)› ÏÊV¯ø‘ 'Eɪ.z„Ï3fÍPÁ;.Ø‹[À;0,VÎJd§vÙi3Ù·ÈN™êõIœ`¦¬H4í!¬$/½Ð7˜Þ‡qf|ëí·¨”­E UDÂIpÈÐ!jè8ŒsÐs‹uÌÐáSXÓtMÛ™î\6®™í¡FÍF Ô¢¾f^ãUM¢vþ1 ëç–ÚZê‚æzÕ‚ªq@êu`‚Ö»—!¢=8q¦Œ°‰’µ/ªW‘§QÊç&<#¦^"$¾,· ¤Ç¶þÇL¨;”¬Î[4ƒkíÅ@—ç5&…ˆ¦öëßÏ‹[$àš©\½fõk¯¿Fc(×£JæGïvˆž×¾8ëøoö§¿ø2õÞ˜"Ðe÷gPG.Òp¬iÊ-ýMô—6žµ]Hà ª•Ã0 ú=¥ç–Ú\\sÆb‘FmI¦•U¡^FV‚+”ï~iÑegÞñ•Zv¨ÀÞdã«}Gì#úáFŒA3ÔVb¥Q8£M-ü˹Zè¯ú •†Ä¯ ªfÏv«}ÄÈ»1óõ!CKÉMýÄ#ɾS¹X*—zÅÏ+ÖH=·´ÍÅÊaÙ¨G^Ÿ¿hÊ-O ¼YÜbU 4PE`ŠÁ·Øî_Sº·˜ugáÁcVšû]Ý.cÌÙ›¬s¨Æ<Òž+q‹ôœ; ¹mYl*𺬄[ÞÜRçP[x–Ý{v3‚ÌœúYa-/ð2úGŠ[êµ)B{¶=ÓC‚+q ïïàÏY†4”`,5jÑ•¶ò‹óÝÇs»¥ÊQuàà–'_-« ·èm võ~ g•àIÕÅr$å°˜ðê}/Ñ^Üz½ûë4 Ìàwðk\_B/wödwvÅ-uPU¿€ uˆ·Ü }îl"ÎØøX–&Ç|õY%ê"åà}X²^ÜâL2ìÄ É úæ…+×·¹E3j1®p„6°h¡¡ÐÐ@z­qK#ºCFIýeï7{'·S,£ÇŒvÇ[_Sªé…mãˆC¬0±è5ãÀ”m ܲfÝv/‡hþeÁPxãzØðaWâ–öHÝaÐkZ¹/’E½ Dó¼iÈB/n1/sçÏeèû›o½É7–-¡…êuB– ^^­:ÅúÑï—«p‹è¢pÊ›¶nâ0qéU„ª2êb8L°ª9Óøj[Åï~}» —)cÅzq‹=¨ßSZuznEFG²%9o±ÀX½Œ›—–² °êHÏã01qÒDo5‹[Œ!ÓÇбàYöÜT,QMRiy|4£ÊãÜ ^9$;•‹]Ù4Ö#[ä«Í´3ˆÍ¥=Ò¸¶ƒXó™5ºÏ¡êZ¸EzŲïX—}媓ғp Œ!…Ðìm;¾y9¥küËÔ÷³õûEít K a6û±)·¨4#7ƒþ’†…ÁÑÜóÕ_Ño·vnáÙ$Úæ!Kˆsy>ýÂð±ÓÛuÆìœ Øznñ—§Dv¦ׯlÞº™éç¾qóF²x]P ÞßAÊe+–±—ØÏÚÉ‹5A€ÁÊã&SÎvâšÓ4! Ö f}øÈálh¡Þ¾Z¼t1‡;nÆŒ+.+VÙ)™ÿªº8á&h0Ûoñ²Å§L|wÀ»¬E­LöUž=HI^Â#¶‰÷ÇíŸ37W¯YMvÒLŸ5ÝåA! ƒ€eÒ© A¬øS»n¹C=P IDATÈÐ!´A+ÂIjÒÔI,MU)ÛR•ãòüŒœ9g&µlß¹]®dop kzAv¼°z7Ow¿ÚSç$آߔiSØrl6-±*PÝ!#ñ'JF¯ß»ý8-j5ºÝº'±váò„¸r¶"tPÛxoô^U ×…&Vßþ}YlêÍ9FŒÁg9‘0°Ìw˜8N¦L:Å‹[ *úG꣤>éÀÂ`…¨c/«šEˆ×fœ™Dž2#ê×®™MµÎ™Dêbm0Ú½ßêÍãF 11EÑrb29ˆ‚(úýÂ&r—x+ýžbñЗÉÓ&S>ËNÐ ÎÔÌn\ô‚Éš8y¢vg`7†{G cå«›zêþÀ±£nOiÕ©m¢®ñƒî-9ëÒ–¤ýøSª£v(•ªÓÍ G”C¥Zv¯ æEíÄË\äe3q,Z&1%=…2ÕÔ§É-Ì¥^FÌàkÛDåRŸgišÆõ5·(Pao®6SÆ8ëiÒvÊúay°˜Y jÁóˆáòÊÅÈ«—þXÌœu¨Võí×—í =R¹¸c(2Ð_ÆÐœp¦a^m9r©µ?ŠÄr<âT¤ß/j/pà ½Úõ}úõáŽJÃŒŒåþè)EQ&'!pÈêe@Ô+áDðiMývkç+[ÿÛíxUmvñ¶jrLcw±š~.“€Iÿˆìê}f—튔çU¿ÓxÙ GƒÕF!PÐå9›3ÇÚN& màKÇýžØ2y-\æ˜dlZõ©VÜé‹JŠÔ‡Uvõz »®â|íϼH@^ÚÉ èߺSŸläàÌ™W½]äòvÜ$»zá‚4êuv÷–™H©ÞsyðÃè¹_¬ó\è_âšý@!îZy‰û‡(]výëõô± ¸„{õQûIL¯ ²«}žŽà[•a`é;½A¥ê7'µÄjî¸C§HƒpÙ8Yö¤V#®kZKh?C5×ê0/{¡‰áp™mØ[¦Rûk?÷˶¹$ãbèô°W" òz¤î¨å¤þOýÌ&-d:ÔjTA<×ʨyQë\ýÆ)Í 1}\q¿¡¡á†ÎŽ˜˜˜˜˜·ù·lEy†7z9»v±ýßÿkûÏÿ¬îØ1»[Wk^öâÖ3Îbbbbb7Æ|[õÕE‹š_zÉÕ¦åþOT}ÿýæNògNsy~FZ¸%&&&vk›qËjÈ2ôèîz饪ŸþÔúàƒ¶‡®ú·suì˜Ûí¥ÊäøVέzìf·â&›Œ€˜Ø-o¾Ä­j—­`ÁÜÊW_uÜs忨 ¨Ýºµê¿þËqç:&Œs6éÉÄ­?ÿùÏ~ø¡æ"¿üòË÷Þ{O{ßëúì‹/¾hll¤Ì#GŽüãÿ8yòds¿&‘6;vìû´áFÙÅ‹éÅõ!äƒ>`l¯¯ÞO>ù„•v}yÅÄÄ|Å|‰[•©‰y=»Wwè@Œeé¥Ã¥¥ ååÎ7Þ¨úÉOªŸ~:¿s§Šƒq?·êëë÷íÛ§>¾w®««Û¿?Nó«o=zÇ}Y'®¿Ii \²d ×µµµ^‰5󺩮sss¼*ºz–+ݹRö˶¡©ýío[¼x±òÀ”””ŒŒŒ«4ã*Ý9tèP@@€Wk¯¥1112Ÿá–Ó^Y0gVy—.ößÿ¾ê׿&Ø:røð‘††úÝ»­¿ûý7¿©xöÙüñcÖòÅ-üZVVVMMÍgŸ}æåãˆ'Š‹‹ÓÒÒþþ÷¿À°Ã‡Ã-ȱyóæˆˆ‚ÒìÞ½[ÅL¤á¦–bAÂÃÃËÊÊ(?))Éápn-Z´ˆ¢¶nÝJÕZ–ÊÊÊ]»víØ±céÒ¥TwáÂb2ð¹gÏžM›6•——S#³5bÄ ¾GQ|ppðÊ•+cbbˆ¹súôi*¥a4€¼îÐf­FºF¥4cÕªU$ ü³gÏB¹bÅ …ÕØØX'Ƨ´´´¢¢B ÜZ¸p!hIAA…Ðå?þØl6—””¨Z`óÁƒIc·Ûƒ‚‚âââ(ŸìÉÉÉéééúÑ6™LTJ4Ã`0Ð_ÆöøÄ‰´<,,Œñgij¿~ýüüüp‚WõèèÑ£ÔHüºsçΨ¨¨øøxr©~%&&ªÃ‡˜˜˜™Ïp«2ñ€¡SG×óÏWýô§ŽW^i¨ª:ª¬ºÚÙ«7«<·ý3åÑ‘70Þ•ãûˆ¥œN§×«vƒîàÙ¡]ÃËggg¦BE ¯<¯àéÿ$¼‘àøñã³gÏ 9vìµTUU‘æJÜ"ËèÑ£Fã‘#GÀÄ"~¿¡¡àA/ªÀ ãßÕŸš)£=k×®%10 ž;ÕÕÕxùüüüS§NyÝ9s挖ÌÀ:N36nÜ~hðàÁƒUË(¡¡¡Pç+Ï t@E 5n1€´N@V EEôWµêà8áÆÐ<†‘ö4åwˆÞŸõë׳xl6œãÜðé§ŸÒ*ª ƒrîÜ9Ò-M{ôX„b&L }䔹ÃäOÄÄ|Î|ƒ[ÕÕÖÜC­¯¼âð[õáá¸o˜Õè±Ã11„\¶_þÒòÜsÙ}û8ªÊ®›[ Çßÿñw£E8_œÝ–-[ —W'qß7ÑÑÑx[Òoذ×ù•çÏ“é&$»·h< ˆ´à~‡N…½:·È¸VpÜp‹¦Ó€=Ê$ ŽXßB7£Má¸ojg"2púaëÖ­ƒX^wh‰>;ýbâ222h,¡¿ ,P=ÊÉÉ[@ Ñ*’A2ý_¶)nçÑG"$ÆØsMÇÏŸ?O¥ðŒW¯^ÍSîÓ}Ú£¸ÅxþÃc_y¸•’’Âx&$$€nrqD ÃBã׬YcµZAÑØWž R{Dùê-Q‘¨ÅbY¶lmc É«…bb>g¾Á­²}…ݺ¹ž}Öò/ÿâì×ïˆÍ†ry¬áðáÆêj×°aîGÌÍO?ýxÊð_|:¾˜zµ\ùË_ˆiH@@F¤–Ñ !Ê©S§xêu‡^kyi®šž={(n­]»Vkwèx¸¯­Lãt!¸¡S ©úVL7YD{¤¤#ÀTSi<ÊH~üñÇd¡å€YQꫯq¥]0)ŽdT§>~IÌJS©ŽGôWÿHÏ-zMgyÊqD5CLL̇¬Ås«¾Ú¾»°kWç£Výä'ÎŽ8ê…¸Ûn»íW¿úU`` þô8áÆ¤IîÏÞsOá“O–l¼Ž?Cnú¹ ŽêWÿL6ÔÑÞÔ¡„8ñœ5—kþ˹^Ï-.rrr¦M›†÷6Ó§O‡ nõêÕÚç q²úÏpœ©kõˆ  ¯ªc`Áñ ñGdd$…¨”êc ¤gÌA#T ad¡Ù€ÄëÍÐj¤ t'Èc³fÍÊÈÈ ƒëׯ×Ú£>õwôèQ¸ üôŸé€ônÁPJù;vì€=–ÍS‘Œeff’C:E|æõyBî4½ ›eeeªñ4•CF€ÿrM˜¨Îò_¸ÎšQÂ0•ðx}hSLL¬å[Kç–ÃR–7h`UÇŽ¶Ûn³Þ}w}TTãQ÷ÛZaaa¿þõ¯ûÛßâ˜Nx¬1=ÝvÿýÖ_ü¢ê±Ç²_{ÕVÒì/Û½Ž¿;&(Ñ>¯¡þ芞Òœq®w8Ü! ñúË*¨ ‚3B\¿z› 0€4zÇŠþ“ ¥ýWž7oÔ#X¥>z >§¾ Qÿ±@ÊEð ¯­ÞÚ(Ô‹³fR´ÏþyÝQÆ5á÷ÉK¿ˆN(Ÿ®iíQ/ŠrAüG úÞÑõ·h}gè£ö@­.B+j%*ÚSñ®¾4þKšË^À9šGvu¼`<Cª£³ ‘z¤J#%ã¦ × ­Ò/&&æ+ÖÒ¹U²½ CWÛ¶îO Žq´®‡¢££o¿ýö;ƒöI:~¼nÊ÷§ ï¼³ð‰¶E«–5÷]._ÿ¾Œ߀Abb"Á(ºÙmk-Ö¢¹e/7e÷yÇѵ«û+tï½÷pjª‚–pçwÞ}÷Ý”é†Ö©Sœ ÚÛ´©ú·³>úhf—ÎÖBƒpë5â¼´´4‚ΛÝ11±Vd-˜[uNã:?S—ÎÕmÚXþå_jfÎl¬­UÐ:~üxFFƽ÷Þû‡?ü¿© å¶ÆÆÃ+VX~òÛï~WüØc‹4ë÷M„[bbbb-ßZ.·¬9†>o;:w¶þìg¶‡nÈÎ>æ ¶Ž{,//ïx衇¸PÌâÔæ½÷N™LÎgŸ­ú×­zðÁœ.],)Â-111±[ÉZ*·jÅÖš:tp>ð@Õ¿ÿ{ÍôéžoˆPÐ:qâ„Åb¡} ¨¬¬¼­3gÎb§NY³¦ê¿°Ýv[у.˜[í´ ·ÄÄÄÄnk¡Ü²ó²»uu¾ð‚õ¿°?ö؃A­“'OÖÖÖªoŸ«¯¯× uÎcgìvgûö„\ÖûîË|ò‰Ê”ƒÂ-111±[ÆZ$·êœ…K–v|±úþû«~úÓÚ Ž9¢‡–úŽÔ;î¸ã®»î ÖC‹ºÞ?w®Ñßßúÿaûå/M>˜;jDµË&Ü»5¬%rË’‘œûr7÷ï•üä'ö¶m–”xAëÔ©S~~~?ûÙÏ~þóŸ¯\¹R­]QQ1Ócååå^Ðú;wîdx¸ûkŸ~þsóý÷çŽá°|÷—í ·ÄÄÄÄZ¾µ0nÕW—ÅïÏëÖÍùÌ3Uÿú¯ŽŽ7…–ú †º¯‚-=´Ô÷Ú}P__÷Æ–ÿó¬¿ùMÎ#mÌ¡ßùgÈÂ-111±–o-ˆ[Î:gEEIÖÄqæçžsü÷lÕΙs¼®îDC:yäÈÉ£GO=zº±ñô±cï;væøñ³pëäÉs'O¾êÔû§Opúô‡ï½wþÌ™ógÏþùÌ™ãëÖrYÿýßMwÞ™Õ÷»Å,Üóuk)ܪ®¯®´W2RRŸÎùüóÖŸýÌýîÔwØ{L“CéñÇõr¢¶mõªVzâ û=÷oYþ×ÿ²Þ~{òƒ”çç·ÄÄÄÄ|ÝZ ·¶J*JÒ“â¾ØÁÖ¡ƒëᇫï»Ïyï½Î{îqÞ}·[wÝå¼óNâ0·î¸Ãñûß;n¿Ý­ßýÎþÛßÚó·~ýkûÿûö_ýÊvÛmnýò—¶ÿú/þ-¿ãŽÄ'Úš YÔ"ÜóikAÜ2[ÌYÙéq æ&?Ó.çÑGs{ÌýïŸþ”óÇ?f?òHv›6Ù?œýÐCÙ=˜õàY¶™¹#¡Ù3ŠJŠˆŠ2r3Å(ìp @–¸« êƒ’‘ëíÁÛA‘¾/» n Ú:xÈ`8j‡ˆÐ ,À©Äú4[¶mѸշ_@Kuç¦Ï‹H$]E­fp ÆÍF®ã“â ¹ Ôäi“Me&7ê 2¨´Âýù 0snQÚü…óý7ûO™>eÞÂykÖ­Šd‡ˆ„>!a!^£Çކ[0¦ÂV¡ *ê*/nUÚ*ùï’åKÂ"ÃfΙɵ¡ÈÉY«­”¹zíjîx¥ÑskÐàAD„.á–H$ò ·²¿øâšÞß~ëü’Ò’ È²•ËÀ ì!vIÍL….‘Ñ‘€‡\ƒ‡.³”¹šp‹ø)6!Ôiw¶?QfàŽ@"Ðc&OœœùÖû¯'sskèàJ{¥ëkn©¼^ÜâÑÄÉs r ³&Lšà~U°¢”sòs¡!×^i¾Å­!ƒTÂ-‘HÔòÕª¹e¯µçsÏ}pîâ?/þSgŸýí3à䎷¾ýyB0°fÃâ¡£F€H†£_¾rùÂ% ž¢ã¢ÁPÜÊ7æ0iy`´Ðî~õèÙc_Ì>XسWϘ1 „ÄI³çÎ&zSÜ¢@ ?q¼Ê»#d`ÓŠ¢FP:söLèØ§_AÐ}±û,Z0oÁ¼þúsÇ+ eçeS Ü2lˆªBݹéó"‰DWQ«æ–³ÞiqXŒeFo™øñú£õ^¿¨Œ¥Æ´¬´‚âC¡Áåy¹/¿8Ÿ ¨¨‘çæjŸ€×ä¦g§óT»c«¶Á °œ¸°:Ý¿F{`!U•‘õR‹Êk¶˜KÊKô 3Wš)Ÿ¼´Gd),)äm#¤ Ú䕦´²”P »Š‚KU¨;7}^D"‘è*jÕÜBuGêŽ59~äèñ£J\£C‡®òwÇ-_%%‹—-Þ¼usàöÀEKeåÉß‹D¢[D­š[`éêºé-¼n?eädl ÚÊÅMoH$Ý(µjn‰D"‘Èç$܉D"‘/I¸%‰D"_’pK$‰D¾$á–H$‰|IÂ-‘H$ù’„["‘H$ò% ·D"‘HäKn‰D"‘È—$܉D¢Ö¡z÷w™úhðe;"܉D¢[_6—ÍXZ”SŸé ÊÊ)Ì6•Óì¦}n‰D"Ñ-.÷N@‚¬ ›Ùâ¨ð •[͆4ƒ1×Qc÷êŽpK$‰nq™+K3rS5Öœ8{ôä¹FŸÐ‰³Gj8S³“Õ¾ë%܉D¢[\ÅeÆìüŒSïk|ïéôû'R²’̳Ww„["‘Ht‹ËèáAÌÑÓõ×­†SuùËæ˜œ5‘Y~Yk#³Œ¶ªïSàwêôp+Q¸%‰D­NŠ['Î=rª®¹j8U[w¬ÆÑà¬=æŠH/\·· 0¡Ì?®|Ύ܃…¥×QàµëÔûÇS2…["‘HÔú·²ò3ŽŸ=rødMsUÓXg0îHȱÔÙÃÒ ×E­ˆ(^jš”_P¢ÒÔs¦ç&ï ßšgÊ®?^ÍÍ GIjv¢VŽ©² ¿$çÐ ×µW}òܱdá–H$µBy¸•~üLØh†Ž»ì‡íQYÆe¡9‹CÒ2KK·Æå,Þe˜½3A¨qQˆ!¡ÀD²ºFçîˆSgN^µvyHØöà°íIéê9“2âgÏŸé)§º¸"?(dKvA××Þ€“g…["‘HÔ¥¸uì½ÃàäJì•A ùkö•„eÕ¬‰*^jXº;gy¨ÁqNyCxzeb¡‰”†”ÕëV䛲‡,µGíÆ²¼õ›Ö™ ‰éq³çͨktpgÇ®@CQ&××ÞtâÌÑä̃Â-‘H$jurs+/½ñô¡ºcŽkR£#§Ì¼1Ú°<ÒT’u(º !¡¸!£üH¡µ±öعC'ÞK­€[$Þ¾kkpXPÍ›Ê ½6¬=˜ øD:IDAT‹fÍ›^Pš³ÂoiBjLm£ýZkÿZÇÏn‰D"QkÜÊÌK;rª®æ¨íµ=!gæö¿Õ«âjÖÆ»üVïH«Þ›[“h¬­ª?å8|:$©4µØDÊM[×…l©n¨R‡-~VF'DÆ§Æ 5”Gë6ùm àþµ×®ÔøÞaá–H$µF)n>QSÝ`¹F­¥r…-v¬Œ­Þ˜àØšdÍpî7T*§W0T•’24*xåÚ¥•Õ%*c™Ý¸rí²ÄŒ¸ÉÑ}û¿“YRX–»zýŠä¬xÇáÊko:zª>I¸%‰D­PnnRë9‡*®QöC%ŽÒ]ɹ‹Bó×ÇY‡æ¯ ÏÞ°/Ç?:wkœaw²!ÝTd­+'¥Á”±tå¸ä}åc¹£ø`Z̆€5Eå¹±IQÓfM¶×—Û•ǧî‡mÅ•y×ÞÔp²6)#A¸%‰D­Np+ÃZÛh·Ö™›¥2gÉþœÜ9Û’gH*È1”åç•ZŠJ¦ªÚR-Yjnªõ˦Ϟ2sî4ÿÀuY…)ÜŒMŽš³`†J`q•îÜ´-d³¥¦äÚk?tÜ%܉D¢Ö(·R\G¬•5¦kWyµÑdÍ7”f…Œ_•ŸžŸ˜U”’WšQl1”9‹Hc²æÅ§EÇ¥ì ß²=t뎰­1»øïÁŒcen¾9S+­Äš_PžÝ¬Ôs&fÄ ·D"‘¨Õ n¥ç¦8[@ѵ«Ô^`´äB©Œ‚¤Äì‰Y±)¹2 sMiEÙ¥öüòê¢ôüƒÓfOš2s‚—f/˜ž_–٬ꚪö¨=1]¸%‰D­On%ÛëËÍŽ‚f 8•ØòŠ«r–œ¢ÊlþåºÄšÇýæur5X…["‘HÔU\Vœ–“d©)1Ù >$[]9Ü*«n‰D"Q+S¹µ<%+ÑX‘WUk¶Õ—û„ªjJ JsR²’,‹Ww„["‘Ht‹ËQë(,-LÎLLÊHð!%g%—uN¯î·D"‘èÖÞ¿Ò^i®2›-¾¡²*3‘VSh¹„["‘H$ò- ·D"‘HäKn‰D"‘È—$܉D"‘/I¸%‰D"_ÒÎ-Ê¥ô®bbbbbb7΄[bbbbb¾d7Œ[çÏŸ?tèÙlNKK‹ŒŒÜ¼yóâÅ‹'L˜Ð_LLLLLìÆd/PÖ@¸}`P³¹õÑG566Z­Ö¼¼¼„„„ÐÐPŠž,&&&&&vã ²À(k Ü>0¨ÙÜúä“ONž0¨ÙÜúì³ÏΟ?ô:DA0ð---퀘˜˜˜˜Ø3È_  ¬8púÀ fsëóÏ?'L{ÿý÷)ú¸Y­VÊ-»qYà ”5î@Ôln}ùå—àŽÌp²!¡KLLLLLìÆd/PÖ@¸}`P³¹uñâE²A<ò_¸p‚>úè#J|_LLLLLìÆd/PÖ@¸}`P³¹%&&&&&ÖÂM¸%&&&&æK&Üó%n‰‰‰‰‰ù’ ·ÄÄÄÄÄ|É„[bbbbb¾dÂ-11111_2á–˜˜˜˜˜/™pKLLLLÌ—L¸%&&&&æK&Üó%n‰‰‰‰‰ù’ý1.ÊÏ IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/settings-ic.png0000644042355400116100000006151011675570700020321 00000000000000‰PNG  IHDRÓ±‰5¦ IDATxœì½wp]Ç•ð9_MíŸkêÛÚªývkwê«Ú±Çöx‚í‘Æ–-[bP°$[9'Š9çˆ È9çœãCÎ9çœAäDäD‚ )îhñú (PÅ>uê±_ßÓ§OwßÛçwï{àû»ÛR¤H‘"EŠ)ß—üÝF EŠ)R¤HyŠD’‡)R¤H‘"åûIR¤H‘"EŠ”ïOþ†>>vvv†R¤H‘"EŠ)w6€àhf€à(âÉcjjª»»»¦¦&;;–ÁiS{“T©R¥J•*UªÐã+¢§§gcc'@ 0ä?@LíííÀKRRR`` D³á#”*UªT©R¥nýtEŽ9|À ÐÌ9ÀPēǕ+Wšššòòò¢¢¢\]] 7|„R¥J•*UªÔÍ£/¯ðqüøq8Z€ øŠä!UªT©R¥J]O•ä!UªT©R¥JýþtÈ£¦±¦º¡Zê&T–fÃÏH©R¥J•úÃÖï›&9#ùÛ êšë²ò²Ç÷E𜙛)<7¶.‡‘–•öˆ>«ªS2R"c#£â¢pNê¡¡µ!¯(¯¼ºüšD«¢3r2”ºϕT©R¥nfÝHòhoo ÈÍÍñó÷337ÓÕÕÑÐÐÐÔÔÐÑÑ622rusMLL,--  êèìx,ÉVŠšÜyÔ5ÕmÛ¾mç®ßf@*}ó­7Ó²• îíbxù•—=ü( K uôuÎ/‘_ýòõ7^·w¶PøÈ)ÌùàÃüƒýï¿IEmÅ_øãÉ3'•Âcº¶¥J•*usꆑÇÍ›7‹‹‹|ý|¬¬¬455µ´´tuuõõõ/^¼H+ã±´´  ÌÍ˹qãÆ]’åÍ›ÓÓÓKKK÷èÂÂÂÒŠÜû§ðnݺ5111vGæææîó³žëׯßçìmN¹ò`ù¶mÛöÕ®¯(W—V•VÕW••T”pˆ¶V¶V?ýéOC"BʪËD(,…熖R>I·¤²¤¸¼˜LߨÖXYWI‡x­¨¬¨© !~hH+<ÿüç?ÇsyMyCkÉ>6!V‰JxSšÓ)½Ô4Ô”V–•á ‡«bamñë_ÿúÃ?ij‰™É‹/¾|$¤&|㡾šxP,E ýÒž—ëW ø ýÙÏfmgM%6DKÌ•µ•¢Ó¦•Ç3b Ê 0ö?üñ'OŸT ÂU]•0ct¼Å¸ ´`y¢*JpþÏc¤J•*usꆑI:((ÀËËS[[æ8@ SSSsss «;âââ’’’ 7¬í»££X¡»û 400°¡¡áòåËEEE÷0;Ž9b``@HfkkK“û¶¶¶{{Þäò@äA"|ë·HÛ§ÏÞ¶}9ÛÎÁ.)-é¿~ó_ÿôOÿôË_ýR< ejhklݶõ½÷ßóö÷Æyfnæóx~ÿýo¾õ&­"c#3r2Nœ:ñÒË/½ú§W/h] ÑÒ0-+mï¾½[¶nùô³OCS3SϧϞ)èBÓJ"7·2ÇÛö—¶Ÿ=6§ ‡Jgwçßþö·ºúºo¿óö–-[öÜŸ™—©>¼¢¼wÞ}'¹Œ¥¦±ÆÛÏÛÌÂLNˆä•W_yíõ×L-Lé‚J‚¤FGO‡W®=½ÜÂ\b&ªÿ÷ç½wpràÐÂ`ìtzîÂ9¦+Z½wÿ^&íƒ?ð 𡯻’œDñbÌD¥d¤üæ·¿9xøà~ã­·ßR%©6|³*UªÔuÑ #ùùyk+{===###˜ƒ/~9×ÉÉÉÑÑÑyEÜÝÝÓÒÒ\]gggWgÊ›7cbb®]»FÍÀÀ@EE…8ZUU544$*ããã“““颦¦†·ÕÕÕÔ@~~~hh(¸ þ@ell ìXþÛš¯¿Æ-m 8‰·---‘‘‘%%%`Pwww]] šã¤µµUxOHH˜&''y»´´T\\LCšóí`òóó£kœlž/Ï>yˆÂ¿ýÛ¿}öÅg§Îœ‚-þøÂcbɲ?ùÉOH¢dÙÆ¶Fw/wêÉÄ}òÑŸ^ûSJf Hñ¯ÿú¯Ïþ׳Têèë$¦&^м@>~òøŽ;žyæ¿ ¿ê†j-]­ßýîw‡úó_þ =`†çŸþô§x À€ÞIó ­ N®N¿}î·Ÿ|úÉž}{p‹AyM¹­ƒíüc¢"¶/v|ñ«_ýJÿ¢¾ú@@òº®®òHCQšÃ4ø¤Ç?ùøÙgŸupv #Þþìg?ƒWΜ?CTÏ<û ‘hëiÿó?ÿó®=»ìì™:ú6 ŠÀ€ª÷?xëÖ­ –ᤵ–þ>‚<Ž8VT^TÛX[×\Ÿïìælhbøîûïþôg?%a”¼Ož9‰  ©i¬Áó¿üË¿Ï y¼ò—7ÿšäç/ny‘&aØØÛTÕW%§'ÿá õPùË_ýÒÄÔdíxi"8x ¿8?!9á?¿ñÅ—_ÐÎ÷ûßôQŒ—¯|ðóŸÿÜÃÛC´…<ž{î¹ð¨pì_ |cfiVV]æéãùÜïžÓÕ×]K5 5ûìûå/ùÊ+¯üþ÷¿ÿõ¯,Èã̹3%•% _|#UªT©?ÝHòpvv$à öööÈÄ>>>â±eñ˹%%%NÎŽ«Èär Ì]TTDâ¿qãÆZòhmmå6¦©©©DBsss+_7)Ï«È}}}ÈL gh„MLLÐm¯^½XQQQPP <ÿÂÂñÀ7p‘˜˜˜ŸŸŸœœŒ2^FÇDMOO?,¬«<y’Å÷@ßGZRÓÊ_£¼ûÞ»Ï<ó ÷ñúñgŸFJäaicÙØºüÅ ª½“=·û/¿òòŸ^ûÓO~òg‡¬ü,XÁÄìo°àòXñ¬)ù­·ß"ß—×”ÓžÞ>óŸÀä±ø"He]å2I: >ŒÜŒ-[·ïi(jòŠòhȸà§gŸ}ÖÀȇ%ì7ßz“Ž–?4Ù¾Mü‹*I%€c-yXYU™3ÚØÖ˜š•úüóÏ‹/–®""„á`”>Zž¨Ï¿ø<&>F‡£‹ãªo¨H•*Uê“®LÐÜ R©BCCÉßîîînnnžžž‘‘‘ééé™™™¤vÈÃeͧ-¤vò÷… €333 ¡¡!…<ðïëë gÔÕÕ‘ãIÿ@€B“““VVVâC–ÒÒRà@ñümäA„x -(C:::ÖÖÖº¸¸ŒŒŒr"±µµŸªÜ^ù¾*áyyy¯6Tvww¶µµuVVÖ]¿9»!òä!¾jÚ´’by¸y¹‘‰#b"HÕ¸:vâ< s\4ºH¾ämˆ†˜Á%/½ü MÍMi 4•‘}q xùzšrßÁ/~ñ áYý™Ç¡#‡¶oßîè ¼ÿÁûoüùÜÂ\A«¨¤´ªôàáƒÿõ›ÿ²°¶ÈÊËJNOÞµg×'Ÿ~B998ùð£ã“ã}| º€B âÖ«Gbj"QÙ9Ú‰/·BÛ_ÚN¢—ˆß?ÿûÓgO§ç¤›?÷»çÌ,ÍîòÌ£±†`Þ~çí¸Ä8š0^bäáîå¾á{„T©R¥®¯ny¹cb¢míl¬¬-­­-]]]ÂÂBcccbbb‚‚ƒ/]215»dmc‰åââ¢zG$o 0˜¨®®Yà€òòr2:ÉL,8ÔÞÞ~õêUÓÒÒRÈcnnŽzx‚ÄßDDD(žÕɃWà$êyÐuHHâO]†£}}}â[#â³NMMÕ××ëêêR~thXYòøõþúõ7^7ëÞ~Þ¤^’7úñ'çç òppv Éèç.œûíoûÚë¯mÛ¾í™gžÑ3Ð+¯)'C?ûì³/¿ò2ÍwìÜQTV„ç_ýúWxA˜  Rõ–­[^Üò")ÿ¹çž³°²¨m¬ýNò aDtþæ·¿YþÆè+/ÿæ7¿9uæTYuYMC©…éï~ÿ;¾ðâ xÆû»’Ãyþùç @ßP_|ÏC±A¦ýöøÇ!`åÜõ{nžnL=â *,-ä¡OOê«ê«(rvs/ñ?¤ÑÅç_|N¾GH•*UêúêF’ÇäädXx(ä |„„„øûû{yyyxxØÛ/ÿÙ‹–¶–——gww·òùÅíò¨ªªRÿ;[Ž‚ÓÓÓ¤ö°°°üü|¸dttôöÊ_É øÈÉÉ¡fxxX|ŸT<Æ€!êëëÕ±æêÕ«|Gð#·ˆçØgffâSÏÌÌ(300 <§¦¦â\|B£TTT@¥¥¥Â8!ζ¶6õ®7VñO¿ÿ¯#|?_\xܽ|£ßð*UêR7’<…ÌÌ ++ ???P{G[[[333###}}}mmm­ˆÈp’úæÉÐ?T‘¿Û"UªT©R¿ÝHò¸qãF|¼ÊÜÂÌÔô’™™©‘‘¡ž¸¡¥¥¥©¡qÁÈØ000 ¹¹ù‰þ¿AŸ‘ä!UªT©R¿ÝHò¸½ccceåeQÑQ^Þž®®.ÎÎNÎ.Nž¡¡¡%%Å«¾[*å1‰$©R¥J•ú=è“Çí•ïO,--ÍÏÏOLL öööBø™½~ýúæù/>ðò¤“G}s}U}Ue]¥T©R¥JÝ@e+®kª»Ç7Õ6€<‚¢ü»ú[Ú{F»»ÚDá2…ž†þ‘Ëjë©§pùΡî•C^èlèñ0ðÙ«éúùÂgúÖ‰6ÿs‚îïýtþ`íú%5ŠÍi‡÷½ åþÅCô½÷ÙgµE]Ošþ>òô?6kÿ?]ºÿoÃùÿ;úä?ž2ùý*©U­ÃÏx…º=‰äÁÉS3>9~kù‡þ¤J•*UêëüÂ|Naη%” gÓ #{-¶¨«¹Ö/ê5þ¯>‹wýugÿg³îÿ²¾ð¯«lžݺ½k{}é`÷„’GVAÖôÌôÍ[7¥J•*Uê†ëµÅkÙ…Ùêÿ­â“‡[ƒ¡ßþ=f[ÔÕéìOÚÎÿŸíÿ«Yç‹öýC¯É?¹žùñ*›ûUó­{̶>dÛÇáçÁtëJ¿ßs§Ëªï½ç ý´EÇÔôÔ›7¤J•*Uê†ëÕkW³ 6yØûZœwþx·éu½¤ù¯Õgÿgí±ÿ½dß?Ôÿ?tþÑü¿®²Q×½fÛNÚ¿½gM=5:;ö›¿t¶÷£{L· ?8¤£½f[Ô·}ó¬Ó4?`ñò}¶:`ñŠ¶Ç—kǵJY¾zÄúõ}æÛOؽõˆ#UÔ*ä´WÈ“úi ä19=¹tcIªT©­‹×¹UÝð06\™„ëK×7<Œ'Z7y¸;ùÜeòâ.“-w^·2|ÞûÌË/þg¯ñ?ÕþÒïô>Çà.zÊþÝüÚ¤=¦ÛÔü,v_ÚJý »w”š5…ï£fË^ÓmÂÏžK[}“,ZüéÛ"¹«†‰ß¡è\Ïô²ˆ„¢@•Ñ~óWî§áY§rªãh~o3›°ó~É–+ƪ{ÌÒƒèm÷ÎþëùiKc[c@p€«‡«Ðˆ{|ÕY]+k+ãã‚<Ø,¾M;»:».wÝÃàþµ¢²brjrm ]ôöö®2ž›Ÿ«®©æ"Tjæ櫪«›ãá‘áܼܱñ±Um[ÛZcbcÍÌÊâ=tdt¤®¾îAGtÿ­NiY)ùéþ757 <Ä<ÓWYy™èkrr²¼¢<-=­¦¶FLþÐðPl\¬29É)ɳs³¢!ݵ´¶(½›M{G»(ÓçFNnNEÅê•eZD+ êk‘_ÿp'a¢,º2œõ õÍ-Í”ûûûãTq£WF•&ÔÄÆ.”zΓñ‰qQOTµuµÌ +"ì§g¦™%¥!g çžúäcVYY¹puam`¸â(óF·Ý=ÝÊü¨;äœÌÊÎÊËÏëëï˜RRZrW‡¨ÌÉ*Ï\5bì ³ªª zgÒ˜B"0õ«LYÙžž¢Å€Ës­Á·é]¯Ç»FÈ+­:m¤¢¬Ýæ"×@¯};_DwoÙe¼u·ñ¶ÝÆ[n÷²×l 7ñµ:sÔð¥Ý+õÝi¼E«ë)û÷J3ö\Úî—dé©—ï_è¯ç±Û*äÌðxoN•Ê&ôÜ~³WìÂ5"²\MŽí3}y· aiv!$Ýñ´Ãš®_„¤;ÅPyÜöm"9iûn@Š­_’GíÂ5…ËàÓÞ ¦Ìÿ´Ûd›¾×žÐ 'ô¼ó§ØÛ‡k:GëEf»§”„b¶çÒ6%ÞDÈH‰o°~˜f˜¶œi—;O>¥4$ª}ûö9»:§8]CÂB>ýìSú%TålG/^„Z"£"=½<‰¼¹µ¹¦®F}9)œÝ=Ü]\]LMM{ûz‰„ȯŒ_¡ÉòÒ¯ _¬µú5¥L”b³¶F9ÓÄù35=uèÐ!¥ ¥­Ÿ‰ÓÕÊÊ Î+===kkkN‰¨˜(ê•ù±wvqvuse­¹.à0¸ˆþÞÕyq2‹kœUÓÔÒ䚥þ›C ËAª_”E„œŠÆ…ÿ× áÎù¼ìj¥­úiðÃÐÞþÞË=—Õg›Qss£Ôl:ò°÷±8cÿÑN£wmÙoü†©£–½»ù²º™‡tuuùú{Ù»YˆÊKŽš{ ÿ„åŠý_õ¤í{% {L^ªï,Ë®T™œôŽ7NÚ¾_×Qjpâ¸Í;†Þ"õŒ|9GéSÞc²½¶½˜äMù”Ýa®Ž:–Ág2Ê£=Ud÷?yªLlB/¸Åyª.a üœ°}¯´1óˆå_ ¼ö{Å›zp‹1 MwÚgúJbaPM{‘m˜¦m˜FYSÖa‹7”ð<âŒ#uw›l§¼ËhëQ«·Y¼qÐü5¸å..ù‹Èr3ñ;zÖñãþÑ®È,wÊñþIÖ¦þÇ«Û uÜwi¹îèh¢/}Ͻç?ñI´¼äwÔ&ä<ñŸ²{ß.L30ÅŽæ+ä±ÕØ÷°c„®‘ÏaF Õí½ôrcWEX† Ñ0mÕÔ}‹n±<í¹®Ÿ¶°Ö_~õee]¥@”Ì”»w¦g§ ¡‘¡§Ïž¾h|1#'#='Ýè’‘x—XÚZ†G‡ëèé4­üŒ­ÞE½SgO…E…Ñ —ã'Û9Ú•­%åD»¢C#Cþþç/œ'Ùxz{²3’WØvG®Œ“Ø+I<ìJìE%ElI'NœÐÑÕaçUË+®ØÜ9ÌîÆFëêîš™›IHL0¸h`aiÁnÞÒÖŸ/n­‚C‚?\~…¤‡åmn%‘$ŠK‹Ù¾¹…¥†ØôÙñÉ©ã“ãJCE«k«‰P”Ù3²2Hì¤äKâgãÃ¶Ž¶Ÿ¿ •›°<8±‘ÆÈ̃©™é¡Ã‡D ‘À4ÌÃ… €žÉéIZÑååîË>~>4.8:; °³`ogo—Ð#ù†Ì%“À!ÃÔÕÕŒŽd»Á’[Ï#G0]$o¢RâgêÒ2ÒCSSÓä’ aà­§¯‡0ÈdúúL2½¬øÐðÐÑcG1KLJ$OÓ sÎ<“HxÍÉÍa!V5! ,Šz=N˜a•H!†~ÅQüçäÏÌÎ?8 ˜F¥!ØÁ!õ‚¢LƬæÉS'97RÓR™‚¢….pM"1]öööÐaM™[646,šãd •*ñpHýTIé…‰[’A‡â’b*™Fæ¤o U++/cë'‘#Q}ñÅœW01o»{ºéâ½÷Þ€XJÎqFríp¦¤¥|üñÇo¼ñ†¶¶v|b|tL´úx™s΄ºúºé™éñ‰q®…¸ø8&mÇŽþþœœr9y9 ŸHXè'O*×trîü9º¦Fج­Cã2á|HJIâB7¹N™%---zǒ馥µª¨©­!x& ‚Ì›{®, ˜s ¸œÓ3Ó}ý|¹ñ™˜œ¨«§K_\\œöÖ6ÖŽgÏ=pàãÊÌÊ|qË‹Œ‹kŠC\MLËl3R M 桯¿ODˆgcr8µ¸6 @=qm²!p®u£7 IDAT•1ÖžÞO®²ŒˆÍ„‹ZœÞŒ]Ž)-)+ùë²0¿¹ÈÃ-ÈÑÐëàW·ì7zÃÆÝ°¡±~` hh¨··'5-òˆîééìëë«o¨³õ0Áû¯.¾¨èI›ò0Þ^Ù’gx†ì~ÊöQSÒyÜú†[Â3]IÏn1F¾‰VQY»·—7åè¹ïázÀìµóŽŸDx†+pRNån£íÍn£mÂ(±øK`нeÐÙeŒ°|3¥8ì ÙëñTî5yyñK¥YØ(á…gº™œ¢—¿ù}º8hþ:‘8„kC!gí?®ë(9çø)–öáZ´¢¦°6…·*šsé‹28â—dMTû/½“ã­åò•m¨F`²­0Æ[T¶g@²-#…]ÂÒ]©²%_ËeǪÎëüi‹:yø8rìHRzRNaާgv~vBj‚‡·Gfn¦®n´*U’ÊÄÌ$*.êàნ²ÖvÖPH\bÀÁ[lüƒýóŠó"b"üý”'ßÇä—„Pö#r*ÛAaQáþû¹}áF“#v®ýû÷WUW‘'ÄStî ¹fÚ;ÛÙ¤.]º¤x`·úàÃÂ#ÂI¨ï¾÷.mÙëIêÜè\Ùõpâããƒç   .!jèàzckVü°¯‘ÜÜÜ0à-Û=‰“œ*ȃ£ls¤Ö¶V›òÊòå§‹£Ü¨-cÁJ¹©¹‰k¸!3©âU ¹¨¸(44´¹¥9::šûT˜æí·ßÎÈÌ Í°]ÂFÔ¼þÆëô-‰ð‚-ž´Ç6͆KHØÐCfïÎ/ÌÇØ¢ ƒõóócìEEE{÷îeW<|ø0Û7×8‘Ó @wŒúô™ÓLfm]-ûõèØ¨?Û4sHùË_Èñ„A–¢m[{Ý Á(V¥/ȃ5"w.§œ•™Y~î23½¼©åd/ç‰è(¡x&,ÃSÏeºJÔ]µw´“ç—xh$l¨GéBÜj³F̃)¡@xDt³°°PºËÍÍ%g“œ¨çä8Ïœ9CHôKVÆCcà¼íéí¡9SÄ F΃舡1¨¦–&27óÌRòªÄC§$o%æGb—'B….X ììlæAœcøaQHxËäqç‚ÿ8Û9=""#8 9p{öì­H¢ l¸qŒ¨)-+e­ÿÊÏYx©Ï!£#ssJˆ>ÒüÃ?„JIüœ™À%qÕïÁ e’Ð×g½Þÿ}ÆËy«JPa³¶†V¬W" rÙr6,"L}ëÛtäáè ç¾wïÅ׬Ü.6”eögÚt×äÒ°¤´òèè舎‰,*.éîîD€+Wƒ½†¯ïÐQÑãVï×gì2\挓Öﯪ9fùÎW[rªâ#3=ü“lým¬ƒÎï2\ «w1Þm¸Ý&D#*ÛË'Þ2½,*<Ãí˜åÛY±Øÿ».n~DáùŸÉè—|ï0xqŸÉ«…ui‡Ìþ¬Ê 0ó?Eb£„ç—hmx–(ózÌêòH/¢kjÂt‚SÎØ}„+šcf¢QSP›‚Áò¡ÚÔ·rÈÜÿ”O¼•¼M.Ós߇q@’­0• j’#2ÜÄH-Îì6z©¬1ûˆÅ›ê3öªí²ËÅ?mQ'ôèñ£GXTØî½»O9uúìé]»weäd"ƦÆ%%V¶V^~^©™©GMc öÅÅJsl¸ÔO=uòôÉCGÕ5Õý•<ò³Æ&ÇÄÓQñÌ–¶0Ww×wÞy6 à–””sþÂy6Y¶-¶,Ù>*«+Ù+¹Ñ×ÐÐP<$ȵ½ý½\W»÷ìÆ5ìJlÊ9#&.†ý‹m Ÿ;wí¤†.¸ÝW<(Š ;»èèa×f³Æ˜ÞÙûbU±lvܶr/ÎF¶ª9áqW*Êø9qâ÷j áØ±c„Ç HZâ/Ê-&7šÂ‰è‚šÓ§O3 ¥†íÕÜœœ’]Ø5°¡ xˆý—b¼åæç;¦–¶½`Il€ËÀàÀ¡ÃËO˜ñ f’ÝGO_1’Õ¸Ŭ»·[=~nû2]p³‘üµ¦¸îÁÕÚJ_GO³ÙÐÕ—׬œ¬¯¾úŠûQ¡d–FpÈÂÒBÝ2`8ê}aCïêÝq4:6:-#MÝ ° ‰R¸dz‰[:¥»øÄxÌ@Ÿªš*ŽB`'Ož$9éèèÀX /Ƥ"++nµµ­ =~óùÝÂ6,‹^QUA¦ïìç.\‰‡N%ÁLµ±‰1ÓÎÒ0Û*ëNmëh# ¥!§× Écð(08i§îœ¡Ø¡¨‰Œ^þ´…zQ`Œ@8gÈ,ñò‡ejËѽûöB“¼mhj a ŸÕµÕQ 打'xËe^ßX¯ØÜµ†UæÔ% ^™.q¹‰F(õÜQ0á ]ÿ@?WS!Ž4Æ%©ØâœÕê«)¦‹é…º(pK .®}P˜£Ê5N=W46œ´¥åËEåùóç†(³|Ö6Ö«Œ™[õk“9ñôçrP"ü)›ƒ›‡Û©Ó§òñǹÓS.@eE6yØy[œ²þHßêTm]uy¨yñùg«\ŽŒ µw´EÅDDÅD†…‡´·· òhooohh¨©­¾hsöK½¿Ô{Aè1Ëw‹ë2vl/©Ïã×8ŠñŠŸD4· Ö¼ä{bçÅíTÕ¥c—ëoâs oÂ36JxFÞGñ†sì[¾‘áqÑóÐ!Ó¿ø'Ú1k·áË^qæIv§l>*¨IùRo Ml‚5ÂÒ]©É¯NÞuqûiÛ•CšÎ;"ô÷½J§e±:®{0Æ•hNï”5¿üJ+1 ».¾TÚ­Ï}è‹f¾§<ƒ×§-M+ߨ’Ó“‚`ˆÄÔDÊ@f9…9‡öö÷>~òxnanZVš c'Ž•U—)uôu<|<’Ò’h˜™›©þåÈãÊĕمYñ¡{]C7FAl»ìŒìV~~ì¼S³S Í Q1QÚÚÚ¤™É™IvSsÓ”´ñU4GÙòöØ?:>* $ dzá>†í2<2ÓsÓìãl@ÔÐ5Šumïj·w°/(*à•-‰W7WÂ`ÃúrÇ—(]|öÙgûöïãNqf~F½mye9)_”CÂBÜ=ÝIW•5•µ µÓ Š”Àî& èÂÀÐ@x  âY®¹ø754'÷3vØËÁɱc³LCäKo™Ù™ä9j´t´ú‡ú™7¢ÅOï@/‰Š~)'¥$ÚÜÖŒv"î8­m­M.™ (ñ“E’S“é‚[y†Rãäâ„ç»ÎJ_GŽ!1ØÚÛ²û‹¶Ì?÷rï匬 Òð]®:ÄÂqÆ,­²a-DÏŒˆtM_VŸ€#;7[½ („$åÎîNN]ÆÇL2Ïp$X Ç,³K~.çXÇå,I„dDV!ЖÔH†®­¯™R’™è«¨´Hé(!)uaž«ëª¡™ñ©q"ä¶›9$ xÚÔÚñ†?™€3aEXw®â¤ÐÑ3Ð] Ž rÖ›¢†[yæŠzNoˆs€3óð‘Ã- ßÓÛsdlDÌ}±(tÁÐè¸èΞ;Ë$‡›˜š§+™‰[lèH±Y[òrÓÌÕÊ0¹Z¹ ÄuG`ÊmÁmxtøî½»A¸ÁÕÃuùÿö¯,‰Oޝi¨! Œ víÙ¥k KY§¬¥eFnFaYaBJxáãï‘ääÀ«ÈƒSŸmE(û,éŠ}6¯ ïÃ>,¯*'p‡Ä¥ÂÍ7{›9•m”]”ƒ¥…•7ñŠ6ÓåïÊðÚ›)Û%»kOIú­·ß¢†.¸ST<¨+¹]ÛÌ ¾YNù³S\±aaª•‹› ©TÝ7ØG )é)Â@Qöwr’(ç摨°ï¼ÜYR^‘AqB[…q1^Ř.ˆgmMkG«?ÔÝ×m|ɘø… Cc¯¬©¯a¤Ì A a3cmml¯ºúºÝ½Ý¤.2Ásϲ/“*ˆ¹¢ºª£ùÎ];[Ú[”ø¹;ä®.Ⱦê5ìΠ!Hlí¤Ñ9œtÂj’°8ùŒ ë,'õ;WéªCt ¶WÙàS”fjF*I‚T´Ê9›ùQ/(JÒ…ÿìí·ßó@_ÅJG¬¯ª¢,7g 3Ï™S\VÌ}'9æ„¡ØpEpÆ!ËJŠeAY/QÃRŽÀ\ 8¡†N9=ÀAÌBÃC¹£åLà ™±¦,“À  ‚dñ¸`@w5u5 „L|î¹åÏìz.Û9ØÏZ›µ5 A2itÍJÁt­Ø]F“üxH,tbgoG –¢“ÌI¢ØÓÖÕÝ5*:Šóœ³Lá eââ¸jh¼jðÌõ«~Õkëh—V”²^Ê!Ê\¼PGÁ2€R16ϵɕØÕÓŵ‰Û{l?e’¹`°w=º¹ÈÃ5ÀQÏeÿE« åe+RRRR\\\TTTPPŸŸO󜜜ìììÌÌÌŒŒŒ´´´ÂÂ#k­Ïµ^ø\ëBwé¿lèqô í<ŽîÒ{I½æŒõ§ö!ºš;wènÕqÞk¬{Ñý0GÕ)7Ô°ô?Íû8ßoôo/yŸÜgø:o…Ñê+Ýí_h½pÖös»`mSŸSXb å¸û𥷅7a£„ÇÑݯ軴 Ò‚0„Ct¯ákø§·´Úcð*±‰q3ʺÛt]ö9†éŸ°ø@9Äë1¢ а ¸pÔìÝ•·ï³ý\iþ•î6¦”‘¸Ü©÷Ò—Ú[Œ<ým<ß­ìv¬/ypν÷þ{0ÄÑãG9v…Ὼ¡ò`{:}ö´£‹cU]ÆÉÉŸ~þ)„A9='ý؉c€o5u41sóZ~S\^lne~æÜ™³çφ®"nÖÙÙYPvdîº.h\`?ýàƒئÅ36GgG’(1ÜÀÈn¢©¥©¡¥qúÌi ¢9ÊuøèaHem\ÂM*û/ Y^Þ}ï]jÄ-I‘¬¬øQ”¬Ì}Û·xËžH<ÜšS¯ØˆtÂe¬Þ]ÌÈÄH”IdkÒŒŽž lhdˆyzyr7FVàÆ”¯/o»1QkkØ+“R“HÆzúzÎ.ÎÜ‹ r}]2»D½¹¥9¸&j˜Izd~ô/êÓÝÑcG™7r½ƒ=#204€ Ø—ããiÈZ{½?YSCS¯aÃ"ÃX ü³k/¯ZmYViH_ä-b$D„ÚºÚ„%P™–¹üý2·PC#CînEC)}¡¤(ÖŽQŸUlœDN}û·=²ÊJ§ŒŽÂ%ÓK{öîQºcÞX¦cÇAæ˜&¹uuseZÈî5X¦]»w¼-«(ûäÓO lN¡åeµ¥W%ª”xèļë!E™¸ø8fƒ¥ÇžSŽEÁ!a(6àˆ¶ûjçW,RéË%À½>‰|ÉùÀ­<Ä€2á^«:%*+k+– Nå\bqÒœ£ÕµÕÌ3…ij/_S\§pË·Êfm Åê³jL4\XR¸|¹Ý±Ê­BBR‚±‰1,jà7w7ìÁ °ƒ«~UÀ à Zb¶±³W˜î‹QpÒ0ž¹~Õ¯z__¶q"!W74437+)+QŒ… ³ñ͵©»|mrTlk·‚§DÙ³ ²6yØyY7ÿÐÀò<Œ¡àEjjjrrrbbb|||\\\LL """BCCƒƒƒcb£/Z\øLó…Ï4þ(õñè —¼ÖùÓ4#'#9=Y(p 8¯¨­ÈÈÍÈÌͬª¯Rè!·(Wp’ä—ä‹'%99YyYÊRRQ’žžS˜£~B ò`;»2y…}eCléha§hhi¨m¬íîïìîììéá•»s”Mmtb´g ‡»¥Šš ìɦ¢9Š%wó¼®-àF°éîï¦mÝòƒ»jè‚=¾šÚþêGÝakg+¯âmûåvì±Tj–Sì•!jH!ê qØÜÞ,ÊÜÕÛ%¼÷öòmëj#~¶c\1(Ř.ˆgm M¨øðÃlˆ·Âfpt129ÌÆòÇF˜@¦±´²4 8€[X&špTÌp}s=­¨a«e* õa¢¼e¢è‚ô¬^C“Ë}—‰igàÔ³ŠXDœ‹1ö õ-¶²LË ½bÌ=«¢eUeÂÉZ?Ô3 õ„ ó&Ê{­ÔÐØP€ó£Þ)¨oظӅ•¢w±ˆtš•›…¦HtÊL~㤼˜A)ÁjJ<Øs+×CŠÒ9¯±µ‘Åâ•ÉË'ÂøÆf|”I#B”¥Á^©¡k&“`˜ÏÚ†Zb¦’Ó˜·,JGwg˪NiÈÚ-šÐXËX–Ç»âæ¥-—• ó#Î"1ó«lÖÖˆåf œQœt¤n#”zN˜åKæN%½ÃÍ Ê­Zb1ÿ\e\,(g¾0 £ #æ„Þ ÏâŠV®qæœø©W}³ÊÍ åÕåœ ê‚°Q®M®,qmŠ aíVð”(ð±¹ÈÃ5ÀQÇéÀyãƒa‘!ñ ªøx• ØPÅÆÂ±ÑÑ Gtd$ÔâåãqÞèЧç_øäü¥>&=kõ¥“ïû»-ùYl¬b“•º^ XÛZs×èíëÍenAô=+·ÅæVæ¤Ò‡kžW˜Ç¼¥e¦Ýhf×î]ðʆ]ªÔGQàƒmys‘‡¶Ã¾//¼´OóýƒŸ8÷ÉÞÓí>ñÁÎcïuäýGÞC)ðv÷É÷ýøà…O÷œ{÷‹ó/}rîŸûÃÇß¼~Ï…¾>éäÁm÷|Ü|H]/íî¯i¨‰Œ‰ -,)ä톇ô=+À½ìÃ5‡ÕT‰ªžþžûoR]_íåë%n£¥J}rutlts‘‡­§ÅQ“öè½¾Có¥ZÚ­óT±CãÕš¯}vvûç_ùJc¹°ã«»´^ÿâ²Í½7vh½´Kç‘ ;u^}„ÂË[øJû•G/|uÏ‚•¯–gë“K}C}}Ã}˯R¥J•*uCuøÊðæ"°¸ÌRUQMF|npÖýŠk3½QûÐ…„¼G/”Ôe=t!µ(êÑ Iùa÷(¤E»º<¡ä‘S˜ÓÑÓÑ=Ð-UªT©R7\{z² ²¿-¡ly¨RT_ýõý¸–ò}ÊÍ[7££ŸDòhlk,©,)®(îêí•*UªT©¤#ƒÝýÝeUe…å…«~cK’‡”Õòä’GÓÊ_ðB9…9P¶T©R¥JÝ@e+.,+¿ºIɃòüüüÒÒÒ:'R)(O4y4Ýù[N0©R¥J•ººöÅ7yܺu«¦¶&)9itt”òýgÊÅÅÅk+BáæÍ›ÂÕ7î§íC€žï\_‘ÂØØØwÚ3W"ÚÇ gëNmõ­õR¥J•*õéTåÿ{܌䑛›säè!kk˂‚ñññûù,frròÔ©S:::zzzæææ™™™ðGcccddäw¶¥G‡éééûž"áááÍÍÍßLRR’££czzúÕ«WïÇ!aØÚÚÎÍÍÝÛŒ)uqq{ðÿÆ"ëNñ©ña±aQ QR¥J•*õiÓИФ̤MJ”óóóüüêêk]½}¼JËJîÝëØØÌAŽ¿víÚÀÀ€§§gWWWee¥··7GÁ—ÂÂÂÔÔÔŠŠŠ‰‰‰†††ëׯ‹†joo×ÕÕmiiÉÏÏÇ@€Âüü>q¥ ·¤´È?À¯¹¥yé[¾Üy\¸p{}ñÀ 22’A x||œHÈÄ05%%%äu8GGGr9maœ_¾|™8‰ajjŠ&ƒƒƒ€ˆžž àååÕÓÓ³¸¸È! ˜8(,,TG¢ŠŠ G|ÑDbÀžæˆÐßߟ&gÏžÍÏϧ@=0AAÀm544À DèææF°NvvvFFÆ*òÈÍÍMOOÇ ½v횃ƒ,…Á#þÅÐã ‘+#7¥H‘"EÊÓ'ýƒý›š<ª««bb£‡Gû{®Œ6·4e-çÜÔ¾¾¾{Çž={lllÈ»àÙ?‚<01„‡‡Ážžž“““vvv@i›J‘òy{{å………mûûû£££CBBlmmÏŸ?¥¥¥øØEˆ»»»ŸŸX=¨Ç_]]M_ ‹@ p1Ð|bb‚Ð2:::¡€ uò @µ¶¶AG«Èƒ.^¼h»"”#Xª¡¡áþèâ^ò8ÈcxtøÆÍR¥J•*õiÓ¾Á¾ÍKH}}]|‚jrj¼»çrjZrfV:ðqíÚÕ{Üīڢˆ Ò3œAy||\¥Ryyy‘ãÓÒÒ •ŽŽ2½––VUUþ»ºº0 @ÉÌÌÄ-$Aާ&00.¡ ñ¬¬¬ÎÎN___õoTôôô@3ðÁ­•¿¬ÉÉÉÁŒ28‚]У™™™Â·ÕÈC__zzZ‡8µ„††ÎÏÏs4%%'«È#99Y|Össå¯ihy|ÛW_HÖ—<š;š—¿ç1:´tcIèµÅk3³3SÓSsós‹×•ú{ëÄäÄØøØwšÍÎÍâáêzŸž¥J•*UêãÓMý=ΈŒ/(Ì‹Oˆ««¯ýÎîA4wvv#²³³OŸ> RpèòåËØSOR'gŸ9sÆÖÖ¶¦¦&""(ÁœZjjjzöìYjÊÊÊðPPP¹¸¸(¾çAÛøøxÒ¿òC`Mpppyy9ZYYõ÷÷?|ššÚÐУŽ&¨Á˜¹â­rˆŽòóósss ‡xV‘!€ÚÚZ:MLL>6'yˆgƒ#ƒ‹K‹(´QXThai¡¡©áêæÚÚÖ (ˆC÷ÖÔ´Ô„„„ï4³¶±Ægœ*.!ñ»¥J•*UêãÖžþžMMímnîÎYÙÜñߺ¿ÿcnn޼ÊOOO €‡¶¶6H"(((++‹-,,€$uŽÒ ÈÈÈ&âââÄ—C©\P¸½òG+¤vœtuu‰Ï>úúúÄÉú ‚ÒïÕ«WAzdÔbÐ…——WJJ ®¨¤¯k×®qˆ“’’ÄÇCÄPQQ¡º½ò×7 °àÆ`а¡€½ÑŠ?º “û™´{Ëã ákׯ]]¼ZRZTTUt÷t‡†…ÚÙÛ\áPß@_ZFZ\|\WwfííkíÉ× IDATJrjrpHpYyÙàð ¶¶öé3§1hni..-NKO«­¯]¸¶ÐÚÞªJP¥¤¥Œ^Å–¶V]C]`P Îy‹óŒÌ < -peüJvNv^A^Aam©‘*UªT©U»û»75yÌÏÏ Þ's<„Ð]ww7d°.ú‡*ãÓ–þ¡~xbv~ÖÞÁø ŒNLMT×VóÚÛ× (ÄÄÅxûz»¹» EÅD}øá‡.®.~~ÇŽÃÌÐȪHÏLß·¯å•åÔÅ©âñ0·0§©¥ ‘„„†LÍLa¡ŠW/Íï½ÿ^@`@fV&Æ" ©R¥J•úøôrßåMM[æææ‹ŠŠnþí_ HQ—ÇñÌ£o°oþê<(pþüù¾þ岺ffgã“ã0‡…¥Ek{kdt¤††Foïôìô¹óçjêj¨  Ƙ6WƯÀ1NÎNyùy3s3-m-Æ&ƓӓGMm ?Æ4wvqÎ+ȃu ¢â¢†¦†C‡QO“U1H•*UªÔÇ¡]=]O5yÜ^ù½äÏÔÝ[yôô÷ S:::]”Q@¤«» àPÅ«BBC€ ÐAK[ tˆˆŒðñó¡3¤ªºŠšÀà@ÞRðð(UTVP8zì(8"Œýüý0nniÞ±c‡¾þEËX–U”Õ5Ôihj·R¥J•*õ{ÐŽËO;yHùNY÷O[¢“¢»z»&g&Ç&ÇÜÜÝT ª±‰±ñ©ñêÚj'g'à#7?7&.ft|t`xàô™Ó•Õ•¡á¡þþ4AÏ_8_^YpLLO¨‚NŠËŠšæ¶æ _ÆÔcÓÖÑæìâ<04€ÁÈ•z§GM-MÑVªT©R¥~ÚÚÙ*ÉCÊwȺ?óÀ[ûåv?ZUSehd‘”`db84:ÔÒÞâà—’–4·6‡ûúûŠ&çΟ+)/WÌÌÍò ói¢*.-öó÷ËÊÍ5Ì-Ì!aìåã…Mß`~¢b¢ðìàäPQUÓ\м ÚJ•*UªÔïA›Û›%yHùyäóŽŽ¢pàéåicg“˜œØÝ×MåÈØHAQ­½­ƒ³CyU9adçe‹&¡á¡M-MÍmÍ.n.DfN¦rhpd0!9ÁÂÒÂÛ×|Á0ÎÊɆ·õMõnnÖ6Öé™éc&ÚJ•*UªÔïA[7)y,ô÷7èéþyñgŸ¡1N²Œ?mˆ^pHI/é¸qóqýÁ‹”U²þŸ¶$Fü0‡T©R¥J}Ú´¾¹~“’G»³sÙóÏ7mÛ†6lÛôöçgÒ­bPóˆÚ½&q“3÷õ‹óR]y4´6ô õI•*UªÔ§Mkk6)y4š˜T¿øbÍ?üCÕßÿ}ùßÿ½ëÏžÑvËvIéÐ ª·Rµ~ª965¾GFFè+55µµµõÛ~᥹¹ù>Gò”Ëãø´¥®¹®g GªT©R¥>mZU_—·YÉcË–êý¨ê¿ý·Êÿþß íË 8[¬²òÍhäqeò[É£§§' )))33ÓÅÅEü=õ ÈÜŠˆ·ØÔÔÔÜ^ùÃÚùùùÙÙYÁ(7nܸzõ*5×®]»uëö333êÿ3éÓ&ƒ<ªª;{:¥J•*UêÓ¦å5å›—<ʶl)þÑ ÿîïŠÿÇÿh¶¿Ðúeß©Euî©í_êEŒÏݵW !""¢¤¤äúõë E{{{llìÕ)((pvv¶°°¨ªªâ 8£®®ÎÛÛÛÜÜ<-- Ú¨¯¯·´´ôððˆç¡^¼x1,,LügêO¡<ŽO[*ê*Ú.·I•*UªÔ§MK«J7)y´‡šŸÝ’üÖ’^ûßòv>ס×s Üý/YAÚ9¦z¯ŒOݵWøÀÉÉIľ^QQXLMMµ¶¶úøøÌÏÏ òèïôóóëíí­¬¬ÔÐÐèéé™õõõ¿L›••õÔ~4ó8þ'±+ãW¾–"EŠ)OŸ nÒïyô×›ô–mé/ýÑ`õ³=yûÊÝ·×…ìÎw|£6t_‰Û›™6¯¶Æž˜¨ZÛëä䤥¥¥ò+k·W>Lá•~A ü/..ZYY ‚<êëëÃÂÂn®äAâ‡mE+ ôôôÜÜÜZZZßÏÇlryä161¶ÑÃ’"EŠ) C#C›—<†j·L6ÿh®ï½–Èw[T§+ü¿,õú¨+Ûª.üp±ÛÛ]‰gú ì×ö:;;ëåå¥ü„QVVvýúõ„„„ºº:ü%Š æææ¸¸8¨Ô °ÚÚZÈ#((H4¿qãF{{{jjªøû‡Ÿé'YÇ/ÆIò"EŠ”§Sžòø¨9ìí¾<›–ø #¥NSMÑWÊ\ÛâŽäšöæZ®íuii);;;<<|dd„NCBB ÈƒÞ à’ÎÎNSSÓééiA£££€–ìììZZZÔÉ££££±±‘£ÆÆÆ@É£Íö“*ò™‡)R¤HY/Ù¼ä1Üjß_ùüdÇ–¹AÍö¸WÊœÇʧ«Ýfj}¦*G L†òÌúò¬ïÚ1T‘””ääädkkRÜ^ùæ)•666¥¥¥7nÜ€N(”””P v¤¤¤ÌÏÏC)\)žžžDkmm Ê<üL?É"ÉCŠ)R¤¬—l^ò¸6ÛÞSq¸5ûÕý%f—“NOTºM–;L–ÛM–XM”;ô¦iŽ7'|[ß‹‹‹“““‡â“òøø8õÐo ñg´×¯_ŸXñ§³¼]XXMnݺ5;;Kð333_?­ÿ³»ü´EŠ)R¤¬—l^òX‘[·¿¾yûë[·n\©ºœ|®+þX—êh—êHWÜáÁb—›×ïõŸ‰IY/‘Ï<¤H‘"EÊzÉ&'¿Ê×7¯/\i™êÌ™lϘlÏœé)¾ymf&@Ê}ˆ$)R¤H‘²^òć” IR¤H‘"e½D’‡”ïIR¤H‘"e½D’‡”ïIR¤H‘"e½D’‡”ïIR¤H‘"e½ä [·n]½zuaaABÉF‰$)R¤H‘²^²ÙÉcnn®¯¯olllzzzbbBüÀ=6û'Tîß¿øý›Ç̆‹$)R¤H‘²^²©ÉãÆ³³³KKK¯óóó¼]XXÿØ·ÉââbWWW]]]GGMn¯ü˜‹òK.÷#mmm€ÎýXŽŽŽÒ×ý{~E’‡)R¤HY/ÙÔä133yÀÊOëŠßuãõ®_¿ž••ååååçç,þCôªª*ŸÛkQÜõ-BóššåÐ=º+,, Jóû™'H$yH‘"EŠ”õ’MJ×®]+-+‰Œ UEÇ©bÖjFfÚÔôÔÚ^§¦¦ÌÍÍ{{{a”éééðððîîîÊÊJcccºæÕ××—zð…ú€€›ââ⥥¥¶¶6Á+NNN_|ñÃö÷÷‡c233²³³‰ ›ŒŒ ÑQBBBuuõÙ³gwîÜiee500àíímddˆŒý Òª$)R¤H‘²^²IÉ£¯¯/++ór÷åþþ¾~5innnooèè¨lk+ÉÉÉ(+/]û…Œ¹¹9GGGziii¡S <öíÛWVV‘XZZÖ×׌ŒÄÄÄ´··ãÚ€°9}útCCe{{{B­ªªJKK8T*MÔÆÖÃÃC¥îàÜÄĤµµ5))‰úõXÍ"’<¤H‘"EÊzÉf$@¡®¾®¤¤¸±±±BMÊËË++ãjjÜ««­ró’ãáŒU½âplmm­¬¬¢££ pD|;Äßß¿¦¦Â ¯7nPS°!„ l(„‡‡ƒÊ(«È›ÂÂBQÓÕÕÅ pÊ<î/À~Ï"ÉCŠ)R¤¬—lFò ÷—•—ÕÔTwww“Î/¯H׊¤§§WV65•46””FFE ¯êâGhÇÆÆjkkíìì:;;!///ag@ `Mhhè­qssÃr-UPÀ¦®®Nq®ØÐÊÅÅE< h&66âÁùC.ȦIR¤H‘"e½d3’ÇÂÂ|nn.Ø144Ôßß?88¨`ˆ”””ŽŽŽÖÖÖ””dÈ&YÕëì쬿¿ÿÈÈ(@900°­­ bðöö‚<p…ÁÌÌŒ½½=¬ N———ß¼y3??¿ººúêÕ«À« °ÿÚÚÚø)..Æ¡ø»›ÞÞÞ©©)z {ä¥ÙD"ÉCŠ)R¤¬—lFòNÏH²²²°ÏÉÉÉÎÎ…ôôôÐÐPh iE¢££ÊËË õŽx[VVæëë =ðŠÙÜÜœò·-dP[[»¸¸XPP@%$1`"l222lllâããGGG###=<<€’±±±žž###'''œ3/øÌÍÍaË—/Ó‹‹ CGÖcu6‹Hò"EŠ)ë%›ûk¾À÷<<)žÞò0šŒ¥e×Êʯ¯èõòRj‘¹¹¹'ÿ_÷<<)žÞòO_Fy$“÷l>bñØSTœÎðÈðÈØ|ªllm|‚åÑÞÓ^ßRÏiç@!ÜlÖ5×u‰ºžŠò  [SGSS;|åvríû“*ZŠ>n!„›S»wå JºËB!„›Y”„BÓ'ÊB!„éå!„Âô‰ò€BaúDy@!„0}¢< „B˜>QB7¬¯c}¹‘NçÓÎå!„pJW>k”0b¾¸k½(ö¨ *›k…ï’f]¬Ö¤e´ŒB£XÒVõf½m¥ïÅFy@!Ü€Rvð„R•ØÈêM6úPcRu ÚZ…ÃóÈ j¥Ni¶™ÃÑp4]†"!*µQmw/ÿ&S”„¦Ãë0b¹ZŒy{“¡Ø:1Úpx­íÝ­¬“]z:FÖh°¦¦§üãÁ?Ö ´Õ±‰1•^e¶›—}:(!„M*¾¸ËÈêz“Áp·ŽìKF¸‡eééè-zÖÁ>ø î?êÿ?÷ïß×4”MË>”„ÂæByè£ýPÜû¹õFÝm ÍùšžÓUüS•üóÕݬßñEüLû¢œöåå¡3ëX'ûiþÞÌŒ«®®ëÍ7;wíšwçNaFFB¯ÿxnîÉþáûÏÊBá¦pñžG$áô¹×lÌí 9l;ë·s%… Ê+\}!×xà _ë°~žWg°ÏKF>­<>¾ÿñÕÄ£ÎNO»nÕJvìîÞݳ'òöÛ‘·Þ²ÿñ’?ý)iµÌÍÝ{ü´IFy@!ܦÊÃÀêB Ÿ?æZ«¬ßVÙ!©í–ÜÖ«\ÉÅ:evsò¦&³°Kc·¤æØý–^Óõ%uÜ•QæëuÒ T%`ôÒÔoÔ!ÓˆTFùšÞº7^¹<,]ËïÍÝ[êìiwCƒô¥—B»vùó÷óÏÏ»m[ø÷¿w¼ôñÎ?',–ÅÉwfî˜-æŽÎ±DÜï[¶Ô‘Q2cãcÓ†QB7…ÿ*«6Ôç¥&X½” z§¥¤Ev¬´çâ­žJs¡¦'«\ò^±$¯Vs¤¸[c7Ó4»Ï|î♃ï(ºúau]嵊«e/ê¸\\PQ]:¿NÄÞ%l+)¿¢6Ê×´ÞþЧ•]ËïÞ»»ÄY[MµtÇŽð®]×_÷æå¹^|Ñõ‹_øÞz+œ›~åÛ‹/ _{-aciòôÌt[[[qIq]C]eUå¹sçzûziüÎìÑñÑá‘aJ‡™Ù™Ù»³ôt|rœFFÆFèUš3sw†^¥ñÔÓÙ{³Sôêäô$=&÷¿»? =º·yiÃ(!„›ÂÅòÆÜ«Ô´‰ º‚zIÇPÑíÁ¶ºÃlêX‹KwäøaF'.¼úáõªâönnΙ2µf®òÝÄœö†•Ëãáí‡Oœ½Ó¹kgä/qmÝêÚ¶Í{üx”e“Ñh?Ãxwí²þüçÎ_ýJþË_ÚênÓd—ÃmæNMO=|µ¬PaÑø¥«ù¥U¥æh¬²üKyÕõkÚ€?êjj[¹<Æ&džƆ–ꑊzþëû /¸~ô#ãw¾£úêW™¯|Eñµ¯1ßú–ñ»ßUþøÇ]¯½fÍó“G‡Ä2ñ…‹>8öANnέº[‰Dÿ`ÿšïyÿÈÑ#Ì=“öíßGãtˆœ‘çÍ1²“9'©KÚ:ÛGÝ>wÑå¢ùuNåК4òÞ¡÷œç²½‘ã“ã(!„›ÂTyhŒ ëÓ]ªÕ«³+”&±@ÙUÒÐxåÖí6!·KÚ*`:¤Ún¥Y¢³34G¬æßn¾YË©*«.¦æ(©¼|£î:pyõŒQ¤¶HWSY¤tÔš6à8šÚê/“Í4<>œN>â`£ò_ÞaùÏmöüÀøÍoê¿ñ í׿núþ÷Ïþÿÿ²¦äP¨7D‰  ZÚ[êë9-¾€/’мAo4uz$5‡?ìO &¼ojñXŒFèA_²Ïås¹ýnz@Oû‡ú‘€Ým§™”/4BëÄâË÷6œUê”(!„ßTy¨ ‹G«w0«V¡¶JF¡HÍãIZZ{šÚz;DÜny›XÓEãVFÓn7ߨ0ãqsΞаҵ¼Ý ºC¶•˃5 Ž R,3žì³ ø/ýAüÿ.ýÉO$Ï>+Þ²¥kËþÿþOÀf¦  9fÖœ“}<ëøROd`ÔÌã >A‡Ç†QB7…©òPä&—Zk“­IªµU¢4‹£jƒ1 •f1ÐøZ—úº‚ìŠåa´“Có÷!V0Ñë‰Ueʲk)57+}Vc,±Òä4J©¤Ô¢< „ÞsY§ëIDATn©”„ §×ÉhÂvµYfñè¬^ýºÐèT‹˜nž°“u±KOÇl73Zfþ'-úûâñu`2KÄìn»B£°:¬Ë>”„ ¨Õi+Dmü–gÝØÅå ;tfݲs±{ì4HWqFÃP‚¬5 íV®‘¬‡×±ìtPB7¦6KW>­I»^|øaæÇ/Õ·ñaqXL6“‘5® i«+ž ÊB!„éå!„Âô‰ò€BaúDy@!„0}¢< „B˜>¿ôò uiõí  <>žXyŒŒŒø|>­VËãñjjj ³³³322^X€Ú€ :jšÊú*bÍå166‡-‹D"inn®¬¬,(( ¥÷,@m@…@@µ@Í@å@ý@±æò˜˜˜ˆÅbN§“âE p8Z”Š&`j*êªj*ꪈ5—ÇÔÔT2™ ,˪T*ZŽZ¦¦¦¦`j*êªj*ꪈ5—ÇÌÌÌÈÈe‹Ï磅¨b$ Çã,@m@…@@µ@Í@å@ý@±æò¸{÷îÄÄÄàà -Aýât:- ­+X€Ú€ :jšÊú*bÍå177GÁBS¹$“IZ+SË8 6 B N Z f r ~ ŠXsyPH(¤”ÒÊéå€ôò@úø?:1·ÿSÜåPIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/tip.png0000644042355400116100000003415511675570700016671 00000000000000‰PNG  IHDR³TýT IDATxœí‡{×™¸ÿÊ–äyv³Ù$›Mœ8u“ì¦m;îØØ˜f›ŽB5@¨ ê½÷v{ïW÷JºW½#Š©®ü^éd'7WK² šó|ðŒÎœ6ó½çû¾3sgæÿÝ““œ¾púzrz’Œ‘œV!ÉÉiÒßaôé§Ÿ~ôÑGwïÞ½}ûö7®_¿~õêÕÙÙÙi9­ƒ„¢Q7JGõÀËÆˆjÔ§!ZœœœèííuÉi$ºQ:ª0X6FHeÀ¤­þþ~š¶X,Z­¶KNë ¡hÔÒQ=€0€Ä²1‚>0¤ À´Ùl´ÛÞÞ^WWW*§uP4êFé¨À@bÙá1hÀHC*•ª¹¹¹¼¼sö ™umn6æ~ý?ÿþïÿþÓŸþôHô³ÃŒ%û‡ø‡üÇüîw¿Û©ú«©€•¯}íkäÿó?ÿóÁ°ƒ¢SÌÞæ­›)öä“O➨‹âÃ"Â~ðƒ|ûÛß~uëÍíÍAèÓÎþô‡o~ó›?ÿ¯Ÿÿ÷ÿü·ÀH©S¾»ãÝýøG ã¿üÅéÔÓ'N<ù£'/]¢c>•zŠ?!IÆèáaôìóÏþöw¿åì³³Ûþîv´ò›ßýæåW^Vhu™ñ¿úï_=óì3'O¾øÒ‹ VP\€IøÎw¾óæ[o²[%Jâé æÿöô éŠÑéýâ¿bÇB'Ýýâ¿À2aÒ~óÛßP24<ôÇ?þ1H$“Ý´eë*Š8„ó}â‰'F¹—r©µïý}Ä[ŒáÕ×^íPеF-óáõ¯ËÖè‘aôÓŸý¯‡˜›ßO>YQSXS„C¼}Áæ²Mÿû߉‹¹_Üʈ2›·lÖ™u ¶wÿ^Ì^—ª+%-å[ßþ¾û÷µ¯í¥—_ Ñ(ŒÚøæF•^E onzS4ˆÏʾ˜Š'ý—ù—ßÿïï­Në;ヲxº¬¼, Uâ©Ä/dŒ¾(FøŒÛ(WBØX÷øÉã„AX jAíà׌Q‡²Cêôý÷]Þ¹]¬¬ïÀhÛ;Û=A§º—?üñÛ¶o#€Ã2a&E­Â’BˆÁ·nz{Ó?x‚ÁCÅ9~ﳘýÊ=Œ@Ï‚¥Á0vtÖÍÍÏýÉO~òÖ¦·ò‹óQ*æ*+7ë~EFE»¯°ò*#*öþìg?Ã=Ñã¦Í›09… Á@bZÒ.¤¸nôð‘ÃøÇŸüô'@CI­iΗa,±sX»/÷ºÆÈáv c¡¤{óŸ¦à,sÒ=OMM ÿ3rÔvãÆ Ô¼{÷n¥Ri2™ÂÂÂÐèœÑÑÑöööžž­V«V«?üðCX¬««³Ùl%%%¸3ZCsP^¢G§Ó¹uëVòQêž={ P îܹSTT|ÔÅL–••ÑZ}}½N§£0m2Ȥ¤¤ÞÞ^XPÚ}CÊ@ƒåÀêÐÿGFFBƽù·F‡‡‡I}îÀ°»ÑÑÑ'aùV€‘Ú¨nU´Šå}‡ªCcÖ¬_Œì.;çw#F‹:q%ؤòòræ=çe0Ñ ArssëÞ|P"´µ0§¢¢˜÷¨ zh£ÆUB³#ìØ€© L`™233ñ¹üÏ.‚ž'NHßm¡SN&¾‰mY FK8âÎpšiiiAÖ1r÷»%_æñy8Ÿ_]Œ°œF›©[£jëîjéìàÿ.µÊh59=«ðX*yú<Fœ_¬g–³ŒO!H2 ØN7§Mpèa”1è‹‚ÊQ0^[BSäð'ís*€&p1%´íÂ2‚¶K—.Õ±1§/©ÓE1úÜQ… üÝñãÇA_:Fkf¥¦Òk J+Îf•ħ•O)=‘Rròliòùòs9¥ù% í _ˆ‘Ð/¼ª"J \ÀMpö±OÕÕÕ¨]X&T¸Œ¨…£‘2¡j–€Æig||'…ÚŠ‹‹!õÁA04uðàAàC÷ åä°"Ãa-£…³Ûí¢q4ÂâôñÄÈâ´•ל8S˜Õ•RlO*õž,ëM(÷&WzÏV{.68²ËԧΕW›í‹¼£s ù4ÄœYlü2r"Pò1TüI !}¥#³[˜#ÕâÅVhœð–¦¾øB!±Åb…ïÍšgdddÑ à°Ï'Öe"š Ð…R§D³ôµô1"k¸ìëë[âÎF:‹ÎÞcÇK,*V—Õ`3|%0‹å”ŤԜ*ñÄ—ø’*ú³Zü%Š¡*íp¥f¸°Ë¶¾'µ¶§¨Í›–ד_ª·¬ð½ä*öÚM`TÙP™‘—qäØ‘ÈØHäpìáÃ1s„G…³]Z]úè1Âeç—Ä­O(ö'U ”(Fº“êži­gJë™ÖöL©Ý“ÝŽ‰R…?¾Ü^ÐáË-ëȾTB-£/; ŒÎœ?³qËÆWßxõ忼üÒk/½ðÊ Ï½ôܳ/<ûççþüÔ³O½¼á傲‚GŒV±¤²&6¥ædQzÝp‹yRížHïÖ{§„è¼Óšž©nÇxn›7¶ØZÜéÏ+ï(®¬YÁ»`¾ú=œpK_ð ŒÞØü¸¼øÚ‹Ï¿ò< =óÂ3O?÷ôSÏ<õÇ?ÿ°=FZ£>!µ þ¢=©b°Å2©rOÍ34eì6õM›ûøŸmr°OÆ¡Ä [b¹£FÙ>·\©Õ¬£>_‘ÇO7Êç† ˈÎÃ?G'%b#ŸÏwo>$Zâš|a"Ô :@)‡ñ\³$ÞZxålaZaNj[¢ÏÔÇäûÊ”cÝNL¶gž¡þi‹oÚ:/–þ9˜ ©Ó6z¡ÑPnËné-ªRTÖ5:–yŒ,6KDDgösg$¢¢¢ÄJ;¨°”#•‘ò «Eá­“? HA-5ëp8233ÉDÍlvÔï¡J»`Q:@‘ð½½Ö,é%::Z\zpZYݶs9e±YÆ%ý¦q…kRÓ3iðN ôØý3ö»ÚæãÏISߤÂ9z±Ý“ZëH¯w×t{òŠªÍŽå­ÚFû÷ïïììd©Ï’˜I_YY)-sü~GG‡¸-îa544¤¥¥ÅÆÆF2™Ä*•êÌ™3¬œ¯åˆ[iééé¬íwïÞMNkk++,ü,³Yü£¹¼¼AlRnÜ¥öÍ–1¥kf웲Ì14í˜q "ÓÎÁi‡³4©tŽuy²›]éõÎ&ãȹ¬’å.ÙFo¼ñg]‚ÓuBÕ½ùY[RR¢ÕjÅ ªˆAm ‚Ža…’TaÝÜÜ\VV&ÝÕâËËËY„£°W_}Uº–ƒ]yýõ×Q*<8q‚õ6ÈÒ;ç‡L ×{Dwt}úôi Øl¶M›6©Õj µ®_¿ŽÖißãñ°ø¡;r›Ûíß壷Þz‹Ccâ+¿â"´:tˆÂ—/_Ÿ{ƒvm`d²™#_ˆ+ô/u¶˜GÁˆ¨ÈÜ?e›chÚ=4Ó3<ãžîš&›²Ã:X¡òtôd6¹Ú,cgÏåkMú`„µ7Ìñ;EEEðÄÄeÊŽŽŽ²!ýîBÜÃWêÄ=, AÍâ÷C8…S§NIa9 fŒ–…5’0¢ˆ ›DݱU#"atïï/HÒ¸¸ü#j ÑžŽ?;4R-†Í@“Z h _ü @Ü­ ºVx5ü±ÀÈFç㊜GòÍÆaµ{Âà´ø¦048ížñŽÌôÎÉ´ghÊÔ;ÚfñÕéúʕދmî.ÛXê¹K+ÃH:ËLú‚‚&%çZ§ÓUÏ'É_,¼‡%0b–‹Ã2I7˜1ŒUh9444#q$r„Å¢"”ÐÚý0·Ûk gǶ^¯nN$F%~PÀ€v………‰kª¢ÁÇ£y§–}¢È™oÎïìS»Ç½“6ÿœíÁAOÿØŒol¦tÊéÓººm¾VS­¶·´Û«rLœ_©S{çw8ÝØÙÒÒÂi5™L8/ÂOKÝ|@7MMMD3¨„c$`’¬‘R©Ä×ܺu‹jË–-I·fE»ð51Ânb$nÀ±Ê“îùÖª©©Á(=ý‚­b„y„\b¨¿/XˆVF>÷gŸk#«Ëv.·$!_}¬ØšVçj4 꽃S×ý㳡þÑiêžpùG-ޛׯuù»¬¾fC_®_i¾TTm²›W€aGJJ á*±øå Jeœœñ@õ®ÂÄò‡óŽ!–ƒ`-º»»¥uÉÇ$lܸña„ßDþöíÛ¥PìÞü/Ú@™FÈ ªEÜFXÆ6 `A‰o¤Z žca<ÀÑÖÖ& 5#rÀHZxÒg€Éó8`Ä‚¿¾¥51£:µÆ‘Vç(èð4ý“Wn\¿ygúÊõ¡‰é¾¡1ïÀPßÐÈØäÔÐè„Ù3¨vúÛÍý]¶¡¦SuC³½gyo£^_o__Ó—S âtCš ’ ZNSL\Âꈈòããã Š]R´E E¾¸i…³°OÒÒZäÐËÞùtîÜ9â3©;4 Ö4ŽÕ ªÅÑ®ZAß#gÌœsqë Ë$ •$z9“†zåÊzù\¿¶60rÍ}nǘžS’]­Ëmé)êì!ôqø'Æ/{‡ÆG¦f&g.OLOÏa46iíÔ¹ÔÎA£k¤¤²¹[³ìþ‹^ÅFyDǬ™™ÖK9Ú/˜P³Á ›´âËŒ!­ŒÖî®ÔÌâ²v{•º¯A×§uáÎìýCNß g`Ð;0ˆéŸžé³÷ š½CÎþ‰š†®Ú¦fÇ*Ý ÁËñˆËÇ!A-‹mby:Ű=œNW–ÖF¸¶æöŽs¹¥šžV“Oåèsù‡ÜþA¥/«ií2÷ƒ‘ÖáéÒè]ýý}ƒ~¯¿O­#ê™·LcMmš…be ¹î©­u¥ßÌß[p÷{Ñ’…ENàM:)gáå™ ]RuQWì ìQÚ+eå(•JBï #°îýŽâ~iíadqZ‹ËkÛ4ÎNSO»Vw©$¿±µB¡©nj-Ê/ÊЕV¡ÑXc«ªK­ü‚‰Ë*„Dv»Ýï÷³º!L9}ú4+jV[---ÒoLYÑI7ðÙ[UU×ÚÚJ ,ò/]ºtêÔ)Ь©©Á0ú ÚÔÔTbö;wb´pÕ9K¬×ŒF#ËÆ¼¼¼ØØØ„„³Ù|o~ýØÐÐ@yq_1å A:ƒ\8 viµZÎ?A‡&=°èQ<>!D<e M UyCiZfbzÆñö®‹— NäkmÏêPÔéMŽÒŠº/ø#Zú?z–Üœq¢]ý|êîî...XLUVVJSÖf³¡?–Í&$$D<¹¶oß>ò‰ÐCCC9v‡ÃQQQâæštfî¢úñãÇY£ZÖnt LµµµØ* axÇÉLLLD7”ø€QÐ0pÜdrh………¯½öZà0Åc…‘Ùa9ž!§ K£ih«/«ÊSj«ZÛ æß Mo2fæ´t¬ü›º®€›!ííí|ðˆdff&%%a˜åLÜÙÙY”400À^æwà“¾|ù2¨ÁÙæÍ›…þÊËËQ§¸sB]Ü\ˆ={öêoá.ªCªp:PB>$10öò'gOüàÚb±8p`aN FAÃÀa\©266¶wïÞÀa,<ŠÇ #½E³)1y[jzjem­R«1Y-f›EgÔ•Ž8½á1W€óƒSYƒ£uÏ'æ(9Ø|SO!=Ñqoþ×òSÙ`0rssU*Õ½€;'µ¸¹†9xð` ’î¢:9b/¶ÆÁõ hRRRÄ…Dú¥üœÀ'C‚†%@¯^½Ê´ ÆÂ£x¬0²8LG£7eeýÅ`ʪkÌÍÈNIIKJ9›~îøùó¡QG_ 9¸aU0:tèÉdÊÊÊÂya°óx·‰‰ qOèèhŒS60%ìÀ+¡œÅ;ï¼³è“=`©»qã†N§ šë wV§;à¾~ý:öh%‰ ËÊÊvïÞ½0ç]QƒJ›o¿ývà0Åc…‘ÙaŒ=¶¥ pû•«Ž›·=×n(ff[üƒej͙ܜÝöÿ)&nçüçFvKdd$ӔȚ8ƒ³4l¤§§cŸÄoÓ€Œh7&&&(n à  ÖëÌ™3[¶l™ššºxñ"zú£<9P"ÞÖ@¤ +©î’ª“ðw4Kãì%Ða„ÀŠÍ#Ñé¢ÃÀ¯¥Ï§­[·cáQÙ`³çµµ,):órÈÁ×ì=+¼b$aÔçï#Cʰ„÷¤úúú#Äã­ü/Æ´T&Ÿ¹KIþæO‚ ñPÛ½ùçÚDulâ"ƒ^>´+°:Ë+l!3a±L#à [ faŽètá0°²&%{zzˆâoå.<ŠÇ #›ÛwìÌÌ·§gt×oØ®\ïš¾Üì(ÓjSŠ‹DG½ºÁêZù2굊ǯø2âîU|½ÕÊá f†Å<ƒAUPÎêâÔpÙuuuX/B½¥ü€aZ{á­´FUäÑ×*+·_ž5Þ¾ë¾q[=5Óìrçwt&–‡$œÜ°gï³*}7áÑŠ?õ½tŒÄÛƒVpêW1a{ð¹ #B·Esî—àF,쉖û€Š”ÖF0auYMv“Æ NMŽŠ~©º6Ê`Ê4𳻕©•UQiéï9òÒŽH<Ñ­îÒµ«Áì0Ûܶåòô0ï©}î5â¯~_k#P Y§Ò©ºT]­ ¹—ÎGDîxûí§CCß {{ÇŽ—6lø]ÈÁíéΔV–4´4´w·+4 µA­·èiY$=LŒ8 â>ÁP`h²”D¼ât:1ЏļZ}= ­ Œ Àâ´`Z`¢[ÓÝÖÝV×\WZYz>ëü¾ýûÎ;WUU»ímI§“²r³ J *k+›Ú›:•JRkÒ‚ ®£ç“4ƒ™Í"GüùÉ|úh>‰2 s¤Za8eD³¤ììl¥R)~n+tL¦( =À$þ¤Méu"ù|¾Ã‡³,Ç7-ZK$Q8°/q!J U˜gPKIk#„@‹‚]‘HÂÞÀJfNfLlLXxXDdDjz*•U•Õ4Ô4·7w(;”Z¥Æ¨?(\Ö%0ò úX± NMMeœ÷æWO­­­,|È—Y ÉFGG‡……‰ÇÖ‚r(ÃʈÐ511Q\ž¹7¿î+**"G¥RÁÁ_þò—mÛ¶1*++ ShÄëõ¢oÖM,ûY—±V:qâ§(<<œ®¥‹ ·nÝ"çùçŸ?zôèìììÂZÉÉÉ„ØåååhV[R_„ÕâÿÐÐÐââb( ÆCÔ!n?† ›„E&°ÀÀ¨õs„Ψ°°Püœ—„[ø0ÚBŒ\kѾÄõ$ £ªù„&jY’À(ëRVlBlìÉØ˜“11ñs}bN¢ŽG±]^S¾î0r{Ü„®ƒÊÅëúpmÄ.¬‰ðS˜–ÀŸ›=áˆQ{{;®«&×ñ5Lw‡ÃAkùùù8x:æ´P€eÔÕ«WNØ• §ˆbôàZR ê+#ÄÉrÈèe‰ïY“0ªj¬"„p÷¹=>Ï¢‚g`¡³î0ê÷÷£f†9au#î„à/PRZZ$1ïãââĦëׯ£   Ê··D-šB»÷æßGƒµ‰w-bŽ;&Þ0‰Aâ¾xç5Xˆ·¹KH7×HÒ®×’RP_#1f± :Cý%^AÄh-½ûñ¡aÄ‚ÝàÅðDâœrÆ W1øÒ{ ÙÁ‡ÀeÑœ…µØ%n‡‰ß–`¨•èE<êzoþÊ29÷¿( E*R‘w= V`ù ¾ÇÌB’àC^eŒ„ѲNåzN2F2F«dŒ¾-åºz‡G(IDATU+ûŒÕ*~üêÁ?‘1zôuwwK?úÜ2D÷Kü°Ð[^J"Z×`Ý+ctŒçBlñ¥é®9ÄÅâ–8¹Ò™a)ÿSFTa×ùX]AkiªDDDøý~ÈuT† Na2툯r-±eZãOZ¦˜¨4Tþ¤Sr¤õ„ø~ˆ´˜ eù¹èõ$£ûbäéó°r>xð`||¼øÉìµkך››Ož<É’Ýp¢Y‹ûä¬q’““9ÅIIIEEEâUk¤´´4 ‹ëÚâ窉‰‰o¯êìì|æ™göíÛ×ÚÚÔÅÂ2---aaatAw‡o]ZJË}}}çÎ;zôhTT”xQŽ4TV‘¬ÎΟ?O§yyyÅÅÅ÷þïE䈗Ýddd<ýôÓtÝÛÛ+c´ Œ¬vëþýû¡×ëEœ÷ºº:µZ 1œÙüüüE/?¢Úòòr–ÓLÜÂÂBŸÏÇy§<ÊÖëõø#v9•J%Ú‰ŒŒÄÀ°ÔÅ¢e° â%W===âuiKiY«ÕZ­VÊp,‡&G*–”” Ž”á ƒD1Ï$Ñétt4;;Kù@ë+c´$Œz¼=h PP­xN-ðžcQŒP›°"T º%Ç1¢¿ØØØèèh,Gà³ÏÒÖA]>I-•‘º.”nË÷æ½@‹ßìÚµkáPÅ•.\¸€»d/v‹6Ù¨©© |5Ûçb¤Ð*Ìv3½½z‹^gÖ­_Œˆ®\¹‚UÀ1aW8ƒlˆ{j(FÜS“”ÄÿLÖÀ´·äRSS ÃÈ| |’$‘ .Åháý–ÏmùÞ¼ƒã$cZ0K!!!C_õºkkkßù,ü h“cYF%q'âºÔ]ÍíÍQ±Q - ë#o¿×d2‰xˆgªÅb!%Tâ,“ØÝn7q(óuÏž=º¡XeeåÄÄ>…Øè³ùOÒâ}Èïïï|Aìgó_ƃˆçL»ÄH”Ë…}nËÔ"ŒÃ]âÂ8ÛO®Ý›µ?º`´”Ç©‘ƒ ¦5Brò9|4f‰ÿ%)#N`FNƶw·½·ë½¢²"‘¹^1êó655%$$ *F(žD.((`âb3ø‚ ¼Off&Ö?~\œ N7Eyâ%²ÆNˆê,ALà© FAœŠ .–© ”CGKiÎ h2$¢«À¡26¼85Ç’••%rà‰6ÅçÞ`”ÊÏÅH|n6'?§¼º\|hvýb„S#ÒD¯ŒS q°öâýöbRR`f>áÄ‹ç+ªÂ-’/]¸ ª.%”$YJ© ñtö[f ŒdÑ¡ò?žKÜ=d­WUU%2iòÒã"TäT,zËvÑÛãóÈP_G7C˜$â뎄€˜Õ¥pGJòJí¾yú<·ïÜ^rëö­ñ‰q^§Ñj|~¡Þr[`Ê Œ°@¬ÎwŸ{ÝaÔÜÙœ_–_\U,ËR¤ ¼ ±£Ñâ´˜&éÍAÂ.«Ëº¾0’åË#YVAdŒdY‘1’eDÆH–U#YVAdŒdYYYÝV£Ýh°Åä09¼wŸû! `Åoúz8ý®àñöu‡‘ÅeéÖv# ­âo¢StiºLv“×ï *¯3éªê«ŠË‹ÛÅ¥¶E‡Ö¨ý"c 5ñ°iCKƒhó!–~n1µA]ÓP³ÜÆ×FóÜKmîܽóY@úô³O§f¦àÉ7ä ,¬3ëN$œ8~("2"2*2çbÊ8|ôpî¥\¦lЬ]˜³¨`6mÞÔ¡ì ðù¬ó‹aÑêhmÑ’‹–Ì×4ol|Cz)tP±ÁÿeUe^¸wÝa¤6ª=Ž…‡q÷û$ÿ°?°pmcíÞý{•Z%ºoïn?qHcÔD‰ ¦×7¾žx*Ñâ´ØÜ6 Ìлö쪨©hjo:•zÊì0çç ”W—CŒhóBÖ…üà/¾übÚù4šRéUgΞ9u„ºÀÚÒÙ2ÿq°æ»v¼½åmÚ×[þöefv5´6Ðæ»;ÞÍÈ΀iìÙþûCÃC7¾¹‘áÑZà`œßÚ~8jÃ"¾ÿÄ÷sU]ƒ¤í¿ðý–ŽF¸kï.&̾÷÷=÷üs?ÿ¯Ÿoݾµ¨¬(ùL²h*%-…C / „„†ì;°¯´²4ÐEÊý5}øá‡ 1jíl}ç½w8‰ð¤Ô)qp(ݼúÚ«hgÇF·º›œt:©©­ébÁEÈ@Oa‡Ã‚ÿÁ…³2édVn–hÓh3¾¶á5Ê`ßÜôf§²“ÿø§?æ\ÊÉÍÏŠB©±ÇcQ0Î%îDÍJãQhÇO¯®¯F¨…Ÿ¥ë_þê—gÏe{Û»Û.]’ ÓÅo¾QY[™šžš—Ÿ×ÖÕöÒË/ÑxÑHAq1Çb˜¿ÿßß:H1ÎÝ{wãÚJ*JBÃBES˜¾~ú³Ÿr¤ Ê–1ZF¸¦ÝÁCßÛùÞ¶w¶eäd`x8§)é)âMKo¾5ÇZáìó'ˆ`T[Ñq~Qþöw·oÞºìÙ·"%‹"è‘60BG¢`Õ0<˜nM7®_ŒX©é­zñëßVjŸ~:93ɲ?h¥f²™RÓR ]™»h"37“óy4§#€`ÍÕ©êD©‰§)F”]a¾¢$Î8Ñ4d<ýç§¥ÀH.lçî4"ªCÛ /¾@ôŠREsº Z8«kª“*ZV Ì',[„)ü)öJB0GË4K#Ä=Âá_Mcͱøc{öïa7M#"Øe$„Vo¾ý&U†üó³¦e¸ùõoͨ0EÄþÄXë#[ ­‹kEÂI ¯/øºކ3Ë$¸މºÒ*½­»M¼T™I¾±1”wÍ¿ò»¹£ͱAup lÃPÛT+^¾+‚-¢`"*© 6€H¨µ«5è»M´IÉú–zŒÊèvíˆ]”c6ˆ£ë›ëÅ[{)YÝPM D1@G0dbžéHÔ¢;†Á𘠘?aUæìÓþ=sCDcë#wŸ»w «ƒø‡üBØîì÷ú½ç*v9£¯¬:Ð Y=X‰z˜÷üÌ|®ó•T”,ºkÝa$Ë—!#«ÛtT–ÇF,ó_'{‰W§Ëòø ‚Hü!aäé÷ôú{eyüDúA„ɲ "c$Ë*ÈZÀÈûw?©YCòàãzäÃ[Å#úªcdwÛTzUKWssGSsGãÚ‘¦ve»ÁjXôÔ[œQ£Ô)ƒ®¤Å…,† «êk#G£SÝYßZ«6(tf~íˆÎ¬îT·×6WÝ4˜cÈ1÷+^»Ûîðù×’ôúzu&À±à7Ý_iŒLvSMc•»Ï1<á™XSâëÕšTX&§çï~ðªÒ©zz{î|xçÓÏ>ýìÞgkFæo`Ï^Å90ÖFLåÊú²±é¡ñÞ5'ƒýž~WuCeàÜ£NUçøäø'ŸÎ}%mÍ¥?ùXcÐmƵ…‘¾¢®llfØ?æý‚âê©èÔÄç7Çå5Åä6%µ8}®/Þì’¼>wUCEFªŽ‰É‰O¤?þäÚ;m¦¡Ô kB±)¯ÉeuûÃ?þxæê-ÏÐå>úxa­‡ŸÖ,FÓC¾QÏʤ¤Çåw:ýN‹×ž\Ü–\¬J.Õ%–v&×{ì+nv)IŸkQŒ°Fòq`úèã&f?H.5íKW+±¦×÷¤Ö¸¢/êÏ”[lý“çklçªmw>üðãGžÖ¬5*™ìq¯L¬½ö´ŠÖ’v…Þm9UÜ_¨ ËTDæißM¬5¸­¢Œ½×TZ]x.ëlaùE­EÙ;ì"³±£Vmê¼CÎu‹Öª\V×ôŒæ>Àðч’ܼ}§¤Ã³ýT×L]H¦6©Ü^£6õÏwõÎÖì8ÝyºÌtûî]JZmÖ‹—."ùùùUÕUv‡ýî‡w›rçî—ÛUQQ1>1¾pïýäƒtuw-Ú p_³M Úå º×9-iûSN·4¨519Má»SÛcóµ{O×ÜŠY{ ±ñQ»÷ï<™|,#7=-#E¡kïr‰‰¸Tœ3×Π£¾¥êì…ÓZ‹bYÀöô;ÅhlbìîG@ñ7™¹vc{bÛ3µ¿¿",C‘×ì<^`Èlp¹†®šú.×é†R+Í·îÞ¡drrrdddAaA~Aþ¹ó碢£,V ùÄì@pýƒë·nßâOèÙ½g÷©Ó§†G†¯ß¸~ã&ÿ®SæöÛ”aûöÝÛ­uóƒ«×¯Ròð¶[·m¥Àµë×®}pM” HZ« OúÑå²Äå³7iµ'òÛ“ÊLêG²;dµE\h‰Êî8[¡S;†Žåµ\fJæäg$ž>¡·*ÝýV·ÏZYWŸV·>2:übQvßVÛ\‘ž‘CËCß°«§ßq?ŒÐj“dröÚ³áÕûÓ‡³ÔÖþ‰ë7oúÇ/Ÿ*5¦VÙíƒWÛ,£`tîÞI>•ÜÔÜÄ:¾ríJEeEfV&Û¾_bRbä‘Ȧ–&òãOÆ?ñÄo½õVGWÇŽ;RϦžˆ?%:½.::úø‰ã&³éÆ­£c£GŽÙºu+™î7ð½üÊ˙ٙûöíÛ±c‡Þ $ýjƒzMb44áó Ú—..Ÿ­´]•ÓSh>SëÍjé+ìê¯Tõ7ü*û`ÿèŒË?q,¯Mï4AÉCûÛk<­k°«÷‡ìј»Á(§ £ª¡ìhÜánm«T`é‚Is÷-ŽÑèĨà@’Ùkœ¯±Ú|“SW®ß¸u ›¡wn=ÙšPl.hï=Uf9]f¼yû%“’“Àˆ7oÝ‹òŠò²ò2ŒGMmÙböøÙk4‡7oÞ|yöòÈèȳÏ=ÛÚÚÊ– ì¼½ÞOOeUåÀà ¼ûî»N—³¹¥¹[Ñ ßO=õTiY)EÅE ‰ ƒÆiMbT^[:8Þçö[—.¯ùpf]h¦*¶Ôœ(w%W9/4¸ Û{ê5^·Rï:™ß¦w]>Ë»;·5uÔHuÍníö÷¶(ômQ‡¢â"“RNF=TÝTFÉe™º×¾(F#ã#·îܺyû¦$3W¯Åê¢sÕѹš#ÙªäC•ÒSÐâ,ép—vô´:•¶Áó%Qí믿r0dÏÞ=¹y¹39=¹sçÎ}û÷‘¿k÷.2GÆF°18/66mÚDêÚ¶·7¿ýþ÷)¶eëµVÝïëß³gÏáÈÃÀ‡ ,¬Ò¨0ZƒD I­_“•øG½Î~ÓÒÅÞgjP+cóš#rµG ±%΄r{j=§ÉQÚéê4ûò›Mç«ÚL=GŸ12&ü|vª£ï¯u[• ïÚ«2u„ ÝpÂÐCGã"ºõ­ŽåŒqù-Î^Û¢ ‘ cIF&gÞ;Õ®qOvÚÆÂ2Ôg+M—g¯\¿æ›vL–uy.ÔX®ÎÇ4`”•“e¶šÏ¦½q¡·¯—ÌÑñQà0˜ §Ãár@ÃÐÈ ôÌmlÙ‚›£bãb-6 ÅœnçÔÌìN;&í`èÁºúºÀ ¥"îX\à HZ«ùFz콆e‰Õ«oÓ+“Šš#r”ÇŠŒáZâ.6Çç·$¶¦–µåÔ·ušT6¯ÞÖ«/­É8ÚÔYctª5–ÎŒ¼´³§ NUØ‘ƒlSÀêÑ‘“xæ¸Ù­YÖ Éáµ,ŠÑÐèSJ28>µ7µ³wücße–fçªÍ.ߨØôLb±nïYņ˜Æ¤bÝ•ks%O&œ¬­«eˆ²ÓÏ¥c<&¦&²²³Œf#ÁF§a†ÃÚ¼eóå+—¥ ªxz=Ù9ÙÞ>/¬KÑÅÿpÃÒŒ¸*#3ãØñc…ɇ¹ÀAÎEâ7?PéUk£¾!—Å£]®˜{´ ‹ò|UóÖeq9•Mª¶6]G‡¡³ÛÜ­s¨ÍÿWÌèRå—å„ ݱçƒûÓ³Î(mäGÆ„eœeT掸“QE•—5´{Ì‹b4828{mvæêŒ$¾Ññ]g::lãÆÞgúL•#"K½/µã™°ª_ï«øãÁÊ‚V›(™t*©®¡NlŒ ¤¦¥Ö7ÖOÍNi ZVm!!!ÇN³:­ýýïíxoêò”´Aù‰é‰šºšðˆpœÚ¹ ç|ƒ¾> â1]4X¸KÙEœ8Hú×$Feµ%¬zŒnÕrEgïVšÚšõI S kZË:«Z”µº&•¥CïTP¦M]_Z›_Tu1ãRZjFò¹œ”KeÙäÔ´–Ík—ZS˜ÚhmY€T[iQŒ†¦¯LO^ž”¤oxä•£µÒ»Â2”y­½•š¡œ¶¾„ gH¦~×Yå®3mNßÅGëëšÛšjÒ­ênlilhið ùƦÆ\—Ånñú¼3ãÓã.¯‹*Ò†¡±!»ËnuXýÃ~þ¤$è˜ífrF&F ÷úz‰\¹~E©S®AŒjŠYO¡õeJ·ÚÚÑehnUÕÕ¶WT6•T5×¶•5vUµkꦭ½“b™—ÒvìݾPŽ‹Ð9º—ßéß $YÝÆE1òù…¦%ézÿl›ÊÖ«qô&kÂ3•ûÏ©vPj×á¬îN³J(†¾Ã"ÂBÃBåPø!AØÚ—'—¯^^«±JBë+­CmiWš[Æ–nc‹ÂÔª2·©­í䯬Áe $Y\úE1›€³_’Á±aƒ«wx~Û?2¤²yª¶²K£Æáèó ~„2=;­Ô®=Œ ÄFVAem[s¢±uê­êšÆª…wø=ýkx¨5'£“£ B¼qpÍ`dqXj›ª;4-&·†Å×ZNkS4´×¶+ÛþîÞ¹ø5FMÿ`ÿØä6iÍÈäØÈøˆ£ÇÑ­é&„_K1ÕUMSUUCùÚ“ÆŠÆöñ¨@±¹mJ½R¡U¨tªµ%DE]š.½E¿ð—Á_iŒ„À„êÌZ­i §û~o™{#–ÃL„±¶EpD‹þºü«Ž‘,kBdŒdY‘1’eDÆH–U#YVA¾tŒh—Ö%§udŒä´ iÕ0šíííÕjµuuuyyyIIIáááÛ·oINë ¡hÔÒQ=€0€Ä²1ºzõêÀÀ€Åbioo///ÏÌÌLHH é÷ä´ŠFÝ(ÕH,£ëׯŒŒ`Ê ±¹¹ËF£àyDNë ¡hÔÒQ=€0€Ä²1ºqãÆääd¿ÍfS©T4˜˜¸³rZ E£n”Žê €$–ÑíÛ·ñ…0ˆS¤!ĸá&Kå´ŠFÝ(ÕH,£»wïbÄÎi1k8HÚí’Ó:H(u£tT` ±lŒ>úè#è£2bÐh‹ 0]rZ E£n”Žê €$–ѧŸ~J5¤>N‘†ÔiqZNë ¡hÔÒQ=€0€Ä²1’“œV–dŒä´ IÆHN«dŒä´ IÆHN«dŒä´ IÆHN«dŒä´ IÆHN«dŒä´ IÆHN«dŒä´ éÿkûôwß¶ö IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/settings-shortcuts.png0000644042355400116100000004124211675570700021764 00000000000000‰PNG  IHDRÓ±‰5¦ IDATxœí½p[Wž§;³S¯j·kjf_ÕÎΦÙyÝovê…ÚÚîíÙ·==–ívÛínÛ%+'+ST`Î9‹9'@$ÁL€D sÎbs’¬÷#®…†)Y&- ¤ÿ¯¾bœ{Ò…Âùˆ àþÉC …B¡P({åO½ …B¡P(¯PÈ<( …B¡Ø/d …B¡Pì—¯™Çƒ677×××WWW—––æççgggïR( …B¡< ܆O€-À`ðXÄžÍÝÐaÄÉÉÉ‘‘‘îîîv …B¡P(”GÀà °8Ìþ‹Ø³yÀYÐ.ƒ±z{{1´^¯ojjj P( …By¸ ž[€3Àà°ˆ=›„æ‚!à2ƒãJ$’ÊÊÊ" …B¡P(”GÀà °8Ìþ‹Ø³y,--MNNÂ_0B¡ …ÅÅÅ,+‰B¡P( åQà0xlÎs€?À"öl ЖöövX †ƒÔdffÆÄÄøQ( …B¡< ܆O€-À`ðXÄžÍc~~~``@¯×K$¸ mïn'‚ ‚`¸b‰——WTT<¶g€9À`{6ÙÙÙîînÈKee%‹Å‚Ñ8ü ‚ ‚88|jÉÅ‹!ðØœæ€EìÙ<îÞ½ÛÞÞÞÐÐPTT”””äçççð3$‚ âàð–%+W®À` p˜üAæAAÄó„̃ ‚ ûáóЛô-Æâ‚?‡ÿ$‚ ^nìm­í­9œœÒêRAµ€8P”V•æpsÚ:Úþ—’ ‚x‰q€y@;î?¸ÿå×óàË;ƒ:гµµÅ¯à“yAûŠÌ¿^cŸCcü\YYfn/×Öf¨ª®båå¦g¤ágUu¥ÁÐ:==½°poyy™iOÙ×@É<‚ ˆýÆ‘æ1uw ’‘’šÌæ°+*ÊE¢ºÊÊ @PS[#­—ÖÕ sr²“rY9ÓÓ»Z åYBæAAØGšGww‹•[_/ÍÎÉ ñôôpqqquuñðp÷÷÷OJNª¨¨hjjÊ/ÈëéíÙ—Í–b2‚ Â8Ì<îß¿¯T*²²3#""\]]ÝÜÜ<==½½½}}}Ñ+À’ððp.—›—Ϫonmm=a³¼ÿÞ½{›››»YèÊÊʦ%O¿Þƒfgg§eiii—×z666vy“½ƒ2‚ Â8Ì<°Içå妧§¹»»Ã9 PàààÐÐа°°ˆGILL¬®®.(ȇ7<>wOOdÓíf¡,Ëh4ö÷÷+Ч4ƒv\¼xÑÇÇK¢££Ñe7òÑÕÕõô‘xÈ<‚ ;à0óX^^ŽŒŠˆ½ãåååïïçÀÏÜ97>>>...Á’”””ÚÚÚ¤¤„ÅÅÅ;åýûÅÅŹ¹¹±±±kkk¨Õh4ÌQN7>>ÎT–••UUUa ½^‡---¨Çd2›Í†.ؾ 2== íØþlÍ—_bXô…Á“ð°££ƒÇã©T*hÐÀÀ€Á``ŒÝ1Hgg'3òÌÌLyy9„inn777•J%:¢;ÖüÐ"LÙÙÙ˜ƒœ7Ï’yAvÀ‘æq'6&++‹y©#&f»ŒÍ&‘šš çÀÏŒŒŒ‚‚±X AyÜ<&''ÑÛ9:¶µµ¡F«Õ¢†9Šqàóóó¥¥¥R©ã>|5h“——·±±!µN€–X³uXÆ<¬B€uzxx,,,LLLÔÕÕ577‹D"hÉdJOO‡d ÙlÎÏÏG=F^__ …X³@ @ãtuu¡€ŽèÞÛÛ § ãp8555999Œ3„yAvÀ‘摇ͮpçÎØØX°gff2/{ ÌÜ9W¥RÅ'Äí0Œ€½Ò€[¡P`ãßÚÚzÜ<:;;qm°0WWW«yÀH0ãÒÒ’åí&JH€uäæÞÞÞ0h —ËÅ©aI°¢ÙÙYÌ…¾«««,K£ÑÈårfd¬eeëßÀ3 2™¬ªª #`@œ/ÎOÔ½{÷žIžkÈ<‚ ;à`ó€=À›ÍÆþ’’’œœœ––Æãñ„B¡H$ÂÖóH|ìj ¶vìß·o߆„„„¸¸¸Œ[ÍãgeeÁ3 öxlÿ€¨¨(«yÌÍÍEDD0Yššš Ö‘¿É<°BŒ€¾P™²²2 ˆŽqqq­­­‰‰‰“““8 #‰ŽŽf®ª<´¼_ËKOOÏ·mP900€eGFFŠÅâ'¾sÖ!!ó ‚ ì€ÃÌ;wq1?:&*"2<22<))‘Ãa—”””W”çåçÅÅLJEF…£åúúºíDؼà‰––( <@­VcGÇfMXàPww7—Ë]]]ÅÂÜÜܬ汴´„zø6~øMaa¡ud[óÀOŒàîîŽöR©}¡X9óvWTC>àI¨gÌS óQ,G‡‡‡™w0×VÐq~~¾­­ÍÓÓåg—†ç2‚ Â8òû< 9YY™€´´Ô˜˜¨Ð° àÀàà bb¶ßpêëë“™•1>>Ž-Ü: ºÃN”J¥õ•‰žž‹3ð÷÷¯­­ÅÑsçÎÁ3°¯‹Å⺺:=zô¨Õ< Дòòr‰D’••ÕÚÚjæáää$—ËaB¡0$$?!XÄíù|~YYÙææ&fÇÈׯ_‡ #cŽúúúêêj<8Š6è‚Êüü|…B)---²$00pyyù٥Ṅ̃ ‚°Ž4¹¹9— ó`³Ù‚‚‚ÜÜÜœœœôôôÔÔÔ;w¶?öâæî–žž600`½~ñÐb:Îös¶8 ¥¸wï¶v‡#“Éà%SSS-Ÿ’eäC*•¢fbb‚y?)ó2¢­­ÍVkVWW±øüGÁ8ÌË-Ìëh/‰0&ÓxaaÁúјÑÑQfä™™™šš Î\!‚£h4ØFSS3`¬³««Ëvjdž̃ ‚°Ž4ˆ‚HT– Õ@ûظØèèèooowww·B›úÁÙ¡_ÖyAvÀ‘æ±µµ522RV&  ö÷÷óò‚n¸¹¹¹º¸Üöðc±rÍfó ýÝ /JÈ<‚ ;àHóxh‘éééfus¿(=#-))1!!>!1>5-•Íf«TÊÑÑÑï-¥ìSÈ<‚ ;à`óxhyÿÄæææòòòìììØØØÐÐlã,..nllœ¯ø|éCæAAØÇ›‡m¾|”ç°‘Rö2‚  óؘ¯ŠÎs, ^샇<Ÿ•²»yAvà ˜ÇæÜèPÚ±>Ÿôyþ‡N·¿éûhuªÿ¹mª”]„̃ ‚°ÅÿWëå¿Tùsý•ÿ} èÿ–³ž2ëƒæççŸxh``à¹Ü†Í:&úozE—……6<›cíŽ^ÌÛia38A<½P¢Ý‰™Aa7f¥‚blüV½¨©©©ªªª¨¨(++ÃoöÅÅÅ¡°°Ífçç磒_Ì£{ØîkÈ<‚ ;à0óÖ‹ËËËÊÊeedCPRß(áó¡|ÖÁãr 9.›Ã)ÈËÏÛñ>Ês™AaöÙ–ÅÅ“É$•Jjj«‚ÒÂBn~A^.+';'+''›ÅÊ)`çÃBªª*Äâ:­V3?ÿ¬_KJyzÈ<‚ ;àÈïóÀϵµµ•••¥¥¥………yøÅÜ~Þ»woqqqyyG™7.ìËfK± ™Aaÿíé”2‚ ÂyP¾ ™AaÈ<(_…̃ ‚°Ž7”———÷úå”ç2‚ Â8Þ<¶¿öªU_YUÉ|åùîwÊõõõ5KP`n}‚î[[[»éûD#?eyXÀ†%{:…éééomçŠYí~Ë™Aa„yÔ×K/^ú"22\Þ(Ÿ™™Ù͵˜¹¹9'''//¯ÐÐP‘Hÿ0™L<ï[ûbÆØØØ½ÞPËåšÍæoZLeeeLLL\\œP(Üå鱌èèhë×›~Sð”&&&Â{0þ·6~–yAvÀñæa¹A|CNn¶¡­5!1.#3½©¹ieeåé³NOOÃ9°Ç¯­­ŽŽ¦¥¥õõõiµÚŒŒ eîlRSS£Ñhfgg™ïg:âPww·§§gGG‡L&CF˜ï5GTZïgk0ðpjj ­wiAË¡¡!ëkxÈçó«««±ŒX‚R©|hy¤§§G,«Õjæ»Û›››á.µµµ°LO:uêTaa!ÖƒCr¹nõ´µµÁ¥°B ÂÜœÅöV,˜¥¾¾G™WA0Ówbbb7`ß2‚ ÂóP(lNÁêÚÊììL£Bž•Éár†‡‡Ÿr鄹?³ýcær¹Ø‰óÀÎ]PPŸŸÏáp+++±’®®.¦%Ü{¿³³sTT”@ `±XR©ãTUUeggGDDdeeaUÐ(ÅŽûÃÁ3°Çà ¬æoÀ\ÖWP&''{{{ÑÏCYYŒKjjj‚Cà)ǘ ¨DƒÓ§Oã!Fprr¤Xž@…BQQQµeffb¨æU–”——Ãc°Œ˜˜˜ÈÈHÔÀ‡ö(_ ™Aa„y¨Õͼ¢Â…Åù¹ù™™Ù»#£Cª&ENn¶¹ÃüMon€yܾ}¿ë3/ðx<Ô0æÍxff+ÁN '@J¥Â¾Îܰ>..{9ú 0x?Ö‰5ÌÏÏ£ËØØDÄËË ¢žž>88¸¾¾ŽChó€s@m•H£Ñ@q˜7šXƒ5 =º£€æää Ë7d2 ¨‡L ÀÈúº¸¸@#PÀ “““1#\G"‘ÔÕÕí0úúz¡PˆÆÐ 6›½¶¶ —BƒgüÄ™Aa„y´´èŠKøScÃcƒwg¦Ìíâí=·fxxø)æqêÔ©¨¨(ì»Ð ìî‡1ìßX—ËÍË˃C¤¥¥ÍÍÍÅÄÄ@2°m£’Ùòñð¡å%а°0æ·|>¿   ::úÖ­[hÎ\va’’’’ -€=Ø®¿¥¥sY]ÆoÀй“-Ôe4ððð`ddÂÖæÚÇðð0sŽØõ¡ÖyWWW¡˜gÝÛÛËœ`Šôôôêêj …J̵¶¶†C˜±²²’¹<„5h4롇–Oß`Œv@8˜ÆÐ¦ hŸ™™‰Õ2ºÁNvó¤==dÄK‰Ö MÏJ7u™¬…c ‡ÇqøÂžüGŠs‰º’Ó’ñp÷}ë¤u¥¥?âUæ@˜ÇòòÒøøØþÝÓ À žËý²†Ìƒ8 à7rÈдjð³½ë•°‡Ç_·ÐõLKX2n¡kÓ1™Eõ¢£Ç6éšj%µ(4ëšµ­ZNѶy þGÂC`ý›ôÅ,ÛSw·£~»Aûø? Ô %`^B@G½I–XŒ¡ýk‹dé :ë"·—mil;2&ÅhhÌLýUA×jÚ)8©óÎÇ'ǧf¤ææçZŸ e»NLéŒF ËL RÒS‚0¯Ãÿ ‰W–aû¥¥¥¸¸8…B±ã(Ûy¾€öüYç[ΟýÜÉÙ©AÑ€¿–ø5ÝÓÛó‹ _Ä'Åcµ6–«äÎ7¡.n.B‰5b™ØË× Ýó8yØnoÞ¾ùÿó1ÔÇŸ~¼]8ö9´ãúëóÂ¥ hyêÌ)MËLC_•FtÕéjpXð¥+— ))8Šõ`öõ ¬!;/Û醚¢e`pàm×Û_\üâ³#Ÿ…Ù¾CX¹y¸U×Ucû—Ê¥Þ~ÞgÏ=qòDlB,Ô–€Â•kW°,I­WC8’Ó’¯8] •)e¶ONÍÇß§¢¶¢±©ÑzéV+=+©l¹{¹767nŸïÍëž>ž˜íÿðáÞúù[—¯^¶} ž¼æñÐò½^t›º§‡Ìƒ8 ¼óî;Ø\•åµë×°›ÖIë°‹Ä;nem¥µ1—Ï=qꄨA”ÏÉ/*-‚j¤f¤¢L%ËÍÏ…¯Ô+ê8†}]Ú(e ØÅ±ßc³ÿð£á+Ø›y%¼ã'cÃŽKŒ‹Œ‰¬Õ8]wúèãðÏõ HJI²¾  É *­ª¸¬ØÃÛ»ø-×[h,” %2 ä£Y×lmŒCŸ|öI¥°ÁZÚZÐ+§hVÀZ>;ü™ºEÍ.dCP ðŒ·ß~ݱxœ;ž„òêrˆ‘­Ê„G…Ãc M(TÔT˜:¿z¥JXåáå½@953CÁÆÐ·AÙ€S€<)ÕÊôìtxýK'È«b”o ™q@€y\¾vÛ3ÊÞ~Þˆ¢’"˜K A̵©\Š=‚’“Ÿ™hÒ6A/NŸ=}î‹sð€èØhy“ž«ØQ@ãÏ}ŽMƒ05üªÓUæ… Ž¢1F8zì(¶jŒí"ýý ¸í–÷‘\ºrI­WCb’R“ ÆãñÇm͇ 4ÍΞ? ÏÀÈð›Ä”DúÅ»¿@c¨›Ç6u™ .~ü!jÐS£=8}æ´¶õ×Gj%µ5âXV‹ŽV%B»§{>7S¸¸»Àoà:Ÿ~ö)FÀrøóõâÚ¬Ü,‰Ãÿ”‰W2ÊW!ó 077¦Ì˜GIy öWìèøû‰ßéYl–µ1¶p¡T˜š‘zùê圼¥F ¨¨©À¯ø¢zöïm«8õH8N}Í<àÌËVóp¾é,j¡{6výí÷¥¶j!XÆm·Û¶ïÀæ]X\Øn1(NsK3vzæ«O4„äL­ÑkNž>‰Æç[ÎéÙéE¥EŒg„„‡ðŠy˜Q¦’}üéǨ MËLÃÙá\êë­o*­JgؾV¢iÕ\½~ÃZåäºz¸BÎ<¼=ðl@¡ I "nãà,VVXd˜Ãÿ”‰W2ÊW!ó 0üâΔóÀ¾—‡-yû]7œ™-Ÿa{s-â*ÔŠ°H‰®MSY[‰-™/àC>à§ÎœÂFŽîL¡AÙ`5E³¢ý‘yÀ ’Ó“³ó²•j%€í50¡DX]WýÑ'1 ù…ØÂ¡•5•gÏÅÞóÀJÚŸd·]oŸ>{g…ºvýzÁ3â“âUÜâWïý ¡‰©‰8Ô3¯‚`´ÌœLœd¨¨¤ÈößfFvT¦I×TVU©7é­‡ÐþÂ¥ ð¤Ä”DÈ žÅ眜ÂË®GV€Û±ÕBUÏÖýýúÀ eGÈ<ˆö`¦Ïɇ%°Ø,ç[ÎNÎN‘1‘Øq­ahóÅÅ/ŽŸ<Ž–ØkË«Ë]Ý]¯:]õõ÷•È$ØkoÞ¾yî‹sØõ™Æ?á<þª£ ÉÀ Ø•Qƒ¾ß_ÌrÓå&sµûôõ×8†1™— ÑqÑЬ ‚Ѽ|¼x%¼vËË0¹¹åkæqòôÉ+×®`´A¦€"àçïÿð{4±Š8, IDATÆ:#¢#0µ«‡ëo~÷Ô¨õjÔ` §N8}Û›P–ð¨p, fV#ª±}9e¸ËgG>7ˆÛ™Ïßf§_¿yýêõ«ñ‰ñž*až.<Ìõ,‚°?6î„„æŸü¤ý7€ñ7ò~}Ø9VQl¡…­§KçvuÇyʳ‡Ìƒ8 à ëåìÇÌ/ô¨„d@vþ²Þµ}½C¦’áó·ûºJ«’7Éѷݲc —)e‡)`„&í¶»à'ó1üdj¤r©¨^TßX{s»ås­J²AÑðøÇP!"˜G™y·?òèM ÍÖ\Ü]ròs°B,ì3êšä*¹ºEÐX¡V¥BL-¨\¾z™Y<&ÝžB­|ü¦®M‡1ˆõí¥ ™Íc{z{ZëqâÌkÌ3iì0bÆÆ¦FÛ„=q°y˜[^{Mÿç®û³?SÿÙŸ%ýýÝ“%‰Õ=nym‚ÎO=xÓóËO™{rrsÕÔÔtvv~Ó^Ìfó.Ïä™ñŠƒ86!ÖÝÓ=8,ØÕÕWÌ{^#»º»rùܧ·aÞÝ„dæd~ç‰ìBö-—[Ї?ŸñMó8t¨å{ßÓýéŸjÿÕ¿j¼|¦>÷†R‘UgfÌãîÜ7šÇàà`nnnee¥H$JLLdîDz(È’%ÌC´Ñëõ-¬]^^^\\dekkkuu5kkk<@û……Ûo&}ÕBæAšV ölN§VRû¿b¼NZgû¶'Òjj­VaꊚŠ=}'é„ayu9ýC&2Ž7æC‡”ßû^ãŸü‰ò/þÂ|ç¶™ý¹>û5 CJM÷ç^E“3KOœÒPXX¨R©666 ÝÝÝ%%%«–Èåò„„„°°0N‡CŒyÀ3 CFFFhhhmm-l£­­-<<<55µ¬¬ ‡°T___‡Ã|™ú+2‚ Â8ú}ì@åCU|¯òÿ[ÃñÿÙ]èÕS|Nòž8Ï]Zìåpwfþ‰³Ââããm-ùòuF±˜ŸŸïììÌÌÌ\^^fÌcdd„ÇãMLLŒegg iµZ—ÁÁÁÅÅŬ¬,æÎ´b±ø•½4CæAAØ›ÇH[àP󡑦ïµüh°áŒ:åMCÁIYÜ/[ÙgTÉï‹¢Þî,¹º8ª{|Ö¹¹¹ððpë]ÖZ.¦à'æ…R`üõõõˆˆ(cmmmç¾%0,’¹±-Ó ¼¼¼’““;::öïö1oJÿ¨Oaà^P&ÿº¯ÂyD~çñYÓÓÓ­w€ƒa477oll”—— Œ)ñññ 0æa6›KKKaP ,¬µµæ‘——ÇtßÚÚêî©aîqÿÝwï9dA„88æñ‘™óëá†¨Ž²Û“Mñóíü»ÍI]¥WF냇êßussS"‘p¹ÜÉÉILZPP±€y`v¹\/éíí ¾wïcSSS ´D!&&¦££ÃÖx°µ:Ù’×_u³¯ìrŸàRŸàb_é…1eâý§}™åy…̃ ‚°Á<þ˜/ïo¬Üí˜ï•Îu×Íu‹•÷מæJÙEÈ<‚ ;p°ÌƒâÀyAvÀæ‘^¬6ÖË[j=µ©a7™®æÙ Úvùw.´u«ŸG¡ú;Z:Ï^0t5=¥ ko䔲É<‚ ˆ}Åæ‘’ŸÀ÷¼ó¾Kò'×ã·»Â{Ï^pNøýw.ÜNúøÙ —Ÿ¡p#áÏ^¸•ôÑS n)Gr£É<‚ ˆ}Åæ›î’úééðC6¼þÍÂNDpœÒÙIdAľâóHbÝñÉ:u:ì…×ñƹ°· 6• ‡;à—s69/ŽÌƒ ‚ØW`© Á¬K§B=âõs!ï\ ùÝùà_ž ~gûgÈ;§CÞDý©7,?í§Cß8½»ñ·[†¾±+9¸&‰Ï¡«-AÄþ∫-Yá·?9tˆáTЗ‚~*àg'´p&è­³AoŸ þùé 7­Íç|øÛ^é'BX—}2N^Œü%j.G¿g;ò·â›yÚ)ö·»iy#þC¯ôã»ùE$,ß)­€®¶Aû‹Ì#17Æ+íä‰À× àLà;~w"àóp›€GXk¶ÛrèlèÏ“Š}òl~}z¡8)­,ðBÄ/Ãò¯•Ê2-ûèëÀÚyxrÇà×Ñ=„u…iùU¯?¶ùjRKáÐB®8éQË×mÆí¥Á'ãL2‹®¶Aû‹#®¶ä'e_:ðÚ©€Ÿ¹„Ÿ õ ‹ó óz oüô޼v&àh¼ƒ+Q¿®o)wMúüTЛ—#?(ƹ' Ësj4TçÕÄ4¶Õ”4d\Ž|ÿdàîÉÇŠ$©" ?šsûLð[>é§‹ë3øÒôgôî€y@Ç—¦ Ùö˜Ú¦Â¾÷ùÐwÐ&¹Ä™(³"4”uÕЫžìkKn'| ¹Q´ÕrE‰N1¿{|a/.·ÇgÓÕ‚ bq€yÜÉ ¿ûÉqÿCWC?á—qûúGF†Glb6›»»==Ú®.Um]å­Ð3Çý÷{Í– a¿ªQq!>égbþp)âýSo†²œúÆÌáùή‰G$ÚÒ€¬‹Îw>Ê­ŠöL9å›~¶q+þS´iëmöϼp+þ³Ú&^l¡ÇÅð÷Br¯¥”x§žÎ®ˆ@´)%3•ÉsC-GËd9—#‘CÞZ…IÓËBP¿cU/4¡¹tµ… ‚Øw` 9Ñn‰ÇNø½pC®™L&MÔjuEE…V[ª×§´´DÔ×Wy‡;Ÿðyó˜ïk¶ÀEnÇæÖ% ›‹ÄšRèŹ_@ªUÜS?Cƒ"qjpöOœzÒÿÍSo¢à“vmÊd¹LÐ…‚Úøœ«ó˜/À|[—ÄLÄ´‰f»05îIdžÚ"Išoú¹~¯ïXÕ oÚ¹dV<™A±¯8æj‹ÆÅã>oF¦ùjuš¾¾¾~Kú, …Zmc{»Êd’«T ©Ñ§¼ß=êý϶ó9t.èÝ“~?»ñ»ÀÌKµ*ž{âñìk%õYG½_Cž(5(ë²_ÚìÚ„c>¯÷}½LΠȼ„6ð¦ !mP(¨MÀ!¦l·&Yfy½¢±m¢ \8–“_úÙå‘uÍ|¿´ó;VõBsóÎgtµ… ‚ØosµÅ)êã“>盧úúÇÇÇGFFÆÆÆ¬…ÞÞÞêêêžžžÎÎÎêêª|6ë¼Ïox¾vÄóŸ­œúÜâZä‡0˜sA¿â S<’Ng]+–f1 ëR3/;Ç|šRx.è—çƒß«Qò|RÏ£ ‚iS,É Í¹~Ìçè÷ÀÌ+§Þ¹óÙiÿw˜qNøþ ã«Û¥'‚u«°.5gß½uçð…8Âäüê8Û%½èe^K˧«-AÄþâóÀ/Ö.±Ç®Æ+fwuu‰Åb´—J¥‰„)…B6›-“É*-)äq®ú~~ÄãÐa÷¶rÌëìëEât¾$“'JOá x7(ãj‘8ƒiÀ©MöO¿tÒç­¨q ¾¢omQ«ÕŒ:›ÔX …8TQQÊȸà#.o~êòSbÿðO¹’š—HæAAì+Ž¸Ú’}3òèÏ ùl~ ¯¨¸°ˆ_ÈãsyEÜÂ"Î6<—Çæ²9…Ûp nû_üôækŸÜú)±¸Ç¥«-AÄ~㘫-Þ >rúéáëovzç[9âôÎÇ×^ûøÆ?}|Óüôy~ú …çÂÓ&ºòIl&]m!‚ ö˜GLzø•à/}tÊó—ç}s)ðÓžï>½p%ø£ÓÞ¿ºàÿÛ«!çÂyÿß|çÂÎù}ðì…³>ï=¥p'Ï›®¶Aû̃WÆÕ™M½Z…¾NgVì¦ÐÞÛòìm»ü;”­¢g/˜û¾{Amjxö‚Ê yJ¡É Í`§’yAûŠÌCP-øòË/w34Åž¹ÿà>¿‚OæAAì+6»ÓÓªfµ¬Qa¡±Q¡zðàÁóßW)ß2‚ Â8Ø<ŠJJOu=1èÜ… sÏ]ô OÙ|”û÷ï?ÿ=–ò¤yAvÀÁæÁÊgßvMöö)õð,q÷(öó¸ºÇ_¸âtñê5péšSVnî/ÍÛBAOÇñæ‘’š\ZZbÃSTÄ‹¹=5õí_óEyöyAvÀÁæ¡ÕiSÒ’ÓÒSŸHjz \dssóùo³”ÇBæAAغW-å«yAvÀæQT^43;3;?K(îÎÜ-,-$ó ‚ ö{›66^9WFDø|c§Ñá) ‚ ˆ—{›AA¯2dAAØ2‚ ‚ ì™AAöƒÌƒ ‚ ûAæAA„ý ó ‚ Â~yA/-¦.Ó‹ÅËt:ßtdAÄKv>A+‘‹«ÅU/ Bi­R£h3?Ụ fC“®IÞ$—©d/XªºEýÄïÅ&ó ‚ ^B •uR…XkPëÚ4/*¢BX&k’™:¿ö‚\¤±¹±¥­e`h`hdè… °æ¡Ô*;¿›Ìƒ ‚xÙ0u™$rqƒRÒ7Ò5<Ù?ò‚04Ñkêj-«)5´lOGkÐjôš¥å¥_>øò –:¿0¯P+ZŒ-;þtÈ<‚ ˆ— ˜Gµ¸Jkhžìï~ä—êMzÛÓQëÕ“áÁ·äþ×q|îß¿¯Ò¨ M;þtÈ<‚ ˆ—G桚èíëúÎt udªV­VµofuHn¡Çô,~+£SCEe;Í£¹¥ÙÐn¸ÿ ÙX]5³ÙU'NT9²ÍáÃu/Ž«Õ[››ßÔÅn!ó ‚ ^ ¬¯y Ž÷ôŽv왑Žö~S[¯ÑÐcLäKb¸q|u _ëWÝdjý.ÑΑÉÁo2­û[›°‰¯³¶¼lÎÏ“¼ÿ~ßÉ“CgÏž93xê”ñw¿“|üñd«~ssãñ.v &ó ‚ ^ óКûÇ»{FÌ{ÅÐÓ–Y.É«©×t´&ð%áìF¯,¹wŽêrL•ʨgÚ{ô%•¼Ôì$6Ÿ¥ÐÖw·£RªÊÕR¦Aש^%Rhö4õðäÀ“ÍÃdÀ^¾±¹aËÚÊr—+}ï½þ#GzÞ|³ãG?ÚæÇ?øå/MïýJ|ø³q½ÞÚxeu¥EßR^Q.–ˆGÇFw õ,Èåó÷æ¯Ç‚É<‚ ˆW‚¯Ì£µ©´ N°{  êv}RI½[Jmx~m¥BʪõL—\O”æ©n'Ö¨Œ-hfìn p¾åt'!2—™œ‘ i¬í2Å&Feä¦l3h¬ª$¥Ç)µ {ZÀðDÿ7™öòõuÖÚX¹Ò÷ß8r¤÷ÓO»Íï¾kþÿ£ûÔ©?¿ßü¦íÝwë>úh¼Í€ÆË«Ë 1)‘Íegfe£~emeîÞÜÌì Ôaumum} ï-ÞCÍìü,Ž¢Íêú*Ž¢žy¸¶±¶°´€£‹Ë‹(ƒ«×®öö}mÛ`ÁdAÄ+Õ<úF: »ÄÜ×&Ö4Gq$QEšŒšö€œ¿,±OF–$ß$7 Fsdª6ZrŠó"t²ö^½¹ÏP-*‹¼¦35ÝIˆÊÈIéè7ÔJ+’Óã¡»Ÿtš†Æûžh­¦ÖõÍu˜AÕ‰½'Oö:ÔqölwCCwnnÏÍ›ã*ÕxuuçôüüçÒŸüÄÄ+Dc]‹îNìþþťŻ3w9\N¨:"–н}¼/_¹ìæî¦Öª'ïN^º|)*:êòåËW¯^U¨°vs{HhˆŸ¿ŸB¹ýpjzŠ•ÇòðôàrÇ'DZ ˜Gß@ŸíÚ°`¥FIæAA¼ü0æ¡Ö«z‡Íƒm»ÁÜoàIä¹â@¶.®¼3CØÃiè-UôÖjú ƒ½£Óƒ“Ñìe›¶s ÍÛߣ²®´cÀÀôÕ››o»ß”7‹c"S³Ëjø>õÊ:´ÜåìVÇz‹Ê¸O6ËËdm¥âÈáÁÓ§Í?ü¡ùÇ?îrw2&‡†&äò®#GZÿûoÿ§jø_ÿ«]€ÆEü"~1iyÉÒquye,,.””–´è[“ÃÂÃÆ&ÆÞÿàý̬LÐ%0(pfn&99m@Mm z‰Ä¢YÃØøD¤º¦zie ŽÒ×ß÷µµYÀ‚É<‚ ˆW‚Gæ¡ì2™û[wC[> »Ê%]\d*2‡·Ç”šÒªÚ ÄærEg{ÿ„®s$†S¯jÓ ñ-Wçraq{ŸžéÛÚ©¾âtQ¢¨Ž÷ôu‹MŠ ñᕱM½-»œÝÊÀhÏ“ÍÃØŠ½|yuù¬,•~d?úQÏ¥KsSSÓr¹ùý÷uÿð†þ°þ¿þWCAç²r‹KŠaLßÅåE€ÂÔôTƒ¼!=#ýÂÅ >>>#c#'OžììÇ!ˆ…Ÿ¿ÄÅÅͬó\¼tÑù†³“““»‡û½Å{W®^ééëùÚÚ,`ÁJ5™Añ À˜G³^Ù9ÐfêÕíc¯®¶©1,_è•£ôãƒx¦¨â¶Ä²¶ìc¡´½¾¥'Ö'‹4f ‡E%eĺ5L߆f‘‹çMüŒŠ »vãrCs]´Ü/Ø[ªw7»•¾‘®'š‡Þ¨ß~•biÁ–²Ï>8vÌüÿÐùá‡c ÅxCÃhVÖr_ß4Ÿ¯ýá›ÿê¯$ßÿ¾>…–‚rA~AþÌÜ Êp^§Öªñ0%-%<"\,gegùøú ?ži&o”ûúùÂE 0뤨Š„m¦6£ÉáÀh—¯\îêîÚ±6ù ó ‚ ^ óhjQ˜ûômÝš]ÒÚ¥nhQ$×yeÉB¸:Ïôº°ž×n\rõº™#ÓˆP–’Ï´QµÖ‡Eær2ö´€ž!3Oðdó˜_œŸžŸ¶¥S*ªýíoŒ?ù‰ù?ÿgí¿ý·Šñ/äú§²ù/åÿæßhÿú¯ðƒª>0´l7ž›׋CÃC]Ý\}ü|òÙùãSãw'²YÙ·nߺírÛù¦³_€_ï@ï•«WP. ò†À À©™©zy½·7¼DP!¸;{·£»ãNìíq|}0&j®ß¸ÞÞÙ¾cmàÞâ=2‚ â•€1•VnèVkÍŠÝÓl”5êÄÂÆª$na\~ Ž_%-ÊË¥M5-’f£mÄÊê‚✼¢¬´ÜD8GRfl6;5üJŽ\+Rê¥ÖÑz)zíi]ƒ&ž€ó¸yèÚt3÷f&g&¿ÆÝñN™´úƒ÷õÿøcãúOÚý¯Õù—Mñºÿïe÷Vû¼Ï ›œžèî‡"ÅÂ’²N!§¨¤¨ZX-’Šºúº†Æ†Ú»Úœ£g güîxWo3øÈÄjP5w›;z:PÀÉé‰ÞÁ^c‡-¡/¨Á8cSc;×639·0רÜHæAA¼ü0æ¡ÔÊôMj“|×È”­R™¶N¤¬¬”””Öòµ…å"~Mƒ@¬ªB½ÊPfÅÙW/>ŽO‡Ê ÝËtO £¿íÉæaÐݽ 3ØÁØä¨QX]ñÞ¯ÄÿÏÿ-ýû¿—üÝ߉¿ÿýªï¿úøÑÞ¶Ú´Z¼|¼Ü=Ýmñðô+åø™™Ÿ!ó ‚ ^ óPhtfeS[ýž€=([%-"¹¶¶!×Õ5¶ˆQƒú½õ0÷žhÚVíäôöëO`|ØT/Vd¤5¦%3¨r2»[µ#ãOjlG JMdAÄ+Ì£VR-k’¨2E«øE~cèÔ>þÙµ^­nQc/|•«äº6ÝŽ?2‚ ⥣«]®’UÔ•)[êõÍ­]êm»R$¯©¬«0˜ ¶§Óbl‘7É·ßi11:65ö0962>bì0ÊT²VSëŽ?2‚ â%¤µ½U, ªKJ*‹^ªø•uåÍ-Í;ÎÅØiD%vq¹JyPɱÚUƒ¦Ucê2í82‚ âå¤ÍlÀÎפkzQ°|cXËã[u»E>ô&"Œ¾ÆQIDAT½®M§5h_°TÈßυ̃ ‚ ûAæAA„ý ó ‚ Â~yAa?È<‚ ‚°ûn£¿E¡P( …ò(d …B¡Pì—çf³³³ÝÝÝMMM•••,+&&ÆËËëâÅ‹ŸR( …B¡< ܆O€-À`ðXÄžÍc~~~``@¯×K$’âââÌĮ̀¨( }…B¡P( åQà0xlÎs€?À"öl ###ííí¡PXTT„Aa4~ …B¡P(7€!À` p˜ü±góXZZšœœìíí5 …ÃÁeX,V…B¡P(Ê£À `ðØœæ€EìÙ>>111ðØœæ€EüdóXZZ€¼466ÂhÎü@0¾9 KKKÈ<¶g€9À`?Ù<æçç{zz:::***RSSÎü@0Þ9 ȇ <¶g€9À`Ä<@ ¼Lˆy@øù8óPhrµœ`„à_sæH@ ü²ù¹Í£»§;Ÿ–_Ó\SÛ\K0*jšjòéùª>Õ™?( ð æ ÌÚñðÑÃoÿ2}ûèx ŽÄÏûûû• •Ä<pªœyàå5Ö9$ãvssƒº¼œJ¥ljn*,*ÈÊÎÄmSs£RÙ½°°°¶¶º±±Aå“8Õ€ó Âis–æ17?ÉHÏH+¥•64Ô3™ŒÆÆ†ÚÚÚ–ÖN;‡ÁhËÏÏKIM.(Ì_X8ÑTH¼HœÄ<4ZMU]UIY (-/­¬­lç·«ûÕ†]MŒ¦ç~,¢®+îÿ„&ýƒ¶²ZÏü@" 9Kóд·sòòóÂÂü½½ÜÜÜÜÝݼ¼<SÓRÄbqqIÑàÐà©,¶$ŽÄIÌCÙ£¼ðÇ ÿ÷ÿÿð¿þõ¯óßsù³Ë¹…¹ê>5v½óî;wïÝ}îÇ"OÌ»òÍ•ŒìŒ“7‘«åÔÂÊâÌ$@ œ33‡ …‚ܼœ¨¨(wwwooo___´ :ŒÈÈH:^T\ØÞÁÙßßÿÅòáÃÕÕÕ½½½“Ltsssï0ž})¼G----|ëëë'ü¬gww÷„Ù3Î8‰yàßwáÂ…O/J« ӊã±ðøçÛ8m­&¿8¿¢¦iÂN¡X&–*¤© KÕE5D%@Áм ÈìÖTVÖVþÓ?ýSHxˆP*ìÑ$`2¹9è ý£ŠÃó;»;E2zC´º¾šêctØ%6Ü ¤r):Dê½@ œ-gfX¤‹Š ²²2===á¨FhhhxxxDDDÔ÷‘’’ÒÜÜ\RR oxrìÁÁAÈ †;ÉD ÕjõÈȈ@ xF´ÃÒÒÒÏÏSÂÄbccÑä$ò¡ÕjŸÝ³‘ÇÉÍãÖ[Ô¦²W™–™ö‡?ü ‚ò¥O/YXYPØ Òþø§?FDG Ut\ôû¼@¦L)C[Q§ÈÃËãÂ<9Ј‹_üÛ¿ýÛù—ùèâGpU¯*·0÷›kßœ?]ÁK Ìvæo÷[S3Ó/}Œ4ØÆrprè9Ô'§sçÏ}öùgÐÜe2;/ûúÍëzçO&f&°"M¿æÌ9@xÍ93óØØØˆŽ‰JHˆ÷ññ „s`§®œ›”””˜˜˜|ééé­­­©©Éz½þøJùðaUUUAAABBÂöö6j¦¦¦:;;©½]]]333Te]]]SS†P(Ø”Ëå¨Ç¸\nii)táè* ÐŽƒïÖ|û-ºE[< ›}}}ååå"‘4::ªT*)#AstÒßßOõ¼¸¸X__aZ^^ÆæÞÞžP(DC4Çœ S^^†F'Æsòìs˜àЏç/œ·µ·5ì¢ ÿüÏÿ|ýÆuwO÷‚â‚ÆÖF(È»wî™Ü{óÍ7³r³Ôýêô¬ôÿøÿ@å7W¿yó­7KÊJüýÿñÿñÆÍ1ñ1ЗŠê ÇþÐÂÒâí·ß† °¹ìVVë¯ýëÿ‡âxûy×6Öb,3s3ªCôcimùÕ•¯ %ÍÌf®ûÞûïÁQììQ¸vãšH&:óCŽ@ ^sÎÒ<âârss©·:ââÊXŒapÜfgg—””°X,Ê“æ¡Óé€å U*jd2j¨½èž±²²RSSÃápÐϵk×Pƒœ¢¢¢ÝÝ]ÎaÀ ‰9º¥Ìà ˜§——×ÚÚÚìì,ƒÁH$L&Z£Ñh²²² Èéíí-..F=zÞÙÙikkÜkkkQ@?Z­4Dó¡¡!8MDDFkiiÉÏϧœÉâùÌCÜ%†y`í?f0†fF3ÊÊelbìo~ó›sçÏ!óŸÿåŸQ uøäÓO˜L¸Kem%œV_IHN zöñ÷ùý¿ÏÊË’tIBÂC`y…y”yXÛZ ¤…FÑÙÝI™:„sü·ûoï¼ûÎxãßþßËÉÏHŸñ9uvuF·´rÚÑÏzp&œ¥y$''b1†+ÄÇÇ'$$ €•8''‡zÛeêʹ"‘()9ñ˜y ¬å¬Ü ÿþþþ“æÑßß]ÈÁÄÜÝÝ æ#Áˆëë뇧›!†ž™|}}aÐ:Ž»†)ÁŠ–––0Únmmvvvòx<ªgÌssóßÀ3  \.·©© = CÜ_Ü;ü¡VWW_H^j<Ÿy4¶6¾}îm7O·cæqíÆ5Ø•ãáíñ¯ÿú¯ðŒ¯¿ùúÊÕ+¡¡8Á7W¿¡Î¡ Ì#>9žÚ´s°{ó­7ÛØgÓ‹ÿíßþ-53•2ȘHês¹ZN™:¼üÙeØÉ_~Q®^¿J¯ «ûÕE´¢·n¼ÿÁûèÊÉÅ ¦ræ‡@ ¼æœ±yÀà µµµ¥¥¥X¿ÓÓÓÓÒÒ233ËËËÛÚÚ˜L&–v˜GÊŸ¶`iÇúíêê  sss›™™1˜úÏÍÍ…g(•J¬ñXþ!111óX^^ŽŠŠ¢>d‹ÅCÏO3Ì= -T¦®®¢abbbwwwJJŠN§ãóùØ #‰¥>Uy|x¾*¦—••U|ÈAåèè(¦Íb±~ðÌÙ3‰“›ÇÍÛ7‘†r» ÝÅÍå­·Þ*,)‡ÃA[(fNîŠÊÐÐPÈ< õ”y`è’’$P_uÁd°wbb‚:k„úl WVVT*•··7Ê/. /%Nn¿ùÍo>¾ôñÅKßÿàýßýþwÎp…cæqô}‘ffóÁ»o¾yðX{÷ÊšƒsEKè%h{áÎ?©kªcsÙo½ýÖ›o½ ]@'ŽÏ¿øü÷oüMþÇoÿ‡Ù3‰\B™‡áƒy Ãì¼ìßþî·èðü…ó×o\ç ¹<ï“O?yã7>üó‡èöžÉ=I—äÌ9@xÍ9ËßóÐë×ÊÊh¹¹9€ÌÌŒ¸¸˜ðˆ°ÐàÐÐââN8õ÷÷ËÉÍž™™ÁnÍa'B¡ÐðÎÄàà`aa!Ì 00°µµ{ÍÌÌàX×Y,ƒÁÀÞ›7oÌÂM©¯¯g³Ù¹¹¹ÝÝ݆Îaööö<&ÑÖÖ†[ˆæ1B~eee]]ÝÞÞFGϰ4¤ÌÂÑÞÞÞÜÜŒ¿ö"§¿¿MPY\\,pGjjj*#88xccãÅ¥á¥ÄIÌ{mìl¾þækê sKó¤´$aW`H ¡`h¥îW—W•Û:ØÚ;ÚC8¨! Ù&f&ήÎ%e•¨IJM‚„†‡*{•‰f‹—¯r‚Bƒøb>ZÁ'®ß¼Ž|Ãà c…G…÷~¥6-3íÅ/¯fFsÏáO“ÁTB#B1Ïð‡ax†@ gÅYšÇòò2^ ó(--…|”””äççgeeeddÄÇ|íÅÃÓ#++sttÔðùÅãCóèêê:ú=[ì…R¬®®bi§Ñh\.^277÷øð[²”|p8ÔÌÎÎRç“RocÀ!T*ÕQ­ÙÚÚÂä‹¿ôC½ÝB½ÿ|&“‰>©äµµ5ÃWc¦¦¦¨ž[ZZÐ9õ ¥³³¶!‹©®€N0O­V{t賓ÿz:ÖoŠ3yÈ{ „Wš³4ˆ“ÉˆŠŠÈË˃j ?!1!666,,,00Ð×××ÓËÓÓË£¬œŽEÝxVè_jë¶ágà,Ícrr²®®6<",44$,,400ÀǺááááîææPXXÐÛÛûJÿ6è«Ä<ð3p–æñøP>$RIEeEVvfjjJrrRrJRFfFii©H$œšš:vn)‰S b@ø8cóx|xþÄÞÞÞÆÆÆÒÒÒôôôøø8lýèõúÝÝ]ãù‰Ï_|¼ææ¡ÑjðàìRvÉ”2@ <7]ª.eòçä½yo¿—°’ø‰ñZ›‡¶G OÂËÄ’. @ žQ§ˆ/áËÕòWÀ1)Ù¸O „“°µ½Åæ½y¬HˇýþŸnëÿUdò7 ›ÿm4ä_x…ÏõÑ£G+++?¸kttô¥\†ÍÐzŽ“^Ñdmm 4Ç’vÂV»»»ccc?š¶³³³¹¹ùðá×xµ[b»{»úõuK'K»¨o,Â/›~|ÇçÃ;î—“3“‡FFFÇÇÁÄÔäúÆD„@ OãÕ0‡ë‹SenÝ!¿ú[uð¿O”8ìëŸ5üââbhhè“?lŠžQ¿¼¼|’©?#°¨Sý Ãºº:êJo'´Òh4ùùùñññééémmmPŠ“4Ôét‘‘‘?*:"‘¨¶¶É?ibÏc6nMwu}uv^v ½D œ’yììëÍøçÞ·I¸hóñ½àwl"?·q77µ°&æwLL…b1åôÐjµããã§:@ œ*›[›Fm°‡‡‡±¶0S•ÛC.Oñ_œ¥*Ÿö£éÔe‘€ÃegggffJ¥RÜ,Þb,»» ¸¸¸»»›ºÀB(–••ÍÍÍáÉN§gdd ’2•¥¥¥ªª*tˆ{Áçó©~:;;a˜ÉÀÀí0¦§§^"ŽÍf&''#íèTÑyNNNÿúúúèè(ä"òøð:/, FÂãñ0%l–——ÃKÒÒÒÐ-ÆE«k×®%%%a¬ÊÊJ$ctÜ‘©©©ššš‚‚ô‰04öÎÌÌ=>| „Ëå–””¨Õêýý}üYŒûŽÎO.aFkê~uFN†¿ODtDdL$n¹".µ ³Å#Ûpú46jz”GïU‰êËå(K0˜Çöîöª~ÕÒÞ:9':*%0.-,"Ñ?*)(='9;' ääæxx{µ0Z‘ M›Û›ë븥67¶6p¼¡F¿¡‡ò£fkgëèæw5›ë¨Dê­P£_×£-jä yÿ@¿!{ Ù3>9>26B=ƒQàijpxP7§3Ôµy,,.´1[+«ËAy^V:<<œ_[VN£*ÌVÁ“ïPæUÖÁÁ~ÐÕÕÕÐÐzGGG¹\ŽV˜ ‡ÃÁ’?@ë±³³3oê¾aÆÏÛÇ[$Ò667ŒÔ<XfOfjj‹èøøXKkÌ£ººrlltzfzbbBÓ£a²XþŸf‰äÑ£GsssT D’•ââbL‹wmm-lìòòò ~¬ KòÔÔVz2WVVQ ]ÀÊ[ªª@½9A HJJ‚I¤§§£rï0¨Ãô 2™ìÉ9c4DŸøÁop¯œœ0 ̇Ë墕A&PðôôÄX(C€ª««1 t'77wddä¨y ·üüüªª*ÜS¤A8éîŸtzŠÑ𻾾nnùÅù­¬Vq—“ÉD¡¡õ-õ0ŒÀÀÊÚJìúãŸþ˜’ž‡pótKNK†gfçgÑŠ>üó‡ É °k7®Õ7×£«ÜÂÜcæ±µ½µ²¶ìmÒÒYÔÔ™g Qšk(·ÉKüS¬F&qøñü6FÛèØh;·½µ­‡Ÿ••ÄZ¡XhöÀleuÅÍÝ =µF—Ÿ7£›é”u  ŠÄ"(ÅÔôTzFúõ×ÑUŸ¶ÏÜܼ 55µ5ããYYY*µŠÁdtp;0@ sós™x½$ë’éæux‚rqs¡•ÑV×V 9FjXéYl†FÊšdÆŒ*ÚÑP$Â<+«ÊB¾N§Ãë~ˆˆZ­b±™ËËK?hXò©‰­¡Ì#<<K2Vh¬ÊB¡r¤=>¼^Œ@ ÈË˃”ÄÆÆbÉG“¨¨(ê]ŠÇ‡çy3Ø 4»¶··q¿ôz}FFFgg§!ù¨yÀÄb1µðãvé0àF C£"u@WÔ ‰cæH}‚ƒQ0OTbîÒßßÔ<Ðapppaa!uO¡G0¼ÿ©'Ÿ­yž˜ãèìhaeáãç#” Y,g7g<œÔýêø¤ø¬Ü,˜Ç{w`ÈMˆ…g°¹l]Ê.¹ZŽdÔðD<ôààä9zHPæ±¹½¹´ºècÚØ™Ïñ¹,¿ä·Ø2Ǭ6ï<¶Ç¿Z’ìŸl54®…ìÇÆÅ:»8Ãý!ûîîË«ËvövL ‚£æ±´¼TT\dmm“›342„&••Õ•ú ýâò" ¤¥§¥¦¥®¬­`¯£“cO_jªkªUUTtÔª~õ`TàuTZFš½ƒ½¯Ÿ¯­ NÃsÚÑ<Ëy`e²Ú 2Z¤Ðåß»R,u³3ƒÚŠª²Šªr½d`@K™ÇÀšõ¨TÊ6FËÑWðÇ<ãh Å!°ü a]‡%@ 2d¬Êð X6KJJ°ä#§´´t}}}ss{‘LõC æ<¯«« ›¨ô÷÷§Ìƒr‘'ÍC©T¢7tN]ïàU¯ZÈ”kww·¾¾¾¼¼Üàó˜…F@Žî‚~±X,¦­Õj½ç2þV¸ËúàÌãè|^ióÐh5©ƒU´°ZÜ<Ý J `^>^¨Äވ舤Ô$˜‡µ­5ÕÄ`îžî ~o?oÔ ™ÑÎHÏN·±³ÉÈÎ8ú°l¶Ã–çÜ£ïÓ¸Ñ õ¶ÑUV¾Ùwì#¿² ÿÂ=ézD™y|½m>;È+Þd`¬ÇUpHpm}­L.“)d=ý=«ë«Ž0†µµiÝ´™™ÙüÒüìül+³5191 0`|j¼ªºª®¾™ Ë 8h5½hGye9š4W÷¨Q;éVuGÇF¯èW0@ Ô³\rjòÝ{w‹K‹ççPó ëkÆhu 5ƒ¥B-—jº» “““cãcT ŒšžÃÐh4½}½5µU'1,Ã)))4 Ë3¬«{kkkaa!¼á¨yllläääÐÃÑÑK>Vk,çµµµh‹&Gû¡¬&„½---T+ØÃ3̽ÕÔÔÀi0:ú‡7 R"‘À‡ššš0:\äIóÀôÂÃÃ1P__Ÿa„SjllDŸyyy‹‹‹ÇÎó@2uO¡8"‘èfxÌøøùÔ7Õwkº¥ ixTxAqH&ŠOŠç ¹¨UdædÂ<àGÍ9¨ƒÃ¸rõ jº”]µ µÂNabJ¢­½í_˜‡ GŽnqÖ5òNz³gHÙ·ô¯ïypÇë}˰Kæ!íc? ¢ÝN¬wòL¸¯í”W•Ã*àøÇÒêdB©Vb×ä̤©™)vu)ºT=ªž¾Ÿ¡DXUS…½š>½êqèÂ<Ðdym™jNÕhµ¹ù¹££pô€@0*¦f§øB¾nA÷ƒ{Ѩ„KõööâŽÏÎÎvQ{©SY©ÿ õÝCs´¢N§…ÍàâÏ %:ùˆ¹yh´šúæzß_'7—øäx±ìàTZÍÕÝÕÑÅ1$,„+â¶qÚœ¨&Œä´dä”–—º¸»8»:_»q-)5IÒ%  Ü¾{;53õ˜yàP™™›r ¿Qfæ™ÿ¹SÚ¥+¸âøÇÔKV1ZFˆÊÀ¢;¡YŽCãÚÅ•ÅþÁþÄäD__?ߦ֦ù¥ygçnU7vO[XYà5ASKöÚÚÙº{¸ Á9 ‹ QƒVE%E8nSÓS+ª*ÐPÍ©š™¹Ü"- (€ËçR ðJ€Wb,ËèÌ£¦¶ ¿A/ZZZšššêêêðʾªª =”•••––£²²ªœ\ÃöTÃhÍ£çð«°‰ •ÕÊlgvvwR• ‚Íe38 øõÐâ‰yÔ.‰\"•Kq_8<Z53¾““Ÿ‰Á®6v8zEÊ<–W—'u¶¡W|ò¯9g^rJÿØ:þC€‚CêEà’õ‰sÊ—)¥¡cÓ#ð Ý¢®¨){”ÓsÓsKsš>Í”nêàC–…YU ØÄ^Q§¨o ›È–)dr•||z›##㽚S5ØE¦ºW=3?ƒ@xU€|£ypÚYõõuuõµuuµµÚêjøFue%”£²¼ÖQN§—ÑhôR­¤¨¸èØy$^z³y<Xï½}½#c"cb}|Ù<öÓ2ñ°ä88TƧÇ,¾´Œ¸hñ°8ÄÒ@äG÷üÞ+®Ï˜œ€[á|°¸Ffp½~M£Ñp8ì–ÖæÚÚš²2zqIQAa~^~n~~^aa~Ii1,¤©©ÅbÈd++/ú³¤$ž¿<óP÷«™íÌìüìÜÂ\ŸóŒÌóàsp¨LÌŒ7r*Ëšòè?LyS~w_×”nŠ@ OcnaÎÍãñáé»»»ÛÛÛ›››ëëëkkk+ð‹åeÜ®®®êõú ì¥N\8•Å–Ä‘øå™ÇÉ¡‘¼ú IDATÌC·¨›˜™  2;?k¤æA¨â57v~ûøÌøèÔ(@ ^±©16ý´…˜‰ïâu6Ükž„'ë–OO릧çð\è¦G'G%]¾”o¸¨1?¯³yôh{äj9OÌãð9ðt@ <7x"åKø âiO¹go(ollüÔŸ ñÒãµ6CÔ}—±ÅC”@ ÏÍÑKˆ©yüìU·¢±©‘úÉ󓯔;;;Û‡ué4ßßß?IÛçôüŒéa»‡ñ“îÂÂÂÂæãoEÍö´åŒ˜@ ~ŒÂ<ÚÛ9–VæÑÑ‘<>oqqñ$ŸÅ,//ÛÛÛ{yyùøø„‡‡3™Lø‡F£)//ÿѶ1!!á§^PN§÷öö>m2qqq‰‰‰mmm'¼0=¦køyÓ§þ¤)))ðôÿ£É/¯¹yh´…Z!UH%r @ ž›NEg·¦OªÆk‡ˆïÈ/ÈSªº“S³s²Äñæææ³G]XX€s`ßÞÞžššÊÌÌ–ÉdÙÙÙØK]Ù¤¥¥¥³³sii‰úMqª!v x{{÷õõq¹\$P¢@ý®9š Òp=[¥R‰Í¹¹9l®Ò‚ÌññqÃ{ج¬¬lnnÆ4FGGa B¡ðñá» ƒƒƒ,K*•R¿Ý.‘Hà.­­­° Oºwï^YYæƒ]ýýý<nù¨T*¸fˆN¨‹³½ FiooÇ^ê]ôCµ=É?ìiñ:›ŽÎîN¾„ßÕÝ¥P)  @xT Y·ìàéTÕeÔæ! Ji%[Û›KK‹|/7/‡F§MLL<ã£êúpÔò˜N§c%¦Ì+wIIIqq1F nllÄL´Z-• ·ÀÚïèèS[[[XXÈápÐOSSS^^^UUUTTTnn.fí€R»><k<ÌÀ`ðŒexE§Ó ¡9þuuu0LI,Ã!ð'ŽŒŒDŸÉÉɨDÂýû÷±‰ìíí1(æ†? @ hhhÀÜrrrÐÕ1ó@BÓaÔ××Ãc0¸¸¸èèhÔÀ‡~¢lüE¼Îæ¡êUñļ±É±½ý½oñ$Âó²»·;4:„'UuŸ±~·e©TR^Q¶¦_Y^Y\\šŸœ‰ùy½}½O;¹æáêêŠ×úÔåå娡Ì‹ñââ"f‚•N€‘H„uº`}bb"Ör´… ó‘‘ÌsXYYA“ééiˆˆD!++klllgg»ó€s@ø|þQ%êìì„âP'šs@>𣀿ç磉““—ËEõ (™@[777h ˜aZZF„ë°ÙlƒqÌ<ÚÛÛÛÚÚ *--ÝÞÞNHH€K!á¿1ô:›–\!wgwç $HxáØØÚàð9Æû{(Ëå]UÕ•³sÓÓcó‹s½}=¬ƒ5·ebbâæqïÞ½˜˜¬»Ð ¬îè‡2¬ß˜N/**‚Cdff.//ÇÅÅA2°l£’Zò±ùøð-Šˆˆê ·•••%%%±±±...ȉŒŒ¤>v¡"===//Z{8:¹\ޱ .c€7`hN]Éê€2¼¼¼¨)™8j(`’/BMi*++;f˜ƒ¿¿ìa  1‚K©Õê“Ùų‚˜ÇÞþþ‹G@ø lïl³ùl£þ S•JYW_»¼²8:6ÒÒÚÄdµA>¶··žñ"þè§-† ÌË3<åÅÅÅÚÚÚ¬¬,¬ñ­­­4 ¦288ˆ¥ÄÃã«« ý#5&“‰naXãQSXX/ÁÔ9",khh(77÷èccc°øÁ£ÃoÖp8¤¡ A†ÀˆaaaÏx|Ä<|}}WWW)ó vÁZJKK766°·¹¹3¦¦&ê³êÛ4hóxÚ©¯?)¾ÞæÑ!ìØÝÛÅÑRPRìàãáïíîçåîë>84)Ù¸O „“°µ½Åæ·yÀ3Ê+é<~G]}RÕ­×ëôƒƒg˜š'''C#Øl¶ƒƒ”»FFFz,êX³ccc EYY¤ýÀ3ª««Åbqhh¨““j$ zàñxååå;;;Ôyh[WW‡åßð&¥5ÅÅÅR©ƒFEEMNNbþðƒ––µZ]YYYUUuT/(™@ ’ñ·Â¦aâr¹ííí (æs̸çõitbT·J¥îé}ÚþÕµ5ˆ@ žÆ+`ƒÚ´ôd›WüNö{ëëëX€õ366Q@Z­&QTTÄb±Pƒ]›››P ,êØ‹V°ƒ™¨©©¡NžžF%Ä“‡(<>üÒ –vt2<33}BçxŽÀp£££0ƒ—²BÿR㥛þ×_|ùERjRFvFJzŠ_€_@p€¤KÒsx”.U—B­0|áÐ.eš|g-‡¿®!SʨlÊÕrÔàÖÐe +‹Æ¶FÊ<¨ÐÙÝ)WÉ©ž • ‚:P8HPË~ל2íÝíUýª¥½ubfTdR`LJhDB@dbPJF|ZFjzFjFVº›—GckÓÖÎ4ùúuýÒÊnQFÍêÚêš~miyiqiq}s58ü—ÁúÆ:•³±µ±¼ºŒV(`S¿¡Ç Ë+Ë K këkÈQ÷¨‡F†¨¶¨GŸÔp` à ªOÛ·¹½i¨Áó^2MÍLjðüfìæqÚ±¾¾ž˜˜(Ž}…ÄÑ8 ó¸qëì2¾˜oç`Çhg`ˆbz±½“½o€o+»UݯFffN¦µuPh_rp‘¡ff³_ Ÿ¹…yxT8DÅe™˜™øøû†BP²ó³ÑÜÕÝõòg—aéYéY¹Yȹ{ÿ®«‡ë­Û·,­-Û8m´¶±ÖÉÕ •N.NÈw‰=¼<®ß¼îèìXß\Ü G gžèêê¼}½e]2èjð<ÆiçxzyŠ%bCžý^wóx|ø»^ä2uÏŽS2xUfp^>^í‚vV Àñ I—¤®©..1®ß^XZcJ…A!A­¬V®ˆV^]Žò¥O.A# ÕõÕÑðŒ”ô”óÎÃ<¨Osóλïdåe‰d"/_¯ÄÔD±L })¢¡‡‹_D’¯]¿ÖÌh¦WÒKè%ÇÌck{kemÙ#Æ”!/iîÊ;@v@cgn“ì® æ½÷ß;j6v6GÍýDÆD63››ÍŸñ9j +¥å¥h›˜’hHþÎ<í8Zt‹³.‘·ÓšÜƒé·ÝÒ¿ºãõÞmÏw­#/Y„^´‹½Xz+¡ÎÁ3ÁD;Ú'¨®«nln„dÈ2.Ÿ»´º™èVwc×äô$ÌG&_Èï”wöô÷ܹ{G©QJd’Šª (ÄɨONM.¯,G“åµeª9U•ÉÍÏêìêH £Oq2¹ Úñ{×VŒ×<6''Õ>>ÂkׄW¯‚*3{ûÈ:‡èàšÐÜ&ÜxZ_x!q,^ºyà1wßô>Äâ`SÛÓØÚÀª¯Ð(Ò³ÒœììR3Rå*9ì2akoëãïÃáq`'•µ•ήÎvŽv!á!hÂà0°—êV¡Vä湸»XÛYzùSˆ4"%=9N.NTUƒ~ʪʜݜQóöͤÔ$©\nimyëέÌÜÌcæ£eznÊ1üzx™™GÞgŽ©—®8þ `ó¡eôyŸÞËr×.®,B’R’Ü=Ü}ý|Û˜m8ü\Ý\¡Ø5>5nmc )ie´b¯…•…—×ðèðÔìTQI‘§—§—·­Œ†ÍôÌôÊêJ4Tsªffn¦ª¦ ™A‘€J „W¼cñXFjÉÉ’7Þè¹p¨/\(úäšcB[T•„—uß®Y^;ÑçI¼xœÆ/‰‰d"Ãg(ŸÈ¥Tÿ°ø0|òÁó¤ )•4¡TÈó©·L°I}×ð(H¢Nr¨oØ‚ƒùw9T ô­ìV6—Íì`äåQ»08zHPæCeR7arÅ'ÿªKÖ'N—ì’>(8¦ì˜ö±kÖ§NÉ_¤ÑÂǦGæ–ææçFÆG4ýí°vf~5ƒ#ƒTA·¨C%n!(¨zUÃãÃØÄ.H <¬o°oJ7…ÍÑÉÑñéñƒÞ¾on¨™˜™èÕöŒ Ì.ÌR ðJ°¸¼h¼æ¡ –¿ý¶âoþ¦ë¯ÿZú×úÿŸg;¥yУHUÛÿWùÂÊÆ3ÆÖét«¥¥¥¿¿ÿiWxéíí=á=yÍã—÷¦b™ØÇÏÇ/Ð/(4(08+â>-KŽ€O›µôÿÒ4øCÓàžÄ,øƒÛ^ï”6dOÎNÀðƒÌ/ÍS§ñ«yœ;'ÿÕ¯ºþÓ’ýçÿÌ·6i/pÖFå2z)ó˜_~ªyŒ4662™Ì””êJô¨‡‚¬µ‰…Bñøð‹µz½žr”ýýý­­-Ôloo?zôùkkkG™ôu‹_žyh´®[^U^QS!ž‘y`|•‰™‰vq[sGÍÓháÖjUSºÉ)Ý@ ~݂ΨÍCrîœðW¿âÿÕ_ ÿËéwí-½¡Èû¢E Lo¸áS¡[\ÿÁQ! eee"‘hwwJ100P]]½u</999""¢«« »(ó€g(•ÊìììðððÖÖV؆J¥ŠŒŒÌÈȨ««Ã.LÕßߟF£Q?¦þÆ/ÏfƼ×_m«ŸêzrÔåååÈÈHÃUÖ~˜‚[Œ ¥@ÿ;;;QQQPÊ>>iii}}}§wù#×Ù<Ô}j¾”/•Kq´LÍžý•ðª2;52>"ì :š~Í>åž½yÌtŸ[îýÕúÄg}å—ûj:óoˆ³¾fG)é´O†'yñOŽª×ë³²² W€ƒaH$’ÝÝÝúúz¥R‰þ!%~~~Ê9êÞޛͦÓé:ƒ–””@,`ÇãÁK†††BCCWWW)󘛛ƒX …¸¸¸¾¾¾£æ188¨Ñh°7((Ròb+ø«¯¹yô~ïw_Ù«$Âsƒ'Ò§½Ûaæ1Û?){cyðÜú´û@ÍÍyIò‚$qUž¶Ö³"KžãÏt„MtDÿàÀ°ŠÆÆÆ¤¤¤ØØX¥x|xæ)*cbbÄbñþþ>ìD­V£ ‰P íhnnÞØØ€a`’TWДÌÌLÌ6::*óü«÷«Ä<ð3pÆæ±­ë´èg¿7Úi5) itX’¥-K–¥qË¢¨%iÂx«ûboýÓÆÞÙÙY^^^ZZ‚púDyqqõ° lB2¨¯Ñîîî.õÕYlnnnRM=z¤×ë1ùµµµ×ö—Ý_sóÐh5rµ\"—ˆ»Ä@xnðDªÐ( ?#itæqûðñ·íoéäE#MÎÃuÖõVõ–Ã5Ó”‡»Ïú11/+^góÀ"UHù¾ºWÝ«í%Âs£êQáéôਵÆkÿ3¾}¸»9ß·2ÄY`,0ׯ„·×^¢Jâñ:›‡ªWÅó¦f§öîûø[@ <7{û{c“c<Oݧ~̃ÄÆëlxXr…ÜÝÝÝG$H Aâ…csk“Ãçéïy0ž æOøðáþþ> °Iý þ>@8 Û;Ûl>[iœ¿aJÂxâáëmŽݽݭíí¬¼\g/WGgàîäì߯Õ(œ„@ '`k{‹Í#æAâÇ‚˜ÌC¿®·p4wM½f›ð‰yäG÷ƒß»ï{)(2ËçóEB •É––—޾)B „clno¾æñèÑ£­­­ÍÍM"%g/Ý<Ôýê‚’©BŠ2¥e¥Å´bêØÙ݉]ªÞŸ<š–FÇEKä’—n;»;kz½¹Ãƒà| ǤϾ6»èsÕ-ÐÁÎÑ Ø:8Þ55ƒ…ÀQNY—¬¯¿ïT‡ „SesËèÍc}}}bbbaaauuuii‰ºÀ=rò%TNÞÿ·‡qª“9óxùæÑ§ ‚p ,ì>0`bf—ð±I¯¤(4Š.e—@*H(à1 #14—)eppðq™˜z×5Õ]¹z%61VÖ}°W*—¢y—ª‹NÒ%‘¹JãÉDH«å _£Õ`ž˜Gm3íÝíUýª¥½U\ZDx|@TbpX¬x\`|JtbJÜnll`sss“ú°§ÅÎÎÎðð°R©D“LJs1\Éå$¡Õj!:'Éœ››ÃX'ïùUŒ—nXæiå´À@ÚØm–V–VÖVÍŒæmOpXp1½˜+ä…™[šßºsËËÇ«ª®ÊÓÇ“’hGph0«ƒÕÐÒàæáæêîZB/Á.+«7þðÆ}Óûl.»¦¡Æ/ÐÏÂÊ"4"&ÁlgÞ¼}ÓË× }&$'˜Y˜ÙØÙ À¦L›Úš„R¡£³ãÍ[7íì*k+›ÇÎöŠ~ÅÒûªcØ-§°ÛOâ~Ç!ä¦sØÉÙQ$ëæu…E…>>>…8ä žAÁANÎN¦f¦9¹9ë›ëµuµæææööö¹¹¹8JK[KhX¨««kCcÚ~ m]\]Ü=Ü͘………¡OÔ4·4C;Xl–ŸŸ’•*%†#„3OtMxÊâ øëë¨ÁóXSsž¨¥RC¼Ä¨Ícmm æÿøöûxtx]7Ü>ãm†ÝÝ]‹••••——W\\Lý zWWWNNÎã'Þ¢øÁMš+ îg ÇçóKJJ¨Có“üu^¡8ó<8<Ž›§›H&*,- Í+Ê“tI<¼< ,.+¿(Ÿ/æCGnܼQQS“(-?xeø‡ÏIËLƒ@ r r[Y­-Ìk[ku¿š/áC)†@" )«*ÃÞËŸ]†©HÒ˜øØ ’\œîÝ¿‡]>~>‰)‰m×®_C=´ƒ^I?f[Û[+kË1¦ EisW.E“,·±3§ …CXÊÒÀT›‘ÉA$à Ú;Úgfg$’úúz„P+¸ÂèØ¨J­215Y^]†a CAææçB6§¦§”jedTäÄäDzF:f¨P*&§&-,,ú´}¨©©­IOO’H%R™Ã‚1°¼²\J/ÅK&NObõ õx¹ÕÔÒ„çÀïrv¶ðºËHÍc{{[,•WÐée¥Õµ•5µUOÂ`¶®¬®<9êÊÊJxxøøø8euu•N§ŽŽÊd²   [¼ÄD=ôõ111B¡pooO«Õb|%))éúõë¸Ûùùùð&“™Àf³1+ä0 j ¬(r¹ÜÉÉéöíÛQQQSSSÙÙÙ‘………^î(NÃ<:»;#c">[ €L`½÷ñ÷ÁmxT¸T.…@À ’Ó’a'zçO†‚âo?ïA4¥°¤âòõ•¯oÞ¾yûîí«×®¢ù6v6èââäꄇµF«‰KŒËÈÎÀ.sKsꛉþ£ã¢1P“œB«{&÷`!²nÙ1óØÜÚ\Z]„yÔI3²™Þ £Õ3šfšo™ÒàšÅôBM¥(Á/Ùrh¼ck#44Ò`aianaîêæ Ï°w°ç x8äfçf͘-./646@AÂÂÂàú }YyYeu% K+KÞÞÞýýiéi9¹9«úU´rttìéëAMUM•R¥ŒˆŠ@="£bai¡¬¢ Ï~ÌXÛX·1ÛVÖVŽ&àYÎHÍcbb‚ÅbâµÝääÄä‘èííPÊ´Z‡ÃHÅOž±¾¾ž˜˜ˆQúúú0($ ó011‘H$0’ÈÈH•J¥Ó骪ªÐ'lÞ€µZr||<¦ª×뻺ºZ[[!µµµhrô2¶Ô^ ;è<88¸¿¿¿±±õ/cÅ7–8 ó€dçgûù[Z[R'a˜™›†¦g§cW3£ÙÑÙe8Ç­;·Ûùb¾…•Erz²µ­5Ê0ˆB» ] ¤‚nM·Á<°Ë×ßkX<&15Ѱ‹2ø¤xªá8ZàKø¥å¥NT‚áaÙ.lÇÚ?¿<çu¯¤="®Î:¢üGê ›°Ï­C>sŠ»Rl[k•Ë ðŒ7í]ÛX ‡ò ŒLLO¬®¯Ú;Ú«4*ìšÖM›š™Î/Î/,/Hd’¼üXѯÌ/ÍÛÙÛ©{Õ)i)UhÔ=ßÕ(Õʸ„¸åµej@ x+,.„vÔ5Ö-®,Û‹çCc4ˆ^Õ‰DBFÓy$¤RiCCƒLV£P¤ËåQíMõ uðŒc£¢ˆ ü 666**ª²²rssÆ¡ÎÉÏÏW(0Œ‚‚êç¡P€¦ Aå €èt:4ÂðÊ1ó@ŸÏ§j†‡‡q§Ð9Tæ´O€ý™ã”¾U[ß\ÿÙŸ¹z¸aê ÖIDATâ_G¡›§Û¥O.Õ4Ô`Wai¡o€o‡°…÷?xæJhÄ•o®„„‡  S´0[ %>Ç Ø•˜’ØÆnƒ xxyäæ3cÂAÄ]✂œAÊ6ö6a‚öµõ5Ýâ¬KäíÔ× ÚM×ô/o{¼sËã›èO,Ã.ÚÅ|Pr#®ÆÎ+ÑT;Ú '¨oª‡IŒOŽó…üVF+Ž=;»nu7vADLLMfçglOÈSõ¨îܽ£Ô(er½œ>82(•I{µ½É)Éå•åh¨æTÍàð`^A^Ÿ¶Ëç¢*@ Œ‡¹Å9¼XÂSß“»VÖVŒÑ<°öK¤…B>::Šå|ä0†£­­M&ã÷ôˆ4žHÄ/¯(›=6*z .B»°°ÐÝÝ744cÈÊÊ¢à0hMii)õc®iiiÈ|Ò*P@ŽR©4tnÈA«”””£æƒÍTWWÃxÐùs.òF§dŠNA~q¾F«E¥EfæfÔWm¹B®_ 6Ýœ¯^¿ u@%«ƒußä~+û ¬îW×6Ö:¹8YZ[FDGP§‘º{ºS»ªêª]­l­bâcIJÿ¹ ¤¤§¤g¥?Yèìî„‚<0pëÎ-¨Ì1óXѯLÏM9†]£›¸ç]vLýøŠÓ€CÊÇV1XFàž÷™ÁÍðlç¡q-¶á±áÔ´T'g'_ß~^xùxA/°k|jÜÁÉaZ7ÝÎmÇ^3“ à ‘ñ‘™¹ZÍÕͶkÁfVN h²°¼@5§j`-u uÈ ’vI‘@ ¯ K«K,ËèÌcss£½½Ú1333999==m(À!š››ûûû›››`p’c£êõúüü|N@¹°°P«Õ²³³©Ê<¦¦¦ÐÖÖÖâããá GÍÉR©ôáÇ\.W.—omma¸¥ Zƒþ===ÑP(D‡Ô÷nÆÇÇWVV0"F{áåÞˆâô~I ë½áñwðÕYÅw_…ˆt©ºD"Ôœöqxm!ê²±†Ë+Ã0$r‰H&’«åÔæÁõwaªÔ.…Fqlj¨Ê,`D´:zO)óÀ¡29;arÅ;ïªKÖ'ΙŸØ' PpJ¿\³/;%}‘F‹›[šƒïMi‡´CcC³ ³¨9p‹ùt‹:x n±‰½}ƒ}£“£ØÄ®‰™ í°vpdpzn›ãÓ㓳“½}ßÜP35;50<0<>LuN ¯ ‹Ë‹Æh³ºÙ6F tÅb!ŸÃá°ÙlªÐÖÖVZZ h<ŒÊÊ ©TÃ8:6%Inn.ì·H[__7|·3èîîÞÙÙáñx¨„I”••ÁSRRBå0Œ˜˜˜ººº¹¹¹òòòŒŒ HÉÂÂÂØØX```RR:ÇßýÀÂÃÃá:###.%%w :ò2V|c‰×ü7L9(…UÀW÷ýß?ä½'xÿ–Ç;ô¦ÜIÝ$@ O2;?;¿4Ïây<êéí ù½½½ÍÍÍJ¥²çû€yðùüÖÖÖÉÉÉhAmmMCcýÖÖÖ±÷öö&&&4Íàà u"n ŸËèt:C%üê°ººJmÂ3¨”Q?<< š™™ÁdQ†ÖŒŽŽbV¸…… mwwÎЃbnК[ë+^wóàsp¨LÌNº8,aóÓ`‹Zz‡40)Ý@ ~Ý‚ÎèÌãÑ£GmÌVµZ-•J!Œ#ÑrБ¶¶6ìjhh@e)½D¿®?—ÄwAÌ‡ÊøÌ8@ ^™ùc4‰D\ßPWS[U]SYU **«@9¨¨eå€NÑÜÒôä{$^n¼Îæ¡ìQ¶ ÚG§F ðâ O sxœ§-(gvžÇÚÚZ¿¶¿§Gó£ôöö,,,ü¾Âj„ñ:›‡ºO- Ä2ñðøðÄôÄäÌ$@ ž<…áU(¾+`,æANqÂøåýT¹ÆëlÔ#‡ ›Çfr™@xnðD íxÚG-gcÅ)EKR'ïj´À”Ô¼xA¤d>w¡«—ÿ âç/HTœ/Èz¸Ï(ˆ•lZuÉkk@Ó¯ÁÝ'‹ îS?íÝŽ³3’”ÄJ«Ø“/Û&||’‚åË(Ø%\zî‚CÒY?y…OŸQpO¿šœ«z̓@ ?g`‰ùQî™WïGž·Ï}íüöWŽoép 7|ÎÝ8GíýY8ÿ3ŽeÔD–Úe–¤ó ©ræ‘\ãuë^ø9pÙüík·mÍ,‚M̓L-‚î?ð½bzõ†÷¹»¡ßq/ì•yzÜ?N{ã'¤Ð2½8™˜@ N•30Ì’”°"«¥;wéþÛήɾ~5^ÞÕž^UµöΗ¾ùäÏ_}>üò=$|ç‰Iøç”/]S¯PØ%|r?üê­b?zùî“ùÏÀ:î#tu‚´‹?µçW ·´«Iù1Ä<pªœy$äE¹¦~s7ämðñý·½ýbRSËJcc‹ÓÒÊÒÓéyy…9‡‘œ’òÑ7ïÜ ~›J>Š}ÂåI•@ÕÂW5‹{íŠ:ßì»÷BÏÇ—¹y¤_"ÿÜ›†šsaEÖÅmñß×üÅ®£m“*½{>÷DαšW•ð"[òi @ N›30¼°öH»y'èmð•Å»¶ö6înnî®Ç@¥»§û×·>¿åñ•|ûøÏDƽ w‚Ι…¿›VÐ.¯³Œú(ºÔÉ-åª{êõìú°¼ÆÈÄrOäåYЙ) å‘F>j"‹ÊX©á…¶6±Ÿð”MÚ e 7Ç"òC礯s#*9yæHC?™uÁè'Žî_掞ïŸsK¹VÜŸU‚9`Ó2êÏ9 áÂâôÚ@LàÉ©¾*åZ¤%ó ©r6ßm γºø6¸a÷QY9½³S*}‚ÎCªj*o;^¢’bû™H͸tÚ4 }OÚ˱¹\ÁÎÍ· /´ïSÄÑܽ3î:%|ZéV`›TîQäp?äOþY¦Ùõá1¥®tfª[òõ܆H¦´Ê'ãžCü—¨GN<Íý8&|‰~4ÃèÇ+ív¯=[E}œTîYäKsK(ó´ˆü=ó•-qtwôUìøäT_\¯&å‘O[pºœÅw[r£°ÈÝòÀ<ø¾N§›ý¡@½D"¾íð •|»˜ó¸xÚ¼p^¤fÚDZÁÊͳ /°gH+MCÞ»p.žîQÎJO¯ʨ i”˜‡T؇„»î¿s'à<Êtf: ÈzPÜ’ˆJ“w˘i¾÷±«IPJõSÇ-@Ï>÷ëy…è 6ð‹¦¾ééi¡HxÓîc*ù(6Q—…*ÆmÿóÔ& 0ëÈOË™!¹Öaùv5íy7ývå5Dà cóbÓ*ï½Kg¤çXQ{’QƒB`¶EaSü-ÿóè­–[”c…]eŒt*³¶#ÿ ç<[~wKac\~clN]¤uÔ§è0©Ì§Ž[Ø$(1ܯW‘€,sòi @ N›³ù ÓÀ,«Þo`{‘ÉbjÄÀa ÆÐЛúiûñwÉG°Ž¼,T2nùžGù¦ïyÏ”» Ç"ìR##8Ç:4׮ГKeF¹†åÙßñÿÓ½Àw„~tÓç\r™`–%j°yÛÿ!¹¶ô¶4tå’p=µ"ð~à{&Aï7 é™è‡Ö–JõSÛžž=SîdT… ÍÍC/Þö»€‚Uø'Ö—+˜Y›'§úªàûMb.ù´…@ §ËY|·%'Ê1æê5Ï·À ›‹ õ]GB~Šï£¬’vÓþ#*ù(Vá—5ò”²€$ºVMGVŸPêsËçemAYÖ!9vUì\*Ó:ü³œÚ¨´Šà⦤¬êð;~ï8Ç]Ë®‰ÌªŽ ·eØF~é™|¯MT™\`úI2Ý?£* B#l#¿@?¥-©T?5œ|ôlôç”ò@ôƒ>Kš“­Â>uŠ»VÁÌΩfJjÐüÉ©¾*fZ¥‘O[pºœÉy1αׯº¿®[_,+§s¹ÜŽÃàï0ø|>Ê1‰WÞ¥’rÇ÷ÝôŠÐÜڊЇ[>B½gÒ}ËÐËVaŸy'›~—ìñ–KÜÍdZ@t»YÐEl^÷<ç“b–D @ý ÏówýÞ‹ÈsI¢ÜöyÇ:üóøŸ„R_»È¯®y¼~<ïRý  zF•qÅÞ %Èù97½. '­<$®ØË$àÃ'§úªà›ú ­|ÚB „Óå,>m)JñO³üÆíMpÕòÏié©Õ5ÕQsœòŠ2g³oÏSÉ„SÅ.âJbù´…@ §Ë˜G|v¹+.oðÿ·s¦±Q^÷Vû©ŸÚ~è*µè*Ý+µQIS©ém+õÒJ´!Js•4ßæ†4”ÄÂNclÀ&1f³!xïÆž1^Çžñ¬ïìû;û¾xìñx_±ÁêþÍÄ®1æÖ†0ÈöïÑ#tæÌyÏœÑ ½Æà”ÿJÚþ§¿~ðßðõ·ÞßøÖþÿü|1|š¦ç'_)ÃO[ „>]ŸÅO[Šs÷ä$m>ðë·öÿjóþ_'pð«•;xëéÒ.¾¹?mBøt}åQXq%»ðÐù²GÏ¿Ÿ]xp)ƒ‹å™O>8ùé¾Ç¤]HþY=ȼ¼çÉé—RþŸAîµ´¼ÂQBŸª‰.º±Õ6Þ¨äVTr++8åKT}ƒ nù3Ô?Á€“ˆ}4V—õ™ÿ¥„B¸ŠMty@!„p-‹ò€BaâDy@!„0q¢< „B˜8QB!Lœ(!„&N”„B'ÊBáªÕæ¶­,WÓÛyÔ»@y@!\…ÒÏÀêEŒ'l])òÅíJÂâXäwI³VmP3jF¦’­é¨Z£vÑß‹ò€B¸ ¥ìh4‹B=«5Xt+B•AÑÌo”©e6×_P‹È5r£Å ÑðŠ0 Py(õJ«sá¯ÆFy@!\mÚÜ6#”*Eþˆ»3ˆ¬Ã=>›ÛÜØv“µ³óߎžÕëLºñ‰ñ{ÿ¸÷uxtX¡U­ÆŸÊBáj“ʃ'lÕ³šÎ˜?õ¬ »b!NÓ “Í4ÿíhMZÖÆÞûÜ}ÐgÏÝ»wU:eÓ‚Oå!„pµ9[Úp/Ðí~lÝagƒLuº¬ýD ïx1ïtiëµ=ɆÿÒ®Þp]ãÂòÐ5¬½ûîLN:ªªZßy§9)iÆ-[ÉÉQ­ö³ééG]’0PBׄsßy„¢^_—sÙFœö€Íâ³²^k>G”W#¿ÀÑæqô»/ðÔ6óãl¸4ý]®H,ô¨òøìîgÓT:51á¨(mÚäߺ5¼m[è½÷Bï¾k}ýuÑŸÿ3›¦§ï<|I¤£< „® ãå¡c5¨Çq,WÖk)n•·ItNó%ŽèL•<­„9v]•’ת²šâk¬^S}Kí§× ª8e ½ÄÓi§I±‚ÏhÅñî°M¢êPè¥ËzéÎXpñò°±t/¿3}g¾S·&œ55âW^ $%yû[ç‹/ÎøÒKÁ?üÁöÊ…[þ5™æßš¼e4›š›„"aWwׂ­žDFÎ ?ù´$¿±“žyT¢ÐÊ%¾úœ¡n_]cÍâåqÿë‡:u«9iKèos¬_ïxé%÷‘#a–…Ã= ãNJ2ÿô§ö_þRú‹_Xª*iq§ŽÃåŒOŒß¿prâÖ9:6Z³Þh2CÁü‚üœ39Ý=Ý›^ÝT\RLº$ëdÖÀÐÀåË—i ÙÖÞFWu;¤2iw´›B„ׯ¿5Nâø8Û}éÀ(!„kÂÙòPzÂ6GÀ¼-^SæµÖC…²SuŽ“uŽ®=ï¦íj«½RèhR¸ìƒ+’W-QYt´øÀG{›ø\»ß¿ÖìÒîÜ,R´Ÿ½x&õøáó¹™§Ók«l>ã_}Î`—wñò°šé^>19ñOo7m™-_ôîØÑãtõöö3ŒcÓ&à /°ë×K~üc¶²œ—–•rë¹TñkÇ&ÆHôö÷JiaQáɤ§§Gº#[·n „ô…EƉ JC‡Ѳ¹×ÍÌÊLÞ‘¼wßÞÝ»w9zddldç®^¿÷³Ý—¬Ô¢< „®ãå¡1)]A‹ÍgXŠVŸ¡]-Ï©à§]WfT[OÖÚr¹–üF˵6ë ±]bô× M—¹:‡Žçœ=YPtõèâ×J5‡R÷ÓŸ¹r>Ü—"ÕÚÄM§Ž‰U|ëÒ^}NĽhy˜¬¦™o)ÆGçÛø—ÍÁ·ßv¼ð‚ë7ºЍTÚUR2á÷÷s8úõë5ßü¦hÝ:Sy­lhj¨¨¬ 1µ‚ÁdÐêµôðÊÕ+g>># K®•¤OGÂÛ·o/cäÌñŒãÔ"”Ts/J“ü¾Åf±Ú¬´[Êηǽàl$ÅÊBáš0^j£Âá7Y<º%jvk¥FE>WV";]cH-ä”ós«y5‚|ް´U(ÒÉi ­lpS37¶stV¹Ò(¾^uµ ð¼Ö*ÿøüéüÂs¬G˺µÅåW²s³hÁÒ@ú:µ‹•‡Ñb¤{ùðèðœC#C­ÛÞc7lðþä'Ž ‚yyÖßÿ^ÿÜsÞääpNŽò¹ç ßùïûß7V”Ób»Óž“-–ˆC!NsøÈa#ëîéÞ»o¯Z«¦g)/RÓR¡Àß·ÿ½o .‘ʤÔ"ÑXôjáUŠ J ‰T28*ƒvǺ¬|^ó+þÇ¿‹ô#ÑóÏ ×­k]·Ž÷¿õYŒ´ÆÈÓÒÓŽ¤™ïÑÔ£Œ’yxÃ/ÐᔄÂ5a¼<:©Á¡T[$Ë’êAiÉŒ^@µÁr£fh~¹[=†?»hyèÍúXÿÌ÷‹í´I„Š¢«ò«—㪮{ÌúHt±Å ”RI®Fy@!\Ry´‹x2µHk•)Ì•"õ ëÒ?ü[´&­Ö¨¥{y¨+´‚ìŠu1*Æ`1,øtPBWn;£’5 •F‰É¥1»µ+B½]ÙÁ´µšY;ÿí­FFÍÌüK‹ž®îÞî`¬;XV™Jf¶™|:(!„«P³Ý,”u4ðêë[êVŒ­œA“ƨYð^¬.+MÒ]œQ1” +@C§•ª¤:³Îæ¶-x;(!„«S‹ƒ¥;ŸÚ ^)ÞÿaƇoÕöûña²™ ƒžÕ¯é¨‹¾”„B'ÊB!„‰å!„Âĉò€BaâDy@!„0q>õò }i÷ ³ <8¾°òôx}üøñäääÄÄÄ=Zh¡…Zhù ¨„Z9‚"A” Kæ’‰—ázt„ïܹsýúõË—/ŽŽÐB -´ÐBËwX@… DÐ"È ¢]‚4—L´ h\ êF_ããã躻»»¥¥¥–Zh¡…Z¾Ã*!‚AŽ H%褹d¢?ƒ¨Ñ¨»··ý …B@M -´ÐB -ßa‚A‹ GP$ˆt Ò\2Ñ>}úI1è566–——çææ&%%…ÑB -´ÐBËwX@… DÐ"È ¢]‚4—L´H„ÁÒHAÚèëïïïD -´ÐB -ßa‚A‹ GP$ˆt Ò\2ÑNNN^¾|¹»» 2¨n …Zh¡…–ï°èM‰¯¯/häŠQ‚.AšK&Ú‰‰‰ÑÑQpµ@ @š _ë ÒB -´ÐBËZʉ)ÑÖÖׂAŽ H%褹d¢½wïÒáÚÚZdÇaaaH–×z‚óȇ~¸Ö*ÐB -´Ðò]‘S®E^ Z9‚"A” Kæ›I´¦¸öïÿ;͸´ÐB -´ˆ[V›hÁm»wïöõõõ›ww÷-[¶())±Ùlœ:wÿ–D„Ÿ~ú©«««¨[ gösæÌ2ÄÙ³g¥¤¤¬¬¬>úè£Wv‹kUUU¡á‡S‚š7ª©©q8ô³|x×®]8Œ6ß›7oþì³Ï>þøãÅk´‘‘‘©©©ÑÖÖõ¼}ûvÔoÚ´iË”’Ê#GŽÈÉÉ•””À¸èÿ•=ÛÛÛkhh|8- þþþŠŠŠèg®ª p01©ÄÐ(HKK¿’ÑgšEKKËÑÑÑËË :à PCòo ±mÛ6ônñ)Òփ銊Š0ÚˆN‘‰ã|B%Ôà“˜‚(–››»wï^Òr‘ù=ÑGdðÂÂBÒ3HCCbÒ3*¡ êa Òì•ýÓB -´ˆ[£»k!šéè脆†‚wÐpŠ„MQÈBX !qŒÄ74@d#ý @Dt‚𼜲Ž ›Îªtqq9þ¼ˆhA„111 NѬQÜŸY‰ùƒÈ£¢¢âãã+**`ÖcÇŽyzz]¾|í=ºp·P9±õ†©tÖÆÆksêÔ)Yª¢ ²R$»°)È©0¸3»¿RÑÜ!XÔÄÄDÐ'!6,¡­­mjjjAAAxx¸²²2ô'ú`Q±Ó×ׇÍaí¤¤$\‚]&Ž @ÞiiiLJoas‹=&Bè‹ÔÆ_ÑÎ4øÖ­[¡†ãb¦"¢ÅšBŒO€³–†Zh¡eMD£6LEx„kDW„kÄ(ÄaI|"¢(ù|>ÇKII±¶¶F(ƒ ò“~má*|ÆÅŰÓÓÓQž;âÚd´uuu³ð’NÈ###°ÂŽ;ÔÕÕAi‹±â~KK rÍ™=ïÛ·´*//jéìì þC ¸˜4ޤŒ01å={ö ×D·óªzúôi´´´´TQQAzå‡ùøø€8_9 Ù:Á°ºèS@2JÌöÂòÀ-0£ÌÌL”1;Bû÷ï‡X¿®®.dÞPÃÄÄÄŠ¡ÙÁƒ±ºîîîh­4G :‡ª„ha”ÁÓØÍ,†haÞœœba¬¯P(„¶H÷a^h‹éëêêŠ(+++á—PSCƒÅ¬#-´ÐB‹Xe&Ñn˜ ¿$Ò’ø‰zDxCCC–Z¹\.ùj¡L”m˜¦-bêö ËÌqí“lo&Ñb×ÀŸØ9’¹WîeŽåÑ3Ò>Ð ¶$¢!æMèüÈ‘#®®®HÝ`qP)ÙøÌUÕÎΦĆìn0"ÈÏÜÜ|1¨Ñaoo/ú•¢¤­à0b¸–™ðk{{;æˆE þF%Ã"_'_ëâB*I‹±9Ë ð”Ç®Môx}Bmì ëƒ}ù\ú'ðxdyy9”ŒŠŠÂÐËŠ¼5Ä‰ÑØÍÍ »™Í›7c£õ3-´ÐB‹XeVF»aš€„ 7@ÃÙÒÒRäxË›äI2â*²Þ™ÉUGÑ"·Ë$''ÿK톗<:žI´äÁ)¢ÿÞ)YävæåN-È <‚£,h!0´‹‹ ¬ ƒ’üeª‚Ý1÷ððpâââ@Š‹¡1tˆÆèû#tB¾ñ%fÙµk:yŸ©UWW‰‰‡‘_6½LUljÀèEEE°illlIIÉ"õ_À,XÈèèhÌ}Ö××£jc^H%ÁX`L¤­­ Kˆy!IÇCŸ´´4\¸ÿ~p3ùŽé5|Û04yÀ‹>‘h‚):´¼ïhámúúú`Sؼ>óÑ12] GL±˜/ªi¡…ZÄ-„hýÈWu OdHL‘ÀØÚÚÊÉÉ!a@ÀÇ'Ârcc#’P ùýÍéÓ§‘\!À"ý …ˆ‡`PDcÄyœB^{¢%é6C¦Eº(¸#ýRSS#§0yÄ}\†ÀÜDûŽý€c`‘¼¼¼Ü)áŽ9#*++“§¸ÈùDC€uÀjP†{eÏDII`` ¬I_¦*˜K…Ã;vX[[“%YÌ ˜SóððHOO­‚ºPƒS‡.//×ÕÕ%s¯ªªï¢ æîûššš¦L 6Y>>>à?Bxò-”$O›±öháŸF•ˆ>"ƒgdd Ìê¡76rnQÏ ZìfÈ)Až„¿ri¡…ZÄ-„hÉ^  >Ÿ¯¥¥…˜‰E*Äm„nÄLr'ä-HT¶lقȆ ŠK"##ßÉOnqjYq¹Ü¹#®vFK~Ç…Hi†€30äé˜*ù‹Uk$LØ_`ª‹üóì/ MfRLtæC.2ÀçÌ!ˆÉDRè9Ña {wçU•ü…Hk‰ÂÖ­[ó׺ ›…ü±†À0ù•9¶]HsQIþ¢›/ ŠC2"ù fÕ…bDUŒ‚òGM„)ÉOØa\õJ;#Y‡ÈÃ!H^uttÈa MžˆzFú‹Áˆ¨ÇÐôŸ÷ÐB -ÿ ‚X„XºwZ$Éwg$’°IþN‡h‰˜‰ø†H‚-âù‚„ÙO?ý òBBB玸ÚD ýSìììÃF ÎÜÜ|V·H—úB†Õìy¦,Õ,Ø"`÷ƒ¬  |+((h–’ªªª/kÞ§(´ÐB -oŒ€ƒýýýçýóŠïè+¿íšÇ¾i‘éþZ ›Í¦¿—¥…ZÞlÙ¸qã¾}ûÎ;wúôi™yc2M´´ÐB -´Ð"F;ÑêêêêÑ Aƒ ß5€±mnqn^I 4hРñ];Ñæ•æÑ Aƒ ßY¬Ñæ—åÓ AƒÆ· HGâ3âcÓbiÐXiùi/õ¢Õ!ÚüÒµ¿ahРAc©Èdy)Û)s½¹ÞܳöÊç]T4½¹š<î+%®‡Ê^êg¬Nkñ¸ZÞ\u7U;emo.pÞ^™ë¢¢ãÍÕáqÏY)iy¨é¢ì¥~Îê´«çÍÕrSU³SÖ÷æêöÊZ.*Þ\WÕJIÏCÍe/uU«Ó†<.ÊznªvÊFÞ\cŒn¯¬ë¢‚‚ ˵R2òP3A½—:×ê´)kêÍ5tSÕ¶S6óæšcD{eCÌ¡¡•’©‡šÊ^êZV§-y\Kt⦪g§lå͵ƈöÊ&.*(Xó¸ºVJ–j6Þ\+/u]«Ó6<®­7×ÂMÕÈNÙΛ Û+[¸¨Ø{síy\+%[5”í¼Ô ¬N;ð¸ŽèÄMÕÔNÙÉ› ˜Ù+[»¨8£Ìã[)9x¨¡ìè¥nluÚ…ÇuÁ…nªvÊ®Þ\ÀÒ^ÙÎEÅÍ›ëÆãšY)¹x¨¹{q]=ÔÍ,N»{pG'U++ew7.`m©ì`«âîÂuwæš+¹Ø«¹;q]íÕÍ O»;pÝí¹ŽVªVFÊîv\w[®µ‘²ƒ™Š»50ÓUr1Ws·äºš«›iv7çކªVÚÊî¦\w®µ–²ƒžŠ»1×݈k¦¦ä¢¯ænÀuÕS7;Ú] 8jªZ©*{hGðbSc^êH¥ÄO´©œ 4¾eÈ(ÊÓ•cɲXÖ÷8,–ìúïÉ­ÿ>‡õnY÷ƒƒ¬rX?<ÄúÏÍë~Ìaý„Ãú›õÃíëßâ°þ eÙõ?‘[ÿ6‡õSëÇ[Öýô ëgÖϱ~²yÝÏ9,à¿Ù¬··¯ÿ%‡õ+ÔË®ÿ…ÜúßpXÀO·¬ûÍAÖï8¬ßbý÷æu¿ç°þÀaý–ÍúÕöõâ°þÌaýZvýïåÖ¿Ãa¿Ú²îƒ¬÷8¬w±~½yÝûð.›õ‡íëÿÆa}ÀaýIvý{rë7pX¢Ÿ-ë>8ÈúåC¬?n^·‰Ãú˜ÃÚÀfýeûúO8¬Oq­ìúåÖKqXÀ{[Ö}rµåC¬¿l^÷‡|Êf}¸}ý6 øHv½”Üúí–,Ú²nÛAÖ”±>ܼn‡µ›Ã’a³>Ù¾~/‡HÉ®—‘[/ÇaoY·ç ‹ò!Öß7¯“ç°pX{ج϶¯?Èa2²ë÷È­Wä°€Í[Ö)(°8ЬCX›?]Ç9ÀâȳØ;YÛ¥×sö±8{X²Ÿ®ß·e=g‹#ËÚò·u·°8[Y‡6³6ÿeGšÅ‘b±7²¶¿·žó1‹³‰%ûîú}YÏÙÀâ|ÀÚòÛußeqÞcz‡µù—ë8bqþÈbÿ–µýë9¿cq~Ã’ýÙú}ÿ½žóKçç¬-?Ywð§,ÎÛ¬Co±6ÿ`çÇ,ÎXìï³¶³ÖŸxë'ÚÜíËiŠnÅO´åùür> q ÿ›Xs}hÐx“!ÈØ­µ[BZB‚ÍþMšño²ŒÿÅfüo6ãmbüŸ½Œg3þ]Žñ62þƒÍv2þCбŽMARš±N–Áb3¾Çf071¾·—ñŸlÆ÷åë62~ÀfüåŒïI1~̦ð}iÆdo±)|ã­½Œ·ÙŒ·å?ÜÈø›ñß(ïdüDŠñ 6…ÿ’füL–ñ+6…·61~µ—ñ6ã×rŒÿÚÈø›ñ{”w2~.Åø#›Â/¥¿•eü™Má›ÚËx—ÍxGŽñËŒ¿°ï£~'ãwRŒ¿±)üAšñ®,c›Âo71>ØËøˆÍøPŽñ»ŒMlÆÇlÆ;ïH1>aSxOš±A–!ŦðçMŒOö26£,Çxw#ã36c+Úìd| ÅØÆfÈ iƧ²Œíl†,ÚÄØ¶—±e9Æß62v³)lÛÉøXб—ÍØÇf|*ÍØ&Ëc3ö³71öîa°år»70Ø»ì]Œ[R2ØÛìm é²li[бéOŒ½(Ìûˆ±ñw 6Úl`ì|—!õ[û}û=†ô¯²¨ÿƒýƦŸ2öþšÁþ CîWŒ?a°Á`ÿœ±óm†Ôì·ì·ÒßgÈþ€Áþ!ƒýƦuŒ½ßc°Y ¹uŒÿÎ`ÿƒýïŒÿ›!õo Åu’®jçѾ̋ÝŠh1RAE…ò‚ÅÊ pU^i^nIîË_šSXž]PžS êIC,QŸù!ÖA_Vx~|NŠEHÌy·ès®txQ¾ QYÅYË1øw¬@yµÿûçúþk(FYÈ*ÊŠMÍ-Îã –d 2i¢¥‰vA¢•íÑ;Ñ–V,¹‚ÜÄ”øôÌÔ— ®Ï«Ú× ]*„ñ‚Š‚e ±$ä•äÅ$ÇEÄE†Ï@\ZB~I¾¸‡ž9ŹVa‰§yÙÜÐríÈZÝøVµˆê³náö¡¡Y‚ì5Qé[„¬‚¬˜¤˜ÔœÔüÒüåù'µEJvŠì.Y['[ܘâ%KEí\¢ý;M´s2Ú¸ÔØ—:R9ñmEaQEÑR‘ÉϬ«¯yúôéä”<š’Ç/dâóGÍ_>Œ|þHðè^Öø¯ª6½¨rÉC, ±)q'TtUtTõœ•µqíTmNp ýÃø¥|bJ²Åª¿¼À/!J70Á 8Ñ,8AÉ%œÃã«ÇµŸ­U°· Ä6j%G³mWi¹i6Ö@HtHF~FAÙŠš‹ÆJƒ_ÆÇ2\E ÿàÃvîÚaig™ž—žWœWÓTS",y]_ýæåÙÅÙ{´öPD+/1M´ÓD+1M´/ˆV^âÑÊKL­Ä4ÑJL­Ä ¢•—xA´òÓD+1M´ÓD+ñ‚hå%^­¼Ä4ÑJL­Ä4ÑJ¼ Zy‰D+/1M´ÓD+1M´/ˆV^âÑÊKL­Ä4ÑJL­Ä ¢•—x‘ÑÊKL­Ä4ÑJL­Ä ¢EB´òÓD+1M´ÓD+Aˆv¼Ä ¢•—˜&Z‰i¢•˜&Z B´ò»$ÑÊo—˜&Z‰i¢•˜&Z B´ò$ÑÊ¿/1M´ÓD+1M´„hå.AˆVþm‰i¢•˜&Z‰i¢• D+ÿïß Ú´¸—9¡[±-|WP)X*²@´ µwïÞ½víÚÕ«W¯MÉõë×oܸqëæØäíäÏD<zíÙã w®x54Å –5Êâ‘}FÛÉÁ¿ÒÁ·ÂÈ­è”e&Û8õ˜Ièeµ“g•Ϩž?ÇUÔuµãÓĪ [Ê7ó ðLÉKÉd‡$E¶ ;â[z*¤ödP¥ºGPtF°WË-ÎÍäÌ òÌvu4ÁFÖËßkïþ½ŸJ*ÂÇŸ|üûßÿÎÁÁîÈQŽôéäæwôv”T—,{-æºzvI¶œ®S†¹N‘SFrý^&K‘ù=EæziÉÿ<ÀüOEæ÷˜,)É(2¨ÈüóûÛ$¤Èü1Ê2’?ÚË|K‘¤%ß:À|[‘ù¶óGR’?SdoË1ßÚ&ùsEæ/P–‘üÙ^æ/™¿Rdþ—´ä/0£Èüµó§R’¿Udþe9æ/¶Iþ^‘ùEæ/e$»—ù'E ¿–üãæ;ŠÌ?+0)%ù®"ó=”嘿Û&ù¾"ó¯h/#ùÎ^æß™ iÉ¿`n@Yù{)É™™“c¾»MòcE&ðžŒä{™Ÿ(RxGZòãL)”˜ïJIJ+27+2ÿ.Çü`›ägŠLàCÉOö2·)2eЉ´äg˜²(+0?’Ü¡ÈÜ©ÈÜ*Çüx›änE&ð‰Œäֽ̽Š6IKî>À”CY¹IJ’­È”Wdî’cnÞ&y@‘©€ e$wíeTdRdJIKg*d*°™R—Td3÷3åd™Û>•TÜÃTÜÅ”ù»äi¦âv¦¢ Sú¯’PÞÂTbJ½+©ø)Sñ¦Üæ¶w$72?bÊüIrÏ»LÅ¿1ßgJÿZòÀŸ™Šï0þÈ”ú¹¤â˜Š¿gÊýš¹íg’Š¿f*þŠ)ó¶äžŸ2ÿ›©øS¦ô$¼ÅTü SáÇL©ÿ”TüSñûL9sÛ:Éc?þ¡»–:ˆv×ÄN´”ã.¸ Zôrɲ7oÞ¼}ëòÄ’g÷‚ŸO &ïd ºÕ4¤/k”Å#"!ê¼®]hl™_ˆÀÆ)PËÀÔÀÜÆØÒZßÈPÏ@ÏÊÆ* 00<"BCG' ž¾Á¾‰™‰Ø¬Âè3Ÿoë`ãâ—’“BQWu[Æ¥Ä9¹;úù u+œª\}À‰é ©Ù©s­Ó ÊVC1X#8*XáÐ-.WMMí¼ZZaaÁ®®ÎººÚFFj\Õú¦úÊúÊe5×ÕóËò=ŒUT´}µó*ênj:¾Ú:¾Zçl”µxTÙ[󜵲®¯–ž¯¶–WÍA}_mu-75_m_-Ue=ž†!ê½5U­• }µPÖõàj8¨ùjûjk:¨èº©™Pe-®²!OÃeoM®µ²©¯ʆ\m3_m@×AÅÐMÍÜWÛÜWKËFÙ”§a²·¦–µ²…¯–¥¯¶‰WÏAÅÊW0pP1qS³öÕ¶öÕÒµQ¶äiØ Þ[S×ZÙÆWËÖWÛƒkä bç«  `á¦fï«mï«e`£lËÓp@½·¦µ²ƒ¯–£¯¶×ÔA'hâ bí¦†‚³¯–±²OÃõÞšÆÖÊ.¾Z(Û{p-T\}µK á¦ææ«íæ«ef£ìÂÓpGÙ[ÓÌZÙÃWËxp­TPðòÕ¶uPqrSó¢ÊZ–6Êî^<mž¦…•²O‹ÇÓvqáÚÚ¨ð<µyÚ(8;¨ñܵ½Ü´,Í”Ý4x.ÚNšÆÊ^NZ<'m®­© ÏA°5Qq¶PãÙi{ÙjYê)»[jð¬µ=,5-t”½,µx–Ú.&\[]ž¹6`«£âl Æ3Õö2Ѳä*»jðŒµ= 5-Ô”½ µxÚ.Ú\[5#½˜ ßøôø…½kUˆV¸d`§OˆÌ ~½1Ͳ·n݆ܽsyânÓ³9ýÁU‘¥ÕÅKbIÑêEDD‡X[[edf”–• Š [ZZòòsí1_}¿°±jUF&„<}úôÑ£Gõ³9ÞÅÇü+NU¨ Ȭœxøðî½»HÚâSã–·9Å9}SÑçuu¦²·Àð/ÏÔ´äðà°˜Pê÷&™AÞî¹ù9v6‘ñ‘â¶ž¢µ¼}çÖý‰{O^¹z9+'ÓçÂKËK£Oü:ĤÄXÙX`îž>îaþ°FAEAdBdPh`zFÏ×C%•Ú®–J ZäýÍÍÍMM3ÐÜÑÜÔÞ”œ• =WAÂÊB++6[îСƒ&&&¶v¶6¶6}ô‘•––¦±±‘‚ÂcÇŽòù|a“pÙcÍuuÌÑ?ŸÌ›^/)Ó¿ÑØ{ ß,{Í,Ï×€7·Á7šÑ8hFã ©ÊïøŒø—ºÖ*­PP\] ª[À'E´õµƒCƒHdoRd ŠâØÛwîܽ‹Qîß¿óøÑææªL~jñ¢{^^Ÿ ZM]???OOOSã|~^sKscScSsÓÅ‹'''‹Š œ5´µ)¢§>¢OLbTm]ÍÇ/Œ_Õ÷Ï”·ŠFFËñ-¥ˆ6PxÔ!Þ<4w`dmb“cÐ~™c‰¢ÏrU%ä–äF%E¹{»%$Å_è½åñs@!`Oç¤ÔÄþ }Ož>ôC q±Ú0ƒŸaeOíÝû·ïÝ¿31ùàáäKLI€>‘‰‘™…™EUSÜ&Ö¥ bSc¼¼=?y40ØŸ–‘J.;7ëÁÄýÁ¡Ääx7ž[Tbdnq.¥’˜]]´pür>ˆ¶©³©¾µ¾®µŸ¢Bc{#ˆ–8Õ*¸º¥½åþýrÛ·Ë ´÷µ·÷Rhíi•‘•9Ì9\Y]‘ž“¾yóæãÇåóóA´+åê@~9•ÑÒ/¬ _XñÊV€hp-@üD;=ä’]ô"£}üø1Ø•°,ű/Xöþƒpª©¹!#?}ý/‰QêZÚ^^^...FƆü‚üòò2A± ¬¬tüâ8tëéé1·0UÓÐô ·2üðèС¡!˜¢ãÂè ÷Œ“Á5§ÃêñŠŽø•Ÿõ-;ÏK¹tõâÅñÄÔx~yþ²ÇÊ)™Š>5˼¼°ª09;Ù/Ä×?È·µ­ùÞý»Þ»÷ànn^¶£›c@°{G¨îÁÄ]Šhƒü¢“¢—ç0KB¶ ÛÖÑæÎÛïS˜¼ÿðѤ¶à¶¦–ÆÀÐÿPÿ¤¬$~_ÜÊħN ÷) IDATÇ{y{bî÷§Ìk —uöpÌÊɸÿàî½pù[¨ öƒ “²E{&qÉ’{ŠhÛêg¡±£1%;¬¿ jÀÑ¢ííï-©)ÁŠTRÉ´¦Žf…°¢¼¾<$&DJZ !Œ"Úfá²Çšëê¹e¹ûõöÓ/¬ _XñÊV¢dÓ&v¢ÅH%Õ%¸C¨ÏEªK²‹²ëj'&&îL áØû„c<˜˜xøäÉ“¦æFíz^^¡ºdÑ—·¶¶65!¥mš››{{{MÍLÔ55‘Ñ.gÊ‹.PA{ÀwîÞá×4œñÎA:«àÁ?èYp˜'àúgÕutÜ¿Œ‰‹Î,ȤTZÖXHF;û:©Ãå©ZœãâáóàÁý§OO>~8ùxécfVF|bÜý÷pHdìTiyª.©_–oïlwçîmP,ÒY|‚þïOPj ¹Än 2:ÉeVa–¸—2=/çëõôÙ“)=~8ñp"5=%=#yÿí»7oÞ¹>µx—ëèæ€ûbìC1\eaz^zsgsáW*£­«›!ZP¸Õ@çäѱˆhÓóÓ­¬›»šAŠ P54&Tz³ô©S'ù|~usõ²§<×ÕA´{´÷ÐÞCÿí+ÿ¼D»€kb'ZŒTZSºTäå€hÁª/(vF" òxøðáäääÓ§OA´™ùËèIÀÂbÑ­º¹¹98:êvuwutv@Úñ¯££§§ÛÄÔXMCÃ;È·D¸œ)/Õ¥©Ù)I)‰0ù“'F^uÝi¯¬#¾¥Ÿâó>µNà,Ú€Ò’3’pÕòÆÊ+ÉëêïZ¶¶‚*Abzb@H@EU9ˆÿÙ³§OŸ=~òä¿ ßÛWZQ ®·=z2ùùógAÁYü,q¯&¥U¥ÀÉÕ-¸znüh˜|4¤öö[ùü¼àð Ä´„¢Ê¢eÚmÑÈäùøñž}þKåµîWVUøúääeOmJ>~ú™nu008 !5š¯‚}ˆ‰2ò2Z:[Ú¦ž×·P¨k©kjoJËN¯“O£¸ªØÆÑF^ž½}ûöîÞn¨tøèa™¡±!œà`¡Ñ¡›7KŸ>}D[Ó\³Ì±æsõ¼ò<šhi¢]Ì +2^æZ„tÅN´©¬¦l©È-Ê©«¯ÑÞ›’ Ù Še'§X,òìÙ3m?sý/ åÖV6–ŽNöŽv¶ö6žî~þ>3áãëmç`kimiji’”IlÊÀžqɱÕ5ÕSÛ;äéúý‰û…µ§¼²Õü²ë:;''¢þÖ­[7n\G˘„èå­@¢OYík(\]Ê/åÇ$ÆDÆDô_èüäñó矗 Ò¢ã£bbzûzQùÕWÿ Ì/£éfªäâîtçî<²Éç_|þÅ—_<œ|ØÑÙÍ/ÍG›UФ¨¼Ð×ßûË|ñøñ£ ¶FÆE`cTXTðìógTå…þ踨¨„(ØpuT"(gæg¶u·6S?€šú%T{c#ÐÖØÜÑœ–“¶lZª¶N¶ ò»ví Q:«¤§§+%%bãd¶v´Ö5Ò••Ý®¤¤¢­m©]öXs]=¿<Ÿ&Zú…‹ÉhA´/ó+B·b'Zj°Ú%#¯(-,ò`F"ûpŠbQùäÉ“Ï?>E´YËèI(D4 ð¹|ùòíWÉ¥Ký})¢Ÿ>5eAa£££Ô›;¦äá”ܽw·¼¥«­YQ£M>š¼tùRHDðòVŠ5¥ùˆ>åµå¯©3ÈyaÑaÙ½½=ùùX8t›[”’›584èèWXZðºc-µ®.ئ<~2 –}þÅs¨”–‘ ¦/¯)_Œ‚œŒçã…¹çäå„F†ÀÄ&Èhûúz³s²`1.sù^¥ÂÒ¬ü¬öžöÖ®ÖÖ®¤¶-Ô/››Û›Z:ZÒsÓWG%¬ELB çÈa­£GX[[%%%œ9£tôèÑcÇŽ?~ìĉãÈe-,Ìs «…H¸—9Ö|®Î/ç¿ Zú…ô +|aE"ˆö宬ÑÂw—Š<Á ¢ýæãâG"–}úôéó/¾Ñfd-£ÿ%AP)@²ÕÞÑzy¹Œut´„‚šÅ©o€÷àà ”AÆ>‡§e¦>/GGÐ~y« út_讨«XÍ‘“eäeDD‡¹{¹ææn©ÊÜôˆèp+[‹¢ò"q¯&PY_éæé:E´nܼ‘•‰¬1+Ÿz4^D(–XÚX„G‡§#G– 6Ù»y¸„E…‚Ï`œÕÔG„²ê2íËþStÛÒÔÞ”‘›±:j`¥zzãâ NÄÇÇîÚµkÏžÝ{öìÙ»wϾ}{yy¶‹«Ë…Á 5M5Ëk®«Tì×ÝO¿°‚~aÅ+_X‘˜™øÒ[iuˆ–¬nÉÈ+Î-ŲàX²O¦XöÙÓgÏž}ñÅ—/ˆvéý/ H;üƒýŽ[[[›_.8››—ëà]TQ$F}jË}x]Ý]½½½0r|B|nnŽ@ ¨ªªª¯¯ïìD,léèèèêBhlE¡»§ÛÇŸG%ËŽ_Ê}VByôÀžØ‹TÖU’nÉ'*1ëJµªª\=œ±©©« MÍJŸÝVaô™Ö€&˜5æ.²>a™Â2ê½K¢ÊU!›ÌüLìŠæE?kuÃ(u­uÃãÃÃýýááàÚ;v õ]è#èíïíéëiîl®¨_¾Vs]]P%0ö¤_XA¿°âÕ/¬HÊJ|©kMÑ­ø‰¶¾Þ¿Tä•äÕÕ×>þ„úù矣ð%_ùÇ”|ýõ×MÍ Ù…YËèI(­) ‰ ±¶±òðóó÷}pÖÖÎÚ?Ô¿¤¦D|ÊÀž„h!¥¥%¹¹¹`Ù’’¡PØØØ("ÚîînQD[^W¶¼±øeüî•žHCÅì>櫪«Ü¼\£¢£Š…Å«6îKí0¯)ÖDŸ¹Š-€ÕÕ¤º¹ºo¸/ (àø‰ãcWÆVV¥y]½¬®,%7%1+‘–Í-É]Àµ±-·²¡r©Àv>%#9Ÿ³0RÒ“ Ê –Ñÿ’€)`”èÄèðØðÐèPî\ g¸óKò—7åÅ+ãè]WWÛ×ׇ¤¶§§ ¤§‡ýýT%Nõ÷÷“BCC=ˆë½¼á0ñžÁžÊFñZx•QÝT]PZPPVÆÖ\‹¸\WÑ®xço¤«ÓXs- Ø‰LØ(\*pUYMY‰™Zñ@®YÕ°œþ—¡‘ë+©MJÝ|“ÕW’fâÖ$%+Ù7À{ñHÏI[ö* úôö ›ÄnáÕˆ¶¦¹æ ›ÔwX¸ÆŽÆºÖº•íöMuukB b'Zj°&+©Å[ Ðòu*¬(ìê3­ý”W˜Î6#¯7ÒÕi¬=¦èVìD[Ý\MãÛ‹ÂJ*úÔ´Ô¬¹&4hˆ´«ÓÄN´pÜÚ–ZßF`튪Šú‡ûk[×^4ÄÚÕi`Ä©×È”¼…å…hŒKh1RÝô[Ri|ë ¨\¾°æjР!nЮN£¼¶¼°¤°±¹±½³ý•hjiBcpíÂGèVìD‹‘æþ  ª¡ªª¾Š”qmEmÅ’._A…eÕÔëú ÏRg!&TÖW– K¡t[‹…ÅF.4´7,ÐÆVäݳ%So]€c-~ò·’¯ßfaÔ4×”T•PV•àÞÀaý”³Õ4ÕˆÏz¢AEÆ«#½æt¨ÝwshíPhêhjéjŸÂ/Ãë/÷2°W§ñ.'¨€e¿úê«Å0ß×_ÝÒÖRXV¸°¯º;Ñb$øîâaïl¯o¤~E$§¦¡-—ÔÊwtu<§zŽ«ÅuñpÉ.È^êDV¹E¹–¶–PISGÓÓ×|¶ ƒ"ú Œ,ÜË$¯ üäñ§NœV>­¥«›‹0½˜þaU°ÑÂm4t4àЯ3‘äŒä=ûö?uü¤ÒIu õˆ˜ œ-2>R|Ö J€µ[x¦¯‰eO§~jÇ/ãSÿëmE,ÓÔÙT^G½˜©£¯C| ¿L™×_îeàe®>eœŠ´¼”¸´˜ØÔho0"ãÃÛ;Úg1ܳgϾüòK°ïÓgOgêêéÊ/Îoìh\ØŸ±-F‚‹‡™¥™"G1*> "OBì&›‚ؤXgçÄ´DD𤌤,~ á1á(£—Ç/á/i €Ì,kçd—ž“ŽrNaóKò««½|½‚#‚Ý)MÈÔóܳùÙ¨!mB£B­í­Ñ uETBÏFfF~Á~•u•ÈhÁý(£² ´ÀÃÇÃÆÁÆ'À›Œ[^SN.)*/‚qêZ¾aº¥Ž[R]‚è³p,X„Ê„Zëa°˜0ìN½áTznº«§+– !êA4ËÌÏ ‰ ©nªÎä%¤%ÀzÈ`°‚aÑahlacfdw•’•âæåƒsŽrø¥¯µ¾ñ©ñ†¦†õS‰ZF^6+H1Í­Ìa1T¦f§ÂD¶Ž¶PŽ„O²¸ø„†p€¥ºñ¬AE }¢CoLcásŒ‹Ä:¢f®cãNž¹ÊØÖÀÇxþ<˜ËÛß[Ø D/?/ÔÀì˜Î2ô„µóJò:z;ú†ú¨ÿ*NXÒÜÙœ]”–—VTYÔÞÛŽð„‚òppsW3ùOrP#¨`R`åqr‘«+)+ÍZn(ƒ8¹9yxc‹9·Wù‡øGÄE –w­”«c ÿÞ1Í݇t>¡ñfãœÙ¶Ž6Ùÿ!Ý=Ý×®_»s÷NGWÇÌzB´ˆ«]ý] û3 v¢¥þßÎ%ÀÜÚ¬fjiJ^ ¢…–ÍÈႃPý‚üA$ÈŸôõ±ù=§f¥.i €8hmg¬š"”‡cPè#³]1÷6¢h§âRâãÀ¨„&h#»CZùùêékWD%,˜±Ï ¬† ’@ðEÐ9Ì¢ª® ›àš 1b´§'øl–é–:.âéàØ bëmDËDô„Ýtôu¨ÿ¬B›†òüxÑ Ñ ]S S¬øìèñ£"zP:«D­ •™Â!̳8}æ46(¹…¹HÑ|}u t?ÛúÚ¼ŽÁ—ÆfƤ ^×1ÐÁp6eôlbn+aôSJ§`4è ¤²ºÚr(–œ™¼ìA¡¼èÿñÀF„x—»·;vŽnŽÈæÁ”àû3gÏ„À>s\;s•±¬èjÏÞ=ÎnÎàcô Ãc·nÛŠé,CO¬]^q^Cµ™Àa[OÛðÅᚦŠ}û:@?°õÓ¶7À 8‹mS|F„!SA¨HîÁ° hÓEÇG[ÚXæäÀªX,-­“J'‰q`(̨¨¬ë"¤¾žo­Ñ¢öDŽS'¥'Áì¨yb\U|&¤& g$”ЃbíÀð4X ~ ‰oyð<àx)™) :hµìA·Êl… p¬*ÁðL³¬ºÌÀÈ LX5Àš˜é¼Žõ¹Ê¨Á9Šàch˜ÍÏÅBC4ÀöÓYžªÐ'GºE:‹2øy3¨9.³¢BÅY$¾ÂFafAf÷…n$»HyÛºÛpjEü€‹—˜éüð X§0_CCL|nÍñ“ÇáoPõÚºÚ+åêÔ3ywËÃÛ8Ò4Þ`1Vµ<ÔÜÚüìù³'ÏžˆÐÒÖ226réꥦ–¦™õÏ>ÖÞÙa!×êlÄN´Ô`ÝK€…4b­ƒ- !ZîÄep‰—¯BjÀ8TQSAXÄUh¶¤@f^¦‘™R rˆ] â—‹‡ rµ#ÇŽà“O >"À!ºšBdáÈnq–<îÆ…`ŠhWH+ÄD[ooU®*öò% 7+[+d~¨Aè©m®ÅˆHj¸tÐ`–éÐÉ’E¨nín]  ¦¼gߌ®¡­!@™1ê±9wþ¬”€Å:¯~l>FK‰¨ ’À ‚áHÈ#5˜ò3VÖU;q 5¯c=¬Å~ùýЫ– K1q6 ¾dco;pðjtêéå ò]AН3¨(ȽàèâA¸ ö)®(†Øá¸®cƒçf­2ñ1âð©Ù©Øxa¡árÈž¡ü2ôÄú‚2{z Ueõe-ˆ‹ˆ¨—%5 ‘¶¢€–üR~{O{Ms R@Å—î–üÒ|Ô€˜WÐω̬k” \RY‚³ØÅήioÄþ #Ô ËG eð•põ©û®.">ÄÝ×ÉÍÇ‘Æ _W°éäãÉ“Dºríʵ›×GgÖ?|ü°µ£›`Ü EÈ)º;ÑBƒÖž%ÀÒÖ{è‡$òðÑøaœÜœ² ²QI¾[FD¨¡¥HzC´Bè\Ò( Q¹W?‹Ð1³"âP8‘—û<(<äSÖöÔCf4CÜD=Ú`s€ ÑOrF2"æÊhÕÝêåçEeíSÄÁ&ÕMÕšºšHѰ÷ôõ$¤=A`4¹E¹8œeº¥Ž[Q_14>ÔÖÛ¶@Ñ”A ‘ñ‘`PõØ DÆEоè‚ÞÞêê&>>ÈØôô1—3çÎ 2’uÇUhFjІ|㈔ü‡š×1à¼kA¥hÕPË]RUžC &¿Â¾‡d.+8hhdhLb &»a™Š«ŠgÎ}®cÏ]å™>åAÀPz*)+‘~– tšéì_vôw€DQ›boÔ;ÔK}ÉÔÖÐ=@Ñ*ù*§þÂ+p!y¼Œ«VÆÏg8ÀÌlÚˆ?c¾„DçÖÀ&~Á~(àÅ-@ì³"®ÞÙß ãÐx³Ö šî>¸{ûÞí;÷î,4¸{ÿ.X9á+\«›‚؉[cl–ìÜ#c#©ß_´ÔÈ+Èc;–†ð—‡, ôö ôÛ'·/%#‡{åö¢Á’FYèc!󈊋B€C¦åìO}U_µ]v»‘©2$@£ÍÍàŸ„Ngl¨Ñæ”Ò)èŒ~ R·Q fDVŠbb Ò}˜ÈÈıêqŽr‚Ñ;,líÁaØàªY¦[êrÀ£ ·™9eXÉÍÓú­½±¨¬Èƒç…CŒmS3SåØr^>^ÐJn¿4ÇUÊç”±­;F$5…e…<_*1¯­Û¶¢æu 8ïZA‘h‘¹BIYÔk#pc/E²½´¨¼ ³à,rzÑÜ1î\Çž»Ê3 Ž$pXT˜‹‡Ë¶íÛH?Ëð.¨!œz“0õôº ê]Ú° Àöv”k[j©_´U ¨·:´ÔƧSßÑB|Œ €ŠVÄωÀqÓÁÈYÓsÒa´øäxg7g´™Uk=~Té¬LáäꛈÃÕi¼Á wAIyÉ…Á ã—Æ_‰áÒ ê?ö4œÄN´‰Úð.àÂÒBRÎäûú¢ÜEqIq¸ Á8UZUŠ]?ÊØP ‘o•V4·0=»¸» Gm RØ <|ä0B¸œJ¦V×\èèê› =чä2c‚•R '§'#ˆ`/Æjï¡–° ¤ÀÍË ú€}Á¦h†J å‰sM·â˜9eòÝ6( ­ ¨ÉÌË„Á—X/Bê×Ñ ß_d¨ † Eë.ªAª†æ©¨y%ç] 2(L„ÕÄ ‚ù0¢FEMøf\ñA1¯ŒÜ Ѓ·Ÿw™° ‡3}~®cÏ]åYÇÖ ·‰§'ØEÔÏRÑu¡«©£ kNq‚h‘¹ÖµÖzÇ.a,°j}C}ƒcƒ(–B 4FËQŠhWÊ0ÂÌÒLØú²&1{YâSŽ=³·ÃiåÓØ‹Àß°÷mjoZq?§ñÆ›­ªº*~1?¯(ï•à ø•µ•­]­ ÷IèVìD‹‘p¾¨i¬9u欶æšÐ+¨GØ8;€çÖ\™Õˆ¶w°¬ €MqHÕ Q5}ÃÔ!*Ee*ñ­«¾8Œ´AÍšë8sVå,6.k® o5:–òTc1ìFèVìDÛ9u¿@Ø5µ0í˜ÚþÓxƒœ[[O;§ ‡^ëy\@"»æšˆ€8cac!¬®¹&4hÌ¡[±-F¢þ¯æ70Ùšë@CÜ ·Çæº+d·cWÆú‡û×\“™èê§×‹Æ¿ÝŠh1ÒšÿœŒ 4hÐX}º;ÑööbÿKƒ 4h|×ÄN´Ô`Ã4hРAƒÆwSt+v¢íîï¡Aƒ 4¾{¦ v¢%fGƒ†8ïêêï¢Þ¶B/Úý—æÕ3гæF¦AƒÆ²AþdNìD»æó¤ñƒúóúª–Îê½öošÚ›*ë+».t­¹iРñ:ÿ +z;j›k«««›ÞÔ¶ÔÖ4Õ|K§ó­V~4VóKùƒ£ƒ_|ùÅÌÿ¾êÁó/ž7w4W¯½©Å¹ˆõ­õtâNã͆؉7ÒðÅáwn|ÛqóÎÍk·®QoéíXse¾SÊ/0©šæšË×.ù0ío0/¬WWfºæÖÓ Þ¸}£¸\»æ¡ ñAìD+lÞ¾wûêÍ«Wn\ù¶AáâÕ‹­Ý­ßÆé|«•Ÿ˜Hms-ˆ-ðüËçŸñùçÏ_‚/>G‚ˆ6¤ñ· ÚÎÞNíš›Z|Àþt‹íøš‡B4Äñm£ðÖÝ[—¯_¾|í⥱ÞK#]—Çû/_¿4~mtàRÏ…K]Sè¹2HµüWÅÕW/]»ÔÜÙLÁ[#GFƇçÁÅá±K£k®ðK•¿:.Z £ÝXË—†¾Q9Ö·æ:¿ð.LŠPlgw—›§—‰…%1 có0³²NHN¾}÷E·ß€k‘Ѷ÷¶Ïœò¥ë—G._íÁçð¥ñK×Ö~!– p-M´4Þx¬ÑÞ¼{wÔÅná0oϘûgCœ‹ÃüÎHëâ]–Å2€Uñöj½‹ˆøk}ó/.]ý'ÑÖ7ÕeådääeÍ‹ì¼Ìáñá5×y^åÇZ ­ÿ6æ¾…`ÀvÓÅæáL‡aûcn›ÇܤFœ?ð’»tu|ÍÕ^†)¢ýâù³ÏŸ¹zz‡†&$&&¥Ç'gÇÆÄÇEÇÆFÅÄDFGGDF†…‡››7µ4SY¯81ùxòÔY‰®° ˆ¶çŸD;zùbiC§sdñi›Ô}z±'¬RìÃ%õ Þ5_‹eãÆí4ÑÒx³±ޱcE4kȹºïuF_V©}Yo>î±y¼¯!²Æ<¢_%éºZÜUåŒ+FÖE{Æ¯Ž¡ñŠç+k–„ËSYlSG9,.+}òäñ£G“““>œ˜˜x!—à”¨%õÁÃ(‹:DKMMÍŽ®Žû÷qÉÝûwoÞº‰fèâ¼}ç6ºÅYR36>† N>D3j gOD½aÑÑÓÑÖÝ6å½SŠäôâwgÉYœõ¦ ÇôBÚ•°-ò÷ô¦úo IDATé'ÄäÖŽ]™mŸä´ä aÅ\»õ ôáî°µ·íì[‘…ùj}S}BrÂâ/¤ˆöÖua£pÍC! âÃj-v¬TpoÊsùàvÌŽ[Ñ2·¢e‡6Œõ5ÄÔÙZ”I;Ôm·«ÝfW-cS°wìÊèÌû\US_#¬âNkVÕT•W•Œ €3pª²¦²¸¬¸º®zpt‡Æ†HK¤’c—ÇTÕUË*ËÊ…åh~Å%E%E¸¶µ£µ±¥‡--h‰S]½]¨Aýðø0ºB‡Õ¸°¥½»uQPø&Ñ ö÷÷—:;ÛKJ‹ëêjª«« ùW®^ÎÍÏîŸŨé4Ô@áÊêÊÞ^Ô`tSLª¸¼¸±µã†E†iik†¢ .ÄÜ«ë«Es¯m¬…eê›ë1…YÓy¥ò#õÙW}¤el›Œÿq.{Ôù£±ÞºÁDãéÇŸ¦K?JøëdöÁA×­ã—¿±誮±®¨´S VÂ'ÔÀ\ˆyE5°ySkSs{óÈőچZr :CŸ¹W¡ –¬¡¹AP* ‹;k)‰•p-ζuµ]ú'ýWÕWáœÞ243‹w2 jP íVvŒÒàõìU2–;¦»ó òîã§O¨¨«WTUEÈÌÊ,ùÜÜÝââãnݾÙÐØPRZbmc­­£mffVßPïãëÓÝÓ¤¤[W_ß¾qóÚ£MJjÊÕkWqŠt˜—Ÿ·yóæ³gÏfegµ¶µºº¹êéëéêéæäæàZppDd„­­“³S[{jp׎‚¹ù|Ô‡†… b.¤7$µí=í­Ý­˜cKÏ…3¶©ÛuSv›æ°)æ4ä5]³ˆé8êR…Ã}¦ÙÇ,’›»goì`@Xì…×ÕWÃC°°pTlç('<*eŽ„;~8×µ°.p-|¶w·£ .Çz½Ìiár­­¸+/Ný|nYZYÚÐÒ€öó®2Áµ›×h¢¥ñfCìD‹œãÚ­k¸ÇÛ3ìkÜ&kK'iI5ÄXŒö×õ†*¨ùÈhíòhvÄ]¡hOðÍÁCmìl¸HNŒ ,­-Õ5ÔcbqoûúãÐÜÒ„Š;îäÜü\''k[ëÈèHžQ>cbfâêiïhtÒÔÖäìê¬tFÉÂÊêêëvõuõô÷à7žÁ-SÕ¸jèÍwˆ2$â7¶7’â’ ý­mÍ©i)õõµéiÅ%E…Eüä”Ä‘ÑáœÜ,¤ 3çB¦#·_ÎÐØú„†‡ö\èAttv„ÎF&Fš:+T°s°ÓÔÒDú#Æ¥g¦£àîéž‘•îA?GEMdL$¦ë’dž»î§l™ÈÚ?âðþhOÝ`‚ñ½äÓI›îGÿùAÚ¾—ÏÆ/ÌT]¡[S3Sh˜— Þ-«*ƒJP#*& Û Ø­@Pàäêdfa¦|VS@¥Šª Z’¹cÖs¯ö³÷£OK›‹;k)¡6hÛ/À (š@ˆœôøéc# Ó¨bW¿–Ωª®ÅÇÌò¶[÷¾£šô¾vỪÉï±Ù£¢¯\^U‰”Q„JaeHhHOo,onaÞÕÓåíãÝÙÕÉ/ä÷ö÷^ºr),<ÌÏ߇¨GVФÓÓ˳«»«´¬´¦¶æúÍë M …tˆ6:º:C#CH|+*+êë¯Ý¸†XJ¤ÎçUÏÛÚÚŽ_ǵž~(ÂàÈ òÈâÒbp n°xÔxõÆUP)8ò»8ffnÖÖÑVQUáìâ "tptPWWMbgieù`òéj`‡Q¾}ï6ˆ6&6×â»7qt‹À¸#ã#Æ&ƨ!“Ï©œCYWW{ÁñKã¤7°u[w[Kõ”‚_*£•ð™núnÓüCez¡­Ýwì“ûNzÔ*Ø•ì2Í“ÑIrÌò70eJz ,äÈ’GÂ1`d‘kÁ¼Øô` à'(`‰gº.‡—"I526B{8-¹ü•N‹Ä'<Ë”§»Ê"%¯Ü¸B-7b'ÚÊzê9ÒàØ AÿpJF ÈtËä‡F†øúy»¸;ƒEDmf"· ÛpÜ®9ù9ÈÏ.Œ\@ öÈP|lçhwâÔ ÜÿØøkjkö ô Ñ ]YS‰2¢ˆ¶o¨<®+‡G‡“—0“ß_ÎÚ€ËÕ¹êh_Q]¡¡¥£â¢º/t“>‡Æ‡ÀÖu­uäú·w´ k+ŠË ŠJòùE9yü¬ì¼ôŒìÔÚúê´Œ”ξιÓÑÑÓA=ìÍa ì6 Š  býî=»SÉIcR” ÖŸ9{ê!M/,)¤ÌbeŽ)àìÜé¼ZùណªŽÊèŽô÷ÇÜŠÙ{;âÏ×~#FºßI•3•G`E:«º{¹#ø"ìž8yÉ4¥ÕÙ3a‘ah ¥£…õ ·²µ"–'zb1¹W¡Í)¥S½¢)Ï]Jì$°Ê¸½Á¬É©òšò±Kc ®ûïë™[Y°ÊË”SöøÔþêoNÙmÑÉû«jø&ù#{O«=«~®¸¼¤(ÂÝw-,-‚‚ƒ(ƒ/yÞ¼àÐà·o`³…lLX#ŒKˆÑ‚2câb||}llm@Æ HG'Ç aÅ…¡ u5´uµQ‰rZFš•”—””•€GïÜ¿¢­k¨Ã)+è»÷ï‚§Ñ#­ìèGyhtý“Þò‚h±7ÂL=b;u“7k§Êå°­‹ Ã[nÜÿÜ-­—ãT)gY$k˜ý™f‚SxÁ,ƒoB* ÿŸYC\ ¾‡½Ö kZMÍLåZ1ñ1°?’Tä (Ë_é´XAx`Ïê}O™¹™Î®ÎsWY¤$¶€Âšhi¼É;ÑVÔUàFš9dc[³µWøYË`e‹à³!ÚNÑañI/û¿rø9ˆ×s ¸cÍ,ÌB#B«êª¨˜nc…„ÑÕO½–¼Çsð7‘F#¦÷ö’D–„”ҌԄD„ X ²“ÿÒˆœjjoÊæg«k¨cD¢ FëZêÈ!¿(¯©¹¡@—”—–‘——TRV”œš%çN‡"òÎŒA´Ø &¥%aß``lÅІì$D…’ÊOoOL¨ÝDÖæNç•Ê_èöÅôÅN#É| ¿µ/VÿzäÎÛ‰Ÿ]úèZ”tŸã§Ã}³ôoïiG–ŒðêèÊïb.D+lp!¦ööljåÉÙ¸Ä8è<÷*Ò±[´¸s—s,­,]"Ò§¬¦ )’?0œŽ¡¡¾¡áŽ=»ewï:l$mÞñÇç·ÔØvHk+jrŸTVžE´@pHði¥ÓüB>åcÇ /_»ŒŽzBÐß‹dÔÕÍÍÚ»ÚUΫ {Cv‹ÃœÜ0ךÀÇ3‰ÖÐÈ™÷­»·ììó òGÇGƒOž< ¢Åêð|xè×úøƒæ ÑÖÔÕ€•Ç/w÷vƒ•oÞ¹‰®&M¢mhkÀLcr… ¦©ÛtÓ¶è¤ï4ÉÓ ¨½qÿ™]|;Xv‡QîVÝôÚñ™•³Ö‹øÆ\oÕÀªÞ~Þä¿ÌIJ&¥&ÍëZ³ ;-Yek;kd±X;ô‰ìvî*‹”Ä V5T­y(¤AC|X ¢ÅDÂ%AcW·MT•cR‡WV/`VžSÛ?£ÁLdçgãžœ[@B–ƒ 8•”•#—‘àb³ŒJ0"2r/Â:„hI ¶ç É ¨GÈ&5HBtÒ³ÓCAY¹YH¶¥ðbrz2QD“«Èa~Q^M06!ÊÌÂ$8ÔßÜÒÄÅÍÑÁÉVßP''/3!)Ä3w:Ûe·‡E…ååƒo@ZbccwíÞÅø>òªÚ*’ˆ PßRÞÊ/Ì/*+ÃU7T‹¬A‘Мé¼Rù~aÊe÷¿?ÊS{”{Ÿ#ö\h¯èK4°øãÝ{ƒ6ï\°ü}¯Ó¶ Ã}3•'©Qi‘«‡+.r刘ô_QS’W˜×;Л˜’eIOž>iamÑÜÑŒB Y¸ªº*–iîUduÈ‚ÌkÖR’§ 0š°N“¢RYõÑNg´šºº;öìÙ¾{÷¾Û;þ}—ÂÙ=»d÷íܾ{×EÅc§N——Í"ÚòÊrdÉÝ}ݕՕgÏíìGþš’–bbjbjfjaeDÍæ"-C‚ ¾ÄáÈø’`4@ÎJ’T¢b¢ôôõ2³3KËK‘cq±È_Qocg·²¦ì#s557¼~ëzRJrkÔƒ›¡À,¢ÅL«[Ú•lRåÍs>ÓIÛ¢®ì^6pyÂ(¤NÆ k‹NÚVí”CÆ UMm³üøÆ\oÕÀøA¡Aüb>–ÕØÔ~8¯kÍ*,à´™9™¸«•–™†U†·`ˆ¹«L†€OŽ^¥‰–Æ›Õ ÚÑË£3oþºŽ.ÛèZÇ”nè6«„N‹èæ Ì:QèœP ‚ûÜb:‚¯¾¡>àâîâãïƒʪÊp·#BXÇ-=5( —´v¶"b‚hIM@pnuŠo†úI òK„ 0·‰¹ â;ZÖ6Õºyº‘_‚Ô7׋‚õoKí ¢-Ì­¨,ËÌIŠOЉˆ‹ˆ öËÈJ‹nïžø0î©Ó§Ì-ÍM-LAêd¤¥£ ©ågC ª­«]\^L ­ $è ¡gW_—ÈÀÜé¼Rù¾ª”›Á;¾.;þuÁλ}ÒßVÑßÛÜßVþOtÖ\øæ¢@UP£†¦††–€Á‘=Û9ØACž/I*jZ\Ý]õô± „VC•Î(xúx’ešuY‚ɼf-%ÛºÚP+Ù9Ú!yKiu©(£uçñ4utô ô ôõ Lõt ôu ôtôõtôô´tuΪªÖ5ÖÏ"Z°ÚØ¥1pž¨€Ê[wnJ+ׯ¤åÕëWA·¢ÌõC£C¯\=é%@Ô£1(I*Êh9~i§pˆt5é,jD—ƒk‡Ç†G/Ž–ù踾•ZÁ¾¡þˆ¬ŠC¦©­óeô2¶é¥°ÌÛ®Ÿ±E;m»^Ún„€äÒÞ¡Ù7ñ¹Þ"ªÙáðÆfƸâ’â°Å™×µfpÚ´¬4²‚Ø"‘ÕÑÓAÆ<ï*‹”¤‰–ÆU!ÚK£ä?¿%¨mï2 ­2ŽhÖ m2ŠhÖ ¨ȨE™ÙFÑÓÂy ä‘—¨ 5/®ìõC*IÍÌö¢6¢Þú‡úg×Lwò"±k®%‡…ÅüäÔĬìtÐjzfJZzrJZRrJBbr<ÒY0n]Sí¬édåe!‰Ôž5¨R¤‰H™“=……§3Ÿò}•ÉW½?~Ê?ø${÷Ó‚##Žëk-Ÿ×þs—cV·³æ"j“™›‰”}áešy8w.³š;4 "ZÐRß@¿O€¿µƒ½““­“#ǰqp°´µ ‹Œ±Í"ÚYˆ2Z-™lgw|ñQËÔC–9‡¬ò,ùûÍrö¥4Ir*lëí~Ùí3×[fÕ¼Òµ¸ûf9íRW¹8B-7â'ÚÚ ÜH3oïÖÞû¨Š#vG Úwà§•6Ílð/ ê7#ÃW‘úæºÌÜŒìü¬~vN~6 ÙyYY23²Ó“Ò‘{ÍêÙƒƒ³ÃÚ+/L»`ò›û¿ ÿöÞ;¨±,ÏóýïÅD¼Ø}ñ^ìÛ}1³oãÅÄLììNôŽíi7Ó]mªº«zº|eUVºJŸYé½Ï$ï½÷N„w0 @„B „÷¤¯¬~_q³Ô*¬pçä'ˆ«{Ͻ÷ÜsÏý}ÎO(Å<úë£WI7÷t¾¹RqÍŸDKe“ö;~¾ÆéÉ" rÓÙçvÆ%Ú—hëšêÜ× ×–ko'röÝ¡¿w!ÿ‹[´kq,š@Þª×úePmˆÖd1Ñv7¾­©ÇäùhabÛ¨ÑÈš[)äª6„¿?ð^×;ŸrꥶC«6¨Æ Ô²›V]«¦]³àmú¶ÆÖFÿ7ÞЪk’ü‰f©¾caS7ˆo®TT#òí.c±hçG®Y«®SµÔ4ªjU-M5ÖøeDmD´„]Ï–‹¶²¶²³»Óý.ÓŽÆŒz¹Rî÷–¼i_Ž].Úù·ŽkkýÞÏ[бÛX]ODKØPŸÙrÑV*x•<Ž˜³k(ç•û½ ofãSÆ)3÷˜Ç§Æý.Å­×Ñ–ówÕ-[ WÂeðøI ì>„ÕB•Vµå¢e‹Ø§£ÛÖMØ"ìNûðØ0ÅÐèë«ýÝ$Ÿa±Ypù½ýþÿ[o[Äu7 „]†ÙjnÕµò¥ü--f¬“%b¶ˆ6CR ˆVT#ò{“”­Ê a…¯D+f¶ˆÖýf#D+” ýÞ$@ €Æ¶Æ ¯D˳ [ÄÑŠd"¿7‰@ À‡¢5Ø6a‹PÔž¢ËÄ~o@ @£Ú‡¢åTrØ•lü$ ›¾ nÿ¾håâmÒ0²@ÈYxÃ|-Z±P´µb¿7‰@ Àw¢m7·s¥\nå<Ë/¸[æMåm»€ö³øÅô¬ÛEñ'ÊŠ#}p9 D+©•¬²—GW»šçïÛ´…Ål“†‘²@ÞÔ…&u“DÛaîàIy«PÉ+e—•¡MhÜêõ·+\“žtšù»êØwèAoW”§mõ5íOÑVÖV®º [Ä.,+,e•âî çýÞiWTÆe”rÊ)..16$2$ž‡¡°EÍ\ w…¿ã^lü·>8w73 ®* Nz)L´ÿç“ÛÌ=ç‚O^¸pýî­ë÷nƒ÷nE†²„¬­»R@ðÄw¢5vÕ‚UÉ.Ê žœšhmkINK ‰ †z‘o¡­Þìî=¼J.’æ‚҂倇Öü*^EItið;u‰¿kL{‹—ð7*þ;¬_pKãRÞæ^…Öè!Ú±¡ªúªUwa‰X÷ÝmS·öÙm,NEpXP\JIƒó6½y¸}¥ì’‚’¥»:¿$ŸÁelüß ¸ùAf\FUT’äìõÈý§oîÿúÖ‘s×öîßÿå}W®] Ù{ð ½¢d+î@ ,F¥UùP´5‚U˜mhDÈìÜÌÄäøÐð D*ŠŠ‹ŠNˆB,FÞïæ¯~ïàIyEeE2…¬¡¹¾þû447Ð+è.ÑnäpmY|AÀ?qâþ›Nò¯â=ÿwñþŸ-¨æmÖU¸Y(Ú†ªUw¡D«Ö¨'¦ÆÑÛæ.SfNFxLXJVr§ŒGM6©y(.®/ÙÛl!gÜøénÜ ‰HKÏNIɼvã:›Í‰DŸÇãI*%QÑ‘ //oÿW‡iôM¿°$>­°FHu……ZD;3;=<:8:6<53iï·W°™1á1É1tSÉq·Þ›.·€Ð_T^T×\W¿(ô7¶5–²KYbÖ†NQÍ©`Üådÿ/5ÿÆ„ÿÙúãÿGûÿ¹î¿ÿß¼ ·˜ôóD5ë‡ù®(e—V×WC«ßëí¦:ô?¿Òõ6ÞÛí­;w_‹ö꥖––ƦFe£R¡TÀ» Š—h÷(fÒ6z:@ðŽ]‹ïD+‘KV…-bGÅD<~2‡X?3;=÷döñÓÇX€²s³ÒsÒ‘ú Dzs¨•ËÅ%%ÊEc«?!…Êâ~“º©œãúœóÆÏxüdã§VÕß[þ¬¯ù?B´ÓÝÿkÎòãç}ÿöÍàÇ3¶õ{ÊsÞË6t:}§ÞS´2¥Ì›ˆŽDÎ7539=35÷x݆†‡¸|NJzrAi_ÊCµMéÌ]jjšÚÑÛÞ€i RÀ²6x"—qöâÙóÏ_¹z éì¹óg"£#’â]$¾&,<ôüÅsGO ‰ Ë6çºaeZu­>­ÉbZ½Aµ$7Q1‘Ož@®SOž>yúô©ÍÖËá²S˹åH­6ñâK+J[›ÕÍMmMË@Ù¢T©›!ZaµpSÎ"”‰èïu5þÒÒð¬Šÿ}X÷ÿM™ðÔö›™î_=íûݳÁóšª9%g$ÓÌ:D[Y[›Ѻ&4gŸ=695©jiNIOÉ+ÊÅØÜ¡†Û'k©4*ª·a\ª·±,¬rDœ ŸÎ¤gfgF³»t-…Ù¬T*‚Èh ‚ohÕûP´ˆì«½EǺD‹kphP$¦e¦ÒÊŠ+å«ï»VJY.Ñb®Ñ¢m¡€@«¶•ÉeBê›rq ŸQp¸­ò힦¿ì®û³þÖ¿˜èüáL×OžöîØ§©úˆG?$®*ßàYô¦?‰vxlXÞ(_ui4>9¢›ž›mS·ÑKiéYi< OZ+ÝôÞfò˜r…lqocA(rÅÜ ¿œËÈ+ȃG­+›ÍÑÆ&ÆJæ§°ÕøP´=¦ÊºÊ•Aè‡Þ¢b"¦¦&ʆ̜ÌBz@*Àz°êîk,c—!s…C/§#ãÙèIk]߃ˆL.//˜•ý¯ÕÛÖÆ?·*þËXÇ?ßî8TWñÛ¢Œ/JË3y•<W  IDAT×ýØÀ¹ &ÃBÑ®vùUõUñ)q­­-}ö¾RFifNz£r^À[ÑÛ,!«ŒU¶do—0]_‘¸Á“²¬Ø„X¹\ÞŠKZ¾¨Õj–š ©•lî5Â’øP´VSe}åÊHë¥"™( ð~^anFn:¯’K­«î»V¤ RIë÷”KS+Þøy…2!ƒÇÈ¥ç&fÄ'G cüȦ~ËÞöC{ËÏl­{ø¹?JŽþ$1-2‡–ƒj"¹h#ç2˜¿/Úfùª»T5T%¦%dåd&¦& ¹ÇUoQWS7£mÙÞ–‹_×ÙÀ)¸•ÜÀ°ÀŒÌô²²Ò`0ʃeä§»€-¸R@X@«ÁW¢5[ÍpÛÊ ôW7Tåç¢MX«î²È9Nqyqz~z|rhVÜïš?ïV}$+ù»‚øŸDGžŽMŠLÏK§1i\jJ±s-mmsíª»T+ª+øÌ|z><·;z;§8'4*$8"((,00ìÑb‚ÂC"ƒ#ã"X"–ßL ÞÚ m>mWo"ûªÈeòFy²Æ›ÊÛØ ãUòÊyåô²Ô²¬?TdÿkqΉBZ"üÊä3ùR¾¤VRݰѵwµ{ж^U¿ê.èdy“¾kzÝ(­“Jä±Lìúß;ß+]©s­+•÷S ƒº]í;Ñ" ¯ŠL)ÞÔÜI(jà€ªú*©œ#•1¥µ",SrŦM9EGW‡§hZ¼ìmÿw@ ìj|*Z$O„-¢£ûû¢mmð{“4‰¶ÛÖ-o’¶c·ÑS´Ê6¥ß›D  1úJ´›¥®¹Ž°E-ßmc[£ß›D  5j}%Ú>K½Ç÷{² Mî•ËÕßDp–&uÓ¦ÓóB|s-–Î?‰v|xå‹òWoû¬Ã aû 3ê|$Úž¾×ßÉYŠÈ¸È½ûöî?´ÿðÑ÷îÝ⊹š·ïßV —ÛeÔ6Õ ªåür–ˆU£¨Q¶)±†[ÉElÖ)Ðì ~ÅýG÷OŸ;ý0ø!–ÑÅeì²ð˜ðM¼%Y(ZMÓr5ÑžÏ÷~ŽÞ>tøÐÅ+iå44;*>ª ¤`s›äƒG÷¢“1TNœ>Ÿ…¥…òFùVw5@ ¬ ]§ÏDkïQ´*–äúíëaQa‡Éc†G‡ÃµýÀ,àgQYHb™XP% öBëY–L)[î°ž 2OÊ“)dÚ­º]-­“Ö7×W7TW»¾Ý¾Õõ÷²FYU}"5”€úÕŠj,c Ú€5ÞœM½rãJ|J|qYqHDÈ•ëWD5¢¼â¼Ë×/£4SÎ-/©(‘È$TïãàxYXRÈ`3p!8,èú%v*{s]nL=&OÑ6k›—«‰öœ>{Mʼn’3’áZ´·Ëh’°ZõÂXl!½„ŸXI]_ʯ”WR/·I‡s%ܳÎÞ{x¯¨´ˆšÐäÓó±;OÂÃÕÑ™t‡ATƽ —ÓqETߺëäÓò± g¯©Ã ÁKôz‰Öj·"z.É;7R2S¨e„¼SgN!êøêÂ(èÅ«/_»|äø¬‡ ¸ t¢&âþ¹‹çø•üå»\'.¸YÓܨnT¶*5횺¦º¼Ò¼ÊÚÊvs;‚ou}5õMjW:ˆM®oF”»¾>ðõ^+ ŠKŽÃ¾x‰.='“„~+Óï<¸ƒiÒG‰\©†^¸rWY. +ßûý{·îÞB6 'yy]f«ÙS´-º–åjRí¡–!BHsêÀ²×o]¿tíÒ©³§9”–öõù¯¡aêrÐòÜ¢\\æöéðàðà¤ô$ªÃæ1·ïÝ–ÖJq9ú1õæÕ”ŒœÇŒŒ‹Dß>xô“6 0Ôùì‹ÏÎ_:quìä1tþš:œ@ ¼Doò™hV„Î%¹yçfLB "¬°JˆtÙ-Òƒ_„t…R¡ë xe•%Ì’Ïö|ïBXFÓcc‚‚jk—;ìêë˜B&®¾AÕ 5j[´-åürs¹Uß ÙèzÈ€Ê,èóËò•-J$dp¤Ø¦o[ùøp ²+&—ÙØöÝÊ6ô¤¹hghdhiE)OÌËÈÍÈÌË„ÊXe‚J¨JáÞÿð}d·ß➢Á-WíÚq.q8» ûAà· 5+ÞE ±ž+â;q,)-éQ𣄔ô6Rë7®b“÷MòA‡}îë ^…»¯¨yFÑÛ7>ˆ®fñY¸XÌ0EHHMÀˆB÷†D„à’QçÄé¨\ÓPóåþ/ùþš:œ@ ¼Ä`2øH´½ŽÞ&MÓ’ Ê¿ûûwì;Œ„CT-Bè„h‘­ÂOYùYÈðΜ;óÖ/ßBèDc!â_»y Î@2´Üa ÒªÔ5">ò¶rA9´Ë<†±Ë¯³D¬Ž®„{×—KÔW##,a— èc/×wMÔUayåã£ÍgÏŸ­àW¼n’º Ç‘ K ¡¨šúšO÷|úÅ—_à2÷îÛ‹‰êãr"c#ñ?ûü3L Š¡B}s½—WäIWo—§hÛ mËÕD{~þÖÏÑ ô0†y ZróîMä¯h-­œ]¾vù×oÿ:-+Æ a½… jzß$t8DK/§»Ç:ùäé“?Q!á!8 òf *L×pQ~üáÞý{qá_ý ]KŽKŠ£&CÔ`[G·ª´›Û}%ÚþÞfmó’ܺ{ ée~´ kð‰@*HÎH† ŠÅ\ wÏÞ=XðN9•’•‚4y¹c.•5šVC«Æ¨‘7ÉßÜ‘`»JµR,£/Pú³6¨FcÑðka_m§våã£ÍȰS2S¨KÀ.1H¡ K ¯Þ¼Š¼jpãü;¢ø _¼zy9êÄ%Çá2ah›¼¿(7 EÛÞ¶\M´-qOµÜ· ='#â )G¶Í—òÏœ?ƒ5hð¥k—’Ò“ÐçhçššäƒÇ”+<&Ü}LóÖ½[ØE¦îú½oCõ¡#‡`zÌl2r3Üï{»/Ùs°­£Û aU|'Z[¿M¥S- ‚cFN†ç$:‡V¹âãÝ€»L.óQÈ#d´Xƒü¹ìñ“Çcc‘ý,wÌ…hUˆæÈo”󟻑ÔJT•닞…mú¶V}+/9‚2~bSnI®D.¡>DƒÝuFݪ§àЏ—®^ÊÎÏFÄGæTU¦•¡Áñ ) ØÄs!Wäar¥üôÙÓ¹…¹¨€L ¢Eb÷å/‘Ÿy{QtÛº=E«nW/W“jÏ’· ‚Wqî¹f æ=Èh±7·à艣hÞÚæ“Çx¸óàNvA6Ø6ÒîBz!¼ ‰~ðÑyEyëõ[×e 2$‘¨“OËGµº¦:÷¨s¶ut;@ ¬JGW‡¯D;`Cx]¾â²bÏ5H}`©ªÚ*IäaðCh ’*¬Á¦zÁç_|.®/wÀ%A(¯k®ãVr‘®!Ä›zLX·±Ål}§fB”ÇV„`sg)®(ÆVA•@ÙªÄM»fÕS d—±Ênß»}úÌiˆVP)Àq`¯ðèp,àZ°éä×'C#BaYTÎ-ÊEâ¢ÂãÂgðÇš®‹Âb³xŠVÛ¡]®&Õž%oA}s=´zòôÉ+ׯ\ºr‰º)¸Š/¾ü}ŽKØnÞ¢mA&„¿yçfqi1N„õèg¤æç.žƒq9Bº³„´ì´3çÎ`&„™:ß=ê܃mÝN «â;Ñö ô!Î. Õ”…+u­î­TˆÇO¼DÐÌ)Èw©—kBשë´t"ˆ»P‘kQM‡Æ`2`°¸œ_ÞÓ׃5îÊ^‚†Q ^|u‹7¹×P+×qQ–¾ï‰—°¶Þþn埚¤{=D*¸pfëh•o:ܳ©5wîßÉÌͤV.Wͳ܃@ 6Ä4߉IÌÆÉÈÉ@ ÈqÑúM9à’4k›©¿¡»u§Ø\ ¨ï‰¶S·)‡J…'NŸÈ§åÃO[ÚþÍíðGÁòŠòü~SøN´v§IÌÆQ´(ä Wvµ)G[}*ñÚôØ¿'Z½I¿)‡UiU5õ5øéƒKØÄW¨\ÿ×ï7…@ @§¥ÓG¢u8ÚíŽÁø~o‰wXíVOÑÌ¿7iww8@ x‰Ébò•h:£Ž°EX¢é0wø½I@ÐÍ0ÅG¢íì×›ô„-¢×Ñû=Ñvuø½I@泯D;Ôo0[Doÿ÷Dkì6ú½I@f«¯Dëú0T»†° &ÄiìZ‰¾>·hG'Fq_;-@ð;ݽÝ>­²EI¯ Wð+k¢„URÓP®€­ßÖ?Ôï-õy(@ l†|$Úº¦:K¯å›WßÖ„cÀQUWÕ?Ø?=;=ûxvI&¦'†öZuРÎðØ0*¯ êx /Gwh³ßQ°Óñ©h»zº^¼|&§&áNjyež¿xîp:ž>J-OMOQ;b™™Á^>}ö›¼9àŽ£¯¿ÏS´S-Ú®„‹.…n‘Ú.)Ú‘‰“Å$¨–æÓò½¡ ¤€'âáaw¸|¹wÚ6µ^­hVÔ7Õ/GCSC³º¹ËÚE¹Ê1èú^0ìR×X·Shhnжk©Ž]¡Cae|*ZsùÙ‹gb@@€ÝaÇòê<†”»`y|b<6.ÖÑïÀòÐÈнû÷RÓR)õ¶w´'&%>yöÄ«cî(`5OѶ›Û«ë«!0X¦uvw.)Ú^Go9·¼ ´ œWÎ0½‚Ϥ•ÓX|ε‚W°µUÛjí³ÎÎÍ>~òxpPÓb³8‡0–¦]ãrŽŽîÐ~½Qoè4ŒOŽÑ„uãSÑ"ÇBnúøéã /¨5jE£ùLYßPoï·cÓ’ô ô=yú ÈÞŠŠ‹$R –;:;.^¼xõêÕÁøëÙ\6|S[W›“ ZÚZº,]ÊF%N‡úsOædrÙØÄ˜­ÏVÆ(c±YŽv\î¤Û(ÓS´–ÝiŸ™›ÁòÈØÒ},/­®C—U˜…nÕˆÄ2±—«…yô<£Ù¸‚Wº­Ý£áù‹ç¯¾}µ2ß¼úw§M׆¹rY¤Âèp츃@ߪÔ*H—ˆ–@ ¬ŸŠéB-œwá­N›‘™ÑÔÜÔÜÒÑbÓb I[¿ ?©” ééP޼VŽI­Þ ‡f>2šŒXS^QŸ—×Ö׆G„÷Úz±¯F§ÁJ‹ÕÂðaÙ VOÀCʲäI·V»uŸ:VëÕùü*¾X.®¬­ôž\Z.<º‚WÌs‡©ãÕ«W«þÇ$ÔknkÆ\¡¾©Òzþü¹¿?[¶¶òòåKˆvd|„ˆ–@ ¬ŸŠÖØe„,pÏ_8t³¥µ²¼ÿà~¥´¶À¦%A˜v/›ºLIÉIæns~A¾¤RRXTÈ`2tz]\|’'d½}½æ.3{ðàA}»>:&š/äOŽgdepy\äÁؽFV#¯“§¥§i´šåNº}è±õ¬O´éyé|)yªD.AªÊ²Y‚ O¸b.µÕ“Üb¯Dë’ÐjãB×¢µ¿í³çÏæÏM&NG¡Õéº-=Ïžm×»½|‰öÑ„àSѶ›Úm§f¦Î?YNLM|õÕWp$Ö/ ìBý:z‰4%5E\)x`µYÛ4mÓŠ™LØÔÚkÍÊÊJNI†w?øð2†ÈЇ: ªÕ‘£GBÃBÃÂ⢣àÝåλ}è¶vC´ŽAõ¹§¥¿°bjb`hiÑRoÓÅ©¨®¾¶¾á5ò:Y£„Á.V Ä2‘Û¸9Å9Þˆòæ“\˜ú¼mcýÌìÌÓgO¦Îƒ_ï;péýçÿ°çëßzòÝs·NëÛÛá` êÓmÛ4†ˆ–@ lŸŠVoÔOLOÀˆgÏE°nikINM‹“VKȰiIºmÝS³S¯_NMÑŠ.]¾tïþ=êã¯pö×g¾F ‹­Åôb¤Èú½F¯9tèÑd´د\½3<:¬5h³s²]¹ïÄ(Ì„ŸËtû`²˜¤µRŽˆ“U•]Meù¯ÉÌϬSÖyÞWJ´¼JD ò sFÇFŸ>}òøÉÜ,ü=;=>1ªT*øù¬¯>çœ;*±¨_Óæ­.ZL˜( yGB¥Ož~ï·°#c#nÑbÎÑ"‹=vã‹ëYŸŠûõ‘ð_ ü·“}ñì•7)¢ââûæW°hÏÈèÈÔôÔrpQD´aƒøT´Ú-܆°uæì™æÖæ´Œ4Y­¬^Yäy6-‰Ùj†oÜ/‘ž~üÉǹù¹ÔH†G†#I…¶±‰Éb†„…T°+BBC~óöo Ô˜÷ìÙ—£"~AQAyE9‹ÃŠKˆƒ’—;éöÁØe„h¡ÒãgŽuü«ƒG8|`ßWû¾<øåû¿ØóåžO÷~zàÈž˜çy_]¢ÍMçJ¸‚*°Z˜[=9915=éè°Û}=ÖîjQ¹2èRë½Uoý”xÕ@vQ¶7¢uYjÁ‡¶úzé¥t»ãOj{öâ™[´uuÈÈ?}¬ÖiÏ\?žTô(åBPÊ•ÐÔ›ÁÉ72sÓ223AZzú©³çìýß|ÐllbìÎ;0+Ôijk"¢%Á§¢UÔÔ "·iÚDRR$B±Á›ƒÊ–N$Áî5¨Y‘Է14ª+80.6õØz˜lfl\,Œ››méµ ×b/êhHv3²2’R’” Îaç’'ÝVÀj”hŸ<ì’ë/öìÛóÙÞÏ>ùü“>ûèÃO>|ÿã÷÷Ø»X´i¹ièv¾”׺D;5‰L±«Ël4âæ´·(«¸éç»é_«½ÍýëÿVñà*ªìB/DÛéz§é Å“gOº{ºãââ¸<.õþ°ä‹íôÔã'5†¶Ã翸öðë+Nzp \}pêFàÙý_Ê«*{2ÿñ7´¹º¦:=#Åf »>¹Ç'Ä×ÈjhtZNnN‡±cîɪaú•—ŸWÆ(³öZ©ÎaÁddådµ¶µÎÎÍ"ÕfV0sórqÀŒÌ Ÿ7>1>15ƒËkå¨?19!®çæ·ª[ÑÎ×—öôIS+-@Ø>m«®n[+H騭cÇÝި߈hy•<¸6§ {jjrtl´½Ý Ñ¨›*ÊzØg†Jß]ýAö©Ï¸ÜRTY…YÞˆ©$D¼05-õAÀƒç€{¥‹gO†G‡Ý¢œž„5FÕèØaôkó|÷2›”zyî‰ëwÏUUU¿úõ¯þùŸÿùßþíßbbcFÇG•Ê¿ú«¿úå¯~ù³ŸýìïþîïΜ9ãrÊä²?üðG?úѯ~õ«Ð°P¤Ñ}޾+W¯üä'?ùÇúÇ>þH«ÓÎ=ž;xðàßþíß¾óÎ;ÿøÿø‹_üÓ4ø§?ýiXxÎU)­|ë­·þå_þeÿþýÆN#u p6-@Ø >m³¦Ùî´¯d´ÈDNÇ:öÝhÚ5ëmNKÄâJ¸ '? åìììÀ@YÛÄ é®8å,ýwYø¿h¥ÙYI¨%ƒÌ‚ÌUE‹ 0û£XÓ³Óu uš[š=? ­ ¹E‹ôqfn¦­½)"ç*¯%½L Jê£ «B «ÃJ¢J ZØ’˜r ÇÁ´àÎÝ;ï¾û.RØS§Oýöw¿E®Ù l€háB¡XxôØQ¨ÔbµÓ‹üã×5òäÖØÉ+L|÷ÞÝ̬Lè3!1ajfêÀÁÿðÿ€9AAQíp@´”›oݾuàÀêĉ8¸û*[‰h ÂFð©hÛmý¶µÒëè]Ç^»†6}ÛúD›š“Š[˱Av~æôôÔôÌt—©]ZpËÂ<î ½[þ#C]áäÄh^A6êàŒüŒUE‹${vÎåW7ÈVëõI)I½}½žë‡Ý¢Eâ‹j-zeHÖÅBypŠèjÿrhÑé› n'Š*;›,¼š*ºÆ¨OH<71= ~ðáù—ùWóå?ø´J £ÿõ_ÿu~A>²[â4u™Œ&#ò×·ß~ûÓÏ>ÍÎɦ>šŽ<¸ZVÝeéúäÓON:5>9¾ÿÀþßýîwV›µÛÒ 1‡Ûì6¨ 8ׇ}1ŒŽ &ÚIµzV¶(‰h ÂFð©h*…Åf!¬ •FµnÑ2ùLÜ]ÑNOMM5ËXõûz ßÿ°ª,Úé´ÏÌÎäd£KÈéyé«‹¶C!Cõæë4w:‡œî5®ÿÝ;4@‰¶VYëÒÕä¸J×r2Ex-Œqüzò§ÿp"àßñól؇÷sDTœÌB´c£Ÿ+‘ýíocãb è¥td«ò:9DËáqpüˆÈˆ¶£³fmimA»oß¾÷Þ{r¥•Ð`ÐGò óùË_FEG¡yûöï{ÿý÷‘¼ÂµØä^èwö_º|éÐW‡Ê™å.^Ô% ”*"Z°!|(ÚÆ:®„[ÛTKX‚*A¥¼r¢MÉNaðåür•—töåËù‰·óî¾%Mø¨»…=91ËÎ΋u`e–›¶ªhu:dœ##+3:9Ú?ØïíÐØV6jënÄïgPôÅÙÈßyõç_ÝýõͬOO¾s3ó“€â½1ŒKQ9w†Ç‡04 i…?ÿÅÏú³Ÿþú7¿¾zíj{g{µ¼¢eóØ8TxdøßÿÃß#½®‘×8xà­·Þ‚5¯]¿fµ[ÑÂc'ŽýèG?úáøî{ï646àì_îÿòïÿú|ÜòãGAÜ ƒ£ƒ &'B¦‹ÔõÝWÙ!-@Ø>mFaF^iaMde­[´eÜ2Ь\—h¿yñT.)WÉÙ§Ç^Ìÿ'ѧϞÌÎÍæäg¡ƒËȃW­¶] ‰B]+3<6ìp:Ü¢uý¾±!…Z~>âã»ù{®eýáLìo?|ëxȯ¯fþáTäÛ—Ó~3ç£;i‡ 9©ÎQ'ägsØX\VTLTZFZSkÖèÚuÁª6%”áÚîÞnœË I ¹¹¨€1šmº¶ÌœÌ˜¸˜šÚšþ¡~¬ÉÉÏIÍHÅÖ^Gotl4WÀu/àhÐs £$19±JV50<@]öjhn ¢%Á§¢Í/Íw‡~‚—2 ×'Úä¬äRv)(a—dçgö÷;?ž{<7û„úë:ó/ææfœý9Y¨CU†ž½-$ ­ Æ–}ÀN‰V® 8‡õ­5'ƒÞ»™¹çzÆ'×Ó¿ã»å›™Ÿ ýX\ÏW=¾@3ê›ê‰h ÂFð©hsKrÐ k"¿,Ý¢¥³è€VAË¥å¦Ùy™KŸ™[œƒ:ØkUÑj —DWû¼´cД”ú£-^‚fâJè¡K!û¿cß‚…[Q'Õ-~ÿ°·Œ["Z°|*ÚzE[Àk,Z¿HòJ9¥ÞÔ„¥ÊxeÞy{’Wš·Ñê:té¹éÅåÅÅÌâ¢ò"ïÉÈËXõÏäµéÚúú¼ùÈtWOW›Öõgòêë­v+ö‚t­öž•Ù>Ÿ3·Ø, Í äÏä„àSÑfÓ²÷Ý ªo®7u›ôF=¯’ç^)®×7Õ{ÖôDÑ¢ËÄËmõ„/å7¶6zSs;“KÏ]‡h­}V›‘[œ›_’#xC=Tp+NÇ ^ÁV•ZÕnjÇÂÀÐÀrôöCÉHg»{»CN$Á-ÚSÉl5ï zÌ&‹©EÓ¢ïГ?üN 6‚OE›UœUÈ(t#¬"7T ªêª…KÙ¥…å…0n—µ êõ¬éIª+IÒµ¡Ò/—›²„, [ét~%_T-Â%AØP²¥×"¬byÉ£írh9ëíèÄ(<'¨äÓòsŠr¼!¯8'âõØz •¼22>‚Ü÷ Ij­²v9ê”u-pÕðذ닽Fœ“A©Rb µSP¨†N×7ƒ®Ü!°2>mfQf~Y¾›UƒL!ƒ\‹˜EúN}· +eJÒ\]‡Î³¦›r~¹s؉tMÙ¢„t Ûôm*Š_Ň“jjà $[ˆéÜJn‡Ùõ?,ae:‹¾äÑv˜¬C´n˜œžœœY Ó“ÞHâ„~GWfht5=353µ³ð²Caüùß{\_ÅP'Åt‚Ô¢Å2¼‹TÛ®]î¿»¸¾)i~/QfeðlÉ+ÒÖ&u s%\‹†\y…ãì0;YŸh °ð©hÓ Òrè9nš5ÍPrKs;»;K8%Ôzž”§i×xÖô¤U×ZYëÚ qÿ`?²[Ðeí*®(†bÍ×¯Ö à|FþÊÇÙ)`vBDKÏùw IDAT ;ŸŠ65/5«8ËM]SX&Φe#oÓ4ÅÌbj=òQµ^íYÓ“m ö‚L!׈¡"¸¶Ò²cwè–ú2ý޳SHËO#¢%„‹OE›’›‚üÌ DØÐÜ€DÖõÕŒµ¹%¹Ôz¶˜Ý¦kó¬é‰B¥@å"fQ9¯\®”—qËx•qøÐ±C8ígњͦææ&µº­¿ßA­±Z{ÚÚZõzÝÀ@ÿ’âQ«Õ]]foEÊï¦ÜÑ¢ÜBѾz844´5#œRH!ÅÏÅÿ¢…/ÓÒRù|žÓ9€5%%ô¬¬Ìøø8‹5‹Å“––&‘ˆÝ©ê‚œ/Ýkê“’wzR»>ÑÍFiµtƒFt8yy££CLÓý7ïˆhI!…R¼)þ­@À/--±Ûûצ¤¤ôôXD"‘@ p8ì:<<Ìbé^`½^ðàÁÓ§O%%% ÖÔÔÄÆÆÀÍTMƒAõðáC£ Ǽ}ûö¾}û‚‚‚ÚúÝ—>­¬V²Àp#c#ö~{¯½×9ì¤ÖàöÛ6Ç€ƒ’èðØ0^ZmÖ¾þ¾‘ñ}‡þÈÑ#]=]ö»´F:61¯Éa'Ž@UÀKlzý7”lV*ýÅš••LDK )¤¼!Åÿ¢-**„Y‘qB™áááPc¿ƒzÇØdê„h»»»XgpÐ •–••b“N§ãp8---UUR‘Hˆóòrcbb râ¶¶V¡P†C ùÝ—~-î´¼NvéÊ¥Üü\èkøBþ­Û·PS£Óà%—Ͻyëæé¯O_¹z¥NQúãŸüøÄÉâJñõ×aÖnkwAqÁ›7îܽӨj„P¯^»|îü¹£ÇŽ NjzjOo-)¤BŠÿE›™™)‹±ÀˆÔz¼‹E\.gÉ·Žq@‰Äµ›Í IIIF6üða’Z¡PpçÎââb$¾ðwCC}bb‚ßM¹MD‹ô4!)Á`4MÆè˜èÆæF]».%5¥£³••MJ¤ªL³UÝjî6'%'EÅDu÷t?qyªÅjn‘ïfådq\¤³‘ 6.kò> |ˆ¬WѤ8~ü8D»ê;ÌD´¤BÊRü/Úüü}:44455%''»¯¯o±x çÐÐ:f±ta÷„„„’’)l|||\\ì;w l­VûðáCTèë³ùÝ—¾-L9:1êÆÔm*(*èèìèìê¼wÿ^•¬ Ëùùæns½¢¾©¥ éìå+—± 3è®ß¸ŽŒ¶ÇÖƒ„í²tQoW°+Ä•bû€ž¾qóÖ@´®§hÉ[ǤB )Tñ¿h‘ƒ z¹\†ÔÓnw9ù¨TZ)‘ˆAuuÕÀÀ¿£Eþ ¡*•ŠÑùÏLÕÖÊ ¥R¨Z­V#—…e±ìt477Ëd²%×»SXŸháÎ>ü¤¸vãšÙbŠ…wïݽyûfn^.õÙãòŠò·nÀ©­êÖÁ‘ÁbzñÕkW¯]¿†:Ñ1Ñ8)ÒâsçÏI¤’K—/A¢0nBR4ü(èQm}-ÖàÈF³g´Ú¬¨õfdeÀÐD´¤B )þ-a‹D Û!£¥—ÒÝ@¨8Âàð L‰˯ß.@¦kí³Roù:‡œð1°9lkðE}êƒÄÈVmvrb¨”ÚŽ€MT÷"ZRH!å /D´;ƒuˆ•‘w"uC‰s;à)Ú   "ZRH!e·¿‰vlloÖ'ÚmŽ[´ß~û­ÅbyþüùÖŒpRH!…?—ê&ޝEk0¦¦& k¢ËbÞe¢¼z…ÎË›Ÿ!„ÝÉÔ0KZx;ø¢OEkí³z? …*ƒ»L´ÃcÃ,aÙíÐó·ÃÏÂîåÌ­³,Aé /ÿ-í:ŠsȹËD;6ÿ…É­ºf¹²J¦®D®¨jÑ4 Ž8#N"Úm]vŸhÇ§Æ áÍÁÿ¢ýv¾¬¼æM.»O´ðFáOÑ~óÍ7ÕÕÕñññ999}}}ë«W¯ ^fffZ,¼ÜLeíÌBDK ;ŠÖd2Ñh4³Ù¬R© ÆÜÜä*‹{zz¤Ri\\ÜÔÔÔf*kg"Z@ØÑøS´B¡u×>þ<==}||¼»»Ûn·ã¥F£‰ŒŒœ˜˜ØLeíÌBDK ;ж´´´±± ¯^½‚V©3Á²Xá‹E¾ÊàD´°Ãñ§hét:%Z$µnÑ~ûí·Hm%Ippðäääæ k§"Z@ØÑøS´|>¢E:ûôéÓŒŒ ê­c›Í×B±111ccc›©¬Yˆh aGãOÑjµÚŠŠ ‡Ã¡Óéx<ÞãÇ CII‰Åbimmåp8X³™ÊÚ™e}¢u;†›ÎðØðØüŸ*Z…ϹÂîÅ›˜€ à7Ñ£™kJJJoo/ÙçÏŸ#ÇMKKƒe‡‡‡Éÿ¦ýãºD‹›J¯ ³ElŽˆCØD\F­²Ö1èÀíèZlEÿ“{A ¼ xz½þü êÿÎ’/¬X¡¬C´˜d±…ì—/_~óêÂ&âp¬z/&¦'Ƚ Þ¼Œ ~-)«–uŠVÄ~ùÍËW¤ljq8W¨È½ …”7§xˆh·{YwFûâå‹oHÙÔ²äìujfjznšÜ RvnÁø|öü™+EÛ–åɳ'˜ªú»K/cív/ëí‹„MÄ>`_p/ƧÆ[u­Ú-n¹„ÊìÜìÈØ´á÷–,ÁË—ýÎ~Ìüß’¥ð2&øT´ííÓ¤¬±t÷t­O´š˜¨>yúdxd˜bl| /±rfvæñ“ÇX ¬‰¾þ>Ï{115Ñ¢máJ¸Þx´0]ù^PLLNÌ=ž£–q;¦g¦ý~]„7ŒçáÑa(Ís%BÄøÄøÈèÈäÔ$5€ý7ž¿xîp:ž>ú½OO»"ðôÙSw#W€ªC]ð!ÇYõ\á9õ2&øT´Zƒftt„°&Œ¦Žuˆ–%dað={ñL­Qúé§_Ÿùúì¹³wîÞ‘ÉeX9¹9uõuØJX6‡Íó^´›Û«ë«»¬]xØd YgwçÊ÷`áÖ­[4 .uwÒ3Òý~]„7ø`hdèÅ‹î5ðŠH,zøèáµë×tzF¬@(Ðê´¾nÞógÈÝOгù‡("2¢¬¬ŒzˆP¡¥µåÆÍÎŽƒ½ì;uýýa_—³rVxN½Œ D´Ûu‹öɳ'˜667bPÎ=™›™›1´î?¸ßïìOˆ—H%X©Ñi Ò3Ókd5˜‹¡~WwNIDã“ãx961Æðé%tc§Ä.ªVURrêôöõ¢ÂžÏ{ávÚvt,–GÆF0ïÆò ÷<~úøøñã·oßî4wRw'2*[Ñ™%e%x˜+XƒÃƒ8H£ w¡°¨9_ÈÏÈÌè0v`œ«AÑ€»ÖÜÒŒÓù½OÛ<È­êVŒÏkFÇGÝk&g&G]6ún¡ÃˆQа€‘>84Ø lÐêµÙ9Ù 5-UgÐù`@ö ôÁ©î—ÔCtëö­ku9YÙY¿ýío­½VÀ]ÀÖÇ'&%&$%ܾsÇ×ôˆ#ˆ¨Œp‰Ûê÷n!lgº…†‡b¼áñÇhà  ¶Ú¬î:Ó-´á^ƒ&kS·ŒŽÀ@êÔôâž¼VŽè@qâä Lþ¶z@‶~›çañ9sre0Xo4ñ¤:tÈbµttvÑŠ"f™Y™˜L`+˜L„¾·ßyu¨«ÈÉÍÁ“ˆ('“Ëð”-ŽuxÆy^~A>8pð¦K6Ï˘àgњͦææ&µº­¿ßá^944¨×ël¶^¿Kn;°>Ñâ¦b=F¤¢QqåêüÄ<ñS3̳bãb1¿›š™²ÙmÝ=Ý-m-/]”TJ´:-†,Fç0þã A|ÇC…öåò¸H¶Î_8_ZVЧËÞoÇñß(zl=¹Ôû è@L±‘¡"ų­Ž~žm„3d xì¿úê«nK7Çþýû;M˜‰Ÿ:} ·,/?Q£®¡N(¢2è÷n!lg0BšTM°fZFZ›¦-'/“9e£cØ]S=¤b”Ã(ðøc¤aÈÝ»NBÚ‡ãPq[1È¡ŒCß HXjÁAT"±Êt 8*«*‘OŸ;w¡ úçp9hžÝaGΊ¤¢”QZÁ® &µŸíù u¨«@H¤Þê£Ç:ÌKpã°$Sèÿ%ïÀ¹óçÌ]ft5²XP€¾Å.èU<ÿ˜å\½v54,âäÉ“ãã®…S'Q ˆzˆˆ’wïÝÅ^ °¸Ð}da9ðœªZT—¯\~ÿƒ÷1ü0ç^0lFÆG0PçÏyY¯´JŠgºE4 â6ÕÖׯ'Äc ޳Õ§³öYgçfÝk¨‡éATt¢"2i×cÕmNKOŠ…Ó3Ó˜(\ºt©ËÒ÷ó…|ì‚Äàøñã¨C]#®kf>Bbaq¬ÃÜ=£Ø6Ö/Ùßû9&¬¸4jΠËÍËE µ÷ I^“›ŸËás‚B‚ 9Ô¡¢Ÿ;0R ‹cµ†^JÇS¹ÿÀ~<•K¶Í˘Àä2ý&ÚÌÌL±ØeÓáá¡€€£±£¦¦º  9.ö"¢Ý h©¬TkÐbú†eODæw8¦´ZŸˆÁ„5¨ioRJì‹y+^bЇÇ,>!ž+à¢>ömQ·`>‹ÁªlR¢†ø›C»©z¨Ÿ<ìz|±gßžÏö~öÉçŸ|ôÙG~òáû¿¿÷ÀÞÅ¢E¿QG@áѵôZ°ŒM¢J‚¶ªÚT˜»„¬APC·cýâÜÜPD:5LŒÞ´[@Ø ìN»­ß†áê^ƒq¥ïÐcògê6aëW›M ÄŠÀà@ˆðEü­8`§¥Y¬çê!¼mCjë^ƒ¬Z^/OLNÌÊÍBû±ÞÓT˜`Ò€ êPÑO×®Cãq4jaq¬ÃÄ@“xȨ`à©\²y^ÆŠ6??²)Ùˆˆp¥R‘___×Óc‰‹‹e³YHvýî9¿³>Ñ2¸ üĨºyëæé¯O{Œ£9‡„µ¢7ê×!Zê^ø½ñÂrÀ²V»udlÄï-Yd£óinâeLð§h96‡Ãèïê2§§§ÕÖÊqúk×®Þ¸qãË/¿¼pá¼ÕÚãwÏùõ‰¶Œ[Ö7Ð××ß§Ö©[4-žhÛµ˜ÀÖ¦]³ÑR÷Âï'––Îùÿº AF‹üù«ß[²/c‚?EÛÞn€_ÓÓÓ“’’*+%Èk‡‡‡(RSSÄb‘ß%·X§h9exr0Q%l"mú¶õˆ–Ü Âö¦×Ñ üÞŒšç÷6,‡—1ÁŸ¢…P ½\.S(ìö>ÏMXO}™°>Ñ–²K»{»-6 aQiTë-¹ÂnÅ˘àOѶN´%ìSÉl56‘¦¶¦uˆ–΢·›Û;º:„íŒÉB"ÆVÅ"ÚíÎúDËq^½zåÍ#Åû208°Ñ2yÌñññ RHÙÞåÅ‹þ~Âv^ñ2&øA´cc£€,x³°Ñ~ûí·/çÿÀÓâòìÙ3lÝš·›‹sȹnÑÚúúl6à*}}}xLüZI!åu™œœ|ùò¥¿Ÿ°W¼Œ >­Áh˜šš$¬‰.‹yÝmc£‚Ãe-†Ç猌 oÍÀÛÍeÝ¢KLI=|ü¡£9ŽºTÁâ×’²M íúÊv­µÏº5»›ËÀàÀºE+ñ'''ž>]˜Î*=Öž%O÷íwÅÇ—¹#ÊFD{ó΃‡Jp(>b^¹—˜œR32U­­‹Ãß¶zÏyÜ£,^ï¯V‘²)eljvq˜Ú”ÀµÖÃÑî’‚é•h‡†F‡œ#Nàt¸E;19Ñßï0;€N§Õj5CCƒµuò«eñ¹i4ZtttAAÅbÙøoym6›D"ÙàA¶OÙ h#£é‘‘̘˜ŠÐв„DvbRQDTLXDdXDÄõ[·Ó2³Ä>³Ù___ïË€[UUÅb±†††¨—v»ƒãF¯×߸qãîÝ»£mV7WÖVJë¤ 2Úþ~ƒYžVÌeÔuwاÚû¦Jê¬ñôj®@è9›S£»j1ì?a+n%†5&wÈ„0Xýq¨m‘EÁ¦˜ýá555¸ï˜Qâ†â'6a@#ßÂ&<P…{rãe#¢A¿ .S0A)c”*• wàÃSHaµZ¡RÌT¨äòöíÛ˜Ècž~ãÆ Ìëá?ÔAÏcƃc掚xâ¨# ·ñ4A~8vÁýB2ŠLkp‹áWÄÜxÇtŸ· 1 ®E5œþ†Ú)Ñb%rV4 ·¦’cX“}L§¤p>Ö)›UvhKKK©H‚‰…Ù$¦þít:à !‹zP šÄT5;;›Ú±O%ÚÙÙY æÎù’ŸŸO­Äqclã‚€áfLLë7fˆvñ;xŒ2p…8ùŸ \‹hîßλÓþ'ÑNŒOŒÒŠóøÍUÚÁž¡Y£cJÐêŒ.×äÒ¼m€¹Â(t‹Ù&:b1ÆÄ½{÷0.ñ7 Ó#Ü8nŒì£GbÄæˆÎÔÍÂ}Dì> ç&$Io²hãâc(±-YÐÕ¥e% Eõ`¬ÂÂBdœ …%E¨Úá°7ˆR/D‹Ä&“‰gíòåËðâÄ|BŒÈ‚ ØŠðQYY‰SX<_¸)¸ƒÔ‡˜/­@ €51 0¯g±Xx$)ÑîÛ·VÆ0ÀIµZ-õ†3~bÌ 'xðàÉhwnÙA¢…©H‚XD‰Á3‚1 •àyJ*`„C±Ô.DnÑ¢LMM¹E‹”3E c£ÑãR!‘-ŽCã‰À¾˜eb:»¸1;@´‹ß@÷aƇýõøñãµuÿ.-Þ‹Vß©olk]Ö.J´ol|tjj²¸„žÇS2}-ÝãÍ]ã5ºÁdŽ&·è{¢Å]@·ãvPo-äääh4„Nxšr6 IDATÜDêíê#˜0"”cr‡Én%Z÷Û2"‘¨­­Í}XÏMo¼hcñPÀ—=ßë|é/®ßÑ‹Ê×¢ÅÖ;wîÀ¦Pz‰,üJ½yë~—Z@ª CŠÐ-—ËÅœ®ªªª¤¤„úL6Éår<_0:‹:7¸sb^“‹E +ãȘi!xQS%J´hÉØ|qÿN¡‘/q !!!h¶õ@Êf•$Z>ŸH‚ˆ„¸„é>†¦†ŸXƒôêÅ8/**ò|§w9Ñ¢ è!!Fȳ ¿"ßE Ãü»üqþeÔ™™™ÁÔ ÆâÆìÑ.~êE˜¨¯¯G˜À&„þµôÿî,Þ‹ÖÒg1vÕn¥D+ ††§g¦ëêë³ 3„z¦ÂÆm¶Uc2Kò ò={£ƆdWÔgí ŒH bDpÄPŒo¤D©¸s¨yäÈJ´îAŒYaMM vÄ^îž›ÞtÑ&Äbެû®èç‹Á£¨ZTTÔÃ|‘{Q/«««Ñ{ø¹¤h1õ Ã㆗7nÜÀì·»c‚o³Ù&L˜¼âÐ-jâ®,ZlÂnݺŠÝÝ¢uÿŽÖ]°Ùt‹y‚@ÊV”$Z lŒgŒL±êÂâ¶Åîô²ƒDûÇEA†*žkq´Yü5K®_ý–<‘gÙ¢]ü€^¯Çü‚úoH€ [oν»ËE»\q8ì%¥%©©É½½ä?7{[6"Úø„ØGÁ!AKðð~aQùFFRüUv–h·OÙ¢]üÀóçÏ©_!UÜÌþرe‹D‹­ss³33Óäéò¾lä Øíökϲôô_p’âÇBD»¾²DûÇåߨo3nVÙ"Ñ’²Ž²Ñú;’BÊ*…ü™¼u”!ZRV-D´Û§¬O´eì²^›ÕFý‰<a»26>6MÊKwOׂ˜ðù¾Ï©˜ðñgÑî˜BD»}ÊúD[Ê*1w›ººÍ¶¥ÛÒ58è!¬ £©ƒŠ §ÎŸ:vúØ‘“GŸ8|èØ¡ƒG8|`ß¡}{îÅ"Úí^ˆh·OY¿h»Ll.':.>2&6":&"&&6!AV+Çz¿GX¡‹ˆvc¢•5È•¡T¸$| _¡RøN´ííþNôw^éîéÚ°h¿}ùbvd¨Çdljn®nmkÆs5;;ãcïñ¯[´&sçõÛw/\о|5ùÒ</LJÅ*”Š6uPkÚ:Œ~¶„7"Úu‹Ö›øÜëèõhµßûeÇáå\^´¯æ&Í–ÖûFùç†ê?èªé4òÚz¹´ºÒÖgó”ß7ß|c6›Ûç‹Ñhìëëóü.‹ –©©©žןšòäÉððð 5ûûûÝÊXµòâ‚«ðüF˜Í-í¥k7ƒJïݯ¸ÿ âî]fH(çÊõÿŸ½÷~k#Ëö½ÿ¨÷×{ß÷¼çœ÷ž{î=wfNÏ™žžîiw;´N`’ LH 2Hd!I(“!¡ B @dLpŽí¿_´MFŒÁX×z<»Ö^»‚víõÙ«TªÊ>ÿË•Ÿ/ýòôâ¥êºÚ€Ø7>1¦´Ú,‡ ”ƒÞf·:Çz½.¸; þÔà{´V´†£†h}¥SSj6›`t8Ÿeÿ×ÖVûgÏ4hO»´¯ž¯Méb6¦“^mÔ­O&™dÿC;"Ô´#ÚáήöÅ¥¿3 ,¼ví‡Ãáú¤¨¨¨¯¯zFãa~~Àëïšš”Ia¿ÓkkkdÑß9øÍ‰{îÒ£GRRRNèuÇmTL\aQMIICYYcaa]YycM ¿®®¾Î'yùÌ\f~@ì“Ê$7oݬ¨,?Ìæ‚‚ŽÎv~T$QFª!2樻QØàU`A«»¾Vµôï³§aZ•JU\\„a~åÊø|þúúZrrÒÄpµ=¸9åìŒEg&>>+ÜÏçhñ™íi×ã€ö×7Oæ&%Óúë¿nå¼X+s«ÏI‰SnǤ{|`¨O5< WÈ^¼xNzÍÿ¿þú«ÛíÎÏÏßÚÚ‚Ål6WTTH¥Òmßk§P«V«ËÊÊÉCEfggkkk›ššMb»óóóÕÕÕõõõ™™™<oee%--íܹsX¡F£»ºº¨çk¢-ÖC½2==Ý´X6û€½zï{Ðc?v»Avÿ Eii)N¹¸¸¸SÚÄ䤨ø˜ø{qÁz/!>&.::6zD£¦ߤk¢¤¤¸¼¢ü~Ê}¤ª° «êêI-¯‰×Û×àõõ÷æ3ñ¹æÇÄÆtt´S>f‹©º†‹½²ªÒá´™Í-Íè·Êî°ûìÙ*22;?19ÞÝ£@z-—ËSRS„]ØÃãÖÏ¥aZ¢ÈeAYR AÇÖÖÖ‚VjjŠR©„9¨‰Ú…/B؉ÿíímlv¡Õj‰D`3‹Å2ôðY\\@sŒ#Ìz##ïÀC¾x1Œ„,£Ñ@6‡Õ"¸­¬,>>‡´SS.½^g±˜—–‰Åë7›M&“…÷åiÐc€öݼéîXï??œJúm;öåz±kð_UÍÿ—ÕÜ·´²`4ëú”Ým‚¥Ý¤Ö´ïÞ½C'â¼YÁNpnffÆh4“€ø'—ËÑÅäÁ^OŸ>…ÃÄÄì(  ?ÿüsww÷ôô4NSƒÁ022Âf³±N»Ý^UU…I(ùÞ÷Ê ¬«%û°'h±þ„„„ÑÑQ43I‹Q¡±Z«Õ 2™ öÜÜ\œÄ§´îÉœÜ,œê“ûˆË5YW_ ˜QoT§e0r•Ê’Ò’Na,Šn9#AjY,`Õh2–•—I¤bÀõÛoÿ ñŸ«­« ;•ee¥hdþåû¿ ð ˆ ZÁ>{¶hÇÆÈ­i@ÙªªJl‘]THðOëÙÐpíÝ»wsrr€ä8K×ÖVñA µ³³L¾a‰ŽŽÆì|Aî‹rOOL&mh¨GsÌ ‚„Ì2¯^½ g ü\ëêj1.§Äb1Œ$ë кÝSåø°Š‹‹¥R &ˆÚMM¨ÙÑÙòµµ·"ܤg¤ÿxîGXZ$»ÈqÁì‚BèˆÅ¾þ^ ™éh›““­ öÙ³UTÔÎ]ÇH^™,fW—°©‰—“›óàAÚN³šCŽZ?—†!hGŠ‹‹IØKJJšœüÚøøx²²²Ò3Ìæ7oî°“òAW__WTÄNOOÇ4w:ÈV1îRRîcÎ $ …`-Îö7v,hURR’œœLVòIñ9” Å¡b®:˜ÁÈu»§êêj¹\>) ‹Åš™™yw†\ùó`¬K$¬k¬VjGG ­zX½CÙ²Š’Õµ¿¿"‰ÜiL-oóóóä'­èP›Í†>%_»bÍHvae Òž>} ¸ÚívPö½ï½ÊÔY@ÀëAêf±Xà@ª°c555z½>øG;H”±*lŽÜäüÞ7 €4"¯(ÆF°6$‚äHhµ²²bµZçææ)~?-Çmn^NoojW†|2ìµZÝÛÛ[Å©Ô>äˆÃê!̨ ô «@;dºÂŽÞ¾ÞA%ù–Ôî°õöõ€¯à",6»U=²së2 ‹D*V«w¾—tM U(Åb‘²®`Ÿ=[õ+ûÈè zäÖˆGØz§°sD£¦äs–4ì@;??çÿƒW£Ñ€P³±C“UòE,ÖåÀÀ€ÓéÄü4¥|6|<R*û§§Ý>Ta`" ÖéF7|÷*ëõºÁÁDbª¥R füÔŸC Z‘¨ ©¦ @leeŽ\&“ö÷÷Á‚¨$}jÊòî ¹ûïŸ|Gü¬c€ @dEÈn‘OŒ\°ý‚tY,#Ç á>AŽó¬ãöÎ6·r?­âV*ºetŽHk¨”íGi¡B!÷OgŸC Zì±ÓéP©5šäéĈD½Z­BþÉžý, ¥å³ÈqÞÞƒ@FÂ]  §³@@»¹¹¥ ‡)„hi=ŒÒ ==rÔ÷Ñ fçä%%û9¿}û '¯5Ûsg´ÁW k>Ñh4µµµäö_¹ ´\·¡µáüµóIéyIyIrÒI™ù)ÙÌÐ\Vzrú½+Q¿Ô¶T7¶5KÐS’^I«¨µ±}gQÒ#éRt)” YŸ¬YØ x™Š…´WÚÒÕ‚&Ä‚Zq˜ßÉG+¬¡SÞ)ï—£U«¸ðG[8·KÛ¥}ÒiŒÔFÃHkø5Gm!›X.ï#`­ µE£!Qºt Áì3##‘%´ÙÙÙcccpF²M,QQQñ>),,„%))‰øÐBËÁF  h‘ªQ /AD$£™™™8œÁÁA‘HDÞ¨ý~÷5ؤ èÀÇf³;  s€ó{¿÷‡î¹3aÚà+ÄþêÕ+ÌÇ1­ ¯¿?hëuW¾K+»‘[¬Œšü¿“õ}~ef}k=´¡­ˆ5ÙMf»Õ"j>Ü|8>5î˜tÌÌͨ´* tÂ=19= £Ö¤E`xÔ4Š&c®±¾á>Xæçݳn4q{ܶ1ø43?ĶIÚFÍ£°XǬ²²ÑðÒãÜu¼ó>×ñq°Ö³+³>™ó‰×ëå77i´-¹>¼í{á.fß*•*´@)Æ0+•aÁ "/P"‚Ðb"ÂðMK¸HV*•´ HAnœžžÆ¸/p,kee…ÇãaJ5ñg§L&ÃPBs$rà4¦¹8¿? Ýó À{ßIð‘fÃg^ŽZSÛRs#õ™®Nd(ÊDú2áhiûH±PWÚ¥/ƒÊÍÕ¼„ܲ@2ɨƨõˆ@Dà¤GÕÓÜÕ¼¶±Ö;Ô Xö õ‘|!íì)»º»ÐÊh3Ê•rð©ªÕià ·èyQ«Õõ ucã.óbØ“+À ¹¹¹ˆ `*¢ ªŠŠŠ0‹'?HÈÊÊâr¹>°,--Á!##©-p  Z‡6‚ÓF Y‘•"sÅé™(HñæÍ ¥ŠŠ ŒˆõõuŒù.ÕÄãñÀBÊÀ &¯Dl6„F^w€ó{ßÛµ9Nƒ6ø À{ßu㦦&ÌY³Õ¯AŽ Z¯*âþ_ê{³X]׳š/Å}w=ã÷×Òw#ë?“ª~d´_-“Ç<¨ŠÈ,¾ÏmâB‘Œ"%EòZͯ®n®æò¹@¬ÇëÁ"jÅ=b‹Ã‚H ¦j š1ת VC«¸vHÄ‚FÓ³ÓH…a!Í) È-ë—aµdsá¨õG-«€‰è0ð2¸+b±˜[Í™ŸŸ£Ÿÿ`ÊHÊ”âlñ÷§…–Jö½ïY€ã€Vçi–ß|rHç²¾0mð€÷¾é&«««‡Ùê× G-r¯Ê†Êë÷¿+F?hþkbíŸNü×ãþß[ÌßE²‘û©¼ïsÛ.'•\Ê*I…3Ôìê [ºZF„ aCkƒgÞÃáqPÛÕÝe¶›AMd´¨o§¢JÚ'E«fa³R­´8-œ&Ž{ÖÍïä£ i> Zõ ÷!ýqÁ]²ÑðÒ²º²#ƒ–]Tð =53+cOMM»ßÈk ŸÈHK¨$¼@{z$ @|ÆçÏŸ×ÕÕù'ò_¹´ Uåõå×’¿Íà]Œ¯ùC çw?&þßßÇþ·›ì¿Sú¿¯äþq5Hªû.–ù3£,‰Q¤³z‹©êðè0¹X ¸بB @V6VŠzDÎ §Ûã–+å À3ìãSã:‹®©³ £ÕˆäM>4o¬$00vN:q8hEm4Œ´´¦ôh Ef¹°°à™õì«Ïòòr¨ƒ--_¯Ð =š„hßïà˜–äh A…ËIÿ•ÀùK|õã¸ßÄr¾‰­ú…å|clùÝJÿ‘U™_V[öw­++¯+ÇjÑ¿Šà°ãsø&uûx†›W´¡¤´Ðò¡_“w ÐÒòQ9"hë+A…+ ßþ÷¯?ÆCÿ%@ÏÅÿË_cÿùvÚ…".»¤¦„ÖÃh·è míj›Ÿ'¯È£•ÖÓª›[›OhùD™ö¸iО9h+ê+Øv~9#ȹRð IDAT·$ëeVäÁ ü õ0ZXUxÐ „-SÓ.÷ô­´žZžq¯®®ll<¤õ“ôï §A{ÚåÈmIu ­ŸW‹8GÉh)ÐN¹]> ŒqûÙi¥õ‹) Ú³ڱɱP'úá'‡¼4ÚVQëüâ|È_–~ÆÔâ°áÅï; u»ªZ¢²nÅfÜMÌV¨­6“ÕfVkÔ™ù¥·bÓoD?ˆIÊQ©G>{ŦCÄi=ýJƒöì€Öæ´†üs ;=dG€V¤Ñ÷”}vYY[9h]S“Q÷²X-™… 7cÓâ¯%Þ¿’˜|%&þj\J.£”û ì?¸Õ!’‘¨ÿ¾þ^E·œ¨zdxÒ5q˜pésèõ:jqbr\®…<ˆÓzú5Œ@ër¹FFÔ”šÍ&ÿÚµµU‡Ã~°åËÇg´§] Ú=ß9H¿‹ðhrÐÞŒy—Qù¹pw@Õ2ªjF;UCÍU5ùQIß^Ný§ÿ¸Ð&”’¨g±šÏŸÿ9—‘ËÈcdffÆÆÆvvvP¬ HRÉ•gRVt+òòó¨*³Å´ór?H'¸tÊK«;¬@[QQžP\\D”Ïç?|¸NªPXZZìêú[<ž™øøøõõ5ÊBÕ~±øLƒö´ë‘AûÛo¿I»U÷3‹î¥¤f—,,.>yúèÉÓÇ KKe\~|*+.…ù ·lλôÙtVù}xЮm¬­<\.®.R ½™#‘UöÔB{û¹2EE—¤¨¨üÁþõê?ÿî"•Ñ´‘‘‘h…20 ÊFGGMFXÄbQvvVu ×d6¢vD£ÎÈÌHHL¨«¯s8íHÁfØí[—H˜’rÿw¿ÿ]LLŒr ÐE«´´´ÊªJxbŽŸ™•YZVš‘‘ÞÒÒ|ÈŒ™Ö³ªaZ0¥§§Ûß©¨¨hooc³ õzÊ@éââBkkk~~~]]]dä€Târ¹àƒÁèêê2 d €q}}ýÊÊò ÅçƒvjÊ…ÏÅb1câû¼Ö§§§M&£Ýn#Z Úw¿ý–œY´{¹òARÊÍÔ7Rܸ—t#>•ñárå_o><íòÝ»wSSSc»²¸¸xȰ¿|ùr}}Z|ûö­Óé<4¼ÂI Z±B®¢·RÑS)‘•vv´vä×óÒ’Ï¥SWq@ ;²R€¶©‰—’šÂd1¡ ÷VZÛZQÅáV!è¸w.ËÓ¤q8UFhN­ MNN²;ìX˜Šq‡ª+W. ©`w‹KŠCëi ¡†hîÝ»G®WUUz½ó-†ƒÁ ßØÉM=-°Êb11@P¥Töc¢¾¤v Ù0ΠÎåšÌÎβ٬óós¹¹¹ßõ~ÞøJÐÊdRÌ8¼ÈkñÙ!yoiiÁ¤SŒÉÉ ùô´;är=h沈¾\ù/¿¿¤3ÚI¯ù¿ ˜eÑq[[[°˜Í把 ©Tº½½Ú¥¥¥ÒÒRtPww÷‹/¨·J={öÌh4üñLOOŸžžtÑŠÍf …Bx>þÝÚÚŠæ8=Âî‘o‡Ïhõ}ïPoßp•Ñrꚮݹ5¤nb¥Š2PV(*lmÏã5gÖÔ§Ä&\¸—’b¶ZIÔ í¤kv€a¥ €ÕÞÑÖÑÑ.–ˆÑ:ÇD……™˜Ý´‘Q‘üfþN±[wÖõ´è\øcmb‰˜ÉÌGÕ7Ì,"Q¢RÈc=­!Ô0í^—Ž×'&ÆQžýÚ¬¬Lr”ÅbÆðeUªA ŒÖVÁ;wàƒŒÚÛÛƒuØ'ŸC Z¯Q¡Pà3Â#j·===˜¤à°‹Ùì¹¹ÙwjÈõ8ßÑ :e—oÜ8àredüýå•W}^»øöíÛ´´´µµµÅÅÅÁÁÁ™™@T£Ñ¼~ýº­­ ÜE777ÏÏÏ´\.E­Íf›]YYyúô©\.×ëõ˜c¢ ØÄO?ý„¤M`±Z­Ÿ„'-‡ÏhWÖw¾….¬,ïhoŦÿ|óAJVZ‡ Ķu0[ÚrAÙºÆ4VQ|TBÂùˆ¡DA¢ž?hñ_"•DEEMa—)ìØ¸àÕiIΊ‚Þ KLLvu´YÙY ou ãËd6Þ½X*«*uzXËkjd±wî·ºpˆEUCC}EeyÈc=­!Ô3Ú‰ ?ÐÖÖÖŽŒŒ m·nÝ„…Édvw+à ‘Hîܹ ô‚Äz………°í©0-.R"pÀ©©©HäM&ãƒi€nRR>&úkÚÃwäžw?~¼}?-â€Ë•õ¥ÔUÜÐÂŽ¬ U*•HRë|’““ƒ¤§/ªD"R[¸šEEEXDw£9µ€6??‰,|ÀÔŽŽTsss¨w[ZZ>/OZŸÑ:&£æQ¨{ÖM@{52åÛË.FfÆ&ÇWpR*8 ¥qE¥ÑéÙ·ãÓ2²¹ÿþçÛÿx×ñy&‹É*`åææ`âÒÞÞ†¼Öl1s¸UÈ_ŒÜšÚjdÅxÉÎÉŽ‰‰îWöa1Ïw3”F;‚¤¶·¯'%5kVu÷( Y…ì8ôõ÷býë¨Å¿]H®<ÓúÕj¶¢bГ“@Kî1v:ÈVKKKRRîGDDÀ"v‚µÈå@™7v,ËËK%%%ÉÉɤíÉÅçP‚¶¾¾Ž|^è`·{ŠÏoBR¾Žeff¸Ýô¥ãce´byDTä—+³ò˜?%½ÚwïÞ‘ŒV(644•[,–7oÞ¼zõjxx˜Çã•––®®®´hˆ¬iî³gÏüAËb±àµ¡!8*ŒG½&“©¾¾þ³rðÄåð ñÎLLO@gf h¯E¥þá|ÒŸ¯füþûùéÇ+×ÿ½tå¯_¿›÷í•ôÿùí­ö® SÅQGG;QtbrœT!y•Ê$ ¦Ýasûî“R vu ‰2]µ™Ø"à šªG†»D]( —_%R±Z=<åvÁróÖM¥²_&—jGµ!ô´†Vô ¨Ç3`4 ËË;÷ #"‘/kA_pD¥RY,fn–…¯^¯°ÛíÄ‚4W*•p¹Ü#ÜõIñ9” ‰ºaNÄVVV`&ÒÙÙ‰weeÙår!‹š™™y§†\õmZÁù/W^¼‘d4¸CØ´ ,rД””ÍÍMƒÁ€pDq£ žðÆÆƒÁ@-@ ľ|ùR*•ö÷÷omm¥¦¦Â@z}}¬EZÌçóÑðúõë@,ªz{{ÑÝŸ…'*Gþ-À–Ç®úùú½Ÿ®Æ_¸~¯¸¢zhX9ªS÷ôu'¥çûõ¨4¥jø‹Ö€¯iýÊ5Œ@ûÜzt:ÝIÇçP‚vl̉ƒ¬¬¬DòÞÛÛƒnFþÞÜ̯õ ñWØñGîÈ=A{7‘ñ‘Ë•ßÝñ¿ëDÞ‰ü•Ãáddd ‹ýõ×_‘€b>ÔØØˆyŸL&AAV8 ãгn·›ºjeeF2I‚ƒ×ëÅi€†È}á;6qñâEÔãâââggá‰ÊÑA;½óL tjçÿ”_€›"Æ)×~pÄØ¸“×Ä£ŸVA+ѯ´ˆl …üÈéìáãs(AK.£«TƒÍ’zbœžvcÑl6Ñ¿íù¤ŽÜ´ÑIyÔåÊïÏŸ»~ó×o~sùú/EDË•ÿþç¿ÿŽLµX,£»‚Rï§D‡Úl6ô)’Ú÷¾û¤æææŒF#ñ‘ É.à šbµ( —ššBr¼°°àûÎøñ½{÷¦§§ív;’ãÏÉÀ/"Ç- gt.œÎíææ”.¦ ¥õ0zœïhkx×¢\¹“q÷AK»dÞëY]]š˜œ`°9Ä“œ?3ë=*í!_‡ ´­]‚Ù9ÏÜü,­´žfE´yüø­Ÿ¤î™)´gAs×1ä·] xjeþÌ,:P^½z¥T*Ãôiï ÚIÇÖÖÖ6-´œn¡®`ÑrxY^]>¥  y¾F…c‚ödN­¯WŽÚÕÕÕy¯w~º#^¯Ã$Ô¡•Z>È£GÂî2§Aù¾ð/ Zç„3ä™~Øé!/MРýrdÐnnn—•ŸÿåöOoŸ»p zéjd§PL³––S"4h&§´³ÞÙ“9س,‡¼4Aƒö Èq@Ÿ˜’ö@’*"šö ãnL:³°¨¸´ Z^Å1˜LþoËOB|±éÅÅÅPm–/)aÚýÞþy|çO´gDÙ‘4h¿€´yÌæ¼¼«3;»µ¨¸«¸„ÇÈgå0òrŒØ{ .õ–––ÒÒÒ’v…Ãáx<ž=ã£H$2 '|ÉC­é/˜¿ #о{÷N©T²Ùìšš¯×‹@‡=7›ÍXäquï}¿6ÄèxóæM@Upsʙܼ211188Hmnmm m÷ §4hψ´Ïž=õ.ÌÏÍÏí§«««á2ºNƒ´‰÷ïgå0rròrró²³øÏÈËÏÛF>3?íAZn~þÊê ‰zóóó;/lŸœœšš²Ûí………GËË˨ZXX°Ùl‹Q‹•••}}}(¬¯¯ÏÍÍ!u»Ýd%ÓÓÓXDq:vŸ`µ¤-ú§cccäÇWXÜØØ€6ª×ë›à3::¡Ñh°žgZΘ„h].ŸÏÇÐÀ³­­íùóç@£D"™™™éíímll$¿Bĸ;A¢€ªàæ”3b&f´ ƒËå’maP444`0î÷[‰°íÉ%õgCŽ Zœr…L")ºe{ªL.åñ½Þyj[ûGñßCöÈ'õÝË—/ÃëFÇã€6—‘SQY^ßP·Ÿfådêõ:õ@Äøøx´"‹ä= (¢@gg'fâL&ƒ smZPV¥Rõ÷÷cÐ!%­ªªªPX^½zµ¸¸øþýûÙÙÙ`6 =ÈSAÓêêj¤Ë]]]^Ÿ\¼xQ†òinnFP())ªœCCZNL´r¹ç9Sd«8ÿq&ƒšÔ/õ1uq,8o1d‚«‚›SÎpÃ8êéé¡@‹©§V«MLL cЧð8r“É„æï4nß´M Ÿí/R¹dbbœl3;btVºO2220 DÚ„~D&ƒwÇÓ§Oe2YAAÎ]¤D‡´8¡qž|žé‹H0hÿüß h¿ùÓ7ƒ¶€ÍBйº€”­m­VC¢^h ’’’2?Ì»‘¤"ï,**B ‹OÑØ2H+Â`XÐqqq˜ÎÃlT Ÿ¨ÄF/_¾ Zcgð>Ôn;‡†´œ˜„hq*búˆBØé(À²©©‰²C²Öf„D½ý@[__ßÛÛ‹E°¼ñ·Â'¾÷uÃîZØ h‘¡bU“ZÊŸgTTelFžŠÆÄÄ ÔćÚ`ç/OZNT´ÍÍÍ„”HÕüA‹‚Q€a‚0…¹ f– fpUpóg꙲D~ÌN€68…Ç„]­VÂ^ÏÌÌ<ä¶Ï¶ ´¼ÐâƒõqsuuGÉßÎ2>d‰TìÚääd 6ÿË¿8çjjj¨S ­0ÂH,#Ù¥vþâè;4‡Û‚ÑhD  ÞûNè‘‘œÊ<Isii)€~ß¾};55œ“oP0ßB®ÿ††TáäNº¡ Õ—ÿüý…€vpdPÖ+“÷É÷TiÔh3îÚ ‚gWf}2ç¯×ËonÒh÷-9„ É+:8LLLÄü2>+“É„Ï +§@‹±Ãb±h‰% €î+..Æv}S° ¬Ó£h1÷‚%Ø944 åÄ$Œ@+•JAJÄ™W¯^UUUál|ïC)‚ŒÍfCô@ŠPƒAAüý«‚›#¦ù;¿?{  Náq´ÈŠ0ž1Ÿqã¦í‡ÙöÙ–c‚©òH’ RùÊW8@{áÂêÒ1¹ïŽœsäT#—ú- Ö611¡P(ü/&£ï222 `0h„¦¦&´Â€ä.`g60@r` àlàógÏ@⺺: !dc\.{‹©q¡­/>€¶¨“û®8|âô“F^ƒÁøáþa’\âÓ@Áår•••a¶ÚY­VLtàŒÏ6''‡\:MÑ#À0 z½†î»téÒ ÅàÂGÅPÅ ÓëõÁ Å„ s/ô2Úç"–“0-NHŒœ“G8-ÁQœ´5ÃÃØbÖŽHR[[KÀP…Ч=åLä¬68…'/:ÅÜ FBƒæÐþ™•c‚xÅÂûúõëm_¢ƒ³íåË—8{vB­T´ß¥crÝ>´àh\\ʈ¿`§?hQ‹Vèt‡ƒ¾ €I&“Ið— !˜Z’¶’ÉnTTª°æÌÌLlUXÖâ─åB9hÙ,ÐQ£Ñhw…¼¼AçµZ]ßP76>F¢†}ü®àLjÀÔdÛwcpww7¹§ ´Ãj1İ*TaÄ!^ ¿ý£ñ­P…¿¥¥Á’ãçóù‹>A×l•øà AB§˜Íæçဖ“’0-È*“ÉX,& ˜k"J`ÅÆÆ&$$à\Å”ÜiŒ ç€*ò¥•s2‰$ÎDÀB-""¦…1h÷¼@~É„¬ ôý¡?ü3+ÇmCckÊE%²K>Až4333å“öŽ6ÐOÜ@ ÚáÔ„ÊžÈhŸ?N~Ó4¶µµ¡ —Ë;::p±ï}—.€ œÈ}1¶)vööö6ðç“÷~X .„PŽZVÃ{àepWÄb1·š3??G¾M? ¸Tëoñ¯"eü'Á>{³¶=i9KF }¿‹ j¢ïÿPw—¨Ú³yðúXô—0mð$:ˆ¹^¯q§¿¿ÿÍ›7‡Ùöٖ〶®¾fhx)B<º 2 }}}$µòeQµŸZÐý‚¬mASÿó›ÀÌ G‡¢ûFFFÞûæ†`*òÚmß}@ €Šu"QÃI£ Ð ð£9ú‰26$Üg´ì¢‚é©™Y{jjÚýF^ýDFZB%áÚÓ#aÚà+˜,#‚‘zÛïÎì¯YŽ Ú‘5&ÀdÕëõm_ÿðÐV«)këª)Ðîy…„\E¡ªÐeXÌËËö€[Oøôôô ï ”J%¹…9.éM2†‘LÛ)))]]]pp¹\äÇ]oß¾˜Éc&''±!…B£Ip!„rdÐâÄ^XXðÌzöU‡ÜîK -!´G“0íû ~OËW.Ç­D*æ7óZ|h¿9SCã‡Ç#4ìü¯­âTÌÏÏQÛÚóc'Æ€K1ûy¼’€áñxþw 4߯|@!„rІ:ÒBËG$¼žsJ$<@KËGå8`Ä,Õ5åBκŸ‚²oÞžÔõù—/_–––Êd2êjá.Gë‹Ö®Ö¹ùÙyòŠ1òhKëW«4hÏhmNkÈ?—°ÓCvd0h_¿yýìù3Z?—>ñ|ieéÈ Œ‰OÏ$ß?ҙ”Ô‘•-º›}þ—+?_úå'èÅKÕuµTÔƒ_¯¢[NT=2<éš8NѨ'&?äGkEk8jxvjÊ¥×ë,óÒÒ"e\XðºÝSÔâòòÒøøØžUÁÍpÆÇ26æ@Èb1oܸ¡R¯--Í7oÞÝAsLL4ØI@ÐÜf·Š%âʪŠÞ¾Þ¦&ÞíÛ·FÖ‰ù>ö„ÉbþéOB«²ò²¬ì,X`!G­'¡aZ¯Q¡PŠH7sssív[?NQâ3??—••E®T7?ÀÓjµ„wF»g ¿á›Œ@CÞ§D Úßþö›Ñl®çñkêkêjêxü–¹¹yÀG–〖‘—ãñxVÌv%øÅïŠn‰z ¥RR@nXDfù ýjh8‰»’““ããã;…H=‡ÕCQw£ºDB44[vÖC6 ¹Ñd@Ùd6J$⪪ʟþY§år9‚ÖéòU_FÛÚÖŠænÕȈ:ä< õ„4Œ@Ëáp}¢ø¥¦¦‚…ÄŽó“äЪ²²Òë® n~€3)o\\\ƒ68…Ÿ››…%;;+##ƒŸBï׬Gío¿ed3îD±¢¢Ë¢¢Kwîw½[PRV³¼¼òèñã—ä=~B?Mú“äX ÍÇÜyÊë“…]YÜ•ååedŸò}@ RFGGï²²4…e|b ³lí¨¦¸¤ÆÄÄD6»°¤´$!!al܉,UÔzþÚl¬‚Ê F.‡SÕÜÒ|ùòe’¿¶··Àh{ûö-XœcŒÊÂÂP|tTr$ÐzF ­¯¯ëéÙ!%vg/uãHäi b±ˆ¢£?;š´8Cgg=á Úà~ppÇŒ±ÝÕ%D°ð¿õë«Õ#ƒöÝoï’S3Ó3ÿáNטøÜ_®E\ºz ú˵ëR¹‚êµwïÞc»‚èOž}º±±A^™ /_¾¤^üüùóùùùééi8“×ïœI9hóòsmvÛî…âBÞ¡äv»ñÑ565ìyéÿ%RITTPä©í@)£7èøÍü»w£òò å­Û·y ø¬ºƒ@ܼº†‹4ImOo÷/—˜ÚÜÌ\±ÑóçÏ•Œê´pNLLvu† ´ž„†hE¢.‘H´¼¼@`î;Èùù9dn˜RMüÙÐÜá°à¼q@œÂºÓÓn•j ¾téÒääDÈ;5äБÞEïÆö鿵µåÕå@{?-½ÿ®ùL&·¶Žê5d¸×®]C§TWWãÌËÈÈÐét &yï7ñù›OH”5›Í(loowttÔÖÖÖÔÔTTT8Nÿ×Qí÷©àªÓ/ÇÌh5ZqWL>1ï ,uõµƒC$êùî:>Ïd1Y¬ÜÜdŸÈ2ÁKعÕ$— +‡[ \¼t‘ÏoTí¼é˜Ü¹Ç86†Ü-  ‰%¸¹\.ËÊÊÂâƒô?üðñÁž ?NI¹ÿýßâè–cœ“¹o¿²/äH õ$4Œ@ÏÝØ³ IDAT;6æ +++KJJz{{¨Ý)..F!«´´dffšjBU77™Œ8oø@Æ  ¾`³Y‹ŠØMM<‰D11Aƒ6°#¥ i]CÝÒÊÒÌÜL%§rT?zÀ¥ã¬œìƒïtMLN\XX ½æÿš<ä² ,:nkkK©T" =ð,ššš`A ÛÓÓóöí[Ì– y½¼V«åñxHpŸ>}*“É òóóq&À­¿¿¿µµokkS©Tl6žØègÇáÉÉq@››—ƒQ­Ú•!Ÿ ûD­V÷ööVq*‘5’¨4Š%¢ŽŽv¢Àõ{V½^'•JûÚ6·ï"0VkµYv }=6»F個d=”% 9V«Ra[ª¡A$µÄ ®\!Sôw÷ìX|>ƒ]]BÿÝ õŒiÌs:ÈÇ4š‘…/eG"‹ôtÃ÷SüÑHU7?ØycO«ƒþñù4‚6ø @ssscc’ZÄëëׯӠ îÈÅ•Å*nÕý´ûÉ)ÉM-M[€¶¨„}ð®õ u8çH¯¼hLKK[[[#/‚E-ø è®ç΃…¼ªLÅÜ:K@h +±X,B¡Ðår¡Ibbâææf}}=Vh0ð?33ùƒÁÀÿÏÇÁ—ã€6+'Ÿ¶ U¬­­n5·¤´˜þñ ­¡Ò0í©Ò0mðµz˜Åb!#šÓ—Ž÷ìÈåÕåªêªÖŽVBÙ@[RVüÑ;]í;éµÐ"…MOO§@;33R"g}öìYVVÚ'Ožäää¿9Í···­VkWW×µk×°4¤Ab´BüîÝ;XBþ.÷O’ã<븽³Ã­ÜO«¸•ŠnýPZC¥4h?W|>u  ¾°²²lµZ,óè¨vy™¾ëxïŽ|¸ùpûñöGï:.-+þè®v»ôZhBÿŒÖív766“oÞ¼)..öÏhÑÅ[[[¤ˆ Oø`‹\.W$©Tª;wîõh4ø  ÕjIákí´ Œ„3º@Ng€vssJSÐÒz=ÎÏ{JËK¾Óµ‰ÏsŽíqé”E2š’’²¹¹Ipˆ ¸³³@]ZZЉ‰¡@ ¦J$’”äóù/^¼J¥B¡IíÄÄÄíÛ·)`¿÷ãëWÚÖ.Áìœgn~–VZO³"Úø~÷Gë'¨{fêÔÖê A{" Ý~²½OF[rð®<~ãŒg†ô@{ýúõºº:ðÃáddd ïD Kp ¢õõõ€kDD„N§# %ÝdUµµµ øßþö7‡Ã2þ^¸pákm‡¤”mZh9ÝòöíÛP°ð“åÕåÓZQÓÜÑ,”uÒúI*¶ jW—Ö–µ÷TtóÞßÑ–|§k#¯a}}ô˜j±XFw)/xËËË=ÂÚЭÀ§Ó鬬¬D¾ûìÙ3ò³òu,2W»Ý¾¾¾N~G‹¶sssÀ9þ#Ÿ§Éz¨úÂEŽÚÕÕÕy¯w~º#^¯Ÿg¨C+-´|ŒDò»yZ>I¾h7¶7¼Ë^Z «Wñé¬Td÷-»¸°¾¡ÞÿîV­®æ64Ö¿xñü0LîfA^‹¬Ø8ÊYæ0¨6¶6?}L¥­G[ûvss³¸¬üü/·ºxûÜ…[ÐKW#;…bšµ´œ¡A{49u }üì±? h=9¥@;¢Qwt¶ v‡ýOÀ D.ÛÖÖ&‹©çW|m0¨zû{åÝòí'Ûëë¢NƒÉphãSÒRREDÓtÜIg—–AË«8“)ÔÁ––¯W´{> g¿hvrÇ¡AûE9%BêÜÂܬwö£ 78¤¡Ÿ´a÷Ü¥Ó/ƒjÂ5Á,`––—²Ø¬ÒŠÒ…¥…ƒA›ÇlÎËë`±:³³[‹Š»ŠKxŒ|V#/‡Áˆ½—PÁáRQoee¥ºº3Ê¢Ñhó]oww·Åbq8'‘i9“F }÷îR©d³Ù555^¯I 9ÎÌÌ ¹£ƒH$½}û6ÀUp˜˜˜¤ÖIœÉªªÖÖÖÁ~áô4‚v}sÝ9îô ,ŽqÇ퇨˜tO‚F!ÇçáuqeQ«×"Åééëù¨Â Î Ë +Y}¸j³¯l5ŒŽêGQØÏBƒö HÀ zúüé¸k<%- óÎð-@›xÿ~V#''/'7/;›ÿŒ¼ü¼aä3óÓ¤åæç¯¬®¨‡ˆðóÏ?óx< r,.--åçç߸që!cƱ±1 ƒÑhœŸŸÇ¢Ýn÷x‹ì‚þþµµÁ¡Áìœl$#£# M3O,›¬¦Æ¦F°šÍj¸1ò™Y™]â.üOLJ´Ø-p˜ž.)-E9¨Äšس¶¹æñz\3““'¡ÓêQµÑl øPпù$ø ¶Ø,³ÁŸ©ÈtÙÅìs? ­Õae0]nzEeplÙ´ úã'Oïþæ eúþãÈ‘ï:h Ø,„ƒÕ}„<¥K«Õ¨ÐÆÆÆb&Ž0Z¤¶‰$..XMJJ" …O||<,ééé---0šL&¬Ñ„€¶¨¨Èb±477ÏÎΆ2„ÓF äg­À*A8 ûíÛ·…B!Ê‹‹‹@ŽkOçׯ_;òëDå\…€ 6û?É'@N#hw㎢â¢I÷$Êz£žUÈBB642„MgÔÈeçæhA߬ì,°(Ë7ünÀí÷?|/ ‹K‹ €jdÀݽÝÈ‘-Æ€$Øê4'gGÿùêÿü¯_þõ$ôRäw“áýî·îDÆÆÇ–w^©»áp:üíï} íìÇŽm=Þú»&°Û—¯\-ŽXŹ´¼tç²seOÐâÌàÖÔ]¼uþ—ÈŸ/Ý^¹ÝÝ«¤Y{d9h Ù¬™™™å}4´¶h4#$êˆ"@”••–˜_ëõz‚U ´sss°`Íh(0 À‹hSRR0újjjÐ*„œ–°0-掄ÈS)v"®‚ˆHF333·}D"¨¹§3„z „r®zôȼ9¥ ªk«e ·š‹¸RÉ©2QXXZHJNššž:´‰É‰hÛÓßs/ñÞòêòÀÐ@VN–wÉw/Îyùy)©)u uþày¸ý°²¶ô»»ÿý—üÿç2ëŸ>¿2ÿ)’õ'ÌЗ¿¾û•R³Å<7?Ö‚Áþv¸™­æ¢ò"ZèÌÜL0h1 Éeä’kì|bÁ–`Ð6µ7G3órs˜Ü|v#Ñ&'¯­Ò éL:Z }ª> ªÅ•EœÆë›ë{êÊÃ|þ{¶ƒ¬õìʬOæ|âõzùÍMí?€vee%77¤¬­­EÃÐ:Θ˜˜MŸ V&“!`…h1î&&&JKKMôýÌ´|L´R©ìù^½zUUUE.cÈ€µ8 ‹…ÃãñÈ K‚ÉJ(š"ñ œªˆ„%hwY“I­fTÃ.fONí¤¶­T.9VÖWnÞº9î-ª²s³‰%3+ªŠ߸y£½³>HmmNé¶m´uüêooüó÷÷þÛ ÿý$ôZêG £/^½xþâ9¥@¯{Æ=¿0¯Õkýíp3šÕ8Þ‚vdt„UÀ‚‘ä¯}ʾ`KhQ5æ³Ûiýì:»0»¾µÐ þ=øwÐFû®8|âô“F^ƒÁh Qº,ÜÚÚ¡T*)Kjjª\.ÇøAoܸ‹D"éïïYïÞ½‹ˆC–|G;<<Œø²¸¸Ò0NËi—0­ÍfëììÄ)q„“ÿÅ‹>---˜n‚—ÈM1X07%¿B v&+ñ°åPE$\A‹YaQ!»ˆM}Y+ŽI@,x ú~íð`jZêêÃU丰û£7 €$£¼²Ü9î„óÄÔDÀ½¸ØÊ”gª°‚q9òÇ 7ÿòùõÆ_nÅ^Ñê´Ož>Ù~¼M©Ån™öLÏyçLV“¿ýñÓÇÈqÁKL> Z³ÍŒ Žhay¡Š[…­[@KëéQÿKÇ*•J£Ñhw…F¢†}QQZMNN2™Lä»”epp0999==]   „0õÞ½{|>uuƒ+·Z­=dU˜°“›ªh¡e? #Ж2™ ™kYYÙÜÜÙ7oÞ`(UTT€²ëëë8çÁTòJ±`g²Ç–––(ç€*"Ïž=ãp8áZ¨Î¨‹‰q¹]d€©®­f0‘¶rª9 f>+_,[íÖˆéé¹y¹úöO°½Ù9ÙhPœTê|f>bÉ¥°϶Ÿlãhñÿ$°›ð6¶6ü3PŸÒ€ŒGgÐYÖ}ó­gÎsåê ´Cv§}~q¾ŠSÅðý¤¾±Þ»è ¶„'´î§hYL ø”Á]‹ÅÜjÎüüø¨ŸÌÈåâ-ŸPUÄrpCZhÙO´ï}ßÈ‚|<°Â¿jOgŸªös äTƒI-â&\}ʾ!õ(‚EÔÎÌ΀I@¦T.UkÕ`3,s s„OÁ…•õNÓÛßk±Y‚˜{Òêšv‹H^±U#æc“c?FÂñú§§äC€V®Tâ󙚙Úô%èZO­R etzvzfn攫kÚev˜½ËÞí'Ûgì(|/~o›Ÿ'¯È£•ÖÓª›[›OhùD™ö¸iÐ~½:ëEèžsOÏMOÏŸn›Æ~Ny¦ÔGO±£h–©i—{zŠVZO­NϸWWW66ÒúI:á?Ì«3¿Ð>ÜzxðoÃQ×7×÷ûjAvaÖåq…….,/˜ì&œ£gì(>€Öíꋘ…쇾ÜÜœ„Ä„¼üârMÖÕ×v÷(HÔ mIiIOo7’ÚʪJø(ºåLsxxÈh2–•—I¤âú†úo¿ý@k0êà€H!‹ÆÆeå¥ÈtÑ<++³¬¬Ôj³`ÃSÐ*¨¨¬ ‹ð·Ù­ ,Úbmì¢Â£]…¦5|5¼@k·Ûúûû?²ˆácµZ¨Œ‚3( +…eqq'?Hi±˜‘¡ÎÏÏéééýý}”3†'ª°øðáz]]J5ìLƒöc ýõ×·¿¾=c Ö~´ó‡B”cÒ©5ŽŽè5*ÍÐFmuÚzú°8¢×¬F€db75â¬Ò[ô“tÅä0 Œ @%½ä‘8Ÿ‚-‡Ùðx_Ðîئ3ë};¨£&=j)ÐbëT+˘E> Ÿ]Øù¥ˆ ÅÎãCCv¯[ÕÝ=Ø-îã?T¦”¹f\€®Z¯Ö ÷ õiMZ‹Ó¢QRkƒØÖ™u*­ >¨¥@|m}K½´G’ÇΓ÷ÉûUý{ªrHYÝÀmliõJ¡BIgJz ZI{¤-íÍ%­ÂV~±B$Vˆ‹Ê‹x-¨*,-É»:ÄíIiIÕ ÕÍí|vi!ЊU‘•@kkòÙùB©0)5©IÀówªÒ2ÓÚºÚPxý ‚[±cï–Ý õkRYŸªo`XªV :…%…”ƒëAVšr¨eEŸœ]ÆîµSµ²iie©H&’vK‹Ë‹Û»Úù­üØ„X^ rn¶²KÙd %%;c$ÀYÀ ÞI·ᣯΠ1hAˆ=ïåùì –Þ¼}³Ÿ¾xùbcsãé³§TáçÓ£8¨ƒA;=? ~TеJg6èLz“ÍŒŒVg2ŒÙQåð å’É•rû¤ehûÕýØÐÔìÇ6IΧ`ËGwà`ÐRGát9û‡|ûiYwÔøAûTö qh{‡z±NðÔµF­gÁv:&Èqq¼À$`Ù*iÅFá) 0{˜òLuÈ:`Œ‘øÕäê7Ћ­à „#ñ%s’øbå“Ó®'Åí‡X €¬ì­´Ò*Åð·:¤¨Çëùè«3—Ö–B ÚYïll\쉾 Õ4ÀÒë·¯÷Ö7¯Åbñ­Û·ú•ý¤ Pîëü¥ôå«—[Û[¿¿ñÙógÛ¶_½~EqPÀÆ~ fÀŒÃ€Öì°(‡UZƒnD§ÕuØð¨fH;¢Õô«ÀWâf°:å H&Tqj-â1ø„Ý-@)$Ž–¹…ƒ:¿8¶ƒÖÿ(“XEª­ÖA5ÃÚ‘ýÔi{•¶q;qCÚÐÖ ” O䬨OŒ—Ç%êap¨B^Žs¯]Ú;š 053…B‡t´Àªm̆*申«» d®JµÔW (ph&» +ÇzvÖ¦’ï€÷<ŠG + fûéâê"fÊ™y™Œ Zi¥5$ZXVèö¸§Œß•õ•bIm(A»çX‘†Ë²Šª ‰L²úp5ز¼¶Ìãóº$]œjÎzè€çÑS –^½yEôÙ‹gF³±®¾®Cر¾±®Ñjþýý{ÄV‹TÃ*Ê9Tº´²TÉ©ÔéuÏ_>'–'ÏžÈòF^ãÖ£-bÁAMLZ÷¬›|Åx°‚€ÖV ÜB5¼¯‹Ã£#:³žø -ëî“õË”#J(ò<”Ty¿ù€7à  …=Àr˜}@â»h©£À>h£Ø±`Õ´À0qÓ˜4€¢wÉ‹òN;é@JŠ2ð‰<àÇ.AQÆîa¨B4¥ ªQr_>‚^º]Èt±f,b¶1bÁ>“UAIÆ|èŒÆý¾¼!¿¨n¨¾påÂ~¤•VZ¿¼ž»xî~Æ}`å€qºŸn?Ù^^_?Ђ£B‘×Ìkëhcä3‡ƒ-hõoÿóßî%Þƒ‘]ÌxûìÞ }óúåë—;úê%ÈÚÄoRt+JJKÚ;Ú'&'¾ûËwÍ-ÍÝ=ݤ0éšüà:EæÚØÔx/ážN§{úìé£Çzûz£c¢±“X$>8¨@k³‚%€ÓáÕh3 Ž kúžþ€*‹ÓЂ=;Ïœu£0 À&ôVýÿßÞy?µ¹åi¾ïo3?Îþ=]µµÕU;µ[S;?ìÜàžéê{g·º{ºq¾×91gưÉ9ˆœÁˆ"K"0¶1ÆöÍ}·ö‘ëµ.!|õŠô<õ˜zuÞs¾'¼Òù¼_I`àA¾ˆ$ÈA¾;§dÑ~(T›´0 U‹ ·Ïà4øªÕkqŒQ©ÛÕ˜ÒS L 4 Éœƒ6]j¢k„Â}ÃÀðš±ù8…Û M·8Ç1bV©ª°´–³˜´¨¾JÚ}÷íØ»ƒ¦iÇ{×—».]»d hgfgà9%«´Ãc×¼/!‹òìIaqaL\Œe ZmÞ²¹¼²9{VnVxDø¢ ýö»o¿þök ¢Ÿ¿_k{+ÖH×¥»å{ ™¢‹«ËÀàJĨ¹ì~6ý,>1Þôk9YHdO>…´×UªÖZm¯±W׫³Ý€DyM¥ª¹QYUDðg§´-€ ‚FReÉ"2×Âòª†*ñ]ßNÓW«~V²h¿ˆ‰j v©³#[CaÁK<ÄqmSmAYAe}%ö ô<ªzˆ¢Úœ $b1þξÎþá~q«‡"ñÅÃV]+*W·¢É¼³°-žÆÍÍccæ Ýs`ÏöÝÛišv¼ÁZ[@‹×uM]M~QþóÏW=hG=N{ˆw½Ë*Ênß¹mY‚V_~õ%~b+-+Eš»h›TÀ’X—Ù7³ž=»{»_}ýÊ8hY‘û;»8 ®8ø€7ä0Fˆ•IJIÚ²mËÞ/÷̼úÙÍnô½ú…@+¾ kâ¥Ínïj¯i¬«VÕªZµ=ZóSmm•ªÊ’ÊTŒÑuëÿ!™3ýÑÿ¡~ðÜEeË’Ešó‚v©³èÐw(k”È2KªÞ µ¨Âôv7€-¾8-&b"WÆñ¼'¦Äš>©Å½ÅÛÛŒG q L w_çB³˜ÚÉ©IÓw•kÍŸ=*!j÷W»·íÜFÓ´ãí´ÛÉ몗-­qÈxç ‰µ«´àâ½û÷ŒÃÆ©çS9¹9Àªe ZmwÚÞ n@r™•y/øžuÐÖ7Õ›îG^¿„ÁªðÈðmøÚ®i?á|uN:Ÿì1ô Dˆš+ĸÃÈÈÌÀýViΩWo^uõvY­øoæ~¹5ÝœcÓ{Èvé¢Gk´KŠfúßaåêgaZ¼&‘jãµ0<6lþêhwîÛ¹Åi MÓŽ÷Ö[/^¹h h‘ü””–œt9YßX¿Ê@»{ÏîŠªŠªš*“k«úû K “S“‹Ü ÈÍÏ5½cüóñíÕëWó òïVVW. Z$²Ó/§…ëêbãc•åʇáCBC0à©!*‹©æ 1Vƒ´,ÇMCgO§К~Å¥[cƒ"ÈÛ,r»ÄGjجiž´Kš€gú¤VΡ.is2Zä÷EeE ¾ùg´í޽;6mÛDÓ´ã ÖÚÚ©gSQ±QwïÝVVhO>ºtóÖMá[¾·:t¸ß¼æ4 IDATVÀâÒb0æùÛnÍKÚ={÷¤g¥‡G„ƒ²‹~ë “PM9bAqò`Eºbpt Sd(GÞH5W¸ÁZ+ mÓ™þh‘Üh±—Ážy3ÚÕ> ËÏhûŒ}uc“ï?£ŠrÚí´qëFš¦o°öâåÅA;ûz¶¦®&,"läñˆT¸:@ûaž÷—‚¬V]oÊ Ÿ?YcÆ&®ëÖÍ Z㈈Òõê–=¶i¨ø†ðœÿø} Ì´ÈeÅß‘1í¶Ûþºù¯4M;Þ·lô¼ì¹(hñÊbÇÆÇÌ ×2h‘à^¿yÝvÐÖ©ë°ßa9Ö˜ÁZíÛÿд8«íÑvèMß2ýÝ¢lñ·Û:ÛFÆG^̾Xc³Xô÷hh·8mùÏMÿIÓ´ãý—M¹àsáÃ~v-ƒVì_6Ö šž›[cÆÅ[´0¦l}ûÿÞVº{½ Ñ‹—/¦_N¯±Y˜þÈèÄèBFjyÌåØá‡iš^_¾yy`xÀÊëÔÊß1¡×,hm·xëó^ck5]š…@‹í©•é7¬_­xÏÎ`¨–”]³4µb}¯¾MÛFÓôr¹£³¼´þ:]ȶ¼·ºöA‹åkj3ý½xidbéÅÚðÈøÈÀÈ@KGKÿPÿ²,,MÓ4m‹×>hq»a0ÀÚv]»éÿgXCeµz­øsÐ4MÓôÊôÚíó·ïÝ ‰ÿèf-¹,)KÓ4½Â½.@+yÙóÕ¾^öõ¤iš¦õú-M¯7?~ò¸o°ojzª³·»úºÄ¡iÚa&hiz-»¨_Õ¢ÂëüQÕ£g/ž)k”c“cË>*š^W&hiz-› ¥ée7AKÓkÙÀjï@ïÔó)m·Öô7;{t“Ïø:šv¨'¦Ú‘ÚæZš¦iš^WÆm®ƒ@ÛkìUÖ(iš¦iz]¹U×ê Ð?nѶÐ4MÓôº²Þ wh[µ­©9©éyé4½r¬ÈQħŇDž?ˆ~@Ó4mw‡Å…U©ªÚZumWO×ì«Yš^96 ¡ÿò¿ÿåþË?Ð4MÛÝÿô?ÿ© ´Àq øéÿýDÓ+Ç'´¿ýï¿ýEQ”½õÑGýú7¿v4hÿöÓßìëÿöã?þ`÷°¶ØÔïßVYäµ±òvôØøAKQ”LZÐööcw¶¯ß|ýæùôsPÉî‘ñ?NLM|ÿý÷«)òÚXy»zt|” ¥(J>9´†Ar øû¾ÿîûï„qüÃ?ˆòEýõ7_ϼœ1/yõæÕÔ³©ßfW"²¡¬ùö»o­›Ãø¥‡ÒŒÞMj±ÈV<'²½&5¯Ñ†´rVþƒýay{=š¸º¹ŠSÂ(Öh5£Gs”ôöõ¢Nk{kKkË“§OD‘Ñ]§uzz{pvï¾½…E…Æ!£‹« z×ê´èTT–<2>" «›Ô>—}ÐÐ8hlïhǦ³³¯g{ ½­m­ˆðôùÓ¡á!–[(òí€Ûæg](”LÏL㡾G¯ëÒ¡_ó¶o¾yÓ×ß×ÜÒŒ ¯^¿R7«wîÚ‰{¤§ÀUgW'f º¿|õòÍ×op]´Ú¤ä¤Xù±ñ±M†u˜·Ät-†Q‚^0°¥^8”£D£ÓÀGEÚ=g¡õÐØAKQ”|r4h{ú{°{b?uuup cC ©«¯ŠKŠÃ#Â}ý|<|€yNIÿ@ÿå+—·nÛ Œ ¢ù‹ÙØîž<'²0ÆÄÅܾŸuŽ=ræì™›·nâ'rk”€…~þ~¾¾¾Þ>Þ{÷î­¬®üÿó8®¨¬8|ä0:  –*K‘‡c£Ç êàP£ »ä}éõׯ nܼqË÷–›»¦YUS%"£‹93óB‘…](”à>æ/ý‹×%¯;wR)À’Ô“1)¸ªº ½þùçþ·ýÁª¸ø8,˵ë×p{ ñÉñmÛ¶a„9(»Ô•ïêîŠOŒGó«×®–W”cFsJ°>GŽACtz7ènSK“4k/\§¾CÂú`x»víB@óØâÁÑA‚–¢(™´ m·¡;)vCd´mmÈ½Ž —ºwÿ2'ì¡BQ8ñdÍ­Í–%ªF€ ’§_NOLM¼!2Ñoì—Îb/ÎÊÎÞ›"5LU¤"‘;ÃÂÞM?±w£$2*2/?á`÷žÝ`¿ˆƒ€GE|{=*#Ÿ“"#ÂOñ<aìñrâÔ´Ô¸„84ÇðäS–+Ñ\Šl90T^(òœ)Û¸P[·nmjnÂxï"m•šãìIç“Ú$» Z;~ óÂ: ³Äx†G‡cãbAhœ½Sbúõ õKZy”˜îŸTu3³3˜ ¢!{žS‚>„áMNMÖÖ×â.Á|l¹p¸·À-ËÔÓ©ðÈp\8éêØn㈑ ¥(J&-hõ}z±¡ï?°ß—û:´qãÆËW/·´¶`+ °çb€Þ²Š2Ë’zU=RO‘üìųñ'ãØ—Ed ¼¯¿O:‹Ï‹ž_íÿ ¼„®ß¸ŽhÀL»¦gG¢]{yy!ŸCIk[ëÁCQ"â˜:;w黤Ê/g_JÁ‘  âûâ‹/°ûïÞ½SPßÔjl47/Y—‡‡Ö×<òœaŽ Ež3eêü…óHdQ¤)Ë”Rsà6Ѐ4/ KIMAýýû÷£NmÛ¼ÃXtå/x^ÀýŽŒ§<0wË’ã'Ž×ÖÕ¢m‘ÚJ‹`ã…C$µ(ÁÝÃÁƒͯŽîê'h)Š’OŽ­®G7ój™vL$aã“ãY¹YIÉIÈZ°bŠŽz:ý;ûÍ[7‹KŠ-Kjêj÷ 2â?yödlrlöͬ´Îb/6çù‹ç&Ï<uºûºqvhdh0P;5*#=ÂæŽî€ Ô±¬Œï‚ÏÎ €â!†¢¡¶SQ][c y‚4飪Auàà)²åÀÞOÊ"ò-¿[ÒŒ`ÊÍÍmdldêÙÔMß›”ÞG˜k[;ZQ3&.ó´0\Žkׯ¥(RpiÒ2ÒZó)ÀÊß º‹¤MÀB$ÍXç¹%ÓÏÐ5F‹ÊX"gWçé™é%\¸égW¯_Eó/°à¸p﯎Íî3ö´EɤeÈh5z ¶BðàÄÉØÍÅÿÒ—š–661608”PßXߨÔxÉûR­ªÖ²¤®¡Îç²`6õ|Jü?ãSã#ã#Ø»EddH ꆡa„-.-F:½.;7;+' ¥ÞQJJJKbãb‘^ôº¸}ûv äì¹³€“qØhYYú/ ƒÑ/\USná8i×¶ˆ†ñr‰É‰êµ·÷v§÷‘Gç ŠŒ¶ÒŒ0$ÀaÑ…B«Ï¿øñëTu7nÝhnk–‚ƒUѱÑÞýûw‡°–¶ä”H‚16Üm:|I¤ù”?`å*#+LE– „£áœ¬Æ—_}éîáŽÁÄ'Ƈ#ŽŽÕ°åÂååãž ©¥ÉÓËsÛömæWÇFw÷w´Eɤem{g;¶Bl¯À²ÃýÆþȨHlô“O'«j«.ù\:ïy{+vjÔœSÒcè¹vãÚé3§ Fƒhޤjøñ0vLÙë’×þûÁ áäÔd -2:òÔéSþ·ý‘ý˜÷hˆèwhtì¹ày{=Zÿà›»Ò;ËÊ¢_¸×Ø‹4K745 qŒ.Ê+Ë‘,¢²J­º~óºÇ)Ї¡ 8JDd dÎÀ¤°–‘wíÚ%ÍÈÕݵ·¿wÑ…ª¨ªØ¿ÿ•kW|®ø<*{„IÁ‡Ç†AeŒ„CpT~þ¬EÎZTRÖÂA÷ƒ—›OùÃVAL¼ãß¡3MpN "%;Åö&’SsR«TUéyéâaFAFCKC‹¦¥¬¦LLÏO¯VU«[Õ%%©Ù©óvjÙʧå¦ÕªkóKó­”ä–ä–V•J•ÕÊ–ôÔU”%J0*E®b¡.04AXGZ,ò‡]A‡7-EQ2i2Úèäè¤Ì$aòÒ`H…’±Gk»µ“S“óžµnìì•õ•SϦ01ñ°¦±¼¬n¨ÆÏâòb”ª&UºNÛ¥-®(¶ìÔ²•-]£!úlú°PIVaV·¡[«×ЇX™ŽÎ¸±µ¬_QÒ¦mÃ]ÂB½–Ž?¯¨«XêÊ8Ò˜HsGóã‰Çpé˜Ô‚–¢(™´ß:NŠLHO09#!¯4¯³§Sß§‡ðð]ù['e%‰_ºMÌL4?e‹‘Zcc@"»ÕõèPˆPªÕ7›ÖƶF!ñU·«-;µlec×`dß@(8IF‚ªEr´¢:…A£ÔÜT^Ø‹ŒgÞ.0ø¦ö&ƒÑ u±2]V[†™~Øt¤£S¢ ZТ䓣A‘—ƒ+€MNINî£\eµR ǧÇ#cS·©³‹³‡F‡ðÐü¬-ÌRrRŒÃÆŒ‚ <2ûŒ}È]p\TV„~E/¢&ÒÖêÆjËNçmeÝEåEííÀ̼%¦ñ䦖T–hº4â!*àzĦßÓßÐJ%óöb[nj»î}À•éälÓ{ïviÜü´EɤeÈhÃÂc10váÞþ^pN<h„q ÈS´j[3‹2ñppd06-VÔY’c±C€–諨?.=Ç )‚KÕPpEG–Zi5¯±e#9®n¨ŽÏˆGeeÒ²DªŒ€]⸹£YœB}$¾iyiR‰Y,r\©pNÀ•` ïÝ׋Þ.üK® ÃŒ›?‚–¢(™´  }ÿ0*% NÌHìêíÅÃòÚrñ÷ð*U•ÀL›® (*­*2ðˆ:KrtJ40©ÈU˜úÊLÔ÷é‘W¡0¿4_Õ¢€R¤³ÈºplÙé¼­¬qVÔU( pÐØÚ˜U”5§Dšo¾29®8®o®G§ègµÝZ$ÁR‰Ù9l– ‘a£Î¬ŒLÆÀ0$ÓE6æ”äˆB  N^öáYqXBAKQ”|r4hÄ>ˆHŠ€cRcjÕµ!rJà-29R2²@0¯MÛ¦Õk_¼|QT^$š,É‘I‘†A …c¬©½ ØCj¨¬VWã¬ø( ‹JŽÂCËN-[Yï}¡¹ðøä8ÈšY9§¡DeÓ×tm⸤²Ä”õ¦›þ”GCKD –èýtÄâ$EJ%¸3@µXùŒá‰qJ%  à®yÉ ôø‡-EQ2i2Ú˜$pxb8†`CÂ' ç¨ë1ô æ¼g­;9´÷#ï#©¥é•ãûQ÷ ZŠ¢d’£3ښƚ ˆ ìk4½r|/âž°?AKQ”ZІ´ôÊ2nþZТ䓣ß:.©(ijk¢é•㲚2Ó·Žÿo¿úÍohš¦íëþñý¿þÙ U׎ Ú‹¢¦‰'¡¿uÚú«ßýަiÚ¾þè³Ï~ýû+P´Ô:Ö;ÐþóÿøÕßÿ=MÓ´ýw÷ëÿö_™ÑRëZï@ËÏh)Š’A9ú÷h Zj剠¥(J>´EÐR%¯Zj½‹ ¥(J>1£¥(‚–¢(EÐRAKQ”¼"h©õ.‚–¢(ùÄŒ–¢ZŠ¢dAKQ-EQòŠ ¥Ö»ZŠ¢ä3ZŠ"h)Š’Q-E´EÉ+‚–Zï"h)Š’OÌh)Š ¥(JF´EÐR%¯Zj½‹ ¥(J>1£¥(‚–¢(EÐRAKQ”¼"h©õ.‚–¢(ùÄŒ–¢ZŠ¢dAKQ-EQòŠ ¥Ö»ZŠ¢ä3ZŠ"h)Š’Q-E´EÉ+‚–Zï"h)Š’OÌh)Š ¥(JF´EÐR%¯Zj½‹ ¥(J>1£¥(‚–¢(EÐRAKQ”¼"h©õ.‚–¢(ùÄŒ–¢ZŠ¢dAKQ-EQòÊq Í-É­¬¯,)/Q·ªiz帬º  Ý±oÇçÿ÷sš¦i»{ËÎ-Ê‚ìbùA‹n[ë›êë›iš¦izݸ©^Õ¬*TÊÚ†Ö†ÌÂÌÔœTš^oNËKË)ÉIÎJŽO‹§íå¤Ì$¬*ÖvÙ¯¯¬Î*ÊÊ.Ê^öaÈjñY¥—R >·$׺ Ë ÕíjÙA«íÖ¢š^‡nÑ´tõu¥d§D%GŤÄĦƾ·"6NG/ÕXºÄŒD¬j‹¶eÙ¯¯¬ÆÎ©ëÑ-û0dµébX­—ƒ×ô‹ÏU}Ÿ^vÐv÷w †!š^wîìÃ+M‘£x˜røœÓÏíGHÏMÇÃì¢ìEÂjmmcmAIAIyI{gûB%òU¶ÒÜŽÖè5%e%ØŠkT5 •ÈWÙJs Ä)«*+*-ªW×ÏÉÇ0x¶±µñOþÓ¯ /]ôôòt;åö ü¦K#ÎZ¦¡(™Sˆ‡½¬®¯^h2 ¸—×û†} '¸}‹ô%²ó³½¼½ÌOY–дu Ð:ûxÿ­Ï`€öàíÏämD\„û÷“®'O¸ž8vòX|j<ºØ´eÓþCû»?î|ü˜ó±È8ƒ·lßRPú®w×S®·ƒnÏ‹4ß;¾GOE(@Z:Ênß¹}«ÓVt„.nøß8çuÎ1 ºL ­oª¿|íòEï‹Ø ¢ã¢±«Z–ÈWÙJs;ûgJzÊé³§/]¾tõÆÕŠš Ëù*[iî€Á#=‹Iˆ¹~ëú ßþþÈô9x½#A»÷˽.ŽuÝ:Ü»t9©jR¡$5#õì…³AÁAxˆ³MíM÷Cﻺ»¢BTlžsȆ’Îyžóõ÷Ý´ySdl$–L°goÞ®k¬Ãq«¶uÿýÿþûGÆ–,%–Õý”{\Rœy\ZQzùêåk7¯¡G”ƒÍxrŸ9w·*]½]è ÁOŸ;ѦkgѪ¹£ J%4m£h·Ÿýø«Ÿ}yý³·6ð·?hOPöN𤧰×e¯‹>¥í;¶ Fæ–äúøž»x57oÝ,õ¿ëv‚—æ“Ò“€g¤³Y…YÑ Ñ™ù™Ò)äÇ€wxl8(Ž„øÈ‰#æ)òjmL|̽{ØC°™x_ñÆ~eY›‹|ÈÆÊKŠl¥¹ø—|.!-Cn—¤HzùpÞÿ;þØ]m©¼ÔÈ 5wÀృ)UõUÈîp+x/Бƒ×/h{tµ µç.œS5«Ëixú&§%Ç&ÆbŠLØ™W”¶{Ïî:uޱ|99x nøÝ†Ä”D é¿þm~‰[ u›Zÿ6 E77¯i¨  ÀYp­J+K¥ £ä¯ÿ ºã®1Û"eQ\bî(q1pö^è=”ûú—U—á¡ç%ÏM ^céÙé9AK/Õï@{æcPvß$µ²d´Ñ‰ÑmfÁ;æç·èBm^I€ê}Õ{^Ðâ¬9Jap4 Œ´<å´ÓÉí´ÛÎ=;/ßÀMþ%t·ªAp7wäØCðw;åàY–`xÙRyI‘­4·£‘Üt=Ù¦mÃ1¶¸[~·,K0y[*/)²•æ<²&/o/ÜÍ“@HáÈÁë Ú?þé`žÏL9%žXÈGãÂ]Ü\P=~´¡¹‹…ĸœMªUÕwïÝŽ¤Aå-[·ˆ”9.žô7|oàfPð[ÿ¢‚‚ȘQ +Œ:ÙÒ„Qi®xÁ€è (šã†Åã´à}'èN|r¼ôf²¨ŒB¿?Ñ AK/Õ´ÛN¼÷òg»/}jJjý>;pv£}Aû0ꡳ»38d^ˆ.6nÞxèè!Ð\ô8ëŸoí¶¹ µ ÄþñÏ<ázÂÕÃÕçºOz^ºt X½îwå÷Nºô ô;}þ4âìÂìU Úk7¯%¤$èß¾‘ˆwê–%òU¶ÒÜŽFBràа\ÿ6Eñ¹êcY"_e+Í0x°Yì¡#‡°Ïã§xgÂaƒ×;´›·lÆ}î)>Žvt¾»7D*Ÿp¢ËŽ^ðºpçÞÈØÈM›7U×WûÞöEOݪ޵gJð¤ôòñMÏ{žGÞ)MÆ´xîâY ãþ%15Ñ¼Ž§—§8h“R“ô}¦ÏÉ:X£ªAêŒ[óÊHÄ#b"Î^8‹›=AK/Ý´[=>ew\øt¯é“Z»ƒ6*>Êý´{Va–x˜–›†¼]€©È8Ò»¡wãRâP’ž›¾s÷NEpËõ”k`pà<äŽ~¸çË= Š„Œ¼ äÊà®%ó€Øó^ç¿:øÕÑGv9‡¯RÐâNZ ·æXÆ:ue‰|•­4·£±ƒw>.r Ðûªe‰|•­4wÀà›Û›O8Ÿ¨¬«DaXTX@`€/þœ…ÈÙýÖ±øú±ôyr²ÂôŽq{g;¢ª¾ gƒ‚ƒÀ?U³*·0wã¦Àjt\4 ‹Ü?-+íOþJL«ær³½vãšùç¯X@%UuUÁ‚±:--gÎIMO•ꘓ2%-Ïo ˆÅ Kmcm\b\rZ2ƃ^Äg´@,0ª°È0Œ¿XY|÷þ]9^ôZõ;к¼ëâ§Ng?ÝåõéW7>µ;hS³SÝN¹Ý»Ÿ]”ìóÌ…3ÞW½Í?£•œU.>ˆz[’‹)iXL˜eÀØäX¯Ë^¨ 0>~œ¶ìñèÉ£1I1Ûvl Ey3ãUÚˆè;i}Sý•ëW°_Y–ÈWÙJs;ºUÓzÑû"v6ìØå£Ã-Kä«l¥¹ߢiZËÅ%ÅŽ¼¦[Ó¡ïè5ö:´û¾Ú'Þ}ÅÏèøè›~71úÆ–Fdôxnaì‚p9gÏŸ ‘ãþÅçÕªj´ y6;»9ÿáó? ABÂB°ƒ€¬æ³RV*8†hx¾FÅE!WFކµ µRh½ß½ƒš¨ïåí…a¨5 5À¼x+´–*WÔVœ»pNY¥D(ð^Ž—½Vý´nï¼ðéö32üúIDATŸì8ÿéW7‘ÑÚÿ[ÇÁáÁÎîÎ..â;Æ)™)¦ÏhwÎ-Xtäøwüô¹æ6'g$ß{pϼZNqÎí Ûg=Pç˜ó±ÄôÄ9Ý]½yÕÓÛÑxô܆DޝRÐVÖV^¹vÅ´øxáæû©eIfn¦Hl©Œj± ±Øßm©ÙvêüÜï+ËïÑB Š„à°àÐÈPE¶BĈ°ü¦RÞ£¼èÄhàhDΊ’Œü Ëogd"TЃ ¤Œ$ËîP_ümZNZ`p Bå•ä­RÐâÅ^^]Ž{hlD­ÚÖyK@YÜšÛX.*-ÂfeKåy›ËaìrØë°C"g˜·Ä|£^´²Þl;µ¥²e‰#/~P_ÅÛ¹²¾Yc™¶G H9.£µ¯‘Âßô½‰›ùž‘4m/ ÐnvùØéÌ'ÛxðápUU¢ã   Ë=ÀÒ‡~¸Ñ&ЉNt¢¾/i÷tk׋€# P—€æë Ú¦Yû÷¿ÿ&.èD':ÑIÔi½A ¶íÝ»×ÓÓÓk&9;;oß¾]QQ‘ÍfãÖ¹sç„ü[?ýôSGGGa³è ÎnçÌ™3¤‹³gÏJHH˜››ôÑG/mϪ¨¨À§J¶lÙ¢ªªÊápÐÎêL]°á´xxxXXXà…ÄæÅº–`ìzzzÎ|{³—:::׊ìœmÏüNç·LeèD':ý«%ø%ccc!,lmm¥¥¥ô™ËGÒÒ¾n@ ¦fggkÌ$@ë“O>9räÈž={pËßßuྷmÛöÙgŸ}üñÇËqÖ¨#%%UYY©¥¥%lyçÎ(ߺuëöéäëëK =*++[PP€ÉEû/mÙÆÆF]]ýÙ$//ïíí­  €væ› „ƒÄ¤]##))ùR¢ÏžMMM;;;777ØŒM€£‹;v }4‹ŸB{0{˜º¼¼>>§pTK'¡ßŸ]ˆñäaaaÑÑÑ%%%˜ÖãÇ»ººúùù]½zõ;¶t³01™ë¦ÃYKKK¬Í©S§\\\昊:ˆJìbN„Â`9Fº¿Ô~áØ‘°¨±±±À'–ÐÊÊ*111'''88XII ö{°¨8Ž]¸psŽÙŽ‹‹Ã#8…aàx0&&ðNJJ:qâö¡¡¡‘‘‘8£a ‡@,BsLþŠ@;{Â?ÿüs؃±q1R!h±¦0½c'À€9KC':щN’„>êƒiw ï w ? ' ‡(‹â’Ïçóx¼„„ ¸bžŸ´C°…§ð3** ÀNNNF~~ÑVWWÏyƒ—xp @…]»v©©©iË™;øýÆÆFÄš³[Þ¿?°*''´´µµ »ÿ.'Œ#!#¦ÀF~ß¾}ˆ5Ñ삦ž>}5ÍÌÌ”••^cyÀ0€ó¥½£vV bFÉ´€^Xl Œ(55yŒŽ ñÀ0ë×ÞÞŽÈf™ššÂ0T;tèV×ÙÙõqÔ‚å(Aã0•€3ƒ<8ÓÌr@‹éÍÈÈ 3Œõ-//‡µ÷1½°Ã×ÑÑ"•KKK±/a†† ËYG:щNtiš Ú¦Ý/ñ´Ä¢^__¸e¸V.—K>Úƒ+FDÌ` P€¯C9Ü>¡Ìü7þ­cíÍ-N ü鄹@Ì„`Ø[Çðòha0ƒ#‰°‹Ãß%?zô¨££#B7Ì8PJ>óMµ¶¶ÆTâ@„ N7èð»xñârÞ Fƒ]]]h(E [Á02-ØXfÂ×––Œ+Š0üF! Ã"^'ëâA•„Å8€²œƒñ8µ ß@›0gÄú ï2ß×…=äx$ìÈââb†.`9–q-JÈ&Fe'''œf¶mÛ†ƒÌ[Nt¢è$Ò4'¢ý`@BÀánaa!b<¸e¸MòN2ü*¢ÞÙo=’§Ž;Ð"¶eâããÿ%@ûÁ"oÏ-yãÞ_f:-óvd'@ 8s ˆ²:Ð"a¢0˘P‚/f*莱ëéé!(.ch•ÑÎGh„|âK¦eÏž=hð>yò$YH”Æh9$$äĉNQQyÛ14ð†ñ±îîîgΜ±´´$ EûØ ¤;ò)`‰5244|éQ€¤ùo«°-™iiiá&&¿e€–1{ˆƒ1®eÎ6èD':‰.͉háÄà!áÙ8ŽŸŸ<<ñÃð–pË111p§¨ãêê G'äJM‘§x<" Tþ΀£277#1`C^^~9sGü>ÜúG3‰¼Ó öïß³ISS“°‹;vàØ‚G–Ôª©©EDD€aä7›3‡=//sYPP°Lû—˜,dxx8F6kjjP³1.„’`'innÆb\RÁxØ“””„86“Ϙ^cáXB“7xÑ&MòðáëûŒ»íÂ… êêê )æ\ŸýÖ1"]tG¦b9TÓ‰Nt¢“¨-¼ù¨øD$€ÀŒ•••¬¬,8|ü„[®««C0”ß¿9}ú4‚+8X„¿åååð‡ (¼1üŸ¯©© Ÿ E*ømKKK¸nøL€±â*Û·o‡gƒSÅ#¡¡¡ðoð‡äWnñJYq¹Üù=®wDK~ â¬f`ˆÓ1Tò«pÖ˜p¾ÀP—ùç=8_èëëÍJ1Ñ È‡X 0ÀÏÙ])¾•ºDˈɈ˜A̸» ©ä/|!¬%2ŸþùrþZwéi!,„.0ôE~ËÇ.„¹($QƒÃ:Å%é‘üFÕ…aÄTô‚òGM„”äWØ1'xê¥óŒ`3@~9 Á«¶¶6ù!t®É;–þbEÐ#ÊÑ5ýç=t¢þ||©ÌL‚“$ŸgHÜ&ù;I\¢&|&ü q¶ðoä>dàf?ýôS`pÈ €cœßãzƒ6!úñÿv²¶¶^–ž¸‹/ÎiâJ¿a=[žV:-8"àôŒa¬¡K'ì-??¿9Fª¨¨,V!þ‚ï¢Ð‰Nt¢Ók“À`8F___ooïK—.-øçßÓ¯`ü®'`ç¦e†û•Øl6ý¹,èD§×;mÙ²eÿþýçÎ;}ú´””Ô‚>™-èD':щN"L"­Ž¾Ž®¾.-Z´hÑ¢õ}‰´™ù™YY´hÑ¢E‹Ö÷M $rÐffÑ¢E‹-Zß[­h³‹²iÑ¢Eë»%„#Ñ)Ñ‘I‘´h-­¤ì¤EwÑú€6»pã_0´hÑ¢µR¥ Ò \ ”¬•¸î\uwîY¥óÊî\ ÷Œ¹"×Eyu7µ3æ§5y\Mw®š“вµ’–;:o£ÄuPÖvçjó¸çÌ5]TuwS;g~Z—ÇÕuçj:©¨Z+]pçBj6JšÊzî\=WÅ\Q×EUy75óÓú<.òºN*êÖJî\Côn£¤ã ŒŒË5W4pQ5B¹›×ü´1kìÎÕwRѲV2qç^D6JúÊÈ\„…æŠÆ.ª¦È»©išŸ6ãqÍЈ“Š®µ’¹;×=Ú(9(#cÁãê˜+š¹¨ZºsÍÝÔtÌO[ò¸Vî\S'k%kw.dh£dê lãεáqõÌ­\T‘·vSÓ3?mËãÚ¡'ck%{w.db£dá | y×Ð\ÑÖEy;75CóÓ<®tR1µVrtçBf6JÖÊNî\'×Ä\ÑÁEÕÙëè¢fbzÚÙ… ÙÙ«˜›+9;q! 3%[+eg®ó%®‰¡¢ƒª³=×ÑFÍDÿ´³-×Ù†kg®bn älÍu¶âZ(Ùš(;[p!E‡‹ªÎf\Ç‹j&š§/r!;}s-%gc®³×BSÉVWÙÙëlÀ5QUt¸ ê¬ÇuÔU39ÚY— Ùi¨˜«(¹êi…úð"#ÝH…”DZôTL‹-Zß1¥ä¥ÈêȲ¤Y,ëKzód7ÿÃú.·oúÑ!Ö9¬fýǶM?å°~Æaý„ÍúñÎÍopXÿ‰¼ôæŸÉn~“Ãú9‡õÓí›~~ˆõ ë‡Y?Û¶é—ô_lÖ›;7ÿšÃú Ê¥7ÿJvóï8,èçÛ7ýîë-ë­Ã¬ÿÚ¶éÖ9¬ß³Y¿Ù¹ùÏÖ_8¬ßJoþƒìæ·9,è7Û7½}ˆõ.‡õÎaÖo·mú‡½Ãfýqçæ÷8¬÷9¬?Ko~WvóÖ‡hgû¦÷±>Bþ0ëOÛ6må°>æ°>`³þºsó'Ö§xVz󇲛%8,èÝí›>9ÄÚ†üaÖ_·múŒÃ‚>e³>ܹy‡}$½YBvóNKmß´ãkò‡YnÛ´‡ÃÚËaI±YŸìÜ,ÃaAÒ›¥d7ËrXÐÇÛ7í;Äb#˜õ÷m›ä8¬ƒÖ>6ë³›qX”ôæ}²›8,hÛöMòò,ŽëðAÖ¶O7q²8r,önÖNÉÍœý,Î>–ô§›÷oßÌÙÅâH³¶¿·éÐvçsÖám¬mÝÄ‘dq$Xì-¬ïnæ|ÌâleI¿³yÿ_7s>`qÞgmÿý¦Cï°8ﲿÍÚöëMœ?³8b±ÏÚù«Íœ·Xœß±¤±yÿmæüšÅù%kûÏ6ú9‹ó&ëð¬m?ÚÄù)‹óû‡¬¬Í_¼ñ3-n@»ØFšÆ­èA[œÍ/æÓ…²¿­ ·‡­×I)‚”½š{Å$ÅÄØ èI2þ—4ã³ÿ‡Íøß[ÿW†ñolÆ¿É2þïÆ¿³âÐnÆ¿K06±)‰K26I3XlÆØ æVÆdÿÁfüP–±i ãGlÆ‘ßÍøã§lJ?”düDšñ›Ò·2Þa¼Éf¼)ËøñÆ/ØŒÿB~7ãgŒ_±)ý§$ãҌ߰)½±•ñÆïØŒßÊ2þs ã-6ãÈïfüR‚ñ'6¥_K2~/Íø ›Ò¯¶2þ,Ãx‡Íx[–ñë-Œ¿²CùnÆ[Œ÷Ø”þ(ÉxGšñ›Òï·2Þ—a|Äf|(Ëxk c+›ñ1›ñþnÆÛŒOؔޕd| Í`SúËVÆ'2ŒmÈË2ÞÙÂøŒÍøuv3Þ—`ì`3¤Ðˆ$ãSiÆN6CmeìaìF^–ñÞÆ^6¥»K0dØŒýlƧ’ŒÒ Y6ã›±e+Cfƒ-ËÝËØòƒ½—ÁÞÃØ½!ñ!ƒ½“ÁÞÁ|Ÿ!½…Á–d°%[ÿÌAþc†ìGŒ-o1بóc÷; ‰ß3Øc°ßeHþ–!ò?3Ødlý9Cæ· öﲿalùƒý+û—ŒÝo2$~Â`¿É`¿Áü!CúG öì1¶nbÈü€Áf1d71¶üƒýï ö¿1vÿ†Äÿb(lwT=‡ˆv±]Dp+rТ§œ’JÅ9ËÍç੬¬̂ÌÅ”]˜‘[œžSœ‘#lE]¬Ðž…%ÒN˼?:#Á4 â¼Sø9GJÚ¼0Ϙ°´ü´ÕLø÷,Cíþ"êü÷Ïõý×0ŒÎ,3“–—™™™Ÿ)Â,ÎI¤Ò ¥A»$hÅ„ ]ÂÛ@"mnqnnÉŠ•)ÈŒMˆNNM\DQ¹|^M¹Mu¹CIy´ $g]¬HYYñQ!Q¡Á³•“]-ê®TF~¦yPìi^:7°X+´J'ºI5¤â¬S°M``š }CLú)-'-"."1#1»0{uû“ÖÆ*!=Az´•½^˜¢ë%MFƒv>hÿNƒv^D•¹èF*¦$zÐ–äæ•ä­T©üÔêšÊ©©©‰éôx:M¾HãÏ7|õ(ôùcÁãi£¼²ªä¼Òw±"E&D}¡¬£¬c¯¢{IIËî8×F^Åò ®¾w°¿O¦’¸l‘šAÄ/ÎñŠ ÓñÑó5ñQtæðøjQ-§«äm¢­CqŒZËE<·ë¯¤Ì$K[ ( < %;%§hM§‹ÖZ‹_ÄÇ2®BG¿ÿáû»÷ì2³6KÎJÎÊϪ¬¯,(/xÕ½úíÇÓóÓ÷iî£@+'6Z±Њ̀VìhåÄ^€VNl´b3 ›­Ø Ðʉ½­œØ hÅf@+6Z± •{Z9±Њ̀Vl´b/@+'ö´rb3 ›­Ø hÅ^€VNìhåÄf@+6Z±Њ½­œØ‹ˆVNl´b3 ›­Ø Т­œØ hÅf@+6Z1Ú}rb/@+'6Z±Њ̀VŒ€Vn­ÜN±Њ̀Vl´b´rˆÐÊýMl´b3 ›­­Ü/ÅhåÞ›­Ø hÅf@+F@+÷obßmRÔb›ŠàVä ÅÞ” Vª4€¶¶êþýû7nܸ~ýúétóæÍ[·nݹ=2q7þÙXÈó©O'{ï]s«­¬ª—å+$&üŒ–½­w©­g‰SÞ)³T¶aâq£À£Jª'Ï*Q9Ž«©éhE'ňÔ(³oâåãš•!Hˆ ?btÔ³ðT@ÕI¿R5¿ð”h¸VzÕaí1ÔµÔ ÊÖÌx´ «M"¬ÚFÌŠx)!€ÖÄÌ(¿PàãïíÄsBt›‘—A’Dßõœ©HËM£ë‚la×Ȥç¦Ï)\ᬖ™Ÿ™!ÈXPä=Ûõ±Y7o7™2ŸJ~*ÔÇŸ|ü‡?¼ekk}ôGr»äÁC³s³[»Z * V½ó·zzAº¬Ž,SйISJ|³ “¥Àüs³¤ødþ‡ó‡òL–„ø˜?V`þH–ùÃâ?Q`þy)ñŸÈ0ßP ô#Iñ72ßT`¾)Ïü‰„ø/˜Ð›²Ì7vˆÿRù+ä¥Ä!Ãüµó7 Ìÿ”ÿõAæï˜¿•gþ\Bü÷ Ì·—eþj‡ø˜T`þZJü÷2Ì?+Pú•¤øŸ2ßV`þEžùk ñw˜ï"/Ë|k‡øß˜ÿúRâoË0ßS`¾v$Åÿû óäå™ÿH¹Eùž,óâ+0¡w¥Äß—a~¢@émIñ2%—g¾#!.©ÀܦÀü»,óýâŸ)0¡¥Ä?‘aîP`J¡IñÏ2¥‘—g¾/!¾K¹[ù¹,óãâ{˜Ð'RâŸË0e(m•ß{)‹¼WØÇTØÃ”ú»ø>I¦ÂN¦‚Sò¿Å"¿)/Á”xG\áS¦Â'LÙ˜;ÞWØÂTøˆ)õgñ}ï0Þc*ü)ù[ñƒa*¼Í”ÿSâ—â d*ü)û[æŽ_ˆ+ü–©ð¦Ô›âû~ÎTø/¦ÂÏ™’??øSágLùŸ2%þC\áGL…2eYÌ›ÄÿôÇΚjí[ 9h©»rÁá´h pMÙÛ·oß½suü^ÁÓþÏ'÷ÒFú*kóWÕËòv^Ç:0²È+@`iï«©g¬wÑÒÐÌ₾®ž®¹¥¹¯opHˆº¶¶O°ŸH-Ñ:{ùzùQ ñ=fîÃñ(øÂ¯ =çnèäFnùú¤å¤¾J_ðªð_ùåùkb9‚~ ÄËßËÞÉ.<.lC!\vRf¢w€—¥eD|„¨gB dnmz÷Þ]HP ày¸zú{ƦÆâ°½ÏVtR´•­¥W€WBF…®2êe•eïlçéçÐ-wºpý…©ˆMŽILOœ/X››S´†a6üÃüåÔÖÖärUUUÏ ¥©©äïèxIGGËÀ@O•«RS_SZSºê¾æoõì¢lCCe[e-O-è¼­²š“ª¶§–¶§æ9K%Mž:•w×8g¡¤ã©©ë©¥éÂUµUFæ‚§–𭲦“ªž§–ž§¦Š¥’.O]åî*JúžšÈë¸pÕm• <µ =µ4l•uœT¨¼&×RIŸ§nŒ¼»×BÉØSy}®–­²‰§¤c«¬ï¤zÑS뢧¦¦¥’1OÝyw M %SOM3O-#®®­²¹§¤g«lä¤já©eá©©c©dÆS·D¹»†Ž…’¥§¦•§–© ×ÀVÙÚS BÆÔIÕÆSËÆSSÏRÉŠ§n‹rw = %[OM;O-K®±­22ö°ÄVÙÂI™Kžš†–J¶AÞ˜œ’œÐ˜P¿@ßä”$ž§+f …Th»^&´ˆûÚZëëg©¡µ¡¾¥>>-v®ƒ¹¥¹æ¶æl¶ìáÇŒŒŒ¬¬­ˆ,­,?úè#KKsMM CCyùƒÇãóùåõå«îkþVǽC¼yþ¼…ä¶Hž®ü­ÊîÓúvÞmv~¡ ¼ù6¸²ß¬Ê~³*ûM¸G§D/ºµÖ ´å‚üŠ|HP±Ü ~R ­©êèG {›‚-;ÍØ»÷îÝ¿^>¼7ùø^CCY*?1Ù-¯.ƒŸ­†¶Ž———«««‘±a6?«¡±¡®¾®¾¡þòåËyy¹ö—ìÔµ´(ЊÒÞ'"6¬ªºòÑ£G½£×/x§Ê™‡#¢åxR õ-?f}10³ohu"ã#P•} ½ÏjM%dd†Å…9»;ÅÄE÷öõoYü Dqp½—ÛÓÛýdjÒÇ× %dÈtSø)æ6hï?¼ûàá½ñ‰±Gã0,6!ö„Ɔ¦æ¦æ•M³M¤KY.ˆLŒpsw™|ò¸¯¿')%‘ê=:1\zfÚØøÃþ¾Øøh'žSXlhf~&e’ˆ·ºpáøÅ|€¶¾­¾¦©¦º©?…™º–:€–lªuØêf6fÈîÜ)Õ7Ð×ÒÝÒÒE©©³IJZêçHiEIrFò¶mÛNœ8žÍÏh×j«CÙÅTDKaý…/ý €v‰­‰´3]®Héy/"ÚÉÉIЕP–bì Ê>íú†Ú”ìäU´¿R…Ć©ij¹¹¹988êós²‹‹‹ù‚¢¢ÂÑË£°­³³ó¢©±ªº†W°¨É)ᇠ`*Z{‡¿pN9é_y:¨æ0/ï¨Wñ~åÇ<‹Î󒆮\¿|y461š_œ½ê¾2 ¦½Oå*Ï-ËO÷ ðôöóljnxððþØ£Æîgf¥Û9Ùùø{·´6ucã÷)Ðúy…Ç…¯nìHé‚t+;Ë{÷îŽ?zHiâá£ÇcmÁ¶úÆ:ß@ï@︴8~ _ÔÆD'G;Ãþ¶ IDAT»¹»bì§§³Xö’‹]ZFÊñûưåï ÐÇß s—+<3‰ZæÜS m®™£ºÖº„ôPÌÀþADK@ÛÕÓUPY€É)¥‚i m’ò’âšâ€ˆ I ¸0 ´ å«îkþVÏ,Ê< {€þ ú +^ú…´ ŠÚDZôTPQ€Wõs™™Š‚ô¼ôšÚªñññ{3‰0ö!aìØØøø£'OžÔ7Ô´+hyu™Š‚9 Í/Èojjª¯GH[544tuu›©ih ¢]Í—¡<‚ # Èóy¸wÿ¿²öŒ{ÂYyþ!ל#<×;­ºµõáØÀˆ¨ðÔœTʤUõ…`´­»º\©ù.—"£#ÆÆNMMNL>š˜Gø˜š–õpì. Q_o„J«3uE™ì¢l›KÖ÷îßbÎâ'ðÿpœ2Á%N¡áÁ.ÓrÓD½”ÉYIí–vÔ³ã‘Þ#¥ªµõÑ£qÜE ->%O­®¯¬‚¬öžöU[+(Ä&Çúø””üOŸNM=|òä1?'ÛÝ‹WXRÖ‚mŸL<{þÔÏß'Ÿ&êÕ¤¬*Ø;Ú"¢Û¨÷CÇÔÞ½w'›Ÿå웓Wš·Êy[¶²Y^¼§Ï¦€X*®{XZVâåë‘‘•>}(y49õ‘nEe¹¯¿OLb4,_‡ù!S”’•ÒØÖXÛ\[;ý¾qM#¥êÆêú–ú¤ô$Ñnòå—å[ÚYÊɱwîÜÙÑÕ“Ž;"%%502€[6X`xà¶m’§OŸh+*WÙ×B[=«8‹- Úå|aELJÌb[‹@Wä EOE•E+Uf^FuMÕÀÀ@û`:²ãe'¦) Š<}ú Mã§®¢ý)§8ÇÔÂÔÜÒÌÎÞÆÖÎÚÊÆÒÅÕÙËÛc¶<<Ý­m­Ì,̌͌²2‰ÌÌgT|dEeÅôñãywýáøÃܪºSnéª^éÕmmP~çÎ[·n¢fDLøêV"Þ§¨ê ®(äò#b#B#Bzz{&ŸL>þ,¿P“ÑÕ݅¯¿þ‡_ ov¾§n¶IÎö÷îßàM>ÿòÙ—_}ùhâQk[KPh`xl8¿0uÖÁ’¼â\Oo÷¯þñåääãÞ¾^„­¡Q!8åæå<}ö”*ìí ‹ îIDùåù©Ù©ÍM Ô/@Mÿ&TK]Ô\×ÐÚ”‘´êµR3¬ì­äååöìÙ xVQWWGBB" 8ÀÒÞ ¶°³Ð1Б–Þ©¨¨ÐV5V­º¯ù[=»8›-ý…ˉhÚÅöÁ­ÈAKuVµbeåe"¢PA‘±Yì£iÄ¢ðÉ“'Ïž=ŸmÚ*Ú_‘rá }<®^½z÷eéÊ•Ë^¾žhEgOe‘_ïðð0õÍÓéÑtºÿà~qc{sO¢"\¢“6ñxâÊÕ+!þ«[Ê×fÃûW¿¢Í”#d…¥¤§tuufçdcáÐlf^fPh@zfZÿ@¿·¯WnaΫöµ •T•8º8à˜2ùd”}þås˜””’ÒW¯ƒ zALÆópÃØ3²2C0dNÑvww¥g¤aÆp¹Êå{–¦e§µt¶4µ75µ7"´m¤~¹¡¡¥¾±µ193y}LÂZDÄDpŽÑÖÖ½%Õ%kb9b²”¬”ð g7ÇŒÜ Ò,U˜™lnešWœ'êÕ„JkJ\§AûøÖí[i驈Ó²©·FÀàu0@¨‚ò3KÓàðàdĈå(ÁœöN.Aaà&g=íª¨¢ ¦ì?5ÛÆú–ú”Ì”õ1+ÕÕ×%/~J__/::rÏž=ûöíÝ·oŸŒÌ¾ýûe 99¶ƒ£Cooe}åªûš¿ÕsJrè ¿°‚þŠ—~aEljì¢/¥õ-ÕYõŠ••Ÿ%-EY0–PöÉ4eŸN=}úôË/¿zÚ•·¿"!ìðö÷‚;njjjX<ánfV¦‡{^Iží©*öðáµw´wuua’£c¢333AYYYMMM[|ackkk{;\c2Þ<*8XUwüBþ ï³Æ£ó‰³Hiu)i–üD!ú‚c]«¾–PYm™£Ë%A*«+CÓÀ3bÛ:ô>{6` F± ç?13¹EÔ÷. ×Y6©Ù©8-¨4~Úú†^ª›ªGûû{úz‚C‚ÁÚ]»v t÷vuõtuvw5´5”Ô¬Þªù[]P&0t¥¿°‚þŠ—aE\Zì¢[k·¢mM1vÿJ•UU]SõüùsõÙ³gÈ|I¥¯HúÇtúæ›oêjÓsÓVÑþŠTXY`aiîíãååí¹˜p×ÊÚÂ;л ²@tÆ`> h‘ 233AÙ‚‚‚òòòºº:!h;::„€¶¸ºhu}ñ‹ø}%µk=Ú’¹mÖ.T(•Õ•9¹9‡…džå—ç¯[¿‹ÎÂS±!öÌ7l ­¯% ݃Ý>~>'¾81rmdmMZp«U%d&ĦÅÒ¢µ„@ÙÌ‚Ì%¶$rÐbã–Ö–®T8Î'¤Ägñ3–VBr|NqÎ*Ú_‘0ôèÎÊqŽ;» {uC^¾1ž¾îÕÕUÝÝÝj;;; *uvಧ‡*Ä­žž’©­­˜±Þ«ëïìï,­í ¯³*ê+r srŠr@\hÃí¡µLµ`!¶:@»æ¿–[Ö†‹EZ8²òºò• OU”#RË_Bˆ5ËjWÓþ*ì¡#7—ÙÙunžnþ!þ—œ)KÈÐïúú8óœÓùé(!uÃ-l,P ŽuMLBË&^þ^¥Õ¥ˆhÁ~äQ˜S˜ãâábikéáãÃú-®,&äçarª¿5u+í· ¢Þgé:X&P„Š„šj0AA8 zíäÌdGWG,\6̃%¨–šPQ_‘%ÈŠIŠÁì!‚Á …¡²©¥)ª‘ÓUBZ‚“›&œsŒÃ/|¥õNŒÖ7Ö¯™ÔR²RpXAˆyÑü"f …‰é‰˜"+;+˜Š„Ÿdqñb¬tÏéT(Ò&tqwÁ`Ñ.1öШP¬#Jæol¼’g¯2Ž5Øcûü3Ôy• / M I\×ÖÓFØlpÊhÙè¢f ½ŸR<…Iƒý@ ÕUðøÔøUw ã…ÿ"dw9»;ãô`çd‡h¤ïÏœ=ãàƒù™¿±ÁÚÙ«ŒeESûdö]rºc’gÌ0vìç;>ÇpVa'Ö.+?«¶™:Lಹ³yðò`e}%EßîVà3Fýß´-µ˜Üű):%šÂ[s-N¢(Yz‡¬t«“-1»0:!“†¥1·6Çiƒ:Ä|»¶á4†æGd8VêyÛê-×àŒ¢Íöó®;λÐz%uÁíhSKã×ß|ý¯ÿ!Tk[ë•«WnݾÕÔÒ4»Õ€^žgS¼:ÝZÓÿù•ÈA Û—/S SP€­°¬ðäé“u-uŽ.ޏÄK ¯¼Š’Ò“à’â“ã•Î)=g \æ—æ¯¨£%fÃ÷Õ5בK !*. x@°(Ë–…I\ g„×ypx0¼!^í~A~¨#'/‡à ™Áƒ¯‰I°!-;MMC x½*ë*±~ÅÅ‚bnYÛY™ý¨SV]?¥©£‰»s¦Ž|ê¶ÜNÛàÓF–®†!>r]Ä&ƨîA Ì 0`ê£ÃÍ,Í2r20«X,MmÍ“Š'Éä`¢0¢¼¢<¬;@H}<ßTТó‰S—‡iGÉ«L úUVQÆÏ˜Ä´Œ€¢S¬h†þŽ  ·\x.Øx © @¬Zu§ŸK}Ž= áX‚Ø'fQE‘ž^QyÌ51Ò76Öwö*£®ÀQaa:?ˆ……¨€ã †³:SaO† ¸E8‹<øŠ¸(EŒ Ã@VdTÜEà[^Wžš“ÚÑÛ`!osG3n­É>‡°EÉ–˜½ù±70{¸…ñêécàóKNœ<ýãQ®¥£µV[zOÞÙìˆúŽž$­×XGõ$UÌ745<}þôÉÓ'B567 ]¹~¥¾±~vùÓgO[ÚZB"CðBXjkµ5@"-ÕYÇ dji  dekGC@ xà•¿ –¸yºÁ üÀ¥²ª2Ü"žBµu´„R³R L jKœJà¿\«=~?1(pþÞMßX– Gt‹»äín<BP ]#«à àDàmݽÝU¸*8ËÕoæVæˆüP×SÕP…ÔÂqÃé Âœ©C#+ê®vpt°©£i‰:ò¾ýûлº–ºÜA9DfpÄ(ÇAäÜùs¤k0Q€Å:¯v´‘ÁR«XAޏÃeiuéñ/Ž£äUfkq@î,Áªa Ë ÑÙl˜4ì%KK`ìࡃ(AЩk ›-ȶs´_¥Sa ‘ׂƒ]HDaæ'¿$fà„[`ÿü ÎÍYe²ÇȆOLOÄÁ -‡èƯÂN¬/ÙÙ× «Jk©kN,":¢¾,©®a+2¨É/ä·t¶T6T J”éhÌ.ÌF À¼†ûœl€Ù%ØZ9…9È”à.N±sKZêp>ÃÁ%ˆòQBMøZlõé×]uHt€³§½“‡­×X.žŽ éÄäÄØÄ˜PÃ×n\»qûFÿPÿìòG“šZ›pÆ a)9[‘ƒ4u®@fVf8#À>¸ ‘GŽÁ ÆÞÉ>='…ä³edBuMux"à Þ ®sE½,-xaÄ^iü4‚%8bt²Âã”?˜’•‚×¹_°à[6ԛ̨¿‰rÔÁá¢ø”xx̵±ª£ÉÍËŠÚ§Á)œTÔWhèh DÃaÜÕÓ•@v`p4™y™¸œ3u+í·¤¦d`t ¹«y‰:Â! ¡Ñ¡ (&å8 „F… ?è‚ î>îjêjzFz¾ˆØ.\ÀXΜ;ÏHÖO¡)Aò‰#Bð%¯2 ®锪¾.–» ¬œC ‚}…s .ÉXÖ°ÓÀÐÀˆØ ó†eÊ/ËŸ=öù{þ*ÏÞc0†Á°SQI‘´³R¡)`¦³¿¼líiD‘Mq6êè¢>dj®í裰J>ÊÅ-„¿Øx¼½Œ§ÖfŸÏÚ³Kph#ûã%_‚9ñò÷B¯P¼Èü¬ÉVoëiÃäÐz½…^^S^[_{ìþÝwï=¸·„PáþÃû 2b—l­J"-ŽÆ8,/_8¹‡F†R¿ÑX­g¨''/‡ã@RzÜwT|¢4L°ÛË×k¿ìþ„”\ÊÈʠŠzYZh}!ò‹ ƒƒC¤åíïM}US¶Sz§±"@p£ m `‰‡\§í%[¨Qç”â)ØŒv`B·51 Óˆ¨.EÄDÀ6„û˜"#øb˜Ç9Æ FMœ°p´ÃpÀSs¦n¥Ë©€]ºÎì!c–œ\¨OÑZêòŠò\x.aÑa¸Dï°615Q–-ëæá«dÈÂr<¥tN ảGR’[”Ëóä¡ãú|Çç(y• \p-H§ŒZD®0RJZ %d¶á¸q–"ÑÞvšWœ„‡Ç„cZp1½pìèwþÆž¿Ê³'A0"à ° ‡;wvV±»`Fùô7 S_ƒ^]Bý¡Ks-8>âÀŽ|Ucõmeê[«¢“©Ïha ~ö õEk²ÏÉÀÆ‹“@„˜59#“}Éé’­ƒ-êÌ)Ál;qLñ¬"¦ÂÞÑs"Š­Në5yôö÷Ž^}©úû K¨?þ\z§á.$rТ'êÀ»l¹…¹$Ÿ-ÈöôõD xEÅEáåo~àVaY!NýÈã@D>UZC¡ÓÌÜL´ìàì€Ø@aymù‘£GàÀ0• ­º¡Ú7Ð×ÎÑ.26v¢&.É-DÆpkeOއÁYÄj餖0§ ÇÉÍ ö€¾ )ª¡ÂxbÃü©[sÍ2ùl”Ú¦Z”¤f¥bÁK¬.a€‡7õÛÑ€‡§'"Húûc…ë.,A¨†åp©(y#\ Ò)¦«‰ù0bFIe xi\óN1®”ÌàÁÝ˽¨¼—³÷üü=•çL8ŽVx™¸z¸‚.ÂvVªöÞöúÖz¬˜ p´ˆ\«›ªÞ‘«#è ¬Z÷@wÿH?ò¹Å¹0•Q³o˜íZm'ô……013 sH}X‰³,Ù­Ó{v ^§•Nã,‚ý†³o}KýšïsZ¯½pØ*«.ãçó³ò²^*¾€_ZUÚÔÞ´t›·"-z‹ðõPe]å©3§0kn -‘ŠzK§“K¶à܆³>h»ú»@M4Å%U2@•tR—(æ©À·ºtðò JP%n?üÌYå³8¸l¸%´¾Ój]ɻˡÁ­ÈAÛ6ý~=·kljÜ:}ü§õ 1·–®VFN½Ö ±,„@vÃ- ~ÆÔÒ´¼¦|Ã-¡Ek¶nEZôDý_ͯ‹0en-Q‹¼<^³­»†Bt;rm¤g°gÃ-™­öz½hýˉàVä EOþëd´hÑ¢E‹Öú‹àVä íêïÂù—-Z´hÑú¾ „DZª³AZ´hÑ¢Eëû§iÜŠ´=ƒ==C´hÑ¢E‹Ö÷Oƒ”Öã­ã5üÔ W[OùÃAZ´hÑ¢Eki‘?™9hKkJ««©¯ÿ­±¬¦¬©£iÃ-Z´h}W$rÐæåN>™œý¿ }wõÕ?¾½:JþcÚŠú«*ë+¿£Æ/ ºŠª†*èõÑ·…ÅÂ’m¸¢U]EMSMg_熻BZ´D'‘ƒ6§(|úò_¾Â@nß½]^W~ëÞ­ï–nß»}ãÎ ê«LºZ7ܘ5ÔЕ¡Ê†Ê+7® ¿áö¬ùè®Þ¼ õô¿~£ŽñÖÝ[=ƒ=憻BZ´D§õíW_>ÿêùó/Ÿ}K(ùêù³/Ÿ õü+ª•ÿe×€3øõÛׯݺöÝ<Úåë—›:𾋯/( äuÍu—¯]ÞpcÖ~t·®c³uôvôõn¸1¢Îä5µá®-Ñi=@KQöËçOîŽ\Ѽâ{„’ß‘›©æOÝm¿Qê]©ìRzr+;™Ûðì˧¨ü/ª¯ž#¢-«)C¨[C—‡†FÐåÁ‘+äڿˆà¸ù5´5P—×G¯ µÿSÃWo\¾zeà[…#ÝnóKuçþº–ºá驽6Ú;ØÛÝß½ˆzF1nóòuóÎÍŽ¾Ž®þ®Ù…Wn^º2Ú;<Ü58„ŸƒWF¯ÜØxSW-°–-­×^ëZD«ãýU7ýežW˜˜Ê9rÙé“Ç·ší½Z9vÝ[,:Þ ì;a]°ÿɳIT~u=}ö4W{ïÁ½Ù%yùy÷Ü•f)ÐV—­CùEy#£ÃOžL>~<11ñèÑ£ñññ1hlì! ³s2`‘š+â³¾Á¾Ù™5ÑÕé¼¾µù‘ÚŒÛû¾©1ø¦Bí›zÓË.’£Ýµ±F™*ßThü£XéY‘ú€³Ô•k#kÕ»ˆD@;xyC345 ŒŒI …†ûùøúûû^04ÊÊã‹Ú$Dψ­¼#_Z2[×o_h;û;Éåàåÿ¤²C†±Ò:ñû3Zä0ÍÚ«—|È(Þ#¶¸odx9=ξµtï+Ò콺ÒfoÞ½Iƒ–Öë­u- 7Ö[qÅuËÃdöƒ„Ý’ÙÃöNÜLlq´©vjÚs©AÚ¹^Ö:ÿ“§“¨,Ôã'©ÿÑþ>¥GîÞ¿{çÞÉ©Ir —·îÜBRòdê ©9ùdòÉÓ':º:}}¨:?šz6US[ópìáØøØƒ±Tùí[ȣϢq” â Þ½G5þpüáÔÓ©ö<Š€–8)AaÞððàÍ›¸†G‡†‡úûzïܽÅÏèè!5W¤òªòÀÀÙ™5ÑÕÔ›«-òõé8ô|É—}žôñ—ù'F>í®h¥ù2Cêiâ–'üãN;._Y«ÞE$œ{(ÐŽbhÚúú‘ÑÑöŽö~Ez!ÍVvV6®¦fVfF&ÆÚtô 4ttÒ²3Dj̸äx©­³mÁ[.n.m]mK”ÌÑõ[×Û{Ú;û:§+_NÈ«•ÕÞk˜&k–sÖ­Œbû– IDAT<±|D7 îuÛ4{ÿ…˜ˆÌª‘ks[ˆOŠ/)/™ßrw_7º¶²±Â±`M.Ü«5õ51ñ1Ëí›åuåî iÑÖ´³‰}—¿h·ú¸BçOåÚì <;ùðfýh®Nì¶s¡ïªD¾gÊß•ÒêΡ²PÍ-Í७­‘‘QhX¨…¥…¶Žvm]íÄ㉂Â\jik™˜˜457²]—.ÙØÚTTV€µêêê~þ~VÖVªjª‰I‰(Aþò•Ëh™‹/ª¨¨xyy!Æ4ÎÏá£00(° M546\¸pA[[Û×Ï÷ÚõkİN¡¤ú…çæ ö÷ôtåÚÚZ ó««++*Êrrù×®_ÍÌNï™çÅ€ÞÊÚÊŠêŠÒŠÒ®¾.”Œ\iíl-.+Î/ίkªëî ÒÔÒÌÍÏõ ðE&¿( Áƒe•e5}C}pи¬ª«ª¬©¬i¨ilm¬k¬ƒ?Í+ÈC ¢‘’Š<ØØÒˆPCèÑ„ ªI¿î!ñ8eÇDôß&3Ù×>éªî5K>1•,ù8æ¿'Òõ;~>zux¶ñhªº®:¯0C€I(ÁO˜±tôt qaIqyq}S}CKÃÐ塪Ú*r 6ÞùO¡ÜtmC­ P€yÀQg`d ¼º彃½d–ð,î6·7\ù'þ±íÀè*héé›ÙwœR2²»à˜yöœ¶â¾ƒû¥öî–çp”Ϋ¤e} ´--°Ïbæ‘Ç›Z›!˜ZZYŠ ÄJÁØ{{z[Ú[³C>vâHƒ Á0Ñ–kG°1j눻T Wµ¾¹Ͷwµ£Ö‘L,ѵ›×ÈÿHƒ|cgï«Ä: {³Zæs}j³êo˜F´s(Ãå~ãôã¦ñ sv˜@Xøb×ÕT`‡`90Ãa‘aœcœà°`ä!l¤¢Ò"ìÃù[ c‡aø‰ùA<ŽõZlÓb°MmM˜ºËÓ¿¾€á–Ö6Ö¢þ‚«Ltãö ´´^o­hOJS»»ÛmlÌÍ-L²²3Æ'Æ/_Å¡ÞÑî’uhDðí{·&ŸN¾¨9#0õŒÒ™–¶–ˆÈÅ3ŠÍ­Íiéin<·±Gcü\~WOוkW‚‚ƒ¼¼½î?¼ïàßÙÝÙÑÙQ\RŒx~ÍÛÇ1(žRãª!¨³‡G†=¼<À`Ô¼|õ2ê 7µ4ååç]¿qÏ¢}„ÈhÊÍÍmdt$'7ghdˆÖR ­*?‚ò r{ûzšš“jjª’S’ò òróøñ ±CÙiä]ÄÙ>eÈêêÛØÙvövÂÚ]²³°²002P×P‡«221’?$omk­¡©Œ£³#|\rj22ήÎ)i)pýhçØñc( µw°Ç̘š›êèé\ÐiïnMˆ…¿hv…pš¤k‚«º–:Šm5iW\>KÙó0aûxÚ!Û¿ wV÷Ç>ˆ?2·õaø_Æ’ö÷9|6zeh¶ñh Í›ÃÂô¬t`©¨¬&ÁŒ°ˆ0Dfp¦9‚Ä”&¦&Jg•0*«(£&;F=ÿ)èûÚ4³4SSW‹Œ‰D;™Ù™¦%4<fÛ^>^N¾þ¾ÂA7îܨiª!ÐhýctÜ‹•}­£”œû·4ßqÚn›‚æŽ#'Ž*©¨¤f¥ÏHÒÚѪ©­‰î0Ï0>#;ÃÛ×ÛÌ ¨¢¦ ]€‚˜Ûð¨ðÅìÉägîÚµËÐÈ0-3 ¸E#öž“‹…l|ј,wBR¦‚mS}gO'†‰Öx‡¼ŽŽjŽ^E/ð vövUÕU=$mNLN Óâªbø\(¯ §³«½©¥¾¦®²º¶¢²º¬¼²¤¬¢¸¤´°£«-5=™Ä1³Åðáà£ÁU!ÂŒ(Às!€€p‹¨cecE*“ ‚ž€à%ðé!a!Mp ‚ ;;]=]Xèî¬òYDð׿–æ5õ5%à.é ž ¥€Q›Ùcô»Aëw§õN÷Å·‡»júb îÅÈ=Œüï»A¿¿+Ýç°}äòàlãáOÏ«žG´ŠØa xïè㸤¤§¤f¤Â{D0ì‚þønÄ=0‰Ä@d8óŸB¹ƒr8¢œÄ”DP íà'FiA\ ³Á6 ½¡¹3„b|4õ—¦Ãý(Ñ2Ô®±óé8j¡bÇç\,¸ØøŽNÞ_õJÞÑÉ[ÓošÉ™”Ìôo-Gÿ’Ó%ÌN`-â3ì1s` z„@\ "ƒŸ@Â< °AX¶˜=;ÕT14ä1ˆÿ0ºä´d;pPTRùpºBœzÛ¤2ð œ#ƒ`×/ÀÜ%­]¹q¥­» A-ò¼èB)͘Ït’÷g¶-Ò l*é¸gß}Ò¥JÞº`q–”vœc˜`Î~)’0óG%q$6&Y¸µ0½8ôÀHìd°Ä³·Ç.Ej`h€úØ´äñ—nZ¬ ~bb¹ñZæ¿ÊB#¯ÝºFƒ–Öë­õ-‚˱‰1¡ºû{ܽlyÖ¼@s'_;÷ Ð¨¨{ïÍ®#TEU :?sûÞm¸$™ਘ(¥¯Þ¸jna~çþò èÐöö÷"?zuQº JzÁ!DÃÿ¬3Ðs}O_òÃ@òý±ûp£ñIñ8È# &mŽ?§è^QØ?ÒñÙ-­MåU%ùE9yÙü¼Œ,~ZzVrJzbUMÎ𒤦P™9™ÚºÚ(ïì±¶³NHIèèÉÉÏñôñ„çÝ»oolb,ê  •IFP$8tøÐ™³g”Î)!*Ê-ÈÅ­‹æ{‡zq$&ßÀ Æ%%êšêZaQaˆ‡H×£ðõÕMÕÔå`g_kY_ké µ•÷õôDé݉¹ò—›¾¿¼!Ùc/‰ÂÙÆÃ±"“œÝœá|áv¿8ù‚iʪ³g‚BƒP¸‚ˆ{E°hne Æ;b8óŸBSЧZ»Z…Cnjo‚ñ}¤_Œ '‰/N}GÐÂ28kr azUcU×@ê¨ëj_ò°9¦*/Ë‘9ãñ±Yï[§½>0íþƒzê»_8mÑ Þ¥fz*1-yöˆZp ˆŠG´…G‡°Gÿ ,:Z0.„n©™©à+ÀÓ=н˜=Â%@㊈ŽÈ¹ÜÃGã©sçÏeåfáŽ)8ÆaéIe¬>ç(M¡AlT rÓ­ ]jîlnéjAÞ%B°['~›V¢´AÛ"_?¸ñÖÃgNI]ûRY³"´gäÚHUCUg'ê¨iiéî–Ù·kÿž6·ºòÛ#’gƒß;í¶e—Ì…cœSgÏ&¤&Ïš2060µ0u÷rk±ÞX5„­!eÕeÔqÁÒ‚Á`­š†ZvnööPK úb œ\œ]‹Êвó²O>…9ApŸ’‘‚[ˆ# ñ,Y¯€° [‚4(lmðò õ%ÛÍÈGd–Ë'îÐIÚ®¼Û(KÓ§êÖçÖÑ- ì.ƒÌÏu’wiE‡¤–ÎY/²7æïa F±“ÿ2Ë—·àÖš“YzÓ’U¶°¶@‹Á¢MD·óWùŸ‹xu¤¬¶lÃ]!-Z¢Ó€vðÚ-ÇøF×´›ÄN§Ôë˜æ˜Â·‹€¶¦®ÆÓÛs~æîƒ» I 7MŒMÍM=<=@ÖšúK+K(¿0—pýCýxäʵ+úú÷Þ'%…ASZRróÎ͸„8S3SÄÄÙ9Ùh¼µ½ÕÙÅY[GÛÐȰ³§“P–€¶ ¼€xÿ켬ÊêòȘ0S#ÿ@ï‹fFNv¶öVôµ3²Rcâ¢RS¨ôìôÒ;ƒÂ‚à|Á@ ‚ÏÂedläž½{bâcø>Ⲫ2ˆ SÓXnÁÅçåpµh®ê„ìlð2ðø7áûÒ2Ó) €z|r<©Êb½ZªfyÂUç¿?ÎR}œy?‡lÞïm)éŽ5é3ýÓ€õ»ý–o÷šý¡Ë~Gï`÷lãIì•W˜~Àá"V‰Aû%•%ÁˆÕºúºbba <éÉÓ'°†Ödr9ˆÂUÔTàÊç?…31™Œ ˆE@‰á#Àð0.œH0iàSDL˜‡b|teC%…€ÖÀÈP†-»ïÀþcú; «Þ9¤¼ëÐÙ=‡Uv£äè‰ã§)Ð&ÍYõࡃèÈÛÏ›-ÇNNOÛ°¢Æ(*)ÂfTt!^Ç—‹ÙƒŒ¶.õV*NF!(€©‡d'OÔ3Ð+./ÆÀqrÂÉz¡ŽO€˜‡Þ}}AzÒÚàè`SGìA¾¢±EÑ2QîbÆgÚIÛµ’•œ‹ú®ŽTKé¥m×Nú\+á°aLY}óœÑ‘½1·K0ù~~ü|>–vb.¸µæd–Ø´©©x«†yÀ*c· ‹ù«LºÀž¾2Lƒ–Öë­uúŒvh­#ëŒÂ¹~µºAõ:þÕÑù‹Ì»vóÚ‚™;÷î A¸$%÷Çî_¹2BÞˆ¾|í2pK€zùêea `‰gIûÂ:`íàÈ Gû¸DáÕëWÁ`ĺSï$krq`3Y/l,+KŒãéh!jÉzBÒJ'²È–ÒMÙ¡›|Ð,kç…”íZI;u“öjÇøÄv ôÌÙodoÌß-ÂØ€ M ©·Ðã¢pÄYpkÍÉ,±i“Ò’È â8ˆ@s‹ˆyÁUIƒ–Ök¯ í•Ûwm£jNØœv,:åXxÂNUÕ»Ø[ÇÿR‚–ü_¾¹ùüøÄØ´ôd`595!)9>!).>!&6>á,ˆ[]_Ej •–•DÞ©#ï:BÈa!Éœ/2³ê Â7-çæûç¶)ìúETÚ@™Ô]Ýýã)þ¡'é{§rŽÙ½×ÝT<ÇÔ5¿Ù9cÖIÍLEÈ>Çraµ9O œ_g‰®!ê?¨¯q×ÝÇKéüù³**ÓBæ<.•Î++)+ŸQVV<{öœêÿcï< Ú¸¶†»V¾ä•8vÜ;NâÞk'N{ÉKw¯qÁÆ€éÝÆôŽ1`:¦÷ÞÑ$$$D/¢÷Þ{7.éíýÿ‘˘âÄÆ‘dtfíÅ]fνsçî9Ò0£HcÒg¬Ñô0¦Çî^æîÄöf-2¿ÂWÇ#ãc•ÍÝiEMìÒæ®A¡Kô¯X–-=ƒNŒ¹œ\rBl|R%9ž’3ñ‰qq\ȱñ1¤pÈu&kDöpÍêÚ”BÁÀ½à¥‰+ZîËLRîÚf‹M-Ñvôt“ÉpöðŒOz O‘f Ô(‘‘(ôHþ¦Ú%¤&Bäï®f5þ"ÈüƒžA/©*ùûoÁÈJú£¸ž ÚÖ®VAy4ÍÍeÕe´tš ¾:®mª…œAAĊ²Âz‚ D›–ˆ ‚ b§œ“*(Ñ&¥%!‚ ˆX!@Ñ6×&1“AD¬àTP´É¬ä$VüÅœÁœÁœ“A‹AAÄ Á‰¶®¹.%=%…Ågpf3ÐqI ¤¨àÈ ¿B)”’/"Á?ÅFƒÿ¤á‰OŽO`$ˆB¨8ƒ3â>VP˜×ÒÒóUUTZòððà;ãù9Í-0sçÎížžîÈ`¡‡ýÔ)(-())c­«««ºº:** þÒéô¼¼<‰äää´wï;66Tîi“ð£E±E°¢eÓæB*;53—ÝÝÛõË/?ÿ~úƒ;ñ_ývïÞݪÚJðÜ·5`ëåUewîÞùý"¼©Ó¯¿þÒÓן 5V“󗃄V½÷ÝSnLèÙ…Ùs¯5¬‡+ÚËŽdd¦×××Â|q '&6º¿¿ ÓÙi5µU££C0ßÝÓÅíœã‡Ô™Ídå°„µ×¦@ˆ¶±±1::º¶¶–Éd677S(”¢¢"6›mk{cÏ[{ìœí„'‚ˆ9‚mCkCjFê\ gÐ!ÍúùçŸ BÃC‚B‚ÇÇÇ‹KŠƒýCBƒH±Ñ£c#¬¬´9nk.0³Ò‡~ûí·_yÓO?ý4>~ëÖø­;wî%ðè­¼ª”žIVDcÂ) ?Îé¼õt“’J)«.›{­S˜\ÑÞ½{§¿¿·§§‹‘F/+/éííÎÉÉ innìêê ÑSÀ»mÝÝ]¡QÁs?™™œY™ÍÉÖ^›BaYaqIIhÉÅÝÇ/(ÜÛ?$$"ÆÉÕSN^ÁÐÐÐÈÈhÇŽ®BAÄœ’ªŠ63u.À nDD…•U”VT–{ûz Á8KKM©¨*Љ¬­«½}gœ™Å˜ã¶æ3“~¿þÈ››-®™99;Þtuþþûï‰B¨E¡!ÉoÌgŸ  O·1)ôû¢ÛzRX) ZÈbã(±äøÿ@ßðˆ˜ñöñ°¶±ŒŠ#ùx‡EÇ’£“)ÍÍM\ÑÎ9þdÖ}Ñ i¯MD›•_zR'ä3õp>»NßøôÀ™³'Nœ={vÓ¦M7½nrua‡Š âŒ@EËaŸt&µ¨´Ü™kuM•_€+yûÎíÆÆ†ä”ÄÐ@vfzˆööxZ&}ÎÛzòØúÈèð÷ßwïÞ]Èbkjª“©IwïÝõñóº}û6”Ü»wïçŸ*¯,¡ )B~cþüóÏÌn˜S'þ»ï¾¿}ë)6&W´5eô¬¹®-D844ÐßßÃd1**Ëúzsó²#"C[Ûš{z»RÔÒ²¢®î˜ïèlÑÎq£@rzrfafvQ¶°ºÖ”™Âò ZÍÔc,‚ Í N›SÕ]2¾Õ VѲhNN¶ÖÓÛ³gÏeË Œ~„3ÎàŒΔT L´m Üv@¸¹…Ù ÚørxdXVN&Ïd ®Û·n…„…4·4Ý£±R渭¹[¸{÷Nq1'2*<$4(+;óÇðó÷!ÅDE‘"@ð’SRšIVDcB££Ã1±ÑØd"£# 9ùwïÞ}Z™š•JaðD›=×U¥¤sE;>~«»»£££•FO)*.ìèlËÈdÁùV]} ¸6™šPP˜ÛÜÒØÖÞÜÞÑ<÷*Àv Ñ k¯M¡°¢0Vó‘ÉTŸÝrî-¥ ý¦Ÿª–Å6ûûœœ¼°°+j*šÚ𡱡)ìØBAÄgL´é™LHÂFF†úÇnŽŽ€´Èb‡¡ô6<2”@£±MS)½}=·nff±«ª+!‹ýé§Ÿþ÷¿ÿݽ{wüöx<… ïÂ)Bvn&-C˜¢…Æ„0bãH ­Û“¦Æ¦†t6ª044øR«òšrF6cŽë¡¦SA´Õ5•pÖæäâàãçç4nî.–fÁ!á!Nv^>aáÁpÑÐP2÷øA´Y…Y9Å9ÂÚkSàTp@´ÿÕŒ K«`6ÈÙ1]bË”¬¢ Ñþ¿‚‚ÿåç÷3™®6Öò ²ŽîŽÐþBAÄÁ‰¶±­Fعš‘JMMƒô%3›]YUÞÓÓÕÝÝɽڥ³=7/ [Zšz{»cHsÜÖ\ 'Æ@ 5<<È)*€Ê¹ßjöýöûoµuÕ0OIŒëïï…<•JK§ +H~cBòUT= '/;¿0ªÐó3‹‘ÈHѦe§ÍqU´tˆ¶­­…Áb¥§ÄÅÇ øÕÑÙžJKNc¦úúÄ£i´ô &œ7„E‡Ì½ øìÂìÜâ\aíµ)U¥dV|¡þ¾r°÷wã » Ñæçƒk¿ËËËŒŒ¼táü{ï¿gël›ÂJzØ"n”V— N´Ìlæ\He§’)1£c#4zrQ '=#­­½,ÛÑÙÞØTŸLM$ìÛÞÙ>ÇmÍ…(rŒì}}½ƒýÍ-Mà­ªš HÄYì4â ÜD|x(1…·°‚$sxxhdd˜¸ÕÃúúú{áŒái5&øD[Q[ÁÌy Áƒh¡'´w´¶´6ÑR“ 9y­mM¬tFP°uMEcs}R %· »¡±¶©¹– ‹{hlˆ6¯8OX{m Úââbk—þ6>¦Ævþʺ6¦&·Ùì_óòþWPP›ðÅŸòÙ'§Ï¶q´#Qèa#ˆ¸QV]& Ñ6µ5Í1V^#¢ÂÆÇoed¥ƒM™l‘)Wiy1ƒ™š›Ÿ]RVĽ1PkKHDÛ442¸¶®¦§§»»§«·¯tUUS><2TTRŠíæeá`8P•)LÑBcB]ÝÜfŒû3)- DËÊaÍq=t®h£`×—•—râ(1ÌtÌPã<½Ürò29Åù$rI-ää—ÂyOøÓ-4Z6';¯DTD[\Y\RRRYYäîî3T*5!!ẹy ™êë;˜ž>À`Hž=#!)áæã›KÏ  =l7Êj(Zaç sA!·ÁD|z IDAToƒP Šòêë2²X .È¡Gv_pm@¨ÿ·5‚Â**Ê@±Žß¾ÉVk{SWwœ%@a/ä‘á‘¡Tfа‚$sdd‚é›…ÁÁþúúڧؘ Úʺʹ¯l­«¯IJ‰OHŠ ö‹"…ÃŒŸ¿÷ Ûëà`Jbl@ODth|Bl25Î{@´Oe»9œœü’|aíµ)¢mmm-//§P(pÄ•••…††ž>}úð¡C›6nLðöþ­  ÚÑñÔéS¾Á¾iYiBAÄж½‰•Ëzr`˜cÓ‚ý›šÇÆF¹&èëéèûñÇÇoÃ<0840:6Êb3ÈQu.››Cœá¤°Tà^}÷ˆJ ~ȱCh,špâ¼ß˜pR2Æ rF††‡XéO³1¡€hÓsÓ縈66ª·¯»ª¦¼¢²„’Hfg2+*K“R(Þ>…¹¥er|43élYEqCc씹ÇOˆ¶ ´@»l&ŠÊ‹²²² ŽŽööövvv†ykkë?ü`Û¶­‡¼pöì@jê‹¥|QÒÀÔÚ_hÇ‚ˆ1mG+õää²R3Rƒ"Ý<\sórjëjëêë¦PYU™˜”àäêHI¥¤å¤ÍisO l—’ïàbOŽ‹­¨,¯­­™BMMu^~ž§·G`xÔˆ»ç¤ÆÌÉ͆¦ÇYQY‘ð´3™™\Y_™žŸ>Çõ0²&D[][QQUJIŒËÈbÁ $¯Þ¾žœÜÒò"r<‰É¦—”qE[ßPËíœã§gÑsŠr Ê „°Ëf‚Ê¢ªª«¾»ïÝwß{wï{{ Þy÷›6®^»zÛöm_ïÿ:ôæÍ_8_GÇ“§O†Å†1s™BAIJZA‰¶¹£FØ'b…|"&)ÆÙÝÉÒæšÙuS3Ë©XX™Û8XG§°R˜9̹lî‰í&¥%„XÛ[A<Óƒ,o\sõv%§é™ôôæ!âH±S‰Ž!G‡E†GC]æ¸]°Tnq.§‚#¬½ö¸À.ãÊÈË\’¿dmoMI¥ÀYŽÐ£Bq£¢®Bp¢…v®ü5æ¾!qˆSàARÓ©5 5Y…YsœÎ¦““Éj>… ‰BŠŽ‚S8]˜ãvÁ[yÅyEEBÞqÓPpÎGN"C#P™T°¬ðCBñC ¢Íâd!â •M­i¬zO dÒy%yE•EBAgˆÊúJ‰¶µ«5»(ghlZmSmNqŽÐ#y2ÒóÒóKò‹«Š… ‚ Ï• ‚m[W[nq."¶€_S3RA´Bä‰aç³óKóK«K… ‚ ÏU U‚mw[^IÞ£™ÜŸ.Ož›žYùˆõ«"þN_øq™ºæâ'_Õ”ÕÎ} G`ÓW>Û2Y…Yé9éX =“^×\'€x¦νyè9¥e5e}'þõíþ1?•Z#2Gªª$ÚöîvÈ£«ãyÉóe.Ê*Èê›èS¨ñO?eïb:ãzt trŠr®ß¸ÎÈdL_ø±€xŒÍ‰ÕJJI^”¾ôÄk›Œ“›SxL¸k†v³u´UVSÖÖ×öðÎÈϘqɘ„˜7±®h[êæìJ¨šœ‚QYUMÕéýÄÝÇ=:>ú)6/W´e\ÑÎVA+[+¿`?"øŸodf”–•ö§k&'‘¡gN.J¹zºÎqÇ}~޵FdŽT7 L´=í0H=}c};'»dFr\rœµõeíËÄé@ 3ÆMZ: æ¹· ÈaEÄFD’#Ó2ÓØ¹le å¡>SÖC@gÓá­0RÌL_ø±€O12Äja4WÓTƒ ¢Je§FÅEÁp™ÍɆŦ”À§`ÌM¢'A ÷ßiÒR"b"¨L*Q~Ì^þ^ì<6, Õ‹ƒâö B245ÔÑ× ¤¤P@´°~H^¡–'–Àæ Í/É_‚5Ûš!Â,F}Ký4ûdÀ—2r27=oBMh –7,5®h@߀x@NÐt‰©‰äD2”ÀÂé¹é±‰±PÙ+:W yç¸i¨uaYaymùŒïB£=:˜^æpr úÙ§ÐJYB´ÐchÂÄ©é©Ü^ÍâöêШPÍ«šy8)œØï°è¥ðA¨ Q ¦‡wax—™ÅäwcX ,–]˜M4uF^´ô"ø·å3¤xìhø,œ'ÁËÃ&àà‡MÀE4ñÙٺĔõû=‘žH¢`CÄ2ðÖF¬vÇŒ=AĚƉ¶£§£°¼ðјxû{Ã! ǧˆ¿¡‰!Ìà'æ0ÖðC mbnº¦–¦±Œ¡G•”–„\ Þš¼~%¡þJËJC.;}á'P# v°žøäxk{kÈ]4´4 ¡™^µ¸ ¡¢¡¢¢®’€È!;„™™Í|¨îÞ0žî?¸ÌËH]’Š¡Ä=0ß _h.¯Á1ð’•Í2·4‡f‡Pu t‰e`ï¸y¹©_V?tø±™18oÆØ`dohm˜K³Û²±·=/!0?h â9qêlÝÙÍÓ'мóÐО_ó54ï7]”Í)çTÔUÌø.4ïyÉ󯿯`tx Š2½fzôØQèÀ‘±‘ZºZÚzÚrŠrªªé9é 6Hu uõŒô x8 „¦ƒŽ­¥£Eìw¢yaG|sà8m‚èÀDŽ bƒ“E؉¦ó÷4ˆŽ÷d¨€']_x>ýÎ6]L,®[€éáãúFúp’ ”¤”$˜ÞÕËÕÖÉ–_‹ÙºÄ”õÀV ÏHœ¹|õ2,L,{ZžÄÁÖçØæ2¨i˜h{;8œGâ¤ãÄX oñãy3/°ˆ˜ÈÀü¡¢%Îxˆ— ZcSc-„ ã>·°‚ÛàDð%3RQÄÌa6µ5WÏ¥ýùÍÝòWè „.[EA÷à/çarAÁRjjsÜïdP‹ª†ªß%š.Šú‰&G[ÚX†F… v „uMõÏ>ÿ J,­-ý‚ü`mÄg‰àa “{4&HîÜùs mb(ÉÌ˄ìÌ="$Ï»¸»ðóÁAÁÕ¡·;¸*Nl¤¹>>ð‘Kò—à €¬Nä•ä5¯jÂÎURQJÏNç×b¶.1e=„ g °Àôã‹ûñKR“;‚ˆ-uÍu‚m_gqUñ£ãNÞ‰ùÔôTe7¡0–@$à0¶Â[pT§e¦yúz^’»§ü0¦ð?5}=PUiYiXçô…ƒÀ+ *þš!ƒIf$Ã|JZ $UÜTrJ œÝó¶Îƒ?3%æˆØ]CÝÙj!”À g‚<8«0‹xÉÎc›YšÅ§ÄóC…Ó‚+ÚW TÈ’õ õ!+—ÕÔÞ4—Æ@®vNv9·'@ÏÉ»ÌØtä$²é5Sð $úŠÊŠsÜï@^ ÷¶PÕÕ3¾K4äp QhgUuUØ.ј^þ^àȨ8î ª ‰„GWG89 Bøìôà‰v.¬Ft{¢vdºùPÈ?"à¸ðôó„¤N¡ a…·ˆ­ƒŒ!÷åÿV[„œÎY¡Ý %Õ4Õþz¦÷þÌ”õL/S#-”ddJHJLîH"¶N´]}]%Õ%,'ÈpbÎÌd‰6dý@–F|‘åà ”À ;ðQ±QgÎad0 ‡³w¶õ–T=X°ÿä5çdde@BÓ~, ·—xû{ÃqyÅyÞõaL˜µõ´a,žR£±u~ü™Éu‡˜ WÍV ¡¶°²µ‚]@cÒÀ"‡Á`å/*()@ÆÂ8pè„› Æ…Å`C3 v¬¨«x‚fŸL8)\V^Æw¨)œfÁ襦Q§7¤\°¯c(1Ð,Ÿñù_oÌÙà>ÿµª¤¼¶|¶w‰¦ ‹;yê¤Åu h¢‚åSR(×o\‡ŒJ@„СÄÁÅZuzðD ìÇ Rˆö$JÀsðÁ ° 8Urñp½09È !ÙURUÊÊÏâÇŸïxÓ1)5 sru‚ü>42ôè±£V7¬Â¢Â=lmgÍ­Úõ˜>3}=ü.Ê_Æüº9œ‡AP¯/¿úrrGB±¥¾¥^P¢íï*«){4pƒ;%¥$edáˆef1¹7(Ê…áRYURÐ-”$Pôô!!³u°…|…œ@Ö¸¬a`lƒ ±¢ÈQ“× Ÿ‚Ø9ìé ?‘1‘ç%ÏÃXA€ BÈ BÈcèét"æÉ%°-bëü0ø3ü51CÕ ²³ÕB(AIf~¦«‡«æÍ«ºWAZ`Y(µÃ’°`_pÓ5r˜L ¢¦£ü´í_¬ç^0¬ÕËÆ%ÅAE¦7·0%‚¼|õ²¦–æ_oÌ'ƒßt¹œ\m]mˆ‡ß¼pâgª…•…Šº ”–º¸¹¨j¨Âì”éÁ%9œh[¢¯%°X ÊjÊÐÿá4hr ÔÞ°¿òóñãƒ,S]SvœvÀ[¬,¤³ éôìtȀɉdXxJ-¦ÏL_¿‹ò— C*{ä ‰ò䎄 b‹àDÛÝß ©À£)ã±0?¥¼¬úAÉäeøŸš¼üäOVϼðc19Âé1LŽpJÉ#f&Ç<9òk!øÀ¦¬ÿ¡ýRý (ŸKÛ>ñ^˜Þ\“çgìQW`Õ6:µU‰fçýR2cð“›t¶JÍX£‡VõðÖ'„??}=ê¯gÆmñ@O@g‚†ÖÁ‰¶¢®AAÄ Á‰¶g §²¾AAĊƶF‰¶w ·ª¾ AAÄŠ¦¶&A‰v°·º¡AAÄŠ¦vA‰¶o°¯¦©AAÄŠæöfA‰v¨¯¶¹AAÄŠæA‰–{1T]%‚ ‚Ìj›jZZEKg‹€D[XZIN&#ò·…Ç‚€(JTf~fw÷#èêëêèéhs‹r«ê«FÇGù[©k¨«©­z2ïl•Ëîì»ûÝÝï~ønFÆïŽwöv N´ÕõÕc·Çù[©o¬¯­«z2ïilmüSÑÞ¾{E‹ ó -‚†E;6>rEÑ"È|E‹ ‚aºh†‚Cƒ’@·(Z™· hD0Líàð`HXˆ±©±‘‰Q|Bü­;·P´2?AÑ"ˆ`˜"ZƒæèßÙÝÙÐÜàéíÉ)æ hd~‚¢EÁ0E´ Ø‘[#Ä7ÆÝö ô¡hd~‚¢EÁ€W#ˆ˜‚¢EÁ€¢E1E‹ ‚E‹ b ŠAŠAÄ-‚-‚ˆ)(Z (ZSP´"P´"¦ hD0 hE‹Ñáž¾ü˜ÎxËŽXQ„lÖÍôî¬zC‰!ý£=™äÈb«PŽÙS ÐÌ“uÕƒ©3Oe…aœk)U>­hn™ ŠV”¸5Ô™`]o°µÙhC»Åö§KÛ¶MÅœ`ë$¶L`¶¥u-ÆêµW7{HŒô6 ¿¹Ä‰‘ñ¡è’jq;U7_¦î¼Lû;Ø13Ôš\¶óÑ Há³ €ÀbÖÛ³.vaß@‡@ÑŠC­e×?ðÞÿ ÇúWÎõ¹aù…Àµ‡±àaþkù/\Ì~É7ýÈL~Î3þ9×ø§\#.9†< ~äbt‹,]¯»¾77RèÍ%V4ö•ë'ÿצ`Êൔ!³9’'&£ì¿ï\ؽâŽõ_AÂ-¢Ei hEˆI¢Õä‰v ÝèSäÏÕ¾ÿkx4?UùüRãûG½?Áouþ¿ÕúüZëoý\íËüPéý}…×wåžc×á|—ÛÅîãÅn·8nðr¤ð&” æ9÷å8ug:´±l›èÖµ)–eñf%ŽGjTùm½G9x/]E+xî‹V…4¬È-2yÈ$õ–ÙŸB{uÄH0Nè5L25$ÃËÄ~£„>CJ¯al»^t³¹SŸÜ¡ó1mº¤V](‰jÔŽ¨¿Zs%¨BÓ¿XÍ»@Å-KQ?á3‰ˆ%ºœ µ_†6«¢hd:(Zâ¾hÕþÈÓx,Ñ‚A=ÕAŠêcþò¼BæúC…÷lËüQð;OØàé¡H©zuí–»”ýwY :«Q´†mH³Jô‰v:þBž fRÆ…äU×÷xwÖƒ°GM©£¦)Ã&%GÏG-Ñ)\o_óEH“ ŠA¦ƒ¢!î‹VõÜÇíUÞV2nÆç<Ôn¹µ¤Ù$yªsHFÅ–Æ™‚ƒ›Ö 4«87Õ$/ÞlÇÞ,]¹ýžf’ß—{ý1EKƒhG}7߉ûænš:ŠVðÜ­rô°ÂãŠRÒk$ ›„‹”CŸB£àÓN Y· ³/ôN¹²å¡Ü*î‚yÔ¹ÈFíð:­o5>Ru8ùî_¶sùq­vÁz۪σ”åÉëQ´2­1!Ú­úãŠÖÇ⢗¹¤·¹d„½–h¯æ¯»QùßÀzEyò:-‚LE+Bܭʈ6ÌNޏâÉúÊ MÉ/•*tÐ=­"ñ™¹ÚQKcà`’³RÝú¦Ñ¹ñ"·¢XãÇ­÷ÆÛä/ïЕQ´‚D«É­âãŠ6¡ÏPÚôóSꜹò±‚Õ×êN‡"®†Õj9¥Éjy ,ÓмyR[XU@‰º²ír‡ÞÍtùÇ­VîZ›ŠOêååcQ´2­q_´Êäª=®hý,¥œ Îù^“*$‘œ”¬dBmå*(æ~–ÒÁ6—’<Õ#í4/~á¨w&ÑSý§*ŸâXã(GÅÇí°×†ñ˜/n§*Ö‹˜h»ûºÃ"ÂnØÝ°µ³%þþ•øëæáVVQ6rkDèUøSÑ5+|øðñãÇ9òùçŸ+++ÛØØ|ýõ×055µ›6€3ïO °°”””½ƒ}mCíðذÐë5B´M²C—ì:÷jå­½·”«[ò$ÉK$cg"fÉ…,ž€4ÁùÉD¼L DÍÀ9 rÑ}^JZ­9çÏJI-‚LE+BLˆ6Qþ÷,¥_>ù…üáQû~ˆzï‡Èw¿"ö|þÎwáoöö½°·¸„î¹ „ìîï"¸´“ÇŽñ@`ûxÀ¶[\¶Žù[Æü¶ŒrÙ<ê»yÄwÓˆ°qðÞÀÅký—uCžë ‹ôÖ z¯ò]7ñÑXÒÅú«¢(Ú   --­/¿ü\{ôèQ+ºÎ IDATˆÖÈÈhÇŽ{öìÑÐÐ0ž6dNšÒÓÓI$ÒUí«2221ä˜ÖöÖÑñQ¡×Ž€­ã¥ðA»®wmÚÞ"žUw­áþ³êê¸ÏªÌj·›Õl7ª·&UÛŒ«¶Wn5®ØbT±Å°|‹aÙf t³~é&ý’ú“à£ÃÙ0õÑ=¼‡öh宽’³–xhföjЪf֛ŪgoÀ ”˜¾ïQqE‹ ÓAÑŠ„hï$Èþ–©-ñ$vþ“bнÿ¤ØØ‡ÆN<)öû¨w¾ãòöw‘oß‹|ë^Ä[w#öÜ vß ÛÅcçíP`Çíã!Ûǃ·ß Þv+Ø:´e,Ø<lñßH0ì·aØwÃïzPìϺAŸµ#áŽ%JЦhCBB  ={VBBâäÉ“Ÿ~ú)ˆÖÙÙùܹs.\°µµuŸ6ÅÄÄdN›@·JJJ°NJe`h@è»/Z¿éÐ~)ÛŽ½¼'±ß{ ïI±-÷ŸÛtÿaì“;ÿà¼BÞSó Öóž—·nBº¹¼Çäe¤kZ°Ï­\B6f ŠA¦€¢!&DK¹ôk†üÏqÝ Ø5î»cÜgû-ïícÞÛÆ¼¶Ý ÚýCô$ÅFOUì=¾bÃgWl0¡Ø­S;è¾¶×ñõ^‡×{Võ8¼tÛ+afÀsÍpØ£ çë®®j¥ØôôŠ%e%jêjáááT*5–7tÕÔÔ ÁMJJJàM ƒ9mb³ÙÓEKL4 $-'/gdlTTRÔÕÛ%Ü:æÔ'«Ç½å[/Ò' ŠM–rÕhP³cñ&"15®Ø rI±ÛgS¬áÅnz´b!UN[¥œöšƒ}¥"}¥B*÷¯ûu“¼÷\KÏ¡hd:(Z‚ííxé_Ù²?Dïkºòr•Ê¢ õåP[V­´ ûÚkßE¼ý ‹žÅSì^»{¦,v;O±~)‹åZvØw}»Ù²*Å—«.)W[:êÒ ¥—jUþÙ{óõ¡Ð}#‰JWÃuZß°ô ôNž:Iüàš‘‘Áb±@¢`J2™ éél*ýÓ V=SUUõýÞWRQ²²±b ”/®ó©“ ê•´lÜ-I^r.lÉ…ðW&{å|Ø+gÃÿ@«<¿Þÿ¹ú¡,Öhâ äÍÓ³ØéßOÎb!½”¸ütÈB‰e!ËùpIöØ×(w¯KÉYŠA¦‚¢!î‹Vê—ôKßG¾[§¾(CïD«SI÷I¹~¬@s}‡é«÷Âöн7‹by~å*vü/*Öo0ä³®ÕhIÆZªåѤIÛÍзJùÅ—UC!ïÄŸ­¹¼‚í¢œ˜’("JII¢MLL$‘H111Å>±b‰‰N§ÛÚÚJKKëéë…%& ³Ž~ñöò[½ë${Î_kØu>j‰|ÐÎ+_] šàrÐçRAkäi+À©S[y_±å÷ ©0¡ØY~ å)v-ÿ‹â+9k4³VKQ–^ Z­ô£€BЮ3!‹ »5Ì~Ç©øÛK(Z™ŠV„˜mÜÅ_XÒßGì­Õx™ÿ<Ú:ÞÃhëŒkÌßÑÞ Ûýÿ[âY»c²bÇî+vôaÅÞ·ìú!ßõƒÞk[ç\Ùk/So6±QêõZ÷“5*/õ8¿6¼w8îtýÕU"ø-ˆY//¯ààà°°0OOÏ4ÞD¡Pâg™RSSgT,¬' à’쥫ÚWLFï@¯ÐëÈý6þm¯ÚóÝç,êvžZÊ}-é¼Wž²GðÈ—W‹ß)O}œúHÅnž¬X½Gf±„b¹?Äf¯ÖÈ|D+¸A7ð¨{–"±QÀ”þÕÙ°ÅŠ©+ô³Þv䜼DZ¢E) hEB´ãdÉŸ™RßE¼¢¥}š¡ÿc¥÷ïuþÀ/e7;í>è0yåNè.þ±wy?ÄÞ Ýݸ¯Åïî€÷Æ‚wŽ?¬X~ ë·ièæúAûµƒÎë¸s/wZÏ¿ÜiÀk ˆ6ûÊ–x'Ùñ"7b£ÀH”T­êKÝN+‚ÞŽ=U¯%Š¢ ‹‹³±± y˜!ñ&KKËk³L ä)Še³ÙÑÑÑÒ2Òá‘á-í-"rá1!ZÏ ÿγæµ;Ñ:¤^Jì7¢òžX߯«“ö¶\Ê« Õ‰bï+Ö¸t³EÞˬuæ¹ë Šx~-¾ÿC,¡ØÞeÆ9ë RW›PÞ4Hyój&q¹q­ײêì7.ÆsE«|<¶CŸØ(àTzì\ÄbÚ ½Ì=…ÇQ´2­1!ÚØ ?¥IÞ ›íä;CýVáÖeÿA»É+·Cvò{'lg‡ÿa¶2W ÍumtŒL"í.tøí~­Óë†éûÖm}±á—ÚÎ,ï·]Í»œ˜{E1¤³ž«[ _&D{§Äcò¡¸¢u\ÑøÖP̉z­×DS´àHðkhh(!ZÈk###MMMMf™'[699ÙÈÈHNNÎÑɱ¾©^DK@ˆÖ£úœoÇi³šíç#—N¹3TˆV6åH[d±e›¯å¬ z5År!ÃèÅ$Ë…¾A¯šd­›¢XHaõk< –ǽ€¶÷_ ÿ]૾Äüºf&÷rb Þÿ𨦿~1n W´!Ç㺠&ß D+G}U—½Û®à˜Lô›(Z™ŠV„à‰vç­‰ç5«h—ßÞÁ¿Ö RØëfÚŸ)û¼+ãö®´ó»2îŸ+{9X¨uúíá~QÌS,0ì¾¾õØÒ¢—_H]°€²xqÊ‚ žoøpa¿Ã›\Åz¯ðZÝïñfóì¢ír|µ/`Ï éXHŠ6""‚N§»¸¸_;;;Sy$¸Á³Lüßq †««ëÅ‹-,-ròrG…^©)€h5âßv«>ëÓþ­iÕ£DkPº™ÿE1¤°d‡Å¹ŠÏ3åþESXÀ’ûg®âÿEº,6ÊZËW¬VÞ:]æê`¹%™KôÌ…ÏÇìI—² «Æ~C-ý Ö*Iò,¢ _ ÛÕNßu#ÿŠA¦ƒ¢!î‹öìt‰»¡{jÕgíxÐvâ‡Ø[!;£í/|¡ìý_EWe«0×X9‹àݶ_*{&9 Ø<ñC¬ß†î˯•.ûGÒª×RaËÉÅôQÄ¿ÿ]ðÒómç—B"˵¬ç›}îo4,šM´¯ôùïŒ>Zwe¥hŠ”I"‘`&** ²[þ·Á³MÄ%Ê`buuuE%Ådjrw_·Ð«3#„h]+O{·2©Üv>rÉŒ¢½”üŠ~É&ârbƒâM¾!+r”^HÕ\Év9œç'Írø&Qæÿr”žwxuâN@·W3VN틞w×Z¢Î|rYUÖ*å´U’±‹gí¥¤åW™;mrK£hd(ZbB´¤3?¤ž»²»V}ÑŒ¢m3^v+pñO±=o›è¿/ç¥i¥v#쨦ËÑË.ÛOA^kh¤;äwÿŠbßõMŸ¿œ½ø%ú‰i’’1ûö…nÜè³`Aò?þQÿÞ‚^û×¹–õx£×mUÓì¢í°_Þë·s ê°ŠVM]ÍßߟF£%%%‘yÌL¿¹ñä ’]P²––(6 ( ½«]èy„hoV|ëÕzÒ¸b묢MZ®W´‘ø§X“Üõ›El…³ÜO±ÝN$ïJ4ÙvéÿØ2ÏÅY½t5gâZ§+Y«#O-ÌX2C߈ýòE­¸•*ÌU€ãµ ³ˆöløb™„eZiÛ­r¢hd:(Z‚+Z£cѧ¿§¹¼kVÑ-»°•¸ïD»ßÞ+¦ûd\Oi{üGÆzÛ C‚·/ºªéš únâþÓŽïú!Ÿuõû^J_´üÑG0Œz/\èýÒK0˜ÆýóŸu»þÝcõX¶Ïãõ^×UMú g­Ý²ßý‘EM´ Í Š ‡>õí© Nz0?;Î7KËKEüyc÷EëRqʳù¸Qù‰ÙD›¸\—³¸œØ4km²ÅKi ¨æ{I—_ ¹ô\dþ)ó\²ñ‹ZÙ«'.wÊ\ûÕæË3ô„þ¥¹‚¸C…"}å…˜—gmØËÒ”e—Û®gï—ŽzE‹ S@ÑŠ Úz££Q§¾§ž¾´svÑ.óßB\ëÔë¿ËÒTëi]§Í¶Ÿ4ÜzÜØ~ÒdŸ¬çuAî ywOô^Û|pq΋/¾ü2Œ¤^ x/Xà·`ý/Ô¼ Çáµ^÷U@ÏÍ•Mú/Í&ÚvÛ¥Ý>ÛúÃ÷‹šhA“-í-µ µ º¨_èñÿx¢}˹ü¤{Ó1ÃÒͳ‰V&q¹vázâ?v sÖÅØ-Êy.Rî!—ž–y—y.óÒsQ¶ /—gq¯u –\Ä^0µo¤þã…ȃ/jƯPbðîE[q~vÑJÅ/ÕLÝz-ó-‚LE+BLˆ6òäw)§ÆwÔÌ"ÚVÃ¥£þ›'þ)6`3ÕñÈAu÷Ýç·4ᦳ§LöHºVwe;~οœxÐ{M·þÊò×þ‘ò¼ø"1’ÆÿóŸ%/?ߦ°´×mUÛk@·ËŠF½YEÛf»¤Û{k_ø×uWVˆ”hÅB´NeÇÝè—l–ˆ˜Y´Ò Ë®¬ã_Nìµ"Kõyϯ!2ÏEȤXg®b!—ípZÖî°´^çß…ª¯±Ì>kñ—Èrän4ÛI¢Þꃥ6[½Ôæ¶¶+ð?5š¯´Rl†G‡…ÞhbôÜúµØÝ78ª¾¹š¿îlø"™ÀzñŸ]O;fq0Ž?¤¿–{QRæ›—s¯uzóþ­&î;ÁW,Üˉ'.wâýK(–ë×äW¿Ê$.“IX&MY¹òÙˆ…ç_S ÙgqØ$†»QÓØZIï|ò$»Š”uô/F¬ŠæØaß@É hEI{ú{š²ckô¶…¸DÛ¬ûrƒæ.—ÔkNРùb»År®hVlÿŸ)¶û‘Šíp\Ú8,i4ZP£úA5Ê 5*Ïר¿Ðdµ ÍuM§ÿG5šËëc®u÷uáx* ¾‘^§³Ó¦ð€]åWWóÖ]$/‘ˆZÄãebæ—…`GëìŠ}íaÅ®˜I±ËVìR,+·Ö*äÅSÁ/Nüåq2øß§‚ÿ É®|Ü=Ú‡Â^ ɶìîž @ÑŠÃmmµì¨j½-ƒÁûÇãŽnòÚ8è¹aÀXßï¬ã±vÀsý ï.>븬ãý4»¶ßkmŸ×š>O`u/àñf¯Ç=îÀë=n¯w»­êv]Õåú—›+;—€ó«ί´;ËÛ—·Ú-m±YÒb½¸ÅúåfÀ XÔtK³í¢V×µ~Tk,«‰2ƒ€Ÿ•B}¦!ú½8Z™´Ãºà»Š¯u 6]ÉZw9s­f ö@=}53Ürî[køåj,àMU曪io¨Œ×•úëJ©«Úk T`¥|ÊJùä•rÉ+ä’VÈ&¾z HxU†òŠ e¹türé¸åÉË$c–^ -ÎG/æµXˆÙ¿¬·V7åƒÓËÔŽ±Ø¬®Þ.¡7‚ˆ(Zá3:>Ú;ÐÛÒÞR•W¥·½×ããÛ)Æ¿O<ÜJ8É…rbŒrœKü±Ñ¸££qG¸#±yŽ90LÚ Ñß F=õÕ`Ô—@$ðEÄçýŸõ‡Öþß¾°OûÂ>zCÿô†|ÜòQOðG=Av}@Ðø~WÀ¾Nÿ÷:ýßíðöv¼ßî±·J㕪›æ¶f[¤q3ÿà÷ fq¼JônãŒÜ«ÏºTw®<æTqÌ©ü¨cùDz#e‡JÛ—²+9hW|жø€mÑEûopöÛßX|mUðÕõü¯®ç} Xæ~q-ç ‹œÏ-²?3Ïþk– |jšñ‰ ÀþÄ8ý?Fé±>6d}dÈüÈ íCý´ôïëÑ}º©ûthÀ{ÚÔw¯¦{µ’ßÑNÙ§•´÷|ÈJÕÇ¥¤¥<¼…±c*Zs¥`*Û‰x ¶^¤½«Xgw‰ÁÞR»Tÿú†šŽî|œÜüƒß7ØÅ)NT•+Ñ«FìU {[™Ë[€ú$Èì Ø1Ë»{ø(†< ^ o«„¿£õ¾9åÛ„¼ÀÚÆšö®öÎîNƒ¦g g`hPTR„]gP´¢ÂÀ𨫡¹¾²œSœËÌÏHÉf&dÒ)©q\hÁ¦‘§B%§Scg%%–•óÉ1ÌdÒl¤%ÑðÖŸIÏe%q²éåÅ9uõ5mmÐi0pß(©âdq˜Ì\jjf"•MIIOaÅÉ“aäÉ$i@ìdÓbC¢}ƒ¢|yó‰Œ$0b¸Ðg†B'ñI “`s =;‰]@/(Ï©mxÐ7€–ö–àÐ`E%Eÿ@ÿº†:ì0ˆx‚¢! wééïiíhmhj¨®«®¨ª(«,+-/åSRV2âÒâGPTZô€.œÎŠ¢°¸pFà³°uˆ§¦¾¦©µ ý¡4Ÿé¾û”F§QiTn¯ø;ûÌ—W–[ÙXi]ÕŠ‹…Z½1DÀ hE •`Híèíêíjïjoïl‡±õí\ Kxˆ¶4·5O†¿GÐØÒ8…†æ†)4µ4ÁÊ!Séì鄾‚ÿ¹1úFks^~^vn¶`ú¼Å`2ttuŒLŒ@ÏøM2"V hEâ›·‘[#0r=yg²G00<ðéê`>›Ã,VxZ}£ª¦ 2Qõ XN‚B‚ƒñšdD|@Ñ"ˆ˜RßP_[W+àÂùAEuÅuëë—µx×$à5ÉÈüE‹ bJ}£DK~e0ú†ú†F†œb~“ŒÌoP´"¦Q´c¼o’[ÚZƒ•ýüšð›dd¾‚¢E1E¸¢% ®I¶¹a3ñM2ÞÝ™ hDLÑÀ”ÊHÅ»[ ó-‚ˆ)¢#Ú1â›d¼»2OAÑ"ˆ˜"R¢%À»[ ó-‚ˆ)"(Z¼»2Ï@Ñ"ˆ˜"²¢û[ ó -‚ˆ)¢,Z¼»2?Ѧç¤çæ23˜¬LÖŒ¤±Ó8¥-‚Ì+D_´xw äY‡m`X š–š’º’‚š‚¼Š¼œ²œ¬’¬Œ‚Œ´œôEÙ‹PBI¡ hd^ñ¬ˆv ïn<㢠 U–½ }ABJâœä¹3çÏ|{îÛSgNøöıSÇÎKGÑ"È|ã-ÞÝyF™.Ú³’g Ñž|xÿþýçÎéÚØØ@v £žžžœ¼\@P^“Œ<]P´"¦ÌoÑô öÑ4 MÃG{xx°X,gúhÇŽç΃tRÛLÞ§££#¯ ÔÕÛ%ôZ Ï4(ZSÄA´=†VVV ä É«]LLLbb"zyyy{{ƒq÷íÛ§  `ffæìì ï¹/ü…ÜWQI108p`x@èuAž]P´"¦Ì{ÑŽÜI¦&ËÊÊBz ~ýúë¯Oœ8rÕ×ׇ&“™Î› ÙµàM&¼ÉÒÒ웜œ ‰/è6$$DJZª´¢TèÕAž]P´"¦Ì{Ñ647((*€Yétº¤¤ä§Ÿ~jkk«««{úôimæ¤)###!!–äëöÆÁÁÁiiið–‘‘‘™¹Ùð(þÛò„ hDL™ß¢…tÖ妋ºº:‹ÅѰ%''çææ¶ÿ~˜'“É4ÈYùä¸Ý:88˜™™kÁÊ©©©P”´ŒtFV†Ð+…<£ hDL™ß¢míh•¹$cnnžœœ ¢…1ËÕÕõÒ¥K_~ù¥ŽŽNTT5 €J¥BÎ:9µ¹BFJ˜þÚÛÛàUQÈ“¢E1e~‹vt|4· ×ÐØPN^ÎÉÉÉÏÏÏÝÝF.OOOƒMMM!mµ³³ KKK›òM2\~IRR$ĉɉøß>È€¢E1e~‹–rPr$»†F†ÆÆÆ¦¦¦fff–––0FYó¦'N\”ºÄ+‘¿ŠAÄ-Ðm§ 191ŽCމ"E…G†‡†……ùúûúûzùx¹{º»º»:ßtvtr´¶±%«kª“bI½ýø2ò' hDLAÑÎ…¾Á¾TFªžä¾E%Eƒ#ƒB YP´"¦ hçÈèøhK{Kph°¢’"$¾u øM223(ZSP´Okye¹••ÖU­Ø¸Øžþ¡‡„ˆ(ZSP´O‘¾Á>“¡£«cdbTX\ˆß$#“AÑ"ˆ˜‚¢}º@jÛÚÞ¤ ¨XßTß$#(ZSP´#·F*ª+®[_¿¬u™{M2Þ×AÑ"ˆØ‚¢ýû¿2˜ }C}C#CN1¿IsP´"¦ hÿV¸×$·µ**+úø547à7Éb ŠAÄ­ ®I¶¹a3ñM2ÞÝB,AÑ"ˆ˜‚¢xw 1E‹ b ŠVàÝ-Ä-‚ˆ)(ZÁƒw·OP´"¦ h…ÞÝBÜ@Ñ"ˆ˜‚¢"xw ±E‹ b ŠVèàÝ-Ä-‚ˆ)(Zïn1ïAÑ"ˆ˜‚¢ðîó-‚ˆ)(ZQïn1_AÑ"ˆ˜‚¢Mðîó-‚ˆ)(Z‘ïn1Ï@ÑŠ£Ã=}ù1ñ–±&¢Ù¬›é5ÜY#ô†BæŠVÄùëw·èfp}“Ê<)%"ˆWBi,»¦©«OèM*,P´¢Ä­¡Îëzƒ­ÍFÚ-¶?]Ú°m*æ['±e³-­“h1ÞP¯½ºÙCb¤·YøÍ…Ì í3ÁŸÞÝbøÖh@JÙi³”ÿßÞ}‡5u÷ÿÿç¾Ûo‹­Ýó¾ïV»µµ{·Ví®{ãÞ‚ì½÷Þ{ï½ÂÞ{oddŠ€ Qœ¶ý]¿wrQ†Zä8¯Ïõ+N’CLÎ3Ÿ$$[t“w¥±o‡aêƒÔí“¡ [¯§é™×y¶Î/Ï9ЊÁö“§Œ>ïwûþ2“ëeF3cx“Rbp3}!½ë%zèþQ¬ó;)"Ú¿iý^¨õ[¡¦@†ú¯šÃQûù*K{ Cæüâ‚Bhç‹éßÝ¢±£÷°Eš‚[qpÞé {'0w$§“áŸÝAüHV‡/Él÷!^ém Ï´VâÞjZ½Q+>¹¤yÎ/Ì9ЊþÚôfí·¯&Iÿ]®õwÆŽ¿3¶ßSÛnHø+}ë_i[ÈŸ©dóõ²ézòÆ?’7$‘õ¿“Äu¿%®ý-üô{æ¡_ ´N)¿p&ÉfÎ/.˜!„v~™êÝ-Šë;w&ÛÅ5ùæœ6áñgÆèQ·h2Œ$¤A?¼A„Õë’ÐzR§M‚ë´‚k5ƒj5k4k,£›¼Ò[7h&¥ÕÎùÅ8'ZÒ_“Ö¬½âjŠÜßÅòůú+nåìù3öË?c¿ø3æ‹ë1Ÿ_þüèÏxŸþN¢>!¿E~ü[äG¿FÉ/á_“6ÿ’¯~JåÅ3‰Ös~qÁ !´óÑÄw·(ªë Ð:Ä7¹¥u(Ô)ù×ÎE¿_R-ï# çsRÖû¤¬W• ñ¬’ö¬”ö¨”"î'Ü+$ÝÊ%]Ë%\Ëu‚k=R[(´©-B;×X í—Lb¯O,oÊÄþ>’ØŸÃÞ'¿$nü%O¡]Úyê–w·ˆÍ*7HšÕÐ*úMH¬÷øÄVŽ$Ö½BX·±Ä–I¸”w)ÓªuOAhZÑpKh ûø¢Ë² NoÌØëÎ;¾&àðÚë#ì_9Gì/ ½4h+0`»tÀ†±dÐné%Ÿ7¯…¼ûK†ŸsUšÚ¡×ÆÞÝ‴Æwrc¡•ö¬Úo[°×:ÿÞ°Êßc•'`™·Û2w·…À.œ]æ9âB;ͲL³wdm7Aß°-<êTªXãš| ¡EhEÂHh“eÿ.’¿ýe·ÞsõbµÇºçjŽ/º#ÇFÔ°CýñËþoý¿þçåf•Ú¡]Μõ㥭S §Ðº¦µÓ¤sƒnêJÙˆ•2aìørRÒ_H‡¯–pЮH# Ú9±yƒB‹ÐŠ€q¡•û#ês¾ì#™ªDïà™îe²cL¤ñöH#6¤«~Tâ¡‹Þˮŭ»–­ˆÐ. íÂPXÛ.n˜d'­¼Oõ×JÑâê~²†rÆž7yÈŽ1t—aÅ.u߯ä"÷Ù¨ûŸtJà¯×ˆGhڹDŽöJ’ôXhS4W&¹ËÕÇð“ŒHS’QC‚}˨ӯ‰ÕcTÇèUñtÆTDj—Gj Dh•…k•„i…¨«åªfû+gù*eø(¦y)¤xÊ'¹Ë&¸ÊÄ9KÇ8IEÙK†Û¶<hqd¼d­Uu'özãjìOײ䛕Ú…¡]˜CÝ­bô~-_cçè<ïØB†gt¾/á•ã™=""Û5,“á–é’æ’Êp NqL¶ H´õ‹·ö‰µôжðä™»Gš¹…›¸„9:ØèÙúêX{kYz¨›ºª™8w@Ë{•\Ä^«|5¿*Çø&„¡ ãB++ í£©š+)¿×{ü¿fïéýVçþGƒÇß|/ÆŸM^6z2®7zÒ~¯w§u~©uû¹Úõr¥ÓÙ›¾›‹åŽ+‡Ë/”9 •ÚŸ+¶(²¥uçZudš·¤š4&žŒÖ­´^×pâá ž¯_ùñj–,B»0 ´ Z»¸F—Ô¡¥@¦œìͨ¼­ôÚäÊž¤Š3$õäÙ´ê>FjõY:…”ªžäÊnúQbyWBÙ阢֨<~lQˆ)láå7‡fÖFä4’ð¬úôêÀä ß„¯˜|×ðL9›¸UòQ{¬òT}*é~B‹ÐŠ„ÑÐJý]$sW¡¥‚ƹHSoÛcòß«>^ßD~“•ʶ®l‹©Vû›/X“‚M ÙÇ—¦Ð¾v%æû+™2ÍÊÿCh„va mì? -±ôäÑÜ”¦­Ñ…-Ó¯œVe˜Daf¾¥ÐjZx„g×ßX§v ½¶?­¦Ÿ:mRµZ!z·e®²w…]Lã:õ8„¡{£¡=ñwáÝ…ö×:7ãŽZ»b¥†ËÛÒMã]¤ËÂ5i[ÅÓ¡·¦™4'óOĻʜɶ¨‹ÓëÌ4´“Hp•¡ Þ¶ÍÂöShÏ{¼z™÷Ý•ti„va@h&´¶±ÎS‡6¹ªÇÊ;†¢èœêWäŸXFPÏèüàôjM ÷½*fn.á™415s‹0t ¢cÇM©êµ HÒ²ôt‹È¦c¹†gщ0«ÑI)èÙ:†¤ÚøÆÑ$ø–*›†ÕPhwYä*yUØD×#´­H m"…VúnC뮿×Uo›Þž`Ë#Ý0›ã´$Ç_ÙYgw„DųC†²£O[½ZåL¹5ÙÐ`p'“`&´Cî¯\ŽúæJÚ‰fåÿ"´ B»0PhÅ “mbS¦ -…SÇÚGÝÌ혒¾²¡ƒ‘S°SHš²ƒ‚® …v÷1E9m+y]][_ú©Žµ7Mp“*»™ãFæ6ѱÔM]éX.a´š„Š!­&«mIõ=,§½e¯„­Md' ­¸yŽ‚g¹¡EhEÃhh%ÿAh-3¯x2‘ß$»çk-‰µÇ~´RÙ&)¾JOj½¡Ìjp¸íñ–T{Í)ƶê;Ò½þ¸ƒgo„ÖíåKQ__N•@h„va†6É&¦Á9¥mªÐ¥VQ÷J(ï8(-§ceà@+ÈjYR£Ù-Ítõíäu­©š´Ü/±ô„šILQ+sÜ„²Ó:6>;ËI¨Qž)´”XÇ cçšÎnÛâ«ï7yDåN|œ™ íN³ly2ËÈ:„¡ £¡•ø»PênCëi¸ÏV}§‡Á¾ÒpÍp›ãÞÆÌ×Äèyî÷3=ï"byTvïkÕí¶Çéë¾ Ÿú¬¿‹í9×—.F¬¹”rŒÐаî³ÝÁffææÌשhikijjŽ­éèìx²æäÐðМÿ pW˜ÐZÇ48MZç°ô£Šº4Ýu”¾øî—R;¡j,£i®eáIMÝuT^^ÇšªIí”R7¥$SY“Gg´qÅíÚÖÞòz6û$Uì“i5j-MmM\ØÆŽAtªñ¥“†v‡i¶œ[©yDíZ5„¡‚Ðj­¸’pünCûßëL¶e]œ>MX«s,¶«Õ;•br½Á£+Û¢:F¯'Ï*ÁUÆQ{We”ö…2‡†ƒ‚`5Jrožõ‡vÐuéÅðU—’ ´¢¬±¹ñð‘à F7CCÉKÆ/TRRÚ·Ÿ‡—GGWr;0¡µŠž.´Ig¼b Ü£r}⊣ N¹GæxÅ„dÔдÕ5"Ûƒ—’^M߯•tøÄ¹„gÒ:4‘ePAiBL S*)º´ZHz ˆÊã gÔÐ >ñÅÉU=C»J·Ý$KƵÄ,¼¡EhEÂHhãý]pânÿ¼ç¶JÂ4 ƒÕþþGÇ„Vêá—%Ãá_]L:ÌWúB+²ø 2²2Ù£#++‹nbþþþéééÙSúi@@€¤¤¤”´TRJÒ™Þ3sþ»À ­ãÔ¡½[` s7}[¢oïŸ2!¢w‚ í6ãLi—b“0„¡ Âо5ÚSòȾTaº¦Ïwë9ÿí34HüþáqO›~Ð$%6àòâ…Ð//&DhE…VVN6(((**ÊËËËÓÓÓÖÖV\\\ZZšÇãÑòààà„„„ä ####77—rkooèÐ!5uµ¼Â¼ÁóƒsþÁô˜ÐZòê“…¡UŠY§(a­í[¦PùOUèø—ëø ù—Ó·ÿàDZd­”‹Új”y¹Ø(¤¡EhEÂhhþ•/y=æ‹A›—[i‘'‹§õð)¹I=tƒìCÍ7,š„Œ_Fl vê>1è¶ä|Èà ûùJÏ#´"‹ ­ŸŸŸ––ÖÚµk7nܸnݺիWKHH˜šš~ûí·?üðƒŽŽŽÅ„Aα±±´ò¾}û,­,›Ï]87ç¿L… ­ET½CR«‚o¸YÎ×ʱ”[Á×bhÉš)¬V}‹U “â­’ç}5µ•r$Š|¯–@3ZIÇ"Ãà“?©Å"´íÜ mÜ‘¿òŽ_ýò¨O ýè—Ð ùàgü>ãZÐ{ׂ޽øîÕÀwÞ¾BüWË~o1.ù¾)´ü¢YvÑûa×/x‘×.x¾v^àÕó¯y¼2äN^>GÜ^p]:(°dÐe ÍbœÉ nK=–œþìBü^¾"B+º˜Ðúúú*((|ýõ×ÔÚõë×S\)´šššË—/ûí·edd´& ooïÜq#+++<<\QIñÀQííç/žŸóß&bBkYo—ØB¡•õ:)ü¬ºò±ƒ=.ü¬ºcÎ¥Œ£N%äˆcÉaÇâÃŇí‹Ù´#…lIÁ~bS°ŒÿÁ§÷ä~tO®às{ÌrvæC{˜Oì1΢¬šÅn1ÊØb˜Aè[ ‡Bý *„¡ Lh/Çú3÷(Íh™Obû¤Øß"G?)6ò¦cg>)öçÐ÷® ¼{-äÝ«!ï\ ~çJðÛW‚ÈŠËo ½y)€,¿ä¿ü¢ÿ²‹~ˆýÞö%¯_ð}í‚yõ¼7yeÈëeÆ9Ï—Îy¼4è±”;è¾dÀýÅ¡ O/ÄíAhEZºAíØ±C\\|óæÍ+W®¤ÐÚÚÚîܹs÷îÝæææNFDDDî„A¹õññ9~ü8fL|Lÿ`ÿœÿ‚p &´fu¶ §nù¤Xé±cg>)v4À‚OŠuÔ÷øHzK™ôaÒë H¯°¾…„õI¯uþ¾I»;òay‚ÏË£èŽ}LÞht3ŽÙèT"´¢ÚÚÆÚ¡á!:{2…O¡9x=çÈï¼Ï.{¿uÑcùE÷eà ·eÜÞ¸àúÆeß¿„KlØ­‰½:–Ø ©ëÇ$öõ[;àôb¯õó½VÏ÷X=×cõ,é¶$ÏÐ~—Î~r>vW“âsmѦ=}= ‚*ª*¤¤¥‚‚‚’’’"…ƒ¢+%%EÜøøøXáHKK˘0²³³'†–ÉÉÉéÃGkji–U–uõtÍù¯ c²Ê›vè'šFÔZÇ7S_)Lûlò™‰)-öµüŸ$vtv;Eb³·flÐM]OtRÈ:¢²V[p`³AúQ»|ÿŠUcý“«ç|7;'ø­| mYav^vm}-¥Ö«¾~)zÿõìC¿„}Ô"¿¸Nòáé'nz¼þ¸X·Á³×‚ß½1‹ ¡Ä¾#LìÛÂYìŠÉf±Ë„‰éëd³XAeÏy,íÔ}¼îØÕ'­–zlĉÇjŽ/j”¼¿×þùÁ€†bÄk¥Ÿô’þV C$‡ä ÉõÖ3O¸Ò|”IÅMLLŒŠŠ¢o§JémGNNÝN%%%?üðý{÷ªª©Îõ/Š12$” ¾• 4 «µŒk¦9ë¥ØUrß(0ÂÉ× _ÊD¬×I¥¬Ž=†¶Iøa´M±Z zïQh¯®¸6ö(ñ”‰]>>±F{þæÄŽVvé ÇÒ·Û5)-Òò@u´îÈ™&5:mn\Ôcûì€ßûçxÛøŠÏá9Z‘ÅPÌ<»c䉨¬­Fß(ÇmT T5ótÈû\§´•²‘kµ“Xå¨{—þ ‚çhZÀ„öbÔžß3ö] ~B›ª¹² Xí×Z·¿š¼È'í»,>9­ýä倷ƞˆ½"|"v8`ÅŸÚj“ý£F"eõæ'bG{Ó±VùMÒ$´£%´yŒRw›çì2›Å û:úr§/06ÌøZ9–B«néSÔÊœ)1 =ù•ï'­äý–Ùªž%-B+FB¹û·ô=WƒÞeB;þ¡þ¬qߢzÜ~·qÆT‰Ý*üžMúik”FBWÒ>þ¡(´?j&íµÈRñ(þ^%¡Ehçž0´oGˆÿš¶ëJà;S†Vë‰K~ËÇ^ëDSX#]¥Uîpü`¿íœVK¸ZéKuy¾-x X˜XrÎiiû†ÇÊÿ;EL,æ‘GÅÄJÄþÕüéC}Vÿ$Öí…~×ÿõ9ÿ·uêО±~ê¬÷ÛášZ6öÐ1ݬ¶nÝJY¥¸nÞ¼™æ¦IIIþþþÞÞÞÔWyyyŠ«ßèˆe›––æàà°wï^}Cý‚¢‚¡9ÿ¥`Lhõ‚NEÔq,Y=UhÕ)«ã{ËÅy{,sÕ%ìÿ·,ëã/&t ùÙ—5˜í4ÉMlÖøÄn6Lßl¾qºÐFQà÷˜e*¹!´­H íŽ_Sů¼Ý(=eh/ú.cžˆö3Ìr÷ ·¯Ž9Hª;DÖ÷[!nþµ„K¼ÕÆ!ïWGžˆõ|©[îÙªÇï‹îÙ”u벎þì³à(Yô¯Ž]ÑDVPY—ÿžuúO«úÃS…¶Ëêɳ^+ÂÖ7É?ƒÐЬ±ÐæääXYYšššš››3½3ö¶Æ4233Ç¿×1­OK¨ÄÒÒÒÇŽKHJè>Û=ç¿ÜZ€*ÃðºÃÅ«å§ mÂ>ëæ‰XáÅì½ù/vŽèÅ…¿ùEÆ¢‡â>þ8sß>ÚKðÞy'å¾ûy/¿w@ƒ7öG±ÔWAb ‰¥¹,UvƒnêjŘ©Bû½zÂnÓ ×¢ï•Z„VŒ„6|û/);/û¯h”~xÒÐvh=>ìóóG±=Þïji«}|ØUÖ"TÊ,p½¬Ýz9»e›5i^«¡©2è9úŠb¥-«ç?²(uÓ¦ô={">ú(àå—ÝÅÄî»ÿ¡X¯åó‚Ê:ÿ§×ñ¹–©C{Úò‰^Ï7ûC×"´¢ŒB+%-åå啜œL·,šªúúúòx¼‰on<~Ðd—Ú¬  @‰õöõî<Ó9ç¿Ü!&´Úþ•úau‡ì‹VËGMZ Þ^«ü‰ð;êGm2ŸüOüoäJHĬYññǯ½ðàƒ™‹ŸRÝo>ib7ê¥mÐüíìT¡])õZ¼¸qºœsB‹ÐŠAh5ß¼¶íçäí—üÞš2´š{¿Î¼ïD§çûòê:pØ¢äüÅ“76i0ÞÝë ¥¢;àñŠàv<–º/á´(ëᇢ>ûŒëöÐCn‹Qhy÷ßßôÖ=ÆÏReÏ:?ßëð\‹ÚCS†Öâñå}!?"´¢¬¹µùè±£k׭ݲu‹3¶NbÓ¦M7mûV\\ÜÖÞ¶ªºjŸ‘7¯0¡Õô«Ð ©=hW8Uh¿SK ¬Nþ–ŠÂ—ëì3Ê~ô鈗_¦;âž?N»â-&–ýУÚ;t&M,ó&ë´“W)DOÚoUãw¥Ë8å‡Ð"´¢€BË×|ó|è–Ÿ“¶]ò}sêÐ>vÁë5æµN½^oê(¼·ßù­mºË6k¼¾Q,Û¬ýÑ!#m™Á( ß=ÑíÅÖ)xðß>‹Se]ÅÄÜÄÄ<ÅÄRïû7ÿs±«g{ž#=öÏ´¨-š*´æu»¿Ñô=B+Ê(“mmÍ·•›Ÿ››ÝÈù– Ý7Ø7çÛw‹ ­†o…nHÍÛ‚US…V5šzË_ìì÷; ’N©O½!&æN{‰E‹˜½Dè¤?ö¬ÜÛq‰MM¬ðM ´SÖj%¯’Ÿ2´ß¨Äm7L“vÌChZ‘0ÚÍ×·\ôYÞ0EhÛ5;ïõêÈÅz¿šd½îGi§»¬ßج-˜ÎnÑ~{ÝZi‡lëÕc/'p{¡[í™êgïK¼ï>ïd*}ÿý•‹ÿÕqô±^ÇçzŸ%ÝvOŸR2´æv»½~6èÛ&ù§Ú€ŠßØÔ8ç›3$­~’ºO¹vPõ~›)CK3Kqó\J¬°¯ÂÄšÝø£Øí&Y{ô}>Z—}ÿA<àN¹ |à¬ûî÷_±f‡f,Ma™ÄÞxŸEÁ›,&SeÒLúJž7Uh¿VŽÝf*iŸ‹Ð"´" íP𦫠›‡}–MÚG‡<^{߉e¾&»’rüøËœ>>äºAÚ.Àd{·ë+LbG^QìøßŽƒW?óïüÿûWæÿý;÷ÿþUùè¿ZÖ?ÜmõŒ ²Ït;+Vç<°(ýþÿ#9ÿ·(ôµO%$\7ê ¦°„‰]'4’X­$ªì‰+å¦ í¥Ø…²þ2IDAT-z)¶9ß)E#´íÜ íÆ«ñ/x¿Þ õÐä¡U§Ð¾<ö1;ç<_êq=ßv••îq %½#6_t»¾ÌôUX×ÿ ^ëäòŸ³öÏw©>ÕòÓÃMŸˆúvQ§ìãÝ–O ût·ýÓgìŸ:cûä4¡m7]ÜåòJÿš&9„v!@h íýDU¯RMÿª½Vy«ä#' í7*q”Õ‘Yì»Õ }¿J˜þ&eÏÖz½ÿ“þÅ}òAu’×%–ú:.±? +û½z”¡•Z­³Y7ù•¡EhEÁHhƒÖ_‰[Ák$´…!ê¿Õ¹_oô"¿Ÿt Ð¶©?rÎ}éØ3oí4ྤß}iŸÛr#±.£‰e^ëäô¼àQb‡g쟹)±väÉ.›'šUdB{©ÒùÏ&Á™Ò×óÂж™<|Úùå¿Uí‚€Ð. Lh•=KÕýªöXæ®’ mrewZM¾3TÎ7Êq”Õ©+|EñÈk6é¥nÒM!uSFžˆ$±‰”X¦²ß©%|);ÚØâ¶tá™ÒW“°j ­àuR:IG¬³Z„V$ôU§ò5—Ÿ \w9vÝyÏׄ¡ý²0HåL®mY´9iŒ3ì2ÿ˜B;è¶ä–wOyk'Ab_KlßøÄ:=7ö\,ó@ñM‰%¶Oœ¶~œB[ ÿjŒõÁ¾Ûêx :ÓšË.ñFI±Vã‡:–vû®l”{ª+ÑjÎ/.˜!„va(¬m§Ð*y”¨úTî¶ÈýJZ¿„°Œ¯È â]pÄ:ûkå8Êêt‰ÿr§Ñϼ›>±Le¿UÿR6j£² ´áÙ ¾1¹^~±yº¾E+e#¿’çmÐJø^ ŽWžŠM$©ªmÔ!³”Ϥ"¾”ã­ÓL8hžñ"Ï;¾‚›û „V$Э¥§¯§%?²AõõAÿ.EÿH¡mUYÜ,+& 'Æ—Ñ,û`§þ‚ÐޜؾÛ%¶{ÚÄž¶~¬“X=zJS¬áÄ¿õ É7Hþ«Aúß-Æb/ty}Ö û? ûl÷¹ \¼Í,í|Çì7R k¶jÇÉ»+y–‹›å¬QŠ])ÇçãQí¾WK ²ŽŸÂN–Ø”i›01±äkeÁ9~r"œ|*ü:BRðõ Ù¨µñûÍÒ¿Vˆr‹.ææ~¡ ýçú;º:³CëU_ðûþ"ïÇó>o º¾<àòR¿3YÚçD–½Øï²tÀã%÷¥ýK„O;ØçúâY×κÿõçÿö:ÿ§Ç‰<ßãø|·ãsÝÏqxVÀþ™.b÷ôibûÔiÛ';mÈÖO´[<Öfúh›É#m&‹[‰1y¸ÅH Õüáv‡»L¬²Y ´È<`ž¹ßÑ–"l:êÓ¡sܦ±]+r—OÞ61<¥¨±¹‰›û „VTôŸë§«`s+¿¶º¬¢0£8'1?#675&'…'|“ìä¨[%Ee%EN)1231â&  áSI'a ú–N?75º03¾,?µº¢ ‰ßÐÑÕA÷¦¹v·tAh€ÑýFsEuuNQiZNARFvBZV|jf\JÆé$–$—3•$’:^t"#eR¼F²@b WBZfrVnf~QqEe¿‰³û „V„ÐýÓž¾žöÓíÍ-ÍõMõ5u5'kOVUW©„V´Ðµn6½ý½gzÏtžéììê¤ÛÏ mm7鸡µ£u"ºŠOãTÛ©[нã[´´µÐ‰Ó½Ñ®ž.ºCÊÁWç/Hí‚ý†ˆChEÝrÈÐð];§A·®I L£ÿ\ÿêì#t€ŽEgÇÍ{£ B»ð`¿!šZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØ1ÚÃ’‡÷ܳkÿ.ñ½â;vïØ&¾MÐÚm›7n݈Ð,@-;˜ÐEé›êëë#¢m¨­m ­e ¥©¯Iß&¤& ´ B À mvav{W{ooß`ߤºÏv·v¶"´ B À&´gÎ^¹våÚ/×&uéÊ¥®Þ.„`AAhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;ZŽBhØÐpB À„€£Zv ´…а¡à(„€-G!´ì@h8 ¡`B ÀQ-;n -}½úóU¦¯t€YˆÐ,@-;n mEUE}cý•Ÿ¯\¼r±²º²±¹¡X˜ZvÜÚ’ò +‹„¤„^„µ­5¿…Ð,L-;&>t\\V¬¤¢¤k [×P‡çh,„€_ uùêåêÚêSm§Æž¬Eh „€xÕ1G!´ì½Ð–”ÐfÀ¬*)/)*-šóÍXðJ«J³ ²zz‡/ SP'uþâyöBÛÒÑBDñŸ¿hûàšóû £Ðxªq`h ï\ß”ûzú{X -U²OSìyêtÏéP^¨w 7ÌœoomSíœïÛg‚¢F•½í#ÌýCý,…öÜ…sÔÚ+×®ÌSƒCƒ¦Ö¦‡%’83¤ ®P×X7çûö™¾4LsVÑ íðåᩞ.}CÃC&V&{îݽ7ÌÈݲʲ ü†9ß·ÏÄ¥+—D:´t_ ¼²¼¸´˜6tÎ/¬;í®»Ä÷‰À É(ÉÌ£ÐR³*ª*JÊKÆ¿ÀX¤CKZY]iaeQy²rì¯zE…ÖØÒ˜®;ö쀙عg§Œâ| -¥ª¾±ž²U\V|ùêåyÚÆæFU ÕØøØ+Sÿ푨aBK×í»¶À I)HͣВ+?_IHNPRQª®­ž¡íìê425 ¾4ožµ„Ö˜®[wn€’’Ÿg¡½xåbDT„®î©¶Só ´4ç·ð­m­‹JŠæË¤–BkdaDWŽÍÛ7ÀLlÙ±å„܉yZÊVeu%e«®¡nüû‹nh§ZOÕ5Ö=Ø-â¡57¢ëǦ­›`†$e%çQhiNØØÜÈ|òݘyÚù…Bkhn¸qëÆ [6À —9>B;)Ñ m|züàùAjÕTï)úúû-wíÛ3'£(SÓP3çûö™8ñ|ßà„ö\l* ¡M‹oílíêí:söÌ<Õq¦#9#9&)f.6)¶¾¹~Î÷í3$xÆóÓhïjOHO˜õÐV&f&Ò¼€kè–”™—› ÷ ]žt©Òe;çÿ¿³Šv› ~ÏÉÜ@æé%³ñ·‘•”’RTQ4ë¡­n¬ÎÈÏHËKàšœ¢œšÆšÐ˜P@Ï O¸'#i¯’[’;çÿ¿³'=/½¼¦¼¢¶‚ÌùÆÌæ2Oÿ+ßTs[µMµ-³ÚæöæŽîŽÎîN®i?ÓÎoã‡Ç…“˜”˜ØTÁl f":9šî¸Ð¥ÚÖÕ6çÿ¿³‡ö™--§:N-ì'Ý@(óô¿’Ùxº*Þ‰YínǽÒÔÚÄò9L/">"*1*!=!13ñö5Á´âÓã™ÐÌ#,…¶áTCbjbLB ‰OŽÏÌͤ õ?ØÜìüìúæú©~Z~²<53õ^:ÕõÕ¥Ó/˜…–—ÄKÌHLÎJ†¢‹q–B[XV˜”–”–VÓX3Õ’Ù[yš£ßCuüº´¬4Ú”LµdöVžæè,l<'+/+%#¥¸¼ø–ù ÏRhËN–­[¿NSGS[W[KGKAYÁÍÓ­®©ŽùéÄi(-¹e!}ÛØÒxôøÑüâü©~ª¸Ž¾Î#¶N=Ám½Íy1bcuôtÆÿhâ€é!´¢ÚâŠbcm=mÚAùøÒ^uâ’Ù[yš£ßC´ÿ ‹ SQSÑ5Ð525Ê)È™¸döVžæè,lt‡+ßÕ)Osô{ˆN_W_—¦e4· ‰q÷vŸt‰•­í]ïdå»=婎ÎÂÆÓœš’WœG³;º+cçhÇÂÆ3Ïà2©š‹Ðžj(,-T×T/©,¡¹<%®¾¡‘¡þÁþôkDDGP;R<|<öîÛ[T^D‡éâ‹KŠ£«àʯV‡SêhúÏÎ/é.Fyu9óûÐ)(()Љ”ØØÙÐO©‹t¬ŒÜŒ±_ž–lÚ¼‰êN÷Jè4)·)™)Át’þ3è§Ž®Ž´ÜÊÎ*+?‹¾ÕÒÕªª«¢ÛXTlm9B w ¡ýÐÚØÛÐ=rÚ‡Ðm\AY‚7q í˜'¼îdå»:åiŽ~ÑFF^¦º¾šÓ.ÎÜÒ|âÚ&ów²ò]ò4GgaãiÖ¤£§C÷f(“” *;_×\W˯méla/´k×­¥æéêÓ/LsJºbÑ|ÔÓÇSNAŽ–I)ÉÒÊRº°hâH¹¥+%¿$ßÞÑÞ7З"MUÞ¶}3%¥9.]éM-LéÎ Óo¾0¢LiÆLëЄ•Ð:¼XÞØoNëÐ4—¹ÁPÑ© ttºÃ¢¤¢Dñ¶u° {0™Y™ZÚX2ç‚ÐÂÝBhE?´ÆfÆAaA|ቴ#¢{ê—ÌÞÊÓý¢ É‘cG¨å|áEßHâ’Ù[y𣳰ñԚœ8FûyúÊ<2ÁÂÆ ^7~†þb/´[·m¥ûtŸâèñ£ÔÑÚÆ‘û†4• ¤pÒBº8¨£š:š¶Ž¶ÞþÞ[¶nÉ/η°¶ ¨|å'Ë÷ìÛCKèJ©£¯C5ÕÐÒ yçØo5>´tÝ¥k-¡û/ÁáÁã×ÑÒÑbShCÂCø­‚çÉ;ZPR@SgºË3~ešˆ{ùy©iªÑ>B w¡ýÐÒ=i&ut×\QE±¨¼hâ’Ù[yš£ßC´“’•bæT Ú¯N\2{+Ost6¾²¦RZV:·(—zøxØØÙÌöÆWÖU þCOÕ×4Ö°:£e:f^~<ö|rh„àcÚº òŠóè§ÎÔ¿’Ê’øäøÍ[6SV}|)º4÷Œ‰\·~-\jrÒôÛ›þ•.Š(-É+Êsvs¦K§ª¶JU]5<*|lñ¥ ‹ £ë7%ŸKwX Ë ‚B#Ci{è\˜çh)±t€¶ÊÃÛƒ¶?53ÕÞÉ~6n°P!´¢Z/_/B{ÒâŠbCCÚ_M\2{+Osô{èdÝIm=mڳђörž¾ž—ÌÞÊÓ…¯ª«¢4”V•Ò\. $€ê0ÛOq=Ý{š¾vvw²Ú‡0¾ÒWß@_3K3Úú²ª2šÑÓu‹.šìRáxq<5 5j!Íñ¿ýîÛü’|:®‹» µYVAö›o¿¡%t"..;wí¤²ŽÿÝ2s3OHŸ S£ë«O€Í•iŽOG,,-[GZ½‘ÐÒ¹S5i}=Ú jAiežy(›j=¶rNaŽº¦zf^&õ~6n°P!´¢ÚÜÂ\CcCÁ®@_‡î|Óþtâ’èøhfzp'+ÓjþAþ´¿“•'=ú=GÓÚ$ÚµÒ.ÑÄÜ„ve—PìibÃ<[|Û•ù¿Jb^¼rÛ•'=:›Î §èXÚXÚ:ØÒ¾}ö6žæ²TVª ³Ù´Uì=tLW¤´¤±M¡ ¦g§3¯b§¦ß–’YY+˜kÓBúQ/"-;&µÌl&¸t-ONOŽKŠc–0¯[¾åoÎ踉i‰‚‡ ›ê*ª+(“”mæeS7.…ÚÊñ6SY£b¢èdé&Á¾¢*» ›–ÐÿÝ![™./ª8&M¦Çà¶ZÑ-ÝØ³ó³é>4íˆNÖŸœt U–îšßáÊ$%#…yû½Û®<éÑgíåh_G{Hš3LºdüŽú¶+óÇíNïdå‰KØÜxæa) ÔWæ%8÷vãÇ¿KÍe_{NSbÛºÚZ;[çå;CÑÞÌÂŒî¼ÌÞ5à^AhE?´3W×\Ge­?UO3Zš›Ña¾pòF ž—¡¥Ù­³»ó¬Þõ¸WZ„¼¦¶& mgwgMS ÍeiÝ~¦™:·žžŸ3Z€y$,6Ì+ÈË'ÄÇ'fÊ;Ä;˜<Ûÿew‹¦­TšË¶v¶ t´ÐWšÔÒW6f´tºtêß``````px ´³8îYh‡‡‡ÛÚÚÊËËSRR‚ƒƒôôô¤¥¥wa`````pxP )ˆ”EŠ#%’BI¹¤hÞuh/]ºÔÕÕU[[›››ëççgggG'-‡ÁáA)¤ R)Ž”H %å’¢yס½råJoo/M‡©Õ™™™4;¦¥€a`````pxP )ˆ”EŠ#%’BI¹¤hÞuh¯]»688ØÑÑQ___RRB'Gé¦i²;‡¥‚HY¤8R")””KŠæ]‡ö×_¦J·µµÑ Q´i‚œ’’ÁáA)¤ R)Ž”H %å’¢yסýý÷ßi"<44D'A¹¦©qmm-n‡¥‚HY¤8R")””KŠæ]‡öúõëÔg:2…š&ÅtZ]]]”n>‡¥‚HY¤8R")””KŠæ]‡öï¿ÿ¦£Q¢éø×®]£ºté⇥‚HY¤8R")””KŠæ]‡ãÞ„cB‹1‹¡ÅÀÀÀÀÀ˜ÅÐb`````Ìâ@h100000fq ´³8Z ŒY-Æ,„cB‹1‹¡ÅÀÀÀÀÀ˜Åñÿ"ö@´ï}ÜIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/machine-rename.png0000644042355400116100000001173611675570700020746 00000000000000‰PNG  IHDRÄ]u­^·¥IDATxœíœiP›×¹ÇÛ~é‡ôkÚi?d¦žé2Ó™NêLÚN¦½77Mœ´Î“ɽ7v|°±ñ‚m0ØØx ÆØ¬b3̾š]€Úôjßw ³Œ16íýc¥ Áø¥r‚ÐùϘ£óžsô¾<¿<Ï#Fñ÷þADä'}﻾¢Í#‘ßD`"ò›¾ÓÒÒÒâââÂÂÂüüüÜÜÜìììÌÌÌôôô$QÐáFÐz >Äm؃pâøøøðð°Ûív8f¢  #ô 0|† b3ðÄYN§GkµZ™LÖG4B¸t„À$†Ï0AÀˆ#€§^¯Ç¹<Á`4n¡À0 €á3L(“Hn@QÅf³[[[««« ‰‚F7‚ŽÐ`€Àð&$4ˆ0q8-++£ÑhIDA#„AGè0 @`ø Úx4_(™HtÀ‡šÑ|‡?U|||VVB€`Ãg˜PQ&Á# 'Ò ýΟø[ó®§ŠˆˆO=€H ŸaB뎴†–YåIï;BâoÍo?xB~Bè0 @`˜ˆ}0‰Øo&0ûÍ›&£Ýh´¿ÛA“R¯(o(¾”}!)㱜y.¿,[ª¢¬Nëæ‡ ÿݔֿYÖD«lËßÈ®zñÿ»5/%÷tVáå~·#`²‘“ kÓîÏß[|üˆØ¿~ôx¡GÔ“pÈ9è ˜’2Ï•ÜÌÄ“klâ*F¶_ÜÊ/{üd]ß ØôâÊè'.„»†‚ ¦ÆÞëŸ%ü›OM|3ôâ<;Cûäá£/&:&®¬#¨a Iüwx%Þ™UƒS9».…a™ùqlînï%“W&ƒÕ€Øë-z½Yo²›¼“x‰IÏÌòëòÏçR\ÂO/7ËóVãÿSèÅ7Ã’ßKþ H9Þ¬>ö&½…—û’ÞÚ—ô¬ÁËÄ7sÎ×0s±>».®º›†IÏ¥ÚN“G±Ì•è“ÑI—’<ðYègeUe˜éêéŠ;·ÿÀþCGÕ4Ô€ŒãQÇ“R’Â…_I¿’r%%doHZVšÖ¤Õ™u¥¥‘Ñ‘é™éB‰pM˜š8Å9õgå&ž@Ý•Óp.³öt~c¨L‡RÿÚÌ-É»y%mdJnÊMü6~Y\þg†~ùà˜ƒ£h-lNâ«:Ø…ØŽK‰Åá&6bf:Ÿîþ4æT ·[ÛP»oÿ>ä˜ë7®×Ô×ÄZíࡃHKŸìüäòÕË Í ìøàRê%z7ýÓÿý”RPÌÎòªr%h¡·€*¤¨gajæÞ ôìÜ›çÏî+ëHK¾q¤_~,ýCÀ”^}²¶'¯ )Ñ1dH«ŠŽÎþ‘Ž b@[=« <å]Z}œÉ¥Lºq8š¶|)¯1žÀäÑ…)t_(AÇX$í Ûë©bHNùEù‘'"wîÚ ˜´zù½ÈC{Bö°ylÌ`%§²s²÷îÛq,ˆ*jÌÄ-®ìÊ’zË;3ÁДw[x7®TFJý[ ¯ ÐêÏÒû*÷_zx!?%Du«bÐP1@•Dó\v&6h™ Û&’‰¾„Éj,.+Ž=[QSq£üÆžÏö,£³7T,1‹½0¡êå^Ëe°Ýìn6Ÿ½²‘ú²gâ\?|e{fml+¯HÙ–Vƒä”Rv¬½¯x=mŒr<]ö ˜²ñryÐMó^"0yµA3SØ0`á…  DEGÕ5ÖIUR°²ëÓ]^tÀÙªA}S=ª›R§ä‹ømmX¹fÏ>NÒvÆ„hí’#WÞ?xù=tBí‚ T=4Ož<äiÉ=0eÖÄÖõäï¿´mÕ%“W&tÙè~0FîA‹ Àlj˜hºQæP×€Ús¬Á¥U¹Fž•“ƒ® »žSv}PëXí}•ÈL¡‰o–´¥ª­BôÚ è”wfxˆéÕ$\?€î ´ÑûªòãW^Ê'=Ó?µË¼œiž–'üô¤(ôFÈRH62µ „-s&{Ö<;XNKb¾P*Ä®çýiì£2?>•³ }j²QjEd› ÂÓ ¡ÑƼ‡˜ˆ´°x_Ò[‘™£?xù¯+/ÉßC`òh#f¦äU0yþéõŇ:„Uh½WÍ­É-½ R˜F&”ÁJN ÞÔØÄ«æ¿Ö†~ùÒÒ““§Ì9ƒ¦ÔœÄ¼Ê”É»·?Ÿ›&ö¯gîÝ¡sjb/FÅ·Ð×7wÝ<{ùx|FdBV±Ÿu&%¢òf‰c ¾ÏäIN|ŠÓÞÝÔÖÝHìw³øÝF›ÁÒo ˜ðœV§Õæ´¿ãw‹ßp°ÀDüšÀDì7˜ˆýf±ßL`"ö› LÄ~3‰Øo&0ûÍ “Τ£b>Åã‰À|1O áË5rï÷®V“*Jª’JT’€0nU¥W­úÿ‚&Äâ1Ù¦X.”(E`…H(t±;D2¡÷Æ#$¥œÙ6‡Ó±ñmwÚ­«L%“©e«ž% a¢›ßãp[†'Ü#“ƒá[c.EÝÅ¢kMÚ•Ï¢1h˜»Ÿß]ZZúû?þ~²ôdrz’’SZ£vUh&T7±¼ïÖÄ€û¶#€<21ØÚÕ¤6¨W>‹R§Ôè5ÏR@éñ“ÇRår± |˜Ä00jÿÆvÛøjuQ/¯‰›ÛÈ)låiÆåÀ¯õèäPKçZ04Ï“µôxqqˆÏÆÇóÏœñX’’2i4>yüxÍõߦ6LÈLCc.׈ÍW;Gl¶A‹Ée‚otÒë„´&YF£üD.S Vƒ×od¦çÁ´ÌÍ3Z˜Ÿwu3¸}dݳ§ß¾e‡†j?ü·{÷„É´¸øèÙ-ßž6SfLƒcýýÃ_m05óÄÕ Ç¦/¦ó3êÅIUâøJidnO­ò¬±º ½BæÍ¶Z:³E¦;n™1)ÓŠD ¾÷¼”ëÄ>½õðóaBt->Zé…‡óNF÷Ãûwïv½û®í°ýþ÷ö?þqðý÷ Û·óBBÆMFïâù‡óv‡]$)”бñ±UGý+Öê´³÷fŸ_|¼¸©`B‚0ûà!³Þ¡¯ìž/a]ªèî•˳zJù'‹øñåâØ‚žJ‰e—¾ 87*æXrjbaIÞõ²kQcÈT\^˜™sõé9&¤køÛ§w¯ “Z¯~ôøÑ£…•¶wurwìpîÞ=°s§íìY˶m–­[íŸ|2çþè#ý{ïqw:a³`åüÂ<‹ÍÊËÏ+.).¸Vžž>2:‚ù‡ çÌÝ»?1Æ ÷çï/ÏÜÿbæá£å5Þðƒy,š{ððçjTTÔÀàÀª{ƒÁÓæI$ ŒØ×uÚê6RzUa+?½AzƒiJ®$•õ^(fÅ—ô¦×‰YòþÜF1_¥ÀJzwóå´$®¨Ç`W[\ºnNGVnšB'..»–A»bs@ Ãû qý7ßhél\¦ÅGˆÜJ³u„„¸Þ~Ûæ¥¥ŽÃ‡G¸Ü1.×þñÇýï¼#üóŸÍ-ÍXi¶˜i94üœ™¹=~»ªºŠÑÍ4r…üRÊ¥¨Q‰õýôÝ鸸¸‚Âðq*ö”J£…Ž~GFfFÊå•zùåÝ™»õ õñ ñ­m­S˜‰ŒŠt¹]«î ^X\(%›&™ÀµÜýÖe·¡["M«å&×Ès;m¥ìþz³MììQ¸„:·}hÒ>4‘Û(â«äXœšžÜØVkÐ{öj-ò„äóì>Æõ²‚´ìT®¸çÒÕ‹Ln‡Õ­_ï»ÿÓC·]σɓ`Vš¹ÿàþýÖ×^³ º%$ étcNç¸RÙø°~ëVÓoPú“¡¾+»™ÝøUÏÎÍ.o|8oî Óç÷>©ÄÞoGºÊÌÊ;vì(**pÔÖÕ¦^I|¥¥¥2¹L*“¶ÓÛï?¸BÉáq܃n¾€ßËéÅLdd¤kÀµêÞ`ÜðæI(ã÷ß²Xtë±Ù¥K«eÆ^ç_i±¤6[ÒÛÌ9ts Ó\ǵvR6£sLçÍm Ôr,>—p¦±½ÖìÒzöêíªØ³1]ì¶¢ÒüSg¢óŠh‰)ê[ª½ ÖïÁÑþçÁ„ð —¬t÷þ°/`ÚºÕ±wïmƒazjjJ$2oß®yõUýk¯‰~÷;}]-V665"‘ 6y÷zÊÙôÌ4Z( uúôi$§ñÉñн¡ýÎ~\¢$TRrðŠ;‡ŸÞÙÙÙ±§cÏ_8ü"Gïwõ¯º77¼©`²™LNÍzltª{åTF=;¾‚Jj0^j4eµ¯u*Y¦&¹O;Ð!2´p¤9gæ]͹–¡µÉ={Å*þ¹Ä3,A×µ’ܰð½½BF 3ùJ8v7àñÀˆ£y-˜T:•§•ùÒs³Œ°}îË«¯ÚvìáñƤÒÑêêû.×T{»úõ×e/¿,ܲE[SÅL³®¾njz c„ß`2(T TYU™–žÖÃîÁ0ކ ¿3}Ë.&]›;{î,`ò¼)rêƒÉ@TkÔ›§;~ ¹í+÷öÔ¸a‰b³ÀÔ'åÙÜzƒC¹NëìŠ> UÐÒ_!LoÒÆ—òRªØiµœÌzN~¯´ƒË’‰t6Vv²[â“Îv±[U&‰Â jh«ÎÎO“¨ùÅ´”´‹z».¯+I˾¬4Š×°kØÖܱ6LŠÎJ÷0nÛæøío-ï½7TVfÙ¹SýË_œ:5ZR"ûÕ¯”/¿ÌyåMM5Vš,¦ôŒt%Öt „ÕË:'O”+å§H!ÍàjxxøäIléöyrÕõâëV›k°ü5µ4¡ÌaD‚'Ì=vT­º77L)¨Í“„‹B£µÉ|²Ä@•w±£séq×Zº„ŽœÏU*¡Ô@i¬_¬ÑX¥ôš¤Ôø“g¢ÎÆÇæer)&æ nä\ÍJñ¬‘Dé9©u%>½{ÿ¥¹ãæ³0)µÊ™{3wfÏa}ðŸÆ7Þ°¼òŠê§?•üà¢ï_øÃŠò$ݲ¥ëýí%VNÝbsØWÓ¯^ˆ¿’JËKGÆFÆ&Ç*ª+ÎÄA!‹Ž‰Æüàðà‘£G0-‘ 9%yrz’×Ç»˜|[é­xiuXi¹4¼j, 3QÑQf«yÕ½ÁHZ›&„ƒ*£¶HÖi•…RE”–ßKõ56eTÔÑ{Û˜z¯¸K g‰5<…I„5ÐÙMmÌÆªÆÒ¢²¼âÊ‚ú¶J:«‰ÁmëS°±Ò{šHÍõ¾\§íƒ¦çÁ4ýùôÄôÄJOŽ™YÝÌíÓ¿þºþg?SüèGÒ—^¢^zIùãK@ÒŽì”p|jløö°B­ äT7«»©µ‰ÞEï÷ÉUò¡÷°9‡[³Ý|{ò¶Þ¤¿3ŽÃ‡F†0ƒñðذF¯Ñ4·nßÂ˱©1,–«åz³~d|3‹ƒU÷ß½+–‹7 L|Š£w(@Àº-”êùBU/GÂ`ðÚÛzšÚ{;z›™‚vÌ•l©^€e-Œú#Çßuì¹hJËóåíÖ0>T® “B£@vA°Wyt|ÄÄf" ~óѯ-üÅ/[¶°þsÆÿ—])õðw.îÔéS« ¤ž=ÐFrÚL0õ¢pÈ Ÿ ž$ZžXͪØl‰5Ì`Þ×£¾-.}ÓZ0É5ò‰;Hkøö-#¯W˜Ÿ+ÈÉòXTX`UH1¿öúo˨€bÙ¦€I@ñ9B–Ò$¦tÜ@±DÇÓÛTk6à2• ¥dpd0€<:>*’ŠV=K@Â$UJºØtJÍG³ŒÏð`™Ê,áIØ]ìI·òY´F­H&²ö[Ñý BaܪÉfZþgÖ¾ú, “ޢ牸=mtfk$IÕRï?Ÿï±ÑfD™C`Ђ £ÀõIû:Ūg H˜`|ÊPhË_IV†¥*)ŠÂ³¿}OÈOËŸ¼ðÉ.ŒVIkÒ®ù, ñÆ4‰Øo&0ûÍ&b¿™ÀDì7¿p˜p.N›(hD`"ò›üÓôô´ÃáÉd £ººšF£ÅÇÇGDDì" !Ü:B€`Ãg˜fffÜn·V«åñx­­­eeeYYY8ú8QÐáFÐz >Ã4;;;<<Œ´Ùl6²¤IDA#„AGè0 @`ø ÓÜÜÜøø¸ÓéÔëõEá8à‰tWH4B¸t„À$†Ï0ÍÏÏ£:‚D”I0‘èP8›‰‚F7‚ŽÐ`€À𦅅$4´î8H"Å¡dâÜ>¢  #ô 0|†iqq b3`DrÃYh¾€§™(h„p#è=€H ŸaZZZÂ6`ˆý(“8mxè €‚­­ha²™V‡•ÞNÿó_þ›ÛÅìÂ)zýÙ)§Ý‘³ë®Ö_*F¦ç‰yÿØñà ø°'ÀžEåu´0z…%…õMõ{öîYœÈ1¨wÄ’6—M­1±B|ùÊå‹Eû8}uu¥e¥©é©Í­ÍR¥ôÀ¡ûì/*-êaõ\¥_½T~‰Ád /<1(újôÞòÔI¾˜ï¨»¯»¡¹¡°´q0"õà€Èè…A)ŸFz£×'#µ£»ƒòéçõcæM-Mß|ÿÙ²òâø¤s.ä\®¸|äè‘ö|JX\>òš†pƒ”Ìpv¾»³¢ºB(.>Åás_c‹—†¢KEÙ¹Ùb¹8hPVnàñˆéõ¬¸Pøfçe—W•Ÿ9{æïoÿ}1+½ý½^.+.§¤§`3Aµƒ5SÛP ‚3²3+ðÚñÎ̳¤¬äȱ#:<2Bd,ƒ}û÷UÖTbªXBèXßXŸ‘•QZ^ŠA— ޹íÚ½+¿0nˆ£T¤c•¢ñ1+ø¼÷Á{x‰A)™ZVv¥¬¦¾3léh¡ 'ÚˆƒÑ„¤d>¤ç’Ë%`Ÿ_ÞÅ<zj¯Öæ^ÈEËᣇ ƒpÆ©êºjê °9m1q1@[Á Ñë,ˆÈWª¯ `;£½©µ )Ól7_(¸€õ@íàl1â`««×»E ¸D`g²›PÅÓâ´9wF­Sc2§COƒZ´ >úâÕ6 ŒŽƒîÞnD€CLl œ—#ŽÒaqêÄÉ¥¤¢ªïCc!¡ |0(|,C ìXm]mØÐ°ufßqÙŒòâ§BNáSÄ1@?xø …HM %€~d/âTRŒŒ‰¤N¡Á)tWéT¾€>Ä“R’À"Xs^~Â1Jœ’«å{÷í]Œ8¢!Çû^R»æ†ø 92´àlè™Ð%ˆ#ÙûFç ¹8À”Ž;ŠA— Ž­ïˆ:Æ)‰B‚î xèéBðGÁR•>Ø@¨œc'ŽÁ‹§¨÷’™“ù ¯"¶¬ü™Å€©ª®*è@Æ N!BhA2Câ8…Ýw -ÈjØÇáC}ð‘Ñ‘¨pF½õ‰Ó[ÙSµ8vªü…Ã?ßÿçbÄÁ(J *ˆ·dg2P ‰Âç£ÓQˆS@ýqtA¦‡óâS(Z°TÐÈ—ð±,WDÔbı±`WÁÐØ@Ž?J!~µùêbıä¨ýÇû^¬/þ¾ˆè¿q¨³§..控jqäZ¤L€²ª¶ ˜ž‹8‡ å5N)êêWo-No¤¾ÜÈÉÏôé™é8… ËÀáB GÀRqŒ«½ˆèˆ·ÿçíň£vÇ’@ñ“ž•ŽRA9¨Ä”\+k+cãcåùrÄQ] §b>Åw ãb,L/¿ å8fþBıƒaV(Ê*Ë /G\(â”c’ˆ¼šoE‰þ‹|í]í¨†q•†MŸ+ k|œØ‘‘Þ챇ÕbÀN545P§¨´Âˆ£.Þô)æqâÔRÁõ%°²1@Ð[Í×Wƒ*$ißDë›êsósqÉH}£ÒÏï‡'ÀB!N}9ƒ¾”3V#êf\âècOðBð­Ç€-‹új…¦„•FãõM(‚ãícm …S>¾U5Fùà‚ÓÈR¥Ôï¬lRùÿ{q"¢ Aœ(ÀE' pÄ_†PÖë,Z…N®Ð­¿ÔFï/.#‚¸ß$Q‹3‹h§Ïü(:ˆh“Êâõ¸F]qÿ)¼¢¡4¥ Rg—Ù=z¢õ•mDW×Qœ˜12î&ˆû ñŠœ‚êäù…Ï=z´ÊÿGØêM f†Ó‚G®Äý†x¯Iâ,K¥Rm̽uM¨ñ"î!ˆ¿PÔÝŠx{{»X,ÞÏy A|©põ›Ÿ»œfz;½‘ÞHßt¶%ËÅR¥´Ÿ×OÝ™(VˆY\–J«¢nô¶ÈÅýü~¹FNýf¾³§“ºûªÓÇd3•ƒJ£Õ˜œš—Gý2Ð8Èæ±©ûu¡D2‡Ï‘«åÿY*«@*@wt¡~o¯3ëzû{!•îÙÐñ—`[ñðÈð³ágÓ2Ó€,_ÂϹ“šžZ|©X¦’ =½ó$:6:6!öTÈ©'O€ÚC‡é-úÒ²R¼Œ>Ÿ|=¼wß^$xASY[™š‘š•›ÕÑÝaqX K 9„–æÖfß M­M1q1Xǃcy`Í`\ŒŠ‰JLNô=âIßhÛˆŸ‹8w¡à²2ð½T~©«§ ItVÕV¼ôÌôæ¶fdÖ¸D/Žð9pèO %b‰B‚¼k´Ë+Ë©›±xïp”‹¸BnQir|aIaDtR5p÷ ŠÏóÕzukGkÐþ T>Xf˜†Dé è+„âm[ñˆ¨ˆvFûÐÓŸ8¾oÿ¾ƒ‡;¶4:13:<6Ô;гäoÁyYѪ>½ÿé“=ù×f0̺wÿ¦½ü/"Ä×GòA9OÌ™ºum|Úý 5vã?úæÑ¾ZÓ·¯w³»–ÜF¯·è5zÍ“çÚ^ûüó/é‹/Ðþü./þxò…Z§^þg¦ â뇸„3ys|ìÆð×ÓèÔ°gÒÅÔe5 $W÷Óªú“«Ør³ñk\nxï\ñ/(”—Ù£ùùáÎNvPóý÷½zï=ΡCÉã……•;¼D#ˆo0âb Ï”sÍšt:LJLÃVÇØPC¿´ E^Ö£+êÒŸ/°•ƒ_'àª5ukâyˆ#9?þüñ-Ì?putwî=ztòäÉëÁÁ×wíÙ#ܽûºLúèÑÂò./M˜0A|cçŠ9³£#“޵Ê>jk–´sõ.s[’×,KiPÄÕ(ÃKy} åã³t0[ J.”U•r%ìá ;åZ1ƒÕN9¸¯‰”\¾Œ³¦¡'o^c<q@óèñ£Åz8ÿÀÙÚ*Þ±clÿþ‘¿üÅñÆŽ×_w¼ùæèßþæÚ¹SðÎ;c|(§œ?{ð™fPÓÔÜÄèf¸GÜ ÿnÿæâò¸sŸÌ-oÇ„ âøŒ¨­^ Õè2W÷IÓê„(NXrUQ+/±JU!JªSЪ„,…nŽQKqYAd̹’òÂ–ÎÆê† íºfkï¦ÓRã½q®Ù„ nYU‰L#\Ó&gǬ•ô9¨\X,GG»hçαF÷ìÎËsîÞíxë-÷áÃ×òóÇvírîØÁß±cR«çgóŸ1{™eåe]Œ®fzsJjÊèØ(Õ~{îöì­Yü|0ÿàᣇ8øäî'h¹yû&ÎÂg~aþã¹ÑN½„ÏÝ{woݾ…Ÿ8†¢¢£Æ®-™›w }þˆ ¾Ñˆ÷_›m«”sÌ*3ê.uŠòZ5õxøÀátdçdÃM$á%àÆVHKÄÏ©é©ù‡óQQQ£ã£KæaÂ*Š ¾‘ˆ‹úÇo¸Ù*Õ'Wf7 Ò›µELW倛.ñ0ží˜Ì<>dGT;à^"•LÏLêásÿÁýȨHì KæaÂñE|@ÄrÄUª´“]!Èê°gv8r»†.vÛ+Øö&£Gî4¹oXFnT0”\ ž9ù(Nì#ÕÑêÖ§fÒ¬6zçÕ»\Yœ_œS^]j1¬~tJØv¬ŽשQ0 ï.7,ôâo¾éž¶ÙæfgçŒFׇ_{Íôë_«_]_U Ï>V½…¦©Ž8î8@A"–Š«ª«N‡œ>{ÕÈÑcG=£œÒõ ‰ (WbÎÇ sStNnNðÉà3gÏ„……Ááî§w###GFG–Ì Â„UZ‚ø#>rÝa÷V#›Ç 7©/wñiuÒ´Kf»ýb—µ´Ç\ÓomØøZ7Sf»Ü)T˜5p®¬/ËÎO78ÔT_µIšš•Äö4wÔÜ+Tp¤ƒü̼4Ÿaѯr”Ʀ†Ÿ‡8 —‹5â r¾þºóÝw§$’…âzyù§Nç'B¡á·¿Uýð‡ÊmÛ´W*à‰¼‹< ^q (f£R­DÅr¥ê ÊPÞÒÖ â/å¦Õiãâ‘Î)Ð}ƒ¢hA:w¹]ÐøÄ8¢EDD »‡—ÌZBñ F\ÈBukuëV)‹[«±©¯r„´ZaN›V-Ìmâ¶ò‹Ûùe]‚¶P0(7¹´ð©R2[³Tm’´0®^¾ 2JÛjc£b°ÛÒ²’z‘eÕ€F']+!Ž©÷ν;‹%ŒÓmÿ“ç7†~ÿû±Ü\ÛÛoë~ö3ç¾}yyªW_5üä'ÂW^ÑVUÂÓ3æÊ,6 E³F«‰‹ôÀWŠr¥Ü9ìDM‚r|zv:88íè¢ôºúšº³ÕŒZ…ÇçaU0û˜ØPÛ ‚ %<<Üár,™„ +µJ‚ø"βœã“K³& ÚUm|Áù2fdqKÆiÅbDf”©­J£Sísc º3óRÏF†Fž?[\ž/TqÐØÜY—”ž@9臔—®–×”]êÕ>21ÔÕ×¾âZòåí;·kT?ÈÛdúÃ\Û¶éücÕw¾#ÿö·¥ßý®üG?Òÿô§Ê_ü‚½ëÝ1³ÁëüÉm…Zq±ð"ª‘äÔäFzã›7f?žmioA‚b:>1ž–L›œ™<{îìÔìºhtš”´”[s·”%NÁÉbâ¥{Ì}¹ìrLL .@%r Z°†\CKæaÂñF¼ohÔ¤w(W/­M®4Š„ªúž®üúf·‹-êæÊzEjŽÜ ´Éà£0[ºè]õ5M—«‹ËjŠkéW茆öÞføÈt|_4µY"× Ö4l;+"VæîÎÊ/éö̈VÍùßô¿ùý•W ?øöûß×|ï{à[¾mëýºµ*øLܘÉD\ðiíòUK¦¶H䀿H™L~'“×Ñ'è±PÅ–éxj‹>IOLBDt|øÑÒãdzþZ†[AÎ1ËóG&ž¾5½D`Ë¥V°?ÜÃýÕ¯ø¿ü%oÛ6²þsÎáCn£gá:³s³Ó2Ò–H¢,¸Žònñ F¼×2¬ÕX%k8V™EJ£PaÈ |c´ }­¡¾†°ít®„8X¹ùñMäÑ4}Ý©U ¶4kš(iÛèn³í+û¿,a A|Ã&Ø|¦Á¡Rš…›H—Y| ^Ä5 Tצ®m"aÂrµ|ÉÁñu“ΤíãöÈ´B“kÐâý¶ä¿^Ã:ƒC-RrÙ¼¾%e×l7ËÔ2T̓ӓ(7…0UÔë˜öò‡˜âë#«Ó*ÓÈzzºû;»Ù›Dý}<¦Ú ^ú76\v”.ÀIQ®Ù RË1[©ZŠi/• ¾n²¹lÞ˜ šÍ¢A£Æh5¬ø„2‘˱éãm yÿä*¦¼Ò{!ˆ¸âD.‚8Q€‹ Nà"ˆ¸6qÄEô¿#æW#ˆ p[7ÄçææÜn·F£a³ÙEEEIII!!!{‰ó«B  %ࢸ®ñ;wL&‘HÄ`0jkk ú 1b~5@$°œ@ ×5#~ïÞ½ÉÉIlX%<;‚bé¤#æW„@@KÀ D*p]3â÷ïߟõx<‹E©T" ¶†rbÄüj€(H` 8(@®kF|~~õ Ö ÂrÁ¦€Ò§“1¿ ŠXN Pëš_XX@òÇ…*B`¡`;@у¸RbÄüj€(H` 8(@®kFüñãÇXèŒ%‚±PÔcÑ #æW„@@KÀ D*p]3âOž^}‰û]pÿ*rÉyŸþöòMyé‡Ô—¾¿!/Þ”—¿)ØÙåö™N÷øj7ï¶/½O½é8úÇEaä)Ä^ÈɧO>5´Õ>å‚WßDâ~WܧÂ}—ýÁõ¤ç¯'='äÛDäÙ›ò r-ñ¹+¹›»Üétwæ%n'_³9þ¤Íñ'|ÂZÈÀãˆÒÿ¸ÍÀßCÖÛçIÜuEâ~WÜO‡|t-ý­oâþñõ/òÔ×±Š\UäïWcþ~5ö—3×Ί»Kã"Ç-z–¿™wß”®¿ízD‘ÎG,ºèY)qŸ)÷»*à>øî•¤×.G=q9êq!—"Ó’G/E„AZ1nyиY“–‡½;–IÜgŠÄý® ¸Ÿò{ãbÜ ÂA·=¬H(òW!ç‡Î…>|.ñ³Yq·©zǼ婃 ÷ßúû©SdÝ_ö×þå`ݮ͟Úå­Xðñê›HÜ婢û¸÷+ç"ÿùUÐý¿Hà}g~‘¿œ øË™ÀûÏÄ~Ðåú‰Nwp·Ð¼n\÷Øžª?í©ü“Ñ ù£ŠÿÙ-Dƒü?#ÍŸíëÞ—¸Ï‰û]põxþLèã§ýþtÚï&…ø"ÿOÈâó'|ÿçtÄ›³ânZòòþЇw”þEJþÏvEþ÷öbE¶!EŠl/þ¿–•oØåJÜuEâ~W¥+ÃuØåSѯžŽx?;‰„=3-O«r*äµÎ™ÉLû¡‚çÌ+_2ÑÖc¦Ó½¨5å`úkÛÝžôØ–øGÖEÞ¿1æ!dÓô_^R¹5ñÑ- ìHx2¼ÌvÁÇ«o"q¿»ÒßÙÖ¤©,N¯Õd×”gyÙYïôv2w³=âjclm²ÛáØ²‚䒼IJ‚”–ÖZî]5måyéE5ÙþQFÆ[,[:ÛºšY9›4ß’[P••Qœ˜]šÚØQ¿ðãÕ3‘¸/¤T7T[ÙX8»8XX™™™±w²557ÉÊϺeǦ¶F{';{k K³£&N.6vV±‰1} >(}‰ûBJWW\b¬µ¥‹›£…ÕQkÛcN®Ž®mó÷JLK´´¶pt±?fmîàlçé㎫ԷÈp~ ‘¸/°Ô5Õ9»9zûzB-¸»y8§ã“㺺çêRÓXãàdçîéêàdëàdäkë`“œž¼àcÑ‘¸/¼¤d$Û9(Ô‚¯“‹½—‰ n0kcB{dlí}ü<]|ý½ü¼]=\Z;[| ú/÷…—¶®67OWßoØ;¹8FÅEΚˆ—U•‘²‡„yú¸A|DT¨½ƒmQYá‚➉»^HAI¾£ ìzz»Áqhxµ¥¦F£Ó¬£·ÃGñ ïа@߯ˆèР€ð ¶î¶Â=!w½¶®Ö Ð@¿@@÷òu ððñ ô…oífùÅùÎnN±ñÑA¡þá‘ÁÉ© Üã–V–.¸ý÷ŠHÜõE ÖÍÓ%!)6(ÄÏ?È'6.ÊÅÝ)§ [mÐÜÞäàA\OËL ‹ %›_pãë‹@mxThph`brÁ Ém¼ý½š;šEƒÌÜ 7§´Ì”ØøÈä´øÌìt'W‡Ú&ÝEI™G$îz$õ-õÎnŽiéɱ QáQ!)i‰^n™¹™ÝÝm.îŽé)iI)é‰ÅydðiY©ó¼_)e¦HÜõH`7&9ÑÙË7§¸4«°8·¸,6%ÃÊÑ¥¬®!$6Î3 ¨¨¢ºPSU\Yœ•ëîçWßÚ°à6ß["q×#éè± -^c“½Ñ©PÈÇ‚UÖY¬µËE69mvAŠ78æïvÏ­nm_p›ï-‘¸ë‘tôuov./òÌœ_‚‹‡vx–ÖÊ-Ý™HÜõHÀ}“S¾þà¾ð¶½aH«¶ìABoˆ]JÏv2‰ûŠÄ]Ü7:å{e÷ïnÞ…5!;…";E,ã;·¸•JÜïT$îz$à¾Á1Ï9­{«_ýVßú-7¤n‹OÝfU¼k7yךFµnr)‘¸ß©HÜõHÀ}½CžmbÇÏš žÕë=~‘uîH•µnUC›Ö;IÜïT$îz$à¾Î>×"¦eµK² qF4ÈJÄIHù §r£€º5ö…÷;‰» ¸¯µË=ָܾô†Ø•.S¤Yj{SlŠ·zU­´Í—¸ß©HÜõHÀ}µmξÀÚÅVEÓRˆ|fyC!Ç „¬w-ÿÂ*Oâ~§"q×#÷U6ÙF¾U+ì‹¿DìnȶEB–#6HáFײ¥Çr$îw*w=’Îþž>…Ë-s—!VÓU9–»TK–X䬲Ê(ol]p›ï-‘¸ë—h[#3J‚“óÃÓ‹§¥(÷üs?òðó/<¿}çöy¾mdmlß}ïÝÇŸxüÑGýdÑ'!á!³:R÷@wAišŸ}îÙGyä…_ؽg·Þ~ŸâþÑÇýéOzäoüãŸÿ <õ§X×û¸Ÿ¥u÷tïìý?‹ÒÑÛ±bå ÌÑÅñwTëäÿç?ÿùåW^žwBõÞý{|èÁ‡~øÉ¿?ùׇÿúÐC8t ½g–¯îèìë´¶³~âÉ'|ðÁ'žx‚@pß}÷½ýÎÛ9…93·t¶ìصCÑüÈ´æ¿þ•K YçÛ-õD w3Âἦ±&%=å‹_ —.[*ˆiëj‹Ž‹ŽˆŽPKãFMÌš¼¢<íŒHH\RÞ2×)Mµ&8<øÅ—^äêÄWjDÈ„°MIbJbdldL|LFN†J-öØcǬÑë¨ÅQ ~ùå—s f!K^}íUüß}XâåëÅnðÏþÓÕÃufcÒÂgŸ}Íìh>|ä01Í$B ¾Ð÷_ánim©Vƒ“¸¿ÿÁûMmJ^,ù<À’‹6¢†¸(jvíÙõ—åùçŸÇ…æ:åæéÆ\ruþRObóé¢OŸzê)¢# ¾ôÒKGLÔ4Ôp•ÂÒBjØ V­^Å.ôɧŸà3ø€‹‡Ë;ï½óØãQ‰£â<èœ w'W'%'ùô“²Ê2ô‡}H_ì™Ù¾i¼dé’ÊÚJlã~&0$ÐÓÇsVß°±·o4WÔTð’Äæw«|ü}|¡%î¿ÂýÀá äµ]*¡ŠMŸ(.àfÙî»ÿ>n¿TÜ©a‹5$úÏÝ,Ï<û ›8ÿëõ5¶6ÎuÊ/È÷àåã?s€›š‘ ¦H£½Fl¦æ¦táBvNvwx¢=éKæPÝPNFŽA/’±G{”³óàŽ=xéÚõk[»”ÈówÕšU¸ÖÑcGg6¦ƒW®^ÉV°dÙ’ÕkWcö\7 ûîgBÐ,¾cžá,]¾͸Á‚/´ÄýW¸?ôׇ J‘ÇèáNNîyp PÒ¡æzÒt>ýôÓî^î¤:§Þ{ÿ=qŠúêúê7ßz“«[ÙX‰¤(42¶öÚO€äΚIî1fËö-*îJ–µ|)Ù3<Õ5×mܼ‘ü‡HÌVcmkÍ=â<ÉÌ.£](Ü´e“Èø»~ãzjöìÛ3³1^ÇžF€z®B3ö´#fGZ:fyx Bsw¿òd²²/W~I±‰ñ‚/´ÄýW¸+kyÿ}ŠL^2¹K#<ÏŠ{ie©6îªdçgÉnÉZ~ýIâÔÓÏ<­ž"kb»çêÚ·ªð‡'ï†\_û×k°KÈ칉;Û逕dæ7߀H’1qGˆ$ÍóDwRF§@9ý)y÷Ý{vÏlÌBcvƒEŸ-b¯ûø“ò3Ï<Ã}ËÌÆèÑÑ,p?täЂ/ôL1hÜwí\„ûTn›&†xÿ ÿ-ÜS3SEGÈcÐÆ5Î-Ê]¼d1@ÛÚÛ¶vþò4§¸­§œ\œÔSwhVq'  "WVnû0€dóÖ¬[ÓswàÆHÑžÔ ;Á16!V…ÌÅÝeÜqÌ^·a¸Í劤(h qšÙ˜ÀLºÅ=Lf^&-Ó²ÒØFhLF4³±Ñ>e+P5ã´Ë–/£1΂/ôL1hܵoUᦶ±–ecñDÌ+¯*òÉ' Tq‰7~ö1!9»Fm܉Ç+W­${¶´±ÔáŒS,¼8¥ògF÷˜„˜ç_xÍDSÓ£¦ÁaÁH]Ü| 37S´çf¬1ÃÕÃUü\I!yždÆÖÁö‘¿=²øóÅÜ}ò’¬éÓÏ>%]qrsšÙØÁÙááGÆx&¤gú[ç1LÜÕÌllaiA΃fr0aÛ~€fnm|¡gŠAãnaeÁ14PŸOHSq‡ŒW^}…š»1ò°cã¾ÿûUÜ‹5ÅÄȧžz =äè(Q´Mçâ¬Ï<ÕÑÓñÎ{Jt”†é/h737ã¢\º¨¬¿"5_µzæq7I÷ÜÂ\aMcÍ_*ï™~öùgXRYWéíçý /ÌݹàæS¹¨i¨qótã˜Ûhñk¬\óÔ§S2Rþùô?Ù”Ø1˜ÜoĶ/µqÏÀ Í‘±‘êïh#×B³£³#1Íé9é·¹÷»„;h‘·ßy›ÛGå=“xæÙg£Âi¦`UÄÝW_{õå—•7OÀô—wfÌL —x…Ѓ|±â‹¦ö&qŠ=]ç{=Ù6jAŠÛS‚½½“=òùçŸ'Z'¤$à]OþýI.ĽiS[“À«5 ûqß_-¬D}ñæ<¸c{¾JK2¥ï–­[ØvÚ»ÛÙ 0/"&B4ÆÈÍ[7s¸(ÇNB;S”_’O{ÑÿñØ/W|‰f|ÍtÁT4ëç4î¢üyº´@X³ï‹Üƒ0ÍÒRŽ/½üQªTÜwíRßAWlÊûîsœï²s €C' ´uµ‘5áWÔàN°aø>†æäÌÄ]¸"6¬%-ß{ÿ=îkçIfˆÜ9K—-8>ñäÜ@skA=p¿øÒ‹ôõòõRÛC6y7ß4&3!? ÆÍp?ј› U3÷6hÿ…ÅQ—¹Í ¾Ê÷_ÖÞ/ÐÄý†ØXZÙZ±S{x{p[¦–ˆÄ¬õìþ‰©‰ÕõÕDbk;kz¦sî_”Ü4ÌuJ¼‘BDän˜—ê'ºHHBP..TUWE¤'‡&½!uÆ=¸¨ÎGÊðI®âìæ,þ”W”Ç%è>×ïuyu9W!ßðöÇÇDöÄ\‹¾hÐnOfÆ †—Ÿ.'ìd/1LG3:Ñ(ÞN]ðU–¸K1t‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ‘¸K1 ùïÄ]| \ñ‹·ÓQülÆaÒmjÆòºæºYGñÉüß—ôGHS{“ös0wSþ qohm065V¿øÈ"c"íín§o@p@IEÉa•½“}~Iþ-›•U•‰Ç¥Å§ÄîÂtyx{ˆ'3îšøúÅ&ÆÞÍ+ªò_ˆ{U}Õo¾áêé*žº¯mªÝ¹{çªÕ«ÄÓtâ+“Ú{Ú³ó³{¦?÷Ÿ_Ó¨|Ë•"¸RŸ˜š˜_œ¯ýö®¶´Ì4”pJS£¹Q“•–S“‘“A0ÆÓxŸ ¢ z’Ó“3s3·ïØžžÄåUåâô‹G³©D!þ‰U¾¾‹?_QQ[!DmQyQ\R\V~ưKp c6Ðè|çóŠòÐFw±§Ñ˜Q¨¹¨úÅ€—Ó ¹½™áÐ1%#o§£¦Z“’ÀKñYh¦…+Æ%ÆEÅFUÖUŠå[n’ãÑ€ÄÄǨŸš¬®¯NJMÊ-ÌŸ--«,ã8)-)":‚6 - Ûvl;h|i¹ûœüoĽ®jñ’ÅÖ¶ÖL./Ã"ÃlìmÖ®_ +ü_ Ž7ocã½öPYƒ]¶ „x/_/6SsSõAÕžéÐûú¯í5²u°ålEM5ïð>ÇþAþè䯛§›¥µ%5õÍõuMu¼$®8tàõ×_G3 œ\ojp3q-^r€Bg7gP €à€0O ¶Á1>üáGî2Úemg-þªæ)ÎæÒñöóÆ<уEc,±s°  VžHêï õôñ$À«»—ûÊÕ+± .™7^rÑ#fG‚ÕÆëÖ¯Û°iƒ¥%aº˜ÉuÖÑÑÄÌdͺ5{÷ï59j²qËFfbŒŠ îΨ¢¥½£=lfaffnF,\½fõ–m[‚‚$î¿î¬3ÞÜÑ ë¬ëÆM…{Ý Ü·mßÙ¥•¥,9ë*p'à±ðô%Pi‡OwrZ2áFAš¥Ë—QŽcpQzÑÅü˜yQYëB>ÂÇŸ|,pWQ¸Dq‰–ŽLjlmµ­Û·öL?¢Ê{É1¦ÒRyú»«uÑâE!á!\‘MC4B ŒY Ë ‰åð$“ˉƻ÷ì†6¸Ç$®…¥¥*î‡f\\¯`ŒtaGLp°~ãzg"=.½rÕJÂ6³Çð‰ 8 ƒbÔøzˆÙ~~l„ÆŽÃãÀ\‚|‰^¢ úÕ§C$î¿îD#² Ó£¦Êw°ØY³Ò,6•Ô]XÕî½»9PqIˆ!&ÍŒ=ÀÍbà §€ L©±‰ÓËÅÝE¤ñÐÈP€—`´yëfÜ ŠÔÐFÕkéàŽÍBñm½ºgß^±j…H½ÔÆBàiÍÚ5Œ‘¡!DnÑXx,Á6Œ·°é­Ñ¯â®~£™†¸óa¤è¡ Æg(¹_S[Óª5«D É 5ˆÆØ‰v•¥Ë–\è¸c×ìd&©m$î¿?îÜûïÚ³‹ ˜ˆ¾7p_·V ‹`ÊPIzNà!—¸§aEìøÚÐ÷’eKÈk º,!7yÔ YœÅµ ™SÐ@ÅÇp7/åñ"v (ÑÆ`í©!ýõ òS¯E`&‡QQ&ÖZXYˆ‡§° 4Å€‰'ôtp'õ'+¹µP(‹Zà.<œKÓQ<‚¨â®>¼‡Ó‚2-Q…ÿÐ]`Ú3î …jÎ^Ħ*~öU¼³¤ ·ÄýÂÅÇÏF.›¶l ‰aŸÝp?»0m –åáNŽ(Èþ.p/¯.§ž”èųú*ö*»3ä‘ëóWw ½È°É¸çÃ1Ð’™@t±œLüýÞzû-jhæíïÍÀñ—ìÜñF¢)DMt|4iC^q~‚̃;ÃáV2 8 ·(—ërÿ=÷žé{wlf*ÄMùLÜ3s21;Wÿ`’r±ÃÜÀ½í¸—hJ˜v<³ 4Ü‹ÏÄÛ˜ÃbM±Äýw¶`A¹WcZ óÔT(g¥w>ô´¡†åaOgÛŒÄBn ô}|Õ¯ÿ¸/YºÄÉʼn L44‹³h#¢³Ÿµ8ÊÈp“V¶VÜ?¤ÑL{’«»w9p¿+®E€çZ`Jì„cÈ#Ï‘]`‘áKÐÖÑ£Üü ‚qcï4¥10ÑvÙ@DcñæÐ\‘ÁFÅE ő؀— %´çv–”RÅ[L€+ެĄBµFç@ì8 ãÅax‰„fц97·4gNnóŸ!÷…íX.å^‰ûHEmYЂ›!å7‹Äý„­¹½{–Ÿ»r¯ˆÄ]ЉÄ]ЉÄ]ЉÄ]ЉÄ]ЉÄ]ŠÉÂã^UWåéëéàì ~`ú7HT\Ti…î/57µ7iÿÜa÷@wpX°ú¿ ­ îÞîûìCöÜŸ’ >=D›ØÄX++Ô¶vµÒ1¯(ï豣ήÎâkx«ë«mím•/Â-W~€ ±­1 $à˜•ò±íGè‹ô  Êîó³Ì,ÌÐ#>ºƒk[kôãiîàä ýýº55ÀHñÑ.ñ«€·#YyY³þ4¤Žtôvxx{Ì|r*5#UýoèíDÏþÒ°¨0õù¿»,0îuÍufæfLSL|Ì1ëcâ‘ ¦ jkÕ_bihi¨ª¯jéhQNµÔ‹v)?m×ÚP×TG 8 iCÔ7µ5áHë7®§¾¢¦‚Å åÊU+T¬½“ýŽÝ;¼ý¼ƒÂ‚<}<7nÞ—xã+úqýÄÂÒbíúµxTPhÐ /¼ ~ï“)^¹z%T­Y·fÛŽm\Â7ÀwóÖÍê/{±$L«_ Ÿ‹‡Ke]%ñ•ÕböÚOýÞý{5ÕÚ±ks­,|OVí4Ú©ý-骮îíïžCG±Šè161zP"ôPoek•‘“Ál0œM‰Š»øõî^î1 1ÅåÅâÃ^â_¥Á굫?üèà ›6p¼tÙRþÁ‡|¶ø³üâ|FGåº ëØÜ”Ÿ ûbs’™—Ÿ¿kÏ.\hÑg‹Tªˆ2´Ço¿\ù%¸SŸ”šdaeáâøäxP3=jÊŽ¤}J|X’AQoniŽK㟠ŸIfbYå‘—–z&$'Ћ±°@ôZ¼d1/Å“Dœ—^~ÉØÔÐ ¬/63óXÅÈ(ˆ_ÑèYüùbH@³“›`0:â×-ŸY`Ü¡3,2LÇJ&ˆÝŸ˜üé`mX’‚Ò†ÇöêáåaïlϾØä°›§3(žôas8bv¤ ¤(-m,™ÍÏ—|NGð‚ƒžþð·øŒ$Ý‚ˆ=,!mÄ'àU3ÀK|"²·ïÜ» ˆo@¶ø8!èlظAü¾áŠ6P"¢mTUSÂ3zÄGpÑÃÐCPD«È¢â¡\³Å§Éîo¿ó6É̶ÛhOž£ó™x€#c#qNT¡‡ˆM€­C|PŒÉÄÓðvñqùeË—á“Â¥e¦A^¡âÎNecgÃbÝáØÕÓ•A±Ëùùãlì?Lµø°ö)wz…G‡‹ôj¡œIC!>L"ŽþÒ IDAT8C!äWtœòIOz-Y¶Dü(•0`˶-L6Ó€@€6.$~ž–U¡0ù¸(ÆpKþæ劸ê5îŒ\ùŒøtÒ¢ìVÓOX°ÅÞÄ4‘Šàú¸8q‚p Ì5ŽÎ)&Ê Qô¸s–ƒ–ädÌÌ”3n‡÷Ø4Y”Ã:KB\ÑÆ^L¢òÐPOÝBmaY!¶¡gßÁ}b‡6ñ‘IšAØ–­[x„.$³ЃKÓ =x#è5¡÷SôlÛJt¯¬­ÄK!{éò¥êsÜ0 F¹…¹ŒŽÍ!2&R¥<¯8ïÆAQž’ÿ´60“¤…˜µâ3½\…’(¢‡dVÁ‚kqÀx™ æbTܹÛaQèÎVCw0ýðãW­^EÜ€(»ËhŽ„wA¡ö)wåéÒ‚öîöÝ{w“ÚÙ;ÚÓ…L2JQøÑt¯_:¹:ÑkõšÕÚ©”À@Ð(Ä9‰ܱàø[ÓÞ{•_k[³Š!€‡8 †ýMßqÇAÉk!ƒygð„j,fîÈU˜özê‰îlŽl‘ÐɪsÀƒx#1%QÅU‡r´±°Z‚r¾ñy÷ÞN¶<âMÏôoá ,Ø!Ê÷Z…Ea•xÔp(²Rñs1$ý¬1.R˜šš•Êf"’Ò°òêr¦žÀƒ „sñLøK…ñ€3z˜‡²¡'#7=l_¬(AŽQó—Ý©´²T'™aQ\œˆˆâ7Å/ÞàZÊïݹ82-JHÄõpÔB<éÑ‹½^}:¼àãŠl68lc°bwºÓ‘Ü Á»hÆÙd¦Î)wE$fø- îâ)A¦ŽèN/ЋK3÷µ«µŸg°4Æ«‰lJ89™½pl6"HÀl7½tôw&?fYoÒA" •Lð±ÝÔ #SÐ'€‰¯(!ÓeQ9Ef.â€@Ë[6 LšÄœr n†8/¡D]–€h LýŽÖrÉÒ%œå¡‘5öôõOá‡(ŽYuPF-—6³0Ãå$'ê蔟þ|±Ðò¡‡ÝËvE‹-ôð=,­òÁ÷¤xü‡©àFB½ñ‚›÷ÞO¼}Dhøfˆ²Ô`1^5£Ã –±œÆìÄxÆENÈ}j L)jÙyÄÛDäÖôbª¬Š;y9}IóÖ­_Çp˜mŒ$ˆP“’‘‚‘ÜÙ£Ö9ÅÒˆçßA“Í„k)Ý»Z‰)„B2+B”¡—x·Šéb”{Óëµqg)1€í ‰ÏÍ­456XîØ ˜ôˆ^:úŽ{Ïô›$„F$üÆb_Éë*Ö€‡D„”T”’ØOYfñ›ºdâ zÄÃfuA)#¿Dá?ê 0âºT²iB6iµÁ&e©GÄ>8ر5‹¼ ð‡;E%•„1jt~õŽ—„[¡Gèol½¡G,Œ¢G£è#Å~¦=:?;Œ,Ä$ìgŠÄû$ ¸1×å¯: *Å1{WG9›Cà@ƒ(_ªQ£ó¬\®ªêÏ’ ²ª2‹]‚1b0ch‹–Ú§„fJÐÉ(ÄÒÝÙdxÉØÕ«®R<¯(z©B,öÐûy)ÿe‰½//Õkéè;ЈPõ;’”hW^Ć ÞÆÒ¦†‚3øøù,Ô÷TIÑí§™\îÜ¥Hù½Dâ.Å€Dâ.Å€Dâ.Å€Dâ.Å€Dâ.Å€Dâ.Å€Dâ>»töõvôjÜuù/ÚÛÕ¯Èݺܽ!wE2rk›ú´kbŽWÔökÌ D/ÝÓ2µtÜÉÁ )©èÏ/¸•ñsêaP™yƒsX>K/;6Ḗ‡ÜÚÂ{ÎI$îŠlÝ>Ÿ|¼£··½G‰ˆ„óÍÛÆXûö¤£Gù+–Y üüõ :l2J_NC£¨9@ótc¥FœU´õ UÊzVeÈÅý¤™ùˆhÖ}S¡Š£rõiµ©HϯŽérÌzÄÚnƒUÄèTÃhsãåôqCkß»ïM¶vi¬4èèùÅNÅø¾_Y+”L›½ðë(q¿-Ù²m|ïQ ûÝI+»áØÄã÷?ðÕó/L±ü÷ݯì;8zÄldçî±e_œ2Ú;VP2ÀzÛ;sУ|¬¥W8Œ805qt=ÙÔÞgm?|àÐh}KŸ§ïÐ;ïM¢¶¾¹oÓ–qÿ!Ø:h<úÙ’‰²ªþÒŠþÏ—Ndå VÔôí» \/¸¯Zs þ\uŠ.p:İ™–1'>Y4‘¯¿yúÍ·N/]~Šc.ôÜóS+WŸzìñ3Èêµ§4Õý ¿tùćOšáÒž>'·ïÛ¸eÜÓ÷dckgW¬:µ{ïØK¯LiáÞÛØÖçá£Ø°nÃxfî Cf¢ÝÚ ãlXδ¬Û8ÎÌ0' ¾ˆ÷Û•Í[Ç¡!¯hæÞ|{²º¾ý¦q`b½ÅAkg玲ãPÓ0wàðhKgo[÷X[VÙ.µMýâ 2öŒæ|±âÔNfçÒ~ÕšqK›áôìÁ½~hÒs·í[³~<(ìòô3SÎn'âNà¨VûcOœ ‰8‘‘=x5vŽÃâ,ÊÓ²q*܉-e÷ž±šÆ> .*À£RÃ¥…ÕHsGÍðLò¢èøão¿{:§`ÐÊvøƒ&s jû}‡pNƾuûø?þyFwo¿!¥ †È?úd‚¡•hêšû¬mG qIÇß{O[ðE”¸ß®lÙ>UD/6eü› ˜z¼g:Ï[¶ ªú-ž N &/¿¡£ÇFÚºnöèuZ¼d"8ü>Êë7Žû n?û|ÂÛ_ñxÚˆ}c_Ú¶sŒ0ýl29ý8xJT«€›\¼´r€4†Äº„dÆãäÓ¢,ȾðÒ©îac?LÃEÁ‘Œˆ]E8Œ­ã0И}ÿÁÑʺ~gŸ›¸ßLŠz\O†Fž ¡·s&éׯ&*î5¤p€Ž*÷ém„cr3VÖöã®Ë¿”¸ß;¸Ã_rÚ Ü?ùt‚Èíé3D>Jàä^M“¹Büöc$ÁD5Ò†bÍÛ‚±Ùô«èIÉ8ŽÐ@†ðâKS$džÞ' ŸEeÄò·Þ™,¯êoéìÛ¶}lͺqÂ'Ù©6ÝÑ ÷î^'_û×é5ëNõ­í†9EÖññ§l{ÔbNøÞ“äÈŽÝcèç,Ç»ŒÆHŸ–,S*á?D úŸyv*3oÖ]N ¦¹Q~%B¿üªÝÙ1”·tz{«êúMGèE®…—2d4‹»s†“•?ˆrÒ­/VžZ±Zâ~oà®3"7£â%¡”u…-ÂU= ™! 'E&Wž~c®‡HO/\Y~õ gú½°n›~OƒöéwI¸Éãš9˜¾ «êûac°Ã ÑÍôåcòKȈ¾"‡A¼bªPHÍB°`/ŽéBÒÏYºÓ Íܘ’ä—+VÕ5õM'c7Þ^¬mì£=îÇm. ˜'Þj¤#ITIÅ€x/ b,œ¥=§¸wó:i´ot¡×Qâ~{B%I s˜_Þ|û´ÑÞ±[63a coá–÷Í·N¯]ª´²ÿ^)‰ûï ¬‹'å?òº_J‰»)¿ˆÄ]ЉÄ]ЉÄ]ŠÉÝÆ½ª¡ª¤²DŠ”» •õ• Œ{\ZœòõÖ}ÝR¤ü¡ÒÚÙ›»À¸'e&}óÍ7·£W¯Ê?þ¸Ð&üeæèþèñÞŽþÿІkß^¶…Ç}tt4;;;kºäää þôÓO¿mHýýýçÎûm}o¿\½zµªªê÷ÒÆ`[ZZ~øá‡;íxöìÙ'NèÖÑÑñÚƒ%åååÚlͬùÍš›››ÿýïÏQB­­-³*NéÌ›ªG´¡#“?11!.-¦šyË!*…ž .$$$Œ z„{hh¨º'''†wfdd¸»»—••]¾|¹°°°½½]¬Ðää$ Xee¥‡‡GZZ¡î相3S}}}aaaèAS€ ®®®^^^¾¾¾(¡ÍÐÌKoooÜ %4”œ:u*<<kiÉÄ¡™‰¦ÆÂ‚6 /^¼ØÜÜœ–´܈ˆˆ3gÎü|3Tƒ/p¤¦¦zzz2v²5ô`6ûùù±fx5a[§|||P‚ÕÔÔP‰~ê)Í"##hœŸŸ¯MÀéÓ§CBBD´c’cccÝÜÜ‚ƒƒ1•šóçϳO:;;3 Â0Q˜ ´EGG³–––b+ qff&¹{crrò¢E‹LLLZ[[E/µ¦¾¾wâ%B-CcPÇŽã%60.{{ûÀÀ@f†¹ššÂO0Ä™LΪ¸sÌ|ÚØØÚXAÂöçŸ~ðàA‚IÀrº3^º«–×ÖÖŠ6¹¹¹èg&™4´i4朋bùÈÈæ1.(&°¨¨#ýúˆûÏÓNÉ ²´@Éb0ïÔÙÙ ÍøÃ`Æ!òøË8›aC¿À ¹ñl@ä/{èÚµkÉ@èBÍøø8S|àÀ¶.}èÐ!’’’âããQ‚‡$Àm8ÀµèË,c ×¥ «Åœ¨ð=¦›³ÀÍË‹/²'Ož¬««&lkž.¸ñ¾}ûŠ‹‹QÂÕwâœbÙp ŽiÀðoTThÂ=tr¹ááa6@íýº¤¤„ÆÌkIPàr´±¶¶f†©!ðsQT±Þ$Šj/lÞ¾}{\\†q9¼Q4fÒh aÌ0dƒ‹º—ª5¹sçN¦šQ ö£ÓOc!¾œ…rðÁÐ0Œè‹=*îXË‚¢6°Ëœƒ>ËÄ),!^ å¦™ºÿ0Rµ Æ Ÿî]]]B!Ç»õ~f†¿ôbùXná6zŠ;qQàŽû«\\\pYÂ0‹Íò0Œ„FK¼;—é‚fF%pg¦ðï§  ”™k¢ËC´ašXl¦†™Â6‚ÔMYT¢8W$n¡\Àù…㟧ÓGÚPÃÔkç Œ xëŠZÖøDèB ¼rE˜&B‹-;á˜öbçQqÇO°\4à,hé‰j"I033Ó¾§Y±×q-®‚fèD.J »øÒ ÷&òiã~øða˜b¤h̨©a¥Ø hƒ=Ôk÷5àub*„L,+»wï^Æî̘0’Û0jX#f’ŘawÖ…HÌܲ×íÚµ‹Ñ±-À+EÔgø¬³¤½¡©mXt±ƒ ÞBw;³ÇÚÁ7·pbuhÀâ<ú‹;]îLelÄÐC%© ›/ ð—íO4Àïé"p犴aù©9 «‚󈬎â®W%X=`-™k¶‹¡éÂ|7³)BÝ\¸ãŠÔ³ÆÂ!¹ ¡„}_0-r:4°,¹Š; ‰¸iÁ-YEjH´àõçéOw\#9¼b6j&L03˜!`8Úࢇ¿*î¢1W¤†(€IóãNwq ý$El‰ìE#;£]î˜Ö¥¥¥\HÜh ÜIŠâ7ù‰6î8'.Ö”yÖfIm#àž‰;š!*ð‘²c*þ&ÀÕGÜ™w²Æ ^lIŠÅì†â-"˜qf–—PËÖÉ$â €Âhî¼$ðÓ·&BˆèNÁé™AÖ†æÂpY*P€-x‚Tm¸Eô³íÐ@›xŒÁ0–„!`†Ya’¿¸2øÒî6{1ØqÀlr9N‘׊=—¤ôq$‚ LWHxP¢sÀc0ëN¢–`PŠym˜e"¢È^Ô‘rò‘Oÿ<}¿KþTÁ¢X‘|ó—Ù`I`ˆôW=…Z²Oºù¸–0pXà.Þ R/ÇL…¸ ãZÐBœ ¨7-¨"³ÂÉÕ^`„"ºhCqÀ¼qÌ_ñÎ6³ctww‹^j Ó¨vV¦‚µ`½¸a‰ñ¡Â®K mHºhÃHE`·86-1˜¾û÷ï·è/++#ÿ¡‹˜"—6îjÆ(î¿ÑÏÔÑ]Ô0Wlz,á '¤‹E{—¾à·´ŠØ—žÞô9EA‰šÃ0„³ŠÂ€Y- k@;5d)µˆˆ¬qkrºˆÔ‹tæ« Ǩ–0›êÈE@ïhïø*U"EŒY55„uñXô£A£ž‚xºpuÁ1ĸtºÿ<}·@Ü7aègNPH{a*5â­j´ß½Eƒª‡aŠÿQÐVDcqŠ1b› DQÃåÔîü奘|ÆʘªþÓƒSÔІB3ÍÄ{Ž"*si¨Çl2h,^Ò…¿Ó@ç½Hµ ÖªïÛ îE˜srtŠ·­¹M'é×;3wῪà.2–ÿšÂr’72Úý-°Ç~…‡ˆ—„»Ø@þè«ÜåBLýïÔïXÄUÕAî²È"q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*wY ¨HÜe1 "q—Å€ŠÄ]*z{bfâ…K¾“E–?¸\º|)1#qqOËMKÈHÀí¤HùCÖ“³’÷în)Rîš,0îõ­õ• •R¤Ü©i®YHÜ{÷ž=1<>,EÊ-'ÇN.ptw)Rî¦,p2#EÊŠÄ]ЉÄ]ЉÄ]ŠÉãÞÙ×ÙÜÑ\ßR¯HCkCkWkW×̱PÙÒÙBƒ7òöÇÒÒÑÂÌ:–ƶƪúÊŠ:Í=!•uµMµí=íú‹;‰Ì{GwGgoç= =í]í55  ó&|0†£Œ¥g¡í¼=ÁԺ溺–:ïeh5Õ9EYÅ…eUÅeU%ú/¥•Åù¥¹ÅEó¿¸7µ75¶6^¼|ñ§ÿôïŸÿ}OÈ?þ815QU_ÕÑÓ¡=–¶®¶š†š³çÏþøÓ näíŽå§Ï]8W×TÇ~¥=–öîöœÂ¬¶î¦ÑÉÃC§úô\NNôžî),Ï«i¨ÖSÜ -Ý}ÝLúO÷Tùîûïªêªà[{,JJÖ\3,´uwV~øñ‡æöfâŽöX ?-'e|j¤©§22×#0Í6 U¯%8á¨> Ϭ¬Ó”U•Îüï’¾àÞÓßäÿ8wùá‡ï.MUsiÃyšÝÍòÃ?€»ND¸Ï?=,Lú>÷–´œä‰¯Æ’J‚ÒÊÃ«Ú «;ŠõWÚ‹‹ÒƒÓúG:ª*J«Jô÷~æ*ß_½Ð=X½z¸ùÀ·×ÎÎÓî?/ßÿðýwß}w›-çÂýÇçŒ ž ÷SgF£ò< ëÓj:Jô\ > Õ¦çdkU½F¯qïîïV8ƒ´Ùäúõ+“A“½Ã-{Î*üîûë3Û\ûöÚÈèHGgÇÀàÀ…‹æR5«ŒŽŽž¿pþì¹³ã§Æ/]¾ÔÔÜt›+ë*gÅ×½eßá‘á‹—.êÔ\¾rùŽ,ÿ½ƒ[ÚgÇ}üÌ™La}*0Í*­…¹šÔüÊôJÂ{qU{QaMfNyЦ9_»õy•i Ùñ™áˆÆ©qå¿nöŸ—ðOµéjÑ{Üûº¬¿¿>‹|wýÊ¥ã'ê7}}¾ðÒDÂP£Ñµk©ÔnsíúµrM¹§§§ƒ£ƒ“³SXx$)mæ’›š…¸¸¸T×T÷ôöTVU:xè gïòkÃæÂ×},ZbckÓÜÒ¬]SPX0>1®mØëÎór®ÑÍoù ÁàÙr÷–TpŸŽÌñ(¬K­j+šUÝÁÕÆÝ×95?®ªµ0»4ÙËßÕÁÕ6½ ^»Yrn´™õá=‡vܱÏxwjA,×oYYœ0—æß ~)Ö]'šïÜ™ôo¿ûV[®]ÿæê•SSÃÉÇk×Mv_¿˜|ýRáHóvˆ?7Qöõ×g¿½~M´likq÷pïîé&®Ã«¯øž>sÚÞÁ>"2ÂÏÏïÂ¥ mm.®.AƒÇ¿ùö¤¡©ÁÕÕÕËÛkûŽí€ÞÐØ–ž†©¯¼òÊÞ}{»º»öîÝëìâŒ'|{ý[óYqg8¸îÌÆ:bieÙØÔ¨]}bèÄ××¾Æ[;ÛØøØ©3S8Þ‰“'‘‡§Gk{+g‡G‡íìíüüýöØ{Œœ¿xž¾ØìæîÖ?Ъ3gÏPÃðË4e—¯^¾¥1<;îÙÉc§OFf»Ô¦@ç¬RX•áéïèèàåïêëéç’U’¤¶)¨J7±<èêÊAau†½»å1{SMsÞš+Ó‹â5My‘IûŒwíØ³9"1 ¢%?½0n÷þmë7¯¶u± KekARNäþ#»Í÷%fGÐ`c ü’­ºŽ7UÖ•ë=îß)AúùöÚ¹Sšãµë«ßêß{eÒýÛsÞß_Žÿæl왓ªO6ºt®çÚ·ßÐ8.>.'7çÊ×W8†ã³çÏÂ=,Z´(+; XÉs223ÈRªjª2³2'OO?q<88¯ˆŠŠzã7**+òòó¼}¼ApË–-`GR´iÓ¦Ò²ÒôŒôظXìù•yxÚõ9q×Ëlbii‰ƒéÔ´w¶cmdTd}C}LL Î?ÇЪ««1Œ!à«4xûí·qãöŽvpÇEûû7oÞÌRRS“¿þæköºÂ¢B0üÖÖÖ[ƒÁsá>:9‘í–_“\Ñš?«hZòÒ ã}ƒ=â£üƒ¼‚Ãý½ü\“r¢ Ym“’}ÐtO~eªxYRŸ­·ä¯Ù¸"­0.:%ØÊÉ,6=Ä'ÔEiV•fíttÛîá þ¦V£Sƒiìægžèïçâk›]–4»1-ù¾ÉVƒúŽ{W_— U%ŒµÛõ¿4Ú²èÌàÆóÃÛ.Ÿ2¾zÚúʤíùóáÆÏ»‹þ59”ôõ7—hL„.+/c™µ5á•*¹©™)1 0ÀÄÔ„HõñŠmÛ·i*5¹y¹à>p|`Ïž=W¿¹J^AVãêæŠ‡à<Úš…à³ãÞT‡'Ìl¯#Ç,Õ7ÖëÔ`) ¸’ñ^Ì89rƒ‰îXkem•“—ÓÕÓµqãÆÑñQÆ•œ’Œ+2Òýû÷c|m]íÅËIälmmÙîèB¼ º¥1<îI#“'³]óªÁzNi΋H õ-)ÏöŒô*kÊÕn›jtp{iC¶vdõ†©1¶®NÞ6e9Õé;önÎ,Iðv^¹n¹›EbNDySnBvø†mkŒ-ö›Xؼs=ÜÏe†O’eû`}E]™^ãÞÙÛÉâ±ÀÚrñâÄäÉÌÁºM}å¯Ot­:{bÝùá=ãëú5ﵘœ¯¸|åœhI¨ƒVšãKW.±¡ðÈjÈRxIeIY ¸gçfçæçöNMž*,.ôõó¥ û¾ñc6ýìœlO/Ͼ>£=FÐFGr¤à`h#À þ´窱÷o®}£Óx¦XXX@§NMKkKVN–Š;ÒÛß‹=i jIDAT,Ï/È<1ØÑÕÜ¢ARrRtl4£hln$O311a+øêÜW$6I)ItÉ+È#ÆßÒ njkš÷“§Ã2]rªâËšrf•ÒÆìô¢8¿Ï¤ÔØpÿðO_'rêÕ6 Yá¤"y•)âevyRdrô¯Þðer~”µóQW?;ÚÕfP“’]PæàpÀÔhëî ñYáÉk6­¤Æ#ÈÑ+Ø9«,q.c|µö×VÔê9î=W®^Q"“Ž\:îÜðø`BOéK]žêø´§ìýÓ£åçÏ_¼|AmVU]¥äî½ÝS_Mñ—-žÈwâ7 š[›£b¢ˆˆ¤1=}=4««¯ej lÅŠøIùqoŸ‚ €†8JàLIK¡G[0¸¢¶b&îµMµW¿¾:ËX~-GÍ’JéÔˆt+19qrj’}󆆇ÏŒ“úúûØsØÈÚEî.¢¢£TSãâæ%CÃWIêèÈþpKc ~.܇ÆûC2œ²*cK²f•M’W€Kt|„ˆW@¤§‡¯aÞÝÇ1­ð—.¥qÍŒ|Ã]s+“³ËÚ:æp¤¨.cÕú/’r#ü#Ý]ýíòªRR ¢ ê)ùQ™¥ñ‰¹lܶÆÅ×&1'ÜÂÞ˜JÚPÏß9ŒÉôJ4oé­ÖÔ–ê5î=¯\ü!(Ök×­{ïX¾êsœ!§"ÉÉÛúàÑ=ÌŒö›ìJÊ‹˜Ã˜t¯„£M=•šš½Æ½½»ýÜ¥sgΟ™]ÎLë*x²«ø_§Æ›fm369+Å5õ5'ÇNRÓw¼/'?g`hàøðñ©sS—•õöò’'FN”W–#šj Ѿµ³¼ê›ëéÈYZ–æäÒwæ/\¾0+î55œšs,Órêô)L W… 547 c©gáoâ̇LJ5UjÚºÚNŸ==rj¤¶¡Vèéèᶇʞþžü¢ü¼Â<¢èŸ:…×ñ’9Jæ ž÷¬ÄÁ‘î 4û´²È‚ÚÔY%·2 Ä• [ÌËü‚tT\fh¶&Q4  “ò#‚b=¼­œ}­Ã’|“ó#3ËâC}²5 ´IÈ óuör£eA¢3"Åß=О.ÙŠêý"Ý|œãsÂP8—1ñfõ]šòšb}Çý«ó_M~59—œšè­=x¼#`°çnöKû©S6v67mDöîß;4:t;½îHŠšͬ¸sjþ¾À½qóFažeGú½-¼}9{ñlCkì¸÷w¦Ú¥–†Cóo“̲¸õ[W}¾üS±p0þÍ:ç÷8Ӻβ²jýƸEB£sËøèXçØÄà¼m~%DAñ,úÈøÈøéñÛïx›‚ÎŽ{C §æïË^¤óÀüèÄèïnáí ¾¡evÜ{‡:ÈÝ£s½³+rª‹T&f–ÇÍ”lMüoT8ÇUÒJ#ÜcMk;J˪‹ô÷–Ž&%¿‡„ 8+îÕõÕœZpóîl,g&Y…™Ÿˆ÷®Á–œŠï„c®1G\£õZÜbLbòüê;+J* õ÷‘MmMµMµäÊcc„½{B¸Ó%×'w×yŒ€mª²®rðä -¸‘·;–‰Q ®ª×ý¸fV~zuSy]‡¦ªµ¸¢¥ ¢%_Ÿ¥²¥°¶£¼¶M“W’]ÝP5r ‰{GoGuc5·VÜ)‚Ë=!-í-`M¾;ói¦º–ºê†jö«7òvÇÒÑ‚ÁD§™xYU_™U^?•÷„Wäçg–´÷´é)îHgogc[#3~¯ˆ’€u¶Ìõ¬*YÁ‚[xG‚Á³>«Je}K}yµò_›{BÈaˆëó³¾ð¸KÑk¸—¾ÂövF$q—b@"q—b@"q—b@"q—b@"q—b@"q—b@"q—b@"q—b@ò‡ãŽ^´¿)‹,zS$î²PùÝp?þüàà`}}}nnntt´‡‡‡¹¹ùŽ;¾E½) –À ¢€ ®@ ºwŒûÅ‹‡‡‡ÛÚÚÊÊÊÒÒÒÂÂÂÜÜÜP½[Yô¦$X'ˆ*¸-èÞ1î—/_gkÀcŠŠŠØ)PŠYÉ"‹Þ€KàQ@W Ý;ÆýêÕ«SSS'Nœèè訩©AÄ–á/‹,zS,D\tï÷k×®‘á+$C(ÂuØ,HRd‘Eo @‚%p‚( ‚+Ђîã~ýúu6nrQÓ°M¡·BYô¦$X'ˆ*¸-èÞ1îßÿ=^BgÜ… ]Üà@=²È¢7 Á8APÁhA÷Žqÿ駟膣ПdEÜð¢ñ+YdÑ›` œ ¨à ´ {ǸË"Ëw‘¸Ëb@Eâ.‹‰»,T$î²P‘¸Ëb@Eâ.‹‰»,T$î²P‘¸Ëb@Eâ.‹‰»,Tþ?\žqÕQ|}IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/pattern-properties.png0000644042355400116100000001575611675570700021752 00000000000000‰PNG  IHDRȇÜ4pµIDATxœíiP[çÕÇÛoýÐöS÷™Ì´i§3ïÛN:™4M§é›¦I“&q›qÓ4ÁxÃ[ŒÁl^ØÁfcƒÙ÷}!6IhAû¾/HHˆlc Æ61äý‹ë¨ÄàQƒtÿÃó-$õLôúª-Ä-`€À€„‹ÔE‚EÊ-"Á"åy8X:³N7@Ê=2ë¼,œŸW~5!#2>#‚Ôö {5§ôŠH.0YMÞ–Ƥ¹R“\XŸ^ÔAj{…½%4«0Åb·xXj£:8úãzÅý÷<\$µ½ºÿp±‡ÛsÒ:lõ:°#ŽQÙu++Ë\Uw#£À%é¬ÒÍl¼7SÜq6ê¸mÄ[ÁZ^YΨ?÷烱ÿw æO_.øžÍÌb÷L‡ç ÖòµúÈ´ªƒ±¯n¬”гÇß"ÁúJÛ`áØUoÖëLŽƒØµ„¾àóù_¢A¼åìXEíIbóHÂëà:÷çÕ°ôêã—±¯ŽThðÕ½¡Y¶²KÝ3žc;,©JêÚ?þr¼ßQ¿'OtѺ@Is{sHXÈ‘cGð—Æ¤9}ð7;7;:.Î¥•ŽK'äùµÜkÁùEùR¥t=X+++¶qãÌÜ ‰ž•40co#¿‹_›\qöHÂ_@°Ã[4qSB±vCÔ­;Ó*³pìÆ{¦Ãsl§ƒ%’‹ÞøëI©IL.3ójfL|ŒJ§ÊÈÊhjmêí댎¼œt>o¿óvAIA^aø[Y[yèð! ØØÚˆ6‹Çª®¯®©¯Ù0bUtfÊMÜÓ©ÿ@Ž»R{>¾ødxö¾¬º‹y‡ýSÞU˜x‰eg’+‚J()pd‘y~Ü*÷L‡çØ.ëƒ?èô£ÝBi‰ˆŠ@C¥WQ{¨!êbäEøøøú nñļ|>’($è9pè€Ö¤ygÏ_<z.ôlèYgB\ VAëeà‚d÷qÒßX2J· ®ƒ[I7·'¿üf¿áêJí…ã‰oŠ{U ¡_ùYc}¥í°t âKmPgegEÆDVÔT$§%` *gOphpqyqµ­½³Î¢o±–XÏX'“ßá(:Ëb OÄLß‹ºêlæ¿®7ÇõëË;3àó, ÖWØnk•'XˆL'OŸìaô >! 9Árò´¬Ü‚ܦ¶&°Èæ³lÆÓÀi'ÿ†LWFM¿¶ïè¥7ÎeûžIß‹j="÷p@Ú? ¥¶_ük\e×ùìýmì2·Ì†ÙNK,£'ÀjíhŠBL¿’„h„úl9}Ö78|Î¥¤Kç.œ ¿^ÛP»!X×›b»õ4qóÅ뇢 Ž*¯Ç}çsöƒ°ÒŽT„+ 62ò±ji×û¤mƒcz÷L‡çØNKgÒõõ÷m…VÁqÑ©dˆXP¿°=NŸõ U\!·³·“ÙÏÔ5‚•Ys.(ãŸÑùG?NzÛ/á/a×|Pže¾Š ©àòžL~/O¥ìÁ»LY»{¦Ãsl§ƒå&=qæÝyþs“ ²xÿJóv°VVVTfaŸ´Õ%ÙÆî™Ï1ï+$Æ¿±»dnavþÞRÛ«» ³TVmX¬¿×]Ý ÐæW\‹H>“V™VEj›U™XX™mò²ë± «gYÛº›Êë ËëHm·ê [»4&µ×]Aj4B¶³ÍLʾ%v²wEH7 CN$å9®(±èŸ¶ç=,l³P.¬l¨Ì)ÌÉ.Ì&µ½Â^­¨«(%^— 5&My]9¥‹¢7è &©íö*I«i¬´zXj£:+7kÐ6¸²²²™Í ÍU»sçN^IžmÄæu`]¹~eÈN^¯ç.[XXÈ+ö8°ˆËlH°ž¡íP°Ôu]cÝ–Á*)/‘©ehÔ7×+´ŠÍ€õèÑ#Fsÿþ}âåÒÒVµ¯¯O§Ó=|øp÷¸—ØkíeX?*½Ê„ÀœÆ¨Qê”óf §Þ…9LcÑÐ8rô‹ËÂ[k׃µ¼¼¬P(nܸ—(¼°žÅÅÅmmmåååjµzÛ÷»ÇÛNKª’f^Ë<t&'/z³í¨Ø¨£Çúî÷Í-ÌED!INOFRjÒÉS' Š ^yå•>ü · ƒ$¦$ùp8? ¬©©)06==ýÙêÓËÊÊ”Jå§Ÿ~z÷îÝ{÷îmû~÷xÛÙ`™tµµÈ‰| ßq[DM%Póñõ9r–Ãç4Sštø”$§%wѺBÂBÞÛûžJ§:äwˆÎ¢#°íÛ¿/"*B ´PZΟ­'ÀB²»}û6Ö‡ 0%$$p¹\‡c·Û7ù[ ¤­µ R[øùpPrâä‰c'Ž!&¡ç°ßáÖŽÖµ>Á¡Á Ê°z‰©Ï>ô9vä!˜ùñëaô<‘[7¬±þÖÜÜÜéÓ§«««étzKK‹ÕjÝÞî ¶ÓÁ ;† Å`3WÄ+(›Ø<öðõ2{ÑCí¡îóÝ·,8£á*XˆXIII“““(áÅbq{;y½¨Ë¶ÓÁ**-ªi¨Qj•ˆIíÔvA@󟲢’Š‘L›»÷Ÿ{у×MïvïǶŽ )ÊÄÄÄ;wP{am·w§{ƒíP°Ä ññÇÁOÄ»œt9ðl ÂRK{ ‚ÿiÿ~aÿZ¾˜)é ¯sÎ}èó!ÀJËL[€r½ó—€•ššJlÚ###UUUiiiXϱ±±íÝéÞ`;,.¾aõn0Áâ±ðu:zP‰§œ>€¹²¯¿e~PHúå9Ò%\ïü4°>[} ý£Gˆ6 v”óȆ³³³äûlÁv(X.)· ‡~I)I"/Ô5mê´*yæÝÝæ `ÉT²JKeMegoçWþg Ö×có ó»¬-HcÔ\+¸¦7’÷ºË¦¦§ Ê ¼ñfж®¶ÚÆÚ>v“Ã$µ½Â^mlmì¤uzã͎ù˜+ä’r‡Dr‘7^óNl³Éj°r‡°o½,ÃêeïHˆ“†”;„}ë¥7SHÕÒVO{O{[O©-¨—ÝËrž&ž„‡#ôÛ€w…mU,K®•+´ R[WÌEÊ›ÛPH‚•ÄëŽ 5F b¨zV+àÊ…ƒöÁ‘ñû˜}½À†F‡6\Ö“ÁB0ßðªeR›¸± Y†Ç‡AmĦÐ)2ÅnÁK,¬­ ܘ‡Ì`ùN¦–u1º:h(­Ì638Ý•`5·73û™[^|=XŽgÿI¸›ü!R,›è¨ ê>~ŽMƒ&¶€-RˆÖÈÄÈŽ óuuÎ7q¿ zDr‘P&$žøH<Üöq¿L$UI‰Gm;.WJУҫœ£Á=kùXXŠ#æT6U*uÊg>a»EàÅ;O&« q BÑbD)rÇ•[[ZQJ‡9¬”V–†ó?í_QS,’R“jkѨ¨® ºyƤ„±¨Ø¨°Œn€WÜ¥8ß¾X°¬²ìi`¡>`ðuíu$X[ %üz í<°:º;BÏ… ¤€’˜’t*k*³s³±:{;#¢#ÄrqL| :™\frZ2GÀi¡´P{¨ˆ^…%…f‰ ¦¾¦­£M¬ÿû÷QÛºéÝåUåóÆ`áƒÐÓDm"Ár ,Ä*'”ðO`¡öBzÙY`i šóϕЈz€¦úÌiô`Á¸„8çu¡HˆØpÿ!¿CˆRYÙYj½úròå‡`ÐöŸØ¨x'Ár,ü° 8Rá:!’í8° †æ†ý?NHLȼš‰8t5çjMC –ßQ¿~A?XbjâZ°‚‚ƒ ÁDpƒÎ¦¶¦ˆ¨ˆè¸hçOž`m XØŸOûß@-L°ãÀBÁ~òÔI_Ä$¼lïl/,-Ä7ùÀñ%|,víúµ~a?ñ*ªœ¼8#Ö6Ô"àJ”V@ /÷íßçDk[ÀÂþD©ŽÉ«ÄÄo÷É42¢„¸ÁÂZ¢Z?wñœ\ã89ŽùFE\]W ,ÚêšêЀÛéÀÓ(¼l¶‡Î¢_ˆ¸@üÊ2&ŠËŠOœrdÆœ¬/XèQêI°\ ¹VÞËîåIx(‚{X=` æ!óNË@<ŽA§r¾Dì‘©dàŒØçÓ€¾1J­Òyº¸ ý9O7À R¥ôKN7<ö Ob¹ö-v8±‡©4jkw«T-%~µÔlÛ©`¹Uä™÷ÿ^ »ßsüu|½52à¥pp™¬&,R[‘,ƒ `AZãÚ80H½,“¦ƒÖ2ó™OÏîÀrü‰Ù€(õ„?ËmÒ!byÝ]::³Ž/åw3»i©­ u: v±RŒcðõ"þóÍb÷¾›)ˆ‹²ÑÀ3©-;ÐqžÝ¾‘>?ïu×¼×ù÷Sr‹½õf RÏP$X¤Ü",Rn )·ˆ‹”[D‚EÊ-"Á"åyXz³~wÉ“6Ç3Á†9FÊgÑÙ4:»w7ˆÖÇí+ÄÞ…¦1j$J _ÂçIx»BXU™J¶á¶ìn°dji'½£_ÄVh¤ ­lWH$`ùÞ_w­Q‹©RéTöûÈØÈ®ÐÐðT)u\hÒ=15»,L ƒCãKú‡ÆÍcÓCc7ì»B#“VµQA¥QÖ^–ÉÕrh~a~yey峕] ••ååå™ÙT°ö‚MO Ó£5©G¦¬öIË.Ò蔽¹£ÑyË.!äG½IÿhùÑò®²O}*BÖ<ùð•] –n@×ÑKÑh†'‡&Ì[–yÄÔÆ¥×Ò“«h‰•´« ½Íðß ø•›nîhX–aÀðè)¶tÿ¾©¡îïßsìXÏÑ£'<ü¦N÷éÒÒÓùÚÌ3ÁÒ ¨íÛø€«²Ž™ Czý^eÖ^md^m\m–\i–]í’›´[póZXƒ…°Î–,,ª«Y{öX:zÔ!??ÕßÿÎ>xð¦A¿ôéÒúe¾>óÔˆ°læÁ1£«R[´ùm}M,žÔ¨ºÖÈJ¯D•òâªÄW:eF5ᣵ(š;ê Ëòê[«Å*¾eÔ€Î^v§PÁ%Ì#z¶!Vó]úè‘©¡ ÁÒ8(y¸ôp­æ ÕUœwßµïß?øÚk¦—^rèå—‡ß}WûöÛÌ}>ÓzÓyáÞ‚R¥ì v°Ø¬ñ‰ñ'†Ú²<|ÀãófïÌ® +ì™`iM*Û¸ S¾y‰^•߯ ¿Þs­‘Ñ#%VТKØÁ¹¬¤Zqhv—̨‚›Ú$KJ¿”q5¥¤² ¿ä:O²Œèãcj+ã 뺔¼âl±Š·ùO5ŒLÚ6ˤ'fÑ©ûïk++Ø{öØ}}­>>11Æ×_7þö·–ƒ‡.^´¿÷žæ­·˜Ü´ ÀyaqÒA¹~ýzEeE~A~jZêÔôúï/Îݛſù¹E¼zx» wÑsçîô8>裓p >zþÞ<Þ©ðGg`P Ž×®!¬°Ç‚e5bŽ7)ƒMK‹ÓjYY-Šân]|9'¾ŒS̸TÎÎk“u#)U,™A ÏŠÚ’+ÙiR5߈Ã8›º½« /ÕFiÜåèê†rÓ¦“ÞVPrTmþÓ! 9:rÄò§? øû[úû-¥¥ƒáá“"ÑdG‡éwßx£ï÷¿7wuÂY,gçdÙ‡îÎß½qóF}C=§Ÿ>˜lftttÀ™€‹UjÕôÍéÓ§Ó3Ó¥2é½û÷ FCbRb|B¼@(F7nݨª®ŠŒŠlhl˜œž„À²Ùmk×VX(z X£rpÄ00¬ÝŒ 6M3‹w©‚•X¯Ìé4—1ëû­í+]6$Ð[Ço†¦Rª˜R½Üœ ëeQì—•i…áBDJ.Àª¨+¡ô´$$ÇrÅ}N‡ÍË>¾1X:“Î`,:uAèý÷G3¾ø¢ñ•WÌ11£:Ý”Ý>-š}}Õ/¾høã™¿û‰Òçºú:*•ŠPäXöþâüÂ<„üÕØÔ(WÊ­6+°ËÉÉ™˜šØ³gOyEùèØ(¸É¼’9s{¦°¨P¡RH¤’ήND>dR6‡ .K£Ó@'´ ÙÖ®!¬°g‚¥6*ŒCêÍHeVÆ–vE” ’šPZ«á*E_Üc¨g™ºEfãдÔ8’QË”ä›* ȟƦ:—UŧÎ|Ì“2c.E^JŽËºž“ÙAkç&?Ý©¡qKe#°Œ:LæÕ©ù…»”÷ÿù¬—^²œ<9e6߯^æpôo¾©øÍo´/½Ô÷ë_ÛÛà\PTÐÝÓ /{ožhßš¹ÅðË+ËÏžIIM›;ìwxxto DdLĤóÎÃ͹ ¢WÐÙ  /„Ÿ GÜBNIJƒ¶ÁµëF+ì™`© rL•ު،´ƒŠ!?©ŠS)ޝ×%5é3[µ¹TmM×Ì1p”¶Zº¢ˆÂT˜dºAy\btQy®nðñ²}üžs‘¡;:>"übOÆU É1\iŸnsŸþ¹”¶1ó†`iZL*Që<ÖÜö½{G4¾ð€τ@0Éb——/Øl7êêd/¼ ùþ÷?ý©¾µÎM-MNŸÜþmÔOˆ@ÐÍOn8„%$IJò²ä”䑱‘Ÿ¸}ç6ÜP’£¨EDF,âCQ\|½®ÕkuxÂhȤf‹ù ë¶*°%”z$Xz™ÁªÔZd›”Ú,eJùY ô˜ ~Jƒ<º˜‘\MO¯edÖ÷å¶0+º™¹@c–j,ÒfjmLBC•ë…"§¤*?¯$[¦DÅ_Dê z®ä¤*¢Í¯d1m –AK0áÔíÙª¯¯þ¯oX~õ+Óž=Ãyyº·ÞRüâ¶‘Œ ásÏ)~øÃ®çžÓ¶¶ÀY­Q# •ÑñQ‰LÅòQHhR¡ÉlŠ‹E(²ÛøÃ"ýÜþ¤ä$D,¤B8L,23;@ÖÔ)¥Z‰Ò Î(ËŒƵëF™W x XJS¥o^J“˜§âQè'ÓZ’+Úi&SÂfË8\%W¢*?w“µ-Ñ !§/Æ„”åðåLôÇ%F•×>%;9ãRC{µK+`64Qê׃¥1hnÏݾ5{ë?º}ËHï¡ý}á0<÷œü?|ó›\è[ßâ}ï{Šýˆÿüó=¾û† Z8ß¼}“Τ§¤¥ …Å%ÄÕÔÕLÝšš¸1Q^Uvîü¹Ð°ÐÔôT«Ýмvã“X¤ŸßŸž‘Ž6‡Ç‰Ž‰‹”N Æ1YLW¯]Å8`‘ÉaÂ!84Ø0`øÂº­ áÍ3ÁRè$j³Dnl^-—¯`ÒxÝYÕõ¹uõÔ¾Ö…ÁïäHh[ªçÁ‡)ìnî¬m T—Ôäç–\-¬¸^ÓRŽj_˪Ë9OÁÄh›ÿt…Qh¶ë7K­W2ûÉô'Ók5usÒ@ëîyëMíË/kòÙw¿+þÎw„ßþ¶âÇ?æþâç]}hS+¦oM ó„<6ÝÑÕÑØÒØNmè±Øð–F¯Ì634‰ÍbðÑÉQ‹Í‚Æøô8â%ŽƦÆzk ž*­ ž@=F³‘h ¬›371ñOhbz\ÓÕA}ëMæÿþû—¿dýüçÌŸý¬ûùç{µj•˜oø(µÊ¨˜¨ˆ¨ˆµŠŒŽÉDëÜFá›à™`É4"™\’HêX|eOÎàʲ¡ÿ×%|øbÏKoÖwÒ©"O¬í¨™»EÀWm’­¿ºA¢”ÈÕrL2×.r(OÄ[ÿTŸÝ ›ÏêÔ\ ápoWÇ• nOw_×^O«°ŒO#»íMO ^¢,㊸Hâž–aõ“t6ÒÛFéiÝEêbP%*ÉúÌ.Rˆ0IÄs{w…P]õ‹ú¿íà9`VŸì-SI7|ÎÎÎRžJ¯Úð6°…·J–]!âF6Ü–]©),Rn )·ˆ‹”[D‚EÊ-r;X£¿NšW in±mkffÆb±ˆÅâ®®®ªªª¬¬¬èèèS§N}DšW¦À$ð$.ƒ5;;k·ÛU*‹Åjmm---ÍÌÌÄÐgHóJÃÔ`€À€Äe°æææÆÆÆîÀ&NGôà6ž4¯4L=€H àH\k~~~zzÚjµj4@€á€*Â`i^i˜z À¸ Öââ"2(¨D*Å@€ɵ™4¯4L=€H àH\ëÁƒt(û1ðDèCZŸý¤y¥aê0 @`@â2XKKKà L=Œ…b ¨HóJÃÔ`€À€Äe°–——±ÄòH¥‡ñ&i^i˜z À¸ i¤m—‘`‘æ#Á"Í-F‚Eš[Œ‹4· in1,ÒÜb$X¤¹ÅH°Hs‹‘`‘æ#Á"Í-F‚Eš[ìÿÒÚ$ ™„²ÿIEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/recording-progress.png0000644042355400116100000000563011675570700021707 00000000000000‰PNG  IHDRœlHL _IDATxœíØkL”Wð6ñc›&µ_Ú/Õ¦mÒÝ4­Q›ºÙmzÕ¶[»»M ‚(r-‹Ö*mEAë­‚0Ž(·a˜ûíûf`æÎÌÀ00 "#B-’âšcbvÿ8 µ[3Ññìyò™Î{xy~çœyãcÿ¢E\=ö°o€Öƒ/ŠJ`QTë7¨·oß¾uëÖÍ›7oܸqýúõk×®ÍÎÎÎÌÌLÓJz¡íh> €@ £â2\‰0ãÔÔÔÄÄD,¤•ôBÛÑ|@ €FÅrÀÅX&˜kttSƒA·Ûm£•ôBÛÑ|@ €FÅZÀ¢ÀX&ýýý˜×jµêt:­¤ÚŽæƒà h”0*Žolv, Läp8Ìf³B¡hmm=G+é…¶£ù 8€%ŒŠ Ž-‚é°^8Nuuu­¤ÚŽæƒà h”0*·ð匣Ë“â!‰&¹)¾SeeeUUU 8€%ŒŠSÇ7Ötl,–‡þþ&íNÀ€P@ „Qñˆ…mŽG/ìzë8ú_ø˜÷ï\±_Ap4¢¨d(*¡¨†¢ŠJ`(*¡¨†¢ŠJ`(*¡¨†¢ŠJ`(*¡¨†¢ŠJ`(*¡¨†¢ŠJ`(*¡¨&Ù¨áhØÛçõ<4$Þ -}ȨÁp°IÐÄpšEÍ\—æ>ƒfµYØ,ÕHzcdhî3\1wI b}ATmRkÌšûL‹¸e© * Jܶ]KsŸáIx•´PTCQ E%0•ÀPTCQ E%0•À,ÔfQ³L+cŒŒÚ¤¦¹Ï,‰ÿ&ìê«ÄB¥æÍìì{Ȩ4IE%0•ÀPTCQ E%0•ÀPÔß$ ?B¡¨÷H(rõº¬vKGwû#‹Ýâô:ú‡ú)êˆ t9:uí§Ïî ¸¼K>¸I§¯Ç`ÑY{,XŽuøC~IŽöÅ~ˆÄú–x¢ã!Üjdt@kV÷öù(êñõù½|rzÜæ×sÔ§˜ãõK8¸½FÕI«O39} kÑíwSÔQ½Jü§éqž®Zc8ú;œ!Ë|}ífA­0o3?ãó¶;æ¦›ÚØøüîaI nÏà”bñM\iL E] uòê%쀃®Í§'h6¶Ô0]?¸yóXnî\²³SRTÞ5r«ñÓ»'-]~}âèå©‹#E]uâê¥æD»‡éékÇѶ3lJûøãá7Þˆ¬Y3¼víØúõC7*׿cä³í}æøàî I¢k­åVŸç±ÔIwÐR|ø®QX‹‘ÝS“ vßÝßW|óí¡½Å{¾Tš…s“L]>C§WßåÓc >Á[[ïÜ'Hü“øä—·A³ÍoÄxü»-7C¦o›¿+¤Ó§;/ÿáÒ• õ¨—kP7»èr<â’¼`JÊØ‡FRRFŒÆ¹|¤°pB§›r:GÒÓ£o¿í~÷ÉÞ©0ò÷~ÿ•€áXÜšv§ú$ëȬ#PáIë wïÈØ¶);k“àl§W—•·e_Ù´Í™©u~wi‘Üȯ¬=–³##Ë×(`s%çO°ãް–ÝTÉ´ qá™ÆSø$3w³DÛ2WˆÅ«>7‡¥¨÷@ýtO§¬«W pÛ/¨«VESR&=ž™éé™Ph8==ðúë×^ó­]+,ÎÁH0”Ú¡ø…½:«oîu»K­#§ÊrvffdmÂÛϾø›HÝŒ Uœmyf'ƒM¬³ýúK¿9P‚ ï¬ü-Ù;¶¶»Ô[sÒÅîü€¹i=ªZÙá‹“Ãu1T…N66Å•®G xø™áÔT<E>øà²J5Lòxÿšíê ¾õ–cùrÏK/ в0[­ôÐ×»¯-^XËm²±qU—íÙQÓpòxMÅ–ì4“CùEÚ?´6éÜäL#¶ ±Go}·ì—_êÕ~µ¯›¸EVǓ׉´\ìx  Õœù»BÌ.ÅYiù…ËC*ŠºªVzq"rNvXkvxTñöä9ßúËèš5ƒëÖÅØìÈÖ­½+WF33¯45y^}ÕóôÓ¶çŸçïÊÆH¹¹íëïŠY?ª,B‘¶yç®ÜªóG¶Z]KanÛûý®ÍÛR =òÏÚ%Á%­ŠúÌÜtŒ9ðÃ>ºIjàÕóYfSuî(«ñ¤®[Êg8¢³f7ƒÕÀW5ÎßbtÊØ’C#ãa•AAQC½0>X+­PÛøf—2¤Vò÷ þ?½9üâ‹þçžs.[füqÛ²e=Ï>ëY¾Ü»r…hÝj†[‰‘&—²QÈ.Ù_˜_”½£8çÛŠ¯ÕVÀŽ>ˆÚìü-[sÒ@µiËçêN.*>49¸ðË’¼í…YGO4:ä2#o_YÉö¢,Ì]£S±m{FÓ0Wˆ¾GrF|p8¢¨÷@^`KÊ™ÎVt6ƒC¦–}úgÍêðнO=åyòI×OxŸyÆùÂJÁŸßPò* =R]·¤IÄ®ã×T×?Á*ÿñìá³ÜÊKjlÑt‰„š&¾ªAfâI \L(Ö5ë{d˜\Û-Æ'x¡³K„Ú& Ã` @äf13c†i8¶[Ä• ƒœ¢þWT¹V ±Å‡Ö}ôר%Œ%øä=Ëÿ`å•î—_¶½ðBûŠ‚wÖ)ZNéíbŒ‘›[ó‹²²ò3þ#¬¦“¿™êÁÇIð@x4Àè)ê"¨ÉàžzÅñfõiÆÚÊt¶Ý©°šwä«–ƒEñð*vIø•¿–¬´ò´¬Zé‘Ð…^ŠºªÇoÔ‡}‰fU¶•V¶í_Â)e‹Ë56a0âª'@QJp ¨5©­N³Èv"K=¸Iÿ«ËÝ¡1©ü!?E] ÃNŸ ÂÃä#µ‰éñÚqóuá„£á@(€£ _QDp«Ø£¿¥¨d†¢ŠJ`(*¡¨æŽŠy1ûû´’^•Àz`¨333###n·[§Óµ¶¶VWW—••¤ÑJz¡íh> €@ £ÎÎÎÆb±`0hµZ ‡Ã©ªªÂÔÅ´’^h;š@€( P¨׮]›˜˜À6Ǻ0›ÍØõ˜‹¥‚VÒ mGóAp4JõúõëSSS£££ýýý‡Óa™`ûŸ£•ôBÛÑ|@ €F½qãNm¬ߘ ºŒVÒ mGóAp4JõæÍ›ØàxÄÂXØò8Ê1¯VÒ mGóAp4JõÖ­[X ¸‹›sáËËdVÒ mGóAp4JõöíÛ¸ Ë×ãøÆDxÜŒӴ’^h;š@€( P¨´È(ŠJ`QT‹¢X•À¢¨E%°(*EQ ,ŠJ`QT‹¢Xÿ»E6L@IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/figures/settings-pc.png0000644042355400116100000006336611675570700020343 00000000000000‰PNG  IHDRÓ±‰5¦ IDATxœì½wP›ižï»§¶ÎgjëÜ:ܺU÷Ö©:wgwvvgîÙíé03Ý΃íî¶ÝNDã69çœsŽ DF€("@€ˆÆ8·1˜à„íîûýŽlnc‹¶Ÿ_}KõèyÏï ü>oÐûþÝÔ¨Q£F5j¯ÊþÎÒ F5jÔ¨½AFɃ5jÔ¨Q£öꌒ5jÔ¨Q£FíÕÙOÈãáÇKKKwïÞ½}ûöÂÂÂÜÜÜììì7¾§F5jÔ¨Q{l`8´f9€@ÏMh†ö„ˆSSS/^œœœ3R£F5jÔ¨=6°œZ3€À ˆç&0 ƒeëÌ™3ÝÛÛ«V«;¨Q£F5jÔØ„N-€@àPÄs“€ä‚`ƒÁ€¸R©´¾¾¾’5jÔ¨Q£Fí± @àИä~E<7y,,,LMM_¨««K"‘TUU±ÙìljÔ¨Q£FµÇ6!€@ `øñÜä177l1 „Ô¥¤¤„Q£F5jÔ¨=6°œZ3€À ˆç&ÙÙÙÉÉÉÞÞ^©T –APã˜‘ŠŠŠŠŠŠŠŠèô²%%%@ `øñÜäqãÆ±±1ÀK}}=›ÍÑX|†TTTTTTTGû—ÍÑÑðN-€@àPÄs“Ç÷ßo4;::*++³³³ÃÂÂ,>C******ª£Ëø8}ú48´f9€@”<¨¨¨¨¨¨¨ÖS”<¨¨¨¨¨¨¨^,@½ƒ½==TPøh,þ¤¢¢¢¢z½õªÉ£ÏØWÂ+5ŠÄbª %Qƒ¨„_Ò?Üoñ/%Õk, °ãÁÃ?üÔþðp¥¡ŽÚ+´û÷ï ë„”<¨¨¨¨¨^ª,@ؽFžƒ3^oÝZ$—ëï7446°ËJ óñÚÐXo0ô]¿~}nîæââ"ñ§öR 8HÉƒŠŠŠŠêeË’äqíûk€ŒÜ¼.[WWÛÚÚR__'‹›š›dí²–IIIqVvf)»äúõ5 …Ú‹ØZÈcpt°ª¦ŠSÁ¸ÜŠª ©B:02€M©D(’òZÔ3Ðïäwª;ÞÍyÞ³›c´ µBT'Â8kjÔzõÏèH߯omoE¨µ7Q¨|!¿w —)XöœŠŠŠjCÉ’ä166Êf—¶·ËŠKŠcbc||||}}üÃÃós²ëêêÔju9§lüÌøKI¶ÔÌl-äa0¶nÛúë_ÿúŸÿùŸó›ßüþ÷¿ß¹k'’+ó)—S›6oê6t¯ñ›×,mþÝï~—–™öó¾¸hþÛßþöÍÁ@À£}û÷½ýÎÛèè½÷Þ³w°'=oGq‰qÀ÷víM’Ó’±2-²¦`ñ¿s***ª#‹‘ǃ”Ê.VqQBB‚¯¯¯ŸŸ_```ppphh(ZE,[||<ŸÏ/+g·wÈîß¿ÿ„dùàÁÍ›7—––Ö2Ð[·n--Û³…÷ðáÃ7n\l k<×sïÞ½5>docÚZÈßÖ­[wíÞůä—óË#¢#þòþ_ŽŸ<Þ;Ø{ÊùÔ›> äÑ3УêVui»t½:@‰¶W«Ò©˜ÃpîÔtÖ7×ÿÛ¿ýr³Z¯†gOÓËŠæL%jÔÝjÍmÍÿò/ÿò ñÐ0d0ª¬S*zïOï¹y¸¥g§ÛÙÛýá !Ä«F¯1ï5êN½A¯íÑviº°ì‚N[Þ¼es[G[ï@/ñÑõé0¥NIzÄx0Z¥V©ïד®1)°!R ñ1xÓLÍTÓ³<€>ºÃ0,þ¿€ŠŠŠêÕÈbä$]VVZPïïïæp5¢££cccãââ[VVVcc#‡SnXÝ÷øø8`Ý­e l6{``àìÙ³]]]Ïpv8::†„„`HXrr2š¬>FGGŸyƒÛÚÉÃÚÖÚ¸|PAªîÛ¿ïË_"é2ä„üÅW_lÙºÅá˜C]S]`HயwŒË ¸ðñ'çæ<ìì÷ìÝOo_o¹JdqÒ|ë¶­hÞØÒhªÔ©üüPèIJMBw„ÿâsq½˜›ûù—Ÿoß±ÝÃË£CÙa|y`­ŠJ‹0xÌÔ×ßœ·c'ŽmÛ¾ Ñ6oÞìéí¹öUTTTT¿hYŒ<“ÒÒRƒ‚‚ÂÃÃÁÈñäɹééé™Ë–››ÛÜÜœ9??¿2S>xPUUUZZš––vçÎÔ\ºtI§Ó‘­z½þÊ•+¤²¦¦¦¡¡]ôööâmOOê1¹\Îår æT®_¿ì0ý¶æ‡m@à$¼*• 499i0‘ 9‚ŒŒŒÈÓÓÓµµµ¦™™¼]ZZR*•hˆæóËÀT\\Œ®dã\<»vòØ´i2¥›§ÛaëÃo½õ–o€/öþòRüù/R89;½õÇ·€l.›bâbA¡V|óí7GE^yüñí?/>øïÿþïÁ¡ÁˆƒdOš;žr$Í‘’s rÿøÇ?ÚÚÙî?°XPQUAÈÃÇÏÇÆÖCbsØ+Fîîéþþûï?ñLGeu%èpÒñ$|¾Ýû­T.­m¬EÀ·ß~û„ã к¶²¶ª®­þð£1GÀȆø¼óÎ;N§PÓÔÖ¾yçÝw:`go‡&^¾^XÕä¨Úýõn°&…ÙEÅFaR‡¬ýæ7¿Áj`Ž˜õs]JBEEEõË•%É#5-…Åb‘C))¦2’1H"//Ì×ÂÂB‡ÓÖÖ@YMSSSp@:GÃþþ~Ôtww£†lEpÆìì¬H$’ÉdˆsðàAÔÀ§¬¬ìÞ½{²eÀcfÂò`€ã ˜››»zõjKK‹F£immÖ 2à344T^^ŽzD¾{÷®D"Á˜Åb1 ˆ3::Š¢ù™3gÀ4qqq<¯©©©¤¤„0ÓF°µ“²/²ìŸþô§>þÈÃÛƒÌ`ÈC¦åæÆ%ÄÙ±û·ß™Žjh{µØÝß»o/°£°¸ðÝ÷Þ%Ç@'N"+£ @nîéïiíh%Í­m­IsƒÑ·»vbœ…"¡ª[EÈLðÛßþvßþ}J­rÅP  ¹R¾zA¡Ayÿ/%e%½&4"s)fªpqsQê”êNŒöãO>îì=rôÈöÛÉ=Öˆ˜@®O÷Ýï¾øò Œ‹ÏmÛ·utu¬&®€‹Yƒ9v|¸ãw¿ÿZõõƒ<Þ}÷]L«Ú7øבPQQQý¢eIòÈÌLG2+¤¦¦¦¥¥¡€L\TTD{ Lžœ«R©22ÓW" —¹»ººøïß¿¿š˜¯¯/C ô¸°°°|¹‰ÀD^ApySø|>¦†!Šnܸ¾ÐööíÛl6[§Ó) ã¿uëÆ¾g2êêêäryCC" æ‹Ùa¡nÞ¼ùB°°®¶vòÀ.¾Z¯ÖôhtH¾S&CB±ð“O?!þõ_ÿýûØ„ØwÞ}'#'éö«_!O@á‘á†!Cw_÷ÁC¿Úõ•¾_Ï«ä‘æŸ}ñiŽÿÍ·ßì?°Ÿ¹Âøø:?üáŸùù_þònwÅPƒßûÓ{l.›¼íèi4€*P^ ¾T.d±Y¿ÿÿ~ŸŸM¨"!9•ˆ‡ÇjòHÏJ'Ç'0ÙO?ý3Âø±2A!Ao¿óv›¼m5yää8>ýüS@Òwû¿óðòÀ:£!øbñÿTTTT¯R&иA,s¹\äïÜÜÜœœœüü|@ ‘HZ[[‘ÚAY«Î¶ µ#{{{bbb|||®\¹Ââ³X,p†Á`@ŽGú$%%1ä133“@N²¨ÕjÀùiä"Úejjj ÓÓÓûúú²²²¦¦¦:;;±D’œœLΪü¸|½*†WPPP¾lðAåää$†˜˜ØÖÖöÄ+g-bÏ{Ç 1ä”ÿöÛo5òŠò‰[y4¶6~ðÁŸ~öéßþ£¿27!={÷TŠ*9dwo_oƒÑàéíIšçäçæ€/_¯>þžU!-„<<¼=Õ‚?ýùOÞ~Þæ\qøœ?ÿåÏûîç ùr¥<%=@—‡ÁÄÄÅJâã%R 9ýÁp U0?–a€ãèñ£À…J•!>¹¹Ä4@Ù¶mø¦ª¦ x´s×N…Z±š<0L?":B"“ÄÄÇ 9Û²mû¶çúÕ Õk ‹‘2wU•09%)!1>11>;;‹ÇãVWW×ÖÕVUU••—¥g¤GEEFÇD%&ÅÃóîÝ»æ!yÇÅÅ#===@p€V«EFG²¦,°illŒÏçß¾}óóócÈcaaõà $~ðMEEÙœ<ðŠþþþð—Édh ¤ÀÈÉ宨ŒŽŽ|€“POÈ]s88Ÿº`0ØzáÂrÕ9·‚†³³³ýýý(¿84¬‹­ydçe>üèCèÝ÷Þývï·*J׫svuþõ¯ý§?ýIT'2.´yüç[ÿ‰¿ió¦wÞy§œ_"IÍH%Íw|¸ãQón0¬°uÛÖÍ[6_jj˜ß¶ G7¤pÔ˜ ”yë­·0ª?ýxæä SáÏ6ûxç]ÓEšÍÓÈÐó¿ÿýwà;q½˜øäæÐCiy)†!ø»ï¾›’–b2¬&àÈþû1Ìëý÷ßG ä.Vü$‡ŠŠŠêµ—%ïç1??WQÁc±Šùùy))I±q1QÑ‘ÑÑQ(¤¤˜.8 )b^¹r)œéÍA'J¥’921>>Îf³AáááÍÍÍØzìØ1pòz[[[KK ¶ZYY1äà¦ÔÖÖJ¥R‹Õ××Çy¸ºº* „D"‰‰‰Á+ÀcÁ_(ÖÔÔ,--¡wDvss !!G{{{cc#V[á322‚&¨,//ïêêÂDD"Qå²EFF...¾84¬‹­…<°õ´Ëéð¨ðÕ›SO9’«Ò²ÒN8ž @b†}s=)~ûÛß"£“ÐÊ•r+«¤Ô$¿?Tæ䟛Hó Ð ÒHMÈÖÇ<½=+ª* Í‘¹94©ª©:vâêW\¤ ÜÉ-È¡!Æ â!³ƒ[ƒ¤ý¢>:.š\#"•K™€Ptl4P XÏÓ®§O;bħRTiþ}æ xð<~òxv~6™B¯ pÚ` ¤G?Ÿ“N'óŠòÈá™ÐˆP4¦?i¡¢¢z³dIò˜™™áñ¹ .— øàp8¥¥¥%%%yyy©©¦Ÿ½øùûäONN2ç/~\&½^oþ;[lRܼy©ÇãÉårpɵk×~\þ•,™L†š«W¯’ëIÉa 0D¿9Öܾ}ƒ/lˆC·ãðommELâ<77Çü4æÒ¥K$òôôtSS‚“3D`NÚP«Õ$ã5ïÚ²öò˜a‘a_íúê?þã?ŠÙÅ ¼à¯9ÖýÇ k ¸ÖNGW¨¨¨¨¨–eIò(´¶¶$$Ä5àŸ–ž–œœìàïàW!à#©oœ ýºÚË#ÃáÐáC~øaxT8½eÕ.K’Çýû÷/^¼XS#Ž‹‰ŽŽŠ‰‰ nøùùùúøx‡G„±Ù¥CCC¿è{ƒþRì¥>1®»¯[Û«¥WSRQQQQY’<~\†ëׯk´šJaeAa~vvVffFfVF^~—ËU©”—.]Zqm)µ—dôYµTTTTT¯@&—¯ŸXZZZ\\¼qãÆåË—ÏŸ?Ú@œùùù{÷îmœ[|¾öFÉƒŠŠŠŠêÈòäan?<¶uH¤ÔžÓ(yPQQQQ½m ò¸7}áJCò…2×s¢èÛSàõɨÔÖf”<¨¨¨¨¨^6 y,Í\:Ÿo=òÿ÷ˆßÿ<“¾÷öµ³ë–T©­Á(y¼<õ õé :mŸÖ\ÝýÝ#CãCÕ«ÔF!]egCÿùbÜ?އÿ/ƒÇÿy&ìŸ/5g­[R¥¶{Iä¡ëÕ‰ëÅ\·¹­ùi¿mQ¨]–úhïlgz `´x­m¬e•² RNiƒ¤á‰Ë‚Jn×äÆf•óËe ÙïöÑkì•kä ¢K×e.¹ZÞmè=;j©‰SQQQYD…<®ÕÇûü_c!ÿs(àÿérø‡ Qÿx¹:lÝ’*µ5ØË U·*6!6,2,*6ÊÇß§¨´¨èÑ]DÑ‘aÈ@Ruv^vjFª©Æh@Ö'm± Ìxðv`xo‰^±•q&õ¨A„Á‘GéŸÔ˜ß¸Ì< £ä´dæ¦é==‡­÷öžp<áè—ãàÇòÒËrX]Ÿn箘Ü"¢#‚B‚¤réêEP÷ªUzÕ½{÷V,øÌÍÀÇÄù ‹ÿ ¢¢¢z•Ú(ä1«L„ü¶ïÔÿ¡rø‡ÞÓÿc2êw×ìgôúðáÃÙÙÙ'nšœœ\—ǰ1qÐÑϸèMæææ° h¾´´´ÆVÈOçÎû›nwïÞ½uëÖƒÖñi·ëNHÒY9YÈ뽟{MC ¤KÛ….„b¡o€¯Ói§r~9Þ‚<\Ý]±ÕÚÖšÜm m‘ìݽÜÃ#ÃÛämHóe¼² Ð àKAqÈ · ×ÙÍÄ Ò©ÐWHXHDTpÁÊÚ ÑмÛЮ] X&ÐÍÓ-2&’dÆùDòÀØZd-d\TÑ7ØçxÊ12:ÒÞÁÞá˜CUMȃ8íw 7>)žy4®¹€Ìê_º¿Ô¡ê8{á¬Åÿ PQQQ½Jmòx°0}©Â§/ê½óÿï@ä[8n÷çŸÕýôôtttôê›"2êgffÖ2ôg’:‰ƒ€555äIok7´,))IMMÍÍÍ•H$«wyŸhSSSñññtT*•X,†s\\Üs ì¶îäPžÞžmmä-’=>}¼ÖKê“Q ”«ä`…½ûöŠêD2…ÌÆÎ¦±¥QÖ)Ë/Ê—Ê¥µMµy…yÚ-|°©©µI­W\JÊK:”UÅìbÀÁ±Ç@ÍmÍâzñÁCAù¬|0üÓ³ÓUݪ֎VD|tŠ€Ý}ÝÌ8ŸM£¡¸¬8)5 ›>ùô“ÐðÐŽ®Ž¬Ü, ’9yh{µ ) Øêu äAEEEe.Ë“èáÁ²Í]¿RÅJ6ò#Y¡ÓW&IåÓnšNž( $`tWXX˜ŸŸ?>>®Õj1$oµZdßÕÕU^^Þ××Gð†P*•×®];þ<ŸÏÏËËC%!•7nTUU! fÑÙÙIâètºúúzF266Æ[¶Ë—/ÿ¸üˆ8©TÊf³333áf>T/**YXX˜œœ|D~\~ÎK[[ˆD¡P`Hx+À%999‹~ÑêàÁƒèK(½c"—.]‰D¥¥¥ˆ‰ŽÐ5¶^¹r%""âÇåC r¹œÃá Ü¿ËgÌÁ×aëN†!€@©S25äH«”…L\À—ÁËÇK"“€*bâcH×Hù@^%Ï»›‡›­m›¼ÍÜ'":âø‰ã®®.n.'O Žã)G›…ø :øø2˜®K9¥æåJ9³iyXY[¡ùñ“Ç? go_ïð¨pp6íûn_k{+ÜjkO»œy|öùgήÎîžî>þ>ɩɚÍêu äAEEEe. “Çõéë’ÖfaµTòù܉‰‰’RV…€G*[Z›«ò@–ussèõúººº¸¸8Ô»»»÷ôô F"“ÉòÁ(#{zz"y“¹!Ocœ •ää䆆°Ecc#¸€Hœéééàà` Âðð0º@[8€ì ^^^€äø   óçÝ755µ··“§Üað7oÞ\\\¼}û6êá *++3 @+++° Ê` àBoo¯··÷™3gÀ+GE_£££àZax?æhNˆà@wxÅL&`Lð¹n<ÿ2Žyøø6µ6‘·ú~}EU²uiyiN~¹ÔÄÐ i ×y7Bð^Ô5Õa+"àkcîW”Wß\­@„B+8ÍZøúc+3˜ü¢|ó€æÏ¦Gä”ôrÉ8 ÌAN¬³‹áÜÜÖ¬Ô*1Õaò4Z†<öíß'ªÁ­EÖ¢íÕ>q(yPQQQ™Ë’ä1=}½MÖj4^ºtIôüùsMÍ êjá¹s“—¯\¾pá q°µ­éÿiäáçç§Ñh>|xíÚ5RP °R^^Ža y‹Åb$ll #7+CJ¾té2=ž³³³ééé¨. sã•Ä!rp‚tŒÈÈÈIäææ¢riÙˆ3<€Ew÷Êdƒ1£ 4DL,ø³öððÀ00¹\ŽV L àïï¾PUWW£à‹Å:{ö¬9y ZIIIUUf 7<}}}áö\—§¬;y [FÅFÉUrdå|V~PHZ¯nhi 'PPâä ‰Ôt̃9ê@ȃàˆF¯Qu«jjzzÍ}ŠJŠÊ¸eÀ ™Bþ äVF3òÜÅBMÍ=xE ²ù¯lÀCA¡Aí]íp.(. ïêgζ0b"Íȃ©y†T=*A·zÁñ1Qò ¢¢ze1ò@¦o“¶ jÛ.¶&Mö¶£¡J­yŒ «]ÊΩ©)ì÷DúÛ¤­337Vdq†3È@ÍkyÄÆÆ"%#C#++•JÂpûqùy1]]]ÅÅÅ€’ääd¤|4IHH G)~\¾Îcy€N€)ØtçÎÌk~~>//O§Ó1ÎæäP«Õ$ñãõƲкF –ˆÇãŠt ˜XAáááä zÁ8Q‰·`—‘‘sò@ÀÈÈH6›Mf ZYUQY%àñ9cc£„<ÆÆÐÌØßo´4™ïÁ¯à ótŠ.þÏœ9ƒ¼J00gdep(o9R>|¸\î­[·°Î$éÍ …^¯Ç[T†††ò ,²š< ¢!8y$^iiéÀÀ@®{÷îÕÖÖ †3ò¸zõ*0è`¾ øÕÖÖâÁðGGGWó@k…)Ï/!óñXŠ< äxY§¬EÖ¢Ò©˜Á"g£¦µ£„a\mÏ£S •‚0ù´· ý¯öM"• 29o´Ù´wµãR¨æ'AVtºbR…” ’\Œ‚€ægdÌ#£ Ú@póšg¨¤c«å+ì@ÛÑ z?**ª7K#š:ÑØøØ ¡w G;ا\¼xñÜùsÄPFqÙ‡†‡D⪵ÒpVVÇCzµ »777³Ùlpƒ9y,..ñ—ÍÝÝ)Ùé\,£-š˜Ç!TÂÖ¦¦&Ò ôð ò@4‘H¦©««Cïˆn@¥F£544 w°ÈjòÀðbccÑÑðð0³ À!Õ××#fqqñôôôŠë<àLf ÄQ©TŠ<¨†Æ‡ÆÎŽMœŸ8{ᬹΜ;3zv”ÞÃ”ŠŠêM“ÅÈC\S­ëÖi– ÉR©Tvuuär9šËd2©TÚÚÚÚÒÒ‚„򴓻 ÍÉãîÝ»}}}¨Á+ùÁ*SjAs€ €)eƒÁ€­æÎ(_»v ݡӑ‘‘‰‰ TÎÏÏcÝÝÝäZQ›ÈOc~\þÅJ{{»V«…'Þ‚lÇÈ+nÚÔ3a.ýýýÌŧ N‡J„%ך`ldƃJ°ÔÐÐ&~õêUfÙJ.e%Ÿ ùmÓ­Èå´ LË $ZûMD(yPQQQQ½2YŒ¾ÂÚüꥥ¥>L=½Èš5jÊ@ÃcÃ×g®O^˜Ì-ÈMJIÊÎÍŽKˆÓ÷é¯M_ˆêEˆ°Êœü^%Ï`4 °¹ìêÚê‚â‚ð]»w¥f¦jz4$‚¶W‹­\75#µ”Sªï×#”P,$[%RI‹¬5l»œ_^Ì.nio[na®R§ìè9xø`}s}«@P% ‚Á \X\ÊÄ`àÞKÊJ˜§àš“8ãî² VTT,,,\¸p!??xxøìÙ³­­­ÀŽÉÉI‹5557€9æqÿþ}luuu•Éd/á_5jÔ¨ýLyGW¾¿ráÊ…ó—Ï_šº¡|îÒ9®^»ºÑÈ#=´ð˜Mø¦G Û|ÐýÃrûö[Ó7¦åŠŽø”H[·ÝVþÛ°É&œhÓ ¹¤|­h±‹ØŠ­G¢vp$é!GãØ®¢ÖñØOx­YüÖlŽ$Cah,¬‰©ï*Îw žy¢ˆÜêˆþ3šV]Uq}‚ -/³2qòk¢…²‚Ò†ä¶nQU{¡mÄ–ÈbGvc §9q¢?¬Q”Æ”ž>÷Y*ß›ì"·’‘åÙ£¯S‰_-¿Ý잺' ×ÍÊŽÕÆå‹"«;X‰OûÈmC“zi·¸´1t‚q†?{yoƒòí&´ècsKý6™çƒ1×ÅW·<Ò÷u¢vhŒRÇ„/à/ŽÊG#xXá1 C¢´éª ÄÑ>Y‡V/ÔÚåŸm“U²AÉ£^Ro\¾CFMCMpXðÀÈ_ÈONKIøúWTU€vîÚ–žòØýõîÌœLæÙ¶ÍmÍÛwl÷õ÷µ8w(ã–Õ6Öžv9M¶"NZfj>þäãð¨pÇSŽÖ¶Öâìê…ÈŸ~þ©§gbJbph0ÐÃ׋“R“Ð{Fv†L!Óõé¾øê ôžŸÝmè^MÄnß¾-‹ûûûA .—{óæÍ¥¥%&>>¾°°P"‘ÌÎÎþ¸|:Æ`0…ÂââbJÔ¨QÛPf"# ãâ•‹«ueêÊÆ"Ô¢8÷Ô½Ö¡›k³µ×'¼ îÜüìÌìôôï/^:ß¡DºÛ|nºÅÌó¯rIúºw´+$ß!(ïHB™GYc*jbKMäa¾Õ9ék×äo|2 ¿9^U²Bûˆm.Éß4©øiûzF;óD‘G"wøg[×w–Û„m9•ðšx¦}—!BŽ·‹Ø&ê(öÍ:ìõá©„¶a[jä¥)<¿¼êÈ®}Ävf$ql7Nsü͇‡1ˆå¥>™‡í·åÚ ¥ùèÝ0®Jåù¡à›y¸ÓЄ &˜ˆûÜÓ3¢-8† ˜Emgƒ±e ‚³…¡mg_#ÞçtA`NU8œ£Kœy’Ì£Ñ7©+PÛð'¯Õ[ê–¿!϶œ$WÊ…b!|LL³{g)§Ô`4T+B#B{{£b£€/äKVnÈcï¾½¤w¦ÓÕäqþüùüü|ò a‘H””””‘‘AŽ|™+É”h„`Û°mRØ9ñk¦G‡PZP«( /¦>ºøtYcb’·ö;œâ¿Â¤:úE{Ê^i·Z£ìtÂnR£èk$Ã8û9œAh…M®Iß¶h«ìÂA6›SyþeMiÄÙ>|;q®”æ+û%µP¢®¬lËwˆü°QÉ /<ùÄUz.ùemÐcÇO·±³qvuöñ÷),.Dâïè=vò˜®W‡­õÍõ^àƒCV‡ÈñÆjòp<åH¦Æp㓘’HjœN; Ž ¢pÊù”qÔH|yÿÁýr•éâq½ØËÇ ½<|ð¤ÓIlŨ@E ¦÷§‘ÇÇ»ººx<y[]]7111>>Îf³gggápÿþý—Ÿr\XX899) õz=ê+**(yP£FmCÈÿŠGÎŒ ­Öʼnêºê D9e!yÇ}ðX›üwU‹…3³Óg'ψj„±'B¾µ Ùa´[Í<ÿªSñ»•†ëà-æ•ÑÅ.U2Ö‰è/šU”áST_-cÙ„nË® /oÊ@Âöϲ³ Ùª3vD³œ­‚7ûfXWËŠ­C¶ŠÚK2+BNÇïŽb9#ÇÇߒ뒴Ç:d‹]Ø CÜQšÁöË´J ]“ö2óN;Ä—ä ƒ± Ý–Æ Lç£\֘]øeÙʺk1õ ôxôçhâ–´WÑÛhªh=ó%úb6ŒýŠÓ”q,êS›m¹U‘BœíB·ŸÜª¨ð‚“Z‘5tñ‚s>q•žG›¼Òg§l@ò`ζ02 áQá]š®ÁÑAA•ÀÍà |pØú0 ÄÄÒæÓ®§±ÉœKJJº»»Oœ8}ôèQOOÏ™úè"jÔ¨myôz}ƒ&À?IüKìéïAaüìøÆ"”Â8—ø=> :°éxÐ7¼Šri{Kjn¬Wì‘#!ŸÜ‚zÆgµœbwwZ¬·˜WF¹TIYG#>«Sp2ø!i¼ ø`P>iÖ]}-¨wÿÔ*h«aLݬFœb×§eU„!_’˪IŒ+ñl××õª0€Øb÷t^pR™oi]*0hë ­¢¸\a”uð6Ò) Y‚pnSVL±:mÕŠÜ“ö£Ç°¼“Ù‚ðÜãŵɈŒ†êé±ÈÏÑÄ%a¯¼§5­šêär?׼Ì&»¨IáøGž®l+Œ+ñ Î6ÁÛ‰&‚„ç;!x~U´mÈö†N^PöÑg¬Õ]äš_¾϶¬&|­¹Üì¼ìJQ%P #;Ü<¤r©ã)G¾Ê§‘GSk“M·,¯0oç®Ï&?ùØ/ÐWÉ ‹ +)+Á±9lt*¨Ä&ÄrøœµÇíÛ·“’’.]ºDÞ^¾|¹¥¥E¯××ÕÕ¥¦¦‚*&''9ŽZ­ÆŸO[[ÛÜÜÜÅÇ–——' ÉjÔ¨QÛòèîëÆcQ½(#'C®”k{´%å%¹…¹Hô£gF7yd—¦d:ðû€è ÿ&Ç=A^¾ÑŽ'ÂwYle6=CGÂ>ͯŠE[óJäƒ ¥>‡6ûgØóšr¸ÙiÜ D¶/6Ù‡~ܬ¬L*ó;ä¿ùÿ&VMR:/¤ZZRX,⋃~ }¨¶Á§H”xÐÔÅ'yÂnSŽwª5:Jbû¹'@(§˜Ý™ü0›àL¿v¡Ųi6è•¶Á;ÐEU+[P¨,¨Ž· ù›Ðcne4†Uè"’•à•Ù9Fïb‰-ˆi¸8ØB|P€eK!ú:û Æ™Ê rŽß³–E{¶0ÍÌâx¶%37sõ/i‘ìS3M——æäç± C†„är·}¿›|ü|:ÕĹSÓ L!eA•¼žÈÊËrvs:dæd¢¦£«ƒø¬( fDt8ñJN©à,=+8pAw`¦÷§‘ǽ{÷wî<º¥é?ü0>>^VVÆf³Ïž=‹·>|ˆÅbæ'µÄt:ÝÈÈÈzü¯ Fµõ1þ"§wi»ð0$<$:.:(4¨±µÿ`‡Ç†«j«6yä°3‚2ï÷yŸè ï¦ãa;m¸ã€ÏLý: ]x&æ6æ8Çî}ñ_y$Ê`mij-¿PÑ{˜R£Fí56‡F¯dè ºeG\Rœ§g½¤^Û§EqÔ¸±È#¹ îTô·ßy½O´ß d°ù€÷û׬»ìƒ?©—óâXž‡|7¿¤.^Eæ¹ä—gSò äA5jÓ@ªn CÝ£†äjy›¢M¥W¡¬éÕ l,òÈ,NõI¶Ûçñþ+ÓwžïðÞ¼ßóƒWÙé/NÞI¶ólË/T ÂÒBæô 5jÔ¨½NòPj•š²[¹ZÈõ ô¬Ú¼²ì˜÷v`@úÑèµRË‚^¼€}úŸ]Ì8öâ…´òàŸ]Ï9õâ…àÌÏ(dó£27äo[~¡jWµçç_¸táöÛTTTT¯™´z­B¥@Nï\©ÞÁ^…ZQ×\wæÜ™BÕõU³óÓó‹7oÌ}sáÆš ·Ö¡0;ÿó 3ëQXx¡Âôz®?£0={'âRòX/õ õÕKês‹r³ ²©¨¨¨^3å—äó«ùÂáì@º™Ù(ä!n›?‡“ڱ넔<ÖKCãC£gGüç'¨¨¨¨^39oúçöĘš¶ž;ìÀ¿ÁH·.^ R<¨’öÎvÿ ô^ÓX“˜’ˆ²J§B=HH"•Ô6Övi»ð–SÁñôñ—T×V#2ùÞbèn›t}:ljnkƤð(€a£Lœ1YdMÔ` µ‚ F…šNM'y‹$`ïÀOʃÞÃ"ýs°±µÑè5>~>¹¹?:…Ä&Ä"Ú¢FT'‚´½Ztmem…5A%:²””—ü5,ŸóåÎ/‘¤;ÕMmMmò64G“.M&.®cÌ`MpÐØÒØ,mVꔈ†Aâ_«qù,æ‹Mè ½#y¨aSkÖ¡°bˆ€…B bª»M‡ª[…zÔàóðaIË„#ë€X7Ò À„)¸z¸âÛ‚î°†„´“™<ü}ø•|RÙÚÑêîåŽEØ`ÿi—ÓnžnGŽR †8“u.*-JJM"M°èkó–ÍžÞžHç;wíÄ0â“â‘éƒB‚PyÂñ„ü5ùvÏ·/Lã‡ìŽØa²¦gwՉРq°†ø ¼|½þ‘±VÜ .ÈÝÓ]®”ì°t('$'L‡­£UQI!Ó$HÈËÇ @†®±¤À¾eÁLJم„…;q ë†Ã„Ïš¬6Ä/ÐoAŸ}þü=¼=ÈP™•D|ñà†¡²¹l¬¾âêî Oò0ÈÝ_ïFGæ µø Õ‹ËÂäq±?ò¼fóEõ¯.÷¼u®ÃA›»ÍÀ±“§ÖÇuPå|ÙšôÑHµóü%ýê^gffâããÍoIέ _ âß½{7!!BÈ£¿¿ŸÇã=X6 ·ÂÂBÒ AAA999ÃÃÄ`Þ@£äñ& äAØÙ©ûë%e%ø§ÀŽ&ö8‘‡J9¥Øå[ *ÔŠSΧ||ÑÄÊÆŠä'¡XèèOjL;÷6VÈØuF+Ä!‡ILùŒÏAê=pèOÀCC^d†ì‹$½ú X$„ÈȦQØûGR1ÎJLƒ°ªÓi'¼Åð°&À, QaI!óøe¬ H 5UÆ-Ea­ èk…æà¡ƒ( y½¤ž *tÕà ƒ<¾ùöÌñhÂLƒñ kð%sÇøe Zeåft:‰¥6¡ŒÁm1_‹ÿ±P½¸,OWú6Ï ýjáÂ×ÂÝÃb7]ÉauÁÞ i‚R™³s¢Îý¢"uu¯óóóW®\!oAæÞ½{µµµƒñ%!!!BCCC"‘TÔÀÀúúú@eee¤ùýû÷ÇÆÆššš+/^üùÙû—l”<Þd!-}ùÕ—ØñýjçWH~ØûÄ|¤dì²#+[ÛX[Y[!ƒ" žt<©ï×5ròs°«jNHuæä}Vr"fEdd äHÔ ‚9g ñ`g·Mþ×Ó9‚¡~Aµ 8,½‹*ø!9X‚MüJ>öÔ‘¢Ÿô‚fòñ}äƒD¸gï [‘½ HÏØJZ€<ÌA È< dNH`&dbRÆ\0S¬ öÚwîÞimk}ìÄ1 Öàx n`5,,œ .ôxÚåt^ažùysò@Lòôc¼"ãÆ'Ç{ùxíøpFò1 Ž tðÁÁ5èQ¡R 8>DŒ¯`G8{z{‡à ݡU9¯ âAs 1kkA‘1‘d¡°þQ1QÎnÎàf`ðħŸ’žâtÊ  |qrv(€3@BÆåìè‘!P ƒ9”ò8zü(ùß‚¾0T&2Ð=’ïX>@rᾇ`¬‰CÉãõÐÆ!½C¼:’†k¼§Ô³Fá÷šìQÑéKíÑçÛãW÷º´´$•Jù|þÔÔ:åp8 zW(à’3gÎDGGß¼y“ǵk×ðD!%%exxØœ<ÆÇDZ5""Pòbü—j”<ÞdEÇE³‹ñç) ‘3°ƒn\ÞÓ5ÕЙN²à‹D‚Ô‚” Ö«ñ6%#Åœ2Áøw€ hNð5ÌɆ<@'€'f0ˆó€ŒÑAäj’NM'’:戀ä”Y &2¹´…!Ô`ÿÑ0Fò)˜“)a¸yšŽC`1O9ò G\p0Œ$ 8 »¯›Yg¹JîpÌÁé´S9¿…cÇá“Ç`5à€#׉Íi™“‰î@xø(™±áCqvu>yêdaq¡£“ãñÇ1}ÂÆUäî2s3ÍɃ!†äIe˜åÅúøù“+‹ñ)ƒáÐ ‰l¤äñÉÂäqu$õb÷ŸgÆ7/\öY}¯É¼®I¿Ù“3×W4ÛyMy¥#æBGâ;UÔ××gdd$''óx< ÅËWž¢2)))--M­Vß¿t200€‚J¥B%°£±±qqq„A’PÀ”üü|Œ611(óó³÷/Ù(y¼Éb®ó@¶T Ý‘ÆLOY*ÌCÊÁŽiVN–P$ìêgsØ%å%ì¸Ã i»¤5 5HÈmÌùsò q°·MâˆêDØÑGvA-`ر7ßåmioñòõ‚sCKCL|L`p ¶G ,ÈÈÎ@/55îžîH–«ÉÆ~¹i$MµØ;G¦7÷i4¤g¥Kd¾ûè1{ IDATÌŠ¬&ÊêÊ|V><Ѽ½«Ý0ý'™Ab¿ÜÇϧ¸¬Y62:2!9s4¿Îƒˆ¹ÄøSò 5«õDòÀR{x{Ô5Õåäçlß±ýä¡ï×)0A‰T‚Éš®3íÑVðA8N9Ÿ²;bשî4ÉÎÀ4ñA¸¸¹`MÌi€\çÑÓߴ™¦¾¹~ÏÞ= K|ßîù|@NÍ<‘<0€Œœ ã7ˆŸAš à_ôÅb³ŠJ‹Äõâ£ÇbÀ”<^KY˜<îÌÓ‘~4©sº¨Š9[ïv£;gF›6£M™Q%ÜЦoöª}ZßwïÞ™™¹q〃‰‰òôô4êAx È ?£½wïÞe#?ÅÛ[·n‘&>œŸŸÇàçææÞØ;»Sòx“•Sƒ GÊø#Å¿~"Êìûb§91%‘ì»+µÊ¨˜(wÓõƒ~H?HrVÖVØWŽOŠ'g÷ÁHº€¤sqÀ$Ò!¶røìCÛÚÛ–ñÊÌGB.b…óiçÓp–ÊMWW #M"»z¸–”•ô ö!3%§%“&R×#/dSrüÆÜÌTP\€]|r~apdÁQ ="¡bvHr`—S.§r rɯ*LY9 ö¿Í‘MŽu'g'`& ù\Y×gú­€,(Ä´sÏÔ¬°>æããÜ|Òé$ÖÔ†’_£_”o^híhl2°&ä'E€ >@@\b9„:1]šêéÆpáSÎ/'Í!8“#^@ð(s©¹ß ,>_ !Îädæ…­X@Rƒ˜À¬6Ö€â[Dâ˜÷Ŭ$>VÓ•È­x[)ªôôöÄ +ŒÏšD6. aâPý¢µžÛòðÇüøÃÇ÷oOõ”mðœ¨95!vš;NˆN^Vf=¸÷¬›‰Q[/£äñ&ë ·ßýë&æôSC29¢À81ÑVÄ|Bœ‘Aó£Ïvfú]=æ•cy‚‘y̧…Z1¤Ÿ1È'ÞÂdu/ϾÓÉӆǬðÊ­Ìùš§|^æÊêñ‰÷ÓVouïÏžÝSç§ç˜ž86óù>cHT¿Pmòø«ýðàÞ­ï‡gÏÈfÆZfÆZçÎ)Ü™[‡¤Jm FɃê¹$ª1WYRQQQ­]‹<¨YÐ(yP=—ðUYq0***ªµˆ’µGFɃjí2ô^uÌüep³â–—Ïv&¿De Tk—¦çÉ×½>—t}:ú?„êoŠ’µGFÉãMVaI¡¨N´FçÖŽVOÏø¤ø<éŽæQÏNx™9™U5UOÜ”“ŸÓ iXá\×Tg^x.©»Õ˜Tw_7SøþzuDt„¥>².m×Ïè}u+•N•’žÒ?Ôð³ÖÃ(>1Þüv,TTO%jŒ’Ç›¬è¸è¼¢<$òêÚjm–Tviºð¶¹­Ùü¨vjO9Ÿ²±³).+:¨ºUâz1ÓJ¦‘G@­¦'t F"•À+àJRæñ(¨ijm²²±b~ÿb\>ƒÓÖÑ&¨TŠ*åJ9B;q,$,¤¦¡m™ÈDÁaÁ&"·wµçȘHN‡L­äÒY úªo®'?Ó@rÅÛŠª Œ<…üô׸ü³ de}¿ž) +›V@ÚŒÄl\¾ÛVcCLÓ£gÔ ¬-¢ÛHÚF/è kB~:‹&!ZáÝa•° ëLNTaõPÆ81¬ùë#šF³Ü) Ÿ¿Å%wÃ,@fX4æ.)èÈÜyEÍêV ºÃ0¾Úù«”ÕÑÕ:áWò…b¡ùý< ©µ½õ<Ÿ©„? ez¾Œ¶ë°Õá¤Ô¤†–Ÿ!Õ mòxøðáíÛ·oݺE¡ÄRFÉãMVTlRPh¿Ojºénß ŒÌÜÌЈPlBZe¾ÊŽÝ_ïFÆMNK–«ä™9™äq*éÙéHr!á!¥œG÷9rô€ÜpðÐAOÏÓ.§O9‚:5q‰qA!A¨Ùñásò@G€o€ïñ“Ç]Ý\‘2Ñ—­½mzV:_Èoio13F‹.л³«ó)—Sµµpv8êàè¿k÷.Ð >ûîwót (ã•a€{{OoO/_/Y§ hRY]I XN!ß“ ³ ÄxÈ €0bâc 5Hà O>ýSF b²Ø,°ÒpxTxXdX~Q>’=|¾üêK,cBr‚Z¯.fcÁ#ü3Ä[lõðöp÷tG@ ÐdE§+2ÓC|úÙ§XFôNn‚¾Â™< nEÍêV “N'‹J‹6oÙìåã®ò ô;átCÂÚšŸ´rqw±µ³Åº9vBÙôH9_Ì.61¶±¥„„àø”™ùRQ=Q‚<.\¸pýúõ›7oÞ¸qƒ<à>/û*kÿò½ÔÁXÜ(y¼É^ ý€$”Z%04  ‘?ÈÃÞ5‘´çà°`r·œüœÜ‚\`J{g;ˆyˆÙ„DNî$ 2m`ßÚÚÖ,‚˜•›ÕmèfsÙHTæä2r!ÆŒØ`?ö¡™€«…ÈH¨º^"cWmÉ-ÅŒï-f\¦'g§NugkG+ø™;.!h‚·˜¹?‘J§òòÇÎ:S÷‡¡¶05pæˆ}}Ì+“[˜ ª #Á_MV^ƒ€X+ ëÄáUòà³gß0“Áh:^’š‘Š×¦Ö&:º:X¥,€y¢¬›‡›¨VT][N}X(t !d †øìóÏCzƒ„ ,–1âŒOpuÍêV¨çaV6V?Pf‡zÀ„ù/Š]Ü\%XÓí㛞ÒRRVRR^‚ñ×4Ô$¥$‘Y{‹QQ=C–'û÷ïŸ9sf~~~ii À×ÅÅE¼½uë¹ØÓìîÝ»ƒa||M~\~˜ ó$—µØèè(@g-ž×®]C_küK4Jo²¢c£Ó2Ó†MwÝ6!Èòm.‘2mìllímO8ž0?ÓÁÐ@t\4rqÔtH>hÅlÂÞ¿Ý;y„#‘{31=lŒm:SÂ8pè€9y˜’Yy 0 lûŽí&žJaÁå¼rã2å›®&2s31àzGmm䡯 óËêšëàŒœÊÕ, s- âŸp:€@ yd¨‚yº ¹¯(Xá›=ß°°hXº¢Ò"spî¯w‘%E%F‚V ænîÀŽ2^™y§`Á™ƒ À[¦GÒšzOIOYáŒA®®YÝjyÙ¡ìêáŠñ˜_ʃò˜YÆ9$,€hkg‹øøÈð5 äAµYž<æææ@ày®^Ÿq˜áÞ½{mmmÅÅÅåååä†èz½¾¨¨èÇU‡(žø†æ½½½Ì¦gt×ÙÙÉápˆÓ|-«ó 2Jo²í°sŒ©ï×{xytj:óYùlûуN†rs-†²ó²¹\Óó\úº‘{°M@ãòSâáy†<’Ó’É5"²NÙÞïöš“2«_€Ÿ¸^ŒÝ胇brÛ3ȃàCpæ M5L!84˜ÌK£×Ø1‘‡‰xtJA•Àá˜sËQÌ‘Åf%&'öõ“¹·&3sc1°H`H`O6FDG¢“ÜLÈ>ÁÚ^-óäs¡X¸âA0Ì}ÐÉ£²ºÒ¼Sò(ó€ÌôA  OÕ)*)Ê)ÈYýÜ–Õ5«[1äamcMÁ³½«=3'“<6…é‘ÜXÝhFX[rJˆyŽ›'%ª¿-K’Ç;wÔ• ’ϯàV‹…"qÕjµ´6ÏÞœ]ÝëììlllìùóçÁ(7oÞäóù“““ÝÝÝè¯, õÀÔ—––&%%)•Ê¥¥¥ÑÑQl¯ddd:tÓ.))Ç´¶¶¦¥¥I¥RŒ >---¤£ÚÚÚžž›„„„K—.†‡‡D®_¿þÂé~%7YQ±Qßíÿ©´‚T'‘JR3Rë›ë±›‹‚Þð×[w0äÑÔÚ”‘“ÑÐÒÀæ²]Ý]‘Ï'4"´YÚŒ»ãÄ+ô@ž{NvaK9¥®®Þ~ÞÈRæ÷Gæ&ß–’ò´ò ô#¿Ýh‘µàíÑãG ÞH®Œ3²/¨5ä¹!ž>žxëâæbþ«ÚNµéâS§ÓN@Óe=„u÷r‹ +(.XñCYD®k®#‘ƒCƒ‰3 gdhR ôñóñðò@_H±Æå“&1ñ1ÇP£Ö«ÅìbzD¦`\>RÎ/G ‰üÊÄ2¡AsFvr?š3Ü€œ“Ÿc\>ÄqvuÆð¶Í}0N,…·¯7ÆÃ­àbõ˜Véi3*Mº»’'žü5 Û£€¨Áì0æNM'Ü€‰X.´%'à Ø"ÎO¬YÝ 5‘1‘˜l^QÞ ÇèˈÝþˆ}NA9X‚T%$'`„äs7þè·Á“ ÀGOÖá´ëix2­,þݦڀ²y ý•J988¨33­V[WW×Ý-êíÍíéIhïh¨­«g¬è.àƒäää„„¡PxëÖ-p„\RRRÒÛÛ Â(--E_÷ïßG˜0ñA>(ðù|`seyÀ§³³“ÔLLL`R”yÙÀ¾b£äAµnÚ0{ºÁaÁæWenÀnXÑ'¤P½>N.Á+s^fjjŠ©ßnÞ¼IÞ‚3ˆʨŸ˜˜ ]¹rƒ™žžFX399‰Qá·{÷î9à€š£SŒ Xób¹~c%****ªW ËÇÇ%­ÍZ­ÑbfMË‘H$ØTWW‡J.Ÿ3¿0ÿr.µGFÉƒŠŠŠŠêÈbä¡Ñ¨këjDâªj‘°ªªVA¨RU*!>QcSÃêcÔÖ×(yPQQQQ½Yì:¹¹¹‘Ñ£qðojhÈxýúõ×ì'¬Ð(yPQQQQ½YŒ<Èåk´×ïVåÐ(yPQQQQ½Yþ¹-Ô6ˆQòøÿÛ;Ó˜¸îs«ýÔOm?t•ÚFé­*Ý+µQ“æJM?TªÒJi㨷R[¥ñ½¹qšÍØÆŽ“x³86n0ÞXÌf³˜u€a€Ù÷};³ï ð›cÜÜ×L È $éPðïÑ#k8ó?ïù°tñ!„0¢<ÀG < „¦Àm.ᑵV'S(—T(”ªp$‚éØPBSà6—GK[û«¯Ÿx3íÜûϽ‘–÷FZÎù‹×û¢Ñ…e¿ø{,Ø”„¸ÍåQSWìDÉ™¬öŒÌ¶S­Ù9ì§®í?t$-ý0yàð‘ªêê ÿiæþýûñx<¶L"‘H¾S’üÔ¯-Ýq§¦¦hÔf–muòÎå!„0nyde_..nºr¥þÒ¥º’’¦Ò7oÕT.QT\|òô™ ÿñellì­·ÞÊÉÉÉÍÍÍÊʺpá‚Ï磱J¥2‰léŽk±Xš››?u™D"ÙêäÊBa Üæòhln>üöá'?qltð䩇§Ûí¶õW¡àHFÉüü<ŸÏ§ø˜žžÖjµÑh´¯¯¯«««££C&“Ñ›Ívûöm¹\>33óáÒû%z½¾®®Îd2%‰sçÎíß¿ŸB‡žÅbtVuu5½ ZFs¸\.¡ Q(4™N§ƒT*ÝÝÝ£££.½ËÂápèÅööö&?¯}‡‚ò€B˜·¹<ÚÚÛššõznú%ÛÙíìŽöõW]].ÅGffæØØXòWÔ †P+ø|¾ÁÁA@@‘!‘H(8îÝ»çr¹:;;U*Åe›Í.((ðz½CCCÔ:Ž%ù‹piÎáÇiN ¸qãMžœœ¤9´†Z„²†Rƒ&çææÒšFÇ?ßÝ;Ay@!LÛ\íì6…RA÷øÁ ãZ¶­½uýU×” ŸßÑÑqþüy‘HD±¾ìö³¸¸¨Ö«)›Ö|wPBw›Ëå¡‹ úƒžÏ¬'âbËÔçkzsª¸g+¹ç«{Ÿýó üTû‡"-kËCkÒ2fñ¸;;묯ï~å•ν{øÒKü´´˜Nwoaá“NI(!„„+ïy„c>¿kËF]Ž Ýê·1>[KTب¸ÊÒ² G®r5vËg¸9ýîh<üIåqoñÞÕÄÃÎÍÌ8ëjE{öö틼þzøµ×¯¾jûãEùKÜb^X¸»þ””IFy@!|$L–‡žÑc^_Ô¹UŸµ’#ªí‘è]–ë,ÑÅzÅé*ù™[ꃅÝj›9¹Ææ3·u5߸Y\ϪQ$Þ>+yr8¹À±KÔ¥Aº¥K÷ÅC—‡¡{ùÝ…»«»3ãjl?ÿ|pï^߯ízê©>ýtèw¿³?ÿ{áK™Í+‹ïÌÞ1™MœNŽP$ìè_3êó(WȉõÇiÃ(!„„•‡Eì÷Pl^ÊÃ\Ü&9YÚ{±®·K©¾PÓ›Y.z»H”W«>VÔ£¶™h™ÍkzÿbîÑ÷Ž\¾þAu}eIÅu‘¢×±_)*¨¨.}0'lëæ³‹Ë¯ª Ò-m o0øIåA÷òù»ó«œ³ÖT‹÷ì íÝëñEO^žó¹çœ?ÿ¹÷ÕWCÙÙ¡?üÁúÜsü?ÿ9fehñÌì ›Í.*.ªo¬¯¬ª|ÿý÷ûúûèø¹;ãã£c£”³s³sósôåÄÔKŒÑ³´fv~–ž¥ãÉ/çîÎMNOÒ³S3Sô˜L?œ ÞÛiÃ(!„„+刺(6©3`êµ ¢‚}E#÷–4»J˜UÁÏ©]giäLøRƒLm5ÒʆÖÚ._Pe¿Ù`¸‚Ž.çíšË× *n•º‚L¯¸³¤üeÇæ¯NzÃöH,°ayXì–ù…y*ƒ)º_yÅ¿oŸïW¿r½þºW*õVWûÞ}7¦VǸ\÷ /ø~óñ3ÏØ››h±Ñd¼|år0œšžnhlà ø”#B±ðLÖ™ƒ‡ž©ýæ7E?n®­¡•l»îvÝèø(=¦V0š:ƒŽ¾,-+½ø÷‹B±°êfUÖÙ¬H4òæ›o&—Éò³Ùg©E(/¨þx÷ãsÿ÷üV­11¦ÓY§OežZmFf†\%_?ð t41Šò€BøH˜,¥^jtª4VÉ–¤zPYD “@nàSmÈ|…IHGèøVG}fÃò0X ñ‘ïCl`¬Ï.*+Êe%IÕ·*½C4¶ÑâJ©¤Ð < „>RyôЏ2Hg“)-Â"õ ã6¬ÿ¿-:³NgÒѽ<ÜÞAöÇûåj¹Ñj\óÝAy@!Üuzrµ¬“ß¡2IÌn­Å£Û*¼§‹ßÉ8™Õ/Çd3É5ò?i1Ø?04°ŒDcQ›Ë&SË,vËšïÊBá.Ôâ°e6·­­«eÇØÍêâs´&íš×bsÛè ÝÅåj9%ÈP-§ÝJÕR½Eo÷Ø×¼”„ÂÝ©ÕÉÐOcÔì—>1Ì´þVíXгÝl´ ŒaGH[¥øÛðµ < „B˜:QB!L(!„¦N”„BS'ÊB!„©óŸ^4—¦? ° Ê©ã +±±1¯×«Ñhºººjjj OŸ>––ö"À2ÔTÔ T Ô TÔT[.D" …Ìf³H$jmm­¬¬,(( Ñ‡–¡6 B N Z f r ~ ŠØryLNNF£Q‡ÃAñÂãñZZZh(M6À2ÔTÔ T Ô TÔT[.éééx<î÷û†Q*•4ŽZ¦¦¦¦`j*êªj*ꪈ-—ÇìììØØe‹×ë¥AT1"‘¨«««`j*êªj*ꪈ-—Çüüüäääðð0 ~q8f³™æJ–¡6 B N Z f r ~ ŠØry,,,P°ÐÉT.ñxœf…B!jÀ2ÔTÔ T Ô TÔT[.û÷ïÓiÔ,tþôô4 J$4q`j*êªj*ꪈ-—À?”RÊ©å€Ôò@ê@y u <:PH(¤”RÊ©å€Ôñ˜¡»m–æ@IEND®B`‚buzztard-0.6.0/docs/help/bt-edit/C/legal.xml0000644042355400116100000000713011576360400015514 00000000000000 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. buzztard-0.6.0/docs/help/bt-edit/C/Makefile.in0000644042355400116100000006660511675570633016002 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # # No modifications of this Makefile should be necessary. # # To use this template: # 1) Define: figdir, docname, lang, omffile, and entities in # your Makefile.am file for each document directory, # although figdir, omffile, and entities may be empty # 2) Make sure the Makefile in (1) also includes # "include $(top_srcdir)/xmldocs.make" and # "dist-hook: app-dist-hook". # 3) Optionally define 'entities' to hold xml entities which # you would also like installed # 4) Figures must go under $(figdir)/ and be in PNG format # 5) You should only have one document per directory # 6) Note that the figure directory, $(figdir)/, should not have its # own Makefile since this Makefile installs those figures. # # example Makefile.am: # figdir = figures # docname = scrollkeeper-manual # lang = C # omffile=scrollkeeper-manual-C.omf # entities = fdl.xml # include $(top_srcdir)/xmldocs.make # dist-hook: app-dist-hook # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # # No modifications of this Makefile should be necessary. # # This file contains the build instructions for installing OMF files. It is # generally called from the makefiles for particular formats of documentation. # # Note that you must configure your package with --localstatedir=/var/lib # so that the scrollkeeper-update command below will update the database # in the standard scrollkeeper directory. # # If it is impossible to configure with --localstatedir=/var/lib, then # modify the definition of scrollkeeper_localstate_dir so that # it points to the correct location. Note that you must still use # $(localstatedir) in this or when people build RPMs it will update # the real database on their system instead of the one under RPM_BUILD_ROOT. # # Note: This make file is not incorporated into xmldocs.make because, in # general, there will be other documents install besides XML documents # and the makefiles for these formats should also include this file. # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # VPATH = @srcdir@ 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@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/buzztard-edit-C.omf.in $(top_srcdir)/omf.make \ $(top_srcdir)/xmldocs.make @ENABLE_SCROLLKEEPER_TRUE@am__append_1 = *.out subdir = docs/help/bt-edit/C ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = buzztard-edit-C.omf CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ # ************* Begin of section some packagers may need to modify ************** # This variable (docdir) specifies where the documents should be installed. # This default value should work for most packages. # docdir = $(datadir)/@PACKAGE@/doc/$(docname)/$(lang) docdir = $(datadir)/gnome/help/$(docname)/$(lang) 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ figdir = figures docname = buzztard-edit lang = C omffile = buzztard-edit-C.omf entities = legal.xml version.entities # ************** You should not have to edit below this line ******************* xml_files = $(entities) $(docname).xml EXTRA_DIST = $(xml_files) $(omffile) CLEANFILES = omf_timestamp $(am__append_1) @ENABLE_SCROLLKEEPER_TRUE@omf_dest_dir = $(datadir)/omf/$(docname) @ENABLE_SCROLLKEEPER_TRUE@scrollkeeper_localstate_dir = $(localstatedir)/scrollkeeper all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_srcdir)/xmldocs.make $(top_srcdir)/omf.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/help/bt-edit/C/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/help/bt-edit/C/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): buzztard-edit-C.omf: $(top_builddir)/config.status $(srcdir)/buzztard-edit-C.omf.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(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 check: check-am 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." @ENABLE_SCROLLKEEPER_FALSE@uninstall-local: @ENABLE_SCROLLKEEPER_FALSE@install-data-local: @ENABLE_SCROLLKEEPER_FALSE@install-data-hook: 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 dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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: uninstall-local .MAKE: install-am install-data-am install-strip .PHONY: all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local dist-hook distclean \ distclean-generic distclean-libtool distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-hook 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 \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-local all-local: @-chmod -R u+w $(srcdir) @cp $(top_builddir)/docs/version.entities $(srcdir)/version.entities clean-local: -@rm -f version.entities @ENABLE_SCROLLKEEPER_TRUE@omf: omf_timestamp @ENABLE_SCROLLKEEPER_TRUE@omf_timestamp: $(omffile) @ENABLE_SCROLLKEEPER_TRUE@ -for file in $(omffile); do \ @ENABLE_SCROLLKEEPER_TRUE@ scrollkeeper-preinstall $(docdir)/$(docname).xml $$file $$file.out; \ @ENABLE_SCROLLKEEPER_TRUE@ done @ENABLE_SCROLLKEEPER_TRUE@ touch omf_timestamp @ENABLE_SCROLLKEEPER_TRUE@install-data-hook-omf: @ENABLE_SCROLLKEEPER_TRUE@ $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir) @ENABLE_SCROLLKEEPER_TRUE@ for file in $(omffile); do \ @ENABLE_SCROLLKEEPER_TRUE@ $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \ @ENABLE_SCROLLKEEPER_TRUE@ done @ENABLE_SCROLLKEEPER_TRUE@ -scrollkeeper-update -p $(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir) @ENABLE_SCROLLKEEPER_TRUE@uninstall-local-omf: @ENABLE_SCROLLKEEPER_TRUE@ -for file in $(srcdir)/*.omf; do \ @ENABLE_SCROLLKEEPER_TRUE@ basefile=`basename $$file`; \ @ENABLE_SCROLLKEEPER_TRUE@ rm -f $(DESTDIR)$(omf_dest_dir)/$$basefile; \ @ENABLE_SCROLLKEEPER_TRUE@ done @ENABLE_SCROLLKEEPER_TRUE@ -rmdir $(DESTDIR)$(omf_dest_dir) @ENABLE_SCROLLKEEPER_TRUE@ -scrollkeeper-update -p $(scrollkeeper_localstate_dir) # If the following file is in a subdir (like help/) you need to add that to the path @ENABLE_SCROLLKEEPER_TRUE@all: omf @ENABLE_SCROLLKEEPER_TRUE@$(docname).xml: $(entities) app-dist-hook: if test "$(figdir)"; then \ $(mkinstalldirs) $(distdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \ done \ fi @ENABLE_SCROLLKEEPER_TRUE@install-data-local: omf @ENABLE_SCROLLKEEPER_TRUE@ $(mkinstalldirs) $(DESTDIR)$(docdir) @ENABLE_SCROLLKEEPER_TRUE@ for file in $(xml_files); do \ @ENABLE_SCROLLKEEPER_TRUE@ cp $(srcdir)/$$file $(DESTDIR)$(docdir); \ @ENABLE_SCROLLKEEPER_TRUE@ done @ENABLE_SCROLLKEEPER_TRUE@ if test "$(figdir)"; then \ @ENABLE_SCROLLKEEPER_TRUE@ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \ @ENABLE_SCROLLKEEPER_TRUE@ for file in $(srcdir)/$(figdir)/*.png; do \ @ENABLE_SCROLLKEEPER_TRUE@ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ @ENABLE_SCROLLKEEPER_TRUE@ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ @ENABLE_SCROLLKEEPER_TRUE@ done \ @ENABLE_SCROLLKEEPER_TRUE@ fi @ENABLE_SCROLLKEEPER_TRUE@install-data-hook: install-data-hook-omf @ENABLE_SCROLLKEEPER_TRUE@uninstall-local: uninstall-local-doc uninstall-local-omf @ENABLE_SCROLLKEEPER_TRUE@uninstall-local-doc: @ENABLE_SCROLLKEEPER_TRUE@ -if test "$(figdir)"; then \ @ENABLE_SCROLLKEEPER_TRUE@ for file in $(srcdir)/$(figdir)/*.png; do \ @ENABLE_SCROLLKEEPER_TRUE@ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ @ENABLE_SCROLLKEEPER_TRUE@ rm -f $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ @ENABLE_SCROLLKEEPER_TRUE@ done; \ @ENABLE_SCROLLKEEPER_TRUE@ rmdir $(DESTDIR)$(docdir)/$(figdir); \ @ENABLE_SCROLLKEEPER_TRUE@ fi @ENABLE_SCROLLKEEPER_TRUE@ -for file in $(xml_files); do \ @ENABLE_SCROLLKEEPER_TRUE@ rm -f $(DESTDIR)$(docdir)/$$file; \ @ENABLE_SCROLLKEEPER_TRUE@ done @ENABLE_SCROLLKEEPER_TRUE@ -rmdir $(DESTDIR)$(docdir) # FIXME: only do this if ENABLE_SCROLLKEEPER ? dist-hook: app-dist-hook # make a pdf using dblatex # - it seems unneccesarily hard to get our logo onto the titlepage # - we tried all sort of customizations ( -p dblatex_pdf.xsl ) buzztard-edit.pdf: buzztard-edit.xml dblatex_pdf.xsl dblatex \ -o buzztard-edit.pdf \ -I figures \ buzztard-edit.xml buzztard-edit.txt: buzztard-edit.xml xmlto txt buzztard-edit.xml buzztard-edit2.pdf: buzztard-edit.xml xsltproc \ --stringparam paper.type A4 \ --stringparam fop.extentions 1 \ --stringparam fop1.extentions 1 \ --stringparam admon.graphics 1 \ http://docbook.sourceforge.net/release/xsl/current/fo/fo.xsl \ buzztard-edit.xml >buzztard-edit.fo; \ fop -fo buzztard-edit.fo -pdf buzztard-edit.pdf # statistics for index building: # sed -e 's/[[:space:]]\+/\n/g' buzztard-edit.txt | sed 's/[,.\(\)"]//g' | egrep -v '^ *$' | sort -f | uniq -ic | sort -n # sed -e 's/[[:space:]]\+/\n/g' buzztard-edit.txt | sed 's/[,.\(\)"]//g' | egrep -v '^ *$' | egrep -v '^..?$' | sort -f | uniq -ic | sort -n # here we should # a) invoke xslproc, if available # stylesheet=/opt/gnome/share/sgml/docbook/yelp/docbook/html/docbook.xsl # xsltproc --nonet $(stylesheet) $(docname).xml # b) simple install pregenerated html (pdf) # this relies on particular names in the tests # it would be nicer to fix the names in the tests and apply some rule: # /tmp/check_buzzard_help_(*).png -> figures/\1.png # - here we would mark the images by having an additional "_help" in the name # - right now this is prgname + widget name + optinal extra name update_figures: if [ -e "/tmp/check_buzzard_main window.png" ]; then \ pngtopnm "/tmp/check_buzzard_main window.png" | ../../mk-shadow.sh | pnmtopng >figures/main-window.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_machine view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_machine view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-machine-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_pattern view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_pattern view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-pattern-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_sequence view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_sequence view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-sequence-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_song information.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_song information.png" | ../../mk-shadow.sh | pnmtopng >figures/page-info-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_wave table view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_wave table view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-wavetable-view.png; \ fi; \ \ if [ -e "/tmp/check_buzzard_pattern properties.png" ]; then \ pngtopnm "/tmp/check_buzzard_pattern properties.png" | ../../mk-shadow.sh | pnmtopng >figures/pattern-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_machine properties.png" ]; then \ pngtopnm "/tmp/check_buzzard_machine properties.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_machine preferences.png" ]; then \ pngtopnm "/tmp/check_buzzard_machine preferences.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-preferences.png; \ fi; \ if [ -e "/tmp/check_buzzard_rename machine.png" ]; then \ pngtopnm "/tmp/check_buzzard_rename machine.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-rename.png; \ fi; \ if [ -e "/tmp/check_buzzard_preset name and comment.png" ]; then \ pngtopnm "/tmp/check_buzzard_preset name and comment.png" | ../../mk-shadow.sh | pnmtopng >figures/preset-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_wire analysis.png" ]; then \ pngtopnm "/tmp/check_buzzard_wire analysis.png" | ../../mk-shadow.sh | pnmtopng >figures/signal-analysis.png; \ fi; \ if [ -e "/tmp/check_buzzard_BtAboutDialog.png" ]; then \ pngtopnm "/tmp/check_buzzard_BtAboutDialog.png" | ../../mk-shadow.sh | pnmtopng >figures/about.png; \ fi; \ if [ -e "/tmp/check_buzzard_Tip of the day.png" ]; then \ pngtopnm "/tmp/check_buzzard_Tip of the day.png" | ../../mk-shadow.sh | pnmtopng >figures/tip.png; \ fi; \ if [ -e "/tmp/check_buzzard_song rendering.png" ]; then \ pngtopnm "/tmp/check_buzzard_song rendering.png" | ../../mk-shadow.sh | pnmtopng >figures/recording-settings.png; \ fi; \ if [ -e "/tmp/check_buzzard_song render progress.png" ]; then \ pngtopnm "/tmp/check_buzzard_song render progress.png" | ../../mk-shadow.sh | pnmtopng >figures/recording-progress.png; \ fi; \ if [ -e "/tmp/check_buzzard_Missing elements in song.png" ]; then \ pngtopnm "/tmp/check_buzzard_Missing elements in song.png" | ../../mk-shadow.sh | pnmtopng >figures/missing-song-elements.png; \ fi; \ if [ -e "/tmp/check_buzzard_Missing GStreamer elements.png" ]; then \ pngtopnm "/tmp/check_buzzard_Missing GStreamer elements.png" | ../../mk-shadow.sh | pnmtopng >figures/missing-gstreamer-elements.png; \ fi; \ if [ -e "/tmp/check_buzzard_Unsaved song recovery.png" ]; then \ pngtopnm "/tmp/check_buzzard_Unsaved song recovery.png" | ../../mk-shadow.sh | pnmtopng >figures/crash-recovery.png; \ fi; \ if [ -e "/tmp/check_buzzard_interaction controller learn.png" ]; then \ pngtopnm "/tmp/check_buzzard_interaction controller learn.png" | ../../mk-shadow.sh | pnmtopng >figures/interaction-controller-learn.png; \ fi; \ \ if [ -e "/tmp/check_buzzard_buzztard settings_audio devices.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_audio devices.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-audio.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_colors.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_colors.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-colors.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_directories.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_directories.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-directories.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_interaction controller.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_interaction controller.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-ic.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_playback controller.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_playback controller.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-pc.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_shortcuts.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_shortcuts.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-shortcuts.png; \ fi; # 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: buzztard-0.6.0/docs/help/bt-edit/C/buzztard-edit-C.omf.in0000644042355400116100000000223211576360400017764 00000000000000 buzztard-devel@lists.sourceforge.net (buzztard developer team) Buzztard Music Editor @BT_RELEASE_DATE@ User manual for the buzztard music editor user's guide buzztard-0.6.0/docs/help/bt-edit/C/version.entities0000644042355400116100000000026011673622374017147 00000000000000 buzztard-0.6.0/docs/help/bt-edit/C/aspell.pws0000644042355400116100000000061311634324735015726 00000000000000personal_ws-1.1 en 53 ctrl Ctrl ui ogg yqy ywyr wavetable multi usr pulseaudio timeline livesrc FIXME UPnP UIs wiki internet muxed audiosink gstreamer GStreamer FastTracker alsasrc alsa pc SoundTracker unselect pre plugins wav buzztard popup BML wiimotes overlayed vorbis simsyn prev buzzmachine Kost bmw bmx harddisk journaling bpm tooltips plugin unmute audiodelay statusbar xml bzt metadata buzztard-0.6.0/docs/help/bt-edit/C/buzztard-edit.xml0000644042355400116100000020465611665155573017250 00000000000000 %version-entities; ]>
&app; manual (&appversion;) &rel_year; Stefan Kost Buzztard Developer Team &legal; Stefan Kost Buzztard Developer team
buzztard-devel@lists.sourceforge.net
&app; manual (&appversion;) &rel_date; Buzztard Developer team buzztard-devel@lists.sourceforge.net This manual describes version &appversion; of &app;. Feedback To report a bug or make a suggestion regarding the &app; application or this manual, see the Buzztard website at http://www.buzztard.org.
&app; buzztard Introduction &app; is a music composer for the GNOME desktop. It partly follows the concepts of programs like SoundTracker, FastTracker and the like, but is based on a modern media engine (gstreamer). This engine supports virtual sound generators and effects in the form of numerous plugins. During the next section we describe the concept of the &app; and also compare it to similar applications. If you are familiar with some of those, the respective sections should help to understand the way &app; works. The main chapter of the help system is separated into these sections: The chapter is introducing &app; in a tutorial style. The later chapters have reference character, describing each view and dialog. The concept behind <application>&app;</application> &app; follows the concept of tracker applications. This is quite different when compared to other music composers. The tracker concept is more focused on the event data. There is no piano roll (at least not now). Instead song fragments (patterns) are shown in a tabular way containing events over time. The tabbed UI provides several linked views on a song: A machine view: virtual devices and how they are connected A pattern view: each virtual device has a list of event fragments A sequence view: a timeline where each track contains patterns that should be played at a given time for the machine of the track A wavetable view: collection of sample clips to be used as sound sources for some machines (optional) A metadata view: extra information about the song Important design criteria for &app; are: fast and desktop compliant ui keyboard shortcuts for everything total recall highly interactive protect the creative process (open song format, journaling) Comparison to <application>Buzz</application> &app; is inspired of lot by Buzz. Some features are still missing and some things already work better. The UI in is not a 1-to-1 copy, for Buzz users the UI will still look familiar. Highlights in &app;: can render songs to wav/mp3,ogg-vorbis/... including song-meta-data (tags) and multi track exports uses color-codes for machine-types through its ui generates cleaner machine UIs (collapsing parts, more distinct widgets) has a scalable machine view can use beats other that 4/4 shows volume and pan on wire does balance on stereo wires has analyzers and mixing controls in sequence view can have multiple wire-analyzers open can be remote controlled with UPnP A/V software supports HID input devices for effect control (e.g. joysticks) has unlimited undo/redo support does journaling and crash recovery ships with a plugin that enables GStreamer based media players to play buzztard songs current shortcomings in &app;: has only marginal MIDI support has no pattern recording yet does not support machine templates adding and removing machines while playing might still hang Comparison to Tracker applications While &app; has much in common with tracker applications, there are some notable differences. trackers are sample based, buzztard also uses software synthesizers trackers have a fixed track concept, buzztard uses tracks per machine (source/effect/sink) trackers do not have the virtual machine routing Getting started The below tutorials will introduce &app; by going though a few examples. Each example will introduce new features. Live Effects This tutorial demonstrates how to use &app; as a toy for live audio effects. Start the graphical editor 'buzztard-edit'. The first tab shows the machine view. Here you can create elements (sound generators and effects) and link them together. To create an element, right click on the background and select an element from the context menu. For the example choose alsasrc. Please note, that not all the elements in the list will work perfectly in a live situation right now. Also using livesrc and normal source does not work reliable right now. This will be address in a future versions of buzztard and gstreamer. In your sound card mixer you should enable recording from the microphone or provide some music on line-in. Next add audiodelay and equalizer-10band elements. Now wire them together by pointing on the source element (alsasrc) and dragging a wire to the target (audiodelay), while holding the shift-key pressed. The wire will become green when the mouse is over a valid target. Releasing the mouse creates the link. Repeat the procedure for audiodelay &rrar; equalizer and equalizer &rrar; master. The wires have a pointer shape in the middle, showing the direction. A left click onto it allows to change the volume of the link, a shift left-click the stereo panorama or balance and a right click shows a context menu for disconnecting the elements and for showing an "analyzer dialog". Open that one for the link between equalizer and master. Finally double click the equalizer and the audiodelay to open their real-time settings windows. Now you should see something like this: (FIXME: need screen shot) Now lets give it a try. Activate the loop in the toolbar and press play. Now you can tweak the settings of the effects while making some noise. The parameter-changes will be effective right away. In the "analyzer window" you can see the frequency spectrum of the sound and the volume level. Synthesized Melody Sequence This tutorial will introduce the sequencer functionality and explain patterns. Start the graphical editor 'buzztard-edit'. On the first tab - the machine view - add one simsyn. This is a very basic synthesizer. Also add an audiodelay and link simsyn &rrar; audiodelay &rrar; master. Now switch to the sequence view. Buzztard has automatically added a track for the simsyn. Also the song has a default length of 64 ticks (the time axis goes from top to bottom). The track will take patterns. Patterns are the actual building blocks of the score. Patterns are a block of control events, like triggering a note or changing a machine parameter. The right side shows existing pattern for the machine the cursor is in. Simsyn has one called '00'. Press '0' four times to fill the sequence track with this pattern. Buzztard will repeat the events there 4 times and stop. If you press play now, you won't hear anything yet, as we have not recorded any events into the pattern. Lets switch to the pattern editor. This can be done, by just pressing "Enter" in addition to using the tabs. The pattern editor shows a grid. Again the time goes from top to bottom. From left to right the editor shows parameter groups. This simple synthesizer has just one. More complex ones have a block with global parameters and one for each voice. Each column shows some info in the status bar when the cursor is in there. The first column is for entering notes. It works like it always worked in trackers - by using the computer keyboard. The two rows above the space key form one octave and the two rows above one octave above. The lower row is for while keys and the upper row for black keys, y/z &rrar; c, s &rrar; c#, x &rrar; d, d &rrar; d#, c &rrar; e, f unused, v &rrar; f and so on. Press Ctrl-2 to set cursor stepping to go down 2 rows on each edit and enter "yqy3ywyr". If you press play now, you should hear a simple melody. Sampled Sounds This tutorial explains how to work with sampled sound. The wave-table view contains a list that one can load audio clips into. Pick some samples from the file-chooser. If you don't have any sample collections, you can still find some samples for testing on your computer. Linux systems usually have some under /usr/share/sounds. Now switch to the machine view. In order to use samples we need to add a special generator that supports the wavetable functionality. Lets use "Generators/BML/Mathilde-Tracker". This machine is part of the ported buzzmachine package. Link the machine to the master as usual. Now switch to the pattern editor. There you can select the "default waveform" from the combo box in the toolbar. This waveform will be used when entering new notes. You will see the waveform number in the pattern as well, where you can edit it like all the other fields. The main window After starting the &app; Music Editor, you will see the main window. If you start the application without specifying an initial file (as a parameter on the command line or by double clicking a song in Nautilus), the window will look like this.
&app; window Shows &app; main window with menu bar, toolbars, editor views and status area.
On the very top of the window is the menu bar. Below one finds the toolbar. And below again are tabs to switch between various views. Each view is for editing certain aspects of the song. On the bottom is a status bar. Many parts in the UI show tooltips with brief explanations. Hover the mouse pointer over the region and wait a moment. The UI uses context menus in several places. Press right mouse button to get the menu. The menu offer crucial functionally not available elsewhere right now. The menu bar main menu The menu bar gives you access to file operations, standard editing function, settings and help. The File menu allows to start a new song, load and save songs, as well as end the program. Songs need other resources in order to be played. These are the sound-generators and effects that are used and eventually digital audio-samples. When loading a song &app; checks if all needed resources are available and if not lists them in one dialog. &app; loads and saves songs in an own format is either a single xml file or a compressed zip file (.bzt) containing the xml file and external files (samples). &app; supports plugins to load and save files in different formats. As of now an importer for buzz-songs (.bmx and .bmw) exists. The Edit menu contains clipboard functions and invocation of . The View menu offers customization for the shown UI elements. It also contains shortcuts to the different song-views. The tool bar main toolbar changing the volume In contrast to the menu bar the tool bar only shows common operations as shortcuts. On the right end the toolbar shows a volume-meter for each audio-channel and a volume control for the whole song. The song views Each part of a song is represented by a specialized view which one can switch to with the tabs. Next we briefly introduce each tab, where in the next sub section they will be described in detail. The machine view of a song creating machines linking machines A song utilizes sound generators, effects and sinks - all called machines. A new machine can be added from the context menu that appear on a right click in the page area. Machines can be moved around by grabbing them with the mouse and dragging them around. To connect machines, move the pointer over the source, press shift+left mouse-button and drag the wire to the target machine. The wire turns green, if the connection can be made. Fully connected machines are shown in bright color and disconnected ones in a desaturated style. Alternatively you can select "connect machines" from the right-click context menu of a machine. Again you need to move the mouse to the target machine and click it.
Machine view The songs machine view.
changing the volume changing the stereo panorama Wires have volume and panorama control support. A left-click on the pointer-shape in the middle of the wire open a volume popup. A click outside closes it again. Shift+left-click opens the panorama control. Only stereo links have a panorama control. For mono-to-stereo links it acts as a panorama for stereo-to-stereo link it acts as a stereo-balance. Machines and wires have context menus. The menu for the wire can be accessed by right clicking over the pointer shape in the middle. A double click on a machine brings up the .
The pattern view of a song Patterns are the building blocks of a song. They are short snippets of events for one machine, that can be reused in the sequence. The vertical axis shows ticks (time) and the horizontal axis has the parameters. Parameters are organized in groups. There is a group for global settings and groups for each voice if the machine is polyphonic. If the pattern is for an effect or sink (master), then the pattern has a group for each incoming wire. There one can change volume and panning/balance (if applicable).
Pattern view The songs pattern view.
In the page toolbar one can select the machine and the pattern for the machine. Pattern names in gray color indicated that the pattern is not used in the sequence (thus are save to be removed or changed). One can also select the base octave for entering notes via keyboard and the sample that should be used for wave-table based machines. Those combo boxes work when entering new notes, for existing notes one can just edit the respective columns in the pattern. A context menu in the pattern area allows to create new patterns and modify existing ones. Unused patterns can be removed immediately (without any dialogs). If the machine is polyphonic, one can add or remove voices by using the context menu. When moving the cursor around one can see the parameter name and value range in the statusbar. To enter notes, imagine your pc keyboard as a music keyboard in two rows. Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on. The next octave starts on the upper part of the keyboard with q being mapped to a 'c' again. Below are tables listing all keyboard shortcuts. Pattern navigation keyboard shortcutspattern view shortcuts command shortcut description move cursor arrows moves the cursor one position next group tab moves the cursor to the next group (wire, global, voices) prev group shifttab moves the cursor to the previous group (wire, global, voices) move page page up/down moves the cursor 16 rows up or down jump cursor home/end moves the cursor to first/last field in group, then first/last group, then first/last row select area shiftarrows set and enlarge/shrink the selection begin selection ctrlb sets the upper row of the selection and changes selection mode into one of column, group, full-pattern (press multiple times) relative to the cursor end selection ctrle sets the lower row of the selection and changes selection mode into one of column, group, full-pattern (press multiple times) relative to the cursor select column ctrll select the full column the cursor is in select group ctrlk select the full group the cursor is in select all ctrla select the full pattern unselect ctrlu remove the selection (leaves the data intact) stepping ctrl1...9 set how many lines the cursor goes down when editing
Pattern editing keyboard shortcutspattern view shortcuts command shortcut description enter notes s d g h j y/z x c v b n m notes from the base octave enter notes 2 3 5 6 7 q w e r t z/y u notes from one octave above the base octave enter notes 9 0 i o p notes from two octaves above the base octave note off 1 turns a playing note off clear value . (period) clears the field under the cursor delete column delete deletes the row at the cursor for the current column (move entries below up) insert column insert insert a black row at the cursor for the current column (move entries below down) delete group shiftdelete deletes the row at the cursor for the current group (move entries below up) insert group shiftinsert insert a black row at the cursor for the current group (move entries below down) delete full row ctrlshiftdelete deletes the row at the cursor for the whole pattern (move entries below up) insert full row ctrlshiftinsert insert a black row at the cursor for the whole pattern (move entries below down) flip ctrlf turns the values in the selected range upside down interpolate ctrli enters values into the selected range that linearly blend from the start to the end value randomize ctrlr enters random values into the selected range
Pattern action keyboard shortcutspattern view shortcuts command shortcut description sequence editor return go to sequence editor select machine ctrlup,down (arrow) select current machine select pattern +,- (keypad) select current pattern select wave <,> select current wave switch base octave *,/ (keypad) lower/raise the base octave
A list of keyboard shortcuts can also be seen on the wiki.
The sequence view of a song A song consists of several tracks (columns), where in each track patterns are played. There can be several tracks for the same machine. The rows are time slots. The labels can show the time in different formats such as ticks and time.
Sequence view The songs sequence view.
The sequence header for each track shows the name of the machine, mute, solo. bypass buttons (depending whether it is a generator, effect or sink) and a level-meter. The sequence header for the label column offers shortcuts to jump to the selected label. The header for the position column contain a selector for the preferred position format. The context menu allows to add or remove tracks, move tracks left or right and open the machine properties/ preferences for the current track. For new generators a track is added automatically. One can navigate around using cursor keys. When changing tracks, the list of patterns on the right is updated to show the patterns for the current machine. Again gray pattern label color indicates that the pattern is not in use. Patterns can be entered into tracks by pressing the associated key (shown left to the pattern name in the list). A new pattern always interrupts a previous one, that is if there is a 32 tick long pattern '00' at row 0 and and a pattern '01' at row 16, then only the first 16 ticks of pattern '00' will be played. In addition patterns further to the right shadow patterns to the left (only the filled parameters are overlayed). Why is that useful? One can have multiple tracks for the same machine and then on-the-fly combine patterns. To give an example, for a synthesizer one can have patterns with the melodies and patterns with filter sweeps. Then one can use the filter sweep patterns with the melody patterns. The pattern list always contains a few special patterns. Depending on the machine type, there are break, mute, solo, bypass. Special patternsspecial patterns pattern machine type description break all stop the pattern above, can be used to reuse a long pattern and cut it off at some point and to undo the special patterns below mute all silence the output, this is similar to break, but would cut-off any sound immediately, use a break pattern to unmute bypass effects stop applying the effect, use a break pattern to enable again solo generators play only this generator, use a break pattern to enable the other generators again
The cursor can move beyond the end of the pattern. The pattern gets automatically expanded when entering a pattern beyond the current end of the song. This works the same way for the label column on the left. There descriptive labels for easier song-navigation can be entered as text upon pressing enter. To expand the sequence, scroll down with the cursor and press Ctrle to set the end-line. If the cursor is above the end-line, pressing Ctrle will set the loop-end marker. When the cursor is on the loop-end marker Ctrle will shorten the sequence. To set the loop-begin marker press Ctrlb. To set play position click with left-mouse button in the first column at the desired time location. To modify the loop start/end instead hold down the Ctrl or Win (Mod) key while clicking. It is also possible to insert and delete full rows or just entries in a track. The shortcuts for this are Ctrli to insert a full row and Ctrld to remove a full row. To only insert or remove inside the current track hold the Shift key in addition. Sequence navigation keyboard shortcutssequence view shortcuts command shortcut description move cursor arrows moves the cursor one position move page page up/down moves the cursor a screen-page up or down jump cursor home/end moves the cursor to first/last row set loop start ctrlb sets the begin of the loop region set loop/song end ctrle sets the end of the loop region or end of song (press again) select area shiftarrows set and enlarge/shrink the selection
Sequence editing keyboard shortcutssequence view shortcuts command shortcut description clear value . (period) clears the pattern under the cursor delete track delete deletes the row at the cursor for the current track (move entries below up) insert track insert insert a black row at the cursor for the current track (move entries below down) delete full row shiftdelete deletes the row at the cursor for the whole sequence (move entries below up) insert full row shiftinsert insert a black row at the cursor for the whole sequence (move entries below down)
Sequence action keyboard shortcutssequence view shortcuts command shortcut description pattern editor return go to sequence editor
A full list of keyboard shortcuts can also be seen on the wiki.
The wavetable view of a song The wavetable hold sampled audio snippet that can be used e.g. from special sound generators (tracker sources). Those can be short instrument samples, but also full length songs.
Wave-table view The songs wave-table view.
The left column is the wavetable. Samples are loaded by double clicking them in the right side file-browser. The toolbar above the browser allows to pre-listen before loading. Waves in the table can also be played, renamed and removed. Each wavetable entry can have multiple wave levels, which are shown below the wavetable for the selected wave. Some of the details are editable. Right to the wave level list is a waveform preview widget. It shows loop markers and a playback position indicator. Samples can be found on the internet, brought from companies offering sample collections (as CD/DVD sets) or recorded yourself.
The information view of a song This page allows you to change song parameters, such as speed and timing resolutions and to enter information about the song. The meta data will be used for the tags when creating a final mix-down. The tags show up in your desktop media player or portable media player. While the fields are not mandatory, it is a good idea to fill them.
Info view The songs info view.
The "beats per minute", "beats" and "ticks per beat" parameters control the timing and measure of the song. "Beats per minute" is the classic "bpm" speed of the song. "beats" determines the beats per measure and "ticks per beat" the granularity. If you like to use quarter notes, "ticks per beats" need to be 4. Thus a straight four to the floor has beats=4 and ticks-per-beat=4. A waltz would use beats=3 and ticks-per-beat=4.
The status bar The status bar that is located at the bottom of the window. On the left side it shows the status of longer operations like saving and loading with a text message. It also shows some extra detail in some song views. On the right side, it displays the length of the song, the loop range, the playback position and the current CPU usage.
Dialog windows main menu There are various dialogs that are invoked from the main-menu or from context menus. The settings window This window contains all settings for the &app; application. All settings are grouped into categories that can be chosen from the list on the left side.
Settings dialog Settings dialog.
Audio device settings Select the audiosink to use. It will be changed immediately, except when a song is playing (will be switched after stopping).
Audio device settings Audio device settings.
All offered audio sinks should be fine for song-playback. One area where they differ is latency. Low latency is important when playing machines live - that is playing notes in the pattern editor or changing parameters in the machine window. The lower the latency, the more immediate the changes are. Jack is known for being able to achieve a low latency, but also a well configured alsa or pulseaudio can achieve a reasonable latency. (FIXME: write more)
Playback controller settings UPnP A/V remote control via Coherence. (FIXME: explain)
Playback controller settings Playback controller settings.
Interaction controller settings Interactive controller for machine parameters. There are actually no settings here right now. It just shows the available devices. (FIXME: no settings yet)
Interaction controller settings Interaction controller settings.
Color settings (FIXME: no theme settings yet)
Colors settings Colors settings.
Shortcut settings (FIXME: no shortcut settings yet)
Shortcut settings Shortcut settings.
Directory settings Configure default directories used for various file types.
Directory settings Directory settings.
Machine properties dialog Context menus on machine, pattern and sequence page allow to open this property view for the current machine. The main area of the dialog is covered by the parameters of the machine. These parameter control the generated audio or the effects. If parameters are controlled by patterns, the ui will reflect the changes as the music plays. Parameters are grouped. There is one group for global parameters and one for each voice (for polyphonic machines). Effects and the master also have a group for each input allowing to change volume and panorama. These are the same parameters that can be changed on the wire in the machine view. Each parameter has a context menu. The menu allows to bind the parameter to a hardware controller and unbind it. If a parameter is bound, the changes on the hardware controller will effect the parameter. &app; supports hid (e.g joysticks, wiimotes, harddisk accelerometers) and midi devices. At the top of the dialog is a small toolbar. One button allows to show or hide the right side preset pane. Most machines support presets. Presets are a collection of parameter sets. Other buttons on the toolbar show information about the machine, the help, reset or randomize parameters.
Machine properties dialog Machine properties dialog.
Several such dialogs can be opened and the status is saved with the song.
Machine preferences dialog Machine preferences are settings that are configured for the whole song. These settings cannot be changed over time. Context menus on machine, pattern and sequence page allow to open this dialog. Warning Right now this might also contain some low-level settings, where changing them could break playback.
Machine preferences dialog Machine preferences dialog.
Machine rename dialog Allows renaming a machine. The dialog ensures that the new name is unique in the song.
Machine rename dialog Machine rename dialog.
Preset properties dialog Allows renaming a preset and adding comments for them. The dialog ensures that the new name is unique among the presets of a machine.
Preset properties dialog Preset properties dialog.
Signal analysis dialog The context menu on wires and the master machine allow to attach live signal analyzers to the song. This dialog shows the volume meters and a spectrogram for the wire or the master. There are a few settings to change the visualization of the spectrogram. Several such dialogs can be opened and the status is saved with the song.
Signal analysis dialog Signal analysis dialog.
Pattern properties dialog Allows renaming a pattern as well as changing its length or the number of voices (for polyphonic machines). The dialog ensures that the new name is unique among the patterns of a machine.
Pattern properties dialog Pattern properties dialog.
Song recording dialog &app; can render a song as a mix-down or a series of files per generator. The mix-down is ideal to share or publish the song. In both cases the recordings can be encoded and muxed in several formats.
Song recording settings dialog Song recording settings dialog.
Song recording progress dialog Song recording progress dialog.
About dialog This dialog shows a short info about the application, the license it is released under and gives credits to the contributors.
About dialog About dialog.
Tip-of-the-day dialog If the tip-of-the-day feature is enabled in the help menu this dialog is shown each time after starting the application. It will highlight special features that one might otherwise miss.
Tip-of-the-day dialog Tip-of-the-day dialog.
Missing song elements dialog Songs have external dependencies, such as the machines (generators and effects) and sampled waveforms. In some song formats (e.g. .bzt) the waveforms are part of the song file, in others (e.g. .xml) only the path to the waveform file is stored. If loading a file detects that some dependencies are missing, &app; will gather them and present them in one dialog. To solve the problem one needs to install the missing machines or put the external waveforms back to the original place. It would be desirable to have some repair feature in &app; to support fixing the song.
Missing song elements dialog Missing song elements dialog.
Crash recovery dialog When editing a song &app; is writing a detailed change log to disk. In the case of a application, system or computer failure it is possible to replay the changes on top of the last saved copy to get back to the state before failure. When starting &app; it will check for such logs and if some are found present this dialog. Now one can choose to restore the changes or delete them. The dialog is also available from the file menu.
Crash recovery dialog Crash recovery dialog.
Reference This chapter contains a few useful lists for reference. Keyboard shortcuts A complete list of keyboard shortcuts is listed on the buzztard wiki. Each of has a table describing the local keyboard shortcuts. Index
buzztard-0.6.0/docs/help/bt-edit/C/Makefile.am0000644042355400116100000001616411576360400015751 00000000000000figdir = figures docname = buzztard-edit lang = C omffile = buzztard-edit-C.omf entities = legal.xml version.entities all-local: @-chmod -R u+w $(srcdir) @cp $(top_builddir)/docs/version.entities $(srcdir)/version.entities clean-local: -@rm -f version.entities # FIXME: only do this if ENABLE_SCROLLKEEPER ? include $(top_srcdir)/xmldocs.make dist-hook: app-dist-hook # make a pdf using dblatex # - it seems unneccesarily hard to get our logo onto the titlepage # - we tried all sort of customizations ( -p dblatex_pdf.xsl ) buzztard-edit.pdf: buzztard-edit.xml dblatex_pdf.xsl dblatex \ -o buzztard-edit.pdf \ -I figures \ buzztard-edit.xml buzztard-edit.txt: buzztard-edit.xml xmlto txt buzztard-edit.xml buzztard-edit2.pdf: buzztard-edit.xml xsltproc \ --stringparam paper.type A4 \ --stringparam fop.extentions 1 \ --stringparam fop1.extentions 1 \ --stringparam admon.graphics 1 \ http://docbook.sourceforge.net/release/xsl/current/fo/fo.xsl \ buzztard-edit.xml >buzztard-edit.fo; \ fop -fo buzztard-edit.fo -pdf buzztard-edit.pdf # statistics for index building: # sed -e 's/[[:space:]]\+/\n/g' buzztard-edit.txt | sed 's/[,.\(\)"]//g' | egrep -v '^ *$' | sort -f | uniq -ic | sort -n # sed -e 's/[[:space:]]\+/\n/g' buzztard-edit.txt | sed 's/[,.\(\)"]//g' | egrep -v '^ *$' | egrep -v '^..?$' | sort -f | uniq -ic | sort -n # here we should # a) invoke xslproc, if available # stylesheet=/opt/gnome/share/sgml/docbook/yelp/docbook/html/docbook.xsl # xsltproc --nonet $(stylesheet) $(docname).xml # b) simple install pregenerated html (pdf) # this relies on particular names in the tests # it would be nicer to fix the names in the tests and apply some rule: # /tmp/check_buzzard_help_(*).png -> figures/\1.png # - here we would mark the images by having an additional "_help" in the name # - right now this is prgname + widget name + optinal extra name update_figures: if [ -e "/tmp/check_buzzard_main window.png" ]; then \ pngtopnm "/tmp/check_buzzard_main window.png" | ../../mk-shadow.sh | pnmtopng >figures/main-window.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_machine view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_machine view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-machine-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_pattern view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_pattern view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-pattern-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_sequence view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_sequence view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-sequence-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_song information.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_song information.png" | ../../mk-shadow.sh | pnmtopng >figures/page-info-view.png; \ fi; \ if [ -e "/tmp/check_buzzard_song views_wave table view.png" ]; then \ pngtopnm "/tmp/check_buzzard_song views_wave table view.png" | ../../mk-shadow.sh | pnmtopng >figures/page-wavetable-view.png; \ fi; \ \ if [ -e "/tmp/check_buzzard_pattern properties.png" ]; then \ pngtopnm "/tmp/check_buzzard_pattern properties.png" | ../../mk-shadow.sh | pnmtopng >figures/pattern-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_machine properties.png" ]; then \ pngtopnm "/tmp/check_buzzard_machine properties.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_machine preferences.png" ]; then \ pngtopnm "/tmp/check_buzzard_machine preferences.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-preferences.png; \ fi; \ if [ -e "/tmp/check_buzzard_rename machine.png" ]; then \ pngtopnm "/tmp/check_buzzard_rename machine.png" | ../../mk-shadow.sh | pnmtopng >figures/machine-rename.png; \ fi; \ if [ -e "/tmp/check_buzzard_preset name and comment.png" ]; then \ pngtopnm "/tmp/check_buzzard_preset name and comment.png" | ../../mk-shadow.sh | pnmtopng >figures/preset-properties.png; \ fi; \ if [ -e "/tmp/check_buzzard_wire analysis.png" ]; then \ pngtopnm "/tmp/check_buzzard_wire analysis.png" | ../../mk-shadow.sh | pnmtopng >figures/signal-analysis.png; \ fi; \ if [ -e "/tmp/check_buzzard_BtAboutDialog.png" ]; then \ pngtopnm "/tmp/check_buzzard_BtAboutDialog.png" | ../../mk-shadow.sh | pnmtopng >figures/about.png; \ fi; \ if [ -e "/tmp/check_buzzard_Tip of the day.png" ]; then \ pngtopnm "/tmp/check_buzzard_Tip of the day.png" | ../../mk-shadow.sh | pnmtopng >figures/tip.png; \ fi; \ if [ -e "/tmp/check_buzzard_song rendering.png" ]; then \ pngtopnm "/tmp/check_buzzard_song rendering.png" | ../../mk-shadow.sh | pnmtopng >figures/recording-settings.png; \ fi; \ if [ -e "/tmp/check_buzzard_song render progress.png" ]; then \ pngtopnm "/tmp/check_buzzard_song render progress.png" | ../../mk-shadow.sh | pnmtopng >figures/recording-progress.png; \ fi; \ if [ -e "/tmp/check_buzzard_Missing elements in song.png" ]; then \ pngtopnm "/tmp/check_buzzard_Missing elements in song.png" | ../../mk-shadow.sh | pnmtopng >figures/missing-song-elements.png; \ fi; \ if [ -e "/tmp/check_buzzard_Missing GStreamer elements.png" ]; then \ pngtopnm "/tmp/check_buzzard_Missing GStreamer elements.png" | ../../mk-shadow.sh | pnmtopng >figures/missing-gstreamer-elements.png; \ fi; \ if [ -e "/tmp/check_buzzard_Unsaved song recovery.png" ]; then \ pngtopnm "/tmp/check_buzzard_Unsaved song recovery.png" | ../../mk-shadow.sh | pnmtopng >figures/crash-recovery.png; \ fi; \ if [ -e "/tmp/check_buzzard_interaction controller learn.png" ]; then \ pngtopnm "/tmp/check_buzzard_interaction controller learn.png" | ../../mk-shadow.sh | pnmtopng >figures/interaction-controller-learn.png; \ fi; \ \ if [ -e "/tmp/check_buzzard_buzztard settings_audio devices.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_audio devices.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-audio.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_colors.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_colors.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-colors.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_directories.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_directories.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-directories.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_interaction controller.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_interaction controller.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-ic.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_playback controller.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_playback controller.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-pc.png; \ fi; \ if [ -e "/tmp/check_buzzard_buzztard settings_shortcuts.png" ]; then \ pngtopnm "/tmp/check_buzzard_buzztard settings_shortcuts.png" | ../../mk-shadow.sh | pnmtopng >figures/settings-shortcuts.png; \ fi; ## add shadows (now integrated above) ## for PNG in *.png; do pngtopnm "$PNG" | ../../../mk-shadow.sh | pnmtopng > "${PNG//.png}"-with-shadow.png buzztard-0.6.0/docs/help/bt-edit/Makefile.am0000644042355400116100000000111711576360400015557 00000000000000SUBDIRS = C DOC_MODULE = buzztard-edit EXTRA_DIST = C/aspell.pws if WITH_ASPELL check-local: @echo "Spellchecking C/$(DOC_MODULE).xml..." @if test 0 -ne `cat $(srcdir)/C/$(DOC_MODULE).xml | aspell list --lang=en_US -p $(PWD)/$(srcdir)/C/aspell.pws --mode=sgml | wc -l`; then \ echo; \ echo "C/$(DOC_MODULE).xml doesn't pass spellchecking, please fix with" >&2; \ echo " aspell check --lang=en_US -p ./C/aspell.pws --mode=sgml C/$(DOC_MODULE).xml" >&2; \ echo; \ false; \ else \ echo " done"; \ fi else check-local: @echo "Aspell is needed for 'make check'" endif buzztard-0.6.0/docs/help/Makefile.am0000644042355400116100000000002211576360400014221 00000000000000SUBDIRS = bt-edit buzztard-0.6.0/docs/reference/0000755042355400116100000000000011675570700013267 500000000000000buzztard-0.6.0/docs/reference/README0000644042355400116100000000313211576360400014060 00000000000000$Id: README 1742 2008-04-16 06:30:00Z ensonic $ rebuild buzztard.types via find $(top_srcdir)/src -name "*.h" -exec grep -oe "bt_.*_get_type" {} \; | sort | uniq find missing classes find src/lib/core/libbtcore -name "*.h" -exec grep -oe "bt_.*_get_type" {} \; | sort | uniq | /usr/bin/diff -u - docs/reference/bt-core/bt-core.types using g_object based sub systems the XXX_init() function of the subsystem need to be added to SCANOBJ_OPTIONS in Makefile.am e.g.: (omit the trailing ';') SCANOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv);gtk_init(&argc,&argv)" what to document where c-language constructs (such as methods, structs, defines, enums, ...) inside source-code object properties extracted from g_param_spec signals inside source-code file long descriptions top of c-sources files to look into -docs.sgml defines the overall structure -sections.txt group symbols to sections add sections in alpahbetical order put internal entries into templ/*.sgml temporary files to make the hierarchy work if a documentation file entry (in the section file) is related to an object (e.g. BtSongInfo), it needs to be of the same name as the object, but all lowercase: BtSongInfo -> btsonginfo.sgml and the type of the object must be named "BtSongInfo" and not e.g. "BtSongInfoType" to force rebuilding the docs rm docs/reference/bt-*/*.stamp documentation guidelines Whenever a parameter can be NULL, document it. Default is that NULL is not acceptable for (pointer) parameters. buzztard-0.6.0/docs/reference/Makefile.in0000644042355400116100000005143211675570633015266 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = . bt-core bt-ic bt-cmd bt-edit all: all-recursive .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 docs/reference/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile all-local 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am all-local check check-am clean clean-generic \ clean-libtool clean-local ctags ctags-recursive distclean \ distclean-generic distclean-libtool distclean-tags 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 installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am # this is an ugly hack to help xsltproc finding the files # it won't be needed with gtk-doc 1.11 # keep the '.' in subdirs so that this is done first all-local: version.entities version.entities: @cp ../version.entities ./ clean-local: -@rm version.entities # 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: buzztard-0.6.0/docs/reference/bt-edit/0000755042355400116100000000000011675570704014623 500000000000000buzztard-0.6.0/docs/reference/bt-edit/html/0000755042355400116100000000000011675570704015567 500000000000000buzztard-0.6.0/docs/reference/bt-edit/html/api-index-0-6.html0000644042355400116100000000757511675570704020571 00000000000000 Index of new API in 0.6 buzztard-0.6.0/docs/reference/bt-edit/html/pt02.html0000644042355400116100000000367711675570704017177 00000000000000 Part IV. Appendix buzztard-0.6.0/docs/reference/bt-edit/html/BtWaveformViewer.html0000644042355400116100000002473111675570704021642 00000000000000 BtWaveformViewer

BtWaveformViewer

BtWaveformViewer — the waveform viewer widget

Synopsis

#include "bt-edit.h"

struct              BtWaveformViewer;
GtkWidget *         bt_waveform_viewer_new              ();
void                bt_waveform_viewer_set_wave         (BtWaveformViewer *self,
                                                         int16_t *data,
                                                         int channels,
                                                         int length);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----BtWaveformViewer

Implemented Interfaces

BtWaveformViewer implements AtkImplementorIface and GtkBuildable.

Properties

  "loop-begin"               gint64                : Write
  "loop-end"                 gint64                : Write
  "playback-cursor"          gint64                : Write
  "wave-length"              gint64                : Read

Description

Provides an viewer for audio waveforms.

Details

struct BtWaveformViewer

struct BtWaveformViewer;

waveform view widget


bt_waveform_viewer_new ()

GtkWidget *         bt_waveform_viewer_new              ();

Create a new waveform viewer widget. Use bt_waveform_viewer_set_wave() to pass wave data.

Returns :

the widget

bt_waveform_viewer_set_wave ()

void                bt_waveform_viewer_set_wave         (BtWaveformViewer *self,
                                                         int16_t *data,
                                                         int channels,
                                                         int length);

Set wave data to show in the widget.

self :

the widget

data :

memory block of samples (interleaved for channels>1)

channels :

number channels

length :

number samples per channel

Property Details

The "loop-begin" property

  "loop-begin"               gint64                : Write

First sample of the loop or -1 if there is no loop.

Allowed values: >= -1

Default value: -1


The "loop-end" property

  "loop-end"                 gint64                : Write

First sample after the loop or -1 if there is no loop.

Allowed values: >= -1

Default value: -1


The "playback-cursor" property

  "playback-cursor"          gint64                : Write

Current playback position within a waveform or -1 if sample is not played.

Allowed values: >= -1

Default value: -1


The "wave-length" property

  "wave-length"              gint64                : Read

The current waveform length.

Allowed values: >= 0

Default value: 0

buzztard-0.6.0/docs/reference/bt-edit/html/BtMemoryAudioSrc.html0000644042355400116100000001372511675570704021575 00000000000000 BtMemoryAudioSrc

BtMemoryAudioSrc

BtMemoryAudioSrc — play samples from memory

Synopsis

#include "bt-edit.h"

struct              BtMemoryAudioSrc;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBaseSrc
                     +----BtMemoryAudioSrc

Properties

  "caps"                     GstCaps*              : Read / Write
  "data"                     gpointer              : Read / Write
  "length"                   gulong                : Read / Write

Description

Gstreamer audio source to play samples from memory. Supports interleaved multi-channels audio. Supports trickmode playback (resampling and ping-pong loops).

Details

struct BtMemoryAudioSrc

struct BtMemoryAudioSrc;

audiotestsrc object structure.

Property Details

The "caps" property

  "caps"                     GstCaps*              : Read / Write

Data format of sample.


The "data" property

  "data"                     gpointer              : Read / Write

The sample data (interleaved for multi-channel).


The "length" property

  "length"                   gulong                : Read / Write

Length of the sample in number of samples.

Allowed values: <= G_MAXINT64

buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsPagePlaybackController.html0000644042355400116100000001347411675570704025004 00000000000000 BtSettingsPagePlaybackController

BtSettingsPagePlaybackController

BtSettingsPagePlaybackController — playback controller configuration settings page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTable
                                 +----BtSettingsPagePlaybackController

Implemented Interfaces

BtSettingsPagePlaybackController implements AtkImplementorIface and GtkBuildable.

Description

Lists available playback controllers and allows to configure them.

Details

struct BtSettingsPagePlaybackController

struct BtSettingsPagePlaybackController;

the root window for the editor application


bt_settings_page_playback_controller_new ()

BtSettingsPagePlaybackController * bt_settings_page_playback_controller_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtSequenceView.html0000644042355400116100000002053411675570704021272 00000000000000 BtSequenceView

BtSequenceView

BtSequenceView — the editor main sequence table view

Synopsis

#include "bt-edit.h"

struct              BtSequenceView;
BtSequenceView *    bt_sequence_view_new                (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTreeView
                                 +----BtSequenceView

Implemented Interfaces

BtSequenceView implements AtkImplementorIface and GtkBuildable.

Properties

  "loop-end"                 gdouble               : Write
  "loop-start"               gdouble               : Write
  "play-position"            gdouble               : Write
  "visible-rows"             gulong                : Write

Description

This widget derives from the GtkTreeView to additionaly draw loop- and play-position bars.

Details

struct BtSequenceView

struct BtSequenceView;

the sequence widget view


bt_sequence_view_new ()

BtSequenceView *    bt_sequence_view_new                (void);

Create a new instance

Returns :

the new instance

Property Details

The "loop-end" property

  "loop-end"                 gdouble               : Write

The end position of the loop range as a fraction.

Allowed values: [0,1]

Default value: 1


The "loop-start" property

  "loop-start"               gdouble               : Write

The start position of the loop range as a fraction.

Allowed values: [0,1]

Default value: 0


The "play-position" property

  "play-position"            gdouble               : Write

The current playing position as a fraction.

Allowed values: [0,1]

Default value: 0


The "visible-rows" property

  "visible-rows"             gulong                : Write

The number of currntly visible sequence rows.

buzztard-0.6.0/docs/reference/bt-edit/html/BtPatternListModel.html0000644042355400116100000002021611675570704022116 00000000000000 BtPatternListModel

BtPatternListModel

BtPatternListModel — data model class for widgets showing pattern of a song

Synopsis

#include "bt-edit.h"

struct              BtPatternListModel;
BtPattern *         bt_pattern_list_model_get_object    (BtPatternListModel *model,
                                                         GtkTreeIter *iter);
BtPatternListModel * bt_pattern_list_model_new          (BtMachine *machine,
                                                         BtSequence *sequence,
                                                         gboolean skip_internal);

Object Hierarchy

  GObject
   +----BtPatternListModel

Implemented Interfaces

BtPatternListModel implements GtkTreeModel.

Description

A generic model representing the patterns of a machine, suitable for combo-boxes and treeview widgets.

Details

struct BtPatternListModel

struct BtPatternListModel;

Data model for GtkTreeView or GtkComboBox.


bt_pattern_list_model_get_object ()

BtPattern *         bt_pattern_list_model_get_object    (BtPatternListModel *model,
                                                         GtkTreeIter *iter);

The the BtPattern for the iter.

model :

the model

iter :

the iter

bt_pattern_list_model_new ()

BtPatternListModel * bt_pattern_list_model_new          (BtMachine *machine,
                                                         BtSequence *sequence,
                                                         gboolean skip_internal);

Creates a list model of patterns for the machne. The model is automatically updated when patterns are added, removed or changed. The sequence is used to track the use of patterns.

machine :

the machine

sequence :

the sequence

skip_internal :

wheter to include internal patterns or not

Returns :

the pattern model.
buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPageWaves.html0000644042355400116100000001307511675570704021360 00000000000000 BtMainPageWaves

BtMainPageWaves

BtMainPageWaves — the editor wavetable page

Synopsis

#include "bt-edit.h"

struct              BtMainPageWaves;
BtMainPageWaves *   bt_main_page_waves_new              (const BtMainPages *pages);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkVBox
                                       +----BtMainPageWaves

Implemented Interfaces

BtMainPageWaves implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Description

Manage a list of audio clips files. Provides an embeded file browser to load files. A waveform viewer can show the selected clip.

Details

struct BtMainPageWaves

struct BtMainPageWaves;

the pattern page for the editor application


bt_main_page_waves_new ()

BtMainPageWaves *   bt_main_page_waves_new              (const BtMainPages *pages);

Create a new instance

pages :

the page collection

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtSignalAnalysisDialog.html0000644042355400116100000001625511675570704022735 00000000000000 BtSignalAnalysisDialog

BtSignalAnalysisDialog

BtSignalAnalysisDialog — audio analysis window

Synopsis

#include "bt-edit.h"

struct              BtSignalAnalysisDialog;
BtSignalAnalysisDialog * bt_signal_analysis_dialog_new  (const GstBin *element);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtSignalAnalysisDialog

Implemented Interfaces

BtSignalAnalysisDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "element"                  GstBin*               : Write / Construct Only

Description

The dialog shows a spectrum analyzer and level-meters for left/right channel. The spectrum analyzer support mono and stereo display. It has a few settings for logarithmic/linear mapping and precission.

Right now the analyser-section can be attached to a BtWire.

The dialog is not modal.

Details

struct BtSignalAnalysisDialog

struct BtSignalAnalysisDialog;

the root window for the editor application


bt_signal_analysis_dialog_new ()

BtSignalAnalysisDialog * bt_signal_analysis_dialog_new  (const GstBin *element);

Create a new instance

element :

the wire/machine object to create the dialog for

Returns :

the new instance or NULL in case of an error

Property Details

The "element" property

  "element"                  GstBin*               : Write / Construct Only

Set wire/machine object, the dialog handles.

buzztard-0.6.0/docs/reference/bt-edit/html/right.png0000644042355400116100000000073011675570704017332 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’òŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚buzztard-0.6.0/docs/reference/bt-edit/html/api-index.html0000644042355400116100000024216411675570704020264 00000000000000 API Index

API Index

A

BtAboutDialog, struct in BtAboutDialog
bt_about_dialog_new, function in BtAboutDialog
add_pixmap_directory, function in btedit

C

BtChangeLog, struct in BtChangeLog
BtChangeLog:can-redo, object property in BtChangeLog
BtChangeLog:can-undo, object property in BtChangeLog
BtChangeLog:crash-logs, object property in BtChangeLog
bt_change_logger_change, function in BtChangeLogger
bt_change_logger_match_method, function in BtChangeLogger
BT_CHANGE_LOGGER_METHOD, macro in BtChangeLogger
bt_change_log_add, function in BtChangeLog
bt_change_log_end_group, function in BtChangeLog
bt_change_log_is_active, function in BtChangeLog
bt_change_log_new, function in BtChangeLog
bt_change_log_recover, function in BtChangeLog
bt_change_log_redo, function in BtChangeLog
bt_change_log_register, function in BtChangeLog
bt_change_log_start_group, function in BtChangeLog
bt_change_log_undo, function in BtChangeLog
bt_crash_recover_dialog_new, function in BtCrashRecoverDialog

D

bt_dialog_message, function in BtMainWindow
bt_dialog_question, function in BtMainWindow

E

BtEditApplication, struct in BtEditApplication
BtEditApplication:ic-registry, object property in BtEditApplication
BtEditApplication:main-window, object property in BtEditApplication
BtEditApplication:song, object property in BtEditApplication
BtEditApplication:unsaved, object property in BtEditApplication
bt_edit_application_attach_child_window, function in BtEditApplication
bt_edit_application_crash_log_recover, function in BtEditApplication
bt_edit_application_is_song_unsaved, function in BtEditApplication
bt_edit_application_load_and_run, function in BtEditApplication
bt_edit_application_load_song, function in BtEditApplication
bt_edit_application_new, function in BtEditApplication
bt_edit_application_new_song, function in BtEditApplication
bt_edit_application_quit, function in BtEditApplication
bt_edit_application_run, function in BtEditApplication
bt_edit_application_save_song, function in BtEditApplication
bt_edit_application_set_song_unsaved, function in BtEditApplication
bt_edit_application_show_about, function in BtEditApplication
bt_edit_application_show_tip, function in BtEditApplication
bt_edit_application_ui_lock, function in BtEditApplication
bt_edit_application_ui_unlock, function in BtEditApplication

G

gdk_pixbuf_new_from_filename, function in btedit
gdk_pixbuf_new_from_theme, function in btedit
GNOME_CANVAS_BROKEN_PROPERTIES, macro in btedit
GtkVUMeter, struct in GtkVUMeter
gtk_image_new_from_filename, function in btedit
gtk_show_uri_simple, function in btedit
gtk_target_table_make, function in btedit
gtk_toolbar_get_style_from_string, function in btedit
gtk_vumeter_new, function in GtkVUMeter
gtk_vumeter_set_levels, function in GtkVUMeter
gtk_vumeter_set_min_max, function in GtkVUMeter
gtk_vumeter_set_scale, function in GtkVUMeter

I

BtInteractionControllerLearnDialog, struct in BtInteractionControllerLearnDialog
BtInteractionControllerLearnDialog:device, object property in BtInteractionControllerLearnDialog
BtInteractionControllerMenu, struct in BtInteractionControllerMenu
BtInteractionControllerMenu:item-unbind, object property in BtInteractionControllerMenu
BtInteractionControllerMenu:item-unbind-all, object property in BtInteractionControllerMenu
BtInteractionControllerMenu:selected-control, object property in BtInteractionControllerMenu
BtInteractionControllerMenu:type, object property in BtInteractionControllerMenu
BtInteractionControllerMenuType, enum in BtInteractionControllerMenu
bt_interaction_controller_learn_dialog_new, function in BtInteractionControllerLearnDialog
bt_interaction_controller_menu_new, function in BtInteractionControllerMenu

M

BtMachineCanvasItem, struct in BtMachineCanvasItem
BtMachineCanvasItem::position-changed, object signal in BtMachineCanvasItem
BtMachineCanvasItem::start-connect, object signal in BtMachineCanvasItem
BtMachineCanvasItem:analysis-dialog, object property in BtMachineCanvasItem
BtMachineCanvasItem:machine, object property in BtMachineCanvasItem
BtMachineCanvasItem:machines-page, object property in BtMachineCanvasItem
BtMachineCanvasItem:preferences-dialog, object property in BtMachineCanvasItem
BtMachineCanvasItem:properties-dialog, object property in BtMachineCanvasItem
BtMachineCanvasItem:zoom, object property in BtMachineCanvasItem
BtMachineListModel, struct in BtMachineListModel
BtMachineMenu, struct in BtMachineMenu
BtMachineMenu:machines-page, object property in BtMachineMenu
BtMachinePreferencesDialog, struct in BtMachinePreferencesDialog
BtMachinePreferencesDialog:machine, object property in BtMachinePreferencesDialog
BtMachinePresetPropertiesDialog, struct in BtMachinePresetPropertiesDialog
BtMachinePresetPropertiesDialog:comment, object property in BtMachinePresetPropertiesDialog
BtMachinePresetPropertiesDialog:machine, object property in BtMachinePresetPropertiesDialog
BtMachinePresetPropertiesDialog:name, object property in BtMachinePresetPropertiesDialog
BtMachinePropertiesDialog, struct in BtMachinePropertiesDialog
BtMachinePropertiesDialog:machine, object property in BtMachinePropertiesDialog
BtMachineRenameDialog, struct in BtMachineRenameDialog
BtMachineRenameDialog:machine, object property in BtMachineRenameDialog
BtMachineRenameDialog:name, object property in BtMachineRenameDialog
bt_machine_action_about, function in BtMachineActions
bt_machine_canvas_item_new, function in BtMachineCanvasItem
bt_machine_list_model_get_object, function in BtMachineListModel
bt_machine_list_model_new, function in BtMachineListModel
bt_machine_menu_new, function in BtMachineMenu
bt_machine_preferences_dialog_new, function in BtMachinePreferencesDialog
bt_machine_preset_properties_dialog_apply, function in BtMachinePresetPropertiesDialog
bt_machine_preset_properties_dialog_new, function in BtMachinePresetPropertiesDialog
bt_machine_properties_dialog_new, function in BtMachinePropertiesDialog
bt_machine_rename_dialog_apply, function in BtMachineRenameDialog
bt_machine_rename_dialog_new, function in BtMachineRenameDialog
bt_machine_show_analyzer_dialog, function in BtMachineCanvasItem
bt_machine_show_preferences_dialog, function in BtMachineCanvasItem
bt_machine_show_properties_dialog, function in BtMachineCanvasItem
BtMainMenu, struct in BtMainMenu
BtMainPageInfo, struct in BtMainPageInfo
BtMainPageMachines, struct in BtMainPageMachines
BtMainPageMachines:canvas, object property in BtMainPageMachines
BtMainPagePatterns, struct in BtMainPagePatterns
BtMainPages, struct in BtMainPages
BtMainPages:info-page, object property in BtMainPages
BtMainPages:machines-page, object property in BtMainPages
BtMainPages:patterns-page, object property in BtMainPages
BtMainPages:sequence-page, object property in BtMainPages
BtMainPages:waves-page, object property in BtMainPages
BtMainPageSequence, struct in BtMainPageSequence
BtMainPageSequence:cursor-row, object property in BtMainPageSequence
BtMainPageWaves, struct in BtMainPageWaves
BtMainStatusbar, struct in BtMainStatusbar
BtMainStatusbar:status, object property in BtMainStatusbar
BtMainToolbar, struct in BtMainToolbar
BtMainWindow, struct in BtMainWindow
BtMainWindow:dialog, object property in BtMainWindow
BtMainWindow:pages, object property in BtMainWindow
BtMainWindow:statusbar, object property in BtMainWindow
BtMainWindow:toolbar, object property in BtMainWindow
bt_main_menu_new, function in BtMainMenu
bt_main_pages_new, function in BtMainPages
bt_main_page_info_new, function in BtMainPageInfo
bt_main_page_machines_add_processor_machine, function in BtMainPageMachines
bt_main_page_machines_add_source_machine, function in BtMainPageMachines
bt_main_page_machines_delete_machine, function in BtMainPageMachines
bt_main_page_machines_delete_wire, function in BtMainPageMachines
bt_main_page_machines_new, function in BtMainPageMachines
bt_main_page_machines_rename_machine, function in BtMainPageMachines
bt_main_page_machines_wire_panorama_popup, function in BtMainPageMachines
bt_main_page_machines_wire_volume_popup, function in BtMainPageMachines
bt_main_page_patterns_copy_selection, function in BtMainPagePatterns
bt_main_page_patterns_cut_selection, function in BtMainPagePatterns
bt_main_page_patterns_delete_selection, function in BtMainPagePatterns
bt_main_page_patterns_new, function in BtMainPagePatterns
bt_main_page_patterns_paste_selection, function in BtMainPagePatterns
bt_main_page_patterns_show_machine, function in BtMainPagePatterns
bt_main_page_patterns_show_pattern, function in BtMainPagePatterns
bt_main_page_sequence_copy_selection, function in BtMainPageSequence
bt_main_page_sequence_cut_selection, function in BtMainPageSequence
bt_main_page_sequence_delete_selection, function in BtMainPageSequence
bt_main_page_sequence_new, function in BtMainPageSequence
bt_main_page_sequence_paste_selection, function in BtMainPageSequence
bt_main_page_waves_new, function in BtMainPageWaves
BT_MAIN_STATUSBAR_DEFAULT, macro in BtMainStatusbar
bt_main_statusbar_new, function in BtMainStatusbar
bt_main_toolbar_new, function in BtMainToolbar
bt_main_window_check_quit, function in BtMainWindow
bt_main_window_check_unsaved_song, function in BtMainWindow
bt_main_window_new, function in BtMainWindow
bt_main_window_new_song, function in BtMainWindow
bt_main_window_open_song, function in BtMainWindow
bt_main_window_save_song, function in BtMainWindow
bt_main_window_save_song_as, function in BtMainWindow
BtMemoryAudioSrc, struct in BtMemoryAudioSrc
BtMemoryAudioSrc:caps, object property in BtMemoryAudioSrc
BtMemoryAudioSrc:data, object property in BtMemoryAudioSrc
BtMemoryAudioSrc:length, object property in BtMemoryAudioSrc
BtMissingFrameworkElementsDialog, struct in BtMissingFrameworkElementsDialog
BtMissingFrameworkElementsDialog:core-elements, object property in BtMissingFrameworkElementsDialog
BtMissingFrameworkElementsDialog:edit-elements, object property in BtMissingFrameworkElementsDialog
BtMissingSongElementsDialog, struct in BtMissingSongElementsDialog
BtMissingSongElementsDialog:machines, object property in BtMissingSongElementsDialog
BtMissingSongElementsDialog:waves, object property in BtMissingSongElementsDialog
bt_missing_framework_elements_dialog_apply, function in BtMissingFrameworkElementsDialog
bt_missing_framework_elements_dialog_new, function in BtMissingFrameworkElementsDialog
bt_missing_song_elements_dialog_new, function in BtMissingSongElementsDialog

O

BtObjectListModel, struct in BtObjectListModel
bt_object_list_model_append, function in BtObjectListModel
bt_object_list_model_get_object, function in BtObjectListModel
bt_object_list_model_new, function in BtObjectListModel

P

BtPanoramaPopup, struct in BtPanoramaPopup
bt_panorama_popup_hide, function in BtPanoramaPopup
bt_panorama_popup_new, function in BtPanoramaPopup
bt_panorama_popup_show, function in BtPanoramaPopup
BtPatternEditor, struct in BtPatternEditor
BtPatternEditor::set-scroll-adjustments, object signal in BtPatternEditor
BtPatternEditor:cursor-group, object property in BtPatternEditor
BtPatternEditor:cursor-param, object property in BtPatternEditor
BtPatternEditor:cursor-row, object property in BtPatternEditor
BtPatternEditor:octave, object property in BtPatternEditor
BtPatternEditor:play-position, object property in BtPatternEditor
BtPatternEditorCallbacks, struct in BtPatternEditor
BtPatternEditorColumn, struct in BtPatternEditor
BtPatternEditorColumnGroup, struct in BtPatternEditor
BtPatternEditorColumnGroupType, enum in BtPatternEditor
BtPatternEditorColumnType, enum in BtPatternEditor
BtPatternEditorSelectionMode, enum in BtPatternEditor
BtPatternListModel, struct in BtPatternListModel
BtPatternPropertiesDialog, struct in BtPatternPropertiesDialog
BtPatternPropertiesDialog:length, object property in BtPatternPropertiesDialog
BtPatternPropertiesDialog:name, object property in BtPatternPropertiesDialog
BtPatternPropertiesDialog:pattern, object property in BtPatternPropertiesDialog
BtPatternPropertiesDialog:voices, object property in BtPatternPropertiesDialog
bt_pattern_editor_get_selection, function in BtPatternEditor
bt_pattern_editor_new, function in BtPatternEditor
bt_pattern_editor_set_pattern, function in BtPatternEditor
bt_pattern_list_model_get_object, function in BtPatternListModel
bt_pattern_list_model_new, function in BtPatternListModel
bt_pattern_properties_dialog_apply, function in BtPatternPropertiesDialog
bt_pattern_properties_dialog_new, function in BtPatternPropertiesDialog
BtPlaybackControllerSocket, struct in BtPlaybackControllerSocket
bt_playback_controller_socket_new, function in BtPlaybackControllerSocket

R

BtRenderDialog, struct in BtRenderDialog
BtRenderDialog:file-name, object property in BtRenderDialog
BtRenderDialog:format, object property in BtRenderDialog
BtRenderDialog:mode, object property in BtRenderDialog
BtRenderMode, enum in BtRenderDialog
BtRenderProgress, struct in BtRenderProgress
BtRenderProgress:settings, object property in BtRenderProgress
bt_render_dialog_new, function in BtRenderDialog
bt_render_progress_new, function in BtRenderProgress
bt_render_progress_run, function in BtRenderProgress
BtRuler, struct in BtRuler
BtRuler:draw-pos, object property in BtRuler
BtRuler:lower, object property in BtRuler
BtRuler:max-size, object property in BtRuler
BtRuler:metric, object property in BtRuler
BtRuler:position, object property in BtRuler
BtRuler:upper, object property in BtRuler
bt_ruler_get_metric, function in BtRuler
bt_ruler_get_range, function in BtRuler
bt_ruler_set_metric, function in BtRuler
bt_ruler_set_range, function in BtRuler

S

BtSequenceGridModel, struct in BtSequenceGridModel
BtSequenceGridModel:bars, object property in BtSequenceGridModel
BtSequenceGridModel:length, object property in BtSequenceGridModel
BtSequenceGridModel:pos-format, object property in BtSequenceGridModel
BtSequenceGridModelPosFormat, enum in BtSequenceGridModel
BtSequenceView, struct in BtSequenceView
BtSequenceView:loop-end, object property in BtSequenceView
BtSequenceView:loop-start, object property in BtSequenceView
BtSequenceView:play-position, object property in BtSequenceView
BtSequenceView:visible-rows, object property in BtSequenceView
bt_sequence_grid_model_new, function in BtSequenceGridModel
bt_sequence_view_new, function in BtSequenceView
BtSettingsDialog, struct in BtSettingsDialog
BtSettingsDialog:page, object property in BtSettingsDialog
BtSettingsPage, enum in BtSettingsDialog
BtSettingsPageAudiodevices, struct in BtSettingsPageAudiodevices
BtSettingsPageDirectories, struct in BtSettingsPageDirectories
BtSettingsPageInteractionController, struct in BtSettingsPageInteractionController
BtSettingsPagePlaybackController, struct in BtSettingsPagePlaybackController
BtSettingsPageShortcuts, struct in BtSettingsPageShortcuts
bt_settings_dialog_new, function in BtSettingsDialog
bt_settings_page_audiodevices_new, function in BtSettingsPageAudiodevices
bt_settings_page_directories_new, function in BtSettingsPageDirectories
bt_settings_page_interaction_controller_new, function in BtSettingsPageInteractionController
bt_settings_page_playback_controller_new, function in BtSettingsPagePlaybackController
bt_settings_page_shortcuts_new, function in BtSettingsPageShortcuts
BtSignalAnalysisDialog, struct in BtSignalAnalysisDialog
BtSignalAnalysisDialog:element, object property in BtSignalAnalysisDialog
bt_signal_analysis_dialog_new, function in BtSignalAnalysisDialog

T

BtTipDialog, struct in BtTipDialog
bt_tip_dialog_new, function in BtTipDialog

U

BtUIResources, struct in BtUIResources
BtUIResourcesColors, enum in BtUIResources
BtUIResourcesMachineColors, enum in BtUIResources
bt_ui_resources_get_accel_group, function in BtUIResources
bt_ui_resources_get_color_by_machine, function in BtUIResources
bt_ui_resources_get_gdk_color, function in BtUIResources
bt_ui_resources_get_icon_image_by_machine, function in BtUIResources
bt_ui_resources_get_icon_image_by_machine_type, function in BtUIResources
bt_ui_resources_get_icon_pixbuf_by_machine, function in BtUIResources
bt_ui_resources_get_machine_graphics_pixbuf_by_machine, function in BtUIResources
bt_ui_resources_get_rgb_color, function in BtUIResources
bt_ui_resources_new, function in BtUIResources

V

BtVolumePopup, struct in BtVolumePopup
bt_volume_popup_hide, function in BtVolumePopup
bt_volume_popup_new, function in BtVolumePopup
bt_volume_popup_show, function in BtVolumePopup

W

BtWaveformViewer, struct in BtWaveformViewer
BtWaveformViewer:loop-begin, object property in BtWaveformViewer
BtWaveformViewer:loop-end, object property in BtWaveformViewer
BtWaveformViewer:playback-cursor, object property in BtWaveformViewer
BtWaveformViewer:wave-length, object property in BtWaveformViewer
bt_waveform_viewer_new, function in BtWaveformViewer
bt_waveform_viewer_set_wave, function in BtWaveformViewer
BtWireCanvasItem, struct in BtWireCanvasItem
BtWireCanvasItem:analysis-dialog, object property in BtWireCanvasItem
BtWireCanvasItem:dst, object property in BtWireCanvasItem
BtWireCanvasItem:h, object property in BtWireCanvasItem
BtWireCanvasItem:machines-page, object property in BtWireCanvasItem
BtWireCanvasItem:src, object property in BtWireCanvasItem
BtWireCanvasItem:w, object property in BtWireCanvasItem
BtWireCanvasItem:wire, object property in BtWireCanvasItem
bt_wire_canvas_item_new, function in BtWireCanvasItem
bt_wire_show_analyzer_dialog, function in BtWireCanvasItem
buzztard-0.6.0/docs/reference/bt-edit/html/BtUIResources.html0000644042355400116100000006620011675570704021077 00000000000000 BtUIResources

BtUIResources

BtUIResources — common shared ui resources like icons and colors

Object Hierarchy

  GObject
   +----BtUIResources

Description

This class serves as a central storage for colors and icons. It is implemented as a singleton.

Details

struct BtUIResources

struct BtUIResources;

a collection of shared ui ressources


enum BtUIResourcesColors

typedef enum {
  BT_UI_RES_COLOR_CURSOR=0,
  BT_UI_RES_COLOR_SELECTION1,
  BT_UI_RES_COLOR_SELECTION2,
  BT_UI_RES_COLOR_PLAYLINE,
  BT_UI_RES_COLOR_LOOPLINE,
  BT_UI_RES_COLOR_ENDLINE,
  BT_UI_RES_COLOR_SOURCE_MACHINE_BASE,       /* machine view normal */
  BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1,    /* list view odd */
  BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2,    /* list view even */
  BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1,      /* machine title */
  BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2,      /* --- */
  BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE,    /* machine view normal */
  BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1, /* list view odd */
  BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2, /* list view even */
  BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1,   /* machine title */
  BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2,   /* --- */
  BT_UI_RES_COLOR_SINK_MACHINE_BASE,         /* machine view normal */
  BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1,      /* list view odd */
  BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2,      /* list view even */
  BT_UI_RES_COLOR_SINK_MACHINE_DARK1,        /* --- */
  BT_UI_RES_COLOR_SINK_MACHINE_DARK2,        /* --- */
  BT_UI_RES_COLOR_ANALYZER_PEAK,             /* analyzer widnow peak marks */
  BT_UI_RES_COLOR_GRID_LINES,                /* grid lines */
  BT_UI_RES_COLOR_COUNT
} BtUIResourcesColors;

Symbolic color names for the UI.

BT_UI_RES_COLOR_CURSOR

cursor color

BT_UI_RES_COLOR_SELECTION1

selection color

BT_UI_RES_COLOR_SELECTION2

shaded selection color

BT_UI_RES_COLOR_PLAYLINE

playback line

BT_UI_RES_COLOR_LOOPLINE

loop line

BT_UI_RES_COLOR_ENDLINE

song end line

BT_UI_RES_COLOR_SOURCE_MACHINE_BASE

source machine base color

BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1

source machine lighter variant

BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2

source machine even lighter variant

BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1

source machine darker variant

BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2

source machine even darker variant

BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE

processor machine base color

BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1

processor machine lighter variant

BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2

processor machine even lighter variant

BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1

processor machine darker variant

BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2

processor machine even darker variant

BT_UI_RES_COLOR_SINK_MACHINE_BASE

sink machine base color

BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1

sink machine lighter variant

BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2

sink machine even lighter variant

BT_UI_RES_COLOR_SINK_MACHINE_DARK1

sink machine darker variant

BT_UI_RES_COLOR_SINK_MACHINE_DARK2

sink machine even darker variant

BT_UI_RES_COLOR_ANALYZER_PEAK

analyzer peak lines

BT_UI_RES_COLOR_GRID_LINES

grid lines

BT_UI_RES_COLOR_COUNT

symbolic color count

enum BtUIResourcesMachineColors

typedef enum {
  BT_UI_RES_COLOR_MACHINE_BASE=0,     /* machine view normal */
  BT_UI_RES_COLOR_MACHINE_BRIGHT1,    /* list view odd */
  BT_UI_RES_COLOR_MACHINE_BRIGHT2,    /* list view even */
  BT_UI_RES_COLOR_MACHINE_DARK1,      /* --- */
  BT_UI_RES_COLOR_MACHINE_DARK2       /* --- */
} BtUIResourcesMachineColors;

Symbolic color names for machines.

BT_UI_RES_COLOR_MACHINE_BASE

base color

BT_UI_RES_COLOR_MACHINE_BRIGHT1

lighter variant

BT_UI_RES_COLOR_MACHINE_BRIGHT2

even lighter variant

BT_UI_RES_COLOR_MACHINE_DARK1

darker variant

BT_UI_RES_COLOR_MACHINE_DARK2

even darker variant

bt_ui_resources_new ()

BtUIResources *     bt_ui_resources_new                 (void);

Create a new instance on first call and return a reference later on.

Returns :

the new signleton instance

bt_ui_resources_get_icon_pixbuf_by_machine ()

GdkPixbuf *         bt_ui_resources_get_icon_pixbuf_by_machine
                                                        (const BtMachine *machine);

Gets a GdkPixbuf image that matches the given machine type for use in menus.

machine :

the machine to get the image for

Returns :

a GdkPixbuf image

bt_ui_resources_get_machine_graphics_pixbuf_by_machine ()

GdkPixbuf *         bt_ui_resources_get_machine_graphics_pixbuf_by_machine
                                                        (const BtMachine *machine,
                                                         gdouble zoom);

Gets a GdkPixbuf image that matches the given machine type for use on the canvas.

machine :

the machine to get the image for

zoom :

scaling factor for the icons

Returns :

a GdkPixbuf image

bt_ui_resources_get_icon_image_by_machine ()

GtkWidget *         bt_ui_resources_get_icon_image_by_machine
                                                        (const BtMachine *machine);

Gets a GtkImage that matches the given machine type.

machine :

the machine to get the image for

Returns :

a GtkImage widget

bt_ui_resources_get_icon_image_by_machine_type ()

GtkWidget *         bt_ui_resources_get_icon_image_by_machine_type
                                                        (GType machine_type);

Gets a GtkImage that matches the given machine type.

machine_type :

the machine_type to get the image for

Returns :

a GtkImage widget

bt_ui_resources_get_gdk_color ()

GdkColor *          bt_ui_resources_get_gdk_color       (BtUIResourcesColors color_type);

Gets a prealocated color by id.

color_type :

the color id

Returns :

the requested GdkColor.

bt_ui_resources_get_rgb_color ()

void                bt_ui_resources_get_rgb_color       (BtUIResourcesColors color_type,
                                                         gdouble *r,
                                                         gdouble *g,
                                                         gdouble *b);

Gets a prealocated color by id. Sets the given parts to values from 0.0 to 1.0.

color_type :

the color id

r :

target for red color part

g :

target for green color part

b :

target for blue color part

bt_ui_resources_get_color_by_machine ()

guint32             bt_ui_resources_get_color_by_machine
                                                        (const BtMachine *machine,
                                                         BtUIResourcesMachineColors color_type);

Gets a colors shade depending on machine type in rgba format.

machine :

the machine to get the color for

color_type :

a color shade

Returns :

a color depending on machine class and color_type

bt_ui_resources_get_accel_group ()

GtkAccelGroup *     bt_ui_resources_get_accel_group     (void);

All windows share one accelerator map.

Returns :

the shared keyboard accelerator map
buzztard-0.6.0/docs/reference/bt-edit/html/api-index-deprecated.html0000644042355400116100000000321511675570704022352 00000000000000 Index of deprecated API

Index of deprecated API

buzztard-0.6.0/docs/reference/bt-edit/html/BtTipDialog.html0000644042355400116100000001217711675570704020547 00000000000000 BtTipDialog

BtTipDialog

BtTipDialog — class for the editor tip-of-the-day dialog

Synopsis

#include "bt-edit.h"

struct              BtTipDialog;
BtTipDialog *       bt_tip_dialog_new                   (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtTipDialog

Implemented Interfaces

BtTipDialog implements AtkImplementorIface and GtkBuildable.

Description

Show a tip, that has not yet been shown to the user.

Details

struct BtTipDialog

struct BtTipDialog;

the about dialog for the editor application


bt_tip_dialog_new ()

BtTipDialog *       bt_tip_dialog_new                   (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/up.png0000644042355400116100000000062611675570704016645 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚buzztard-0.6.0/docs/reference/bt-edit/html/ch04.html0000644042355400116100000000440411675570704017135 00000000000000 Widget Class Reference

Widget Class Reference

BtPatternEditor — the pattern editor widget
BtRuler — A ruler widget
BtWaveformViewer — the waveform viewer widget
GtkVUMeter — vu meter widget
buzztard-0.6.0/docs/reference/bt-edit/html/pt01.html0000644042355400116100000000300511675570704017157 00000000000000 Part I. Overview

Part I. Overview

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainStatusbar.html0000644042355400116100000001507511675570704021450 00000000000000 BtMainStatusbar

BtMainStatusbar

BtMainStatusbar — class for the editor main statusbar

Synopsis

#include "bt-edit.h"

struct              BtMainStatusbar;
#define             BT_MAIN_STATUSBAR_DEFAULT
BtMainStatusbar *   bt_main_statusbar_new               (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkHBox
                                       +----BtMainStatusbar

Implemented Interfaces

BtMainStatusbar implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Properties

  "status"                   gchar*                : Write

Description

The statusbar shows some contextual help, as well as things like playback status.

Details

struct BtMainStatusbar

struct BtMainStatusbar;

the root window for the editor application


BT_MAIN_STATUSBAR_DEFAULT

#define BT_MAIN_STATUSBAR_DEFAULT _("Ready to rock!")

Default text to display when idle.


bt_main_statusbar_new ()

BtMainStatusbar *   bt_main_statusbar_new               (void);

Create a new instance

Returns :

the new instance

Property Details

The "status" property

  "status"                   gchar*                : Write

main status text.

Default value: "Ready to rock!"

buzztard-0.6.0/docs/reference/bt-edit/html/BtWireCanvasItem.html0000644042355400116100000003621711675570704021555 00000000000000 BtWireCanvasItem

BtWireCanvasItem

BtWireCanvasItem — class for the editor wire views wire canvas item

Synopsis

#include "bt-edit.h"

struct              BtWireCanvasItem;
BtWireCanvasItem *  bt_wire_canvas_item_new             (const BtMainPageMachines *main_page_machines,
                                                         BtWire *wire,
                                                         gdouble pos_xs,
                                                         gdouble pos_ys,
                                                         gdouble pos_xe,
                                                         gdouble pos_ye,
                                                         BtMachineCanvasItem *src_machine_item,
                                                         BtMachineCanvasItem *dst_machine_item);
void                bt_wire_show_analyzer_dialog        (BtWire *wire);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GnomeCanvasItem
                     +----GnomeCanvasGroup
                           +----BtWireCanvasItem

Properties

  "analysis-dialog"          BtSignalAnalysisDialog*  : Read
  "dst"                      BtMachineCanvasItem*  : Read / Write
  "h"                        gdouble               : Read / Write
  "machines-page"            BtMainPageMachines*   : Read / Write
  "src"                      BtMachineCanvasItem*  : Read / Write
  "w"                        gdouble               : Read / Write
  "wire"                     BtWire*               : Read / Write

Description

Provides volume control on the wires, as well as a menu to disconnect wires and to launch the analyzer screen.

Details

struct BtWireCanvasItem

struct BtWireCanvasItem;

the root window for the editor application


bt_wire_canvas_item_new ()

BtWireCanvasItem *  bt_wire_canvas_item_new             (const BtMainPageMachines *main_page_machines,
                                                         BtWire *wire,
                                                         gdouble pos_xs,
                                                         gdouble pos_ys,
                                                         gdouble pos_xe,
                                                         gdouble pos_ye,
                                                         BtMachineCanvasItem *src_machine_item,
                                                         BtMachineCanvasItem *dst_machine_item);

Create a new instance

main_page_machines :

the machine page the new item belongs to

wire :

the wire for which a canvas item should be created

pos_xs :

the horizontal start location

pos_ys :

the vertical start location

pos_xe :

the horizontal end location

pos_ye :

the vertical end location

src_machine_item :

the machine item at start

dst_machine_item :

the machine item at end

Returns :

the new instance or NULL in case of an error

bt_wire_show_analyzer_dialog ()

void                bt_wire_show_analyzer_dialog        (BtWire *wire);

Shows the wire analyzer dialog.

wire :

wire to show the dialog for

Since 0.6

Property Details

The "analysis-dialog" property

  "analysis-dialog"          BtSignalAnalysisDialog*  : Read

Get the the analysis dialog if shown.


The "dst" property

  "dst"                      BtMachineCanvasItem*  : Read / Write

Set wire dst machine canvas item.


The "h" property

  "h"                        gdouble               : Read / Write

height of the wire.

Allowed values: [-100000,100000]

Default value: 1


The "machines-page" property

  "machines-page"            BtMainPageMachines*   : Read / Write

Set application object, the window belongs to.


The "src" property

  "src"                      BtMachineCanvasItem*  : Read / Write

Set wire src machine canvas item.


The "w" property

  "w"                        gdouble               : Read / Write

width of the wire.

Allowed values: [-100000,100000]

Default value: 1


The "wire" property

  "wire"                     BtWire*               : Read / Write

Set wire object, the item belongs to.

buzztard-0.6.0/docs/reference/bt-edit/html/BtPanoramaPopup.html0000644042355400116100000001675011675570704021456 00000000000000 BtPanoramaPopup

BtPanoramaPopup

BtPanoramaPopup — panorama popup widget

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtPanoramaPopup

Implemented Interfaces

BtPanoramaPopup implements AtkImplementorIface and GtkBuildable.

Description

Shows a popup window containing a horizontal slider

Details

struct BtPanoramaPopup

struct BtPanoramaPopup;

a volume popup widget


bt_panorama_popup_new ()

GtkWidget *         bt_panorama_popup_new               (GtkAdjustment *adj);

Create a new instance

adj :

the adjustment for the popup

Returns :

the new instance or NULL in case of an error

bt_panorama_popup_show ()

void                bt_panorama_popup_show              (BtPanoramaPopup *self);

Show and activate the widget

self :

the popup widget

bt_panorama_popup_hide ()

void                bt_panorama_popup_hide              (BtPanoramaPopup *self);

Hide and deactivate the widget

self :

the popup widget
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachineCanvasItem.html0000644042355400116100000004502411675570704022207 00000000000000 BtMachineCanvasItem

BtMachineCanvasItem

BtMachineCanvasItem — class for the editor machine views machine canvas item

Synopsis

#include "bt-edit.h"

struct              BtMachineCanvasItem;
BtMachineCanvasItem * bt_machine_canvas_item_new        (const BtMainPageMachines *main_page_machines,
                                                         BtMachine *machine,
                                                         gdouble xpos,
                                                         gdouble ypos,
                                                         gdouble zoom);
void                bt_machine_show_properties_dialog   (BtMachine *machine);
void                bt_machine_show_preferences_dialog  (BtMachine *machine);
void                bt_machine_show_analyzer_dialog     (BtMachine *machine);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GnomeCanvasItem
                     +----GnomeCanvasGroup
                           +----BtMachineCanvasItem

Description

The canvas object emits "position-changed" signal after it has been moved.

Details

struct BtMachineCanvasItem

struct BtMachineCanvasItem;

the root window for the editor application


bt_machine_canvas_item_new ()

BtMachineCanvasItem * bt_machine_canvas_item_new        (const BtMainPageMachines *main_page_machines,
                                                         BtMachine *machine,
                                                         gdouble xpos,
                                                         gdouble ypos,
                                                         gdouble zoom);

Create a new instance

main_page_machines :

the machine page the new item belongs to

machine :

the machine for which a canvas item should be created

xpos :

the horizontal location

ypos :

the vertical location

zoom :

the zoom ratio

Returns :

the new instance or NULL in case of an error

bt_machine_show_properties_dialog ()

void                bt_machine_show_properties_dialog   (BtMachine *machine);

Shows the machine properties dialog.

machine :

machine to show the dialog for

Since 0.6


bt_machine_show_preferences_dialog ()

void                bt_machine_show_preferences_dialog  (BtMachine *machine);

Shows the machine preferences dialog.

machine :

machine to show the dialog for

Since 0.6


bt_machine_show_analyzer_dialog ()

void                bt_machine_show_analyzer_dialog     (BtMachine *machine);

Shows the machine signal analysis dialog.

machine :

machine to show the dialog for

Since 0.6

Property Details

The "analysis-dialog" property

  "analysis-dialog"          BtSignalAnalysisDialog*  : Read

Get the the analysis dialog if shown.


The "machine" property

  "machine"                  BtMachine*            : Read / Write

Set machine object, the item belongs to.


The "machines-page" property

  "machines-page"            BtMainPageMachines*   : Read / Write

Set application object, the window belongs to.


The "preferences-dialog" property

  "preferences-dialog"       BtMachinePreferencesDialog*  : Read

Get the the preferences dialog if shown.


The "properties-dialog" property

  "properties-dialog"        BtMachinePropertiesDialog*  : Read

Get the the properties dialog if shown.


The "zoom" property

  "zoom"                     gdouble               : Read / Write

Set zoom ratio for the machine item.

Allowed values: [0,100]

Default value: 1

Signal Details

The "position-changed" signal

void                user_function                      (BtMachineCanvasItem *self,
                                                        gpointer             user_data)      : No Hooks

Signals that item has been moved around. The new position can be read from the canvas item.

self :

the machine-canvas-item object that emitted the signal

user_data :

user data set when the signal handler was connected.

The "start-connect" signal

void                user_function                      (BtMachineCanvasItem *self,
                                                        gpointer             user_data)      : No Hooks

Signals that a connect should be made starting from this machine.

self :

the machine-canvas-item object that emitted the signal

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPageSequence.html0000644042355400116100000003005111675570704022034 00000000000000 BtMainPageSequence

BtMainPageSequence

BtMainPageSequence — the editor main sequence page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkVBox
                                       +----BtMainPageSequence

Implemented Interfaces

BtMainPageSequence implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Properties

  "cursor-row"               glong                 : Read

Description

Provides an editor for BtSequence instances.

Details

struct BtMainPageSequence

struct BtMainPageSequence;

the sequence page for the editor application


bt_main_page_sequence_new ()

BtMainPageSequence * bt_main_page_sequence_new          (const BtMainPages *pages);

Create a new instance

pages :

the page collection

Returns :

the new instance

bt_main_page_sequence_delete_selection ()

void                bt_main_page_sequence_delete_selection
                                                        (const BtMainPageSequence *self);

Delete (clear) the selected area.

self :

the sequence subpage

bt_main_page_sequence_copy_selection ()

void                bt_main_page_sequence_copy_selection
                                                        (const BtMainPageSequence *self);

Copy selected area.

Note

not yet working

self :

the sequence subpage

bt_main_page_sequence_cut_selection ()

void                bt_main_page_sequence_cut_selection (const BtMainPageSequence *self);

Cut selected area.

Note

not yet working

self :

the sequence subpage

bt_main_page_sequence_paste_selection ()

void                bt_main_page_sequence_paste_selection
                                                        (const BtMainPageSequence *self);

Paste at the top of the selected area.

Note

not yet working

self :

the sequence subpage

Property Details

The "cursor-row" property

  "cursor-row"               glong                 : Read

position of the cursor in the sequence view in bars.

Allowed values: >= 0

Default value: 0

buzztard-0.6.0/docs/reference/bt-edit/html/BtPatternEditor.html0000644042355400116100000006664711675570704021472 00000000000000 BtPatternEditor

BtPatternEditor

BtPatternEditor — the pattern editor widget

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----BtPatternEditor

Implemented Interfaces

BtPatternEditor implements AtkImplementorIface and GtkBuildable.

Properties

  "cursor-group"             guint                 : Read / Write
  "cursor-param"             guint                 : Read / Write
  "cursor-row"               guint                 : Read / Write
  "octave"                   guint                 : Write
  "play-position"            gdouble               : Write

Description

Provides an editor widget for BtPattern instances.

Details

struct BtPatternEditor

struct BtPatternEditor;

Opaque editor instance data.


BtPatternEditorCallbacks

typedef struct {
  /* FIXME: what about supplying
   * - BtPatternEditorColumn instead of BtPatternEditorColumn->user_data
   * - BtPatternEditorColumnGroup instead of track;
   */
  gfloat (*get_data_func)(gpointer pattern_data, gpointer column_data, guint row, guint group, guint param);
  void (*set_data_func)(gpointer pattern_data, gpointer column_data, guint row, guint group, guint param, guint digit, gfloat value);
} BtPatternEditorCallbacks;

Data format conversion callbacks.

get_data_func ()

called to fetch data from the model and convert for view

set_data_func ()

called to convert from view format for storage in the model

BtPatternEditorColumn

typedef struct {
  BtPatternEditorColumnType type;
  float def, min, max;
  gpointer user_data;
} BtPatternEditorColumn;

A parameter column.

BtPatternEditorColumnType type;

column value type

float def;

default value

float min;

minimum allowed value

float max;

maximum allowed value

gpointer user_data;

extra data to attach

enum BtPatternEditorColumnType

enum BtPatternEditorColumnType {
  PCT_NOTE=0,
  PCT_SWITCH,
  PCT_BYTE,
  PCT_WORD,
  PCT_FLOAT
};

Column data types.

PCT_NOTE

musical notes

PCT_SWITCH

on/off switches

PCT_BYTE

8bit values

PCT_WORD

16bit value

PCT_FLOAT

single precission floating point values

BtPatternEditorColumnGroup

typedef struct {
  // just an id to tell groups apart
  BtPatternEditorColumnGroupType type;
  // can be used for the headline above the group
  gchar *name;
  guint num_columns;
  BtPatternEditorColumn *columns;
  gpointer user_data;
} BtPatternEditorColumnGroup;

A group of BtPatternEditorColumns, such as a voice or all global parameters.

BtPatternEditorColumnGroupType type;

group type

gchar *name;

group name

guint num_columns;

number of columns

BtPatternEditorColumn *columns;

array of columns

gpointer user_data;

extra data to attach

enum BtPatternEditorColumnGroupType

enum BtPatternEditorColumnGroupType {
  PGT_WIRE=0,
  PGT_GLOBAL,
  PGT_VOICE
};

Column group type

PGT_WIRE

wire parameters

PGT_GLOBAL

global parameters

PGT_VOICE

voice parameters

enum BtPatternEditorSelectionMode

enum BtPatternEditorSelectionMode {
  PESM_COLUMN,
  PESM_GROUP,
  PESM_ALL
};

Seleting single columns, whole groups (e.g. voices) or the whole pattern.

PESM_COLUMN

a single columns

PESM_GROUP

a whole group

PESM_ALL

all columns (and groups)

bt_pattern_editor_new ()

GtkWidget *         bt_pattern_editor_new               (void);

Create a new pattern editor widget. Use bt_pattern_editor_set_pattern() to pass pattern data.

Returns :

the widget

bt_pattern_editor_set_pattern ()

void                bt_pattern_editor_set_pattern       (BtPatternEditor *self,
                                                         gpointer pattern_data,
                                                         guint num_rows,
                                                         guint num_groups,
                                                         BtPatternEditorColumnGroup *groups,
                                                         BtPatternEditorCallbacks *cb);

Set pattern data to show in the widget.

self :

the widget

pattern_data :

memory block of values (passed to the callbacks)

num_rows :

number of tick rows (y axis)

num_groups :

number of groups (x axis)

groups :

group parameters

cb :

value transformation callbacks

bt_pattern_editor_get_selection ()

gboolean            bt_pattern_editor_get_selection     (BtPatternEditor *self,
                                                         gint *start,
                                                         gint *end,
                                                         gint *group,
                                                         gint *param);

Get selection rectangle.

self :

the widget

start :

location for start tick

end :

location for end tick

group :

location for group

param :

location for parameter in group

Returns :

TRUE if there was a selection.

Property Details

The "cursor-group" property

  "cursor-group"             guint                 : Read / Write

The current group the cursor is in.

Default value: 0


The "cursor-param" property

  "cursor-param"             guint                 : Read / Write

The current parameter the cursor is at.

Default value: 0


The "cursor-row" property

  "cursor-row"               guint                 : Read / Write

The current cursor row.

Default value: 0


The "octave" property

  "octave"                   guint                 : Write

The octave for note input.

Allowed values: <= 12

Default value: 2


The "play-position" property

  "play-position"            gdouble               : Write

The current playing position as a fraction.

Allowed values: [-1,1]

Default value: -1

Signal Details

The "set-scroll-adjustments" signal

void                user_function                      (BtPatternEditor *hadjustment,
                                                        GtkAdjustment   *vadjustment,
                                                        GtkAdjustment   *arg2,
                                                        gpointer         user_data)        : Run Last

Internal signal for scrolling.

hadjustment :

horizontal adjustment

vadjustment :

vertical adjust

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachineRenameDialog.html0000644042355400116100000002072211675570704022502 00000000000000 BtMachineRenameDialog

BtMachineRenameDialog

BtMachineRenameDialog — machine settings

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtMachineRenameDialog

Implemented Interfaces

BtMachineRenameDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "machine"                  BtMachine*            : Write / Construct Only
  "name"                     gchar*                : Read

Description

A dialog to (re)configure a BtMachine.

Details

struct BtMachineRenameDialog

struct BtMachineRenameDialog;

the machine settings dialog


bt_machine_rename_dialog_new ()

BtMachineRenameDialog * bt_machine_rename_dialog_new    (const BtMachine *machine);

Create a new instance

machine :

the machine for which to create the dialog for

Returns :

the new instance

bt_machine_rename_dialog_apply ()

void                bt_machine_rename_dialog_apply      (const BtMachineRenameDialog *self);

Makes the dialog settings effective.

self :

the dialog which settings to apply

Property Details

The "machine" property

  "machine"                  BtMachine*            : Write / Construct Only

Set machine object, the dialog handles.


The "name" property

  "name"                     gchar*                : Read

the display-name of the machine.

Default value: "unamed"

buzztard-0.6.0/docs/reference/bt-edit/html/style.css0000644042355400116100000001210011675570704017353 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } buzztard-0.6.0/docs/reference/bt-edit/html/BtVolumePopup.html0000644042355400116100000001655611675570704021173 00000000000000 BtVolumePopup

BtVolumePopup

BtVolumePopup — volume popup widget

Synopsis

#include "bt-edit.h"

struct              BtVolumePopup;
GtkWidget *         bt_volume_popup_new                 (GtkAdjustment *adj);
void                bt_volume_popup_show                (BtVolumePopup *self);
void                bt_volume_popup_hide                (BtVolumePopup *self);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtVolumePopup

Implemented Interfaces

BtVolumePopup implements AtkImplementorIface and GtkBuildable.

Description

Shows a popup window containing a vertical slider

Details

struct BtVolumePopup

struct BtVolumePopup;

a volume popup widget


bt_volume_popup_new ()

GtkWidget *         bt_volume_popup_new                 (GtkAdjustment *adj);

Create a new instance

adj :

the adjustment for the popup

Returns :

the new instance or NULL in case of an error

bt_volume_popup_show ()

void                bt_volume_popup_show                (BtVolumePopup *self);

Show and activate the widget

self :

the popup widget

bt_volume_popup_hide ()

void                bt_volume_popup_hide                (BtVolumePopup *self);

Hide and deactivate the widget

self :

the popup widget
buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsDialog.html0000644042355400116100000002041711675570704021607 00000000000000 BtSettingsDialog

BtSettingsDialog

BtSettingsDialog — class for the editor settings dialog

Synopsis

#include "bt-edit.h"

struct              BtSettingsDialog;
enum                BtSettingsPage;
BtSettingsDialog *  bt_settings_dialog_new              (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtSettingsDialog

Implemented Interfaces

BtSettingsDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "page"                     BtSettingsPage        : Read / Write

Description

Provides UI to access the BtSettings.

Details

struct BtSettingsDialog

struct BtSettingsDialog;

the root window for the editor application


enum BtSettingsPage

typedef enum {
  BT_SETTINGS_PAGE_AUDIO_DEVICES=0,
  BT_SETTINGS_PAGE_INTERACTION_CONTROLLER,
  BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER,
  BT_SETTINGS_PAGE_COLORS,
  BT_SETTINGS_PAGE_SHORTCUTS,
  BT_SETTINGS_PAGE_DIRECTORIES
} BtSettingsPage;

Ids for the setting pages.

BT_SETTINGS_PAGE_AUDIO_DEVICES

audio devices

BT_SETTINGS_PAGE_INTERACTION_CONTROLLER

interaction controller

BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER

playback controller

BT_SETTINGS_PAGE_COLORS

colors

BT_SETTINGS_PAGE_SHORTCUTS

shortcuts

BT_SETTINGS_PAGE_DIRECTORIES

directories

bt_settings_dialog_new ()

BtSettingsDialog *  bt_settings_dialog_new              (void);

Create a new instance

Returns :

the new instance

Property Details

The "page" property

  "page"                     BtSettingsPage        : Read / Write

Current settings page.

Default value: BT_SETTINGS_PAGE_AUDIO_DEVICES

See Also

BtSettings
buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsPageDirectories.html0000644042355400116100000001304611675570704023461 00000000000000 BtSettingsPageDirectories

BtSettingsPageDirectories

BtSettingsPageDirectories — default directory configuration settings page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTable
                                 +----BtSettingsPageDirectories

Implemented Interfaces

BtSettingsPageDirectories implements AtkImplementorIface and GtkBuildable.

Description

Select default directories for songs, samples, recordings, etc.

Details

struct BtSettingsPageDirectories

struct BtSettingsPageDirectories;

the root window for the editor application


bt_settings_page_directories_new ()

BtSettingsPageDirectories * bt_settings_page_directories_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachinePresetPropertiesDialog.html0000644042355400116100000002637711675570704024626 00000000000000 BtMachinePresetPropertiesDialog

BtMachinePresetPropertiesDialog

BtMachinePresetPropertiesDialog — machine preset settings

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtMachinePresetPropertiesDialog

Implemented Interfaces

BtMachinePresetPropertiesDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "comment"                  gpointer              : Read / Write / Construct Only
  "machine"                  GstElement*           : Read / Write / Construct Only
  "name"                     gpointer              : Read / Write / Construct Only

Description

A dialog to (re)configure machine presets.

Details

struct BtMachinePresetPropertiesDialog

struct BtMachinePresetPropertiesDialog;

the root window for the editor application


bt_machine_preset_properties_dialog_new ()

BtMachinePresetPropertiesDialog * bt_machine_preset_properties_dialog_new
                                                        (GstElement *machine,
                                                         gchar **name,
                                                         gchar **comment);

Create a new instance

machine :

the machine for which to create the dialog for

name :

the preset name

comment :

the comment name

Returns :

the new instance

bt_machine_preset_properties_dialog_apply ()

void                bt_machine_preset_properties_dialog_apply
                                                        (const BtMachinePresetPropertiesDialog *self);

Makes the dialog settings effective.

self :

the dialog which settings to apply

Property Details

The "comment" property

  "comment"                  gpointer              : Read / Write / Construct Only

address of preset comment.


The "machine" property

  "machine"                  GstElement*           : Read / Write / Construct Only

Set machine object, the dialog handles.


The "name" property

  "name"                     gpointer              : Read / Write / Construct Only

address of preset name.

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainWindow.html0000644042355400116100000005513211675570704020745 00000000000000 BtMainWindow

BtMainWindow

BtMainWindow — root buzztard editor window

Synopsis

#include "bt-edit.h"

struct              BtMainWindow;
BtMainWindow *      bt_main_window_new                  (void);
gboolean            bt_main_window_check_unsaved_song   (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline);
gboolean            bt_main_window_check_quit           (const BtMainWindow *self);
void                bt_main_window_new_song             (const BtMainWindow *self);
void                bt_main_window_open_song            (const BtMainWindow *self);
void                bt_main_window_save_song            (const BtMainWindow *self);
void                bt_main_window_save_song_as         (const BtMainWindow *self);
void                bt_dialog_message                   (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline,
                                                         const gchar *message);
gboolean            bt_dialog_question                  (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline,
                                                         const gchar *message);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtMainWindow

Implemented Interfaces

BtMainWindow implements AtkImplementorIface, GtkBuildable and BtChildProxy.

Properties

  "dialog"                   GtkDialog*            : Read
  "pages"                    BtMainPages*          : Read
  "statusbar"                BtMainStatusbar*      : Read
  "toolbar"                  BtMainToolbar*        : Read

Description

The main window class is a container for the BtMainMenu, the BtMainToolbar, the BtMainStatusbar and the BtMainPages tabbed notebook.

Details

struct BtMainWindow

struct BtMainWindow;

the root window for the editor application


bt_main_window_new ()

BtMainWindow *      bt_main_window_new                  (void);

Create a new instance

Returns :

the new instance

bt_main_window_check_unsaved_song ()

gboolean            bt_main_window_check_unsaved_song   (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline);

Checks if the current song is modified and asks for confirmation to continue (and loose the changes). It only considers the undo/redo stack and not minor changes such as switching tabs or selecting something.

self :

the main window instance

title :

the title of the message

headline :

the bold headline of the message

Returns :

TRUE if the user has confirmed to continue

bt_main_window_check_quit ()

gboolean            bt_main_window_check_quit           (const BtMainWindow *self);

Displays a dialog box, that asks the user to confirm exiting the application.

self :

the main window instance

Returns :

TRUE if the user has confirmed to exit

bt_main_window_new_song ()

void                bt_main_window_new_song             (const BtMainWindow *self);

Prepares a new song. Triggers cleaning up the old song and refreshes the ui.

self :

the main window instance

bt_main_window_open_song ()

void                bt_main_window_open_song            (const BtMainWindow *self);

Opens a dialog box, where the user can choose a song to load. If the dialog is not canceld, the old song will be freed, the new song will be loaded and the ui will be refreshed upon success.

self :

the main window instance

bt_main_window_save_song ()

void                bt_main_window_save_song            (const BtMainWindow *self);

Save the song to disk. If it is a new song it will ask for a file_name and location.

self :

the main window instance

bt_main_window_save_song_as ()

void                bt_main_window_save_song_as         (const BtMainWindow *self);

Opens a dialog box, where the user can choose a file_name and location to save the song under.

self :

the main window instance

bt_dialog_message ()

void                bt_dialog_message                   (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline,
                                                         const gchar *message);

Displays a modal message dialog, that needs to be confirmed with "Okay".

self :

the applications main window

title :

the title of the message

headline :

the bold headline of the message

message :

the message itself

bt_dialog_question ()

gboolean            bt_dialog_question                  (const BtMainWindow *self,
                                                         const gchar *title,
                                                         const gchar *headline,
                                                         const gchar *message);

Displays a modal question dialog, that needs to be confirmed with "Okay" or aborted with "Cancel".

self :

the applications main window

title :

the title of the message

headline :

the bold headline of the message

message :

the message itself

Returns :

TRUE for Okay, FALSE otherwise

Property Details

The "dialog" property

  "dialog"                   GtkDialog*            : Read

Get the active dialog.


The "pages" property

  "pages"                    BtMainPages*          : Read

Get the pages widget.


The "statusbar" property

  "statusbar"                BtMainStatusbar*      : Read

Get the status bar.


The "toolbar" property

  "toolbar"                  BtMainToolbar*        : Read

Get the toolbar.

buzztard-0.6.0/docs/reference/bt-edit/html/GtkVUMeter.html0000644042355400116100000002715511675570704020404 00000000000000 GtkVUMeter

GtkVUMeter

GtkVUMeter — vu meter widget

Synopsis

#include "bt-edit.h"

struct              GtkVUMeter;
GtkWidget *         gtk_vumeter_new                     (gboolean vertical);
void                gtk_vumeter_set_min_max             (GtkVUMeter *vumeter,
                                                         gint min,
                                                         gint max);
void                gtk_vumeter_set_levels              (GtkVUMeter *vumeter,
                                                         gint rms,
                                                         gint peak);
void                gtk_vumeter_set_scale               (GtkVUMeter *vumeter,
                                                         gint scale);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkVUMeter

Implemented Interfaces

GtkVUMeter implements AtkImplementorIface and GtkBuildable.

Description

Shows a vertical or horizontal gauge with a colorized bar to signal volume level.

Details

struct GtkVUMeter

struct GtkVUMeter;

a volume meter widget


gtk_vumeter_new ()

GtkWidget *         gtk_vumeter_new                     (gboolean vertical);

Creates a new VUMeter widget.

vertical :

TRUE for a vertical VUMeter, FALSE for horizontal VUMeter.

Returns :

the new GtkWidget

gtk_vumeter_set_min_max ()

void                gtk_vumeter_set_min_max             (GtkVUMeter *vumeter,
                                                         gint min,
                                                         gint max);

Sets the minimum and maximum of the VU Meters scale. The positions are irrelevant as the widget will rearrange them. It will also increment max by one if min == max. And finally it will clamp the current level into the min,max range.

vumeter :

the vumeter widget to change the level bounds

min :

the new minimum level shown (level that is 0%)

max :

the new maximum level shown (level that is 100%)

gtk_vumeter_set_levels ()

void                gtk_vumeter_set_levels              (GtkVUMeter *vumeter,
                                                         gint rms,
                                                         gint peak);

Sets new level values for the level display. They are clamped to the min max range.

vumeter :

the vumeter widget to change the current level

rms :

the new rms level shown

peak :

the new peak level shown

gtk_vumeter_set_scale ()

void                gtk_vumeter_set_scale               (GtkVUMeter *vumeter,
                                                         gint scale);

Sets the scale of the VU Meter. It is either log or linear and defaults to linear. No matter which scale you set the input should always be linear, GtkVUMeter does the log calculation. 0db is red. -6db is yellow. -18db is green. Whatever min turns into is dark green.

vumeter :

the vumeter widget to change the scaling type

scale :

the scale type, either GTK_VUMETER_SCALE_LINEAR or GTK_VUMETER_SCALE_LOG
buzztard-0.6.0/docs/reference/bt-edit/html/BtInteractionControllerMenu.html0000644042355400116100000002512511675570704024040 00000000000000 BtInteractionControllerMenu

BtInteractionControllerMenu

BtInteractionControllerMenu — class for the interaction controller assignment popup menu

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkMenuShell
                                 +----GtkMenu
                                       +----BtInteractionControllerMenu

Implemented Interfaces

BtInteractionControllerMenu implements AtkImplementorIface and GtkBuildable.

Properties

  "item-unbind"              GtkWidget*            : Read
  "item-unbind-all"          GtkWidget*            : Read
  "selected-control"         BtIcControl*          : Read / Write
  "type"                     BtInteractionControllerMenuType  : Read / Write / Construct Only

Description

Build a menu with available interaction controllers of a type.

Details

struct BtInteractionControllerMenu

struct BtInteractionControllerMenu;

the machine selection sub-menu for the canvas page context menu


enum BtInteractionControllerMenuType

typedef enum {
  BT_INTERACTION_CONTROLLER_RANGE_MENU=0,
  BT_INTERACTION_CONTROLLER_TRIGGER_MENU,
} BtInteractionControllerMenuType;

BtInteractionControllerMenu can generate a menu showing different controller types.

BT_INTERACTION_CONTROLLER_RANGE_MENU

range controllers

BT_INTERACTION_CONTROLLER_TRIGGER_MENU

trigger controllers

bt_interaction_controller_menu_new ()

BtInteractionControllerMenu * bt_interaction_controller_menu_new
                                                        (BtInteractionControllerMenuType type);

Create a new instance

type :

for which kind of controllers make a menu

Returns :

the new instance

Property Details

The "item-unbind" property

  "item-unbind"              GtkWidget*            : Read

menu item for unbind command.


The "item-unbind-all" property

  "item-unbind-all"          GtkWidget*            : Read

menu item for unbind-all command.


The "selected-control" property

  "selected-control"         BtIcControl*          : Read / Write

control after menu selection.


The "type" property

  "type"                     BtInteractionControllerMenuType  : Read / Write / Construct Only

control types to list in the menu.

Default value: BT_INTERACTION_CONTROLLER_RANGE_MENU

buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit-ops.html0000644042355400116100000000661711675570704021776 00000000000000 buzztard-edit

buzztard-edit

buzztard-edit — work with buzztard songs

Synopsis

buzztard-edit [options...]

Description

buzztard-edit is the graphical buzztard song editor.

Invocation

buzztard-edit without any argumants launches the UI. Alternatively it takes a mandatory argument that specifies the command and extra options depending on the command.

Options

-c, --command command-name

The command to exeute, one of: load

-i, --input-file song-filename

The input filename. This should be a song file buzztard can handle.

-h, --help

Print brief help and exit.

--version

Print version and exit.

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainMenu.html0000644042355400116100000001206111675570704020374 00000000000000 BtMainMenu

BtMainMenu

BtMainMenu — class for the editor main menu

Synopsis

#include "bt-edit.h"

struct              BtMainMenu;
BtMainMenu *        bt_main_menu_new                    (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkMenuShell
                                 +----GtkMenuBar
                                       +----BtMainMenu

Implemented Interfaces

BtMainMenu implements AtkImplementorIface and GtkBuildable.

Description

Provides the main application menu.

Details

struct BtMainMenu

struct BtMainMenu;

the main menu inside the BtMainWindow


bt_main_menu_new ()

BtMainMenu *        bt_main_menu_new                    (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit-BtCrashRecoverDialog.html0000644042355400116100000000751111675570704025163 00000000000000 BtCrashRecoverDialog

BtCrashRecoverDialog

BtCrashRecoverDialog — class for the song recovery dialog

Synopsis

#include "bt-edit.h"

BtCrashRecoverDialog * bt_crash_recover_dialog_new      (GList *crash_entries);

Description

Show a dialog listing found unsaved songs. Allows to delete or restore them.

Details

bt_crash_recover_dialog_new ()

BtCrashRecoverDialog * bt_crash_recover_dialog_new      (GList *crash_entries);

Create a new instance

crash_entries :

list of found change-logs

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtPatternPropertiesDialog.html0000644042355400116100000002410711675570704023501 00000000000000 BtPatternPropertiesDialog

BtPatternPropertiesDialog

BtPatternPropertiesDialog — pattern settings

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtPatternPropertiesDialog

Implemented Interfaces

BtPatternPropertiesDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "length"                   gulong                : Read
  "name"                     gchar*                : Read
  "pattern"                  BtPattern*            : Write / Construct Only
  "voices"                   gulong                : Read

Description

A dialog to (re)configure a BtPattern.

Details

struct BtPatternPropertiesDialog

struct BtPatternPropertiesDialog;

the pattern settings dialog


bt_pattern_properties_dialog_new ()

BtPatternPropertiesDialog * bt_pattern_properties_dialog_new
                                                        (const BtPattern *pattern);

Create a new instance

pattern :

the pattern for which to create the dialog for

Returns :

the new instance

bt_pattern_properties_dialog_apply ()

void                bt_pattern_properties_dialog_apply  (const BtPatternPropertiesDialog *self);

Makes the dialog settings effective.

self :

the dialog which settings to apply

Property Details

The "length" property

  "length"                   gulong                : Read

length of the pattern in ticks.

Allowed values: >= 1


The "name" property

  "name"                     gchar*                : Read

the display-name of the pattern.

Default value: "unamed"


The "pattern" property

  "pattern"                  BtPattern*            : Write / Construct Only

Set pattern object, the dialog handles.


The "voices" property

  "voices"                   gulong                : Read

number of voices in the pattern.

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainToolbar.html0000644042355400116100000001223411675570704021074 00000000000000 BtMainToolbar

BtMainToolbar

BtMainToolbar — class for the editor main toolbar

Synopsis

#include "bt-edit.h"

struct              BtMainToolbar;
BtMainToolbar *     bt_main_toolbar_new                 (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkToolbar
                                 +----BtMainToolbar

Implemented Interfaces

BtMainToolbar implements AtkImplementorIface, GtkBuildable, GtkToolShell and GtkOrientable.

Description

Contains typical applications buttons for file i/o and playback, plus volume meters and volume control.

Details

struct BtMainToolbar

struct BtMainToolbar;

the main toolbar for the editor application


bt_main_toolbar_new ()

BtMainToolbar *     bt_main_toolbar_new                 (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit-BtMachineActions.html0000644042355400116100000001033511675570704024340 00000000000000 BtMachineActions

BtMachineActions

BtMachineActions — shared machine released ui actions

Synopsis

#include "bt-edit.h"

void                bt_machine_action_about             (BtMachine *machine,
                                                         BtMainWindow *main_window);

Description

Shared UI actions for machines that can be invoked from several UI classes.

Details

bt_machine_action_about ()

void                bt_machine_action_about             (BtMachine *machine,
                                                         BtMainWindow *main_window);

Shows the about dialog for the given machine.

machine :

the machine

main_window :

the main window to use as parent
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachineMenu.html0000644042355400116100000001504611675570704021062 00000000000000 BtMachineMenu

BtMachineMenu

BtMachineMenu — class for the machine selection popup menu

Synopsis

#include "bt-edit.h"

struct              BtMachineMenu;
BtMachineMenu *     bt_machine_menu_new                 (const BtMainPageMachines *main_page_machines);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkMenuShell
                                 +----GtkMenu
                                       +----BtMachineMenu

Implemented Interfaces

BtMachineMenu implements AtkImplementorIface and GtkBuildable.

Properties

  "machines-page"            BtMainPageMachines*   : Write / Construct Only

Description

Builds a hierachical menu with usable machines from the GStreamer registry.

Details

struct BtMachineMenu

struct BtMachineMenu;

the machine selection sub-menu for the canvas page context menu


bt_machine_menu_new ()

BtMachineMenu *     bt_machine_menu_new                 (const BtMainPageMachines *main_page_machines);

Create a new instance

main_page_machines :

the machine page for the menu

Returns :

the new instance

Property Details

The "machines-page" property

  "machines-page"            BtMainPageMachines*   : Write / Construct Only

Set application object, the window belongs to.

buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsPageShortcuts.html0000644042355400116100000001264311675570704023205 00000000000000 BtSettingsPageShortcuts

BtSettingsPageShortcuts

BtSettingsPageShortcuts — keyboard shortcut settings page

Synopsis

#include "bt-edit.h"

struct              BtSettingsPageShortcuts;
BtSettingsPageShortcuts * bt_settings_page_shortcuts_new
                                                        (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTable
                                 +----BtSettingsPageShortcuts

Implemented Interfaces

BtSettingsPageShortcuts implements AtkImplementorIface and GtkBuildable.

Description

Edit and manage keyboard shortcut schemes.

Details

struct BtSettingsPageShortcuts

struct BtSettingsPageShortcuts;

the root window for the editor application


bt_settings_page_shortcuts_new ()

BtSettingsPageShortcuts * bt_settings_page_shortcuts_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/index.html0000644042355400116100000002741711675570704017517 00000000000000 Buzztard Bt-Edit Reference Manual

for Buzztard 0.6.0. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-edit/.


Introduction
I. Overview
II. User Application API Reference
Main Class Reference
btedit — buzztard graphical editor application
BtAboutDialog — class for the editor about dialog
BtChangeLog — class for the editor action journaling
BtChangeLogger — interface for the editor action journaling
BtCrashRecoverDialog — class for the song recovery dialog
BtEditApplication — class for a gtk based buzztard editor application
BtInteractionControllerMenu — class for the interaction controller assignment popup menu
BtInteractionControllerLearnDialog — learn dialog for interaction devices
BtMachineActions — shared machine released ui actions
BtMachineCanvasItem — class for the editor machine views machine canvas item
BtMachineListModel — data model class for widgets showing machines of a song
BtMachineMenu — class for the machine selection popup menu
BtMachinePreferencesDialog — machine non-realtime parameters
BtMachinePresetPropertiesDialog — machine preset settings
BtMachinePropertiesDialog — machine realtime parameters
BtMachineRenameDialog — machine settings
BtMainMenu — class for the editor main menu
BtMainPageInfo — the editor main info page
BtMainPageMachines — the editor main machines page
BtMainPagePatterns — the editor main pattern page
BtMainPageSequence — the editor main sequence page
BtMainPageWaves — the editor wavetable page
BtMainPages — class for the editor main pages
BtMainStatusbar — class for the editor main statusbar
BtMainToolbar — class for the editor main toolbar
BtMainWindow — root buzztard editor window
BtMissingFrameworkElementsDialog — missing core and application elements
BtMissingSongElementsDialog — missing song machine and wave elements
BtObjectListModel — data model class for some widgets
BtPanoramaPopup — panorama popup widget
BtPatternListModel — data model class for widgets showing pattern of a song
BtPatternPropertiesDialog — pattern settings
BtRenderDialog — class for the editor render dialog
BtRenderProgress — class for the editor render progress
BtSequenceGridModel — data model class for widgets showing the pattern sequence of a song
BtSequenceView — the editor main sequence table view
BtSettingsDialog — class for the editor settings dialog
BtSettingsPageAudiodevices — audio device configuration settings page
BtSettingsPageInteractionController — interaction controller configuration settings page
BtSettingsPagePlaybackController — playback controller configuration settings page
BtSettingsPageDirectories — default directory configuration settings page
BtSettingsPageShortcuts — keyboard shortcut settings page
BtSignalAnalysisDialog — audio analysis window
BtTipDialog — class for the editor tip-of-the-day dialog
BtUIResources — common shared ui resources like icons and colors
BtVolumePopup — volume popup widget
BtWireCanvasItem — class for the editor wire views wire canvas item
Tool Class Reference
BtPlaybackControllerSocket — sockets based playback controller
GStreamer Element Reference
BtMemoryAudioSrc — play samples from memory
Widget Class Reference
BtPatternEditor — the pattern editor widget
BtRuler — A ruler widget
BtWaveformViewer — the waveform viewer widget
GtkVUMeter — vu meter widget
III. User Application Command Line Reference
buzztard-edit — work with buzztard songs
IV. Appendix
Object Hierarchy
API Index
Index of deprecated API
Index of new API in 0.6
buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit-BtChangeLogger.html0000644042355400116100000002052511675570704024002 00000000000000 BtChangeLogger

BtChangeLogger

BtChangeLogger — interface for the editor action journaling

Synopsis

#include "bt-edit.h"

#define             BT_CHANGE_LOGGER_METHOD             (name,
                                                         name_len,
                                                         regexp)
gboolean            bt_change_logger_change             (const BtChangeLogger *self,
                                                         const gchar *data);
gint                bt_change_logger_match_method       (BtChangeLoggerMethods *change_logger_methods,
                                                         const gchar *data,
                                                         GMatchInfo **match_info);

Description

Defines undo/redo interface.

Details

BT_CHANGE_LOGGER_METHOD()

#define             BT_CHANGE_LOGGER_METHOD(name,name_len,regexp)

Structure entry for a change log line parser array (array of BtChangeLoggerMethods).

name :

name of method

name_len :

length of the string

regexp :

regular expression for parsing the parameter part

bt_change_logger_change ()

gboolean            bt_change_logger_change             (const BtChangeLogger *self,
                                                         const gchar *data);

Run the editor action pointed to by data.

self :

an object that implements logging changes

data :

serialised data of the action to apply

Returns :

TRUE for success.

bt_change_logger_match_method ()

gint                bt_change_logger_match_method       (BtChangeLoggerMethods *change_logger_methods,
                                                         const gchar *data,
                                                         GMatchInfo **match_info);

Matches commands registered in the change_logger_methods against data. If a match is found the parameters are returned in match_info.

change_logger_methods :

array of change log methods

data :

the string to match agains

match_info :

resulting parameter on a positive match

Returns :

the command id from change_logger_methods or -1 for no match. Free the match_info on positive matches.
buzztard-0.6.0/docs/reference/bt-edit/html/BtRenderProgress.html0000644042355400116100000001714511675570704021637 00000000000000 BtRenderProgress

BtRenderProgress

BtRenderProgress — class for the editor render progress

Synopsis

#include "bt-edit.h"

struct              BtRenderProgress;
BtRenderProgress *  bt_render_progress_new              (BtRenderDialog *settings);
void                bt_render_progress_run              (const BtRenderProgress *self);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtRenderProgress

Implemented Interfaces

BtRenderProgress implements AtkImplementorIface and GtkBuildable.

Properties

  "settings"                 BtRenderDialog*       : Write / Construct Only

Description

Song recording status dialog.

Details

struct BtRenderProgress

struct BtRenderProgress;

the song rendering progress for the editor application


bt_render_progress_new ()

BtRenderProgress *  bt_render_progress_new              (BtRenderDialog *settings);

Create a new instance

settings :

the settings for the rendering

Returns :

the new instance

bt_render_progress_run ()

void                bt_render_progress_run              (const BtRenderProgress *self);

Run the rendering and show the progress.

self :

the progress-dialog

Property Details

The "settings" property

  "settings"                 BtRenderDialog*       : Write / Construct Only

Set settings object, the progress dialog handles.

buzztard-0.6.0/docs/reference/bt-edit/html/BtObjectListModel.html0000644042355400116100000002364111675570704021714 00000000000000 BtObjectListModel

BtObjectListModel

BtObjectListModel — data model class for some widgets

Synopsis

#include "bt-edit.h"

struct              BtObjectListModel;
void                bt_object_list_model_append         (BtObjectListModel *model,
                                                         GObject *object);
GObject *           bt_object_list_model_get_object     (BtObjectListModel *model,
                                                         GtkTreeIter *iter);
BtObjectListModel * bt_object_list_model_new            (gint n_columns,
                                                         GType object_type,
                                                         ...);

Object Hierarchy

  GObject
   +----BtObjectListModel

Implemented Interfaces

BtObjectListModel implements GtkTreeModel.

Description

Allows to bind gobject properties to model columns. Does not copy the data and thus keeps the widget always up-to-date.

Details

struct BtObjectListModel

struct BtObjectListModel;

Data model for GtkTreeView or GtkComboBox.


bt_object_list_model_append ()

void                bt_object_list_model_append         (BtObjectListModel *model,
                                                         GObject *object);

Append a new row to the model. The object has to have the same type as given to bt_object_list_model_new().

model :

the model

object :

the object to append

bt_object_list_model_get_object ()

GObject *           bt_object_list_model_get_object     (BtObjectListModel *model,
                                                         GtkTreeIter *iter);

The the GObject for the iter.

model :

the model

iter :

the iter

bt_object_list_model_new ()

BtObjectListModel * bt_object_list_model_new            (gint n_columns,
                                                         GType object_type,
                                                         ...);

Creates a list model mapping object properties to model columns.

n_columns :

number of columns

object_type :

the GType of the objects in the model

... :

property names for the columns

Returns :

the model.
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachinePropertiesDialog.html0000644042355400116100000001631011675570704023425 00000000000000 BtMachinePropertiesDialog

BtMachinePropertiesDialog

BtMachinePropertiesDialog — machine realtime parameters

Synopsis

#include "bt-edit.h"

struct              BtMachinePropertiesDialog;
BtMachinePropertiesDialog * bt_machine_properties_dialog_new
                                                        (const BtMachine *machine);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtMachinePropertiesDialog

Implemented Interfaces

BtMachinePropertiesDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "machine"                  BtMachine*            : Write / Construct Only

Description

A dialog to configure dynamic settings of a BtMachine. The dialog also allows to editing and manage presets for machines that support them.

Details

struct BtMachinePropertiesDialog

struct BtMachinePropertiesDialog;

the root window for the editor application


bt_machine_properties_dialog_new ()

BtMachinePropertiesDialog * bt_machine_properties_dialog_new
                                                        (const BtMachine *machine);

Create a new instance

machine :

the machine to create the dialog for

Returns :

the new instance

Property Details

The "machine" property

  "machine"                  BtMachine*            : Write / Construct Only

Set machine object, the dialog handles.

See Also

BtMachine
buzztard-0.6.0/docs/reference/bt-edit/html/BtRuler.html0000644042355400116100000004777311675570704017776 00000000000000 BtRuler

BtRuler

BtRuler — A ruler widget

Synopsis

#include "bt-edit.h"

struct              BtRuler;
GtkWidget *         gtk_vumeter_new                     (gboolean vertical);
void                bt_ruler_set_metric                 (BtRuler *ruler,
                                                         GtkMetricType metric);
GtkMetricType       bt_ruler_get_metric                 (BtRuler *ruler);
void                bt_ruler_set_range                  (BtRuler *ruler,
                                                         gdouble lower,
                                                         gdouble upper,
                                                         gdouble position,
                                                         gdouble max_size);
void                bt_ruler_get_range                  (BtRuler *ruler,
                                                         gdouble *lower,
                                                         gdouble *upper,
                                                         gdouble *position,
                                                         gdouble *max_size);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----BtRuler

Implemented Interfaces

BtRuler implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Properties

  "draw-pos"                 gboolean              : Read / Write
  "lower"                    gdouble               : Read / Write
  "max-size"                 gdouble               : Read / Write
  "metric"                   GtkMetricType         : Read / Write
  "position"                 gdouble               : Read / Write
  "upper"                    gdouble               : Read / Write

Description

The Ruler widget is utilized around other widgets such as a text widget or a graph. The ruler is used to show the location of the mouse on the window and to show the size of the window in specified units. The available units of measurement are GTK_PIXELS, GTK_INCHES and GTK_CENTIMETERS. GTK_PIXELS is the default unit of measurement. The ruler widget can be oriented vertically or horizontally.

Details

struct BtRuler

struct BtRuler;

gtk_vumeter_new ()

GtkWidget *         gtk_vumeter_new                     (gboolean vertical);

Creates a new VUMeter widget.

vertical :

TRUE for a vertical VUMeter, FALSE for horizontal VUMeter.

Returns :

the new GtkWidget

bt_ruler_set_metric ()

void                bt_ruler_set_metric                 (BtRuler *ruler,
                                                         GtkMetricType metric);

bt_ruler_get_metric ()

GtkMetricType       bt_ruler_get_metric                 (BtRuler *ruler);

Gets the units used for a BtRuler. See bt_ruler_set_metric().

ruler :

a BtRuler

Returns :

the units currently used for ruler

bt_ruler_set_range ()

void                bt_ruler_set_range                  (BtRuler *ruler,
                                                         gdouble lower,
                                                         gdouble upper,
                                                         gdouble position,
                                                         gdouble max_size);

This sets the range of the ruler.

ruler :

the gtkruler

lower :

the lower limit of the ruler

upper :

the upper limit of the ruler

position :

the mark on the ruler

max_size :

the maximum size of the ruler used when calculating the space to leave for the text

bt_ruler_get_range ()

void                bt_ruler_get_range                  (BtRuler *ruler,
                                                         gdouble *lower,
                                                         gdouble *upper,
                                                         gdouble *position,
                                                         gdouble *max_size);

Retrieves values indicating the range and current position of a BtRuler. See bt_ruler_set_range().

ruler :

a BtRuler

lower :

location to store lower limit of the ruler, or NULL. [allow-none]

upper :

location to store upper limit of the ruler, or NULL. [allow-none]

position :

location to store the current position of the mark on the ruler, or NULL. [allow-none]

max_size :

location to store the maximum size of the ruler used when calculating the space to leave for the text, or NULL.

Property Details

The "draw-pos" property

  "draw-pos"                 gboolean              : Read / Write

Wheter the position should be marked at the ruler.

Default value: TRUE


The "lower" property

  "lower"                    gdouble               : Read / Write

Lower limit of ruler.

Default value: 0


The "max-size" property

  "max-size"                 gdouble               : Read / Write

Maximum size of the ruler.

Default value: 0


The "metric" property

  "metric"                   GtkMetricType         : Read / Write

The metric used for the ruler.

Default value: GTK_PIXELS


The "position" property

  "position"                 gdouble               : Read / Write

Position of mark on the ruler.

Default value: 0


The "upper" property

  "upper"                    gdouble               : Read / Write

Upper limit of ruler.

Default value: 0

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPages.html0000644042355400116100000002167411675570704020541 00000000000000 BtMainPages

BtMainPages

BtMainPages — class for the editor main pages

Synopsis

#include "bt-edit.h"

struct              BtMainPages;
BtMainPages *       bt_main_pages_new                   (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkNotebook
                                 +----BtMainPages

Implemented Interfaces

BtMainPages implements AtkImplementorIface and GtkBuildable.

Description

The user interface of the buzztard editor is divided into several pages. This class implements the notebook widgets to manage the sub-pages: BtMainPageMachines, BtMainPagePatterns, BtMainPageSequence, BtMainPageWaves and BtMainPageInfo.

Details

struct BtMainPages

struct BtMainPages;

the root window for the editor application


bt_main_pages_new ()

BtMainPages *       bt_main_pages_new                   (void);

Create a new instance

Returns :

the new instance

Property Details

The "info-page" property

  "info-page"                BtMainPageInfo*       : Read

the info view page.


The "machines-page" property

  "machines-page"            BtMainPageMachines*   : Read

the machines view page.


The "patterns-page" property

  "patterns-page"            BtMainPagePatterns*   : Read

the patterns view page.


The "sequence-page" property

  "sequence-page"            BtMainPageSequence*   : Read

the sequence view page.


The "waves-page" property

  "waves-page"               BtMainPageWaves*      : Read

the waves view page.

buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsPageAudiodevices.html0000644042355400116100000001310211675570704023602 00000000000000 BtSettingsPageAudiodevices

BtSettingsPageAudiodevices

BtSettingsPageAudiodevices — audio device configuration settings page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTable
                                 +----BtSettingsPageAudiodevices

Implemented Interfaces

BtSettingsPageAudiodevices implements AtkImplementorIface and GtkBuildable.

Description

List available GStreamer audio devices. User can pick and configure one.

Details

struct BtSettingsPageAudiodevices

struct BtSettingsPageAudiodevices;

the root window for the editor application


bt_settings_page_audiodevices_new ()

BtSettingsPageAudiodevices * bt_settings_page_audiodevices_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtSequenceGridModel.html0000644042355400116100000002451711675570704022233 00000000000000 BtSequenceGridModel

BtSequenceGridModel

BtSequenceGridModel — data model class for widgets showing the pattern sequence of a song

Synopsis

#include "bt-edit.h"

struct              BtSequenceGridModel;
enum                BtSequenceGridModelPosFormat;
BtSequenceGridModel * bt_sequence_grid_model_new        (BtSequence *sequence,
                                                         gulong bars);

Object Hierarchy

  GObject
   +----BtSequenceGridModel

Implemented Interfaces

BtSequenceGridModel implements GtkTreeModel.

Properties

  "bars"                     gulong                : Read / Write
  "length"                   gulong                : Read / Write
  "pos-format"               BtSequenceGridModelPosFormat  : Read / Write

Description

A generic model representing the track x time grid of patterns of a song. Can be shown by a treeview.

The visible length can be greater then the real length of the underlying sequence, by setting the BtSequenceGridModel::length property.

Details

struct BtSequenceGridModel

struct BtSequenceGridModel;

Data model for GtkTreeView or GtkComboBox.


enum BtSequenceGridModelPosFormat

typedef enum {
  BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS=0,
  BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME,
  BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS
} BtSequenceGridModelPosFormat;

Format type for time values in the sequencer.

BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS

show as number of ticks

BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME

show as "min:sec.msec"

BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS

show as "beats.ticks"

bt_sequence_grid_model_new ()

BtSequenceGridModel * bt_sequence_grid_model_new        (BtSequence *sequence,
                                                         gulong bars);

Creates a grid model for the sequence. The model is automatically updated on changes in the content. It also expands its length in sync to the sequence.

To make the row-shading work, the application has to update "bars" when it changed on the view.

When setting "length" to a value greater than the real sequence, the model will append dummy rows. This allows the cursor to go beyond the end to expand the sequence.

sequence :

the sequence

bars :

the intial bar-filtering for the view

Returns :

the sequence model.

Property Details

The "bars" property

  "bars"                     gulong                : Read / Write

tick stepping for the color shading.

Allowed values: [1,4294967295]


The "length" property

  "length"                   gulong                : Read / Write

visible length of the sequence (>= real length).

Allowed values: <= 4294967295


The "pos-format" property

  "pos-format"               BtSequenceGridModelPosFormat  : Read / Write

the display format for position columns.

Default value: BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS

buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit-btedit.html0000644042355400116100000003712611675570704022447 00000000000000 btedit

btedit

btedit — buzztard graphical editor application

Synopsis

#include "bt-edit.h"

void                add_pixmap_directory                (const gchar *directory);
GtkWidget *         gtk_image_new_from_filename         (const gchar *filename);
GdkPixbuf *         gdk_pixbuf_new_from_filename        (const gchar *filename);
GdkPixbuf *         gdk_pixbuf_new_from_theme           (const gchar *name,
                                                         gint size);
GtkToolbarStyle     gtk_toolbar_get_style_from_string   (const gchar *style_name);
GtkTargetEntry *    gtk_target_table_make               (GdkAtom format_atom,
                                                         gint *n_targets);
void                gtk_show_uri_simple                 (GtkWidget *widget,
                                                         const gchar *uri);
#define             GNOME_CANVAS_BROKEN_PROPERTIES

Description

Implements the body of the buzztard GUI editor.

You can try to run the uninstalled program via

1
libtool --mode=execute buzztard-edit

to enable debug output add:

1
2
--gst-debug="*:2,bt-*:3" for not-so-much-logdata or
--gst-debug="*:2,bt-*:4" for a-lot-logdata

Example songs can be found in ./test/songs/.

Details

add_pixmap_directory ()

void                add_pixmap_directory                (const gchar *directory);

Use this function to set the directory containing installed pixmaps.

directory :

register another directory to search for pixmaps

gtk_image_new_from_filename ()

GtkWidget *         gtk_image_new_from_filename         (const gchar *filename);

Creates a new pixmap image widget for the image file.

filename :

the filename of the image file

Returns :

a new pixmap widget

gdk_pixbuf_new_from_filename ()

GdkPixbuf *         gdk_pixbuf_new_from_filename        (const gchar *filename);

Creates a new pixbuf image for the image file.

filename :

the filename of the image file

Returns :

a new pixbuf, g_object_unref() when done.

gdk_pixbuf_new_from_theme ()

GdkPixbuf *         gdk_pixbuf_new_from_theme           (const gchar *name,
                                                         gint size);

Creates a new pixbuf image from the icon name and size.

name :

the icon name

size :

the pixel size

Returns :

a new pixbuf, g_object_unref() when done.

gtk_toolbar_get_style_from_string ()

GtkToolbarStyle     gtk_toolbar_get_style_from_string   (const gchar *style_name);

toolbar gconf to style conversion

style_name :

the style name returned from gconf settings

Returns :

the style id

gtk_target_table_make ()

GtkTargetEntry *    gtk_target_table_make               (GdkAtom format_atom,
                                                         gint *n_targets);

Generate the target table for pasting to clipboard. Use gtk_target_table_free (targets, n_targets);

format_atom :

format atom for the target list

n_targets :

out variable for the size of the table

Returns :

the table and the size in the out variable n_targets

gtk_show_uri_simple ()

void                gtk_show_uri_simple                 (GtkWidget *widget,
                                                         const gchar *uri);

Show the given uri. Uses same screen as widget (default if widget is NULL).

widget :

widget that triggered the action

uri :

the uri

GNOME_CANVAS_BROKEN_PROPERTIES

#define GNOME_CANVAS_BROKEN_PROPERTIES 1

gnome canvas has a broken design, it does not allow derived classes to have G_PARAM_CONSTRUCT_ONLY properties

buzztard-0.6.0/docs/reference/bt-edit/html/BtEditApplication.html0000644042355400116100000007050111675570704021737 00000000000000 BtEditApplication

BtEditApplication

BtEditApplication — class for a gtk based buzztard editor application

Object Hierarchy

  GObject
   +----BtApplication
         +----BtEditApplication

Properties

  "ic-registry"              BtIcRegistry*         : Read
  "main-window"              BtMainWindow*         : Read
  "song"                     BtSong*               : Read / Write
  "unsaved"                  gboolean              : Read / Write

Description

Opens the BtMainWindow and provide application level function like load, save, run and exit.

It also provides functions to invoke some dialogs like about and tips.

The application instance will have exactly one active "song" at a time. I tracks undo/redo-able changes to the song via BtChangeLog and simple flagged changes via the "unsaved" property.

Details

struct BtEditApplication

struct BtEditApplication;

BtApplication subclass for the gtk editor application


bt_edit_application_new ()

BtEditApplication * bt_edit_application_new             (void);

Create a new instance on first call and return a reference later on.

Returns :

the new signleton instance

bt_edit_application_new_song ()

gboolean            bt_edit_application_new_song        (const BtEditApplication *self);

Creates a new blank song instance. If there is a previous song instance it will be freed.

self :

the application instance to create a new song in

Returns :

TRUE for success

bt_edit_application_load_song ()

gboolean            bt_edit_application_load_song       (const BtEditApplication *self,
                                                         const char *file_name);

Loads a new song. If there is a previous song instance it will be freed.

self :

the application instance to load a new song in

file_name :

the song filename to load

Returns :

true for success

bt_edit_application_save_song ()

gboolean            bt_edit_application_save_song       (const BtEditApplication *self,
                                                         const char *file_name);

Saves a song.

self :

the application instance to save a song from

file_name :

the song filename to save

Returns :

true for success

bt_edit_application_run ()

gboolean            bt_edit_application_run             (const BtEditApplication *self);

Start the gtk based editor application

self :

the application instance to run

Returns :

TRUE for success

bt_edit_application_load_and_run ()

gboolean            bt_edit_application_load_and_run    (const BtEditApplication *self,
                                                         const gchar *input_file_name);

load the file of the supplied name and start the gtk based editor application

self :

the application instance to run

input_file_name :

the file to load initially

Returns :

true for success

bt_edit_application_quit ()

gboolean            bt_edit_application_quit            (const BtEditApplication *self);

End the application. Eventualy asks the user for confirmation.

self :

the application instance to quit

Returns :

TRUE it ending the application was confirmed

bt_edit_application_show_about ()

void                bt_edit_application_show_about      (const BtEditApplication *self);

Shows the applications about window

self :

the application instance

bt_edit_application_show_tip ()

void                bt_edit_application_show_tip        (const BtEditApplication *self);

Shows the tip of the day window

self :

the application instance

Since 0.6


bt_edit_application_crash_log_recover ()

void                bt_edit_application_crash_log_recover
                                                        (const BtEditApplication *self);

Shows the crash-log recover window if we have pending crash logs.

self :

the application instance

Since 0.6


bt_edit_application_attach_child_window ()

void                bt_edit_application_attach_child_window
                                                        (const BtEditApplication *self,
                                                         GtkWindow *window);

The parent and transient relation ship to the applications main-window.

self :

the application instance

window :

a child window (e.g. dialog)

Since 0.6


bt_edit_application_ui_lock ()

void                bt_edit_application_ui_lock         (const BtEditApplication *self);

Sets the main window insensitive and show a wait cursor.

self :

the application instance

bt_edit_application_ui_unlock ()

void                bt_edit_application_ui_unlock       (const BtEditApplication *self);

Sets the main window sensitive again and unset the wait cursor.

self :

the application instance

bt_edit_application_is_song_unsaved ()

gboolean            bt_edit_application_is_song_unsaved (const BtEditApplication *self);

Check if the song has unsaved changes.

self :

the application instance

Returns :

TRUE if there are pending changes

bt_edit_application_set_song_unsaved ()

void                bt_edit_application_set_song_unsaved
                                                        (const BtEditApplication *self);

Flag unsaved changes in the applications song.

self :

the application instance

Property Details

The "ic-registry" property

  "ic-registry"              BtIcRegistry*         : Read

the interaction controller registry of this application.


The "main-window" property

  "main-window"              BtMainWindow*         : Read

the main window of this application.


The "song" property

  "song"                     BtSong*               : Read / Write

the current song object.


The "unsaved" property

  "unsaved"                  gboolean              : Read / Write

tell whether the current state of the song has been saved.

Default value: TRUE

See Also

BtMainWindow
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachineListModel.html0000644042355400116100000001565511675570704022060 00000000000000 BtMachineListModel

BtMachineListModel

BtMachineListModel — data model class for widgets showing machines of a song

Object Hierarchy

  GObject
   +----BtMachineListModel

Implemented Interfaces

BtMachineListModel implements GtkTreeModel.

Description

A generic model representing the machines of a song, suitable for combo-boxes and treeview widgets.

Details

struct BtMachineListModel

struct BtMachineListModel;

Data model for GtkTreeView or GtkComboBox.


bt_machine_list_model_get_object ()

BtMachine *         bt_machine_list_model_get_object    (BtMachineListModel *model,
                                                         GtkTreeIter *iter);

The the BtMachine for the iter.

model :

the model

iter :

the iter

bt_machine_list_model_new ()

BtMachineListModel * bt_machine_list_model_new          (BtSetup *setup);

Creates a list model of machines for the setup. The model is automatically updated when machines are added, removed or changed.

setup :

the setup

Returns :

the machine model.
buzztard-0.6.0/docs/reference/bt-edit/html/BtMachinePreferencesDialog.html0000644042355400116100000001621111675570704023532 00000000000000 BtMachinePreferencesDialog

BtMachinePreferencesDialog

BtMachinePreferencesDialog — machine non-realtime parameters

Synopsis

#include "bt-edit.h"

struct              BtMachinePreferencesDialog;
BtMachinePreferencesDialog * bt_machine_preferences_dialog_new
                                                        (const BtMachine *machine);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----BtMachinePreferencesDialog

Implemented Interfaces

BtMachinePreferencesDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "machine"                  BtMachine*            : Write / Construct Only

Description

A dialog to configure static settings of a BtMachine.

Details

struct BtMachinePreferencesDialog

struct BtMachinePreferencesDialog;

the root window for the editor application


bt_machine_preferences_dialog_new ()

BtMachinePreferencesDialog * bt_machine_preferences_dialog_new
                                                        (const BtMachine *machine);

Create a new instance

machine :

the machine to create the dialog for

Returns :

the new instance

Property Details

The "machine" property

  "machine"                  BtMachine*            : Write / Construct Only

Set machine object, the dialog handles.

See Also

BtMachine
buzztard-0.6.0/docs/reference/bt-edit/html/BtSettingsPageInteractionController.html0000644042355400116100000001370711675570704025534 00000000000000 BtSettingsPageInteractionController

BtSettingsPageInteractionController

BtSettingsPageInteractionController — interaction controller configuration settings page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkTable
                                 +----BtSettingsPageInteractionController

Implemented Interfaces

BtSettingsPageInteractionController implements AtkImplementorIface and GtkBuildable.

Description

Lists available interaction controller devices and allows to select controllers that should be used.

Details

struct BtSettingsPageInteractionController

struct BtSettingsPageInteractionController;

the root window for the editor application


bt_settings_page_interaction_controller_new ()

BtSettingsPageInteractionController * bt_settings_page_interaction_controller_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/index.sgml0000644042355400116100000024775511675570704017526 00000000000000 buzztard-0.6.0/docs/reference/bt-edit/html/BtPlaybackControllerSocket.html0000644042355400116100000001117211675570704023630 00000000000000 BtPlaybackControllerSocket

BtPlaybackControllerSocket

BtPlaybackControllerSocket — sockets based playback controller

Object Hierarchy

  GObject
   +----BtPlaybackControllerSocket

Description

Allows the coherence upnp backend for buzztard to remote control and query buzztard-edit.

Function can be tested doing "netcat -n 127.0.0.1 7654".

Details

struct BtPlaybackControllerSocket

struct BtPlaybackControllerSocket;

the root window for the editor application


bt_playback_controller_socket_new ()

BtPlaybackControllerSocket * bt_playback_controller_socket_new
                                                        (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/uibtedit.html0000644042355400116100000002702511675570704020214 00000000000000 User Application API Reference

User Application API Reference


Abstract

The classes described in this chapter are all part of end user application code. Please make sure you have read section conventions before reading further.

Table of Contents

Main Class Reference
btedit — buzztard graphical editor application
BtAboutDialog — class for the editor about dialog
BtChangeLog — class for the editor action journaling
BtChangeLogger — interface for the editor action journaling
BtCrashRecoverDialog — class for the song recovery dialog
BtEditApplication — class for a gtk based buzztard editor application
BtInteractionControllerMenu — class for the interaction controller assignment popup menu
BtInteractionControllerLearnDialog — learn dialog for interaction devices
BtMachineActions — shared machine released ui actions
BtMachineCanvasItem — class for the editor machine views machine canvas item
BtMachineListModel — data model class for widgets showing machines of a song
BtMachineMenu — class for the machine selection popup menu
BtMachinePreferencesDialog — machine non-realtime parameters
BtMachinePresetPropertiesDialog — machine preset settings
BtMachinePropertiesDialog — machine realtime parameters
BtMachineRenameDialog — machine settings
BtMainMenu — class for the editor main menu
BtMainPageInfo — the editor main info page
BtMainPageMachines — the editor main machines page
BtMainPagePatterns — the editor main pattern page
BtMainPageSequence — the editor main sequence page
BtMainPageWaves — the editor wavetable page
BtMainPages — class for the editor main pages
BtMainStatusbar — class for the editor main statusbar
BtMainToolbar — class for the editor main toolbar
BtMainWindow — root buzztard editor window
BtMissingFrameworkElementsDialog — missing core and application elements
BtMissingSongElementsDialog — missing song machine and wave elements
BtObjectListModel — data model class for some widgets
BtPanoramaPopup — panorama popup widget
BtPatternListModel — data model class for widgets showing pattern of a song
BtPatternPropertiesDialog — pattern settings
BtRenderDialog — class for the editor render dialog
BtRenderProgress — class for the editor render progress
BtSequenceGridModel — data model class for widgets showing the pattern sequence of a song
BtSequenceView — the editor main sequence table view
BtSettingsDialog — class for the editor settings dialog
BtSettingsPageAudiodevices — audio device configuration settings page
BtSettingsPageInteractionController — interaction controller configuration settings page
BtSettingsPagePlaybackController — playback controller configuration settings page
BtSettingsPageDirectories — default directory configuration settings page
BtSettingsPageShortcuts — keyboard shortcut settings page
BtSignalAnalysisDialog — audio analysis window
BtTipDialog — class for the editor tip-of-the-day dialog
BtUIResources — common shared ui resources like icons and colors
BtVolumePopup — volume popup widget
BtWireCanvasItem — class for the editor wire views wire canvas item
Tool Class Reference
BtPlaybackControllerSocket — sockets based playback controller
GStreamer Element Reference
BtMemoryAudioSrc — play samples from memory
Widget Class Reference
BtPatternEditor — the pattern editor widget
BtRuler — A ruler widget
BtWaveformViewer — the waveform viewer widget
GtkVUMeter — vu meter widget
buzztard-0.6.0/docs/reference/bt-edit/html/objecttree.html0000644042355400116100000002405611675570704020532 00000000000000 Object Hierarchy buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPageInfo.html0000644042355400116100000001315211675570704021162 00000000000000 BtMainPageInfo

BtMainPageInfo

BtMainPageInfo — the editor main info page

Synopsis

#include "bt-edit.h"

struct              BtMainPageInfo;
BtMainPageInfo *    bt_main_page_info_new               (const BtMainPages *pages);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkVBox
                                       +----BtMainPageInfo

Implemented Interfaces

BtMainPageInfo implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Description

Provides an editor for the song meta data.

Details

struct BtMainPageInfo

struct BtMainPageInfo;

the info page for the editor application


bt_main_page_info_new ()

BtMainPageInfo *    bt_main_page_info_new               (const BtMainPages *pages);

Create a new instance

pages :

the page collection

Returns :

the new instance

See Also

BtSongInfo
buzztard-0.6.0/docs/reference/bt-edit/html/ch02.html0000644042355400116100000000361411675570704017135 00000000000000 Tool Class Reference

Tool Class Reference

BtPlaybackControllerSocket — sockets based playback controller
buzztard-0.6.0/docs/reference/bt-edit/html/BtAboutDialog.html0000644042355400116100000001245011675570704021057 00000000000000 BtAboutDialog

BtAboutDialog

BtAboutDialog — class for the editor about dialog

Synopsis

#include "bt-edit.h"

struct              BtAboutDialog;
BtAboutDialog *     bt_about_dialog_new                 (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----GtkAboutDialog
                                                   +----BtAboutDialog

Implemented Interfaces

BtAboutDialog implements AtkImplementorIface and GtkBuildable.

Description

Info about the project, people involved, license and so on.

Details

struct BtAboutDialog

struct BtAboutDialog;

the about dialog for the editor application


bt_about_dialog_new ()

BtAboutDialog *     bt_about_dialog_new                 (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-edit/html/BtInteractionControllerLearnDialog.html0000644042355400116100000001660211675570704025315 00000000000000 BtInteractionControllerLearnDialog

BtInteractionControllerLearnDialog

BtInteractionControllerLearnDialog — learn dialog for interaction devices

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtInteractionControllerLearnDialog

Implemented Interfaces

BtInteractionControllerLearnDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "device"                   BtIcDevice*           : Write / Construct Only

Description

A dialog to prompt the user for an interaction controller assignment.

Details

struct BtInteractionControllerLearnDialog

struct BtInteractionControllerLearnDialog;

dynamic controller learn dialog


bt_interaction_controller_learn_dialog_new ()

BtInteractionControllerLearnDialog * bt_interaction_controller_learn_dialog_new
                                                        (BtIcDevice *device);

Create a new instance.

device :

the device of which the learn events are monitored

Returns :

the new instance

Property Details

The "device" property

  "device"                   BtIcDevice*           : Write / Construct Only

Set the device we want to snoop for a new controler.

buzztard-0.6.0/docs/reference/bt-edit/html/ch03.html0000644042355400116100000000357511675570704017144 00000000000000 GStreamer Element Reference

GStreamer Element Reference

BtMemoryAudioSrc — play samples from memory
buzztard-0.6.0/docs/reference/bt-edit/html/uibteditopts.html0000644042355400116100000000345411675570704021122 00000000000000 User Application Command Line Reference

User Application Command Line Reference


Table of Contents

buzztard-edit — work with buzztard songs
buzztard-0.6.0/docs/reference/bt-edit/html/BtMissingSongElementsDialog.html0000644042355400116100000002067511675570704023752 00000000000000 BtMissingSongElementsDialog

BtMissingSongElementsDialog

BtMissingSongElementsDialog — missing song machine and wave elements

Synopsis

#include "bt-edit.h"

struct              BtMissingSongElementsDialog;
BtMissingSongElementsDialog * bt_missing_song_elements_dialog_new
                                                        (GList *machines,
                                                         GList *waves);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtMissingSongElementsDialog

Implemented Interfaces

BtMissingSongElementsDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "machines"                 gpointer              : Write / Construct Only
  "waves"                    gpointer              : Write / Construct Only

Description

A dialog to inform about missing song machine and wave elements.

Details

struct BtMissingSongElementsDialog

struct BtMissingSongElementsDialog;

the root window for the editor application


bt_missing_song_elements_dialog_new ()

BtMissingSongElementsDialog * bt_missing_song_elements_dialog_new
                                                        (GList *machines,
                                                         GList *waves);

Create a new instance

machines :

list of missing machine elements

waves :

list of missing wave files

Returns :

the new instance

Property Details

The "machines" property

  "machines"                 gpointer              : Write / Construct Only

Set missing machines list, the dialog handles.


The "waves" property

  "waves"                    gpointer              : Write / Construct Only

Set missing waves list, the dialog handles.

buzztard-0.6.0/docs/reference/bt-edit/html/home.png0000644042355400116100000000121611675570704017145 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚buzztard-0.6.0/docs/reference/bt-edit/html/BtRenderDialog.html0000644042355400116100000002056511675570704021232 00000000000000 BtRenderDialog

BtRenderDialog

BtRenderDialog — class for the editor render dialog

Synopsis

#include "bt-edit.h"

struct              BtRenderDialog;
enum                BtRenderMode;
BtRenderDialog *    bt_render_dialog_new                (void);

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtRenderDialog

Implemented Interfaces

BtRenderDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "file-name"                gchar*                : Read
  "format"                   BtSinkBinRecordFormat  : Read
  "mode"                     BtRenderMode          : Read

Description

Provides UI to access the song recording

Details

struct BtRenderDialog

struct BtRenderDialog;

the song rendering dialog for the editor application


enum BtRenderMode

typedef enum {
  BT_RENDER_MODE_MIXDOWN=0,
  BT_RENDER_MODE_SINGLE_TRACKS,
} BtRenderMode;

Different modes of operation for the BtSong rendering.

BT_RENDER_MODE_MIXDOWN

mix to one track

BT_RENDER_MODE_SINGLE_TRACKS

record one track for each source

bt_render_dialog_new ()

BtRenderDialog *    bt_render_dialog_new                (void);

Create a new instance

Returns :

the new instance

Property Details

The "file-name" property

  "file-name"                gchar*                : Read

Get chosen filename.

Default value: NULL


The "format" property

  "format"                   BtSinkBinRecordFormat  : Read

format to use.

Default value: .ogg


The "mode" property

  "mode"                     BtRenderMode          : Read

render-mode to use.

Default value: BT_RENDER_MODE_MIXDOWN

buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPageMachines.html0000644042355400116100000005630111675570704022021 00000000000000 BtMainPageMachines

BtMainPageMachines

BtMainPageMachines — the editor main machines page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkVBox
                                       +----BtMainPageMachines

Implemented Interfaces

BtMainPageMachines implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Properties

  "canvas"                   GnomeCanvas*          : Read

Description

Displays the machine setup and wires on a canvas.

Details

struct BtMainPageMachines

struct BtMainPageMachines;

the machines page for the editor application


bt_main_page_machines_new ()

BtMainPageMachines * bt_main_page_machines_new          (const BtMainPages *pages);

Create a new instance

pages :

the page collection

Returns :

the new instance

bt_main_page_machines_wire_volume_popup ()

gboolean            bt_main_page_machines_wire_volume_popup
                                                        (const BtMainPageMachines *self,
                                                         BtWire *wire,
                                                         gint xpos,
                                                         gint ypos);

Activates the volume-popup for the given wire.

self :

the machines page

wire :

the wire to popup the volume control for

xpos :

the x-position for the popup

ypos :

the y-position for the popup

Returns :

TRUE for succes.

bt_main_page_machines_wire_panorama_popup ()

gboolean            bt_main_page_machines_wire_panorama_popup
                                                        (const BtMainPageMachines *self,
                                                         BtWire *wire,
                                                         gint xpos,
                                                         gint ypos);

Activates the panorama-popup for the given wire.

self :

the machines page

wire :

the wire to popup the panorama control for

xpos :

the x-position for the popup

ypos :

the y-position for the popup

Returns :

TRUE for succes.

bt_main_page_machines_add_source_machine ()

gboolean            bt_main_page_machines_add_source_machine
                                                        (const BtMainPageMachines *self,
                                                         const gchar *id,
                                                         const gchar *plugin_name);

Add a new machine to the machine-page.

self :

the machines page

id :

the id for the new machine

plugin_name :

the plugin-name for the new machine

bt_main_page_machines_add_processor_machine ()

gboolean            bt_main_page_machines_add_processor_machine
                                                        (const BtMainPageMachines *self,
                                                         const gchar *id,
                                                         const gchar *plugin_name);

Add a new machine to the machine-page.

self :

the machines page

id :

the id for the new machine

plugin_name :

the plugin-name for the new machine

bt_main_page_machines_delete_machine ()

void                bt_main_page_machines_delete_machine
                                                        (const BtMainPageMachines *self,
                                                         BtMachine *machine);

Remove a machine from the machine-page.

self :

the machines page

machine :

the machine to remove

bt_main_page_machines_delete_wire ()

void                bt_main_page_machines_delete_wire   (const BtMainPageMachines *self,
                                                         BtWire *wire);

Remove a wire from the machine-page (unlink the machines).

self :

the machines page

wire :

the wire to remove

bt_main_page_machines_rename_machine ()

void                bt_main_page_machines_rename_machine
                                                        (const BtMainPageMachines *self,
                                                         BtMachine *machine);

Run the machine BtMachineRenameDialog.

self :

the machines page

machine :

the machine to renam

Property Details

The "canvas" property

  "canvas"                   GnomeCanvas*          : Read

Get the machine canvas.

See Also

BtSetup
buzztard-0.6.0/docs/reference/bt-edit/html/BtMainPagePatterns.html0000644042355400116100000003367311675570704022101 00000000000000 BtMainPagePatterns

BtMainPagePatterns

BtMainPagePatterns — the editor main pattern page

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBox
                                 +----GtkVBox
                                       +----BtMainPagePatterns

Implemented Interfaces

BtMainPagePatterns implements AtkImplementorIface, GtkBuildable and GtkOrientable.

Description

Provides an editor for BtPattern instances.

Details

struct BtMainPagePatterns

struct BtMainPagePatterns;

the pattern page for the editor application


bt_main_page_patterns_new ()

BtMainPagePatterns * bt_main_page_patterns_new          (const BtMainPages *pages);

Create a new instance

pages :

the page collection

Returns :

the new instance

bt_main_page_patterns_show_pattern ()

void                bt_main_page_patterns_show_pattern  (const BtMainPagePatterns *self,
                                                         BtPattern *pattern);

Show the given pattern. Will update machine and pattern menu.

self :

the pattern subpage

pattern :

the pattern to show

bt_main_page_patterns_show_machine ()

void                bt_main_page_patterns_show_machine  (const BtMainPagePatterns *self,
                                                         BtMachine *machine);

Show the given machine. Will update machine menu.

self :

the pattern subpage

machine :

the machine to show

bt_main_page_patterns_delete_selection ()

void                bt_main_page_patterns_delete_selection
                                                        (const BtMainPagePatterns *self);

Delete (clear) the selected area.

self :

the pattern subpage

bt_main_page_patterns_cut_selection ()

void                bt_main_page_patterns_cut_selection (const BtMainPagePatterns *self);

Cut selected area.

self :

the pattern subpage

bt_main_page_patterns_copy_selection ()

void                bt_main_page_patterns_copy_selection
                                                        (const BtMainPagePatterns *self);

Copy selected area.

self :

the sequence subpage

bt_main_page_patterns_paste_selection ()

void                bt_main_page_patterns_paste_selection
                                                        (const BtMainPagePatterns *self);

Paste at the top of the selected area.

self :

the pattern subpage
buzztard-0.6.0/docs/reference/bt-edit/html/pr01.html0000644042355400116100000000412611675570704017162 00000000000000 Introduction

Introduction

Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch.

The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures.

buzztard-0.6.0/docs/reference/bt-edit/html/BtChangeLog.html0000644042355400116100000004653411675570704020526 00000000000000 BtChangeLog

BtChangeLog

BtChangeLog — class for the editor action journaling

Synopsis

#include "bt-edit.h"

struct              BtChangeLog;
BtChangeLog *       bt_change_log_new                   (void);
gboolean            bt_change_log_is_active             (BtChangeLog *self);
void                bt_change_log_add                   (BtChangeLog *self,
                                                         BtChangeLogger *owner,
                                                         gchar *undo_data,
                                                         gchar *redo_data);
void                bt_change_log_redo                  (BtChangeLog *self);
void                bt_change_log_undo                  (BtChangeLog *self);
void                bt_change_log_start_group           (BtChangeLog *self);
void                bt_change_log_end_group             (BtChangeLog *self);
gboolean            bt_change_log_recover               (BtChangeLog *self,
                                                         const gchar *log_name);
void                bt_change_log_register              (BtChangeLog *self,
                                                         BtChangeLogger *logger);

Object Hierarchy

  GObject
   +----BtChangeLog

Properties

  "can-redo"                 gboolean              : Read
  "can-undo"                 gboolean              : Read
  "crash-logs"               gpointer              : Read

Description

Tracks edits actions since last save. Provides undo/redo. Supports grouping of edits into single undo/redo items (see bt_change_log_start_group()).

Edit actions are logged to disk for crash recovery. Groups are logged atomically, when they are closed (to have a recoverable log).

Logs are reset when saving a song. The log is removed when a song is closed.

BtEditApplication checks for left-over logs at startup and uses BtCrashRecoverDialog to offer a list of recoverable songs to the user.

Details

struct BtChangeLog

struct BtChangeLog;

Editor action journal.


bt_change_log_new ()

BtChangeLog *       bt_change_log_new                   (void);

Create a new instance on first call and return a reference later on.

Returns :

the new signleton instance

bt_change_log_is_active ()

gboolean            bt_change_log_is_active             (BtChangeLog *self);

Checks if the changelog journalling is active. Should be checked before adding entries to avoid logging when e.g. loading a song.

self :

the changelog

Returns :

TRUE if the log is active

bt_change_log_add ()

void                bt_change_log_add                   (BtChangeLog *self,
                                                         BtChangeLogger *owner,
                                                         gchar *undo_data,
                                                         gchar *redo_data);

Add a new change to the change log. Changes are passed as serialized strings. The change-log takes ownership of undo_data and redo_data.

self :

the change log

owner :

the owner of the change

undo_data :

how to undo the change

redo_data :

how to redo the change

bt_change_log_redo ()

void                bt_change_log_redo                  (BtChangeLog *self);

Redo the last action.

self :

the change log

bt_change_log_undo ()

void                bt_change_log_undo                  (BtChangeLog *self);

Undo the last action.

self :

the change log

bt_change_log_start_group ()

void                bt_change_log_start_group           (BtChangeLog *self);

Open a new group. All further bt_change_log_add() calls will add to the active group. The group needs to be closed using bt_change_log_end_group(). Groups can be nested.

A top-level group is undone or redone with a single bt_change_log_undo() or bt_change_log_redo() call.

One would start and finish such a group in the first signal handler that triggered the change.

self :

the change log

bt_change_log_end_group ()

void                bt_change_log_end_group             (BtChangeLog *self);

Closed the last group opened with bt_change_log_start_group(). Usually one a group would be closed in the same local scope where it was opened.

self :

the change log

bt_change_log_recover ()

gboolean            bt_change_log_recover               (BtChangeLog *self,
                                                         const gchar *log_name);

Recover the given song.

Return: TRUE for successful recovery.

self :

the changelog

log_name :

the log file to replay

bt_change_log_register ()

void                bt_change_log_register              (BtChangeLog *self,
                                                         BtChangeLogger *logger);

Register a change-logger for use in change log replay.

self :

the change log

logger :

a change logger

Property Details

The "can-redo" property

  "can-redo"                 gboolean              : Read

Where there are action to redo.

Default value: FALSE


The "can-undo" property

  "can-undo"                 gboolean              : Read

Where there are action to undo.

Default value: FALSE


The "crash-logs" property

  "crash-logs"               gpointer              : Read

A list of found crash logs.

See Also

BtCrashRecoverDialog
buzztard-0.6.0/docs/reference/bt-edit/html/BtMissingFrameworkElementsDialog.html0000644042355400116100000002435011675570704024773 00000000000000 BtMissingFrameworkElementsDialog

BtMissingFrameworkElementsDialog

BtMissingFrameworkElementsDialog — missing core and application elements

Object Hierarchy

  GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                             +----BtMissingFrameworkElementsDialog

Implemented Interfaces

BtMissingFrameworkElementsDialog implements AtkImplementorIface and GtkBuildable.

Properties

  "core-elements"            gpointer              : Write / Construct Only
  "edit-elements"            gpointer              : Write / Construct Only

Description

A dialog to inform about missing core and application elements.

Details

struct BtMissingFrameworkElementsDialog

struct BtMissingFrameworkElementsDialog;

the root window for the editor application


bt_missing_framework_elements_dialog_new ()

BtMissingFrameworkElementsDialog * bt_missing_framework_elements_dialog_new
                                                        (GList *core_elements,
                                                         GList *edit_elements);

Create a new instance

core_elements :

list of missing core elements

edit_elements :

list of missing edit elements

Returns :

the new instance or NULL in case there is nothing new to show

bt_missing_framework_elements_dialog_apply ()

void                bt_missing_framework_elements_dialog_apply
                                                        (const BtMissingFrameworkElementsDialog *self);

Makes the dialog settings effective.

self :

the dialog which settings to apply

Property Details

The "core-elements" property

  "core-elements"            gpointer              : Write / Construct Only

Set missing core-elements list, the dialog handles.


The "edit-elements" property

  "edit-elements"            gpointer              : Write / Construct Only

Set missing edit-elements list, the dialog handles.

buzztard-0.6.0/docs/reference/bt-edit/html/buzztard-edit.devhelp20000644042355400116100000014060111675570704021734 00000000000000 buzztard-0.6.0/docs/reference/bt-edit/html/ch01.html0000644042355400116100000002361211675570704017134 00000000000000 Main Class Reference

Main Class Reference

btedit — buzztard graphical editor application
BtAboutDialog — class for the editor about dialog
BtChangeLog — class for the editor action journaling
BtChangeLogger — interface for the editor action journaling
BtCrashRecoverDialog — class for the song recovery dialog
BtEditApplication — class for a gtk based buzztard editor application
BtInteractionControllerMenu — class for the interaction controller assignment popup menu
BtInteractionControllerLearnDialog — learn dialog for interaction devices
BtMachineActions — shared machine released ui actions
BtMachineCanvasItem — class for the editor machine views machine canvas item
BtMachineListModel — data model class for widgets showing machines of a song
BtMachineMenu — class for the machine selection popup menu
BtMachinePreferencesDialog — machine non-realtime parameters
BtMachinePresetPropertiesDialog — machine preset settings
BtMachinePropertiesDialog — machine realtime parameters
BtMachineRenameDialog — machine settings
BtMainMenu — class for the editor main menu
BtMainPageInfo — the editor main info page
BtMainPageMachines — the editor main machines page
BtMainPagePatterns — the editor main pattern page
BtMainPageSequence — the editor main sequence page
BtMainPageWaves — the editor wavetable page
BtMainPages — class for the editor main pages
BtMainStatusbar — class for the editor main statusbar
BtMainToolbar — class for the editor main toolbar
BtMainWindow — root buzztard editor window
BtMissingFrameworkElementsDialog — missing core and application elements
BtMissingSongElementsDialog — missing song machine and wave elements
BtObjectListModel — data model class for some widgets
BtPanoramaPopup — panorama popup widget
BtPatternListModel — data model class for widgets showing pattern of a song
BtPatternPropertiesDialog — pattern settings
BtRenderDialog — class for the editor render dialog
BtRenderProgress — class for the editor render progress
BtSequenceGridModel — data model class for widgets showing the pattern sequence of a song
BtSequenceView — the editor main sequence table view
BtSettingsDialog — class for the editor settings dialog
BtSettingsPageAudiodevices — audio device configuration settings page
BtSettingsPageInteractionController — interaction controller configuration settings page
BtSettingsPagePlaybackController — playback controller configuration settings page
BtSettingsPageDirectories — default directory configuration settings page
BtSettingsPageShortcuts — keyboard shortcut settings page
BtSignalAnalysisDialog — audio analysis window
BtTipDialog — class for the editor tip-of-the-day dialog
BtUIResources — common shared ui resources like icons and colors
BtVolumePopup — volume popup widget
BtWireCanvasItem — class for the editor wire views wire canvas item
buzztard-0.6.0/docs/reference/bt-edit/buzztard-edit-sections.txt0000644042355400116100000006164711675570704021737 00000000000000# $Id: buzztard-edit-sections.txt 3754 2011-12-07 07:44:11Z ensonic $ # :mode=html: # please add section in the alpahbetical order using the following template #
# btxxx # BtXxx # #
"bt-edit.h"
btaboutdialog BtAboutDialog BtAboutDialog bt_about_dialog_new BtAboutDialogClass BT_ABOUT_DIALOG BT_IS_ABOUT_DIALOG BT_TYPE_ABOUT_DIALOG BT_ABOUT_DIALOG_CLASS BT_IS_ABOUT_DIALOG_CLASS BT_ABOUT_DIALOG_GET_CLASS bt_about_dialog_get_type BtAboutDialogPrivate
btchangelog BtChangeLog BtChangeLog bt_change_log_new bt_change_log_is_active bt_change_log_add bt_change_log_redo bt_change_log_undo bt_change_log_start_group bt_change_log_end_group bt_change_log_recover bt_change_log_register BtChangeLogClass BtChangeLogFile BT_CHANGE_LOG BT_IS_CHANGE_LOG BT_TYPE_CHANGE_LOG BT_CHANGE_LOG_CLASS BT_IS_CHANGE_LOG_CLASS BT_CHANGE_LOG_GET_CLASS bt_change_log_get_type BtChangeLogPrivate
btchangelogger BtChangeLogger BT_CHANGE_LOGGER_METHOD bt_change_logger_change bt_change_logger_match_method BtChangeLogger BtChangeLoggerMethods BtChangeLoggerInterface BT_CHANGE_LOGGER BT_IS_CHANGE_LOGGER BT_TYPE_CHANGE_LOGGER BT_CHANGE_LOGGER_GET_INTERFACE bt_change_logger_get_type
btcrashrecoverdialog BtCrashRecoverDialog bt_crash_recover_dialog_new BtCrashRecoverDialog BtCrashRecoverDialogClass BT_CRASH_RECOVER_DIALOG BT_IS_CRASH_RECOVER_DIALOG BT_CRASH_RECOVER_DIALOG_CLASS BT_IS_CRASH_RECOVER_DIALOG_CLASS BT_TYPE_CRASH_RECOVER_DIALOG BT_CRASH_RECOVER_DIALOG_GET_CLASS bt_crash_recover_dialog_get_type BtCrashRecoverDialogPrivate
bteditapplication BtEditApplication BtEditApplication bt_edit_application_new bt_edit_application_new_song bt_edit_application_load_song bt_edit_application_save_song bt_edit_application_run bt_edit_application_load_and_run bt_edit_application_quit bt_edit_application_show_about bt_edit_application_show_tip bt_edit_application_crash_log_recover bt_edit_application_attach_child_window bt_edit_application_ui_lock bt_edit_application_ui_unlock bt_edit_application_is_song_unsaved bt_edit_application_set_song_unsaved BtEditApplicationClass BT_EDIT_APPLICATION BT_IS_EDIT_APPLICATION BT_EDIT_APPLICATION_CLASS BT_IS_EDIT_APPLICATION_CLASS BT_EDIT_APPLICATION_GET_CLASS BT_TYPE_EDIT_APPLICATION bt_edit_application_get_type BtEditApplicationPrivate
btinteractioncontrollermenu BtInteractionControllerMenu BtInteractionControllerMenu BtInteractionControllerMenuType bt_interaction_controller_menu_new BtInteractionControllerMenuClass BT_INTERACTION_CONTROLLER_MENU BT_IS_INTERACTION_CONTROLLER_MENU BT_INTERACTION_CONTROLLER_MENU_CLASS BT_IS_INTERACTION_CONTROLLER_MENU_CLASS BT_INTERACTION_CONTROLLER_MENU_GET_CLASS BT_TYPE_INTERACTION_CONTROLLER_MENU BT_TYPE_INTERACTION_CONTROLLER_MENU_TYPE bt_interaction_controller_menu_get_type bt_interaction_controller_menu_type_get_type BtInteractionControllerMenuPrivate
btinteractioncontrollerlearndialog BtInteractionControllerLearnDialog BtInteractionControllerLearnDialog bt_interaction_controller_learn_dialog_new BtInteractionControllerLearnDialogClass BT_INTERACTION_CONTROLLER_LEARN_DIALOG BT_IS_INTERACTION_CONTROLLER_LEARN_DIALOG BT_INTERACTION_CONTROLLER_LEARN_DIALOG_CLASS BT_IS_INTERACTION_CONTROLLER_LEARN_DIALOG_CLASS BT_INTERACTION_CONTROLLER_LEARN_DIALOG_GET_CLASS BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG bt_interaction_controller_learn_dialog_get_type BtInteractionControllerLearnDialogPrivate
btmachineactions BtMachineActions bt_machine_action_about
btmachinecanvasitem BtMachineCanvasItem BtMachineCanvasItem bt_machine_canvas_item_new bt_machine_show_properties_dialog bt_machine_show_preferences_dialog bt_machine_show_analyzer_dialog BtMachineCanvasItemClass BT_MACHINE_CANVAS_ITEM BT_IS_MACHINE_CANVAS_ITEM BT_MACHINE_CANVAS_ITEM_CLASS BT_IS_MACHINE_CANVAS_ITEM_CLASS BT_MACHINE_CANVAS_ITEM_GET_CLASS BT_TYPE_MACHINE_CANVAS_ITEM bt_machine_canvas_item_get_type BtMachineCanvasItemPrivate
btmachinelistmodel BtMachineListModel BtMachineListModel bt_machine_list_model_get_object bt_machine_list_model_new BtMachineListModelClass BT_MACHINE_LIST_MODEL BT_IS_MACHINE_LIST_MODEL BT_MACHINE_LIST_MODEL_CLASS BT_IS_MACHINE_LIST_MODEL_CLASS BT_MACHINE_LIST_MODEL_GET_CLASS BT_TYPE_MACHINE_LIST_MODEL bt_machine_list_model_get_type BtMachineListModelPrivate
btmachinemenu BtMachineMenu BtMachineMenu bt_machine_menu_new BtMachineMenuClass BT_MACHINE_MENU BT_IS_MACHINE_MENU BT_MACHINE_MENU_CLASS BT_IS_MACHINE_MENU_CLASS BT_MACHINE_MENU_GET_CLASS BT_TYPE_MACHINE_MENU bt_machine_menu_get_type BtMachineMenuPrivate
btmachinepreferencesdialog BtMachinePreferencesDialog BtMachinePreferencesDialog bt_machine_preferences_dialog_new BtMachinePreferencesDialogClass BT_MACHINE_PREFERENCES_DIALOG BT_IS_MACHINE_PREFERENCES_DIALOG BT_MACHINE_PREFERENCES_DIALOG_CLASS BT_IS_MACHINE_PREFERENCES_DIALOG_CLASS BT_MACHINE_PREFERENCES_DIALOG_GET_CLASS BT_TYPE_MACHINE_PREFERENCES_DIALOG bt_machine_preferences_dialog_get_type BtMachinePreferencesDialogPrivate
btmachinepresetpropertiesdialog BtMachinePresetPropertiesDialog BtMachinePresetPropertiesDialog bt_machine_preset_properties_dialog_new bt_machine_preset_properties_dialog_apply BtMachinePresetPropertiesDialogClass BT_MACHINE_PRESET_PROPERTIES_DIALOG BT_IS_MACHINE_PRESET_PROPERTIES_DIALOG BT_MACHINE_PRESET_PROPERTIES_DIALOG_CLASS BT_IS_MACHINE_PRESET_PROPERTIES_DIALOG_CLASS BT_MACHINE_PRESET_PROPERTIES_DIALOG_GET_CLASS BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG bt_machine_preset_properties_dialog_get_type BtMachinePresetPropertiesDialogPrivate
btmachinepropertiesdialog BtMachinePropertiesDialog BtMachinePropertiesDialog bt_machine_properties_dialog_new BtMachinePropertiesDialogClass BT_MACHINE_PROPERTIES_DIALOG BT_IS_MACHINE_PROPERTIES_DIALOG BT_MACHINE_PROPERTIES_DIALOG_CLASS BT_IS_MACHINE_PROPERTIES_DIALOG_CLASS BT_MACHINE_PROPERTIES_DIALOG_GET_CLASS BT_TYPE_MACHINE_PROPERTIES_DIALOG bt_machine_properties_dialog_get_type BtMachinePropertiesDialogPrivate
btmachinerenamedialog BtMachineRenameDialog BtMachineRenameDialog bt_machine_rename_dialog_new bt_machine_rename_dialog_apply BtMachineRenameDialogClass BT_MACHINE_RENAME_DIALOG BT_IS_MACHINE_RENAME_DIALOG BT_TYPE_MACHINE_RENAME_DIALOG BT_MACHINE_RENAME_DIALOG_CLASS BT_IS_MACHINE_RENAME_DIALOG_CLASS BT_MACHINE_RENAME_DIALOG_GET_CLASS bt_machine_rename_dialog_get_type BtMachineRenameDialogPrivate
btmainmenu BtMainMenu BtMainMenu bt_main_menu_new BtMainMenuClass BT_MAIN_MENU BT_IS_MAIN_MENU BT_MAIN_MENU_CLASS BT_IS_MAIN_MENU_CLASS BT_MAIN_MENU_GET_CLASS BT_TYPE_MAIN_MENU bt_main_menu_get_type BtMainMenuPrivate
btmainpages BtMainPages BtMainPages bt_main_pages_new BtMainPagesClass BT_MAIN_PAGES BT_IS_MAIN_PAGES BT_MAIN_PAGES_CLASS BT_IS_MAIN_PAGES_CLASS BT_MAIN_PAGES_GET_CLASS BT_TYPE_MAIN_PAGES bt_main_pages_get_type BtMainPagesPrivate
btmainpageinfo BtMainPageInfo BtMainPageInfo bt_main_page_info_new BtMainPageInfoClass BT_MAIN_PAGE_INFO BT_IS_MAIN_PAGE_INFO BT_MAIN_PAGE_INFO_CLASS BT_IS_MAIN_PAGE_INFO_CLASS BT_MAIN_PAGE_INFO_GET_CLASS BT_TYPE_MAIN_PAGE_INFO bt_main_page_info_get_type BtMainPageInfoPrivate
btmainpagemachines BtMainPageMachines BtMainPageMachines bt_main_page_machines_new bt_main_page_machines_wire_volume_popup bt_main_page_machines_wire_panorama_popup bt_main_page_machines_add_source_machine bt_main_page_machines_add_processor_machine bt_main_page_machines_delete_machine bt_main_page_machines_delete_wire bt_main_page_machines_rename_machine BtMainPageMachinesClass BT_MAIN_PAGE_MACHINES BT_IS_MAIN_PAGE_MACHINES BT_MAIN_PAGE_MACHINES_CLASS BT_IS_MAIN_PAGE_MACHINES_CLASS BT_MAIN_PAGE_MACHINES_GET_CLASS BT_TYPE_MAIN_PAGE_MACHINES bt_main_page_machines_get_type BtMainPageMachinesPrivate MACHINE_VIEW_FONT_SIZE MACHINE_VIEW_GRID_FC MACHINE_VIEW_MACHINE_SIZE_X MACHINE_VIEW_MACHINE_SIZE_Y MACHINE_VIEW_WIRE_PAD_SIZE MACHINE_VIEW_ZOOM_FC MACHINE_VIEW_ZOOM_X MACHINE_VIEW_ZOOM_Y machine_view_get_machine_position
btmainpagepatterns BtMainPagePatterns BtMainPagePatterns bt_main_page_patterns_new bt_main_page_patterns_show_pattern bt_main_page_patterns_show_machine bt_main_page_patterns_delete_selection bt_main_page_patterns_cut_selection bt_main_page_patterns_copy_selection bt_main_page_patterns_paste_selection BtMainPagePatternsClass BT_MAIN_PAGE_PATTERNS BT_IS_MAIN_PAGE_PATTERNS BT_MAIN_PAGE_PATTERNS_CLASS BT_IS_MAIN_PAGE_PATTERNS_CLASS BT_MAIN_PAGE_PATTERNS_GET_CLASS BT_TYPE_MAIN_PAGE_PATTERNS bt_main_page_patterns_get_type BtMainPagePatternsPrivate
btmainpagesequence BtMainPageSequence BtMainPageSequence bt_main_page_sequence_new bt_main_page_sequence_delete_selection bt_main_page_sequence_copy_selection bt_main_page_sequence_cut_selection bt_main_page_sequence_paste_selection BtMainPageSequenceClass BT_MAIN_PAGE_SEQUENCE BT_IS_MAIN_PAGE_SEQUENCE BT_MAIN_PAGE_SEQUENCE_CLASS BT_IS_MAIN_PAGE_SEQUENCE_CLASS BT_MAIN_PAGE_SEQUENCE_GET_CLASS BT_TYPE_MAIN_PAGE_SEQUENCE bt_main_page_sequence_get_type BtMainPageSequencePrivate
btmainpagewaves BtMainPageWaves BtMainPageWaves bt_main_page_waves_new BtMainPageWavesClass BT_MAIN_PAGE_WAVES BT_IS_MAIN_PAGE_WAVES BT_MAIN_PAGE_WAVES_CLASS BT_IS_MAIN_PAGE_WAVES_CLASS BT_MAIN_PAGE_WAVES_GET_CLASS BT_TYPE_MAIN_PAGE_WAVES bt_main_page_waves_get_type BtMainPageWavesPrivate
btmainstatusbar BtMainStatusbar BtMainStatusbar BT_MAIN_STATUSBAR_DEFAULT bt_main_statusbar_new BtMainStatusbarClass BT_MAIN_STATUSBAR BT_IS_MAIN_STATUSBAR BT_MAIN_STATUSBAR_CLASS BT_IS_MAIN_STATUSBAR_CLASS BT_MAIN_STATUSBAR_GET_CLASS BT_TYPE_MAIN_STATUSBAR bt_main_statusbar_get_type BtMainStatusbarPrivate
btmaintoolbar BtMainToolbar BtMainToolbar bt_main_toolbar_new BtMainToolbarClass BT_MAIN_TOOLBAR BT_IS_MAIN_TOOLBAR BT_MAIN_TOOLBAR_CLASS BT_IS_MAIN_TOOLBAR_CLASS BT_MAIN_TOOLBAR_GET_CLASS BT_TYPE_MAIN_TOOLBAR bt_main_toolbar_get_type BtMainToolbarPrivate
btmainwindow BtMainWindow BtMainWindow bt_main_window_new bt_main_window_check_unsaved_song bt_main_window_check_quit bt_main_window_new_song bt_main_window_open_song bt_main_window_save_song bt_main_window_save_song_as bt_dialog_message bt_dialog_question BtMainWindowClass BT_MAIN_WINDOW BT_IS_MAIN_WINDOW BT_MAIN_WINDOW_CLASS BT_IS_MAIN_WINDOW_CLASS BT_MAIN_WINDOW_GET_CLASS BT_TYPE_MAIN_WINDOW bt_main_window_get_type BtMainWindowPrivate
btmemoryaudiosrc BtMemoryAudioSrc BtMemoryAudioSrc BtMemoryAudioSrcClass BT_MEMORY_AUDIO_SRC BT_IS_MEMORY_AUDIO_SRC BT_TYPE_MEMORY_AUDIO_SRC BT_MEMORY_AUDIO_SRC_CLASS BT_IS_MEMORY_AUDIO_SRC_CLASS bt_memory_audio_src_get_type
btmissingframeworkelementsdialog BtMissingFrameworkElementsDialog BtMissingFrameworkElementsDialog bt_missing_framework_elements_dialog_new bt_missing_framework_elements_dialog_apply BtMissingFrameworkElementsDialogClass BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG BT_IS_MISSING_FRAMEWORK_ELEMENTS_DIALOG BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_CLASS BT_IS_MISSING_FRAMEWORK_ELEMENTS_DIALOG_CLASS BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_GET_CLASS BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG bt_missing_framework_elements_dialog_get_type BtMissingFrameworkElementsDialogPrivate
btmissingsongelementsdialog BtMissingSongElementsDialog BtMissingSongElementsDialog bt_missing_song_elements_dialog_new BtMissingSongElementsDialogClass BT_MISSING_SONG_ELEMENTS_DIALOG BT_IS_MISSING_SONG_ELEMENTS_DIALOG BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG BT_MISSING_SONG_ELEMENTS_DIALOG_CLASS BT_IS_MISSING_SONG_ELEMENTS_DIALOG_CLASS BT_MISSING_SONG_ELEMENTS_DIALOG_GET_CLASS bt_missing_song_elements_dialog_get_type BtMissingSongElementsDialogPrivate
btobjectlistmodel BtObjectListModel BtObjectListModel bt_object_list_model_append bt_object_list_model_get_object bt_object_list_model_new BtObjectListModelClass BT_OBJECT_LIST_MODEL BT_IS_OBJECT_LIST_MODEL BT_OBJECT_LIST_MODEL_CLASS BT_IS_OBJECT_LIST_MODEL_CLASS BT_OBJECT_LIST_MODEL_GET_CLASS BT_TYPE_OBJECT_LIST_MODEL bt_object_list_model_get_type BtObjectListModelPrivate
btpanoramapopup BtPanoramaPopup BtPanoramaPopup bt_panorama_popup_new bt_panorama_popup_show bt_panorama_popup_hide BtPanoramaPopupClass BT_PANORAMA_POPUP BT_IS_PANORAMA_POPUP BT_PANORAMA_POPUP_CLASS BT_IS_PANORAMA_POPUP_CLASS BT_PANORAMA_POPUP_GET_CLASS BT_TYPE_PANORAMA_POPUP bt_panorama_popup_get_type
btpatterneditor BtPatternEditor BtPatternEditor BtPatternEditorCallbacks BtPatternEditorColumn BtPatternEditorColumnType BtPatternEditorColumnGroup BtPatternEditorColumnGroupType BtPatternEditorSelectionMode bt_pattern_editor_new bt_pattern_editor_set_pattern bt_pattern_editor_get_selection BtPatternEditorClass BT_PATTERN_EDITOR BT_IS_PATTERN_EDITOR BT_PATTERN_EDITOR_CLASS BT_IS_PATTERN_EDITOR_CLASS BT_TYPE_PATTERN_EDITOR bt_pattern_editor_get_type BtPatternEditorPrivate
btpatternlistmodel BtPatternListModel BtPatternListModel bt_pattern_list_model_get_object bt_pattern_list_model_new BtPatternListModelClass BT_PATTERN_LIST_MODEL BT_IS_PATTERN_LIST_MODEL BT_PATTERN_LIST_MODEL_CLASS BT_IS_PATTERN_LIST_MODEL_CLASS BT_PATTERN_LIST_MODEL_GET_CLASS BT_TYPE_PATTERN_LIST_MODEL bt_pattern_list_model_get_type BtPatternListModelPrivate
btpatternpropertiesdialog BtPatternPropertiesDialog BtPatternPropertiesDialog bt_pattern_properties_dialog_new bt_pattern_properties_dialog_apply BtPatternPropertiesDialogClass BT_PATTERN_PROPERTIES_DIALOG BT_IS_PATTERN_PROPERTIES_DIALOG BT_PATTERN_PROPERTIES_DIALOG_CLASS BT_IS_PATTERN_PROPERTIES_DIALOG_CLASS BT_PATTERN_PROPERTIES_DIALOG_GET_CLASS BT_TYPE_PATTERN_PROPERTIES_DIALOG bt_pattern_properties_dialog_get_type BtPatternPropertiesDialogPrivate
btplaybackcontrollersocket BtPlaybackControllerSocket BtPlaybackControllerSocket bt_playback_controller_socket_new BtPlaybackControllerSocketClass BT_PLAYBACK_CONTROLLER_SOCKET BT_IS_PLAYBACK_CONTROLLER_SOCKET BT_PLAYBACK_CONTROLLER_SOCKET_CLASS BT_IS_PLAYBACK_CONTROLLER_SOCKET_CLASS BT_PLAYBACK_CONTROLLER_SOCKET_GET_CLASS BT_TYPE_PLAYBACK_CONTROLLER_SOCKET bt_playback_controller_socket_get_type BtPlaybackControllerSocketPrivate
btrenderdialog BtRenderDialog BtRenderDialog BtRenderMode bt_render_dialog_new BtRenderDialogClass BT_RENDER_DIALOG BT_IS_RENDER_DIALOG BT_TYPE_RENDER_DIALOG BT_RENDER_DIALOG_CLASS BT_IS_RENDER_DIALOG_CLASS BT_RENDER_DIALOG_GET_CLASS bt_render_dialog_get_type BtRenderDialogPrivate BT_TYPE_RENDER_MODE bt_render_mode_get_type
btrenderprogress BtRenderProgress BtRenderProgress bt_render_progress_new bt_render_progress_run BtRenderProgressClass BT_RENDER_PROGRESS BT_IS_RENDER_PROGRESS BT_TYPE_RENDER_PROGRESS BT_RENDER_PROGRESS_CLASS BT_IS_RENDER_PROGRESS_CLASS BT_RENDER_PROGRESS_GET_CLASS bt_render_progress_get_type BtRenderProgressPrivate
btruler BtRuler BtRuler gtk_vumeter_new bt_ruler_set_metric bt_ruler_get_metric bt_ruler_set_range bt_ruler_get_range BtRulerClass BtRulerPrivate BtRulerMetric BT_RULER_MAXIMUM_SCALES BT_RULER_MAXIMUM_SUBDIVIDE BT_RULER BT_IS_RULER BT_RULER_CLASS BT_IS_RULER_CLASS BT_RULER_GET_CLASS BT_TYPE_RULER bt_ruler_get_type
btsequencegridmodel BtSequenceGridModel BtSequenceGridModel BtSequenceGridModelPosFormat bt_sequence_grid_model_new BtSequenceGridModelClass BT_SEQUENCE_GRID_MODEL BT_IS_SEQUENCE_GRID_MODEL BT_SEQUENCE_GRID_MODEL_CLASS BT_IS_SEQUENCE_GRID_MODEL_CLASS BT_SEQUENCE_GRID_MODEL_GET_CLASS BT_TYPE_SEQUENCE_GRID_MODEL bt_sequence_grid_model_get_type BtSequenceGridModelPrivate BT_TYPE_SEQUENCE_GRID_MODEL_POS_FORMAT bt_sequence_grid_model_pos_format_get_type
btsequenceview BtSequenceView BtSequenceView bt_sequence_view_new BtSequenceViewClass BT_SEQUENCE_VIEW BT_IS_SEQUENCE_VIEW BT_SEQUENCE_VIEW_CLASS BT_IS_SEQUENCE_VIEW_CLASS BT_SEQUENCE_VIEW_GET_CLASS BT_TYPE_SEQUENCE_VIEW bt_sequence_view_get_type BtSequenceViewPrivate
btsettingsdialog BtSettingsDialog BtSettingsDialog BtSettingsPage bt_settings_dialog_new BtSettingsDialogClass BT_SETTINGS_DIALOG BT_IS_SETTINGS_DIALOG BT_SETTINGS_DIALOG_CLASS BT_IS_SETTINGS_DIALOG_CLASS BT_SETTINGS_DIALOG_GET_CLASS BT_TYPE_SETTINGS_DIALOG BT_TYPE_SETTINGS_PAGE bt_settings_dialog_get_type bt_settings_page_get_type BtSettingsDialogPrivate
btsettingspageaudiodevices BtSettingsPageAudiodevices BtSettingsPageAudiodevices bt_settings_page_audiodevices_new BtSettingsPageAudiodevicesClass BT_SETTINGS_PAGE_AUDIODEVICES BT_IS_SETTINGS_PAGE_AUDIODEVICES BT_SETTINGS_PAGE_AUDIODEVICES_CLASS BT_IS_SETTINGS_PAGE_AUDIODEVICES_CLASS BT_SETTINGS_PAGE_AUDIODEVICES_GET_CLASS BT_TYPE_SETTINGS_PAGE_AUDIODEVICES bt_settings_page_audiodevices_get_type BtSettingsPageAudiodevicesPrivate
btsettingspageinteractioncontroller BtSettingsPageInteractionController BtSettingsPageInteractionController bt_settings_page_interaction_controller_new BtSettingsPageInteractionControllerClass BT_SETTINGS_PAGE_INTERACTION_CONTROLLER BT_IS_SETTINGS_PAGE_INTERACTION_CONTROLLER BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_CLASS BT_IS_SETTINGS_PAGE_INTERACTION_CONTROLLER_CLASS BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_GET_CLASS BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER bt_settings_page_interaction_controller_get_type BtSettingsPageInteractionControllerPrivate
btsettingspageplaybackcontroller BtSettingsPagePlaybackController BtSettingsPagePlaybackController bt_settings_page_playback_controller_new BtSettingsPagePlaybackControllerClass BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER BT_IS_SETTINGS_PAGE_PLAYBACK_CONTROLLER BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_CLASS BT_IS_SETTINGS_PAGE_PLAYBACK_CONTROLLER_CLASS BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_GET_CLASS BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER bt_settings_page_playback_controller_get_type BtSettingsPagePlaybackControllerPrivate
btsettingspagedirectories BtSettingsPageDirectories BtSettingsPageDirectories bt_settings_page_directories_new BtSettingsPageDirectoriesClass BT_SETTINGS_PAGE_DIRECTORIES BT_IS_SETTINGS_PAGE_DIRECTORIES BT_SETTINGS_PAGE_DIRECTORIES_CLASS BT_IS_SETTINGS_PAGE_DIRECTORIES_CLASS BT_SETTINGS_PAGE_DIRECTORIES_GET_CLASS BT_TYPE_SETTINGS_PAGE_DIRECTORIES bt_settings_page_directories_get_type BtSettingsPageDirectoriesPrivate
btsettingspageshortcuts BtSettingsPageShortcuts BtSettingsPageShortcuts bt_settings_page_shortcuts_new BtSettingsPageShortcutsClass BT_SETTINGS_PAGE_SHORTCUTS BT_IS_SETTINGS_PAGE_SHORTCUTS BT_SETTINGS_PAGE_SHORTCUTS_CLASS BT_IS_SETTINGS_PAGE_SHORTCUTS_CLASS BT_SETTINGS_PAGE_SHORTCUTS_GET_CLASS BT_TYPE_SETTINGS_PAGE_SHORTCUTS bt_settings_page_shortcuts_get_type BtSettingsPageShortcutsPrivate
btsignalanalysisdialog BtSignalAnalysisDialog BtSignalAnalysisDialog bt_signal_analysis_dialog_new BtSignalAnalysisDialogClass BT_SIGNAL_ANALYSIS_DIALOG BT_IS_SIGNAL_ANALYSIS_DIALOG BT_SIGNAL_ANALYSIS_DIALOG_CLASS BT_IS_SIGNAL_ANALYSIS_DIALOG_CLASS BT_SIGNAL_ANALYSIS_DIALOG_GET_CLASS BT_TYPE_SIGNAL_ANALYSIS_DIALOG bt_signal_analysis_dialog_get_type BtSignalAnalysisDialogPrivate
bttipdialog BtTipDialog BtTipDialog bt_tip_dialog_new BtTipDialogClass BT_TIP_DIALOG BT_IS_TIP_DIALOG BT_TYPE_TIP_DIALOG BT_TIP_DIALOG_CLASS BT_IS_TIP_DIALOG_CLASS BT_TIP_DIALOG_GET_CLASS bt_tip_dialog_get_type BtTipDialogPrivate
btuiresources BtUIResources BtUIResources BtUIResourcesColors BtUIResourcesMachineColors bt_ui_resources_new bt_ui_resources_get_icon_pixbuf_by_machine bt_ui_resources_get_machine_graphics_pixbuf_by_machine bt_ui_resources_get_icon_image_by_machine bt_ui_resources_get_icon_image_by_machine_type bt_ui_resources_get_gdk_color bt_ui_resources_get_rgb_color bt_ui_resources_get_color_by_machine bt_ui_resources_get_accel_group BtUIResourcesClass BT_UI_RESOURCES BT_IS_UI_RESOURCES BT_UI_RESOURCES_CLASS BT_IS_UI_RESOURCES_CLASS BT_UI_RESOURCES_GET_CLASS BT_TYPE_UI_RESOURCES bt_ui_resources_get_type BtUIResourcesPrivate
btvolumepopup BtVolumePopup BtVolumePopup bt_volume_popup_new bt_volume_popup_show bt_volume_popup_hide BtVolumePopupClass BT_VOLUME_POPUP BT_IS_VOLUME_POPUP BT_VOLUME_POPUP_CLASS BT_IS_VOLUME_POPUP_CLASS BT_VOLUME_POPUP_GET_CLASS BT_TYPE_VOLUME_POPUP bt_volume_popup_get_type
btwaveformviewer BtWaveformViewer BtWaveformViewer bt_waveform_viewer_new bt_waveform_viewer_set_wave BtWaveformViewerClass BT_WAVEFORM_VIEWER BT_IS_WAVEFORM_VIEWER BT_WAVEFORM_VIEWER_CLASS BT_IS_WAVEFORM_VIEWER_CLASS BT_TYPE_WAVEFORM_VIEWER bt_waveform_viewer_get_type
btwirecanvasitem BtWireCanvasItem BtWireCanvasItem bt_wire_canvas_item_new bt_wire_show_analyzer_dialog BtWireCanvasItemClass BT_WIRE_CANVAS_ITEM BT_IS_WIRE_CANVAS_ITEM BT_WIRE_CANVAS_ITEM_CLASS BT_IS_WIRE_CANVAS_ITEM_CLASS BT_WIRE_CANVAS_ITEM_GET_CLASS BT_TYPE_WIRE_CANVAS_ITEM bt_wire_canvas_item_get_type BtWireCanvasItemPrivate
gtkvumeter GtkVUMeter GtkVUMeter gtk_vumeter_new gtk_vumeter_set_min_max gtk_vumeter_set_levels gtk_vumeter_set_scale GtkVUMeterClass GTK_VUMETER GTK_IS_VUMETER GTK_VUMETER_CLASS GTK_IS_VUMETER_CLASS GTK_VUMETER_GET_CLASS GTK_TYPE_VUMETER gtk_vumeter_get_type
btedit btedit # gtk extras add_pixmap_directory gtk_image_new_from_filename gdk_pixbuf_new_from_filename gdk_pixbuf_new_from_theme gtk_toolbar_get_style_from_string gtk_target_table_make gtk_show_uri_simple GNOME_CANVAS_BROKEN_PROPERTIES BOX_BORDER SCREEN_BORDER_HEIGHT # testing bt_edit_ui_config BT_EDIT_UI_CONFIG # gtk extras GTK_CHECK_CAST GTK_CHECK_CLASS_CAST GTK_CHECK_CLASS_TYPE GTK_CHECK_GET_CLASS GTK_CHECK_TYPE gtk_dialog_get_action_area gtk_dialog_get_content_area gtk_menu_tool_button_set_arrow_tooltip_text gtk_selection_data_get_data gtk_selection_data_get_target gtk_tool_item_set_tooltip_text gtk_vumeter_set_peaks_falloff gtk_widget_get_allocation gtk_widget_get_mapped gtk_widget_get_realized gtk_widget_get_window gtk_widget_grab_focus_savely gtk_widget_is_toplevel gtk_widget_set_can_focus gtk_widget_set_has_window gtk_widget_set_realized gtk_widget_set_tooltip_text # gstreamer extras GST_CAT_DEFAULT # gettext extras _ N_ bindtextdomain dgettext gettext textdomain
buzztard-0.6.0/docs/reference/bt-edit/buzztard-edit-overrides.txt0000644042355400116100000000000011576377715022071 00000000000000buzztard-0.6.0/docs/reference/bt-edit/Makefile.in0000644042355400116100000007631411675570634016625 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ 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@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/gtk-doc.make subdir = docs/reference/bt-edit ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = 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' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE = buzztard-edit # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/src/ui/edit # Extra options to pass to gtkdoc-scangobj. Not normally needed. #SCANGOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv);gtk_init(&argc,&argv)" SCANGOBJ_OPTIONS = --type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS = --deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS = --sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GTK_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GCANVAS_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ --extra-dir=.. # Used for dependencies. HFILE_GLOB = $(top_srcdir)/src/ui/edit/*.h CFILE_GLOB = $(top_srcdir)/src/ui/edit/*.c # Header files to ignore when scanning. IGNORE_HFILES = marshal.h # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/ui/edit \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/ui/edit/libbtedit.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(GUI_DEPS_LIBS) \ $(BT_LIBS) @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) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE).types \ buzztard-edit.xml 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) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # -Wl,--no-as-needed # include generic part @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@man_MANS = \ @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@ buzztard-edit.1 @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@BUILT_EXTRA_DIST = $(man_MANS) # Comment this out if you want your docs-status tested during 'make check' @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @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: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_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/bt-edit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/bt-edit/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | 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=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @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 all-am: Makefile $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." 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-man 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-man1 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 uninstall-man uninstall-man: uninstall-man1 .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-libtool clean-local 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-man1 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 uninstall uninstall-am \ uninstall-local uninstall-man uninstall-man1 @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_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) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ 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 @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building 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) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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 \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs 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) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @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 # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc 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 @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@%.1 : %.xml @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< # 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: buzztard-0.6.0/docs/reference/bt-edit/buzztard-edit-docs.sgml0000644042355400116100000001461511667610014021142 00000000000000 %version-entities; ]> Buzztard Bt-Edit Reference Manual for Buzztard &BT_VERSION;. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-edit/. Introduction Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch. The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures. Overview User Application API Reference The classes described in this chapter are all part of end user application code. Please make sure you have read section conventions before reading further. Main Class Reference Tool Class Reference GStreamer Element Reference Widget Class Reference User Application Command Line Reference Appendix Object Hierarchy API Index Index of deprecated API Index of new API in 0.6 buzztard-0.6.0/docs/reference/bt-edit/buzztard-edit.xml0000644042355400116100000000373111576360400020047 00000000000000 the buzztard project Development and documentation. buzztard buzztard-edit 1 Buzztard Manual Pages buzztard-edit work with buzztard songs buzztard-edit options Description buzztard-edit is the graphical buzztard song editor. Invocation buzztard-edit without any argumants launches the UI. Alternatively it takes a mandatory argument that specifies the command and extra options depending on the command. Options , command-name The command to exeute, one of: load , song-filename The input filename. This should be a song file buzztard can handle. , Print brief help and exit. Print version and exit. buzztard-0.6.0/docs/reference/bt-edit/Makefile.am0000644042355400116100000000613511625501107016566 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE=buzztard-edit # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src/ui/edit # Extra options to pass to gtkdoc-scangobj. Not normally needed. #SCANGOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv);gtk_init(&argc,&argv)" SCANGOBJ_OPTIONS=--type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS=--deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS=--sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GTK_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GCANVAS_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html \ --extra-dir=.. # Used for dependencies. HFILE_GLOB=$(top_srcdir)/src/ui/edit/*.h CFILE_GLOB=$(top_srcdir)/src/ui/edit/*.c # Header files to ignore when scanning. IGNORE_HFILES=marshal.h # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/ui/edit \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/ui/edit/libbtedit.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(GUI_DEPS_LIBS) \ $(BT_LIBS) # -Wl,--no-as-needed # include generic part include $(top_srcdir)/gtk-doc.make if ENABLE_GTK_DOC if ENABLE_MAN man_MANS = \ buzztard-edit.1 %.1 : %.xml @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< BUILT_EXTRA_DIST = $(man_MANS) endif endif # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += \ $(DOC_MODULE).types \ buzztard-edit.xml # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif buzztard-0.6.0/docs/reference/bt-edit/buzztard-edit.types0000644042355400116100000000330111675570704020416 00000000000000#include #include "bt-edit.h" #include "btmemoryaudiosrc.h" #include "ruler.h" #include "gtkvumeter.h" bt_about_dialog_get_type bt_change_log_get_type bt_change_logger_get_type bt_crash_recover_dialog_get_type bt_edit_application_get_type bt_interaction_controller_menu_get_type bt_interaction_controller_learn_dialog_get_type bt_machine_canvas_item_get_type bt_machine_list_model_get_type bt_machine_menu_get_type bt_machine_preferences_dialog_get_type bt_machine_preset_properties_dialog_get_type bt_machine_properties_dialog_get_type bt_machine_rename_dialog_get_type bt_main_menu_get_type bt_main_pages_get_type bt_main_page_machines_get_type bt_main_page_patterns_get_type bt_main_page_sequence_get_type bt_main_page_info_get_type bt_main_page_waves_get_type bt_main_statusbar_get_type bt_main_toolbar_get_type bt_main_window_get_type bt_memory_audio_src_get_type bt_missing_framework_elements_dialog_get_type bt_missing_song_elements_dialog_get_type bt_object_list_model_get_type bt_pattern_list_model_get_type bt_pattern_properties_dialog_get_type bt_playback_controller_socket_get_type bt_render_dialog_get_type bt_render_progress_get_type bt_sequence_grid_model_get_type bt_sequence_view_get_type bt_settings_dialog_get_type bt_settings_page_audiodevices_get_type bt_settings_page_directories_get_type bt_settings_page_interaction_controller_get_type bt_settings_page_playback_controller_get_type bt_settings_page_shortcuts_get_type bt_signal_analysis_dialog_get_type bt_tip_dialog_get_type bt_ui_resources_get_type bt_wire_canvas_item_get_type bt_panorama_popup_get_type bt_pattern_editor_get_type bt_volume_popup_get_type bt_waveform_viewer_get_type bt_ruler_get_type gtk_vumeter_get_type buzztard-0.6.0/docs/reference/bt-ic/0000755042355400116100000000000011675570704014271 500000000000000buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic-sections.txt.in0000644042355400116100000001252211665771324021444 00000000000000# $Id: buzztard-ic-sections.txt 3552 2011-08-19 13:23:12Z ensonic $ # :mode=html: # please add section in the alpahbetical order using the following template #
# btxxx # BtXxx # #
libbtic/ic.h
bticabsrangecontrol BtIcAbsRangeControl BtIcAbsRangeControl btic_abs_range_control_new BtIcAbsRangeControlClass BTIC_ABS_RANGE_CONTROL BTIC_IS_ABS_RANGE_CONTROL BTIC_TYPE_ABS_RANGE_CONTROL BTIC_ABS_RANGE_CONTROL_CLASS BTIC_IS_ABS_RANGE_CONTROL_CLASS BTIC_ABS_RANGE_CONTROL_GET_CLASS BtIcAbsRangeControlPrivate btic_abs_range_control_get_type
bticcontrol BtIcControl BtIcControl BtIcControlClass BTIC_CONTROL BTIC_IS_CONTROL BTIC_TYPE_CONTROL BTIC_CONTROL_CLASS BTIC_IS_CONTROL_CLASS BTIC_CONTROL_GET_CLASS BtIcControlPrivate btic_control_get_type
bticdevice BtIcDevice BtIcDevice btic_device_add_control btic_device_get_control_by_id btic_device_has_controls btic_device_start btic_device_stop btic_device_virtual_start btic_device_virtual_stop BtIcDeviceClass BTIC_DEVICE BTIC_IS_DEVICE BTIC_TYPE_DEVICE BTIC_DEVICE_CLASS BTIC_IS_DEVICE_CLASS BTIC_DEVICE_GET_CLASS BtIcDevicePrivate btic_device_get_type
@GUDEV_DOC_SECTIONS@
@GUDEV_DOC_SECTIONS@bticgudevdiscoverer @GUDEV_DOC_SECTIONS@BtIcGudevDiscoverer @GUDEV_DOC_SECTIONS@BtIcGudevDiscoverer @GUDEV_DOC_SECTIONS@btic_gudev_discoverer_new @GUDEV_DOC_SECTIONS@ @GUDEV_DOC_SECTIONS@BtIcGudevDiscovererClass @GUDEV_DOC_SECTIONS@BTIC_GUDEV_DISCOVERER @GUDEV_DOC_SECTIONS@BTIC_IS_GUDEV_DISCOVERER @GUDEV_DOC_SECTIONS@BTIC_TYPE_GUDEV_DISCOVERER @GUDEV_DOC_SECTIONS@BTIC_GUDEV_DISCOVERER_CLASS @GUDEV_DOC_SECTIONS@BTIC_IS_GUDEV_DISCOVERER_CLASS @GUDEV_DOC_SECTIONS@BTIC_GUDEV_DISCOVERER_GET_CLASS @GUDEV_DOC_SECTIONS@BtIcGudevDiscovererPrivate @GUDEV_DOC_SECTIONS@btic_gudev_discoverer_get_type @GUDEV_DOC_SECTIONS@
@HAL_DOC_SECTIONS@
@HAL_DOC_SECTIONS@btichaldiscoverer @HAL_DOC_SECTIONS@BtIcHalDiscoverer @HAL_DOC_SECTIONS@BtIcHalDiscoverer @HAL_DOC_SECTIONS@btic_hal_discoverer_new @HAL_DOC_SECTIONS@ @HAL_DOC_SECTIONS@BtIcHalDiscovererClass @HAL_DOC_SECTIONS@BTIC_HAL_DISCOVERER @HAL_DOC_SECTIONS@BTIC_IS_HAL_DISCOVERER @HAL_DOC_SECTIONS@BTIC_TYPE_HAL_DISCOVERER @HAL_DOC_SECTIONS@BTIC_HAL_DISCOVERER_CLASS @HAL_DOC_SECTIONS@BTIC_IS_HAL_DISCOVERER_CLASS @HAL_DOC_SECTIONS@BTIC_HAL_DISCOVERER_GET_CLASS @HAL_DOC_SECTIONS@BtIcHalDiscovererPrivate @HAL_DOC_SECTIONS@btic_hal_discoverer_get_type @HAL_DOC_SECTIONS@
@LINUX_INPUT_DOC_SECTIONS@
@LINUX_INPUT_DOC_SECTIONS@bticinputdevice @LINUX_INPUT_DOC_SECTIONS@BtIcInputDevice @LINUX_INPUT_DOC_SECTIONS@BtIcInputDevice @LINUX_INPUT_DOC_SECTIONS@btic_input_device_new @LINUX_INPUT_DOC_SECTIONS@ @LINUX_INPUT_DOC_SECTIONS@BtIcInputDeviceClass @LINUX_INPUT_DOC_SECTIONS@BTIC_INPUT_DEVICE @LINUX_INPUT_DOC_SECTIONS@BTIC_IS_INPUT_DEVICE @LINUX_INPUT_DOC_SECTIONS@BTIC_TYPE_INPUT_DEVICE @LINUX_INPUT_DOC_SECTIONS@BTIC_INPUT_DEVICE_CLASS @LINUX_INPUT_DOC_SECTIONS@BTIC_IS_INPUT_DEVICE_CLASS @LINUX_INPUT_DOC_SECTIONS@BTIC_INPUT_DEVICE_GET_CLASS @LINUX_INPUT_DOC_SECTIONS@BtIcInputDevicePrivate @LINUX_INPUT_DOC_SECTIONS@btic_input_device_get_type @LINUX_INPUT_DOC_SECTIONS@
bticlearn BtIcLearn BtIcLearn btic_learn_start btic_learn_stop btic_learn_register_learned_control btic_learn_load_controller_map btic_learn_store_controller_map btic_learn_virtual_start btic_learn_virtual_stop btic_learn_virtual_register_learned_control BtIcLearnInterface BTIC_LEARN BTIC_IS_LEARN BTIC_TYPE_LEARN BTIC_LEARN_GET_INTERFACE btic_learn_get_type
bticmididevice BtIcMidiDevice BtIcMidiDevice btic_midi_device_new BtIcMidiDeviceClass BTIC_MIDI_DEVICE BTIC_IS_MIDI_DEVICE BTIC_TYPE_MIDI_DEVICE BTIC_MIDI_DEVICE_CLASS BTIC_IS_MIDI_DEVICE_CLASS BTIC_MIDI_DEVICE_GET_CLASS BtIcMidiDevicePrivate btic_midi_device_get_type
bticregistry BtIcRegistry BtIcRegistry btic_registry_new btic_registry_add_device btic_registry_remove_device_by_udi BtIcRegistryClass BTIC_REGISTRY BTIC_IS_REGISTRY BTIC_TYPE_REGISTRY BTIC_REGISTRY_CLASS BTIC_IS_REGISTRY_CLASS BTIC_REGISTRY_GET_CLASS BtIcRegistryPrivate btic_registry_get_type
btictriggercontrol BtIcTriggerControl BtIcTriggerControl btic_trigger_control_new BtIcTriggerControlClass BTIC_TRIGGER_CONTROL BTIC_IS_TRIGGER_CONTROL BTIC_TYPE_TRIGGER_CONTROL BTIC_TRIGGER_CONTROL_CLASS BTIC_IS_TRIGGER_CONTROL_CLASS BTIC_TRIGGER_CONTROL_GET_CLASS BtIcTriggerControlPrivate btic_trigger_control_get_type
libbtic libbtic btic_init_get_option_group btic_init_check btic_init btic_major_version btic_micro_version btic_minor_version BTIC_MAJOR_VERSION BTIC_MICRO_VERSION BTIC_MINOR_VERSION # gstreamer extras GST_CAT_DEFAULT # gettext extras _ N_ gettext dgettext textdomain bindtextdomain
buzztard-0.6.0/docs/reference/bt-ic/html/0000755042355400116100000000000011675570704015235 500000000000000buzztard-0.6.0/docs/reference/bt-ic/html/api-index-0-6.html0000644042355400116100000000412711675570704020225 00000000000000 Index of new API in 0.6

Index of new API in 0.6

D

btic_device_get_control_by_id, function in BtIcDevice
btic_device_has_controls, function in BtIcDevice
buzztard-0.6.0/docs/reference/bt-ic/html/pt02.html0000644042355400116100000000364711675570704016642 00000000000000 Part III. Appendix

Part III. Appendix

buzztard-0.6.0/docs/reference/bt-ic/html/BtIcAbsRangeControl.html0000644042355400116100000002476711675570704021650 00000000000000 BtIcAbsRangeControl

BtIcAbsRangeControl

BtIcAbsRangeControl — buzztards interaction controller single absolute range control

Synopsis

#include <libbtic/ic.h>

struct              BtIcAbsRangeControl;
BtIcAbsRangeControl * btic_abs_range_control_new        (const BtIcDevice *device,
                                                         const gchar *name,
                                                         guint id,
                                                         glong min,
                                                         glong max,
                                                         glong def);

Object Hierarchy

  GObject
   +----BtIcControl
         +----BtIcAbsRangeControl

Properties

  "def"                      glong                 : Read / Write / Construct Only
  "max"                      glong                 : Read / Write / Construct Only
  "min"                      glong                 : Read / Write / Construct Only
  "value"                    glong                 : Read / Write

Description

Absolute range control. The state of the hardware control can be read from BtIcAbsRangeControl:value.

Details

struct BtIcAbsRangeControl

struct BtIcAbsRangeControl;

buzztards interaction controller single trigger control


btic_abs_range_control_new ()

BtIcAbsRangeControl * btic_abs_range_control_new        (const BtIcDevice *device,
                                                         const gchar *name,
                                                         guint id,
                                                         glong min,
                                                         glong max,
                                                         glong def);

Create a new instance

device :

the device it belongs to

name :

human readable name

id :

unique identifier per device

min :

minimum value

max :

maximum value

def :

default value

Returns :

the new instance or NULL in case of an error

Property Details

The "def" property

  "def"                      glong                 : Read / Write / Construct Only

default control value.

Default value: 0


The "max" property

  "max"                      glong                 : Read / Write / Construct Only

maximum control value.

Default value: 9223372036854775807


The "min" property

  "min"                      glong                 : Read / Write / Construct Only

minimum control value.

Default value: -9223372036854775808


The "value" property

  "value"                    glong                 : Read / Write

control value.

Default value: 0

buzztard-0.6.0/docs/reference/bt-ic/html/BtIcLearn.html0000644042355400116100000004460311675570704017655 00000000000000 BtIcLearn

BtIcLearn

BtIcLearn — interface for devices with learn function

Object Hierarchy

  GInterface
   +----BtIcLearn

Known Implementations

BtIcLearn is implemented by BtIcMidiDevice.

Properties

  "device-controlchange"     gchar*                : Read / Write

Description

An interface which all devices which support interactive learning of controls should implement.

The interface comes with an implementation for caching the learned controls. The implementor needs to call btic_learn_load_controller_map() after construction and btic_learn_store_controller_map() when a control got added.

Details

BtIcLearn

typedef struct _BtIcLearn BtIcLearn;

interface for devices which implement a learn-function


btic_learn_start ()

gboolean            btic_learn_start                    (const BtIcLearn *self);

Starts the device if needed and enables the learn function. Starts emission of notify::devide-controlchange signals.

self :

the device which implements the BtIcLearn interface

Returns :

TRUE for success

btic_learn_stop ()

gboolean            btic_learn_stop                     (const BtIcLearn *self);

Eventually stops the device and disables the learn function. Stops emission of notify::devide-controlchange signals.

self :

the device which implements the BtIcLearn interface

Returns :

TRUE for success

btic_learn_register_learned_control ()

BtIcControl *       btic_learn_register_learned_control (const BtIcLearn *self,
                                                         const gchar *name);

Registers the last detected control with name name.

self :

the device which implements the BtIcLearn interface

name :

the name under which to register the control

Returns :

TRUE for success

btic_learn_load_controller_map ()

gboolean            btic_learn_load_controller_map      (const BtIcLearn *self);

Create initial set of controls from a stored control map. Interface implementations should call this from their GObjectClass.constructed() function.

self :

the device

Returns :

TRUE for success

btic_learn_store_controller_map ()

gboolean            btic_learn_store_controller_map     (const BtIcLearn *self);

Store a map of all controls to disk. Interface implementations should call this from their btic_learn_register_learned_control() function after they registered a new control.

self :

the device

Returns :

TRUE for success

btic_learn_virtual_start ()

gboolean            (*btic_learn_virtual_start)         (gconstpointer self);

Subclasses will override this methods with a function which enables the learning mode on this device.

self :

device instance

Returns :

TRUE for success

btic_learn_virtual_stop ()

gboolean            (*btic_learn_virtual_stop)          (gconstpointer self);

Subclasses will override this methods with a function which disables the learning mode on this device.

self :

device instance

Returns :

TRUE for success

btic_learn_virtual_register_learned_control ()

BtIcControl *       (*btic_learn_virtual_register_learned_control)
                                                        (gconstpointer self,
                                                         const gchar *name);

Subclasses will override this methods with a function which registers the last control which was detected in learn mode.

self :

device instance

name :

the name under which to register the control

Returns :

TRUE for success

Property Details

The "device-controlchange" property

  "device-controlchange"     gchar*                : Read / Write

get the last detected control.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-ic/html/buzztard-ic.devhelp20000644042355400116100000001657611675570704021065 00000000000000 buzztard-0.6.0/docs/reference/bt-ic/html/right.png0000644042355400116100000000073011675570704017000 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’ò BtIcDevice

BtIcDevice

BtIcDevice — buzztards interaction controller device

Object Hierarchy

  GObject
   +----BtIcDevice
         +----BtIcInputDevice
         +----BtIcMidiDevice

Properties

  "controls"                 gpointer              : Read
  "name"                     gchar*                : Read / Write / Construct Only
  "udi"                      gchar*                : Read / Write / Construct Only

Description

Abstract base class for control devices. Subclasses will provide functionality to query capabilities and register BtIcControl instances. They will also read from the device and trigger the change events on their controls (via value property).

This baseclass manages the added controls. The can be queries by calling btic_device_get_control_by_id() or iterating the list in BtIcDevice::controls.

Details

struct BtIcDevice

struct BtIcDevice;

buzztards interaction controller device


btic_device_add_control ()

void                btic_device_add_control             (const BtIcDevice *self,
                                                         const BtIcControl *control);

Add the given control to the list that the device manages. Takes ownership of the control.

self :

the device

control :

new control

btic_device_get_control_by_id ()

BtIcControl *       btic_device_get_control_by_id       (const BtIcDevice *self,
                                                         guint id);

Look up a control by id.

self :

the device

id :

he control id

Returns :

the found instance or NULL. This does not increase the ref-count!

Since 0.6


btic_device_has_controls ()

gboolean            btic_device_has_controls            (const BtIcDevice *self);

Check if the device has controls. This is useful to check after device creation. One reason for not having any controls could also be missing read-permissions on the device node.

self :

the device

Since 0.6


btic_device_start ()

gboolean            btic_device_start                   (const BtIcDevice *self);

Starts the io-loop for the device. This can be called multiple times and must be paired by an equal amount of btic_device_stop() calls.

self :

the BtIcDevice instance to use

Returns :

TRUE for success

btic_device_stop ()

gboolean            btic_device_stop                    (const BtIcDevice *self);

Stops the io-loop for the device. This must be called as often as the device has been started using btic_device_start().

self :

the BtIcDevice instance to use

Returns :

TRUE for success

btic_device_virtual_start ()

gboolean            (*btic_device_virtual_start)        (gconstpointer self);

Subclasses will override this methods with a function that counts start calls and runs the device-io for starts>0.

self :

device instance

Returns :

TRUE for success

btic_device_virtual_stop ()

gboolean            (*btic_device_virtual_stop)         (gconstpointer self);

Subclasses will override this methods with a function that counts stop calls and stops the device-io for starts==0.

self :

device instance

Returns :

TRUE for success

Property Details

The "controls" property

  "controls"                 gpointer              : Read

A copy of the list of device controls.


The "name" property

  "name"                     gchar*                : Read / Write / Construct Only

device name.

Default value: NULL


The "udi" property

  "udi"                      gchar*                : Read / Write / Construct Only

device udi.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-ic/html/buzztard-ic-libbtic.html0000644042355400116100000002426711675570704021722 00000000000000 libbtic

libbtic

libbtic — interaction controller library of the buzztard application framework

Synopsis

#include <libbtic/ic.h>

GOptionGroup *      btic_init_get_option_group          (void);
gboolean            btic_init_check                     (int *argc,
                                                         char **argv[],
                                                         GError **err);
void                btic_init                           (int *argc,
                                                         char **argv[]);
extern const unsigned int btic_major_version;
extern const unsigned int btic_micro_version;
extern const unsigned int btic_minor_version;

Description

The library offers an abstraction of hardware controllers that can be bound to ui controls.

Details

btic_init_get_option_group ()

GOptionGroup *      btic_init_get_option_group          (void);

Returns a GOptionGroup with libbtic's argument specifications. The group is set up to use standard GOption callbacks, so when using this group in combination with GOption parsing methods, all argument parsing and initialization is automated.

This function is useful if you want to integrate libbtic with other libraries that use GOption (see g_option_context_add_group() ).

Returns :

a pointer to a GOption group. Should be dereferenced after use.

btic_init_check ()

gboolean            btic_init_check                     (int *argc,
                                                         char **argv[],
                                                         GError **err);

Initializes the Buzztard interaction controller library.

This function will return FALSE if Buzztard interaction controller could not be initialized for some reason. If you want your program to fail fatally, use btic_init() instead.

argc :

pointer to application's argc

argv :

pointer to application's argv

err :

pointer to a GError to which a message will be posted on error

Returns :

TRUE if Buzztard interaction controller could be initialized.

btic_init ()

void                btic_init                           (int *argc,
                                                         char **argv[]);

Initializes the Buzztard Interaction Controller library.

Note

This function will terminate your program if it was unable to initialize the core for some reason. If you want your program to fall back, use btic_init_check() instead.

WARNING: This function does not work in the same way as corresponding functions in other glib-style libraries, such as gtk_init(). In particular, unknown command line options cause this function to abort program execution.

argc :

pointer to application's argc

argv :

pointer to application's argv

btic_major_version

extern const unsigned int btic_major_version;

buzztard version stamp, major part; determined from BTIC_MAJOR_VERSION


btic_micro_version

extern const unsigned int btic_micro_version;

buzztard version stamp, micro part; determined from BTIC_MICRO_VERSION


btic_minor_version

extern const unsigned int btic_minor_version;

buzztard version stamp, minor part; determined from BTIC_MINOR_VERSION

buzztard-0.6.0/docs/reference/bt-ic/html/left.png0000644042355400116100000000071311675570704016616 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1&¹³[(XIDATxœµ•!OÃPEïÛ*ˆ‰ŠID%~ꊯ˜ÄÕ"pæ'öŘ`sÜ–¥rKf–´‚¤â h—mi—ÇIžz}÷ܯIû¤–.pÚö\“`xä‹ ˆl‡?l·[²,H¬‡¯×k<Ï#Žcþ%\’AUx[S³7–n6ù¾¯år¹ßèõzE‰‡’s’žŒ1³ºö“²æÅj@œ—NL$ݤiª0 ¿5/ð}¿²\E‡Ž¤KIo¥Í“$a0üjÞdF£bŠkIê„‹æAh>ŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚buzztard-0.6.0/docs/reference/bt-ic/html/api-index.html0000644042355400116100000003633611675570704017734 00000000000000 API Index

API Index

A

BtIcAbsRangeControl, struct in BtIcAbsRangeControl
BtIcAbsRangeControl:def, object property in BtIcAbsRangeControl
BtIcAbsRangeControl:max, object property in BtIcAbsRangeControl
BtIcAbsRangeControl:min, object property in BtIcAbsRangeControl
BtIcAbsRangeControl:value, object property in BtIcAbsRangeControl
btic_abs_range_control_new, function in BtIcAbsRangeControl

C

BtIcControl, struct in BtIcControl
BtIcControl:device, object property in BtIcControl
BtIcControl:id, object property in BtIcControl
BtIcControl:name, object property in BtIcControl

D

BtIcDevice, struct in BtIcDevice
BtIcDevice:controls, object property in BtIcDevice
BtIcDevice:name, object property in BtIcDevice
BtIcDevice:udi, object property in BtIcDevice
btic_device_add_control, function in BtIcDevice
btic_device_get_control_by_id, function in BtIcDevice
btic_device_has_controls, function in BtIcDevice
btic_device_start, function in BtIcDevice
btic_device_stop, function in BtIcDevice
btic_device_virtual_start, user_function in BtIcDevice
btic_device_virtual_stop, user_function in BtIcDevice

G

BtIcGudevDiscoverer, struct in BtIcGudevDiscoverer
btic_gudev_discoverer_new, function in BtIcGudevDiscoverer

I

btic_init, function in libbtic
btic_init_check, function in libbtic
btic_init_get_option_group, function in libbtic
BtIcInputDevice, struct in BtIcInputDevice
BtIcInputDevice:devnode, object property in BtIcInputDevice
btic_input_device_new, function in BtIcInputDevice

L

BtIcLearn, struct in BtIcLearn
BtIcLearn:device-controlchange, object property in BtIcLearn
btic_learn_load_controller_map, function in BtIcLearn
btic_learn_register_learned_control, function in BtIcLearn
btic_learn_start, function in BtIcLearn
btic_learn_stop, function in BtIcLearn
btic_learn_store_controller_map, function in BtIcLearn
btic_learn_virtual_register_learned_control, user_function in BtIcLearn
btic_learn_virtual_start, user_function in BtIcLearn
btic_learn_virtual_stop, user_function in BtIcLearn

M

btic_major_version, variable in libbtic
btic_micro_version, variable in libbtic
BtIcMidiDevice, struct in BtIcMidiDevice
BtIcMidiDevice:devnode, object property in BtIcMidiDevice
btic_midi_device_new, function in BtIcMidiDevice
btic_minor_version, variable in libbtic

R

BtIcRegistry, struct in BtIcRegistry
BtIcRegistry:devices, object property in BtIcRegistry
btic_registry_add_device, function in BtIcRegistry
btic_registry_new, function in BtIcRegistry
btic_registry_remove_device_by_udi, function in BtIcRegistry

T

BtIcTriggerControl, struct in BtIcTriggerControl
BtIcTriggerControl:value, object property in BtIcTriggerControl
btic_trigger_control_new, function in BtIcTriggerControl
buzztard-0.6.0/docs/reference/bt-ic/html/BtIcTriggerControl.html0000644042355400116100000001554311675570704021561 00000000000000 BtIcTriggerControl

BtIcTriggerControl

BtIcTriggerControl — buzztards interaction controller single trigger control

Synopsis

#include <libbtic/ic.h>

struct              BtIcTriggerControl;
BtIcTriggerControl * btic_trigger_control_new           (const BtIcDevice *device,
                                                         const gchar *name,
                                                         guint id);

Object Hierarchy

  GObject
   +----BtIcControl
         +----BtIcTriggerControl

Properties

  "value"                    gboolean              : Read / Write

Description

Trigger control. The state of the hardware control can be read from BtIcTriggerControl:value.

Details

struct BtIcTriggerControl

struct BtIcTriggerControl;

buzztards interaction controller single trigger control


btic_trigger_control_new ()

BtIcTriggerControl * btic_trigger_control_new           (const BtIcDevice *device,
                                                         const gchar *name,
                                                         guint id);

Create a new instance

device :

the device it belongs to

name :

human readable name

id :

unique identifier per device

Returns :

the new instance or NULL in case of an error

Property Details

The "value" property

  "value"                    gboolean              : Read / Write

control value.

Default value: FALSE

buzztard-0.6.0/docs/reference/bt-ic/html/api-index-deprecated.html0000644042355400116100000000321211675570704022015 00000000000000 Index of deprecated API

Index of deprecated API

buzztard-0.6.0/docs/reference/bt-ic/html/up.png0000644042355400116100000000062611675570704016313 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚buzztard-0.6.0/docs/reference/bt-ic/html/pt01.html0000644042355400116100000000277711675570704016644 00000000000000 Part I. Overview

Part I. Overview

buzztard-0.6.0/docs/reference/bt-ic/html/libbtic.html0000644042355400116100000000726411675570704017464 00000000000000 Interaction Controller Reference

Interaction Controller Reference


Abstract

The interaction controler library provides unifies access to (hardware) controlers that are suitable for interaction with parameters in sound generatros and effects.

Table of Contents

libbtic — interaction controller library of the buzztard application framework
BtIcRegistry — buzztards interaction controller registry
BtIcGudevDiscoverer — gudev based device discovery
BtIcDevice — buzztards interaction controller device
BtIcInputDevice — buzztards interaction controller input device
BtIcMidiDevice — buzztards interaction controller midi device
BtIcControl — buzztards interaction controller single control
BtIcAbsRangeControl — buzztards interaction controller single absolute range control
BtIcTriggerControl — buzztards interaction controller single trigger control
BtIcLearn — interface for devices with learn function
buzztard-0.6.0/docs/reference/bt-ic/html/style.css0000644042355400116100000001210011675570704017021 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } buzztard-0.6.0/docs/reference/bt-ic/html/BtIcGudevDiscoverer.html0000644042355400116100000001035211675570704021706 00000000000000 BtIcGudevDiscoverer

BtIcGudevDiscoverer

BtIcGudevDiscoverer — gudev based device discovery

Synopsis

#include <libbtic/ic.h>

struct              BtIcGudevDiscoverer;
BtIcGudevDiscoverer * btic_gudev_discoverer_new         (void);

Object Hierarchy

  GObject
   +----BtIcGudevDiscoverer

Description

Discover input and midi devices using gudev.

Details

struct BtIcGudevDiscoverer

struct BtIcGudevDiscoverer;

gudev based device discovery for buzztards interaction controller


btic_gudev_discoverer_new ()

BtIcGudevDiscoverer * btic_gudev_discoverer_new         (void);

Create a new instance

Returns :

the new instance
buzztard-0.6.0/docs/reference/bt-ic/html/BtIcMidiDevice.html0000644042355400116100000001602711675570704020615 00000000000000 BtIcMidiDevice

BtIcMidiDevice

BtIcMidiDevice — buzztards interaction controller midi device

Synopsis

#include <libbtic/ic.h>

struct              BtIcMidiDevice;
BtIcMidiDevice *    btic_midi_device_new                (const gchar *udi,
                                                         const gchar *name,
                                                         const gchar *devnode);

Object Hierarchy

  GObject
   +----BtIcDevice
         +----BtIcMidiDevice

Implemented Interfaces

BtIcMidiDevice implements BtIcLearn.

Properties

  "devnode"                  gchar*                : Read / Write / Construct Only

Description

Event handling for midi devices.

Details

struct BtIcMidiDevice

struct BtIcMidiDevice;

buzztards interaction controller registry


btic_midi_device_new ()

BtIcMidiDevice *    btic_midi_device_new                (const gchar *udi,
                                                         const gchar *name,
                                                         const gchar *devnode);

Create a new instance

udi :

the udi of the device

name :

human readable name

devnode :

device node in filesystem

Returns :

the new instance or NULL in case of an error

Property Details

The "devnode" property

  "devnode"                  gchar*                : Read / Write / Construct Only

device node path.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-ic/html/index.html0000644042355400116100000000727111675570704017161 00000000000000 Buzztard Bt-Ic Reference Manual

for Buzztard 0.6.0. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-ic/.


Introduction
I. Overview
II. Interaction Controller Reference
libbtic — interaction controller library of the buzztard application framework
BtIcRegistry — buzztards interaction controller registry
BtIcGudevDiscoverer — gudev based device discovery
BtIcDevice — buzztards interaction controller device
BtIcInputDevice — buzztards interaction controller input device
BtIcMidiDevice — buzztards interaction controller midi device
BtIcControl — buzztards interaction controller single control
BtIcAbsRangeControl — buzztards interaction controller single absolute range control
BtIcTriggerControl — buzztards interaction controller single trigger control
BtIcLearn — interface for devices with learn function
III. Appendix
Object Hierarchy
API Index
Index of deprecated API
Index of new API in 0.6
buzztard-0.6.0/docs/reference/bt-ic/html/BtIcRegistry.html0000644042355400116100000001623611675570704020425 00000000000000 BtIcRegistry

BtIcRegistry

BtIcRegistry — buzztards interaction controller registry

Synopsis

#include <libbtic/ic.h>

struct              BtIcRegistry;
BtIcRegistry *      btic_registry_new                   (void);
void                btic_registry_add_device            (BtIcDevice *device);
void                btic_registry_remove_device_by_udi  (const gchar *udi);

Object Hierarchy

  GObject
   +----BtIcRegistry

Properties

  "devices"                  gpointer              : Read

Description

Manages a dynamic list of controller devices. It uses HAL and dbus.

Details

struct BtIcRegistry

struct BtIcRegistry;

buzztards interaction controller registry


btic_registry_new ()

BtIcRegistry *      btic_registry_new                   (void);

Create a new instance

Returns :

the new instance

btic_registry_add_device ()

void                btic_registry_add_device            (BtIcDevice *device);

Add the given device to the registry.

Only to be used by discoverers.

device :

new device

btic_registry_remove_device_by_udi ()

void                btic_registry_remove_device_by_udi  (const gchar *udi);

Remove device identified by the given udi from the registry.

Only to be used by discoverers.

udi :

device id

Property Details

The "devices" property

  "devices"                  gpointer              : Read

A copy of the list of control devices.

buzztard-0.6.0/docs/reference/bt-ic/html/BtIcControl.html0000644042355400116100000001304111675570704020224 00000000000000 BtIcControl

BtIcControl

BtIcControl — buzztards interaction controller single control

Synopsis

#include <libbtic/ic.h>

struct              BtIcControl;

Object Hierarchy

  GObject
   +----BtIcControl
         +----BtIcAbsRangeControl
         +----BtIcTriggerControl

Properties

  "device"                   BtIcDevice*           : Read / Write / Construct Only
  "id"                       guint                 : Read / Write / Construct Only
  "name"                     gchar*                : Read / Write / Construct Only

Description

Abstract base class for controls.

Details

struct BtIcControl

struct BtIcControl;

buzztards interaction controller single control

Property Details

The "device" property

  "device"                   BtIcDevice*           : Read / Write / Construct Only

parent device object.


The "id" property

  "id"                       guint                 : Read / Write / Construct Only

control id (for lookups).

Default value: 0


The "name" property

  "name"                     gchar*                : Read / Write / Construct Only

control name.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-ic/html/BtIcInputDevice.html0000644042355400116100000001535411675570704021034 00000000000000 BtIcInputDevice

BtIcInputDevice

BtIcInputDevice — buzztards interaction controller input device

Synopsis

#include <libbtic/ic.h>

struct              BtIcInputDevice;
BtIcInputDevice *   btic_input_device_new               (const gchar *udi,
                                                         const gchar *name,
                                                         const gchar *devnode);

Object Hierarchy

  GObject
   +----BtIcDevice
         +----BtIcInputDevice

Properties

  "devnode"                  gchar*                : Read / Write / Construct Only

Description

Event handling for input devices (joystick,hdaps,wiimote).

Details

struct BtIcInputDevice

struct BtIcInputDevice;

buzztards interaction controller registry


btic_input_device_new ()

BtIcInputDevice *   btic_input_device_new               (const gchar *udi,
                                                         const gchar *name,
                                                         const gchar *devnode);

Create a new instance

udi :

the udi of the device

name :

human readable name

devnode :

device node in filesystem

Returns :

the new instance or NULL in case of an error

Property Details

The "devnode" property

  "devnode"                  gchar*                : Read / Write / Construct Only

device node path.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-ic/html/index.sgml0000644042355400116100000002760611675570704017163 00000000000000 buzztard-0.6.0/docs/reference/bt-ic/html/objecttree.html0000644042355400116100000000506311675570704020175 00000000000000 Object Hierarchy buzztard-0.6.0/docs/reference/bt-ic/html/home.png0000644042355400116100000000121611675570704016613 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚buzztard-0.6.0/docs/reference/bt-ic/html/pr01.html0000644042355400116100000000411611675570704016627 00000000000000 Introduction

Introduction

Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch.

The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures.

buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic-sections.txt0000644042355400116100000001054211675570704021037 00000000000000# $Id: buzztard-ic-sections.txt 3552 2011-08-19 13:23:12Z ensonic $ # :mode=html: # please add section in the alpahbetical order using the following template #
# btxxx # BtXxx # #
libbtic/ic.h
bticabsrangecontrol BtIcAbsRangeControl BtIcAbsRangeControl btic_abs_range_control_new BtIcAbsRangeControlClass BTIC_ABS_RANGE_CONTROL BTIC_IS_ABS_RANGE_CONTROL BTIC_TYPE_ABS_RANGE_CONTROL BTIC_ABS_RANGE_CONTROL_CLASS BTIC_IS_ABS_RANGE_CONTROL_CLASS BTIC_ABS_RANGE_CONTROL_GET_CLASS BtIcAbsRangeControlPrivate btic_abs_range_control_get_type
bticcontrol BtIcControl BtIcControl BtIcControlClass BTIC_CONTROL BTIC_IS_CONTROL BTIC_TYPE_CONTROL BTIC_CONTROL_CLASS BTIC_IS_CONTROL_CLASS BTIC_CONTROL_GET_CLASS BtIcControlPrivate btic_control_get_type
bticdevice BtIcDevice BtIcDevice btic_device_add_control btic_device_get_control_by_id btic_device_has_controls btic_device_start btic_device_stop btic_device_virtual_start btic_device_virtual_stop BtIcDeviceClass BTIC_DEVICE BTIC_IS_DEVICE BTIC_TYPE_DEVICE BTIC_DEVICE_CLASS BTIC_IS_DEVICE_CLASS BTIC_DEVICE_GET_CLASS BtIcDevicePrivate btic_device_get_type
bticgudevdiscoverer BtIcGudevDiscoverer BtIcGudevDiscoverer btic_gudev_discoverer_new BtIcGudevDiscovererClass BTIC_GUDEV_DISCOVERER BTIC_IS_GUDEV_DISCOVERER BTIC_TYPE_GUDEV_DISCOVERER BTIC_GUDEV_DISCOVERER_CLASS BTIC_IS_GUDEV_DISCOVERER_CLASS BTIC_GUDEV_DISCOVERER_GET_CLASS BtIcGudevDiscovererPrivate btic_gudev_discoverer_get_type
#
#btichaldiscoverer #BtIcHalDiscoverer #BtIcHalDiscoverer #btic_hal_discoverer_new # #BtIcHalDiscovererClass #BTIC_HAL_DISCOVERER #BTIC_IS_HAL_DISCOVERER #BTIC_TYPE_HAL_DISCOVERER #BTIC_HAL_DISCOVERER_CLASS #BTIC_IS_HAL_DISCOVERER_CLASS #BTIC_HAL_DISCOVERER_GET_CLASS #BtIcHalDiscovererPrivate #btic_hal_discoverer_get_type #
bticinputdevice BtIcInputDevice BtIcInputDevice btic_input_device_new BtIcInputDeviceClass BTIC_INPUT_DEVICE BTIC_IS_INPUT_DEVICE BTIC_TYPE_INPUT_DEVICE BTIC_INPUT_DEVICE_CLASS BTIC_IS_INPUT_DEVICE_CLASS BTIC_INPUT_DEVICE_GET_CLASS BtIcInputDevicePrivate btic_input_device_get_type
bticlearn BtIcLearn BtIcLearn btic_learn_start btic_learn_stop btic_learn_register_learned_control btic_learn_load_controller_map btic_learn_store_controller_map btic_learn_virtual_start btic_learn_virtual_stop btic_learn_virtual_register_learned_control BtIcLearnInterface BTIC_LEARN BTIC_IS_LEARN BTIC_TYPE_LEARN BTIC_LEARN_GET_INTERFACE btic_learn_get_type
bticmididevice BtIcMidiDevice BtIcMidiDevice btic_midi_device_new BtIcMidiDeviceClass BTIC_MIDI_DEVICE BTIC_IS_MIDI_DEVICE BTIC_TYPE_MIDI_DEVICE BTIC_MIDI_DEVICE_CLASS BTIC_IS_MIDI_DEVICE_CLASS BTIC_MIDI_DEVICE_GET_CLASS BtIcMidiDevicePrivate btic_midi_device_get_type
bticregistry BtIcRegistry BtIcRegistry btic_registry_new btic_registry_add_device btic_registry_remove_device_by_udi BtIcRegistryClass BTIC_REGISTRY BTIC_IS_REGISTRY BTIC_TYPE_REGISTRY BTIC_REGISTRY_CLASS BTIC_IS_REGISTRY_CLASS BTIC_REGISTRY_GET_CLASS BtIcRegistryPrivate btic_registry_get_type
btictriggercontrol BtIcTriggerControl BtIcTriggerControl btic_trigger_control_new BtIcTriggerControlClass BTIC_TRIGGER_CONTROL BTIC_IS_TRIGGER_CONTROL BTIC_TYPE_TRIGGER_CONTROL BTIC_TRIGGER_CONTROL_CLASS BTIC_IS_TRIGGER_CONTROL_CLASS BTIC_TRIGGER_CONTROL_GET_CLASS BtIcTriggerControlPrivate btic_trigger_control_get_type
libbtic libbtic btic_init_get_option_group btic_init_check btic_init btic_major_version btic_micro_version btic_minor_version BTIC_MAJOR_VERSION BTIC_MICRO_VERSION BTIC_MINOR_VERSION # gstreamer extras GST_CAT_DEFAULT # gettext extras _ N_ gettext dgettext textdomain bindtextdomain
buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic.types0000644042355400116100000000072011675570704017534 00000000000000#include #include "libbuzztard-ic/gudev-discoverer.h" %#include "libbuzztard-ic/hal-discoverer.h" #include "libbuzztard-ic/input-device.h" #include "libbuzztard-ic/midi-device.h" btic_control_get_type btic_device_get_type btic_gudev_discoverer_get_type %btic_hal_discoverer_get_type btic_input_device_get_type btic_learn_get_type btic_midi_device_get_type btic_registry_get_type btic_abs_range_control_get_type btic_trigger_control_get_type buzztard-0.6.0/docs/reference/bt-ic/Makefile.in0000644042355400116100000006736311675570634016277 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ 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@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/buzztard-ic-sections.txt.in \ $(srcdir)/buzztard-ic.types.in $(top_srcdir)/gtk-doc.make subdir = docs/reference/bt-ic ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = buzztard-ic.types buzztard-ic-sections.txt CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE = buzztard-ic # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/src/lib/ic # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS = --type-init-func="g_thread_init(NULL);g_type_init()" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS = --deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS = --sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB = $(top_srcdir)/src/lib/ic/libbuzztard-ic/*.h CFILE_GLOB = $(top_srcdir)/src/lib/ic/*.c @USE_LINUX_INPUT_FALSE@LINUX_INPUT_FILES = input-device.h @USE_LINUX_INPUT_TRUE@LINUX_INPUT_FILES = @USE_GUDEV_FALSE@GUDEV_FILES = gudev-discoverer.h @USE_GUDEV_TRUE@GUDEV_FILES = @USE_HAL_FALSE@HAL_FILES = hal-discoverer.h @USE_HAL_TRUE@HAL_FILES = # Header files to ignore when scanning. IGNORE_HFILES = ic_private.h \ $(GUDEV_FILES) $(HAL_FILES) \ $(LINUX_INPUT_FILES) # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) @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) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # include generic part # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE).types 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) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # Comment this out if you want your docs-status tested during 'make check' @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @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: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_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/bt-ic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/bt-ic/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): buzztard-ic.types: $(top_builddir)/config.status $(srcdir)/buzztard-ic.types.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ buzztard-ic-sections.txt: $(top_builddir)/config.status $(srcdir)/buzztard-ic-sections.txt.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(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 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." 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: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-libtool clean-local 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 uninstall uninstall-am \ uninstall-local @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_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) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ 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 @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building 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) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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 \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs 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) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @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 # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc 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 # 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: buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic-overrides.txt0000644042355400116100000000000011576377707021206 00000000000000buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic-docs.sgml0000644042355400116100000000717511665770526020276 00000000000000 %version-entities; ]> Buzztard Bt-Ic Reference Manual for Buzztard &BT_VERSION;. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-ic/. Introduction Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch. The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures. Overview Interaction Controller Reference The interaction controler library provides unifies access to (hardware) controlers that are suitable for interaction with parameters in sound generatros and effects. Appendix Object Hierarchy API Index Index of deprecated API Index of new API in 0.6 buzztard-0.6.0/docs/reference/bt-ic/Makefile.am0000644042355400116100000000544011665754611016250 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE=buzztard-ic # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src/lib/ic # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS=--type-init-func="g_thread_init(NULL);g_type_init()" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS=--deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS=--sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB=$(top_srcdir)/src/lib/ic/libbuzztard-ic/*.h CFILE_GLOB=$(top_srcdir)/src/lib/ic/*.c if USE_LINUX_INPUT LINUX_INPUT_FILES= else LINUX_INPUT_FILES=input-device.h endif if USE_GUDEV GUDEV_FILES= else GUDEV_FILES=gudev-discoverer.h endif if USE_HAL HAL_FILES= else HAL_FILES=hal-discoverer.h endif # Header files to ignore when scanning. IGNORE_HFILES=ic_private.h \ $(GUDEV_FILES) $(HAL_FILES) \ $(LINUX_INPUT_FILES) # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) # include generic part include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += $(DOC_MODULE).types # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif buzztard-0.6.0/docs/reference/bt-ic/buzztard-ic.types.in0000644042355400116100000000107411675140541020134 00000000000000#include @GUDEV_DOC_TYPES@#include "libbuzztard-ic/gudev-discoverer.h" @HAL_DOC_TYPES@#include "libbuzztard-ic/hal-discoverer.h" @LINUX_INPUT_DOC_TYPES@#include "libbuzztard-ic/input-device.h" #include "libbuzztard-ic/midi-device.h" btic_control_get_type btic_device_get_type @GUDEV_DOC_TYPES@btic_gudev_discoverer_get_type @HAL_DOC_TYPES@btic_hal_discoverer_get_type @LINUX_INPUT_DOC_TYPES@btic_input_device_get_type btic_learn_get_type btic_midi_device_get_type btic_registry_get_type btic_abs_range_control_get_type btic_trigger_control_get_type buzztard-0.6.0/docs/reference/bt-core/0000755042355400116100000000000011675570702014624 500000000000000buzztard-0.6.0/docs/reference/bt-core/html/0000755042355400116100000000000011675570702015570 500000000000000buzztard-0.6.0/docs/reference/bt-core/html/api-index-0-6.html0000644042355400116100000001755411675570702020570 00000000000000 Index of new API in 0.6 buzztard-0.6.0/docs/reference/bt-core/html/pt02.html0000644042355400116100000000432511675570702017167 00000000000000 Part III. Appendix buzztard-0.6.0/docs/reference/bt-core/html/BtSetup.html0000644042355400116100000013267611675570702020003 00000000000000 BtSetup

BtSetup

BtSetup — class with all machines and wires (BtMachine and BtWire) for a BtSong instance

Synopsis

#include <libbtcore/core.h>

struct              BtSetup;
gboolean            bt_setup_add_machine                (const BtSetup * const self,
                                                         const BtMachine * const machine);
gboolean            bt_setup_add_wire                   (const BtSetup * const self,
                                                         const BtWire * const wire);
BtMachine *         bt_setup_get_machine_by_id          (const BtSetup * const self,
                                                         const gchar * const id);
BtMachine *         bt_setup_get_machine_by_type        (const BtSetup * const self,
                                                         const GType type);
GList *             bt_setup_get_machines_by_type       (const BtSetup * const self,
                                                         const GType type);
gchar *             bt_setup_get_unique_machine_id      (const BtSetup * const self,
                                                         const gchar * const base_name);
BtWire *            bt_setup_get_wire_by_dst_machine    (const BtSetup * const self,
                                                         const BtMachine * const dst);
BtWire *            bt_setup_get_wire_by_machines       (const BtSetup * const self,
                                                         const BtMachine * const src,
                                                         const BtMachine * const dst);
BtWire *            bt_setup_get_wire_by_src_machine    (const BtSetup * const self,
                                                         const BtMachine * const src);
GList *             bt_setup_get_wires_by_dst_machine   (const BtSetup * const self,
                                                         const BtMachine * const dst);
GList *             bt_setup_get_wires_by_src_machine   (const BtSetup * const self,
                                                         const BtMachine * const src);
BtSetup *           bt_setup_new                        (const BtSong * const song);
void                bt_setup_remember_missing_machine   (const BtSetup * const self,
                                                         const gchar * const str);
void                bt_setup_remove_machine             (const BtSetup * const self,
                                                         const BtMachine * const machine);
void                bt_setup_remove_wire                (const BtSetup * const self,
                                                         const BtWire * const wire);

Object Hierarchy

  GObject
   +----BtSetup

Implemented Interfaces

BtSetup implements

Properties

  "machines"                 gpointer              : Read
  "missing-machines"         gpointer              : Read
  "properties"               gpointer              : Read
  "song"                     BtSong*               : Read / Write / Construct Only
  "wires"                    gpointer              : Read

Description

The setup manages virtual gear in a BtSong. This is a list of BtMachines that are used and the BtWires that connect them.

The setup manages the actual GStreamer GstPipeline content. Freshly created machines are not yet added to the pipeline. Only once a subgraph from a source is fully connected to the sink, that subgraph is added o the pipeline.

Applications can watch the GstObject:parent property to see wheter a machine is physically inserted into the processing pipeline.

Details

struct BtSetup

struct BtSetup;

virtual hardware setup (contains BtMachine and BtWire objects)


bt_setup_add_machine ()

gboolean            bt_setup_add_machine                (const BtSetup * const self,
                                                         const BtMachine * const machine);

Let the setup know that the supplied machine is now part of the song.

self :

the setup to add the machine to

machine :

the new machine instance

Returns :

return true, if the machine can be added. Returns false if the machine is currently added to the setup.

bt_setup_add_wire ()

gboolean            bt_setup_add_wire                   (const BtSetup * const self,
                                                         const BtWire * const wire);

Let the setup know that the supplied wire is now part of the song.

self :

the setup to add the wire to

wire :

the new wire instance

Returns :

returns true, if the wire is added. Returns false, if the setup contains a wire witch is link between the same src and dst machines (cycle check).

bt_setup_get_machine_by_id ()

BtMachine *         bt_setup_get_machine_by_id          (const BtSetup * const self,
                                                         const gchar * const id);

Search the setup for a machine by the supplied id. The machine must have been added previously to this setup with bt_setup_add_machine(). Unref the machine, when done with it.

self :

the setup to search for the machine

id :

the identifier of the machine

Returns :

BtMachine instance or NULL if not found

bt_setup_get_machine_by_type ()

BtMachine *         bt_setup_get_machine_by_type        (const BtSetup * const self,
                                                         const GType type);

Search the setup for the first machine with the given type. The machine must have been added previously to this setup with bt_setup_add_machine(). Unref the machine, when done with it.

self :

the setup to search for the machine

type :

the gobject type (sink,processor,source)

Returns :

BtMachine instance or NULL if not found

bt_setup_get_machines_by_type ()

GList *             bt_setup_get_machines_by_type       (const BtSetup * const self,
                                                         const GType type);

Gathers all machines of the given type from the setup. Free the list (and unref the machines), when done with it.

self :

the setup to search for the machine

type :

the gobject type (sink,processor,source)

Returns :

the list instance or NULL if not found

bt_setup_get_unique_machine_id ()

gchar *             bt_setup_get_unique_machine_id      (const BtSetup * const self,
                                                         const gchar * const base_name);

The function makes the supplied base_name unique in this setup by eventually adding a number postfix. This method should be used when adding new machines.

self :

the setup for which the name should be unique

base_name :

the leading name part

Returns :

the newly allocated unique name

bt_setup_get_wire_by_dst_machine ()

BtWire *            bt_setup_get_wire_by_dst_machine    (const BtSetup * const self,
                                                         const BtMachine * const dst);

Searches for the first wire in setup that uses the given BtMachine as a target. In other words - it returns the first wire that ends at the given BtMachine. Unref the wire, when done with it.

self :

the setup to search for the wire

dst :

the machine that is at the dst end of the wire

Returns :

the BtWire or NULL

bt_setup_get_wire_by_machines ()

BtWire *            bt_setup_get_wire_by_machines       (const BtSetup * const self,
                                                         const BtMachine * const src,
                                                         const BtMachine * const dst);

Searches for a wire in setup that uses the given BtMachine instances as a source and dest. Unref the wire, when done with it.

self :

the setup to search for the wire

src :

the machine that is at the src end of the wire

dst :

the machine that is at the dst end of the wire

Returns :

the BtWire or NULL

bt_setup_get_wire_by_src_machine ()

BtWire *            bt_setup_get_wire_by_src_machine    (const BtSetup * const self,
                                                         const BtMachine * const src);

Searches for the first wire in setup that uses the given BtMachine as a source. In other words - it returns the first wire that starts at the given BtMachine. Unref the wire, when done with it.

self :

the setup to search for the wire

src :

the machine that is at the src end of the wire

Returns :

the BtWire or NULL

bt_setup_get_wires_by_dst_machine ()

GList *             bt_setup_get_wires_by_dst_machine   (const BtSetup * const self,
                                                         const BtMachine * const dst);

Searches for all wires in setup that use the given BtMachine as a target. Free the list (and unref the wires), when done with it.

self :

the setup to search for the wire

dst :

the machine that is at the dst end of the wire

Returns :

a GList with the BtWires or NULL

bt_setup_get_wires_by_src_machine ()

GList *             bt_setup_get_wires_by_src_machine   (const BtSetup * const self,
                                                         const BtMachine * const src);

Searches for all wires in setup that use the given BtMachine as a source. Free the list (and unref the wires), when done with it.

self :

the setup to search for the wire

src :

the machine that is at the src end of the wire

Returns :

a GList with the BtWires or NULL

bt_setup_new ()

BtSetup *           bt_setup_new                        (const BtSong * const song);

Create a new instance

song :

the song the new instance belongs to

Returns :

the new instance or NULL in case of an error

bt_setup_remember_missing_machine ()

void                bt_setup_remember_missing_machine   (const BtSetup * const self,
                                                         const gchar * const str);

Loaders can use this function to collect information about machines that failed to load. The front-end can access this later by reading BtSetup::missing-machines property.

self :

the setup

str :

human readable description of the missing machine

bt_setup_remove_machine ()

void                bt_setup_remove_machine             (const BtSetup * const self,
                                                         const BtMachine * const machine);

Let the setup know that the supplied machine is removed from the song.

self :

the setup to remove the machine from

machine :

the machine instance to remove

bt_setup_remove_wire ()

void                bt_setup_remove_wire                (const BtSetup * const self,
                                                         const BtWire * const wire);

Let the setup know that the supplied wire is removed from the song.

self :

the setup to remove the wire from

wire :

the wire instance to remove

Property Details

The "machines" property

  "machines"                 gpointer              : Read

A copy of the list of machines.


The "missing-machines" property

  "missing-machines"         gpointer              : Read

The list of missing machines, don't change.


The "properties" property

  "properties"               gpointer              : Read

hashtable of setup properties.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Set song object, the setup belongs to.


The "wires" property

  "wires"                    gpointer              : Read

A copy of the list of wires.

Signal Details

The "machine-added" signal

void                user_function                      (BtSetup   *self,
                                                        BtMachine *machine,
                                                        gpointer   user_data)      : No Hooks

A new machine item has been added to the setup.

self :

the setup object that emitted the signal

machine :

the new machine

user_data :

user data set when the signal handler was connected.

The "machine-removed" signal

void                user_function                      (BtSetup   *self,
                                                        BtMachine *machine,
                                                        gpointer   user_data)      : No Hooks

A machine item has been removed from the setup.

self :

the setup object that emitted the signal

machine :

the old machine

user_data :

user data set when the signal handler was connected.

The "wire-added" signal

void                user_function                      (BtSetup *self,
                                                        BtWire  *wire,
                                                        gpointer user_data)      : No Hooks

A new wire item has been added to the setup.

self :

the setup object that emitted the signal

wire :

the new wire

user_data :

user data set when the signal handler was connected.

The "wire-removed" signal

void                user_function                      (BtSetup *self,
                                                        BtWire  *wire,
                                                        gpointer user_data)      : No Hooks

A wire item has been removed from the setup.

self :

the setup object that emitted the signal

wire :

the old wire

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/BtWire.html0000644042355400116100000011171111675570702017574 00000000000000 BtWire

BtWire

BtWire — class for a connection of two BtMachines

Synopsis

#include <libbtcore/core.h>

#define             BT_WIRE_MAX_NUM_PARAMS
struct              BtWire;
void                bt_wire_add_wire_pattern            (const BtWire * const self,
                                                         const BtPattern * const pattern,
                                                         const BtWirePattern * const wire_pattern);
void                bt_wire_controller_change_value     (const BtWire * const self,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue * const value);
void                bt_wire_get_param_details           (const BtWire * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);
glong               bt_wire_get_param_index             (const BtWire *const self,
                                                         const gchar * const name,
                                                         GError **error);
const gchar *       bt_wire_get_param_name              (const BtWire * const self,
                                                         const gulong index);
GParamSpec *        bt_wire_get_param_spec              (const BtWire * const self,
                                                         const gulong index);
GType               bt_wire_get_param_type              (const BtWire * const self,
                                                         const gulong index);
BtWirePattern *     bt_wire_get_pattern                 (const BtWire * const self,
                                                         const BtPattern * const pattern);
BtWire *            bt_wire_new                         (const BtSong *song,
                                                         const BtMachine *src_machine,
                                                         const BtMachine *dst_machine,
                                                         GError **err);
gboolean            bt_wire_reconnect                   (BtWire *self);

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtWire

Implemented Interfaces

BtWire implements GstChildProxy.

Properties

  "analyzers"                gpointer              : Read / Write
  "construction-error"       gpointer              : Read / Write / Construct Only
  "dst"                      BtMachine*            : Read / Write / Construct Only
  "gain"                     GstElement*           : Read
  "num-params"               gulong                : Read / Write
  "pan"                      GstElement*           : Read
  "properties"               gpointer              : Read
  "song"                     BtSong*               : Read / Write / Construct Only
  "src"                      BtMachine*            : Read / Write / Construct Only

Description

Abstracts connection between two BtMachines. After creation, the elements are connected. In contrast to directly wiring GstElements this insert needed conversion elements automatically.

Furthermore each wire has a volume and if possible panorama/balance element. Volume and panorama/balance can be sequenced like machine parameters in BtWirePattern objects.

Details

BT_WIRE_MAX_NUM_PARAMS

#define BT_WIRE_MAX_NUM_PARAMS 2

Maximum number of parameters per wire.


struct BtWire

struct BtWire;

A link between two BtMachine instances.


bt_wire_add_wire_pattern ()

void                bt_wire_add_wire_pattern            (const BtWire * const self,
                                                         const BtPattern * const pattern,
                                                         const BtWirePattern * const wire_pattern);

Add the supplied wire-pattern to the wire. This is automatically done by #bt_wire_pattern_new().

self :

the wire to add the wire-pattern to

pattern :

the pattern that the wire-pattern is associated with

wire_pattern :

the new wire-pattern instance

bt_wire_controller_change_value ()

void                bt_wire_controller_change_value     (const BtWire * const self,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue * const value);

Depending on wheter the given value is NULL, sets or unsets the controller value for the specified param and at the given time.

self :

the wire to change the param for

param :

the parameter index

timestamp :

the time stamp of the change

value :

the new value or NULL to unset a previous one

bt_wire_get_param_details ()

void                bt_wire_get_param_details           (const BtWire * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);

Retrieves the details of a voice param. Any detail can be NULL if its not wanted.

self :

the wire to search for the param details

index :

the offset in the list of params

pspec :

place for the param spec

min_val :

place to hold new GValue with minimum

max_val :

place to hold new GValue with maximum

bt_wire_get_param_index ()

glong               bt_wire_get_param_index             (const BtWire *const self,
                                                         const gchar * const name,
                                                         GError **error);

Searches the list of registered param of a wire for a param of the given name and returns the index if found.

self :

the wire to search for the param

name :

the name of the param

error :

the location of an error instance to fill with a message, if an error occures

Returns :

the index or sets error if it is not found and returns -1.

bt_wire_get_param_name ()

const gchar *       bt_wire_get_param_name              (const BtWire * const self,
                                                         const gulong index);

Gets the param name. Do not modify returned content.

self :

the wire to get the param name from

index :

the offset in the list of params

Returns :

the requested name

bt_wire_get_param_spec ()

GParamSpec *        bt_wire_get_param_spec              (const BtWire * const self,
                                                         const gulong index);

Retrieves the parameter specification for the param

self :

the wire to search for the param

index :

the offset in the list of params

Returns :

the GParamSpec for the requested param

bt_wire_get_param_type ()

GType               bt_wire_get_param_type              (const BtWire * const self,
                                                         const gulong index);

Retrieves the GType of a param

self :

the wire to search for the param type

index :

the offset in the list of params

Returns :

the requested GType

bt_wire_get_pattern ()

BtWirePattern *     bt_wire_get_pattern                 (const BtWire * const self,
                                                         const BtPattern * const pattern);

Gets the wire-pattern that hold the automation data for this wire.

self :

the wire that has the pattern

pattern :

the pattern that the wire-pattern is associated with

Returns :

a reference to the wire-pattern, unref when done.

bt_wire_new ()

BtWire *            bt_wire_new                         (const BtSong *song,
                                                         const BtMachine *src_machine,
                                                         const BtMachine *dst_machine,
                                                         GError **err);

Create a new instance. The new wire is automaticall added to a songs setup. You don't need to call bt_setup_add_wire(setup,wire);.

song :

the song the new instance belongs to

src_machine :

the data source (BtSourceMachine or BtProcessorMachine)

dst_machine :

the data sink (BtSinkMachine or BtProcessorMachine)

err :

inform about failed instance creation

Returns :

the new instance or NULL in case of an error

bt_wire_reconnect ()

gboolean            bt_wire_reconnect                   (BtWire *self);

Call this method after internal elements in a BtMachine have changed, but failed to link.

self :

the wire to re-link

Returns :

TRUE for success and FALSE otherwise

Property Details

The "analyzers" property

  "analyzers"                gpointer              : Read / Write

list of wire analyzers.


The "construction-error" property

  "construction-error"       gpointer              : Read / Write / Construct Only

signal failed instance creation.


The "dst" property

  "dst"                      BtMachine*            : Read / Write / Construct Only

dst machine object, the wire links to.


The "gain" property

  "gain"                     GstElement*           : Read

the gain element for the connection.


The "num-params" property

  "num-params"               gulong                : Read / Write

number of params for the wire.

Allowed values: <= 2


The "pan" property

  "pan"                      GstElement*           : Read

the panorama element for the connection.


The "properties" property

  "properties"               gpointer              : Read

list of wire properties.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

the song object, the wire belongs to.


The "src" property

  "src"                      BtMachine*            : Read / Write / Construct Only

src machine object, the wire links to.

Signal Details

The "pattern-created" signal

void                user_function                      (BtWire        *self,
                                                        BtWirePattern *tick,
                                                        gpointer       user_data)      : No Hooks

signals that a param of this wire-pattern has been changed

self :

the wire-pattern object that emitted the signal

tick :

the tick position inside the pattern

param :

the parameter index

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/BtWirePattern.html0000644042355400116100000020726511675570702021144 00000000000000 BtWirePattern

BtWirePattern

BtWirePattern — class for an event pattern of a BtMachine instance

Synopsis

#include <libbtcore/core.h>

struct              BtWirePattern;
void                bt_wire_pattern_blend_column        (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_wire_pattern_blend_columns       (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
BtWirePattern *     bt_wire_pattern_copy                (const BtWirePattern * const self,
                                                         const BtPattern * const pattern);
void                bt_wire_pattern_delete_column       (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_wire_pattern_delete_columns      (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
void                bt_wire_pattern_delete_full_row     (const BtWirePattern * const self,
                                                         const gulong tick);
void                bt_wire_pattern_delete_row          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
gboolean            bt_wire_pattern_deserialize_column  (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         const gchar *data);
void                bt_wire_pattern_flip_column         (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_wire_pattern_flip_columns        (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
gchar *             bt_wire_pattern_get_event           (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
GValue *            bt_wire_pattern_get_event_data      (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
void                bt_wire_pattern_insert_full_row     (const BtWirePattern * const self,
                                                         const gulong tick);
void                bt_wire_pattern_insert_row          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
BtWirePattern *     bt_wire_pattern_new                 (const BtSong * const song,
                                                         const BtWire * const wire,
                                                         const BtPattern * const pattern);
void                bt_wire_pattern_randomize_column    (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_wire_pattern_randomize_columns   (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
void                bt_wire_pattern_serialize_column    (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         GString *data);
void                bt_wire_pattern_serialize_columns   (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         GString *data);
gboolean            bt_wire_pattern_set_event           (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param,
                                                         const gchar * const value);
gboolean            bt_wire_pattern_test_event          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
gboolean            bt_wire_pattern_tick_has_data       (const BtWirePattern * const self,
                                                         const gulong tick);

Object Hierarchy

  GObject
   +----BtWirePattern

Implemented Interfaces

BtWirePattern implements

Properties

  "pattern"                  BtPattern*            : Read / Write / Construct Only
  "song"                     BtSong*               : Read / Write / Construct Only
  "wire"                     BtWire*               : Read / Write / Construct Only

Description

A wire-pattern contains a grid of events. Events are parameter changes in BtWire objects. The events are stored as GValues. Cells contaning NULL have no event for the parameter at the time.

The wire-patterns are used in normal BtPattern objects as a group for each input of the BtMachine that is the owner of the pattern.

Wire-patterns synchronize their length to the length of the pattern they belong to.

Details

struct BtWirePattern

struct BtWirePattern;

Class that holds a sequence of automation events for a BtWire.


bt_wire_pattern_blend_column ()

void                bt_wire_pattern_blend_column        (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Fade values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.3


bt_wire_pattern_blend_columns ()

void                bt_wire_pattern_blend_columns       (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Fade values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.3


bt_wire_pattern_copy ()

BtWirePattern *     bt_wire_pattern_copy                (const BtWirePattern * const self,
                                                         const BtPattern * const pattern);

Create a new instance as a copy of the given instance. This is usualy done in sync with bt_pattern_copy().

self :

the wire pattern to create a copy from

pattern :

the new pattern for the copy

Returns :

the new instance or NULL in case of an error

bt_wire_pattern_delete_column ()

void                bt_wire_pattern_delete_column       (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Randomize values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.6


bt_wire_pattern_delete_columns ()

void                bt_wire_pattern_delete_columns      (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Clear values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.6


bt_wire_pattern_delete_full_row ()

void                bt_wire_pattern_delete_full_row     (const BtWirePattern * const self,
                                                         const gulong tick);

Delete row for all parameters.

self :

the pattern

tick :

the postion to delete

Since 0.3


bt_wire_pattern_delete_row ()

void                bt_wire_pattern_delete_row          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Delete row for given param.

self :

the pattern

tick :

the postion to delete

param :

the parameter

Since 0.3


bt_wire_pattern_deserialize_column ()

gboolean            bt_wire_pattern_deserialize_column  (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         const gchar *data);

Deserializes values to start_tick to end_tick for param from data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

data :

the source data

Returns :

TRUE for success, FALSE e.g. to indicate incompative GType values for the column specified by param and the data.

Since 0.6


bt_wire_pattern_flip_column ()

void                bt_wire_pattern_flip_column         (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Flips values from start_tick to end_tick for param up-side down.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.6


bt_wire_pattern_flip_columns ()

void                bt_wire_pattern_flip_columns        (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Flips values from start_tick to end_tick for all params up-side down.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.6


bt_wire_pattern_get_event ()

gchar *             bt_wire_pattern_get_event           (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Returns the string representation of the specified cell. Free it when done.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the parameter starting with 0

Returns :

a newly allocated string with the data or NULL on error

bt_wire_pattern_get_event_data ()

GValue *            bt_wire_pattern_get_event_data      (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Fetches a cell from the given location in the pattern. If there is no event there, then the GValue is uninitialized. Test with BT_IS_GVALUE(event).

self :

the pattern to search for the param

tick :

the tick (time) position starting with 0

param :

the number of the parameter starting with 0

Returns :

the GValue or NULL if out of the pattern range

bt_wire_pattern_insert_full_row ()

void                bt_wire_pattern_insert_full_row     (const BtWirePattern * const self,
                                                         const gulong tick);

Insert one empty row for all parameters.

self :

the pattern

tick :

the postion to insert at

Since 0.3


bt_wire_pattern_insert_row ()

void                bt_wire_pattern_insert_row          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Insert one empty row for given param.

self :

the pattern

tick :

the postion to insert at

param :

the parameter

Since 0.3


bt_wire_pattern_new ()

BtWirePattern *     bt_wire_pattern_new                 (const BtSong * const song,
                                                         const BtWire * const wire,
                                                         const BtPattern * const pattern);

Create a new instance.

song :

the song the new instance belongs to

wire :

the wire the pattern belongs to

pattern :

the pattern that gets extended

Returns :

the new instance or NULL in case of an error

bt_wire_pattern_randomize_column ()

void                bt_wire_pattern_randomize_column    (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Randomize values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.3


bt_wire_pattern_randomize_columns ()

void                bt_wire_pattern_randomize_columns   (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Randomize values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.3


bt_wire_pattern_serialize_column ()

void                bt_wire_pattern_serialize_column    (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         GString *data);

Serializes values from start_tick to end_tick for param into data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

data :

the target

Since 0.6


bt_wire_pattern_serialize_columns ()

void                bt_wire_pattern_serialize_columns   (const BtWirePattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         GString *data);

Serializes values from start_tick to end_tick for all params into data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

data :

the target

Since 0.6


bt_wire_pattern_set_event ()

gboolean            bt_wire_pattern_set_event           (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param,
                                                         const gchar * const value);

Stores the supplied value into the specified pattern cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the parameter starting with 0

value :

the string representation of the value to store

Returns :

TRUE for success

bt_wire_pattern_test_event ()

gboolean            bt_wire_pattern_test_event          (const BtWirePattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Tests if there is an event in the specified cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the parameter starting with 0

Returns :

TRUE if there is an event

bt_wire_pattern_tick_has_data ()

gboolean            bt_wire_pattern_tick_has_data       (const BtWirePattern * const self,
                                                         const gulong tick);

Check if there are any event in the given pattern-row.

self :

the pattern to check

tick :

the tick index in the pattern

Returns :

TRUE is there are events, FALSE otherwise

Property Details

The "pattern" property

  "pattern"                  BtPattern*            : Read / Write / Construct Only

Pattern object, the wire-pattern belongs to.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Song object, the pattern belongs to.


The "wire" property

  "wire"                     BtWire*               : Read / Write / Construct Only

Wire object, the wire-pattern belongs to.

Signal Details

The "param-changed" signal

void                user_function                      (BtWirePattern *self,
                                                        gulong         tick,
                                                        BtWire        *wire,
                                                        gulong         param,
                                                        gpointer       user_data)      : No Hooks

signals that a param of this wire-pattern has been changed

self :

the wire-pattern object that emitted the signal

tick :

the tick position inside the pattern

wire :

the wire for which it changed

param :

the parameter index

user_data :

user data set when the signal handler was connected.

The "pattern-changed" signal

void                user_function                      (BtWirePattern *self,
                                                        gpointer       user_data)      : No Hooks

signals that this wire-pattern has been changed (more than in one place)

self :

the wire-pattern object that emitted the signal

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/right.png0000644042355400116100000000073011675570702017333 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’ò Annotation Glossary

Annotation Glossary

A

array

Parameter points to an array of items.

I

inout

Parameter for input and for returning results. Default is transfer full.

T

transfer full

Free data after the code is done.

buzztard-0.6.0/docs/reference/bt-core/html/BtWave.html0000644042355400116100000005226311675570702017576 00000000000000 BtWave

BtWave

BtWave — one BtWavetable entry that keeps a list of BtWavelevels

Synopsis

#include <libbtcore/core.h>

struct              BtWave;
enum                BtWaveLoopMode;
gboolean            bt_wave_add_wavelevel               (const BtWave * const self,
                                                         const BtWavelevel * const wavelevel);
BtWavelevel *       bt_wave_get_level_by_index          (const BtWave * const self,
                                                         const gulong index);
BtWave *            bt_wave_new                         (const BtSong * const song,
                                                         const gchar * const name,
                                                         const gchar * const uri,
                                                         const gulong index,
                                                         const gdouble volume,
                                                         const BtWaveLoopMode loop_mode,
                                                         const guint channels);

Object Hierarchy

  GObject
   +----BtWave

Implemented Interfaces

BtWave implements

Properties

  "channels"                 guint                 : Read / Write / Construct
  "index"                    gulong                : Read / Write / Construct
  "loop-mode"                BtWaveLoopMode        : Read / Write / Construct
  "name"                     gchar*                : Read / Write / Construct
  "song"                     BtSong*               : Read / Write / Construct Only
  "uri"                      gchar*                : Read / Write / Construct
  "volume"                   gdouble               : Read / Write / Construct
  "wavelevels"               gpointer              : Read

Signals

  "loading-done"                                   : No Hooks

Description

Represents one instrument. Contains one or more BtWavelevels.

Details

struct BtWave

struct BtWave;

A single waveform.


enum BtWaveLoopMode

typedef enum {
  BT_WAVE_LOOP_MODE_OFF=0,
  BT_WAVE_LOOP_MODE_FORWARD,
  BT_WAVE_LOOP_MODE_PINGPONG
} BtWaveLoopMode;

BtWave clips can be played using several loop modes.

BT_WAVE_LOOP_MODE_OFF

no loop

BT_WAVE_LOOP_MODE_FORWARD

forward looping

BT_WAVE_LOOP_MODE_PINGPONG

forward/backward looping

bt_wave_add_wavelevel ()

gboolean            bt_wave_add_wavelevel               (const BtWave * const self,
                                                         const BtWavelevel * const wavelevel);

Add the supplied wavelevel to the wave. This is automatically done by #bt_wavelevel_new().

self :

the wavetable to add the new wavelevel to

wavelevel :

the new wavelevel instance

Returns :

TRUE for success, FALSE otheriwse

bt_wave_get_level_by_index ()

BtWavelevel *       bt_wave_get_level_by_index          (const BtWave * const self,
                                                         const gulong index);

Search the wave for a wavelevel by the supplied index. The wavelevel must have been added previously to this wave with bt_wave_add_wavelevel(). Unref the wavelevel, when done with it.

self :

the wave to search for the wavelevel

index :

the index of the wavelevel

Returns :

BtWavelevel instance or NULL if not found

bt_wave_new ()

BtWave *            bt_wave_new                         (const BtSong * const song,
                                                         const gchar * const name,
                                                         const gchar * const uri,
                                                         const gulong index,
                                                         const gdouble volume,
                                                         const BtWaveLoopMode loop_mode,
                                                         const guint channels);

Create a new instance

song :

the song the new instance belongs to

name :

the display name for the new wave

uri :

the location of the sample data

index :

the list slot for the new wave

volume :

the volume of the wave

loop_mode :

loop playback mode

channels :

number of audio channels

Returns :

the new instance or NULL in case of an error

Property Details

The "channels" property

  "channels"                 guint                 : Read / Write / Construct

number of channels in the sample.

Allowed values: <= 2

Default value: 0


The "index" property

  "index"                    gulong                : Read / Write / Construct

The index of the wave in the wavtable.


The "loop-mode" property

  "loop-mode"                BtWaveLoopMode        : Read / Write / Construct

mode of loop playback.

Default value: off


The "name" property

  "name"                     gchar*                : Read / Write / Construct

The name of the wave.

Default value: "unamed wave"


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Set song object, the wave belongs to.


The "uri" property

  "uri"                      gchar*                : Read / Write / Construct

The uri of the wave.

Default value: NULL


The "volume" property

  "volume"                   gdouble               : Read / Write / Construct

The volume of the wave in the wavtable.

Allowed values: [0,1]

Default value: 1


The "wavelevels" property

  "wavelevels"               gpointer              : Read

A copy of the list of wavelevels.

Signal Details

The "loading-done" signal

void                user_function                      (BtWave  *self,
                                                        gboolean success,
                                                        gpointer user_data)      : No Hooks

Loading the sample has finished with result.

self :

the setup object that emitted the signal

success :

the result

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/left.png0000644042355400116100000000071311675570702017151 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1&¹³[(XIDATxœµ•!OÃPEïÛ*ˆ‰ŠID%~ꊯ˜ÄÕ"pæ'öŘ`sÜ–¥rKf–´‚¤â h—mi—ÇIžz}÷ܯIû¤–.pÚö\“`xä‹ ˆl‡?l·[²,H¬‡¯×k<Ï#Žcþ%\’AUx[S³7–n6ù¾¯år¹ßèõzE‰‡’s’žŒ1³ºö“²æÅj@œ—NL$ݤiª0 ¿5/ð}¿²\E‡Ž¤KIo¥Í“$a0üjÞdF£bŠkIê„‹æAh>ŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚buzztard-0.6.0/docs/reference/bt-core/html/api-index.html0000644042355400116100000031466411675570702020272 00000000000000 API Index

API Index

A

BtApplication, struct in BtApplication
BtApplication:bin, object property in BtApplication
BtApplication:settings, object property in BtApplication

B

bt_bin_activate_tee_chain, function in libbtcore
bt_bin_deactivate_tee_chain, function in libbtcore

C

BtChildProxyInterface, struct in BtChildProxy
bt_child_proxy_get, function in BtChildProxy
bt_child_proxy_get_children_count, function in BtChildProxy
bt_child_proxy_get_child_by_index, function in BtChildProxy
bt_child_proxy_get_child_by_name, function in BtChildProxy
bt_child_proxy_get_property, function in BtChildProxy
bt_child_proxy_get_valist, function in BtChildProxy
bt_child_proxy_lookup, function in BtChildProxy
bt_child_proxy_set, function in BtChildProxy
bt_child_proxy_set_property, function in BtChildProxy
bt_child_proxy_set_valist, function in BtChildProxy
bt_cpu_load_get_current, function in libbtcore

D

bt_deinit, function in libbtcore

G

BtGConfSettings, struct in BtGConfSettings
bt_gconf_settings_new, function in BtGConfSettings
bt_gst_check_core_elements, function in libbtcore
bt_gst_check_elements, function in libbtcore
bt_gst_debug_pad_link_return, function in libbtcore
bt_gst_element_factory_can_sink_media_type, function in libbtcore
bt_gst_registry_get_element_factories_matching_all_categories, function in libbtcore
bt_gst_registry_get_element_names_matching_all_categories, function in libbtcore
G_OBJECT_REF_COUNT, macro in libbtcore
g_object_try_ref, macro in libbtcore
g_object_try_unref, macro in libbtcore
g_object_try_weak_ref, macro in libbtcore
g_object_try_weak_unref, macro in libbtcore
G_POINTER_ALIAS, macro in libbtcore
bt_g_type_get_base_type, function in libbtcore

I

bt_init, function in libbtcore
bt_init_add_option_groups, function in libbtcore
bt_init_check, function in libbtcore
bt_init_get_option_group, function in libbtcore
BT_IS_GVALUE, macro in libbtcore
BT_IS_STRING, macro in libbtcore

M

BtMachine, struct in BtMachine
BtMachine::pattern-added, object signal in BtMachine
BtMachine::pattern-removed, object signal in BtMachine
BtMachine:adder-convert, object property in BtMachine
BtMachine:construction-error, object property in BtMachine
BtMachine:global-params, object property in BtMachine
BtMachine:id, object property in BtMachine
BtMachine:input-gain, object property in BtMachine
BtMachine:input-post-level, object property in BtMachine
BtMachine:input-pre-level, object property in BtMachine
BtMachine:machine, object property in BtMachine
BtMachine:output-gain, object property in BtMachine
BtMachine:output-post-level, object property in BtMachine
BtMachine:output-pre-level, object property in BtMachine
BtMachine:patterns, object property in BtMachine
BtMachine:plugin-name, object property in BtMachine
BtMachine:properties, object property in BtMachine
BtMachine:song, object property in BtMachine
BtMachine:state, object property in BtMachine
BtMachine:voice-params, object property in BtMachine
BtMachine:voices, object property in BtMachine
BtMachineClass, struct in BtMachine
BtMachineState, enum in BtMachine
bt_machine_activate_adder, function in BtMachine
bt_machine_activate_spreader, function in BtMachine
bt_machine_add_pattern, function in BtMachine
bt_machine_bind_parameter_control, function in BtMachine
bt_machine_describe_global_param_value, function in BtMachine
bt_machine_describe_voice_param_value, function in BtMachine
bt_machine_enable_input_gain, function in BtMachine
bt_machine_enable_input_post_level, function in BtMachine
bt_machine_enable_input_pre_level, function in BtMachine
bt_machine_enable_output_gain, function in BtMachine
bt_machine_enable_output_post_level, function in BtMachine
bt_machine_enable_output_pre_level, function in BtMachine
bt_machine_get_global_param_details, function in BtMachine
bt_machine_get_global_param_index, function in BtMachine
bt_machine_get_global_param_name, function in BtMachine
bt_machine_get_global_param_no_value, function in BtMachine
bt_machine_get_global_param_spec, function in BtMachine
bt_machine_get_global_param_type, function in BtMachine
bt_machine_get_global_wave_param_index, function in BtMachine
bt_machine_get_pattern_by_id, function in BtMachine
bt_machine_get_pattern_by_index, function in BtMachine
bt_machine_get_pattern_by_name, function in BtMachine
bt_machine_get_unique_pattern_name, function in BtMachine
bt_machine_get_voice_param_details, function in BtMachine
bt_machine_get_voice_param_index, function in BtMachine
bt_machine_get_voice_param_name, function in BtMachine
bt_machine_get_voice_param_no_value, function in BtMachine
bt_machine_get_voice_param_spec, function in BtMachine
bt_machine_get_voice_param_type, function in BtMachine
bt_machine_get_voice_wave_param_index, function in BtMachine
bt_machine_get_wire_by_dst_machine, function in BtMachine
bt_machine_global_controller_change_value, function in BtMachine
bt_machine_has_active_adder, function in BtMachine
bt_machine_has_active_spreader, function in BtMachine
bt_machine_has_patterns, function in BtMachine
bt_machine_is_global_param_no_value, function in BtMachine
bt_machine_is_global_param_trigger, function in BtMachine
bt_machine_is_polyphonic, function in BtMachine
bt_machine_is_voice_param_no_value, function in BtMachine
bt_machine_is_voice_param_trigger, function in BtMachine
bt_machine_randomize_parameters, function in BtMachine
bt_machine_remove_pattern, function in BtMachine
bt_machine_reset_parameters, function in BtMachine
bt_machine_set_global_param_default, function in BtMachine
bt_machine_set_global_param_value, function in BtMachine
bt_machine_set_param_defaults, function in BtMachine
bt_machine_set_voice_param_default, function in BtMachine
bt_machine_set_voice_param_value, function in BtMachine
bt_machine_unbind_parameter_control, function in BtMachine
bt_machine_unbind_parameter_controls, function in BtMachine
bt_machine_voice_controller_change_value, function in BtMachine
bt_major_version, variable in libbtcore
bt_micro_version, variable in libbtcore
bt_minor_version, variable in libbtcore

P

BtPattern, struct in BtPattern
BtPattern::global-param-changed, object signal in BtPattern
BtPattern::pattern-changed, object signal in BtPattern
BtPattern::voice-param-changed, object signal in BtPattern
BtPattern:id, object property in BtPattern
BtPattern:is-internal, object property in BtPattern
BtPattern:length, object property in BtPattern
BtPattern:machine, object property in BtPattern
BtPattern:name, object property in BtPattern
BtPattern:song, object property in BtPattern
BtPattern:voices, object property in BtPattern
BtPatternCmd, enum in BtPattern
bt_pattern_blend_column, function in BtPattern
bt_pattern_blend_columns, function in BtPattern
bt_pattern_copy, function in BtPattern
bt_pattern_delete_column, function in BtPattern
bt_pattern_delete_columns, function in BtPattern
bt_pattern_delete_full_row, function in BtPattern
bt_pattern_delete_row, function in BtPattern
bt_pattern_deserialize_column, function in BtPattern
bt_pattern_flip_column, function in BtPattern
bt_pattern_flip_columns, function in BtPattern
bt_pattern_get_cmd, function in BtPattern
bt_pattern_get_global_event, function in BtPattern
bt_pattern_get_global_event_data, function in BtPattern
bt_pattern_get_global_param_index, function in BtPattern
bt_pattern_get_voice_event, function in BtPattern
bt_pattern_get_voice_event_data, function in BtPattern
bt_pattern_get_voice_param_index, function in BtPattern
bt_pattern_insert_full_row, function in BtPattern
bt_pattern_insert_row, function in BtPattern
bt_pattern_new, function in BtPattern
bt_pattern_new_with_event, function in BtPattern
bt_pattern_randomize_column, function in BtPattern
bt_pattern_randomize_columns, function in BtPattern
bt_pattern_serialize_column, function in BtPattern
bt_pattern_serialize_columns, function in BtPattern
bt_pattern_set_global_event, function in BtPattern
bt_pattern_set_voice_event, function in BtPattern
bt_pattern_test_global_event, function in BtPattern
bt_pattern_test_voice_event, function in BtPattern
bt_pattern_tick_has_data, function in BtPattern
BtPersistenceInterface, struct in BtPersistence
bt_persistence_collect_hashtable_entries, function in BtPersistence
bt_persistence_get_value, function in BtPersistence
bt_persistence_load, function in BtPersistence
bt_persistence_load_hashtable, function in BtPersistence
bt_persistence_parse_enum, function in BtPersistence
bt_persistence_save, function in BtPersistence
bt_persistence_save_hashtable, function in BtPersistence
bt_persistence_save_list, function in BtPersistence
bt_persistence_set_value, function in BtPersistence
bt_persistence_strfmt_double, function in BtPersistence
bt_persistence_strfmt_enum, function in BtPersistence
bt_persistence_strfmt_long, function in BtPersistence
bt_persistence_strfmt_uchar, function in BtPersistence
bt_persistence_strfmt_ulong, function in BtPersistence
BtProcessorMachine, struct in BtProcessorMachine
BtProcessorMachinePatternIndex, enum in BtProcessorMachine
bt_processor_machine_new, function in BtProcessorMachine

R

return_if_disposed, macro in libbtcore
return_val_if_disposed, macro in libbtcore

S

safe_string, macro in libbtcore
BtSequence, struct in BtSequence
BtSequence::pattern-added, object signal in BtSequence
BtSequence::pattern-removed, object signal in BtSequence
BtSequence::rows-changed, object signal in BtSequence
BtSequence::track-added, object signal in BtSequence
BtSequence::track-removed, object signal in BtSequence
BtSequence:length, object property in BtSequence
BtSequence:loop, object property in BtSequence
BtSequence:loop-end, object property in BtSequence
BtSequence:loop-start, object property in BtSequence
BtSequence:properties, object property in BtSequence
BtSequence:song, object property in BtSequence
BtSequence:tracks, object property in BtSequence
bt_sequence_add_track, function in BtSequence
bt_sequence_delete_full_rows, function in BtSequence
bt_sequence_delete_rows, function in BtSequence
bt_sequence_get_bar_time, function in BtSequence
bt_sequence_get_label, function in BtSequence
bt_sequence_get_loop_time, function in BtSequence
bt_sequence_get_machine, function in BtSequence
bt_sequence_get_pattern, function in BtSequence
bt_sequence_get_tick_by_pattern, function in BtSequence
bt_sequence_get_track_by_machine, function in BtSequence
bt_sequence_insert_full_rows, function in BtSequence
bt_sequence_insert_rows, function in BtSequence
bt_sequence_is_pattern_used, function in BtSequence
bt_sequence_limit_play_pos, function in BtSequence
bt_sequence_move_track_left, function in BtSequence
bt_sequence_move_track_right, function in BtSequence
bt_sequence_new, function in BtSequence
bt_sequence_remove_track_by_ix, function in BtSequence
bt_sequence_remove_track_by_machine, function in BtSequence
bt_sequence_repair_damage, function in BtSequence
bt_sequence_set_label, function in BtSequence
bt_sequence_set_pattern, function in BtSequence
bt_sequence_set_pattern_quick, function in BtSequence
bt_sequence_update_tempo, function in BtSequence
BtSettings, struct in BtSettings
BtSettings:audiosink, object property in BtSettings
BtSettings:channels, object property in BtSettings
BtSettings:coherence-upnp-active, object property in BtSettings
BtSettings:coherence-upnp-port, object property in BtSettings
BtSettings:grid-density, object property in BtSettings
BtSettings:missing-machines, object property in BtSettings
BtSettings:news-seen, object property in BtSettings
BtSettings:presented-tips, object property in BtSettings
BtSettings:record-folder, object property in BtSettings
BtSettings:sample-folder, object property in BtSettings
BtSettings:sample-rate, object property in BtSettings
BtSettings:show-tips, object property in BtSettings
BtSettings:song-folder, object property in BtSettings
BtSettings:statusbar-hide, object property in BtSettings
BtSettings:system-audiosink, object property in BtSettings
BtSettings:tabs-hide, object property in BtSettings
BtSettings:toolbar-hide, object property in BtSettings
BtSettings:toolbar-style, object property in BtSettings
BtSettings:window-height, object property in BtSettings
BtSettings:window-width, object property in BtSettings
BtSettings:window-xpos, object property in BtSettings
BtSettings:window-ypos, object property in BtSettings
BtSettingsFactory, user_function in BtSettings
bt_settings_determine_audiosink_name, function in BtSettings
bt_settings_make, function in BtSettings
bt_settings_set_factory, function in BtSettings
BtSetup, struct in BtSetup
BtSetup::machine-added, object signal in BtSetup
BtSetup::machine-removed, object signal in BtSetup
BtSetup::wire-added, object signal in BtSetup
BtSetup::wire-removed, object signal in BtSetup
BtSetup:machines, object property in BtSetup
BtSetup:missing-machines, object property in BtSetup
BtSetup:properties, object property in BtSetup
BtSetup:song, object property in BtSetup
BtSetup:wires, object property in BtSetup
bt_setup_add_machine, function in BtSetup
bt_setup_add_wire, function in BtSetup
bt_setup_get_machines_by_type, function in BtSetup
bt_setup_get_machine_by_id, function in BtSetup
bt_setup_get_machine_by_type, function in BtSetup
bt_setup_get_unique_machine_id, function in BtSetup
bt_setup_get_wires_by_dst_machine, function in BtSetup
bt_setup_get_wires_by_src_machine, function in BtSetup
bt_setup_get_wire_by_dst_machine, function in BtSetup
bt_setup_get_wire_by_machines, function in BtSetup
bt_setup_get_wire_by_src_machine, function in BtSetup
bt_setup_new, function in BtSetup
bt_setup_remember_missing_machine, function in BtSetup
bt_setup_remove_machine, function in BtSetup
bt_setup_remove_wire, function in BtSetup
BtSinkBin, struct in BtSinkBin
BtSinkBin:analyzers, object property in BtSinkBin
BtSinkBin:input-gain, object property in BtSinkBin
BtSinkBin:master-volume, object property in BtSinkBin
BtSinkBin:mode, object property in BtSinkBin
BtSinkBin:record-file-name, object property in BtSinkBin
BtSinkBin:record-format, object property in BtSinkBin
BtSinkBinMode, enum in BtSinkBin
BtSinkBinRecordFormat, enum in BtSinkBin
BtSinkMachine, struct in BtSinkMachine
BtSinkMachinePatternIndex, enum in BtSinkMachine
bt_sink_machine_new, function in BtSinkMachine
BtSong, struct in BtSong
BtSong:app, object property in BtSong
BtSong:bin, object property in BtSong
BtSong:is-idle, object property in BtSong
BtSong:is-playing, object property in BtSong
BtSong:master, object property in BtSong
BtSong:play-pos, object property in BtSong
BtSong:play-rate, object property in BtSong
BtSong:sequence, object property in BtSong
BtSong:setup, object property in BtSong
BtSong:song-info, object property in BtSong
BtSong:song-io, object property in BtSong
BtSong:wavetable, object property in BtSong
BtSongClass, struct in BtSong
BtSongInfo, struct in BtSongInfo
BtSongInfo:author, object property in BtSongInfo
BtSongInfo:bars, object property in BtSongInfo
BtSongInfo:bpm, object property in BtSongInfo
BtSongInfo:change-dts, object property in BtSongInfo
BtSongInfo:create-dts, object property in BtSongInfo
BtSongInfo:file-name, object property in BtSongInfo
BtSongInfo:genre, object property in BtSongInfo
BtSongInfo:info, object property in BtSongInfo
BtSongInfo:name, object property in BtSongInfo
BtSongInfo:song, object property in BtSongInfo
BtSongInfo:taglist, object property in BtSongInfo
BtSongInfo:tpb, object property in BtSongInfo
BtSongIO, struct in BtSongIO
BtSongIO:data, object property in BtSongIO
BtSongIO:data-len, object property in BtSongIO
BtSongIO:file-name, object property in BtSongIO
BtSongIO:status, object property in BtSongIO
BtSongIOClass, struct in BtSongIO
BtSongIOFormatInfo, struct in BtSongIO
BtSongIOInit, user_function in BtSongIO
BtSongIOModuleInfo, struct in BtSongIO
BtSongIONative, struct in BtSongIONative
BtSongIONativeBZT, struct in BtSongIONativeBZT
BtSongIONativeBZTClass, struct in BtSongIONativeBZT
BtSongIONativeClass, struct in BtSongIONative
BtSongIONativeXML, struct in BtSongIONativeXML
BtSongIONativeXMLClass, struct in BtSongIONativeXML
bt_song_continue, function in BtSong
bt_song_info_new, function in BtSongInfo
bt_song_io_from_data, function in BtSongIO
bt_song_io_from_file, function in BtSongIO
bt_song_io_get_module_info_list, function in BtSongIO
bt_song_io_load, function in BtSongIO
BT_SONG_IO_MODULE_INFO_MAX_FORMATS, macro in BtSongIO
bt_song_io_native_bzt_copy_from_uri, function in BtSongIONativeBZT
bt_song_io_native_bzt_copy_to_fd, function in BtSongIONativeBZT
bt_song_io_native_module_info, variable in BtSongIONative
bt_song_io_save, function in BtSongIO
bt_song_io_virtual_load, user_function in BtSongIO
bt_song_io_virtual_save, user_function in BtSongIO
bt_song_new, function in BtSong
bt_song_pause, function in BtSong
bt_song_play, function in BtSong
bt_song_stop, function in BtSong
bt_song_update_playback_position, function in BtSong
BtSourceMachine, struct in BtSourceMachine
BtSourceMachinePatternIndex, enum in BtSourceMachine
bt_source_machine_new, function in BtSourceMachine

W

BtWave, struct in BtWave
BtWave::loading-done, object signal in BtWave
BtWave:channels, object property in BtWave
BtWave:index, object property in BtWave
BtWave:loop-mode, object property in BtWave
BtWave:name, object property in BtWave
BtWave:song, object property in BtWave
BtWave:uri, object property in BtWave
BtWave:volume, object property in BtWave
BtWave:wavelevels, object property in BtWave
BtWavelevel, struct in BtWavelevel
BtWavelevel:data, object property in BtWavelevel
BtWavelevel:length, object property in BtWavelevel
BtWavelevel:loop-end, object property in BtWavelevel
BtWavelevel:loop-start, object property in BtWavelevel
BtWavelevel:rate, object property in BtWavelevel
BtWavelevel:root-note, object property in BtWavelevel
BtWavelevel:song, object property in BtWavelevel
BtWavelevel:wave, object property in BtWavelevel
BT_WAVELEVEL_DEFAULT_ROOT_NOTE, macro in BtWavelevel
bt_wavelevel_new, function in BtWavelevel
BtWaveLoopMode, enum in BtWave
BtWavetable, struct in BtWavetable
BtWavetable::wave-added, object signal in BtWavetable
BtWavetable::wave-removed, object signal in BtWavetable
BtWavetable:missing-waves, object property in BtWavetable
BtWavetable:song, object property in BtWavetable
BtWavetable:waves, object property in BtWavetable
bt_wavetable_add_wave, function in BtWavetable
bt_wavetable_get_wave_by_index, function in BtWavetable
bt_wavetable_new, function in BtWavetable
bt_wavetable_remember_missing_wave, function in BtWavetable
bt_wavetable_remove_wave, function in BtWavetable
bt_wave_add_wavelevel, function in BtWave
bt_wave_get_level_by_index, function in BtWave
bt_wave_new, function in BtWave
BtWire, struct in BtWire
BtWire::pattern-created, object signal in BtWire
BtWire:analyzers, object property in BtWire
BtWire:construction-error, object property in BtWire
BtWire:dst, object property in BtWire
BtWire:gain, object property in BtWire
BtWire:num-params, object property in BtWire
BtWire:pan, object property in BtWire
BtWire:properties, object property in BtWire
BtWire:song, object property in BtWire
BtWire:src, object property in BtWire
BtWirePattern, struct in BtWirePattern
BtWirePattern::param-changed, object signal in BtWirePattern
BtWirePattern::pattern-changed, object signal in BtWirePattern
BtWirePattern:pattern, object property in BtWirePattern
BtWirePattern:song, object property in BtWirePattern
BtWirePattern:wire, object property in BtWirePattern
bt_wire_add_wire_pattern, function in BtWire
bt_wire_controller_change_value, function in BtWire
bt_wire_get_param_details, function in BtWire
bt_wire_get_param_index, function in BtWire
bt_wire_get_param_name, function in BtWire
bt_wire_get_param_spec, function in BtWire
bt_wire_get_param_type, function in BtWire
bt_wire_get_pattern, function in BtWire
BT_WIRE_MAX_NUM_PARAMS, macro in BtWire
bt_wire_new, function in BtWire
bt_wire_pattern_blend_column, function in BtWirePattern
bt_wire_pattern_blend_columns, function in BtWirePattern
bt_wire_pattern_copy, function in BtWirePattern
bt_wire_pattern_delete_column, function in BtWirePattern
bt_wire_pattern_delete_columns, function in BtWirePattern
bt_wire_pattern_delete_full_row, function in BtWirePattern
bt_wire_pattern_delete_row, function in BtWirePattern
bt_wire_pattern_deserialize_column, function in BtWirePattern
bt_wire_pattern_flip_column, function in BtWirePattern
bt_wire_pattern_flip_columns, function in BtWirePattern
bt_wire_pattern_get_event, function in BtWirePattern
bt_wire_pattern_get_event_data, function in BtWirePattern
bt_wire_pattern_insert_full_row, function in BtWirePattern
bt_wire_pattern_insert_row, function in BtWirePattern
bt_wire_pattern_new, function in BtWirePattern
bt_wire_pattern_randomize_column, function in BtWirePattern
bt_wire_pattern_randomize_columns, function in BtWirePattern
bt_wire_pattern_serialize_column, function in BtWirePattern
bt_wire_pattern_serialize_columns, function in BtWirePattern
bt_wire_pattern_set_event, function in BtWirePattern
bt_wire_pattern_test_event, function in BtWirePattern
bt_wire_pattern_tick_has_data, function in BtWirePattern
bt_wire_reconnect, function in BtWire
buzztard-0.6.0/docs/reference/bt-core/html/BtMachine.html0000644042355400116100000040357111675570702020242 00000000000000 BtMachine

BtMachine

BtMachine — base class for signal processing machines

Synopsis

#include <libbtcore/core.h>

struct              BtMachine;
struct              BtMachineClass;
enum                BtMachineState;
gboolean            bt_machine_activate_adder           (BtMachine * const self);
gboolean            bt_machine_activate_spreader        (BtMachine * const self);
void                bt_machine_add_pattern              (const BtMachine *self,
                                                         const BtPattern *pattern);
void                bt_machine_bind_parameter_control   (const BtMachine * const self,
                                                         GstObject *object,
                                                         const gchar *property_name,
                                                         BtIcControl *control);
gchar *             bt_machine_describe_global_param_value
                                                        (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);
gchar *             bt_machine_describe_voice_param_value
                                                        (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);
gboolean            bt_machine_enable_input_gain        (BtMachine * const self);
gboolean            bt_machine_enable_input_post_level  (BtMachine * const self);
gboolean            bt_machine_enable_input_pre_level   (BtMachine * const self);
gboolean            bt_machine_enable_output_gain       (BtMachine * const self);
gboolean            bt_machine_enable_output_post_level (BtMachine * const self);
gboolean            bt_machine_enable_output_pre_level  (BtMachine * const self);
void                bt_machine_get_global_param_details (const BtMachine * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);
glong               bt_machine_get_global_param_index   (const BtMachine * const self,
                                                         const gchar * const name,
                                                         GError **error);
const gchar *       bt_machine_get_global_param_name    (const BtMachine * const self,
                                                         const gulong index);
GValue *            bt_machine_get_global_param_no_value
                                                        (const BtMachine * const self,
                                                         const gulong index);
GParamSpec *        bt_machine_get_global_param_spec    (const BtMachine * const self,
                                                         const gulong index);
GType               bt_machine_get_global_param_type    (const BtMachine * const self,
                                                         const gulong index);
glong               bt_machine_get_global_wave_param_index
                                                        (const BtMachine * const self);
BtPattern *         bt_machine_get_pattern_by_id        (const BtMachine * const self,
                                                         const gchar * const id);
BtPattern *         bt_machine_get_pattern_by_index     (const BtMachine * const self,
                                                         const gulong index);
BtPattern *         bt_machine_get_pattern_by_name      (const BtMachine * const self,
                                                         const gchar * const name);
gchar *             bt_machine_get_unique_pattern_name  (const BtMachine * const self);
void                bt_machine_get_voice_param_details  (const BtMachine * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);
glong               bt_machine_get_voice_param_index    (const BtMachine * const self,
                                                         const gchar * const name,
                                                         GError **error);
const gchar *       bt_machine_get_voice_param_name     (const BtMachine * const self,
                                                         const gulong index);
GValue *            bt_machine_get_voice_param_no_value (const BtMachine * const self,
                                                         const gulong index);
GParamSpec *        bt_machine_get_voice_param_spec     (const BtMachine * const self,
                                                         const gulong index);
GType               bt_machine_get_voice_param_type     (const BtMachine * const self,
                                                         const gulong index);
glong               bt_machine_get_voice_wave_param_index
                                                        (const BtMachine * const self);
BtWire *            bt_machine_get_wire_by_dst_machine  (const BtMachine * const self,
                                                         const BtMachine * const dst);
void                bt_machine_global_controller_change_value
                                                        (const BtMachine * const self,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue *value);
gboolean            bt_machine_has_active_adder         (const BtMachine * const self);
gboolean            bt_machine_has_active_spreader      (const BtMachine * const self);
gboolean            bt_machine_has_patterns             (const BtMachine * const self);
gboolean            bt_machine_is_global_param_no_value (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const value);
gboolean            bt_machine_is_global_param_trigger  (const BtMachine * const self,
                                                         const gulong index);
gboolean            bt_machine_is_polyphonic            (const BtMachine * const self);
gboolean            bt_machine_is_voice_param_no_value  (const BtMachine *const self,
                                                         const gulong index,
                                                         GValue * const value);
gboolean            bt_machine_is_voice_param_trigger   (const BtMachine * const self,
                                                         const gulong index);
void                bt_machine_randomize_parameters     (const BtMachine * const self);
void                bt_machine_remove_pattern           (const BtMachine *self,
                                                         const BtPattern *pattern);
void                bt_machine_reset_parameters         (const BtMachine * const self);
void                bt_machine_set_global_param_default (const BtMachine * const self,
                                                         const gulong index);
void                bt_machine_set_global_param_value   (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);
void                bt_machine_set_param_defaults       (const BtMachine *const self);
void                bt_machine_set_voice_param_default  (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong index);
void                bt_machine_set_voice_param_value    (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong index,
                                                         GValue * const event);
void                bt_machine_unbind_parameter_control (const BtMachine * const self,
                                                         GstObject *object,
                                                         const char *property_name);
void                bt_machine_unbind_parameter_controls
                                                        (const BtMachine * const self);
void                bt_machine_voice_controller_change_value
                                                        (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue *value);

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtMachine
                           +----BtProcessorMachine
                           +----BtSinkMachine
                           +----BtSourceMachine

Implemented Interfaces

BtMachine implements GstChildProxy.

Properties

  "adder-convert"            GstElement*           : Read
  "construction-error"       gpointer              : Read / Write / Construct Only
  "global-params"            gulong                : Read / Write
  "id"                       gchar*                : Read / Write / Construct
  "input-gain"               GstElement*           : Read
  "input-post-level"         GstElement*           : Read
  "input-pre-level"          GstElement*           : Read
  "machine"                  GstElement*           : Read
  "output-gain"              GstElement*           : Read
  "output-post-level"        GstElement*           : Read
  "output-pre-level"         GstElement*           : Read
  "patterns"                 gpointer              : Read
  "plugin-name"              gchar*                : Read / Write / Construct
  "properties"               gpointer              : Read
  "song"                     BtSong*               : Read / Write / Construct Only
  "state"                    BtMachineState        : Read / Write
  "voice-params"             gulong                : Read / Write
  "voices"                   gulong                : Read / Write / Construct

Description

Machines are pieces in a BtSong that generate, process or play media.

The machine class takes care of inserting additional low-level elemnts to do signal conversion etc.. Further it provides general facillities like input/output level monitoring. The resulting machine instance is a box containing several processing elements.

A machine can have several GstElements:

adder:

mixes all incoming signals

input volume:

gain for incoming signals

input pre/post-gain level:

level meter for incoming signal

machine:

the real machine

output volume:

gain for outgoing signal

output pre/post-gain level:

level meter for outgoing signal

spreader:

distibutes signal to outgoing connections

The adder and spreader elements are activated depending on element type. The volume controls and level meters are activated as requested via the API. It is recommended to only activate them, when needed. The instances are cached after deactivation (so that they can be easily reactivated) and destroyed with the BtMachine object.

Furthermore the machine handles a list of BtPattern instances. These contain event patterns that form a BtSequence.

Details

struct BtMachine

struct BtMachine {
  /*< read-only >*/
  GList *src_wires;
  GList *dst_wires;
};

Base object for a virtual piece of hardware (generator, effect, ...).

GList *src_wires;

read-only list of outgoing BtWire objects

GList *dst_wires;

read-only list of incomming BtWire objects

struct BtMachineClass

struct BtMachineClass {
  /* virtual methods for subclasses */
  gboolean (*check_type)(const BtMachine * const machine, const gulong pad_src_ct, const gulong pad_sink_ct);
};

Base class for machines.

check_type ()

sanity check that the given input/output characteristics are okay for the implementation

enum BtMachineState

typedef enum {
  BT_MACHINE_STATE_NORMAL=0,
  BT_MACHINE_STATE_MUTE,
  BT_MACHINE_STATE_SOLO,
  BT_MACHINE_STATE_BYPASS,
} BtMachineState;

A machine is always in one of the 4 states. Use the "state" property of the BtMachine to change or query the current state.

BT_MACHINE_STATE_NORMAL

just working

BT_MACHINE_STATE_MUTE

be quiet

BT_MACHINE_STATE_SOLO

be the only one playing

BT_MACHINE_STATE_BYPASS

be uneffective (pass through)

bt_machine_activate_adder ()

gboolean            bt_machine_activate_adder           (BtMachine * const self);

Machines use an adder to allow multiple incoming wires. This method is used by the BtWire class to activate the adder when needed.

self :

the machine to activate the adder in

Returns :

TRUE for success

bt_machine_activate_spreader ()

gboolean            bt_machine_activate_spreader        (BtMachine * const self);

Machines use a spreader to allow multiple outgoing wires. This method is used by the BtWire class to activate the spreader when needed.

self :

the machine to activate the spreader in

Returns :

TRUE for success

bt_machine_add_pattern ()

void                bt_machine_add_pattern              (const BtMachine *self,
                                                         const BtPattern *pattern);

Add the supplied pattern to the machine. This is automatically done by bt_pattern_new().

self :

the machine to add the pattern to

pattern :

the new pattern instance

bt_machine_bind_parameter_control ()

void                bt_machine_bind_parameter_control   (const BtMachine * const self,
                                                         GstObject *object,
                                                         const gchar *property_name,
                                                         BtIcControl *control);

Connect the interaction control object to the give parameter. Changes of the control-value are mapped into a change of the parameter.

self :

machine

object :

child object (global or voice child)

property_name :

name of the parameter

control :

interaction control object

bt_machine_describe_global_param_value ()

gchar *             bt_machine_describe_global_param_value
                                                        (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);

Described a param value in human readable form. The type of the given value must match the type of the paramspec of the param referenced by index.

self :

the machine to get a param description from

index :

the offset in the list of global params

event :

the value to describe

Returns :

the description as newly allocated string

bt_machine_describe_voice_param_value ()

gchar *             bt_machine_describe_voice_param_value
                                                        (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);

Described a param value in human readable form. The type of the given value must match the type of the paramspec of the param referenced by index.

self :

the machine to get a param description from

index :

the offset in the list of voice params

event :

the value to describe

Returns :

the description as newly allocated string

bt_machine_enable_input_gain ()

gboolean            bt_machine_enable_input_gain        (BtMachine * const self);

Creates the input-gain element of the machine and activates it.

self :

the machine to enable the input-gain element in

Returns :

TRUE for success, FALSE otherwise

bt_machine_enable_input_post_level ()

gboolean            bt_machine_enable_input_post_level  (BtMachine * const self);

Creates the post-gain input-level analyser of the machine and activates it.

self :

the machine to enable the post-gain input-level analyser in

Returns :

TRUE for success, FALSE otherwise

bt_machine_enable_input_pre_level ()

gboolean            bt_machine_enable_input_pre_level   (BtMachine * const self);

Creates the pre-gain input-level analyser of the machine and activates it.

self :

the machine to enable the pre-gain input-level analyser in

Returns :

TRUE for success, FALSE otherwise

bt_machine_enable_output_gain ()

gboolean            bt_machine_enable_output_gain       (BtMachine * const self);

Creates the output-gain element of the machine and activates it.

self :

the machine to enable the output-gain element in

Returns :

TRUE for success, FALSE otherwise

bt_machine_enable_output_post_level ()

gboolean            bt_machine_enable_output_post_level (BtMachine * const self);

Creates the post-gain output-level analyser of the machine and activates it.

self :

the machine to enable the post-gain output-level analyser in

Returns :

TRUE for success, FALSE otherwise

bt_machine_enable_output_pre_level ()

gboolean            bt_machine_enable_output_pre_level  (BtMachine * const self);

Creates the pre-gain output-level analyser of the machine and activates it.

self :

the machine to enable the pre-gain output-level analyser in

Returns :

TRUE for success, FALSE otherwise

bt_machine_get_global_param_details ()

void                bt_machine_get_global_param_details (const BtMachine * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);

Retrieves the details of a global param. Any detail can be NULL if its not wanted.

self :

the machine to search for the global param details

index :

the offset in the list of global params

pspec :

place for the param spec

min_val :

place to hold new GValue with minimum

max_val :

place to hold new GValue with maximum

bt_machine_get_global_param_index ()

glong               bt_machine_get_global_param_index   (const BtMachine * const self,
                                                         const gchar * const name,
                                                         GError **error);

Searches the list of registered param of a machine for a global param of the given name and returns the index if found.

self :

the machine to search for the global param

name :

the name of the global param

error :

the location of an error instance to fill with a message, if an error occures

Returns :

the index or sets error if it is not found and returns -1.

bt_machine_get_global_param_name ()

const gchar *       bt_machine_get_global_param_name    (const BtMachine * const self,
                                                         const gulong index);

Gets the global param name. Do not modify returned content.

self :

the machine to get the param name from

index :

the offset in the list of global params

Returns :

the requested name

bt_machine_get_global_param_no_value ()

GValue *            bt_machine_get_global_param_no_value
                                                        (const BtMachine * const self,
                                                         const gulong index);

Get the neutral value for the machines parameter.

self :

the machine to get params from

index :

the offset in the list of global params

Returns :

the value. Don't modify.

Since 0.6


bt_machine_get_global_param_spec ()

GParamSpec *        bt_machine_get_global_param_spec    (const BtMachine * const self,
                                                         const gulong index);

Retrieves the parameter specification for the global param

self :

the machine to search for the global param

index :

the offset in the list of global params

Returns :

the GParamSpec for the requested global param

bt_machine_get_global_param_type ()

GType               bt_machine_get_global_param_type    (const BtMachine * const self,
                                                         const gulong index);

Retrieves the GType of a global param

self :

the machine to search for the global param type

index :

the offset in the list of global params

Returns :

the requested GType

bt_machine_get_global_wave_param_index ()

glong               bt_machine_get_global_wave_param_index
                                                        (const BtMachine * const self);

Searches for the wave-table index parameter (if any). This parameter should refer to a wavetable index that should be used to play a note.

self :

the machine to lookup the param from

Returns :

the index of the wave-table parameter or -1 if none.

bt_machine_get_pattern_by_id ()

BtPattern *         bt_machine_get_pattern_by_id        (const BtMachine * const self,
                                                         const gchar * const id);

Search the machine for a pattern by the supplied id. The pattern must have been added previously to this setup with #bt_machine_add_pattern(). Unref the pattern, when done with it.

self :

the machine to search for the pattern

id :

the identifier of the pattern

Returns :

BtPattern instance or NULL if not found

bt_machine_get_pattern_by_index ()

BtPattern *         bt_machine_get_pattern_by_index     (const BtMachine * const self,
                                                         const gulong index);

Fetches the pattern from the given position of the machines pattern list. The pattern must have been added previously to this setup with #bt_machine_add_pattern(). Unref the pattern, when done with it.

self :

the machine to search for the pattern

index :

the index of the pattern in the machines pattern list

Returns :

BtPattern instance or NULL if not found

bt_machine_get_pattern_by_name ()

BtPattern *         bt_machine_get_pattern_by_name      (const BtMachine * const self,
                                                         const gchar * const name);

Search the machine for a pattern by the supplied name. The pattern must have been added previously to this setup with #bt_machine_add_pattern(). Unref the pattern, when done with it.

self :

the machine to search for the pattern

name :

the name of the pattern

Returns :

BtPattern instance or NULL if not found

bt_machine_get_unique_pattern_name ()

gchar *             bt_machine_get_unique_pattern_name  (const BtMachine * const self);

The function generates a unique pattern name for this machine by eventually adding a number postfix. This method should be used when adding new patterns.

self :

the machine for which the name should be unique

Returns :

the newly allocated unique name

bt_machine_get_voice_param_details ()

void                bt_machine_get_voice_param_details  (const BtMachine * const self,
                                                         const gulong index,
                                                         GParamSpec **pspec,
                                                         GValue **min_val,
                                                         GValue **max_val);

Retrieves the details of a voice param. Any detail can be NULL if its not wanted.

self :

the machine to search for the voice param details

index :

the offset in the list of voice params

pspec :

place for the param spec

min_val :

place to hold new GValue with minimum

max_val :

place to hold new GValue with maximum

bt_machine_get_voice_param_index ()

glong               bt_machine_get_voice_param_index    (const BtMachine * const self,
                                                         const gchar * const name,
                                                         GError **error);

Searches the list of registered param of a machine for a voice param of the given name and returns the index if found.

self :

the machine to search for the voice param

name :

the name of the voice param

error :

the location of an error instance to fill with a message, if an error occures

Returns :

the index or sets error if it is not found and returns -1.

bt_machine_get_voice_param_name ()

const gchar *       bt_machine_get_voice_param_name     (const BtMachine * const self,
                                                         const gulong index);

Gets the voice param name. Do not modify returned content.

self :

the machine to get the param name from

index :

the offset in the list of voice params

Returns :

the requested name

bt_machine_get_voice_param_no_value ()

GValue *            bt_machine_get_voice_param_no_value (const BtMachine * const self,
                                                         const gulong index);

Get the neutral value for the machines parameter.

self :

the machine to get params from

index :

the offset in the list of voice params

Returns :

the value. Don't modify.

Since 0.6


bt_machine_get_voice_param_spec ()

GParamSpec *        bt_machine_get_voice_param_spec     (const BtMachine * const self,
                                                         const gulong index);

Retrieves the parameter specification for the voice param

self :

the machine to search for the voice param

index :

the offset in the list of voice params

Returns :

the GParamSpec for the requested voice param

bt_machine_get_voice_param_type ()

GType               bt_machine_get_voice_param_type     (const BtMachine * const self,
                                                         const gulong index);

Retrieves the GType of a voice param

self :

the machine to search for the voice param type

index :

the offset in the list of voice params

Returns :

the requested GType

bt_machine_get_voice_wave_param_index ()

glong               bt_machine_get_voice_wave_param_index
                                                        (const BtMachine * const self);

Searches for the wave-table index parameter (if any). This parameter should refer to a wavetable index that should be used to play a note.

self :

the machine to lookup the param from

Returns :

the index of the wave-table parameter or -1 if none.

bt_machine_get_wire_by_dst_machine ()

BtWire *            bt_machine_get_wire_by_dst_machine  (const BtMachine * const self,
                                                         const BtMachine * const dst);

Searches for a wire in the wires originating from this machine that uses the given BtMachine instances as a target. Unref the wire, when done with it.

self :

the machine that is at src of a wire

dst :

the machine that is at the dst end of the wire

Returns :

the BtWire or NULL

Since 0.6


bt_machine_global_controller_change_value ()

void                bt_machine_global_controller_change_value
                                                        (const BtMachine * const self,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue *value);

Depending on whether the given value is NULL, sets or unsets the controller value for the specified param and at the given time. If timestamp is 0 and value is NULL it set a default value for the start of the controller sequence, taken from the current value of the parameter.

self :

the machine to change the param for

param :

the global parameter index

timestamp :

the time stamp of the change

value :

the new value or NULL to unset a previous one

bt_machine_has_active_adder ()

gboolean            bt_machine_has_active_adder         (const BtMachine * const self);

Checks if the machine currently uses an adder. This method is used by the BtWire class to activate the adder when needed.

self :

the machine to check

Returns :

TRUE for success

bt_machine_has_active_spreader ()

gboolean            bt_machine_has_active_spreader      (const BtMachine * const self);

Checks if the machine currently uses an spreader. This method is used by the BtWire class to activate the spreader when needed.

self :

the machine to check

Returns :

TRUE for success

bt_machine_has_patterns ()

gboolean            bt_machine_has_patterns             (const BtMachine * const self);

Check if the machine has BtPattern entries appart from the standart private ones.

self :

the machine for which to check the patterns

Returns :

TRUE if it has patterns

bt_machine_is_global_param_no_value ()

gboolean            bt_machine_is_global_param_no_value (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const value);

Tests if the given value is the no-value of the global param

self :

the machine to check params from

index :

the offset in the list of global params

value :

the value to compare against the no-value

Returns :

TRUE if it is the no-value

bt_machine_is_global_param_trigger ()

gboolean            bt_machine_is_global_param_trigger  (const BtMachine * const self,
                                                         const gulong index);

Tests if the global param is a trigger param (like a key-note or a drum trigger).

self :

the machine to check params from

index :

the offset in the list of global params

Returns :

TRUE if it is a trigger

bt_machine_is_polyphonic ()

gboolean            bt_machine_is_polyphonic            (const BtMachine * const self);

Tells if the machine can produce (multiple) voices. Monophonic machines have their (one) voice params as part of the global params.

self :

the machine to check

Returns :

TRUE for polyphic machines, FALSE for monophonic ones

bt_machine_is_voice_param_no_value ()

gboolean            bt_machine_is_voice_param_no_value  (const BtMachine *const self,
                                                         const gulong index,
                                                         GValue * const value);

Tests if the given value is the no-value of the voice param

self :

the machine to check params from

index :

the offset in the list of voice params

value :

the value to compare against the no-value

Returns :

TRUE if it is the no-value

bt_machine_is_voice_param_trigger ()

gboolean            bt_machine_is_voice_param_trigger   (const BtMachine * const self,
                                                         const gulong index);

Tests if the voice param is a trigger param (like a key-note or a drum trigger).

self :

the machine to check params from

index :

the offset in the list of voice params

Returns :

TRUE if it is a trigger

bt_machine_randomize_parameters ()

void                bt_machine_randomize_parameters     (const BtMachine * const self);

Randomizes machine parameters.

self :

machine

bt_machine_remove_pattern ()

void                bt_machine_remove_pattern           (const BtMachine *self,
                                                         const BtPattern *pattern);

Remove the given pattern from the machine.

self :

the machine to remove the pattern from

pattern :

the existing pattern instance

bt_machine_reset_parameters ()

void                bt_machine_reset_parameters         (const BtMachine * const self);

Resets machine parameters back to defaults.

self :

machine

bt_machine_set_global_param_default ()

void                bt_machine_set_global_param_default (const BtMachine * const self,
                                                         const gulong index);

Set a default value that should be used before the first control-point.

self :

the machine

index :

the offset in the list of global params

bt_machine_set_global_param_value ()

void                bt_machine_set_global_param_value   (const BtMachine * const self,
                                                         const gulong index,
                                                         GValue * const event);

Sets a the specified global param to the give data value.

self :

the machine to set the global param value

index :

the offset in the list of global params

event :

the new value

bt_machine_set_param_defaults ()

void                bt_machine_set_param_defaults       (const BtMachine *const self);

Sets default values that should be used before the first control-point. Should be called, if all parameters are changed (like after switching presets).

self :

the machine

bt_machine_set_voice_param_default ()

void                bt_machine_set_voice_param_default  (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong index);

Set a default value that should be used before the first control-point.

self :

the machine

voice :

the voice number

index :

the offset in the list of global params

bt_machine_set_voice_param_value ()

void                bt_machine_set_voice_param_value    (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong index,
                                                         GValue * const event);

Sets a the specified voice param to the give data value.

self :

the machine to set the voice param value

voice :

the voice to change

index :

the offset in the list of voice params

event :

the new value

bt_machine_unbind_parameter_control ()

void                bt_machine_unbind_parameter_control (const BtMachine * const self,
                                                         GstObject *object,
                                                         const char *property_name);

Disconnect the interaction control object from the give parameter.

self :

machine

object :

child object (global or voice child)

property_name :

name of the parameter

bt_machine_unbind_parameter_controls ()

void                bt_machine_unbind_parameter_controls
                                                        (const BtMachine * const self);

Disconnect all interaction controls.

self :

machine

bt_machine_voice_controller_change_value ()

void                bt_machine_voice_controller_change_value
                                                        (const BtMachine * const self,
                                                         const gulong voice,
                                                         const gulong param,
                                                         const GstClockTime timestamp,
                                                         GValue *value);

Depending on whether the given value is NULL, sets or unsets the controller value for the specified param and at the given time. If timestamp is 0 and value is NULL it set a default value for the start of the controller sequence, taken from the current value of the parameter.

self :

the machine to change the param for

voice :

the voice number

param :

the voice parameter index

timestamp :

the time stamp of the change

value :

the new value or NULL to unset a previous one

Property Details

The "adder-convert" property

  "adder-convert"            GstElement*           : Read

the after mixing format converter element, if any.


The "construction-error" property

  "construction-error"       gpointer              : Read / Write / Construct Only

signal failed instance creation.


The "global-params" property

  "global-params"            gulong                : Read / Write

number of params for the machine.


The "id" property

  "id"                       gchar*                : Read / Write / Construct

machine identifier.

Default value: "unamed machine"


The "input-gain" property

  "input-gain"               GstElement*           : Read

the input-gain element, if any.


The "input-post-level" property

  "input-post-level"         GstElement*           : Read

the post-gain input-level element, if any.


The "input-pre-level" property

  "input-pre-level"          GstElement*           : Read

the pre-gain input-level element, if any.


The "machine" property

  "machine"                  GstElement*           : Read

the machine element, if any.


The "output-gain" property

  "output-gain"              GstElement*           : Read

the output-gain element, if any.


The "output-post-level" property

  "output-post-level"        GstElement*           : Read

the post-gain output-level element, if any.


The "output-pre-level" property

  "output-pre-level"         GstElement*           : Read

the pre-gain output-level element, if any.


The "patterns" property

  "patterns"                 gpointer              : Read

a copy of the list of patterns.


The "plugin-name" property

  "plugin-name"              gchar*                : Read / Write / Construct

the name of the gst plugin for the machine.

Default value: "unamed machine"


The "properties" property

  "properties"               gpointer              : Read

hashtable of machine properties.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

song object, the machine belongs to.


The "state" property

  "state"                    BtMachineState        : Read / Write

the current state of this machine.

Default value: BT_MACHINE_STATE_NORMAL


The "voice-params" property

  "voice-params"             gulong                : Read / Write

number of params for each machine voice.


The "voices" property

  "voices"                   gulong                : Read / Write / Construct

number of voices in the machine.

Signal Details

The "pattern-added" signal

void                user_function                      (BtMachine *self,
                                                        BtPattern *pattern,
                                                        gpointer   user_data)      : No Hooks

A new pattern item has been added to the machine

self :

the machine object that emitted the signal

pattern :

the new pattern

user_data :

user data set when the signal handler was connected.

The "pattern-removed" signal

void                user_function                      (BtMachine *self,
                                                        BtPattern *pattern,
                                                        gpointer   user_data)      : No Hooks

A pattern item has been removed from the machine

self :

the machine object that emitted the signal

pattern :

the old pattern

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/api-index-deprecated.html0000644042355400116100000000321611675570702022354 00000000000000 Index of deprecated API

Index of deprecated API

buzztard-0.6.0/docs/reference/bt-core/html/up.png0000644042355400116100000000062611675570702016646 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚buzztard-0.6.0/docs/reference/bt-core/html/pt01.html0000644042355400116100000000321511675570702017163 00000000000000 Part I. Overview

Part I. Overview

Table of Contents

Conventions
buzztard-0.6.0/docs/reference/bt-core/html/buzztard-core-BtChildProxy.html0000644042355400116100000006626211675570702023556 00000000000000 BtChildProxy

BtChildProxy

BtChildProxy — Interface for multi child elements.

Synopsis

#include <libbtcore/core.h>

struct              BtChildProxyInterface;
void                bt_child_proxy_get                  (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);
GObject *           bt_child_proxy_get_child_by_index   (BtChildProxy *parent,
                                                         guint index);
GObject *           bt_child_proxy_get_child_by_name    (BtChildProxy *parent,
                                                         const gchar *name);
guint               bt_child_proxy_get_children_count   (BtChildProxy *parent);
void                bt_child_proxy_get_property         (GObject *object,
                                                         const gchar *name,
                                                         GValue *value);
void                bt_child_proxy_get_valist           (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);
gboolean            bt_child_proxy_lookup               (GObject *object,
                                                         const gchar *name,
                                                         GObject **target,
                                                         GParamSpec **pspec);
void                bt_child_proxy_set                  (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);
void                bt_child_proxy_set_property         (GObject *object,
                                                         const gchar *name,
                                                         const GValue *value);
void                bt_child_proxy_set_valist           (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);

Description

This interface abstracts handling of property sets for elements with children. Imagine elements such as mixers or polyphonic generators. They all have multiple GstPad or some kind of voice objects. Another use case are container elements like GstBin. The element implementing the interface acts as a parent for those child objects.

By implementing this interface the child properties can be accessed from the parent element by using bt_child_proxy_get() and bt_child_proxy_set().

Property names are written as "child-name::property-name". The whole naming scheme is recursive. Thus "child1::child2::property" is valid too, if "child1" and "child2" implement the BtChildProxy interface.

Details

struct BtChildProxyInterface

struct BtChildProxyInterface {
  /* virtual methods */
  GObject *(*get_child_by_name)(BtChildProxy *parent,const gchar *name);
  GObject *(*get_child_by_index) (BtChildProxy *parent,guint index);
  guint (*get_children_count) (BtChildProxy *parent);
};

BtChildProxy interface.

get_child_by_name ()

virtual method to fetch the child by name

get_child_by_index ()

virtual method to fetch the child by position

get_children_count ()

virtual method to get the children count

bt_child_proxy_get ()

void                bt_child_proxy_get                  (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);

Gets properties of the parent object and its children.

object :

the parent object

first_property_name :

name of the first property to get

... :

return location for the first property, followed optionally by more name/return location pairs, followed by NULL

bt_child_proxy_get_child_by_index ()

GObject *           bt_child_proxy_get_child_by_index   (BtChildProxy *parent,
                                                         guint index);

Fetches a child by its number.

parent :

the parent object to get the child from

index :

the childs position in the child list

Returns :

the child object or NULL if not found (index too high). Unref after usage. MT safe.

bt_child_proxy_get_child_by_name ()

GObject *           bt_child_proxy_get_child_by_name    (BtChildProxy *parent,
                                                         const gchar *name);

Looks up a child element by the given name.

parent :

the parent object to get the child from

name :

the childs name

Returns :

the child object or NULL if not found. Unref after usage. MT safe.

bt_child_proxy_get_children_count ()

guint               bt_child_proxy_get_children_count   (BtChildProxy *parent);

Gets the number of child objects this parent contains.

parent :

the parent object

Returns :

the number of child objects MT safe.

bt_child_proxy_get_property ()

void                bt_child_proxy_get_property         (GObject *object,
                                                         const gchar *name,
                                                         GValue *value);

Gets a single property using the BtChildProxy mechanism. You are responsible for for freeing it by calling g_value_unset()

object :

object to query

name :

name of the property

value :

a GValue that should take the result.

bt_child_proxy_get_valist ()

void                bt_child_proxy_get_valist           (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);

Gets properties of the parent object and its children.

object :

the object to query

first_property_name :

name of the first property to get

var_args :

return location for the first property, followed optionally by more name/return location pairs, followed by NULL

bt_child_proxy_lookup ()

gboolean            bt_child_proxy_lookup               (GObject *object,
                                                         const gchar *name,
                                                         GObject **target,
                                                         GParamSpec **pspec);

Looks up which object and GParamSpec would be effected by the given name.

object :

object to lookup the property in

name :

name of the property to look up

target :

pointer to a GObject that takes the real object to set property on

pspec :

pointer to take the GParamSpec describing the property

Returns :

TRUE if target and pspec could be found. FALSE otherwise. In that case the values for pspec and target are not modified. Unref target after usage. MT safe.

bt_child_proxy_set ()

void                bt_child_proxy_set                  (gpointer object,
                                                         const gchar *first_property_name,
                                                         ...);

Sets properties of the parent object and its children.

object :

the parent object

first_property_name :

name of the first property to set

... :

value for the first property, followed optionally by more name/value pairs, followed by NULL

bt_child_proxy_set_property ()

void                bt_child_proxy_set_property         (GObject *object,
                                                         const gchar *name,
                                                         const GValue *value);

Sets a single property using the BtChildProxy mechanism.

object :

the parent object

name :

name of the property to set

value :

new GValue for the property

bt_child_proxy_set_valist ()

void                bt_child_proxy_set_valist           (GObject *object,
                                                         const gchar *first_property_name,
                                                         va_list var_args);

Sets properties of the parent object and its children.

object :

the parent object

first_property_name :

name of the first property to set

var_args :

value for the first property, followed optionally by more name/value pairs, followed by NULL
buzztard-0.6.0/docs/reference/bt-core/html/BtApplication.html0000644042355400116100000001546011675570702021135 00000000000000 BtApplication

BtApplication

BtApplication — base class for a buzztard based application

Synopsis

#include <libbtcore/core.h>

struct              BtApplication;

Object Hierarchy

  GObject
   +----BtApplication

Properties

  "bin"                      GstBin*               : Read
  "settings"                 BtSettings*           : Read

Description

Every application using the libbtcore library should inherit from this class.

The base class automatically creates a GstBin element as a container for the song. This can be retrieved via the "bin" property. When creating BtSong instances, the BtApplication instance needs to be passed to the bt_song_new() constructor, so that it can retrieve the GstBin element.

1
2
3
4
BtApplication *app;
BtSong *song;
...
song=bt_song_new(app);

Another module the application base class maintains is a settings instance (see BtSettings), that manages application preferences.

Details

struct BtApplication

struct BtApplication;

base object for a buzztard based application

Property Details

The "bin" property

  "bin"                      GstBin*               : Read

The top-level gstreamer element for the song, e.g. a GstPipeline or GstBin.


The "settings" property

  "settings"                 BtSettings*           : Read

applications configuration settings.

buzztard-0.6.0/docs/reference/bt-core/html/style.css0000644042355400116100000001210011675570702017354 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } buzztard-0.6.0/docs/reference/bt-core/html/BtSongIONativeXML.html0000644042355400116100000001066511675570702021562 00000000000000 BtSongIONativeXML

BtSongIONativeXML

BtSongIONativeXML — class for song input and output in builtin native format

Synopsis

#include <libbtcore/core.h>

struct              BtSongIONativeXML;
struct              BtSongIONativeXMLClass;

Object Hierarchy

  GObject
   +----BtSongIO
         +----BtSongIONative
               +----BtSongIONativeXML

Description

This internal BtSongIONative module implements loading and saving of an own xml format without externals.

Details

struct BtSongIONativeXML

struct BtSongIONativeXML;

object for song input and output in native zip/xml format


struct BtSongIONativeXMLClass

struct BtSongIONativeXMLClass {
  const BtSongIONativeClass parent;
};

Class for song input and output in native zip/xml format

const BtSongIONativeClass parent;

parent class type
buzztard-0.6.0/docs/reference/bt-core/html/BtSongIONative.html0000644042355400116100000001156711675570702021203 00000000000000 BtSongIONative

BtSongIONative

BtSongIONative — class for song input and output in builtin native format

Synopsis

#include <libbtcore/core.h>

struct              BtSongIONative;
struct              BtSongIONativeClass;
extern BtSongIOModuleInfo bt_song_io_native_module_info;

Object Hierarchy

  GObject
   +----BtSongIO
         +----BtSongIONative
               +----BtSongIONativeBZT
               +----BtSongIONativeXML

Description

Buzztard stores its songs in a own file-format. This internal io-module implements loading and saving of this format. The format is an archive, that contains an XML file and optionally binary data, such as audio samples.

Details

struct BtSongIONative

struct BtSongIONative;

object for song input and output in native zip/xml format


struct BtSongIONativeClass

struct BtSongIONativeClass {
  const BtSongIOClass parent;
};

Class for song input and output in native zip/xml format

const BtSongIOClass parent;

parent class type

bt_song_io_native_module_info

extern BtSongIOModuleInfo bt_song_io_native_module_info;

Buzztard native format song loader/saver metadata.

buzztard-0.6.0/docs/reference/bt-core/html/api-index-0-3.html0000644042355400116100000001560511675570702020560 00000000000000 Index of new API in 0.3 buzztard-0.6.0/docs/reference/bt-core/html/BtSong.html0000644042355400116100000005520511675570702017601 00000000000000 BtSong

BtSong

BtSong — class of a song project object (contains BtSongInfo, BtSetup, BtSequence and BtWavetable)

Synopsis

#include <libbtcore/core.h>

struct              BtSong;
struct              BtSongClass;
gboolean            bt_song_continue                    (const BtSong * const self);
BtSong *            bt_song_new                         (const BtApplication * const app);
gboolean            bt_song_pause                       (const BtSong * const self);
gboolean            bt_song_play                        (const BtSong * const self);
gboolean            bt_song_stop                        (const BtSong * const self);
gboolean            bt_song_update_playback_position    (const BtSong * const self);

Object Hierarchy

  GObject
   +----BtSong

Implemented Interfaces

BtSong implements

Properties

  "app"                      BtApplication*        : Read / Write / Construct Only
  "bin"                      GstBin*               : Read
  "is-idle"                  gboolean              : Read / Write
  "is-playing"               gboolean              : Read
  "master"                   BtSinkMachine*        : Read / Write
  "play-pos"                 gulong                : Read / Write
  "play-rate"                gdouble               : Read / Write
  "sequence"                 BtSequence*           : Read
  "setup"                    BtSetup*              : Read
  "song-info"                BtSongInfo*           : Read
  "song-io"                  BtSongIO*             : Read / Write
  "wavetable"                BtWavetable*          : Read

Description

A song is the top-level container object to manage all song-related objects.

To load or save a song, use a BtSongIO object. These implement loading and saving for different file-formats.

One can seek in a song by setting the "play-pos" property. Likewise one can watch the property to display the playback position.

The "play-rate" property can be used to change the playback speed and direction.

Details

struct BtSong

struct BtSong;

Song project object (contains BtSongInfo, BtSetup and BtSequence)


struct BtSongClass

struct BtSongClass {
  const GObjectClass parent;
};

Base class for songs

const GObjectClass parent;

parent class type

bt_song_continue ()

gboolean            bt_song_continue                    (const BtSong * const self);

Continues the playback of the specified song instance.

self :

the song that should be paused

Returns :

TRUE for success

bt_song_new ()

BtSong *            bt_song_new                         (const BtApplication * const app);

Create a new instance. The new song instance automatically has one instance of BtSetup, BtSequence and BtSongInfo. These instances can be retrieved via the respecting properties.

For example use following code to retrive a BtSequence from the song class:

1
2
3
BtSequence *sequence;
...
g_object_get(BT_SONG(song), "sequence", &sequence, NULL);

app :

the application object the songs belongs to.

Returns :

the new instance or NULL in case of an error

bt_song_pause ()

gboolean            bt_song_pause                       (const BtSong * const self);

Pauses the playback of the specified song instance.

self :

the song that should be paused

Returns :

TRUE for success

bt_song_play ()

gboolean            bt_song_play                        (const BtSong * const self);

Starts to play the specified song instance from beginning. This methods toggles the "is-playing" property.

self :

the song that should be played

Returns :

TRUE for success

bt_song_stop ()

gboolean            bt_song_stop                        (const BtSong * const self);

Stops the playback of the specified song instance.

self :

the song that should be stopped

Returns :

TRUE for success

bt_song_update_playback_position ()

gboolean            bt_song_update_playback_position    (const BtSong * const self);

Updates the playback-position counter to fire all "play-pos" notify handlers.

self :

the song that should update its playback-pos counter

Returns :

FALSE if the song is not playing

Property Details

The "app" property

  "app"                      BtApplication*        : Read / Write / Construct Only

set application object, the song belongs to.


The "bin" property

  "bin"                      GstBin*               : Read

songs top-level GstElement container.


The "is-idle" property

  "is-idle"                  gboolean              : Read / Write

request that the song should idle-loop if not playing.

Default value: FALSE


The "is-playing" property

  "is-playing"               gboolean              : Read

tell whether the song is playing right now or not.

Default value: FALSE


The "master" property

  "master"                   BtSinkMachine*        : Read / Write

songs audio_sink.


The "play-pos" property

  "play-pos"                 gulong                : Read / Write

position of the play cursor of the sequence in timeline bars.

Allowed values: <= G_MAXINT64


The "play-rate" property

  "play-rate"                gdouble               : Read / Write

playback rate of the sequence.

Allowed values: [-5,5]

Default value: 1


The "sequence" property

  "sequence"                 BtSequence*           : Read

songs sequence sub object.


The "setup" property

  "setup"                    BtSetup*              : Read

songs setup sub object.


The "song-info" property

  "song-info"                BtSongInfo*           : Read

songs metadata sub object.


The "song-io" property

  "song-io"                  BtSongIO*             : Read / Write

the song-io plugin during i/o operations.


The "wavetable" property

  "wavetable"                BtWavetable*          : Read

songs wavetable sub object.

buzztard-0.6.0/docs/reference/bt-core/html/BtSettings.html0000644042355400116100000006010611675570702020467 00000000000000 BtSettings

BtSettings

BtSettings — base class for buzztard settings handling

Synopsis

#include <libbtcore/core.h>

struct              BtSettings;
gpointer            (*BtSettingsFactory)                (void);
gchar *             bt_settings_determine_audiosink_name
                                                        (const BtSettings * const self);
BtSettings *        bt_settings_make                    (void);
void                bt_settings_set_factory             (BtSettingsFactory factory);

Object Hierarchy

  GObject
   +----BtSettings
         +----BtGConfSettings

Properties

  "audiosink"                gchar*                : Read / Write
  "channels"                 guint                 : Read / Write
  "coherence-upnp-active"    gboolean              : Read / Write
  "coherence-upnp-port"      guint                 : Read / Write
  "grid-density"             gchar*                : Read / Write
  "missing-machines"         gchar*                : Read / Write
  "news-seen"                guint                 : Read / Write
  "presented-tips"           gchar*                : Read / Write
  "record-folder"            gchar*                : Read / Write
  "sample-folder"            gchar*                : Read / Write
  "sample-rate"              guint                 : Read / Write
  "show-tips"                gboolean              : Read / Write
  "song-folder"              gchar*                : Read / Write
  "statusbar-hide"           gboolean              : Read / Write
  "system-audiosink"         gchar*                : Read
  "tabs-hide"                gboolean              : Read / Write
  "toolbar-hide"             gboolean              : Read / Write
  "toolbar-style"            gchar*                : Read
  "window-height"            gint                  : Read / Write
  "window-width"             gint                  : Read / Write
  "window-xpos"              gint                  : Read / Write
  "window-ypos"              gint                  : Read / Write

Description

Under the gnome platform GConf is a locical choice for settings managment. Unfortunately there currently is no port of GConf for other platforms. This class wraps the settings management. Depending on what settings managment capabillities the configure script find on the system one of the subclasses (BtGConfSettings,BtPlainfileSettings) will be used.

In any case it is always sufficient to talk to this class instance. Single settings are accessed via normat g_object_get() and g_object_set() calls. If the backends supports it changes in the settings will be notified to the application by the GObject::notify signal.

Details

struct BtSettings

struct BtSettings;

base object for a buzztard based settings


BtSettingsFactory ()

gpointer            (*BtSettingsFactory)                (void);

Factory method that creates a new settings instance.

Returns :

the setting implementation

bt_settings_determine_audiosink_name ()

gchar *             bt_settings_determine_audiosink_name
                                                        (const BtSettings * const self);

Check the settings for the configured audio sink. Pick a fallback if none has been chosen. Verify that the sink works.

self :

the settings

Returns :

the elemnt name, free when done.

bt_settings_make ()

BtSettings *        bt_settings_make                    (void);

Create a new instance. The type of the settings depends on the subsystem found during configuration run.

Settings are implemented as a singleton. Thus the first invocation will create the object and further calls will just give back a reference.

Returns :

the instance or NULL in case of an error

bt_settings_set_factory ()

void                bt_settings_set_factory             (BtSettingsFactory factory);

Set a factory method that creates a new settings instance. This is currently only used by the unit tests to exercise the applications under various conditions. Normal applications should NOT use it.

factory :

factory method

Property Details

The "audiosink" property

  "audiosink"                gchar*                : Read / Write

audio output gstreamer element.

Default value: "autoaudiosink"


The "channels" property

  "channels"                 guint                 : Read / Write

number of audio output channels.

Allowed values: [1,2]

Default value: 2


The "coherence-upnp-active" property

  "coherence-upnp-active"    gboolean              : Read / Write

activate Coherence UPnP based playback controller.

Default value: FALSE


The "coherence-upnp-port" property

  "coherence-upnp-port"      guint                 : Read / Write

the port number for the communication with the coherence backend.

Default value: 7654


The "grid-density" property

  "grid-density"             gchar*                : Read / Write

machine view grid detail level.

Default value: "low"


The "missing-machines" property

  "missing-machines"         gchar*                : Read / Write

list of tip-numbers that were shown already.

Default value: NULL


The "news-seen" property

  "news-seen"                guint                 : Read / Write

version number for that the user has seen the news.

Default value: 0


The "presented-tips" property

  "presented-tips"           gchar*                : Read / Write

list of missing machines to ignore.

Default value: NULL


The "record-folder" property

  "record-folder"            gchar*                : Read / Write

default directory for recordings.

Default value: "/home/ensonic"


The "sample-folder" property

  "sample-folder"            gchar*                : Read / Write

default directory for sample-waveforms.

Default value: "/home/ensonic"


The "sample-rate" property

  "sample-rate"              guint                 : Read / Write

audio output sample-rate.

Allowed values: [1,96000]

Default value: 44100


The "show-tips" property

  "show-tips"                gboolean              : Read / Write

show tips on startup.

Default value: TRUE


The "song-folder" property

  "song-folder"              gchar*                : Read / Write

default directory for songs.

Default value: "/home/ensonic"


The "statusbar-hide" property

  "statusbar-hide"           gboolean              : Read / Write

hide bottom statusbar.

Default value: FALSE


The "system-audiosink" property

  "system-audiosink"         gchar*                : Read

system audio output gstreamer element.

Default value: "autoaudiosink"


The "tabs-hide" property

  "tabs-hide"                gboolean              : Read / Write

hide main page tabs.

Default value: FALSE


The "toolbar-hide" property

  "toolbar-hide"             gboolean              : Read / Write

hide main toolbar.

Default value: FALSE


The "toolbar-style" property

  "toolbar-style"            gchar*                : Read

system tolbar style.

Default value: "both"


The "window-height" property

  "window-height"            gint                  : Read / Write

last application window height.

Allowed values: >= G_MAXULONG

Default value: -1


The "window-width" property

  "window-width"             gint                  : Read / Write

last application window width.

Allowed values: >= G_MAXULONG

Default value: -1


The "window-xpos" property

  "window-xpos"              gint                  : Read / Write

last application window x-position.

Default value: 0


The "window-ypos" property

  "window-ypos"              gint                  : Read / Write

last application window y-position.

Default value: 0

buzztard-0.6.0/docs/reference/bt-core/html/api-index-0-5.html0000644042355400116100000000516311675570702020560 00000000000000 Index of new API in 0.5

Index of new API in 0.5

P

bt_pattern_flip_columns, function in BtPattern

S

bt_sequence_repair_damage, function in BtSequence
bt_sequence_set_pattern_quick, function in BtSequence
buzztard-0.6.0/docs/reference/bt-core/html/BtProcessorMachine.html0000644042355400116100000002372311675570702022137 00000000000000 BtProcessorMachine

BtProcessorMachine

BtProcessorMachine — class for signal processing machines with inputs and outputs

Synopsis

#include <libbtcore/core.h>

struct              BtProcessorMachine;
enum                BtProcessorMachinePatternIndex;
BtProcessorMachine * bt_processor_machine_new           (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const plugin_name,
                                                         const glong voices,
                                                         GError **err);

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtMachine
                           +----BtProcessorMachine

Implemented Interfaces

BtProcessorMachine implements GstChildProxy.

Description

Processors are machines that alter incomming audio.

Details

struct BtProcessorMachine

struct BtProcessorMachine;

Sub-class of a BtMachine that implements an effect-processor (a machine with in and outputs).


enum BtProcessorMachinePatternIndex

typedef enum {
  BT_PROCESSOR_MACHINE_PATTERN_INDEX_BREAK=0,
  BT_PROCESSOR_MACHINE_PATTERN_INDEX_MUTE,
  BT_PROCESSOR_MACHINE_PATTERN_INDEX_BYPASS,
  BT_PROCESSOR_MACHINE_PATTERN_INDEX_OFFSET
} BtProcessorMachinePatternIndex;

Use this with bt_machine_get_pattern_by_index() to get the command patterns.

BT_PROCESSOR_MACHINE_PATTERN_INDEX_BREAK

stop the pattern

BT_PROCESSOR_MACHINE_PATTERN_INDEX_MUTE

mute the machine

BT_PROCESSOR_MACHINE_PATTERN_INDEX_BYPASS

bypass the machine

BT_PROCESSOR_MACHINE_PATTERN_INDEX_OFFSET

offset for real pattern ids

bt_processor_machine_new ()

BtProcessorMachine * bt_processor_machine_new           (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const plugin_name,
                                                         const glong voices,
                                                         GError **err);

Create a new instance. The machine is automaticly added to the setup of the given song. You don't need to call bt_setup_add_machine(setup,BT_MACHINE(machine));.

song :

the song the new instance belongs to

id :

the id, we can use to lookup the machine

plugin_name :

the name of the gst-plugin the machine is using

voices :

the number of voices the machine should initially have

err :

inform about failed instance creation

Returns :

the new instance or NULL in case of an error
buzztard-0.6.0/docs/reference/bt-core/html/BtSinkBin.html0000644042355400116100000002763511675570702020236 00000000000000 BtSinkBin

BtSinkBin

BtSinkBin — bin to be used by BtSinkMachine

Synopsis

#include <libbtcore/core.h>

struct              BtSinkBin;
enum                BtSinkBinMode;
enum                BtSinkBinRecordFormat;

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtSinkBin

Implemented Interfaces

BtSinkBin implements GstChildProxy and GstBtTempo.

Properties

  "analyzers"                gpointer              : Read / Write
  "input-gain"               GstElement*           : Read / Write
  "master-volume"            gdouble               : Read / Write
  "mode"                     BtSinkBinMode         : Read / Write
  "record-file-name"         gchar*                : Read / Write
  "record-format"            BtSinkBinRecordFormat  : Read / Write

Description

The sink-bin provides switchable play and record facillities. It also provides controlable master-volume.

In play and record modes it plugs a chain of elements. In combined play and record mode it uses a tee and plugs both pipleines.

Details

struct BtSinkBin

struct BtSinkBin;

Sub-class of a GstBin that implements a signal output (a machine with inputs only).


enum BtSinkBinMode

typedef enum {
  BT_SINK_BIN_MODE_PLAY=0,
  BT_SINK_BIN_MODE_RECORD,
  BT_SINK_BIN_MODE_PLAY_AND_RECORD,
  BT_SINK_BIN_MODE_PASS_THRU
} BtSinkBinMode;

BtSinkMachine supports several modes of operation. Playing is the default mode. Passthru is only needed if the song is plugged in another pipeline.

BT_SINK_BIN_MODE_PLAY

play the song

BT_SINK_BIN_MODE_RECORD

record to file

BT_SINK_BIN_MODE_PLAY_AND_RECORD

play and record together

BT_SINK_BIN_MODE_PASS_THRU

output audio on sometimes src pad

enum BtSinkBinRecordFormat

typedef enum {
  BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS=0,
  BT_SINK_BIN_RECORD_FORMAT_MP3,
  BT_SINK_BIN_RECORD_FORMAT_WAV,
  BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC,
  BT_SINK_BIN_RECORD_FORMAT_MP4_AAC,
  BT_SINK_BIN_RECORD_FORMAT_RAW
} BtSinkBinRecordFormat;

BtSinkMachine can record audio in several formats.

BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS

ogg vorbis

BT_SINK_BIN_RECORD_FORMAT_MP3

mp3

BT_SINK_BIN_RECORD_FORMAT_WAV

wav

BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC

ogg flac

BT_SINK_BIN_RECORD_FORMAT_MP4_AAC

mp4 aac

BT_SINK_BIN_RECORD_FORMAT_RAW

raw

Property Details

The "analyzers" property

  "analyzers"                gpointer              : Read / Write

list of master analyzers.


The "input-gain" property

  "input-gain"               GstElement*           : Read / Write

the input-gain element, if any.


The "master-volume" property

  "master-volume"            gdouble               : Read / Write

master volume for the song.

Allowed values: [0,1]

Default value: 1


The "mode" property

  "mode"                     BtSinkBinMode         : Read / Write

mode of operation.

Default value: BT_SINK_BIN_MODE_PLAY


The "record-file-name" property

  "record-file-name"         gchar*                : Read / Write

the file-name to use for recording.

Default value: NULL


The "record-format" property

  "record-format"            BtSinkBinRecordFormat  : Read / Write

format to use when in record mode.

Default value: .ogg

buzztard-0.6.0/docs/reference/bt-core/html/index.html0000644042355400116100000002041511675570702017507 00000000000000 Buzztard Bt-Core Reference Manual

for Buzztard 0.6.0. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-core/.


Introduction
I. Overview
Conventions
II. API Reference
Core Class Reference
libbtcore — core library of the buzztard application framework
BtApplication — base class for a buzztard based application
BtSettings — base class for buzztard settings handling
BtGConfSettings — gconf based implementation sub class for buzztard settings handling
BtChildProxy — Interface for multi child elements.
BtPersistence — object persistence interface
Song Class Reference
BtMachine — base class for signal processing machines
BtPattern — class for an event pattern of a BtMachine instance
BtProcessorMachine — class for signal processing machines with inputs and outputs
BtSequence — class for the event timeline of a BtSong instance
BtSetup — class with all machines and wires (BtMachine and BtWire) for a BtSong instance
BtSinkBin — bin to be used by BtSinkMachine
BtSinkMachine — class for signal processing machines with inputs only
BtSong — class of a song project object (contains BtSongInfo, BtSetup, BtSequence and BtWavetable)
BtSongInfo — class that keeps the meta-data for a BtSong instance
BtSongIO — base class for song input and output
BtSongIONative — class for song input and output in builtin native format
BtSongIONativeBZT — class for song input and output in builtin native format
BtSongIONativeXML — class for song input and output in builtin native format
BtSourceMachine — class for signal processing machines with outputs only
BtWave — one BtWavetable entry that keeps a list of BtWavelevels
BtWavelevel — a single part of a BtWave item
BtWavetable — the list of BtWave items in a BtSong
BtWire — class for a connection of two BtMachines
BtWirePattern — class for an event pattern of a BtMachine instance
III. Appendix
Object Hierarchy
API Index
Index of deprecated API
Index of new API in 0.3
Index of new API in 0.5
Index of new API in 0.6
Annotation Glossary
buzztard-0.6.0/docs/reference/bt-core/html/BtSourceMachine.html0000644042355400116100000002351111675570702021413 00000000000000 BtSourceMachine

BtSourceMachine

BtSourceMachine — class for signal processing machines with outputs only

Synopsis

#include <libbtcore/core.h>

struct              BtSourceMachine;
enum                BtSourceMachinePatternIndex;
BtSourceMachine *   bt_source_machine_new               (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const plugin_name,
                                                         const glong voices,
                                                         GError **err);

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtMachine
                           +----BtSourceMachine

Implemented Interfaces

BtSourceMachine implements GstChildProxy.

Description

Sources are machines that generate audio.

Details

struct BtSourceMachine

struct BtSourceMachine;

Sub-class of a BtMachine that implements a signal generator (a machine with outputs only).


enum BtSourceMachinePatternIndex

typedef enum {
  BT_SOURCE_MACHINE_PATTERN_INDEX_BREAK=0,
  BT_SOURCE_MACHINE_PATTERN_INDEX_MUTE,
  BT_SOURCE_MACHINE_PATTERN_INDEX_SOLO,
  BT_SOURCE_MACHINE_PATTERN_INDEX_OFFSET
} BtSourceMachinePatternIndex;

Use this with bt_machine_get_pattern_by_index() to get the command patterns.

BT_SOURCE_MACHINE_PATTERN_INDEX_BREAK

stop the pattern

BT_SOURCE_MACHINE_PATTERN_INDEX_MUTE

mute the machine

BT_SOURCE_MACHINE_PATTERN_INDEX_SOLO

play only this machine

BT_SOURCE_MACHINE_PATTERN_INDEX_OFFSET

offset for real pattern ids

bt_source_machine_new ()

BtSourceMachine *   bt_source_machine_new               (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const plugin_name,
                                                         const glong voices,
                                                         GError **err);

Create a new instance The machine is automaticly added to the setup from the given song object. You don't need to add the machine with bt_setup_add_machine(setup,BT_MACHINE(machine));.

song :

the song the new instance belongs to

id :

the id, we can use to lookup the machine

plugin_name :

the name of the gst-plugin the machine is using

voices :

the number of voices the machine should initially have

err :

inform about failed instance creation

Returns :

the new instance or NULL in case of an error
buzztard-0.6.0/docs/reference/bt-core/html/libbtcore.html0000644042355400116100000002153111675570702020345 00000000000000 API Reference

API Reference


Abstract

libbtcore is the main library for the buzztard software system. This library contains all classes needed for the components of a song like machines, patterns, wires and so on. It further defines bases classes for common operations such as song input/output. The synthesis engine and the low-level parts of the sequencer are built into GStreamer. Please make sure you have read section conventions before reading further.

All data structures are encapsulated in objects based on GObject. Central starting points are BtApplication and BtSong. All the objects that belong to a song have their song-instance as their member. Likewise all objects that belong to the applications have their application instance as a member.

Table of Contents

Core Class Reference
libbtcore — core library of the buzztard application framework
BtApplication — base class for a buzztard based application
BtSettings — base class for buzztard settings handling
BtGConfSettings — gconf based implementation sub class for buzztard settings handling
BtChildProxy — Interface for multi child elements.
BtPersistence — object persistence interface
Song Class Reference
BtMachine — base class for signal processing machines
BtPattern — class for an event pattern of a BtMachine instance
BtProcessorMachine — class for signal processing machines with inputs and outputs
BtSequence — class for the event timeline of a BtSong instance
BtSetup — class with all machines and wires (BtMachine and BtWire) for a BtSong instance
BtSinkBin — bin to be used by BtSinkMachine
BtSinkMachine — class for signal processing machines with inputs only
BtSong — class of a song project object (contains BtSongInfo, BtSetup, BtSequence and BtWavetable)
BtSongInfo — class that keeps the meta-data for a BtSong instance
BtSongIO — base class for song input and output
BtSongIONative — class for song input and output in builtin native format
BtSongIONativeBZT — class for song input and output in builtin native format
BtSongIONativeXML — class for song input and output in builtin native format
BtSourceMachine — class for signal processing machines with outputs only
BtWave — one BtWavetable entry that keeps a list of BtWavelevels
BtWavelevel — a single part of a BtWave item
BtWavetable — the list of BtWave items in a BtSong
BtWire — class for a connection of two BtMachines
BtWirePattern — class for an event pattern of a BtMachine instance
buzztard-0.6.0/docs/reference/bt-core/html/BtSongIO.html0000644042355400116100000006627711675570702020044 00000000000000 BtSongIO

BtSongIO

BtSongIO — base class for song input and output

Synopsis

#include <libbtcore/core.h>

#define             BT_SONG_IO_MODULE_INFO_MAX_FORMATS
struct              BtSongIO;
struct              BtSongIOClass;
                    BtSongIOFormatInfo;
gboolean            (*BtSongIOInit)                     (void);
                    BtSongIOModuleInfo;
BtSongIO *          bt_song_io_from_data                (gpointer *data,
                                                         guint len,
                                                         const gchar *media_type);
BtSongIO *          bt_song_io_from_file                (const gchar * const file_name);
const GList *       bt_song_io_get_module_info_list     (void);
gboolean            bt_song_io_load                     (BtSongIO const *self,
                                                         const BtSong * const song);
gboolean            bt_song_io_save                     (BtSongIO const *self,
                                                         const BtSong * const song);
gboolean            (*bt_song_io_virtual_load)          (gconstpointer self,
                                                         const BtSong * const song);
gboolean            (*bt_song_io_virtual_save)          (gconstpointer const self,
                                                         const BtSong * const song);

Object Hierarchy

  GObject
   +----BtSongIO
         +----BtSongIONative

Properties

  "data"                     gpointer              : Read
  "data-len"                 guint                 : Read
  "file-name"                gchar*                : Read
  "status"                   gchar*                : Read / Write

Description

A base class for BtSong loader and saver implementations. A BtSongIO module needs to be installed as a shared library into LIBDIR/songio. It is recognized, if it exports a BtSongIOModuleInfo structure. At runtime the detect method of each module is called with the chosen file-name. The module should return its GType if it can handle the format or NULL else.

Such a module should overwrite the bt_song_io_load() and/or bt_song_io_save() default implementations.

There is an internal subclass of this called BtSongIONative.

Note

This API is not yet fully stable. Please discuss with the deverloper team if you intend to write a io plugin.

Details

BT_SONG_IO_MODULE_INFO_MAX_FORMATS

#define BT_SONG_IO_MODULE_INFO_MAX_FORMATS 10

Maximum number of BtSongIOFormatInfo per plugin (10).


struct BtSongIO

struct BtSongIO;

base object for song input and output plugins


struct BtSongIOClass

struct BtSongIOClass {
  const GObjectClass parent;

  /* class methods */
  bt_song_io_virtual_load load;
  bt_song_io_virtual_save save;
};

Base class for song input and output plugins

const GObjectClass parent;

parent class type

bt_song_io_virtual_load load;

virtual method for loading a song

bt_song_io_virtual_save save;

virtual method for saving a song

BtSongIOFormatInfo

typedef struct {
  GType type;
  const gchar *name;
  const gchar *mime_type;
  const gchar *extension;
} BtSongIOFormatInfo;

Metadata structure for BtSongIO plugins describing one format.

GType type;

the io module GType

const gchar *name;

format name

const gchar *mime_type;

mime type

const gchar *extension;

file extension

BtSongIOInit ()

gboolean            (*BtSongIOInit)                     (void);

Function to init the plugin.

Returns :

TRUE if the plugin was initialized fine

BtSongIOModuleInfo

typedef struct {
  BtSongIOInit init;
  BtSongIOFormatInfo formats[BT_SONG_IO_MODULE_INFO_MAX_FORMATS];
} BtSongIOModuleInfo;

Metadata structure for BtSongIO plugins.

BtSongIOInit init;

pointer to init function, can be NULL.

BtSongIOFormatInfo formats[BT_SONG_IO_MODULE_INFO_MAX_FORMATS];

NULL terminated array of formats supported by this plugin

bt_song_io_from_data ()

BtSongIO *          bt_song_io_from_data                (gpointer *data,
                                                         guint len,
                                                         const gchar *media_type);

Create a new instance from the given parameters. Each installed plugin will test if it can handle the file type.

data :

in memory data of the song

len :

the siye of the data block

media_type :

the media-type of the song, if available

Returns :

the new instance or NULL in case of an error

bt_song_io_from_file ()

BtSongIO *          bt_song_io_from_file                (const gchar * const file_name);

Create a new instance from the given file_name. Each installed plugin will test if it can handle the file type.

file_name :

the file name of the song

Returns :

the new instance or NULL in case of an error

bt_song_io_get_module_info_list ()

const GList *       bt_song_io_get_module_info_list     (void);

Get read only access to list of BtSongIOModuleInfo entries.

Returns :

the GList.

bt_song_io_load ()

gboolean            bt_song_io_load                     (BtSongIO const *self,
                                                         const BtSong * const song);

load the song from a file. The file is set in the constructor

self :

the BtSongIO instance to use

song :

the BtSong instance that should initialized

Returns :

TRUE for success

bt_song_io_save ()

gboolean            bt_song_io_save                     (BtSongIO const *self,
                                                         const BtSong * const song);

save the song to a file. The file is set in the constructor

self :

the BtSongIO instance to use

song :

the BtSong instance that should stored

Returns :

TRUE for success

bt_song_io_virtual_load ()

gboolean            (*bt_song_io_virtual_load)          (gconstpointer self,
                                                         const BtSong * const song);

Subclasses will override this methods with the loader function.

self :

song-io instance

song :

song object to load

Returns :

TRUE for success

bt_song_io_virtual_save ()

gboolean            (*bt_song_io_virtual_save)          (gconstpointer const self,
                                                         const BtSong * const song);

Subclasses will override this methods with the saver function.

self :

song-io instance

song :

song object to save

Returns :

TRUE for success

Property Details

The "data" property

  "data"                     gpointer              : Read

in memory block pointer for load save operations.


The "data-len" property

  "data-len"                 guint                 : Read

in memory block length for load save operations.

Default value: 0


The "file-name" property

  "file-name"                gchar*                : Read

full filename for load save operations.

Default value: NULL


The "status" property

  "status"                   gchar*                : Read / Write

status of load save operations.

Default value: NULL

buzztard-0.6.0/docs/reference/bt-core/html/BtSinkMachine.html0000644042355400116100000002150711675570702021062 00000000000000 BtSinkMachine

BtSinkMachine

BtSinkMachine — class for signal processing machines with inputs only

Synopsis

#include <libbtcore/core.h>

struct              BtSinkMachine;
enum                BtSinkMachinePatternIndex;
BtSinkMachine *     bt_sink_machine_new                 (const BtSong * const song,
                                                         const gchar * const id,
                                                         GError **err);

Object Hierarchy

  GObject
   +----GstObject
         +----GstElement
               +----GstBin
                     +----BtMachine
                           +----BtSinkMachine

Implemented Interfaces

BtSinkMachine implements GstChildProxy.

Description

Sinks are machines that do playback or recording of the song. The sink-machine utilizes the BtSinkBin to transparently switch elements between record (encoding) and playback.

Details

struct BtSinkMachine

struct BtSinkMachine;

Sub-class of a BtMachine that implements a signal output (a machine with inputs only).


enum BtSinkMachinePatternIndex

typedef enum {
  BT_SINK_MACHINE_PATTERN_INDEX_BREAK=0,
  BT_SINK_MACHINE_PATTERN_INDEX_MUTE,
  BT_SINK_MACHINE_PATTERN_INDEX_OFFSET
} BtSinkMachinePatternIndex;

Use this with bt_machine_get_pattern_by_index() to get the command patterns.

BT_SINK_MACHINE_PATTERN_INDEX_BREAK

stop the pattern

BT_SINK_MACHINE_PATTERN_INDEX_MUTE

mute the machine

BT_SINK_MACHINE_PATTERN_INDEX_OFFSET

offset for real pattern ids

bt_sink_machine_new ()

BtSinkMachine *     bt_sink_machine_new                 (const BtSong * const song,
                                                         const gchar * const id,
                                                         GError **err);

Create a new instance. The machine is automaticly added to the setup from the given song object. You don't need to add the machine with bt_setup_add_machine(setup,BT_MACHINE(machine));. The element used for this machine is BtSinkBin which is configured according to the use-case (playback, recordfing). The playback device is taken from the BtSettings.

song :

the song the new instance belongs to

id :

the id, we can use to lookup the machine

err :

inform about failed instance creation

Returns :

the new instance or NULL in case of an error
buzztard-0.6.0/docs/reference/bt-core/html/BtSequence.html0000644042355400116100000022512211675570702020440 00000000000000 BtSequence

BtSequence

BtSequence — class for the event timeline of a BtSong instance

Synopsis

#include <libbtcore/core.h>

struct              BtSequence;
gboolean            bt_sequence_add_track               (const BtSequence * const self,
                                                         const BtMachine * const machine,
                                                         const glong ix);
void                bt_sequence_delete_full_rows        (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong rows);
void                bt_sequence_delete_rows             (const BtSequence * const self,
                                                         const gulong time,
                                                         const glong track,
                                                         const gulong rows);
GstClockTime        bt_sequence_get_bar_time            (const BtSequence * const self);
gchar *             bt_sequence_get_label               (const BtSequence * const self,
                                                         const gulong time);
GstClockTime        bt_sequence_get_loop_time           (const BtSequence * const self);
BtMachine *         bt_sequence_get_machine             (const BtSequence * const self,
                                                         const gulong track);
BtPattern *         bt_sequence_get_pattern             (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track);
glong               bt_sequence_get_tick_by_pattern     (const BtSequence * const self,
                                                         gulong track,
                                                         const BtPattern * const pattern,
                                                         gulong tick);
glong               bt_sequence_get_track_by_machine    (const BtSequence * const self,
                                                         const BtMachine * const machine,
                                                         gulong track);
void                bt_sequence_insert_full_rows        (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong rows);
void                bt_sequence_insert_rows             (const BtSequence * const self,
                                                         const gulong time,
                                                         const glong track,
                                                         const gulong rows);
gboolean            bt_sequence_is_pattern_used         (const BtSequence * const self,
                                                         const BtPattern * const pattern);
gulong              bt_sequence_limit_play_pos          (const BtSequence * const self,
                                                         const gulong play_pos);
gboolean            bt_sequence_move_track_left         (const BtSequence * const self,
                                                         const gulong track);
gboolean            bt_sequence_move_track_right        (const BtSequence * const self,
                                                         const gulong track);
BtSequence *        bt_sequence_new                     (const BtSong * const song);
gboolean            bt_sequence_remove_track_by_ix      (const BtSequence * const self,
                                                         const gulong ix);
gboolean            bt_sequence_remove_track_by_machine (const BtSequence * const self,
                                                         const BtMachine * const machine);
void                bt_sequence_repair_damage           (const BtSequence * const self);
void                bt_sequence_set_label               (const BtSequence * const self,
                                                         const gulong time,
                                                         const gchar * const label);
void                bt_sequence_set_pattern             (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track,
                                                         const BtPattern * const pattern);
gboolean            bt_sequence_set_pattern_quick       (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track,
                                                         const BtPattern * const pattern);
void                bt_sequence_update_tempo            (const BtSequence * const self);

Object Hierarchy

  GObject
   +----BtSequence

Implemented Interfaces

BtSequence implements

Properties

  "length"                   gulong                : Read / Write
  "loop"                     gboolean              : Read / Write
  "loop-end"                 glong                 : Read / Write
  "loop-start"               glong                 : Read / Write
  "properties"               gpointer              : Read
  "song"                     BtSong*               : Read / Write / Construct Only
  "tracks"                   gulong                : Read / Write

Description

A sequence holds grid of BtPatterns, with labels on the time axis and BtMachine instances on the track axis. It tracks first and last use of patterns and provides two signals for notification - "pattern-added" and "pattern-removed".

It supports looping a section of the sequence (see "loop", "loop-start", "loop-end").

The BtSequence manages the GstController event queues for the BtMachines and BtWires. It uses a damage-repair based two phase algorithm to update the controller queues whenever patterns or the sequence changes.

Details

struct BtSequence

struct BtSequence;

Starting point for the BtSong timeline data-structures. Holds a series of array of BtPatterns for time and tracks, which define the events that are sent to a BtMachine at a time.


bt_sequence_add_track ()

gboolean            bt_sequence_add_track               (const BtSequence * const self,
                                                         const BtMachine * const machine,
                                                         const glong ix);

Adds a new track with the machine at ix or the end.

self :

the BtSequence that holds the tracks

machine :

the BtMachine

ix :

position to add the track at, use -1 to append

Returns :

TRUE for success

bt_sequence_delete_full_rows ()

void                bt_sequence_delete_full_rows        (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong rows);

Delete row for all tracks.

self :

the sequence

time :

the postion to delete

rows :

the number of rows to remove

Since 0.3


bt_sequence_delete_rows ()

void                bt_sequence_delete_rows             (const BtSequence * const self,
                                                         const gulong time,
                                                         const glong track,
                                                         const gulong rows);

Delete row for given track.

self :

the sequence

time :

the postion to delete

track :

the track

rows :

the number of rows to remove

Since 0.3


bt_sequence_get_bar_time ()

GstClockTime        bt_sequence_get_bar_time            (const BtSequence * const self);

Calculates the length of one sequence bar in microseconds. Divide it by G_USEC_PER_SEC to get it in milliseconds.

self :

the BtSequence of the song

Returns :

the length of one sequence bar in microseconds

bt_sequence_get_label ()

gchar *             bt_sequence_get_label               (const BtSequence * const self,
                                                         const gulong time);

Fetches the label for the given time position. Free when done.

self :

the BtSequence that holds the labels

time :

the requested time position

Returns :

a copy of the label or NULL in case of an error

bt_sequence_get_loop_time ()

GstClockTime        bt_sequence_get_loop_time           (const BtSequence * const self);

Calculates the length of the song loop in microseconds. Divide it by G_USEC_PER_SEC to get it in milliseconds.

self :

the BtSequence of the song

Returns :

the length of the song loop in microseconds

bt_sequence_get_machine ()

BtMachine *         bt_sequence_get_machine             (const BtSequence * const self,
                                                         const gulong track);

Fetches the BtMachine for the given track. Unref when done.

self :

the BtSequence that holds the tracks

track :

the requested track index

Returns :

a reference to the BtMachine pointer or NULL in case of an error

bt_sequence_get_pattern ()

BtPattern *         bt_sequence_get_pattern             (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track);

Fetches the pattern for the given time and track position. Unref when done.

self :

the BtSequence that holds the patterns

time :

the requested time position

track :

the requested track index

Returns :

a reference to the BtPattern or NULL when empty

bt_sequence_get_tick_by_pattern ()

glong               bt_sequence_get_tick_by_pattern     (const BtSequence * const self,
                                                         gulong track,
                                                         const BtPattern * const pattern,
                                                         gulong tick);

Gets the next tick position >= tick this pattern is on.

self :

the sequence to search in

track :

the track to search in

pattern :

the pattern to find the next track for

tick :

the tick position to start the search from

Returns :

the tick position or -1 if there is no further tick for this pattern.

Since 0.6


bt_sequence_get_track_by_machine ()

glong               bt_sequence_get_track_by_machine    (const BtSequence * const self,
                                                         const BtMachine * const machine,
                                                         gulong track);

Gets the next track >= track this machine is on.

self :

the sequence to search in

machine :

the machine to find the next track for

track :

the track to start the search from

Returns :

the track-index or -1 if there is no further track for this machine.

Since 0.6


bt_sequence_insert_full_rows ()

void                bt_sequence_insert_full_rows        (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong rows);

Insert one empty row for all tracks.

self :

the sequence

time :

the postion to insert at

rows :

the number of rows to insert

Since 0.3


bt_sequence_insert_rows ()

void                bt_sequence_insert_rows             (const BtSequence * const self,
                                                         const gulong time,
                                                         const glong track,
                                                         const gulong rows);

Insert one empty row for given track.

self :

the sequence

time :

the postion to insert at

track :

the track

rows :

the number of rows to insert

Since 0.3


bt_sequence_is_pattern_used ()

gboolean            bt_sequence_is_pattern_used         (const BtSequence * const self,
                                                         const BtPattern * const pattern);

Checks if the pattern is used in the sequence.

self :

the sequence to check for pattern use

pattern :

the pattern to check for

Returns :

TRUE if pattern is used.

bt_sequence_limit_play_pos ()

gulong              bt_sequence_limit_play_pos          (const BtSequence * const self,
                                                         const gulong play_pos);

Enforce the playback position to be within loop start and end or the song bounds if there is no loop.

self :

the sequence to trim the play position of

play_pos :

the time position to lock inbetween loop-boundaries

Returns :

the new play_pos

bt_sequence_move_track_left ()

gboolean            bt_sequence_move_track_left         (const BtSequence * const self,
                                                         const gulong track);

Move the selected track on column left.

self :

the BtSequence that holds the tracks

track :

the track to move

Returns :

TRUE for success

bt_sequence_move_track_right ()

gboolean            bt_sequence_move_track_right        (const BtSequence * const self,
                                                         const gulong track);

Move the selected track on column left.

self :

the BtSequence that holds the tracks

track :

the track to move

Returns :

TRUE for success

bt_sequence_new ()

BtSequence *        bt_sequence_new                     (const BtSong * const song);

Create a new instance. One would not call this directly, but rather get this from a BtSong instance.

song :

the song the new instance belongs to

Returns :

the new instance or NULL in case of an error

bt_sequence_remove_track_by_ix ()

gboolean            bt_sequence_remove_track_by_ix      (const BtSequence * const self,
                                                         const gulong ix);

Removes the specified track.

self :

the BtSequence that holds the tracks

ix :

the requested track index

Returns :

TRUE for success

bt_sequence_remove_track_by_machine ()

gboolean            bt_sequence_remove_track_by_machine (const BtSequence * const self,
                                                         const BtMachine * const machine);

Removes all tracks that belong the the given machine.

self :

the BtSequence that holds the tracks

machine :

the BtMachine

Returns :

TRUE for success

bt_sequence_repair_damage ()

void                bt_sequence_repair_damage           (const BtSequence * const self);

Works through the repair queue and rebuilds controller queues, where needed.

There is usualy no need to call that manualy. Only call after soing mass updates using bt_sequence_set_pattern_quick() functions.

self :

the BtSequence

Since 0.5


bt_sequence_set_label ()

void                bt_sequence_set_label               (const BtSequence * const self,
                                                         const gulong time,
                                                         const gchar * const label);

Sets a new label for the respective time position.

self :

the BtSequence that holds the labels

time :

the requested time position

label :

the new label

bt_sequence_set_pattern ()

void                bt_sequence_set_pattern             (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track,
                                                         const BtPattern * const pattern);

Sets the BtPattern for the respective time and track position.

self :

the BtSequence that holds the patterns

time :

the requested time position

track :

the requested track index

pattern :

the BtPattern or NULL to unset

bt_sequence_set_pattern_quick ()

gboolean            bt_sequence_set_pattern_quick       (const BtSequence * const self,
                                                         const gulong time,
                                                         const gulong track,
                                                         const BtPattern * const pattern);

A quick version of bt_sequence_set_pattern() that does not repair damaged area. Useful when doing mass updates.

self :

the BtSequence that holds the patterns

time :

the requested time position

track :

the requested track index

pattern :

the BtPattern or NULL to unset

Returns :

TRUE if a change has been made. One should call bt_sequence_repair_damage() in that case.

Since 0.5


bt_sequence_update_tempo ()

void                bt_sequence_update_tempo            (const BtSequence * const self);

Refresh sequence after tempo changes. Called from BtSongInfo.

self :

the sequence

Property Details

The "length" property

  "length"                   gulong                : Read / Write

length of the sequence in timeline bars.

Allowed values: <= G_MAXINT64


The "loop" property

  "loop"                     gboolean              : Read / Write

is loop activated.

Default value: FALSE


The "loop-end" property

  "loop-end"                 glong                 : Read / Write

end of the repeat sequence on the timeline.

Allowed values: >= -1

Default value: -1


The "loop-start" property

  "loop-start"               glong                 : Read / Write

start of the repeat sequence on the timeline.

Allowed values: >= -1

Default value: -1


The "properties" property

  "properties"               gpointer              : Read

hashtable of sequence properties.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Set song object, the sequence belongs to.


The "tracks" property

  "tracks"                   gulong                : Read / Write

number of tracks in the sequence.

Signal Details

The "pattern-added" signal

void                user_function                      (BtSequence *self,
                                                        BtPattern  *pattern,
                                                        gpointer    user_data)      : No Hooks

A pattern has been used in the sequence for the first time.

self :

the sequence object that emitted the signal

pattern :

the new pattern

user_data :

user data set when the signal handler was connected.

The "pattern-removed" signal

void                user_function                      (BtSequence *self,
                                                        BtPattern  *pattern,
                                                        gpointer    user_data)      : No Hooks

The last occurance of pattern has been removed from the sequence.

self :

the sequence object that emitted the signal

pattern :

the old pattern

user_data :

user data set when the signal handler was connected.

The "rows-changed" signal

void                user_function                      (BtSequence *self,
                                                        gulong      begin,
                                                        gulong      end,
                                                        gpointer    user_data)      : No Hooks

The content of the given rows in the sequence has changed.

self :

the sequence object that emitted the signal

begin :

start row that changed

end :

last row that changed

user_data :

user data set when the signal handler was connected.

Since 0.6


The "track-added" signal

void                user_function                      (BtSequence *self,
                                                        BtMachine  *machine,
                                                        gulong      track,
                                                        gpointer    user_data)      : No Hooks

A new track for machine has been added with the track index.

self :

the sequence object that emitted the signal

machine :

the machine for the track

track :

the track index

user_data :

user data set when the signal handler was connected.

Since 0.6


The "track-removed" signal

void                user_function                      (BtSequence *self,
                                                        BtMachine  *machine,
                                                        gulong      track,
                                                        gpointer    user_data)      : No Hooks

A track for machine has been removed at the track index.

self :

the sequence object that emitted the signal

machine :

the machine for the track

track :

the track index

user_data :

user data set when the signal handler was connected.

Since 0.6

buzztard-0.6.0/docs/reference/bt-core/html/conventions.html0000644042355400116100000000573511675570702020755 00000000000000 Conventions

Conventions

During the API docs some conventions are used to avoid duplication and improve precision.

  1. It is never valid to supply NULL for an object reference, unless it is explicitly said so.

  2. Methods do checking of preconditions using g_return_if_fail() or g_return_val_if_fail(). Therefore watch for the glib log messages indicating wrong API usage.

  3. All methods that return a pointer to an object, increase the reference counter. Therefore you should do release this reference by calling g_object_unref() when you are done with the object.

  4. When a return value is marked as const e.g. const gchar * or const BtObjectName * then this is a static reference. You must not call g_free() or g_object_unref() on it.

buzztard-0.6.0/docs/reference/bt-core/html/buzztard-core-BtPersistence.html0000644042355400116100000007552211675570702023754 00000000000000 BtPersistence

BtPersistence

BtPersistence — object persistence interface

Synopsis

#include <libbtcore/core.h>

struct              BtPersistenceInterface;
void                bt_persistence_collect_hashtable_entries
                                                        (gpointer const key,
                                                         gpointer const value,
                                                         gpointer const user_data);
gchar *             bt_persistence_get_value            (GValue * const gvalue);
BtPersistence *     bt_persistence_load                 (const GType type,
                                                         const BtPersistence * const self,
                                                         xmlNodePtr node,
                                                         GError **err,
                                                         ...);
gboolean            bt_persistence_load_hashtable       (GHashTable *hashtable,
                                                         xmlNodePtr node);
gint                bt_persistence_parse_enum           (GType enum_type,
                                                         const gchar *str);
xmlNodePtr          bt_persistence_save                 (const BtPersistence * const self,
                                                         xmlNodePtr const parent_node);
gboolean            bt_persistence_save_hashtable       (GHashTable *hashtable,
                                                         xmlNodePtr const node);
gboolean            bt_persistence_save_list            (const GList *list,
                                                         xmlNodePtr const node);
gboolean            bt_persistence_set_value            (GValue * const gvalue,
                                                         const gchar * const svalue);
const gchar *       bt_persistence_strfmt_double        (const gdouble val);
const gchar *       bt_persistence_strfmt_enum          (GType enum_type,
                                                         gint value);
const gchar *       bt_persistence_strfmt_long          (const glong val);
const gchar *       bt_persistence_strfmt_uchar         (const guchar val);
const gchar *       bt_persistence_strfmt_ulong         (const gulong val);

Description

Classes can implement this interface to store their data as xml and restore them from xml. They should call the interface methods on their children objects (which also implement the interface) to serialize/ deserialize a whole object hierarchy.

Details

struct BtPersistenceInterface

struct BtPersistenceInterface {
  /* virtual methods */
  xmlNodePtr (*save)(const BtPersistence * const self, xmlNodePtr const node);
  BtPersistence* (*load)(const GType type, const BtPersistence * const self, xmlNodePtr node, GError **err, va_list var_args);
};

BtPersistence interface

save ()

virtual method to serialize an object to an xml node

load ()

virtual method to deserialze an object from an xml node

bt_persistence_collect_hashtable_entries ()

void                bt_persistence_collect_hashtable_entries
                                                        (gpointer const key,
                                                         gpointer const value,
                                                         gpointer const user_data);

Gather GHashTable entries in a list. Should be used with g_hash_table_foreach().

key :

hashtable key

value :

hashtable value

user_data :

GList **list

bt_persistence_get_value ()

gchar *             bt_persistence_get_value            (GValue * const gvalue);

Returns the string representation of the given gvalue. Free it when done.

gvalue :

the event cell

Returns :

a newly allocated string with the data or NULL on error

bt_persistence_load ()

BtPersistence *     bt_persistence_load                 (const GType type,
                                                         const BtPersistence * const self,
                                                         xmlNodePtr node,
                                                         GError **err,
                                                         ...);

Deserializes the given object from the node. If self is NULL and a type is given it constructs a new object.

type :

a GObject type

self :

a deserialiable object

node :

the xml node

err :

a GError for deserialisation errors

... :

extra parameters NULL terminated name/value pairs.

Returns :

the deserialized object or NULL.

bt_persistence_load_hashtable ()

gboolean            bt_persistence_load_hashtable       (GHashTable *hashtable,
                                                         xmlNodePtr node);

Iterates over the xml-node and deserializes elements into the hashtable.

hashtable :

a GHashTable

node :

the list xml node

Returns :

TRUE if all elements have been deserialized.

bt_persistence_parse_enum ()

gint                bt_persistence_parse_enum           (GType enum_type,
                                                         const gchar *str);

Convinience methods, that parses a enum value nick and to get the corresponding intger value.

enum_type :

the GType for the enum

str :

the enum value name

Returns :

the interger value for the enum, or -1 for invalid strings.

bt_persistence_save ()

xmlNodePtr          bt_persistence_save                 (const BtPersistence * const self,
                                                         xmlNodePtr const parent_node);

Serializes the given object into node.

self :

a serialiable object

parent_node :

the parent xml node

Returns :

the new node if the object has been serialized, else NULL.

bt_persistence_save_hashtable ()

gboolean            bt_persistence_save_hashtable       (GHashTable *hashtable,
                                                         xmlNodePtr const node);

Iterates over a hashtable with strings and serializes them.

hashtable :

a GHashTable with strings

node :

the list xml node

Returns :

TRUE if all elements have been serialized.

bt_persistence_save_list ()

gboolean            bt_persistence_save_list            (const GList *list,
                                                         xmlNodePtr const node);

Iterates over a list of objects, which must implement the BtPersistence interface and calls bt_persistence_save() on each item.

list :

a GList doc; the xml-document

node :

the list xml node

Returns :

TRUE if all elements have been serialized.

bt_persistence_set_value ()

gboolean            bt_persistence_set_value            (GValue * const gvalue,
                                                         const gchar * const svalue);

Stores the supplied value into the given gvalue.

gvalue :

a GValue

svalue :

the string representation of the value to store

Returns :

TRUE for success

bt_persistence_strfmt_double ()

const gchar *       bt_persistence_strfmt_double        (const gdouble val);

Convinience methods, that formats a value to be serialized as a string.

val :

a value

Returns :

a reference to static memory containg the formatted value.

bt_persistence_strfmt_enum ()

const gchar *       bt_persistence_strfmt_enum          (GType enum_type,
                                                         gint value);

Convinience methods, that formats a value to be serialized as a string.

enum_type :

the GType for the enum

value :

the integer value for the enum

Returns :

a reference to static memory containg the formatted value.

bt_persistence_strfmt_long ()

const gchar *       bt_persistence_strfmt_long          (const glong val);

Convinience methods, that formats a value to be serialized as a string.

val :

a value

Returns :

a reference to static memory containg the formatted value.

bt_persistence_strfmt_uchar ()

const gchar *       bt_persistence_strfmt_uchar         (const guchar val);

Convinience methods, that formats a value to be serialized as a string.

val :

a value

Returns :

a reference to static memory containg the formatted value.

bt_persistence_strfmt_ulong ()

const gchar *       bt_persistence_strfmt_ulong         (const gulong val);

Convinience methods, that formats a value to be serialized as a string.

val :

a value

Returns :

a reference to static memory containg the formatted value.
buzztard-0.6.0/docs/reference/bt-core/html/index.sgml0000644042355400116100000020033711675570702017510 00000000000000 buzztard-0.6.0/docs/reference/bt-core/html/BtSongIONativeBZT.html0000644042355400116100000002433511675570702021560 00000000000000 BtSongIONativeBZT

BtSongIONativeBZT

BtSongIONativeBZT — class for song input and output in builtin native format

Synopsis

#include <libbtcore/core.h>

struct              BtSongIONativeBZT;
struct              BtSongIONativeBZTClass;
gboolean            bt_song_io_native_bzt_copy_from_uri (const BtSongIONativeBZT * const self,
                                                         const gchar *file_name,
                                                         const gchar *uri);
gboolean            bt_song_io_native_bzt_copy_to_fd    (const BtSongIONativeBZT * const self,
                                                         const gchar *file_name,
                                                         gint fd);

Object Hierarchy

  GObject
   +----BtSongIO
         +----BtSongIONative
               +----BtSongIONativeBZT

Description

This internal BtSongIONative module implements loading and saving of an own xml format with externals. The format is an archive, that contains an XML file and optionally binary data, such as audio samples.

Details

struct BtSongIONativeBZT

struct BtSongIONativeBZT;

object for song input and output in native zip/xml format


struct BtSongIONativeBZTClass

struct BtSongIONativeBZTClass {
  const BtSongIONativeClass parent;
};

Class for song input and output in native zip/xml format

const BtSongIONativeClass parent;

parent class type

bt_song_io_native_bzt_copy_from_uri ()

gboolean            bt_song_io_native_bzt_copy_from_uri (const BtSongIONativeBZT * const self,
                                                         const gchar *file_name,
                                                         const gchar *uri);

Copies the file specified by uri to file_name into the song file.

This is a helper for BtSong persistence.

self :

the song-plugin

file_name :

the path to the file inside the song

uri :

location of the source file

Returns :

TRUE on success

bt_song_io_native_bzt_copy_to_fd ()

gboolean            bt_song_io_native_bzt_copy_to_fd    (const BtSongIONativeBZT * const self,
                                                         const gchar *file_name,
                                                         gint fd);

Copies the file specified by file_name from the song file to the fd.

This is a helper for BtSong persistence.

self :

the song-plugin

file_name :

the path to the file inside the song

fd :

a file-descriptor of an opened file to copy file_name to

Returns :

TRUE on success
buzztard-0.6.0/docs/reference/bt-core/html/BtWavetable.html0000644042355400116100000004640111675570702020603 00000000000000 BtWavetable

BtWavetable

BtWavetable — the list of BtWave items in a BtSong

Synopsis

#include <libbtcore/core.h>

struct              BtWavetable;
gboolean            bt_wavetable_add_wave               (const BtWavetable * const self,
                                                         const BtWave * const wave);
BtWave *            bt_wavetable_get_wave_by_index      (const BtWavetable * const self,
                                                         const gulong index);
BtWavetable *       bt_wavetable_new                    (const BtSong * const song);
void                bt_wavetable_remember_missing_wave  (const BtWavetable * const self,
                                                         const gchar * const str);
gboolean            bt_wavetable_remove_wave            (const BtWavetable * const self,
                                                         const BtWave * const wave);

Object Hierarchy

  GObject
   +----BtWavetable

Implemented Interfaces

BtWavetable implements

Properties

  "missing-waves"            gpointer              : Read
  "song"                     BtSong*               : Read / Write / Construct Only
  "waves"                    gpointer              : Read

Description

Each wave table entry can constist of multiple BtWaves, were each of the waves has a BtWavelevel with the data for a note range.

Details

struct BtWavetable

struct BtWavetable;

A table of BtWave objects.


bt_wavetable_add_wave ()

gboolean            bt_wavetable_add_wave               (const BtWavetable * const self,
                                                         const BtWave * const wave);

Add the supplied wave to the wavetable. This is automatically done by #bt_wave_new().

self :

the wavetable to add the wave to

wave :

the new wave instance

Returns :

TRUE for success, FALSE otheriwse

bt_wavetable_get_wave_by_index ()

BtWave *            bt_wavetable_get_wave_by_index      (const BtWavetable * const self,
                                                         const gulong index);

Search the wavetable for a wave by the supplied index. The wave must have been added previously to this wavetable with bt_wavetable_add_wave(). Unref the wave, when done with it.

self :

the wavetable to search for the wave

index :

the index of the wave

Returns :

BtWave instance or NULL if not found

bt_wavetable_new ()

BtWavetable *       bt_wavetable_new                    (const BtSong * const song);

Create a new instance

song :

the song the new instance belongs to

Returns :

the new instance or NULL in case of an error

bt_wavetable_remember_missing_wave ()

void                bt_wavetable_remember_missing_wave  (const BtWavetable * const self,
                                                         const gchar * const str);

Loaders can use this function to collect information about wavetable entries that failed to load. The front-end can access this later by reading BtWavetable::missing-waves property.

self :

the wavetable

str :

human readable description of the missing wave

bt_wavetable_remove_wave ()

gboolean            bt_wavetable_remove_wave            (const BtWavetable * const self,
                                                         const BtWave * const wave);

Remove the supplied wave from the wavetable.

self :

the wavetable to remove the wave from

wave :

the wave instance

Returns :

TRUE for success, FALSE otheriwse

Property Details

The "missing-waves" property

  "missing-waves"            gpointer              : Read

The list of missing waves, don't change.


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Set song object, the wavetable belongs to.


The "waves" property

  "waves"                    gpointer              : Read

A copy of the list of waves.

Signal Details

The "wave-added" signal

void                user_function                      (BtWavetable *self,
                                                        BtWave      *wave,
                                                        gpointer     user_data)      : No Hooks

A new wave item has been added to the wavetable

self :

the wavetable object that emitted the signal

wave :

the new wave

user_data :

user data set when the signal handler was connected.

The "wave-removed" signal

void                user_function                      (BtWavetable *self,
                                                        BtWave      *wave,
                                                        gpointer     user_data)      : No Hooks

A wave item has been removed from the wavetable

self :

the setup object that emitted the signal

wave :

the old wave

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/html/buzztard-core-libbtcore.html0000644042355400116100000012634611675570702023150 00000000000000 libbtcore

libbtcore

libbtcore — core library of the buzztard application framework

Synopsis

#include <libbtcore/core.h>

#define             BT_IS_GVALUE                        (v)
#define             BT_IS_STRING                        (a)
guint               bt_cpu_load_get_current             (void);
void                bt_init                             (int *argc,
                                                         char **argv[]);
void                bt_init_add_option_groups           (GOptionContext * const ctx);
gboolean            bt_init_check                       (int *argc,
                                                         char **argv[],
                                                         GError **err);
GOptionGroup *      bt_init_get_option_group            (void);
void                bt_deinit                           (void);
extern const unsigned int bt_major_version;
extern const unsigned int bt_micro_version;
extern const unsigned int bt_minor_version;
#define             return_if_disposed
#define             return_val_if_disposed              (a)
#define             safe_string                         (a)
#define             G_OBJECT_REF_COUNT                  (obj)
#define             G_POINTER_ALIAS                     (type,
                                                         var)
GType               bt_g_type_get_base_type             (const GType type);
#define             g_object_try_ref                    (obj)
#define             g_object_try_unref                  (obj)
#define             g_object_try_weak_ref               (obj)
#define             g_object_try_weak_unref             (obj)
gboolean            bt_bin_activate_tee_chain           (GstBin *bin,
                                                         GstElement *tee,
                                                         GList *analyzers,
                                                         gboolean is_playing);
gboolean            bt_bin_deactivate_tee_chain         (GstBin *bin,
                                                         GstElement *tee,
                                                         GList *analyzers,
                                                         gboolean is_playing);
GList *             bt_gst_check_core_elements          (void);
GList *             bt_gst_check_elements               (GList *list);
const gchar *       bt_gst_debug_pad_link_return        (GstPadLinkReturn link_res,
                                                         GstPad *src_pad,
                                                         GstPad *sink_pad);
gboolean            bt_gst_element_factory_can_sink_media_type
                                                        (GstElementFactory *factory,
                                                         const gchar *name);
GList *             bt_gst_registry_get_element_factories_matching_all_categories
                                                        (const gchar *class_filter);
GList *             bt_gst_registry_get_element_names_matching_all_categories
                                                        (const gchar *class_filter);

Description

The library offers base objects such as BtApplication and BtSong.

Details

BT_IS_GVALUE()

#define BT_IS_GVALUE(v) (G_VALUE_TYPE(v)!=G_TYPE_INVALID)

checks if the supplied gvalue is initialized (not all fields zero).

v :

pointer to a GValue

BT_IS_STRING()

#define BT_IS_STRING(a) (a && *a)

checks if the supplied string pointer is not NULL and contains not just '\0'

a :

string pointer

bt_cpu_load_get_current ()

guint               bt_cpu_load_get_current             (void);

Determines the current CPU load.

Returns :

CPU usage as integer ranging from 0% to 100%

bt_init ()

void                bt_init                             (int *argc,
                                                         char **argv[]);

Initializes the Buzztard Core library.

Note

This function will terminate your program if it was unable to initialize the core for some reason. If you want your program to fall back, use bt_init_check() instead.

WARNING: This function does not work in the same way as corresponding functions in other glib-style libraries, such as gtk_init(). In particular, unknown command line options cause this function to abort program execution.

argc :

pointer to application's argc. [inout]

argv :

pointer to application's argv. [array length=argc][inout]

bt_init_add_option_groups ()

void                bt_init_add_option_groups           (GOptionContext * const ctx);

Adds all option groups to the main context the core library will pull in.

ctx :

main option context

bt_init_check ()

gboolean            bt_init_check                       (int *argc,
                                                         char **argv[],
                                                         GError **err);

Initializes the Buzztard core library.

This function will return FALSE if Buzztard core could not be initialized for some reason. If you want your program to fail fatally, use bt_init() instead.

argc :

pointer to application's argc. [inout]

argv :

pointer to application's argv. [array length=argc][inout]

err :

pointer to a GError to which a message will be posted on error

Returns :

TRUE if Buzztard core could be initialized.

bt_init_get_option_group ()

GOptionGroup *      bt_init_get_option_group            (void);

Returns a GOptionGroup with libbtcore's argument specifications. The group is set up to use standard GOption callbacks, so when using this group in combination with GOption parsing methods, all argument parsing and initialization is automated.

This function is useful if you want to integrate libbtcore with other libraries that use GOption (see g_option_context_add_group() ).

Returns :

a pointer to a GOption group. Should be dereferenced after use.

bt_deinit ()

void                bt_deinit                           (void);

It is normally not needed to call this function in a normal application as the resources will automatically be freed when the program terminates. This function is therefore mostly used by testsuites and other memory profiling tools.


bt_major_version

extern const unsigned int bt_major_version;

buzztard version stamp, major part; determined from BT_MAJOR_VERSION


bt_micro_version

extern const unsigned int bt_micro_version;

buzztard version stamp, micro part; determined from BT_MICRO_VERSION


bt_minor_version

extern const unsigned int bt_minor_version;

buzztard version stamp, minor part; determined from BT_MINOR_VERSION


return_if_disposed

#define return_if_disposed() if(self->priv->dispose_has_run) return

Checks self->priv->dispose_has_run and if TRUE returns. This macro is handy to use at the start of all class routines such as GObjectClass.get_property(), GObjectClass.set_property(), GObjectClass.dispose().


return_val_if_disposed()

#define return_val_if_disposed(a) if(self->priv->dispose_has_run) return(a)

Checks self->priv->dispose_has_run and if TRUE returns with the supplied arg a. This macro is handy to use at the start of e.g. idle handlers.

a :

return value

safe_string()

#define safe_string(a) ((gchar *)(a)?(gchar *)(a):"")

passed the supplied string through or return an empty string when it is NULL

a :

string pointer

Returns :

the given string or an empty string in the case of a NULL argument

G_OBJECT_REF_COUNT()

#define G_OBJECT_REF_COUNT(obj) ((obj)?((G_OBJECT(obj))->ref_count):0)

Read the objects reference counter. Implemented as a macro, so don't use expressions for obj.

obj :

the object (may be NULL)

Returns :

the reference counter.

G_POINTER_ALIAS()

#define             G_POINTER_ALIAS(type,var)

Defines a anonymous union to handle gcc-4.1s type punning warning that one gets when using e.g. g_object_try_weak_ref()

type :

the type

var :

the variable name

bt_g_type_get_base_type ()

GType               bt_g_type_get_base_type             (const GType type);

Call g_type_parent() as long as it returns a parent.

type :

a GType

Returns :

the super parent type, aka base type.

g_object_try_ref()

#define             g_object_try_ref(obj)

If the supplied object is not NULL then reference it via g_object_ref().

obj :

the object to reference

Returns :

the referenced object or NULL

g_object_try_unref()

#define             g_object_try_unref(obj)

If the supplied object is not NULL then release the reference via g_object_unref().

obj :

the object to release the reference

g_object_try_weak_ref()

#define             g_object_try_weak_ref(obj)

If the supplied object is not NULL then reference it via g_object_add_weak_pointer().

obj :

the object to reference

g_object_try_weak_unref()

#define             g_object_try_weak_unref(obj)

If the supplied object is not NULL then release the reference via g_object_remove_weak_pointer().

obj :

the object to release the reference

bt_bin_activate_tee_chain ()

gboolean            bt_bin_activate_tee_chain           (GstBin *bin,
                                                         GstElement *tee,
                                                         GList *analyzers,
                                                         gboolean is_playing);

Add the elements from analyzers to the bin and link them. Handle pad blocking in playing mode.

Return: TRUE for success

bin :

the bin

tee :

the tee to connect the chain to

analyzers :

the list of analyzers

is_playing :

wheter the pipeline is streaming data

bt_bin_deactivate_tee_chain ()

gboolean            bt_bin_deactivate_tee_chain         (GstBin *bin,
                                                         GstElement *tee,
                                                         GList *analyzers,
                                                         gboolean is_playing);

Add the elements from analyzers to the bin and link them. Handle pad blocking in playing mode.

Return: TRUE for success

bin :

the bin

tee :

the tee to connect the chain to

analyzers :

the list of analyzers

is_playing :

wheter the pipeline is streaming data

bt_gst_check_core_elements ()

GList *             bt_gst_check_core_elements          (void);

Check if all core elements exist.

Returns :

a list of elements that does not exist, NULL if all elements exist. The list is static, don't free.

bt_gst_check_elements ()

GList *             bt_gst_check_elements               (GList *list);

Check if the given elements exist.

list :

a GList with element names

Returns :

a list of element-names which do not exist, NULL if all elements exist

bt_gst_debug_pad_link_return ()

const gchar *       bt_gst_debug_pad_link_return        (GstPadLinkReturn link_res,
                                                         GstPad *src_pad,
                                                         GstPad *sink_pad);

Format a nice debug message from failed pad links.

link_res :

pad link result

src_pad :

the source pad

sink_pad :

the sink pad

Returns :

the message. The returned string has to be used before the can be called again, otherwise the previous reult will be overwritten.

bt_gst_element_factory_can_sink_media_type ()

gboolean            bt_gst_element_factory_can_sink_media_type
                                                        (GstElementFactory *factory,
                                                         const gchar *name);

Check if the sink pads of the given factory are compatible with the given name. The name can e.g. be "audio/x-raw-int".

factory :

element factory to check

name :

caps type name

Returns :

TRUE if the pads are compatible.

bt_gst_registry_get_element_factories_matching_all_categories ()

GList *             bt_gst_registry_get_element_factories_matching_all_categories
                                                        (const gchar *class_filter);

Iterates over all available elements and filters by categories given in class_filter.

class_filter :

path for filtering (e.g. "Sink/Audio")

Returns :

list of element factories, use gst_plugin_feature_list_free() after use.

Since 0.6


bt_gst_registry_get_element_names_matching_all_categories ()

GList *             bt_gst_registry_get_element_names_matching_all_categories
                                                        (const gchar *class_filter);

Iterates over all available elements and filters by categories given in class_filter.

class_filter :

path for filtering (e.g. "Sink/Audio")

Returns :

list of read-only element names, g_list_free after use.
buzztard-0.6.0/docs/reference/bt-core/html/objecttree.html0000644042355400116100000000776011675570702020536 00000000000000 Object Hierarchy buzztard-0.6.0/docs/reference/bt-core/html/ch02.html0000644042355400116100000000531411675570702017135 00000000000000 Core Class Reference

Core Class Reference

libbtcore — core library of the buzztard application framework
BtApplication — base class for a buzztard based application
BtSettings — base class for buzztard settings handling
BtGConfSettings — gconf based implementation sub class for buzztard settings handling
BtChildProxy — Interface for multi child elements.
BtPersistence — object persistence interface
buzztard-0.6.0/docs/reference/bt-core/html/ch03.html0000644042355400116100000001457611675570702017150 00000000000000 Song Class Reference

Song Class Reference

BtMachine — base class for signal processing machines
BtPattern — class for an event pattern of a BtMachine instance
BtProcessorMachine — class for signal processing machines with inputs and outputs
BtSequence — class for the event timeline of a BtSong instance
BtSetup — class with all machines and wires (BtMachine and BtWire) for a BtSong instance
BtSinkBin — bin to be used by BtSinkMachine
BtSinkMachine — class for signal processing machines with inputs only
BtSong — class of a song project object (contains BtSongInfo, BtSetup, BtSequence and BtWavetable)
BtSongInfo — class that keeps the meta-data for a BtSong instance
BtSongIO — base class for song input and output
BtSongIONative — class for song input and output in builtin native format
BtSongIONativeBZT — class for song input and output in builtin native format
BtSongIONativeXML — class for song input and output in builtin native format
BtSourceMachine — class for signal processing machines with outputs only
BtWave — one BtWavetable entry that keeps a list of BtWavelevels
BtWavelevel — a single part of a BtWave item
BtWavetable — the list of BtWave items in a BtSong
BtWire — class for a connection of two BtMachines
BtWirePattern — class for an event pattern of a BtMachine instance
buzztard-0.6.0/docs/reference/bt-core/html/home.png0000644042355400116100000000121611675570702017146 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚buzztard-0.6.0/docs/reference/bt-core/html/buzztard-core.devhelp20000644042355400116100000016054711675570702021753 00000000000000 buzztard-0.6.0/docs/reference/bt-core/html/BtSongInfo.html0000644042355400116100000003266611675570702020423 00000000000000 BtSongInfo

BtSongInfo

BtSongInfo — class that keeps the meta-data for a BtSong instance

Synopsis

#include <libbtcore/core.h>

struct              BtSongInfo;
BtSongInfo *        bt_song_info_new                    (const BtSong * const song);

Object Hierarchy

  GObject
   +----BtSongInfo

Implemented Interfaces

BtSongInfo implements

Properties

  "author"                   gchar*                : Read / Write
  "bars"                     gulong                : Read / Write
  "bpm"                      gulong                : Read / Write
  "change-dts"               gchar*                : Read / Write
  "create-dts"               gchar*                : Read / Write
  "file-name"                gchar*                : Read / Write
  "genre"                    gchar*                : Read / Write
  "info"                     gchar*                : Read / Write
  "name"                     gchar*                : Read / Write
  "song"                     BtSong*               : Read / Write / Construct Only
  "taglist"                  gpointer              : Read
  "tpb"                      gulong                : Read / Write

Description

Exposes the meta-data of a song as GObject properties. These are for one pure data fields such as author and song name. These fields get used when recording a song to a file (rendering) in the form of meta-tags.

Further there are fields that determine rythm and song-speed. The speed is determined by "bpm". The rythm is determined by "bars" and "tpb". If 'bars' is 16, than on can have 1/16 notes. And if 'ticks per beat' is 4 one will have 4 beats - a classic 4/4 meassure. For a 3/4 meassure, 'bars' would be 12. Thus bars = beats * tpb.

Details

struct BtSongInfo

struct BtSongInfo;

holds song metadata


bt_song_info_new ()

BtSongInfo *        bt_song_info_new                    (const BtSong * const song);

Create a new instance

song :

the song the new instance belongs to

Returns :

the new instance or NULL in case of an error

Property Details

The "author" property

  "author"                   gchar*                : Read / Write

songs author.

Default value: NULL


The "bars" property

  "bars"                     gulong                : Read / Write

how many bars per meassure.

Allowed values: [1,64]


The "bpm" property

  "bpm"                      gulong                : Read / Write

how many beats should be played in a minute.

Allowed values: [1,1000]


The "change-dts" property

  "change-dts"               gchar*                : Read / Write

song changed date time stamp (iso 8601 format).

Default value: NULL


The "create-dts" property

  "create-dts"               gchar*                : Read / Write

song creation date time stamp (iso 8601 format).

Default value: NULL


The "file-name" property

  "file-name"                gchar*                : Read / Write

songs file name.

Default value: NULL


The "genre" property

  "genre"                    gchar*                : Read / Write

songs genre.

Default value: NULL


The "info" property

  "info"                     gchar*                : Read / Write

songs freeform info.

Default value: "comment me!"


The "name" property

  "name"                     gchar*                : Read / Write

songs name.

Default value: "untitled song"


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

song object, the song-info belongs to.


The "taglist" property

  "taglist"                  gpointer              : Read

songs meta data as a taglist.


The "tpb" property

  "tpb"                      gulong                : Read / Write

event granularity in one beat.

Allowed values: [1,128]

buzztard-0.6.0/docs/reference/bt-core/html/BtGConfSettings.html0000644042355400116100000001071011675570702021400 00000000000000 BtGConfSettings

BtGConfSettings

BtGConfSettings — gconf based implementation sub class for buzztard settings handling

Synopsis

#include <libbtcore/core.h>

struct              BtGConfSettings;
BtGConfSettings *   bt_gconf_settings_new               (void);

Object Hierarchy

  GObject
   +----BtSettings
         +----BtGConfSettings

Description

GConf is the standart mechanism used in GNOME to handle persistance of application settings and status.

Details

struct BtGConfSettings

struct BtGConfSettings;

gconf based implementation object for a buzztard based settings


bt_gconf_settings_new ()

BtGConfSettings *   bt_gconf_settings_new               (void);

Create a new instance.

Returns :

the new instance or NULL in case of an error
buzztard-0.6.0/docs/reference/bt-core/html/BtWavelevel.html0000644042355400116100000003564611675570702020634 00000000000000 BtWavelevel

BtWavelevel

BtWavelevel — a single part of a BtWave item

Synopsis

#include <libbtcore/core.h>

#define             BT_WAVELEVEL_DEFAULT_ROOT_NOTE
struct              BtWavelevel;
BtWavelevel *       bt_wavelevel_new                    (const BtSong * const song,
                                                         const BtWave * const wave,
                                                         const guchar root_note,
                                                         const gulong length,
                                                         const glong loop_start,
                                                         const glong loop_end,
                                                         const gulong rate,
                                                         gconstpointer sample);

Object Hierarchy

  GObject
   +----BtWavelevel

Implemented Interfaces

BtWavelevel implements

Properties

  "data"                     gpointer              : Read / Write / Construct
  "length"                   gulong                : Read / Write / Construct
  "loop-end"                 glong                 : Read / Write / Construct
  "loop-start"               glong                 : Read / Write / Construct
  "rate"                     gulong                : Read / Write / Construct
  "root-note"                guchar                : Read / Write / Construct
  "song"                     BtSong*               : Read / Write / Construct Only
  "wave"                     BtWave*               : Read / Write / Construct Only

Description

BtWavelevel contain the digital audio data of a BtWave to be used for a certain key-range.

Details

BT_WAVELEVEL_DEFAULT_ROOT_NOTE

#define BT_WAVELEVEL_DEFAULT_ROOT_NOTE (1+(4*16))

Default base-note for a wavelevel (c-3).


struct BtWavelevel

struct BtWavelevel;

A tone level for a BtWave. In most cases a BtWave has only one BtWavelevel.


bt_wavelevel_new ()

BtWavelevel *       bt_wavelevel_new                    (const BtSong * const song,
                                                         const BtWave * const wave,
                                                         const guchar root_note,
                                                         const gulong length,
                                                         const glong loop_start,
                                                         const glong loop_end,
                                                         const gulong rate,
                                                         gconstpointer sample);

Create a new instance

song :

the song the new instance belongs to

wave :

the wave the new wavelevel belongs to

root_note :

the keyboard note this sample is related

length :

the number of samples

loop_start :

the start of the loop

loop_end :

the end of the loop

rate :

the sampling rate

sample :

the sample data

Returns :

the new instance or NULL in case of an error

Property Details

The "data" property

  "data"                     gpointer              : Read / Write / Construct

the sample data.


The "length" property

  "length"                   gulong                : Read / Write / Construct

length of the sample.

Allowed values: <= G_MAXINT64


The "loop-end" property

  "loop-end"                 glong                 : Read / Write / Construct

end of the sample loop.

Allowed values: >= -1

Default value: -1


The "loop-start" property

  "loop-start"               glong                 : Read / Write / Construct

start of the sample loop.

Allowed values: >= -1

Default value: -1


The "rate" property

  "rate"                     gulong                : Read / Write / Construct

sampling rate of the sample.


The "root-note" property

  "root-note"                guchar                : Read / Write / Construct

the base note associated with the sample.

Default value: 0


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Set song object, the wavelevel belongs to.


The "wave" property

  "wave"                     BtWave*               : Read / Write / Construct Only

Set wave object, the wavelevel belongs to.

buzztard-0.6.0/docs/reference/bt-core/html/pr01.html0000644042355400116100000000412611675570702017163 00000000000000 Introduction

Introduction

Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch.

The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures.

buzztard-0.6.0/docs/reference/bt-core/html/BtPattern.html0000644042355400116100000030351711675570702020312 00000000000000 BtPattern

BtPattern

BtPattern — class for an event pattern of a BtMachine instance

Synopsis

#include <libbtcore/core.h>

struct              BtPattern;
enum                BtPatternCmd;
void                bt_pattern_blend_column             (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_pattern_blend_columns            (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
BtPattern *         bt_pattern_copy                     (const BtPattern * const self);
void                bt_pattern_delete_column            (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_pattern_delete_columns           (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
void                bt_pattern_delete_full_row          (const BtPattern * const self,
                                                         const gulong tick);
void                bt_pattern_delete_row               (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
gboolean            bt_pattern_deserialize_column       (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         const gchar *data);
void                bt_pattern_flip_column              (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_pattern_flip_columns             (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
BtPatternCmd        bt_pattern_get_cmd                  (const BtPattern * const self,
                                                         const gulong tick);
gchar *             bt_pattern_get_global_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
GValue *            bt_pattern_get_global_event_data    (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
gulong              bt_pattern_get_global_param_index   (const BtPattern * const self,
                                                         const gchar * const name,
                                                         GError **error);
gchar *             bt_pattern_get_voice_event          (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);
GValue *            bt_pattern_get_voice_event_data     (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);
gulong              bt_pattern_get_voice_param_index    (const BtPattern * const self,
                                                         const gchar * const name,
                                                         GError **error);
void                bt_pattern_insert_full_row          (const BtPattern * const self,
                                                         const gulong tick);
void                bt_pattern_insert_row               (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
BtPattern *         bt_pattern_new                      (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const name,
                                                         const gulong length,
                                                         const BtMachine * const machine);
BtPattern *         bt_pattern_new_with_event           (const BtSong * const song,
                                                         const BtMachine * const machine,
                                                         const BtPatternCmd cmd);
void                bt_pattern_randomize_column         (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);
void                bt_pattern_randomize_columns        (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);
void                bt_pattern_serialize_column         (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         GString *data);
void                bt_pattern_serialize_columns        (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         GString *data);
gboolean            bt_pattern_set_global_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param,
                                                         const gchar * const value);
gboolean            bt_pattern_set_voice_event          (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param,
                                                         const gchar * const value);
gboolean            bt_pattern_test_global_event        (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);
gboolean            bt_pattern_test_voice_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);
gboolean            bt_pattern_tick_has_data            (const BtPattern * const self,
                                                         const gulong tick);

Object Hierarchy

  GObject
   +----BtPattern

Implemented Interfaces

BtPattern implements

Properties

  "id"                       gchar*                : Read / Write / Construct
  "is-internal"              gboolean              : Read / Write / Construct Only
  "length"                   gulong                : Read / Write / Construct
  "machine"                  BtMachine*            : Read / Write / Construct Only
  "name"                     gchar*                : Read / Write / Construct
  "song"                     BtSong*               : Read / Write / Construct Only
  "voices"                   gulong                : Read

Description

A pattern contains a grid of events. Events are parameter changes in BtMachine objects. The events are stored as GValues. Cells contaning NULL have no event for the parameter at the time.

Patterns can have individual length. The length is meassured in ticks. How much that is in e.g. milliseconds is determined by "bpm" and "tpm".

The number of voices (tracks) is the same in all patterns of a machine. If the voices are changed on the machine patterns resize themself.

The patterns are used in the BtSequence to form the score of a song.

Details

struct BtPattern

struct BtPattern;

Holds a sequence of events for a BtMachine.


enum BtPatternCmd

typedef enum {
  BT_PATTERN_CMD_NORMAL=0,
  BT_PATTERN_CMD_BREAK,
  BT_PATTERN_CMD_MUTE,
  BT_PATTERN_CMD_SOLO,
  BT_PATTERN_CMD_BYPASS
} BtPatternCmd;

A pattern has a command field for every tick. The commands are only used in static internal patterns.

BT_PATTERN_CMD_NORMAL

just working

BT_PATTERN_CMD_BREAK

no more notes

BT_PATTERN_CMD_MUTE

be quiet immediately

BT_PATTERN_CMD_SOLO

be the only one playing

BT_PATTERN_CMD_BYPASS

be uneffective (pass through)

bt_pattern_blend_column ()

void                bt_pattern_blend_column             (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Fade values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.3


bt_pattern_blend_columns ()

void                bt_pattern_blend_columns            (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Fade values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.3


bt_pattern_copy ()

BtPattern *         bt_pattern_copy                     (const BtPattern * const self);

Create a new instance as a copy of the given instance.

self :

the pattern to create a copy from

Returns :

the new instance or NULL in case of an error

bt_pattern_delete_column ()

void                bt_pattern_delete_column            (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Randomize values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.6


bt_pattern_delete_columns ()

void                bt_pattern_delete_columns           (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Clear values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.6


bt_pattern_delete_full_row ()

void                bt_pattern_delete_full_row          (const BtPattern * const self,
                                                         const gulong tick);

Delete row for all parameters.

self :

the pattern

tick :

the postion to delete

Since 0.3


bt_pattern_delete_row ()

void                bt_pattern_delete_row               (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Delete row for given param.

self :

the pattern

tick :

the postion to delete

param :

the parameter

Since 0.3


bt_pattern_deserialize_column ()

gboolean            bt_pattern_deserialize_column       (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         const gchar *data);

Deserializes values to start_tick to end_tick for param from data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

data :

the source data

Returns :

TRUE for success, FALSE e.g. to indicate incompative GType values for the column specified by param and the data.

Since 0.6


bt_pattern_flip_column ()

void                bt_pattern_flip_column              (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Flips values from start_tick to end_tick for param up-side down.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.6


bt_pattern_flip_columns ()

void                bt_pattern_flip_columns             (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Flips values from start_tick to end_tick for all params up-side down.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.5


bt_pattern_get_cmd ()

BtPatternCmd        bt_pattern_get_cmd                  (const BtPattern * const self,
                                                         const gulong tick);

Returns the command id in the specified tick row.

self :

the pattern to query the command from

tick :

the tick (time) position starting with 0

Returns :

the command id

bt_pattern_get_global_event ()

gchar *             bt_pattern_get_global_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Returns the string representation of the specified cell. Free it when done.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the global parameter starting with 0

Returns :

a newly allocated string with the data or NULL on error

bt_pattern_get_global_event_data ()

GValue *            bt_pattern_get_global_event_data    (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Fetches a cell from the given location in the pattern. If there is no event there, then the GValue is uninitialized. Test with BT_IS_GVALUE(event).

self :

the pattern to search for the global param

tick :

the tick (time) position starting with 0

param :

the number of the global parameter starting with 0

Returns :

the GValue or NULL if out of the pattern range

bt_pattern_get_global_param_index ()

gulong              bt_pattern_get_global_param_index   (const BtPattern * const self,
                                                         const gchar * const name,
                                                         GError **error);

Searches the list of registered dparam of the machine the pattern belongs to for a global dparam of the given name and returns the index if found.

self :

the pattern to search for the global dparam

name :

the name of the global dparam

error :

pointer to an error variable

Returns :

the index. If an error occurs the function returns 0 and sets the error variable. You should always check for error if you use this function.

bt_pattern_get_voice_event ()

gchar *             bt_pattern_get_voice_event          (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);

Returns the string representation of the specified cell. Free it when done.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

voice :

the voice number starting with 0

param :

the number of the global parameter starting with 0

Returns :

a newly allocated string with the data or NULL on error

bt_pattern_get_voice_event_data ()

GValue *            bt_pattern_get_voice_event_data     (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);

Fetches a cell from the given location in the pattern. If there is no event there, then the GValue is uninitialized. Test with BT_IS_GVALUE(event).

self :

the pattern to search for the voice param

tick :

the tick (time) position starting with 0

voice :

the voice number starting with 0

param :

the number of the voice parameter starting with 0

Returns :

the GValue or NULL if out of the pattern range

bt_pattern_get_voice_param_index ()

gulong              bt_pattern_get_voice_param_index    (const BtPattern * const self,
                                                         const gchar * const name,
                                                         GError **error);

Searches the list of registered dparam of the machine the pattern belongs to for a voice dparam of the given name and returns the index if found.

self :

the pattern to search for the voice dparam

name :

the name of the voice dparam

error :

pointer to an error variable

Returns :

the index. If an error occurs the function returns 0 and sets the error variable. You should always check for error if you use this function.

bt_pattern_insert_full_row ()

void                bt_pattern_insert_full_row          (const BtPattern * const self,
                                                         const gulong tick);

Insert one empty row for all parameters.

self :

the pattern

tick :

the postion to insert at

Since 0.3


bt_pattern_insert_row ()

void                bt_pattern_insert_row               (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Insert one empty row for given param.

self :

the pattern

tick :

the postion to insert at

param :

the parameter

Since 0.3


bt_pattern_new ()

BtPattern *         bt_pattern_new                      (const BtSong * const song,
                                                         const gchar * const id,
                                                         const gchar * const name,
                                                         const gulong length,
                                                         const BtMachine * const machine);

Create a new instance. It will be automatically added to the machines pattern list.

song :

the song the new instance belongs to

id :

the id, we can use to lookup the pattern

name :

the display name of the pattern

length :

the number of ticks

machine :

the machine the pattern belongs to

Returns :

the new instance or NULL in case of an error

bt_pattern_new_with_event ()

BtPattern *         bt_pattern_new_with_event           (const BtSong * const song,
                                                         const BtMachine * const machine,
                                                         const BtPatternCmd cmd);

Create a new default pattern instance containg the given cmd event. It will be automatically added to the machines pattern list. If cmd is BT_PATTERN_CMD_NORMAL use bt_pattern_new() instead.

Don't call this from applications.

song :

the song the new instance belongs to

machine :

the machine the pattern belongs to

cmd :

a BtPatternCmd

Returns :

the new instance or NULL in case of an error

bt_pattern_randomize_column ()

void                bt_pattern_randomize_column         (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param);

Randomize values from start_tick to end_tick for param.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

Since 0.3


bt_pattern_randomize_columns ()

void                bt_pattern_randomize_columns        (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick);

Randomize values from start_tick to end_tick for all params.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

Since 0.3


bt_pattern_serialize_column ()

void                bt_pattern_serialize_column         (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         const gulong param,
                                                         GString *data);

Serializes values from start_tick to end_tick for param into data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

param :

the parameter

data :

the target

Since 0.6


bt_pattern_serialize_columns ()

void                bt_pattern_serialize_columns        (const BtPattern * const self,
                                                         const gulong start_tick,
                                                         const gulong end_tick,
                                                         GString *data);

Serializes values from start_tick to end_tick for all params into data.

self :

the pattern

start_tick :

the start postion for the range

end_tick :

the end postion for the range

data :

the target

Since 0.6


bt_pattern_set_global_event ()

gboolean            bt_pattern_set_global_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param,
                                                         const gchar * const value);

Stores the supplied value into the specified pattern cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the global parameter starting with 0

value :

the string representation of the value to store

Returns :

TRUE for success

bt_pattern_set_voice_event ()

gboolean            bt_pattern_set_voice_event          (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param,
                                                         const gchar * const value);

Stores the supplied value into the specified pattern cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

voice :

the voice number starting with 0

param :

the number of the global parameter starting with 0

value :

the string representation of the value to store

Returns :

TRUE for success

bt_pattern_test_global_event ()

gboolean            bt_pattern_test_global_event        (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong param);

Tests if there is an event in the specified cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

param :

the number of the global parameter starting with 0

Returns :

TRUE if there is an event

bt_pattern_test_voice_event ()

gboolean            bt_pattern_test_voice_event         (const BtPattern * const self,
                                                         const gulong tick,
                                                         const gulong voice,
                                                         const gulong param);

Tests if there is an event in the specified cell.

self :

the pattern the cell belongs to

tick :

the tick (time) position starting with 0

voice :

the voice number starting with 0

param :

the number of the global parameter starting with 0

Returns :

TRUE if there is an event

bt_pattern_tick_has_data ()

gboolean            bt_pattern_tick_has_data            (const BtPattern * const self,
                                                         const gulong tick);

Check if there are any event in the given pattern-row.

self :

the pattern to check

tick :

the tick index in the pattern

Returns :

TRUE is there are events, FALSE otherwise

Property Details

The "id" property

  "id"                       gchar*                : Read / Write / Construct

pattern identifier (unique per song).

Default value: "unamed pattern"


The "is-internal" property

  "is-internal"              gboolean              : Read / Write / Construct Only

internal (cmd-pattern) indicator.

Default value: FALSE


The "length" property

  "length"                   gulong                : Read / Write / Construct

length of the pattern in ticks.

Allowed values: >= 1


The "machine" property

  "machine"                  BtMachine*            : Read / Write / Construct Only

Machine object, the pattern belongs to.


The "name" property

  "name"                     gchar*                : Read / Write / Construct

the display-name of the pattern.

Default value: "unamed"


The "song" property

  "song"                     BtSong*               : Read / Write / Construct Only

Song object, the pattern belongs to.


The "voices" property

  "voices"                   gulong                : Read

number of voices in the pattern.

Signal Details

The "global-param-changed" signal

void                user_function                      (BtPattern *self,
                                                        gulong     tick,
                                                        gulong     param,
                                                        gpointer   user_data)      : No Hooks

signals that a global param of this pattern has been changed

self :

the pattern object that emitted the signal

tick :

the tick position inside the pattern

param :

the global parameter index

user_data :

user data set when the signal handler was connected.

The "pattern-changed" signal

void                user_function                      (BtPattern *self,
                                                        gboolean   intermediate,
                                                        gpointer   user_data)         : No Hooks

Signals that this pattern has been changed (more than in one place). When doing e.g. lin inserts, one will receive two updtes, one before and one after. The first will have intermediate=TRUE. Applications can use that to defer change-consolidation.

self :

the pattern object that emitted the signal

intermediate :

boolean flag that is TRUE to signal that more change are comming

user_data :

user data set when the signal handler was connected.

The "voice-param-changed" signal

void                user_function                      (BtPattern *self,
                                                        gulong     tick,
                                                        gulong     voice,
                                                        gulong     param,
                                                        gpointer   user_data)      : No Hooks

signals that a voice param of this pattern has been changed

self :

the pattern object that emitted the signal

tick :

the tick position inside the pattern

voice :

the voice number

param :

the voice parameter index

user_data :

user data set when the signal handler was connected.
buzztard-0.6.0/docs/reference/bt-core/buzztard-core.types0000644042355400116100000000115511675570702020427 00000000000000#include "libbuzztard-core/core.h" bt_application_get_type bt_child_proxy_get_type bt_gconf_settings_get_type bt_machine_get_type bt_pattern_get_type bt_persistence_get_type %bt_plainfile_settings_get_type bt_processor_machine_get_type bt_sequence_get_type bt_settings_get_type bt_setup_get_type bt_sink_bin_get_type bt_sink_machine_get_type bt_song_get_type bt_song_info_get_type bt_song_io_get_type bt_song_io_native_bzt_get_type bt_song_io_native_get_type bt_song_io_native_xml_get_type bt_source_machine_get_type bt_wave_get_type bt_wavelevel_get_type bt_wavetable_get_type bt_wire_get_type bt_wire_pattern_get_type buzztard-0.6.0/docs/reference/bt-core/buzztard-core-overrides.txt0000644042355400116100000000000011576377676022105 00000000000000buzztard-0.6.0/docs/reference/bt-core/buzztard-core-docs.sgml0000644042355400116100000001622011612311725021137 00000000000000 %version-entities; ]> Buzztard Bt-Core Reference Manual for Buzztard &BT_VERSION;. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-core/. Introduction Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch. The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures. Overview Conventions During the API docs some conventions are used to avoid duplication and improve precision. It is never valid to supply NULL for an object reference, unless it is explicitly said so. Methods do checking of preconditions using g_return_if_fail() or g_return_val_if_fail(). Therefore watch for the glib log messages indicating wrong API usage. All methods that return a pointer to an object, increase the reference counter. Therefore you should do release this reference by calling g_object_unref() when you are done with the object. When a return value is marked as const e.g. const gchar * or const BtObjectName * then this is a static reference. You must not call g_free() or g_object_unref() on it. API Reference libbtcore is the main library for the buzztard software system. This library contains all classes needed for the components of a song like machines, patterns, wires and so on. It further defines bases classes for common operations such as song input/output. The synthesis engine and the low-level parts of the sequencer are built into GStreamer. Please make sure you have read section conventions before reading further. All data structures are encapsulated in objects based on GObject. Central starting points are BtApplication and BtSong. All the objects that belong to a song have their song-instance as their member. Likewise all objects that belong to the applications have their application instance as a member. Core Class Reference Song Class Reference Appendix Object Hierarchy API Index Index of deprecated API Index of new API in 0.3 Index of new API in 0.5 Index of new API in 0.6 buzztard-0.6.0/docs/reference/bt-core/Makefile.in0000644042355400116100000006716611675570633016634 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ 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@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/buzztard-core.types.in $(top_srcdir)/gtk-doc.make subdir = docs/reference/bt-core ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = buzztard-core.types CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE = buzztard-core # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/src/lib/core # Extra options to pass to gtkdoc-scangobj. Not normally needed. #SCANGOBJ_OPTIONS=--type-init-func="do { void gst_init(int *argc,char **argv[]);g_type_init();gst_init(&argc,&argv); } while (0)" #SCANGOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv)" SCANGOBJ_OPTIONS = --type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. # --rebuild-types requires gtk-doc 1.8 SCAN_OPTIONS = --deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS = --sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB = $(top_srcdir)/src/lib/core/libbuzztard-core/*.h CFILE_GLOB = $(top_srcdir)/src/lib/core/*.c # Header files to ignore when scanning. IGNORE_HFILES = core_private.h settings-private.h marshal.h version.h \ plainfile-settings.h # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) @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) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # include generic part # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE).types 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) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # Comment this out if you want your docs-status tested during 'make check' @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @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: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_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/bt-core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/bt-core/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): buzztard-core.types: $(top_builddir)/config.status $(srcdir)/buzztard-core.types.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(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 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." 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: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-libtool clean-local 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 uninstall uninstall-am \ uninstall-local @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_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) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ 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 @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building 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) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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 \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs 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) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @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 # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc 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 # 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: buzztard-0.6.0/docs/reference/bt-core/buzztard-core.types.in0000644042355400116100000000117611625555571021041 00000000000000#include "libbuzztard-core/core.h" bt_application_get_type bt_child_proxy_get_type @GCONF_DOC_TYPES@bt_gconf_settings_get_type bt_machine_get_type bt_pattern_get_type bt_persistence_get_type %bt_plainfile_settings_get_type bt_processor_machine_get_type bt_sequence_get_type bt_settings_get_type bt_setup_get_type bt_sink_bin_get_type bt_sink_machine_get_type bt_song_get_type bt_song_info_get_type bt_song_io_get_type bt_song_io_native_bzt_get_type bt_song_io_native_get_type bt_song_io_native_xml_get_type bt_source_machine_get_type bt_wave_get_type bt_wavelevel_get_type bt_wavetable_get_type bt_wire_get_type bt_wire_pattern_get_type buzztard-0.6.0/docs/reference/bt-core/buzztard-core-sections.txt0000644042355400116100000003434511675570702021736 00000000000000# $Id: buzztard-core-sections.txt 3714 2011-12-01 11:24:32Z ensonic $ # :mode=html: # please add section in the alpahbetical order using the following template #
# btxxx # BtXxx # #
libbtcore/core.h
btapplication BtApplication BtApplication BT_APPLICATION BT_APPLICATION_CLASS BT_APPLICATION_GET_CLASS BT_IS_APPLICATION BT_IS_APPLICATION_CLASS BT_TYPE_APPLICATION BtApplicationClass BtApplicationPrivate bt_application_get_type
btchildproxy BtChildProxy BtChildProxyInterface bt_child_proxy_get bt_child_proxy_get_child_by_index bt_child_proxy_get_child_by_name bt_child_proxy_get_children_count bt_child_proxy_get_property bt_child_proxy_get_valist bt_child_proxy_lookup bt_child_proxy_set bt_child_proxy_set_property bt_child_proxy_set_valist BT_CHILD_PROXY BT_CHILD_PROXY_GET_INTERFACE BT_IS_CHILD_PROXY BT_TYPE_CHILD_PROXY bt_child_proxy_get_type
btgconfsettings BtGConfSettings BtGConfSettings bt_gconf_settings_new BT_GCONF_SETTINGS BT_GCONF_SETTINGS_CLASS BT_GCONF_SETTINGS_GET_CLASS BT_IS_GCONF_SETTINGS BT_IS_GCONF_SETTINGS_CLASS BT_TYPE_GCONF_SETTINGS BtGConfSettingsClass BtGConfSettingsPrivate bt_gconf_settings_get_type
btmachine BtMachine BtMachine BtMachineClass BtMachineState bt_machine_activate_adder bt_machine_activate_spreader bt_machine_add_pattern bt_machine_bind_parameter_control bt_machine_describe_global_param_value bt_machine_describe_voice_param_value bt_machine_enable_input_gain bt_machine_enable_input_post_level bt_machine_enable_input_pre_level bt_machine_enable_output_gain bt_machine_enable_output_post_level bt_machine_enable_output_pre_level bt_machine_get_global_param_details bt_machine_get_global_param_index bt_machine_get_global_param_name bt_machine_get_global_param_no_value bt_machine_get_global_param_spec bt_machine_get_global_param_type bt_machine_get_global_wave_param_index bt_machine_get_pattern_by_id bt_machine_get_pattern_by_index bt_machine_get_pattern_by_name bt_machine_get_unique_pattern_name bt_machine_get_voice_param_details bt_machine_get_voice_param_index bt_machine_get_voice_param_name bt_machine_get_voice_param_no_value bt_machine_get_voice_param_spec bt_machine_get_voice_param_type bt_machine_get_voice_wave_param_index bt_machine_get_wire_by_dst_machine bt_machine_global_controller_change_value bt_machine_has_active_adder bt_machine_has_active_spreader bt_machine_has_patterns bt_machine_is_global_param_no_value bt_machine_is_global_param_trigger bt_machine_is_polyphonic bt_machine_is_voice_param_no_value bt_machine_is_voice_param_trigger bt_machine_randomize_parameters bt_machine_remove_pattern bt_machine_reset_parameters bt_machine_set_global_param_default bt_machine_set_global_param_value bt_machine_set_param_defaults bt_machine_set_voice_param_default bt_machine_set_voice_param_value bt_machine_unbind_parameter_control bt_machine_unbind_parameter_controls bt_machine_voice_controller_change_value bt_machine_dbg_dump_global_controller_queue bt_machine_dbg_dump_voice_controller_queue bt_machine_dbg_print_parts bt_machine_get_element_list BT_IS_MACHINE BT_IS_MACHINE_CLASS BT_MACHINE BT_MACHINE_CLASS BT_MACHINE_GET_CLASS BT_TYPE_MACHINE BT_TYPE_MACHINE_STATE BtMachinePrivate bt_machine_get_type bt_machine_state_get_type
btpattern BtPattern BtPattern BtPatternCmd bt_pattern_blend_column bt_pattern_blend_columns bt_pattern_copy bt_pattern_delete_column bt_pattern_delete_columns bt_pattern_delete_full_row bt_pattern_delete_row bt_pattern_deserialize_column bt_pattern_flip_column bt_pattern_flip_columns bt_pattern_get_cmd bt_pattern_get_global_event bt_pattern_get_global_event_data bt_pattern_get_global_param_index bt_pattern_get_voice_event bt_pattern_get_voice_event_data bt_pattern_get_voice_param_index bt_pattern_insert_full_row bt_pattern_insert_row bt_pattern_new bt_pattern_new_with_event bt_pattern_randomize_column bt_pattern_randomize_columns bt_pattern_serialize_column bt_pattern_serialize_columns bt_pattern_set_global_event bt_pattern_set_voice_event bt_pattern_test_global_event bt_pattern_test_voice_event bt_pattern_tick_has_data BT_IS_PATTERN BT_IS_PATTERN_CLASS BT_PATTERN BT_PATTERN_CLASS BT_PATTERN_GET_CLASS BT_TYPE_PATTERN BT_TYPE_PATTERN_CMD BtPatternClass BtPatternPrivate bt_pattern_cmd_get_type bt_pattern_get_type
btpersistence BtPersistence BtPersistenceInterface bt_persistence_collect_hashtable_entries bt_persistence_get_value bt_persistence_load bt_persistence_load_hashtable bt_persistence_parse_enum bt_persistence_save bt_persistence_save_hashtable bt_persistence_save_list bt_persistence_set_value bt_persistence_strfmt_double bt_persistence_strfmt_enum bt_persistence_strfmt_long bt_persistence_strfmt_uchar bt_persistence_strfmt_ulong BT_IS_PERSISTENCE BT_PERSISTENCE BT_PERSISTENCE_GET_INTERFACE BT_TYPE_PERSISTENCE BtPersistence bt_persistence_get_type
btprocessormachine BtProcessorMachine BtProcessorMachine BtProcessorMachinePatternIndex bt_processor_machine_new BT_IS_PROCESSOR_MACHINE BT_IS_PROCESSOR_MACHINE_CLASS BT_PROCESSOR_MACHINE BT_PROCESSOR_MACHINE_CLASS BT_PROCESSOR_MACHINE_GET_CLASS BT_TYPE_PROCESSOR_MACHINE BtProcessorMachineClass bt_processor_machine_get_type
btsequence BtSequence BtSequence bt_sequence_add_track bt_sequence_delete_full_rows bt_sequence_delete_rows bt_sequence_get_bar_time bt_sequence_get_label bt_sequence_get_loop_time bt_sequence_get_machine bt_sequence_get_pattern bt_sequence_get_tick_by_pattern bt_sequence_get_track_by_machine bt_sequence_insert_full_rows bt_sequence_insert_rows bt_sequence_is_pattern_used bt_sequence_limit_play_pos bt_sequence_move_track_left bt_sequence_move_track_right bt_sequence_new bt_sequence_remove_track_by_ix bt_sequence_remove_track_by_machine bt_sequence_repair_damage bt_sequence_set_label bt_sequence_set_pattern bt_sequence_set_pattern_quick bt_sequence_update_tempo BT_IS_SEQUENCE BT_IS_SEQUENCE_CLASS BT_SEQUENCE BT_SEQUENCE_CLASS BT_SEQUENCE_GET_CLASS BT_TYPE_SEQUENCE BtSequenceClass BtSequencePrivate bt_sequence_get_type
btsettings BtSettings BtSettings BtSettingsFactory bt_settings_determine_audiosink_name bt_settings_make bt_settings_set_factory BT_IS_SETTINGS BT_IS_SETTINGS_CLASS BT_SETTINGS BT_SETTINGS_CLASS BT_SETTINGS_GET_CLASS BT_TYPE_SETTINGS BtSettingsClass bt_settings_get_type
btsetup BtSetup BtSetup bt_setup_add_machine bt_setup_add_wire bt_setup_get_machine_by_id bt_setup_get_machine_by_type bt_setup_get_machines_by_type bt_setup_get_unique_machine_id bt_setup_get_wire_by_dst_machine bt_setup_get_wire_by_machines bt_setup_get_wire_by_src_machine bt_setup_get_wires_by_dst_machine bt_setup_get_wires_by_src_machine bt_setup_new bt_setup_remember_missing_machine bt_setup_remove_machine bt_setup_remove_wire BT_IS_SETUP BT_IS_SETUP_CLASS BT_SETUP BT_SETUP_CLASS BT_SETUP_GET_CLASS BT_TYPE_SETUP BtSetupClass BtSetupPrivate bt_setup_get_type
btsinkbin BtSinkBin BtSinkBin BtSinkBinMode BtSinkBinRecordFormat BT_IS_SINK_BIN BT_IS_SINK_BIN_CLASS BT_SINK_BIN BT_SINK_BIN_CLASS BT_SINK_BIN_GET_CLASS BT_TYPE_SINK_BIN BT_TYPE_SINK_BIN_MODE BT_TYPE_SINK_BIN_RECORD_FORMAT BtSinkBinClass BtSinkBinPrivate bt_sink_bin_get_type bt_sink_bin_mode_get_type bt_sink_bin_record_format_get_type
btsinkmachine BtSinkMachine BtSinkMachine BtSinkMachinePatternIndex bt_sink_machine_new BT_IS_SINK_MACHINE BT_IS_SINK_MACHINE_CLASS BT_SINK_MACHINE BT_SINK_MACHINE_CLASS BT_SINK_MACHINE_GET_CLASS BT_TYPE_SINK_MACHINE BtSinkMachineClass bt_sink_machine_get_type
btsong BtSong BtSong BtSongClass bt_song_continue bt_song_new bt_song_pause bt_song_play bt_song_stop bt_song_update_playback_position bt_song_write_to_highlevel_dot_file bt_song_write_to_lowlevel_dot_file BT_IS_SONG BT_IS_SONG_CLASS BT_SONG BT_SONG_CLASS BT_SONG_GET_CLASS BT_TYPE_SONG BtSongPrivate bt_song_get_type
btsonginfo BtSongInfo BtSongInfo bt_song_info_new BT_IS_SONG_INFO BT_IS_SONG_INFO_CLASS BT_SONG_INFO BT_SONG_INFO_CLASS BT_SONG_INFO_GET_CLASS BT_TYPE_SONG_INFO BtSongInfoClass BtSongInfoPrivate bt_song_info_get_type
btsongio BtSongIO BT_SONG_IO_MODULE_INFO_MAX_FORMATS BtSongIO BtSongIOClass BtSongIOFormatInfo BtSongIOInit BtSongIOModuleInfo bt_song_io_from_data bt_song_io_from_file bt_song_io_get_module_info_list bt_song_io_load bt_song_io_save bt_song_io_virtual_load bt_song_io_virtual_save BT_IS_SONG_IO BT_IS_SONG_IO_CLASS BT_SONG_IO BT_SONG_IO_CLASS BT_SONG_IO_GET_CLASS BT_TYPE_SONG_IO BtSongIOPrivate bt_song_io_get_type
btsongionative BtSongIONative BtSongIONative BtSongIONativeClass bt_song_io_native_module_info BT_IS_SONG_IO_NATIVE BT_IS_SONG_IO_NATIVE_CLASS BT_SONG_IO_NATIVE BT_SONG_IO_NATIVE_CLASS BT_SONG_IO_NATIVE_GET_CLASS BT_TYPE_SONG_IO_NATIVE bt_song_io_native_get_type
btsongionativebzt BtSongIONativeBZT BtSongIONativeBZT BtSongIONativeBZTClass bt_song_io_native_bzt_copy_from_uri bt_song_io_native_bzt_copy_to_fd BT_IS_SONG_IO_NATIVE_BZT BT_IS_SONG_IO_NATIVE_BZT_CLASS BT_SONG_IO_NATIVE_BZT BT_SONG_IO_NATIVE_BZT_CLASS BT_SONG_IO_NATIVE_BZT_GET_CLASS BT_TYPE_SONG_IO_NATIVE_BZT BtSongIONativeBZTPrivate bt_song_io_native_bzt_get_type
btsongionativexml BtSongIONativeXML BtSongIONativeXML BtSongIONativeXMLClass BT_IS_SONG_IO_NATIVE_XML BT_IS_SONG_IO_NATIVE_XML_CLASS BT_SONG_IO_NATIVE_XML BT_SONG_IO_NATIVE_XML_CLASS BT_SONG_IO_NATIVE_XML_GET_CLASS BT_TYPE_SONG_IO_NATIVE_XML bt_song_io_native_xml_get_type
btsourcemachine BtSourceMachine BtSourceMachine BtSourceMachinePatternIndex bt_source_machine_new BT_IS_SOURCE_MACHINE BT_IS_SOURCE_MACHINE_CLASS BT_SOURCE_MACHINE BT_SOURCE_MACHINE_CLASS BT_SOURCE_MACHINE_GET_CLASS BT_TYPE_SOURCE_MACHINE BtSourceMachineClass bt_source_machine_get_type
btwave BtWave BtWave BtWaveLoopMode bt_wave_add_wavelevel bt_wave_get_level_by_index bt_wave_new BT_IS_WAVE BT_IS_WAVE_CLASS BT_TYPE_WAVE BT_TYPE_WAVE_LOOP_MODE BT_WAVE BT_WAVE_CLASS BT_WAVE_GET_CLASS BtWaveClass BtWavePrivate bt_wave_get_type bt_wave_loop_mode_get_type
btwavelevel BtWavelevel BT_WAVELEVEL_DEFAULT_ROOT_NOTE BtWavelevel bt_wavelevel_new BT_IS_WAVELEVEL BT_IS_WAVELEVEL_CLASS BT_TYPE_WAVELEVEL BT_WAVELEVEL BT_WAVELEVEL_CLASS BT_WAVELEVEL_GET_CLASS BtWavelevelClass BtWavelevelPrivate bt_wavelevel_get_type
btwavetable BtWavetable BtWavetable bt_wavetable_add_wave bt_wavetable_get_wave_by_index bt_wavetable_new bt_wavetable_remember_missing_wave bt_wavetable_remove_wave BT_IS_WAVETABLE BT_IS_WAVETABLE_CLASS BT_TYPE_WAVETABLE BT_WAVETABLE BT_WAVETABLE_CLASS BT_WAVETABLE_GET_CLASS BtWavetableClass BtWavetablePrivate bt_wavetable_get_type
btwire BtWire BT_WIRE_MAX_NUM_PARAMS BtWire bt_wire_add_wire_pattern bt_wire_controller_change_value bt_wire_get_param_details bt_wire_get_param_index bt_wire_get_param_name bt_wire_get_param_spec bt_wire_get_param_type bt_wire_get_pattern bt_wire_new bt_wire_reconnect bt_wire_dbg_print_parts bt_wire_get_element_list BT_IS_WIRE BT_IS_WIRE_CLASS BT_TYPE_WIRE BT_WIRE BT_WIRE_CLASS BT_WIRE_GET_CLASS BtWireClass BtWirePrivate bt_wire_get_type
btwirepattern BtWirePattern BtWirePattern bt_wire_pattern_blend_column bt_wire_pattern_blend_columns bt_wire_pattern_copy bt_wire_pattern_delete_column bt_wire_pattern_delete_columns bt_wire_pattern_delete_full_row bt_wire_pattern_delete_row bt_wire_pattern_deserialize_column bt_wire_pattern_flip_column bt_wire_pattern_flip_columns bt_wire_pattern_get_event bt_wire_pattern_get_event_data bt_wire_pattern_insert_full_row bt_wire_pattern_insert_row bt_wire_pattern_new bt_wire_pattern_randomize_column bt_wire_pattern_randomize_columns bt_wire_pattern_serialize_column bt_wire_pattern_serialize_columns bt_wire_pattern_set_event bt_wire_pattern_test_event bt_wire_pattern_tick_has_data BT_IS_WIRE_PATTERN BT_IS_WIRE_PATTERN_CLASS BT_TYPE_WIRE_PATTERN BT_WIRE_PATTERN BT_WIRE_PATTERN_CLASS BT_WIRE_PATTERN_GET_CLASS BtWirePatternClass BtWirePatternPrivate bt_wire_pattern_get_type
libbtcore libbtcore BT_IS_GVALUE BT_IS_STRING bt_cpu_load_get_current bt_init bt_init_add_option_groups bt_init_check bt_init_get_option_group bt_deinit bt_major_version bt_micro_version bt_minor_version return_if_disposed return_val_if_disposed safe_string # glib extras G_OBJECT_REF_COUNT G_POINTER_ALIAS bt_g_type_get_base_type g_object_try_ref g_object_try_unref g_object_try_weak_ref g_object_try_weak_unref # gstreamer extras bt_bin_activate_tee_chain bt_bin_deactivate_tee_chain bt_gst_check_core_elements bt_gst_check_elements bt_gst_debug_pad_link_return bt_gst_element_factory_can_sink_media_type bt_gst_registry_get_element_factories_matching_all_categories bt_gst_registry_get_element_names_matching_all_categories # glib extras G_OPTION_FLAG_NO_ARG G_PARAM_STATIC_STRINGS G_DEFINE_INTERFACE G_DEFINE_INTERFACE_WITH_CODE # gstreamer extras GST_CAT_DEFAULT GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS
buzztard-0.6.0/docs/reference/bt-core/Makefile.am0000644042355400116100000000563211625765240016604 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE=buzztard-core # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src/lib/core # Extra options to pass to gtkdoc-scangobj. Not normally needed. #SCANGOBJ_OPTIONS=--type-init-func="do { void gst_init(int *argc,char **argv[]);g_type_init();gst_init(&argc,&argv); } while (0)" #SCANGOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv)" SCANGOBJ_OPTIONS=--type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. # --rebuild-types requires gtk-doc 1.8 SCAN_OPTIONS=--deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS=--sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB=$(top_srcdir)/src/lib/core/libbuzztard-core/*.h CFILE_GLOB=$(top_srcdir)/src/lib/core/*.c # Header files to ignore when scanning. IGNORE_HFILES=core_private.h settings-private.h marshal.h version.h \ plainfile-settings.h # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) # include generic part include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += $(DOC_MODULE).types # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif buzztard-0.6.0/docs/reference/bt-cmd/0000755042355400116100000000000011675570704014441 500000000000000buzztard-0.6.0/docs/reference/bt-cmd/html/0000755042355400116100000000000011675570704015405 500000000000000buzztard-0.6.0/docs/reference/bt-cmd/html/pt02.html0000644042355400116100000000353411675570704017005 00000000000000 Part IV. Appendix

Part IV. Appendix

buzztard-0.6.0/docs/reference/bt-cmd/html/buzztard-cmd-ops.html0000644042355400116100000000757311675570704021434 00000000000000 buzztard-cmd

buzztard-cmd

buzztard-cmd — work with buzztard songs

Synopsis

buzztard-cmd [options...]

Description

buzztard-cmd can be used to inspect, play and convert buzztard songs from the commandline.

Invocation

buzztard-cmd takes a mandatory argument that specifies the command and extra options depending on the command.

Options

-q, --quiet

Be quiet (no verbose ouput when running)

-c, --command command-name

The command to exeute, one of: info, play, convert, encode

-i, --input-file song-filename

The input filename. This should be a song file buzztard can handle.

-o, --output-file song-filename

The output filename. Depending on the command this is the result of the file-format conversion or the song-rendering.

-h, --help

Print brief help and exit.

--version

Print version and exit.

buzztard-0.6.0/docs/reference/bt-cmd/html/right.png0000644042355400116100000000073011675570704017150 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2 I%Á=eIDATxœ­”!oÂ@†Ÿ.'**M0$ÄÁ$¿?1~¢vIeEuLlÉ&–Ô4‚ä Í¶B»Ý›œ¹|÷>ï—ûî …$ݶ©oc<”´ÑA©¤×€X’òŸW¶lC'?“tk;|/t*I»ÝN«ÕÊZø^`Œy•4ë÷ûšN§r]×® çJÒÌó<«’½À“Út»Ýú€à`±Xàºî1@p´ä€¸d½÷ŽZ')høÖÚK¬ ª$V?%Å]€­+³L’sgUKà"ÿw5â3O·•ÜòIEND®B`‚buzztard-0.6.0/docs/reference/bt-cmd/html/api-index.html0000644042355400116100000000700611675570704020074 00000000000000 API Index buzztard-0.6.0/docs/reference/bt-cmd/html/api-index-deprecated.html0000644042355400116100000000272011675570704022170 00000000000000 Index of deprecated API

Index of deprecated API

buzztard-0.6.0/docs/reference/bt-cmd/html/up.png0000644042355400116100000000062611675570704016463 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ2.œE€Ù#IDATxœí“=JÄ@F¿o‰] !+¤œ2…Å[ZÌ<@/á<€¥…XÛ Ú­20v±³ˆÂ…Ïj0»lþvV°ðA`˜ ïÍ ð—t*iùâHÒ­~xR~'IUUÉ9ç#OÁ‘my–eJÓTeY†GvÉ@x¤O#ß;2E>9²|t$DÞ9nnBäíÈjµò‘BRIsIªë:HîŸ8ŽU…œùëùPÖÚN™1fc­sNÎ95Mã§–ɵ¤ ׿ŸØŒ1~¸pEòe$ïIž°€Ç î7nrDòf!;Ã`¨çÝ'äykíÎI’øáû䲤sI_]ÿÇy—‡‘€ÅÀ^^I>O>Á¡ø­§²š?YBIEND®B`‚buzztard-0.6.0/docs/reference/bt-cmd/html/pt01.html0000644042355400116100000000300011675570704016770 00000000000000 Part I. Overview

Part I. Overview

buzztard-0.6.0/docs/reference/bt-cmd/html/style.css0000644042355400116100000001210011675570704017171 00000000000000.synopsis, .classsynopsis { /* tango:aluminium 1/2 */ background: #eeeeec; border: solid 1px #d3d7cf; padding: 0.5em; } .programlisting { /* tango:sky blue 0/1 */ background: #e6f3ff; border: solid 1px #729fcf; padding: 0.5em; } .variablelist { padding: 4px; margin-left: 3em; } .variablelist td:first-child { vertical-align: top; } @media screen { sup a.footnote { position: relative; top: 0em ! important; } /* this is needed so that the local anchors are displayed below the naviagtion */ div.footnote a[name], div.refnamediv a[name], div.refsect1 a[name], div.refsect2 a[name], div.index a[name], div.glossary a[name], div.sect1 a[name] { display: inline-block; position: relative; top:-5em; } /* this seems to be a bug in the xsl style sheets when generating indexes */ div.index div.index { top: 0em; } /* make space for the fixed navigation bar and add space at the bottom so that * link targets appear somewhat close to top */ body { padding-top: 3.2em; padding-bottom: 20em; } /* style and size the navigation bar */ table.navigation#top { position: fixed; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; z-index: 10; } .navigation a, .navigation a:visited { /* tango:scarlet red 3 */ color: #a40000; } .navigation a:hover { /* tango:scarlet red 1 */ color: #ef2929; } td.shortcuts { /* tango:scarlet red 1 */ color: #ef2929; font-size: 80%; white-space: nowrap; } } @media print { table.navigation { visibility: collapse; display: none; } div.titlepage table.navigation { visibility: visible; display: table; /* tango:scarlet red 0/1 */ background: #ffe6e6; border: solid 1px #ef2929; margin-top: 0; margin-bottom: 0; top: 0; left: 0; height: 3em; } } .navigation .title { font-size: 200%; } div.gallery-float { float: left; padding: 10px; } div.gallery-float img { border-style: none; } div.gallery-spacer { clear: both; } a, a:visited { text-decoration: none; /* tango:sky blue 2 */ color: #3465a4; } a:hover { text-decoration: underline; /* tango:sky blue 1 */ color: #729fcf; } div.table table { border-collapse: collapse; border-spacing: 0px; /* tango:aluminium 3 */ border: solid 1px #babdb6; } div.table table td, div.table table th { /* tango:aluminium 3 */ border: solid 1px #babdb6; padding: 3px; vertical-align: top; } div.table table th { /* tango:aluminium 2 */ background-color: #d3d7cf; } hr { /* tango:aluminium 3 */ color: #babdb6; background: #babdb6; border: none 0px; height: 1px; clear: both; } .footer { padding-top: 3.5em; /* tango:aluminium 3 */ color: #babdb6; text-align: center; font-size: 80%; } .warning { /* tango:orange 0/1 */ background: #ffeed9; border-color: #ffb04f; } .note { /* tango:chameleon 0/0.5 */ background: #d8ffb2; border-color: #abf562; } .note, .warning { padding: 0.5em; border-width: 1px; border-style: solid; } .note h3, .warning h3 { margin-top: 0.0em } .note p, .warning p { margin-bottom: 0.0em } /* blob links */ h2 .extralinks, h3 .extralinks { float: right; /* tango:aluminium 3 */ color: #babdb6; font-size: 80%; font-weight: normal; } .annotation { /* tango:aluminium 5 */ color: #555753; font-size: 80%; font-weight: normal; } /* code listings */ .listing_code .programlisting .cbracket { color: #a40000; } /* tango: scarlet red 3 */ .listing_code .programlisting .comment { color: #a1a39d; } /* tango: aluminium 4 */ .listing_code .programlisting .function { color: #000000; font-weight: bold; } .listing_code .programlisting .function a { color: #11326b; font-weight: bold; } /* tango: sky blue 4 */ .listing_code .programlisting .keyword { color: #4e9a06; } /* tango: chameleon 3 */ .listing_code .programlisting .linenum { color: #babdb6; } /* tango: aluminium 3 */ .listing_code .programlisting .normal { color: #000000; } .listing_code .programlisting .number { color: #75507b; } /* tango: plum 2 */ .listing_code .programlisting .preproc { color: #204a87; } /* tango: sky blue 3 */ .listing_code .programlisting .string { color: #c17d11; } /* tango: chocolate 2 */ .listing_code .programlisting .type { color: #000000; } .listing_code .programlisting .type a { color: #11326b; } /* tango: sky blue 4 */ .listing_code .programlisting .symbol { color: #ce5c00; } /* tango: orange 3 */ .listing_frame { /* tango:sky blue 1 */ border: solid 1px #729fcf; padding: 0px; } .listing_lines, .listing_code { margin-top: 0px; margin-bottom: 0px; padding: 0.5em; } .listing_lines { /* tango:sky blue 0.5 */ background: #a6c5e3; /* tango:aluminium 6 */ color: #2e3436; } .listing_code { /* tango:sky blue 0 */ background: #e6f3ff; } .listing_code .programlisting { /* override from previous */ border: none 0px; padding: 0px; } .listing_lines pre, .listing_code pre { margin: 0px; } buzztard-0.6.0/docs/reference/bt-cmd/html/uibtcmdopts.html0000644042355400116100000000346511675570704020560 00000000000000 User Application Command Line Reference

User Application Command Line Reference


Table of Contents

buzztard-cmd — work with buzztard songs
buzztard-0.6.0/docs/reference/bt-cmd/html/index.html0000644042355400116100000000472711675570704017334 00000000000000 Buzztard Bt-Cmd Reference Manual

for Buzztard 0.6.0. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-cmd/.


Introduction
I. Overview
II. User Application API Reference
btcmd — buzztard commandline tool
BtCmdApplication — class for a commandline based buzztard tool application
III. User Application Command Line Reference
buzztard-cmd — work with buzztard songs
IV. Appendix
Object Hierarchy
API Index
Index of deprecated API
buzztard-0.6.0/docs/reference/bt-cmd/html/BtCmdApplication.html0000644042355400116100000003771611675570704021406 00000000000000 BtCmdApplication

BtCmdApplication

BtCmdApplication — class for a commandline based buzztard tool application

Synopsis

#include "bt-cmd.h"

struct              BtCmdApplication;
BtCmdApplication *  bt_cmd_application_new              (gboolean quiet);
gboolean            bt_cmd_application_play             (const BtCmdApplication *self,
                                                         const gchar *input_file_name);
gboolean            bt_cmd_application_info             (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);
gboolean            bt_cmd_application_convert          (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);
gboolean            bt_cmd_application_encode           (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);

Object Hierarchy

  GObject
   +----BtApplication
         +----BtCmdApplication

Properties

  "quiet"                    gboolean              : Write

Description

This class implements the body of the buzztard commandline tool. It provides application level function like play, convert and encode songs.

Details

struct BtCmdApplication

struct BtCmdApplication;

BtApplication subclass for the commandline application


bt_cmd_application_new ()

BtCmdApplication *  bt_cmd_application_new              (gboolean quiet);

Create a new instance

quiet :

do not output on stdout

Returns :

the new instance or NULL in case of an error

bt_cmd_application_play ()

gboolean            bt_cmd_application_play             (const BtCmdApplication *self,
                                                         const gchar *input_file_name);

load and play the file of the supplied name

self :

the application instance to run

input_file_name :

the file to play

Returns :

TRUE for success

bt_cmd_application_info ()

gboolean            bt_cmd_application_info             (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);

load the file of the supplied name and print information about it to stdout.

self :

the application instance to run

input_file_name :

the file to print information about

output_file_name :

the file to put informations from the input_file_name. If the given file_name is NULL, stdout is used to print the informations.

Returns :

TRUE for success

bt_cmd_application_convert ()

gboolean            bt_cmd_application_convert          (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);

Load the file of the supplied name and convert it into a buzztard song file. The type of the input file is automatically determined.

self :

the application instance to run

input_file_name :

the file to read in

output_file_name :

the file to generate

Returns :

TRUE for success

bt_cmd_application_encode ()

gboolean            bt_cmd_application_encode           (const BtCmdApplication *self,
                                                         const gchar *input_file_name,
                                                         const gchar *output_file_name);

Load the file of the supplied name and encode it as an audio file. The type of the output file is automatically determined from the filename extension.

self :

the application instance to run

input_file_name :

the file to read in

output_file_name :

the file to generate

Returns :

TRUE for success

Property Details

The "quiet" property

  "quiet"                    gboolean              : Write

tell wheter the app should do output or not.

Default value: FALSE

buzztard-0.6.0/docs/reference/bt-cmd/html/index.sgml0000644042355400116100000000417111675570704017323 00000000000000 buzztard-0.6.0/docs/reference/bt-cmd/html/buzztard-cmd-btcmd.html0000644042355400116100000001057011675570704021713 00000000000000 btcmd

btcmd

btcmd — buzztard commandline tool

Synopsis

#include "bt-cmd.h"

Description

Implements the body of the buzztard commandline tool.

You can try to run the uninstalled program via

1
libtool --mode=execute buzztard-cmd --command=info --input-file=<filename>

to enable debug output add:

1
2
--gst-debug="*:2,bt-*:3" for not-so-much-logdata or
--gst-debug="*:2,bt-*:4" for a-lot-of-log-data

Example songs can be found in ./test/songs/.

Details

See Also

BtCmdApplication
buzztard-0.6.0/docs/reference/bt-cmd/html/objecttree.html0000644042355400116100000000357311675570704020351 00000000000000 Object Hierarchy buzztard-0.6.0/docs/reference/bt-cmd/html/uibtcmd.html0000644042355400116100000000451411675570704017646 00000000000000 User Application API Reference

User Application API Reference


Abstract

The classes described in this chapter are all part of end user application code. Please make sure you have read section conventions before reading further.

Table of Contents

btcmd — buzztard commandline tool
BtCmdApplication — class for a commandline based buzztard tool application
buzztard-0.6.0/docs/reference/bt-cmd/html/buzztard-cmd.devhelp20000644042355400116100000000362711675570704021376 00000000000000 buzztard-0.6.0/docs/reference/bt-cmd/html/home.png0000644042355400116100000000121611675570704016763 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  ÒÝ~ütIMEÒ1õÚKvIDATxœÕ•±kqÅ?ßrC‡ßàpà ~C„np¼¡CAAJ .B-\'G‡]:Ü “‚ƒCÇ -(ˆ8´à Ô€!…fD°€…çÒ“klbRÛÁoyüxïûîËïwpðIJº<°of_®-@ÒððçRH•´ÏfÖŸtèÂü¤^¯×ÓÚÚš’$Q«ÕÒ|“ôpâ’¶€gív;X^^&Ïs¢(bww—Z­F£ÑÀ9Çææ&Þû3à¶™ Æ’^IRµZUE.0Z]]Uš¦ ÃPY–Mü8óHÒGIÚÙÙÑìììæeŸkqqñÒ€™!ó  $ÛÛÛ¬¯¯3Œn eýþ{-/seeeìÔÃŒãXóóóåO‡Í·$ý8==UÇS™—é½×ÑÑQòRR€¤'ã–9-sÚÛÛ+B^ éC·Û•sîŸÍËÂ+%À°<7³ŸWô˜¿ õâ:™2IEND®B`‚buzztard-0.6.0/docs/reference/bt-cmd/html/pr01.html0000644042355400116100000000412211675570704016774 00000000000000 Introduction

Introduction

Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch.

The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures.

buzztard-0.6.0/docs/reference/bt-cmd/buzztard-cmd-overrides.txt0000644042355400116100000000000011576377712021522 00000000000000buzztard-0.6.0/docs/reference/bt-cmd/Makefile.in0000644042355400116100000007577211675570633016451 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ # -*- mode: makefile -*- #################################### # Everything below here is generic # #################################### VPATH = @srcdir@ 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@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/gtk-doc.make subdir = docs/reference/bt-cmd ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = 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' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE = buzztard-cmd # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE = $(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR = $(top_srcdir)/src/ui/cmd # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS = --type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS = --deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS = --sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS = # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS = --extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB = $(top_srcdir)/src/ui/cmd/*.h CFILE_GLOB = $(top_srcdir)/src/ui/cmd/*.c # Header files to ignore when scanning. IGNORE_HFILES = # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files = # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/ui/cmd \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/ui/cmd/libbtcmd.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) @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) \ $(DOC_MAIN_SGML_FILE) \ $(DOC_MODULE)-sections.txt \ $(DOC_MODULE)-overrides.txt # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST = $(HTML_IMAGES) $(SETUP_FILES) $(DOC_MODULE).types \ buzztard-cmd.xml 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) @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_FALSE@HTML_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_HTML_TRUE@HTML_BUILD_STAMP = html-build.stamp @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_FALSE@PDF_BUILD_STAMP = @ENABLE_GTK_DOC_TRUE@@GTK_DOC_BUILD_PDF_TRUE@PDF_BUILD_STAMP = pdf-build.stamp # -Wl,--no-as-needed # include generic part @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@man_MANS = \ @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@ buzztard-cmd.1 @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@BUILT_EXTRA_DIST = $(man_MANS) # Comment this out if you want your docs-status tested during 'make check' @ENABLE_GTK_DOC_TRUE@TESTS_ENVIRONMENT = cd $(srcdir) && \ @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: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(top_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/bt-cmd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu docs/reference/bt-cmd/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | 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=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } tags: TAGS TAGS: ctags: CTAGS CTAGS: check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi @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 all-am: Makefile $(MANS) all-local installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." 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-man 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-man1 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 uninstall-man uninstall-man: uninstall-man1 .MAKE: check-am install-am install-strip .PHONY: all all-am all-local check check-TESTS check-am clean \ clean-generic clean-libtool clean-local 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-man1 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 uninstall uninstall-am \ uninstall-local uninstall-man uninstall-man1 @ENABLE_GTK_DOC_TRUE@all-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) @ENABLE_GTK_DOC_FALSE@all-local: docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_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) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ 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 @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building 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) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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 \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs 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) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @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 # @ENABLE_GTK_DOC_TRUE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@dist-check-gtkdoc: @ENABLE_GTK_DOC_FALSE@ @echo "*** gtk-doc must be installed and enabled in order to make dist" @ENABLE_GTK_DOC_FALSE@ @false dist-hook: dist-check-gtkdoc 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 @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@%.1 : %.xml @ENABLE_GTK_DOC_TRUE@@ENABLE_MAN_TRUE@ @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< # 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: buzztard-0.6.0/docs/reference/bt-cmd/buzztard-cmd-sections.txt0000644042355400116100000000162611675570704021362 00000000000000# $Id: buzztard-cmd-sections.txt 2985 2010-09-15 20:06:52Z ensonic $ # :mode=html: # please add section in the alpahbetical order using the following template #
# btxxx # BtXxx # #
"bt-cmd.h"
btcmdapplication BtCmdApplication BtCmdApplication bt_cmd_application_new bt_cmd_application_play bt_cmd_application_info bt_cmd_application_convert bt_cmd_application_encode BtCmdApplicationClass BT_CMD_APPLICATION BT_IS_CMD_APPLICATION BT_CMD_APPLICATION_CLASS BT_IS_CMD_APPLICATION_CLASS BT_CMD_APPLICATION_GET_CLASS BT_TYPE_CMD_APPLICATION bt_cmd_application_get_type BtCmdApplicationPrivate
btcmd btcmd GST_CAT_DEFAULT # gettext extras _ N_ bindtextdomain dgettext gettext textdomain
buzztard-0.6.0/docs/reference/bt-cmd/buzztard-cmd-docs.sgml0000644042355400116100000000622611612312024020563 00000000000000 %version-entities; ]> Buzztard Bt-Cmd Reference Manual for Buzztard &BT_VERSION;. The latest version of this documentation can be found on-line at http://www.buzztard.org/files/apidocs/bt-cmd/. Introduction Buzztard aims to be a successor of the freeware music tracker called Buzz with a focus on Linux. The development of Buzz for windows had been discontinued as the author lost all his source-codes. Buzztard is only related to Buzz in the concepts, Buzztards source code is written from scratch. The homepage of the buzztard project can be found at www.buzztard.org. It is a social site containing forums, a wiki and bug tracker and many other resoures. Overview User Application API Reference The classes described in this chapter are all part of end user application code. Please make sure you have read section conventions before reading further. User Application Command Line Reference Appendix Object Hierarchy API Index Index of deprecated API buzztard-0.6.0/docs/reference/bt-cmd/buzztard-cmd.types0000644042355400116100000000012511675570704020053 00000000000000#include #include bt_cmd_application_get_type buzztard-0.6.0/docs/reference/bt-cmd/Makefile.am0000644042355400116100000000561611625500306016407 00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # The name of the module, e.g. 'glib'. DOC_MODULE=buzztard-cmd # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # The directory containing the source code. Relative to $(srcdir). # gtk-doc will search all .c & .h files beneath here for inline comments # documenting the functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src/ui/cmd # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS=--type-init-func="g_thread_init(NULL);g_type_init();gst_init(&argc,&argv)" # Extra options to supply to gtkdoc-scan. SCAN_OPTIONS=--deprecated-guards="BT_DISABLE_DEPRECATED" # Extra options to supply to gtkdoc-mkdb. MKDB_OPTIONS=--sgml-mode # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html/ \ --extra-dir=$(GST_PREFIX)/share/gtk-doc/html/ \ --extra-dir=.. # Used for dependencies. The docs will be rebuilt if any of these change. HFILE_GLOB=$(top_srcdir)/src/ui/cmd/*.h CFILE_GLOB=$(top_srcdir)/src/ui/cmd/*.c # Header files to ignore when scanning. IGNORE_HFILES= # Images to copy into HTML directory. HTML_IMAGES = # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # 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. GTKDOC_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/ui/cmd \ -I$(top_builddir) \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) GTKDOC_LIBS = \ $(top_builddir)/src/ui/cmd/libbtcmd.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) \ $(BT_LIBS) # -Wl,--no-as-needed # include generic part include $(top_srcdir)/gtk-doc.make if ENABLE_GTK_DOC if ENABLE_MAN man_MANS = \ buzztard-cmd.1 %.1 : %.xml @XSLTPROC@ -nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $< BUILT_EXTRA_DIST = $(man_MANS) endif endif # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += \ $(DOC_MODULE).types \ buzztard-cmd.xml # Comment this out if you want your docs-status tested during 'make check' if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) TESTS = $(GTKDOC_CHECK) endif buzztard-0.6.0/docs/reference/bt-cmd/buzztard-cmd.xml0000644042355400116100000000464511576360400017510 00000000000000 the buzztard project Development and documentation. buzztard buzztard-cmd 1 Buzztard Manual Pages buzztard-cmd work with buzztard songs buzztard-cmd options Description buzztard-cmd can be used to inspect, play and convert buzztard songs from the commandline. Invocation buzztard-cmd takes a mandatory argument that specifies the command and extra options depending on the command. Options , Be quiet (no verbose ouput when running) , command-name The command to exeute, one of: info, play, convert, encode , song-filename The input filename. This should be a song file buzztard can handle. , song-filename The output filename. Depending on the command this is the result of the file-format conversion or the song-rendering. , Print brief help and exit. Print version and exit. buzztard-0.6.0/docs/reference/Makefile.am0000644042355400116100000000046111576360400015236 00000000000000SUBDIRS = . bt-core bt-ic bt-cmd bt-edit # this is an ugly hack to help xsltproc finding the files # it won't be needed with gtk-doc 1.11 # keep the '.' in subdirs so that this is done first all-local: version.entities version.entities: @cp ../version.entities ./ clean-local: -@rm version.entities buzztard-0.6.0/docs/version.entities.in0000644042355400116100000000034711576360401015110 00000000000000 buzztard-0.6.0/docs/Makefile.am0000644042355400116100000000057611576360401013310 00000000000000## $Id: Makefile.am 3317 2011-04-13 19:17:16Z ensonic $ SUBDIRS = help reference BUILT_SOURCES = version.entities EXTRA_DIST = version.entities.in \ buzztard.xsd # this is a hack to make sure gtkdoc find the file during "out of source build" all-local: @if test "$(top_srcdir)" != "$(top_builddir)"; then \ chmod u+w $(srcdir); \ cp version.entities $(srcdir)/; \ fi; buzztard-0.6.0/docs/buzztard.xsd0000644042355400116100000003236511576360401013642 00000000000000 Song metadata, like title and genre. Pattern data for all voices of a machine. Pattern data for all voices of a machine. State data. State key-value list. Pattern data one voice of a machine. Control change fragment for one machine. List of control change fragments for one machine. Media generator/effect/sink. List of machines. Control change fragment for one wire and pattern. List of control change fragments for one wire. Connection of two machines. List of connections. Virtual gear setup (machines and wires). Time slot. Annotation for a tick. List of annotations. Time location for a pattern in a track. Slot for pattern related to one machine. List of tracks. Song structure build of a timeline and tracks. Wave in a wavetable. List of waves. Toplevel elements for a buzztard song. buzztard-0.6.0/config.sub0000754042355400116100000010242511576377400012311 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-06-11' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # 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. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # 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. # 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 $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) 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) 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*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -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 \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | 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 \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | 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 \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-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-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | 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-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | 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-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | 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-unknown 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 ;; 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 ;; 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) 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* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; 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 ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? 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 ;; i386-vsta | 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 ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-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 ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; 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 ;; nsr-tandem) basic_machine=nsr-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) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) 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 | ppc64-le | powerpc64-little) 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) 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 ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | 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 ;; 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 ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-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 ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; 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 ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; 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 ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; 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. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First 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* | -solaris* | -sym* \ | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -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* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # 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 | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -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 ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -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 ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -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 ;; # 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 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; 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 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-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 ;; *-next) os=-nextstep3 ;; *-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-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: buzztard-0.6.0/AUTHORS0000644042355400116100000000033611643651621011370 00000000000000Original Authors ---------------- Stefan Sauer Krzysztof Foltman Thomas Wabner Patric Schmitz buzztard-0.6.0/buzztard.schemas0000644042355400116100000002123711674060563013540 00000000000000 /schemas/apps/buzztard/news-seen /apps/buzztard/news-seen buzztard int 0 Version number for that the user has seen the news Tracks for which application version the user has seen the news already. /schemas/apps/buzztard/missing-machines /apps/buzztard/missing-machines buzztard string List of missing machines to ignore Comma separated list of machine names, that we will not warn about on startup, if they are missing. /schemas/apps/buzztard/presented-tips /apps/buzztard/presented-tips buzztard string List of tip-numbers that were shown already Comma separated list of tip-of-the-day numbers, that the user has seen. /schemas/apps/buzztard/show-tips /apps/buzztard/show-tips buzztard bool true Show tips on startup Should the tip-of-the-day dialog be shown everytime the application starts. Vis tip ved opstart Tipps beim Programmstart anzeigen Näytä vihjeet käynnistettäessä Afficher les astuces au démarrage å¯åŠ¨æ—¶æ˜¾ç¤ºæŠ€å·§æç¤º /schemas/apps/buzztard/toolbar-hide /apps/buzztard/toolbar-hide buzztard bool false Hide main toolbar Should the main application toolbar be hidden. /schemas/apps/buzztard/statusbar-hide /apps/buzztard/statusbar-hide buzztard bool false false Hide bottom statusbar Should the main application statusbar be hidden. /schemas/apps/buzztard/tabs-hide /apps/buzztard/tabs-hide buzztard bool false Hide main page tabs Should the main application notebook pages tabs be hidden. /schemas/apps/buzztard/grid-density /apps/buzztard/grid-density buzztard string low Machine view grid detail level How dense the app should draw the grid lines shown in machine view: (off,low,medium,high) /schemas/apps/buzztard/window/x-pos /apps/buzztard/window/x-pos buzztard int -1 window-xpos Last application window x-position. /schemas/apps/buzztard/window/y-pos /apps/buzztard/window/y-pos buzztard int -1 window-ypos Last application window y-position. /schemas/apps/buzztard/window/width /apps/buzztard/window/width buzztard int -1 window-width Last application window width. /schemas/apps/buzztard/window/height /apps/buzztard/window/height buzztard int -1 window-height Last application window height. /schemas/apps/buzztard/audiosink /apps/buzztard/audiosink buzztard string Which audiosink to use Which gstreamer audiosink element should buzztard applications use. /schemas/apps/buzztard/sample-rate /apps/buzztard/sample-rate buzztard int 44100 Which sample-rate to use Which sample rate should be used for the generated audio. /schemas/apps/buzztard/channels /apps/buzztard/channels buzztard int 2 How many audio channels to use How many audio channels should be used for the generated audio. /schemas/apps/buzztard/playback-controller/coherence-upnp-active /apps/buzztard/playback-controller/coherence-upnp-active buzztard bool false Activate Coherence UPnP based playback controller Allows to remote control buzztard via upnp together by using the coherence backend. /schemas/apps/buzztard/playback-controller/coherence-upnp-port /apps/buzztard/playback-controller/coherence-upnp-port buzztard int 7654 Socket port for the Coherence UPnP based playback controller The port number for the communication with the coherence backend. /schemas/apps/buzztard/song-folder /apps/buzztard/song-folder buzztard string Default directory for songs Default directory for filechoosers, when loading existing or saving new songs. /schemas/apps/buzztard/record-folder /apps/buzztard/record-folder buzztard string Default directory for recordings Default directory song recordings. /schemas/apps/buzztard/sample-folder /apps/buzztard/sample-folder buzztard string Default directory for digital waveforms Default directory for the sample browser in the wavetable view. buzztard-0.6.0/README0000644042355400116100000000577111643650654011215 00000000000000$Id: README 3680 2011-10-07 19:23:23Z ensonic $ = quick info = Please turn you browser to http://www.buzztard.org to learn what this project is about. Buzztard is free software and distributed under the LGPL. = intro = Buzztard is a music composer similar to tracker applications. It is roughly modeled after the windows only, closed source and now discontinued application called Buzz. = requirements = libxml2 glib2 gtk+2 gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad gnome-canvas gst-buzztard (from buzztard svn, use same version as this module) gudev gsf Regarding gstreamer - the newer the better. = supported packages = check (http://check.sf.net - for unit tests) gconf (for persistent settings) udev (for interaction controller) = building from svn = To build use autogen.sh instead of configure. This accept the same options like configure. Later one can use autoregen.sh to rerun the bootstrapping. To build from SVN one needs gconf2-dev (see #1530372), gtk-doc and cvs (for autopoint from gettext) installed. = directories = design : little test sources, not needed for releases, not built during make docs : design ideas and API reference po : gettext i18n catalogs src : the project sources ui cmd : buzztard tool for the command line edit : buzztard editor (gtk based ui) lib core : logic, e.g. connections framework, file i/o, ... ic : interaction controller tests : unit tests (same directory structure as src) = installing localy = Use following options for ./autogen.sh or ./configure --prefix=$HOME/buzztard --with-gconf-source=xml::/home/ensonic/.gconf/ --with-desktop-dir=/home/ensonic/.gnome2/vfolders/ when installing the package to e.g. $HOME/buzztard remember to set these environment variables: libraries: export LD_LIBRARY_PATH=$HOME/buzztard/lib:$LD_LIBRARY_PATH online help: (as root) export OMF_DIR="$OMF_DIR:$HOME/buzztard/share/omf" scrollkeeper-update devhelp: export DEVHELP_SEARCH_PATH="$DEVHELP_SEARCH_PATH:$HOME/buzztard/share/gtk-doc/html" pkg-config: export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:$HOME/buzztard/lib/pkgconfig" gstreamer export GST_PLUGIN_PATH="$HOME/buzztard/lib/gstreamer-0.10" mime-database & icon-themes: export XDG_DATA_DIRS="$XDG_DATA_DIRS:$HOME/buzztard/share" update-mime-database $HOME/buzztard/share/mime/ = installing in /usr/local = The default value for the --prefix configure option is /usr/local. Also in that case the variables mentioned in the last example need to be exported. = running the apps = cd $HOME/buzztard/bin ./buzztard-cmd --command=info --input-file=../share/buzztard/songs/melo1.xml ./buzztard-cmd --command=play --input-file=../share/buzztard/songs/melo1.xml ./buzztard-cmd --command=encode --input-file=../share/buzztard/songs/melo1.xml --output-file=./melo1.ogg ./buzztard-edit --command=load --input-file=../share/buzztard/songs/melo1.xml = running unit tests = in one console enter eval {rm\ ,\;touch\ ,\;tail\ -f\ }/tmp/bt_XXX.log where XXX is one of 'core', 'cmd' and 'edit' and in another make check buzztard-0.6.0/pixmaps/0000755042355400116100000000000011675570700012062 500000000000000buzztard-0.6.0/pixmaps/prefs-input-gaming.png0000644042355400116100000000163711576360365016237 00000000000000‰PNG  IHDRÄ´l;bKGD¬M4Ö×{ pHYs × ×B(›xtIMEÕ(@ÜŠ,IDAT8Ë­•]hU†Ÿsvfvf7?Û¬ZE1n©‚ˆ,&B¯ ÅŠà+Ö?%%Ò›Þh ¢b$z)DoZĶYn¼¢MµŠ?X‚¥$­ív³ÓfgvvggæŒ7»›,Ùl4øÁÇ÷q†÷=ïy¿9Á6qéuòŽ˜³âúÓ€¼#2×4¢×žº»Ø'¶#çïÝsŸ¥Y&±Rµ:åå;jM ïîTå§­°²±B|˜ÍZ2m&ØÕ&µPòÀc»%ðy?¬ÜƉƒzÊ"‘L¢:†¡Qºn³ëáûÉÄk{ûµþ>Å*ðØ·k îJS­¸„̀Ѐ8Ú±bßË„Dúu–]fíö]zä<{í‡+Þ·¯Þ:°û‰ÑLî©a´¤Nõæ*7_vLâc;V8»iKj|q’“¹soÎ'ç~Ï™sàzÄ^~ôÁ à à8px*=z,¿?~ùÅW?ý+øÌÙÓŸç¢(º.„¨¾xâ¥F¥R™0 U‚ ’ÉdZBˆZ¤£û·oߺ;77;¡”zwïüÅ —>Ù NÞ}ç½%¥Ô´”rséÏ¥Òý{÷D£Ñ ×ë¥a2¦‰Í2::Êñ™ã]Û¶ëNçP>Ÿ¿õÍ·_?}ñÂ% ¶‡/¥œºq㺨V«Oh­1 …”˲B MGšµ\»v­P©T “““d³ÙÉí,#Õó-×uŸÝò¼‘……*R˜f¥J) îwïu»]Úí6®ëê……òر£Ë¿ÿ6¿(”R§_xþÄ‘Åj•L&ƒiš(¥0MÓ4Éd2™eY÷çy¬¬¬¨S'ß¼ ¼?”"I’£«««H)1 chƒo)%J)„©Ôb¸NýiµZ¸®[F¶k,úýþ0+¥( är9’$!Š"úý>Zk”R;À–e!¥”J©€L#0ÊåX–½#âR©„ã8är9,Ëê»6¦\.S«Õô°‹bÑéOMM!„@J‰”ÿEQD„aˆÖ­5q ¡®ë’ÏçÉf³ xÃûø¾Ÿcÿþý¬¬¬°¾¾ŽïûÄqŒ‚$IÐZEI’P*•°m›‰‰ ’$¡Ùl’Ëåž{ lYÅb‘ÍÍM*• ®ëÇ1Fƒz½NÇ(¥p‡r¹Œã8H)¹sçããã8ŽC>Ÿg7øüÕ®œÛ^àÅ¢ƒ;æ2>~ééi …aÒétX__cié&Ë-§?ÖŽ–óÙî&4ræìé×_;IEÔj«¬­=¤Ýnã>Zëa©)¥°,›C• \×e~~~£Ýií»xáÒ$ðè"Î@†I³Ù”9x°2L˜Öš0 ±m)%QQ¯×™EHa¤œÐ¶Ô6IÌ4‰BˆÑz½NEC³,‹ ØÚÚÚ±¯”"!1SŽ™š”›¢Ë³s?Ú¶½™$ÉŽþêyAìØ³,+Aø¾WlµZ¿ñà !`..Þ¬>RJÁfÐŒ^Ï3úýÏÛ =Ïëø~ÏØò:F…ªÙlÍ}åêÇ@X’Ýd0òÊ«/Ÿš™™y»ÝÞ|f¯ ë¤Öívï^¾üÝç@¨¥Ðx¯ÑdO¦Í¤&ÖNó RÇð.°–Ž+ÿ?ͼ]ÉÈV €~ ïïåø7ÿ¿”æ aîIEND®B`‚buzztard-0.6.0/pixmaps/gnome/0000755042355400116100000000000011675570700013167 500000000000000buzztard-0.6.0/pixmaps/gnome/32x32/0000755042355400116100000000000011675570700013750 500000000000000buzztard-0.6.0/pixmaps/gnome/32x32/buzztard_master_mute.png0000644042355400116100000000203011576360365020647 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“ÍIDATX…í–¿o#UÇ?owÛqB.èBr Aˆ"º€DC(¹qÔˆ–? þ*Ðu€NB¢ "‰ŠH%á” CˆK.ŠåÛ9ÿØ}3o½Þ]/!‡€†L±Þ7ã7óÝùñ}.åR.åÿ.àÅw>š~b~éÛ•ÅÙÕ¿ëHU³ëÔ›*¤ÍÇ­‡ÍfãìµÛoNU{åÕÍkA¥Z¶’utNÈ€1EQQ$Ö«*ŒÖ¢¬¯ñäÖ7?¾|ÐƘ“vŸÈ^@Ž*ªŠ¨&AU4Ñt¢ÊêB<¯¤DV88øOì£Ïec´L—k|®,-â²,d(è`26xù…%¦¦*Ÿ¢‚¢‰àÖFˆ8›ª`#‹ªE!6²DÑ0ÙwØ›¡?˜GìØ÷@ê#V×Ö™™«?RÎK8²½û Ú«?xc¹VýÅó|Ê•*~PBE±©>KøWbgEAD‘DõßD”ô¨iCiªD×<Æí}Œ—`sÝ<~è³Úb= C¡<]ÁÚqVÏÀÚõkãÙçÌýÆä’žóÜŒ¹ Ø^™ŠíÅzƒˆƒƒLWPè B–— ¿0Pz-º0Œ8=íR-»0ýaH­VÅJyDÙ –ǽ7VêøA‰ŸŽ„~áy^.° $çdAÂHX šl>=”Ø;TŽº ØÉ hr <ûü3su¿ÿ™ÞïDd"½& ÙÜùv_º‰øþd‰âŽüÝìsØmb¥¨Äf £†r]+9§Ê­ÏÞãF÷€gvùäÍ÷ zArÞ\¯NE'€XqÙI,µÖ Ëícj5G©Oµ©µNhÏ.dKTp²Šhñ¨*v2ˆ*b%S÷îtN¼UŽ èVçɤO>‘‰qT‘ Ž3`݆<扨bÇç7ߥ³}¶^›¡ñ²Ç¯¸~ÉÍ0af µ fÏm¾Ã»²ÆÇ·>O€-˜+¨ÉúSQ¢| “šÕ¬(÷pçë»x~Àý“6 sˆ˜ì襈é<î5 Ÿ~µ‡ç5:ßÊbûê@%Å©#g(•ó$TA"" ‘¢¢ˆ(¦†Dñ3Љ”¨#ˆÄûšáíÖ6RÉÎé#±]|n†êdùÀQx”©ÝNÄ•Ÿ·hH=®ÄÜ”€ {÷¸ÌõÂJ€¸¨J„a1=^3ÀD@ ü‡è7QE´° Tö±‰»\¼vÇéß–THA€¬hŠÕI—Ñš‹j ÔÇq8qz6¯áTÇ k:Ñu¦ýü÷l]¯OxIc*’¡*ûÍ¿\»A¥Rƒv»ÍáãÓ?DHswÛõ;MÂ0 ÓîP· bJÔ(íÌq4xÏw¹ÅOD:žçzX¥(ÂÆ'*Ëx¾ËÍh•ýhã!)AÁð8¾4Ou²ÌƒÕßØÓ¤É˜1²Ûeqe‡ú|™[‹•œ÷O]n1sµÍú;£4fݘ¬ÆÅÐ;¯¹ò+E ‹Ð²¿Uí¨Ænd'â•/n°Ûž FNO°öÒ8ªpâ³]jg÷iµ^½ØâÒÇSìÍz˜ +ËÄr*He¨"ˆ —¹JìÉâÛì5„Àv×8|½‰ˆ¡¢,\اÞöh¹.;[.Ǿl¢¢qLTQ ˜öÕdk.¤ÄÚ €Æ˜Ÿ€(ûs¥$z•ŠqûE‘|¨ÿc‡D{}¨@Ô¯`#Nˆrs!äöò83Ó>ÞÑ2—Þ˜LÓséÃ1Â×`îHÄÍ÷Jü¹dè B\¤Š¡J¢çᔘüx²Êê £©ø¿ùðÍGcYQ&ëU,ó°—±aìoÙ¨ª"jlvÖ¹põ®ï°Y¿ËÌ|õÜÜ…#'¹‚ G&Oe³»Î×ߎë;ÜÛÞÄ â:è6­Ò#Pn툩MbùL-R&kã)˜ºš¹=½k2Κ’ºçZ óŒ‘#šªirl:N›*Pö[;×ùnáù•ëãÕÚª†3(I0d°ªM³U½ì™åêHÒ¡9€á¢õöïÛßÚyHnÅ@˜Æ€Pt'sò~ÐoÐ:À° ìn*§Å)8ð š×„D‹äFð7]~sƒt²ÍÍIEND®B`‚buzztard-0.6.0/pixmaps/gnome/32x32/buzztard_effect_bypass.png0000644042355400116100000000215411576360365021146 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“!IDATX…í–Kse†Ÿ¾Lzfr%„ &Pâ"P°páÂráJËÿÀ`•µ+ÿ–eeC¹R„–%–‘’E$.¹Ln3¦§Ï9.ºgzz¦)¢…+9›îïúžs¾÷=ß/ì…½°ÿ»9ï|Byj²r¥2~üè¿ÝÈúÛ*™Ã0‹ëµµ7/¾ßxìÇÃÁ믽òÖ|0B{ˆYHë"f ¦é¿Z×SãDëôÁ/¯~úð±à@Á§ÝC,ü§Á'Çjf¨& é?ÌØ¦üÞM$n/>õöœæ¸÷ÓÍF:Ì*Õ}˜+Ý~¿g‚µšm´6ÁéÃç*fP‰tÀ‰ED15$Š¿Q¤H¤D¡ ¯kK´š›H)ݧÇÔÛ#'÷32^Üsže*F;ŒXüuºÔb~$æv°Áèž—¹žCP*à\Ô@%Ï„A1=_3ÀD@úø3Ðk¢Šh.`¨ècc+\¹±€ãô.K’“ ˰|5DÒfxÊE5Gj‚ã8Ì›Îj¸«c5è:Õ~¶?ש^R˜òd¨Ên#ä÷Q*Á Õjq¨:I¡à8¤™óÛ­ˆÚãA¶BF&ÄÍ91%jG mäXá žïò[Da Ïsû€û#ÌÏR A}–¹ÒY<ße9ºÉn´ô”#AÁð¨ÎW/òäæ]v4)2f”wÚÌýÒàÑÌ˳A&úW›L^kq÷íaêÓnì¬Ædèì׸þõ-EsIhémÕËÕ¸Ò•·#Þý®IõÈQÖ—6ùz£ÎÏ§Š¨Â‰Ï¶¾Ð`{Î\i²øÑ;Ó&ƒÊ2±Œ º2TDi®G2w«NõÈ!‚Ñ2³/ÍR½"b¨(•Ë –Ÿ¸ì¸.WàØ T4Î@Ÿ‰*ªQŽ&¹µ@5yp ÀÚÆíf‹ ˆ²{У˜do¬+¯úˆdSÄ$Ú©C=PKjtöÓ„÷g \ÚÚæäµu6ÊpéLÕøâùáƒQαÅð²pï"÷ç X’·' 1IÉ%¡J¢çŒÃÝ ˜ÁOÇ_ꪉïýȇo?MI™ÌW±4Å#TÁîš «*¢Æjx‡Ë×p}‡ÕÚ û+#¨çfÉå<8Ry*«í;|õã績Ãúæ*^!æA»a¥ŽÅæ1µ‰áΞŸJ€”ñ©Ñ.˜ºš¹½kÒN‹’ºŸµæåÃÚUÓø¾ÉXUª„M< èv{!ü~öÔõßFG¦fQu0œ~I‚!ý¬6MguNÏ,Ã#é6Í ­µþÜ\úÆ.Bò*F€1`0ä½Éœ§üïµÏÚ@ì›Àvÿ¢"ñ±89îàYãš8Ñ$yü 1äzß6$#IEND®B`‚buzztard-0.6.0/pixmaps/gnome/32x32/buzztard_generator_mute.png0000644042355400116100000000215111576360365021346 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“IDATX…í–ËoUUÆçžsßÜ{i±…RÁ’*Zñ&&&Æ80Ê€DgêÀ©‰ ò8pàˆÎÄ‘±A1MƒPèli¡ô>Ï^ŸƒsîûTªÁ‘¬äÞ³Ï^YëûÖÚk­³á‘<’Gòàâ§JÅñï³û¦þ'B ›Š~@÷?Z…kKw‹KoÎ|Å­ Øâõ±·ß=^QVjíqû I ‹8Ðû.„¨·žÛ·pæË õE ´žî/€í€@§XqäŠA}:Ix¹¤”z¸VÈÕ‹×hÉÿ§ðC¯JØ™<:Še]Ï^O ­Z“knœÒóo‘˦ûŒÍŒÐÙtè çŒÐ9ÌDè 3£:Bg4›aÇnbówƪ«¤Šlˆ@×ùÑé FÊ…Çÿ qÎh´BV¸‰t ™uðº”PÉI|?EÁÏ <¬%< ;ºT—€ý§$º0ÖÅéÉÀðù>tp·c7Bù ³ÈÚ7§ÙðÚFIYQßR£ëõ¯°Aù`YB˜9Ré‡_9õ0t‡G_«g¸l¯“,"מ)‹–D‰ÆV•Å‹óÅ"aµÊÞ™ý¹tƒ¥«³¾÷°Þb}nƒ P„«×(Mñ36LÀœ#l¶ø#sú ÒOþÆk®àgüm€ÛãÖ†2" × ¹ž’àéÈ_na–Bk/9¥/=ó#å+µ_0&·ë%Î.Ïp¼|“+Wû2Rû­Js¾Nþµ"þˆ$,.¶¿å­+4ï$9Ì:A€2ÇJ­Äç—ßãúZƒrþÞÍɉ Hbëü=R³>¥T…»¿®“ÿ¤@jÔ‡&ëÃé›4€(f|»<ÃõÕ:ÖÙØ¼ÏùÛG0‹œ5.Õ)çw“Éf©x#Ôg·â€C=2Іr®[ý=”Í"bÏ–oP)F߇”0™[ÇÌ!3R£.ŒœÖ­Š?DvnP™K*B9¼¤a§ì…ò<Mïæ»ÕcLf×ùìÐ9ƒäßßÅÚ×·±5#ýr@ú©,2>R¢z’‹0Jwº¢Ñ)sqbï,'ÆìT¹µ»!-òºK:R™an€ÀÒ}Šã‚9vݼ­s§¹ã{T—=²'f½Mÿ38¬gäÅÅŸY9sŠ5ߣ¶|ƒÌ¤™ãnƒ|›@îÏ*iç…=}g¬ã¬<]‰£è‚{Ìð¢™Oý{1© kxUHIöìm§šÍºù@.tê2?›º4—Û/3ÏâËjçl¤áe{C½WÒö-4zXg-0<<äÂêüú™9ÎFd#ÙT€’îdÞ6ëîy@ h›ÀpoÐ(Gt,^‚Ãÿ*âû“[”láïn‹Ýn+E; Ê©Vr Ê+Ÿ¼ýõ6ó›ë¬¾õA$‡æ´–í‚TêV buGëz¸Öùr{‡®®°½Cýp?íq÷[¶ÒÙ.›„v²ˆjšxØÃÝZ¯º €RH7œqïlR5™hG)ž„ÖªÛë"Æ9ÐÈx¬½þÍÖ2—ZËÜzí]ÆÃ&O-’T+¦$×hÀ mrÏ$éÛ¼Â÷æ–øìíG` ºÄ jÆñT”8?ˆúÇûu« XQî´áæ—›x~ÀÝý#fgg1ã­—Lg !QáNÇðé­ P Ýûáóõù«[ÍF}^T ª&+¾ª2_:šþeÖ™‹ÒTÆÕ¸•‘ƒƒÁa{ó›U òЦ2à3iæOÎÏë3@ €cà8ÊßTÅm‹)·ø7x4Ãâ*9'DíEöU„>¹KlºëØÔŒ€åC Ôê^úƒš63&6z,oqo±Âí¥j.ûù³™?sùý*í9? V2ôýu.üN»¥h! -;­†¹£štº‰–ãð—7hmÏ—=&_ŸfõÕ)Tá•/Ú¼ýU‰iêìÿ±ÁÊ'̘Œ+ËÄr*ÈPE§¹J’ÉÒ…&­ a ¸‹«D eùû.sQr±×ͰÿÔCT4©Àˆ‰*ª® “Â^ š€¬-DTʉ6Ë@{*LA”æ3â§M6¹qÀG$_ê4ÿ$!Ñ~â€ZÚ£ó'˜¦¸¹Q;:Åž+ÚS!gÞ¬£š<ß~<ž¸Cý–rù½k¯•±´þP’*RHB•TϹ€0ƒËj\Ú?9P’œû.„SLJH™®W±¬Äý-WÁæºMª*¢ÆZ|•ï~^Á=ÖwÙµPC?wáÈI®à‘ÉSYë]囟>Ç=î5×J z«ö¨lµ(‰©íœÜÍ‘c³)RŸ€©¯ß×»¦ã¬)©oÉ^«a1±Gjªï˜IT¥J¼ETBÀVWâ3‹/_¸2U›]DÕÃðF% †Œ²Ú4[Õß=³d040|´Ñý³yý; é­¨ÓÀ’ÝɼG¼o÷›ô€x4ÑŸ*$Ûâ8ÜÀãæ5 b‹ôFð7ßsÇeL¬IEND®B`‚buzztard-0.6.0/pixmaps/gnome/32x32/buzztard_generator.png0000644042355400116100000000216011576360365020314 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“%IDATX…í–ÍoTeÆwîÎ03”Ú–RAš"R´¢˜MLŒqa”… &ºqãÂÄ?ù\°¢ º"b¨4&¤„B?À–¶¶™ÎÜ÷<.îï[©Wr’™ûÞ÷äœç9ç=çÜÉ#y$ÿwñf>"_,Œ|—Ý?yèß8JØTôÚÿÑ*\Y¸¿=¿ðÚôYîÁ¯ ¿ñÖ‰ò ²Rc7ˆ;oHHYÄÎw!D­ñìþ¹sŸ¿ Ïy¤=ð´9¶ Iœb`Å‘+ué$áåŠR ètâ!7fnÒÿOáû^•°2>µËºŽ½ŽÕ:7ÝÅç^'—Mw›¡³>èÐΡs˜‰ÐfF#t„Ψ×Ã–ÝØÆ5†+ˤ ¬@ÛùÔ䃥ü®ã8gl7B–/ÞAº‹ÌZxmJ¨ä‡$¾Ÿ"ïgÈÖž…-]ªMÀþSmkãtd ÿ|:¸ˆÛ±!‚ 3ÏÊgXóšFIYQ×R£ëô¯p›Ò¡,²„.0s¤Ò)޾x0êah®þVÇpÙY'YD®9R!,‰Û[æg® „• £Óré.zK[g]ïa­ÁêìA>W«R<\ÀÏX?sްÞà÷Ìþ䫤ŸÛ—y¬¾„ŸñwnŽ[ëˈ$\=äÖÀ‚§"¹¹Kä³xɰ(m¤xáé',åYªþ‚™0ȸW+r~qš¥;œ,ßèÊÈÖ¯[T~«R~¹ˆ?è# ‹ ¤éoqë*õuƒ$2‡YO'CæXªùôÊÛÜZÙ¦4pîå±ËHbåë5®}µÉjÝcâÇ*G>"µÏ‡&ëÂéšê5€(f|¹8Í­åÖXÛØäÛ{Ç0‹œ­Ïl±úTS)n®{¬_܈rôõHO¶ȹvõwP6‹ˆ=SºM¹}R~Àxn3‡ÌÈ ùdâvÝ›¹Étd§þ• ¹¤"”ÃKFqÊž/]çƒÉ½|³|œñì*ŸL\@1Èð{eNž]£¾R:™#ýd™õ)Q=I‰E¥»;]Ñè”9„85z‰S#ß·ªÜšÝÃï—ÚK:R™a®‡ÀÂ&… Á{î\åî…3Ü÷=* sì;6³Þ¡ÿéÖ1rÂüÏ,;ÍŠïQ]¼MfÜÇ̱¾Í@“@î içù¡1¦Þn9+M–ã(Úàž3¼h¦ÀSwÄ^L*È_’Cù¡ÑfªÙ¨™ä@§¯ðÃñÃ?Í ™gñeµu6Rÿ‡²¹¡Î+ió=¬µò@aåúê¹YÎGd#Ù”"’îdÞëÝîy@¨Àðg¯QŽèX¼‡»xÞbUÀühÌ<ÖSH"@IEND®B`‚buzztard-0.6.0/pixmaps/gnome/32x32/buzztard_generator_solo.png0000644042355400116100000000215511576360365021354 00000000000000‰PNG  IHDR szzôbKGDÿÿÿ ½§“"IDATX…í–ÍoTeÆwîÎ0SJ-Ç(¤V‚`IŒ‰&&ÆbX›¸p‹ ÿ·ÈàlИYàõ )D°ÐR°-mg¦sï{÷Î÷­Tƒ+9É̼ï{rÎóœóžsæ…§òTžÊÿ]<€™ÓË¥—ò»&Ÿû7N„R€îw¼Šj 6æÞ:zŽ{@°Îïœ:6:¦¼nqó I ‹9лB4×wÍ]øô=? ä‘õÀÓÚØ¤qJ€•D®Ô§“„W(CFY€ ×‰ #~Ÿ¹E(ÿŸÂm•r±wj–w=g=1„·ÜNÊÇߦÏö›‘³!èÈΑs˜‰ÈfF9"g´ZQÇn÷ê5&êKdJlˆ@×ùÔänÆ*Å-Çÿ8qÎØ#–®ÜAº‡Ì:x]J©ä'$¾Ÿ¡èçÈ Ï¢Ž.Ó%`ÿ)‰.Œuqz20|¿O\$íØÍ@‡€ÁHŽg™§öåY–½¶QZVÔ·Ôßèzý+Ú ò\YJ˜92Ù ‡^Ý÷0t‡G_«g¸l®“,&מ)–F‰õ:ó37J%¢zêÑ=…lƒ¥«³¾}Ô y8»LP,Â5”÷—ðs6LÀœ#j…ÜÌÀŸ|“là3rû{ži-âçüM€ÛãÖ†2" ׊øcä ÁáØ_aî[Šá,^z,NNyž±J‘ÅÆ¯˜ “ŒûÍ _ÕNp¤x“ãå}Yÿmúõ£¯—ñÇ|$aI´ýÝ]¿JkÅ €Ìa6Ð ä9›>^øBõ0?¯Ö˜kžçÔøe$Q»¸Ìµ¯×xØò8ðCƒƒ“ÙáCŠ?“õáôÍ @œ3..M“¯¢X̳½º‡+^Á,v¶2³ÎBäÓÈd¸µâ±re5 È1Ô#mØ! çºÕßCÙ,&6U¼I¸V Õ ©ú÷1sȌܸO.i×í9Q˜ÌÆvnP™K+B9¼´a”¤ìضYîÔÎsùú4Uÿ>§w}†‰÷G™>·Lk)¢2] ûB™ _)q=I©E§»?]ñè”9„8¹ýNŽ^êT¹µ»!+&>¨t;!!–v¥2ÃÜ…5J;-sl»s•{_œåïQ_˜cÇ‹ã ëMúŸÁy`=#×(ÍÿÂâ…3Ô|ÆÝÛäöú˜9V6i(üY'뜣8¾›©w':Î*“£I]pO€^<Ó@à©?b/!ä}¯ É!‰âxµjV›æ…ЙŸøî¥ý?ÎŽŒMì‘™gÉcµs7Òðeû@½OÒö+4þ±ÎZ`xxÈEõ/ÌòyL6–mÀ(Pr@Ú›ÌÛd½Õ3° , Ä×â¥8Ü Àãô–hà/k_>Hê4‰IEND®B`‚buzztard-0.6.0/pixmaps/gnome/32x32/buzztard.png0000644042355400116100000000312211576360365016245 00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs : :ðd’JtEXtSoftwarewww.inkscape.org›î<ÏIDATX…­WKl[UþÎõ½¾×ØÔ±“Öi«D´´%m@¥•¨f3Ħˆ OÓR̓GÄŒf36³© ,`…ÄH£i…x´¤’‹ÄElІ6eÚ)¤š¤!”ª4¡±¿ÎóŸEìÄvâÄe¸‹ëßçüÿ÷}ç?÷ñ]öŸ§°À4Lô§¯–›Ø{ÌÝ  ó.°NÛÁd×çÉß<ÖÕlEfôRöü!öh½ˆ½ÇÜÝ}Ý{>îêè‰6‹õ\·‰¤ôf¹ï›*¢{·E§Ï}Ú  ¾ ]=ÑÛÞ¹¦pbv'âѵA›È€´‚Ñ•YæO´Àºp‚oª‚Vº:}‡s¨<)€6¶QŠ”â %&³kdD0¬±¡©*Í‹µÕØD' ml2 Z)ê[]¼¯$@J¡Õ2ÄóAuG8´Vd“VPŠÃ(¹ìŠk¤Á0ѸR@B®H\AÐFÃ6F’’|¡õ+®1¬´‚aTUÅ‹àPZ’MZCK]î@UjM++¡±©8„T ‹ÄU‹(pp­aëbÑG^ÌW6ø § (÷¹Ž¿P,òöP·[!žï$Õ@PyÒa~LÉkŒ]ø£u° ÙKÒÀ!0ßœîò"mN…RKiXîÖ”ÇøØ,Çè‘/̓÷¨¦{¹ië-£h' ,h;ÔbµuøÏÇÀÆ0[øYs_ö{X†“†={ӼÈŒ1i8x¨ÿÕíÛ·¿"‡ Ž@ ˆ+W.OÌfòœ:uJί†Þ Œ1ûðáÃflbt¤wÛ¶Í…b~¿¡@Οýàø{ƒ©r^€°Ê€º0ósöÈwW¯Ýµ„!¥Äì\›z6mt\ëu"â+‘—±ÔåÑ‘¿öÜ×Ý™/ä¡B¤¥ׯ®Ýä%õ—ª¼)«`hhˆyáHn.—D"ðù|ð»®•hM<Þßÿø†•È •J…ï Gþ‹­ñ,Ÿ…p8 “™™ìñt:=UŸ¿D¼ÿÞÉw®^½2žˆ'àwüÈåç°eë–u¶ü×jl×zíÞës…<ÏCr]¾ýæâé©;‡—Ë_Vˆ’~~òÆ3­±V8Ž­5ººîÝ•:˜z¸Q;§ö­O&“O‚žå8ÖDïÁL&“ÏÎå^Zvë 8qâÄ—ã£ãç£Ñ(\×E±TÀæM›baÏkØ…<ú`ßCk …<ž‡D¢ÿ{a|ðøàÛj €Rqöé‘‘‘ŸÚÛÚáøýÈç󨱣¯ûÀ¡ýõ¹û÷ïßyÿæÍ»®ë"ÞÇØøØL®XüóJ+ 8yòÉÉÉ>òùl PJ`ÃÆ¡h$òÊÀÀ€SÛ íÝÞ‚# %ÁÈ¥Kçß<ý‹@!_záÌ™¯n®[›„ßïGv6ƒ={ÙP¹¿Wrýáwý»víî.–ŠxÚÚÛñõ¹¯oÏerϬ†¿ª€t:šš~3—ËñD¢ ‘HÉdÒio_÷l*•Š 8Ñhë«[·n …C!Äãq00ý(N__ Ÿ-yó-s<ü§£±Y‹ùg¼”ÙŸ6°Š­ŽDkIJcÀõÉ[|úöO}Ÿ½ýâåÕ°íUÙxá5oýþÉÁ’\"6¾\þƒ½=î?O ÿÀo`,P’„o'³5ÃÔÀrmÙ€@3ÐÍ  RªËVý~¯6‚+¬¾±w!€ˆÀ¥‚ÕÀTg8—j©«ú¿à\•ÝNÃ] ÌF‰ÿÚˆPeuþ®FJy¨$šä¿‹-àBT gw^âùK\¢YM @Mê/À…‘òÿù-hŠ¿é|s'“(rü:0µQ ¤™l^£GšÁnêI¸ó¹÷­Âôijª4³l·üA¬Ê÷³J@ZÙ"§åÇáô¢¹½öÿˆ’PÍdÇÂIEND®B`‚buzztard-0.6.0/pixmaps/gnome/Makefile.in0000644042355400116100000005734511675570634015200 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = pixmaps/gnome DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = 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__installdirs = "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" \ "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon32dir)" \ "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(icon64dir)" \ "$(DESTDIR)$(svgicondir)" DATA = $(icon16_DATA) $(icon22_DATA) $(icon24_DATA) $(icon32_DATA) \ $(icon48_DATA) $(icon64_DATA) $(svgicon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ iconthemedir = $(datadir)/icons/gnome gtk_update_icon_cache = gtk-update-icon-cache -f -t $(iconthemedir) icon16dir = $(iconthemedir)/16x16/apps icon16_DATA = 16x16/buzztard.png \ 16x16/buzztard_menu_processor_machine.png \ 16x16/buzztard_menu_sink_machine.png \ 16x16/buzztard_menu_source_machine.png \ 16x16/buzztard_tab_machines.png \ 16x16/buzztard_tab_patterns.png \ 16x16/buzztard_tab_sequence.png \ 16x16/buzztard_tab_waves.png icon22dir = $(iconthemedir)/22x22/apps icon22_DATA = 22x22/buzztard.png icon24dir = $(iconthemedir)/24x24/apps icon24_DATA = 24x24/buzztard.png \ 24x24/buzztard_menu_grid.png \ 24x24/buzztard_menu_processor_machine.png \ 24x24/buzztard_menu_sink_machine.png \ 24x24/buzztard_menu_source_machine.png icon32dir = $(iconthemedir)/32x32/apps icon32_DATA = 32x32/buzztard.png \ 32x32/buzztard_effect_bypass.png \ 32x32/buzztard_effect_mute.png \ 32x32/buzztard_effect.png \ 32x32/buzztard_generator_mute.png \ 32x32/buzztard_generator_solo.png \ 32x32/buzztard_generator.png \ 32x32/buzztard_master_mute.png \ 32x32/buzztard_master.png icon48dir = $(iconthemedir)/48x48/apps icon48_DATA = 48x48/buzztard.png \ 48x48/buzztard_effect_bypass.png \ 48x48/buzztard_effect_mute.png \ 48x48/buzztard_effect.png \ 48x48/buzztard_generator_mute.png \ 48x48/buzztard_generator_solo.png \ 48x48/buzztard_generator.png \ 48x48/buzztard_master_mute.png \ 48x48/buzztard_master.png icon64dir = $(iconthemedir)/64x64/apps icon64_DATA = 64x64/buzztard.png \ 64x64/buzztard_effect_bypass.png \ 64x64/buzztard_effect_mute.png \ 64x64/buzztard_effect.png \ 64x64/buzztard_generator_mute.png \ 64x64/buzztard_generator_solo.png \ 64x64/buzztard_generator.png \ 64x64/buzztard_master_mute.png \ 64x64/buzztard_master.png MACHINE_ICONS = scalable/buzztard_effect_bypass.svg \ scalable/buzztard_effect_mute.svg \ scalable/buzztard_effect.svg \ scalable/buzztard_generator_mute.svg \ scalable/buzztard_generator_solo.svg \ scalable/buzztard_generator.svg \ scalable/buzztard_master_mute.svg \ scalable/buzztard_master.svg svgicondir = $(iconthemedir)/scalable/apps svgicon_DATA = scalable/buzztard.svg $(MACHINE_ICONS) EXTRA_DIST = \ $(icon16_DATA) $(icon22_DATA) $(icon24_DATA) \ $(icon32_DATA) $(icon48_DATA) $(icon64_DATA) $(svgicon_DATA) 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 pixmaps/gnome/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu pixmaps/gnome/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 install-icon16DATA: $(icon16_DATA) @$(NORMAL_INSTALL) test -z "$(icon16dir)" || $(MKDIR_P) "$(DESTDIR)$(icon16dir)" @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ 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)$(icon16dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon16dir)" || exit $$?; \ done uninstall-icon16DATA: @$(NORMAL_UNINSTALL) @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon16dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon16dir)" && rm -f $$files install-icon22DATA: $(icon22_DATA) @$(NORMAL_INSTALL) test -z "$(icon22dir)" || $(MKDIR_P) "$(DESTDIR)$(icon22dir)" @list='$(icon22_DATA)'; test -n "$(icon22dir)" || list=; \ 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)$(icon22dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon22dir)" || exit $$?; \ done uninstall-icon22DATA: @$(NORMAL_UNINSTALL) @list='$(icon22_DATA)'; test -n "$(icon22dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon22dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon22dir)" && rm -f $$files install-icon24DATA: $(icon24_DATA) @$(NORMAL_INSTALL) test -z "$(icon24dir)" || $(MKDIR_P) "$(DESTDIR)$(icon24dir)" @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ 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)$(icon24dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon24dir)" || exit $$?; \ done uninstall-icon24DATA: @$(NORMAL_UNINSTALL) @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon24dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon24dir)" && rm -f $$files install-icon32DATA: $(icon32_DATA) @$(NORMAL_INSTALL) test -z "$(icon32dir)" || $(MKDIR_P) "$(DESTDIR)$(icon32dir)" @list='$(icon32_DATA)'; test -n "$(icon32dir)" || list=; \ 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)$(icon32dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon32dir)" || exit $$?; \ done uninstall-icon32DATA: @$(NORMAL_UNINSTALL) @list='$(icon32_DATA)'; test -n "$(icon32dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon32dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon32dir)" && rm -f $$files install-icon48DATA: $(icon48_DATA) @$(NORMAL_INSTALL) test -z "$(icon48dir)" || $(MKDIR_P) "$(DESTDIR)$(icon48dir)" @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ 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)$(icon48dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon48dir)" || exit $$?; \ done uninstall-icon48DATA: @$(NORMAL_UNINSTALL) @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon48dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon48dir)" && rm -f $$files install-icon64DATA: $(icon64_DATA) @$(NORMAL_INSTALL) test -z "$(icon64dir)" || $(MKDIR_P) "$(DESTDIR)$(icon64dir)" @list='$(icon64_DATA)'; test -n "$(icon64dir)" || list=; \ 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)$(icon64dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon64dir)" || exit $$?; \ done uninstall-icon64DATA: @$(NORMAL_UNINSTALL) @list='$(icon64_DATA)'; test -n "$(icon64dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon64dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon64dir)" && rm -f $$files install-svgiconDATA: $(svgicon_DATA) @$(NORMAL_INSTALL) test -z "$(svgicondir)" || $(MKDIR_P) "$(DESTDIR)$(svgicondir)" @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ 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)$(svgicondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgicondir)" || exit $$?; \ done uninstall-svgiconDATA: @$(NORMAL_UNINSTALL) @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(svgicondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(svgicondir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(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 $(DATA) installdirs: for dir in "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon22dir)" "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon32dir)" "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(icon64dir)" "$(DESTDIR)$(svgicondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." 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-icon16DATA install-icon22DATA \ install-icon24DATA install-icon32DATA install-icon48DATA \ install-icon64DATA install-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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: uninstall-icon16DATA uninstall-icon22DATA \ uninstall-icon24DATA uninstall-icon32DATA uninstall-icon48DATA \ uninstall-icon64DATA uninstall-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-icon16DATA install-icon22DATA \ install-icon24DATA install-icon32DATA install-icon48DATA \ install-icon64DATA install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-svgiconDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-hook \ uninstall-icon16DATA uninstall-icon22DATA uninstall-icon24DATA \ uninstall-icon32DATA uninstall-icon48DATA uninstall-icon64DATA \ uninstall-svgiconDATA install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi prescale-svg: for size in 32 48 64; do \ for icon in $(MACHINE_ICONS); do \ rsvg-convert "$$icon" -w $$size -h $$size -f png -o "$${size}x$${size}/`basename $$icon .svg`.png"; \ done; \ done # 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: buzztard-0.6.0/pixmaps/gnome/48x48/0000755042355400116100000000000011675570700013766 500000000000000buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_master_mute.png0000644042355400116100000000274411576360365020701 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“™IDAThí˜ÉUÇ?Õ{Ïô 3ð (2ˆ 1A=ñ`L<â/&Þü79ŸÓrL»mÚǦå8AÙ±›äî.û^¨» Äul%¥P,P,•¨ö8ïø•ψµ“@.\ ©âª ž°D èªÅ¢¸"ˆBØ"sñA«UüÓ;”\tTgè_-" ¢ÒÝ‚bMW¹×°¸|íÎc˜%f‹j¡ˆˆ d¡KˆºQ¼p=P­08<Æ™[.gn]ê 1Å侎ª¦+¿Q-Ë¢T,z^(+ˆxaß²`ÛÖA2ùI—ŸMÆs^“¶p”ºž÷×J7àñ¤+œëô<+i‹Ï÷ÖUÄõ‚Y*L°X|Pçìù«ñK`ÇäfjåÞ€'Ü`ðƲÍõÉ6·n| îp%;û:&ãƒÊ³kïFÏÝ 2Âô“zઑSWUÖÏß‹ì;»0âõwK%Ô5àŒžŒGr¡‹ßÌyyïÀÅn’÷=ÿõ ¶˜D.Ëú^()Ë ÆåO?9÷»O~ §ö¼Î…g^îjðY1Hü9ÝTHÄJÊb¢âùâ =ßÿã—ìÿmšMÃlùöcŽ/\ã—WgÚHF. ~ŽŽéˆÄ®ï–2û;Ñ ;TSUŠ%^–JÜ©ç÷-—‹¨ "â:E¼o‚!Q§YRK\¥\.°}ëÆÎ“2›Åo êM’Ò‰„SO°¡œeQ¬¤ÎU,µü¨N/äíÅù«ów¶èŽmxzp4¸¶$Ox¼f6j ©‡úÑ];âDÂw"¦M¢Ä¯Íß·[vý Ï«æ!`hÏ‘O?É—‡Þà1ôíUZÍÓ¿ûèÍÝ}ŸTÍ3€w=E¼3ó &ÉE§¹í¬þ¬9I} ´XêÀðXOÈãF(Ѿ…¸k^ PJÜÅ#aã‘h˜rêByóøýÿ6ènã„cÞü Èð:ÑÑž¤úIEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_effect.png0000644042355400116100000000315511576360365017605 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“"IDAThí™KÕÇÕUSÝížž1È`cÐø…y$1a‘,’ È„„e‘À"_#[¬‚HÀ‰ ‹xÁ"±° “8É ÆCìîa¦gº«úžÃâVU×­G)s¤žzÜÇùŸ{^ÿî=Ù“=Ù“=Ù“=Ù“ÿ_ñ²;Å{æµö2– n"¦Zñ<¤á7Î ‚áï>ø#€ èS¯6{û»ž~îW/^£*µUËïPw¦ šÍU{Õd¶*š¾Œ˜Æ‡Ÿ¿÷ðß¿\þ ÿì€È±Ã·õ¯˜UV½F¦Ë¤¢š{Vû<îŽÝãà- áù‹ŸÜ—îuCCe:ð<ø²QªŠŠ¼:Å€­Áˆh_Wàö> £‚1ù°I×h2-lú„ÍDÑÆÎŒ¶#–?\¡Üz] ؽhvQ``zœ8u' ÈP„Ñ0f_°Ÿ»Ì£tæ[ˆ‘’ŠñX²ÓÊK yJ›n °Ö<Ëh!³Š¨»—c€&É“Jg¾Åÿ9zMÊó2Ž ª0N GöÇT‰#Ã86Œ“k ñhÌ·=UEDPõ§@Œ?’¡U>Óôw˜éÊ?O7PQD×nF”ªôOGDAErÝ(ͬˆë›/¶‰JbÄDŠ9ðS>Rê®(J¹âÜtÉ5;™ÞÈì çAlFlI¯ÿ{áFÁ¬•QÌ„"‚¨8‹ƒâdÛˆï?”Å[žd€ecés YËq!gm’¬•cª–¹N !$iW ¼Üկ؇jàé{±aTg€$¥ê»Þ€/–ªcÿøÏètÛ»î²ÐzàÛ[k_]®Ô{àŽýH¸•@HâLé·qpøˆ3|©yÖRZÑ싸tzS€—¸¿³Šuô®…Ä•e´D%TƧ°ÿ@ÇáBïž^Êq’«^Žex1\ŠzßùËÇˆŽ¬^™V…4É)½Lë ¸²p~“{έ£À—'ç¸x´S îðé-ßß`åÉ~ÝvŒÒ)-H…Rª0 9]™ÒÕ’ª4™Ož¹ÂâRoc»âÔ7C:ýýœ{hÞIØ__gñ­M.­Ê‡>ïÓùO̧/tK(ëL±)^Áe2'‚N9 IJ™Šâ '–z¬ŽaÃóØð|öó.Q0ù5jy|öì,÷z#æaÞNxC–Ÿí0jÚò™–ç:ŒÈô>`l&%'W±™¦®œ4ŸO~1ÇúœÏ‘ åÌñîn'¹4)©ËÏwX¿ÓçØÛ€ò·Ç»¬þ2ÌõJñ]:8-7„ë©94²\™\½»ÍÊáV¡ö—¹ÒÊc!ÿ~,œŒ‰Û7êÂ'-ÙFÊ?$d˜ˆ@“o<Óª’pòʦ•>W5­)F}¥}"ÉA#Ù—êÔ€v¼¥-UÁ$erÓü³ý·9ûŽ»ÕÁÎ-ŽÛ3°uL²¼ž½Š*[Z­·ÙšADðT13@Ø#ZãˆUOEh¶BOÞážVŽ…¦U¨øîi·}ö fçÚ“¹Ú-Fð0¨ÁZ@`+‘¿Ýó.^î_Òã‡äÞùƒ™‚4œ$%¥°Á +u€‹Jn]xÚ4s•p7—DmÝûWm²ø@ÃKnº@÷‰—š/‡ûô÷Üà}¯VIEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_effect_bypass.png0000644042355400116100000000317611576360365021171 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“3IDAThí™KÕÇ]U]Ý=ÝmË0{œl#(YaA)”E>@| ¶,XE‘¢d"`Ć^xÖxä`˜al,1vg¦gº«úž“Å­ª®W×xbc[Ê©§÷Ö=ÿsÏë_5°#;²#;²#;²#;òÿ+µäL©ýú¯­¿ËH^UÔ»‡˜&J­†8®óqß¼ðÁé$@_ùKãù‡öøÕï~ö'ÏsýÛT¥ö¯jñš©‚&sÕ5š­ŠÆ÷#Æ9{á½§ÿýõÜk0x=c"Gf:ìÞ0‹,ö?ºMªe RQM]«½ÏŽ=èaúƒþ—Ï?¯uWC¥x|Ñ(UEEs^­0`£?$„w¸=Â(gL:lâg4šæ7\üFQAÔÙÚ€áfÀÜÙÚÞÞ;bÀöE“ƒ}Óãñ§A}ÙŠ0„Ly{8`NÓÞÝDŒTŒF’ìVZÂÀËSÂÐüï¶ËY†ƒé(¢Ùµ2h”<±´w7yú‡oKyZFAF‘A£ÀÃЀ*a`…†Qt !ޏ֫¡ªˆªn…DÁø=‰ç[åõ†»Å̬\<ã ¢ˆ("Yd3¢P¥ïAPHE´S˜Y×÷^l9•Ȉ±d ÈçÀý$6|¤Ð² (ÅŠsÏ%Õ줺‘ÙÁZ B3dCz\ùvénÁœ(Ãp@]=Ä&Bf,W…¬‹¦º-vﯳ|Æò¿òä+¿|¶é”ЦOµäÞÄÅQÀq¡î{ˆ¢’yØËOV±èÑãû“xKó‘Ä”°d,¾ž@ÖR\(ól”¬¥cª–¹V†5Œ[^îV€—¬C9ðø¾ˆØ0šd€D¥jµ×çóså±ÿØÉƒ´»­mϲÐÉÀ77–/]/Õ»ïá=ˆ¿•@ˆâLéz2=x&3|µ1k)­h²‹y \ؽ àî/BÇÙÇþàtFï²ÿ HXZF TB%b| {öµ3\èÝ3çRœäÖc9 <.y½ï|ø¢C«WªªF9PÑËD°H€+3_¬säbU¸xdŠK‡Û¥àfÎlðÃ÷×Xüe›¥Ÿ·2FiE R¡PJ ˆvW*ú±ZR'ó‰ÙN]2óø!Ì.ñéêˆùSÝLÂþøo79ôÖ‹%r'/ôh2ÿj·à¢Î›RËy HæDЊ­¨”©(îÀðÄÜMŽýäIºÓ{éNïåØOOqr~ wh’ÍðÖ ÇÞZeÖø\s]®¹.ŸŸãÿXÃëËDšß\òs¢"ŠIªÊ„…$æ%JçF€×iá8ãe×Ák7èö„w/…ô='CRè»»–‚ÄKù™Ý8ç@jZ‰LÅNŒ©(7wyŒÖIß#„ëVº®§ÊÊA—ÖH2Ê m„ÞA7Ùô»sѶ~©ULäöIb˨­BCæOtðÏÎ1sô\þÏsÇÛ^-ÙÙa³Æ…ßv8ýÏ> ¡ÍÕ çÓfØ¢õªôŠ F§ª›I‘+KÓØ•ãæsîd‡>G—@•ÏŸlðõ¡Vbd¼«çßfõ—Ãl¢(³/vY|ÖOõ ñ]Ø8-˜l#S¬*s jd©2¹x¨ÅÂL3Wû‹\iá9Ÿ¯žóÇc’í“Â'.ÙFŠL€§ÑOUR"N^Ú´â벦µ5ŘBqŸˆrÐHòRÐ 7´©*˜¨L®›ï˜]y›Ùw²KM·ȸ=;‰I€Of¯¢Ê†–ëm4ëˆ5dDh›^dDsà£ZSMŸG=œÝ­ µ/“oŸvÛk×qèìjçæh·¡†A .ÐB[ÑÜÍ^íòõ•«úØÌ ŽîžNÄá$ ()„ ™°Ò pQI=—7Í”‡D%<›K¢6‰¯ô¾ ‚upjÑIè¾ôFãMJ_æ.ô½U©„CûøÏá®ÏsXÿÁÑÚÑo ëž:¶¸ãçËÖÜJç¶ž)S`„ÀØúÀ:0H?àb£øŒ½ÿvt'@m×pƒ5"À±O\È~ñø÷ z«ù‚5"ŒŽ‰üT¾b]B?IEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_generator_mute.png0000644042355400116100000000310511576360365021364 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“úIDAThí™ÛouÇ?³·ÙÝva±¤´A!&‚&*Þ#¢ñżÄÿŒÿƒÏ&¾kÔƒñU#^¢¨AE°x‰$ÆZZ(¶íÞgææ²ó›%±'ÙÎoæw9ßïïœß9g¦°.ë².ë².ë².ëòÿ+l(XÓ/äßôyFÑ j˜X’+¾ÁuÝÿM€èÉç94²eû“·=ûRÁ*”®^‹jüfHŸÏí÷%îU5¯âå>ﮥN¼òŠA@a×ÈöÝy«1ƒ^øöê ¬A4οUÿ^Õ‡õõû­;©Nî(ýõãww„ký«®²Vࡌ~TL«%ÐYiá¶»×8!b®‚”8ð ?Ì,ØEŠUDúd†Pz­¿|:M·6yM$©\©Ø+3Üvÿ.Šd` “@`Z§ÝÅgfÇaê*xž ,긚‚§ç¸Ï{Ž{UÀCÙ=w”^»KAt h,õ `ï?R—\H¨õPUzŽGÏqƒŸßîtŠç­›ÜTº^R*úêìÒ•ÅŽ3?YA4òPµŒ¾œ9ôúÿG¢DáTE!æÑ™.t#‰O`ð,°v#Šª¢2èBƒÎxƒZ‚ æ§„Q°° ×¦Ô¸ÀÊï?ÿ‹ ÓÅí´@˨ *™T…r}„-›‹¸óŸ°0oŽÐèÑH ˆòkJúsMi…Í|ŠÕ¢O€Lýƒ2uç­f}’UÇÄÊ%4³®>/>.ò°€3牂%™NºÏt ÀÓ °5ÍÞ—>UT%oX)%Œ Í¥e~ÿòGÒäæƒ{¨ÔG®x0Cw—;,žšKÕ»iï*£B2’„Qßú6~:l Þ=w42ozÉ›µÓÇ„U„öÆ)Îl{ÌÐ{ûÙ©k/ðŽ ˆƒÆÇjF-tæO¢„²vàIÀñyÄ\±Ÿƒ’z}ý#¿K²ò€Q(-ãEcB Ä[Üà {A•Ç'¦ypÓÏ©À[߯Ð>ÞÀ¾·Jõ@Õ8ôÉJÓÔ+w˜Õi/t¡Œd¦‚ˆ„«òöìAÞùã——/púÒ!ÎnßÄÓ“_ßéå÷/Ñù¬ÉMµÍ\<²ˆwÁaäp-:;Ù‚™Ø\ƒŽºÇ°…báR…¦[äݹ»¹¸8‹Ûmàv,-žåÈÜ=´ÜBÊk¹4?¾ÌÖ‰TFG©ŒŽ²ubÍWðZÞ€U‡AÔË&€HFòÝL‚wÓÙö&,é„UKºÌvÆ"k:ç{ì–Õ÷_˲(ÚE¼…ðpÖúq½á¦!qr±–hdέö"ä’Àr¨e3Uº€ãòãyœn/ATqº=¬ñ¼±æP½aðH<7-&1³^H_H•ŠÕᩉ¯»™B©F¡TcllЧ&¿¢œë~E°l‹ê#£ÌŸ›¡ÕhÐj4˜?7Cåá*V)¡whœO1]h õY¾<ÇFŸ6ü]{zëL•—øèÏ}(pxóqÖOû»ê/ˆ¢T³¸tb ìGËØûìÀu€dX? %Ýl0Œ®…â¦cø}õiîÛ8m&·”PÚoSÚoGó$ž‚öjz5áÞ®G¡ŸÈV[(‘¤Rˉ¬¤… <\W†ë%ü"¡‚+’O¨,÷(o‰™©|yމc¯rò˜¹NyódßìÑŽgnÀ“Ù\P*ËóTÒôÞRÁ©ÏÑŠ@hå¶KIKU(Õl¶=´kˆâ 4àq€Éy«ÔOùJŽÚÞ Cë&ÿœ¸.y  8üH”?ßdvçùsjí¿“â¶q¤íxX"EÀe@üðG×x;.æ¼°¡1÷KoÅá7 䬠QjŸ>c½V/òzãþ årêåÏyîø< Àr˜l`$øUñÍSÄß×ðÀXɇ<[­?kNZŸ.à 4ЉOÈã (Ñ?à‰_×Ô•÷ðIôðI´ƒöÐ…òÁ/ì¿Þ W/ø$œàÉß®°é‘W½tIEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_master.png0000644042355400116100000000273211576360365017644 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“IDAThí˜ËouÇ?3s_}?(/Q¦(*h š5ј¸ÑH\àÆÄÿ†k÷Jb`ÃVE“.HÃBh¡"ÚRj±½½wîœãb~3wfîÌÜK¬ØÄ{’éýÍïù=çüÎùžt¥+]éJWºÒ•®üÅj6ÕzáÃ/?÷TO¨jῃ”'*ŽS˜ª®º¯Nqr zôƒS¯ìØ:òÖûo. ÎFæÿÕ´ÞfCTEÕt©†k$h((ŠˆÚç¦n™þùÎGÀÇ1Ô¶Çw?2äÌ¯Ôøé·û @¶¨jø«jÞƒñ”÷£=ìÜ:Pš½~û@°×C½*¹ÀÍ»ï„"¦_DÃ=Ú*°V­S¯»Ü?·y=¢×%PÄ´ŒÍ÷bÁ¡T* ªÍk•©€B­ærizŽ‘^ÙÚŠ†ДáåªÍÞñÇŒâc- (°^w®(‡·­Ñ?0ˆH«"†ÛâN€†ÛÚßp몒*3‹Ã¬×ˆ*žäx@ƒýƒxù•@¹@!·ášþºéwqÝ: × Ûn½†}o=ÈBíc yÇ6R Å"ÅR €ž×MÞ˜òƒX[°£/‘«¸éDEÃ'*qtÓâGQ<D!‘vrÒf•ÀúÉ„bÇgµRÿfQ•öi ¨yÊrÕâú­¥‡0Oªµ=…""†È"Nˆ§Q|ºîí©Ð78ÊåË s­ÓÒLkyÕl² :5¥Ó²,JÅ¢Ÿ…òx@ħ}Ë‚=»w„ÅT’ò[Š® šLÖ:mÑ(s?ÿrP<<(í€'‹®h­Ó ð¼¢-¹ÞßWÏ'³L0d±r+Wo& À¾ñ]ô÷–;žâÁ<àÕõ:ÜN¹­cCxƒ•|&õ)On¹›ƒ$XÓî ‰˜@ÉØLTü\œsÏŸÿî'Ï0¯ ^úu–¡Å[L½x"7nDrj X8>§…‰½ ¥leÎ5q¢au¨¦-ª««<;y†9[Yv–‡9[ynò4…êZ3J$5ŠðÙÿ@ÅŒ›¥@à¦$YÄæDÀj¢­¢ /ܤêbê PuF1 $¼iˆÌcÍY’OdQËdn„›A>‹£»({ ,»éCèix,Œ>‹¡?˜_+ëTÏSlË'²w \èÚ\K˜yëj¥.L¼Ã>±ò<†<½bq~âmjÅJ«£È1\lNdZ!1ËgâvÙ âVº‡óÇßeit‡~øÎ=ý?î?gà†ÕDPF gŒ„÷Q< Y–¶³ªaY›Gd³&˜Ý,Æ©µOt½ø{dž+ vF H£^¢\s¢)¸.YÀÓ,Ûxàì$Úü"aŠ~û èñê«T-1ÙàîšÍÙ‹ÂÙ‹ßÆ6Ú¾m$tQE:žŸ(%–ÖœÔsËå"ª‚ˆ…xnÿ›@µ`”¨ˆ[+©Š%žR.xb÷ŽVK™Ã’ˆg“öuP‘Ù–E_%s½¨b©x ¸üLäÔWæoÎ/=®ûölç`ßHè¶4úof^L35çD®G˜=´…o$fˆ ‰˜>‰+~kþÏz£¾vpÀϪ0 ü­N‡V§Ãò¬¼ÒÇëK%MÈo®ÆñY©€ˆ¥Y¥b"Ix‰Ò¹0tËZ n/L)p÷Ó·YÇq&_qÇÁmÔ™]R+åS¤½q:‰L· DSvb²Š²=ëÑTÍ|\26¶º®é§ÊÖ’ËxZóª*Ñ( ·ä¦’=;5 ôPo[@•(6{•˜4jÌ>òàý‡ç8Y‡9”9”uxï¡.79Eš3ÃÚæ:ƒ;;¬m®³ú\‹QäÏ$=W‰¨‰L¯‘‰¤Ø”%“ibÊIñyge–íY—åû€òï“mÖµâXš¤ÔÕçgè-Ö8ók(Ê¥§\yÜÏÔ þ]Ø8-&»)ÆSc .d™4¹v¬Å•£Í\î/r¥ÿ>ásù Ò&vݨrŸ$eGRü*xŸx¦e!%æä¥E+y.+Z{SŒjJêDƒ‘¤‡êDV8ЦªÅir'úŠ [å«öT í{,³§`«˜dx5{UZ¾n£YGDpT1u ìz±Íq€ª£"4š>˧íÝʰPs°¨¾ÚmžÝZÎlkÒ7G»%"4š@èa2‘»Ûs®^ÛÚÔ“GÂæÒw’”ÜË­Ô.*™qàIÑÌXHT2ÀíX5Aüyïrìppšßtî/_jüÑŸÑ_q‡?úÞ¬8 áH/žÿSøÛkï² |Ô ÐŽ3óÔ1 ÀŒ/›s¯5÷5¦¬M1bŠüè;À0;ÀÅFð™X!ÿíèv€Ú¯âF‰£Än|_9‘ÿ’öoô^ý£D_Sù¼fG".3FIEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_generator.png0000644042355400116100000000310111576360365020326 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“öIDAThí™[oedz³»³ÛvÛ%ÅB)ˆ1©0Ñ€‡ E4Þxáh¼ñ xaü^›x¯Q/ŒÆKc´ÄxNÀ‚I PŠ[m»Ç™çñb;ïìì´ ‰}’íÎÌ{xþÿ÷9îÖdMÖdMÖdMÖdMþ¿b… Öôö‡^G*šÿ/AõËBrùü¸îó;?b züuö nØúòý¯¾•·òÅ›×¢¿é3¦Æ3E»c‰{Uæ«x¹¹#Ÿ?¶ðëOo‚¼cPØ>¸u‡m-G¯üxóV!šçߪ¯êÃÆºãÖÈ Œo+^=õóÃá^wÔUV <´€1 ‚ŠiÕ¾š‹uÜFëÖ'BÌUðŒ‡Àƒ•y§@aÀ‘.™þ”v½É™ÃÓ´*ã·„@’ÊŠ³xžûŸÜNaXz¶0 ¦í4Zt†Æ8¿m?Õá2ž'=›v\MÁÓî¸=ÏÛ÷¦€‡²cökÚyÑ, ±lT‡Ë¼øÔä¿R—\H¨ûí¡ª´;íŽ|üëf«Cá²`’§“êB·KŠ_S¼±Üqö7+ÈFª–1–3§Þ>ðÿJ”(ª(Ä<:Ó…î&ñ ôÆ¢A Lkw£¨**½.ÔëŒw© ¨jqJ Ú ŠKWXuiËášmsͶ™¶jS5¼º×cÕ¾Dõ² ’Q„|7“à·éLc–4 ª‚%-fš£‘5;—۴윱«-Û› ƒ³·×ë  ɰ@ÄÉIÆ^¢‘979ó+bYÝÀ²¬j9L¯ Á<{ÌÆñĨ¡9ðŸÙÆž}õ†É#ñÜ´@XÄÌ~!}#UÊV“W6~ÏèèòÅ ùb…ÑÑ ^ÿ–R®EøÁr,*Ï ñˆ¶ñ Qj¸E±T…bÅaó3Ûû(ŽJžÖà%-Õ§ ±Ë9*“Ã}û&?N\(<~&²//3óÀå?ÕÚ¹›Âæ1¤xX"EÀ¥@<ø£ïDSGÌÉþ)HïK³gÚ‹þl g rø õ^µÀKèÝûÿºË‰·ðÚw—˜jamq€Áà3€ožþ¹†c%7ìól¥ñ¬5ic ¸@hu`Xšñ6~`8@‘n€'^~ÝP7JÜÃ'ÑÆ'Ñ®ûndŸpüvƒ^i¾à“èß‘üZ«-ØU÷IEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard_generator_solo.png0000644042355400116100000000311011576360365021362 00000000000000‰PNG  IHDR00Wù‡bKGDÿÿÿ ½§“ýIDAThí™IoUÇ==3=cÏ8c’Ø„˜„,$‹K‚8°H Ä…/Àñ8#qá‰[8‘X‰ €«@DŠ²Ù±­„$vÜh¬;n­ØÄÀšõÅs‡Ü꺮¡²TࡌqTL¯ö%М¯ã6ZW8!b¡‚”8ð`<¬Ì; ˆtÉô' ´ëMþ:8A«ºæªHR¹Tqæ³ñ‘͆¤G…I pm§Ñ¢SáøúÝÔ†Êxžô(í¸š‚§Ýq{ž·;îeeËäç´-ò¢‹x@cÙ¨ •yf×ö+2—\H¨ûí¡ª´;íŽ|üëf«CaÚ ° ÉÝI ¡k%Å‚oÎ)^Zî8ò‡d#UËË™S¯ø+%J§* ±ˆÎ ¡I|½gÑ ¦µQT•Þê ÆÔÔ5·8%‚…íÅ‹³Ìûó:‚L·Y-¡*¨dz@PJµAFWp§03eÎÐèq‘˜Õ×”ñôçšr^Ú%( |d蔵÷m0û“¬>&Ö&(¡›uñuñyQl„ œ¹N,Èô@pÒ}¦KžÖ€-i]/ðî¼ôu¨¢"(¶á¥”4*,œãØ×‡I“[wn¥\¼àIÀôÞškræ×ÉT»ÃÛG)W„d&íI£*¾šµ1þ^»Û˜¼eòóȽé-oÖN÷V+Ördla÷öSŸQÓv5&¬¬½Ð‘DeéÀ“€ã눅b·%íþýþ¸?¤Yu@ƒ,”Vñ¢9¡b€¾:³•ñ³÷ðäÊŸytøTà ?Í3÷Í<Õ‡+ Ü;`úd§iÚ• :ÌîÇô€†PF1SADB­|<µ‹Oÿyœ›Çnན8ݼ‰—FßésûÏ1;~â›\ô,«fÚ íŠÎN6 C&6× £„áÑOQ,]ª°àødz'[#áZ…áZ…­wmcßÌ#ÔÝ|Ê«»\?Ï„åpÞ¶9oÛLXsãsxu¯Ç«} ˆ êe@$£ùa&Á»éÉÆ0ƒ¥<¹\7.s9‹R“Í•‘7;ÓmZvÎÐ*@˶ðfÚݰí·q±MC2<âä$C—häÎ[œ3Ô›$ö¢-¢,4:¬-Î"Á<{ÄÆñĨ¡9ðŸØ†Î¾vÃä‘xnâ°ˆ™ýBª"ÊV“VÍþÃEFÇÖ0sê/®>D)׊ҬåXTŸ¬p÷އg çRy¢‚U ìFá™A@3„zºQ_YïËslFðÓ†¿k/~Á-…YÎ<(Ï­ú‡j¿û»ê+DQª»«äWÛT¾«Py°Šsm†_[2<€Ÿ…’aÖ›FÉBqW‡9|gm‚+&Ìâ–RœÎ'Z'ñ\/fWáhyä»…l1E‰"•ÚNd-Là¡^éo—ð \;I <צ4sSéÂ$7z‡_™zJ«ÖtÝíxFã– Qj¸E±T…bÕaì±Í} Ç¥Okð’žêÓ†ØåÕíC}û&ÿœ¸.6P:yüŒfO/prÓôiµvÜGalÄi;–Èpé?üÑw¢©#<ÌÉþ)Hï'ÿjÏw8 Ø@Î .ª@õà^ëÝZgÑ÷ÿu—_ßú’W¿b˜ k‹ Ÿ|÷ð÷5<0VRaŸg‹g­ISÀ:@¨ ÀE _`ã (Ò=à‰¿® ¨K%îá“hã“h×}ÙÁ'¿Ö ›/ø$:Áw$ÿ3 š¶˜¯h´IEND®B`‚buzztard-0.6.0/pixmaps/gnome/48x48/buzztard.png0000644042355400116100000000442711576360365016274 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<”IDAThÕYkl×þîÌÙe׀߻¶[¨I‚MÖ††G¬4†6 …ü(2°Á­šVj¤Rõ•–¨irUÒÆUE«4Œªˆ¢F…D”&BUIKÀTjŠÝ`JD¦mlïÃÞõî̽sûcŸ3;»Þ-ê‘å½sï9ßwwîœ%Bü? ùÛ“t¿Áø!­J!L¢òàÊWô›·ík?gƱ'Si\ÜEô®oÿŒJw5ú`$¢;ð4ûôaC)6oë¯úî­?¤¥:{ =Š—NìeTA%‡âê«U)”–¥xUAŠŽªÊ^Ï¢/AAiJkZ¹ÉôŸyÌr)1­ óì™ì›±,VÆ“ö(®s–3SXY@g!d‡yét¦é™ Có¡'„ ž;µ°±—;YÛj“'Â"BBêx„‘òÅ–Ç{¹}Yûc÷ÞsÂÔ–g!py|<~ëæÍWN¿}æRjí,€ÛBˆ©H˜ìmøÜ†-^OóÏX½Ú-É$‰@–d|üïqitôƒ7ÿÖÆ6 %mz¡éïÿ|+dǵõ½ë]Á`ÑXÂp:X\[‡ ÃÃ1]â¯ÿöõæ\Lü~¿JdÜX¹ªÛ ÌÌD Ë2T‡m­m8ûÞÙèÜlâñ@ ðG»õR!ÅGŽünBÆk×®Ïyš= ”B¦š¦A–$,k_¦R.¨|ñ͆†úEõõ ˆÍÅ ¨ E§ÙƒÛ\Khç /Jb³Úó·'nÏiºŽºÚzP*ƒRŠP(ˆe÷.£ŠJ·lïß¾¶Rì}}} „½>ŸÏ ‡¡P UQQ³p!Ün7.k:øî¢ü‹ÝºuSD¡ñ×^;~¢T\%ƒ‰gÇ.1BjׂR J)¦&'ñÀšµªLå]Û¿°½³Ðz¿ß_Ÿ~¶wƒ; ‚Ê2TEk ‹këð§³gãLO•ƒ©,@`Ú Æ¾ .ÄZZÛ@ådt¦ƒézzzT•È¿*´^VÈsŽÚºÚÔCKMn‹c££L×õ7À_ÿk@häÅ?üG8Ž ±±)…É©Iø|>Éåvõìèßñ¨u]ÿÖO‚ཽ½ ¦ƒS©mSÁ¢…‹ (œÖãBÿN¹xÊ&4_çÝwb^ªš|¸ D"a<òÈF—"ÉLº uxø¡Ï(²,A×õ¬÷½-8î\œsþ‹JÎUe€cG½1==5~óæ-áiöf¢ ±téRx[Z¼ï¿ÿ•ôü;·­s¨Ž-k×®£ÁÐ4TUª*¨««ÇÜ\—.]Š«Ôù£J°TDŒ=õöéÓñ††Ftûº±²{º»VÁétbÓ¦M.YÂ`²hY¡7oÞìt¹\¸ï¾¬èìBÇòhkýNýáTLp㻇ŽV‚£àqz>yèkG÷sÆ¿/óæQŠA’zYI­†²"ÿdø¥ÏV‚£â=çÆžgž\OœjÑnú¼×tò¡÷¾àK@Aª‚3£ÿªT`c·§¤¶|!©êWÌóž;'seí2sK{¥L©Š€ÎŒLƒÊÚ'²kJeçåèÐÍ]r¥JÜL -ÖnsÎS‡A Û¡«Pª" 1Œg[„y‰$lZ" hw“€®s0–NaÛ:æ°~½«)¤å¤PZì~O°m¡çè¨Fª/ÔeFIµ é¥t# Ku°¤Pú#¿lšƒ©yšµK]¦ÜñÊíá›Ga›Zw—€ÆÀ9/ئuž¹ÈÞHÜ5„°Ù˜N»>UŸ··–'qs- Dc@HÅ…P1 <ó—ž Wª#)‚k±ð¼mùBRñqÈo“§‡-ŸÅÆÒmò !&+Áðêx#ÐÆ‹IEND®B`‚buzztard-0.6.0/pixmaps/gnome/22x22/0000755042355400116100000000000011675570700013746 500000000000000buzztard-0.6.0/pixmaps/gnome/22x22/buzztard.png0000644042355400116100000000173411576360365016252 00000000000000‰PNG  IHDRÄ´l;sRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ+±ìêS\IDAT8Ë¥ÔOhWðï›»«ÙdK6µ&nþìnôd6EÐP"jÕS…C[ZO¥ÅCõÐ*ÅJ©”öP(D)H%šS AÇ3ÝþõsÇ.FÆ<—fDI—¸ëõe>«Ù@œpçÜ{5€çò¾³_d8¾=Õ'wM¸ÓÃDÕ-;˵ðûâ%Pe+¨òÀþÞHàèKp,£ÂUe‚¬—aÍ(ÃÐm€È‡ÿ.¯Á®^‚m™ë*^ÁõR ¼¬—a<±|Å–Ëk°¥-€½¸¯’à´lm!~¬•ÑÞ¿òê'\ÒV`&°ks£Ã¯%‹ÝÞ8ÇÀnܼýÓá ŒYÆ]àU­MMñLº3ý~*•T,ËF¡ðÐÎݽÿ¥®ë¿Ñ ÌØÑP(´¯+³÷ã¶ö¶p$ÆÌì{6?û}±X¼ào‰ˆn®ÞxKíH¥SGEÓIÖ‘lOýxåêÙš#Etýø@öH2•d±XlÇõ×ùyâ׉“Õóï xÎù™¼‹Å°³¹Y–åÐ1UU÷n„UUM˲|"‘ØjlŒcjjÒvàô]¬õ/ÃÃ×rÏ,Î?2Æéî ‰;_s³dá»î—»ÃŠ,£Xœ·Àù£—Gó0ˆ,ôéŸù¼FÇ…úXCWv ûÚºjÕEëz[Zš…ú†zär÷Ǧ35­`ãÄÐÐвç9§'ïOꊢ §çÀvIbƒªªŠŒ1&ÊÂ…ƒ½½Û"‘r¹Iˆ>Y|& ÅKç Í•DADk"Žöd£ àÝì;m­‰–t*Q13;³ì9ôíf[»ÂþÑÿö'§‡÷|Åáo4Âjã!ŽzsêÌø¥Ï¿Ø,/òrdO]Ïn¼Ò•Øt}âÎÆ~ƒ”„ÀåSsKx0¯ùšMûŽí°]o«èÖ°i¹Ðt †±Úl*²öD‚a:Ïë¦E·`˜¶¯çjº Ãú°aØhiªÃîÑ*J8'ücØÏ {l|º°pzº° ýýQáVP<ð¸1Æú¼´EQ"€"]ßlñ)èˆKÔÜBIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/0000755042355400116100000000000011675570700013754 500000000000000buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_menu_processor_machine.png0000644042355400116100000000106711576360365023066 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<´IDAT8­’ÁJÔQÅwý[s´ÂA‘4p%´ˆ‚¤MA-¤Eô½@oÑ+ôõ5µZ´° ”42E¬É­î½ßwZÌèL‚Ø…Ëý÷ûqÎáIœåTδý?á᳑¥BCRqªÅ~Kº[–ï\PÜX¸÷oBr$a2䎻pï>½.V>¼\®öh¬ï­ðvíþFH½ Hqmn‰ì@ÀqZßڌڳõ«'Jon­±ßê`ƒÉqwF‹’ÉñË'¶v?“-aæ}€y¦8?Ìöf“¯­&ÇÕP7Šc; j&‰)õÙc%ó‹uÜ·^XÖíhvÇM„!‘ó€3#åD±÷“Û/6‘ ñh†v9„›3ü%²ød$VŸ^$Î%²uTޤ©ܧÝ6:cf½MŽ™œŒZã}¨UaòÍ!1þ"åØ˜1%6®œ£,+”e…ælAJFŠ™[#Ps¨9Û7‡I)a6`!åH­ºÀØôï;îÆ”9—ܺ”™ç"[fÊ3£c@¯Ê@8U•1p?H"„0Ì?èWñ¤w8Vÿ¨û]fŹIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_tab_waves.png0000644042355400116100000000141411576360365020306 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<‰IDAT8•’½k“Q‡Ÿû&Mš˜˜´Ic¿b4©ˆˆ-‚Њ èà"Š‹‹“ ¸ˆ¨ÿ»“"ÅÅA7¿:ŠCü»´Õ¦yÛ´51m’7Mß&¹Ç¡±QÁÁ—˹çœçœ{ïO:2xÆ0ŒûZë(ÿa†a˜Zë+êðà±ôõkW£ñxDÑ‚"²½øuÞðS3³Üyh:µÖÑP8ÂÓ£Ôëš¶~›@Ü&5êE‹ Z#²Ó¢·šœBkux=n"¡Z„î“ó¸ÂÊï{Ð"´mì| ˆP«×±, ˲°+%œùÕó Ë8wÔÙ) nMze åÔì.2þÀÅ|:M©d5®ÑX¢ ðíh¥³£àÑ,¥o>Z{ËÄ’^þMü„]Aâ.*¦€ŽP`ë1rù³fWr™É75ò ›ü¨gXp~$ïšÀêž`E¥HÜg~uŽ©”If9ל ï|9—¡j9ñ;©6 ²Hà@–c^¨RžnÁƒÓw‹¬~j§/ð¼äâÙKƒ²eaÇèu¬Òytƒ¶Ø:¯nø9û$GË®"oo…‰ ظ|y,»Øœ ¶aãq8ðü„~|uÑ¡ ªy±ÀŠŸ«ì<¸F¨ÒGíÔûxO°´’c*en«ÌÕì÷V™{íf*e²öz‡ÝLN7sö&²M@$$™øSÉ5kçJÉÄ.Tj*$žíxgG[°¸”ãëÌÂölÜ òýË:•l£ët®”¢wwcÃ0ÌM{=zùÒE~Õ ²%ÙSù¿Å—0 ÃT‡Ž žQJˆHÿa ¾[¥Òm%"(¥b€(ÿ™óϽhÒ?<&FßÀµkŸ¡TPW.jpg‰¨-EJj‚™ûýq17é,$Pê…s‡{ΙÃá îÎyNv.õÿ0_¾yBØr÷âL¦îþ46ž÷ïýû·þAsÜÁÜ1K“î?ŠwŸ†ùŒ:òaç;¡)wðd‚{ú†½UÔ €|FÆ,·rÖo_YýËî/F'T掻q±¼@wåÒBƒ²uŒˆaM5£U,±»À×½£:'>ƒ„>«…ÞZ—Xé©A§Ó)X»³Z¥†šcfiMhfdY†¨7¨+%F ŠÃ=½~…»óþÅ&ÓåîÜ¨ŠŠH 1ª(ˆÔQ”«;Û0>"L޹6Ø&Jý‰JUE*±SU« iD”Ÿ½>Vv°²Ã·õÇHT¢Q”i¥¨6:¨DY¹¼D»ÌQsT »Ñf¸ù3㦦Š'ã?@Ze` 8Ó*ã^Éô÷³àî„ÚÀ]`óe\„× ðù/àG!¯ù;¤ÈIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_tab_sequence.png0000644042355400116100000000070511576360365020773 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<BIDAT8•“­NA…Ïl$ Ù P¸Â`0H<¼¾‡§¢„$oA`H@Ó„`¶-Ý™¹çbËΖÝ%Ëu;sî7ßü¬y8B@Cí^Ǧ1Ó€þà¼2ñtv²òÝ õô´Pqxžæu_з»"œlV—R¼\CU¡J$½ýh@;…xµì´ÚOR $T ÐE€Ø¼³1mgÅ‚"P%”„[d)¼“¥µ"ªDPˆ[$;EXêbW¶” Æ·7•†*ÀKU-άûs×íË3P¢#Y4hSÒç×H‚âsÀ_¯¬l§tXëíAi¡>Ý"´y‰ï£‹ÚEò-¸)Âø¾4›&µ?ÿ„,æùHèÌ>šòõ›NÖ·‘ÿ—>üð:ºjÝð»¾ähÝ-sÇIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_tab_machines.png0000644042355400116100000000126511576360365020754 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<2IDAT8•’?LSQÆï¾×šZR)0¡D%„kHŒƒl.¢Á‚«ƒ‹‰2¹¸˜ Ftc‚”g1.ps`0Që€ÐPBÓ¾öµ}´}÷8…´$ê™nîùîï;÷»×ø4aÎ뺧©”eÚçgêc7fBó~]·hLKÙ–®ûñØäK e€Z ©©Ûq` À¯ëøÝÑi ¥@Dkž.Ü‹[~µHí[!Ð7ÚlF¹ê²’ÝõaèÄ8@­˜aÇ+Ћ™@ÎÝ¢Tô@@rÁ­€çl`t\@ÍŽ³ÑÈ:N†Ð{šmgs`˜†ýûÕlK@†2ìÆÚ0ì¥ ­ð Ù nìÖÍ;‘HäQooo8•JåµÖ=v"éÄÇGCJ©t,ëH§Ó¥\.÷01gO¨}šˆ¼(•JÙ`0Hggç1¥ÔƒýžRj2†Ú#í …¢ÖúYcŠý öœ®†ÃáùáËÃáÅw‹ß÷ûºiš?G®_~¿ìæóù ;‘\hÀßÉN$ßÖjµ/NÁÑV x¦­J¥"^Åûqøpãצê2÷5šÔÒ¥õ]ø¾ê—&ÂéÇÍú€<{îÊÅ>.ÅzÙË>|N³´¢úÿ ¨Ö|RkYÖ2.ˆpª«jí(éÑ·RÅ*z”Ê»?ÏqMŠ•ÿ”<ºO„9Ó݆ˆ "¸eW׷ﯮo‡šö=íWß4‹ÿØ Î’•ÁˆIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_menu_source_machine.png0000644042355400116100000000103711576360365022344 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<œIDAT8­’½j”A†ŸÙý¢ ‹˜dW%bVÅÂ2 ká ÄBñÄ;°¶ÒJ±+…ˆÁJ“4B@"i6ŸÂVÁø%s~,fX“,(!s8æ=Ïùa‚»s˜S;Töÿ„å›õ×&Ú>på¢Þi=‘k…‰¶[÷Aƒ*·ìÌpOfª|yp· PäF(_ÝGvtW²ã}ïý¸8RgböN_V¤ ‘«ëœž›ÿkÛ®Jwácñ×^ÁÃcÍ,nFO³ñöijÏ7ùœŽ#“Ç1©ö,Vœ¼p7ÅÜp3,/Í,Ån†¹âfèþL*T#¿^¥SN3×Xáö™… RV_öè.nÒ¼rŒó×GÑø§ƒZl£"tÊi¾o¬ñ¦l¡Q¨ ÝÅMz S~ü‰ª 4V¨ ³K4šSÌŒJBIÖ¸< *&/E$¢q«Ÿoàçæoá–æsW\˱¹à*ùMÒNDé½ûÀÅgŠP¯uÖž?>ðWÞRÞw'„0 ;»4!ÛþxhßÜ}ý7ò‹ MÉ¥âIEND®B`‚buzztard-0.6.0/pixmaps/gnome/16x16/buzztard_tab_patterns.png0000644042355400116100000000110411576360365021015 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÁIDAT8•Áj“Q…¿¿˜ESBŠ•l,ku'º0uÙµµ>†]‹à#"‚øveQ“E„¦Å®jV]ÔBLÛü3÷¿3.Ò4­‰ÔæÀå~œ9‰»óêõËwªzŸ L.—{ÿäñÓÜç/žùé1³3Š1žRæY–ùñ.õ‰îN«õw?Wåòµ“$§FŠ»cçÌâ0ÀÌP 4›M …Åb‘ÝÝ]ÜR©Äþþ>N‡éé«Ä8ŒõMŒ†åÍò2_¶·Ñ T«5ªµ”Í­-Þ®¬ !e#ÄQU––;A•‹½’U•¹¹ •Ê]T•,fÀ”ÎáopÇÌ 7ÇÝz½ÄÞI‡YI1³sät»Ý ² ù€¡*ÃUEDhýøI~|œüDž½½_˜““EÚí6G‡GL]™Bd„4ÖÖ>òµÑ ac£N½¾I*ÂÎNƒõõOˆi:¢‘^‚Ň ˜"Âܽʉ¿qs–ë³3¤"tÓ¤’rûÖÁ­Þ+Ìb.ÅzÙË>|N³´¢úÿ ¨Ö|RkYÖ2.ˆpª«jí(éÑ·RÅ*z”Ê»?ÏqMŠ•ÿ”<ºO„9Ó݆ˆ "¸eW׷ﯮo‡šö=íWß4‹ÿØ Î’•ÁˆIEND®B`‚buzztard-0.6.0/pixmaps/gnome/24x24/0000755042355400116100000000000011675570700013752 500000000000000buzztard-0.6.0/pixmaps/gnome/24x24/buzztard_menu_processor_machine.png0000644042355400116100000000156411576360365023066 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ñIDATH‰Ý–ÏkuÆ?ßÙÙÙ®nÚ®›*bí<zQDÁk/…*¼x<)þÞÅ“ ×ªñä¡”R=䔓=‚<ôHÁX¡bÒPÛlšù¾ïãafg“ÝD©˜‹3óÎïû¼ïó<ï0A‡¹%‡šýŽ‚ Ÿµžù×¾yk¨àµÅöÇíìñw’¤aÿ.×^£ÈÕÚöWÀ›A¯~~¤xûÂiÚlüM ÕG$„„äHÂ}ã .-½Ю)J’ÀO[×¢ùÁ@òQB!/﹜$!ð|÷õúý ª®¯¢âѤušÎÂÙy¢ÅiWIžç<—œ§ûd§¬rTmuvó=]¸U±ÄJ±„™m¸6ª…v§Å™—O>R+W—°hD{eL‘JÞð»ÝäÛž¦B5!nÂòi€¨œ# gO²óð]H¥€P‰Y;§[‚:†§ç{˜9‹i7âsûÖ: .§f—O¸f—&*5¹óË&IHpwfç»j»D+0s¶9÷ÂE[ÛXjѹ¿Òá×ÅÓÜþ²ÏƒÕ™êY¹ïìäœ{ñ"Ã<Ç¢mª­ ÆRœÞñ§j>Ý… 6–çè_¥“öXûzžlnÇqwÐ=v¢\cFÇŒ;ðˆM ˜E+ €ØàÙ…>ï¾²H(RŠí¤â{rSÄ}æ Æ}¬ê i´NßåûOŽr#¼GóÔ:ÞÜA±Ô` `¿9ˆ–cE——/í¥H¢óÒ-Š6.Ñ8>ÀâHpÇå\Yþ¤²ãb¦b,h1C¿ <1Û¥2<©\Dk¶L(?Š' Gœè‰´Ù£‘ìuQ †wîþ–fY—nv UU›¼ü©2ƒá(8ŽCOœÇ² ªú¢þ9ذëÝ`cÕ߸Q|÷‘œ,„XtÐÃrîBÜôOï­‰ ‰Bô€°5±,ï¾Þ}h÷õpØ¿-c”8n`CÂIEND®B`‚buzztard-0.6.0/pixmaps/gnome/24x24/buzztard_menu_sink_machine.png0000644042355400116100000000152611576360365022011 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÓIDATH‰Ý–Ïk\UÇ?÷ÍËLSÓ4CÓJQ”´¡P´ *‚Ø…àBþmEÔEéÖ•‹®ºj¡ 7º‹Ý¸p+Ä­‚›‚F-´Jˆ-S1m23ïÝs¾.Þ›ÉK2/«fÓ—{ßåžóý~ï¹çð‚$vÓ’]þT¤ƒÅkŸ.<ÿ„ÿZþú”R€7>¿vqïž±³IìID–Ôèõmø8HâõϾɿøè­4M;x6ÍBw!KÈ…KàÒÂãÃ+JBÂÒïºYÄÌwbW ¯ '„'ÏϧW–¾AP¶£’:óÐäØüaò¸Ap0 å‘wçºL·àfHŽ»#w\Ú¾WÉY¼ù,fNm;€W*zü™ ^~õÍzª5¶øÕ"fF´ †~û§Á~­ T{Kb‚cGÓëçtÖc™P†3ɤ²'6Κݙ·ç@˜‹èÎí»’ ÌáèÜsÅ )_Ju=˜ÍŽ{ p‡±öÔ&IU™óx­Ë‡ï¿ÂÚz3ެóÝ_®Ð_¹BöðæN4ÇÌèÇœ3ï —åõIŽfX)íP{3/Øš‘ßþžö×™HgøóÛ ßû .pw‚‹ƒ3¥‘R— ªfæp¾æ?¹·¯\XÖÅÌñQ>£ê FÃܶ¶¢„ì{‘¥K7Y籩ˆ¡‰¬¨ªEs²|ë rÛPPö‘‚á ¹íw wwáÍiܼè=î˜àòµŸ@*r°@¥‚ÖXÂüK‘Äþ}´š" e#k@^F¸ WÂìÌäЧ‘„M9HôïÞ_MÇ›)ãS-L ;cµ\B–€Õ'»§  þ}Ô°•ワNVÿ^9½dý HMj uPhŸÑVž HúïÎõËkn$Bh3@ x¼Å/Ô¬«ßÕýI` X„Ýþmù#W?¹Lh‘›IEND®B`‚buzztard-0.6.0/pixmaps/gnome/24x24/buzztard_menu_grid.png0000644042355400116100000000162511576360365020306 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDATH‰µ”ÍkœUÆwÞi¬I¡¤*b?ˆ‹L­ú˜V¨`w*Hj]»ðƒ‚WB±qåBÄà`šfÚÚøù$êÒ2u‘ÍJÌt2ÉûÞó¸xß{ç}ÓI X/ sï¹çÜsžç9çu’ø?Wà“Og?ò>û@RýA<êœË’¤þñûï^üI\ž½”fY¦û_&ÉdVý¥iªË³—RI9Iõ$I¸sg-V±±±ÁüÂ<ç_;mW®pî¥sÑ6¿ðÏ>óG?Bñ‡MØøO”ý$ÃÌJç¡®÷• š ¤Üf&Ì<ùuµiêå`ï}¼È2$Ò4÷¡Ê4M‡É$²,c;MA ´;‚¯ç¾ªd73æ¾ý&žWWWø{­[ñ¹Ùý¾÷Þ;G'xóõ ±Ú^oƒ«íE^}ù•´Äb» ˆ³g_ ×o\§ÕjñØ#F¿‘"9N¼Pü—  U!³Â?Ý•"3«0…j%C€ù¯ÚŠ. ç²ÐWÛ‹¡(¶Ómnßþ‹öµvá/þ¼u €kErN‡õõu„P.¼ñÖ(wErY©§Uº¶"A°KŠupæL„Øëõñæ9=sºDE83ó|¤òç_á©©)&&—¨ÜKäP­ùBïs4;D.Îf~ï9ÈÍ"t ‚šUÛO*:+ï¨àkÞ†¤î"qséF<™[ƒM–~\ ×t:|ÿÓÑïn¿ÏÊÊ2õ¤5xò‰c÷&0‰SOŸŠs°9°²¼ÌÉÖÉ}³¿ @kº«üíß™œœäàøÁ*•÷ h6Çc‚Z-ÁÕj4›Í˜`ll F³ C$µ„‡÷ï§ÑhPž‹‘|IPS.xYÐÐEe?‘kRþ ìÙE¡ÕÌ[¡Åð3ú¿2µÊg¦âg;8ç²í­­ú±£'†ƒ†˜žüç?:;%ÐvâøTÜû`k€sÎ;ç×înö?ûâËÏß–”ð`–ïv׿€}Nι1`xèípv»ìËç²}Øütÿ%èÌbƒ§§IEND®B`‚buzztard-0.6.0/pixmaps/gnome/24x24/buzztard_menu_source_machine.png0000644042355400116100000000154111576360365022342 00000000000000‰PNG  IHDRàw=øsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÞIDATH‰Ý–±oEƳ·çœÏœQäÇ`#£ÄH$P% iQCD@¢¥RDAÄ?@´QD("ƒI‘ $£…$8;¹Û}¹]ßÙVᆑfç½Ù™ï›oß›§ ’ØÍ–í*úÿ‚ ßžÿÇ„?=+åßl¼ÛhÝ÷j–göoT=’ïj¨Øøx%Hbùå¬X|ý½¼ÑlÞ&õ”y’@ŽäÑvG)pùÃÓãÕ'ÊZý ï­c¶³I XÉväÑβ@~ðXµ>¯wÆaåË‹ô”âþ­6FÉüó‡Û””½>?=É}÷cî¸ wÇ%Ü…Ym»khÍáKgp7Üú[ $#$»3Ñâ¹'þ±‚åD +·Sàq 0µv«Ÿ/ÝP£V·`n%sO¢¿q ù  ”9Õ(O U¿Û÷ølR°M ÜJÜëW®9RÉÜ3 u¦ŒdÌ`Î͸±| BÁ™êŒáe­ « ÜŒ»·»Ì;Eï÷.滯sú«9Þ¸0ÏÒõv fìÅÆæ_zâÏ;qÞ‹a²÷œñé‡i0ç“+Ód/üÈä‹·9»2K¿ôêZ¼ØÍD;/82ýß¼ßáoòÄþ›´³nÂ7íÑ6 ê{`Eµx壷*ƒ€d•Ÿ»-$1Óîâ)Ø.Cr¾?ó6 mkš / ”O0óôb=8ÍV,lr˜Ý;(lHiÜ™\܃pš3 ™eQ"½õµÕ¼Ñž„‰A8¥ÇÓ#‰*gôceUp²ö`„Ó¿ñ+;ñ{s€¥_tüðùsïÆªìÃ^­*Ê–/%A’¾^ãƒË·¢Ca ˜öÝ‘}a{³¿y¾4?€›a·[þ;ê)Е,þIEND®B`‚buzztard-0.6.0/pixmaps/gnome/24x24/buzztard.png0000644042355400116100000000200411576360365016245 00000000000000‰PNG  IHDRàw=øsRGB®ÎébKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEØ.ó°|^„IDATHÇ­•OlUÇ¿ofºÕÝâ–BØ-Ôƒ(‘v+,H¢5!ÜêAÓ]³Á”pqMŒSÿ]Ú ‰rGjL鹨ۃ‰&¨lË.%H/ÒðÏegvgæ½™7?ÝÝÛÝi ¼ÌaòÞïûýü~“ßü›?ª¥ë"d©=ÚlúK÷ÕàÞ_E‹Ò“á:MÕ¤ët`¬s濳ÆHzrt"{"TwbfbTò=Èk§AC ´ù®J_â·_£)¤¦Ž€ýo4Ü€+8š¶+OCå]un€Ûn˸¥# þ¤¹ ðlBpRiUÜjW€å˜p,ÑÒQ «‘X à g9ˆ ØÝ5» n‹•x BfC§€°–¡$^lÔØ ¬!ÏD|z¸úšÕ0•Í.}{&´Ý ýؾÇ›=é\7Àà®3l@{3{Ž=ûÜöAEQa×-º±´ô÷\iþ8€›Dô}à%;‡_HO<=4´3¶!¦ ‹×ï_ú³ô!Ùþa­Íg_é‹F‹{öfú[lÆ(AÁÌ™™_‡ÿjY5)¥‡TjwLQ•“…B¡§Ý|jjJÑ;•N§¢`.\²,»4_éúï–˾eK‘Þ††¶Å—«÷Þk»z­r$‘LlÇŸB29ˆ¹RÉñ„,´Ç­躾Ÿ¾¹uû–PU©T:¦ªêd.—hƌǦ~¾/³/¦i*îÞ¾ãJéÓu½¼.\!?-Ï—Eÿ|ò1<œŽ¨=ìXó\xÎÇ»vïŠFz#ظ ÿ¸èºÜÿ “WG€®ë÷ 4µp¥b%“Èdö÷jšvdìðØŽ|þõ­ª¦¾?òòȉD•+›€Ït]¿ÓÉë¡. ®\.ùwãˆaÒ¦Þ°d»çn^¾×uÝþ_Øÿöiš, óÇä?ã÷S‡Y·s ë,OJœ¿|70Bšƒ8”J¬'_P·¸#Z昜5[<: f¹p¸ÛšóÁ*Lë1L‹Ãá"`¾:ÎÍúcuŽç·ÅW¾;­ˆfÝy4cì“â…¿ÆÂb$¯]õkSÆØk6¯Þ¥+Ûmï7ˆè§nÿføÐönRPIEND®B`‚buzztard-0.6.0/pixmaps/gnome/scalable/0000755042355400116100000000000011675570700014735 500000000000000buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_master.svg0000644042355400116100000006373611576360365020641 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_master_mute.svg0000644042355400116100000002602211576360365021656 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard.svg0000644042355400116100000005247311576360365017262 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_generator_mute.svg0000644042355400116100000002765211576360365022363 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_effect_mute.svg0000644042355400116100000002771011576360365021624 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_generator.svg0000644042355400116100000003067111576360365021324 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_effect.svg0000644042355400116100000002770311576360365020574 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_generator_solo.svg0000644042355400116100000003067711576360365022366 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/scalable/buzztard_effect_bypass.svg0000644042355400116100000003106311576360365022147 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/gnome/Makefile.am0000644042355400116100000000556511576360365015162 00000000000000## $Id: Makefile.am 2543 2009-07-31 20:35:05Z ensonic $ iconthemedir=$(datadir)/icons/gnome gtk_update_icon_cache = gtk-update-icon-cache -f -t $(iconthemedir) icon16dir = $(iconthemedir)/16x16/apps icon16_DATA = 16x16/buzztard.png \ 16x16/buzztard_menu_processor_machine.png \ 16x16/buzztard_menu_sink_machine.png \ 16x16/buzztard_menu_source_machine.png \ 16x16/buzztard_tab_machines.png \ 16x16/buzztard_tab_patterns.png \ 16x16/buzztard_tab_sequence.png \ 16x16/buzztard_tab_waves.png ## 16x16/buzztard_tab_info.png icon22dir = $(iconthemedir)/22x22/apps icon22_DATA = 22x22/buzztard.png icon24dir = $(iconthemedir)/24x24/apps icon24_DATA = 24x24/buzztard.png \ 24x24/buzztard_menu_grid.png \ 24x24/buzztard_menu_processor_machine.png \ 24x24/buzztard_menu_sink_machine.png \ 24x24/buzztard_menu_source_machine.png icon32dir = $(iconthemedir)/32x32/apps icon32_DATA = 32x32/buzztard.png \ 32x32/buzztard_effect_bypass.png \ 32x32/buzztard_effect_mute.png \ 32x32/buzztard_effect.png \ 32x32/buzztard_generator_mute.png \ 32x32/buzztard_generator_solo.png \ 32x32/buzztard_generator.png \ 32x32/buzztard_master_mute.png \ 32x32/buzztard_master.png icon48dir = $(iconthemedir)/48x48/apps icon48_DATA = 48x48/buzztard.png \ 48x48/buzztard_effect_bypass.png \ 48x48/buzztard_effect_mute.png \ 48x48/buzztard_effect.png \ 48x48/buzztard_generator_mute.png \ 48x48/buzztard_generator_solo.png \ 48x48/buzztard_generator.png \ 48x48/buzztard_master_mute.png \ 48x48/buzztard_master.png icon64dir = $(iconthemedir)/64x64/apps icon64_DATA = 64x64/buzztard.png \ 64x64/buzztard_effect_bypass.png \ 64x64/buzztard_effect_mute.png \ 64x64/buzztard_effect.png \ 64x64/buzztard_generator_mute.png \ 64x64/buzztard_generator_solo.png \ 64x64/buzztard_generator.png \ 64x64/buzztard_master_mute.png \ 64x64/buzztard_master.png MACHINE_ICONS = scalable/buzztard_effect_bypass.svg \ scalable/buzztard_effect_mute.svg \ scalable/buzztard_effect.svg \ scalable/buzztard_generator_mute.svg \ scalable/buzztard_generator_solo.svg \ scalable/buzztard_generator.svg \ scalable/buzztard_master_mute.svg \ scalable/buzztard_master.svg svgicondir = $(iconthemedir)/scalable/apps svgicon_DATA = scalable/buzztard.svg $(MACHINE_ICONS) EXTRA_DIST = \ $(icon16_DATA) $(icon22_DATA) $(icon24_DATA) \ $(icon32_DATA) $(icon48_DATA) $(icon64_DATA) $(svgicon_DATA) install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi prescale-svg: for size in 32 48 64; do \ for icon in $(MACHINE_ICONS); do \ rsvg-convert "$$icon" -w $$size -h $$size -f png -o "$${size}x$${size}/`basename $$icon .svg`.png"; \ done; \ done buzztard-0.6.0/pixmaps/gnome/64x64/0000755042355400116100000000000011675570700013762 500000000000000buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_master_mute.png0000644042355400116100000000416011576360365020667 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“%IDATxœíšMlIÇ==c{ÆÎÚ3þˆ×ñ:‘–¯X@À‰]!- '. EZíV ‰7 8¯Ä$$´BHìiO –3(Rˆw!ÖëµC°ãgýíéîzº«ºº»z¦¬Cæ)íÉÔT½zÿ½zïUÍÀ@2 d È@2 d ù/ßð±çùL ïG"2÷¿0è¤Äó¼m¥xùâü?¾Í‹/*Ónwúø³¿¸àùµKŸþÈ¢vnâÄ’>ä?‘Ü{»MÒ¿’|fµïìñû?½‘úÖÅŸ}í§ZG=£Ð÷¾Ò>û‰sþÖ^@*NZ²˜Ü”(MˆˆÕ_’bôˆnKX´gO³y{¿qéïןÜÔ”×j6jxümm›Ã º{„w!zumàv[üj7¯ñ)Â'Ÿ¦9\G„Œkg¸_$ìnë<Õ#…-÷EàYª·=Ìױ±Ãúpí_7ÙÙ=¸kpýDœi+4II{ ìöVs˜ééq,Uuˆ;¾³½ÏòÛ,´¿0ï‘”ÍÛÇžH`u}‘棭‘8VõMÔQ7àü©­ŠÖÞ_²ºÕ¡D´’ý/ ”Å…~ŠÙ3 (¡¢bzŒ¢³FE()öƒ®ù¿R E(¥ÃÂ0@”2ã£0DD†aÒAÐ%  ë r:FÊN¡=JÙ¨Õ|j5¿¨¨Ñpö¿—bHév9<ØçµÕ7Pº(1õ„-nNÚÒ߯ãûu†GšŒ=2¼g”r§ÁšSӃʀCtôwep ‚s¯<°¢Ý_)”c8= lÿ?ˆ¢‹#%nTnüq@×ûß«ÄÑåµ*9 <üAL¨–­ ÑˆóýòN›õ‹ëÔ—nŸ¤­ïª„ Z¿æYY (Î:@çÌñS-›foï½=½çFI†1§µâˆâ ªœÌg{ªlbb”‘á!«(V¤¥• JJÇù¹Éô8Iþëü]vOušñÖ5Všv-=ïÆØÂ¡Ëa—ˆ$¾‚Ò^pÜ›—Â9\{Iî:+Üzué¬ÜJsö½‚~)A9nøÊÏ"uÙÝ=´ÜÓvùx±æ0¡ºx//è ÜEÆ;4Ô ˆ8< ²º18ŽÕ}¿úi0Ac{ç€7—ÿíêbdñìi:õÑŠî_$À\ReéJ;È88ì²yóžöuÚcøÍJ)!ÀE€upH ~já–Sùk«ãnU÷Šོ2+ÚÓ>ÒUT‚:HYxÏãLt¦r\sÕT¸íªbyÙ>nàN/² ,³O㉔VÔ‡$ €Ä%¤–G&:Ì<:Ÿë|¥Ä8 xêÒ6`wàë?ìÈ^jŸÄ8”Hµ- ]ÑurrI6Sônµun¬ðä¯Âüò_X;÷!þð…øÏôcÇ œ%©-Èxµ#:Ka]7»nQ‹`úŠ`†uIõ‰S×ÿÉ×_zŽ÷®_e~v†ùÙÞ·q•oüøy¦Ö—Ó˜bÑŽM&EWoÙ§Ta¸H‹ ª°XĹ@ „/¾òÚí6gæ¥56FklŒ3ss´'&øò+?„äÜîž>˜×þhðwà•6HrïV\·Í¾ýW&6טœìÔLNvho®1{íJ8=הּÒrII °¼ ŠòĘҴ•´5w·À¯ãÕŠ¼{µâûŒîܪTÁ¹¢ûTš*}5& ³¢ÅãšÁvÇ\Úʼ9³ˆt ‚€Fî9èv! Y?}ÞÜ#%V6/ë9yqÆ€t?÷Ÿ@ƒìt#N·½Õžåõ'žæúúQQr}ã—Ÿø[ãÓŽ½žÕÙ0ã•OÏR¸RšÑ€¡RñòÛÏ¿ÀÔË+++œjµØÙßg}z‘ß<ýœÙ«¦è±µª¸@šÜxzÞT!À.…«/GC#üüÙ—øÀëäÜ[—`eñÃ,}ð3ˆWë¼[ªˆ²Rr_Ä" bèQ cµ[^åy,]xŠ¥ OfÆ”S—WUóÐ|*­F€Niýñ›ý˜^4Ò}Ì­h%àÖ˜J[ ž+RJ§ÎÌ÷Ê6  AÓÊéñ»2Æ[ûlÞpáÏfì÷w<3¾„ }ÁÑÓ>cñÀ0 Ù4€–Š‚B¡üóÚ¬]®•0œuó<ðÒ=œ'Àòº^Àó®\žô6H<`$á¦['þ©Á0$QXO§›ÑÑΟ›Í¥²SYxïÂ(iͼp—N{îº_ãÔXӚˣçL¼9.‡•&`ˆ€ øÄžP$8ê‘DJ83ÙŠ¯–màÖÞ‹µ#k’—Å–_½0Dâ+ŠYÙÀXIàµtÛväLˆ ž h;Áì~=Ñ(€l¯.ýndlú›—¯®3ÕͲ®ÿã,÷.€°˜ÁÙ(l÷5U§yŸéeÈÆú,¿â ÉLÞY¿‰àæí}nÛ7^µ•ëˆØÒÏû¿ôý¯¶f¿ãyþ ‘ˆ¨Ý`ïÖ«—õÝïÁá°ìk|bF€&ñ&Ž u«–ª?™ºÃŸ8Uê×OG@¼Ê!Ð%Žú‡És<­¤FL€ßH?™Ìý=â½Ó¯Ÿ«="%À&A” ¬“¯ °û> Äg5EL@@LB—4LõU¢W>O@¿1Çi?N¿ãèÐQP{ƒó‡ÏÿmÝ2;B¯y IEND®B`‚buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_effect.png0000644042355400116100000000446111576360365017602 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“æIDATxœíZÍGÿõ×|îÇìzíØ1Çñf‰µq@²@ä`.‘PD$ÇHˆ Hœ>ñ7’á‚àB"‚òaÉüvÖ¶wµwwvwfg¦»ÞãPUÝÕÝÕ3½ŽØÎ<íhf{^U½ß¯Þ{ý^õcËXÆ2–±Œe,cËXÆ2–±ŒåÓ&NöÂ+?^s<÷GLüä'aЃÇu¶ˆéÌÉ›áwOŸé뾩ôòO+σœŸ}aéËÞüÜÂ7ŠÙzÕø”Q`ƒ˜9¥Ì™Ö3¶ûí©7ÏÿñÛçžÄE |]•"ÀøzkzFœ:þŠ·­"âþÞQHLÆða:Ì 0À 4iŒ¨|—3Äà™!‡2 Xßú0øç•÷^+$€]4jAÃ\í½‰uö ô~J\ÑŸsÀ埸Ô>7ý5Tƒ:pË\ÃÇC(¬ pN¼ÂÜœÃæ`yà*(2ÀS:H“‘.ç •?²Œ$àæò¶ÛÝûp˜pꃙèòš¹kl¾%ÿ4&j˜;4 0@,¬9f(íõ,_^Á>ïi8ž[Ç=Kî~<âú(aA¸u÷êÍ 5å%% `–·ÉA/ÌôߣŸ¬Üõ¯aЋPo0ˆ)}kTRàyÅç¿ôž8Ò  Ê}/D~œˆLùëa(’Õˆc½(`D(@$×"Jæ‰Bf© ¢P TﶺBç &*2Qݳ×sàzže¢üµ[DD’¾@¯;À•· â_a*Ê»x¾ ÏwQ­˜hÕ¨ %3,kÍlŒ¼‹?ªÂª,&bk(HíÞî “ôb²Â²0,0ƒHa*s”‹©5\fz¶óÓiÕ·‘ìÈøO“sño™Ã,lŠì‹=€öp"D,ä®Ú¾ÌHÜo§€þ@`é­»8riµž@»UÁ¿¿8ƒë CùÓNœicêfˆþ¤‡«_iàü7§Vœy6@VûX×Ê-‡À»%`•4ÍØuã¥_ýõÍ« D®ƒf;Ä‹gocrc€÷OÎXrãÄ™6^øy·¼+A •]ÆÂo:8ôN¿{}?„çÄ„%Ž4P¹±½°÷T|ˆ˜W6XVõöñwÖlE¸ Žƒm8Xu\q],½»‰©õA¬«ÇM0À‰_´q¡RÃÍ À–çáŽïã_AÕ¿ÜN­QtÊ›B⥶.7G€$—Ä6?s|è ?/¼ßÆ(×íØq€c—ò`~¿ƒ¶ç¡ã¦Mn³ç~ÛÉ]δ—ÊCÖ¬X !RC>^ìóg+F Öû‰~Ä@½‰SÎQ]ˆ„Í" tT·’Óåø¤·Œ}š°‚œf }~fc,·åC`s¦‚F~Íîì«äÆm P÷íë5‰°ñ”Û·¶%ÎmtŽ¢‚C{`QúPÈ  æÜ‹38à†:2Ãñ]\^l¦w†_n«Ÿ ©§ASBà…øÇ·&S®/w´dŽ"UÜY64Ÿ˜c°È %ÀµçÜ8\Ç…¦°ÀŒ£`Ì3ãY0f}}i>2Iè׿ü`sÀR´‹£ý>žúx®ßÃùW›¸ñù —7Jç(fíáÙ dËþ$%§‹$TÌâåÜÉi\Ÿ¯ã™:¨u–güg¡Ý𗋍V–üú'ûñÙ³]Ì.‡èκøÛ©)|¸è';žªJ1 Âå*Af¨IJ1–.€Ìªmm.ÀÚ\+_¼d€ËaòÿnËÁ¹W†ñÆü©²¥ \’`“¡ç¥Ò€Q4ÙËUÓèt©lgc\ ÜR1šs”*Uõ]ŠÔ™¥8›¢Ï4"HY$ªm¬¶¯£scÕ‚Ÿ“ÆiÀm„õÙ9É\Cí3ŒÈIÀPÐ7 4(D(ŒSÔeñw,ÿ·ˆßÄc$›ÑüÂù9ŠÂl´}2GÉÛ  @M øw¨ € EðptçÔœªã™©zÞM3Fç»Aûî–ÎÉ€â0PïžïcbÚ‹×N¯cæ“n†à(B€§<Á§ý( ™Xà‰ú"… ”á~±qrýÌM_ÃPwe%­ˆí Ä–ÀêPS/ ó’šÍTu˜ %®ã!}–Âìð|$é„o_¢³¹Îw.\{³SÓ¬"m` ,õ¯yâÝÒŒÄ Í[˜ñÆØX3Eª"%q‰tn€–¼WÞé¯`sçnÔ[£7,gĆ~ú¾ÿÖ¼÷=Çãxœ„°ÓÝä7þ|:ü!zè@öf]M€I@ @2Fª¹Á7t´”ýíÒGýíÓ0½Qs„»@fýžzíªWhNâB Áêå©ÅŠž‹}`FéÙ® $˜$h"¢>Òà5¦î£à YË$!$ ébÔ$z糌³—ë{ÑÛË:¹¤7Xkáÿ!3cv–ðÙIEND®B`‚buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_effect_bypass.png0000644042355400116100000000451511576360365021163 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“ IDATxœíZÍWÿõt÷|íìÎì‡×_lâd— Ákˆà`.‘PD$ˆH"!.8 qB|âo$à ¡("‰Ä!‹$62ov-ìì&k¯wvggg¦»«8¼÷º_w¿îéuìÄv¦´£îí©÷^ýêUÕ«ª`D#шF4¢hD#шF4¢}ÒÈJ>xîçî –]úù8º[d•¬mb:ýÔuï§NÔsGgzö—å%õ«/ÿŠ=7³p×…b6>Õî Ì`m3Ǹ£9ã|`ÆN¿=ñÆù?ïÜ\¼ÕW1ؾÑjN'ÎÞö×ásÿ¨2(&!x3 0(®4FT\Å !xfˆ¡Œ£î6·?p/\9ûB¦¸„zÕ­[€…åÞÐî¾ÞIŠ€ ê>\ü ^àóͯ£âÖ`[úîAb …€sdàú&»§."<ƃ¸2ÒÀÅ$ãGRCp}e;íî˜G»Ñ]š3õŒõKôO½QÅÌá&Àq`Œ1¹ hov°ri Óö1Xv©ŽÛ¦Ôy<äù0â€ðÞÍUÔÆÊ¨7ªÒJ *€Y“ƒž˜ì?~›b|¼tÓYÅ ç£VgSüh””aiÆ¥/=„ƒ·@ƒJ} ÒãŸÀ”~îyA´qÈçû˜À @$Ö"Šæñ½Ì‚ß𽞼šò 3˜¨˜ ˆ@‘uf%ÛBɶ ¥Ÿ}Ôø$ÒÐëpå ¤ÿKL…] ƒù^'Û)ÁvJ¨Ô\4ZUrC‰ÁL ÃÆ##mâ÷+±L‹‰Ø2Bûý·ûYÄ$¬€˜Œ° È‹÷1º@q àÇTIDáñ®SF xpl€Ã،ꠀH¹Á>!·"¾Þª^ÄÙÕe¸ëw7¾“DH´l§$ƒ``tt"0ˆ11YÇÜü,º[è‚/#=0TYªFOT*ñÛdá“à3>áÜÉnQb&ZÓã¨TÝ0*‡Eé(’&àè#2Q¹š_‡ky V®æ—´zÝÍe*•“s|FÌÆD(£âØ' <¯ó’\)J]ò„Ξ×#HΡîÕ÷DE-€#èí Ðiwæ_pl¼·ìd ^¬‰a²¤µ€7ðÑßó"°šk(žrÅ…m[“!ÃM[³0&ìÜÚÅòÅ÷ÒjÓèØâ!´fÆ3gZE.ð„›ÅxÔ"@¯ÛÇÆZ;W¾©ã¨UD*l¨J1@eMJ‹ þ׌“_qþ•hä mަ˜P ¸îÿÃäSë H“1“È¡µ!s‹3hÍŒÅx †Œ²`“7H¹—®”|ùÀ "‰©È1(“;ª™LsªŽÙ¹fœõMD;’ãÿqåܦÿæÐ›,ùB  }t„ˆ±«¦/ÖÛ1`€3°tf\îÀÝóÑ™ªàŸO5qu¡‘ üáW;X:ÝFóš‡þ„ågê8ÿ&¼²•Rž Q>Vy€4Ë\°¦Ý`4ußµÆ3¿¿ŽV8òÙy¸Um4^ý&¶<œ²eˆ Œ§ÛøÜ¯ÛX.9¸ìVPí2>ýò.¿ÕÃ^œE`[¡Â"P´Üx?ye7ÓÌÚ®È=þö&&=Ÿyú ”Ñ*kÌNbâÐ4ðúy¬«c«å„ÀÁ@se€¿iãŒSF»¥Üë°ñåµ>Nüvÿøvü´)¢Bd¥¦*7•Ü å²؆àg›ê~ñ_;8²0‚WTŸGc¶…ùwv"בãþØÁ »€rðØËm 5n¸|jƒˆE“5I†DˆdáöóüÉŒp»>œjÙÈ_©TPßÝÖ§˜£² XÆú´oY¨îDçxØé-"ŸRXFL3–wªfÒXjØî‹ëÎt{[3°³µérjÜ­y޹Ó$ÂæCN(SXÚèÛ¨EMs?€ƒÂM!Ý]˜·¾ØÄÚ¥«ØÝØŠøˆ±öït\Z‹ï 3.>;·jaÑ÷boƒ¦‰0Ï>þþÝñ˜é‹-£HXv±LIj Æ)"Í$¥\;ZÃ…¥ðúŒžD¥RAûfýA¯==@Á³_þòãI|õ'›8è÷q+(¡RbÌzÎ=ßÀµ'\-ˆ'T¹øYYó>Þ m™ß¤¤x¹Šž¼œ}²‰ÕOÕðè»»¨íõ°¹èâòB{U;åÿ*P­wñ»_Àc¯t1µâakª„¿ž¬âƒE'ÚñXþPHÒ P,d†l õ±x¤gm3.6fZéä%\ ÿw[Î}³® Ÿ>f£< À1È@‰„˜(·P( hI“9]ՅާÊ:pÖÆ…À c<($`oˆ ø g]nÐç2Æ´$HJTÚXo_Åîµu~Ž §}7),«FHÎÁˆæÊ•O{1"~$€ €¾®@<¸€T€ÖE] þ†•ÿfé7²Â$tžU˜Ü!=G–› —OÄ(q 2À°Tåàñ„2€2ùp°Tå46Qãµ´™&„NWƒYÕÛpà…Úmòj;M;\;¾Ž;Lª‚%- à9li yèû¾ÇÄÖ'Aiæ 'VQïÜÔóÐ y:HÁ(*ELSL˦¦Z@Å%Í ”6cÙaÒ•”,^ÐG@Ø–˜m¶ƒ(œðûïÐ+õ™ÝïÿgõmLMŠkqC`±õgî–ÒHR?´ k`CΘR¥R"“ˆÇ(J[åþ¶:7ýÞ½„hÉ0"ÖÕçäœoµæìZ6ÏâA"B§»Å/½vÊû)zØÐÐU °!PPƒð‘ Dlp4EE»ôaû”Ç7lb—}ˆ¨ß“Ÿ=ùñôIJ Pà]ù±åbYïÅ> 0ÃøLÏD Е áe t¯ óÞÀ¹,A(ÀƒPÂZ¸6‰Úù¤†ÙÏóýðígÜ ÂŒ¹ðÿ*øBŒ/ÀIEND®B`‚buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_generator_mute.png0000644042355400116100000000434211576360365021364 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“—IDATxœíšû‹$WÇ?ÕUýî™îÙ™8³“¬»f7F—hVH²à†|àã5‹ "ú“àŸ| (øCÄG—€HÆkÝÕ•°D}9½3;žî®Ç½þPu«nUßê®ÙeÖͦUsëÔ¹çû½çœû˜†©Le*S™ÊT¦2•©Le*S™ÊT¦òv+Ûð—Ïó$¶õ])äòÿáý˲¶¤?|ð_³¾ƒˆÛu¥×¾È‰ëÕ¥‡µ[÷ß?o¤Ì{Q@Ej/eò…TÏ2­µx[\úý/=áû_=ùcžV*Žn;|ª:0X|äÓ6ý«¸M’4)”yˆA*=)B­51 2zÒÈQ/¤„ÆÊ1Üõ+åî™—ži&‹†S­[XòÊËà÷ ÜQÀûL@†¾äŠ„è)aûÈG)Õ½4·‰(À:€.õT‘RO˜Xn+ÆOÒÀ\éD-)àÊ–0fÙDÖþ¹Êîúö ƒš,rô)èé÷Æê¨H½Ý sd1&©xD–zk›\þëv¾˾­‚e¢ÈÀ§uþ•vƒÚ\)…S TôúC.,>´oŽî§<°v¿?„N)¦¨% 5Ï&rêÇ8²²@!FÞû Ìí ïzAü,„Ä„x~€”á=l¿ïª=üÛõ|\/ˆî¾1;¤Œj‚ÔkÃ8B—È›—m»„m—FÚ+e³¥[)Š”¡ëÓëéž…x0:95`_ýÜ7qìŽ]¡Q«07Û µ‡€×èP†Ÿì—·\Bð"¬†x ê@DBFFPŒÝ9"Çbʉ€;H¤Ôf‚~”? ¼Õ$^ ‹À8 Þù5¡m„ ­%§NîG×þDÿ…Wy³òÖÉøØ;Yß „¬5Ú,Þ˜ÙÍ«01HÈßœDo¥‰si¸I£ &—3¥ÔSFyöðʳµ0Ä^ö"™7Þ·ßÛ„ ¹dg*ÓººÌ=m+sâ£ÛÏök²õký"õøæf€œ5ÙÊ\щ£¤0pݗȆ0¯Œ›!5úîî€~æ, {Që4ãZ±7àZtŒ>†pàán”‰„ -œV%ªæuÀذÛÝââ™7Œ*J–Þw„™å¹‰£d®¦ñ'>[Ñ;wsÀúù«cýkß;Om¡b2ìJ €¶p›^ï—ŒÆ8ûý$¿4ài§MyÑ57¤E–$5ªãü‹¿+¡jîL>ºÿ]K,˜Iénœ%&L/V7 \Ý8— Àc4_òý‹°a$Á"Ú8ÈT ‡—çÓhdeO" ]ö\ÙÒ§à<ÿd¤cšL@.9'(í”®º‡üëÏ­`'¨s¨v/¬¼È‡çÿ–“*á½÷Ê6ÛÏ^Ç»êb7mjµh¬+C¢LõeÑ)‘„é¸ôÍFÔ¥'J<õÚ¬îÎÐÛê"¤Ï…r“ïõ?ÎÅ~›Ïz~8ÀæoÖÙzvƒ¹ TWê¾ÏÆókü÷ï}~ã`“ª“½#JQµ®}m&@…rÁ²çù?[ý«»M®w/Äy¸;xî?µNñðÜ9î®ucàRJ¼K.[¿Ý`ùîÃÔêõØzkf†ÕÕ7Ù9½IëñÙ$Ò(Ê?)Lûóâ^ŒBäWtÿõå“ìl¯áõ Ü¿[{âXtõ^Ü¢Ñl¦ÀX¥ö<½?줣­hЦ ô¨þ(zS™³4Â7ê»~À†ÛÒôC¢ƒÍÛ2/KlÇ!è©íl~A3ûGÅdP8Çâ4âVª]l§fж¨W«m\Ž«ïÊ+e†þÀ؇;P^*ÇÀGëÎX#=ó4hL=¤ w 9õ•çi´°ËM »E¥µH³"yláÏ#@ê4ñK>ëkk)`ýÝ]66º4?1cÿ¨> «@˜°*"úH(§NξÁg–þÈÏ9Þ®P«Ö¨:ß<úêÖpdí`U-:_>ÀÆÓ]z»ÛÔ*u|áÓßÞ¡ñØ •û*£ ¡¢Ó JµBÛá(÷ ‡Xf4Ô7O,?ÇÛÿà…\s[¼³q…GçÎÐ.odzEº¢Cùh™ùoÝEÿåîÅ!¥v‰Îƒ ”ïqŒÅ¬XŠFß ó´ž»@軵1  Óèêíxã?oü;³xa¸>…–Z4cñ`ÄÀµç=ÌRy眹+Áâ9–NƒÔì¡g<ðXW·«e€Ç¶ F(ÉbHÊôï¢tÊ}ŸJM)“¬æý.þEŸë;é9Z922mfCµ ð‘à ÃjQ4Åùdÿ’®@RªÀP'  4†e©E€êàÐù_Ñ;æ_ ©¹<†˜K€ž*ztȤ¡ðX7jç_숣ÈjÑ+×!l¨/À‘K)×[¬,Þ›*†ÆQ’7<ã H§…Óq˜é´'ô«Eˆ ¨à9„[ p¼€¡ð†RÊ€Rç–ðB;B%™rRï(q@¤N^%dÄÀE¸Â)ã±Nša.G°¬ÒlE˜mÀv"S¯\áôÒÌÎS×μDý®eÍël˜ªN“œOné‘ÓuRMô)ˆ˜GJŒ_ï#=ÉÅ ŸÈOwm•Á¥«þê6Ïè&TEl¨ëGóÙwÏ[_/[r‘;Hìt{<óÉ_ðíAX.v]E€MH@ ¨æH•°68šŽ’‘ßçHžÞÍ~_ĆG8Ê>àVýAtõ£ËÓ” PàËÑeGåý_ìV€™¤gjHÐIPDxy:¤Á+tÝ·BH B}Öߨ #ÅaK“›¥ ±úKúOŒÑm) ’uãÌÉqÖïì6¯üëúEÀM@Cy#ífîlÒ ãûGx¢W×n·%¯póš| |æ©iÚÃ"ä\;GÀÃ"`7pX?à™)m!xÈ(ÏP¸íf¼ŽŽÖ—€Õ÷n±µ½wßàú‰68×Vj’Šö,Øí#ía¦§ÇM°Tõ= éxws—…wo0;)ø¥„ù€¤jÞ>öÄËk;´ÚCŒŽ´’@Z×4QûÝ€óG6jZûpÉòÆÝ0f$Ýÿâ` D@Q\øÄg™yb¥bT\Nq¡ârÖˆã%åþQØ5ÿWJ¡â¥Q‚@…ˆRf|Eˆ(¢(JÛ#¢0$ »DaHvANÀXÙ)´@%[†O£á—5›ÎþR )Ý.½]^[~¥‹"SOØâ&à°-=$ñýßnµ;:¼™d”r§Á†SӣʀCtôwep ‚s¯<²¢Ý_)”c8= jÿ?Š¢‹#%nTnüI@×ûß«ÂÑ嵪8 <þAL¨—­ ÙLòýÂÖ$k—×æï¦­¨D)Z¿áYY ,Î:@çÌñ##Ì>9ÍÎN‡=çFE†1§µòˆò ºœÜg{¦lbb”ÖðU”+ÒÊJP¥¥ãéSDzã$Å ¬ówÕ9<ÓiÆ[×XYÚµô|G` ‡.‡]R" –ä J{ÁAo^Jçpí%…ë¬pëÕ¥³p+ÍÙ÷ ú}¬å¸á«> ˆ°·ße{»c¹§íòÉ„cíašCx//è ÜEÆ;4Ô0Œéì‡yݘ@Ç߯LÐØÜÚã…÷]]ŒÌ9ÉT0ZÓý˸€K¦,[i{.ë·îö´ojr ¿Ý@)…#¸°©ÁÏÎÞv*myʸ[]à½âGx//€ÜŠö´lA5‚ RÆ€TfÏ=ÅÄÔñÂ×À\5Õn»ªX^`¶¸Ó‹,«ìÓxb¥õ!I I ©åèÄ'>tºÐùZ…qðÌ¥mÀîÀ×+~Ø‘½Ò>Ip(‘z[@»¢ëää’|¦èÜj›º¹Äçÿô[N/¼Àʹ§yýkßã?ÓO,pV¤¶""ãÕŽ è,…uÝìºE-€é+‚9xÖ%Ó'"¿þ6ÏÿêŽ.¾ÁbÐ`1h0±t•‹¿yãk YL±ÆèGÇ&“¢ëÀ·ìSª´\dEuX,â\ PÂW.ýœµÀçí¡&¾Ï†ïóV3`-ðùú¥_@znwÏÌk4ø{ð€Z›@$½w«®ÛfÞýSë«\Ê¡ç}ßçØ­fV¯€“Ó“óÎZ[ [ —TÄË ê(O©L[i[{{ƒ¸Ñp$#ˆ=¨á3ºu»^P犖ìSY¨õÕ˜(ÌŠ–wŒkÛ i«`ðú‰9‚8bX†Ø÷òßl´”"P1k'Ï[€{¤ÄÚæå=§(Îíçþ(cnÄé¶·'g˜æËœ‹bš–ò¦gcÅ•gžcc|Ú±×óº1Û f¼râéY ×J30Ô*^þüÕïóíK|ìÆwSú*aýäY^}îE³WM ÐckÕq, ¸ñô¼¨C€] ×)^ö‡Z¼üÝ_ó‘¿¿ÎÜâ–æžfþ£_@¼FàåØRG”•’û 5C@R«Ýò*Ïcþ³Ì_øbnLu0uyU=-¦Òzè”Ö¿Ùyàe#Ý'ÁŠÖn©µ’¹b¥têÌE_›€¦Šö‡ måôd‚mcñÆ.ë›.üù,€ýþÞçÆW¡/8zÚgì1؆}›€&0¢â°‰Pªÿ¶2+«ÀjÃy7/¯ÜÃE,¯ë¼èÊuìËnƒÄZ)7Ý€ä§CÀÄQ "žN7££-ΟÉ¥ªSYxïÂ(mͼp—N{îÀopd¬mÍeÑs¦Þœ”ÃJ0 Ä@>‰'±„ûÝ0–X OI®–màÖÞKµ#kš—ÅV\½0D’ª°@V>0–Cx-ݶÅ’‚'Œ$ÞL1û€¤ÍåùW[cÓ?¸úï5ŽOŽæY×q–{—@XÌà|¶ûšªÓ¼Ïõ2dc}V\qÐd¦ï¬ßÄpëÎ.w¶÷¢ÎæÍWlå:"ŽèçÃßøÙ·FNÌýØóü - M²G†IbC`õÑR÷'S÷ø§ZýúéIV9º$Q¿“>{éÚJ$hðÍôñÓÉÜß#>0ýú¹Úc2l4aÕÀ€õÅÇxä@  *T¹ÏÃP¡Âü¸0PˆÊ·û~˜®¦$é!"ú!Jéµ”Jç üÝ?è‡~ˆ=myE3D©r. EÑ™ ס⺖‰òm·„Ò„ôBº>çß$òÿSi(è|¿‹ëUp½ *S­:m¨Dʲ±ÖÈ&äMüA‰Òb¥Ä Bûƒ·ûE"J[e…e!`XxðD qò  ĤR*9ÞM)ˆ H’ÛQ} ¥b7Øe"TÐoÔÏòöêª×îm:|7E…:Ñr½JC« ä!¢€¡„™¹&K÷ÑÙ¾E¿ =°TYq>P©dß>ý¬…O2÷àmÑÀL­=ÓLÔ«I,UëÒQ' ¢`ñ‰½…i¹:¼·Öò)W‡—´fÝŸÎe+•çPQ›±&BÅd^ƒÀ‡Ý¼‰ŠÔ.>ìŽ`pŽø}ü¹Re-@RèÞî³Ýî ˜WvÁÉéÕšW¨`x¹K ›… Z€ßèÝöS°†kÄ}jU\×ј,nÞD´¹ˆbëÖÎ^ÉÓfÈã‡öÓZ˜.^hC¸Y¦O¼t;=Ö®¶‡ê7¿wšÆä„N…-U©5ÄYSÌârðUëä罿'Ô¶Ç[L(ÜôÿQúÅëh È‹5(Q:‡6†,Z µ0™]à-PBe À6þ(ns/“”áú!‚R¦2Ç ^,ÚQÃdfç›ì[šÍv}‹tG†ø–œ;ôËfbS¤_bj7BJB½«¶$©·3ÀÀë‡yó&ÎmQ[5þó…9..O ~àµmžye“©K>þŒËû_nòηgðkNŽ< «~ç‘Y%@ vK0 QÐ4}× …ç~ÿõ[>W8Lmø<{òC¦oõy÷Øœ%&G_nóô+mææ¨/6ƒ€úŸÖX<Õå?ÛKè: a)#ÔWn²›<@_"æ;»íèçþ±NµpF9ÉÁ³)ÐÆáÈ© VŸ˜d£å%À˜]ésô7m—Po4’駦§áò*G»Åé³§M©•ÚªÜ\r¯É#°À/’\:Äï—ßms=ÈŸº;À–Ïm¥®[þó6ÉÉ x§Raaf‡ÿØ1ÖˆÇÖ/Þ %ú’uP,‰Š ‡¼¿ØçÌ¡Þ ñ nôý;8õõõ5ë×ó¨m†É9žÜô–Ñ/&¬ ¦YË»øþÌÆXnÌîëçÆ\fAÿ¦ 7öÔrãÖVÙ»Ö1½n—öcÕD§¤´-qoÇ(UpÉc¿°ô¥é.1˜ÓÏα߅iƒsXDpªÞ;4™ÝÎ>?Ém/`}m-{nw:ܼuƒ¿}g*cúzGKÆ(¥-»\&(*b 뀜(Ã$#Å/-68st†£ï´Ù¨h³Ÿ¬€ë9¼þÜúˆ‚g¯¯ý¨ÅW~¼Nûƒ-¦ª zÐÛÜæŸßšâÒ3U#È&TCñKlÍ»ønP³eÿ&%×—ÔUÌäåô±Y..5xò;Ô;!ç«üw¹Éíº›óÿ8P]=Råw¿ÜËgOvسÒeg¾Âùãó\?ä¥;žÉJ1¹å2A¢ IJ>–M€Ì¬mm¡ÊÚB+Ÿ¼ ×Ãôÿ–Ãéo4 åóÇlš”8*J[€M†Þ” FÒdOWM¥³©² \Œq pKƘÍJ)˜Ä¥¨ìñdP {RcÒH‚"‰6×ÚÙ¹tÍ‚_ÒÂi—Àm„Õƒsé\Cõ3¾Ñ?’ L=“€*ÐT>Uˆ0nQW¿³ò~¿©Åh6¥‡Y…Íòs¹ÙhýtŒÒÇ €àõhpßCŸP5 ¦<'®œ&g<9ÓÈ›é€Òùj°¨z \ÒÅn=]ÏcjÖMÖήcÆAT\ áD¾¸‘%xʧ¾( y¤qˆPù(Ãüåô*ñwnq{â‘b*-El!¶˜€D—šñq\2Ü f3“ºPq\ü°G¨ØŒ0»€ë‘†ùðœ:Ù\ØùÞ™ÕSÌÏìϲJVÁXæ_³M%»3’€40ã!ؤg†Ôˆ”Ô$²±XòVy£w•í›AwM½Jºd›ñëø½o¶–Ü8®ìãaÅvgC^}ý„ÿºì ࢠ¨ ´L cƒgô‰¥ìo—>êoŸ†õ5‡Þå裣~7zÝŽ^¾9IM@ ¾½Üh±¢ïÅ>0£úÙÚCRLb"ü¢Yð1fßÁË*4>š„>F¸5I¼óƒŒ³›öÝôÛÍqpWhk°æÂÿø?H•ÓÑúIEND®B`‚buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_generator.png0000644042355400116100000000433211576360365020331 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“IDATxœíšÛoWÇ?³3{_{íÚqpbš”B(4H\ÔF⪠Tq{@h%„x+ !ÁÿAŸ¸E@xhU U´¥)´@ÒU;¼‰ãµ×»;—sx˜93gfÏìŽ9$éþ¤ÕŒÏüæw~ßïùý~çâ©Le*S™ÊT¦2•©Le*S™ÊT¦òV+Ûð—/ò¶õ})äÿ‡C{%–eu¥?~ðß°¾‡ˆÛu¥×¾Ì‰ëÕ凱[‡Žï7Ræ=( "µ‡2yCª{™ÖZ¼îÿkOøþ×Oþ”§”Š£Û$Ÿ©.ì –þ¬Mÿ nAD“$M ebJOŠP+AML‚Œî4rÔ)¡±r ÷ÚårçÌKO€4€EéÖ-, yùeð{î(àáU& ÃÆ_rEBt—0ƒ}ä“”j €9½4·‰(À:€.õT‘RO˜Xn+ÆOÒÀ\éD-)àÊ–0fÙDÖÿ±Êε­5Yäè]:ÑÓÏÕQ' ‘z»ÁÜ‘¥˜¤âYê­oréoØÞ÷n,û¶ –‰"ŸÖùsTÚ jó ¤ @NPÑ븰ôá=st/åõsøý!ÌÕ‘R`ŠªQRól"§>pŒ#+‹ b乂ÀÜ. ú®Ä÷BHü @‰çH^ÃöðýðªÚÿ]ÏÇõ‚èê³Cʨ&H½6Œ# t‰¼yÙ¶KØvi¤½R6[º•¢Hº>½þÎYˆg£‘SöÔÏ=Ç.áØµ ó³ :Q{qeøÊ^ùxË%/Â`H·ªD$dd„ÅØÝ#r,¦œ¸‹DJm&(áKù³À&ñRXÆiðî¯m#Th(9µpr?ºþ'ú/¼Ê?+wNÆÈÀÀ®ØÉB¨ø^ d­¹ØféþÃÌn^ˆAÚ@þæ$z*MœKÃEU0¹œÙ(¥î2ʳ‡ï¡<[ #@ìf/ ’ysß}+‘ñÝ@¨Kv¦2­«ÛÈ\Ó¶2'>ºýl¿&[Q¿¦ÑÏ! ROan¸ÁY“­ÌÁ8J ×}‰ló:À¸R£ïî ègβµ¹f\+v\‹ŽqÀÇî<Ü­2‘¡¥ƒÓªDuÀ¼[v:]ÖμiTQ²ü¾#̘Ÿ8JFàZa⓱=s7\;e¬í{¨-6BL†]©!ÐaÓ_ßó£ñÎþ0É/ xÚiS^gtMÀ i‘%Iê8ÿâ÷ŠF@脚;“—îç2K÷̤t7Φ«®‡nœËà1š/ùþEX„0’`Hmdª‡Å¹‡,¤;ÐÈÊŸD@º.츲¥OÁyþÉH/Æ4™€(\rNP Ú)]u?ú×)ž[?ÁvPç`í*_Zy‘.ü='UÂkï•-®ŸÞ ø¯‡Õ,ÑüP‹öcóP±2$ÊùþÉX_=‘B I˜Žë@ßlD]z¢Ä“¯=ÎêÎ ½n!}.”›ü ÿký6_8ø‡à×O_£{zƒ5§L·R¥âJ=¿Eÿõ>û¿µ 6©1Ù;¢UëšÑÇfT(ì!{žÿ‹Õ°ºÓäzçBœw»çvù¹uЇæÏñöZ'.¥Ä»è²ù» ÎVkôJÉ’{‡÷vl=s™O´“H£X(ÿ¤0íÌ‹{U0 u@’_Ñõ·—N²½um¤è¯Oàöxfýý‰cѯ÷b—®m§ÀÀ*ÛÏo§£­hЦ ô¨þ(zS™Ó Háõ]?`Ãmiú!Ñþ¦Ï0çƳ,ÄŽ*bùÍìI#Aá‹;Ј[©v°šAÛ¢^­r´q)®Þ«¬T˜±Í=6…À~›­;c=ŒôÌÓ 1ô.ÜæÔ×?K£µˆ]njØ-*­%šÉ£‹R¸I½+ž›úha6X³Ÿš5„T†U LX}$”S'gßäsËä—œ¯‹ëÔª5ªŽÅ·þŒº5Y;XU‹…¯.ÀS½>›¢Dµmϧñè •û*£ ¡¢Ó JµBÛá(÷ ‡Xf4Ô;x޶ßà…\u[¼£q™GæÏÐ.oųEº¢Cùh™}ßÙOÿåí5R»DõÁ9ʇc1+–¢Ñ{Â<­ç®únmL¨Â4ºz;ÞøÇÿÎ,^®O¡¥–EãcÍØF<1pí~³TÞ9gîJ°xŽ¥Ó 5{èÀ<ÖÕmÄjà±­‚J²’2ý]”N@¹ïS©)e’uÀ‚ßÁ_ó¹¾]7Ø7L›ÙP-|ä0ðZÔ#Mq>Ù¿ä„+”€*0Ô (a@Yj :8xþ7ô΃ù‹!5—Çs ÐSE™4ëFmãü‹ýqY@-zä:„  â8Rb)åúR‹•¥{SÅÐ8Jò&€g¢c<é´pæfæÚúÕ¢@ÄT ™žC¸ÅpÇ  o(¥ (ÍÃ^hGè£$SNê%ˆ´ÓÉ£„Œ¸ÈW8…b<ÖI Àå–UBºC‚€n„Ùl'2%ùÊež]žÙ~òê™—¨ï? y SÕi’óÉ%=rºNª ¢‰>Åñ÷€y¤Äøõ>Ò“\¼ð‰üt×W\¼â¯nñ´nBUĆúýäã|þ] Ö7Ë–\â.ÛOúW|w–‹`G`Pê„9R%¬ ަ£däãÉÓ»Ù÷‹ØðGÙ\ª?ˆ~ýèçéFJ„(ðåègGåý_ìV€™¤gjHÐIPDxy/:¤Á+tÝ;!$áGA‚­M2¢F>KÀ¤wvÓ¾½ÝØPUZFC`Rü%":Z°èŒIEND®B`‚buzztard-0.6.0/pixmaps/gnome/64x64/buzztard_generator_solo.png0000644042355400116100000000434311576360365021367 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“˜IDATxœíšßoWÇ?³3;Þ]ÿØuìlÇMHh mC T ⪠ªúUEÀ+ $x¨O<ðô !¼‚PAµj«R¤ÐB*(ªªà¤qíÚÞõý13÷ò0sgîÌÞÙ'rHÒ=ÒjÆwΜ{¾ß{ι?<0–±Œe,cËXÆ2–±Œe,cËXÞobeþù žÄ¶~*…\ø8´_bYV[ ùÌý'ùõDÜ®+½þ÷X¯þôÃöÔÑSûç”y ¨Hí¡LÞê^¦u£¯½Á•¿ýÞ¾ÿ½~ÉÓJÅÑm’¯LÌ š=nÓY _Ñ(ÉA“B™‡¤Ò“"ÔJP“ £;õ@J¨-ž¤¿~µ¼vîå'Aš À¢æLT-, yõðw ÜQÀëL@†¾ä Š„è.aûø£”*5€†ÞGš€›D`Àµ—zªH©'L,7À'i`®t¢–peK³l$«ÿYfw}ëšA9x—NôôscuÔ H¤Z¯Ñ8ÞŒI*‘¥Õïüû-¶~˾©‚e¤ÈÀgêÂyÜzÊl )…S Tô:=Þj~jßÝO¹oõ<~§*R LQ5H@jžMä3;ÉñÅy‚@1ðÜA`ný¾Ä÷BHü @‰çH^ÃöðýðªÚÿûžOß ¢«oÌ)£š õÚ0Œ€Ð%òæeÛ.aÛ¥v·l¶t#E‘Òëûìtz¬-A<Ȉœ°¯~î›8v Çv©U\fgj¬Eía`Ä58”á+ûåã —¼k€!Þ¨:‘‘c·È¡˜r"à6)µ™ @„/åÏ·šÄKa§ÁÛ¿ ´P¡u@¢äTÂÉýÄêßé¼øo»·NÆÈÀÀvíd!T|/²69_§y÷1fZ+ÐÑMÈßœDO¥‰si¸H£ &—3¥Ô]FyæØÊ3•0Ä^ö"™7ž^ŒŒïíB…\²3•i]ÝFæš¶•9ñÑígû5ÙŠú5~‘z| s=À Κle.ÈèÄQR¸îKdC˜×ÆÍýþn—Næ, {QiLƵboÀµè|á~×£¿ÕU&2´tp¦Ü¨˜×CkÀîZ›Ëç.U”>sœé…Ù‘£d®¦á'>[ѳ~«Ëú…•¡þÕ2_ 1v¥†@[8„MÿúÈ·ŒÆï[úy’_ð´Ó¦¼Î蚀Ò"K’ÕaþÅï€Ð 5w&/ÝýÁÃ4L§t7–ˆ Ó‹Õµ×C7Îeð˜Í—|ÿ",BI0¤€ˆ62ÕÃ|cŠc sé4²²ÀG® {®léSpž2Ò‹1& —œƒvJW]»Ã3—>Ë_×î¥íUX¬mðõ…øÜÜ9©^w^ÝbóìÁ»Öd‰ÉONQl\+C¢LõeÑ)‘„é°ôÍFÔ¥'J|ÿoò®Åc Üé–iµšüìâ,W: ¾vä…à›g×iŸÝà²S¦íNàö%GŸß¢óf‡C?: 6©1Ú;¢UëšÁÇfT(ì!{žÿ›åY—MΜ9Ÿ5ê“̘â×K’g—¸³²—Râ]éÓúãKvJÉ’{‡{׺l=·ÉôëI¤Q,”R˜öæÅ½*…: ɯèzvåãÜqdaàìpfªFcf’çV?š8ýv^jÓ¶íx€XÆaûùít´MÑTÔ$@ï ` Ó`Z^·l^b”Ü Þ´¦í·|z9ç0že!vUË/hfÿH" € çXÜFÜÑÚ:ÛÛ»eèn·9Q½W﹋.Ó¶¹ÇI!°ïpbàƒug¨‡‘žy4¦€Ò…;МúöâŸX^¾ÊfkGÓ‚·/­Pò¶xdþ@ªMRuaÑë§>Z˜ …ÇÌ—f á_€Õ‡a#BED åÔ3y¼ù¿=o1ߨa»vÛ-„×á©¿¢jõÖÖ„ÅÜwæàé5æ½-Qb¢uϧöÈ4îiwp!TtT©Vh;å~áËŒ†z牅¿ð‰ú›¼¸qïõ§ùÀwxxöõòV<[¤+:”O”9øÔ!:¯ìP¿ìQª—˜¸¿Aù¨c,fÅR4zO˜§õÜuBß­ éU˜Wo§jÿåTíRfñÂp} -MYÔ>?Ûˆ#®Ýïa–Ê;çÌ] ϱt¤f8ÃǺºX-<¶U0BICR¦¿‹Ò (w|ÜŠR&YÌùkø—}6·«û†i3ªfV‹z¤)ÎGû—œp’0ôtÊ@­P–Z¨Ž\ø;ÀüÅšËcˆ¹è©¢G‡L u£¶aþÅþˆ8Š, =ê;„ .àzŽ”XJ¹Úœb±yWªGI^ðLt ' NÃaºQѯ"&`‚p‘é9„[ p¼€žðzRÊ€Rã$–ðB;B%™rRï(q@¤N%dÄÀE¸Â)ã±Nša.°¬²ß#hG˜mÀv"S¯^åχ§·¿ûÞ¹—©ZмΆ©ê4Éùä’9]'UÑDŸâ€ø{À`@ Ø R¤FGEP#Mj¤QÐ6- (q X2%'° Ô? X±„XvSÉö®Éòʲ¤¬^»|ìƒä’sï9ýÁ%Å!‡\’KÕ¨;sÎw¾{ι—3gÅ©?Å#BŠ}L¼·FBü7˜ÿ|ÃË|­–¶¾èé/1ã Ä­%„eæ§M!žŽõ«º†î¿vÀZ‹ËoxÈJNíðoÛÓâi{è7=* iÜ\^øßU_>½ÏdâÕ]C÷ÿt58kº!Ѻ5ÃæÄû'ÖÖqÛÚþ%æš¾Ï ®.7S«Ñ âÜ¥‘Õfþ$§Çk¿nº1¬Ù ˆÆ£ø\úÍ&‚ÉÉjc³Êuf®6šÿW~~N$)€©>„b²aáR(…CEZ+s0i0)0鲫Ë–ýÊN£y¤ÚS5…˜¡IAë"òØÁ^™j.¾Ì ´V ÎùZD€å®(SYtTÑgÃB+0k§ª 3A‘Ò4Éy¸ô¤ãyØÓ¤¡)GlÒ ¤µÓs€µ•œâ²I¸ "(­ •ëuâ¢BZ°C¨h¥ì)@¤æ>¥3eŸñ2¶À .“ÕP &h² ó“R)ø*oÇmǪtÎ_ _Iƒµe' åå„V`˜AÊÊ¥VÂ\NºËm;Ay¡.KÒªj (2[y¸„åüeL¸HÏ Kî-诚EsãPÏÐÊa eÕ€J9^fºd¼™ÎQç¼¹Ú²ï/jb†RÅ)ÀU³³ ‹c†ä&T)U¹ x¬¸p´S9I7¸ ž«º²z§ÍXÅ PÑ2¨µZUk‡Ý]•ª_­è¶æÙNWL¹\-]ÊæÁ¹øÚ‡íþä"˶T¶¸yoÕÅ·pè¸?˜ÒÙ†R€)W )ààY¥wÚücUZA“m#¤ÃXQæG¹Ý⇂Sø-gT¶¡ &‚¥-=ýÎ1WºÜ–fØy¸©Å„)ž;K]^,Ý.F•oZùóN_m¹ÄàÍk¬W‘Zêùb91µ&W\Rº àó›«rL¥Xn"uògFMa"q L¸f‚ñLòâÅM]¼Ø^Àº„Qü¤Ž[~’±Ò_¾ðκ[†‰0šàÌŒ÷þL¸9Š•7Rð­ `&‘bˆ³½Ÿÿ¡émû£»7nrI)AL¹dÄ&Æ1:zŽÛSW½‰Gâ³ðÄfá x0;Ø…ÄSoòÅF@n}ÑŒŽ’/þ · öu‰ŒKµ{ƒ©Gƒ=¡îËû…”€RJÒ0 …À™³Òõñë7®¸ßù‚Å)+¯sú*„%.ðXôc¾.æ«Ðápx™0xtíÚµ®åË–!C)fƒa&ÚÛÛqòäI5=3ó›ÈC[q¶VÙöÄãß6 cïæÍ÷šZY˜Íd H)ÑÕÝt2‰_¿ý6"|èà¡CÕôÉù F"‘K^8?z^ÜR©$R©$’É$‰!&˜ïß¶}ÛcMó¶DÂápŸ”òÙ•+Vš>¯ñD©Tét éÙ„ð¸Ý8óÑY%„øŸùœj fSÙïiÒSŸ\øðz¼0 £ðI$âèêêF__ Á?ܽ{·káî– ô¼Ûí6–¯\©é)!`š&L— Ó4ì ""™‚ééZtÖDÀ믿> âg/\ø„2Ù,‚Áàœó†aÀ²,ÌΦ180(ÄÒødtÏ‚]]Ýðz¼8}ú´% <øÚ;µè­‰`–/2pþÌoÏêööZZ[mQÇà÷ûÑßß/…ßݵkWgãî–‹0øG@@/]²‰É8 Ã(̾ÛíFoO/._¾„d2 )Ô·jÕ[3‘HD â¯ýÎHL&Ð Ù &LÏLcp`†a´X:óíÆ\-—ðÎÇþ˜™2µÖH§Ó¶Ðïíé… +fþÑ¿ü´VÝ5¯¾zø¿„”G?øà«¥¥0 r.‰8\.î¼ëNÀSÛ·?ºª^gK%‚å¾ÅKëP0„x_þº úz45¯\¹‚Po¦i¢@ød«úWÁï÷3ÁüA½úK…%? ˆÕë?³Þ˜Mò¬‚ó¦i" !›Éàô鉉Ÿ‹D"“õ诛€Ã¯?;uê”eº\èéî¶¥ÂÔÔ$Œ{î¾ÛðcO<ñøõÚÈËÖ­[Û¤À÷d =€X¿ý÷zmÔM(=›J¥ôèèyôôáv»aÈ›$Ä¢Q,Y²¡PPAÊ}Ø·×|Æ0Œ¶¡¡!ÌÌLƒ™l³ßêÃd"GG%1}ãèÑ£ª^ ðÚ˯]%¢,ˆ€½{÷ ýÔùóçñññ²( "$qlX¿^¯×­Ùúûùt†w<þ(3ßÿàƒº,•E:‚i‚Á À„cÇŽ+"úA$[ˆ ""¯üâMñƱãÇ­––tuuÙHˆÅs3øÀ–-.fþZ8¨¤k÷îÝ.)ä?ßqÇ:ZÔׇX4:Wø\0M>ŸÝÝ8yò$[*;)ØXð>cÁ€dýÍ7®Ÿ^¸€¾à"%›£h,ŠÁÁuèêê&ið •ôÄ'£{„Kxà³2™JÂÒVYáK¥’xûÄ á™H$2SIWÍØªüÅfþ_½õ–e˜‚ÁmYœœL@“ÆCŸÿœ‹˜¿¼mÇ¶Ï•êØµkW§ò»÷ÝwŸh žˆ9oÀïoC =€cÇŽi!ÄGw®»s3°7…ɽÓÓÓÖÈÈ‚½Axæ6Gù¥q|â–-[Žþ•ýÊö aoʪÌsÇwïæÍ˜ž™3àB_0„ñ‰q Œšøé½{÷6¥ïfÞGbõÈ;¶ý­išÏïÙó׆”¢ðè,' Ÿ×‡h,†ýû÷3CüÅ¡ƒ‡~Û·?ºŠ`œýòW¾bÝu¬l †bîq—ŸÏ‡Ÿþt¿uñÒå_½úJäáfaž·Iª™ðÿÁÏÜ™±göy/°bÅrÁœ{Ÿ—{ÁÂ`N€Áp-ºÑø¿l~ò¥ Óêð ý•ÏÅ"iü~s.)„ò\½v #c”FïsÍÄÜ´XóÔžÎL|Ìeˆ.ÛrÎga1¡!À`6ó³]Iˆ™¬bK#÷t.þøÇ_Ì4wÓ" 3•x˜%wc×gáóÖüH°®6Ðô¬%¾ÿÒñîÎTâaÿY7Hi,¹|^>¹>ƒØL¶Yª]~7úC~›­fHSk@^Ò©›ï"ê§´ôº$¨‰;/M'€™AÌ'ìï%Þ#Wxû\:¦5•÷ 5AšN€Ò";ØjýÎÜ”÷*EPc •[B€r˜­J=>_¿—ŒiÊém¶Ü´¦BžÝYç>Ç‹’1­ ªf«ù¤éè Pµ©ÊÖeRBÇܯJßF)P¹`Uîôbûecyb›-·®UîëÉ–I¡N8dŠº]j€¥R Z?QYAt®Z,U³Õ|ÒüPZQ®ÅÕ6RÞØT:œûá·M °æªµv" èйpÅ1"‚u; ”}¬Ø³g³_ãT szo“PJ—ïkÚ:Ô‰Â2¨o°4(ÿ}ÿ¦Tê.·ÄŠIÒÿÏ‹ hÁ@&«°¸§‹{ZÊ ºãçMzMm’Éê‚­fán†K½IY#ûöðïd‹×¼ù™óÝXÃ7Ü/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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pixmapdatadir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pixmapdataDATA 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pixmapdataDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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-pixmapdataDATA install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am \ uninstall-pixmapdataDATA # 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: buzztard-0.6.0/pixmaps/prefs-input-keyboard.png0000644042355400116100000000143411576360365016570 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÕ  s £©IDAT8Ëí•OHaÆß7߸c*©»…h!¦i’m]Ò SzlOA‡ˆ:haA¥eëa={ëD B„ *"*¥±Î±lèâÁ²uvd×ù:´nëú'ÉŽ½ðòÌ|ïÌÃó¼¼óüLˆíŠCCC{S©TÂ4 c¦»»ûÇ®ˆ#‘ˆò<ïªçy±¥¥¥ÙD"ñ=Ô*¥ „Q ÖÓÓã„Ãa«··×ÍçP›¯®®^^XX˜ˆD"QÀ4ð ¿¿¿Ö²¬ÆÁÁÁ¥”›L&wd¡««kO8L@渙4rRnåzƒâÊÊÊ#®ë¾É(õrJ:ƒ›mÝãƒ÷ÎJ)'þv ’NòtßÝû¯óKÓô wœëÐåå@Ö!6:Í?‹F£¼|õü)à_s$ÆÆÆ.V”WTùýaY–eáóù²˜›“““ÌÏÏñåËõ,†2TYïÍgrËÄrbŸ”ÂK§ÓLLü¹étzzž‡Y`®ë6/­‰DCCýaÓq:;;·%E)…R×~)Ë࡚ZǯÀ–€H§ÒõýT*• ‹m‰¡Pˆ©©iª«k²ùéÓg ñù ®µWŒŒœœ›÷Wú³/WUUm‹¶m¯sbš&EEÅÖí;·Nô÷ ¼SRʦ²²²×ußñxùý~‚Á ¶mSZZŠÖšוÑ L©oßÛê×ñxœP(„mÛ´··oJ¶V³m›`0½_^^¦ùè1ùnúí࡚›ÿÚÚzª !DÖ^¾Í|òÍžq‡@ `!š©´¦´¤¤D9ŽCKK Zël;¾þýáh@ÍÎ|¾ôøÉ£gÿjÁ¿Ÿþx~mWE™mµÛX~I‘™;ù§¿ÉCgÈõOëÃ.ܪ„;¯IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/0000755042355400116100000000000011675570700013521 500000000000000buzztard-0.6.0/pixmaps/hicolor/Makefile.in0000644042355400116100000004666311675570634015533 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = pixmaps/hicolor DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = 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__installdirs = "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon24dir)" \ "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(svgicondir)" DATA = $(icon16_DATA) $(icon24_DATA) $(icon48_DATA) $(svgicon_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ iconthemedir = $(datadir)/icons/hicolor gtk_update_icon_cache = gtk-update-icon-cache -f -t $(iconthemedir) icon16dir = $(iconthemedir)/16x16/apps icon16_DATA = 16x16/buzztard.png \ 16x16/buzztard_menu_processor_machine.png \ 16x16/buzztard_menu_sink_machine.png \ 16x16/buzztard_menu_source_machine.png \ 16x16/buzztard_tab_machines.png \ 16x16/buzztard_tab_patterns.png \ 16x16/buzztard_tab_sequence.png \ 16x16/buzztard_tab_waves.png \ 16x16/buzztard_tab_info.png icon24dir = $(iconthemedir)/24x24/apps icon24_DATA = \ 24x24/buzztard_menu_grid.png \ 24x24/buzztard_menu_processor_machine.png \ 24x24/buzztard_menu_sink_machine.png \ 24x24/buzztard_menu_source_machine.png icon48dir = $(iconthemedir)/48x48/apps icon48_DATA = 48x48/buzztard.png svgicondir = $(iconthemedir)/scalable/apps svgicon_DATA = scalable/buzztard.svg EXTRA_DIST = \ $(icon16_DATA) $(icon24_DATA) $(icon48_DATA) $(svgicon_DATA) 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 pixmaps/hicolor/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu pixmaps/hicolor/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 install-icon16DATA: $(icon16_DATA) @$(NORMAL_INSTALL) test -z "$(icon16dir)" || $(MKDIR_P) "$(DESTDIR)$(icon16dir)" @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ 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)$(icon16dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon16dir)" || exit $$?; \ done uninstall-icon16DATA: @$(NORMAL_UNINSTALL) @list='$(icon16_DATA)'; test -n "$(icon16dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon16dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon16dir)" && rm -f $$files install-icon24DATA: $(icon24_DATA) @$(NORMAL_INSTALL) test -z "$(icon24dir)" || $(MKDIR_P) "$(DESTDIR)$(icon24dir)" @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ 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)$(icon24dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon24dir)" || exit $$?; \ done uninstall-icon24DATA: @$(NORMAL_UNINSTALL) @list='$(icon24_DATA)'; test -n "$(icon24dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon24dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon24dir)" && rm -f $$files install-icon48DATA: $(icon48_DATA) @$(NORMAL_INSTALL) test -z "$(icon48dir)" || $(MKDIR_P) "$(DESTDIR)$(icon48dir)" @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ 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)$(icon48dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icon48dir)" || exit $$?; \ done uninstall-icon48DATA: @$(NORMAL_UNINSTALL) @list='$(icon48_DATA)'; test -n "$(icon48dir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icon48dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icon48dir)" && rm -f $$files install-svgiconDATA: $(svgicon_DATA) @$(NORMAL_INSTALL) test -z "$(svgicondir)" || $(MKDIR_P) "$(DESTDIR)$(svgicondir)" @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ 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)$(svgicondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(svgicondir)" || exit $$?; \ done uninstall-svgiconDATA: @$(NORMAL_UNINSTALL) @list='$(svgicon_DATA)'; test -n "$(svgicondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(svgicondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(svgicondir)" && rm -f $$files tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(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 $(DATA) installdirs: for dir in "$(DESTDIR)$(icon16dir)" "$(DESTDIR)$(icon24dir)" "$(DESTDIR)$(icon48dir)" "$(DESTDIR)$(svgicondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." 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-icon16DATA install-icon24DATA \ install-icon48DATA install-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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: uninstall-icon16DATA uninstall-icon24DATA \ uninstall-icon48DATA uninstall-svgiconDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: install-am install-data-am install-strip uninstall-am .PHONY: all all-am check check-am clean clean-generic clean-libtool \ distclean distclean-generic distclean-libtool distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-data-hook install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-icon16DATA install-icon24DATA \ install-icon48DATA install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip install-svgiconDATA installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am uninstall uninstall-am uninstall-hook \ uninstall-icon16DATA uninstall-icon24DATA uninstall-icon48DATA \ uninstall-svgiconDATA install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi # 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: buzztard-0.6.0/pixmaps/hicolor/48x48/0000755042355400116100000000000011675570700014320 500000000000000buzztard-0.6.0/pixmaps/hicolor/48x48/buzztard.png0000644042355400116100000000442711576360364016625 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<”IDAThÕYkl×þîÌÙe׀߻¶[¨I‚MÖ††G¬4†6 …ü(2°Á­šVj¤Rõ•–¨irUÒÆUE«4Œªˆ¢F…D”&BUIKÀTjŠÝ`JD¦mlïÃÞõî̽sûcŸ3;»Þ-ê‘å½sï9ßwwîœ%Bü? ùÛ“t¿Áø!­J!L¢òàÊWô›·ík?gƱ'Si\ÜEô®oÿŒJw5ú`$¢;ð4ûôaC)6oë¯úî­?¤¥:{ =Š—NìeTA%‡âê«U)”–¥xUAŠŽªÊ^Ï¢/AAiJkZ¹ÉôŸyÌr)1­ óì™ì›±,VÆ“ö(®s–3SXY@g!d‡yét¦é™ Có¡'„ ž;µ°±—;YÛj“'Â"BBêx„‘òÅ–Ç{¹}Yûc÷ÞsÂÔ–g!py|<~ëæÍWN¿}æRjí,€ÛBˆ©H˜ìmøÜ†-^OóÏX½Ú-É$‰@–d|üïqitôƒ7ÿÖÆ6 %mz¡éïÿ|+dǵõ½ë]Á`ÑXÂp:X\[‡ ÃÃ1]â¯ÿöõæ\Lü~¿JdÜX¹ªÛ ÌÌD Ë2T‡m­m8ûÞÙèÜlâñ@ ðG»õR!ÅGŽünBÆk×®Ïyš= ”B¦š¦A–$,k_¦R.¨|ñ͆†úEõõ ˆÍÅ ¨ E§ÙƒÛ\Khç /Jb³Úó·'nÏiºŽºÚzP*ƒRŠP(ˆe÷.£ŠJ·lïß¾¶Rì}}} „½>ŸÏ ‡¡P UQQ³p!Ün7.k:øî¢ü‹ÝºuSD¡ñ×^;~¢T\%ƒ‰gÇ.1BjׂR J)¦&'ñÀšµªLå]Û¿°½³Ðz¿ß_Ÿ~¶wƒ; ‚Ê2TEk ‹këð§³gãLO•ƒ©,@`Ú Æ¾ .ÄZZÛ@ådt¦ƒézzzT•È¿*´^VÈsŽÚºÚÔCKMn‹c££L×õ7À_ÿk@häÅ?üG8Ž ±±)…É©Iø|>Éåvõìèßñ¨u]ÿÖO‚ཽ½ ¦ƒS©mSÁ¢…‹ (œÖãBÿN¹xÊ&4_çÝwb^ªš|¸ D"a<òÈF—"ÉLº uxø¡Ï(²,A×õ¬÷½-8î\œsþ‹JÎUe€cG½1==5~óæ-áiöf¢ ±téRx[Z¼ï¿ÿ•ôü;·­s¨Ž-k×®£ÁÐ4TUª*¨««ÇÜ\—.]Š«Ôù£J°TDŒ=õöéÓñ††Ftûº±²{º»VÁétbÓ¦M.YÂ`²hY¡7oÞìt¹\¸ï¾¬èìBÇòhkýNýáTLp㻇ŽV‚£àqz>yèkG÷sÆ¿/óæQŠA’zYI­†²"ÿdø¥ÏV‚£â=çÆžgž\OœjÑnú¼×tò¡÷¾àK@Aª‚3£ÿªT`c·§¤¶|!©êWÌóž;'seí2sK{¥L©Š€ÎŒLƒÊÚ'²kJeçåèÐÍ]r¥JÜL -ÖnsÎS‡A Û¡«Pª" 1Œg[„y‰$lZ" hw“€®s0–NaÛ:æ°~½«)¤å¤PZì~O°m¡çè¨Fª/ÔeFIµ é¥t# Ku°¤Pú#¿lšƒ©yšµK]¦ÜñÊíá›Ga›Zw—€ÆÀ9/ئuž¹ÈÞHÜ5„°Ù˜N»>UŸ··–'qs- Dc@HÅ…P1 <ó—ž Wª#)‚k±ð¼mùBRñqÈo“§‡-ŸÅÆÒmò !&+Áðêx#ÐÆ‹IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/0000755042355400116100000000000011675570700014306 500000000000000buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_tab_info.png0000644042355400116100000000147711576360365020457 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¼IDAT8e“MO^U…Ÿ½Ïá¾_BË ¦­Å·aˆs sŒ3㔩qFÔ'-3b ¿¡sÜô0ó#¤¤)C£À…{Ï=gobSíJöl­••<âî¼®ÉÚö"°®ª«î¾ "‡æ¾ûîÑÞæ/¯ûåß‚ÉÚ¶ŠÈ†ªl½=?®¦g†q8‚Wõ5—u>==KfþØÝwŽö6íUÁdm[UõéhØ_ywá‘NU¸+ˆ *JÇJÇÑoÇõE}}àfŸímšÞ¼¸1ôV>e"Å”#ß|ñ;_~L¯ª0“È£ަGƒÙÐÉÚöbºu÷þÑu*ˆ(ÕT¤êU¤ì4©Ð«¦¨zª¶sÞ»?R•­ÉÚöb‘õñøVUPpA 1PÅÈO‰1Põ*(¥ÐåŒI`nn¶:ýãåºÆVûý^ÌÙDEU‰!Ðïõˆ! ª¨("BWœÁpUdUK±åþp@¶‚»ãî˜ÅŒ¯>]ä»Ï—È¥PÌ07Ü\Œª_áîË*½*bf”bäbä\èºÌ°˜Dš6Ñu™œ ¹¥J)háкŒ#—Bî2©ëhSÂÝhš–6%Rב»Œ»sU7„ ‡šsÞoSÊs·ß¢» §¶£ifŽ;\7-M›HmGê:Ì ^r.ÅöÕÌwŸÿžæo ö#mJ4m¢iZÌ pš¦ýçÚD—;úA8;û3¹û®¸;>ûþëñìÌ“——FÇ'/9û«~µ¼¸ƒÝŒxw<ÍóãõÅEýäן¾ýAJ±óóúàððçúÁ½Y–î0žREE^˜¿=bro–ÏOêúêú ˜í¼SºT¶–ÞPMÏŒâh8 ˜sqyÉùyž$3{\Šý¦ÿ㬪ëÕT\Í¥,ÄS—÷Íì œÿó±ŸF¿®IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_menu_processor_machine.png0000644042355400116100000000031711576360365023415 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ3EGµOIDAT8Ëc`hÀÈÀÀÀP_ÿŸBþ“iBC# 2ÿ`ãA8Û¾Þž(3˜( k+V\\HÒ¸‡au¼0 `A²R"¥Éy`™NŠw~zÙIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_tab_waves.png0000644042355400116100000000111411576360365020635 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÉIDAT8•’½kQÅÏ{óIÆÝ|cÀ¬™¤’!BT+M!;hace±EJA,Lš ¤4µ;Øø¸µ£Ø¤ò#¢‚‰Å®"î.“,æsßî¼wm\Y'38p9—ûã À²ys²ËL¿:?6eTë_ÐT¶áਙÁËw‹{MŲ̀rBuxWy‘žfŒýÉZƒ" Œ3¿#"‚‘V¡ÞÜÃ(Yèƒã|´Øy~aâ’½ÞøŠ(Š AG¯q’-¯,Õ7·ÞÐWŸÈÚ?žX¾òÀ^ 7+SšÃø†(Â=r•R$øÖ³§7÷u‹K)š]+}¨÷À…#¡7Rø\z/HÑ4ÿHTȉ·»í7Õõ2 Ùgð±øzW*y·ß€ˆfŠÕO;åð­!€{­#¢$ ø½Â÷É‹…œxÑÊ5øÝãŽ"ù¨ý¸U/±³y³/žýÈÑüH*Y»IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_menu_sink_machine.png0000644042355400116100000000031511576360365022340 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ19(tü?MIDAT8Ëc`hÀÈÀÀÀP_ÿŸlX 4¹&0² ól„³ííë‰2‰Ò0@q±¶b5ÀÅ…4{öPÉ ÃÀô@!+)Sšœ «]¹2IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_tab_sequence.png0000644042355400116100000000056311576360365021327 00000000000000‰PNG  IHDR‘h6 pHYs  šœtIMEÖ 28\¥”tEXtCommentid logo†Æw¹÷IDAT(Ï•R»M1}ï!R¥PÀ" ¢2$Dˆp$”Áu1‚€ˆ`wÖÞÙ›èp`Yž7~Ÿ1ïîoñŸU,W«Ñ/ëuOg7›T{;^¦›ïëÊ 5‚b=M謅 QªE¶ËzÆ7 ’TihÖeÑB’¬d†ú2ƒ$Z lùmÛÐä¤uÛŸçïã…7¦Ã0MÙÀÀÌK 6Iƒ]ãÞ÷}b܃áùê´ á8z=I±þ^|Mdª±;1‹6Í!G“yÃ9f:0ŸC N‹ýƒTî/2Ãô[ŸvÿÞ Ÿ(Xåx?'IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_tab_machines.png0000644042355400116100000000114111576360365021277 00000000000000‰PNG  IHDRóÿabKGDÿÿÿ ½§“ pHYs × ×B(›xtIMEÖ$R99ÑîIDAT8˵’ÏNQÆ¿;÷Ãb66:1Å÷ÀvTqQc\})m˜L¦ÛÂ[ðGÐ ¥)±eÛJ¢ ¾ 3ÖtB:‹Ó;÷ºªqadãY}‹sr¾óýAÄ*®Xr 3‹92ÐJ”áRÉRlÛÁ‹ç/aÛJ%K‰º…Õ<=¯'…²çõ䨸¨(¬æ «lÛ¶+_Àáa7?6dân’¤R÷Xny ÃÃñ«O0 ªª¢yÔÀ­›±ëÍ£TU…i˜Ñ2Ð žç!1’Dç{÷Gb$ Ïó úÈàO¨ÎÏH)%4Mƒi˜Ð ív„¼Û~OÈï¨Î'4݉Çéç““0›É!»7Û›¿=šŒn×Åë¢õw›³sÓ¢Õ:•AHÎûÒ÷}Éy_A [­S9;7-”âŠ%³s±»³Gêµ_X|Õ¯×j|wghšF¶Þn‚RŠõ5ÿé³'b}cͧ”âøøSŸ2úA‰‚ŠsŽêAuBaÕƒêçšvûZÈôc é©´EðôTÚgŒ¡Ý>ïSF«ÿž,-,ËɉÍæ2¸¼t‘Íe09‘¢ˆëºèt.°_)ó¯ß¾„û•2ït.àº.È@«„œ? Œ•CÎïB €(??^ 5ñGIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_menu_source_machine.png0000644042355400116100000000031611576360365022675 00000000000000‰PNG  IHDRóÿasRGB®ÎébKGDÿÿÿ ½§“ pHYs  šœtIMEØ3,wŸzVNIDAT8Ëc`hÀÈÀÀÀP_ÿŸ2þ“iBC# ²@ãÁƒpv½½=Q†0Q(. ÖV츸¦sÏêxaÀ‚(d¥DJ“óÀ˜ÒŠ‹^XIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard_tab_patterns.png0000644042355400116100000000073211576360365021355 00000000000000‰PNG  IHDR‘h6 pHYs  šœtIMEÖ 7 PótEXtCommentid logo†Æw¹^IDAT(Ï•’».„AÇÿ™ù\w#¶Q<„F$*[HDlï艄xñZ‰¸¡N-±,zËZ×ì(ÎÇRa2™œ™œó¿œ9:Üæ?+ýC Ì>9š ½¾\þšÝÐØ 8ä—–·³¹B6W@ðà³¹Bz*‘B*IòR23·R¹[7°Lû(`×lnÜrK ÀYµˆ Ë›1 ZÛòRÉC~q~²µ-TË;©jÕ ˆ”Á¥½r~zj¢ú°W½?@¾¾GIõáyC7‰`x’‹ŸÐ‘š¹HMr’ÿò¤¤«wÌØK«Æ,|Sfà¹rÜœ|®Û£¼Ë:üÅùš"½#@©¸4eÒÖS«3@Ï7LÍuqÛð^O-}ÂcP @gO¸¹ÚýñÃ@.àê¦ð·Wûf7âD-âLâíé,‚¾y.tüqþôßñþY1Ä "IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/16x16/buzztard.png0000644042355400116100000000126511576360365016611 00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<2IDAT8•’?LSQÆï¾×šZR)0¡D%„kHŒƒl.¢Á‚«ƒ‹‰2¹¸˜ Ftc‚”g1.ps`0Që€ÐPBÓ¾öµ}´}÷8…´$ê™nîùîï;÷»×ø4aÎ뺧©”eÚçgêc7fBó~]·hLKÙ–®ûñØäK e€Z ©©Ûq` À¯ëøÝÑi ¥@Dkž.Ü‹[~µHí[!Ð7ÚlF¹ê²’ÝõaèÄ8@­˜aÇ+Ћ™@ÎÝ¢Tô@@rÁ­€çl`t\@ÍŽ³ÑÈ:N†Ð{šmgs`˜†ýûÕlK@†2ìÆÚ0ì¥ ­ð Ù nìÖÍ;‘HäQooo8•JåµÖ=v"éÄÇGCJ©t,ëH§Ó¥\.÷01gO¨}šˆ¼(•JÙ`0Hggç1¥ÔƒýžRj2†Ú#í …¢ÖúYcŠý öœ®†ÃáùáËÃáÅw‹ß÷ûºiš?G®_~¿ìæóù ;‘\hÀßÉN$ßÖjµ/NÁÑV x¦­J¥"^Åûqøpãצê2÷5šÔÒ¥õ]ø¾ê—&ÂéÇÍú€<{îÊÅ>.ÅzÙË>|N³´¢úÿ ¨Ö|RkYÖ2.ˆpª«jí(éÑ·RÅ*z”Ê»?ÏqMŠ•ÿ”<ºO„9Ó݆ˆ "¸eW׷ﯮo‡šö=íWß4‹ÿØ Î’•ÁˆIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/24x24/0000755042355400116100000000000011675570700014304 500000000000000buzztard-0.6.0/pixmaps/hicolor/24x24/buzztard_menu_processor_machine.png0000644042355400116100000000036011576360365023411 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ S#á}IDATHÇí”1€ EÄkïÕp/ÂÁê¤AЉjxSC“ÿiÉ&“QÜQˆŠZ GÀRæ˜Ïz•ÕÄÈ¿½¢ËV·¾3P€mX0¸€¨t¬E‹‰A­íšhg`1A_åÀL¹ÖòmàFi·ðmi~ž“²ošê¸SIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/24x24/buzztard_menu_sink_machine.png0000644042355400116100000000034011576360365022334 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ ô8‹!mIDATHÇí“1À E?M¯e\¼á^.ƃáÔF·BãÀ›>ÁWè ˜U- ‹À='[“7ΙM„.o‹– ¬ºÞ (”bS´ÖE"äbѲƒ”ÈW wõ`VW‹ÈëLÿýƒù¼‚à4P•n*Ä@IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/24x24/buzztard_menu_grid.png0000644042355400116100000000104011576360365020627 00000000000000‰PNG  IHDRÄé…cbKGDOOO¾Eâ pHYs  šœtIMEÖ  è‘íIDATHÇí•1Kä@Çd ­N´H!V×Ëqb%Ât’B„UìÛ\y]zïCìuˆ¥~ƒm¶ÖFAî°XåǼ]³KNô8ÿ’÷òKfÞ¼É? 8–^_߀~|V(çœÊ²LåyŽÄrÏ£œsH¼±9?•/ßû±äeâuzrÃÓ˜õˆ ÀîþÂTrm}®1õsµÕdËGd­!„¦ cSå“xï}ìh­«äp8¬b­õHÜï÷±Ö¶â{½Þh%eÓZ)„€µ¶5_ÅÓ õòsh­IÓ4n휩¯_ðÞ`ŒÁZ½÷êÇÝ'~ÿŠìmÏU|QÊ9Wñ²¼¥'ò‹K3U%Y–‘çy”XdŒÁ9…çgg“^&•ÈÕåÅ}ëužÄÞÞ>4æ;å ¥7Õ.JÓcLUA]ãq? ž}'¼•dÄz²MO$ÞØœŸÊ?ëÉK½«þïJÄsä¨{Yý¬µ&„À4^ìFk÷¾jú»wý›Þu=îGõN]bãÞ%ü$ïJ€càü\åøÐŽÊe{í£tQdrFfÊIEND®B`‚buzztard-0.6.0/pixmaps/hicolor/24x24/buzztard_menu_source_machine.png0000644042355400116100000000034411576360365022674 00000000000000‰PNG  IHDRàw=øbKGDÿÿÿ ½§“ pHYs  šœtIMEÖ `+·•qIDATHÇc`£€RÀcü¯¯ÿOUƒX„³ëíí©b­ƒÅÔr5N \\({[[†ÿõõÄÑ¿ÿÈ`â,`b¢(ŠþÓ:’ifÑq@–á‡`>`سg´ðƒâÊVë·¡IEND®B`‚buzztard-0.6.0/pixmaps/hicolor/scalable/0000755042355400116100000000000011675570700015267 500000000000000buzztard-0.6.0/pixmaps/hicolor/scalable/buzztard.svg0000754042355400116100000005247311576360365017616 00000000000000 image/svg+xml buzztard-0.6.0/pixmaps/hicolor/Makefile.am0000644042355400116100000000241311576360365015501 00000000000000## $Id: Makefile.am 2543 2009-07-31 20:35:05Z ensonic $ iconthemedir=$(datadir)/icons/hicolor gtk_update_icon_cache = gtk-update-icon-cache -f -t $(iconthemedir) icon16dir = $(iconthemedir)/16x16/apps icon16_DATA = 16x16/buzztard.png \ 16x16/buzztard_menu_processor_machine.png \ 16x16/buzztard_menu_sink_machine.png \ 16x16/buzztard_menu_source_machine.png \ 16x16/buzztard_tab_machines.png \ 16x16/buzztard_tab_patterns.png \ 16x16/buzztard_tab_sequence.png \ 16x16/buzztard_tab_waves.png \ 16x16/buzztard_tab_info.png icon24dir = $(iconthemedir)/24x24/apps icon24_DATA = \ 24x24/buzztard_menu_grid.png \ 24x24/buzztard_menu_processor_machine.png \ 24x24/buzztard_menu_sink_machine.png \ 24x24/buzztard_menu_source_machine.png icon48dir = $(iconthemedir)/48x48/apps icon48_DATA = 48x48/buzztard.png svgicondir = $(iconthemedir)/scalable/apps svgicon_DATA = scalable/buzztard.svg EXTRA_DIST = \ $(icon16_DATA) $(icon24_DATA) $(icon48_DATA) $(svgicon_DATA) install-data-hook: update-icon-cache uninstall-hook: update-icon-cache update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ $(gtk_update_icon_cache); \ else \ echo "*** Icon cache not updated. After install, run this:"; \ echo "*** $(gtk_update_icon_cache)"; \ fi buzztard-0.6.0/pixmaps/stock_volume.png0000644042355400116100000000214211576360365015225 00000000000000‰PNG  IHDRàw=øbKGDþþþëÔ‚ pHYsHHFÉk> vpAgxL¥¦fIDATHÇí•ML\UÇç½7”–Rb¥Xî[[ njbt©.´…b']‚Ú¤šª´‘š—èBM AÑÄJÇSMвê‡L°˜LÕ–D!iT4d˜û>Ž‹ù` C¤]¹ð$7ïÜ{Ͻ¿û¿ÿ›<ø?þ%ìõöö½ýæ–»ï:»sÇŽSSßM¬wµž"×u7xƼÜõÒ±Ê@ƒ×KÕ4?{úÑÆg"·˜™ù©ÁÞºµ ËJÕhÈ!K+zn;øô«‘èoØö·éº€±Ã£ªtìîˆ7O;ÅÖ¶}FD CF£UUÕíG_x¾üÜçc%÷oüõ¾^é:—ì?øESgüEKôÃí-#ß'ZÍ*ªq{\Çíq RWW×~â•šÚµ%Zz ‘×öŽoLÆ>õ¢ÕK{nRвo5p ²²²°öX×ñŠM5›ð}µ©ñ.KeèÒ{&›;‡Æ—’ïÇ>h>ôñŠ>©ˆ%vi´Z¥¥¥«Õª†¾—Tƒƒ’«æp8X™žfooY–Uج?yq¤‹[7.±8Ò`ð*³YB}}ŒQWWp¨Ž—DÐÔ=Iwûešº' ¾ÞnZ­¤B!¼^¯˜Ài½š¢ F^¾Õv­÷óŠ˜ÍòÈå"‰\´Ùl/€‡z5†[Th—Æ"Çè»^Ãݶ¶‚ñœÙÌíñq?`Þp‹Ü ›%ºP≥%æææ‡ÃÛÊÉ´_ò®©»a³h¢¦â}Íçóå2™Ì<V”ﱂ½¨Ðÿ~<¼±AtgG«ƒ×ë­ª8ð ˆk¦£´ögËËtvv200 awÚÛ‘$Éœ¾«†(„~¿ßÐëý~¿eY!„,Ë¢§§GH’$$Ivûa±H"‰‹ ‹©³!\Uˆ?††žÐÚê`ff†ôÄ„¯w»§ÓiR”ü5…ý(ëu0ÔTƒAƒ }ÿ°è‡Ø×ÕZÎ+i ø¬Ûl¶xrjʼj±àt:I$³Àc ZŽq~¸d€uà 𸜩(A`;ð ø ¼6ÊA Î•jeå5?€Ý?ùo[y.¬}IEND®B`‚buzztard-0.6.0/ltmain.sh0000755042355400116100000073341511675570446012170 00000000000000# Generated from ltmain.m4sh. # ltmain.sh (GNU libtool) 2.2.6b # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --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 # --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 informational messages (default) # --version print version information # -h, --help print short or 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. # 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) # $progname: (GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . PROGRAM=ltmain.sh PACKAGE=libtool VERSION="2.2.6b Debian-2.2.6b-2ubuntu1" TIMESTAMP="" package_revision=1.3017 # 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 # NLS nuisances: We save the old values to restore during execute mode. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done $lt_unset CDPATH : ${CP="cp -f"} : ${ECHO="echo"} : ${EGREP="/bin/grep -E"} : ${FGREP="/bin/grep -F"} : ${GREP="/bin/grep"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SED="/bin/sed"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: 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. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # 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" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # Generated shell functions inserted here. # 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: # In the unlikely event $progname began with a '-', it would play havoc with # func_echo (imagine progname=-n), so we prepend ./ in that case: func_dirname_and_basename "$progpath" progname=$func_basename_result case $progname in -*) progname=./$progname ;; esac # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=: for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to 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 '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname${mode+: }$mode: $*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && 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_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname${mode+: }$mode: "${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname${mode+: }$mode: warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "X$my_directory_path" | $Xsed -e "$dirname"` done my_dir_list=`$ECHO "X$my_dir_list" | $Xsed -e 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_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 "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "X$my_tmpdir" | $Xsed } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "X$1" | $Xsed -e "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # 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 () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "X$1" | $Xsed \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_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. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent 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 () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent 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 () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_version # Echo version message to standard output and exit. func_version () { $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $SED -n '/^# Usage:/,/# -h/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" $ECHO $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help # Echo long help message to standard output and exit. func_help () { $SED -n '/^# Usage:/,/# Report bugs to/ { s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(automake --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(autoconf --version) 2>/dev/null |$SED 1q`"'/ p }' < "$progpath" exit $? } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { func_error "missing argument for $1" exit_cmd=exit } exit_cmd=: # Check that we have a working $ECHO. if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t'; then # Yippee, $ECHO works! : else # Restart under the correct shell, and then maybe $ECHO will work. exec $SHELL "$progpath" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat </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 } # Parse options once, thoroughly. This comes as soon as possible in # the script to make things like `libtool --version' happen quickly. { # 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 ;; esac # Parse non-mode specific arguments: while test "$#" -gt 0; do opt="$1" shift case $opt in --config) func_config ;; --debug) preserve_args="$preserve_args $opt" func_echo "enabling shell trace mode" opt_debug='set -x' $opt_debug ;; -dlopen) test "$#" -eq 0 && func_missing_arg "$opt" && break execute_dlfiles="$execute_dlfiles $1" shift ;; --dry-run | -n) opt_dry_run=: ;; --features) func_features ;; --finish) mode="finish" ;; --mode) test "$#" -eq 0 && func_missing_arg "$opt" && break 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 $opt" exit_cmd=exit break ;; esac mode="$1" shift ;; --preserve-dup-deps) opt_duplicate_deps=: ;; --quiet|--silent) preserve_args="$preserve_args $opt" opt_silent=: ;; --verbose| -v) preserve_args="$preserve_args $opt" opt_silent=false ;; --tag) test "$#" -eq 0 && func_missing_arg "$opt" && break preserve_args="$preserve_args $opt $1" func_enable_tag "$1" # tagname is set here shift ;; # Separate optargs to long options: -dlopen=*|--mode=*|--tag=*) func_opt_split "$opt" set dummy "$func_opt_split_opt" "$func_opt_split_arg" ${1+"$@"} shift ;; -\?|-h) func_usage ;; --help) opt_help=: ;; --version) func_version ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) nonopt="$opt" break ;; esac done case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_duplicate_deps ;; esac # Having warned about all mis-specified options, bail out if # anything was wrong. $exit_cmd $EXIT_FAILURE } # 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 } ## ----------- ## ## Main. ## ## ----------- ## $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi test -z "$mode" && func_fatal_error "error: you must specify a MODE." # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$execute_dlfiles" && test "$mode" != execute; 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=$mode' for more information." } # 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 \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # 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 "$lalib_p" = yes } # 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 () { func_lalib_p "$1" } # 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_ltwrapper_scriptname_result="" if func_ltwrapper_executable_p "$1"; then func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" fi } # 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 () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" 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 () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$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 () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done 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 "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) ;; # 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_quote_for_eval "$arg" CC_quoted="$CC_quoted $func_quote_for_eval_result" done case "$@ " in " $CC "* | "$CC "* | " `$ECHO $CC` "* | "`$ECHO $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$ECHO $CC_quoted` "* | "`$ECHO $CC_quoted` "*) # 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 "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T <?"'"'"' &()|`$[]' \ && 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 "$build_old_libs" = yes; 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 "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then output_obj=`$ECHO "X$srcfile" | $Xsed -e 's%^.*/%%' -e '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 "$need_locks" = yes; 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 "$need_locks" = warn; 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 removelist="$removelist $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist removelist="$removelist $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 if test -n "$fix_srcfile_path"; then eval srcfile=\"$fix_srcfile_path\" fi func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; 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 command="$command -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && 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 "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then command="$command -o $obj" fi # Suppress compiler output if we already did a PIC compilation. command="$command$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && 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 "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $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 building PIC objects only -prefer-non-pic try to building 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 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 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 -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 -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 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 \`$mode'" ;; esac $ECHO $ECHO "Try \`$progname --help' for more information about other modes." exit $? } # Now that we've collected a possible --mode arg, show help if necessary $opt_help && func_mode_help # func_mode_execute arg... func_mode_execute () { $opt_debug # 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 $execute_dlfiles; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) # 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 dir="$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 -*) ;; *) # 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_quote_for_eval "$file" args="$args $func_quote_for_eval_result" done if test "X$opt_dry_run" = Xfalse; then 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" else # 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 fi } test "$mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libdirs="$nonopt" admincmds= if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for dir do libdirs="$libdirs $dir" done 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" || admincmds="$admincmds $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS $ECHO "X----------------------------------------------------------------------" | $Xsed $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 "X----------------------------------------------------------------------" | $Xsed exit $EXIT_SUCCESS } test "$mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. $ECHO "X$nonopt" | $GREP shtool >/dev/null; 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" install_prog="$install_prog$func_quote_for_eval_result" # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= for arg do if test -n "$dest"; then files="$files $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) case " $install_prog " in *[\\\ /]cp\ *) ;; *) prev=$arg ;; esac ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" install_prog="$install_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 -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=yes if test "$isdir" = yes; 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. staticlibs="$staticlibs $file" ;; *.la) # 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 "*) ;; *) current_libdirs="$current_libdirs $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) future_libdirs="$future_libdirs $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" dir="$dir$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$destdir" | $Xsed -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 "X$relink_command" | $Xsed -e "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "X$relink_command" | $Xsed -e "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_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) 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" && staticlibs="$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 "$build_old_libs" = yes; 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=yes 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 "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { 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 "X$file$stripped_ext" | $Xsed -e "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_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $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 "$mode" = install && 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 () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; 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$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; 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 "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` for progfile in $progfiles; do func_verbose "extracting global C symbols from \`$progfile'" $opt_dry_run || eval "$NM $progfile | $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" $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' eval "$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'" } 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 $ECHO >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; " case $host in *cygwin* | *mingw* | *cegcc* ) $ECHO >> "$output_objdir/$my_dlsyms" "\ /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */" lt_dlsym_const= ;; *osf5*) echo >> "$output_objdir/$my_dlsyms" "\ /* This system does not cope well with relocations in const data */" lt_dlsym_const= ;; *) lt_dlsym_const=const ;; esac $ECHO >> "$output_objdir/$my_dlsyms" "\ extern $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; $lt_dlsym_const lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," 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" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) symtab_cflags="$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"' # 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 "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` fi } # 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. func_win32_libid () { $opt_debug 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 if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then win32_nmres=`eval $NM -f posix -A $1 | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` 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_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" 'exit $?' 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 () { $opt_debug 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` darwin_base_archive=`basename "$darwin_archive"` 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 "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | $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 | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper_part1 [arg=no] # # Emit the first part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part1 () { func_emit_wrapper_part1_arg1=no if test -n "$1" ; then func_emit_wrapper_part1_arg1=$1 fi $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $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. Xsed='${SED} -e 1s/^X//' 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 ECHO=\"$qecho\" file=\"\$0\" # Make sure echo works. if test \"X\$1\" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test \"X\`{ \$ECHO '\t'; } 2>/dev/null\`\" = 'X\t'; then # Yippee, \$ECHO works! : else # Restart under the correct shell, and then maybe \$ECHO will work. exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} fi fi\ " $ECHO "\ # Find the directory that this script lives in. thisdir=\`\$ECHO \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` done " } # end: func_emit_wrapper_part1 # func_emit_wrapper_part2 [arg=no] # # Emit the second part of a libtool wrapper script on stdout. # For more information, see the description associated with # func_emit_wrapper(), below. func_emit_wrapper_part2 () { func_emit_wrapper_part2_arg1=no if test -n "$1" ; then func_emit_wrapper_part2_arg1=$1 fi $ECHO "\ # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_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 \"X\$thisdir\" | \$Xsed -e 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; 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" # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` export $shlibpath_var " fi # fixup the dll searchpath if we need to. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 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\ " } # end: func_emit_wrapper_part2 # 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 in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=no if test -n "$1" ; then func_emit_wrapper_arg1=$1 fi # split this up so that func_emit_cwrapperexe_src # can call each part independently. func_emit_wrapper_part1 "${func_emit_wrapper_arg1}" func_emit_wrapper_part2 "${func_emit_wrapper_arg1}" } # func_to_host_path arg # # Convert paths to host format when used with build tools. # Intended for use with "native" mingw (where libtool itself # is running under the msys shell), or in the following cross- # build environments: # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # where wine is equipped with the `winepath' executable. # In the native mingw case, the (msys) shell automatically # converts paths for any non-msys applications it launches, # but that facility isn't available from inside the cwrapper. # Similar accommodations are necessary for $host mingw and # $build cygwin. Calling this function does no harm for other # $host/$build combinations not listed above. # # ARG is the path (on $build) that should be converted to # the proper representation for $host. The result is stored # in $func_to_host_path_result. func_to_host_path () { func_to_host_path_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' case $build in *mingw* ) # actually, msys # awkward: cmd appends spaces to result lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_path_tmp1=`( cmd //c echo "$1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_path_tmp1=`cygpath -w "$1"` func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # Unfortunately, winepath does not exit with a non-zero # error code, so we are forced to check the contents of # stdout. On the other hand, if the command is not # found, the shell will set an exit code of 127 and print # *an error message* to stdout. So we must check for both # error code of zero AND non-empty stdout, which explains # the odd construction: func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null` if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\ $SED -e "$lt_sed_naive_backslashify"` else # Allow warning below. func_to_host_path_result="" fi ;; esac if test -z "$func_to_host_path_result" ; then func_error "Could not determine host path corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_path_result="$1" fi ;; esac fi } # end: func_to_host_path # func_to_host_pathlist arg # # Convert pathlists to host format when used with build tools. # See func_to_host_path(), above. This function supports the # following $build/$host combinations (but does no harm for # combinations not listed here): # $build $host # mingw (msys) mingw [e.g. native] # cygwin mingw # *nix + wine mingw # # 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. # # ARG is a pathlist (on $build) that should be converted to # the proper representation on $host. The result is stored # in $func_to_host_pathlist_result. func_to_host_pathlist () { func_to_host_pathlist_result="$1" if test -n "$1" ; then case $host in *mingw* ) lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # 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_to_host_pathlist_tmp2="$1" # Once set for this call, this variable should not be # reassigned. It is used in tha fallback case. func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e 's|^:*||' -e 's|:*$||'` case $build in *mingw* ) # Actually, msys. # Awkward: cmd appends spaces to result. lt_sed_strip_trailing_spaces="s/[ ]*\$//" func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; *cygwin* ) func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"` func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\ $SED -e "$lt_sed_naive_backslashify"` ;; * ) # unfortunately, winepath doesn't convert pathlists func_to_host_pathlist_result="" func_to_host_pathlist_oldIFS=$IFS IFS=: for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do IFS=$func_to_host_pathlist_oldIFS if test -n "$func_to_host_pathlist_f" ; then func_to_host_path "$func_to_host_pathlist_f" if test -n "$func_to_host_path_result" ; then if test -z "$func_to_host_pathlist_result" ; then func_to_host_pathlist_result="$func_to_host_path_result" else func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result" fi fi fi IFS=: done IFS=$func_to_host_pathlist_oldIFS ;; esac if test -z "$func_to_host_pathlist_result" ; then func_error "Could not determine the host path(s) corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This may break if $1 contains DOS-style drive # specifications. The fix is not to complicate the expression # below, but for the user to provide a working wine installation # with winepath so that path translation in the cross-to-mingw # case works properly. lt_replace_pathsep_nix_to_dos="s|:|;|g" func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\ $SED -e "$lt_replace_pathsep_nix_to_dos"` fi # Now, add the leading and trailing path separators back case "$1" in :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result" ;; esac case "$1" in *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;" ;; esac ;; esac fi } # end: func_to_host_pathlist # 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 # define setmode _setmode #else # include # include # ifdef __CYGWIN__ # include # define HAVE_SETENV # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif # endif #endif #include #include #include #include #include #include #include #include #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 #ifdef _MSC_VER # define S_IXUSR _S_IEXEC # define stat _stat # ifndef _INTPTR_T_DEFINED # define intptr_t int # endif #endif #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 */ #ifdef __CYGWIN__ # define FOPEN_WB "wb" #endif #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 ((void *) stale); stale = 0; } \ } while (0) #undef LTWRAPPER_DEBUGPRINTF #if defined DEBUGWRAPPER # define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args static void ltwrapper_debugprintf (const char *fmt, ...) { va_list args; va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } #else # define LTWRAPPER_DEBUGPRINTF(args) #endif const char *program_name = NULL; 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_fatal (const char *message, ...); 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_opt_process_env_set (const char *arg); void lt_opt_process_env_prepend (const char *arg); void lt_opt_process_env_append (const char *arg); int lt_split_name_value (const char *arg, char** name, char** value); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); static const char *script_text_part1 = EOF func_emit_wrapper_part1 yes | $SED -e 's/\([\\"]\)/\\\1/g' \ -e 's/^/ "/' -e 's/$/\\n"/' echo ";" cat <"))); for (i = 0; i < newargc; i++) { LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d] : %s\n", i, (newargz[i] ? newargz[i] : ""))); } EOF case $host_os in mingw*) cat <<"EOF" /* execv doesn't actually work on mingw as expected on unix */ rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz); if (rval == -1) { /* failed to start process */ LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno)); return 127; } return rval; EOF ;; *) cat <<"EOF" execv (lt_argv_zero, newargz); return rval; /* =127, but avoids unused variable warning */ EOF ;; esac cat <<"EOF" } void * xmalloc (size_t num) { void *p = (void *) malloc (num); if (!p) lt_fatal ("Memory exhausted"); return p; } char * xstrdup (const char *string) { return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL; } const char * base_name (const char *name) { const char *base; #if defined (HAVE_DOS_BASED_FILE_SYSTEM) /* Skip over the disk name in MSDOS pathnames. */ if (isalpha ((unsigned char) name[0]) && name[1] == ':') name += 2; #endif for (base = name; *name; name++) if (IS_DIR_SEPARATOR (*name)) base = name + 1; return base; } int check_executable (const char *path) { struct stat st; LTWRAPPER_DEBUGPRINTF (("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); if ((!path) || (!*path)) return 0; if ((stat (path, &st) >= 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; LTWRAPPER_DEBUGPRINTF (("(make_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!")); 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]; int tmp_len; char *concat_name; LTWRAPPER_DEBUGPRINTF (("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!")); 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 = 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 ("getcwd failed"); 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 ("getcwd failed"); 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) { LTWRAPPER_DEBUGPRINTF (("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 { char *errstr = strerror (errno); lt_fatal ("Error accessing file %s (%s)", tmp_pathspec, errstr); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal ("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 (strcmp (str, pat) == 0) *str = '\0'; } return str; } static void lt_error_core (int exit_status, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s: %s: ", program_name, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, "FATAL", message, ap); va_end (ap); } void lt_setenv (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n", (name ? name : ""), (value ? value : ""))); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int 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) { int orig_value_len = strlen (orig_value); int 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; } int lt_split_name_value (const char *arg, char** name, char** value) { const char *p; int len; if (!arg || !*arg) return 1; p = strchr (arg, (int)'='); if (!p) return 1; *value = xstrdup (++p); len = strlen (arg) - strlen (*value); *name = XMALLOC (char, len); strncpy (*name, arg, len-1); (*name)[len - 1] = '\0'; return 0; } void lt_opt_process_env_set (const char *arg) { char *name = NULL; char *value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg); } lt_setenv (name, value); XFREE (name); XFREE (value); } void lt_opt_process_env_prepend (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg); } new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_opt_process_env_append (const char *arg) { char *name = NULL; char *value = NULL; char *new_value = NULL; if (lt_split_name_value (arg, &name, &value) != 0) { XFREE (name); XFREE (value); lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg); } new_value = lt_extend_str (getenv (name), value, 1); lt_setenv (name, new_value); XFREE (new_value); XFREE (name); XFREE (value); } void lt_update_exe_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? 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 #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n", (name ? name : ""), (value ? 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 } # end: func_emit_cwrapperexe_src # func_mode_link arg... func_mode_link () { $opt_debug 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 # which 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 which 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 dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no 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 "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && 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 dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then dlfiles="$dlfiles $arg" else dlprefiles="$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 "*) ;; *) deplibs="$deplibs $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # moreargs="$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 "$pic_object" = none && test "$non_pic_object" = none; 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 "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$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 "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; 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 "$pic_object" = none ; 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 ;; 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 "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) weak_libs="$weak_libs $arg" prev= continue ;; xcclinker) linker_flags="$linker_flags $qarg" compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) compiler_flags="$compiler_flags $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) linker_flags="$linker_flags $qarg" compiler_flags="$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 ;; -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$arg" = "X-export-symbols"; 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" dir=$func_stripname_result if test -z "$dir"; 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 # 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 "*) ;; *) deplibs="$deplibs -L$dir" lib_search_path="$lib_search_path $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*) # 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$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework deplibs="$deplibs System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi deplibs="$deplibs $arg" 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) compiler_flags="$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) compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) new_inherited_linker_flags="$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 ;; -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_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) xrpath="$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" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$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" arg="$arg $wl$func_quote_for_eval_result" compiler_flags="$compiler_flags $wl$func_quote_for_eval_result" linker_flags="$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" ;; # -64, -mips[0-9] enable 64-bit mode on the SGI compiler # -r[0-9][0-9]* specifies the processor on the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler # +DA*, +DD* enable 64-bit mode on the HP compiler # -q* pass through compiler args for the IBM compiler # -m*, -t[45]*, -txscale* pass through architecture-specific # compiler args for GCC # -F/path gives path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC # @file GCC response files -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" compiler_flags="$compiler_flags $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. objs="$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 "$pic_object" = none && test "$non_pic_object" = none; 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 "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then dlfiles="$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 "$prev" = dlprefiles; then # Preload the old-style object. dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; 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 "$pic_object" = none ; 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. deplibs="$deplibs $arg" old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. if test "$prev" = dlfiles; then # This library was specified with -dlopen. dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. dlprefiles="$dlprefiles $arg" prev= else deplibs="$deplibs $arg" 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 "$export_dynamic" = yes && 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 \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" # 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_duplicate_deps ; then case "$libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi libs="$libs $deplib" done if test "$linkmode" = lib; 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 "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac pre_post_deps="$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=no 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 "$linkmode,$pass" = "lib,link"; 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 "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; 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 "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= case $lib in *.la) func_source "$lib" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do deplib_base=`$ECHO "X$deplib" | $Xsed -e "$basename"` case " $weak_libs " in *" $deplib_base "*) ;; *) deplibs="$deplibs $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else compiler_flags="$compiler_flags $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; 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=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) new_inherited_linker_flags="$new_inherited_linker_flags $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" dir=$func_stripname_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; 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=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"X$deplib\"" 2>/dev/null | $Xsed -e 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then $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." else $ECHO $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else newdlfiles="$newdlfiles $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # 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 "X$inherited_linker_flags" | $Xsed -e '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 "*) ;; *) new_inherited_linker_flags="$new_inherited_linker_flags $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO "X $dependency_libs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && dlfiles="$dlfiles $dlopen" test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; 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. convenience="$convenience $ladir/$objdir/$old_library" old_convenience="$old_convenience $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; 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= for l in $old_library $library_names; do linklib="$l" done 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 "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; 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. dlprefiles="$dlprefiles $lib $dependency_libs" else newdlfiles="$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 "X$installed" = Xyes; then if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$libdir" absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && 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 notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later notinst_path="$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 "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then newdlprefiles="$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" && \ dlpreconveniencelibs="$dlpreconveniencelibs $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then newdlprefiles="$newdlprefiles $dir/$dlname" else newdlprefiles="$newdlprefiles $dir/$linklib" fi fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" newlib_search_path="$newlib_search_path $func_stripname_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; 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_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || 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:"*) ;; *) temp_rpath="$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 "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && 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 "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded notinst_deplibs="$notinst_deplibs $lib" need_relink=no ;; *) if test "$installed" = no; then notinst_deplibs="$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 "$shouldnotlink" = yes && test "$pass" = link; then $ECHO if test "$linkmode" = prog; 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 "$linkmode" = lib && test "$hardcode_into_libs" = yes; 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 "*) ;; *) compile_rpath="$compile_rpath $absdir" esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$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*) 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 "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; 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 can not # 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 "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; 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 [\\/]*) add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; 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 can not 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 "$module" = yes; 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 "$build_old_libs" = no; 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 "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; 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 "*) ;; *) xrpath="$xrpath $temp_xrpath";; esac;; *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" if $opt_duplicate_deps ; then case "$tmp_libs " in *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) 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 compiler_flags="$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" linker_flags="$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 "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # 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 "*) ;; *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_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 "*) ;; *) tmp_libs="$tmp_libs $deplib" ;; esac ;; *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # 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 tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; 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" objs="$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 "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; 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 "$deplibs_check_method" != pass_all; 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!" libobjs="$libobjs $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; 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 # which has an extra 1 added just for fun # case $version_type in darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|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" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; 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 "$loop" -ne 0; 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) 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 "$loop" -ne 0; 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. verstring="$verstring:${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. 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 "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" libobjs="$libobjs $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$mode" != relink; 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 "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi removelist="$removelist $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "X$lib_search_path " | $Xsed -e "s% $path % %g"` # deplibs=`$ECHO "X$deplibs " | $Xsed -e "s% -L$path % %g"` # dependency_libs=`$ECHO "X$dependency_libs " | $Xsed -e "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 temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; *) dlfiles="$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 "*) ;; *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework deplibs="$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 "$build_libtool_need_lc" = "yes"; then deplibs="$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` 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then newdeplibs="$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. newdeplibs="$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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) newdeplibs="$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 \"X$potent_lib\"" 2>/dev/null | $Xsed -e 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then newdeplibs="$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. newdeplibs="$newdeplibs $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO "X $deplibs" | $Xsed \ -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO "X $tmp_deplibs" | $Xsed -e "s,$i,,"` done fi if $ECHO "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' | $GREP . >/dev/null; then $ECHO if test "X$deplibs_check_method" = "Xnone"; 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 fi ;; 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 "X $newdeplibs" | $Xsed -e 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; 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 "$build_old_libs" = no; 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 "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 "X $newdeplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO "X $new_inherited_linker_flags" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO "X $deplibs" | $Xsed -e '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 "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$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 "$build_libtool_libs" = yes; then if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $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"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$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" if test -n "$hardcode_libdir_flag_spec_ld"; then eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" else eval dep_rpath=\"$hardcode_libdir_flag_spec\" fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do rpath="$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 "$mode" != relink && 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 linknames="$linknames $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "X$libobjs" | $SP2NL | $Xsed -e "$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" delfiles="$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 if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # 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 fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || 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 cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" func_len " $cmd" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then func_show_eval "$cmd" 'exit $?' 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 "X$skipped_export" != "X:"; 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 "X$include_expsyms" | $Xsed | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && 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 delfiles="$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 "*) ;; *) tmp_deplibs="$tmp_deplibs $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && 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" generated="$generated $gentop" func_extract_archives $gentop $convenience libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking if test "$mode" = relink; 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 "$module" = yes && 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 "X$skipped_export" != "X:" && 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 output_la=`$ECHO "X$output" | $Xsed -e "$basename"` # 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 "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" $ECHO 'INPUT (' > $output for obj in $save_libobjs do $ECHO "$obj" >> $output done $ECHO ')' >> $output delfiles="$delfiles $output" elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do $ECHO "$obj" >> $output done delfiles="$delfiles $output" output=$firstobj\"$file_list_spec$output\" 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 "X$objlist" = X || 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 "$k" -eq 1 ; then # The first file doesn't have a previous command to add. eval concat_cmds=\"$reload_cmds $objlist $last_robj\" else # All subsequent reloadable object files will link in # the last one created. eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj~\$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~ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi delfiles="$delfiles $output" else output= fi if ${skipped_export-false}; then 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 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_silent || { 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 "$mode" = relink; 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 if ${skipped_export-false}; then 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 "X$include_expsyms" | $Xsed | $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 delfiles="$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 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 "$module" = yes && 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" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles libobjs="$libobjs $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { 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 "$mode" = relink; 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 "$mode" = relink; 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 "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; 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= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test 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 if test "$build_libtool_libs" != yes; then 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 fi if test -n "$pic_flag" || test "$pic_mode" != default; 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" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ 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 "X $compile_deplibs" | $Xsed -e 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) compile_command="$compile_command ${wl}-bind_at_load" finalize_command="$finalize_command ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO "X $compile_deplibs" | $Xsed -e 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO "X $finalize_deplibs" | $Xsed -e '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 "*) new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$new_libs $deplib" ;; esac ;; *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" compile_command="$compile_command $compile_deplibs" finalize_command="$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 "*) ;; *) finalize_rpath="$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"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) perm_rpath="$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;; *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) dllsearchpath="$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"*) ;; *) hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) finalize_perm_rpath="$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 "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` finalize_command=`$ECHO "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *cegcc) # Disable wrappers for cegcc, we are cross compiling anyway. wrappers_required=no ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "X$compile_command" | $Xsed -e '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=$?' # 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 fi 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 rpath="$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 rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e '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 $?' exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # 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" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "X$link_command" | $Xsed -e '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 $?' # 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` fi # Quote $ECHO for shipping. if test "X$ECHO" = "X$SHELL $progpath --fallback-echo"; then case $progpath in [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; esac qecho=`$ECHO "X$qecho" | $Xsed -e "$sed_quote_subst"` else qecho=`$ECHO "X$ECHO" | $Xsed -e "$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 if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then oldobjs="$oldobjs $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" generated="$generated $gentop" func_extract_archives $gentop $addlibs oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; 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" generated="$generated $gentop" func_extract_archives $gentop $dlprefiles oldobjs="$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" generated="$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" oldobjs="$oldobjs $gentop/$newobj" ;; *) oldobjs="$oldobjs $obj" ;; esac done fi 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 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 "X$oldobjs" = "X" ; 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 "$build_old_libs" = yes && 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; 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" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" newdependency_libs="$newdependency_libs $libdir/$name" ;; *) newdependency_libs="$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" newdlfiles="$newdlfiles $libdir/$name" ;; *) newdlfiles="$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" newdlprefiles="$newdlprefiles $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 newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $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 can not 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 "$installed" = no && test "$need_relink" = yes; 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 } { test "$mode" = link || test "$mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= 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) RM="$RM $arg"; rmforce=yes ;; -*) RM="$RM $arg" ;; *) files="$files $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= origobjdir="$objdir" for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then objdir="$origobjdir" else objdir="$dir/$origobjdir" fi func_basename "$file" name="$func_basename_result" test "$mode" = uninstall && objdir="$dir" # Remember objdir for removal later, being careful to avoid duplicates if test "$mode" = clean; then case " $rmdirs " in *" $objdir "*) ;; *) rmdirs="$rmdirs $objdir" ;; 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 test "$rmforce" = yes; 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 rmfiles="$rmfiles $objdir/$n" done test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" case "$mode" in clean) case " $library_names " in # " " in the beginning catches empty $dlname *" $dlname "*) ;; *) rmfiles="$rmfiles $objdir/$dlname" ;; esac test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || 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 "$pic_object" != none; then rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) if test "$mode" = clean ; 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 rmfiles="$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 rmfiles="$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 rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done objdir="$origobjdir" # 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 } { test "$mode" = uninstall || test "$mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$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 # in which 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: # vi:sw=2 buzztard-0.6.0/Makefile.in0000644042355400116100000007770311675570635012413 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \ INSTALL NEWS TODO config.guess config.rpath config.sub depcomp \ install-sh ltmain.sh missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive 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__installdirs = "$(DESTDIR)$(schemasdir)" DATA = $(schemas_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(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 distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SRCDIRS = src tests SUBDIRS = $(SRCDIRS) pixmaps po docs ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-debug --disable-scrollkeeper schemasdir = $(GCONF_SCHEMA_FILE_DIR) schemas_in_files = buzztard.schemas.in schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) EXTRA_DIST = \ $(schemas_DATA) \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ COPYING-DOCS \ omf.make \ xmldocs.make \ TODO \ po/$(GETTEXT_PACKAGE).pot DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-update distuninstallcheck_listfiles = find . -type f -print | grep -v \ '/var/scrollkeeper' | grep -v '/share/mime' | grep -v \ 'icon-theme.cache' all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ 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): config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-schemasDATA: $(schemas_DATA) @$(NORMAL_INSTALL) test -z "$(schemasdir)" || $(MKDIR_P) "$(DESTDIR)$(schemasdir)" @list='$(schemas_DATA)'; test -n "$(schemasdir)" || list=; \ 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)$(schemasdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(schemasdir)" || exit $$?; \ done uninstall-schemasDATA: @$(NORMAL_UNINSTALL) @list='$(schemas_DATA)'; test -n "$(schemasdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(schemasdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(schemasdir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @case `sed 15q $(srcdir)/NEWS` in \ *"$(VERSION)"*) : ;; \ *) \ echo "NEWS not updated; not releasing" 1>&2; \ exit 1;; \ esac $(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 \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__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*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(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 \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(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__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: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { 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: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(schemasdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." @GCONF_SCHEMAS_INSTALL_FALSE@uninstall-local: @GCONF_SCHEMAS_INSTALL_FALSE@install-data-local: clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am 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-data-local install-schemasDATA 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-local uninstall-schemasDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool clean-local ctags ctags-recursive dist dist-all \ dist-bzip2 dist-gzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean 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-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-schemasDATA install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-recursive uninstall uninstall-am uninstall-local \ uninstall-schemasDATA @INTLTOOL_SCHEMAS_RULE@ clean-local: rm -f po/.intltool-merge-cache @GCONF_SCHEMAS_INSTALL_TRUE@install-data-local: @GCONF_SCHEMAS_INSTALL_TRUE@ @if test -z "$(DESTDIR)" ; then \ @GCONF_SCHEMAS_INSTALL_TRUE@ for p in $(schemas_DATA) ; do \ @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ @GCONF_SCHEMAS_INSTALL_TRUE@ $(GCONFTOOL) --makefile-install-rule $(top_srcdir)/$$p ; \ @GCONF_SCHEMAS_INSTALL_TRUE@ done \ @GCONF_SCHEMAS_INSTALL_TRUE@ fi @GCONF_SCHEMAS_INSTALL_TRUE@uninstall-local: @GCONF_SCHEMAS_INSTALL_TRUE@ @if test -z "$(DESTDIR)" ; then \ @GCONF_SCHEMAS_INSTALL_TRUE@ for p in $(schemas_DATA) ; do \ @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ @GCONF_SCHEMAS_INSTALL_TRUE@ $(GCONFTOOL) --makefile-uninstall-rule $(top_srcdir)/$$p ; \ @GCONF_SCHEMAS_INSTALL_TRUE@ done \ @GCONF_SCHEMAS_INSTALL_TRUE@ fi .PHONY: help coverage valgrind dict todo stats splint @USE_LCOV_TRUE@coverage:: @USE_LCOV_TRUE@ mkdir -p ./coverage @USE_LCOV_TRUE@ lcov --compat-libtool --directory . --zerocounters @USE_LCOV_TRUE@ -$(MAKE) check @USE_LCOV_TRUE@ lcov --compat-libtool --directory ./src --capture --output-file ./coverage/$(PACKAGE)_tmp.info @USE_LCOV_TRUE@ lcov --compat-libtool --extract ./coverage/$(PACKAGE)_tmp.info "$(PWD)/src*" -o ./coverage/$(PACKAGE).info @USE_LCOV_TRUE@ $(RM) ./coverage/$(PACKAGE)_tmp.info @USE_LCOV_TRUE@ genhtml -o ./coverage --num-spaces 2 ./coverage/$(PACKAGE).info @USE_BCOV_TRUE@coverage:: @USE_BCOV_TRUE@ mkdir -p ./coverage @USE_BCOV_TRUE@ $(MAKE) -C tests coverage @USE_BCOV_TRUE@ bcov-report -i $(abs_top_builddir)/src tests/.bcovdump.all ./coverage @USE_VALGRIND_TRUE@valgrind:: @USE_VALGRIND_TRUE@ $(MAKE) -C tests valgrind dict:: tags echo "personal_ws" >$(PACKAGE).aspell_dict @find . -name tags -exec grep -v "$\!" {} \; | cut -f1 | sort | uniq >>$(PACKAGE).aspell_dict todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done # -k2 in sort for Tranditional McCabe Cyclomatic Complexity cc10: @pmccabe `find src -name '*.c'` | sort -nr | awk '($$1 > 10)' cc20: @pmccabe `find src -name '*.c'` | sort -nr | awk '($$1 > 20)' help:: @echo "make coverage -- run all checks and generate html coverage report" @echo " only availble when built using --enable-coverage" @echo "make valgrind -- run all checks under valgrind" @echo @echo "make dict -- create an aspell dictionary from tags" @echo @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/intltool-extract.in0000644042355400116100000000000011675570451014156 00000000000000buzztard-0.6.0/configure.ac0000644042355400116100000005321411673622514012613 00000000000000dnl $Id: configure.ac 3776 2011-12-19 11:51:38Z ensonic $ dnl dnl current : the interface : MAJOR + MINOR dnl revision : of the same interface : MICRO dnl age : MINOR dnl dnl 1: when releasing a changed version : MICRO++ dnl 2: when the interface has changed (adding functions) : MINOR++, MICRO=0 dnl 3: when the interface has changed (removing functions) : MAJOR++, MINOR=0, MICRO=0 dnl dnl Initialise the autoconf/automake tool AC_PREREQ(2.61) AC_INIT([buzztard],[0.6.0],[buzztard-devel@lists.sourceforge.net]) # we can't do -Werror, because # - we use gnu make extensions # - we override uninstallcheck var AM_INIT_AUTOMAKE([-Wall check-news std-options]) AC_CONFIG_SRCDIR([ChangeLog]) AC_CONFIG_HEADERS(config.h) AC_CONFIG_MACRO_DIR(m4) # Support silent build rules, requires at least automake-1.11. Disable # by either passing --disable-silent-rules to configure or passing V=1 # to make m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) BT_MAJOR_VERSION=0 BT_MINOR_VERSION=6 BT_MICRO_VERSION=0 BT_VERSION=$BT_MAJOR_VERSION.$BT_MINOR_VERSION.$BT_MICRO_VERSION BT_VERSION_INFO=`expr $BT_MAJOR_VERSION + $BT_MINOR_VERSION`:$BT_MICRO_VERSION:$BT_MINOR_VERSION BT_VERSION_NUMBER=`expr $BT_MAJOR_VERSION \* 10000 + $BT_MINOR_VERSION \* 100 + $BT_MICRO_VERSION` dnl our libraries and install dirs use major.minor as a version BT_MAJORMINOR=$BT_MAJOR_VERSION.$BT_MINOR_VERSION dnl we override it here for release candidates - not needed as be bump after releases dnl BT_MAJORMINOR=0.6 dnl release year and date BT_RELEASE_YEAR=`date +%Y` BT_RELEASE_DATE=`date +%Y-%m-%d` AC_SUBST(BT_MAJOR_VERSION) AC_SUBST(BT_MINOR_VERSION) AC_SUBST(BT_MICRO_VERSION) AC_SUBST(BT_VERSION) AC_SUBST(BT_VERSION_INFO) AC_SUBST(BT_VERSION_NUMBER) AC_SUBST(BT_MAJORMINOR) AC_SUBST(BT_RELEASE_YEAR) AC_SUBST(BT_RELEASE_DATE) AC_DEFINE_UNQUOTED(PACKAGE_VERSION_NUMBER, ${BT_VERSION_NUMBER}, [version as a number]) VERSION=${BT_VERSION} dnl m4 - everyone who develops should have aclocal installed AC_PATH_PROG(PROG_ACLOCAL, aclocal, no) AC_MSG_CHECKING(where to install .m4 files to) if test "$PROG_ACLOCAL" = "no" ; then acdir=${datadir}/aclocal else acdir=`$PROG_ACLOCAL --print-ac-dir` if test ! -w "$acdir" ; then acdir=${datadir}/aclocal fi fi AC_MSG_RESULT($acdir) AC_SUBST(acdir) dnl Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_SED AC_ISC_POSIX AC_PROG_LIBTOOL AC_PROG_CC AM_PROG_MKDIR_P IT_PROG_INTLTOOL PKG_PROG_PKG_CONFIG AC_PATH_PROG(xvfb_path, [Xvfb], [no]) if test "x$xvfb_path" != "xno" ; then have_xvfb="yes" AC_DEFINE_UNQUOTED(XVFB_PATH, "$xvfb_path", [Path of Xvfb executable to be used to run gui unit tests under]) XFONT_PATH=`xset q | grep fonts | sed 's/^\ *//'` if test "x$XFONT_PATH" != "x"; then AC_DEFINE_UNQUOTED(XFONT_PATH, "$XFONT_PATH", [X font path]) fi else have_xvfb="no" fi AC_SUBST(XFONT_PATH) dnl Initialise gettext AM_GNU_GETTEXT_VERSION(0.12.1) AM_GNU_GETTEXT([external]) localedir='${datadir}/locale' AC_SUBST(localedir) GETTEXT_PACKAGE="buzztard-$BT_MAJORMINOR" AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Package Name for Gettext]) DATADIRNAME="share" AC_SUBST(DATADIRNAME) dnl this macro comes from gnome.m4, which we do not want to require dnl AM_ACLOCAL_INCLUDE(./m4) dnl enable runtime debugging code AC_MSG_CHECKING(whether to enable runtime debugging code) AC_ARG_ENABLE([debug], AS_HELP_STRING([--enable-debug],[enable runtime debugging code (default=no)]), , [enable_debug=no]) AC_MSG_RESULT($enable_debug) if test "x$enable_debug" = "xyes"; then AC_DEFINE(USE_DEBUG, [1], [enable runtime debugging code]) DEBUG_CFLAGS="-O0 -Wall -Werror -g" DEBUG_LDFLAGS="-Wl,--warn-common" AM_CONDITIONAL(USE_DEBUG, true) else AC_DEFINE(G_DISABLE_ASSERT, [1], [if no runtime debugging, do not enable g_asserts]) AC_DEFINE(G_DISABLE_CHECKS, [1], [if no runtime debugging, do not enable g_return_if_fail variants]) AC_DEFINE(G_DISABLE_CAST_CHECKS, [1], [if no runtime debugging, do not enable dynamic type checks]) DEBUG_CFLAGS="" DEBUG_LDFLAGS="" AM_CONDITIONAL(USE_DEBUG, false) fi dnl compile with disable-deprecated switches AC_MSG_CHECKING([whether to disable deprecated glib/gtk+/gst/etc. features]) AC_ARG_ENABLE([deprecated], AS_HELP_STRING([--disable-deprecated],[disable deprecated glib/gtk+/gst/etc. features]), , [ if test -f $ac_top_srcdir/autogen.sh; then is_vcs_version=true enable_deprecated=no else enable_deprecated=yes fi ] ) AC_MSG_RESULT($enable_deprecated) if test "x$enable_deprecated" = "xyes"; then # ATK_DISABLE_DEPRECATED BT_DISABLE_DEPRECATED="-DG_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGST_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED" else BT_DISABLE_DEPRECATED="" fi AC_SUBST(BT_DISABLE_DEPRECATED) dnl enable coverage analysis AC_MSG_CHECKING(whether to enable coverage analysis) AC_ARG_ENABLE([coverage], AS_HELP_STRING([--enable-coverage],[enable coverage analysis (default=no)]), , [enable_coverage=no]) AC_MSG_RESULT($enable_coverage) COVERAGE_CFLAGS="" COVERAGE_LIBS="" if test "x$enable_coverage" = "xyes"; then bcov_path="no" lcov_path="no" dnl bcov isn't ready yet AC_PATH_PROG(bcov_path, [bcov], [no]) if test "x$bcov_path" != "xno" ; then coverage_tool="bcov" else AC_PATH_PROG(lcov_path, [lcov], [no]) if test "x$lcov_path" != "xno" ; then LCOV_VERSION=`lcov --version|head -n 1| $SED 's/^.* version //'` LCOV_MAJOR=`echo $LCOV_VERSION | cut -d. -f1 | $SED s/[a-zA-Z\-].*//g` LCOV_MINOR=`echo $LCOV_VERSION | cut -d. -f2 | $SED s/[a-zA-Z\-].*//g` if [[ "$LCOV_MAJOR" -lt "1" ]]; then AC_MSG_WARN([lcov >= 1.6 is required, you have $LCOV_VERSION]) lcov_path="no" elif [[ "$LCOV_MAJOR" -eq "1" ]] && \ [[ "$LCOV_MINOR" -lt "6" ]]; then AC_MSG_WARN([lcov >= 1.6 is required, you have $LCOV_VERSION]) lcov_path="no" fi if test "x$lcov_path" != "xno" ; then coverage_tool="gcov + lcov" COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" COVERAGE_LIBS="-lgcov" fi fi fi fi AM_CONDITIONAL(USE_BCOV, test "x$bcov_path" != "xno") AM_CONDITIONAL(USE_LCOV, test "x$lcov_path" != "xno") dnl valgrind integration for tests AC_MSG_CHECKING(where Valgrind is installed on your system) AC_ARG_WITH([valgrind], AS_HELP_STRING([--with-valgrind],[where Valgrind is installed on your system (default is no)]), [ac_cv_use_valgrind=$withval], [ac_cv_use_valgrind=no]) AC_MSG_RESULT($ac_cv_use_valgrind) if test "x$ac_cv_use_valgrind" == "xyes"; then AC_PATH_PROG(valgrind_path, [valgrind], [no]) if test "x$valgrind_path" != "xno"; then valgrind_path=`dirname $valgrind_path` VALGRIND=`dirname $valgrind_path` else VALGRIND="no" fi else VALGRIND=$ac_cv_use_valgrind fi AC_SUBST(VALGRIND) AM_CONDITIONAL(USE_VALGRIND, test "x$VALGRIND" != "xno") VALGRIND_CPPFLAGS= if test "x$ac_cv_use_valgrind" != "xno"; then AC_DEFINE(HAVE_VALGRIND, 1, [Define to 1 if valgrind is to be used.]) if test -f $ac_cv_use_valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind elif test -f $ac_cv_use_valgrind/include/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/include elif test -f $ac_cv_use_valgrind/valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/valgrind elif test -f $ac_cv_use_valgrind/include/valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/include/valgrind elif test -f $ac_cv_use_valgrind/valgrind/include/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/valgrind/include fi fi AC_SUBST(VALGRIND_CFLAGS) dnl define custom path for desktop files AC_MSG_CHECKING(where to install desktop files) AC_ARG_WITH( desktop_dir, AS_HELP_STRING([--with-desktop-dir],[install desktop files to DIR/applications (default=$prefix/share/)]), , [with_desktop_dir="$prefix/share/"]) AC_MSG_RESULT($with_desktop_dir) AC_SUBST(with_desktop_dir) dnl Checks for libraries. dnl mandarory deps PKG_CHECK_MODULES(BASE_DEPS, \ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ ) # gstreamer-app-0.10 >= 0.10.22 PKG_CHECK_MODULES(GUI_DEPS, \ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ ) # still the pixbuf loader should have svg support # librsvg-2.0 # gnome-vfs is only needed, if we have gtk+ < 2.14.0 PKG_CHECK_MODULES(GTK_DEPS, gtk+-2.0 >= 2.14.0, [ ],[ PKG_CHECK_MODULES(GNOMEVFS_DEPS, \ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GNOMEVFS_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GNOMEVFS_DEPS_LIBS" AC_DEFINE(USE_GNOMEVFS, [1], [Define to 1 if we need to use gnomevfs libraries]) ] ) PKG_CHECK_MODULES(GCONF_DEPS, gconf-2.0 >= 2.2.0, [ AM_CONDITIONAL(USE_GCONF, true) AC_DEFINE(USE_GCONF, [1], [Define to 1 if we can use GConf]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GCONF_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GCONF_DEPS_LIBS" AC_PATH_PROG(GCONFTOOL, gconftool-2, [#]) m4_ifdef([AM_GCONF_SOURCE_2], [AM_GCONF_SOURCE_2]) GCONF_DOC_TYPES= ],[ AM_CONDITIONAL(USE_GCONF, false) AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, false) GCONF_DOC_TYPES="%" ] ) AC_SUBST(GCONF_DOC_TYPES) PKG_CHECK_MODULES(GSTBT_DEPS, libgstbuzztard >= 0.6.0, [ AC_DEFINE(USE_GSTBT, [1], [Define to 1 if we can use gst-buzztard]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GSTBT_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GSTBT_DEPS_LIBS" ] ) dnl optional deps PKG_CHECK_MODULES(BML_DEPS, libbml >= 0.6.0, [ AC_DEFINE(USE_BML, [1], [Define to 1 if we can use bml]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $BML_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $BML_DEPS_LIBS" use_bml=yes ],[ use_bml=no ] ) PKG_CHECK_MODULES(HILDON_DEPS, hildon-1 libosso, [ AC_DEFINE(USE_HILDON, [1], [Define to 1 if we can use hildon libraries]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $HILDON_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $HILDON_DEPS_LIBS" use_hildon=yes ],[ use_hildon=no ] ) PKG_CHECK_MODULES(GUDEV_DEPS, gudev-1.0, [ AC_DEFINE(USE_GUDEV, [1], [Define to 1 if we can use gudev libraries]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GUDEV_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GUDEV_DEPS_LIBS" AM_CONDITIONAL(USE_GUDEV, true) use_gudev=yes GUDEV_DOC_TYPES= GUDEV_DOC_SECTIONS= ],[ AM_CONDITIONAL(USE_GUDEV, false) use_gudev=no GUDEV_DOC_TYPES=% GUDEV_DOC_SECTIONS=# ] ) AC_SUBST(GUDEV_DOC_TYPES) AC_SUBST(GUDEV_DOC_SECTIONS) PKG_CHECK_MODULES(HAL_DEPS, dbus-glib-1 hal, [ AC_DEFINE(USE_HAL, [1], [Define to 1 if we can use hal libraries]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $HAL_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $HAL_DEPS_LIBS" if test x$use_gudev = xno; then AM_CONDITIONAL(USE_HAL, true) use_hal=yes HAL_DOC_TYPES= HAL_DOC_SECTIONS= else AM_CONDITIONAL(USE_HAL, false) use_hal=no HAL_DOC_TYPES=% HAL_DOC_SECTIONS=# fi ],[ AM_CONDITIONAL(USE_HAL, false) use_hal=no HAL_DOC_TYPES=% HAL_DOC_SECTIONS=# ] ) AC_SUBST(HAL_DOC_TYPES) AC_SUBST(HAL_DOC_SECTIONS) PKG_CHECK_MODULES(GSF_DEPS, libgsf-1, [ AM_CONDITIONAL(USE_GSF, true) AC_DEFINE(USE_GSF, [1], [Define to 1 if we can use gsf libraries]) BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GSF_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GSF_DEPS_LIBS" use_gsf=yes ],[ AM_CONDITIONAL(USE_GSF, false) use_gsf=no ] ) # GObject Introspection AC_ARG_ENABLE([introspection], AS_HELP_STRING([--enable-introspection], [enable introspection for this build (default=auto)]), , [enable_introspection=auto]) case "x${enable_introspection}" in xyes|xauto) PKG_CHECK_MODULES(GOBJECT_INTROSPECTION, [gobject-introspection-1.0],[ AM_CONDITIONAL(USE_GIR, true) G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` AC_SUBST(G_IR_SCANNER) G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` AC_SUBST(G_IR_COMPILER) G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` AC_SUBST(G_IR_GENERATE) GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` AC_SUBST(GIRDIR) TYPELIBDIR=`$PKG_CONFIG --variable=typelibdir gobject-introspection-1.0` AC_SUBST(TYPELIBDIR) enable_gir="yes" ],[ AM_CONDITIONAL(USE_GIR, false) enable_gir="no" ] ) ;; *) AM_CONDITIONAL(USE_GIR, false) enable_gir="no" ;; esac GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" GTK_PREFIX="`$PKG_CONFIG --variable=prefix gtk+-2.0`" GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-0.10`" GCANVAS_PREFIX="`pkg-config --variable=prefix libgnomecanvas-2.0`" AC_SUBST(GLIB_PREFIX) AC_SUBST(GTK_PREFIX) AC_SUBST(GST_PREFIX) AC_SUBST(GCANVAS_PREFIX) dnl check for pending gtk+ addditions dnl ac_libs_save="$LIBS" dnl AC_CHECK_LIB( gtk-x11-2.0, gtk_tree_view_column_set_wrap_header_widget, \ dnl AC_DEFINE(HAVE_GTK_TREE_VIEW_COLUMN_PATCH, [1], [Define to 1 if we have the pending gtk+ patch applied]) \ dnl ) dnl LIBS="$ac_libs_save" dnl check for gstreamer devel additions #ac_cflags_save="$CFLAGS" #ac_cppflags_save="$CPPFLAGS" #ac_libs_save="$LIBS" #CFLAGS="$CFLAGS $BASE_DEPS_CFLAGS" #CPPFLAGS="$CPPFLAGS $BASE_DEPS_CFLAGS" #LIBS="$LIBS $BASE_DEPS_LIBS" #AC_CHECK_HEADERS(gst/gstpreset.h) #AC_CHECK_FUNCS(gst_element_factory_can_sink_any_caps) #LIBS="$ac_libs_save" #CFLAGS="$ac_cflags_save" #CPPFLAGS="$ac_cppflags_save" #LIBS="$ac_libs_save" dnl Add additional libraries BASE_DEPS_LIBS="$LIBINTL $BASE_DEPS_LIBS" dnl test for availability of check unittest package (with a relative new function) dnl @todo: if we configure without --enable-debug most tests wont work PKG_CHECK_MODULES(CHECK, check >= 0.9.2, [ have_check=yes AM_CONDITIONAL(BUILD_CHECK_TESTS, true) ],[ have_check=no AM_CONDITIONAL(BUILD_CHECK_TESTS, false) ] ) dnl GStreamer plugin build dnl that is needed to figure the directory name, where the plugin goes to GST_MAJORMINOR=0.10 AC_DEFINE_UNQUOTED(GST_MAJORMINOR, "$GST_MAJORMINOR", [gstreamer series]) AC_SUBST(GST_MAJORMINOR) plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" AC_SUBST(plugindir) GST_PLUGIN_CFLAGS="$DEBUG_CFLAGS $COVERAGE_CFLAGS" AC_SUBST(GST_PLUGIN_CFLAGS) GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '[_]*(gst_|bt_|Bt|BT_).*' $COVERAGE_LIBS" AC_SUBST(GST_PLUGIN_LDFLAGS) dnl Check for gtk-doc. m4_ifdef([GTK_DOC_CHECK], [ GTK_DOC_CHECK([1.10],[--flavour no-tmpl]) ],[ AM_CONDITIONAL([ENABLE_GTK_DOC], false) ]) AC_ARG_ENABLE(man, [AC_HELP_STRING([--enable-man], [regenerate man pages from Docbook [default=no]])],enable_man=yes, enable_man=no) AC_PATH_PROG([XSLTPROC], [xsltproc]) AM_CONDITIONAL(ENABLE_MAN, test x$enable_man != xno) dnl Check for scrollkeeper AC_PATH_PROG(scrollkeeper_config, scrollkeeper-config, no) if test x$scrollkeeper_config = xno; then have_scrollkeeper=no AC_MSG_WARN([Couldn't find scrollkeeper-config, please install the scrollkeeper package]) dnl if test x$xsltproc = xno; then dnl AC_MSG_WARN([Couldn't find xsltproc, please install the libxml/libxslt package]) dnl fi else have_scrollkeeper=yes fi AM_CONDITIONAL(ENABLE_SCROLLKEEPER, test ! x$scrollkeeper_config = xno) SCROLLKEEPER_BUILD_REQUIRED=0.3.5 AC_SUBST(SCROLLKEEPER_BUILD_REQUIRED) dnl Check for aspell (spellcheck the docs) AC_CHECK_PROGS(ASPELL,[aspell],[]) AM_CONDITIONAL(WITH_ASPELL,[test "x$ASPELL" != "x"]) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([X11/Xlocale.h]) AC_CHECK_HEADERS([linux/input.h], [ have_linux_input_h=yes LINUX_INPUT_DOC_TYPES= LINUX_INPUT_DOC_SECTIONS= ], [ have_linux_input_h=no LINUX_INPUT_DOC_TYPES=% LINUX_INPUT_DOC_SECTIONS=# ] ) AC_SUBST(LINUX_INPUT_DOC_TYPES) AC_SUBST(LINUX_INPUT_DOC_SECTIONS) AM_CONDITIONAL(USE_LINUX_INPUT, test x$have_linux_input_h = xyes) dnl check for SSE intrisics ARCH_CFLAGS="" ARCH_CPPFLAGS="" case "x${host_cpu}" in xi?86|k?|xx86_64|xamd64) ARCH_CFLAGS="-march=native" ARCH_CPPFLAGS="-D__SSE__ -D__MMX__" AC_CHECK_HEADERS([xmmintrin.h]) ;; esac dnl Checks for typedefs, structures, and compiler characteristics. AM_C_PROTOTYPES test "x$U" != "x" && AC_MSG_ERROR(Compiler not ANSI compliant) AC_C_CONST dnl check for libraries AC_CHECK_LIBM AC_SUBST(LIBM) dnl Checks for library functions. dnl libc functions AC_CHECK_FUNCS( sched_setscheduler) AC_CHECK_FUNCS( mlockall) AC_CHECK_FUNCS( getrusage) AC_CHECK_FUNCS( setrlimit) dnl Check for -Bsymbolic-functions linker flag used to avoid dnl intra-library PLT jumps, if available. AC_ARG_ENABLE(Bsymbolic, [AC_HELP_STRING([--disable-Bsymbolic], [avoid linking with -Bsymbolic])],, [SAVED_LDFLAGS="${LDFLAGS}" AC_MSG_CHECKING([for -Bsymbolic-functions linker flag]) LDFLAGS=-Wl,-Bsymbolic-functions AC_TRY_LINK([], [int main (void) { return 0; }], AC_MSG_RESULT(yes) enable_Bsymbolic=yes, AC_MSG_RESULT(no) enable_Bsymbolic=no) LDFLAGS="${SAVED_LDFLAGS}"]) dnl Extra vars BT_INCLUDEDIR='-I${includedir}' dnl -Wl,--as-needed # can be put into CFLAGS to drop all unused libs BT_CFLAGS="$ARCH_CFLAGS $ARCH_CPPFLAGS $DEBUG_CFLAGS $COVERAGE_CFLAGS $BT_DISABLE_DEPRECATED" BT_LIBDIR='-L${libdir}' BT_LIBS="$COVERAGE_LIBS" BT_LDFLAGS="$DEBUG_LDFLAGS" if test "x${enable_Bsymbolic}" == "xyes"; then BT_LDFLAGS="$BT_LDFLAGS -Wl,-Bsymbolic-functions" fi dnl check for desktop and mimetype utilities AC_PATH_PROG(UPDATE_MIME_DATABASE, update-mime-database) AC_PATH_PROG(UPDATE_DESKTOP_DATABASE, update-desktop-database) dnl Substitutes AC_SUBST(BT_INCLUDEDIR) AC_SUBST(BT_CFLAGS) AC_SUBST(BT_LIBDIR) AC_SUBST(BT_LIBS) AC_SUBST(BT_LDFLAGS) AC_SUBST(BASE_DEPS_LIBS) AC_SUBST(BASE_DEPS_CFLAGS) AC_SUBST(GUI_DEPS_LIBS) AC_SUBST(GUI_DEPS_CFLAGS) AC_CONFIG_FILES(Makefile \ docs/Makefile \ docs/version.entities \ docs/help/Makefile \ docs/help/bt-edit/Makefile \ docs/help/bt-edit/C/Makefile \ docs/help/bt-edit/C/buzztard-edit-C.omf \ docs/reference/Makefile \ docs/reference/bt-cmd/Makefile \ docs/reference/bt-core/Makefile \ docs/reference/bt-core/buzztard-core.types \ docs/reference/bt-edit/Makefile \ docs/reference/bt-ic/Makefile \ docs/reference/bt-ic/buzztard-ic.types \ docs/reference/bt-ic/buzztard-ic-sections.txt \ pixmaps/Makefile \ pixmaps/hicolor/Makefile \ pixmaps/gnome/Makefile \ po/Makefile.in \ src/Makefile \ src/lib/Makefile \ src/lib/buzztard.xml \ src/lib/core/Makefile \ src/lib/core/libbuzztard-core.pc \ src/lib/core/libbuzztard-core/Makefile \ src/lib/core/libbuzztard-core/version.h \ src/lib/ic/Makefile \ src/lib/ic/libbuzztard-ic.pc \ src/lib/ic/libbuzztard-ic/Makefile \ src/lib/ic/libbuzztard-ic/version.h \ src/ui/Makefile \ src/ui/cmd/Makefile \ src/ui/dec/Makefile \ src/ui/edit/Makefile \ tests/Makefile \ tests/bt-cfg.sh \ tests/lib/Makefile \ tests/lib/core/Makefile \ tests/lib/ic/Makefile \ tests/ui/Makefile \ tests/ui/cmd/Makefile \ tests/ui/edit/Makefile \ ) AC_OUTPUT if test "x${coverage_tool}" != "x"; then using_coverage_tool="(using ${coverage_tool})" fi echo " Configuration Version : ${VERSION} Source code location : ${srcdir} Prefix : ${prefix} Compiler : ${CC} Documentation (API) : ${enable_gtk_doc} Documentation (Man) : ${enable_man} Documentation (User) : ${have_scrollkeeper} Bindings Metadata (GIR) : ${enable_gir} GUdev for interaction ctrl. : ${use_gudev} HAL for interaction ctrl. : ${use_hal} Linux HID for interaction ctrl. : ${have_linux_input_h} Buzzmachine Host support : ${use_bml} Zipped Song file support (bzt) : ${use_gsf} Hildon Desktop Integration : ${use_hildon} Debug : ${enable_debug} Coverage profiling : ${enable_coverage} ${using_coverage_tool} UI tests on Xvfb : ${have_xvfb} Use of deprecated API : ${enable_deprecated} Check based unit tests : ${have_check} " if test "x${use_bml}" = "xno" -o "x${use_gudev}" = "xno" -o "x${use_gsf}" = "xno" ; then echo " Some features are not built. If you like to have them built, please check that you have the required -devel packages installed and that they can be found in your PKG_CONFIG_PATH ($PKG_CONFIG_PATH). " fi if test ! `echo "$PKG_CONFIG_PATH:/usr" | tr \: \\n | grep $prefix` ; then echo " You are installing buzztard libraries into a location that is not yet known to system. In order for other buzztard modules to find them and the application to work with all features please register the location (see README for details): export LD_LIBRARY_PATH=$prefix/lib:\$LD_LIBRARY_PATH export MANPATH=\$MANPATH:$prefix/share/man export DEVHELP_SEARCH_PATH="\$DEVHELP_SEARCH_PATH:$prefix/share/gtk-doc/html" export PKG_CONFIG_PATH="\$PKG_CONFIG_PATH:$prefix/lib/pkgconfig" export GST_PLUGIN_PATH="\$GST_PLUGIN_PATH:$prefix/lib/gstreamer-0.10" export XDG_DATA_DIRS="\$XDG_DATA_DIRS:$prefix/share" export GI_TYPELIB_PATH="\$GI_TYPELIB_PATH:$prefix/lib/girepository" " fi buzztard-0.6.0/config.rpath0000754042355400116100000003521711576377374012654 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-2003 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 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 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # 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. # # 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 M$VC, # 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 AC_LIBTOOL_PROG_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | pw32* | os2*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; newsos6) ;; linux*) case $CC in icc|ecc) wl='-Wl,' ;; ccc) wl='-Wl,' ;; esac ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; sco3.2v5*) ;; solaris*) wl='-Wl,' ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) wl='-Wl,' ;; sysv4*MP*) ;; uts4*) ;; esac fi # Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32*) # 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 ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then case "$host_os" in aix3* | aix4* | aix5*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # Samuel A. Falvo II reports # that the semantics of dynamic libraries on AmigaOS, at least up # to version 4, is to share data among multiple programs linked # with the same dynamic library. Since this doesn't match the # behavior of shared libraries on other platforms, we can use # them. ld_shlibs=no ;; beos*) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32*) # 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 ;; netbsd*) ;; solaris* | sysv5*) if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = yes; then # 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' 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 ;; aix4* | aix5*) 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].*|aix5*) 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 hardcode_direct=yes 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*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes # see comment about different semantics on the GNU ld section ld_shlibs=no ;; bsdi4*) ;; cygwin* | mingw* | pw32*) # 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*) if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then hardcode_direct=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd1*) ld_shlibs=no ;; freebsd2.2*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; freebsd2*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd*) 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* | hpux11*) if test "$with_gnu_ld" = no; then case "$host_cpu" in hppa*64*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=no ;; ia64*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=no # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; *) 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 ;; 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=: ;; openbsd*) 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 ;; 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=: ;; sco3.2v5*) ;; 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.2uw2*) hardcode_direct=yes hardcode_minus_L=no ;; sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) ;; sysv5*) hardcode_libdir_flag_spec= ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. libname_spec='lib$name' case "$host_os" in aix3*) ;; aix4* | aix5*) ;; amigaos*) ;; beos*) ;; bsdi4*) ;; cygwin* | mingw* | pw32*) shrext=.dll ;; darwin* | rhapsody*) shrext=.dylib ;; dgux*) ;; freebsd1*) ;; freebsd*) ;; gnu*) ;; hpux9* | hpux10* | hpux11*) case "$host_cpu" in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac ;; irix5* | irix6* | nonstopux*) 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*) ;; netbsd*) ;; newsos6) ;; nto-qnx) ;; openbsd*) ;; os2*) libname_spec='$name' shrext=.dll ;; osf3* | osf4* | osf5*) ;; sco3.2v5*) ;; solaris*) ;; sunos4*) ;; sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) ;; sysv4*MP*) ;; uts4*) ;; 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_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <, 2008. # Roland Illig , 2009. # Roland Illig , 2011. # # :encoding=UTF-8: msgid "" msgstr "" "Project-Id-Version: buzztard 0.6.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2011-10-09 20:29+0100\n" "Last-Translator: Roland Illig \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Basepath: C:\\Users\\roland\\Desktop\\tmp\\posrc\\src\n" "X-Poedit-SearchPath-0: C:\\Users\\roland\\Desktop\\tmp\\posrc\\src\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Die Buzztard Kernversion ausgeben" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Buzztard Kernoptionen" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Buzztard Kernoptionen anzeigen" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normal" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "unterbrechen" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "stumm" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "solo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "durchschleifen" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Datei »%s« wird geladen" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Datei »%s« wird gespeichert" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "unbennanter Song" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Die Buzztard Interaction Controller Version ausgeben" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Buzztard Interaction Controller Optionen" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Buzztard Interaction Controller Optionen anzeigen" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Die Version der Anwendung ausgeben" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Keine Ausgaben" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Befehlsname" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Eingabedateiname" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Ausgabedateiname" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Optionen für buzztard-cmd" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Optionen für buzztard-cmd anzeigen" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "" "Stefan Kost , 2008\n" "Roland Illig , 2009\n" "Roland Illig , 2011" #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Buzztard-Entwicklerteam" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Musikproduktionsumgebung" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Dieses Paket ist freie Software; Sie dürfen sie unter den Bedingungen der " "GNU Lesser General Public License, wie von der Free Software Foundation " "veröffentlicht, weiterverteilen und/oder modifizieren; entweder gemäß " "Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version.\n" "\n" "Dieses Paket wird in der Hoffnung weiterverbreitet, dass es nützlich sein " "wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne die implizierte Garantie " "der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Mehr " "Details finden Sie in der GNU Lesser General Public License.\n" "\n" "Sie sollten eine Kopie der GNU Lesser General Public License zusammen mit " "diesem Paket erhalten haben; falls nicht, schreiben Sie an die Free Software " "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, " "USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "\"Development version (do not translate this)\"" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "Optionen für buzztard-edit" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Optionen für buzztard-edit anzeigen" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "Buzztard Musik Editor" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "Buzzztard Musikstücke bearbeiten" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "Ungespeicherter Song" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "Wiederherstellung erfolgreich beendet" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "Der ausgewählte Song wurde erfolgreich wiederhergestellt." #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "Bitte prüfen Sie den Song und speichern Sie ihn, wenn alles gut ist." #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "Wiederherstellung fehlgeschlagen" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" "Sorry, der ausgewählte Song konnte nicht vollständig wiederhergestellt " "werden." #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" "Bitte prüfen Sie den Song und speichern Sie ihn, wenn er noch gut aussieht." #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "Wiederherstellung ungespeicherter Songs" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "Ungespeicherte Songs gefunden" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" "Wählen Sie die Songs einzeln aus und wählen Sie »wiederherstellen« oder " "»löschen«." #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "Songdatei" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "Zuletzt geändert" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "Wiederherstellen" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Sie werden keinen Pegelanzeigen sehen." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Sie werden kein Frequenzspektum im Analysefenster sehen." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "Fernsteuerung für %s lernen" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" "Bewegen Sie eine Fernsteuerung oder drücken Sie darauf, um sie zu erkennen." #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "Fernsteuerung erkannt" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "keine" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "Registrieren als" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Lernen..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Fernsteuerung anbinden" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Fernsteuerung aufheben" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Alle Fernsteuerungen aufheben" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "von %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Über..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Stumm" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Durchschleifen" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Umbenennen..." #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "Geräte verbinden" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Signalanalyse..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Generatoren" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Effekte" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "Voreinstellungsname und -kommentar" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "Name" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "Kommentar" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s-Einstellungen" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "keine Einstellungen" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "Gerät hat keine Einstellungen" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "Parameter auf Vorgaben zurücksetzen" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "Alle Parameter auf Vorgaben zurücksetzen" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "Parameter kopieren" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Einfügen" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "Gruppe kopieren" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "globale Eigenschaften" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "Eigenschaften für Stimme %lu" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "%s Leitungs-Eigenschaften" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s-Eigenschaften" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Neue Voreinstellung hinzufügen" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Voreinstellung entfernen" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Voreinstellungsnamen und -kommentar bearbeiten" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Voreinstellung" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "Geräteeigenschaften" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Information über dieses Gerät" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Hilfe für dieses Gerät" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Parameter zufällig einstellen" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Parameter auf Vorgaben zurücksetzen" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Voreinstellungen anzeigen/verstecken" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Voreinstellungen" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s-Name" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "Einen neuen Song laden?" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Beim Laden des Songs »%s« trat ein Fehler auf" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Kann Song nicht laden" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "Einen Song wiederherstellen?" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Datei" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "Zulezt ve_rwendete" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "Ungespeicherte Songs wiederherstellen" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Bearbeiten" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Ansicht" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Werkzeugleiste" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Statusleiste" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Reiter" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "Vollbild" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Zur Geräteansicht gehen" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Zur Fragmentansicht gehen" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Zur Sequenzansicht gehen" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Zur Wellenformtabellenansicht gehen" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Zur Songinformation gehen" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Wiedergabe" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Vom Cursor an abspielen" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Hilfe" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "Tipp des Tages" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "IRC-Diskussion beitreten" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "Ein Problem berichten" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "Song-Metadaten" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "Genre" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "Autor" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "Erstellt" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "Schläge pro Minute" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "Schläge" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "Ticks pro Schlag" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "zuletzt gespeichert" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "Freitextinformation" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Gerät hinzufügen" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Stummschaltung für alle Machinen aufheben" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Aus" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Niedrig" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Mittel" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Hoch" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Vergrößerung so anpassen, dass alles sichtbar ist" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Für mehr Details vergrößern" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Für eine bessere Übersicht verkleinern" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Raster" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Raster anzeigen" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "Geräteansicht" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "Menüaktionen für die Geräteansicht unten" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" "Fügen Sie neue Geräte vom Rechtsklick-Kontextmenü hinzu. Verbinden Sie die " "Geräte mit Umschalt+Klick von der Quelle zum Ziel." #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "Fügen Sie neue Fragmente vom Rechtsklick-Kontextmenü hinzu." #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Globale Parameter" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Stimme 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Stimme %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Gerät" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Fragment" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Wellenform" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktave" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Live abspielen" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Noten und Anstöße während des Bearbeitens abspielen" #: ../src/ui/edit/main-page-patterns.c:3106 msgid "Pattern view menu" msgstr "Fragmentansicht" #: ../src/ui/edit/main-page-patterns.c:3107 msgid "Menu actions for pattern view below" msgstr "Menüaktionen für die Fragmentansicht unten" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Neue Spur" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Letzte Spur entfernen" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Neues Fragment..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Fragmenteigenschaften..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Fragment entfernen..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Fragment kopieren..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "Geräteeigenschaften" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "Geräteeinstellungen" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Ticks" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Zeit" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "Schläge" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Labels" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Jede n-te Zeile anzeigen" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Unterteilungen" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "Sequenzansicht" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "Menüaktionen für die Sequenzansicht unten" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Spur hinzufügen" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Spur entfernen" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Spur nach links verschieben" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Spur nach recht verschieben" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Markierungen in der Sequenz anspringen" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Taste" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Fragmente" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "Neue Spuren vom Rechtsklick-Kontextmenü hinzufügen." #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Aktuelle Wellenform als C-4 abspielen" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Abspielen der aktuellen Wellenform anhalten" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Aktuelle Wellenform entfernen" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Lautstärke" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Wiederholen" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Aktuelles Sample abspielen" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Abspielen des aktuellen Samples anhalten" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Aktuelles Sample in den ausgewählten Wellenformeintrag laden" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Basis" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Länge" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Rate" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Loopanfang" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Loopende" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "Geräte" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "Im Song verwendete Geräte und Verbindungen" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "Fragmente" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "Ereignisfragmenteditor" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "Sequenz" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "Song-Sequenzeditor" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "Wellenformtabelle" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "Sample-Wellenformtabelleneditor" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "Songinformationen" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "Song Metadateneditor" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Bereit zum Rocken!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "CPU-Last" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Abspielzeit" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Abspielposition" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Abspiellänge" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Fehler" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Ein Fehler trat auf" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Warnung" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Ein Problem trat auf" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Einen leeren Song anlegen" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Einen neuen Song laden" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Diesen Song abspeichern" #: ../src/ui/edit/main-toolbar.c:818 msgid "Rewind playback position of this song" msgstr "Abspielposition dieses Songs zurückspulen" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Diesen Song abspielen" #: ../src/ui/edit/main-toolbar.c:833 msgid "Forward playback position of this song" msgstr "Abspielposition dieses Songs vorspulen" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Abspielen dieses Songs beenden" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Wiederholen der Wiedergabe umschalten" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "Abspiellautstärke" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Abspiellautstärke ändern" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "ungespeichert" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "gespeichert" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "%d %s und %d %s" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "Stunde" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "Stunden" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "Minute" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "Minuten" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "Sekunde" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "Sekunden" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "%d %s" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "" "Alle ungespeicherten Änderungen seit dem %s werden verworfen. Dieser Song " "wurde zuletzt am %s gespeichert." #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "" "Alle ungespeicherten Änderungen seit dem %s werden verworfen. Dieser Song " "wurde am %s erzeugt." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Wirklich beenden?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Neuen Song?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Song öffnen" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Beim Speichern des Songs »%s« trat ein Fehler auf." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Kann Song nicht speichern" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Song speichern" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Format" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Datei existiert bereits" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Wählen Sie »Okay« zum Überscheiben oder »Abbrechen«, um den Song nicht zu " "speichern." #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Beim Speichern des Songs »%s« trat ein Fehler auf: %s" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Beim Speichern des Songs »%s« trat ein Fehler auf." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Fehlende GStreamer-Elemente" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Die im folgenden angezeigten Geräte fehlen oder können nicht geladen werden, " "werden jedoch benötigt." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Die im folgenden angezeigten Geräte fehlen oder können nicht geladen werden, " "werden aber empfohlen um die volle Funktionalität nutzen zu können." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "Nicht nochmals warnen" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Fehlende Elemente im Song" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "" "Die im Folgenden angezeigten Geräte fehlen oder können nicht geladen werden." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "" "Die im Folgenden angezeigten Wellenformen fehlen oder können nicht geladen " "werden." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "Länge" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "Stimmen" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "Song-Generierung" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Ordner" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Einen Ordner wählen" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Dateiname" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Modus" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Aufnahme nach: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "Song-Generierungsfortschritt" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "Buzztard-Einstellungen" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Audiogeräte" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Interaktionssteuerung" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Wiedergabesteuerung" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Farben" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Tastaturkürzel" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Ordner" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Audiogerät" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Senke" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "Systemvorgabe: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "Systemvorgabe: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Sampling-Rate" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanäle" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Songs" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Aufnahmen" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Wellenformen" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Gerät" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "Fernsteuerung" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Portnummer" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s Analyse" #: ../src/ui/edit/signal-analysis-dialog.c:711 msgid "master analysis" msgstr "Masteranalyse" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "lin." #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "log." #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "Frequenzzuordnung" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "einfach" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "doppelt" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "dreifach" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "Spektrumsgenauigkeit" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" "Neue Geräte werden vom Kontextmenü aus in der Geräteansicht hinzugefügt." #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" "Verbinden Sie Maschinen, indem Sie die Umschalttaste gedrückt halten und " "eine Verbindung von der Quell- zu der Zielmaschine ziehen." #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" "Stücke können als einzelne Wellen pro Spur aufgenommen werden, um sie an " "Remixer weiterzugeben." #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" "Füllen Sie die Details auf der Infoseite aus. Wenn Sie Stücke aufnehmen, " "werden die Metadaten als Tags zu der Aufnahme hinzugefügt." #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" "Benutzen Sie das »jackaudio«-Ziel in den Audiogeräteeinstellungen, um " "kürzere Verzögerungen für eine Livemaschinensteuerung zu erreichen." #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" "Sie können neben MIDI-Geräten auch andere Eingabegeräte wie zum Beispiel " "Joysticks benutzen, um die Maschinenparameter live zu steuern." #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" "Sie können einen UPnP-Medienclient (zum Beispiel Medienstreamer auf Nokia-" "Geräten) benutzen, um Buzztard fernzusteuern." #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" "Um Noten einzugeben, stellen Sie sich die PC-Tastatur als zweizeilige " "Klaviatur vor. Das »y« links unten wird ein C, das »s« wird ein Cis, »x« " "wird D, und so weiter." #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" "Weitere Hilfe können Sie von der Gemeinschaft auf irc://irc.freenode.net/" "#buzztard erhalten." #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" "Die Fragmentanordnungen sind für jede Maschine individuell. Weitere " "Informationen zu der Cursorspalte finden Sie unten in der Statuszeile." #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" "Klicken Sie auf das Lautsprechersymbol in der Fragmentansicht, um die Noten " "während der Eingabe zu hören." #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" "Jede Leitung hat eine Lautstärke- und mögliche Panorama/Balance-Steuerung, " "die auch im Maschinenfenster angepasst werden können, und zwar bei der " "Maschine, in die die Leitung hineinläuft." #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" "Die Box für die Leitungslautstärke geht auf, wenn Sie auf die Pfeilbox auf " "der Leitung klicken." #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" "Die Box für die Panorama/Balance-Steuerung geht auf (wenn es denn eine " "gibt), wenn Sie die Umschalttaste gedrückt halten, während Sie auf die " "Pfeilbox der Leitung klicken." #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "Tipps beim Programmstart anzeigen" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Kann Pixmap-Datei nicht finden: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Trennen" #~ msgid "" #~ "Rewrote internal pipeline management. One can now play partially " #~ "connected songs, and add/remove plugins while playing. Buzztard can play " #~ "notes while editing. More robust saving of songs. Lots of bugfixes and UI " #~ "improvemnts. Better user-guide including three small tutorials. Initial " #~ "support for python and javascript via gobject introspection." #~ msgstr "" #~ "Interne Pipeline-Verwaltung neugeschrieben. Man kann jetzt teilweise " #~ "verbunden Lieder abspielen und Plugins während der Wiedergabe hinzufügen " #~ "und entfernen. Buzztard kann Noten schon beim Bearbeiten spielen. " #~ "Robusteres Speichern von Liedern. Unmengen von Fehlerkorrekturen und " #~ "Verbesserungen der Benutzeroberfläche. Besseres Benutzerhandbuch " #~ "inclusive dreier kleiner Anleitungen. Neu hinzugekommen sind die " #~ "Unterstützung für Python und JavaScript via GObject-Introspektion." #~ msgid "Delete machine '%s'" #~ msgstr "Gerät '%s' entfernen" #~ msgid "Delete machine..." #~ msgstr "Gerät entfernen ..." #~ msgid "There is no undo for this." #~ msgstr "Diese Änderung kann nicht zurückgenommen werden." #~ msgid "Delete pattern '%s'" #~ msgstr "Muster »%s« entfernen" #~ msgid "Delete pattern..." #~ msgstr "Fragemnt entfernen ..." #~ msgid " clear" #~ msgstr " löschen" #~ msgid " mute" #~ msgstr " stumm" #~ msgid " break" #~ msgstr " abbrechen" #~ msgid " bypass" #~ msgstr " durchschleifen" #~ msgid " solo" #~ msgstr " solo" #~ msgid "default" #~ msgstr "Vorgabe" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Beim Laden des Songs '%s' trat ein Fehler auf" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "" #~ "Beim Öffnen des Songs '%s' zum Schreibzugriff trat ein Fehler auf: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Beim Speichern des Songs '%s' trat ein Fehler auf." #~ msgid "Show version" #~ msgstr "Version anzeigen" #~ msgid "interaction controller menu" #~ msgstr "Interaktionssteuerungsmenu" #~ msgid "interaction controllers menu" #~ msgstr "Interaktionssteuerung Menü" #~ msgid "add menu" #~ msgstr "Hinzufügen Menü" #~ msgid "generators menu" #~ msgstr "Generatoren Menü" #~ msgid "effects menu" #~ msgstr "Effekt Menü" #~ msgid "rename machine" #~ msgstr "Machine umbenennen" #~ msgid "main menu" #~ msgstr "Hauptmenü" #~ msgid "file menu" #~ msgstr "Datei Menü" #~ msgid "New" #~ msgstr "Neu" #~ msgid "Open" #~ msgstr "Öffnen" #~ msgid "separator" #~ msgstr "Trenner" #~ msgid "Save" #~ msgstr "Speichern" #~ msgid "Save as" #~ msgstr "Speichern unter" #~ msgid "Render" #~ msgstr "Generieren" #~ msgid "Quit" #~ msgstr "Beenden" #~ msgid "edit menu" #~ msgstr "Bearbeiten Menü" #~ msgid "Cut" #~ msgstr "Ausschneiden" #~ msgid "Copy" #~ msgstr "Kopieren" #~ msgid "Delete" #~ msgstr "Löschen" #~ msgid "Settings" #~ msgstr "Einstellungen" #~ msgid "view menu" #~ msgstr "Ansichts Menü" #~ msgid "Wave table view" #~ msgstr "Wellenformtabellenansicht" #~ msgid "Song information" #~ msgstr "Songinformationen" #~ msgid "playback menu" #~ msgstr "Wiedergabe Menü" #~ msgid "Play" #~ msgstr "Abspielen" #~ msgid "Stop" #~ msgstr "Anhalten" #~ msgid "help menu" #~ msgstr "Hilfe Menü" #~ msgid "Content" #~ msgstr "Inhalt" #~ msgid "About" #~ msgstr "Über" #~ msgid "song information" #~ msgstr "Songinformationen" #~ msgid "machine view" #~ msgstr "Geräteansicht" #~ msgid "machine view toolbar" #~ msgstr "Maschienenansichts-Werkzeugleiste" #~ msgid "Zoom Fit" #~ msgstr "Einpassen" #~ msgid "Zoom In" #~ msgstr "Vergrößern" #~ msgid "Zoom Out" #~ msgstr "Verkleinern" #~ msgid "machine and wire editor" #~ msgstr "Gerät und Verbindungseditor" #~ msgid "Delete unused pattern '%s'" #~ msgstr "Unbenutztes Fragment entfernen '%s'" #~ msgid "pattern view" #~ msgstr "Fragmentansicht" #~ msgid "pattern view toolbar" #~ msgstr "Fragmentansichts-Werkzeugleiste" #~ msgid "pattern editor" #~ msgstr "Fragemnteditor" #~ msgid " thru" #~ msgstr " durchleiten" #~ msgid "sequence view" #~ msgstr "Sequenzansicht" #~ msgid "sequence view toolbar" #~ msgstr "Sequenzansicht-Werkzeugleiste" #~ msgid "sequence editor" #~ msgstr "Song Abfolgeeditor" #~ msgid "pattern list for sequence track" #~ msgstr "Fragmentliste für Sequenzspur" #~ msgid "wave table view" #~ msgstr "Wellenformtabellenansicht" #~ msgid "sample list toolbar" #~ msgstr "Samplelisten-Werkzeugleiste" #~ msgid "Clear" #~ msgstr "Freigeben" #~ msgid "wave list" #~ msgstr "Wellenformtabelle" #~ msgid "sample browser toolbar" #~ msgstr "Samplebrowser-Werkzeugleiste" #~ msgid "sample edit toolbar" #~ msgstr "Sampleeditor-Werkzeugleiste" #~ msgid "wave-level list" #~ msgstr "Wellenformebenenliste" #~ msgid "song views" #~ msgstr "Liedansichten" #~ msgid "main toolbar" #~ msgstr "Hauptwerkzeugleiste" #~ msgid "main window" #~ msgstr "Geräteansicht" #~ msgid "pattern properties" #~ msgstr "Fragmenteigenschaften" #~ msgid "settings pages" #~ msgstr "Einstellungsseiten" #~ msgid "color settings" #~ msgstr "Farb-Einstellungen" #~ msgid "keyboard shortcut settings" #~ msgstr "Tataturkürzel-Einstellungen" #~ msgid "audio device settings" #~ msgstr "Audiogeräte-Einstellungen" #~ msgid "default directory settings" #~ msgstr "Standardverzeichnis-Einstellungen" #~ msgid "interaction controller settings" #~ msgstr "Interaktionssteuerung-Einstellungen" #~ msgid "playback controller settings" #~ msgstr "Wiedergabesteuerung-Einstellungen" #~ msgid "Coherence UPnP" #~ msgstr "Coherence UPnP" #~ msgid "" #~ "Improvements in all areas. We now have native buzzmachine support and " #~ "better compatibility. The buzztard editor got an own pattern editor " #~ "widget. The ui got lots of keyboard commands. We have settings for " #~ "default directories used. The ui has dialogs for recording mix-downs and " #~ "also single tracks." #~ msgstr "" #~ "Verbesserungen in allen Bereichen. Wir haben jetzt Unterstützung für " #~ "native Buzzmachines und bessere Kompatibillität. Der buzztard Editor " #~ "besitzt nun ein eigenes Widget für den Patterneditor. Das UI wurde mit " #~ "vielen Tastaturkommandos ausgestattet. Es gibt Einstellungen für die " #~ "Vorgabeverzeichnisse. Es gibt Dialog für die Aufnahme eines Mixdowns oder " #~ "Einzeltracks." #~ msgid "Generate and load random preset" #~ msgstr "Zufällige Einstellung erzeugen und laden" #~ msgid "Loop begin" #~ msgstr "Start des Wiederholbereiches" #~ msgid "Audio" #~ msgstr "Audio" #~ msgid "" #~ "This version has lots of UI usability improvements, bug fixes, more " #~ "instant apply settings and introduces some interactivity features " #~ "(interaction controller and upnp playback controller)." #~ msgstr "" #~ "Diese Version bringt viele Verbesserungen der Benutzungsoberfläche, " #~ "Fehlerbereinigungen, mehr sofort angewendete Einstellungen und führt " #~ "Interaktivitätsfunktionen ein (Interaktionssteuerung und UPnP " #~ "Wiedergabesteuerung)." buzztard-0.6.0/po/id.po0000644042355400116100000013243311675570705011706 00000000000000# Terjemah pesan berbahasa Indonesia untuk buzztard. # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the buzztard package. # Erwid M Jadied , 2008. # msgid "" msgstr "" "Project-Id-Version: buzztard-0.4.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2008-12-15 17:56+0700\n" "Last-Translator: Erwid M Jadied \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Indonesian\n" "X-Poedit-Country: INDONESIA\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Cetak versi inti buzztard" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Pilihan inti buzztard" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Tunjukkan pilihan inti buzztard" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "biasa" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "berhenti" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "matikan suara" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "sendiri" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "melewati" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Mengisi berkas '%s'" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Menyimpan berkas '%s'" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "Lagu tidak berjudul" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Cetak versi pengendali interaksi buzztard" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Pilihan pengendali interaksi buzztard" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Tunjukkan pilihan pengendali interaksi buzztard" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 #, fuzzy msgid "Print application version" msgstr "Cetak versi aplikasi" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Tenanglah!" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Nama perintah" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Masukan berkas nama" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Keluaran nama berkas" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 #, fuzzy msgid "buzztard-cmd options" msgstr "Pilihan inti buzztard" #: ../src/ui/cmd/bt-cmd.c:94 #, fuzzy msgid "Show buzztard-cmd options" msgstr "Tunjukkan pilihan inti buzztard" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "" #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Team Pengembang Buzztard " #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Lingkungan produksi musik" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Paket ini adalah software bebas; anda dapat mendistribusikan dan/atau " "memodifikasinya dengan syarat-syarat dari GNU Library General Public License " "sebagaimana yang diterbitkan oleh Free Software Foundation; baik versi 2 " "dari lisensi atau versi-versi selanjutnya (sesuai pilihan anda).\n" "\n" "Paket ini didistribusikan dengan harapan akan memberi banyak manfaat, tetapi " "TANPA ADA JAMINAN APAPUN; termasuk jaminan untuk PERDAGANGAN atau KECOCOKAN " "UNTUK TUJUAN TERTENTU.Lihat GNU Libarary General Public License untuk " "informasi lebih detail." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 #, fuzzy msgid "buzztard-edit options" msgstr "pilihan bt-edit" #: ../src/ui/edit/bt-edit.c:103 #, fuzzy msgid "Show buzztard-edit options" msgstr "Tunjukkan pilihan bt-edit" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "Editor Musik Buzztard" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "Edit berkas lagu buzztard" #: ../src/ui/edit/change-log.c:544 #, fuzzy msgid "unsaved song" msgstr "Tidak dapat menyimpan lagu" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 #, fuzzy msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Anda tidak akan melihat level-meters apapun." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Anda tidak akan melihat spektrum analizer pada jendela analizer" #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, fuzzy, c-format msgid "learn controller for %s" msgstr "Pengendali Bind" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Belajar..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Pengendali Bind" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Unbind pengendali" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Unbind semua pengendali" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "oleh %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Tentang..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Matikan suara" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Melewati" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Menamai ulang..." #: ../src/ui/edit/machine-canvas-item.c:764 #, fuzzy msgid "Connect machines" msgstr "beri nama mesin" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Menganalisa Sinyal..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Pembangkit" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Efek-efek" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "preset nama dan komentar" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "nama" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "komentar" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s preferensi-preferensi" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "tidak ada pengaturan" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "mesin tidak mempunyai preferensi" #: ../src/ui/edit/machine-properties-dialog.c:741 #, fuzzy msgid "Reset parameter" msgstr "Reset parameter ke standar" #: ../src/ui/edit/machine-properties-dialog.c:746 #, fuzzy msgid "Reset all parameters" msgstr "Reset parameter ke standar" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 #, fuzzy msgid "Copy parameter" msgstr "Salin pola..." #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Tempel" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "parameter global" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "parameter suara %lu" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, fuzzy, c-format msgid "%s wire properties" msgstr "%s sifat-sifat" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s sifat-sifat" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Tambahkan aturan awal baru" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Hapus aturan awal" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Rdit nama aturan awal dan komentar" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Aturan awal" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "sifat-sifat mesin" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Informasi tentang mesin ini" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Bantuan untuk mesin ini" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Acak parameter" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Reset parameter ke standar" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Tampilkan/Sembunyikan pane aturan awal" #: ../src/ui/edit/machine-properties-dialog.c:2265 #, fuzzy msgid "Presets" msgstr "Aturan awal" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s name" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 #, fuzzy msgid "Load new song?" msgstr "Memuat lagu baru" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Kesalahan terjadi ketika memuat lagu dari berkas '%s'" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Tidak dapat memutar lagu" #: ../src/ui/edit/main-menu.c:132 #, fuzzy msgid "Recover a song?" msgstr "Simpan lagu" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Berkas" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Baru saja digunakan" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Edit" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Lihat" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Toolbar" #: ../src/ui/edit/main-menu.c:851 #, fuzzy msgid "Statusbar" msgstr "tampilan status" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Tabulator" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Menuju ke tampilan mesin" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Menuju ke tampilan pola" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Menuju ke tampilan urutan" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Menuju ke Tampilan wavetable" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Pergi ke informasi lagu" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Memutar" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Bantuan" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "meta data lagu" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "genre" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "pencipta" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "ketukan per menit" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "ketukan" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "tik per ketukan" #: ../src/ui/edit/main-page-info.c:398 #, fuzzy msgid "last saved" msgstr "disimpan" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "info teks bebas" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Tambahkan mesin" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Kembalikan semua suara mesin" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Mati" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Rendah" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Pertengahan" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Tinggi" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Perbesar/perkecil sehingga semuanya terlihat" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Perkecil untuk melihat lebih detail" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Perbesar untuk penglihatan lebih baik" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Grid" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Tampilkan latarbelakang grid" #: ../src/ui/edit/main-page-machines.c:1266 #, fuzzy msgid "Machine view menu" msgstr "Tampilan mesin" #: ../src/ui/edit/main-page-machines.c:1267 #, fuzzy msgid "Menu actions for machine view below" msgstr "Menuju ke tampilan mesin" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 #, fuzzy msgid "Voice 1" msgstr "suara-suara" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "mesin" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Pola" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Gelombang" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktaf" #: ../src/ui/edit/main-page-patterns.c:3094 #, fuzzy msgid "Play live" msgstr "Waktu memutar" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3106 #, fuzzy msgid "Pattern view menu" msgstr "Tampilan Pola" #: ../src/ui/edit/main-page-patterns.c:3107 #, fuzzy msgid "Menu actions for pattern view below" msgstr "Menuju ke tampilan pola" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Track baru" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Hapuskan track terakhir" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Pola baru..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Sifat-sifat pola..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Hilangkan pola..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Salin pola..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 #, fuzzy msgid "Machine properties" msgstr "sifat-sifat mesin" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 #, fuzzy msgid "Machine preferences" msgstr "preferensi mesin" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Tik" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Waktu" #: ../src/ui/edit/main-page-sequence.c:1093 #, fuzzy msgid "Beats" msgstr "ketukan" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Label" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Tampilkan setiap garis ke-n" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Langkah-langkah" #: ../src/ui/edit/main-page-sequence.c:3067 #, fuzzy msgid "Sequence view menu" msgstr "Tampilan urutan" #: ../src/ui/edit/main-page-sequence.c:3068 #, fuzzy msgid "Menu actions for sequence view below" msgstr "Menuju ke tampilan urutan" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Tambahkan track" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Pindahkan track" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Pindahkan ke track kiri" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Pindahkan ke track kanan" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Jelajahi ke label pada urutan" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Kunci" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Pola-pola" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Putar entri wavetable saat ini sebagai C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Hentikan memutar entri wavetable saat ini " #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Bersihkan wavetable saat ini" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Volume" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Loop" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Putar sample saat ini" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Hentikan memutar sample saat ini" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Muat sampel saat ini ke dalam wave table entri" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Akar" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Panjang" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Rate" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Awal loop" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Akhir loop" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "mesin-mesin" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "mesin digunakan pada lagu dan kabelnya" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "pola-pola" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "editor kejadian pola" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "urutan" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "editor urutan lagu" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "wave table" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "editor wave table sampel" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "informasi" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "editor meta data lagu" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Siap berpesta!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "Beban CPU" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Waktu memutar" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Posisi pemutaran" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Panjang pemutaran" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Kesalahan" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Terjadi kesalahan" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Peringatan" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Terjadi permasalahan" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Mempersiapkan lagu baru yang kosong" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Memuat lagu baru" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Simpan lagu ini" #: ../src/ui/edit/main-toolbar.c:818 #, fuzzy msgid "Rewind playback position of this song" msgstr "Hentikan memutar" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Putar lagu ini" #: ../src/ui/edit/main-toolbar.c:833 #, fuzzy msgid "Forward playback position of this song" msgstr "Hentikan memutar" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Hentikan memutar" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Toogle loop pemutar" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "volume pemutar" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Ubah volume suara" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "tidak disimpan" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "disimpan" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, fuzzy, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "Semau perubahan yang tidak tersimpan akan hlang." #: ../src/ui/edit/main-window.c:296 #, fuzzy, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "Semau perubahan yang tidak tersimpan akan hlang." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Keluar?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Lagu baru?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Buka lagu" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Kesalahan terjadi menyimpan lagu kedalam berkas '%s'." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Tidak dapat menyimpan lagu" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Simpan lagu" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Format" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Berkas sudah ada" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Pilih 'OK' untuk menulis ulang atau 'Batal' untuk membatalkan menyimpan lagu." #: ../src/ui/edit/main-window.c:897 #, fuzzy, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Kesalahan terjadi menyimpan lagu kedalam berkas '%s'." #: ../src/ui/edit/main-window.c:909 #, fuzzy, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Kesalahan terjadi menyimpan lagu kedalam berkas '%s'." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Kehilangan elemen-elemen GStreamer" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Elemen-elemen yang terdaftar dibawah ini hilang pada saat instalasi tetapi " "dibutuhkan" #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Elemen-elemen yang terdaftar dibawah ini hilang dari instalasi tetapi " "direkomendasikan untuk fungsionalitas program sepenuhnya." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "jangan peringatkan kembali" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Kehilangan elemen pada lagu" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Mesin-mesin yang terdaftar dibawah ini hilang atau gagal dimuat." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "" "Gelombang-gelombang yang terdaftar dibawah ini hilang atau gagal dimuat." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "panjang" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "suara-suara" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "rendering lagu" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Folder" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Pilih folder" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Namaberkas" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Mode" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Merekam ke:'%s'" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "rendering lagu sedang dalam progress" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "pengaturan buzztard" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Alat-alat audio" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Pengendali Interaksi" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Pengendali pemutar" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Warna-warna" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Jalan pintas" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Direktori" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Alat audio" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Sink" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, fuzzy, c-format msgid "system default: %s (%s)" msgstr "standar sistem (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 #, fuzzy msgid "system default: -" msgstr "standar sistem (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Lagu-lagu" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Merekam" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Bentuk gelombang" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Alat" #: ../src/ui/edit/settings-page-interaction-controller.c:171 #, fuzzy msgid "Controller" msgstr "Pengendali Bind" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Nomer port" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s analisa" #: ../src/ui/edit/signal-analysis-dialog.c:711 #, fuzzy msgid "master analysis" msgstr "analisa kabel" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Tidak dapat menemukan berkas pixmap: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Memutuskan" #~ msgid "Show version" #~ msgstr "Tunjukkan versi" #~ msgid "" #~ "As planned, main focus for this release was the wavetable support. Its " #~ "done - buzztard can load what gstreamer can decode.The wavetable view has " #~ "a nice waveform widget. Related to that buzztard has a new song-format " #~ "that bundles the XML together with external files in a zip archive. Also " #~ "the UI has seen a lot of improvements. The machine view looks nicer - " #~ "Marc drew spiffy machine icons. In addition they now show real volume " #~ "meters when playing. All meters are now properly synced." #~ msgstr "" #~ "Sesuai dengan rencana, fokus utama rilis ini adalah wavetable support. " #~ "Dan berhasil-buzztard dapat memuat apa yang gstreamer decode. Tampilan " #~ "wavetable mempunyai waveform widget yang cantik. Berhubungan dengan hal " #~ "tersebut, buzztard mempunyai format lagu baru yang membundle XML dengan " #~ "berkas eksternal dalam arsip zip. Juga meningkatan yang banyak pada UI. " #~ "Tampilan mesin terlihat lebih bagus - Merc menggambar icon mesin spiffy. " #~ "Sebagai tambahan, mereka juga membuat volume meter ketika memainkannya. " #~ "Semau meter sekarang telah tersinkronisasi." #~ msgid "interaction controller menu" #~ msgstr "menu pengendali interaksi" #~ msgid "interaction controllers menu" #~ msgstr "menu pengendali-pengendali interaksi" #~ msgid "Delete machine '%s'" #~ msgstr "Menghapus mesin '%s'" #~ msgid "Delete machine..." #~ msgstr "Menghapus mesin..." #~ msgid "There is no undo for this." #~ msgstr "Tidak ada undo untuk ini" #~ msgid "add menu" #~ msgstr "tambah menu" #~ msgid "generators menu" #~ msgstr "menu pembangkit" #~ msgid "effects menu" #~ msgstr "menu efek" #~ msgid "main menu" #~ msgstr "menu utama" #~ msgid "file menu" #~ msgstr "menu berkas" #~ msgid "New" #~ msgstr "Baru" #~ msgid "Open" #~ msgstr "Buka" #~ msgid "separator" #~ msgstr "pemisah" #~ msgid "Save" #~ msgstr "Simpan" #~ msgid "Save as" #~ msgstr "Simpan sebagai" #~ msgid "Render" #~ msgstr "Render" #~ msgid "Quit" #~ msgstr "Keluar" #~ msgid "edit menu" #~ msgstr "menu edit" #~ msgid "Cut" #~ msgstr "Potong" #~ msgid "Copy" #~ msgstr "Salin" #~ msgid "Delete" #~ msgstr "Hapus" #~ msgid "Settings" #~ msgstr "Pengaturan" #~ msgid "view menu" #~ msgstr "menu lihat" #~ msgid "Wave table view" #~ msgstr "Tampilan wavetable" #~ msgid "Song information" #~ msgstr "Informasi lagu" #~ msgid "playback menu" #~ msgstr "menu putar kembali" #~ msgid "Play" #~ msgstr "Mainkan" #~ msgid "Stop" #~ msgstr "Berhenti" #~ msgid "help menu" #~ msgstr "menu bantuan" #~ msgid "Content" #~ msgstr "Isi" #~ msgid "About" #~ msgstr "Tentang" #~ msgid "song information" #~ msgstr "informasi lagu" #~ msgid "machine view" #~ msgstr "tampilan mesin" #~ msgid "machine view toolbar" #~ msgstr "toolbar tampilan mesin " #~ msgid "Zoom Fit" #~ msgstr "Zoom yang pas" #~ msgid "Zoom In" #~ msgstr "Perkecil" #~ msgid "Zoom Out" #~ msgstr "Perbesar" #~ msgid "machine and wire editor" #~ msgstr "mesin dan kabel editor" #~ msgid "Delete used pattern '%s'" #~ msgstr "Hapus pola yang digunakan: '%s'" #~ msgid "Delete unused pattern '%s'" #~ msgstr "Hapus pola yang tidak digunakan '%s'" #~ msgid "Delete pattern..." #~ msgstr "Hapus pola..." #~ msgid "pattern view" #~ msgstr "tampilan pola" #~ msgid "pattern view toolbar" #~ msgstr "toolbar tampilan pola" #~ msgid "pattern editor" #~ msgstr "editor pola" #~ msgid " clear" #~ msgstr " bersih" #~ msgid " mute" #~ msgstr " matikan suara" #~ msgid " break" #~ msgstr " berhenti" #~ msgid " thru" #~ msgstr " melewati" #~ msgid " solo" #~ msgstr " sendiri" #~ msgid "sequence view" #~ msgstr "tampilan urutan" #~ msgid "sequence view toolbar" #~ msgstr "toolbar tampilan urutan" #~ msgid "sequence editor" #~ msgstr "editor urutan" #~ msgid "pattern list for sequence track" #~ msgstr "daftar pola untuk urutan track" #~ msgid "wave table view" #~ msgstr "tampilan wavetable" #~ msgid "sample list toolbar" #~ msgstr "toolbar daftar sample" #~ msgid "Clear" #~ msgstr "Bersih" #~ msgid "wave list" #~ msgstr "daftar gelombang" #~ msgid "sample browser toolbar" #~ msgstr "toolbar jelajah sampel" #~ msgid "sample edit toolbar" #~ msgstr "toolbar edit sampel" #~ msgid "wave-level list" #~ msgstr "daftar wave-level" #~ msgid "song views" #~ msgstr "tampilan-tampilan lagu" #~ msgid "default" #~ msgstr "standar" #~ msgid "main toolbar" #~ msgstr "toolbar utama" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Kesalahan terjadi ketika berusaha memuat lagu dari berkas '%s'" #~ msgid "main window" #~ msgstr "jendela utama" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "" #~ "Kesalahan terjadi ketika berusaha membuka berkas '%s' untuk menulis: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Kesalahan terjadi ketika berusaha menyimpan lagu ke berkas '%s'" #~ msgid "pattern properties" #~ msgstr "sifat-sifat pola" #~ msgid "settings pages" #~ msgstr "Pengaturan halaman" #~ msgid "color settings" #~ msgstr "pengaturan warna" #~ msgid "keyboard shortcut settings" #~ msgstr "pengaturan shortcut keyboard" #~ msgid "audio device settings" #~ msgstr "Pengaturan alat audio" #~ msgid "default directory settings" #~ msgstr "pengaturan direktori standar" #~ msgid "interaction controller settings" #~ msgstr "pengaturan pengendali interaksi" #~ msgid "playback controller settings" #~ msgstr "pengaturan pengendali pemutar" #~ msgid "Coherence UPnP" #~ msgstr "Koheren UPnP" buzztard-0.6.0/po/Makefile.in.in0000644042355400116100000001537711675570705013433 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo 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 Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$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; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # 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: buzztard-0.6.0/po/cs.po0000644042355400116100000012377011675570705011723 00000000000000# Czech translation for Buzztard. # Copyright (C) 2009 Pavel Fric # This file is distributed under the same license as the buzztard package. # :encoding=UTF-8: # Pavel Fric , 2009. # Vladimir Michl , 2009. msgid "" msgstr "" "Project-Id-Version: buzztard 0.5.0-pre1\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2009-08-08 17:05+0100\n" "Last-Translator: Vladimir Michl \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Lokalize 0.3\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Vytisknout základní verzi Buzztardu" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Základní volby pro Buzztard" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Ukázat základní volby pro Buzztard" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normální" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "pÅ™eruÅ¡it" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "ztlumit" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "sólo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "dotáhnout" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Nahrává se soubor '%s'" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Ukládá se soubor '%s'" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "Nepojmenovaná skladba" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Vytisknout verzi ovladaÄe výmÄ›ny informací Buzztardu" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Volby pro ovladaÄ výmÄ›ny informací Buzztardu" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Ukázat volby pro ovladaÄ výmÄ›ny informací Buzztardu" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Vytisknout používanou verzi" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Žádná oznámení" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Název příkazu" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Název vstupního souboru" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Název výstupního souboru" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Cmd volby pro Buzztard" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Ukázat cmd volby pro Buzztard" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "www.fripohled.blogspot.com" #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Buzztardův vývojářský tým" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "ProstÅ™edí pro tvorbu hudby" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Tento balík je svobodným softwarem; můžete jej rozdávat a/nebo upravovat za " "podmínek GNU General Public License (GPL), jak jsou zveÅ™ejnÄ›ny Free Software " "Foundation; buÄ ve verzi 2 licence, nebo (podle své volby) v kterékoli " "pozdÄ›jší verzi.\n" "\n" "Tento balík je šířen v nadÄ›ji, že bude užiteÄný, ale BEZ JAKÉKOLI ZÃRUKY; " "také bez pÅ™edpokládané záruky PRODEJNOSTI nebo POUŽITELNOSTI PRO NÄšJAKà " "URÄŒITà ÚČEL: Více podrobností naleznete v GNU Library General Public " "License.\n" "\n" "Kopii GNU Library General Public License byste mÄ›l obdržet spoleÄnÄ› s tímto " "balíkem; a pokud ne, napiÅ¡te Free Software Foundation, Inc., 51 Franklin St, " "Fifth Floor, Boston, MA 02110, USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "Volby pro úpravy buzztardu" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Ukázat volby pro úpravy buzztardu" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 #, fuzzy msgid "Buzztard Music Editor" msgstr "Základní volby pro Buzztard" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 #, fuzzy msgid "Edit buzztard song files" msgstr "Nastavení Buzztardu" #: ../src/ui/edit/change-log.c:544 #, fuzzy msgid "unsaved song" msgstr "Skladbu nelze uložit" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 #, fuzzy msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 #, fuzzy msgid "Last changed" msgstr "naposledy uložený" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Neuvidíte žádné ukazatele hladin." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Neuvidíte žádné kmitoÄtové spektrum v oknÄ› s rozborem." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, fuzzy, c-format msgid "learn controller for %s" msgstr "Napojit ovládací spínaÄ" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "UÄit se..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Napojit ovládací spínaÄ" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "ZruÅ¡it ovládací spínaÄ" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "ZruÅ¡it vÅ¡echny ovládací spínaÄe" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "od %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "O..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Ztlumit" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Sólo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Dotáhnout" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "PÅ™ejmenovat..." #: ../src/ui/edit/machine-canvas-item.c:764 #, fuzzy msgid "Connect machines" msgstr "Nástroje" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Rozbor signálu..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Původci" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Efekty" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "Název pÅ™ednastavení a poznámka" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "Název" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "Poznámka" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s nastavení" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "žádná nastavení" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "Nástroj nemá žádná nastavení" #: ../src/ui/edit/machine-properties-dialog.c:741 #, fuzzy msgid "Reset parameter" msgstr "Parametry pÅ™enastavit na výchozí" #: ../src/ui/edit/machine-properties-dialog.c:746 #, fuzzy msgid "Reset all parameters" msgstr "Parametry pÅ™enastavit na výchozí" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 #, fuzzy msgid "Copy parameter" msgstr "Kopírovat Äást..." #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "souhrnná nastavení" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "Nastavení pro hlas %lu" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "%s vlastnosti propojení" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s vlastnosti" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "PÅ™idat nové pÅ™ednastavení" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Odstranit pÅ™ednastavení" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Upravit název pÅ™ednastavení a poznámka" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "PÅ™ednastavení" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "Vlastnosti nástroje" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Informace o tomto nástroji" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "NápovÄ›da pro tento nástroj" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Parametry nastavit náhodnÄ›" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Parametry pÅ™enastavit na výchozí" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Ukázat/Skrýt pÅ™ednastavení" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "PÅ™ednastavení" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s název" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 #, fuzzy msgid "Load new song?" msgstr "Nahrát novou skladbu" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "PÅ™i nahrávání skladby '%s' se vyskytla chyba" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Skladbu nelze nahrát" #: ../src/ui/edit/main-menu.c:132 #, fuzzy msgid "Recover a song?" msgstr "Uložit skladbu" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Soubor" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Naposledy použité" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Úpravy" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Pohled" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Nástrojová liÅ¡ta" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Stavová liÅ¡ta" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Karty" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Jít na pohled na nástroje" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Jít na pohled na Äásti" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Jít na pohled na sekvence" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Jít na pohled na tabulku s tvary vln" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Jít na informace o skladbÄ›" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_PÅ™ehrání" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "PÅ™ehrávat od polohy běžce" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_NápovÄ›da" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "Údaje v souboru se skladbou" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "Žánr" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "Autor" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "VytvoÅ™eno" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "Dob za minutu" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "Doby" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "Tiknutí na dobu" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "naposledy uložený" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "Volnotextová informace" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "PÅ™idat nástroj" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "ZruÅ¡it ztlumení pro vÅ¡echny nástroje" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Vypnuto" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Nízký" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "StÅ™ední" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Vysoký" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "ZvÄ›tÅ¡ení pÅ™izpůsobit tak, aby bylo vÅ¡e viditelné" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "ZvÄ›tÅ¡it kvůli více podrobnostem" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "ZmenÅ¡it kvůli lepšímu pÅ™ehledu" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Mřížka" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Ukázat mřížku" #: ../src/ui/edit/main-page-machines.c:1266 #, fuzzy msgid "Machine view menu" msgstr "Jít na pohled na nástroje" #: ../src/ui/edit/main-page-machines.c:1267 #, fuzzy msgid "Menu actions for machine view below" msgstr "Jít na pohled na nástroje" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Souhrnná" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Hlas 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Hlas %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Nástroj" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Část" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Tvar vlny" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktáva" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "PÅ™ehrát živÄ›" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "PÅ™i upravování Äást pÅ™ehrávat noty a spouÅ¡tÄ›" #: ../src/ui/edit/main-page-patterns.c:3106 #, fuzzy msgid "Pattern view menu" msgstr "Jít na pohled na Äásti" #: ../src/ui/edit/main-page-patterns.c:3107 #, fuzzy msgid "Menu actions for pattern view below" msgstr "Jít na pohled na Äásti" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Nová stopa" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Odstranit poslední stopu" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Nová Äást..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Vlastnosti Äásti..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Odstranit Äást..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Kopírovat Äást..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 #, fuzzy msgid "Machine properties" msgstr "Vlastnosti nástroje" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 #, fuzzy msgid "Machine preferences" msgstr "Nástroj nemá žádná nastavení" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Poz." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Tiknutí" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "ÄŒas" #: ../src/ui/edit/main-page-sequence.c:1093 #, fuzzy msgid "Beats" msgstr "Doby" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Popisky" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Ukázat každý n-te řádek" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "RozdÄ›lení" #: ../src/ui/edit/main-page-sequence.c:3067 #, fuzzy msgid "Sequence view menu" msgstr "Jít na pohled na sekvence" #: ../src/ui/edit/main-page-sequence.c:3068 #, fuzzy msgid "Menu actions for sequence view below" msgstr "Jít na pohled na sekvence" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "PÅ™idat stopu" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Odstranit stopu" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Posunout stopu vlevo" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Posunout stopu vpravo" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "SkoÄit na znaÄení v sekvenci" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Klávesa" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Části" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "PÅ™ehrát nynÄ›jší tvar vlny jako C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Zastavit pÅ™ehrávání nynÄ›jšího tvaru vlny" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Odstranit nynÄ›jší tvar vlny" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Hlasitost" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Opakovat ve smyÄce" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "PÅ™ehrát nynÄ›jší vzorek" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Zastavit pÅ™ehrávání nynÄ›jšího vzorku" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Nahrát nynÄ›jší vzorek do vybraného zápisu tvaru vlny" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Základ" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Délka" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Rychlost" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "ZaÄátek smyÄky" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Konec smyÄky" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "Nástroje" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "Nástroje použité ve skladbÄ› a jejich propojení" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "Části" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "Editor pro události Äástí" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "Sekvence" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "Editor poÅ™adí skladeb" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "Tabulka s tvary vln" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "Editor tabulky s tvary vln vzorků" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "Informace o skladbÄ›" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "Editor údajů v souboru se skladbou" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "PÅ™ipraven na hraní rockové hudby!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "Zatížení CPU" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Doba pÅ™ehrávání" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Poloha pÅ™ehrávání" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Délka pÅ™ehrávání" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Chyba" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Vyskytla se chyba" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Varování" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Vyskytl se problém" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Založit prázdnou skladbu" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Nahrát novou skladbu" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Uložit tuto skladbu" #: ../src/ui/edit/main-toolbar.c:818 #, fuzzy msgid "Rewind playback position of this song" msgstr "UkonÄit pÅ™ehrávání této skladby" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "PÅ™ehrát tuto skladbu" #: ../src/ui/edit/main-toolbar.c:833 #, fuzzy msgid "Forward playback position of this song" msgstr "UkonÄit pÅ™ehrávání této skladby" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "UkonÄit pÅ™ehrávání této skladby" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "PÅ™epnout opakování pÅ™ehrávání ve smyÄce" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "Hlasitost pÅ™ehrávání" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "ZmÄ›nit hlasitost pÅ™ehrávání" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "neuložený" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "uložený" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, fuzzy, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "VÅ¡echny zmÄ›ny, které nejsou uloženy, pak budou ztraceny." #: ../src/ui/edit/main-window.c:296 #, fuzzy, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "VÅ¡echny zmÄ›ny, které nejsou uloženy, pak budou ztraceny." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "SkuteÄnÄ› ukonÄit?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Novou skladbu?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Otevřít skladbu" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "PÅ™i ukládání skladby do souboru '%s' se vyskytla chyba." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Skladbu nelze uložit" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Uložit skladbu" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Formát" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Soubor již existuje" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "Zvolte 'OK' pro pÅ™epsání nebo 'ZruÅ¡it' pro pÅ™eruÅ¡ení ukládání skladby." #: ../src/ui/edit/main-window.c:897 #, fuzzy, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "PÅ™i ukládání skladby do souboru '%s' se vyskytla chyba." #: ../src/ui/edit/main-window.c:909 #, fuzzy, c-format msgid "An error occurred saving the song to file '%s'." msgstr "PÅ™i ukládání skladby do souboru '%s' se vyskytla chyba." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "ChybÄ›jící prvky GStreameru" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Prvky vypsané níže chybÄ›jí nebo se je nepodaÅ™ilo nahrát, jsou ale požadovány." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Prvky vypsané níže chybÄ›jí nebo se je nepodaÅ™ilo nahrát, jsou ale " "doporuÄovány, aby byl program plnÄ› funkÄní." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "Znovu nevarovat" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "ChybÄ›jící prvky ve skladbÄ›" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Nástroje vypsané níže chybÄ›jí nebo se je nepodaÅ™ilo nahrát." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Vzorky vypsané níže chybÄ›jí nebo se je nepodaÅ™ilo nahrát." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "Délka" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "Hlasy" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "VytvoÅ™ení skladby" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Složka" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Vybrat složku" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Název souboru" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Způsob" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Nahrávání do: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "Postup vytvoÅ™ení skladby" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "Nastavení Buzztardu" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Zvukové zařízení" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Ovládání výmÄ›ny informací" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Ovládání pÅ™ehrávání" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Barvy" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Klávesové zkratky" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Adresáře" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Zvukové zařízení" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Snížit" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "Výchozí nastavení systému: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "Výchozí nastavení systému: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Vzorkovací kmitoÄet" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanäle" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "Mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "Stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Skladby" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Nahrávky" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Tvary vln" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Zařízení" #: ../src/ui/edit/settings-page-interaction-controller.c:171 #, fuzzy msgid "Controller" msgstr "Napojit ovládací spínaÄ" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Číslo portu" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s rozbor" #: ../src/ui/edit/signal-analysis-dialog.c:711 #, fuzzy msgid "master analysis" msgstr "%s -> %s rozbor" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Nelze najít soubor s pixmapou: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Odpojit" #~ msgid "Delete machine '%s'" #~ msgstr "Odstranit nástroj '%s'" #~ msgid "Delete machine..." #~ msgstr "Odstranit nástroj..." #~ msgid "There is no undo for this." #~ msgstr "Tuto zmÄ›nu nelze vrátit zpÄ›t." #~ msgid "Delete pattern '%s'" #~ msgstr "Odstranit Äást '%s'" #~ msgid "Delete pattern..." #~ msgstr "Odstranit Äást..." #~ msgid " clear" #~ msgstr " vymazat" #~ msgid " mute" #~ msgstr " ztlumit" #~ msgid " break" #~ msgstr " pÅ™eruÅ¡it" #~ msgid " bypass" #~ msgstr " dotáhnout" #~ msgid " solo" #~ msgstr " sólo" #~ msgid "default" #~ msgstr "Výchozí" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "PÅ™i pokusu o nahrání skladby ze souboru '%s' se vyskytla chyba" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "PÅ™i pokusu o otevÅ™ení souboru '%s' pro zápis se vyskytla chyba: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "PÅ™i pokusu o uložení skladby do souboru '%s' se vyskytla chyba." buzztard-0.6.0/po/buzztard-0.6.pot0000644042355400116100000010443511672327767013652 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-15 09:29+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:96 msgid "buzztard-cmd options" msgstr "" #: ../src/ui/cmd/bt-cmd.c:96 msgid "Show buzztard-cmd options" msgstr "" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:75 msgid "translator-credits" msgstr "" #: ../src/ui/edit/about-dialog.c:77 ../src/ui/edit/about-dialog.c:78 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "" #: ../src/ui/edit/about-dialog.c:94 msgid "Music production environment" msgstr "" #: ../src/ui/edit/about-dialog.c:99 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:136 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:105 msgid "buzztard-edit options" msgstr "" #: ../src/ui/edit/bt-edit.c:105 msgid "Show buzztard-edit options" msgstr "" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "" #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "" #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "" #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "" #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "" #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1999 msgid "Globals" msgstr "" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:2018 msgid "Voice 1" msgstr "" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:2033 #, c-format msgid "Voice %u" msgstr "" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:3034 msgid "Machine" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3062 msgid "Pattern" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3091 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3114 msgid "Octave" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3130 msgid "Play live" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3132 msgid "Play notes and triggers while editing the pattern" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3142 msgid "Pattern view menu" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3143 msgid "Menu actions for pattern view below" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3180 msgid "New track" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3189 msgid "Remove last track" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3202 msgid "New pattern ..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3211 msgid "Pattern properties..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3220 msgid "Remove pattern..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3229 msgid "Copy pattern..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3242 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3249 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "" #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:854 msgid "Loop" msgstr "" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "" #: ../src/ui/edit/main-statusbar.c:291 ../src/ui/edit/main-statusbar.c:383 msgid "Ready to rock!" msgstr "" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:302 msgid "CPU load" msgstr "" #: ../src/ui/edit/main-statusbar.c:313 msgid "Playback time" msgstr "" #: ../src/ui/edit/main-statusbar.c:325 msgid "Playback position" msgstr "" #: ../src/ui/edit/main-statusbar.c:337 msgid "Playback length" msgstr "" #: ../src/ui/edit/main-toolbar.c:390 msgid "Error" msgstr "" #: ../src/ui/edit/main-toolbar.c:390 msgid "An error occurred" msgstr "" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:422 msgid "Warning" msgstr "" #: ../src/ui/edit/main-toolbar.c:422 msgid "A problem occurred" msgstr "" #: ../src/ui/edit/main-toolbar.c:799 msgid "Prepare a new empty song" msgstr "" #: ../src/ui/edit/main-toolbar.c:805 msgid "Load a new song" msgstr "" #: ../src/ui/edit/main-toolbar.c:812 msgid "Save this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:822 msgid "Rewind playback position of this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:831 msgid "Play this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:837 msgid "Forward playback position of this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:846 msgid "Stop playback of this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:856 msgid "Toggle looping of playback" msgstr "" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:876 msgid "playback volume" msgstr "" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:894 msgid "Change playback volume" msgstr "" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "" #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "" #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "" #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "" #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "" #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:718 #, c-format msgid "%s -> %s analysis" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:723 msgid "master analysis" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:781 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:782 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:785 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:789 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:790 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:791 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:794 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "" buzztard-0.6.0/po/vi.po0000644042355400116100000012671711675570705011740 00000000000000# Vietnamese translation for Buzztard. # Copyright © 2010 Free Software Foundation, Inc. # This file is distributed under the same license as the buzztard package. # Clytie Siddall , 2010. # msgid "" msgstr "" "Project-Id-Version: buzztard 0.5.0-pre1\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2010-03-31 16:10+1030\n" "Last-Translator: Clytie Siddall \n" "Language-Team: Vietnamese \n" "Language: vi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: LocFactoryEditor 1.8\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Hiển thị phiên bản lõi buzztard" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Tùy chá»n lõi buzztard" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Hiển thị các tuỳ chá»n lõi cá»§a buzztard" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "bình thưá»ng" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "ngắt" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "câm" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "đơn" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "Ä‘i vòng" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Äang nạp tập tin « %s »" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Äang lưu tập tin « %s »" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "bài hát không tên" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Hiển thị phiên bản cá»§a trình Ä‘iá»u khiển chức năng tương tác buzztard" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Tuỳ chá»n Ä‘iá»u khiển buzztard tương tác" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Hiển thị các tuỳ chá»n vá» trình Ä‘iá»u khiển chức năng tương tác buzztard" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Hiển thị phiên bản cá»§a ứng dụng" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Chạy im" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Tên lệnh" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Tên tập tin nhập" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Tên tập tin kết xuất" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Tuỳ chá»n buzztard-cmd" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Hiển thị các tuỳ chá»n vá» buzztard-cmd" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Clytie Siddall " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Tác quyá»n © năm 2003-%d cá»§a Nhóm phát triển Buzztard" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Môi trưá»ng sáng tạo âm nhạc" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Chương trình này là phần má»m dùng tá»± do;\n" "bạn có thể phân phối lại và/hay sá»­a đổí nó vá»›i Ä‘iá»u kiện cua\n" "Giấy Phép Công Cá»™ng GNU (GPL) như được xuất do\n" "Tổ Chức Phần Má»m Dùng Tá»± Do; hoặc phiên bản 2, hoặc (tùy chá»n)\n" "bất cứ phiên bản sau nào.\n" "\n" "Chúng tôi phân phối chương trình này vì mong nó có ích, nhưng\n" "không bảo đảm gì cả, không bảo đảm má»™t cách ngụ ý\n" "khả năng bán hay khả năng làm việc dứt khoát.\n" "Xem Giấy Phép Công Cá»™ng GNU để tim thấy chi tiết thêm.\n" "\n" "Bạn nên được nhận má»™t bản Giấy Phép Công Cá»™ng GNU\n" "cùng vá»›i chương trình này; nếu không thì hãy viết thư cho\n" "Free Software Foundation, Inc.,\n" "59 Temple Place - Suite 330, Boston,\n" "MA 02111-1307, USA (Mỹ)." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "Tuỳ chá»n buzztard-edit" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Hiển thị các tùy chá»n vá» chức năng chỉnh sá»­a buzztard-edit" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 #, fuzzy msgid "Buzztard Music Editor" msgstr "Tùy chá»n lõi buzztard" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 #, fuzzy msgid "Edit buzztard song files" msgstr "Thiết lập buzztard" #: ../src/ui/edit/change-log.c:544 #, fuzzy msgid "unsaved song" msgstr "Không thể lưu bài hát" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 #, fuzzy msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 #, fuzzy msgid "Last changed" msgstr "lưu cuối cùng" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Bạn sẽ không thấy cái Ä‘o mức nào." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Bạn sẽ không thấy quang phổ tần số trong cá»­a sổ phân tích." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, fuzzy, c-format msgid "learn controller for %s" msgstr "Kết hợp bá»™ Ä‘iá»u khiển" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Há»c hiểu..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Kết hợp bá»™ Ä‘iá»u khiển" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Bá» kết hợp bá»™ Ä‘iá»u khiển" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Bá» kết hợp tất cả các bá»™ Ä‘iá»u khiển" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "bởi %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Giá»›i thiệu..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Câm" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "ÄÆ¡n" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Äi vòng" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Thay tên..." #: ../src/ui/edit/machine-canvas-item.c:764 #, fuzzy msgid "Connect machines" msgstr "máy" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Phân tích tín hiệu..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Bá»™ phát sinh" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Hiệu ứng" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "tên và ghi chú định sẵn" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "tên" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "ghi chú" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "Tuỳ thích %s" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "không có thiết lập" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "máy không có tùy thích" #: ../src/ui/edit/machine-properties-dialog.c:741 #, fuzzy msgid "Reset parameter" msgstr "Äặt má»i tham số vá» mặc định" #: ../src/ui/edit/machine-properties-dialog.c:746 #, fuzzy msgid "Reset all parameters" msgstr "Äặt má»i tham số vá» mặc định" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 #, fuzzy msgid "Copy parameter" msgstr "Chép mẫu..." #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "thuá»™c tính toàn cục" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "thuá»™c tính %lu giá»ng nói" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "thuá»™c tính dây %s" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "thuá»™c tính %s" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Thêm định sẵn má»›i" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "BỠđịnh sẵn" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Sá»­a tên và ghi chú định sẵn" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Äịnh sẵn" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "thuá»™c tính máy" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "thông tin vá» máy này" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Trợ giúp cho máy này" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Tham số ngẫu nhiên" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Äặt má»i tham số vá» mặc định" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Hiện/Ẩn ô định sẵn" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Äịnh sẵn" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "tên %s" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 #, fuzzy msgid "Load new song?" msgstr "Nạp má»™t bài hát má»›i" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Gặp lá»—i khi nạp bài hát từ tập tin « %s »" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Không thể nạp bài hát" #: ../src/ui/edit/main-menu.c:132 #, fuzzy msgid "Recover a song?" msgstr "Lưu bài hát" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Tập tin" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Vừa dùng" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Sá»­a" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Xem" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Thanh công cụ" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Thanh trạng thái" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Thẻ" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Tá»›i ô xem máy" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Tá»›i ô xem mẫu" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Tá»›i ô xem dãy" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Tá»›i ô xem bảng sóng" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Tá»›i thông tin bài hát" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Phát lại" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Phát từ con chạy" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "Trợ g_iúp" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "siêu dữ liệu bài hát" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "thể loại" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "tác giả" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "đã tạo" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "nhịp má»—i phút" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "nhịp" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "nhịp phụ má»—i nhịp" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "lưu cuối cùng" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "thông tin Ä‘oạn văn tá»± do" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Thêm máy" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Bá» câm má»i máy" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Tắt" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Thấp" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Vừa" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Cao" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Thu phóng để má»i đồ Ä‘á»u hiện rõ" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Phóng to để xem chi tiết" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Thu nhỠđể xem toàn cảnh" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Lưới" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Hiển thị lưới ná»n" #: ../src/ui/edit/main-page-machines.c:1266 #, fuzzy msgid "Machine view menu" msgstr "Tá»›i ô xem máy" #: ../src/ui/edit/main-page-machines.c:1267 #, fuzzy msgid "Menu actions for machine view below" msgstr "Tá»›i ô xem máy" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Toàn cục" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Giá»ng nối 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Giá»ng nối %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Máy" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Mẫu" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Sóng" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Quãng tám" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Phát động" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Phát các nốt và bá»™ gây nên trong khi chỉnh sá»­a mẫu đó" #: ../src/ui/edit/main-page-patterns.c:3106 #, fuzzy msgid "Pattern view menu" msgstr "Tá»›i ô xem mẫu" #: ../src/ui/edit/main-page-patterns.c:3107 #, fuzzy msgid "Menu actions for pattern view below" msgstr "Tá»›i ô xem mẫu" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Rãnh má»›i" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Bá» rãnh cuối" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Mẫu má»›i..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Thuá»™c tính mẫu..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Bá» mẫu..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Chép mẫu..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 #, fuzzy msgid "Machine properties" msgstr "thuá»™c tính máy" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 #, fuzzy msgid "Machine preferences" msgstr "máy không có tùy thích" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Vị trí" #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Nhịp phụ" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Loại nhịp" #: ../src/ui/edit/main-page-sequence.c:1093 #, fuzzy msgid "Beats" msgstr "nhịp" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Nhãn" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Hiện má»—i dòng thứ n" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Bước" #: ../src/ui/edit/main-page-sequence.c:3067 #, fuzzy msgid "Sequence view menu" msgstr "Tá»›i ô xem dãy" #: ../src/ui/edit/main-page-sequence.c:3068 #, fuzzy msgid "Menu actions for sequence view below" msgstr "Tá»›i ô xem dãy" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Thêm rãnh" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Bá» rãnh" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Dá»i rãnh phía trái" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Dá»i rãnh phía phải" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Duyệt qua các nhãn trong dãy" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Khoá" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Mẫu" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Phát mục nhập bảng sóng hiện thá»i như là C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Dừng phát mục nhập bảng sóng hiện thá»i" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Xoá sạch mục nhập bảng sóng hiện thá»i" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Âm lượng" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Vòng lặp" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Phát mẫu hiện có" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Dừng phát lại mẫu hiện có" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Nạp mẫu hiện thá»i vào mục nhập bảng sóng được chá»n" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Gốc" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Chiá»u dài" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Tá»· lệ" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Äầu vòng lặp" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Cuối vòng lặp" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "máy" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "máy được dùng trong bài hát và các dãy tương ứng" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "mẫu" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "bá»™ chỉnh sá»­a mẫu sá»± kiện" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "dãy" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "bá»™ chỉnh sá»­a dãy bài hát" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "bảng sóng" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "bá»™ chỉnh sá»­a bảng sóng lấy mẫu" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "thông tin" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "bá»™ chỉnh sá»­a siêu dữ liệu bài hát" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Sẵn sàng rốc !" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "Trá»ng tải CPU" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Thá»i gian phát lại" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Vị trí phát lại" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Chiá»u dài phát lại" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Lá»—i" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Gặp lá»—i" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Cảnh báo" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Má»™t vấn đỠđã xảy ra" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Chuẩn bị má»™t bài hát trắng má»›i" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Nạp má»™t bài hát má»›i" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Lưu bài hát này" #: ../src/ui/edit/main-toolbar.c:818 #, fuzzy msgid "Rewind playback position of this song" msgstr "Dừng phát lại bài hát này" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Phát bài hát này" #: ../src/ui/edit/main-toolbar.c:833 #, fuzzy msgid "Forward playback position of this song" msgstr "Dừng phát lại bài hát này" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Dừng phát lại bài hát này" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Bật tắt vòng lặp phát lại" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "âm lượng phát lại" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Äổi âm lượng phát lại" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "chưa lưu" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "đã lưu" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, fuzzy, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "Má»i thay đổi chưa lưu Ä‘á»u thì bị mất." #: ../src/ui/edit/main-window.c:296 #, fuzzy, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "Má»i thay đổi chưa lưu Ä‘á»u thì bị mất." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Thá»±c sá»± thoát ?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Bài hát má»›i ?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Mở má»™t bài hát" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Gặp lá»—i trong khi lưu bài hát vào tập tin « %s »." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Không thể lưu bài hát" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Lưu bài hát" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Äịnh dạng" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Tập tin đã có" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "Chá»n « OK » để ghi đè hoặc « Thôi » để há»§y bá» việc lưu bài hát này." #: ../src/ui/edit/main-window.c:897 #, fuzzy, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Gặp lá»—i trong khi lưu bài hát vào tập tin « %s »." #: ../src/ui/edit/main-window.c:909 #, fuzzy, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Gặp lá»—i trong khi lưu bài hát vào tập tin « %s »." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Thiếu phần tá»­ GStreamer" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Theo đây có má»™t số phần tá»­ còn thiếu trong bản cài đặt này, mà cần thiết." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Theo đây có má»™t số phần tá»­ còn thiếu trong bản cài đặt này, mà khuyến khích " "để chức năng đầy đủ." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "đừng cảnh báo lần nữa" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Thiếu phần tá»­ trong bài hát" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Theo đây có má»™t số máy còn thiếu hay không nạp được." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Theo đây có má»™t số sóng còn thiếu hay không nạp được." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "độ dài" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "giá»ng nối" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "diá»…n tấu bài hát" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Thư mục" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Chá»n thư mục" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Tên tập tin" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Chế độ" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Äang thu vào : %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "Tiến hành diá»…n tấu" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "Thiết lập buzztard" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Thiết bị âm thanh" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Äiá»u khiển sá»± tương tác" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Äiá»u khiển sá»± phát lại" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Màu sắc" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Phím tắt" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Thư mục" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Thiết bị âm thanh" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "á»” chìm" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "mặc định cá»§a hệ thống: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "mặc định hệ thống: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Tần số lấy mẫu" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kênh" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "nguồn đơn" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "âm lập thể" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Bài hát" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Bản thu" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Dạng sóng" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Thiết bị" #: ../src/ui/edit/settings-page-interaction-controller.c:171 #, fuzzy msgid "Controller" msgstr "Kết hợp bá»™ Ä‘iá»u khiển" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Số thứ tá»± cổng" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "Phân tích %s -> %s" #: ../src/ui/edit/signal-analysis-dialog.c:711 #, fuzzy msgid "master analysis" msgstr "Phân tích %s -> %s" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Không tìm thấy tập tin sÆ¡ đồ Ä‘iểm ảnh: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Ngắt kết nối" #~ msgid "" #~ "Rewrote internal pipeline management. One can now play partially " #~ "connected songs, and add/remove plugins while playing. Buzztard can play " #~ "notes while editing. More robust saving of songs. Lots of bugfixes and UI " #~ "improvemnts. Better user-guide including three small tutorials. Initial " #~ "support for python and javascript via gobject introspection." #~ msgstr "" #~ "Vừa tạo lại chức năng quản lý ống dẫn ná»™i bá»™. Ngưá»i dùng giá» có khả năng " #~ "phát các bài hát được kết nối không hoàn chỉnh, và thêm/bá» phần bổ sung " #~ "trong khi phát. Trình Buzztard giá» có khả năng phát nốt trong khi chỉnh " #~ "sá»­a. Chức năng lưu bài hát giá» mạnh hÆ¡n. Có nhiá»u sá»± sá»­a chữa lá»—i và sá»± " #~ "cải tiến giao diện. CÅ©ng có sổ tay ngưá»i dùng tăng cưá»ng, gồm có ba trợ " #~ "lý nhá». Có há»— trợ đầu tiên cho python và javascript thông qua sá»± ná»™i quan " #~ "gobject." #~ msgid "Delete machine '%s'" #~ msgstr "Xoá máy « %s »" #~ msgid "Delete machine..." #~ msgstr "Xoá máy..." #~ msgid "There is no undo for this." #~ msgstr "Không có chức năng hoàn tác cho chức năng này." #~ msgid "Delete pattern '%s'" #~ msgstr "Xoá mẫu « %s »" #~ msgid "Delete pattern..." #~ msgstr "Xoá mẫu..." #~ msgid " clear" #~ msgstr " rõ" #~ msgid " mute" #~ msgstr " câm" #~ msgid " break" #~ msgstr " ngắt" #~ msgid " bypass" #~ msgstr " Ä‘i vòng" #~ msgid " solo" #~ msgstr " đơn" #~ msgid "default" #~ msgstr "mặc định" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Gặp lá»—i trong khi thá»­ nạp bài hát từ tập tin « %s »" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "Gặp lá»—i trong khi thá»­ mở tập tin « %s » để ghi vào : %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Gặp lá»—i trong khi thá»­ lưu bài hát vào tập tin « %s »." buzztard-0.6.0/po/fr.po0000644042355400116100000013313111675570705011715 00000000000000# French translation of buzztard # Copyright (C) 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the buzztard package. # # Frédéric Marchal , 2011. msgid "" msgstr "" "Project-Id-Version: buzztard-0.6.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2011-10-10 22:19+0200\n" "Last-Translator: Frédéric Marchal \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Lokalize 1.2\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Afficher la version de base de buzztard" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Options de base de Buzztard" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Montrer les options de base de buzztard" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normal" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "arrêter" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "silence" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "solo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "dérivation" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Chargement du fichier « %s »" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Sauvegarde du fichier « %s »" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "musique sans titre" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Afficher la version du contrôleur d'interaction de buzztard" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Options du contrôleur d'interaction de buzztard" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Montrer les options du contrôleur d'interaction de buzztard" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Afficher la version de l'application" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Silencieux" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Nom de commande" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Nom du fichier source" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Nom du fichier cible" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "options de buzztard en ligne de commande" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Montrer les options de buzztard en ligne de commande" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Frédéric Marchal " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Équipe de développeurs buzztard" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Environnement de production de musique" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le " "modifier suivant les termes de la « GNU Library General Public License » " "telle que publiée par la Free Software Foundation : soit la version 2 de " "cette licence, soit (à votre gré) toute version ultérieure.\n" "\n" "Ce programme est distribué dans l’espoir qu’il vous sera utile, mais SANS " "AUCUNE GARANTIE : sans même la garantie implicite de COMMERCIALISABILITÉ ni " "d’ADÉQUATION À UN OBJECTIF PARTICULIER. Consultez la Licence Générale " "Publique des Librairies GNU pour plus de détails.\n" "\n" "Vous devriez avoir reçu une copie de la Licence Générale Publique des " "Libraires GNU avec ce programme ; si ce n’est pas le cas, écrivez à la Free " "Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA " "02111-1307, USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "options d'édition buzztard" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Montrer les options d'édition de buzztard" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 #, fuzzy msgid "Buzztard Music Editor" msgstr "Options de base de Buzztard" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 #, fuzzy msgid "Edit buzztard song files" msgstr "paramètres buzztard" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "musique non sauvée" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "Récupération terminée" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "La musique sélectionnée a été récupérée avec succès." #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "Merci de vérifier la musique et de la sauver si tout est en ordre." #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "La récupération a échoué" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "Désolé, la musique sélectionnée n'a pas pu être récupérée en entier." #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" "Merci de vérifier la musique et de la sauver si elle semble toujours " "correcte." #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "Récupération de la musique non sauvée" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "Il existe des musiques non sauvées" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" "Sélectionnez les une par une et choisissez « récupérer » ou « supprimer »." #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "Fichier musical" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "Dernier changement" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "Récupérer" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Vous ne verrez aucun sonomètre." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "" "-> Vous ne verrez pas le spectre en fréquence dans la fenêtre d'analyse." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "apprendre le contrôleur pour %s" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "Déplacez ou pressez un contrôleur pour le détecter." #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "contrôle détecté" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "aucun" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Apprentissage..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Lier le contrôleur" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Délier le contrôleur" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Délier tous les contrôleurs" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "par %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "À propos..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Silence" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Dérivation" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Renommer..." #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "Connecter des machines" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Analyse du signal..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Générateurs" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Effets" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "nom et commentaire de la présélection" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "nom" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "commentaire" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "préférences de %s" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "pas de réglage" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "la machine n'a pas de réglages" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "Réinitialiser le paramètre" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "Réinitialiser tous les paramètres" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "Copier le paramètre" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Coller" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "Copier le groupe" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "propriétés globales" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "propriétés de la voix %lu" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "propriétés du fil %s" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "propriétés de %s" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Ajouter une nouvelle présélection" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Supprimer la présélection" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Éditer le nom et le commentaire de la présélection" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Présélection" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "propriétés de la machine" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Info à propos de cette machine" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Aide pour cette machine" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Rendre les paramètres aléatoires" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Réinitialiser les paramètres par défaut" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Montre/Cache le panneau de présélection" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Présélections" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "nom de %s" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "Charger une nouvelle musique ?" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "" "Une erreur est survenue pendant le chargement du son depuis le fichier « %s »" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Ne peut charger le son" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "Récupérer une musique ?" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Fichier" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Récents" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "Récupérer des musiques non sauvées" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Edition" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Affichage" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Barre d'outils" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Barre d'état" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Onglets" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "Plein écran" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Aller à l'affichage de la machine" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Aller à l'affichage des motifs" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Aller à l'affichage de la séquence" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Aller à l'affichage de la table des ondes" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Aller aux informations de la chanson" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Jouer" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Jouer depuis le curseur" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "A_ide" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "Astuce du jour" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "Joindre la discussion sur IRC" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "Rapporter un problème" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "méta données de la musique" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "genre" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "auteur" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "créé" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "battements par minute" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "battements" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "repères par battements" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "dernière sauvegarde" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "texte d'information libre" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Ajouter machine" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Supprimer silence sur toutes les machines" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Off" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Bas" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Moyen" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Haut" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Zoom avant/arrière pour rendre tout visible" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Zoom avant pour plus de détails" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Zoom arrière pour meilleure visibilité" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Grille" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Montrer la grille en arrière plan" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "Menu de vue machine" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "Actions du menu pour la vue de la machine ci-dessous" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" "Ajouter de nouvelles machines via le menu contextuel (clic droit). Connecter " "des machines avec shift+glisser de la source vers la cible." #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "Ajouter de nouveaux motifs depuis le menu contextuel (clic droit)." #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Globaux" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Voix 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Voix %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Machine" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Motif" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Onde" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Octave" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Jouer en réel" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Jouer les notes et les déclencheurs lors de l'édition du motif" #: ../src/ui/edit/main-page-patterns.c:3106 msgid "Pattern view menu" msgstr "Menu d'affichage du motif" #: ../src/ui/edit/main-page-patterns.c:3107 msgid "Menu actions for pattern view below" msgstr "Actions du menu pour la vue du motif ci-dessous" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Nouvelle piste" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Supprimer la dernière piste" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Nouveau motif..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Propriétés du motif..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Supprimer le motif..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Copier le motif..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "Propriétés de la machine" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "Préférences de la machine" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Repères" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Temps" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "Battements" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Étiquettes" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Montrer une ligne sur n" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Pas" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "Menu d'affichage de la séquence" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "Actions du menu pour la vue de la séquence ci-dessous" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Ajouter piste" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Supprimer piste" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Déplacer la piste à gauche" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Déplacer la piste à droite" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Balayer les étiquettes dans la séquence" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Clé" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Motifs" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "Ajouter de nouvelles pistes depuis le menu contextuel (clic droit)." #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Jouer l'entrée courante de la table des ondes en Do" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Arrêter de jouer l'entrée actuelle de la table des ondes" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Effacer l'entrée courante de la table des ondes" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Volume" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Boucle" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Jouer l'échantillon courant" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Arrêter de jouer l'échantillon courant" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "" "Charger l'échantillon courant dans l'entrée sélectionnée de la table des " "ondes" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Racine" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Longueur" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Débit" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Début boucle" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Fin boucle" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "machines" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "machines utilisées dans la musique et leurs fils" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "motifs" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "éditeur d'événement de motif" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "séquence" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "éditeur de séquence de musique" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "table des ondes" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "éditeur de la table des ondes des échantillons" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "information" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "éditeur des méta données de la musique" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Prêt à rocker !" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "charge CPU" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Temps" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Position" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Longueur" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Erreur" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Une erreur est survenue" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Attention" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Un problème est survenu" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Préparer une nouvelle musique vide" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Charger une nouvelle musique" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Sauver cette musique" #: ../src/ui/edit/main-toolbar.c:818 msgid "Rewind playback position of this song" msgstr "Rembobiner la position de lecture de cette musique" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Jouer cette musique" #: ../src/ui/edit/main-toolbar.c:833 msgid "Forward playback position of this song" msgstr "Avancer la position de lecture de cette musique" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Arrêter la lecture de cette musique" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Activer/désactiver le bouclage de la lecture" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "volume" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Changer le volume" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "non sauvé" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "sauvé" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "%d %s et %d %s" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "heure" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "heures" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "minute" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "minutes" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "seconde" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "secondes" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "%d %s" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "" "Tous les changements non sauvés depuis %s vont être perdus. Cette musique a " "été sauvée pour la dernière fois à %s" #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "" "Tous les changements non sauvés depuis %s vont être perdus. Cette musique a " "été créée à %s" #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Quitter ?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Nouvelle musique ?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Ouvrir une musique" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "" "Une erreur a été rencontrée lors de la sauvegarde de la musique dans le " "fichier « %s »." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Ne peut sauver la musique" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Sauver la musique" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Format" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Le fichier existe déjà" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Choisissez « Ok » pour écraser ou « Annuler » pour abandonner la sauvegarde " "de la musique." #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Une erreur a été rencontrée lors de l'écriture du fichier « %s »: %s" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "" "Une erreur a été rencontrée lors de la sauvegarde de la musique dans le " "fichier « %s »." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Élément GSreamer manquant" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Les éléments listés ci-dessous sont manquants dans votre installation mais " "sont nécessaires." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Les éléments listés ci-dessous sont manquants dans votre installation mais " "sont recommandés pour utiliser toutes les fonctionalités." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "ne plus afficher les avertissements" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Éléments manquant dans la musique" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "" "Les machines listées ci-dessous sont manquantes ou n'ont pu être chargées." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Les ondes listées ci-dessous sont manquantes ou n'ont pu être chargées" #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "longueur" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "voix" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "rendu de la musique" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Dossier" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Choisissez un dossier" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Nom de fichier" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Mode" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Enregistrement dans : %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "progression du rendu de la musique" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "paramètres buzztard" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Périphériques audio" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Contrôleur d'interaction" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Contrôleur du jeu" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Couleurs" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Raccourcis" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Répertoires" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Périphérique audio" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Collecteur" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "défaut système : %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "défaut système : -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Taux d'échantillonnage" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Canaux" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stéréo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Musiques" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Enregistrements" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Formes d'ondes" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Périphérique" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "Contrôleur" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Numéro de port" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "analyse de %s -> %s" #: ../src/ui/edit/signal-analysis-dialog.c:711 msgid "master analysis" msgstr "analyse maître" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "lin." #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "log." #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "correspondance des fréquences" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "simple" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "double" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "triple" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "précision spectrale" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" "Les nouvelles machines sont ajoutées dans l'affichage de la machine depuis " "le menu contextuel." #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" "Connectez des machines en maintenant la touche shift enfoncée et en glissant " "la connexion de la source vers la machine cible." #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" "Les musiques peuvent être enregistrées avec une piste par wav pour la " "traiter dans des remixeurs." #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" "Remplissez les détails dans la page d'info. Lors de l'enregistrement des " "musiques, les méta données sont ajoutées à l'enregistrement sous forme " "d'étiquettes." #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" "Utilisez la sortie audio jack dans les paramètres du périphérique audio pour " "obtenir une latence plus faible dans le contrôle de la machine." #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" "Vous pouvez utiliser des périphériques d'entrée tels que des joysticks en " "plus des périphériques midi pour contrôler les paramètres de la machine en " "temps réel." #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" "Vous pouvez utiliser un client upnp (par exemple un flux média sur une " "tablette nokia) pour contrôler buzztard à distance." #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" "Pour entrer des notes, imaginez que le clavier de votre pc est un clavier " "musical sur deux lignes. La touche w devient un « la », s un « la dièse », x " "un « ré », etc..." #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" "Vous pouvez obtenir plus d'aide de la part de la communauté (en anglais) sur " "irc://irc.freenode.net/#buzztard." #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" "Les dispositions des motifs sont individuels pour chaque machine. Observez " "la barre de statut en bas pour avoir des informations sur la colonne du " "curseur." #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" "Cliquez sur l'icône du haut-parleur dans la vue des motifs pour entendre les " "notes au fur et à mesure que vous les entrez." #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" "Chaque fil à des contrôles de volume et parfois de panorama ou de balance. " "Ils peuvent aussi être ajustés dans la fenêtre de la machine qui a le fil " "comme entrée." #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" "Le contrôle de volume du fil apparaît en cliquant sur la flèche de la boîte " "sur le fil." #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" "Le contrôle du panorama et de la balance du fil apparaît en shift cliquant " "sur la flèche de la boîte sur le fil si disponible." #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "Afficher les astuces au démarrage" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "N'a pu trouver le fichier pixmap : %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Déconnecter" #~ msgid "Delete machine '%s'" #~ msgstr "Effacer la machine « %s »" #~ msgid "Delete machine..." #~ msgstr "Effacement de la machine..." #~ msgid "There is no undo for this." #~ msgstr "Il n'est pas possible d'annuler cette opération." #~ msgid "Delete pattern '%s'" #~ msgstr "Supprimer motif « %s »" #~ msgid "Delete pattern..." #~ msgstr "Suppression du motif..." #~ msgid " clear" #~ msgstr " effacer" #~ msgid " mute" #~ msgstr " silence" #~ msgid " break" #~ msgstr " arrêter" #~ msgid " bypass" #~ msgstr " dérivation" #~ msgid " solo" #~ msgstr " solo" #~ msgid "default" #~ msgstr "défaut" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "" #~ "Une erreur est survenue lors du chargement de la musique depuis le " #~ "fichier « %s »" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "" #~ "Une erreur est survenue lors de l'ouverture en écriture du fichier " #~ "« %s » : %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "" #~ "Une erreur est survenue lors de la sauvegarde de la musique dans le " #~ "fichier « %s »." buzztard-0.6.0/po/nn.po0000644042355400116100000013405411675570705011726 00000000000000# Norwegian Nynorsk translation for buzztard. # This file is distributed under the same license as the buzztard package. # Eivind ØdegÃ¥rd , 2009. msgid "" msgstr "" "Project-Id-Version: buzztard 0.5.0-pre1\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2009-09-25 20:28+0100\n" "Last-Translator: Eivind ØdegÃ¥rd \n" "Language-Team: Norwegian Nynorsk \n" "Language: nn\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Norwegian Nynorsk\n" "X-Poedit-Country: NORWAY\n" "X-Poedit-Basepath: /home/eivind/umseting/buzztard\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Vis versjonsnummeret for buzztard-kjerna" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Val for Buzztard-kjerna" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Vis val for Buzztard-kjerna" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normal" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "pause" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "demp" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "solo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "forbikopla" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Lastar fila '%s'" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Lagrar fila '%s'" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "song utan namn" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Vis versjonsnummeret for buzztard-samhandlingskontrollen" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Val for buzztard-samhandlingskontrollen" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Vis val for buzztard-samhandlingskontrollen" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Vis versjonen til dette programmet" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Ver stille" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Kommandonamn" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Inngangsfilnamn" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Utangsfilnamn" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Val for Buzztard-kjerna" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Vis val for Buzztard-kjerna" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Eivind ØdegÃ¥rd " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "© 2003-%d Buzztard-utviklarlaget" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Miljø for musikkskaping" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Dette er fri programvare. Du kan vidareformidla og/eller endra henne under " "vilkÃ¥ra i GNU Library General Public-lisensen, utgjeven av Free Software " "Foundation, anten versjon 2 av lisensen, eller, om du vil, ei seinare " "utgÃ¥ve. \n" "\n" "Dette programmet er formidla i von om at det kan vera brukande, men UTAN " "NOKON GARANTI; ikkje ein gong med tanke pÃ¥ om programmet er eigna for sal " "eller brukande til eitkvart føremÃ¥l. SjÃ¥ GNU Library General Public-lisensen " "for fleire detaljar.\n" "\n" "Det skal fylgja med ei utgÃ¥ve av GNU Library General Public-lisensen saman " "med programmet. Viss ikkje, kan du kontakta Free Software Foundation Inc., " "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "Val for buzztard-redigeringa" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Vis val for buzztard-redigeringa" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "Buzztard musikkredigering" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "Redigerer buzztard-songfiler" #: ../src/ui/edit/change-log.c:544 #, fuzzy msgid "unsaved song" msgstr "Kan ikkje lagra song" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 #, fuzzy msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 #, fuzzy msgid "Last changed" msgstr "lagra" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Du kjem ikkje til Ã¥ sjÃ¥ nivÃ¥mælarar." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Du kjem ikkje til Ã¥ sjÃ¥ frekvensomfanget i analyseringsruta." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, fuzzy, c-format msgid "learn controller for %s" msgstr "Fest kontroll" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Lær..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Fest kontroll" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Løys kontroll" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Løys alle kontrollar" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "av %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Om..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Demp" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Forbikopla" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Endra namn ..." #: ../src/ui/edit/machine-canvas-item.c:764 #, fuzzy msgid "Connect machines" msgstr "maskiner" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Signalanalyse..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Generatorar" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Effektar" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "namn og merknader for ferdigoppsett" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "namn" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "merknad" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s-innstillingar" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "ingen innstillingar" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "maskina har ingen innstillinar" #: ../src/ui/edit/machine-properties-dialog.c:741 #, fuzzy msgid "Reset parameter" msgstr "Still tilbake til standardinnstillingane" #: ../src/ui/edit/machine-properties-dialog.c:746 #, fuzzy msgid "Reset all parameters" msgstr "Still tilbake til standardinnstillingane" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 #, fuzzy msgid "Copy parameter" msgstr "Kopier mønster..." #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Lim inn" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "allmenne eigenskapar" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "eigenskapar for stemma %lu" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, fuzzy, c-format msgid "%s wire properties" msgstr "%s trÃ¥deigenskapar" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s-eigenskapar" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Legg til nytt ferdigoppsett" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Fjern ferdigoppsett" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Rediger namn og merknad for ferdigoppsettet" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Ferdigoppsett" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "maskineigenskapar" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Info om denne maskina" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Hjelp for denne maskina" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Tilfeldige val" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Still tilbake til standardinnstillingane" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Vis/gøym ferdigoppsett-fana" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Ferdigoppsett" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s-namn" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 #, fuzzy msgid "Load new song?" msgstr "Opna ein ny song" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Ein feil oppstod ved lasting av songfila '%s'," #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Kan ikkje lasta song." #: ../src/ui/edit/main-menu.c:132 #, fuzzy msgid "Recover a song?" msgstr "Lagre eom spmg" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Fil" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "N_yleg brukt" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "R_ediger" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Vis" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Verktøylinje" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Statuslinje" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Faner" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "GÃ¥ til maskinvisinga" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "GÃ¥ til mønstervisinga" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "GÃ¥ til sekvensvisinga" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "GÃ¥ til bylgjetabell-visinga" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "GÃ¥ til songinformasjonen" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "Avs_peling" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Spel frÃ¥ markøren" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Hjelp" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "informasjon om songen" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "sjanger" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "forfattar" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "oppretta" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "slag per minutt" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "slag" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "tikk per taktslag" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "lagra" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "fritekstinfo" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Legg til maskin" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Fjern demping pÃ¥ alle maskiner" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Av" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "LÃ¥g" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Middels" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Høg" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Zoom inn/ut slik at alt visest" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Zoom inn for fleire detaljar" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Zoom ut for betre oversikt" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Rutenett" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Vis rutenett i bakgrunnen" #: ../src/ui/edit/main-page-machines.c:1266 #, fuzzy msgid "Machine view menu" msgstr "Maskinvising" #: ../src/ui/edit/main-page-machines.c:1267 #, fuzzy msgid "Menu actions for machine view below" msgstr "GÃ¥ til maskinvisinga" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Allmenne innstillingar" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Stemme 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Stemme %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Maskin" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Mønster" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Bylgje" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktav" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Spel live" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Spel notar og utløysarar medan du redigerer mønsteret" #: ../src/ui/edit/main-page-patterns.c:3106 #, fuzzy msgid "Pattern view menu" msgstr "Mønstervising" #: ../src/ui/edit/main-page-patterns.c:3107 #, fuzzy msgid "Menu actions for pattern view below" msgstr "GÃ¥ til mønstervisinga" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Nytt spor" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Slett siste spor" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Nytt mønster..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Eigenskapar for mønster..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Fjern eit mønster..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Kopier mønster..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 #, fuzzy msgid "Machine properties" msgstr "maskineigenskapar" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 #, fuzzy msgid "Machine preferences" msgstr "maskininnstillingar" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Tikk" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Tid" #: ../src/ui/edit/main-page-sequence.c:1093 #, fuzzy msgid "Beats" msgstr "slag" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Merkelappar" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Vis kvar n-te linje" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Steg" #: ../src/ui/edit/main-page-sequence.c:3067 #, fuzzy msgid "Sequence view menu" msgstr "Sekvensvising" #: ../src/ui/edit/main-page-sequence.c:3068 #, fuzzy msgid "Menu actions for sequence view below" msgstr "GÃ¥ til sekvensvisinga" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Legg til spor" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Fjern spor" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Flytt sporet til venstre" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Flytt sporet til høgre" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "GÃ¥ til merkelappar i sekvensen" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Nøkkel" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Mønster" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Spel denne bylgjetabelloppføringa som C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Slutt Ã¥ spela av denne bylgjetabelloppføringa" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Tøm denne bylgjetabelloppføringa" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Volum" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Spel i lykkje" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Spel denne lydbiten" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Slutt Ã¥ spela av denne lydbiten" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Last denne lydbiten til den valde bylgjetabellen" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Rot" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Lengd" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Rate" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Lykkjestart" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Lykkjeslutt" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "maskiner" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "maskiner i bruk i denne songen, og koplingane deira" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "mønster" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "hendingsmønsterredigering" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "sekvens" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "songsekvensredigering" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "bylgjetabell" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "lydbit-bylgjetabellredigering" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "informasjon" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "rediger song-informasjon" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Klar til Ã¥ rÃ¥kka hardt!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "Prosessorlast" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Avspelingstid" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Spel-posisjon" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Avspelingslengd" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Feil" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Ein feil oppstod" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Ã…tvaring" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Det oppstod eit problem" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Lag ny tom song" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Opna ein ny song" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Lagre denne songen" #: ../src/ui/edit/main-toolbar.c:818 #, fuzzy msgid "Rewind playback position of this song" msgstr "Stopp avspelinga" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Spel denne songen" #: ../src/ui/edit/main-toolbar.c:833 #, fuzzy msgid "Forward playback position of this song" msgstr "Stopp avspelinga" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Stopp avspelinga" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Skru av/pÃ¥ speling i lykkje" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "avspelingsvolum" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Endre avspelingsvolum" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "ulagra" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "lagra" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, fuzzy, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "Dersom du ikkje lagrar, vil endringane dine gÃ¥ tapt for godt." #: ../src/ui/edit/main-window.c:296 #, fuzzy, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "Dersom du ikkje lagrar, vil endringane dine gÃ¥ tapt for godt." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Er du sikker pÃ¥ at du vil avslutta?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Ny song?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Opna ein song" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ lagra songen til fila '%s'." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Kan ikkje lagra song" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Lagre eom spmg" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Format" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Fila finst allereie" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "Vel 'OK' for Ã¥ skriva over, eller 'Avbryt' for Ã¥ avbryta lagringa." #: ../src/ui/edit/main-window.c:897 #, fuzzy, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ lagra songen til fila '%s'." #: ../src/ui/edit/main-window.c:909 #, fuzzy, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ lagra songen til fila '%s'." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Manglar GStreamer-element" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "Elementa under krevst, men er ikkje med i installasjonen din." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "Elementa under er tilrÃ¥dde, men er ikkje med i installasjonen din." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "ikkje Ã¥tvar meg att" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Manglar element i songen" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Maskinene under manglar eller kunne ikkje lastast." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Bylgjene under manglar eller kunne ikkje lastast." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "lengd" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "stemmer" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "songteikning" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Mappe" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Vel ei mappe" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Filnamn" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Modus" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Tek opp til: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "framgang for songteikning" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "innstillingar for buzztard" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Lydeiningar" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Samhandlingskontroll" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Avspelingskontroll" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Farger" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Snøggtastar" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Mapper" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Lydeining" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Sluk" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "systemstandard: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "systemstandard: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Punktprøvefrekvens" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanalar" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Songar" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Opptak" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Lydbylgjer" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Eining" #: ../src/ui/edit/settings-page-interaction-controller.c:171 #, fuzzy msgid "Controller" msgstr "Fest kontroll" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Portnummer" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s-analyse" #: ../src/ui/edit/signal-analysis-dialog.c:711 #, fuzzy msgid "master analysis" msgstr "koplingsanalyse" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Fann ikkje biletefila: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Kopla frÃ¥" #~ msgid "" #~ "Rewrote internal pipeline management. One can now play partially " #~ "connected songs, and add/remove plugins while playing. Buzztard can play " #~ "notes while editing. More robust saving of songs. Lots of bugfixes and UI " #~ "improvemnts. Better user-guide including three small tutorials. Initial " #~ "support for python and javascript via gobject introspection." #~ msgstr "" #~ "Rewrote internal pipeline management. One can now play partially " #~ "connected songs, and add/remove plugins while playing. Buzztard can play " #~ "notes while editing. More robust saving of songs. Lots of bugfixes and UI " #~ "improvemnts. Better user-guide including three small tutorials. Initial " #~ "support for python and javascript via gobject introspection." #~ msgid "Delete machine '%s'" #~ msgstr "Slett maskina '%s'" #~ msgid "Delete machine..." #~ msgstr "Slett maskin..." #~ msgid "There is no undo for this." #~ msgstr "Du kan ikkje angra dette." #~ msgid "Delete pattern '%s'" #~ msgstr "Slett mønsteret '%s'" #~ msgid "Delete pattern..." #~ msgstr "Slett mønster..." #~ msgid " clear" #~ msgstr " tøm" #~ msgid " mute" #~ msgstr " demp" #~ msgid " break" #~ msgstr " pause" #~ msgid " bypass" #~ msgstr " forbikopla" #~ msgid " solo" #~ msgstr " solo" #~ msgid "default" #~ msgstr "standard" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ lasta songen frÃ¥ fila '%s'." #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ opna fila '%s' for skriving: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Det vart ein feil dÃ¥ eg prøvde Ã¥ lagra songen til fila '%s'." #~ msgid "Show version" #~ msgstr "Vis versjonsnummer" #~ msgid "" #~ "As planned, main focus for this release was the wavetable support. Its " #~ "done - buzztard can load what gstreamer can decode.The wavetable view has " #~ "a nice waveform widget. Related to that buzztard has a new song-format " #~ "that bundles the XML together with external files in a zip archive. Also " #~ "the UI has seen a lot of improvements. The machine view looks nicer - " #~ "Marc drew spiffy machine icons. In addition they now show real volume " #~ "meters when playing. All meters are now properly synced." #~ msgstr "" #~ "Kommentarar frÃ¥ utviklarane om endringar sidan sist utgÃ¥ve: Buzztard kan " #~ "no opna alt gstreamer kan handtere. Me har eit nytt lagringsformat for " #~ "songfiler: XML blir pakka saman med eksterne filer i ei zip-fil. " #~ "Brukarflata har vorte utbetra, mellom anna med nye ikon og betre " #~ "nivÃ¥mælarar." #~ msgid "interaction controller menu" #~ msgstr "meny for samhandlingskontroll" #~ msgid "interaction controllers menu" #~ msgstr "meny for samhandlingskontrollar" #~ msgid "add menu" #~ msgstr "legg til meny" #~ msgid "generators menu" #~ msgstr "generatormeny" #~ msgid "effects menu" #~ msgstr "effektmeny" #~ msgid "rename machine" #~ msgstr "gje maskina nytt namn" #~ msgid "main menu" #~ msgstr "hovudmeny" #~ msgid "file menu" #~ msgstr "filmeny" #~ msgid "New" #~ msgstr "Ny" #~ msgid "Open" #~ msgstr "Opna" #~ msgid "separator" #~ msgstr "skiljeteikn" #~ msgid "Save" #~ msgstr "Lagre" #~ msgid "Save as" #~ msgstr "Lagre som" #~ msgid "Render" #~ msgstr "Teikn" #~ msgid "Quit" #~ msgstr "Avslutt" #~ msgid "edit menu" #~ msgstr "redigeringsmeny" #~ msgid "Cut" #~ msgstr "Klypp ut" #~ msgid "Copy" #~ msgstr "Kopier" #~ msgid "Delete" #~ msgstr "Slett" #~ msgid "Settings" #~ msgstr "Innstillingar" #~ msgid "view menu" #~ msgstr "visingsmeny" #~ msgid "Wave table view" #~ msgstr "Bylgjetabellvising" #~ msgid "Song information" #~ msgstr "Songinformasjon" #~ msgid "playback menu" #~ msgstr "avspelingsmeny" #~ msgid "Play" #~ msgstr "Spel av" #~ msgid "Stop" #~ msgstr "Stopp" #~ msgid "help menu" #~ msgstr "hjelpemeny" #~ msgid "Content" #~ msgstr "Innhald" #~ msgid "About" #~ msgstr "Om" #~ msgid "song information" #~ msgstr "songinformasjon" #~ msgid "machine view" #~ msgstr "maskinvising" #~ msgid "machine view toolbar" #~ msgstr "maskinvising-verktøylinje" #~ msgid "Zoom Fit" #~ msgstr "Zoom alt" #~ msgid "Zoom In" #~ msgstr "Zoom inn" #~ msgid "Zoom Out" #~ msgstr "Zoom ut" #~ msgid "machine and wire editor" #~ msgstr "maskin- og koplingsredigering" #~ msgid "Delete unused pattern '%s'" #~ msgstr "Slett det ubrukte mønsteret '%s'" #~ msgid "pattern view" #~ msgstr "mønstervising" #~ msgid "pattern view toolbar" #~ msgstr "mønstervising-verktøylinje" #~ msgid "pattern editor" #~ msgstr "mønster-redigering" #~ msgid " thru" #~ msgstr " gjennom" #~ msgid "sequence view" #~ msgstr "sekvensvising" #~ msgid "sequence view toolbar" #~ msgstr "sekvensvising-verktøylinje" #~ msgid "sequence editor" #~ msgstr "sekvensredigering" #~ msgid "pattern list for sequence track" #~ msgstr "mønsterliste for sekvenssporet" #~ msgid "wave table view" #~ msgstr "bylgjetabellvising" #~ msgid "sample list toolbar" #~ msgstr "lydbit-verktøylinje" #~ msgid "Clear" #~ msgstr "Tøm" #~ msgid "wave list" #~ msgstr "bylgjeliste" #~ msgid "sample browser toolbar" #~ msgstr "verktøylinje for Ã¥ sjÃ¥ etter lydbitar" #~ msgid "sample edit toolbar" #~ msgstr "lydbitredigering-verktøylinje" #~ msgid "wave-level list" #~ msgstr "bylgenivÃ¥liste" #~ msgid "song views" #~ msgstr "songvisingar" #~ msgid "main toolbar" #~ msgstr "hovudverktøylinje" #~ msgid "main window" #~ msgstr "hovudvindauge" #~ msgid "pattern properties" #~ msgstr "eigenskapar for mønsteret" #~ msgid "settings pages" #~ msgstr "innstillingssider" #~ msgid "color settings" #~ msgstr "fargeinnstillingar" #~ msgid "keyboard shortcut settings" #~ msgstr "innstillingar for snøggtastar" #~ msgid "audio device settings" #~ msgstr "innstillingar for lydeiningar" #~ msgid "default directory settings" #~ msgstr "standard mappeinnstillingar" #~ msgid "interaction controller settings" #~ msgstr "innstillingar for samhandlingskontroll" #~ msgid "playback controller settings" #~ msgstr "innstillingar for avspelingskontroll" #~ msgid "Coherence UPnP" #~ msgstr "Samanheng UPnP" buzztard-0.6.0/po/LINGUAS0000644042355400116100000000004111675570705011764 00000000000000cs da de fr fi id nl nn vi zh_CN buzztard-0.6.0/po/Makevars0000644042355400116100000000373211675570705012445 00000000000000# Makefile variables for PO directory in any package using GNU gettext. # 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=_ --keyword=N_ # 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 = Buzztard project team # 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 = buzztard-devel@lists.sourceforge.net # 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 = # Avoid line numbers in *.po, but keep them in *.pot. MSGMERGE = msgmerge --no-location MSGMERGE_UPDATE = msgmerge --no-location --update MSGFILTER = msgfilter --no-location buzztard-0.6.0/po/POTFILES.in0000644042355400116100000000325311675570705012524 00000000000000[encoding: UTF-8] src/lib/buzztard.xml.in src/lib/core/application.c src/lib/core/core.c src/lib/core/pattern.c src/lib/core/song-io-native.c src/lib/core/song-io-native-bzt.c src/lib/core/song-io-native-xml.c src/lib/core/song-info.c src/lib/ic/ic.c src/ui/cmd/bt-cmd.c src/ui/cmd/cmd-application.c src/ui/edit/about-dialog.c src/ui/edit/bt-edit.c src/ui/edit/buzztard-edit.desktop.in src/ui/edit/change-log.c src/ui/edit/crash-recover-dialog.c src/ui/edit/edit-application.c src/ui/edit/interaction-controller-learn-dialog.c src/ui/edit/interaction-controller-menu.c src/ui/edit/machine-actions.c src/ui/edit/machine-canvas-item.c src/ui/edit/machine-menu.c src/ui/edit/machine-preset-properties-dialog.c src/ui/edit/machine-preferences-dialog.c src/ui/edit/machine-properties-dialog.c src/ui/edit/machine-rename-dialog.c src/ui/edit/main-menu.c src/ui/edit/main-page-info.c src/ui/edit/main-page-machines.c src/ui/edit/main-page-patterns.c src/ui/edit/main-page-sequence.c src/ui/edit/main-page-waves.c src/ui/edit/main-pages.c src/ui/edit/main-statusbar.c src/ui/edit/main-toolbar.c src/ui/edit/main-window.c src/ui/edit/missing-framework-elements-dialog.c src/ui/edit/missing-song-elements-dialog.c src/ui/edit/pattern-properties-dialog.c src/ui/edit/render-dialog.c src/ui/edit/render-progress.c src/ui/edit/settings-dialog.c src/ui/edit/settings-page-audiodevices.c src/ui/edit/settings-page-directories.c src/ui/edit/settings-page-interaction-controller.c src/ui/edit/settings-page-playback-controller.c src/ui/edit/settings-page-shortcuts.c src/ui/edit/signal-analysis-dialog.c src/ui/edit/tip-dialog.c src/ui/edit/tools.c src/ui/edit/volume-popup.c src/ui/edit/wire-canvas-item.c buzztard.schemas buzztard-0.6.0/po/POTFILES.skip0000644042355400116100000000022511675570705013060 00000000000000design/gui/buzztard.glade design/gui/sequence.glade src/ui/edit/buzztard-edit.desktop.in.in src/ui/edit/buzztard-edit.desktop.in buzztard.schemas.in buzztard-0.6.0/po/nl.po0000644042355400116100000013352511675570705011726 00000000000000# translation of buzztard-0.4.po to Nederlands # This file is distributed under the same license as the buzztard package. # Erwin Poeze , 2008. msgid "" msgstr "" "Project-Id-Version: buzztard-0.5.0-pre1\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2009-07-22 18:33+0100\n" "Last-Translator: Erwin Poeze \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Poedit-Language: Dutch\n" "X-Poedit-Country: NETHERLANDS\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-Bookmarks: 142,-1,-1,-1,-1,-1,-1,-1,-1,-1\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Versie buzztardkern tonen" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Opties buzztardkern" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Opties buzztardkern tonen" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normaal" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "onderbreken" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "dempen" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "solo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "omleiding" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Bestand '%s' laden" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Bestand '%s' bewaren" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "nummer zonder titel" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Versie interactieregelaar tonen" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Opties interactieregelaar" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Opties interactieregelaar tonen" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Programmaversie tonen" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Wees stil" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Naam opdracht" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Naam invoerbestand" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Naam uitvoerbestand" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Opties buzztard-cmd" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Opties buzztard-cmd tonen" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Erwin Poeze " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Buzztard-ontwikkelteam" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Omgeving voor muziekproductie" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Dit pakket is vrije software. U kunt het herdistribueren en/of aanpassen " "onder de voorwaarden van de GNU Library Public License zoals gepubliceerd " "door de Free Software Foundation; ofwel versie 2 van de licentie, ofwel " "iedere latere versie (naar uw keuze).\n" "\n" "Dit pakket is verspreid in de hoop dat het bruikbaar zal zijn, maar ZONDER " "ENIGE GARANTIE; zelfs zonder de gesuggereerde waarborg van VERHANDELBAARHEID " "of BRUIKBAARHEID VOOR EEN BEPAALD DOEL. Zie de GNU Library General Public " "Licence voor meer details.\n" "\n" "Samen met dit pakket moet een u kopie van de GNU Library General Public " "License ontvangen hebben; zo niet, schrijft dan naar Free Software " "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "Opties Buzztard-bewerken" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Opties Buzztard-bewerken tonen" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "Buzztardmuziekbewerker" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "Buzztardnummerbestanden bewerken" #: ../src/ui/edit/change-log.c:544 #, fuzzy msgid "unsaved song" msgstr "Nummer kan niet bewaard worden" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 #, fuzzy msgid "Song file" msgstr "" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 #, fuzzy msgid "Last changed" msgstr "Recent bewaard" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> u zult geen niveaumeters zien." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> u zult het frequentiespectrum in het analysescherm niet zien." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, fuzzy, c-format msgid "learn controller for %s" msgstr "Regelaar koppelen" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Leren..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Regelaar koppelen" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Regelaar ontkoppelen" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Alle regelaars ontkoppelen" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "door %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Over..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Dempen" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Omleiding" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Hernoem..." #: ../src/ui/edit/machine-canvas-item.c:764 #, fuzzy msgid "Connect machines" msgstr "machines" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Signaalanalyse..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Generatoren" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Effecten" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "voorinstelling naam en opmerking" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "naam" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "opmerking" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s-voorkeuren" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "geen instellingen" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "machine heeft geen voorkeuren" #: ../src/ui/edit/machine-properties-dialog.c:741 #, fuzzy msgid "Reset parameter" msgstr "Parameters terugzetten naar standaardwaarden" #: ../src/ui/edit/machine-properties-dialog.c:746 #, fuzzy msgid "Reset all parameters" msgstr "Parameters terugzetten naar standaardwaarden" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 #, fuzzy msgid "Copy parameter" msgstr "Kopieer patroon..." #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Plak" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "algemene eigenschappen" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "stem-%lu-eigenschappen" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "%s signaaleigenschappen" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s-eigenschappen" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Nieuwe voorinstelling toevoegen" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Voorinstelling verwijderen" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Vooringestelde naam en opmerking bewerken" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Voorinstelling" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "machine-eigenschappen" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Informatie over deze machine" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Hulp voor deze machine" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Parameters willekeurig maken" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Parameters terugzetten naar standaardwaarden" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Paneel voorinstellingen tonen/verbergen" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Voorinstellingen" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s-naam" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 #, fuzzy msgid "Load new song?" msgstr "Nieuw nummer laden" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Laden van het nummer uit bestand '%s' is mislukt" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Nummer kan niet worden geladen" #: ../src/ui/edit/main-menu.c:132 #, fuzzy msgid "Recover a song?" msgstr "Nummer bewaren" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Bestand" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Recent gebruikt" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "B_ewerk" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Beeld" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Werkbalk" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "statusbalk" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Tabbladen" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Naar machineweergave gaan" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Naar patroonweergave gaan" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Naar reeksweergave gaan" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Naar golftabelweergave gaan" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Naar nummerinformatie gaan" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Afspelen" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Vanaf cursor spelen" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Hulp" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "metagegevens nummer" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "genre" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "auteur" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "gemaakt" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "slagen per minuut" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "slagen" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "tikken per slag" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "Recent bewaard" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "vrije informatietekst" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Machine toevoegen" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Demping van alle machines verwijderen" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Uitschakelen" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Laag" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Middel" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Hoog" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Zoom uitersten" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Zoom verder in" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Zoom verder uit" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Rooster" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Achtergrondrooster tonen" #: ../src/ui/edit/main-page-machines.c:1266 #, fuzzy msgid "Machine view menu" msgstr "Machineweergave" #: ../src/ui/edit/main-page-machines.c:1267 #, fuzzy msgid "Menu actions for machine view below" msgstr "Naar machineweergave gaan" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Algemeen" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Stem 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Stem %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Machine" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Patroon" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Golf" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Octaaf" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "'Live' afspelen" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Speel noten en triggers tijdens de patroonbewerking" #: ../src/ui/edit/main-page-patterns.c:3106 #, fuzzy msgid "Pattern view menu" msgstr "Patroonweergave" #: ../src/ui/edit/main-page-patterns.c:3107 #, fuzzy msgid "Menu actions for pattern view below" msgstr "Naar patroonweergave gaan" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Nieuw nummer" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Laatste nummer verwijderen" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Nieuw patroon..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Patrooneigenschappen..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Verwijder patroon..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Kopieer patroon..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 #, fuzzy msgid "Machine properties" msgstr "machine-eigenschappen" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 #, fuzzy msgid "Machine preferences" msgstr "machinevoorkeuren" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Tikken" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Tijd" #: ../src/ui/edit/main-page-sequence.c:1093 #, fuzzy msgid "Beats" msgstr "slagen" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Labels" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Iedere n-de regel tonen" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Stappen" #: ../src/ui/edit/main-page-sequence.c:3067 #, fuzzy msgid "Sequence view menu" msgstr "Reeksweergave" #: ../src/ui/edit/main-page-sequence.c:3068 #, fuzzy msgid "Menu actions for sequence view below" msgstr "Naar reeksweergave gaan" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Nummer toevoegen" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Nummer verwijderen" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Nummer links verplaatsen" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Nummer rechts verplaatsen" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Naar labels in reeks bladeren" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Sleutel" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Patronen" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Huidige golftabelitem afspelen als C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Afspelen huidige golftabelitem beëindigen" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Huidige golftabelitem wissen" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Geluidsterkte" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Lus" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Huidige sample afspelen" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Afspelen huidige sample stoppen" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Huidige sample in geselecteerde golftabelitem laden" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Basis" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Lengte" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Snelheid" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Begin lus" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Einde lus" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "machines" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "machines gebruikt in nummers en hun signalen" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "patronen" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "bewerker gebeurtenispatroon" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "reeks" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "bewerker nummerreeks" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "golftabel" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "bewerker sample-golftabel" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "informatie" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "bewerker metagegevens van nummer" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Klaar om te gaan!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "belasting processor" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Afspeeltijd" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Afspeelpositie" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Afspeelduur" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Fout" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Fout opgetreden" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Waarschuwing" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Probleem opgetreden" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Nieuw, leeg nummer voorbereiden" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Nieuw nummer laden" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Nummer bewaren" #: ../src/ui/edit/main-toolbar.c:818 #, fuzzy msgid "Rewind playback position of this song" msgstr "Afspelen van dit nummer stoppen" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Nummer afspelen" #: ../src/ui/edit/main-toolbar.c:833 #, fuzzy msgid "Forward playback position of this song" msgstr "Afspelen van dit nummer stoppen" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Afspelen van dit nummer stoppen" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Herhalen afspelen aan/uit" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "geluidsterkte bij afspelen" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "geluidsterkte bij afspelen veranderen" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "Niet bewaard" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "Bewaard" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "" #: ../src/ui/edit/main-window.c:294 #, fuzzy, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "Veranderingen die niet bewaard zijn gaan dan verloren." #: ../src/ui/edit/main-window.c:296 #, fuzzy, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "Veranderingen die niet bewaard zijn gaan dan verloren." #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Echt afsluiten?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Nieuw nummer?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Nummer openen" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Bewaren van het nummer in bestand '%s' is mislukt." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Nummer kan niet bewaard worden" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Nummer bewaren" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Indeling" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Bestand bestaat al" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Kies 'OK' om het nummer te overschrijven, 'Annuleren' om het bewaren af te " "breken." #: ../src/ui/edit/main-window.c:897 #, fuzzy, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Bewaren van het nummer in bestand '%s' is mislukt." #: ../src/ui/edit/main-window.c:909 #, fuzzy, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Bewaren van het nummer in bestand '%s' is mislukt." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Ontbrekende onderdelen van GStreamer" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "De onderstaande elementen ontbreken in uw installatie, maar zijn wel vereist." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "De onderstaande elementen ontbreken in uw installatie, maar zijn wel " "aanbevolen voor een volledige functionaliteit." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "niet opnieuw waarschuwen" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Ontbrekende elementen in nummer" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "De onderstaande machines ontbreken of kunnen niet worden geladen." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "De onderstaande golven ontbreken of kunnen niet geladen worden" #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "lengte" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "stemmen" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "nummervertolking" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Map" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Selecteer een map" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Bestandsnaam" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Modus" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Opnemen naar: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "voorgang nummervertolking" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "Buzztard-instellingen" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Geluidsapparaten" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Interactieregelaar" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Afspeelregelaar" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Kleuren" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Snelkoppelingen" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Mappen" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Geluidsapparaat" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Put" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "systeemstandaard: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "systeemstandaard: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Monsterfrequentie" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanalen" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Nummers" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Opnamen" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Golfvormen" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Apparaat" #: ../src/ui/edit/settings-page-interaction-controller.c:171 #, fuzzy msgid "Controller" msgstr "Regelaar koppelen" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Poortnummer" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "analyse %s -> %s" #: ../src/ui/edit/signal-analysis-dialog.c:711 #, fuzzy msgid "master analysis" msgstr "signaalanalyse" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Kan afbeeldingsbestand %s niet vinden" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Verbreken" #~ msgid "Delete machine '%s'" #~ msgstr "Machine '%s' verwijderen" #~ msgid "Delete machine..." #~ msgstr "Machine verwijderen..." #~ msgid "There is no undo for this." #~ msgstr "Dit kan niet ongedaan gemaakt worden." #~ msgid "Delete pattern '%s'" #~ msgstr "Patroon '%s' verwijderen" #~ msgid "Delete pattern..." #~ msgstr "Patroon verwijderen..." #~ msgid " clear" #~ msgstr " wissen" #~ msgid " mute" #~ msgstr " dempen" #~ msgid " break" #~ msgstr " onderbreken" #~ msgid " bypass" #~ msgstr " omleiding" #~ msgid " solo" #~ msgstr " solo" #~ msgid "default" #~ msgstr "standaard" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Laden van het nummer uit bestand '%s' is mislukt" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "Het openen van bestand '%s' om %s naar te schrijven is mislukt." #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Het bewaren van het nummer naar bestand '%s' is mislukt." #~ msgid "Show version" #~ msgstr "Versie tonen" #~ msgid "" #~ "As planned, main focus for this release was the wavetable support. Its " #~ "done - buzztard can load what gstreamer can decode.The wavetable view has " #~ "a nice waveform widget. Related to that buzztard has a new song-format " #~ "that bundles the XML together with external files in a zip archive. Also " #~ "the UI has seen a lot of improvements. The machine view looks nicer - " #~ "Marc drew spiffy machine icons. In addition they now show real volume " #~ "meters when playing. All meters are now properly synced." #~ msgstr "" #~ "De nadruk in deze uitgave ligt op de ondersteuning van de golftabel. " #~ "Buzztard kan alles laden wat gstreamer kan decoderen. De golftabel heeft " #~ "een mooie golfvormassistent. Daaraan gerelateerd heeft Buzztard een " #~ "nieuwe nummerstructuur dat de XML samenbundelt met externe bestanden in " #~ "een zip-achief. Ook heeft de grafische interface vele verbeteringen " #~ "ondergaan. De machineweergave toont prettiger; Marc tekende strakke " #~ "machinepictogrammen. Daarnaast tonen ze nu echte geluidsterktemeters " #~ "tijdens het afspelen. Alle meters zijn nu correct gesynchroniseerd." #~ msgid "interaction controller menu" #~ msgstr "menu interactieregelaar" #~ msgid "interaction controllers menu" #~ msgstr "menu interactieregelaars" #~ msgid "add menu" #~ msgstr "menu toevoegen" #~ msgid "generators menu" #~ msgstr "menu generatoren" #~ msgid "effects menu" #~ msgstr "menu effecten" #~ msgid "rename machine" #~ msgstr "machine hernoemen" #~ msgid "main menu" #~ msgstr "hoofdmenu" #~ msgid "file menu" #~ msgstr "menu bestand" #~ msgid "New" #~ msgstr "Nieuw" #~ msgid "Open" #~ msgstr "Open" #~ msgid "separator" #~ msgstr "scheidingsteken" #~ msgid "Save" #~ msgstr "Opslaan" #~ msgid "Save as" #~ msgstr "Opslaan als" #~ msgid "Render" #~ msgstr "Vertolken" #~ msgid "Quit" #~ msgstr "Beëindig" #~ msgid "edit menu" #~ msgstr "menu bewerk" #~ msgid "Cut" #~ msgstr "Knip" #~ msgid "Copy" #~ msgstr "Kopieer" #~ msgid "Delete" #~ msgstr "Verwijder" #~ msgid "Settings" #~ msgstr "Instellingen" #~ msgid "view menu" #~ msgstr "menu beeld" #~ msgid "Wave table view" #~ msgstr "Golftabelweergave" #~ msgid "Song information" #~ msgstr "Nummerinformatie" #~ msgid "playback menu" #~ msgstr "menu afspelen" #~ msgid "Play" #~ msgstr "Afspelen" #~ msgid "Stop" #~ msgstr "Stop" #~ msgid "help menu" #~ msgstr "menu hulp" #~ msgid "Content" #~ msgstr "Inhoud" #~ msgid "About" #~ msgstr "Over" #~ msgid "song information" #~ msgstr "nummerinformatie" #~ msgid "machine view" #~ msgstr "machineweergave" #~ msgid "machine view toolbar" #~ msgstr "werkbalk machineweergave" #~ msgid "Zoom Fit" #~ msgstr "Zoom passend" #~ msgid "Zoom In" #~ msgstr "Zoom in" #~ msgid "Zoom Out" #~ msgstr "Zoom uit" #~ msgid "machine and wire editor" #~ msgstr "machine en signaalbewerker" #~ msgid "Delete unused pattern '%s'" #~ msgstr "Ongebruikt patroon '%s' verwijderen" #~ msgid "pattern view" #~ msgstr "patroonweergave" #~ msgid "pattern view toolbar" #~ msgstr "werkbalk patroonweergave" #~ msgid "pattern editor" #~ msgstr "Patroonbewerker" #~ msgid " thru" #~ msgstr " doorgaan" #~ msgid "sequence view" #~ msgstr "reeksweergave" #~ msgid "sequence view toolbar" #~ msgstr "werkbalk reeksweergave" #~ msgid "sequence editor" #~ msgstr "reeksbewerker" #~ msgid "pattern list for sequence track" #~ msgstr "patroonlijst voor reeksnummer" #~ msgid "wave table view" #~ msgstr "golftabelweergave" #~ msgid "sample list toolbar" #~ msgstr "werkbalk samplelijst" #~ msgid "Clear" #~ msgstr "Wissen" #~ msgid "wave list" #~ msgstr "golflijst" #~ msgid "sample browser toolbar" #~ msgstr "werkbalk sample-browser" #~ msgid "sample edit toolbar" #~ msgstr "werkbalk sample-bewerker" #~ msgid "wave-level list" #~ msgstr "lijst golfniveau" #~ msgid "song views" #~ msgstr "nummerweergaven" #~ msgid "main toolbar" #~ msgstr "Hoofdwerkbalk" #~ msgid "main window" #~ msgstr "Hoofdscherm" #~ msgid "pattern properties" #~ msgstr "patrooneigenschappen" #~ msgid "settings pages" #~ msgstr "instellingspagina's" #~ msgid "color settings" #~ msgstr "Kleurinstellingen" #~ msgid "keyboard shortcut settings" #~ msgstr "instellingen sneltoetsen" #~ msgid "audio device settings" #~ msgstr "instellingen geluidsapparaat" #~ msgid "default directory settings" #~ msgstr "standaard mapinstellingen" #~ msgid "interaction controller settings" #~ msgstr "instellingen interactieregelaar" #~ msgid "playback controller settings" #~ msgstr "instellingen afspeelregelaar" #~ msgid "Coherence UPnP" #~ msgstr "Coherentie UPnP" buzztard-0.6.0/po/zh_CN.po0000644042355400116100000011342411675570705012312 00000000000000# Chinese simplified translation for buzztard. # Copyright (C) buzztard's authors. # This file is distributed under the same license as the buzztard package. # Wylmer Wang , 2011. # msgid "" msgstr "" "Project-Id-Version: buzztard-0.6.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-10-07 21:35+0200\n" "PO-Revision-Date: 2011-12-20 10:13+0800\n" "Last-Translator: Wylmer Wang \n" "Language-Team: Chinese (simplified) \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "æ‰“å° buzztard 核心版本" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Buzztard 核心选项" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "显示 buzztard 核心选项" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "正常" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "é™éŸ³" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "正在加载文件“%sâ€" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "正在ä¿å­˜æ–‡ä»¶â€œ%sâ€" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "无标题歌曲" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "æ‰“å° buzztard 交互控制器版本" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Buzztard 交互控制器选项" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "显示 Buzztard 交互控制器选项" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "打å°åº”用程åºç‰ˆæœ¬" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "ä¿æŒå®‰é™" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "命令å" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "输入文件å" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "<歌曲文件>" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "输出文件å" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "buzztard-cmd 选项" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "显示 buzztard-cmd 选项" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Wylmer Wang " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "ç‰ˆæƒæ‰€æœ‰ © 2003-%d Buzztard å¼€å‘组" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "音ä¹åˆ›ä½œçŽ¯å¢ƒ" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License along with this package; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "Main feature of this release is full undo/redo support. Related to it is the journaling of edit action and the crash recovery. This way chances of losing changes in the song are quite low. Other UI improvements are: tip of day, improved spectrum analyzer, clipboard support, more commands in context menus and many more). This release features a gstreamer decoder that enables playback of buzztard songs in any gstreamer based media player. We also kept the buzztard codebase clean and ported from deprecated APIs to the successors (gnomevfs->gio, hal->gudev). The libraries and the applications got performance improvements in many areas. Also the docs have been improved a lot with tutorials, keyboard shortcut tables, better coverage and man-pages. " msgstr "这一å‘布版本的主è¦ç‰¹æ€§æ˜¯å®Œæ•´çš„æ’¤æ¶ˆ/é‡å𿔝æŒã€‚程åºå…·æœ‰ç›¸åº”的编辑æ“作日志和崩溃æ¢å¤åŠŸèƒ½ã€‚è¿™æ ·å¯¹æ­Œæ›²çš„æ›´æ”¹ä¸¢å¤±çš„å¯èƒ½æ€§å°†å¾ˆå°ã€‚其他用户界é¢ä¸Šçš„æ”¹è¿›åŒ…æ‹¬ï¼šæ¯æ—¥æŠ€å·§æç¤ºã€æ”¹è¿›çš„频谱分æžå™¨ã€å‰ªè´´æ¿æ”¯æŒã€ä¸Šä¸‹æ–‡èœå•中的选项更多,等等。这一版本加入了一个 gstreamer è§£ç å™¨ï¼Œå¯èƒ½åœ¨ä»»ä½•基于 gstreamer 的媒体播放器中播放 buzztard 歌曲。我们也清ç†äº† buzztard 的代ç åº“,并由废弃的 API è¿ç§»åˆ°äº†å…¶ç»§æ‰¿è€…(gnomevfs->gio,hal->gudev)ã€‚åº“å’Œåº”ç”¨ç¨‹åºæ€§èƒ½åœ¨å¾ˆå¤šæ–¹é¢æœ‰æ‰€æé«˜ã€‚文档也有所改进,加入了å‘导ã€é”®ç›˜å¿«æ·é”®è¡¨ï¼Œå†…容更全é¢ï¼Œå®Œå–„了 man-pages等。" #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "buzztard-edit 选项" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "显示 buzztard-edit 选项" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "未ä¿å­˜çš„æ­Œæ›²" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "æ¢å¤å®Œæˆ" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "所选的歌曲已æˆåŠŸæ¢å¤ã€‚" #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "请检查此歌曲,若一切无误,对它进行ä¿å­˜ã€‚" #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "æ¢å¤å¤±è´¥" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "抱歉,无法完整æ¢å¤æ‰€é€‰çš„æ­Œæ›²ã€‚" #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "请检查该歌曲,如果æ¢å¤ç»“果尚å¯ï¼Œå¯¹å®ƒè¿›è¡Œä¿å­˜ã€‚" #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "未ä¿å­˜çš„æ­Œæ›²æ¢å¤" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "有未ä¿å­˜çš„æ­Œæ›²" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "é€ä¸ªé€‰æ‹©å®ƒä»¬ï¼Œå¹¶é€‰æ‹©â€œæ¢å¤â€æˆ–“删除â€ã€‚" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "歌曲文件" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "上次更改" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "æ¢å¤" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "" #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "" #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "æ— " #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "关于..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "é™éŸ³" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "改å..." #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "ä¿¡å·åˆ†æž..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "效果" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "预设å称和注释" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "åç§°" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "注释" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s å好设置" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "无设置" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "é‡è®¾å‚æ•°" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "é‡è®¾æ‰€æœ‰å‚æ•°" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "å¤åˆ¶å‚æ•°" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "粘贴" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "å¤åˆ¶ç»„" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "全局属性" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "声音 %lu 属性" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s 属性" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "添加新预设" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "移除预设" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "编辑预设å称和注释" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "预设" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "éšæœºåŒ–傿•°" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "将傿•°é‡è®¾ä¸ºé»˜è®¤å€¼" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "显示/éšè—é¢„è®¾é¢æ¿" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "预设" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s åç§°" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "加载新歌曲?" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "从文件“%sâ€åŠ è½½æ­Œæ›²æ—¶å‘生了一个错误" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "无法加载歌曲" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "æ¢å¤æ­Œæ›²ï¼Ÿ" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "文件(_F)" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "最近使用的(_R)" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "æ¢å¤æœªä¿å­˜çš„æ­Œæ›²" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "编辑(_E)" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "视图(_V)" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "工具æ " #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "çŠ¶æ€æ " #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "标签" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "å…¨å±" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "转到歌曲信æ¯" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "播放(_P)" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "从光标处播放" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "帮助(_H)" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "æ¯æ—¥æŠ€å·§æç¤º" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "å‚与 IRC 讨论" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "报告一个问题" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "歌曲元数æ®" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "æµæ´¾" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "作者" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "创建日期" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "上次ä¿å­˜" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "å…³" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "低" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "中" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "高" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "放大/缩å°ä»¥çœ‹åˆ°æ‰€æœ‰å†…容" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "放大以查看更多细节" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "缩å°ä»¥æ›´å¥½åœ°æŸ¥çœ‹å…¨è²Œ" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "网格" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "显示背景网格" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "Add new machines from right click context menu. Connect machines with shift+drag from source to target." msgstr "" #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "" #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "全局" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "声音 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "声音 %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3106 msgid "Pattern view menu" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3107 msgid "Menu actions for pattern view below" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "新音轨" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "" #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "" #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "æ—¶é—´" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "" #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "长度" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "CPU è´Ÿè½½" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "播放时间" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "播放ä½ç½®" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "播放长度" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "错误" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "å‘生了错误" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "警告" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "出现了一个问题" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "准备新的空白歌曲" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "加载新歌曲" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "ä¿å­˜æ­¤æ­Œæ›²" #: ../src/ui/edit/main-toolbar.c:818 msgid "Rewind playback position of this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "播放此歌曲" #: ../src/ui/edit/main-toolbar.c:833 msgid "Forward playback position of this song" msgstr "" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "åœæ­¢å›žæ”¾æ­¤æ­Œæ›²" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "切æ¢å¾ªçŽ¯æ’­æ”¾" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "播放音é‡" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "更改播放音é‡" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "未ä¿å­˜" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "å·²ä¿å­˜" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "å°æ—¶" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "å°æ—¶" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "分钟" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "分钟" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "ç§’" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "ç§’" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "%d %s" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "自 %s 之åŽçš„æœªä¿å­˜æ›´æ”¹å°†ä¸¢å¤±ã€‚此歌曲上次ä¿å­˜äºŽï¼š%s" #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "自 %s 之åŽçš„æœªä¿å­˜æ›´æ”¹å°†ä¸¢å¤±ã€‚此歌曲创建于:%s" #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "真的退出å—?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "新建歌曲?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "打开歌曲" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "在ä¿å­˜æ­Œæ›²åˆ°æ–‡ä»¶â€œ%sâ€æ—¶å‡ºçŽ°äº†ä¸€ä¸ªé”™è¯¯ã€‚" #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "无法ä¿å­˜æ­Œæ›²" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "ä¿å­˜æ­Œæ›²" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "æ ¼å¼" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "文件已存在" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "选择“确定â€è¦†ç›–æ–‡ä»¶ï¼Œæˆ–â€œå–æ¶ˆâ€ä¸­æ­¢ä¿å­˜æ­Œæ›²ã€‚" #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "在写入文件“%sâ€æ—¶å‘生了一个错误:%s" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "在将歌曲ä¿å­˜åˆ°æ–‡ä»¶â€œ%sâ€æ—¶å‘生了一个错误。" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "缺少 GStreamer 元素" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "The elements listed below are missing from your installation, but are required." msgstr "需è¦ä¸‹åˆ—元素,但它们没有安装。" #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "The elements listed below are missing from your installation, but are recommended for full functionality." msgstr "下列元素没有安装;为了功能完整,建议安装它们。" #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "ä¸è¦å†è­¦å‘Šäº†" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "歌曲中缺少元素" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "" #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "" #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "长度" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "声音" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "歌曲渲染" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "文件夹" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "选择文件夹" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "文件å" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "模å¼" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "" #: ../src/ui/edit/render-progress.c:146 msgid "song render progress" msgstr "歌曲渲染过程" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "buzztard 设置" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "音频设备" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "交互控制器" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "播放控制器" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "颜色" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "å¿«æ·é”®" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "目录" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "音频设备" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "系统默认:%s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "系统默认: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "采样率" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "声é“" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "å•声é“" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "立体声" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "歌曲" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "波形" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "设备" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "控制器" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "端å£å·" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:702 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s 分æž" #: ../src/ui/edit/signal-analysis-dialog.c:707 msgid "master analysis" msgstr "主分æž" #: ../src/ui/edit/signal-analysis-dialog.c:766 msgid "lin." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:767 msgid "log." msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "frequency mapping" msgstr "频率映射" #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "single" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:775 msgid "double" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:776 msgid "triple" msgstr "" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "spectrum precision" msgstr "频谱精度" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "" #: ../src/ui/edit/tip-dialog.c:49 msgid "Connect machines by holding the shift key and dragging a connection for the source to the target machine." msgstr "" #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" #: ../src/ui/edit/tip-dialog.c:51 msgid "Fill the details on the info page. When recording songs, the metadata is added to the recording as tags." msgstr "" #: ../src/ui/edit/tip-dialog.c:52 msgid "Use jackaudio sink in audio device settings to get lower latencies for live machine control." msgstr "" #: ../src/ui/edit/tip-dialog.c:53 msgid "You can use input devices such as joysticks, beside midi devices to live control machine parameters." msgstr "" #: ../src/ui/edit/tip-dialog.c:54 msgid "You can use a upnp media client (e.g. media streamer on nokia tablets) to remote control buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:55 msgid "To enter notes, imagine your pc keyboard as a music keyboard in two rows. Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" #: ../src/ui/edit/tip-dialog.c:56 msgid "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" #: ../src/ui/edit/tip-dialog.c:57 msgid "Pattern layouts are individual for each machine. Look at the statusbar at the bottom for information about the cursor-column." msgstr "" #: ../src/ui/edit/tip-dialog.c:58 msgid "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" #: ../src/ui/edit/tip-dialog.c:59 msgid "Each wire has volume and possible panorama/balance controls. These can also be adjusted in the machine-window of the machine that has the wire as an input." msgstr "" #: ../src/ui/edit/tip-dialog.c:60 msgid "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" #: ../src/ui/edit/tip-dialog.c:61 msgid "The wire panorama/balance control pops up upon a shift+click on the arrow box on the wire if available." msgstr "" #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "å¯åŠ¨æ—¶æ˜¾ç¤ºæŠ€å·§æç¤º" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "æ–­å¼€" buzztard-0.6.0/po/fi.po0000644042355400116100000013352211675570705011710 00000000000000# Finnish messages for buzztard. # Copyright © 2010, 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the buzztard package. # Jorma Karvonen , 2010-2011. # msgid "" msgstr "" "Project-Id-Version: buzztard 0.6.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2011-10-14 17:35+0200\n" "Last-Translator: Jorma Karvonen \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Tulosta buzztard-ydinversio" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Buzztard-ydinvalitsimet" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Näytä buzztard-ydinvalitsimet" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normaali" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "katkaise" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "mykistä" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "soolo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "ohita" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Ladataan tiedosto ’%s’" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Tallennetaan tiedosto ’%s’" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "nimetön kappale" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Tulosta buzztard-keskusteluohjainversio" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Buzztard-keskusteluohjainvalitsimet" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Näytä buzztard-keskusteluohjainvalitsimet" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Tulosta sovellusversio" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Ole hiljaa" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Komennon nimi" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Syötetiedoston nimi" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Tulostetiedoston nimi" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "buzztard-cmd-valitsimet" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Näytä buzztard-cmd-valitsimet" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "Jorma Karvonen " #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Copyright © 2003-%d Buzztard-kehitysryhmä" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Musiikkituotantoympäristö" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Tämä pakkaus on ilmainen ohjelmisto; voit jakaa sitä edelleen ja/tai muokata " "sitä Free Software Foundation julkaiseman GNU Library General Public License-" "lisenssin joko lisenssiversion 2 tai (valintasi mukaan) mikä tahansa " "myöhäisemmän version mukaisesti.\n" "\n" "Tätä pakkausta on jaettu toivossa, että se on hyödyllinen, mutta ILMAN " "MITÄÄN TAKUUTA; ilman edes epäsuoraa takuuta KAUPALLISUUDESTA tai " "SOPIVUUDESTA TIETTYYN TARKOITUKSEEN. Katso lisätietoja GNU Library General " "Public License-lisenssistä.\n" "\n" "Sinun pitäisi vastaanottaa kopion GNU Library General Public License-" "lisenssistä tämä pakkauksen mukana; Jos näin ei ole, kirjoita osoitteeseen " "Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA " "02111-1307, USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" "Tämän julkaisun pääominaisuus on täysy peru/tee uudelleen -tuki. Siihen " "verrattava on muokkaa-toiminnon päivitettävyys ja kaatumistoipuminen. Tällä " "tavalla mahdollisuus muutosten menettämiseen on aika alhainen. Muut " "käyttöliittymärajapinnan parannukset ovat: päivän vihje, spektrianalyysin " "parannus, leikepöytätuki, lisää komentoja konteksivalikkoihin ja paljon " "muuta. Tämän julkaisun ominaisuuksia on gstreamer-dekooderi, joka sallii " "buzztard-kappaleiden toiston missä tahansa virtaperustaisessa " "mediasoittimessa. Pidämme myös buzztard-tietoperustan puhtaana ja siirsimme " "vanhentuneet sovellusrajapinta seuraajille (gnomevfs->gio, hal->gudev). " "Kirjastot ja sovellukset saivat suorituskykyparannukset monilla alueilla. " "Dokumentoinnit ovat myös parantuneet runsaasti oppikurssien, " "pikanäppäimistötaulukoiden, paremman peton ja man-sivujen ansiosta." #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "buzztard-edit -valitsimet" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Näytä buzztard-edit -valitsimet" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 #, fuzzy msgid "Buzztard Music Editor" msgstr "Buzztard-ydinvalitsimet" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 #, fuzzy msgid "Edit buzztard song files" msgstr "buzztard-asetukset" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "tallentamaton kappale" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "Palautus on valmis" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "Valittu kappale on palautettu onnistuneesti." #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "Tarkista kappale ja tallenna se, jos kaikki on kunnossa." #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "Palautus epäonnistui" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "Valittuja kappaleita ei kyettä palauttamaan täydellisesti." #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "Tarkista kappale ja tallenna se, jos se näyttää yhä hyvältä." #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "Tallentamattoman kappaleen palautus" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "Löytyi tallentamaton kappale" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "Valitse ne yksi kerrallaan ja valitse ’palauta’ tai ’poista’." #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "Kappaletiedosto" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "Viimeksi muutettu" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "Palauta" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Et näe yhtään tasomittaria." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Et näe taajuuspektriä analysoijaikkunassa." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "oppimisohjain kohteelle %s" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "Siirrä tai paina ohjainta sen havaitsemiseksi." #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "havaittu ohjain" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "ei mitään" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "rekisteröidään nimellä" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Opi..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Yhdistä ohjain" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Poista ohjaimen yhdistäminen" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Poista kaikkien ohjainten yhdistämiset" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" ": %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Ohjelmasta..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Mykistä" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Soolo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "Ohita" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Nimeä uudelleen..." #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "Yhdistä koneisiin" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Signaalianalyysi..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Generaattorit" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Tehoste" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "esiasetusnimi ja -kommentti" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "nimi" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "kommentti" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s-asetukset" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "ei asetuksia" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "koneella ei ole asetuksia" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "Nollaa parametri" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "Nollaa kaikki parametrit" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "Kopioi parametri" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Liitä" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "Kopio ryhmä" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "yleisominaisuudet" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "ääni %lu -ominaisuudet" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "%s-lankaominaisuudet" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s-ominaisuudet" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Lisää uusi esiasettelu" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Poista esiasetus" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Muokkaa esiasetusnimeä ja -kommenttia" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Esiaseta" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "koneen ominaisuudet" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Tiedot tästä koneesta" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Opaste tälle koneelle" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Satunnaista parametrit" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Palauta parametrit oletusasetuksiin" #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Näytä/Piilota esiasetuspaneeli" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Esiasetukset" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s nimi" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "Lataa uusi kappale?" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Tapahtui virhe ladattaessa kappaletta tiedostosta ’%s’" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Ei voida ladata kappaletta" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "Palauta kappale?" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Tiedosto" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "Äs_kettäin käytetyt" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "Palauta tallentamattomat kappaleet" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Muokkaa" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Näkymä" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Työkalupalkki" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Tilapalkki" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Välilehdet" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "Kokoruutunäyttö" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "Siirry konenäkymään" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "Siirry mallinäkymään" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "Siirry sekvenssinäkymään" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "Siirry aaltotaulunäkymään" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "Siirry kappaletietoihin" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "Toi_sto" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Soita kohdistimesta" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Opaste" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "Päivän vihje" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "Liity IRC-keskusteluun" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "Ilmoita pulmasta" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "kappaleen metatiedot" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "tyylilaji" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "tekijä" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "luotu" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "tahtia per minuutti" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "tahdit" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "lyönnit/tahti" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "viimeksi tallennettu" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "ilmainen tekstitieto" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Lisää kone" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Poista kaikkien koneiden mykistys" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Sulje" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Alhainen" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Keskitaso" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Korkea" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Kavenna/avarra niin että kaikki on näkyvää" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Kavenna lisätietoihin" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Avarra paremman yleisnäkymän saamiseksi" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Rasteri" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Näytä taustarasteri" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "Konenäkymävalikko" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "Valikkotoiminnot konenäkymälle alla" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" "Lisää uusia koneita hiiren oikean painikkeen konteksivalikosta. Yhdistä " "koneet vaihtopainikkeella ja raahaamisella lähteestä kohteeseen." #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "Lisää uudet mallit hiiren oikean painikkeen konteksivalikkoon." #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Yleisasetukset" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Ääni 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Ääni %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Kone" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Malli" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Aalto" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktaavi" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Soita suoratoistona" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Soita nuotit ja käynnistimet mallia muokattaessa" #: ../src/ui/edit/main-page-patterns.c:3106 msgid "Pattern view menu" msgstr "Mallinäkymävalikko" #: ../src/ui/edit/main-page-patterns.c:3107 msgid "Menu actions for pattern view below" msgstr "Valikkotoiminnot mallinäkymälle alla" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Uusi ääniraita" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Poista viimeinen ääniraita" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Uusi malli..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Malliominaisuudet..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Poista malli..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Kopioi malli" #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "Koneen ominaisuudet" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "Koneasetukset" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Sijainti" #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Lyönnit" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Aika" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "Tahdit" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Nimiöt" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Näytä joka n. rivi" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Vaiheet" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "Sekvenssinäkymävalikko" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "Valikkotoiminnot sekvenssinäkymälle alla" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Lisää ääniraita" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Poista ääniraita" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Siirrä ääniraita vasemmalle" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Siirrä ääniraita oikealle" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "Selaa nimiöitä järjestyksessä" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Painike" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Mallit" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "Lisää uudet ääniraidat hiiren oikean painikkeen konteksivalikosta." #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Soita nykyinen aaltotaulurivi C-4:nä" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Pysäytä nykyisen aaltotaulurivin toisto" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Tyhjennä nykyinen aaltotaulurivi" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ix" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Äänenvoimakkuus" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Silmukka" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Soita nykyinen näyte" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Pysäytä nykyisen näytteen toisto" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Lataa nykyinen näyte valitulle aaltotauluriville" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Juuri" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Pituus" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Taajuus" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Silmukan alku" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Silmukan loppu" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "koneet" # wires-sanan merkitys tässä on epäselvä #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "koneita käytetään kappaleissa ja niiden johdoissa" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "mallit" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "tapahtumamallimuokkain" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "sekvenssi" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "kappalesekvenssimuokkain" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "aaltotaulu" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "näyteaaltotaulumuokkain" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "tiedot" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "kappaleen metatietojen muokkain" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "Valmis rokkaamaan!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "Prosessorikuorma" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Toistoaika" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Toistosijainti" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Toistopituus" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Virhe" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "Tapahtui virhe" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Varoitus" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Tapahtui pulma" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Valmistele uusi tyhjä kappale" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Lataa uusi kappale" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Tallenna tämä kappale" #: ../src/ui/edit/main-toolbar.c:818 msgid "Rewind playback position of this song" msgstr "Siirry takaisinpäin tämän kappaleen toistosijainnissa" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Soita tämä kappale" #: ../src/ui/edit/main-toolbar.c:833 msgid "Forward playback position of this song" msgstr "Siirry eteenpäin tämän kappaleen toistosijainnissa" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Pysäytä tämän kappaleen toisto" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "Vuorottele toiston silmukointia" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "toiston voimakkuus" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Muuta toiston voimakkuutta" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "tallentamaton" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "tallennettu" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "%d %s ja %d %s" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "tunti" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "tuntia" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "minuutti" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "minuuttia" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "sekunti" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "sekuntia" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "%d %s" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "" "Kaikki tallentamattomat muutokset sitten %s menetetään. Tämä kappale " "tallennettiin viimeksi: %s" #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "" "Kaikki tallentamattomat muutokset sitten %s menetetään. Tämä kappale " "luotiin: %s" #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Poistutaanko todella?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Uusi kappale?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Avaa kappale" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "Tapahtui virhe tallennettaessa kappaletta tiedostoon ’%s’." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Ei voida tallentaa kappaletta" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Tallenna kappale" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Muoto" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Tiedosto on jo olemassa" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Valitse ’Kyllä’, jos haluat korvata kappaleen tai ’Peru’, jos haluat " "keskeyttää kappaleen tallennuksen." #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Tapahtui virhe kirjoitettaessa tiedostoa ’%s’: %s" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Tapahtui virhe tallennettaessa kappaletta tiedostoon ’%s’." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Puuttuvat GStreamer-elementit" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Alla luetellut elementit puuttuavat asennuksestasi, mutta niitä tarvitaan." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Alla luetellut elementit puuttuvat asennuksestasi, mutta ne ovat " "suositeltavia täyteen toiminnallisuuteen." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "älä varoita uudelleen" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Puuttuvat elementit kappaleessa" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Alla luetellut koneet puuttuvat tai niiden lataus epäonnistui." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Alla luetellut aallot puuttuvat tai niiden lataaminen epäonnistui." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "pituus" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "äänet" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "kappaleen tulkinta" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Kansio" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Valitse kansio" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Tiedostonimi" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Tila" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Äänitetään kohteeseen: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "kappaleen tulkintaprosessi" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "buzztard-asetukset" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Audiolaitteet" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Keskusteluohjain" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Toisto-ohjain" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Värit" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Pikavalitsimet" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Hakemistot" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Äänilaite" #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Upotus" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "järjestelmäoletus: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "järjestelmäoletus: -" #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Näytetaajuus" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanavat" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Kappaleet" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Äänitykset" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Aaltomuodot" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Laite" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "Ohjain" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Porttinumero" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s analyysi" #: ../src/ui/edit/signal-analysis-dialog.c:711 msgid "master analysis" msgstr "isäntäanalyysi" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "lin." #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "log." #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "taajuuskuvaus" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "yksittäinen" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "kaksinkertainen" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "kolminkertainen" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "spektritarkkuus" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "Uusia koneita lisättiin konenäkymään kontekstivalikosta." #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" "Yhdistä koneet pitämällä vaihtopainikkeen alhaalla ja raahaamalla yhteyden " "lähteestä kohdekoneeseen." #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" "Kappaleet voidaan äänittää yksittäisaaltoisen per ääniraita antamalle se " "uudelleensekoittimelle." #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" "Täytä yksityiskohdat tiedot-sivulla. Kun kappaleita äänitetään, metatieto " "lisätään äänityksen tunnisteina." #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" "Käytä jakkiääninielua äänilaiteasetuksisa alhaisemman viiveen saamiseksi " "suoralähetteisessä koneohjaimessa." #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" "Voit käyttä syötelaitteita, kuten sauvaohjainta, midi-laitteiden rinnalla " "suoralähetteisiin koneparametreihin. " #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" "Voit käyttää upnp-media-asiakasta (esim.: media-virtaa nokian " "sormitietokoneissa) buzztard-etäohjaimena." #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" "Nuottien kirjoittamiseksi kuvittele tietokonenäppäimistösi kaksiriviseksi " "musiikkinäppäimistöksi. Alhaalla vasemmalla z -painikkeesta tulee ’c’, s on " "’c#’, x on ’d’ jne." #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "Saat lisäohjausta yhteisöltä irc://irc.freenode.net/#buzztard." #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" "Malliasettelut ovat yksilöllisiä jokaiselle koneelle. Katso alalaidan " "tilapalkkia tietojen saamiseksi kohdistinsarakkeesta." #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" "Napsauta kaiutinkuvaketta mallinäkymässä nuottien kuulemiseksi samalla kun " "kirjoitat niitä." #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" "Jokaisella johdolla on voimmakkuusohjain ja mahdollisest yleisnäkymä/" "balanssiohjain. Niitä voidaan myös säätää koneen koneikkunasssa, jossa johto " "on syötteenä." #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" "Johdon voimakkuusohjain ponnahtaa näkyviin napsauttamalla nuolilaatikkoa " "johdon kohdalla." #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" "Johtoyleisnäkymä/balanssiohjain ponnahtaa näkyviin vaihtopainikkeella ja " "napsauttamalla nuolilaatikkoa, jos johto on saatavilla." #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "Näytä vihjeet käynnistettäessä" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Ei voitu löytää pixmap-tiedostoa: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Katkaise yhteys" #~ msgid "" #~ "Rewrote internal pipeline management. One can now play partially " #~ "connected songs, and add/remove plugins while playing. Buzztard can play " #~ "notes while editing. More robust saving of songs. Lots of bugfixes and UI " #~ "improvemnts. Better user-guide including three small tutorials. Initial " #~ "support for python and javascript via gobject introspection." #~ msgstr "" #~ "Uudelleenkirjoitti sisäisen putkilinjahallinnan. Nyt voidaan soittaa " #~ "osittain yhdistetyt kappaleet, ja lisätä/poistaa lisäosat soittamisen " #~ "aikana. Buzztard voi soittaa nuotteja niitä muokatessa. Aikaisempaa " #~ "parempi kappaleiden tallennus. Paljon vikakorjauksia ja " #~ "käyttöliittymäparannuksia. Parempi käyttöopaste sisältäen kolme pientä " #~ "oppikurssia. Alustava tuki pythonille ja javascriptille gobject-" #~ "keskustelun kautta." #~ msgid "Delete machine '%s'" #~ msgstr "Poista kone ’%s’" #~ msgid "Delete machine..." #~ msgstr "Poista kone..." #~ msgid "There is no undo for this." #~ msgstr "Tälle ei ole perumistoimintoa." #~ msgid "Delete pattern '%s'" #~ msgstr "Poista malli ’%s’" #~ msgid "Delete pattern..." #~ msgstr "Poista malli..." #~ msgid " clear" #~ msgstr " tyhjennä" #~ msgid " mute" #~ msgstr " vaienna" #~ msgid " break" #~ msgstr " katkaise" #~ msgid " bypass" #~ msgstr " ohita" #~ msgid " solo" #~ msgstr " soolo" #~ msgid "default" #~ msgstr "oletus" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "Tapahtui virhe yritettäessä ladata kappaletta tiedostosta ’%s’" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "" #~ "Tapahtui virhe yritettäessä avata tiedostoa ’%s’ kirjoittamista varten: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "Tapahtui virhe yritettäessä tallentaa kappaletta tiedostoon ’%s’." buzztard-0.6.0/po/da.po0000644042355400116100000014201411675570705011672 00000000000000# Danish translation of buzztard. # Copyright (C) 2011 buzztard og Joe Hansen. # This file is distributed under the same license as the buzztard package. # Joe Hansen , 2008, 2009, 2011. # # konventioner # redo -> omgør # sample -> lydprøve # husk at maskine i sammensætninger ikke har e (maskinvisning) # msgid "" msgstr "" "Project-Id-Version: buzztard-0.6.0\n" "Report-Msgid-Bugs-To: buzztard-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2011-12-03 00:16+0100\n" "PO-Revision-Date: 2011-10-09 00:00+0000\n" "Last-Translator: Joe Hansen \n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/lib/core/core.c:196 msgid "Print the buzztard core version" msgstr "Vis buzztard kerneversionen" #: ../src/lib/core/core.c:200 msgid "Buzztard core options" msgstr "Buzztard kerneindstillinger" #: ../src/lib/core/core.c:200 msgid "Show buzztard core options" msgstr "Vis buzztard kerneindstillinger" #. track commands in sequencer #: ../src/lib/core/pattern.c:371 msgid "normal" msgstr "normal" #: ../src/lib/core/pattern.c:371 msgid "break" msgstr "skift" #: ../src/lib/core/pattern.c:371 msgid "mute" msgstr "slÃ¥ lyd fra" #: ../src/lib/core/pattern.c:371 msgid "solo" msgstr "solo" #: ../src/lib/core/pattern.c:371 msgid "bypass" msgstr "gÃ¥ udenom" #: ../src/lib/core/song-io-native-bzt.c:243 #: ../src/lib/core/song-io-native-xml.c:54 #, c-format msgid "Loading file '%s'" msgstr "Indlæser fil »%s«" #: ../src/lib/core/song-io-native-bzt.c:366 #: ../src/lib/core/song-io-native-xml.c:122 #, c-format msgid "Saving file '%s'" msgstr "Gemmer fil »%s«" #. default name for new songs #: ../src/lib/core/song-info.c:99 msgid "untitled song" msgstr "unavngivet sang" #: ../src/lib/ic/ic.c:115 msgid "Print the buzztard interaction controller version" msgstr "Vis versionen pÃ¥ buzztard interaktionstyreenhed" #: ../src/lib/ic/ic.c:119 msgid "Buzztard interaction controller options" msgstr "Indstillinger for buzztard interaktionstyreenhed" #: ../src/lib/ic/ic.c:119 msgid "Show buzztard interaction controller options" msgstr "Vis indstillinger for buzztard interaktionstyreenhed" #: ../src/ui/cmd/bt-cmd.c:72 ../src/ui/edit/bt-edit.c:82 msgid "Print application version" msgstr "Vis programversion" #: ../src/ui/cmd/bt-cmd.c:73 msgid "Be quiet" msgstr "Vær stille" #: ../src/ui/cmd/bt-cmd.c:74 ../src/ui/edit/bt-edit.c:83 msgid "Command name" msgstr "Kommandonavn" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/edit/bt-edit.c:84 msgid "Input file name" msgstr "Filnavn for inddata" #: ../src/ui/cmd/bt-cmd.c:75 ../src/ui/cmd/bt-cmd.c:76 #: ../src/ui/edit/bt-edit.c:84 msgid "" msgstr "" #: ../src/ui/cmd/bt-cmd.c:76 msgid "Output file name" msgstr "Filnavn for uddata" #. g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); #: ../src/ui/cmd/bt-cmd.c:94 msgid "buzztard-cmd options" msgstr "Indstillinger for buzztard-cmd" #: ../src/ui/cmd/bt-cmd.c:94 msgid "Show buzztard-cmd options" msgstr "Vis indstillinger for buzztard-cmd" #. Note to translators: put here your name and email so it will show up in #. * the "about" box. Example: Stefan 'ensonic' Sauer #: ../src/ui/edit/about-dialog.c:73 msgid "translator-credits" msgstr "" "Joe Hansen\n" "\n" "Dansk-gruppen \n" "Mere info: http://www.dansk-gruppen.dk" #: ../src/ui/edit/about-dialog.c:75 ../src/ui/edit/about-dialog.c:76 #, c-format msgid "Copyright © 2003-%d Buzztard developer team" msgstr "Ophavsret © 2003-%d Buzztard udviklingshold" #: ../src/ui/edit/about-dialog.c:92 msgid "Music production environment" msgstr "Musikproduktionsmiljø" #: ../src/ui/edit/about-dialog.c:97 msgid "" "This package is free software; you can redistribute it and/or modify it " "under the terms of the GNU Library General Public License as published by " "the Free Software Foundation; either version 2 of the License, or (at your " "option) any later version.\n" "\n" "This package is distributed in the hope that it will be useful, but WITHOUT " "ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License " "for more details.\n" "\n" "You should have received a copy of the GNU Library General Public License " "along with this package; if not, write to the Free Software Foundation, " "Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Dette program er frit programmel. Du kan videredistribuere det eller ændre " "det under betingelserne i GNU General Public License som udgives af Free " "Software Foundation; enten version 2 af licensen eller (hvis du ønsker det) " "enhver senere version.\n" "\n" "Dette program distribueres i hÃ¥b om at programmet er nyttigt, men UDEN NOGEN " "GARANTI, ikke engang underforstÃ¥et garanti om, at det er SALGBART eller er " "BRUGBART TIL ET BESTEMT FORMÃ…L. Se GNU General Public License for flere " "detaljer.\n" "\n" "Du burde have modtaget en kopi af GNU General Public License sammen med " "programmet; hvis ikke, sÃ¥ skriv til Free Software Foundation, Inc. 59 Temple " "Place - Suite 330, Boston, MA 02110-1301 USA." #. "Development version (do not translate this)" #: ../src/ui/edit/about-dialog.c:130 msgid "" "Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context " "menus and many more). This release features a gstreamer decoder that enables " "playback of buzztard songs in any gstreamer based media player. We also kept " "the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications " "got performance improvements in many areas. Also the docs have been improved " "a lot with tutorials, keyboard shortcut tables, better coverage and man-" "pages. " msgstr "" "Vigtigste funktion i denne udgivelse er fuld understøttelse af fortryd/" "omgør. Relateret til dette er registrering af redigeringshandlinger og " "gendannelse efter nedbrud. PÃ¥ denne mÃ¥de er risikoen for at miste ændringer " "i sangen ret lav. Andre UI-forbedringer er: dagnes tip, forbedret " "spektrumanalyseprogram, understøttelse af udklipsholder, flere kommandoer i " "kontekstmenuer og meget mere). Denne udgivelse har en gstreamer-afkoder som " "aktiverer afspilning af buzztardsange i alle gstreamer-baserede " "medieafspillere. Vi har ogsÃ¥ holdt buzztards kodebase ryddet og porteret fra " "forældede API'er til efterfølgerne (gnomevfs->gio, hal->gudev). " "Bibliotekerne og programmerne har fÃ¥et ydelsesforbedringer pÃ¥ mange omrÃ¥der. " "Dokumentationen er ogsÃ¥ blevet forbedret med en masse eksempler, tabeller " "over tastaturgenveje, bedre dækning og manualsider. " #. g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); #: ../src/ui/edit/bt-edit.c:103 msgid "buzztard-edit options" msgstr "indstillinger for buzztard-edit" #: ../src/ui/edit/bt-edit.c:103 msgid "Show buzztard-edit options" msgstr "Vis indstillinger for buzztard-edit" #: ../src/ui/edit/buzztard-edit.desktop.in.h:1 msgid "Buzztard Music Editor" msgstr "Buzztard musikhÃ¥ndtering" #: ../src/ui/edit/buzztard-edit.desktop.in.h:2 msgid "Edit buzztard song files" msgstr "Rediger buzztard sangfiler" #: ../src/ui/edit/change-log.c:544 msgid "unsaved song" msgstr "ikke gemt sang" #. the song recovery has been finished #: ../src/ui/edit/crash-recover-dialog.c:153 msgid "Recovery finished" msgstr "Gendannelse færdig" #: ../src/ui/edit/crash-recover-dialog.c:154 msgid "The selected song has been recovered successful." msgstr "Den valgte sang er blevet gendannet." #: ../src/ui/edit/crash-recover-dialog.c:155 msgid "Please check the song and save it if everything is alright." msgstr "Kontroller venligst sangen og gem den hvis alt er okay." #. FIXME: the log is still there #. * - this dialog should be a warning #. * - ev. we want to suggest to ask for support #. #: ../src/ui/edit/crash-recover-dialog.c:162 msgid "Recovery failed" msgstr "Gendannelse fejlede" #: ../src/ui/edit/crash-recover-dialog.c:163 msgid "Sorry, the selected song could not be fully recovered." msgstr "Beklager, den valgte sang kunne ikke fuldt ud gendannes." #: ../src/ui/edit/crash-recover-dialog.c:164 msgid "Please check the song and save it if still looks good." msgstr "Kontroller venligst sangen og gem den hvis den stadig ser okay ud." #: ../src/ui/edit/crash-recover-dialog.c:199 msgid "Unsaved song recovery" msgstr "Ikke gemt sanggendannelse" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Unsaved songs found" msgstr "Ikke gemte sange fundet" #: ../src/ui/edit/crash-recover-dialog.c:217 msgid "Select them one by one and choose 'recover' or 'delete'." msgstr "Vælg dem en efter en og vælg »recover« (gendan) eller »delete« (slet)." #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:233 msgid "Song file" msgstr "Sangfil" #. column listing song file names to recover #: ../src/ui/edit/crash-recover-dialog.c:239 msgid "Last changed" msgstr "Sidst ændret" #. add "undelete" button to action area #. GTK_STOCK_REVERT_TO_SAVED #: ../src/ui/edit/crash-recover-dialog.c:269 msgid "Recover" msgstr "Gendan" #: ../src/ui/edit/edit-application.c:146 msgid "-> You will not see any level-meters." msgstr "-> Du vil ikke se nogen VU-metre." #: ../src/ui/edit/edit-application.c:153 msgid "-> You will not see the frequency spectrum in the analyzer window." msgstr "-> Du vil ikke se frekvensspektrummet i analysevinduet." #. set dialog title #: ../src/ui/edit/interaction-controller-learn-dialog.c:115 #, c-format msgid "learn controller for %s" msgstr "læringsstyreenhed for %s" #: ../src/ui/edit/interaction-controller-learn-dialog.c:142 msgid "Move or press a controller to detect it." msgstr "Flyt eller tryk pÃ¥ en styreenhed for at detektere den." #: ../src/ui/edit/interaction-controller-learn-dialog.c:148 msgid "detected control" msgstr "detekteret styreenhed" #: ../src/ui/edit/interaction-controller-learn-dialog.c:152 msgid "none" msgstr "ingen" #: ../src/ui/edit/interaction-controller-learn-dialog.c:156 msgid "register as" msgstr "registrer som" #: ../src/ui/edit/interaction-controller-menu.c:158 msgid "Learn..." msgstr "Lær..." #: ../src/ui/edit/interaction-controller-menu.c:257 msgid "Bind controller" msgstr "Tildel styreenhed" #: ../src/ui/edit/interaction-controller-menu.c:267 msgid "Unbind controller" msgstr "Fjern styreenhed" #: ../src/ui/edit/interaction-controller-menu.c:273 msgid "Unbind all controllers" msgstr "Fjern alle styreenheder" #. format about message for machines #: ../src/ui/edit/machine-actions.c:63 #, c-format msgid "" "by %s\n" "\n" "%s" msgstr "" "af %s\n" "\n" "%s" #: ../src/ui/edit/machine-actions.c:66 msgid "About..." msgstr "Om..." #: ../src/ui/edit/machine-canvas-item.c:697 msgid "Mute" msgstr "Lyd slukket" #: ../src/ui/edit/machine-canvas-item.c:703 msgid "Solo" msgstr "Solo" #: ../src/ui/edit/machine-canvas-item.c:710 msgid "Bypass" msgstr "ForbigÃ¥" #: ../src/ui/edit/machine-canvas-item.c:750 msgid "Rename..." msgstr "Omdøb..." #: ../src/ui/edit/machine-canvas-item.c:764 msgid "Connect machines" msgstr "Forbind maskiner" #: ../src/ui/edit/machine-canvas-item.c:769 #: ../src/ui/edit/wire-canvas-item.c:800 msgid "Signal Analysis..." msgstr "Signalanalyse..." #. generators #: ../src/ui/edit/machine-menu.c:280 msgid "Generators" msgstr "Generatorer" #. effects #: ../src/ui/edit/machine-menu.c:293 msgid "Effects" msgstr "Effekter" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/machine-preset-properties-dialog.c:131 msgid "preset name and comment" msgstr "forvalgt navn og bemærkning" #. GtkEntry : preset name #. GtkEntry : machine name #. GtkEntry : pattern name #: ../src/ui/edit/machine-preset-properties-dialog.c:158 #: ../src/ui/edit/machine-rename-dialog.c:149 #: ../src/ui/edit/main-page-info.c:334 #: ../src/ui/edit/pattern-properties-dialog.c:166 msgid "name" msgstr "navn" #. GtkEntry : preset comment #: ../src/ui/edit/machine-preset-properties-dialog.c:171 msgid "comment" msgstr "bemærkning" #: ../src/ui/edit/machine-preferences-dialog.c:214 #, c-format msgid "%s preferences" msgstr "%s præferencer" #: ../src/ui/edit/machine-preferences-dialog.c:462 msgid "no settings" msgstr "ingen indstillinger" #: ../src/ui/edit/machine-preferences-dialog.c:469 msgid "machine has no preferences" msgstr "maskine har ingen præferencer" #: ../src/ui/edit/machine-properties-dialog.c:741 msgid "Reset parameter" msgstr "Nulstil parameter" #: ../src/ui/edit/machine-properties-dialog.c:746 msgid "Reset all parameters" msgstr "Nulstil alle parametre" #. @todo: copy parameter/group/all? #: ../src/ui/edit/machine-properties-dialog.c:757 msgid "Copy parameter" msgstr "Kopier parameter" #: ../src/ui/edit/machine-properties-dialog.c:764 #: ../src/ui/edit/machine-properties-dialog.c:838 msgid "Paste" msgstr "Indsæt" #. add copy/paste item #: ../src/ui/edit/machine-properties-dialog.c:831 msgid "Copy group" msgstr "Kopier gruppe" #: ../src/ui/edit/machine-properties-dialog.c:1861 msgid "global properties" msgstr "globale egenskaber" #: ../src/ui/edit/machine-properties-dialog.c:1912 #, c-format msgid "voice %lu properties" msgstr "stemme %lu egenskaber" #. set group title #: ../src/ui/edit/machine-properties-dialog.c:1995 #, c-format msgid "%s wire properties" msgstr "%s forbindelsesegenskaber" #. set dialog title #: ../src/ui/edit/machine-properties-dialog.c:2099 #: ../src/ui/edit/pattern-properties-dialog.c:136 #, c-format msgid "%s properties" msgstr "%s egenskaber" #: ../src/ui/edit/machine-properties-dialog.c:2117 msgid "Add new preset" msgstr "Tilføj nyt forvalg" #: ../src/ui/edit/machine-properties-dialog.c:2122 msgid "Remove preset" msgstr "Fjern forvalg" #: ../src/ui/edit/machine-properties-dialog.c:2127 msgid "Edit preset name and comment" msgstr "Rediger forvalgsnavn og bemærkning" #: ../src/ui/edit/machine-properties-dialog.c:2153 msgid "Preset" msgstr "Forvalg" #: ../src/ui/edit/machine-properties-dialog.c:2190 msgid "machine properties" msgstr "maskinegenskaber" #: ../src/ui/edit/machine-properties-dialog.c:2237 msgid "Info about this machine" msgstr "Information om denne maskine" #: ../src/ui/edit/machine-properties-dialog.c:2242 msgid "Help for this machine" msgstr "Hjælp til denne maskine" #: ../src/ui/edit/machine-properties-dialog.c:2252 msgid "Randomize parameters" msgstr "Vælg tilfældige parametre" #: ../src/ui/edit/machine-properties-dialog.c:2257 msgid "Reset parameters to defaults" msgstr "Nulstil parametre til standard" # hmmm, er pane = felt, rude eller panel? #: ../src/ui/edit/machine-properties-dialog.c:2264 msgid "Show/Hide preset pane" msgstr "Vis/skjul forvalgsfelt" #: ../src/ui/edit/machine-properties-dialog.c:2265 msgid "Presets" msgstr "Forvalg" #. set dialog title #: ../src/ui/edit/machine-rename-dialog.c:119 #, c-format msgid "%s name" msgstr "%s navn" #: ../src/ui/edit/main-menu.c:95 ../src/ui/edit/main-window.c:524 msgid "Load new song?" msgstr "Indlæs ny sang?" #: ../src/ui/edit/main-menu.c:104 ../src/ui/edit/main-window.c:228 #: ../src/ui/edit/main-window.c:609 #, c-format msgid "An error occurred while loading the song from file '%s'" msgstr "Der opstod en fejl under indlæsning af sangen fra filen »%s«" #: ../src/ui/edit/main-menu.c:106 ../src/ui/edit/main-window.c:229 #: ../src/ui/edit/main-window.c:610 msgid "Can't load song" msgstr "Kan ikke indlæse sang" #: ../src/ui/edit/main-menu.c:132 msgid "Recover a song?" msgstr "Gendan en sang" #. gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); #. -- file menu #: ../src/ui/edit/main-menu.c:712 msgid "_File" msgstr "_Fil" #: ../src/ui/edit/main-menu.c:726 msgid "_Recently used" msgstr "_Nylig anvendte" #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); #: ../src/ui/edit/main-menu.c:769 msgid "Recover unsaved songs" msgstr "Gendan ikke gemte sange" #. edit menu #: ../src/ui/edit/main-menu.c:788 msgid "_Edit" msgstr "_Rediger" #. view menu #: ../src/ui/edit/main-menu.c:837 msgid "_View" msgstr "_Vis" #: ../src/ui/edit/main-menu.c:845 msgid "Toolbar" msgstr "Værktøjslinje" #: ../src/ui/edit/main-menu.c:851 msgid "Statusbar" msgstr "Statusbjælke" #: ../src/ui/edit/main-menu.c:857 msgid "Tabs" msgstr "Faneblade" #. @todo 'Machine properties' show/hide toggle #. @todo 'Analyzer windows' show/hide toggle #: ../src/ui/edit/main-menu.c:866 msgid "Fullscreen" msgstr "Fuldskærm" #: ../src/ui/edit/main-menu.c:874 msgid "Go to machine view" msgstr "GÃ¥ til maskinvisning" #: ../src/ui/edit/main-menu.c:881 msgid "Go to pattern view" msgstr "GÃ¥ til mønstervisning" #: ../src/ui/edit/main-menu.c:888 msgid "Go to sequence view" msgstr "GÃ¥ til sekvensvisning" #: ../src/ui/edit/main-menu.c:895 msgid "Go to wave table view" msgstr "GÃ¥ til wavetabelvisning" #: ../src/ui/edit/main-menu.c:902 msgid "Go to song information" msgstr "GÃ¥ til sanginformation" #. @todo zoom menu items #. * machine view: zoom-in/zoom-out/zoom-fit #. * sequence vide: zoom-in/zoom-out #. * #. #. gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); #. #. subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); #. gtk_container_add(GTK_CONTAINER(menu),subitem); #. g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); #. #. playback menu #: ../src/ui/edit/main-menu.c:930 msgid "_Playback" msgstr "_Afspilning" #: ../src/ui/edit/main-menu.c:944 msgid "Play from cursor" msgstr "Afspil fra markør" #. @todo toggle loop item #. * - we only have: #. * gtk_image_menu_item_new_from_stock - not a toggle #. * gtk_check_menu_item_new_with_mnemonic - no image #. #. @todo: tools menu #. * 'normalize song' #. * - dummy render with master->input-pre-gain, adjust master volume #. * 'cleanup' #. * - remove unsused patterns, unconnected machines with no empty/tracks #. #. help menu #: ../src/ui/edit/main-menu.c:970 msgid "_Help" msgstr "_Hjælp" #: ../src/ui/edit/main-menu.c:983 ../src/ui/edit/tip-dialog.c:166 #: ../src/ui/edit/tip-dialog.c:182 msgid "Tip of the day" msgstr "Dagens tip" #. join web-chat #: ../src/ui/edit/main-menu.c:989 msgid "Join IRC discussion" msgstr "GÃ¥ til IRC-diskussion" #. @todo 'translate application' -> link to translator project #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png #. #. 'report a problem' -> link to bug tracker #. * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png #. * /usr/share/app-install/icons/bug-buddy.png #. #: ../src/ui/edit/main-menu.c:1001 msgid "Report a problem" msgstr "Rapporter et problem" #: ../src/ui/edit/main-page-info.c:312 ../src/ui/edit/main-page-info.c:314 msgid "song meta data" msgstr "metadata for sang" #: ../src/ui/edit/main-page-info.c:341 msgid "genre" msgstr "genre" #: ../src/ui/edit/main-page-info.c:348 msgid "author" msgstr "forfatter" #: ../src/ui/edit/main-page-info.c:355 msgid "created" msgstr "kreeret" #: ../src/ui/edit/main-page-info.c:367 msgid "beats per minute" msgstr "beat per minut" #: ../src/ui/edit/main-page-info.c:376 msgid "beats" msgstr "beat" #: ../src/ui/edit/main-page-info.c:390 msgid "ticks per beat" msgstr "slag per beat" #: ../src/ui/edit/main-page-info.c:398 msgid "last saved" msgstr "sidst gemt" #: ../src/ui/edit/main-page-info.c:416 ../src/ui/edit/main-page-info.c:418 msgid "free text info" msgstr "fri tekstinformation" #. menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); #: ../src/ui/edit/main-page-machines.c:1136 msgid "Add machine" msgstr "Tilføj maskine" #: ../src/ui/edit/main-page-machines.c:1149 msgid "Unmute all machines" msgstr "Tænd alle maskiner" #. background grid density #: ../src/ui/edit/main-page-machines.c:1162 msgid "Off" msgstr "Slukket" #: ../src/ui/edit/main-page-machines.c:1169 msgid "Low" msgstr "Lav" #: ../src/ui/edit/main-page-machines.c:1176 msgid "Medium" msgstr "Mellem" #: ../src/ui/edit/main-page-machines.c:1183 msgid "High" msgstr "Høj" #: ../src/ui/edit/main-page-machines.c:1221 msgid "Zoom in/out so that everything is visible" msgstr "Zoom ind/ud sÃ¥ alt er synligt" #: ../src/ui/edit/main-page-machines.c:1228 msgid "Zoom in for more details" msgstr "Zoom ind for yderligere detaljer" #: ../src/ui/edit/main-page-machines.c:1235 msgid "Zoom out for better overview" msgstr "Zoom ud for bedre overblik" #: ../src/ui/edit/main-page-machines.c:1246 #: ../src/ui/edit/main-page-machines.c:1254 msgid "Grid" msgstr "Gitter" #: ../src/ui/edit/main-page-machines.c:1248 #: ../src/ui/edit/main-page-machines.c:1249 #: ../src/ui/edit/main-page-machines.c:1255 msgid "Show background grid" msgstr "Vis baggrundsgitter" #: ../src/ui/edit/main-page-machines.c:1266 msgid "Machine view menu" msgstr "Menu for maskinvisning" #: ../src/ui/edit/main-page-machines.c:1267 msgid "Menu actions for machine view below" msgstr "Menuhandlinger for maskinvisning nedenfor" #. it would be nice if we could just do: #. * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); #. #: ../src/ui/edit/main-page-machines.c:1941 msgid "" "Add new machines from right click context menu. Connect machines with shift" "+drag from source to target." msgstr "" "Tilføj nye maskiner fra kontekstmenuen for højreklik. Forbind maskiner med " "skift+træk fra kilde til mÃ¥l." #: ../src/ui/edit/main-page-patterns.c:329 msgid "Add new patterns from right click context menu." msgstr "Tilføj nye mønstre fra kontekstmenuen for højreklik." #. label for first global parameter column in a pattern #: ../src/ui/edit/main-page-patterns.c:1963 msgid "Globals" msgstr "Globale" #. label for parameters of first voice column in a pattern #: ../src/ui/edit/main-page-patterns.c:1982 msgid "Voice 1" msgstr "Stemme 1" #. label for parameters of voice columns in a pattern #: ../src/ui/edit/main-page-patterns.c:1997 #, c-format msgid "Voice %u" msgstr "Stemme %u" #. this won't work, as we can't pass anything to the event handler #. * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); #. * so, we need to subclass the combobox and add two signals: select-next, select-prev #. #: ../src/ui/edit/main-page-patterns.c:2998 msgid "Machine" msgstr "Maskine" #: ../src/ui/edit/main-page-patterns.c:3026 msgid "Pattern" msgstr "Mønster" #: ../src/ui/edit/main-page-patterns.c:3055 #: ../src/ui/edit/main-page-waves.c:1197 msgid "Wave" msgstr "Wave" #: ../src/ui/edit/main-page-patterns.c:3078 msgid "Octave" msgstr "Oktav" #: ../src/ui/edit/main-page-patterns.c:3094 msgid "Play live" msgstr "Direkte afspilning" #: ../src/ui/edit/main-page-patterns.c:3096 msgid "Play notes and triggers while editing the pattern" msgstr "Afspil noter og udløsende faktorer under redigering af mønsteret" #: ../src/ui/edit/main-page-patterns.c:3106 msgid "Pattern view menu" msgstr "Menu for mønstervisning" #: ../src/ui/edit/main-page-patterns.c:3107 msgid "Menu actions for pattern view below" msgstr "Menuhandlinger for mønstervisning nedenfor" #: ../src/ui/edit/main-page-patterns.c:3144 msgid "New track" msgstr "Nyt spor" #: ../src/ui/edit/main-page-patterns.c:3153 msgid "Remove last track" msgstr "Fjern sidste spor" #: ../src/ui/edit/main-page-patterns.c:3166 msgid "New pattern ..." msgstr "Nyt mønster ..." #: ../src/ui/edit/main-page-patterns.c:3175 msgid "Pattern properties..." msgstr "Mønsteregenskaber..." #: ../src/ui/edit/main-page-patterns.c:3184 msgid "Remove pattern..." msgstr "Fjern mønster..." #: ../src/ui/edit/main-page-patterns.c:3193 msgid "Copy pattern..." msgstr "Kopier mønster..." #: ../src/ui/edit/main-page-patterns.c:3206 #: ../src/ui/edit/main-page-sequence.c:3119 msgid "Machine properties" msgstr "Maskinegenskaber" #: ../src/ui/edit/main-page-patterns.c:3213 #: ../src/ui/edit/main-page-sequence.c:3126 msgid "Machine preferences" msgstr "Maskinpræferencer" #. time line position #: ../src/ui/edit/main-page-sequence.c:1085 msgid "Pos." msgstr "Pos." #: ../src/ui/edit/main-page-sequence.c:1091 msgid "Ticks" msgstr "Slag" #: ../src/ui/edit/main-page-sequence.c:1092 msgid "Time" msgstr "Tid" #: ../src/ui/edit/main-page-sequence.c:1093 msgid "Beats" msgstr "Beat" #: ../src/ui/edit/main-page-sequence.c:1237 #: ../src/ui/edit/main-page-sequence.c:1268 msgid "Labels" msgstr "Etiketter" #: ../src/ui/edit/main-page-sequence.c:3046 msgid "Show every n-th line" msgstr "Vis hver n. linje" #: ../src/ui/edit/main-page-sequence.c:3053 msgid "Steps" msgstr "Trin" #: ../src/ui/edit/main-page-sequence.c:3067 msgid "Sequence view menu" msgstr "Menu for sekvensvisning" #: ../src/ui/edit/main-page-sequence.c:3068 msgid "Menu actions for sequence view below" msgstr "Menuhandlinger for sekvensvisning nedenfor" #: ../src/ui/edit/main-page-sequence.c:3078 msgid "Add track" msgstr "Tilføj spor" #: ../src/ui/edit/main-page-sequence.c:3084 msgid "Remove track" msgstr "Fjern spor" #: ../src/ui/edit/main-page-sequence.c:3097 msgid "Move track left" msgstr "Flyt spor venstre" #: ../src/ui/edit/main-page-sequence.c:3106 msgid "Move track right" msgstr "Flyt spor højre" #: ../src/ui/edit/main-page-sequence.c:3177 msgid "Browse to labels in the sequence" msgstr "GÃ¥ til etiketter i sekvensen" #: ../src/ui/edit/main-page-sequence.c:3274 msgid "Key" msgstr "Nøgle" #: ../src/ui/edit/main-page-sequence.c:3287 msgid "Patterns" msgstr "Mønstre" #. use status bar #: ../src/ui/edit/main-page-sequence.c:3881 msgid "Add new tracks from right click context menu." msgstr "Tilføj nye numre fra kontekstmenuen for højreklik." #: ../src/ui/edit/main-page-waves.c:1153 msgid "Play current wave table entry as C-4" msgstr "Afspil nuværende wavetabelelement som C-4" #: ../src/ui/edit/main-page-waves.c:1160 msgid "Stop playback of current wave table entry" msgstr "Stop afspilning af nuværende wavetabelelement" #: ../src/ui/edit/main-page-waves.c:1167 msgid "Clear current wave table entry" msgstr "Ryd nuværende wavettabelelement" #. Ix: index in wavetable #: ../src/ui/edit/main-page-waves.c:1191 msgid "Ix" msgstr "Ind" #: ../src/ui/edit/main-page-waves.c:1203 msgid "Volume" msgstr "Volume" #: ../src/ui/edit/main-page-waves.c:1208 ../src/ui/edit/main-toolbar.c:850 msgid "Loop" msgstr "Loop" #: ../src/ui/edit/main-page-waves.c:1233 msgid "Play current sample" msgstr "Spil aktuel lydprøve" #: ../src/ui/edit/main-page-waves.c:1239 msgid "Stop playback of current sample" msgstr "Stop afspilning af nuværende lydprøve" #: ../src/ui/edit/main-page-waves.c:1246 msgid "Load current sample into selected wave table entry" msgstr "Indlæs nuværende lydprøve ind i valgt wavetabelpost" #: ../src/ui/edit/main-page-waves.c:1289 msgid "Root" msgstr "Rod" #: ../src/ui/edit/main-page-waves.c:1294 msgid "Length" msgstr "Længde" #: ../src/ui/edit/main-page-waves.c:1299 msgid "Rate" msgstr "Rate" #: ../src/ui/edit/main-page-waves.c:1305 msgid "Loop start" msgstr "Loop start" #: ../src/ui/edit/main-page-waves.c:1311 msgid "Loop end" msgstr "Loop slut" #: ../src/ui/edit/main-pages.c:171 msgid "machines" msgstr "maskiner" #: ../src/ui/edit/main-pages.c:171 msgid "machines used in the song and their wires" msgstr "maskiner brugt i sangen og deres forbindelser" #: ../src/ui/edit/main-pages.c:176 msgid "patterns" msgstr "mønstre" #: ../src/ui/edit/main-pages.c:176 msgid "event pattern editor" msgstr "redigering af begivenhedsmønster" #: ../src/ui/edit/main-pages.c:181 msgid "sequence" msgstr "sekvens" #: ../src/ui/edit/main-pages.c:181 msgid "song sequence editor" msgstr "sangsekvensredigering" #: ../src/ui/edit/main-pages.c:186 msgid "wave table" msgstr "wavetabel" #: ../src/ui/edit/main-pages.c:186 msgid "sample wave table editor" msgstr "redigeringstabel for lydprøvewave" #: ../src/ui/edit/main-pages.c:191 msgid "information" msgstr "information" #: ../src/ui/edit/main-pages.c:191 msgid "song meta data editor" msgstr "metadataredigering for sang" #: ../src/ui/edit/main-statusbar.c:288 ../src/ui/edit/main-statusbar.c:380 msgid "Ready to rock!" msgstr "SÃ¥ er vi klar!" #. @idea: this could be used to avoid resizing when the label changes #. gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); #. gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); #: ../src/ui/edit/main-statusbar.c:299 msgid "CPU load" msgstr "CPU-belastning" #: ../src/ui/edit/main-statusbar.c:310 msgid "Playback time" msgstr "Afspilningstid" #: ../src/ui/edit/main-statusbar.c:322 msgid "Playback position" msgstr "Afspilningsposition" #: ../src/ui/edit/main-statusbar.c:334 msgid "Playback length" msgstr "Afspilningslængde" #: ../src/ui/edit/main-toolbar.c:386 msgid "Error" msgstr "Fejl" #: ../src/ui/edit/main-toolbar.c:386 msgid "An error occurred" msgstr "En fejl opstod" #. bt_song_stop(song); #: ../src/ui/edit/main-toolbar.c:418 msgid "Warning" msgstr "Advarsel" #: ../src/ui/edit/main-toolbar.c:418 msgid "A problem occurred" msgstr "Et problem opstod" #: ../src/ui/edit/main-toolbar.c:795 msgid "Prepare a new empty song" msgstr "Gør en ny tom sang klar" #: ../src/ui/edit/main-toolbar.c:801 msgid "Load a new song" msgstr "Indlæs en ny sang" #: ../src/ui/edit/main-toolbar.c:808 msgid "Save this song" msgstr "Gem denne sang" #: ../src/ui/edit/main-toolbar.c:818 msgid "Rewind playback position of this song" msgstr "Spol afspilning af denne sang tilbage" #: ../src/ui/edit/main-toolbar.c:827 msgid "Play this song" msgstr "Afspil denne sang" #: ../src/ui/edit/main-toolbar.c:833 msgid "Forward playback position of this song" msgstr "Spol afspilning af denne sang frem" #: ../src/ui/edit/main-toolbar.c:842 msgid "Stop playback of this song" msgstr "Stop afspilning af denne sang" #: ../src/ui/edit/main-toolbar.c:852 msgid "Toggle looping of playback" msgstr "SlÃ¥ afspilningsløkke til/fra" #. @idea have distinct tooltips with channel names #: ../src/ui/edit/main-toolbar.c:872 msgid "playback volume" msgstr "afspilningsvolume" #. add gain-control #. min= #. max= #. step= #: ../src/ui/edit/main-toolbar.c:890 msgid "Change playback volume" msgstr "Ændr afspilningsvolume" #. we don't use PACKAGE_NAME = 'buzztard' for the window title #: ../src/ui/edit/main-window.c:202 msgid "unsaved" msgstr "ugemt" #: ../src/ui/edit/main-window.c:202 msgid "saved" msgstr "gemt" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 #, c-format msgid "%d %s and %d %s" msgstr "%d %s og %d %s" #: ../src/ui/edit/main-window.c:285 msgid "hour" msgstr "time" #: ../src/ui/edit/main-window.c:285 msgid "hours" msgstr "timer" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minute" msgstr "minut" #: ../src/ui/edit/main-window.c:285 ../src/ui/edit/main-window.c:287 msgid "minutes" msgstr "minutter" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "second" msgstr "sekund" #: ../src/ui/edit/main-window.c:287 ../src/ui/edit/main-window.c:289 msgid "seconds" msgstr "sekunder" #: ../src/ui/edit/main-window.c:289 #, c-format msgid "%d %s" msgstr "%d %s" #: ../src/ui/edit/main-window.c:294 #, c-format msgid "" "All unsaved changes since %s will be lost. This song was last saved on: %s" msgstr "" "Alle ugemte ændringer siden %s vil gÃ¥ tabt. Denne sang blev sidst gemt den: " "%s" #: ../src/ui/edit/main-window.c:296 #, c-format msgid "All unsaved changes since %s will be lost. This song was created on: %s" msgstr "" "Alle ugemte ændringer siden %s vil gÃ¥ tabt. Denne sang blev oprettet den: %s" #: ../src/ui/edit/main-window.c:489 msgid "Really quit?" msgstr "Afslut?" #: ../src/ui/edit/main-window.c:499 msgid "New song?" msgstr "Ny sang?" #: ../src/ui/edit/main-window.c:527 msgid "Open a song" msgstr "Ã…bn en sang" #: ../src/ui/edit/main-window.c:647 #, c-format msgid "An error occurred while saving the song to file '%s'." msgstr "En fejl opstod da sangen blev forsøgt gemt til fil »%s«." #: ../src/ui/edit/main-window.c:648 ../src/ui/edit/main-window.c:898 #: ../src/ui/edit/main-window.c:910 msgid "Can't save song" msgstr "Kan ikke gemme sang" #. gchar *glob; #: ../src/ui/edit/main-window.c:684 msgid "Save a song" msgstr "Gem en sang" #: ../src/ui/edit/main-window.c:843 ../src/ui/edit/render-dialog.c:287 msgid "Format" msgstr "Format" #: ../src/ui/edit/main-window.c:884 ../src/ui/edit/main-window.c:885 msgid "File already exists" msgstr "Fil eksisterer allerede" #: ../src/ui/edit/main-window.c:886 msgid "Choose 'Okay' to overwrite or 'Cancel' to abort saving the song." msgstr "" "Vælg »Okay« for at overskrive eller »Afbryd« for at fortryde at gemme sangen." #: ../src/ui/edit/main-window.c:897 #, c-format msgid "An error occurred while writing the file '%s': %s" msgstr "Der opstod en fejl under skrivning af filen »%s«: %s" #: ../src/ui/edit/main-window.c:909 #, c-format msgid "An error occurred saving the song to file '%s'." msgstr "Der opstod en fejl under gemning af sangen til filen »%s«." #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-framework-elements-dialog.c:130 #: ../src/ui/edit/missing-framework-elements-dialog.c:147 msgid "Missing GStreamer elements" msgstr "Mangler GStreamer-elementer" #: ../src/ui/edit/missing-framework-elements-dialog.c:154 msgid "" "The elements listed below are missing from your installation, but are " "required." msgstr "" "Elementerne vist nedenfor, er krævet, men mangler fra din installation." #: ../src/ui/edit/missing-framework-elements-dialog.c:194 msgid "" "The elements listed below are missing from your installation, but are " "recommended for full functionality." msgstr "" "Elementerne vist nedenfor, anbefales for fuld funktionalitet, men mangler " "fra din installation." #: ../src/ui/edit/missing-framework-elements-dialog.c:196 msgid "don't warn again" msgstr "advar ikke igen" #. create and set window icon #. #. if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { #. gtk_window_set_icon(GTK_WINDOW(self),window_icon); #. g_object_unref(window_icon); #. } #. #. set dialog title #: ../src/ui/edit/missing-song-elements-dialog.c:116 #: ../src/ui/edit/missing-song-elements-dialog.c:133 msgid "Missing elements in song" msgstr "Manglende elementer i sang" #: ../src/ui/edit/missing-song-elements-dialog.c:140 msgid "The machines listed below are missing or failed to load." msgstr "Maskinerne listet nedenfor mangler eller kunne ikke indlæses." #: ../src/ui/edit/missing-song-elements-dialog.c:144 msgid "The waves listed below are missing or failed to load." msgstr "Waverne listet nedenfor mangler eller kunne ikke indlæses." #. GtkComboBox : pattern length #: ../src/ui/edit/pattern-properties-dialog.c:176 msgid "length" msgstr "længde" #. GtkSpinButton : number of voices #: ../src/ui/edit/pattern-properties-dialog.c:187 msgid "voices" msgstr "stemmer" #: ../src/ui/edit/render-dialog.c:224 msgid "song rendering" msgstr "sanggengivelse" #: ../src/ui/edit/render-dialog.c:243 msgid "Folder" msgstr "Mappe" #: ../src/ui/edit/render-dialog.c:247 #: ../src/ui/edit/settings-page-directories.c:99 #: ../src/ui/edit/settings-page-directories.c:109 #: ../src/ui/edit/settings-page-directories.c:119 msgid "Select a folder" msgstr "Vælg en mappe" #: ../src/ui/edit/render-dialog.c:253 msgid "Filename" msgstr "Filnavn" #: ../src/ui/edit/render-dialog.c:304 msgid "Mode" msgstr "Tilstand" #: ../src/ui/edit/render-progress.c:118 #, c-format msgid "Recording to: %s" msgstr "Optager til: %s" #: ../src/ui/edit/render-progress.c:149 msgid "song render progress" msgstr "status for sanggengivelse" #. gtk_widget_set_size_request(GTK_WIDGET(self),800,600); #: ../src/ui/edit/settings-dialog.c:145 msgid "buzztard settings" msgstr "buzztard indstillinger" #: ../src/ui/edit/settings-dialog.c:181 ../src/ui/edit/settings-dialog.c:236 msgid "Audio Devices" msgstr "Lydenheder" #: ../src/ui/edit/settings-dialog.c:188 ../src/ui/edit/settings-dialog.c:243 #: ../src/ui/edit/settings-page-interaction-controller.c:127 msgid "Interaction Controller" msgstr "Interaktionstyreenhed" #: ../src/ui/edit/settings-dialog.c:195 ../src/ui/edit/settings-dialog.c:250 #: ../src/ui/edit/settings-page-playback-controller.c:107 msgid "Playback Controller" msgstr "Afspilningsstyreenhed" #: ../src/ui/edit/settings-dialog.c:202 ../src/ui/edit/settings-dialog.c:260 msgid "Colors" msgstr "Farver" #: ../src/ui/edit/settings-dialog.c:209 ../src/ui/edit/settings-dialog.c:267 #: ../src/ui/edit/settings-page-shortcuts.c:75 msgid "Shortcuts" msgstr "Genveje" #: ../src/ui/edit/settings-dialog.c:216 ../src/ui/edit/settings-dialog.c:274 #: ../src/ui/edit/settings-page-directories.c:88 msgid "Directories" msgstr "Mapper" #: ../src/ui/edit/settings-page-audiodevices.c:147 msgid "Audio Device" msgstr "Lydenhed" # har det her en speciel betydning indenfor lydfagterminologi #: ../src/ui/edit/settings-page-audiodevices.c:154 msgid "Sink" msgstr "Datamodtager" #: ../src/ui/edit/settings-page-audiodevices.c:163 #, c-format msgid "system default: %s (%s)" msgstr "systemstandard: %s (%s)" #: ../src/ui/edit/settings-page-audiodevices.c:170 msgid "system default: -" msgstr "systemstandard: -" # samplingstempo #: ../src/ui/edit/settings-page-audiodevices.c:295 msgid "Sampling rate" msgstr "Samplingsfrekvens" #: ../src/ui/edit/settings-page-audiodevices.c:323 msgid "Channels" msgstr "Kanaler" #: ../src/ui/edit/settings-page-audiodevices.c:328 msgid "mono" msgstr "mono" #: ../src/ui/edit/settings-page-audiodevices.c:329 msgid "stereo" msgstr "stereo" #: ../src/ui/edit/settings-page-directories.c:95 msgid "Songs" msgstr "Sange" #: ../src/ui/edit/settings-page-directories.c:105 msgid "Recordings" msgstr "Optagelser" #: ../src/ui/edit/settings-page-directories.c:115 msgid "Waveforms" msgstr "Waveformer" #: ../src/ui/edit/settings-page-interaction-controller.c:134 msgid "Device" msgstr "Enhed" #: ../src/ui/edit/settings-page-interaction-controller.c:171 msgid "Controller" msgstr "Styreenhed" #. local network port number for socket communication #: ../src/ui/edit/settings-page-playback-controller.c:123 msgid "Port number" msgstr "Portnummer" #. set dialog title : machine -> machine analysis #: ../src/ui/edit/signal-analysis-dialog.c:706 #, c-format msgid "%s -> %s analysis" msgstr "%s -> %s analyse" #: ../src/ui/edit/signal-analysis-dialog.c:711 msgid "master analysis" msgstr "masteranalyse" #: ../src/ui/edit/signal-analysis-dialog.c:770 msgid "lin." msgstr "lin." #: ../src/ui/edit/signal-analysis-dialog.c:771 msgid "log." msgstr "log." #: ../src/ui/edit/signal-analysis-dialog.c:774 msgid "frequency mapping" msgstr "frekvensoversættelse" #: ../src/ui/edit/signal-analysis-dialog.c:778 msgid "single" msgstr "enkel" #: ../src/ui/edit/signal-analysis-dialog.c:779 msgid "double" msgstr "dobbelt" #: ../src/ui/edit/signal-analysis-dialog.c:780 msgid "triple" msgstr "tredobbelt" #: ../src/ui/edit/signal-analysis-dialog.c:783 msgid "spectrum precision" msgstr "spektrumpræcision" #: ../src/ui/edit/tip-dialog.c:48 msgid "New machines are added in machine view from the context menu." msgstr "Nye maskiner tilføjes i maskinvisningen fra kontekstmenuen." #: ../src/ui/edit/tip-dialog.c:49 msgid "" "Connect machines by holding the shift key and dragging a connection for the " "source to the target machine." msgstr "" "Forbind maskiner ved at holde tasten skift nede og trække en forbindelse fra " "kilden til mÃ¥lmaskinen." #: ../src/ui/edit/tip-dialog.c:50 msgid "Songs can be recorded as single waves per track to give it to remixers." msgstr "" "Sange kan optages som enkel bølger (waves) per spor sÃ¥ de kan overgives til " "remixere." #: ../src/ui/edit/tip-dialog.c:51 msgid "" "Fill the details on the info page. When recording songs, the metadata is " "added to the recording as tags." msgstr "" "Udfyld detaljerne pÃ¥ informationssiden. NÃ¥r der optages sange, sÃ¥ tilføjes " "metadataene til optagelsen som mærker." #: ../src/ui/edit/tip-dialog.c:52 msgid "" "Use jackaudio sink in audio device settings to get lower latencies for live " "machine control." msgstr "" "Brug jackaudio-datamodtager i opsætningen for lydenhed for at fÃ¥ lavere " "latens for live maskinkontrol." #: ../src/ui/edit/tip-dialog.c:53 msgid "" "You can use input devices such as joysticks, beside midi devices to live " "control machine parameters." msgstr "" "Du kan bruge inddataenheder sÃ¥som joystick, udover midi-enheder til live " "parametre for kontrolmaskiner." #: ../src/ui/edit/tip-dialog.c:54 msgid "" "You can use a upnp media client (e.g. media streamer on nokia tablets) to " "remote control buzztard." msgstr "" "Du kan bruge en upnp-medieklient (f.eks. media streamer pÃ¥ nokia-tabletter) " "til at kontrollere buzztard eksternt." #: ../src/ui/edit/tip-dialog.c:55 msgid "" "To enter notes, imagine your pc keyboard as a music keyboard in two rows. " "Bottom left y/z key becomes a 'c', s a 'c#', x a 'd' and so on." msgstr "" "For at indtaste noder, sÃ¥ se dit pc-tastatur som et musiktastatur i to " "rækker. Nederste til venstre y og z-taster bliver et »c«, s et »C#«, x et " "»d« og sÃ¥ videre." #: ../src/ui/edit/tip-dialog.c:56 msgid "" "You can get more help from the community on irc://irc.freenode.net/#buzztard." msgstr "" "Du kan fÃ¥ mere hjælp fra fællesskabet pÃ¥ irc://irc.freenode.net/#buzztard." #: ../src/ui/edit/tip-dialog.c:57 msgid "" "Pattern layouts are individual for each machine. Look at the statusbar at " "the bottom for information about the cursor-column." msgstr "" "Mønsterlayout er individuelle for hver maskine. Se pÃ¥ statusbjælken i bunden " "for information om markørkolonne." #: ../src/ui/edit/tip-dialog.c:58 msgid "" "Click the speaker icon in the pattern-view to hear notes as you enter them." msgstr "" "Klik pÃ¥ højtalerikonet i mønstervisningen for at høre noder mens du " "indtaster dem." #: ../src/ui/edit/tip-dialog.c:59 msgid "" "Each wire has volume and possible panorama/balance controls. These can also " "be adjusted in the machine-window of the machine that has the wire as an " "input." msgstr "" "Hver trÃ¥d har lydstyrke og kontrol af panorama og balance. Disse kan ogsÃ¥ " "justeres i maskinvinduet for maskinen som har trÃ¥den som inddata." #: ../src/ui/edit/tip-dialog.c:60 msgid "" "The wire volume control pops up upon a click on the arrow box on the wire." msgstr "" "Lydstyrkekontrollen for trÃ¥den kommer frem efter et klik pÃ¥ pileboksen pÃ¥ " "trÃ¥den." #: ../src/ui/edit/tip-dialog.c:61 msgid "" "The wire panorama/balance control pops up upon a shift+click on the arrow " "box on the wire if available." msgstr "" "Panorama og balancekontrollen for trÃ¥den kommer frem efter et skift+klik pÃ¥ " "pileboksen pÃ¥ trÃ¥den hvis tilgængelig." #: ../src/ui/edit/tip-dialog.c:199 msgid "Show tips on startup" msgstr "Vis tip ved opstart" #: ../src/ui/edit/tools.c:79 ../src/ui/edit/tools.c:106 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Kunne ikke finde pixmap-fil: %s" #: ../src/ui/edit/wire-canvas-item.c:791 msgid "Disconnect" msgstr "Afbryd" #~ msgid "Delete machine '%s'" #~ msgstr "Slet maskine »%s«" #~ msgid "Delete machine..." #~ msgstr "Slet maskine..." #~ msgid "There is no undo for this." #~ msgstr "Der er ingen fortryd for dette." #~ msgid "Delete pattern '%s'" #~ msgstr "Slet mønster »%s«" #~ msgid "Delete pattern..." #~ msgstr "Slet mønster..." #~ msgid " clear" #~ msgstr " ryd" #~ msgid " mute" #~ msgstr " slÃ¥ lyd fra" #~ msgid " break" #~ msgstr " skift" #~ msgid " bypass" #~ msgstr " gÃ¥ udenom" #~ msgid " solo" #~ msgstr " solo" #~ msgid "default" #~ msgstr "standard" #~ msgid "An error occurred while trying to load the song from file '%s'" #~ msgstr "En fejl opstod under forsøget pÃ¥ at indlæse sangen fra filen »%s«" #~ msgid "An error occurred while trying to open the file '%s' for writing: %s" #~ msgstr "" #~ "En fejl opstod under forsøget pÃ¥ at Ã¥bne filen »%s« til skrivning: %s" #~ msgid "An error occurred while trying to save the song to file '%s'." #~ msgstr "En fejl opstod under forsøget pÃ¥ at gemme sangen til fil »%s«." #~ msgid "Show version" #~ msgstr "Vis version" #~ msgid "" #~ "As planned, main focus for this release was the wavetable support. Its " #~ "done - buzztard can load what gstreamer can decode.The wavetable view has " #~ "a nice waveform widget. Related to that buzztard has a new song-format " #~ "that bundles the XML together with external files in a zip archive. Also " #~ "the UI has seen a lot of improvements. The machine view looks nicer - " #~ "Marc drew spiffy machine icons. In addition they now show real volume " #~ "meters when playing. All meters are now properly synced." #~ msgstr "" #~ "Som planlagt var hovedfokus i denne udgave understøttelse af wavetabel. " #~ "Den er nu færdig - buzztard kan indlæse det som gstreamer kan afkode. " #~ "Wavetableoversigten har en pæn waveform-dims. I forbindelse med dette har " #~ "buzztard et nyt sangformat som samler XML'en sammen med eksterne filer i " #~ "et zip-arkiv. Grænsefladen har ogsÃ¥ fÃ¥et en række forbedringer. " #~ "Maskineoverblikket ser pænere ud - Marc tegnede nogle smarte " #~ "maskineikoner. Derudover viser de nu reelle VU-metre, nÃ¥r der afspilles. " #~ "Alle VU-metre er nu synkrone." #~ msgid "interaction controller menu" #~ msgstr "menu for interaktionstyreenhed" #~ msgid "interaction controllers menu" #~ msgstr "menu for interaktionstyreenheder" #~ msgid "add menu" #~ msgstr "tilføj menu" #~ msgid "generators menu" #~ msgstr "menu for generatorer" #~ msgid "effects menu" #~ msgstr "effektmenu" #~ msgid "rename machine" #~ msgstr "omdøb maskine" #~ msgid "main menu" #~ msgstr "hovedmenu" #~ msgid "file menu" #~ msgstr "filmenu" #~ msgid "New" #~ msgstr "Ny" #~ msgid "Open" #~ msgstr "Ã…bn" #~ msgid "separator" #~ msgstr "adskiller" #~ msgid "Save" #~ msgstr "Gem" #~ msgid "Save as" #~ msgstr "Gem som" #~ msgid "Render" #~ msgstr "Rendere" #~ msgid "Quit" #~ msgstr "Afslut" #~ msgid "edit menu" #~ msgstr "rediger menu" #~ msgid "Cut" #~ msgstr "Klip" #~ msgid "Copy" #~ msgstr "Kopier" #~ msgid "Delete" #~ msgstr "Slet" #~ msgid "Settings" #~ msgstr "Indstillinger" #~ msgid "view menu" #~ msgstr "vis menu" #~ msgid "Wave table view" #~ msgstr "Wavetabelvisning" #~ msgid "Song information" #~ msgstr "Sanginformation" #~ msgid "playback menu" #~ msgstr "afspilningsmenu" #~ msgid "Play" #~ msgstr "Afspil" #~ msgid "Stop" #~ msgstr "Stop" #~ msgid "help menu" #~ msgstr "hjælpemenu" #~ msgid "Content" #~ msgstr "Indhold" #~ msgid "About" #~ msgstr "Om" #~ msgid "song information" #~ msgstr "sanginformation" #~ msgid "machine view" #~ msgstr "maskinevisning" #~ msgid "machine view toolbar" #~ msgstr "værktøjslinje for maskinevisning" #~ msgid "Zoom Fit" #~ msgstr "Zoom tilpas" #~ msgid "Zoom In" #~ msgstr "Zoom ind" #~ msgid "Zoom Out" #~ msgstr "Zoom ud" #~ msgid "machine and wire editor" #~ msgstr "maskine og forbindelseshÃ¥ndtering" #~ msgid "Delete unused pattern '%s'" #~ msgstr "Slet ubrugt mønster »%s«" #~ msgid "pattern view" #~ msgstr "mønstervisning" #~ msgid "pattern view toolbar" #~ msgstr "værktøjslinje for mønstervisning" #~ msgid "pattern editor" #~ msgstr "mønsterhÃ¥ndtering" #~ msgid " thru" #~ msgstr " igennem" #~ msgid "sequence view" #~ msgstr "sekvensvisning" #~ msgid "sequence view toolbar" #~ msgstr "værktøjslinje for sekvensvisning" #~ msgid "sequence editor" #~ msgstr "sekvenshÃ¥ndtering" #~ msgid "pattern list for sequence track" #~ msgstr "mønsterliste for sekvensspor" #~ msgid "wave table view" #~ msgstr "wavetabelvisning" #~ msgid "sample list toolbar" #~ msgstr "værktøjslinje for lydprøveliste" #~ msgid "Clear" #~ msgstr "Ryd" #~ msgid "wave list" #~ msgstr "waveliste" #~ msgid "sample browser toolbar" #~ msgstr "værktøjslinje for lydprøvebrowser" #~ msgid "sample edit toolbar" #~ msgstr "værktøjslinje for lydprøveredigering" #~ msgid "wave-level list" #~ msgstr "wave-niveauliste" #~ msgid "song views" #~ msgstr "sangvisninger" #~ msgid "main toolbar" #~ msgstr "hovedværktøjslinje" #~ msgid "main window" #~ msgstr "hovedvindue" #~ msgid "pattern properties" #~ msgstr "mønsteregenskaber" #~ msgid "settings pages" #~ msgstr "opsætningssider" #~ msgid "color settings" #~ msgstr "farveopsætning" #~ msgid "keyboard shortcut settings" #~ msgstr "opsætning af tastaturgenveje" #~ msgid "audio device settings" #~ msgstr "opsætning af lydenheder" #~ msgid "default directory settings" #~ msgstr "standard mappeopsætning" #~ msgid "interaction controller settings" #~ msgstr "opsætning for interaktionstyreenhed" #~ msgid "playback controller settings" #~ msgstr "opsætning for afspilningsstyreenhed" #~ msgid "Coherence UPnP" #~ msgstr "Sammenhæng UPnP" buzztard-0.6.0/config.h.in0000644042355400116100000000770111675570644012360 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS /* Package Name for Gettext */ #undef GETTEXT_PACKAGE /* gstreamer series */ #undef GST_MAJORMINOR /* if no runtime debugging, do not enable g_asserts */ #undef G_DISABLE_ASSERT /* if no runtime debugging, do not enable dynamic type checks */ #undef G_DISABLE_CAST_CHECKS /* if no runtime debugging, do not enable g_return_if_fail variants */ #undef G_DISABLE_CHECKS /* 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 `getrusage' function. */ #undef HAVE_GETRUSAGE /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define if you have the iconv() function. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_INPUT_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mlockall' function. */ #undef HAVE_MLOCKALL /* Define to 1 if you have the `sched_setscheduler' function. */ #undef HAVE_SCHED_SETSCHEDULER /* Define to 1 if you have the `setrlimit' function. */ #undef HAVE_SETRLIMIT /* 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 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 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 valgrind is to be used. */ #undef HAVE_VALGRIND /* Define to 1 if you have the header file. */ #undef HAVE_X11_XLOCALE_H /* Define to 1 if you have the header file. */ #undef HAVE_XMMINTRIN_H /* Define to the sub-directory in which 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 /* version as a number */ #undef PACKAGE_VERSION_NUMBER /* Define to 1 if the C compiler supports function prototypes. */ #undef PROTOTYPES /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if we can use bml */ #undef USE_BML /* enable runtime debugging code */ #undef USE_DEBUG /* Define to 1 if we can use GConf */ #undef USE_GCONF /* Define to 1 if we need to use gnomevfs libraries */ #undef USE_GNOMEVFS /* Define to 1 if we can use gsf libraries */ #undef USE_GSF /* Define to 1 if we can use gst-buzztard */ #undef USE_GSTBT /* Define to 1 if we can use gudev libraries */ #undef USE_GUDEV /* Define to 1 if we can use hal libraries */ #undef USE_HAL /* Define to 1 if we can use hildon libraries */ #undef USE_HILDON /* Version number of package */ #undef VERSION /* X font path */ #undef XFONT_PATH /* Path of Xvfb executable to be used to run gui unit tests under */ #undef XVFB_PATH /* Define like PROTOTYPES; this can be used by system headers. */ #undef __PROTOTYPES /* Define to empty if `const' does not conform to ANSI C. */ #undef const buzztard-0.6.0/tests/0000755042355400116100000000000011675570677011560 500000000000000buzztard-0.6.0/tests/bt-check.c0000644042355400116100000012572111634330220013301 00000000000000/* $Id: bt-check.c 3632 2011-09-15 08:00:14Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * testing helpers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION::btcheck: * @short_description: testing helpers */ #include "bt-check.h" #include #include #include #ifdef HAVE_SETRLIMIT #include #include #endif void bt_check_init(void) { #if GST_CHECK_VERSION(0,10,16) /* @todo: requires gst-0.10.16 */ extern gboolean bt_test_plugin_init (GstPlugin * plugin); gst_plugin_register_static(GST_VERSION_MAJOR, GST_VERSION_MINOR, "bt-test", "buzztard test plugin - several unit test support elements", bt_test_plugin_init, VERSION, "LGPL", PACKAGE, PACKAGE_NAME, "http://www.buzztard.org"); #endif GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-check", 0, "music production environment / unit tests"); // no ansi color codes in logfiles please gst_debug_set_colored(FALSE); // use our dummy settings bt_settings_set_factory((BtSettingsFactory)bt_test_settings_new); #ifdef HAVE_SETRLIMIT // only fork mode limit cpu/mem usage const gchar *mode = g_getenv ("CK_FORK"); if (!mode || strcmp(mode, "no")) { struct rlimit rl; rl.rlim_max = RLIM_INFINITY; // limit cpu in seconds rl.rlim_cur = 20; if(setrlimit(RLIMIT_CPU,&rl)<0) perror("setrlimit(RLIMIT_CPU) failed"); // limit process’s virtual memory in bytes // if we get failing tests and "mmap() failed: Cannot allocate memory" // this limmit needs to be increased rl.rlim_cur = 1024 * 1024 * 1024; // 1024 Mb = 1GB if(setrlimit(RLIMIT_AS,&rl)<0) perror("setrlimit(RLIMIT_AS) failed"); } #endif } /* * error trapping: * Check for certain log-output. */ static gboolean __check_error_trapped=FALSE; static gchar *__check_method=NULL; static gchar *__check_test=NULL; static GLogLevelFlags __fatal_mask=0; // is set during setup_log_capture() static gchar *__log_file_name=NULL; /* * Install a new error trap for function and output. */ void check_init_error_trapp(gchar *method, gchar *test) { __check_method=method; __check_test=test; __check_error_trapped=FALSE; __fatal_mask=g_log_set_always_fatal(G_LOG_FATAL_MASK); } /* * Check if the monitored log-output has been emitted. * If Gstreamer has not been compiled using --gst-enable-debug, this returns * %TRUE as there is no logoutput at all. */ gboolean check_has_error_trapped(void) { g_log_set_always_fatal(__fatal_mask); #ifndef GST_DISABLE_GST_DEBUG return(__check_error_trapped); #else return(TRUE); #endif } /* * log helper: * Helpers for handling glib log-messages. */ static void check_print_handler(const gchar * const message) { if(message) { FILE *logfile; gboolean add_nl=FALSE; guint sl=strlen(message); //-- check if messages has no newline if((sl>1) && (message[sl-1]!='\n')) add_nl=TRUE; //-- check message contents if(__check_method && (strstr(message,__check_method)!=NULL) && __check_test && (strstr(message,__check_test)!=NULL)) __check_error_trapped=TRUE; else if(__check_method && (strstr(message,__check_method)!=NULL) && !__check_test) __check_error_trapped=TRUE; else if(__check_test && (strstr(message,__check_test)!=NULL) && !__check_method) __check_error_trapped=TRUE; if((logfile=fopen(__log_file_name, "a")) || (logfile=fopen(__log_file_name, "w"))) { (void)fwrite(message,sl,1,logfile); if(add_nl) (void)fwrite("\n",1,1,logfile); fclose(logfile); } else { /* Fall back to console output if unable to open file */ printf("%s",message); if(add_nl) putchar('\n'); } } } /* static void check_critical_log_handler(const gchar * const log_domain, const GLogLevelFlags log_level, const gchar * const message, gpointer const user_data) { printf(">>> CRITICAL: %s\n",message); //-- check message contents if(__check_method && (strstr(message,__check_method)!=NULL) && __check_test && (strstr(message,__check_test)!=NULL)) __check_error_trapped=TRUE; else if(__check_method && (strstr(message,__check_method)!=NULL) && !__check_test) __check_error_trapped=TRUE; else if(__check_test && (strstr(message,__check_test)!=NULL) && !__check_method) __check_error_trapped=TRUE; } */ static void check_log_handler(const gchar * const log_domain, const GLogLevelFlags log_level, const gchar * const message, gpointer const user_data) { gchar *msg,*level; switch(log_level&G_LOG_LEVEL_MASK) { case G_LOG_LEVEL_ERROR: level="ERROR";break; case G_LOG_LEVEL_CRITICAL: level="CRITICAL";break; case G_LOG_LEVEL_WARNING: level="WARNING";break; case G_LOG_LEVEL_MESSAGE: level="MESSAGE";break; case G_LOG_LEVEL_INFO: level="INFO";break; case G_LOG_LEVEL_DEBUG: level="DEBUG";break; default: level="???";break; } msg=g_alloca(strlen(log_domain)+strlen(level)+strlen(message)+3); g_sprintf(msg,"%s-%s %s",log_domain,level,message); check_print_handler(msg); } #ifndef GST_DISABLE_GST_DEBUG static void check_gst_log_handler(GstDebugCategory *category, GstDebugLevel level, const gchar *file,const gchar *function,gint line,GObject *object,GstDebugMessage *_message,gpointer data) G_GNUC_NO_INSTRUMENT; static void check_gst_log_handler(GstDebugCategory *category, GstDebugLevel level, const gchar *file,const gchar *function,gint line,GObject *object,GstDebugMessage *_message,gpointer data) { const gchar *message=gst_debug_message_get(_message); //-- check message contents if(__check_method && (strstr(function,__check_method)!=NULL) && __check_test && (strstr(message,__check_test)!=NULL)) __check_error_trapped=TRUE; else if(__check_method && (strstr(function,__check_method)!=NULL) && !__check_test) __check_error_trapped=TRUE; else if(__check_test && (strstr(message,__check_test)!=NULL) && !__check_method) __check_error_trapped=TRUE; } #endif /* * setup_log: * @argc: command line argument count received in main() * @argv: command line arguments received in main() * * Initializes the logoutput channel. */ void setup_log(int argc, char **argv) { gchar *basename,*str; __log_file_name="/tmp/buzztard.log"; // get basename from argv[0]; -> lt-bt_edit if((str=g_path_get_basename(argv[0]))) { //fprintf(stderr,"name : '%s'\n",str);fflush(stderr); if((basename=g_strdup_printf("%s.log",&str[3]))) { //fprintf(stderr,"basename : '%s'\n",basename);fflush(stderr); // build path rooted in tmpdir (this is a tiny memleak, as we never free __log_file_name) if(!(__log_file_name=g_build_filename(g_get_tmp_dir(),basename,NULL))) { fprintf(stderr,"can't build logname from '%s','%s'\n",g_get_tmp_dir(),basename);fflush(stderr); __log_file_name="/tmp/buzztard.log"; } //fprintf(stderr,"logfilename : '%s'\n",__log_file_name);fflush(stderr); g_free(basename); } else { fprintf(stderr,"can't build basename from: '%s'\n",str);fflush(stderr); } g_free(str); } else { fprintf(stderr,"can't get basename from: '%s'\n",argv[0]);fflush(stderr); } // reset logfile g_unlink(__log_file_name); g_setenv("GST_DEBUG_FILE", __log_file_name, TRUE); } /* * setup_log_capture: * * Installs own logging handlers to capture and channelize all diagnostic output * during testing. In case of probelms that can help to locate the errors. */ void setup_log_capture(void) { (void)g_log_set_default_handler(check_log_handler,NULL); (void)g_log_set_handler(G_LOG_DOMAIN ,G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_log_set_handler("buzztard" ,G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_log_set_handler("GStreamer" ,G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_log_set_handler("GLib" ,G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_log_set_handler("GLib-GObject",G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_log_set_handler(NULL ,G_LOG_LEVEL_MASK|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, check_log_handler, NULL); (void)g_set_printerr_handler(check_print_handler); #ifndef GST_DISABLE_GST_DEBUG gst_debug_add_log_function(check_gst_log_handler, NULL); #endif } /* * file output tests: * Check if certain text has been outputted to a logfile. */ gboolean file_contains_str(gchar *tmp_file_name, gchar *str) { FILE *input_file; gchar read_str[1024]; gboolean ret=FALSE; g_assert(tmp_file_name); g_assert(str); input_file=fopen(tmp_file_name,"rb"); if (!input_file) { return ret; } while (!feof(input_file)) { if (!fgets(read_str, 1023, input_file)) { break; } read_str[1023]='\0'; if (strstr(read_str, str)) { ret=TRUE; break; } } fclose(input_file); return ret; } // runtime test selection via env-var BT_CHECKS gboolean _bt_check_run_test_func(const gchar * func_name) { const gchar *checks; gboolean res = FALSE; gchar **funcs, **f; checks = g_getenv ("BT_CHECKS"); /* no filter specified => run all checks */ if (checks == NULL || *checks == '\0') return TRUE; /* only run specified functions, regexps would be nice */ funcs = g_strsplit (checks, ",", -1); for (f = funcs; f != NULL && *f != NULL; ++f) { if (g_pattern_match_simple (*f, func_name)) { res = TRUE; break; } } g_strfreev (funcs); return res; } // test file access const gchar *check_get_test_song_path(const gchar *name) { static gchar path[2048]; // TESTSONGDIR gets defined in Makefile.am and is an absolute path g_snprintf(path,2047,TESTSONGDIR""G_DIR_SEPARATOR_S"%s",name); GST_INFO("build path: '%s'",path); return(path); } // test plugins void check_register_plugins(void) { // this is a hack to persuade the linker to not optimize out these :( if(!bt_test_mono_source_get_type()) g_print("registering mono-src faild"); } // property tests static gboolean check_read_int_param(GParamSpec *paramspec, GObject *toCheck) { gint check; gboolean ret=FALSE; g_object_get(toCheck,paramspec->name,&check,NULL); if ((check >= G_PARAM_SPEC_INT(paramspec)->minimum) && (check <= G_PARAM_SPEC_INT(paramspec)->maximum)) { ret=TRUE; } else { GST_WARNING("property read range check failed for : %s : %d <= %d <= %d", paramspec->name, G_PARAM_SPEC_INT(paramspec)->minimum, check, G_PARAM_SPEC_INT(paramspec)->maximum ); } return ret; } static gboolean check_read_uint_param(GParamSpec *paramspec, GObject *toCheck) { guint check; gboolean ret=FALSE; g_object_get(toCheck,paramspec->name,&check,NULL); if ((check >= G_PARAM_SPEC_UINT(paramspec)->minimum) && (check <= G_PARAM_SPEC_UINT(paramspec)->maximum)) { ret=TRUE; } else { GST_WARNING("property read range check failed for : %s : %u <= %u <= %u", paramspec->name, G_PARAM_SPEC_UINT(paramspec)->minimum, check, G_PARAM_SPEC_UINT(paramspec)->maximum ); } return ret; } static gboolean check_read_int64_param(GParamSpec *paramspec, GObject *toCheck) { gint64 check; gboolean ret=FALSE; g_object_get(toCheck,paramspec->name,&check,NULL); if ((check >= G_PARAM_SPEC_INT64(paramspec)->minimum) && (check <= G_PARAM_SPEC_INT64(paramspec)->maximum)) { ret=TRUE; } else { GST_WARNING("property read range check failed for : %s",paramspec->name); } return ret; } static gboolean check_read_long_param(GParamSpec *paramspec, GObject *toCheck) { glong check; gboolean ret=FALSE; g_object_get(toCheck,paramspec->name,&check,NULL); if ((check >= G_PARAM_SPEC_LONG(paramspec)->minimum) && (check <= G_PARAM_SPEC_LONG(paramspec)->maximum)) { ret=TRUE; } else { GST_WARNING("property read range check failed for : %s : %ld <= %ld <= %ld", paramspec->name, G_PARAM_SPEC_LONG(paramspec)->minimum, check, G_PARAM_SPEC_LONG(paramspec)->maximum ); } return ret; } static gboolean check_read_ulong_param(GParamSpec *paramspec, GObject *toCheck) { gulong check; gboolean ret=FALSE; g_object_get(toCheck,paramspec->name,&check,NULL); if ((check >= G_PARAM_SPEC_ULONG(paramspec)->minimum) && (check <= G_PARAM_SPEC_ULONG(paramspec)->maximum)) { ret=TRUE; } else { GST_WARNING("property read range check failed for : %s : %lu <= %lu <= %lu", paramspec->name, G_PARAM_SPEC_ULONG(paramspec)->minimum, check, G_PARAM_SPEC_ULONG(paramspec)->maximum ); } return ret; } static gboolean check_read_property(GParamSpec *paramspec, GObject *toCheck) { GType param_type; gboolean ret=FALSE; param_type=G_PARAM_SPEC_TYPE(paramspec); if(param_type == G_TYPE_PARAM_INT) { ret=check_read_int_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_UINT) { ret=check_read_uint_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_INT64) { ret=check_read_int64_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_LONG) { ret=check_read_long_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_ULONG) { ret=check_read_ulong_param(paramspec, toCheck); } else { // no check performed ret=TRUE; } return ret; } static gboolean check_write_int_param(GParamSpec *paramspec, GObject *toCheck) { gint check1, check2; check1=G_PARAM_SPEC_INT(paramspec)->minimum; g_object_set(toCheck,paramspec->name,check1,NULL); check2=G_PARAM_SPEC_INT(paramspec)->maximum; g_object_set(toCheck,paramspec->name,check2,NULL); return TRUE; } static gboolean check_write_uint_param(GParamSpec *paramspec, GObject *toCheck) { guint check1, check2; check1=G_PARAM_SPEC_UINT(paramspec)->minimum; g_object_set(toCheck,paramspec->name,check1,NULL); check2=G_PARAM_SPEC_UINT(paramspec)->maximum; g_object_set(toCheck,paramspec->name,check2,NULL); return TRUE; } static gboolean check_write_int64_param(GParamSpec *paramspec, GObject *toCheck) { gint64 check1, check2; check1=G_PARAM_SPEC_INT64(paramspec)->minimum; g_object_set(toCheck,paramspec->name,check1,NULL); check2=G_PARAM_SPEC_INT64(paramspec)->maximum; g_object_set(toCheck,paramspec->name,check2,NULL); return TRUE; } static gboolean check_write_long_param(GParamSpec *paramspec, GObject *toCheck) { glong check1, check2; check1=G_PARAM_SPEC_LONG(paramspec)->minimum; g_object_set(toCheck,paramspec->name,check1,NULL); check2=G_PARAM_SPEC_LONG(paramspec)->maximum; g_object_set(toCheck,paramspec->name,check2,NULL); return TRUE; } static gboolean check_write_ulong_param(GParamSpec *paramspec, GObject *toCheck) { gulong check1, check2; check1=G_PARAM_SPEC_ULONG(paramspec)->minimum; g_object_set(toCheck,paramspec->name,check1,NULL); check2=G_PARAM_SPEC_ULONG(paramspec)->maximum; g_object_set(toCheck,paramspec->name,check2,NULL); return TRUE; } static gboolean check_write_property(GParamSpec *paramspec, GObject *toCheck) { GType param_type; gboolean ret=FALSE; param_type=G_PARAM_SPEC_TYPE(paramspec); if(param_type == G_TYPE_PARAM_INT) { ret=check_write_int_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_UINT) { ret=check_write_uint_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_INT64) { ret=check_write_int64_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_LONG) { ret=check_write_long_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_ULONG) { ret=check_write_ulong_param(paramspec, toCheck); } else { // no check performed ret=TRUE; } return ret; } static gboolean check_readwrite_int_param(GParamSpec *paramspec, GObject *toCheck) { gint ival,oval; gboolean ret=TRUE; ival=G_PARAM_SPEC_INT(paramspec)->minimum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write minimum check failed for : %s : %d != %d", paramspec->name, ival,oval ); ret=FALSE; } /* ival=G_PARAM_SPEC_INT(paramspec)->maximum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write maximum check failed for : %s : %d != %d", paramspec->name, ival,oval ); ret=FALSE; } */ return ret; } static gboolean check_readwrite_uint_param(GParamSpec *paramspec, GObject *toCheck) { guint ival,oval; gboolean ret=TRUE; ival=G_PARAM_SPEC_UINT(paramspec)->minimum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write minimum check failed for : %s : %u != %u", paramspec->name, ival,oval ); ret=FALSE; } /* ival=G_PARAM_SPEC_UINT(paramspec)->maximum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write maximum check failed for : %s : %u != %u", paramspec->name, ival,oval ); ret=FALSE; } */ return ret; } static gboolean check_readwrite_int64_param(GParamSpec *paramspec, GObject *toCheck) { gint64 ival,oval; gboolean ret=TRUE; ival=G_PARAM_SPEC_INT64(paramspec)->minimum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write minimum check failed for : %s",paramspec->name); ret=FALSE; } /* ival=G_PARAM_SPEC_INT64(paramspec)->maximum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write maxmum check failed for : %s",paramspec->name); ret=FALSE; } */ return ret; } static gboolean check_readwrite_long_param(GParamSpec *paramspec, GObject *toCheck) { glong ival,oval; gboolean ret=TRUE; ival=G_PARAM_SPEC_LONG(paramspec)->default_value; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write default_value check failed for : %s : %ld != %ld", paramspec->name, ival,oval ); ret=FALSE; } /* ival=G_PARAM_SPEC_LONG(paramspec)->maximum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write maxmum check failed for : %s : %ld != %ld", paramspec->name, ival,oval ); ret=FALSE; } */ return ret; } static gboolean check_readwrite_ulong_param(GParamSpec *paramspec, GObject *toCheck) { gulong ival,oval; gboolean ret=TRUE; ival=G_PARAM_SPEC_ULONG(paramspec)->default_value; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write default_value check failed for : %s : %lu != %lu", paramspec->name, ival,oval ); ret=FALSE; } /* ival=G_PARAM_SPEC_ULONG(paramspec)->maximum; g_object_set(toCheck,paramspec->name, ival,NULL); g_object_get(toCheck,paramspec->name,&oval,NULL); if(ival!=oval) { GST_WARNING("property read/write maxmum check failed for : %s : %lu != %lu", paramspec->name, ival,oval ); ret=FALSE; } */ return ret; } static gboolean check_readwrite_property(GParamSpec *paramspec, GObject *toCheck) { GType param_type; gboolean ret=FALSE; param_type=G_PARAM_SPEC_TYPE(paramspec); if(param_type == G_TYPE_PARAM_INT) { ret=check_readwrite_int_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_UINT) { ret=check_readwrite_uint_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_INT64) { ret=check_readwrite_int64_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_LONG) { ret=check_readwrite_long_param(paramspec, toCheck); } else if (param_type == G_TYPE_PARAM_ULONG) { ret=check_readwrite_ulong_param(paramspec, toCheck); } else { // no check performed ret=TRUE; } return ret; } /** test gobject properties * @toCheck: the object to examine * * The function runs tests against all registered properties of the given * object. Depending on the flags and the type of the properties, tests include * read/write and boundary checks. * * TODO: * - tests limmits for integer/float props * - write twice to gobject props (to check if they unref the old one) * - test more type * - use test more often :) */ gboolean check_gobject_properties(GObject *toCheck) { gboolean ret=FALSE; gboolean check_read=TRUE; gboolean check_write=TRUE; gboolean check_readwrite=TRUE; guint n_properties; guint loop; GParamSpec **return_params; return_params=g_object_class_list_properties(G_OBJECT_GET_CLASS(toCheck),&n_properties); // iterate over properties for (loop=0; loopname); if (paramspec->flags&G_PARAM_READABLE) { if(!(check_read=check_read_property(paramspec, toCheck))) { GST_WARNING("property read check failed for : %s",paramspec->name); } } if (paramspec->flags&G_PARAM_WRITABLE) { if(!(check_write=check_write_property(paramspec, toCheck))) { GST_WARNING("property write check failed for : %s",paramspec->name); } } if (paramspec->flags&G_PARAM_READWRITE) { if(!(check_readwrite=check_readwrite_property(paramspec, toCheck))) { GST_WARNING("property read/write check failed for : %s",paramspec->name); } } } g_free(return_params); if (check_read && check_write && check_readwrite) { ret=TRUE; } return ret; } // gtk+ gui tests /* it could also be done in a makefile * http://git.imendio.com/?p=timj/gtk%2B-testing.git;a=blob;f=gtk/tests/Makefile.am;hb=72227f8f808a0343cb420f09ca480fc1847b6601 * * for testing: * Xnest :2 -ac & * metacity --display=:2 --sm-disable & * ./bt-edit --display=:2 & */ #ifdef XVFB_PATH static GPid server_pid; static GdkDisplayManager *display_manager=NULL; static GdkDisplay *default_display=NULL,*test_display=NULL; static volatile gboolean wait_for_server; static gchar display_name[3]; static gint display_number; static void __test_server_watch(GPid pid,gint status,gpointer data) { if(status==0) { GST_INFO("test x server %d process finished okay",pid); } else { GST_WARNING("test x server %d process finished with error %d",pid,status); } wait_for_server=FALSE; g_spawn_close_pid(pid); server_pid=0; } #endif void check_setup_test_server(void) { #ifdef XVFB_PATH //gulong flags=G_SPAWN_SEARCH_PATH|G_SPAWN_STDOUT_TO_DEV_NULL|G_SPAWN_STDERR_TO_DEV_NULL; gulong flags=G_SPAWN_SEARCH_PATH; GError *error=NULL; gchar display_file[18]; gchar lock_file[14]; // we can also use Xnest, but the without "-screen" gchar *server_argv[]={ "Xvfb", //"Xnest", ":9", "-ac", "-nolisten","tcp", #ifdef XFONT_PATH "-fp", XFONT_PATH, /*"/usr/X11R6/lib/X11/fonts/misc"*/ #endif "-noreset", /*"-terminate",*/ /* 32 bit does not work */ "-screen","0","1024x786x24", "-render",/*"color",*/ // seems whatever we do, Xvfb won't get xrandr support "-extension", "RANDR", NULL }; gboolean found=FALSE,launched=FALSE,trying=TRUE; server_pid=0; display_number=0; // try display ids starting with '0' while(trying) { wait_for_server=TRUE; g_sprintf(display_name,":%1d",display_number); g_sprintf(display_file,"/tmp/.X11-unix/X%1d",display_number); g_sprintf(lock_file,"/tmp/.X%1d-lock",display_number); // if we have a lock file, check if there is an alive process if(g_file_test(lock_file, G_FILE_TEST_EXISTS)) { FILE *pid_file; gchar pid_str[20]; guint pid; gchar proc_file[15]; // read pid, normal X11 is owned by root if((pid_file=fopen(lock_file,"rt"))) { gchar *pid_str_res=fgets(pid_str,20,pid_file); fclose(pid_file); if(pid_str_res) { pid=atol(pid_str); g_sprintf(proc_file,"/proc/%d",pid); // check proc entry if(!g_file_test(proc_file, G_FILE_TEST_EXISTS)) { // try to remove file and reuse display number if(!g_unlink(lock_file) && !g_unlink(display_file)) { found=TRUE; } } } } } else { found=TRUE; } // this display is not yet in use if(found && !g_file_test(display_file, G_FILE_TEST_EXISTS)) { // create the testing server server_argv[1]=display_name; if(!(g_spawn_async(NULL,server_argv,NULL,flags,NULL,NULL,&server_pid,&error))) { GST_ERROR("error creating virtual x-server : \"%s\"", error->message); g_error_free(error); } else { g_child_watch_add(server_pid,__test_server_watch,NULL); while(wait_for_server) { // try also waiting for /tmp/X%1d-lock" files if(g_file_test(display_file, G_FILE_TEST_EXISTS)) { wait_for_server=trying=FALSE; launched=TRUE; } else { sleep(1); } } } } if(!launched) { display_number++; // stop after trying the first ten displays if(display_number==10) trying=FALSE; } } if(!launched) { display_number=-1; GST_WARNING("no free display number found"); } else { // we still get a dozen of // Xlib: extension "RANDR" missing on display ... // this is a gdk bug: // https://bugzilla.gnome.org/show_bug.cgi?id=645856 // and it seems to be fixed in Jan.2011 //printf("####### Server started \"%s\" is up (pid=%d)\n",display_name,server_pid); g_setenv("DISPLAY",display_name,TRUE); GST_INFO("test server \"%s\" is up (pid=%d)",display_name,server_pid); /* a window manager is not that useful gchar *wm_argv[]={"metacity", "--sm-disable", NULL }; if(!(g_spawn_async(NULL,wm_argv,NULL,flags,NULL,NULL,NULL,&error))) { GST_WARNING("error running window manager : \"%s\"", error->message); g_error_free(error); } */ /* this is not working ** (gnome-settings-daemon:17715): WARNING **: Failed to acquire org.gnome.SettingsDaemon ** (gnome-settings-daemon:17715): WARNING **: Could not acquire name gchar *gsd_argv[]={"/usr/lib/gnome-settings-daemon/gnome-settings-daemon", NULL }; if(!(g_spawn_async(NULL,gsd_argv,NULL,flags,NULL,NULL,NULL,&error))) { GST_WARNING("error gnome-settings daemon : \"%s\"", error->message); g_error_free(error); } */ } #endif } void check_setup_test_display(void) { #ifdef XVFB_PATH if(display_number>-1) { // activate the display for use with gtk if((display_manager = gdk_display_manager_get())) { GdkScreen *default_screen; GtkSettings *default_settings; gchar *theme_name; default_display = gdk_display_manager_get_default_display(display_manager); if((default_screen = gdk_display_get_default_screen(default_display))) { /* this block when protected by gdk_threads_enter() and crashes if not :( */ //gdk_threads_enter(); if((default_settings = gtk_settings_get_for_screen(default_screen))) { g_object_get(default_settings,"gtk-theme-name",&theme_name,NULL); GST_INFO("current theme is \"%s\"",theme_name); //g_object_unref(default_settings); } else GST_WARNING("can't get default_settings"); //gdk_threads_leave(); //g_object_unref(default_screen); } else GST_WARNING("can't get default_screen"); if((test_display = gdk_display_open(display_name))) { #if 0 GdkScreen *test_screen; if((test_screen = gdk_display_get_default_screen(test_display))) { GtkSettings *test_settings; if((test_settings = gtk_settings_get_for_screen(test_screen))) { // this just switches to the default theme //g_object_set(test_settings,"gtk-theme-name",NULL,NULL); /* Is there a bug in gtk+? None of this reliable creates a working * theme setup */ //g_object_set(test_settings,"gtk-theme-name",theme_name,NULL); /* Again this shows no effect */ //g_object_set(test_settings,"gtk-toolbar-style",GTK_TOOLBAR_ICONS,NULL); //gtk_rc_reparse_all_for_settings(test_settings,TRUE); //gtk_rc_reset_styles(test_settings); GST_INFO("theme switched "); //g_object_unref(test_settings); } else GST_WARNING("can't get test_settings on display: \"%s\"",display_name); //g_object_unref(test_screen); } else GST_WARNING("can't get test_screen on display: \"%s\"",display_name); #endif gdk_display_manager_set_default_display(display_manager,test_display); GST_INFO("display %p,\"%s\" is active",test_display,gdk_display_get_name(test_display)); } else { GST_WARNING("failed to open display: \"%s\"",display_name); } //g_free(theme_name); } else { GST_WARNING("can't get display-manager"); } } #endif } void check_shutdown_test_display(void) { #ifdef XVFB_PATH if(test_display) { wait_for_server=TRUE; g_assert(GDK_IS_DISPLAY_MANAGER(display_manager)); g_assert(GDK_IS_DISPLAY(test_display)); g_assert(GDK_IS_DISPLAY(default_display)); GST_INFO("trying to shut down test display on server %d",server_pid); // restore default and close our display GST_DEBUG("display_manager=%p, test_display=%p,\"%s\" default_display=%p,\"%s\"", display_manager, test_display,gdk_display_get_name(test_display), default_display,gdk_display_get_name(default_display)); gdk_display_manager_set_default_display(display_manager,default_display); GST_INFO("display has been restored"); // TODO: here it hangs, hmm not anymore //gdk_display_close(test_display); /* gdk_display_close() does basically the following (which still hangs): //g_object_run_dispose (G_OBJECT (test_display)); GST_INFO("test_display has been disposed"); //g_object_unref (test_display); */ GST_INFO("display has been closed"); test_display=NULL; } else { GST_WARNING("no test display"); } #endif } void check_shutdown_test_server(void) { #ifdef XVFB_PATH if(server_pid) { guint wait_count=5; wait_for_server=TRUE; GST_INFO("shuting down test server"); // kill the testing server - @todo try other signals (SIGQUIT, SIGTERM). kill(server_pid, SIGINT); // wait for the server to finish (use waitpid() here ?) while(wait_for_server && wait_count) { sleep(1); wait_count--; } GST_INFO("test server has been shut down"); } else { GST_WARNING("no test server"); } #endif } // gtk+ gui screenshooter #if !GTK_CHECK_VERSION(2,18,0) #define gtk_widget_get_visible(widget) GTK_WIDGET_VISIBLE(widget) #endif static GdkPixbuf *make_screenshot(GtkWidget *widget) { GdkWindow *window=widget->window; gint ww,wh; // make sure the window gets drawn if(!gtk_widget_get_visible(widget)) { gtk_widget_show_all(widget); } if(GTK_IS_WINDOW(widget)) { gtk_window_present(GTK_WINDOW(widget)); //gtk_window_move(GTK_WINDOW(widget),30,30); } gtk_widget_queue_draw(widget); while(gtk_events_pending()) gtk_main_iteration(); gdk_window_get_geometry(window,NULL,NULL,&ww,&wh,NULL); return(gdk_pixbuf_get_from_drawable(NULL,window,NULL,0,0,0,0,ww,wh)); } static gchar *make_filename(GtkWidget *widget, const gchar *name) { gchar *filename; if(!name) { filename=g_strdup_printf("%s"G_DIR_SEPARATOR_S"%s_%s.png", g_get_tmp_dir(),g_get_prgname(),gtk_widget_get_name(widget)); } else { filename=g_strdup_printf("%s"G_DIR_SEPARATOR_S"%s_%s_%s.png", g_get_tmp_dir(),g_get_prgname(),gtk_widget_get_name(widget),name); } return(filename); } static void add_shadow_and_save(cairo_surface_t *image, gchar *filename, gint iw, gint ih) { cairo_surface_t *shadow; cairo_t *cr; gint x,y; gint ss=12; // shadow size gint so=0; // shadow offset gint sd=1+(ss-so); // number of draws // stupid simple drop shadow code shadow=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,iw+ss,ih+ss); cr=cairo_create(shadow); cairo_rectangle(cr,0.0,0.0,iw+ss,ih+ss); cairo_set_source_rgba(cr,1.0,1.0,1.0,1.0); cairo_fill(cr); // we draw sd*sd-24 and we don't want the gray-level to become >0.7 cairo_set_source_rgba(cr,0.0,0.0,0.0,0.7/(sd*sd-24.0)); for(x=ss;x>=so;x--) { for(y=ss;y>=so;y--) { // skip corners (this would need to be dependend on shadow size) if((x==ss || x==so) && (y>(ss-2) || y<(so+2))) continue; if((y==ss || y==so) && (x>(ss-2) || x<(so+2))) continue; if((x==(ss-1) || x==(so+1)) && (y>(ss-1) || y<(so+1))) continue; if((y==(ss-1) || y==(so+1)) && (x>(ss-1) || x<(so+1))) continue; cairo_mask_surface(cr,image,x,y); } } cairo_set_source_surface(cr,image,3,3); cairo_paint(cr); cairo_surface_write_to_png(shadow,filename); // cleanup cairo_destroy(cr); cairo_surface_destroy(shadow); } /* @todo: remember all names to build an index.html with a table and all images */ /* @todo: create diff images * - check if we have a ref image, skip otherwise * - should we have ref images in repo? * - own diff * - load old image and subtract pixels * - should we return a boolean for detected pixel changes? * - imagemagic * - http://www.imagemagick.org/script/compare.php * - need to make a html with table containing * [ name, ref image, cur image, diff image ] */ /* @todo: write a html image map for selected regions * - allows xrefs to the related part in the docs * - having tooltips on images wuld be cool */ /* * check_make_widget_screenshot: * @widget: a #GtkWidget to screenshoot * @name: filename or NULL. * * Captures the given widget as a png file. The filename is built from tmpdir, * application-name, widget-name and give @name. */ void check_make_widget_screenshot(GtkWidget *widget, const gchar *name) { GdkPixbuf *pixbuf, *scaled_pixbuf; gint iw,ih; gchar *filename; cairo_surface_t *surface; cairo_t *cr; g_return_if_fail(GTK_IS_WIDGET(widget)); filename=make_filename(widget,name); pixbuf = make_screenshot(widget); iw=gdk_pixbuf_get_width(pixbuf)*0.75; ih=gdk_pixbuf_get_height(pixbuf)*0.75; scaled_pixbuf = gdk_pixbuf_scale_simple(pixbuf,iw,ih,GDK_INTERP_HYPER); //gdk_pixbuf_save(scaled_pixbuf,filename,"png",NULL,NULL); // create a image surface with screenshot surface=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,iw,ih); cr=cairo_create(surface); gdk_cairo_set_source_pixbuf(cr,scaled_pixbuf,0,0); cairo_paint(cr); add_shadow_and_save(surface,filename,iw,ih); // cleanup cairo_destroy(cr); cairo_surface_destroy(surface); g_object_unref(pixbuf); g_object_unref(scaled_pixbuf); g_free(filename); } static GtkWidget *find_child(GtkWidget *w, BtCheckWidgetScreenshotRegions *r) { GtkWidget *f=NULL; gboolean match=TRUE; GST_INFO(" trying widget: '%s', '%s', '%s',%d", gtk_widget_get_name(w),(GTK_IS_LABEL(w)?gtk_label_get_text((GtkLabel *)w):NULL), G_OBJECT_TYPE_NAME(w),G_OBJECT_TYPE(w)); if(r->match&BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_TYPE) { if(!g_type_is_a(G_OBJECT_TYPE(w),r->type)) { GST_DEBUG(" wrong type: %d,%s",G_OBJECT_TYPE(w),G_OBJECT_TYPE_NAME(w)); match=FALSE; } } if(r->match&BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NAME) { if(g_strcmp0(gtk_widget_get_name(w),r->name)) { GST_DEBUG(" wrong name: %s",gtk_widget_get_name(w)); match=FALSE; } } if(r->match&BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_LABEL) { if((!GTK_IS_LABEL(w)) || g_strcmp0(gtk_label_get_text((GtkLabel *)w),r->label)) { GST_DEBUG(" not a label or wrong label text"); match=FALSE; } } if(match) { f=w; } else if(GTK_IS_CONTAINER(w)) { GList *node,*list=gtk_container_get_children(GTK_CONTAINER(w)); GtkWidget *c=NULL; GST_INFO(" searching container: '%s'",G_OBJECT_TYPE_NAME(w)); for(node=list;node;node=g_list_next(node)) { c=node->data; if((f=find_child(c,r))) { break; } } g_list_free(list); } return(f); } /* * check_make_widget_screenshot_with_highlight: * @widget: a #GtkWidget to screenshoot * @name: filename or NULL. * @regions: array of regions to highlight * * Captures the given widget as png files. The filename is built from tmpdir, * application-name, widget-name and give @name. * * Locates the widgets listed in @regions, highlights their position and draws * callouts to the given position. The callouts are numberd with the array * index. Widgets can be specified by name and/or type. * * The array needs to be terminated with an entry using * match=%BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NONE. */ void check_make_widget_screenshot_with_highlight(GtkWidget *widget, const gchar *name, BtCheckWidgetScreenshotRegions *regions) { GdkPixbuf *pixbuf, *scaled_pixbuf; GtkWidget *child,*parent; GtkAllocation a; gint iw,ih; gchar *filename; cairo_surface_t *surface; cairo_t *cr; cairo_pattern_t *grad; cairo_text_extents_t extent; BtCheckWidgetScreenshotRegions *r; gint c=12,b=(c/4)+(c*3),bl=c,br=c,bt=c,bb=c; gint wx,wy,ww,wh; gfloat lx1=0.0,ly1=0.0,lx2=0.0,ly2=0.0; gfloat cx=0.0,cy=0.0; gfloat f=0.75; gint num=1; gchar num_str[5]; gboolean have_space; g_return_if_fail(GTK_IS_WIDGET(widget)); filename=make_filename(widget,name); pixbuf=make_screenshot(widget); iw=gdk_pixbuf_get_width(pixbuf)*f; ih=gdk_pixbuf_get_height(pixbuf)*f; scaled_pixbuf=gdk_pixbuf_scale_simple(pixbuf,iw,ih,GDK_INTERP_HYPER); // check borders r=regions; while(r->match!=BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NONE) { switch(r->pos) { case GTK_POS_LEFT: bl=b; break; case GTK_POS_RIGHT: br=b; break; case GTK_POS_TOP: bt=b; break; case GTK_POS_BOTTOM: bb=b; break; } r++; } // create a image surface with screenshot surface=cairo_image_surface_create(CAIRO_FORMAT_ARGB32,iw+bl+br,ih+bt+bb); cr=cairo_create(surface); gdk_cairo_set_source_pixbuf(cr,scaled_pixbuf,bl,bt); cairo_paint(cr); // locate widgets and highlight the areas r=regions; while(r->match!=BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NONE) { GST_INFO("searching widget: '%s', '%s', '%s',%d",r->name,r->label,g_type_name(r->type),r->type); if((child=find_child(widget,r))) { // for label matches we look for a sensible parent if(r->match&BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_LABEL) { // TODO: should the region include gtk_label_get_mnemonic_widget()? if((parent=gtk_widget_get_ancestor(child,GTK_TYPE_BUTTON))) { child=parent; } if((parent=gtk_widget_get_ancestor(child,GTK_TYPE_TOOL_ITEM))) { child=parent; } } // highlight area parent=gtk_widget_get_parent(child); have_space=FALSE; if(parent) { if(GTK_IS_CONTAINER(parent) && gtk_container_get_border_width((GtkContainer *)parent)>0) { have_space=TRUE; } if(GTK_IS_BOX(parent) && gtk_box_get_spacing((GtkBox *)parent)>0) { have_space=TRUE; } } /* it seems that the API docs are lying and the allocations are relative to * the toplevel and not their parent */ // @todo: if we don't snapshot a top-level, we need to subtract the offset gtk_widget_get_allocation(child,&a); wx=a.x*f;wy=a.y*f;ww=a.width*f;wh=a.height*f; GST_INFO("found widget at: %d,%d with %dx%d pixel size",a.x,a.y,a.width,a.height); if(have_space) { cairo_rectangle(cr,bl+wx,bt+wy,ww,wh); } else { // we make this a bit smaller to separate adjacent widgets cairo_rectangle(cr,bl+wx+1,bt+wy+1,ww-2,wh-2); } cairo_set_source_rgba(cr,1.0,0.0,0.2,0.3); cairo_fill(cr); cairo_set_line_width(cr, 4); // callouts positions switch(r->pos) { case GTK_POS_LEFT: lx1=bl+wx; lx2=b-c; cx=lx2-c; cy=ly1=ly2=bt+wy+wh/2.0; break; case GTK_POS_RIGHT: lx1=bl+wx+ww; lx2=bl+iw+c; cx=lx2+c; cy=ly1=ly2=bt+wy+wh/2.0; break; case GTK_POS_TOP: break; case GTK_POS_BOTTOM: break; } // callout line grad=cairo_pattern_create_linear(lx1,ly1,lx2,ly2); cairo_pattern_add_color_stop_rgba(grad,0.00,1.0,0.0,0.2,0.3); cairo_pattern_add_color_stop_rgba(grad,1.00,1.0,0.0,0.2,1.0); cairo_set_source(cr,grad); cairo_move_to(cr,lx1,ly1); cairo_line_to(cr,lx2,ly2); cairo_stroke(cr); cairo_pattern_destroy(grad); // callout circle cairo_arc(cr,cx,cy,c,0.0,2*M_PI); cairo_set_source_rgba(cr,1.0,0.0,0.2,1.0); cairo_stroke_preserve(cr); cairo_set_source_rgba(cr,1.0,1.0,1.0,1.0); cairo_fill(cr); // callout label sprintf(num_str,"%d",num); cairo_set_source_rgba(cr,0.0,0.0,0.0,1.0); cairo_set_font_size(cr,10); cairo_text_extents(cr,num_str,&extent); // this is the bottom left pos for the text cairo_move_to(cr,cx-(extent.width/2.0),cy+(extent.height/2.0)); cairo_show_text(cr,num_str); } else { GST_WARNING("widget not found: '%s',%d",r->name,r->type); } r++; num++; } add_shadow_and_save(surface,filename,iw+bl+br,ih+bt+bb); // cleanup cairo_destroy(cr); cairo_surface_destroy(surface); g_object_unref(pixbuf); g_object_unref(scaled_pixbuf); g_free(filename); } /* * check_send_key: * @widget: a #GtkWidget to send the key even to * @keyval: the key code * * Send a key-press and a key-release of the given key to the @widget. */ void check_send_key(GtkWidget *widget, guint keyval) { GdkEventKey *e; GdkWindow *w; w=gtk_widget_get_window(widget); e=(GdkEventKey *)gdk_event_new(GDK_KEY_PRESS); e->window=g_object_ref(w); e->keyval=keyval; gtk_main_do_event((GdkEvent *)e); while(gtk_events_pending()) gtk_main_iteration(); gdk_event_free((GdkEvent *)e); e=(GdkEventKey *)gdk_event_new(GDK_KEY_RELEASE); e->window=g_object_ref(w); e->keyval=keyval; e->state|=GDK_RELEASE_MASK; gtk_main_do_event((GdkEvent *)e); while(gtk_events_pending()) gtk_main_iteration(); gdk_event_free((GdkEvent *)e); } buzztard-0.6.0/tests/m-bt-edit.c0000644042355400116100000001574511666764274013440 00000000000000/* $Id: m-bt-edit.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * graphical editor app unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* @todo: try gdk_error_trap_push() to use FORK mode and trap XErrors */ #define BT_CHECK #include "bt-check.h" #include "../src/ui/edit/bt-edit.h" GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); GST_DEBUG_CATEGORY_EXTERN(btic_debug); GST_DEBUG_CATEGORY_EXTERN(bt_edit_debug); extern Suite *bt_about_dialog_suite(void); extern Suite *bt_change_log_suite(void); extern Suite *bt_controller_learn_dialog_suite(void); extern Suite *bt_crash_recover_dialog_suite(void); extern Suite *bt_edit_application_suite(void); extern Suite *bt_interaction_controller_menu_suite(void); extern Suite *bt_machine_actions_suite(void); extern Suite *bt_machine_page_suite(void); extern Suite *bt_machine_preset_properties_dialog_suite(void); extern Suite *bt_machine_preferences_dialog_suite(void); extern Suite *bt_machine_properties_dialog_suite(void); extern Suite *bt_machine_rename_dialog_suite(void); extern Suite *bt_main_window_suite(void); extern Suite *bt_missing_framework_elements_dialog_suite(void); extern Suite *bt_missing_song_elements_dialog_suite(void); extern Suite *bt_pattern_page_suite(void); extern Suite *bt_pattern_properties_dialog_suite(void); extern Suite *bt_render_dialog_suite(void); extern Suite *bt_render_progress_dialog_suite(void); extern Suite *bt_sequence_page_suite(void); extern Suite *bt_settings_dialog_suite(void); extern Suite *bt_signal_analysis_dialog_suite(void); extern Suite *bt_tip_dialog_suite(void); gint test_argc=2; gchar test_arg0[]="check_buzzard"; gchar test_arg1[]="--sync"; gchar *test_argv[2]; gchar **test_argvptr; static BtSettings *settings; /* common setup and teardown code */ static void cleanup_cache_dir(void) { /* clean up cache dir */ if(g_file_test("buzztard",G_FILE_TEST_IS_DIR)) { GDir *dir; const gchar *log_name; gchar log_path[FILENAME_MAX]; if((dir=g_dir_open("buzztard",0,NULL))) { while((log_name=g_dir_read_name(dir))) { if(!g_str_has_suffix(log_name,".log")) { GST_WARNING("unexpected file %s found in temp log dir",log_name); continue; } g_sprintf(log_path,"buzztard"G_DIR_SEPARATOR_S"%s",log_name); g_remove(log_path); } g_dir_close(dir); g_rmdir("buzztard"); } } } void bt_edit_setup(void) { gtk_init(&test_argc,&test_argvptr); bt_init(&test_argc,&test_argvptr); btic_init(&test_argc,&test_argvptr); add_pixmap_directory(".."G_DIR_SEPARATOR_S"pixmaps"G_DIR_SEPARATOR_S); /* @todo: we need to ensure icons are found when running uninstalled * one problem is that we have them under "pixmaps" and not "icons" * maybe we should rename in svn theme=gtk_icon_theme_get_default() gtk_icon_theme_append_search_path(theme,....); */ bt_check_init(); GST_DEBUG_CATEGORY_INIT(bt_edit_debug, "bt-edit", 0, "music production environment / editor ui"); // set this to e.g. DEBUG to see more from gst in the log gst_debug_set_threshold_for_name("GST_*",GST_LEVEL_WARNING); gst_debug_set_threshold_for_name("bt-*",GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_core_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(btic_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_edit_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_check_debug,GST_LEVEL_DEBUG); //g_log_set_always_fatal(g_log_set_always_fatal(G_LOG_FATAL_MASK)|G_LOG_LEVEL_CRITICAL); /* cleanup cache dir before (first) test run */ cleanup_cache_dir(); GST_INFO("................................................................................"); check_setup_test_display(); GST_INFO("................................................................................"); /* set some good settings for the tests */ settings=bt_settings_make(); GST_INFO("tests have settings %p",settings); g_object_set(settings,"show-tips",FALSE,NULL); } void bt_edit_teardown(void) { if (settings) { g_object_unref(settings); settings=NULL; } GST_INFO("................................................................................"); check_shutdown_test_display(); /* cleanup cache dir after test run */ cleanup_cache_dir(); GST_INFO("................................................................................"); } /* start the test run */ int main(int argc, char **argv) { int nf; SRunner *sr; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif g_type_init(); g_set_application_name("Buzztard"); setup_log(argc,argv); setup_log_capture(); test_argv[0]=test_arg0; test_argv[1]=test_arg1; test_argvptr=test_argv; check_setup_test_server(); sr=srunner_create(bt_about_dialog_suite()); srunner_add_suite(sr, bt_change_log_suite()); srunner_add_suite(sr, bt_controller_learn_dialog_suite()); srunner_add_suite(sr, bt_crash_recover_dialog_suite()); srunner_add_suite(sr, bt_edit_application_suite()); srunner_add_suite(sr, bt_interaction_controller_menu_suite()); srunner_add_suite(sr, bt_machine_actions_suite()); srunner_add_suite(sr, bt_machine_page_suite()); srunner_add_suite(sr, bt_machine_preset_properties_dialog_suite()); srunner_add_suite(sr, bt_machine_preferences_dialog_suite()); srunner_add_suite(sr, bt_machine_properties_dialog_suite()); srunner_add_suite(sr, bt_machine_rename_dialog_suite()); srunner_add_suite(sr, bt_main_window_suite()); srunner_add_suite(sr, bt_missing_framework_elements_dialog_suite()); srunner_add_suite(sr, bt_missing_song_elements_dialog_suite()); srunner_add_suite(sr, bt_pattern_page_suite()); srunner_add_suite(sr, bt_pattern_properties_dialog_suite()); srunner_add_suite(sr, bt_render_dialog_suite()); srunner_add_suite(sr, bt_render_progress_dialog_suite()); srunner_add_suite(sr, bt_sequence_page_suite()); srunner_add_suite(sr, bt_settings_dialog_suite()); srunner_add_suite(sr, bt_signal_analysis_dialog_suite()); srunner_add_suite(sr, bt_tip_dialog_suite()); srunner_run_all(sr,CK_NORMAL); nf=srunner_ntests_failed(sr); srunner_free(sr); check_shutdown_test_server(); bt_deinit(); return(nf==0) ? EXIT_SUCCESS : EXIT_FAILURE; } buzztard-0.6.0/tests/lib/0000755042355400116100000000000011675570677012326 500000000000000buzztard-0.6.0/tests/lib/core/0000755042355400116100000000000011675570677013256 500000000000000buzztard-0.6.0/tests/lib/core/s-sink-machine.c0000644042355400116100000000227511576360403016136 00000000000000/* $Id: s-sink-machine.c 2202 2009-01-16 23:03:16Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_sink_machine_test_case(void); extern TCase *bt_sink_machine_example_case(void); Suite *bt_sink_machine_suite(void) { Suite *s=suite_create("BtSinkMachine"); suite_add_tcase(s,bt_sink_machine_test_case()); suite_add_tcase(s,bt_sink_machine_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/s-core.c0000644042355400116100000000221211576360403014507 00000000000000/* $Id: s-core.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_core_test_case(void); //extern TCase *bt_core_example_case(void); Suite *bt_core_suite(void) { Suite *s=suite_create("BtCore"); suite_add_tcase(s,bt_core_test_case()); //suite_add_tcase(s,bt_core_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/s-processor-machine.c0000644042355400116100000000234411576360403017206 00000000000000/* $Id: s-processor-machine.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //extern TCase *bt_processor_machine_test_case(void); extern TCase *bt_processor_machine_example_case(void); Suite *bt_processor_machine_suite(void) { Suite *s=suite_create("BtProcessorMachine"); //suite_add_tcase(s,bt_processor_machine_test_case()); suite_add_tcase(s,bt_processor_machine_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/e-network.c0000644042355400116100000005247311665661620015254 00000000000000/* $Id: e-network.c 3713 2011-12-01 11:22:55Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } /* * check if we can connect a sine machine to a sink. Also try to play after * connecting the machines. */ BT_START_TEST(test_btcore_net_static1) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL; BtMachine *sink=NULL; BtMachine *machine; // wires BtWire *wire, *wire1=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* check if we can retrieve the machine via the id */ machine=bt_setup_get_machine_by_id(setup,"master"); fail_unless(machine==sink, NULL); g_object_unref(machine); machine=bt_setup_get_machine_by_id(setup,"generator1"); fail_unless(machine==gen1, NULL); g_object_unref(machine); /* try to link machines */ wire1=bt_wire_new(song, gen1, sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* check if we can retrieve the wire via the source machine */ wire=bt_setup_get_wire_by_src_machine(setup,gen1); fail_unless(wire==wire1, NULL); g_object_try_unref(wire); /* check if we can retrieve the wire via the dest machine */ wire=bt_setup_get_wire_by_dst_machine(setup,sink); fail_unless(wire==wire1, NULL); g_object_try_unref(wire); /* enlarge the sequence */ g_object_set(sequence,"length",1L,"tracks",1L,NULL); bt_sequence_add_track(sequence,gen1,-1); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing of network song failed"); } g_object_unref(gen1); g_object_unref(sink); g_object_unref(wire1); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can connect two sine machines to one sink. Also try to play after * connecting the machines. */ BT_START_TEST(test_btcore_net_static2) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL,*gen2=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); fail_unless(sequence!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator2 */ gen2=BT_MACHINE(bt_source_machine_new(song,"generator2","audiotestsrc",0,&err)); fail_unless(gen2!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to sink */ wire1=bt_wire_new(song, gen1, sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen2 to sink */ wire2=bt_wire_new(song, gen2, sink,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); /* enlarge the sequence */ g_object_set(sequence,"length",1L,"tracks",2L,NULL); bt_sequence_add_track(sequence,gen1,-1); bt_sequence_add_track(sequence,gen2,-1); mark_point(); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing song failed"); } g_object_unref(gen1); g_object_unref(gen2); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can connect two sine machines to one effect and this to the * sink. Also try to start play after connecting the machines. */ BT_START_TEST(test_btcore_net_static3) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; BtSongInfo *song_info=NULL; // machines BtMachine *gen1=NULL,*gen2=NULL; BtMachine *proc=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL, *wire3=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,"song-info",&song_info,NULL); fail_unless(setup!=NULL, NULL); fail_unless(sequence!=NULL, NULL); fail_unless(song_info!=NULL, NULL); g_object_set(song_info,"name","btcore_net_example3",NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator2 */ gen2=BT_MACHINE(bt_source_machine_new(song,"generator2","audiotestsrc",0,&err)); fail_unless(gen2!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a processor with volume */ proc=BT_MACHINE(bt_processor_machine_new(song,"processor","volume",0,&err)); fail_unless(proc!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to proc */ wire1=bt_wire_new(song,gen1,proc,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen2 to proc */ wire2=bt_wire_new(song,gen2,proc,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from proc to sink */ wire3=bt_wire_new(song,proc,sink,&err); fail_unless(wire3!=NULL, NULL); fail_unless(err==NULL, NULL); /* enlarge the sequence */ g_object_set(sequence,"length",1L,"tracks",2L,NULL); bt_sequence_add_track(sequence,gen1,-1); bt_sequence_add_track(sequence,gen2,-1); mark_point(); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing song failed"); } g_object_unref(gen1); g_object_unref(gen2); g_object_unref(proc); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(wire3); g_object_unref(setup); g_object_unref(sequence); g_object_unref(song_info); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can connect two sine machines to one sink, then play() and * stop(). After stopping remove one machine and play again. */ BT_START_TEST(test_btcore_net_static4) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; BtSongInfo *song_info=NULL; // machines BtMachine *gen1=NULL,*gen2=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,"song-info",&song_info,NULL); fail_unless(setup!=NULL, NULL); fail_unless(sequence!=NULL, NULL); g_object_set(song_info,"name","btcore_net_example3",NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG_OBJECT(gen1,"added machine: %p,ref_count=%d",gen1,G_OBJECT_REF_COUNT(gen1)); /* try to create generator2 */ gen2=BT_MACHINE(bt_source_machine_new(song,"generator2","audiotestsrc",0,&err)); fail_unless(gen2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG_OBJECT(gen2,"added machine: %p,ref_count=%d",gen2,G_OBJECT_REF_COUNT(gen2)); /* try to create a wire from gen1 to proc */ wire1=bt_wire_new(song,gen1,sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG_OBJECT(gen1,"linked machine: %p,ref_count=%d",gen1,G_OBJECT_REF_COUNT(gen1)); /* try to create a wire from gen2 to proc */ wire2=bt_wire_new(song,gen2,sink,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG_OBJECT(gen2,"linked machine: %p,ref_count=%d",gen2,G_OBJECT_REF_COUNT(gen2)); /* enlarge the sequence */ g_object_set(sequence,"length",1L,"tracks",2L,NULL); bt_sequence_add_track(sequence,gen1,-1); GST_DEBUG_OBJECT(gen1,"added machine to sequence: %p,ref_count=%d",gen1,G_OBJECT_REF_COUNT(gen1)); bt_sequence_add_track(sequence,gen2,-1); GST_DEBUG_OBJECT(gen2,"added machine to sequence: %p,ref_count=%d",gen2,G_OBJECT_REF_COUNT(gen2)); mark_point(); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing of network song failed"); } /* remove one machine */ bt_setup_remove_wire(setup,wire2); g_object_unref(wire2); GST_DEBUG_OBJECT(gen2,"unlinked machine: %p,ref_count=%d",gen2,G_OBJECT_REF_COUNT(gen2)); res=bt_sequence_remove_track_by_machine(sequence,gen2); fail_unless(res, NULL); bt_setup_remove_machine(setup,gen2); GST_DEBUG_OBJECT(gen2,"removed machine from sequence: %p,ref_count=%d",gen2,G_OBJECT_REF_COUNT(gen2)); g_object_unref(gen2); mark_point(); /* try to start playing the song again */ if(bt_song_play(song)) { mark_point(); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing song failed again"); } g_object_unref(gen1); g_object_unref(sink); g_object_unref(wire1); g_object_unref(setup); g_object_unref(sequence); g_object_unref(song_info); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can connect a src machine to a sink while playing */ BT_START_TEST(test_btcore_net_dynamic_add_src) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL,*gen2=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to link machines */ wire1=bt_wire_new(song, gen1, sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* enlarge the sequence */ g_object_set(sequence,"length",10L,"tracks",1L,NULL); bt_sequence_add_track(sequence,gen1,-1); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); GST_DEBUG("song plays"); /* try to create generator1 */ gen2=BT_MACHINE(bt_source_machine_new(song,"generator2","audiotestsrc",0,&err)); fail_unless(gen2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("generator added"); /* try to link machines */ wire2=bt_wire_new(song, gen2, sink,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("wire added"); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing of network song failed"); } g_object_unref(gen1); g_object_unref(gen2); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can disconnect a src machine from a sink while playing. */ BT_START_TEST(test_btcore_net_dynamic_rem_src) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL,*gen2=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to link machines */ wire1=bt_wire_new(song, gen1, sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen2=BT_MACHINE(bt_source_machine_new(song,"generator2","audiotestsrc",0,&err)); fail_unless(gen2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("generator added"); /* try to link machines */ wire2=bt_wire_new(song, gen2, sink,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("wire added"); /* enlarge the sequence */ g_object_set(sequence,"length",10L,"tracks",1L,NULL); bt_sequence_add_track(sequence,gen1,-1); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); GST_DEBUG("song plays"); /* try to unlink machines */ bt_setup_remove_wire(setup,wire2); GST_DEBUG("wire removed"); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing of network song failed"); } g_object_unref(gen1); g_object_unref(gen2); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can connect a processor machine to a src and sink while playing */ BT_START_TEST(test_btcore_net_dynamic_add_proc) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL; BtMachine *proc=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL, *wire3=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); fail_unless(sequence!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to sink */ wire1=bt_wire_new(song,gen1,sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("wire added"); /* enlarge the sequence */ g_object_set(sequence,"length",10L,"tracks",1L,NULL); bt_sequence_add_track(sequence,gen1,-1); mark_point(); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); GST_DEBUG("song plays"); /* try to create a processor with volume */ proc=BT_MACHINE(bt_processor_machine_new(song,"processor","volume",0,&err)); fail_unless(proc!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to proc */ wire2=bt_wire_new(song,gen1,proc,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from proc to sink */ wire3=bt_wire_new(song,proc,sink,&err); fail_unless(wire3!=NULL, NULL); fail_unless(err==NULL, NULL); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing song failed"); } g_object_unref(gen1); g_object_unref(proc); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(wire3); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * check if we can disconnect a processor machine to a src and sink while playing */ BT_START_TEST(test_btcore_net_dynamic_rem_proc) { BtApplication *app=NULL; GError *err=NULL; // the song BtSong *song=NULL; BtSetup *setup=NULL; BtSequence *sequence=NULL; // machines BtMachine *gen1=NULL; BtMachine *proc=NULL; BtMachine *sink=NULL; // wires BtWire *wire1=NULL, *wire2=NULL, *wire3=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* get the song setup and sequence */ g_object_get(song,"setup",&setup,"sequence",&sequence,NULL); fail_unless(setup!=NULL, NULL); fail_unless(sequence!=NULL, NULL); /* try to create the sink */ sink=BT_MACHINE(bt_sink_machine_new(song,"master",&err)); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create generator1 */ gen1=BT_MACHINE(bt_source_machine_new(song,"generator1","audiotestsrc",0,&err)); fail_unless(gen1!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to sink */ wire1=bt_wire_new(song,gen1,sink,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); GST_DEBUG("wire added"); /* try to create a processor with volume */ proc=BT_MACHINE(bt_processor_machine_new(song,"processor","volume",0,&err)); fail_unless(proc!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from gen1 to proc */ wire2=bt_wire_new(song,gen1,proc,&err); fail_unless(wire2!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a wire from proc to sink */ wire3=bt_wire_new(song,proc,sink,&err); fail_unless(wire3!=NULL, NULL); fail_unless(err==NULL, NULL); /* enlarge the sequence */ g_object_set(sequence,"length",10L,"tracks",1L,NULL); bt_sequence_add_track(sequence,gen1,-1); mark_point(); /* try to start playing the song */ if(bt_song_play(song)) { mark_point(); sleep(1); GST_DEBUG("song plays"); /* try to unlink machines */ bt_setup_remove_wire(setup,wire2); GST_DEBUG("wire 2 removed"); bt_setup_remove_wire(setup,wire3); GST_DEBUG("wire 2 removed"); sleep(1); /* stop the song */ bt_song_stop(song); } else { fail("playing song failed"); } g_object_unref(gen1); g_object_unref(proc); g_object_unref(sink); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(wire3); g_object_unref(setup); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* should we have variants, where we remove the machines instead of the wires? */ TCase *bt_network_example_case(void) { TCase *tc = tcase_create("BtNetworkExamples"); tcase_add_test(tc,test_btcore_net_static1); tcase_add_test(tc,test_btcore_net_static2); tcase_add_test(tc,test_btcore_net_static3); tcase_add_test(tc,test_btcore_net_static4); tcase_add_test(tc,test_btcore_net_dynamic_add_src); tcase_add_test(tc,test_btcore_net_dynamic_rem_src); tcase_add_test(tc,test_btcore_net_dynamic_add_proc); tcase_add_test(tc,test_btcore_net_dynamic_rem_proc); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-source-machine.c0000644042355400116100000001323411576360403016451 00000000000000/* $Id: e-source-machine.c 3110 2010-12-16 20:48:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * In this example we show how to create a source machine and adding a * newly created pattern to it. Then we try to get the pattern back from * the machine by its id. * * We check also, if we can create a pattern iterator and getting the added * pattern back from the newly created iterator. */ BT_START_TEST(test_btsourcemachine_obj1){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=bt_source_machine_new(song,"gen","buzztard-test-mono-source",0,&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this example we show how to create a mono source machine and adding a * newly created pattern to it. Then we try to get the pattern back from * the machine by its id. * * We check also, if we can create a pattern iterator and getting the added * pattern back from the newly created iterator. */ BT_START_TEST(test_btsourcemachine_obj2){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; BtPattern *pattern=NULL; BtPattern *ref_pattern=NULL; GList *list,*node; gulong voices; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=bt_source_machine_new(song,"gen","buzztard-test-mono-source",0,&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* verify number of voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==0, NULL); /* try to get the same pattern back per id */ ref_pattern=bt_machine_get_pattern_by_id(BT_MACHINE(machine),"pattern-id"); fail_unless(ref_pattern==pattern, NULL); g_object_try_unref(ref_pattern); g_object_get(G_OBJECT(machine),"patterns",&list,NULL); /* the list should not be null */ fail_unless(list!=NULL, NULL); /* source machine has 3 default pattern (break+mute+solo) */ fail_unless(g_list_length(list)==4, NULL); node=g_list_last(list); /* the returned pointer should point to the same pattern, that we added to the machine before */ ref_pattern=node->data; fail_unless(ref_pattern==pattern, NULL); /* cleanup */ g_list_foreach(list,(GFunc)g_object_unref,NULL); g_list_free(list); g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this example we show how to create a poly source machine and adding a * newly created pattern to it. The we change the number of voices in the machine * and check back the voices in the pattern. */ BT_START_TEST(test_btsourcemachine_obj3){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; BtPattern *pattern=NULL; GstElement *element; gulong voices; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=bt_source_machine_new(song,"gen","buzztard-test-poly-source",1,&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* verify the number of voices */ g_object_get(machine,"machine",&element,NULL); voices=gst_child_proxy_get_children_count(GST_CHILD_PROXY(element)); g_object_unref(element); fail_unless(voices==1, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* verify number of voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==1, NULL); /* change number of voices in the machine and verify again */ g_object_set(machine,"voices",4,NULL); g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==4, NULL); /* cleanup */ g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_source_machine_example_case(void) { TCase *tc = tcase_create("BtSourceMachineExamples"); tcase_add_test(tc,test_btsourcemachine_obj1); tcase_add_test(tc,test_btsourcemachine_obj2); tcase_add_test(tc,test_btsourcemachine_obj3); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-song-io.c0000644042355400116100000000223211576360403015134 00000000000000/* $Id: s-song-io.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_song_io_test_case(void); extern TCase *bt_song_io_example_case(void); Suite *bt_song_io_suite(void) { Suite *s=suite_create("BtSongIO"); suite_add_tcase(s,bt_song_io_test_case()); suite_add_tcase(s,bt_song_io_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/s-song.c0000644042355400116100000000220611576360403014530 00000000000000/* $Id: s-song.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_song_test_case(void); extern TCase *bt_song_example_case(void); Suite *bt_song_suite(void) { Suite *s=suite_create("BtSong"); suite_add_tcase(s,bt_song_test_case()); suite_add_tcase(s,bt_song_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-song-io-native.c0000644042355400116100000000372611576360403016432 00000000000000/* $Id: t-song-io-native.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // try to create a songIO object from file with different format BT_START_TEST(test_btsong_io_native_obj1) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *song_io; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); song_io=bt_song_io_from_file(check_get_test_song_path("broken1.xml")); fail_unless(song_io != NULL, NULL); res=bt_song_io_load(song_io,song); fail_unless(res == FALSE, NULL); g_object_checked_unref(song_io); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_song_io_native_test_case(void) { TCase *tc = tcase_create("BtSongIONativeTests"); tcase_add_test(tc,test_btsong_io_native_obj1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-processor-machine.c0000644042355400116100000000676711576360403017205 00000000000000/* $Id: e-processor-machine.c 3110 2010-12-16 20:48:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests BT_START_TEST(test_btprocessormachine_obj1) { BtApplication *app=NULL; BtSong *song=NULL; BtProcessorMachine *machine; GError *err=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_processor_machine_new(song,"vol","volume",0,&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btprocessormachine_obj2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtProcessorMachine *machine; BtPattern *pattern=NULL; BtPattern *ref_pattern=NULL; GList *list,*node; gulong voices; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_processor_machine_new(song,"vol","volume",0,&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* verify number of voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==0, NULL); /* try to get the same pattern back per id */ ref_pattern=bt_machine_get_pattern_by_id(BT_MACHINE(machine),"pattern-id"); fail_unless(ref_pattern==pattern, NULL); g_object_try_unref(ref_pattern); g_object_get(G_OBJECT(machine),"patterns",&list,NULL); /* the list should not be null */ fail_unless(list!=NULL, NULL); /* source machine has 3 default pattern (break+mute+bypass) */ fail_unless(g_list_length(list)==4, NULL); node=g_list_last(list); /* the returned pointer should point to the same pattern, that we added to the machine before */ ref_pattern=node->data; fail_unless(ref_pattern==pattern, NULL); /* cleanup */ g_list_foreach(list,(GFunc)g_object_unref,NULL); g_list_free(list); g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_processor_machine_example_case(void) { TCase *tc = tcase_create("BtProcessorMachineExamples"); tcase_add_test(tc,test_btprocessormachine_obj1); tcase_add_test(tc,test_btprocessormachine_obj2); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/t-song.c0000644042355400116100000001245311641015736014535 00000000000000/* $Id: t-song.c 3663 2011-09-29 07:18:53Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals #if 0 static gboolean play_signal_invoked=FALSE; #endif //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // helper method to test the play signal #if 0 static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { play_signal_invoked=TRUE; } #endif BT_START_TEST(test_btsong_properties) { BtApplication *app=NULL; BtSong *song=NULL; gboolean check_prop_ret=FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); check_prop_ret=check_gobject_properties(G_OBJECT(song)); fail_unless(check_prop_ret==TRUE,NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if the default constructor handles NULL BT_START_TEST(test_btsong_obj1) { BtSong *song; /* create a new song */ check_init_error_trapp("bt_song_","BT_IS_APPLICATION(self->priv->app)"); song=bt_song_new(NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(song != NULL, NULL); g_object_unref(song); } BT_END_TEST // play without loading a song (means don't play anything audible) BT_START_TEST(test_btsong_play1) { BtApplication *app=NULL; BtSong *song=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); // returns TRUE even that the song is empty! res=bt_song_play(song); fail_unless(res==TRUE, NULL); bt_song_stop(song); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * test if the play method from the song works as aspected if the self parameter * is NULL */ BT_START_TEST(test_btsong_play2) { BtApplication *app=NULL; BtSong *song=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); /* check if a correct error message is thrown */ check_init_error_trapp("bt_song_play","BT_IS_SONG(self)"); bt_song_play(NULL); fail_unless(check_has_error_trapped(),NULL); bt_song_stop(song); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // load a new song while the first plays BT_START_TEST(test_btsong_play3) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); g_object_checked_unref(loader); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(1); //fail_unless(play_signal_invoked, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple2.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); bt_song_stop(song); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if we can get a empty setup from an empty song BT_START_TEST(test_btsong_setup1) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_song_test_case(void) { TCase *tc = tcase_create("BtSongTests"); tcase_add_test(tc,test_btsong_properties); tcase_add_test(tc,test_btsong_obj1); tcase_add_test(tc,test_btsong_play1); tcase_add_test(tc,test_btsong_play2); tcase_add_test(tc,test_btsong_play3); tcase_add_test(tc,test_btsong_setup1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-network.c0000644042355400116100000000223311576360403015253 00000000000000/* $Id: s-network.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_network_test_case(void); extern TCase *bt_network_example_case(void); Suite *bt_network_suite(void) { Suite *s=suite_create("BtNetwork"); suite_add_tcase(s,bt_network_test_case()); suite_add_tcase(s,bt_network_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-setup.c0000644042355400116100000006422311576360403014732 00000000000000/* $Id: t-setup.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests BT_START_TEST(test_btsetup_properties) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; gboolean check_prop_ret=FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); check_prop_ret=check_gobject_properties(G_OBJECT(setup)); fail_unless(check_prop_ret==TRUE,NULL); /* clean up */ g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * Try to add the same machine twice to the setup */ BT_START_TEST(test_btsetup_obj1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtMachine *machine=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create a machine (already adds the machine) */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); /* try to add machine again */ res=bt_setup_add_machine(setup,machine); fail_unless(res==FALSE, NULL); /* clean up */ g_object_unref(machine); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to add the same wire twice */ BT_START_TEST(test_btsetup_obj2){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtMachine *source=NULL; BtMachine *sink=NULL; BtWire *wire1,*wire2; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create the source machine */ source=BT_MACHINE(bt_source_machine_new(song,"gen","audiotestsrc",0,&err)); fail_unless(err==NULL, NULL); /* create the sink machine */ sink=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(err==NULL, NULL); /* try to create the wire */ wire1=bt_wire_new(song,source,sink,&err); fail_unless(wire1 != NULL, NULL); fail_unless(err==NULL, NULL); /* try to add again the same wire */ wire2=bt_wire_new(song,source,sink,&err); fail_unless(wire2 != NULL, NULL); fail_unless(err!=NULL, NULL); /* try to add again the same wire */ res=bt_setup_add_wire(setup,wire1); fail_unless(res==FALSE, NULL); /* clean up */ g_object_unref(wire1); g_object_unref(wire2); g_object_unref(source); g_object_unref(sink); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to create a new setup with a NULL song object */ BT_START_TEST(test_btsetup_obj3) { BtSetup *setup=NULL; // we don't use a _constructed method there yet //check_init_error_trapp("bt_setup_","BT_IS_SONG(self->priv->song)"); setup=bt_setup_new(NULL); //fail_unless(check_has_error_trapped(), NULL); fail_unless(setup != NULL, NULL); g_object_unref(setup); } BT_END_TEST /* * try to call bt_setup_add_machine with NULL object for self */ BT_START_TEST(test_btsetup_obj4) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_add_machine","BT_IS_SETUP(self)"); bt_setup_add_machine(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_add_machine with NULL object for machine */ BT_START_TEST(test_btsetup_obj5) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_add_machine","BT_IS_MACHINE(machine)"); bt_setup_add_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_add_wire with NULL object for self */ BT_START_TEST(test_btsetup_obj6) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_add_wire","BT_IS_SETUP(self)"); bt_setup_add_wire(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_add_wire with NULL object for wire */ BT_START_TEST(test_btsetup_obj7) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_add_wire","BT_IS_WIRE(wire)"); bt_setup_add_wire(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_machine_by_id with NULL object for self */ BT_START_TEST(test_btsetup_obj8) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_machine_by_id","BT_IS_SETUP(self)"); bt_setup_get_machine_by_id(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_machine_by_id with NULL object for id */ BT_START_TEST(test_btsetup_obj9) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_machine_by_id",NULL); bt_setup_get_machine_by_id(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_wire_by_src_machine with NULL for setup parameter */ BT_START_TEST(test_btsetup_get_wire_by_src_machine1) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_wire_by_src_machine","BT_IS_SETUP(self)"); bt_setup_get_wire_by_src_machine(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_wire_by_src_machine with NULL for machine parameter */ BT_START_TEST(test_btsetup_get_wire_by_src_machine2) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_wire_by_src_machine","BT_IS_MACHINE(src)"); bt_setup_get_wire_by_src_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by source machine with NULL for setup */ BT_START_TEST(test_btsetup_get_wires_by_src_machine1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtSourceMachine *src_machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* create source machine */ src_machine=bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(err==NULL, NULL); /* try to get the wires */ check_init_error_trapp("bt_setup_get_wires_by_src_machine","BT_IS_SETUP(self)"); bt_setup_get_wires_by_src_machine(NULL,BT_MACHINE(src_machine)); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(src_machine); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by source machine with NULL for machine */ BT_START_TEST(test_btsetup_get_wires_by_src_machine2) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to get the wires */ check_init_error_trapp("bt_setup_get_wires_by_src_machine","BT_IS_MACHINE(src)"); bt_setup_get_wires_by_src_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by source machine with a not added machine */ BT_START_TEST(test_btsetup_get_wires_by_src_machine3) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; GList *wire_list=NULL; BtSourceMachine *src_machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* create source machine */ src_machine=bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(err==NULL, NULL); /* remove machine from setup */ bt_setup_remove_machine(setup, BT_MACHINE(src_machine)); /* try to get the wires */ wire_list=bt_setup_get_wires_by_src_machine(setup,BT_MACHINE(src_machine)); fail_unless(wire_list==NULL,NULL); /* clean up */ g_object_unref(src_machine); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_wire_by_dst_machine with NULL for setup parameter */ BT_START_TEST(test_btsetup_get_wire_by_dst_machine1) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_wire_by_dst_machine","BT_IS_SETUP(self)"); bt_setup_get_wire_by_dst_machine(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to call bt_setup_get_wire_by_dst_machine with NULL for machine parameter */ BT_START_TEST(test_btsetup_get_wire_by_dst_machine2) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_get_wire_by_dst_machine","BT_IS_MACHINE(dst)"); bt_setup_get_wire_by_dst_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by destination machine with NULL for setup */ BT_START_TEST(test_btsetup_get_wires_by_dst_machine1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtSinkMachine *dst_machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create sink machine */ dst_machine=bt_sink_machine_new(song,"dst",&err); fail_unless(err==NULL, NULL); /* try to get the wires */ check_init_error_trapp("bt_setup_get_wires_by_dst_machine","BT_IS_SETUP(self)"); bt_setup_get_wires_by_dst_machine(NULL,BT_MACHINE(dst_machine)); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(dst_machine); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by sink machine with NULL for machine */ BT_START_TEST(test_btsetup_get_wires_by_dst_machine2) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* try to get the wires */ check_init_error_trapp("bt_setup_get_wires_by_dst_machine","BT_IS_MACHINE(dst)"); bt_setup_get_wires_by_dst_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to get wires by sink machine with a not added machine */ BT_START_TEST(test_btsetup_get_wires_by_dst_machine3) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; GList *wire_list=NULL; BtSinkMachine *dst_machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create sink machine */ dst_machine=bt_sink_machine_new(song,"dst",&err); fail_unless(err==NULL, NULL); /* remove machine from setup */ bt_setup_remove_machine(setup, BT_MACHINE(dst_machine)); /* try to get the wires */ wire_list=bt_setup_get_wires_by_dst_machine(setup,BT_MACHINE(dst_machine)); fail_unless(wire_list==NULL,NULL); /* clean up */ g_object_unref(dst_machine); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a machine from setup with NULL pointer for setup */ BT_START_TEST(test_btsetup_obj13) { BtApplication *app=NULL; BtSong *song=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); check_init_error_trapp("bt_setup_remove_machine",NULL); bt_setup_remove_machine(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a wire from setup with NULL pointer for setup */ BT_START_TEST(test_btsetup_obj14) { BtApplication *app=NULL; BtSong *song=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); check_init_error_trapp("bt_setup_remove_wire",NULL); bt_setup_remove_wire(NULL,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a machine from setup with NULL pointer for machine */ BT_START_TEST(test_btsetup_obj15) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_remove_machine",NULL); bt_setup_remove_machine(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a wire from setup with NULL pointer for wire */ BT_START_TEST(test_btsetup_obj16) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); check_init_error_trapp("bt_setup_remove_wire",NULL); bt_setup_remove_wire(setup,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a machine from setup with a machine witch is never added */ BT_START_TEST(test_btsetup_obj17) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtMachine *gen=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to create generator1 */ gen = BT_MACHINE(bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err)); fail_unless(gen!=NULL, NULL); fail_unless(err==NULL, NULL); /* and remove it from setup */ bt_setup_remove_machine(setup,gen); check_init_error_trapp("bt_setup_remove_machine", "trying to remove machine that is not in setup"); bt_setup_remove_machine(setup,gen); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(gen); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to remove a wire from setup with a wire witch is not added */ BT_START_TEST(test_btsetup_obj18) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtSinkMachine *sink=NULL; // wire BtWire *wire=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","audiotestsrc",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create sink machine */ sink = bt_sink_machine_new(song,"sink",&err); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire */ wire = bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink),&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* and remove it from setup */ bt_setup_remove_wire(setup,wire); check_init_error_trapp("bt_setup_remove_wire", "trying to remove wire that is not in setup"); bt_setup_remove_wire(setup,wire); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_unref(source); g_object_unref(sink); g_object_unref(wire); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to add wire(src,dst) and wire(dst,src) to setup. This should fail (cycle). */ BT_START_TEST(test_btsetup_wire1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtMachine *src=NULL; BtMachine *dst=NULL; // wire BtWire *wire1=NULL; BtWire *wire2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to craete volume machine */ src = BT_MACHINE(bt_processor_machine_new(song,"src","volume",0,&err)); fail_unless(src!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create volume machine */ dst = BT_MACHINE(bt_processor_machine_new(song,"dst","volume",0,&err)); fail_unless(dst!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire one */ wire1 = bt_wire_new(song,src,dst,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* this should fail */ wire2 = bt_wire_new(song,dst,src,&err); fail_unless(wire2!=NULL,NULL); fail_unless(err!=NULL, NULL); /* clean up */ g_object_unref(src); g_object_unref(dst); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to add wire(dst,src) and wire(src,dst) to setup. This should fail (cycle). */ BT_START_TEST(test_btsetup_wire2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtMachine *src=NULL; BtMachine *dst=NULL; // wire BtWire *wire1=NULL; BtWire *wire2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to craete volume machine */ src = BT_MACHINE(bt_processor_machine_new(song,"src","volume",0,&err)); fail_unless(src!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create volume machine */ dst = BT_MACHINE(bt_processor_machine_new(song,"dst","volume",0,&err)); fail_unless(dst!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire one */ wire1 = bt_wire_new(song,dst,src,&err); fail_unless(wire1!=NULL, NULL); fail_unless(err==NULL, NULL); /* this should fail */ wire2 = bt_wire_new(song,src,dst,&err); fail_unless(wire2!=NULL,NULL); fail_unless(err!=NULL, NULL); /* clean up */ g_object_unref(src); g_object_unref(dst); g_object_unref(wire1); g_object_unref(wire2); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to add wire(src1,dst), wire(dst,src2) and wire(src2,scr1) to setup. This * should fail (cycle). * * */ #ifdef __CHECK_DISABLED__ BT_START_TEST(test_btsetup_wire3) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtMachine *elem1=NULL; BtMachine *elem2=NULL; BtMachine *elem3=NULL; // wire BtWire *wire_one=NULL; BtWire *wire_two=NULL; BtWire *wire_three=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); /* try to craete volume machine */ elem1 = BT_MACHINE(bt_processor_machine_new(song,"elem1","volume",0)); fail_unless(elem1!=NULL, NULL); /* try to craete volume machine */ elem2 = BT_MACHINE(bt_processor_machine_new(song,"elem2","volume",0)); fail_unless(elem2!=NULL, NULL); /* try to create volume machine */ elem3 = BT_MACHINE(bt_processor_machine_new(song,"elem3","volume",0)); fail_unless(elem3!=NULL, NULL); /* try to create the wire one and two */ wire_one = bt_wire_new(song, elem1, elem2); fail_unless(wire_one!=NULL, NULL); wire_two = bt_wire_new(song, elem2, elem3); fail_unless(wire_two!=NULL,NULL); /* this should fail (should it?) */ wire_three = bt_wire_new(song, elem3, elem1); fail_unless(wire_three!=NULL,NULL); /* clean up */ g_object_unref(src1); g_object_unref(src2); g_object_unref(dst); g_object_unref(wire_one); g_object_unref(wire_two); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST #endif TCase *bt_setup_test_case(void) { TCase *tc = tcase_create("BtSetupTests"); tcase_add_test(tc,test_btsetup_properties); tcase_add_test(tc,test_btsetup_obj1); tcase_add_test(tc,test_btsetup_obj2); tcase_add_test(tc,test_btsetup_obj3); tcase_add_test(tc,test_btsetup_obj4); tcase_add_test(tc,test_btsetup_obj5); tcase_add_test(tc,test_btsetup_obj6); tcase_add_test(tc,test_btsetup_obj7); tcase_add_test(tc,test_btsetup_obj8); tcase_add_test(tc,test_btsetup_obj9); tcase_add_test(tc,test_btsetup_get_wire_by_src_machine1); tcase_add_test(tc,test_btsetup_get_wire_by_src_machine2); tcase_add_test(tc,test_btsetup_get_wires_by_src_machine1); tcase_add_test(tc,test_btsetup_get_wires_by_src_machine2); tcase_add_test(tc,test_btsetup_get_wires_by_src_machine3); tcase_add_test(tc,test_btsetup_get_wire_by_dst_machine1); tcase_add_test(tc,test_btsetup_get_wire_by_dst_machine2); tcase_add_test(tc,test_btsetup_get_wires_by_dst_machine1); tcase_add_test(tc,test_btsetup_get_wires_by_dst_machine2); tcase_add_test(tc,test_btsetup_get_wires_by_dst_machine3); tcase_add_test(tc,test_btsetup_obj13); tcase_add_test(tc,test_btsetup_obj14); tcase_add_test(tc,test_btsetup_obj15); tcase_add_test(tc,test_btsetup_obj16); tcase_add_test(tc,test_btsetup_obj17); tcase_add_test(tc,test_btsetup_obj18); tcase_add_test(tc,test_btsetup_wire1); tcase_add_test(tc,test_btsetup_wire2); // @todo make test work //tcase_add_test(tc,test_btsetup_wire3); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-machine.c0000644042355400116100000001450711576360403015157 00000000000000/* $Id: e-machine.c 3273 2011-03-27 13:35:23Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests BT_START_TEST(test_btmachine_obj1) { BtApplication *app; BtSong *song; BtMachine *machine; GError *err=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); /* should have no patterns */ fail_unless(!bt_machine_has_patterns(machine),NULL); g_object_checked_unref(song); g_object_checked_unref(machine); g_object_checked_unref(app); } BT_END_TEST /* * activate the input level meter in an unconnected machine */ BT_START_TEST(test_btmachine_enable_input_level1) { BtApplication *app=NULL; BtSong *song=NULL; BtMachine *machine; GError *err=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=BT_MACHINE(bt_processor_machine_new(song,"vol","volume",0,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); res=bt_machine_enable_input_pre_level(machine); fail_unless(res == TRUE, NULL); g_object_checked_unref(song); g_object_checked_unref(machine); g_object_checked_unref(app); } BT_END_TEST /* * activate the input level meter in a connected machine */ BT_START_TEST(test_btmachine_enable_input_level2) { BtApplication *app; BtSong *song; BtMachine *machine1,*machine2; BtWire *wire; GError *err=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create two machines */ machine1=BT_MACHINE(bt_processor_machine_new(song,"vol1","volume",0,&err)); fail_unless(machine1 != NULL, NULL); fail_unless(err==NULL, NULL); machine2=BT_MACHINE(bt_processor_machine_new(song,"vol2","volume",0,&err)); fail_unless(machine2 != NULL, NULL); fail_unless(err==NULL, NULL); /* connect them */ wire=bt_wire_new(song,machine1,machine2,&err); fail_unless(wire != NULL, NULL); fail_unless(err==NULL, NULL); res=bt_machine_enable_input_pre_level(machine2); fail_unless(res == TRUE, NULL); g_object_checked_unref(song); g_object_checked_unref(wire); g_object_checked_unref(machine1); g_object_checked_unref(machine2); g_object_checked_unref(app); } BT_END_TEST /* * activate the input gain control in an unconnected machine */ BT_START_TEST(test_btmachine_enable_input_gain1) { BtApplication *app; BtSong *song; BtMachine *machine; GError *err=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=BT_MACHINE(bt_processor_machine_new(song,"vol","volume",0,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); res=bt_machine_enable_input_gain(machine); fail_unless(res == TRUE, NULL); g_object_checked_unref(song); g_object_checked_unref(machine); g_object_checked_unref(app); } BT_END_TEST /* * activate the output gain control in an unconnected machine */ BT_START_TEST(test_btmachine_enable_output_gain1) { BtApplication *app; BtSong *song; BtMachine *machine; GError *err=NULL; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=BT_MACHINE(bt_processor_machine_new(song,"vol","volume",0,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); res=bt_machine_enable_output_gain(machine); fail_unless(res == TRUE, NULL); g_object_checked_unref(song); g_object_checked_unref(machine); g_object_checked_unref(app); } BT_END_TEST /* * change voices and verify that voices in machine and patetrn are in sync */ BT_START_TEST(test_btmachine_change_voices) { BtApplication *app; BtSong *song; BtMachine *machine; BtPattern *p1,*p2; gulong voices; GError *err=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",1L,&err)); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); /* create two patterns */ p1=bt_pattern_new(song,"pattern-id1","pattern-name1",8L,machine); fail_unless(p1!=NULL, NULL); p2=bt_pattern_new(song,"pattern-id2","pattern-name2",8L,machine); fail_unless(p1!=NULL, NULL); /* change voices and verify */ g_object_set(machine,"voices",2,NULL); g_object_get(p1,"voices",&voices,NULL); fail_unless(voices==2, NULL); g_object_get(p2,"voices",&voices,NULL); fail_unless(voices==2, NULL); g_object_checked_unref(song); g_object_checked_unref(machine); g_object_checked_unref(p1); g_object_checked_unref(p2); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_example_case(void) { TCase *tc = tcase_create("BtMachineExamples"); tcase_add_test(tc,test_btmachine_obj1); tcase_add_test(tc,test_btmachine_enable_input_level1); tcase_add_test(tc,test_btmachine_enable_input_level2); tcase_add_test(tc,test_btmachine_enable_input_gain1); tcase_add_test(tc,test_btmachine_enable_output_gain1); tcase_add_test(tc,test_btmachine_change_voices); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/t-song-info.c0000644042355400116100000000344111576360403015464 00000000000000/* $Id: t-song-info.c 2206 2009-01-19 20:03:52Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * try to create a new setup with a NULL song object */ BT_START_TEST(test_btsonginfo_obj1) { BtSongInfo *song_info=NULL; // we don't use a _constructed method there yet //check_init_error_trapp("bt_song_info_","BT_IS_SONG(self->priv->song)"); song_info=bt_song_info_new(NULL); //fail_unless(check_has_error_trapped(), NULL); fail_unless(song_info != NULL, NULL); g_object_unref(song_info); } BT_END_TEST TCase *bt_song_info_test_case(void) { TCase *tc = tcase_create("BtSongInfoTests"); tcase_add_test(tc,test_btsonginfo_obj1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-sink-machine.c0000644042355400116100000001224611576360403016117 00000000000000/* $Id: e-sink-machine.c 3110 2010-12-16 20:48:31Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests BT_START_TEST(test_btsinkmachine_obj1) { BtApplication *app=NULL; BtSong *song=NULL; BtSinkMachine *machine; GError *err=NULL; BtSettings *settings=bt_settings_make(); /* configure a sink for testing */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); g_object_try_unref(machine); g_object_unref(settings); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsinkmachine_obj2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine; BtPattern *pattern=NULL; BtPattern *ref_pattern=NULL; GList *list,*node; gulong voices; BtSettings *settings=bt_settings_make(); /* configure a sink for testing */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* verify number of voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==0, NULL); /* try to get the same pattern back per id */ ref_pattern=bt_machine_get_pattern_by_id(BT_MACHINE(machine),"pattern-id"); fail_unless(ref_pattern==pattern, NULL); g_object_try_unref(ref_pattern); g_object_get(G_OBJECT(machine),"patterns",&list,NULL); /* the list should not be null */ fail_unless(list!=NULL, NULL); /* source machine has 2 default pattern (break+mute) */ fail_unless(g_list_length(list)==3, NULL); node=g_list_last(list); /* the returned pointer should point to the same pattern, that we added to the machine before */ ref_pattern=node->data; fail_unless(ref_pattern==pattern, NULL); /* cleanup */ g_list_foreach(list,(GFunc)g_object_unref,NULL); g_list_free(list); g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsinkmachine_default) { BtApplication *app=NULL; BtSong *song=NULL; BtSinkMachine *machine; GError *err=NULL; BtSettings *settings=bt_settings_make(); /* configure a sink for testing */ g_object_set(settings,"audiosink",NULL,NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); g_object_try_unref(machine); g_object_unref(settings); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsinkmachine_fallback) { BtApplication *app=NULL; BtSong *song=NULL; BtSinkMachine *machine; GError *err=NULL; gchar *settings_str=NULL; BtSettings *settings=bt_settings_make(); /* configure a sink for testing */ g_object_set(settings,"audiosink",NULL,NULL); bt_test_settings_set(BT_TEST_SETTINGS(settings),"system-audiosink",&settings_str); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* create a machine */ machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine != NULL, NULL); fail_unless(err==NULL, NULL); g_object_try_unref(machine); g_object_unref(settings); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_sink_machine_example_case(void) { TCase *tc = tcase_create("BtSinkMachineExamples"); tcase_add_test(tc,test_btsinkmachine_obj1); tcase_add_test(tc,test_btsinkmachine_obj2); tcase_add_test(tc,test_btsinkmachine_default); tcase_add_test(tc,test_btsinkmachine_fallback); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/Makefile.in0000644042355400116100000005645311675570635015252 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/lib/core DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbtcore_check_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libbtcore_check_la_OBJECTS = s-core.lo t-core.lo s-machine.lo \ e-machine.lo t-machine.lo s-network.lo e-network.lo \ t-network.lo s-pattern.lo e-pattern.lo t-pattern.lo \ s-processor-machine.lo e-processor-machine.lo s-sequence.lo \ e-sequence.lo t-sequence.lo s-setup.lo e-setup.lo t-setup.lo \ s-sink-machine.lo e-sink-machine.lo t-sink-machine.lo \ s-song.lo t-song.lo e-song.lo s-song-io.lo e-song-io.lo \ t-song-io.lo s-song-io-native.lo e-song-io-native.lo \ t-song-io-native.lo s-song-info.lo e-song-info.lo \ t-song-info.lo s-source-machine.lo e-source-machine.lo \ t-source-machine.lo s-wire.lo t-wire.lo s-wire-pattern.lo \ e-wire-pattern.lo s-settings.lo t-settings.lo libbtcore_check_la_OBJECTS = $(am_libbtcore_check_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbtcore_check_la_SOURCES) DIST_SOURCES = $(libbtcore_check_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ noinst_LTLIBRARIES = libbtcore-check.la libbtcore_check_la_LIBADD = $(BASE_DEPS_LIBS) libbtcore_check_la_SOURCES = m-bt-core.h \ s-core.c t-core.c \ s-machine.c e-machine.c t-machine.c \ s-network.c e-network.c t-network.c \ s-pattern.c e-pattern.c t-pattern.c \ s-processor-machine.c e-processor-machine.c \ s-sequence.c e-sequence.c t-sequence.c \ s-setup.c e-setup.c t-setup.c \ s-sink-machine.c e-sink-machine.c t-sink-machine.c \ s-song.c t-song.c e-song.c \ s-song-io.c e-song-io.c t-song-io.c \ s-song-io-native.c e-song-io-native.c t-song-io-native.c \ s-song-info.c e-song-info.c t-song-info.c \ s-source-machine.c e-source-machine.c t-source-machine.c \ s-wire.c t-wire.c \ s-wire-pattern.c e-wire-pattern.c \ s-settings.c t-settings.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 tests/lib/core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/lib/core/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbtcore-check.la: $(libbtcore_check_la_OBJECTS) $(libbtcore_check_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbtcore_check_la_OBJECTS) $(libbtcore_check_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-processor-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-sink-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-song-info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-song-io-native.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-song-io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-song.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-source-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-wire-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-processor-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-sink-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-song-info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-song-io-native.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-song-io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-song.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-source-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-wire-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-wire.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-network.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-sink-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-song-info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-song-io-native.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-song-io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-song.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-source-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-wire.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcore_check_la_SOURCES) # 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: buzztard-0.6.0/tests/lib/core/e-song-info.c0000644042355400116100000000673611576360403015457 00000000000000/* $Id: e-song-info.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } /* * In this test we show, how to get the creation date of an song from the * song info class. We load a example song and try to retrive the creation date * from it. */ BT_START_TEST(test_btsonginfo_createdate) { BtApplication *app=NULL; BtSong *song; BtSongIO *loader; BtSongInfo *song_info=NULL; gchar *create_dts=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); // loading a song xml file loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); mark_point(); bt_song_io_load(loader,song); mark_point(); // get the song info class from the song property g_object_get(song,"song-info",&song_info,NULL); mark_point(); // get the creating date property from the song info g_object_get(song_info,"create-dts",&create_dts,NULL); fail_unless(create_dts!=NULL,NULL); g_free(create_dts); g_object_unref(song_info); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * Test changing the tempo */ BT_START_TEST(test_btsonginfo_tempo) { BtApplication *app=NULL; BtSong *song; BtSongIO *loader; BtSongInfo *song_info; BtSequence *sequence; GstClockTime t1, t2; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); // loading a song xml file loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); mark_point(); bt_song_io_load(loader,song); mark_point(); // get the song info class from the song property g_object_get(song,"song-info",&song_info,"sequence",&sequence,NULL); mark_point(); // set a new bpm g_object_set(song_info,"bpm",120,NULL); t1=bt_sequence_get_bar_time(sequence); // set a new bpm g_object_set(song_info,"bpm",60,NULL); t2=bt_sequence_get_bar_time(sequence); fail_unless(t2>t1,NULL); fail_unless((t2/2)==t1,NULL); // wait a bit for the change to happen g_usleep(G_USEC_PER_SEC/10); g_object_unref(song_info); g_object_unref(sequence); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_song_info_example_case(void) { TCase *tc = tcase_create("BtSongInfoExamples"); tcase_add_test(tc,test_btsonginfo_createdate); tcase_add_test(tc,test_btsonginfo_tempo); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/t-machine.c0000644042355400116100000001546711645631664015213 00000000000000/* $Id: t-machine.c 3688 2011-10-13 18:53:38Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* this is an abstract base class, which should not be instantiable * unfortunately glib manages again to error out here in a fashion that exits the app :( */ /* BT_START_TEST(test_btmachine_abstract) { BtMachine *machine; machine=g_object_new(BT_TYPE_MACHINE,NULL); fail_unless(machine==NULL,NULL); } BT_END_TEST */ /* * audiotestsrc | volume | audio_sink * mute audiotestsrc, mute volume, unmute volume, test if volume still is muted */ BT_START_TEST(test_btmachine_state1) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; GError *err=NULL; // machines BtSourceMachine *source=NULL; BtProcessorMachine *volume=NULL; BtSinkMachine *sink=NULL; // wires BtWire *wire_src_proc=NULL; BtWire *wire_proc_sink=NULL; // machine states BtMachineState state_ref; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create a new source machine */ source=bt_source_machine_new(song,"source","audiotestsrc",0,&err); /* create a new processor machine */ volume=bt_processor_machine_new(song,"volume","volume",0,&err); /* create a new sink machine */ sink=bt_sink_machine_new(song, "alsasink",&err); /* create wire (src,proc) */ wire_src_proc=bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(volume),&err); /* create wire (proc,sink) */ wire_proc_sink=bt_wire_new(song,BT_MACHINE(volume),BT_MACHINE(sink),&err); /* start setting the states */ g_object_set(source,"state",BT_MACHINE_STATE_MUTE,NULL); g_object_get(source,"state",&state_ref,NULL); fail_unless(state_ref==BT_MACHINE_STATE_MUTE,NULL); g_object_set(volume,"state",BT_MACHINE_STATE_MUTE,NULL); g_object_get(volume,"state",&state_ref,NULL); fail_unless(state_ref==BT_MACHINE_STATE_MUTE,NULL); g_object_set(source,"state",BT_MACHINE_STATE_NORMAL,NULL); g_object_get(source,"state",&state_ref,NULL); fail_unless(state_ref==BT_MACHINE_STATE_NORMAL,NULL); g_object_get(volume,"state",&state_ref,NULL); fail_unless(state_ref==BT_MACHINE_STATE_MUTE,NULL); g_object_unref(wire_proc_sink); g_object_unref(wire_src_proc); g_object_unref(sink); g_object_unref(volume); g_object_unref(source); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * audiotestsrc1, audiotestsrc2 | audio_sink * solo audiotestsrc1, solo audiotestsrc2, test that audiotestsrc1 is not solo */ BT_START_TEST(test_btmachine_state2) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; GError *err=NULL; // machines BtSourceMachine *sine1=NULL; BtSourceMachine *sine2=NULL; BtSinkMachine *sink=NULL; // wires BtWire *wire_sine1_sink=NULL; BtWire *wire_sine2_sink=NULL; // machine states BtMachineState state_ref; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create a new sine source machine */ sine1=bt_source_machine_new(song,"sine1","audiotestsrc",0,&err); /* create a new sine source machine */ sine2=bt_source_machine_new(song,"sine2","audiotestsrc",0,&err); /* create a new sink machine */ sink=bt_sink_machine_new(song,"alsasink",&err); /* create wire (sine1,src) */ wire_sine1_sink=bt_wire_new(song,BT_MACHINE(sine1),BT_MACHINE(sink),&err); /* create wire (sine2,src) */ wire_sine2_sink=bt_wire_new(song,BT_MACHINE(sine2),BT_MACHINE(sink),&err); mark_point(); /* start setting the states */ g_object_set(sine1,"state",BT_MACHINE_STATE_SOLO,NULL); g_object_set(sine2,"state",BT_MACHINE_STATE_SOLO,NULL); g_object_get(sine1,"state",&state_ref,NULL); fail_unless(state_ref!=BT_MACHINE_STATE_SOLO,NULL); g_object_unref(wire_sine1_sink); g_object_unref(wire_sine2_sink); g_object_unref(sink); g_object_unref(sine2); g_object_unref(sine1); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * create two machines from the same type, rename them and then link them in * checks that we ensure unique names */ BT_START_TEST(test_btmachine_names) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; GError *err=NULL; // machines BtSourceMachine *sine1=NULL; BtSourceMachine *sine2=NULL; BtSinkMachine *sink=NULL; // wires BtWire *wire_sine1_sink=NULL; BtWire *wire_sine2_sink=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* create a new sine source machine */ sine1=bt_source_machine_new(song,"sine1","audiotestsrc",0,&err); g_object_set(sine1, "id", "beep1", NULL); /* create a new sine source machine */ sine2=bt_source_machine_new(song,"sine2","audiotestsrc",0,&err); g_object_set(sine2, "id", "beep2", NULL); /* create a new sink machine */ sink=bt_sink_machine_new(song,"alsasink",&err); mark_point(); /* create wires */ wire_sine2_sink=bt_wire_new(song,BT_MACHINE(sine2),BT_MACHINE(sink),&err); wire_sine1_sink=bt_wire_new(song,BT_MACHINE(sine1),BT_MACHINE(sink),&err); mark_point(); g_object_unref(wire_sine1_sink); g_object_unref(wire_sine2_sink); g_object_unref(sink); g_object_unref(sine2); g_object_unref(sine1); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_test_case(void) { TCase *tc = tcase_create("BtMachineTests"); // @todo try catching the critical log //tcase_add_test(tc, test_btmachine_abstract); tcase_add_test(tc, test_btmachine_state1); tcase_add_test(tc, test_btmachine_state2); tcase_add_test(tc, test_btmachine_names); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-song-io-native.c0000644042355400116100000000231211576360403016417 00000000000000/* $Id: s-song-io-native.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_song_io_native_test_case(void); extern TCase *bt_song_io_native_example_case(void); Suite *bt_song_io_native_suite(void) { Suite *s=suite_create("BtSongIONative"); suite_add_tcase(s,bt_song_io_native_test_case()); suite_add_tcase(s,bt_song_io_native_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-network.c0000644042355400116100000000435611641015736015263 00000000000000/* $Id: t-network.c 3663 2011-09-29 07:18:53Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * try to check if we can create a network of NULL machines and NULL wires * * this is a negative test */ BT_START_TEST(test_btcore_net1) { BtApplication *app=NULL; BtSong *song=NULL; BtSetup *setup=NULL; gboolean song_ret; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* get the setup for the song */ g_object_get(G_OBJECT(song),"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to add a NULL wire to the setup */ check_init_error_trapp("bt_setup_add_wire","BT_IS_WIRE"); bt_setup_add_wire(setup, NULL); fail_unless(check_has_error_trapped(), NULL); /* try to start playing the song */ song_ret=bt_song_play(song); fail_unless(song_ret==TRUE, NULL); bt_song_stop(song); g_object_unref(setup); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_network_test_case(void) { TCase *tc = tcase_create("BtNetworkTests"); tcase_add_test(tc,test_btcore_net1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-source-machine.c0000644042355400116100000000231311576360403016463 00000000000000/* $Id: s-source-machine.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_source_machine_test_case(void); extern TCase *bt_source_machine_example_case(void); Suite *bt_source_machine_suite(void) { Suite *s=suite_create("BtSourceMachine"); suite_add_tcase(s,bt_source_machine_test_case()); suite_add_tcase(s,bt_source_machine_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-wire.c0000644042355400116100000000716011576360403014535 00000000000000/* $Id: t-wire.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * try to create a wire with the same machine as source and dest */ BT_START_TEST(test_btwire_obj1){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtWire *wire=NULL; // machine BtProcessorMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); /* try to create a source machine */ machine=bt_processor_machine_new(song,"id","volume",0,&err); fail_unless(machine!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to add the machine twice to the wire */ wire=bt_wire_new(song,BT_MACHINE(machine),BT_MACHINE(machine),&err); fail_unless(wire!=NULL,NULL); fail_unless(err!=NULL, NULL); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwire_obj2){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; BtWire *wire1=NULL; BtWire *wire2=NULL; BtSourceMachine *source=NULL; BtProcessorMachine *sink1=NULL; BtProcessorMachine *sink2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL,NULL); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create a source machine */ source=bt_source_machine_new(song,"id","audiotestsrc",0,&err); fail_unless(source!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to create a volume machine */ sink1=bt_processor_machine_new(song,"volume1","volume",0,&err); fail_unless(sink1!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to create a volume machine */ sink2=bt_processor_machine_new(song,"volume2","volume",0,&err); fail_unless(sink2!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to connect source machine to volume1 */ wire1=bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink1),&err); mark_point(); fail_unless(wire1!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to connect source machine to volume2 */ wire2=bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink2),&err); mark_point(); fail_unless(wire2!=NULL,NULL); fail_unless(err==NULL, NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_wire_test_case(void) { TCase *tc = tcase_create("BtWireTests"); tcase_add_test(tc,test_btwire_obj1); tcase_add_test(tc,test_btwire_obj2); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-sequence.c0000644042355400116100000000224211576360403015372 00000000000000/* $Id: s-sequence.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_sequence_test_case(void); extern TCase *bt_sequence_example_case(void); Suite *bt_sequence_suite(void) { Suite *s=suite_create("BtSequence"); suite_add_tcase(s,bt_sequence_test_case()); suite_add_tcase(s,bt_sequence_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-sequence.c0000644042355400116100000002152311601351356015372 00000000000000/* $Id: t-sequence.c 3416 2011-06-25 12:22:04Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* apply generic property tests to sequence */ BT_START_TEST(test_btsequence_properties) { BtApplication *app=NULL; BtSong *song=NULL; BtSequence *sequence=NULL; gboolean check_prop_ret=FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); g_object_get(song,"sequence",&sequence,NULL); fail_unless(sequence!=NULL,NULL); check_prop_ret=check_gobject_properties(G_OBJECT(sequence)); fail_unless(check_prop_ret==TRUE,NULL); /* clean up */ g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* try to create a new sequence with NULL for song object */ BT_START_TEST(test_btsequence_obj1) { BtSequence *sequence=NULL; check_init_error_trapp("bt_sequence_","BT_IS_SONG(self->priv->song)"); sequence=bt_sequence_new(NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(sequence != NULL, NULL); g_object_unref(sequence); } BT_END_TEST /* try to add a NULL machine to the sequence */ BT_START_TEST(test_btsequence_add_track1) { BtApplication *app=NULL; BtSong *song=NULL; BtSequence *sequence=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(BT_SONG(song), "sequence", &sequence, NULL); fail_unless(sequence!=NULL,NULL); check_init_error_trapp("","BT_IS_MACHINE(machine)"); bt_sequence_add_track(sequence,NULL,-1); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* try to add a new machine for the sequence with NULL for the sequence parameter */ BT_START_TEST(test_btsequence_add_track2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=bt_source_machine_new(song,"id","audiotestsrc",0,&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); check_init_error_trapp("","BT_IS_SEQUENCE(self)"); bt_sequence_add_track(NULL,BT_MACHINE(machine),-1); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* try to remove a NULL machine from the sequence */ BT_START_TEST(test_btsequence_rem_track1) { BtApplication *app=NULL; BtSong *song=NULL; BtSequence *sequence=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(BT_SONG(song), "sequence", &sequence, NULL); fail_unless(sequence!=NULL,NULL); check_init_error_trapp("","BT_IS_MACHINE(machine)"); bt_sequence_remove_track_by_machine(sequence,NULL); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* try to remove a machine from the sequence that has never added */ BT_START_TEST(test_btsequence_rem_track2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSequence *sequence=NULL; BtSourceMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(BT_SONG(song), "sequence", &sequence, NULL); fail_unless(sequence!=NULL,NULL); /* try to create a source machine */ machine=bt_source_machine_new(song,"id","audiotestsrc",0,&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); bt_sequence_remove_track_by_machine(sequence,BT_MACHINE(machine)); /* clean up */ g_object_try_unref(machine); g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* try to add a label to the sequence beyond the sequence length */ BT_START_TEST(test_btsequence_length1) { BtApplication *app=NULL; BtSong *song=NULL; BtSequence *sequence=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(BT_SONG(song), "sequence", &sequence, NULL); fail_unless(sequence!=NULL,NULL); /* enlarge length */ g_object_set(sequence,"length",4L,NULL); check_init_error_trapp("bt_sequence_set_label","timepriv->length"); bt_sequence_set_label(sequence,5,"test"); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsequence_pattern1) { BtApplication *app; GError *err=NULL; BtSong *song; BtSequence *sequence; BtMachine *machine; BtPattern *pattern; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"sequence",&sequence,NULL); /* create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen-m","buzztard-test-mono-source",0,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* enlarge length & tracks */ g_object_set(sequence,"length",4L,NULL); /* set pattern (which should be rejected - no track has been added) */ check_init_error_trapp("bt_sequence_set_pattern","trackpriv->tracks"); bt_sequence_set_pattern(sequence,0,0,pattern); fail_unless(check_has_error_trapped(), NULL); /* clean up */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsequence_pattern2) { BtApplication *app; GError *err=NULL; BtSong *song; BtSequence *sequence; BtMachine *machine1,*machine2; BtPattern *pattern1,*pattern2,*pattern3; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"sequence",&sequence,NULL); /* create two source machines */ machine1=BT_MACHINE(bt_source_machine_new(song,"gen-m","buzztard-test-mono-source",0,&err)); fail_unless(machine1!=NULL, NULL); fail_unless(err==NULL, NULL); machine2=BT_MACHINE(bt_source_machine_new(song,"gen-p","buzztard-test-poly-source",1,&err)); fail_unless(machine2!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern1=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine1); fail_unless(pattern1!=NULL, NULL); /* enlarge length*/ g_object_set(sequence,"length",4L,NULL); /* add tracks */ bt_sequence_add_track(sequence,machine1,-1); bt_sequence_add_track(sequence,machine2,-1); /* get pattern */ pattern2=bt_sequence_get_pattern(sequence,0,1); /* set pattern (which should be rejected - wrong machine) */ bt_sequence_set_pattern(sequence,0,1,pattern1); /* get pattern again and verify */ pattern3=bt_sequence_get_pattern(sequence,0,1); fail_unless(pattern2==pattern3, NULL); /* clean up */ g_object_unref(pattern1); g_object_unref(machine1); g_object_unref(machine2); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_sequence_test_case(void) { TCase *tc = tcase_create("BtSequenceTests"); tcase_add_test(tc,test_btsequence_properties); tcase_add_test(tc,test_btsequence_obj1); tcase_add_test(tc,test_btsequence_add_track1); tcase_add_test(tc,test_btsequence_add_track2); tcase_add_test(tc,test_btsequence_rem_track1); tcase_add_test(tc,test_btsequence_rem_track2); tcase_add_test(tc,test_btsequence_length1); tcase_add_test(tc,test_btsequence_pattern1); tcase_add_test(tc,test_btsequence_pattern2); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-pattern.c0000644042355400116100000004337011601351356015224 00000000000000/* $Id: e-pattern.c 3416 2011-06-25 12:22:04Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests BT_START_TEST(test_btpattern_obj_mono1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* should have patterns now */ fail_unless(bt_machine_has_patterns(machine),NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,0,1,"2.5"); bt_pattern_set_global_event(pattern,0,2,"1"); /* verify test data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_global_event(pattern,0,1); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"2.5",1),"data is '%s' instead of '2.5'",data); g_free(data); data=bt_pattern_get_global_event(pattern,0,2); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"1",1),"data is '%s' instead of '1'",data); g_free(data); g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_obj_poly1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; GstElement *element; gulong voices; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",2L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_get(machine,"machine",&element,NULL); voices=gst_child_proxy_get_children_count(GST_CHILD_PROXY(element)); gst_object_unref(element); fail_unless(voices==2, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==2, NULL); g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_obj_poly2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSequence *sequence; BtMachine *machine=NULL; BtPattern *pattern=NULL; GstElement *element; gulong voices; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); g_object_get(song,"sequence",&sequence,NULL); /* create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",2L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_get(machine,"machine",&element,NULL); voices=gst_child_proxy_get_children_count(GST_CHILD_PROXY(element)); gst_object_unref(element); fail_unless(voices==2, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* enlarge length */ g_object_set(sequence,"length",4L,NULL); /* set machine */ bt_sequence_add_track(sequence,machine,-1); /* set pattern */ bt_sequence_set_pattern(sequence,0,0,pattern); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,4,0,"10"); bt_pattern_set_voice_event(pattern,0,0,0,"5"); bt_pattern_set_voice_event(pattern,4,0,0,"10"); g_object_unref(pattern); g_object_unref(machine); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_copy) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern1=NULL,*pattern2=NULL; gulong length1,length2,voices1,voices2; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",2L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern1=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern1!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern1,0,0,"5"); /* create a copy */ pattern2=bt_pattern_copy(pattern1); fail_unless(pattern2!=NULL, NULL); fail_unless(pattern2!=pattern1, NULL); /* compare */ g_object_get(pattern1,"length",&length1,"voices",&voices1,NULL); g_object_get(pattern2,"length",&length2,"voices",&voices2,NULL); fail_unless(length1==length2, NULL); fail_unless(voices1==voices2, NULL); g_object_try_unref(pattern1); g_object_try_unref(pattern2); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_has_data) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gchar *data; gboolean res; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",1L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,4,0,"10"); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_global_event(pattern,4,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); data=bt_pattern_get_global_event(pattern,6,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); /* test tick lines */ res=bt_pattern_tick_has_data(pattern,0); fail_unless(res==TRUE, NULL); res=bt_pattern_tick_has_data(pattern,4); fail_unless(res==TRUE, NULL); res=bt_pattern_tick_has_data(pattern,1); fail_unless(res==FALSE, NULL); /* cleanup */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_enlarge_length) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gulong length; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ // @todo try "bml-ErsKick" before and fall back to "buzztard-test-mono-source" as long as we don't have multi-voice machine in gst machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,4,0,"10"); /* verify length */ g_object_get(pattern,"length",&length,NULL); fail_unless(length==8, NULL); /* change and verify length */ g_object_set(pattern,"length",16L,NULL); g_object_get(pattern,"length",&length,NULL); fail_unless(length==16, NULL); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_global_event(pattern,4,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); data=bt_pattern_get_global_event(pattern,10,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); /* cleanup */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_shrink_length) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gulong length; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",16L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,12,0,"10"); /* verify length */ g_object_get(pattern,"length",&length,NULL); fail_unless(length==16, NULL); /* change and verify length */ g_object_set(pattern,"length",8L,NULL); g_object_get(pattern,"length",&length,NULL); fail_unless(length==8, NULL); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); /* cleanup */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_enlarge_voices) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gulong voices; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",1L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_voice_event(pattern,4,0,0,"10"); /* verify voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==1, NULL); /* change and verify voices */ g_object_set(machine,"voices",2L,NULL); g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==2, NULL); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_voice_event(pattern,4,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); data=bt_pattern_get_voice_event(pattern,0,1,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); /* cleanup */ g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_shrink_voices) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gulong voices; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-poly-source",2L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,machine); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_voice_event(pattern,4,0,0,"10"); /* verify voices */ g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==2, NULL); /* change and verify voices */ g_object_set(machine,"voices",1L,NULL); g_object_get(pattern,"voices",&voices,NULL); fail_unless(voices==1, NULL); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_voice_event(pattern,4,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); /* cleanup */ g_object_unref(pattern); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_insert_row) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,4,0,"10"); /* insert row */ bt_pattern_insert_row(pattern,0,0); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); data=bt_pattern_get_global_event(pattern,1,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"5",1),"data is '%s' instead of '5'",data); g_free(data); data=bt_pattern_get_global_event(pattern,4,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); data=bt_pattern_get_global_event(pattern,5,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); /* cleanup */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btpattern_delete_row) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *machine=NULL; BtPattern *pattern=NULL; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine */ machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(machine)); fail_unless(pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"5"); bt_pattern_set_global_event(pattern,4,0,"10"); /* insert row */ bt_pattern_delete_row(pattern,0,0); /* verify data */ data=bt_pattern_get_global_event(pattern,0,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); data=bt_pattern_get_global_event(pattern,3,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"10",2),"data is '%s' instead of '10'",data); g_free(data); data=bt_pattern_get_global_event(pattern,4,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); /* cleanup */ g_object_try_unref(pattern); g_object_try_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_pattern_example_case(void) { TCase *tc = tcase_create("BtPatternExamples"); tcase_add_test(tc,test_btpattern_obj_mono1); tcase_add_test(tc,test_btpattern_obj_poly1); tcase_add_test(tc,test_btpattern_obj_poly2); tcase_add_test(tc,test_btpattern_copy); tcase_add_test(tc,test_btpattern_has_data); tcase_add_test(tc,test_btpattern_enlarge_length); tcase_add_test(tc,test_btpattern_shrink_length); tcase_add_test(tc,test_btpattern_enlarge_voices); tcase_add_test(tc,test_btpattern_shrink_voices); tcase_add_test(tc,test_btpattern_insert_row); tcase_add_test(tc,test_btpattern_delete_row); // blend/randomize // set params multiple times and clear them again tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-song.c0000644042355400116100000003161711624270306014516 00000000000000/* $Id: e-song.c 3577 2011-08-21 20:55:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals #if 0 static gboolean play_signal_invoked=FALSE; #endif //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // helper method to test the play signal #if 0 static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { play_signal_invoked=TRUE; } #endif // test if the default constructor works as expected BT_START_TEST(test_btsong_obj1) { BtApplication *app=NULL; BtSong *song; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if the song loading works without failure BT_START_TEST(test_btsong_load1) { BtApplication *app=NULL; BtSong *song; BtSongIO *loader; gboolean load_ret = FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); //gst_debug_set_threshold_for_name("bt*",GST_LEVEL_DEBUG); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); mark_point(); fail_unless(loader != NULL, NULL); //gst_debug_set_threshold_for_name("bt*",GST_LEVEL_WARNING); load_ret = bt_song_io_load(loader,song); mark_point(); fail_unless(load_ret, NULL); mark_point(); g_object_checked_unref(loader); mark_point(); g_object_checked_unref(song); mark_point(); g_object_checked_unref(app); } BT_END_TEST // test if subsequent song loading works without failure BT_START_TEST(test_btsong_load2) { BtApplication *app=NULL; BtSong *song; BtSongIO *loader; gboolean load_ret = FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); g_object_checked_unref(loader); g_object_checked_unref(song); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple2.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if after the song loading everything is there BT_START_TEST(test_btsong_load3) { BtApplication *app=NULL; BtSong *song; BtSongIO *loader; gboolean load_ret = FALSE; BtSinkMachine *master; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); //gst_debug_set_threshold_for_name("bt*",GST_LEVEL_DEBUG); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); mark_point(); fail_unless(loader != NULL, NULL); //gst_debug_set_threshold_for_name("bt*",GST_LEVEL_WARNING); load_ret = bt_song_io_load(loader,song); mark_point(); fail_unless(load_ret, NULL); g_object_get(song,"master",&master,NULL); fail_unless(master != NULL, NULL); g_object_unref(master); mark_point(); g_object_checked_unref(loader); mark_point(); g_object_checked_unref(song); mark_point(); g_object_checked_unref(app); } BT_END_TEST // test if the song play routine works without failure BT_START_TEST(test_btsong_play1) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; gboolean is_playing; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(1); // this song is very short! //g_object_get(G_OBJECT(song),"is-playing",&is_playing,NULL); //fail_unless(is_playing, NULL); //fail_unless(play_signal_invoked, NULL); bt_song_stop(song); // @todo: this needs a mainloop! sleep(1); g_object_get(G_OBJECT(song),"is-playing",&is_playing,NULL); fail_unless(!is_playing, NULL); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // play, wait a little, stop, play again BT_START_TEST(test_btsong_play2) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; gint i; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); for(i=0;i<2;i++) { res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(1); //fail_unless(play_signal_invoked, NULL); bt_song_stop(song); //play_signal_invoked=FALSE; } g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // load a new song, play, change audiosink to fakesink BT_START_TEST(test_btsong_play3) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; BtSettings *settings=bt_settings_make(); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(2); // change audiosink g_object_set(settings,"audiosink","fakesink",NULL); //fail_unless(play_signal_invoked, NULL); bt_song_stop(song); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // change audiosink to NULL, load and play a song BT_START_TEST(test_btsong_play4) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; BtSettings *settings=bt_settings_make(); // change audiosink g_object_set(settings,"audiosink",NULL,"system-audiosink",NULL,NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(2); //fail_unless(play_signal_invoked, NULL); bt_song_stop(song); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test, if a newly created song contains empty setup, sequence, song-info and // wavetable BT_START_TEST(test_btsong_new1){ BtApplication *app=NULL,*app2; BtSong *song=NULL,*song2; BtSetup *setup=NULL; BtSequence *sequence=NULL; BtSongInfo *songinfo=NULL; BtWavetable *wavetable=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); g_object_get(song,"app",&app2,NULL); fail_unless(app2==app,NULL); g_object_unref(app2); // get the setup property g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL,NULL); g_object_get(setup,"song",&song2,NULL); fail_unless(song2==song,NULL); g_object_unref(song2); g_object_unref(setup); // get the sequence property g_object_get(song,"sequence",&sequence,NULL); fail_unless(sequence!=NULL,NULL); g_object_get(sequence,"song",&song2,NULL); fail_unless(song2==song,NULL); g_object_unref(song2); g_object_unref(sequence); // get the song-info property g_object_get(song,"song-info",&songinfo,NULL); fail_unless(songinfo!=NULL,NULL); g_object_get(songinfo,"song",&song2,NULL); fail_unless(song2==song,NULL); g_object_unref(song2); g_object_unref(songinfo); // get the wavetable property g_object_get(song,"wavetable",&wavetable,NULL); fail_unless(wavetable!=NULL,NULL); g_object_get(wavetable,"song",&song2,NULL); fail_unless(song2==song,NULL); g_object_unref(song2); g_object_unref(wavetable); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test the idle looper BT_START_TEST(test_btsong_idle1) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); //play_signal_invoked=FALSE; //g_signal_connect(G_OBJECT(song),"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),NULL); g_object_set(G_OBJECT(song),"is-idle",TRUE,NULL); // @todo: this needs a mainloop! sleep(2); g_object_set(G_OBJECT(song),"is-idle",FALSE,NULL); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test the idle looper and playing transition BT_START_TEST(test_btsong_idle2) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; gboolean is_idle,is_playing; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); g_object_set(G_OBJECT(song),"is-idle",TRUE,NULL); // @todo: this needs a mainloop! sleep(1); // start regular playback, this should stop the idle loop res=bt_song_play(song); fail_unless(res, NULL); // @todo: this needs a mainloop! sleep(1); // this song is very short! //g_object_get(G_OBJECT(song),"is-playing",&is_playing,"is-idle",&is_idle,NULL); //fail_unless(is_playing, NULL); //fail_unless(!is_idle, NULL); bt_song_stop(song); // @todo: this needs a mainloop! sleep(1); g_object_get(G_OBJECT(song),"is-playing",&is_playing,"is-idle",&is_idle,NULL); fail_unless(!is_playing, NULL); fail_unless(is_idle, NULL); g_object_set(G_OBJECT(song),"is-idle",FALSE,NULL); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_song_example_case(void) { TCase *tc = tcase_create("BtSongExamples"); tcase_add_test(tc,test_btsong_obj1); tcase_add_test(tc,test_btsong_load1); tcase_add_test(tc,test_btsong_load2); tcase_add_test(tc,test_btsong_load3); tcase_add_test(tc,test_btsong_play1); tcase_add_test(tc,test_btsong_play2); tcase_add_test(tc,test_btsong_play3); tcase_add_test(tc,test_btsong_play4); tcase_add_test(tc,test_btsong_new1); tcase_add_test(tc,test_btsong_idle1); tcase_add_test(tc,test_btsong_idle2); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-wire.c0000644042355400116100000000221211576360403014525 00000000000000/* $Id: s-wire.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_wire_test_case(void); //extern TCase *bt_wire_example_case(void); Suite *bt_wire_suite(void) { Suite *s=suite_create("BtWire"); suite_add_tcase(s,bt_wire_test_case()); //suite_add_tcase(s,bt_wire_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-source-machine.c0000644042355400116100000000670611642675313016501 00000000000000/* $Id: t-source-machine.c 3673 2011-10-04 21:29:47Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * try to create a machine with not exising plugin name */ BT_START_TEST(test_btsourcemachine_obj1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine with wrong pluginname (not existing)*/ machine=bt_source_machine_new(song,"id","nonsense",1,&err); fail_unless(machine!=NULL, NULL); fail_unless(err!=NULL, NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * try to create a machine which is a sink machine and not a source machine */ BT_START_TEST(test_btsourcemachine_obj2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a source machine with wrong plugin type (sink instead of source) */ machine=bt_source_machine_new(song,"id","autoaudiosink",1,&err); fail_unless(machine!=NULL, NULL); fail_unless(err!=NULL, NULL); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsourcemachine_obj3){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSourceMachine *machine=NULL; gulong ix=0; GError *error=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* try to create a normal sink machine */ machine=bt_source_machine_new(song,"id","audiotestsrc",0,&err); fail_unless(machine!=NULL,NULL); fail_unless(err==NULL, NULL); /* try to get global param index from audiotestsrc */ ix=bt_machine_get_global_param_index(BT_MACHINE(machine),"nonsense",&error); fail_unless(g_error_matches(error, g_quark_from_static_string("BtMachine"),0),NULL); g_error_free(error); fail_unless(ix==-1); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_source_machine_test_case(void) { TCase *tc = tcase_create("BtSourceMachineTests"); tcase_add_test(tc,test_btsourcemachine_obj1); tcase_add_test(tc,test_btsourcemachine_obj2); tcase_add_test(tc,test_btsourcemachine_obj3); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-setup.c0000644042355400116100000000221511576360403014722 00000000000000/* $Id: s-setup.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_setup_test_case(void); extern TCase *bt_setup_example_case(void); Suite *bt_setup_suite(void) { Suite *s=suite_create("BtSetup"); suite_add_tcase(s,bt_setup_test_case()); suite_add_tcase(s,bt_setup_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/e-song-io-native.c0000644042355400116100000003043311641041601016373 00000000000000/* $Id: e-song-io-native.c 3664 2011-09-29 10:03:24Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- helper static void assert_machine_refcount(BtSetup *setup, const gchar *id, guint refs) { BtMachine *machine=bt_setup_get_machine_by_id(setup,id); fail_unless(machine!=NULL,NULL); GST_INFO("setup.machine[%s].ref_count=%d",id,G_OBJECT_REF_COUNT(machine)); fail_unless(G_OBJECT_REF_COUNT(machine)==(1+refs),NULL); g_object_unref(machine); } static void assert_song_part_refcounts(BtSong *song) { BtSetup *setup; BtSequence *sequence; BtSongInfo *songinfo; BtWavetable *wavetable; g_object_get(song,"setup",&setup,"sequence",&sequence,"song-info",&songinfo,"wavetable",&wavetable,NULL); fail_unless(setup!=NULL,NULL); GST_INFO("setup.ref_count=%d",G_OBJECT_REF_COUNT(setup)); fail_unless(G_OBJECT_REF_COUNT(setup)==2,NULL); fail_unless(sequence!=NULL,NULL); GST_INFO("sequence.ref_count=%d",G_OBJECT_REF_COUNT(sequence)); fail_unless(G_OBJECT_REF_COUNT(sequence)==2,NULL); fail_unless(songinfo!=NULL,NULL); GST_INFO("songinfo.ref_count=%d",G_OBJECT_REF_COUNT(songinfo)); fail_unless(G_OBJECT_REF_COUNT(songinfo)==2,NULL); fail_unless(wavetable!=NULL,NULL); GST_INFO("wavetable.ref_count=%d",G_OBJECT_REF_COUNT(wavetable)); fail_unless(G_OBJECT_REF_COUNT(wavetable)==2,NULL); g_object_unref(setup); g_object_unref(sequence); g_object_unref(songinfo); g_object_unref(wavetable); } //-- tests BT_START_TEST(test_btsong_io_native_refcounts) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *song_io; gboolean res; BtSetup *setup; BtSequence *sequence; BtSongInfo *songinfo; BtWavetable *wavetable; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); /* load the song */ song_io=bt_song_io_from_file(check_get_test_song_path("example.xml")); fail_unless(song_io != NULL, NULL); res=bt_song_io_load(song_io,song); fail_unless(res == TRUE, NULL); GST_INFO("song.ref_count=%d",G_OBJECT_REF_COUNT(song)); fail_unless(G_OBJECT_REF_COUNT(song)==1,NULL); /* assert main song part refcounts */ g_object_get(song,"setup",&setup,"sequence",&sequence,"song-info",&songinfo,"wavetable",&wavetable,NULL); fail_unless(setup!=NULL,NULL); GST_INFO("setup.ref_count=%d",G_OBJECT_REF_COUNT(setup)); fail_unless(G_OBJECT_REF_COUNT(setup)==2,NULL); fail_unless(sequence!=NULL,NULL); GST_INFO("sequence.ref_count=%d",G_OBJECT_REF_COUNT(sequence)); fail_unless(G_OBJECT_REF_COUNT(sequence)==2,NULL); fail_unless(songinfo!=NULL,NULL); GST_INFO("songinfo.ref_count=%d",G_OBJECT_REF_COUNT(songinfo)); fail_unless(G_OBJECT_REF_COUNT(songinfo)==2,NULL); fail_unless(wavetable!=NULL,NULL); GST_INFO("wavetable.ref_count=%d",G_OBJECT_REF_COUNT(wavetable)); fail_unless(G_OBJECT_REF_COUNT(wavetable)==2,NULL); /* assert machine refcounts */ // 1 x setup, 1 x wire assert_machine_refcount(setup,"audio_sink",2); // 1 x setup, 2 x wire assert_machine_refcount(setup,"amp1",3); // 1 x setup, 1 x wire, 1 x sequence assert_machine_refcount(setup,"sine1",3); /* @todo: check more refcounts (wires) * grep ".ref-count=" /tmp/bt_core.log */ g_object_unref(setup); g_object_unref(sequence); g_object_unref(songinfo); g_object_unref(wavetable); g_object_checked_unref(song_io); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST /* for testing we use autoaudiosink and that slows down loging files here :/ */ BT_START_TEST(test_btsong_io_native_song_refcounts) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *song_io; gboolean res; GstElement *bin; gchar **song_name,*song_names[]={ "example.xml", "test-simple1.xml", "test-simple2.xml", "test-simple3.xml", "test-simple4.xml", "test-simple5.xml", NULL }; BtSettings *settings=bt_settings_make(); /* tweak the config */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app */ app=bt_test_application_new(); g_object_get(app,"bin",&bin,NULL); GST_INFO("song.elements=%d",GST_BIN_NUMCHILDREN(bin)); fail_unless(GST_BIN_NUMCHILDREN(bin) == 0, NULL); song_name=song_names; while(*song_name) { /* load the song */ song_io=bt_song_io_from_file(check_get_test_song_path(*song_name)); fail_unless(song_io != NULL, NULL); song=bt_song_new(app); res=bt_song_io_load(song_io,song); fail_unless(res == TRUE, NULL); GST_INFO("song.ref_count=%d",G_OBJECT_REF_COUNT(song)); fail_unless(G_OBJECT_REF_COUNT(song)==1,NULL); GST_INFO("song[%s].elements=%d",*song_name,GST_BIN_NUMCHILDREN(bin)); /* assert main song part refcounts */ assert_song_part_refcounts(song); g_object_checked_unref(song_io); g_object_checked_unref(song); GST_INFO("song.elements=%d",GST_BIN_NUMCHILDREN(bin)); fail_unless(GST_BIN_NUMCHILDREN(bin) == 0, NULL); song_name++; }; gst_object_unref(bin); g_object_unref(settings); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsong_io_write_song1) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *song_io; gboolean res; gchar *song_path,*song_name; gchar **format,*formats[]={"xml","bzt",NULL}; BtSettings *settings=bt_settings_make(); /* tweak the config */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app */ app=bt_test_application_new(); /* test the formats */ format=formats; while(*format) { song_name=g_strconcat("bt-test1-song.",*format,NULL); song_path=g_build_filename(g_get_tmp_dir(),song_name,NULL); GST_INFO("testing write for %s",song_path); /* save empty song */ song=bt_song_new(app); song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); res=bt_song_io_save(song_io,song); fail_unless(res == TRUE, NULL); g_object_checked_unref(song_io); g_object_checked_unref(song); /* load the song */ song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); song=bt_song_new(app); res=bt_song_io_load(song_io,song); fail_unless(res == TRUE, NULL); g_object_checked_unref(song_io); g_object_checked_unref(song); g_free(song_path); g_free(song_name); format++; } g_object_unref(settings); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsong_io_write_song2) { BtApplication *app=NULL; BtSong *song=NULL; BtMachine *gen,*sink; BtWire *wire; BtPattern *pattern; BtSongIO *song_io; gboolean res; gchar *song_path,*song_name; gchar **format,*formats[]={"xml","bzt",NULL}; BtSettings *settings=bt_settings_make(); /* tweak the config */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app */ app=bt_test_application_new(); /* test the formats */ format=formats; while(*format) { song_name=g_strconcat("bt-test2-song.",*format,NULL); song_path=g_build_filename(g_get_tmp_dir(),song_name,NULL); GST_INFO("testing write for %s",song_path); /* create a test song */ song=bt_song_new(app); sink=BT_MACHINE(bt_sink_machine_new(song,"master",NULL)); gen=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,NULL)); wire=bt_wire_new(song, gen, sink,NULL); pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(gen)); g_object_unref(pattern); g_object_unref(wire); g_object_unref(gen); g_object_unref(sink); /* save the song*/ song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); res=bt_song_io_save(song_io,song); fail_unless(res == TRUE, NULL); g_object_checked_unref(song_io); g_object_checked_unref(song); /* load the song */ song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); song=bt_song_new(app); res=bt_song_io_load(song_io,song); fail_unless(res == TRUE, NULL); g_object_checked_unref(song_io); g_object_checked_unref(song); g_free(song_path); g_free(song_name); format++; } g_object_unref(settings); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsong_io_write_song3) { BtApplication *app=NULL; BtSong *song=NULL; BtMachine *gen,*sink; BtWire *wire; BtPattern *pattern; BtWave *wave; BtWavelevel *wave_level; BtSongIO *song_io; gboolean res; gchar *song_path,*song_name; gchar **format,*formats[]={"xml","bzt",NULL}; gchar *ext_data_path,*ext_data_uri; BtSettings *settings=bt_settings_make(); /* make external data */ ext_data_path=g_build_filename(g_get_tmp_dir(),"test.wav",NULL); ext_data_uri=g_strconcat("file://",ext_data_path,NULL); /* tweak the config */ g_object_set(settings,"audiosink","fakesink",NULL); /* create app */ app=bt_test_application_new(); /* test the formats */ format=formats; while(*format) { song_name=g_strconcat("bt-test3-song.",*format,NULL); song_path=g_build_filename(g_get_tmp_dir(),song_name,NULL); GST_INFO("testing write for %s",song_path); /* create a test song with external data */ song=bt_song_new(app); sink=BT_MACHINE(bt_sink_machine_new(song,"master",NULL)); gen=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,NULL)); wire=bt_wire_new(song, gen, sink,NULL); pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,BT_MACHINE(gen)); wave=bt_wave_new(song,"sample1",ext_data_uri,1,1.0,BT_WAVE_LOOP_MODE_OFF,0); fail_unless(wave != NULL, NULL); GST_INFO(" song created"); /* loading waves is async and we need to wait a bit * FIXME: we need to wait for wave:loading-done * (this might also cause hassle in the ui, if loading big samples and saving before they are loaded) */ while(!(wave_level=bt_wave_get_level_by_index(wave,0))) { // FIXME: bah, this can trigger random left-over callbacks from previous // tests while(g_main_context_pending(NULL)) g_main_context_iteration(NULL,FALSE); } g_object_unref(wave_level); GST_INFO(" wave loaded"); /* save the song*/ song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); res=bt_song_io_save(song_io,song); fail_unless(res == TRUE, NULL); g_object_unref(sink); g_object_unref(gen); g_object_unref(wire); g_object_unref(pattern); g_object_unref(wave); g_object_checked_unref(song_io); g_object_checked_unref(song); GST_INFO(" song saved"); /* load the song */ song_io=bt_song_io_from_file(song_path); fail_unless(song_io != NULL, NULL); song=bt_song_new(app); res=bt_song_io_load(song_io,song); fail_unless(res == TRUE, NULL); GST_INFO(" song re-loaded"); g_object_checked_unref(song_io); g_object_checked_unref(song); g_free(song_path); g_free(song_name); format++; } g_object_unref(settings); g_object_checked_unref(app); g_free(ext_data_uri); g_free(ext_data_path); } BT_END_TEST TCase *bt_song_io_native_example_case(void) { TCase *tc = tcase_create("BtSongIONativeExamples"); tcase_add_test(tc,test_btsong_io_native_refcounts); tcase_add_test(tc,test_btsong_io_native_song_refcounts); tcase_add_test(tc,test_btsong_io_write_song1); tcase_add_test(tc,test_btsong_io_write_song2); tcase_add_test(tc,test_btsong_io_write_song3); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-pattern.c0000644042355400116100000000223311576360403015237 00000000000000/* $Id: s-pattern.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_pattern_test_case(void); extern TCase *bt_pattern_example_case(void); Suite *bt_pattern_suite(void) { Suite *s=suite_create("BtPattern"); suite_add_tcase(s,bt_pattern_test_case()); suite_add_tcase(s,bt_pattern_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/t-settings.c0000644042355400116100000000377111576360403015433 00000000000000/* $Id: t-settings.c 2652 2009-11-27 21:34:50Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests BT_START_TEST(test_btsettings_get_audiosink1) { BtSettings *settings=BT_SETTINGS(bt_gconf_settings_new()); gchar *saved_audiosink_name,*test_audiosink_name; g_object_get(settings,"audiosink",&saved_audiosink_name,NULL); g_object_set(settings,"audiosink","fakesink",NULL); g_object_get(settings,"audiosink",&test_audiosink_name,NULL); fail_unless(!strcmp(test_audiosink_name,"fakesink"),"sink is %s",test_audiosink_name); g_object_set(settings,"audiosink",saved_audiosink_name,NULL); /* clean up */ g_object_unref(settings); g_free(saved_audiosink_name); g_free(test_audiosink_name); } BT_END_TEST; TCase *bt_gconf_settings_test_case(void) { TCase *tc = tcase_create("BtSettingsTests"); tcase_add_test(tc,test_btsettings_get_audiosink1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-setup.c0000644042355400116100000003263711576360403014717 00000000000000/* $Id: e-setup.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests /* * In this test case we demonstrate how to create a setup and adding a machine * to the setup. * Then we use the iterator to get the current added machine back and check * if the machine was added correctly. */ BT_START_TEST(test_btsetup_obj1){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machine BtSourceMachine *source=NULL; BtMachine *ref_machine=NULL; GList *list,*node; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* try to create machine */ source = bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_get(G_OBJECT(setup),"machines",&list,NULL); /* the list should not be null */ fail_unless(list!=NULL, NULL); node=list; /* the pointer should be pointing to the gen1 machine */ ref_machine=node->data; fail_unless(ref_machine!=NULL, NULL); fail_unless(ref_machine==BT_MACHINE(source), NULL); fail_unless(BT_IS_SOURCE_MACHINE(ref_machine)==TRUE, NULL); /* the list should contain only one element */ fail_unless(g_list_length(list)==1, NULL); g_list_free(list); /* clean up */ g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this test case we demonstrate how to create a wire and adding the newly * created wire to the setup. After that, we try to get the same wire back, if * we give the source or dest machine. */ BT_START_TEST(test_btsetup_obj2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtSinkMachine *sink=NULL; // wire BtWire *wire=NULL; BtWire *ref_wire=NULL; GList *list; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","audiotestsrc",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create sink machine (default audio sink) */ sink = bt_sink_machine_new(song,"sink",&err); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire */ wire = bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink),&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to get the list of wires in the setup */ g_object_get(G_OBJECT(setup),"wires",&list,NULL); /* the list should not null */ fail_unless(list!=NULL,NULL); /* look, of the added wire is in the list */ ref_wire=list->data; fail_unless(ref_wire!=NULL,NULL); fail_unless(wire==BT_WIRE(ref_wire),NULL); /* the list should contain only one element */ fail_unless(g_list_length(list)==1, NULL); g_list_free(list); /* try to get the current added wire by the source machine. In this case the source of the wire is our source machine.*/ ref_wire = bt_setup_get_wire_by_src_machine(setup, BT_MACHINE(source)); fail_unless(ref_wire!=NULL, NULL); fail_unless(ref_wire==wire, NULL); g_object_try_unref(ref_wire); /* try to get the current added wire by the dest machine. In this case the destination of the wire is our sink machine. */ ref_wire = bt_setup_get_wire_by_dst_machine(setup, BT_MACHINE(sink)); fail_unless(ref_wire!=NULL, NULL); fail_unless(ref_wire==wire, NULL); g_object_try_unref(ref_wire); /* clean up */ g_object_unref(wire); g_object_unref(sink); g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this test we demonstrate how to remove a machine from the setup after the * same machine is added to the setup. */ BT_START_TEST(test_btsetup_obj3) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtMachine *ref_machine=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to get the machine back from the setup */ ref_machine=bt_setup_get_machine_by_id(setup, "src"); fail_unless(ref_machine!=NULL, NULL); g_object_unref(ref_machine); /* now we try to remove the same machine from the setup */ bt_setup_remove_machine(setup, BT_MACHINE(source)); /* try to get the machine back from the setup, the ref_machine should be null */ ref_machine=bt_setup_get_machine_by_id(setup, "src"); fail_unless(ref_machine==NULL, NULL); /* clean up */ g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this test we demonstrate how to remove a wire from the setup after the * same wire is added to the setup. */ BT_START_TEST(test_btsetup_obj4) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtSinkMachine *sink=NULL; // wire BtWire *wire=NULL; BtWire *ref_wire=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","audiotestsrc",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create sink machine (default audio sink) */ sink = bt_sink_machine_new(song,"sink",&err); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire */ wire = bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink),&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* check if we can get the wire from the setup */ ref_wire=bt_setup_get_wire_by_src_machine(setup, BT_MACHINE(source)); fail_unless(ref_wire!=NULL,NULL); g_object_try_unref(ref_wire); /* try to remove the wire from the setup */ bt_setup_remove_wire(setup, wire); /* check if we can get the wire from the setup. The ref_wire should be null */ ref_wire=bt_setup_get_wire_by_src_machine(setup, BT_MACHINE(source)); fail_unless(ref_wire==NULL,NULL); /* clean up */ g_object_unref(wire); g_object_unref(sink); g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this example we show you how to get wires by source machines. */ BT_START_TEST(test_btsetup_wire1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtSinkMachine *sink=NULL; // wire BtWire *wire=NULL; BtWire *ref_wire=NULL; /* wire list */ GList* wire_list=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","audiotestsrc",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create sink machine (default audio sink) */ sink = bt_sink_machine_new(song,"sink",&err); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire */ wire = bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink),&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to get the list of wires */ wire_list=bt_setup_get_wires_by_src_machine(setup,BT_MACHINE(source)); fail_unless(wire_list!=NULL,NULL); ref_wire=BT_WIRE(g_list_first(wire_list)->data); fail_unless(ref_wire!=NULL,NULL); fail_unless(ref_wire==wire,NULL); g_object_unref(ref_wire); g_list_free(wire_list); /* clean up */ g_object_unref(wire); g_object_unref(sink); g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this example we show you how to get wires by a destination machine. */ BT_START_TEST(test_btsetup_wire2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtSinkMachine *sink=NULL; // wire BtWire *wire=NULL; BtWire *ref_wire=NULL; /* wire list */ GList* wire_list=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","audiotestsrc",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create sink machine (default audio sink) */ sink = bt_sink_machine_new(song,"sink",&err); fail_unless(sink!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to create the wire */ wire = bt_wire_new(song,BT_MACHINE(source),BT_MACHINE(sink),&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* try to get the list of wires */ wire_list=bt_setup_get_wires_by_dst_machine(setup,BT_MACHINE(sink)); fail_unless(wire_list!=NULL,NULL); ref_wire=BT_WIRE(g_list_first(wire_list)->data); fail_unless(ref_wire!=NULL,NULL); fail_unless(ref_wire==wire,NULL); g_object_unref(ref_wire); g_list_free(wire_list); /* clean up */ g_object_unref(wire); g_object_unref(sink); g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this example you can see, how we get a source machine back by its type. */ BT_START_TEST(test_btsetup_machine1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machines BtSourceMachine *source=NULL; BtMachine *ref_machine=NULL; // Gtype of the machine GType machine_type; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); fail_unless(setup!=NULL, NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* now try to get the machine back via bt_setup_get_machine_by_type */ machine_type=G_OBJECT_TYPE(source); ref_machine=bt_setup_get_machine_by_type(setup, machine_type); fail_unless(BT_IS_SOURCE_MACHINE(ref_machine),NULL); fail_unless(ref_machine==BT_MACHINE(source),NULL); g_object_unref(ref_machine); /* clean up */ g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST /* * In this test case we check the _unique_id function. */ BT_START_TEST(test_btsetup_unique_id1){ BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSetup *setup=NULL; // machine BtSourceMachine *source=NULL; BtMachine *ref_machine=NULL; gchar *id; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"setup",&setup,NULL); /* try to create generator1 */ source = bt_source_machine_new(song,"src","buzztard-test-mono-source",0,&err); fail_unless(source!=NULL, NULL); fail_unless(err==NULL, NULL); /* get an id for a new machine, with the same name */ id=bt_setup_get_unique_machine_id(setup,"src"); fail_unless(id!=NULL, NULL); fail_unless(strcmp(id,"src"), NULL); /* there should be no machine using this id */ ref_machine=bt_setup_get_machine_by_id(setup,id); fail_unless(ref_machine==NULL, NULL); /* clean up */ g_free(id); g_object_unref(source); g_object_unref(setup); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_setup_example_case(void) { TCase *tc = tcase_create("BtSetupExamples"); tcase_add_test(tc,test_btsetup_obj1); tcase_add_test(tc,test_btsetup_obj2); tcase_add_test(tc,test_btsetup_obj3); tcase_add_test(tc,test_btsetup_obj4); tcase_add_test(tc,test_btsetup_wire1); tcase_add_test(tc,test_btsetup_wire2); tcase_add_test(tc,test_btsetup_machine1); tcase_add_test(tc,test_btsetup_unique_id1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-wire-pattern.c0000644042355400116100000000230111576360403016177 00000000000000/* $Id: s-wire-pattern.c 2651 2009-11-26 21:25:28Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //extern TCase *bt_wire_pattern_test_case(void); extern TCase *bt_wire_pattern_example_case(void); Suite *bt_wire_pattern_suite(void) { Suite *s=suite_create("BtWirePattern"); //suite_add_tcase(s,bt_wire_pattern_test_case()); suite_add_tcase(s,bt_wire_pattern_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/m-bt-core.h0000644042355400116100000000215411576360403015116 00000000000000/* $Id: m-bt-core.h 2031 2008-10-15 13:00:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "../../bt-check.h" //-- globals GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); //-- prototypes extern void bt_core_setup(void); extern void bt_core_teardown(void); buzztard-0.6.0/tests/lib/core/t-pattern.c0000644042355400116100000000466711576360403015255 00000000000000/* $Id: t-pattern.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests /* * try creating a pattern for a NULL machine, with an invalid id and an invalid * name */ BT_START_TEST(test_btpattern_obj1) { BtApplication *app=NULL; BtSong *song=NULL; BtPattern *pattern=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); check_init_error_trapp("bt_pattern_","BT_IS_MACHINE(self->priv->machine)"); pattern=bt_pattern_new(song,"pattern-id","pattern-name",1L,NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(pattern != NULL, NULL); g_object_unref(pattern); check_init_error_trapp("bt_pattern_","BT_IS_STRING(self->priv->id)"); pattern=bt_pattern_new(song,NULL,"pattern-name",1L,NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(pattern != NULL, NULL); g_object_unref(pattern); check_init_error_trapp("bt_pattern_","BT_IS_STRING(self->priv->name)"); pattern=bt_pattern_new(song,"pattern-id",NULL,1L,NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(pattern != NULL, NULL); g_object_unref(pattern); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_pattern_test_case(void) { TCase *tc = tcase_create("BtPatternTests"); tcase_add_test(tc,test_btpattern_obj1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-machine.c0000644042355400116100000000223311576360403015166 00000000000000/* $Id: s-machine.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_machine_test_case(void); extern TCase *bt_machine_example_case(void); Suite *bt_machine_suite(void) { Suite *s=suite_create("BtMachine"); suite_add_tcase(s,bt_machine_test_case()); suite_add_tcase(s,bt_machine_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/Makefile.am0000644042355400116100000000224411576360403015214 00000000000000## $Id: Makefile.am 2650 2009-11-26 21:15:14Z ensonic $ noinst_LTLIBRARIES = libbtcore-check.la libbtcore_check_la_LIBADD = $(BASE_DEPS_LIBS) libbtcore_check_la_SOURCES = m-bt-core.h \ s-core.c t-core.c \ s-machine.c e-machine.c t-machine.c \ s-network.c e-network.c t-network.c \ s-pattern.c e-pattern.c t-pattern.c \ s-processor-machine.c e-processor-machine.c \ s-sequence.c e-sequence.c t-sequence.c \ s-setup.c e-setup.c t-setup.c \ s-sink-machine.c e-sink-machine.c t-sink-machine.c \ s-song.c t-song.c e-song.c \ s-song-io.c e-song-io.c t-song-io.c \ s-song-io-native.c e-song-io-native.c t-song-io-native.c \ s-song-info.c e-song-info.c t-song-info.c \ s-source-machine.c e-source-machine.c t-source-machine.c \ s-wire.c t-wire.c \ s-wire-pattern.c e-wire-pattern.c \ s-settings.c t-settings.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcore_check_la_SOURCES) buzztard-0.6.0/tests/lib/core/t-song-io.c0000644042355400116100000000446711576360403015151 00000000000000/* $Id: t-song-io.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // try to create a SongIO object with NULL pointer BT_START_TEST(test_btsong_io_obj1) { BtSongIO *song_io; song_io=bt_song_io_from_file(NULL); fail_unless(song_io == NULL, NULL); } BT_END_TEST // try to create a SongIO object with empty string BT_START_TEST(test_btsong_io_obj2) { BtSongIO *song_io; song_io=bt_song_io_from_file(""); fail_unless(song_io==NULL, NULL); } BT_END_TEST // try to create a SongIO object from song name without extension BT_START_TEST(test_btsong_io_obj3) { BtSongIO *song_io; song_io=bt_song_io_from_file("test"); fail_unless(song_io==NULL, NULL); } BT_END_TEST // try to create a SongIO object from song name with unknown extension BT_START_TEST(test_btsong_io_obj4) { BtSongIO *song_io; song_io=bt_song_io_from_file("test.unk"); fail_unless(song_io==NULL, NULL); } BT_END_TEST TCase *bt_song_io_test_case(void) { TCase *tc = tcase_create("BtSongIOTests"); tcase_add_test(tc,test_btsong_io_obj1); tcase_add_test(tc,test_btsong_io_obj2); tcase_add_test(tc,test_btsong_io_obj3); tcase_add_test(tc,test_btsong_io_obj4); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-song-io.c0000644042355400116100000000327311576360403015124 00000000000000/* $Id$ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // try to create a SongIO object with a native file name BT_START_TEST(test_btsong_io_obj1) { BtSongIO *song_io; song_io=bt_song_io_from_file(check_get_test_song_path("example.xml")); // check if the type of songIO is native fail_unless(BT_IS_SONG_IO_NATIVE(song_io), NULL); fail_unless(song_io!=NULL, NULL); g_object_checked_unref(song_io); } BT_END_TEST TCase *bt_song_io_example_case(void) { TCase *tc = tcase_create("BtSongIOExamples"); tcase_add_test(tc,test_btsong_io_obj1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/s-settings.c0000644042355400116100000000243111576360403015422 00000000000000/* $Id: s-settings.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_gconf_settings_test_case(void); Suite *bt_settings_suite(void) { Suite *s=suite_create("BtSettings"); // setup/teardown provides different environments for each run suite_add_tcase(s,bt_gconf_settings_test_case()); // @todo: run it again when we have an implementation for the plainfile_settings //suite_add_tcase(s,bt_gconf_settings_test_case()); return(s); } buzztard-0.6.0/tests/lib/core/s-song-info.c0000644042355400116100000000225011576360403015460 00000000000000/* $Id: s-song-info.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" extern TCase *bt_song_info_test_case(void); extern TCase *bt_song_info_example_case(void); Suite *bt_song_info_suite(void) { Suite *s=suite_create("BtSongInfo"); suite_add_tcase(s,bt_song_info_test_case()); suite_add_tcase(s,bt_song_info_example_case()); return(s); } buzztard-0.6.0/tests/lib/core/e-sequence.c0000644042355400116100000004204511631754330015357 00000000000000/* $Id: e-sequence.c 3626 2011-09-07 20:49:27Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests BT_START_TEST(test_btsequence_enlarge_length) { BtApplication *app=NULL; BtSong *song; BtSequence *sequence; gulong length; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"sequence",&sequence,NULL); g_object_get(sequence,"length",&length,NULL); fail_unless(length==0, NULL); g_object_set(sequence,"length",16L,NULL); g_object_get(sequence,"length",&length,NULL); fail_unless(length==16, NULL); g_object_try_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btsequence_enlarge_length_vals) { BtApplication *app; BtSong *song; BtSequence *sequence; gchar label1[]="test",*label2; gulong i,length; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); g_object_get(song,"sequence",&sequence,NULL); /* try to enlarge length */ g_object_set(sequence,"length",8L,NULL); g_object_get(sequence,"length",&length,NULL); fail_unless(length==8, NULL); /* nothing should be there for all times */ for(i=0;i * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- tests // test if the normal init call works with commandline arguments (no args) START_TEST(test_btcore_init0) { bt_init(&test_argc,&test_argvptr); } END_TEST // test if the init call handles correct null pointers START_TEST(test_btcore_init1) { bt_init(NULL,NULL); } END_TEST // test if the normal init call works with commandline arguments START_TEST(test_btcore_init2) { // this shadows the global vars of the same name gint test_argc=2; gchar *test_argv[test_argc]; gchar **test_argvptr; test_argv[0]="check_buzzard"; test_argv[1]="--bt-version"; test_argvptr=test_argv; bt_init(&test_argc,&test_argvptr); } END_TEST /* * Test nonsense args. * * This unfortunately exits the test app. */ #ifdef __CHECK_DISABLED__ // test if the normal init call works with commandline arguments START_TEST(test_btcore_init3) { // this shadows the global vars of the same name gint test_argc=2; gchar *test_argv[test_argc]; gchar **test_argvptr; test_argv[0]="check_buzzard"; test_argv[1]="--bt-non-sense"; test_argvptr=test_argv; bt_init(&test_argc,&test_argvptr); } END_TEST #endif TCase *bt_core_test_case(void) { TCase *tc = tcase_create("BtCoreTests"); tcase_add_test(tc,test_btcore_init0); tcase_add_test(tc,test_btcore_init1); tcase_add_test(tc,test_btcore_init2); //tcase_add_test(tc,test_btcore_init3); return(tc); } buzztard-0.6.0/tests/lib/core/t-sink-machine.c0000644042355400116100000002003111671471007016124 00000000000000/* $Id: t-sink-machine.c 3770 2011-12-12 21:28:37Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); //puts(__FILE__":teardown"); } //-- tests // test attribute handling in sink names BT_START_TEST(test_btsinkmachine_settings1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine=NULL; //gchar *saved_audiosink_name; BtSettings *settings=bt_settings_make(); /* create app, song and get settings */ app=bt_test_application_new(); song=bt_song_new(app); mark_point(); //g_object_get(settings,"audiosink",&saved_audiosink_name,NULL); g_object_set(settings,"audiosink","osssink sync=false",NULL); mark_point(); machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); //g_object_set(settings,"audiosink",saved_audiosink_name,NULL); //g_free(saved_audiosink_name); g_object_unref(machine); g_object_unref(settings); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST; /* * Try to create a sink machine, if we set the sink property with the gconf * properties to the string "audioconvert ! osssink sync=false". This string * should be replaced by the sink machine to "ossink" and the machine should be * instantiable. */ BT_START_TEST(test_btsinkmachine_settings2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine=NULL; BtSettings *settings=bt_settings_make(); /* create app, song and get settings */ app=bt_test_application_new(); song=bt_song_new(app); mark_point(); g_object_set(settings,"audiosink","audioconvert ! osssink sync=false",NULL); mark_point(); machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_unref(settings); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST; // test attribute handling in sink names BT_START_TEST(test_btsinkmachine_settings3) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine=NULL; BtSettings *settings=bt_settings_make(); /* create app, song and get settings */ app=bt_test_application_new(); song=bt_song_new(app); mark_point(); g_object_set(settings,"audiosink","xvimagsink",NULL); mark_point(); machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_unref(settings); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST; // test attribute handling in sink names BT_START_TEST(test_btsinkmachine_settings4) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine=NULL; BtSettings *settings=bt_settings_make(); /* create app, song and get settings */ app=bt_test_application_new(); song=bt_song_new(app); mark_point(); g_object_set(settings,"audiosink","alsasink device=invalid:666",NULL); mark_point(); machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_unref(settings); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST; // test attribute handling in sink names BT_START_TEST(test_btsinkmachine_settings5) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSinkMachine *machine=NULL; BtSettings *settings=bt_settings_make(); /* create app, song and get settings */ app=bt_test_application_new(); song=bt_song_new(app); mark_point(); g_object_set(settings,"audiosink","doesnotexistssink",NULL); mark_point(); machine=bt_sink_machine_new(song,"master",&err); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); g_object_unref(settings); g_object_unref(machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST; // test if the song play routine works with fakesink BT_START_TEST(test_btsinkmachine_play1) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; BtSettings *settings=bt_settings_make(); g_object_set(settings,"audiosink","fakesink",NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); res=bt_song_play(song); fail_unless(res, NULL); sleep(1); bt_song_stop(song); g_object_unref(settings); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if the song play routine handles sink with wrong parameters BT_START_TEST(test_btsinkmachine_play2) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; BtSettings *settings=bt_settings_make(); g_object_set(settings,"audiosink","alsasink device=invalid:666",NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); res=bt_song_play(song); fail_unless(res, NULL); sleep(1); bt_song_stop(song); g_object_unref(settings); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST // test if the song play routine handles sink with wrong parameters BT_START_TEST(test_btsinkmachine_play3) { BtApplication *app=NULL; BtSong *song=NULL; BtSongIO *loader=NULL; gboolean load_ret = FALSE; gboolean res; BtSettings *settings=bt_settings_make(); g_object_set(settings,"audiosink","doesnotexistssink",NULL); /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song != NULL, NULL); loader=bt_song_io_from_file(check_get_test_song_path("test-simple1.xml")); fail_unless(loader != NULL, NULL); load_ret = bt_song_io_load(loader,song); fail_unless(load_ret, NULL); res=bt_song_play(song); fail_unless(res, NULL); sleep(1); bt_song_stop(song); g_object_unref(settings); g_object_checked_unref(loader); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_sink_machine_test_case(void) { TCase *tc = tcase_create("BtSinkMachineTests"); tcase_add_test(tc,test_btsinkmachine_settings1); tcase_add_test(tc,test_btsinkmachine_settings2); tcase_add_test(tc,test_btsinkmachine_settings3); tcase_add_test(tc,test_btsinkmachine_settings4); tcase_add_test(tc,test_btsinkmachine_settings5); tcase_add_test(tc,test_btsinkmachine_play1); tcase_add_test(tc,test_btsinkmachine_play2); tcase_add_test(tc,test_btsinkmachine_play3); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/core/e-wire-pattern.c0000644042355400116100000003516711601351356016175 00000000000000/* $Id: e-wire-pattern.c 3416 2011-06-25 12:22:04Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-core.h" //-- globals //-- fixtures static void test_setup(void) { bt_core_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_core_teardown(); } //-- tests BT_START_TEST(test_btwirepattern_obj1) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_try_unref(src_machine); g_object_try_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_obj2) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtSequence *sequence; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); g_object_get(song,"sequence",&sequence,NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); /* enlarge length */ g_object_set(sequence,"length",4L,NULL); /* set machine */ bt_sequence_add_track(sequence,sink_machine,-1); /* set pattern */ bt_sequence_set_pattern(sequence,0,0,pattern); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"50"); bt_wire_pattern_set_event(wire_pattern,0,0,"100"); g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_unref(src_machine); g_object_unref(sink_machine); g_object_unref(sequence); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_copy) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern1=NULL,*pattern2=NULL; BtWirePattern *wire_pattern1=NULL,*wire_pattern2=NULL; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern1=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern1!=NULL, NULL); /* create a wire-pattern */ wire_pattern1=bt_wire_pattern_new(song,wire,pattern1); fail_unless(wire_pattern1!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern1,0,0,"50"); bt_wire_pattern_set_event(wire_pattern1,0,0,"100"); /* create a copy */ pattern2=bt_pattern_copy(pattern1); fail_unless(pattern2!=NULL, NULL); fail_unless(pattern2!=pattern1, NULL); /* get the copied wire_pattern */ wire_pattern2=bt_wire_get_pattern(wire,pattern2); fail_unless(wire_pattern2!=NULL, NULL); fail_unless(wire_pattern2!=wire_pattern1, NULL); g_object_unref(wire_pattern2); g_object_unref(pattern2); g_object_unref(wire_pattern1); g_object_unref(pattern1); g_object_unref(wire); g_object_try_unref(src_machine); g_object_try_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_enlarge_length) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; gulong length; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"50"); bt_wire_pattern_set_event(wire_pattern,0,0,"100"); /* change and verify length */ g_object_set(pattern,"length",16L,NULL); g_object_get(pattern,"length",&length,NULL); fail_unless(length==16, NULL); /* verify data */ data=bt_wire_pattern_get_event(wire_pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"100",1),"data is '%s' instead of '100'",data); g_free(data); data=bt_wire_pattern_get_event(wire_pattern,4,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_unref(src_machine); g_object_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_shrink_length) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; gulong length; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",16L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"50"); bt_wire_pattern_set_event(wire_pattern,0,0,"100"); bt_wire_pattern_set_event(wire_pattern,12,0,"15"); /* change and verify length */ g_object_set(pattern,"length",8L,NULL); g_object_get(pattern,"length",&length,NULL); fail_unless(length==8, NULL); /* verify data */ data=bt_wire_pattern_get_event(wire_pattern,0,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"100",1),"data is '%s' instead of '100'",data); g_free(data); data=bt_wire_pattern_get_event(wire_pattern,4,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_unref(src_machine); g_object_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_insert_row) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"50"); bt_wire_pattern_set_event(wire_pattern,0,0,"100"); /* insert row */ bt_wire_pattern_insert_row(wire_pattern,0,0); /* verify data */ data=bt_wire_pattern_get_event(wire_pattern,0,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); data=bt_wire_pattern_get_event(wire_pattern,1,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"100",1),"data is '%s' instead of '100'",data); g_free(data); /* cleanup */ g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_unref(src_machine); g_object_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_btwirepattern_delete_row) { BtApplication *app=NULL; GError *err=NULL; BtSong *song=NULL; BtMachine *src_machine=NULL,*sink_machine=NULL; BtWire *wire=NULL; BtPattern *pattern=NULL; BtWirePattern *wire_pattern=NULL; gchar *data; /* create app and song */ app=bt_test_application_new(); song=bt_song_new(app); fail_unless(song!=NULL, NULL); /* create a source machine */ src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0L,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create sink machine (default audio sink) */ sink_machine=BT_MACHINE(bt_sink_machine_new(song,"sink",&err)); fail_unless(sink_machine!=NULL, NULL); fail_unless(err==NULL, NULL); /* create the wire */ wire = bt_wire_new(song,src_machine,sink_machine,&err); fail_unless(wire!=NULL, NULL); fail_unless(err==NULL, NULL); /* create a pattern */ pattern=bt_pattern_new(song,"pattern-id","pattern-name",8L,sink_machine); fail_unless(pattern!=NULL, NULL); /* create a wire-pattern */ wire_pattern=bt_wire_pattern_new(song,wire,pattern); fail_unless(wire_pattern!=NULL, NULL); /* set some test data */ bt_pattern_set_global_event(pattern,0,0,"50"); bt_wire_pattern_set_event(wire_pattern,0,0,"100"); bt_wire_pattern_set_event(wire_pattern,4,0,"15"); /* insert row */ bt_wire_pattern_delete_row(wire_pattern,0,0); /* verify data */ data=bt_wire_pattern_get_event(wire_pattern,0,0); fail_unless(data==NULL, "data is '%s' instead of ''",data); data=bt_wire_pattern_get_event(wire_pattern,3,0); fail_unless(data!=NULL, NULL); fail_if(strncmp(data,"15",1),"data is '%s' instead of '15'",data); g_free(data); /* cleanup */ g_object_unref(wire_pattern); g_object_unref(pattern); g_object_unref(wire); g_object_unref(src_machine); g_object_unref(sink_machine); g_object_checked_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_wire_pattern_example_case(void) { TCase *tc = tcase_create("BtWirePatternExamples"); tcase_add_test(tc,test_btwirepattern_obj1); tcase_add_test(tc,test_btwirepattern_obj2); tcase_add_test(tc,test_btwirepattern_copy); tcase_add_test(tc,test_btwirepattern_enlarge_length); tcase_add_test(tc,test_btwirepattern_shrink_length); tcase_add_test(tc,test_btwirepattern_insert_row); tcase_add_test(tc,test_btwirepattern_delete_row); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/Makefile.in0000644042355400116100000005101611675570635014310 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = core ic all: all-recursive .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 tests/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/lib/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: splint splint:: for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done # 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: buzztard-0.6.0/tests/lib/ic/0000755042355400116100000000000011675570677012721 500000000000000buzztard-0.6.0/tests/lib/ic/t-ic.c0000644042355400116100000000436211576360403013626 00000000000000/* $Id: t-ic.c 3214 2011-02-21 10:42:08Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-ic.h" //-- globals //-- tests // test if the normal init call works with commandline arguments (no args) START_TEST(test_btic_init0) { btic_init(&test_argc,&test_argvptr); } END_TEST // test if the init call handles correct null pointers START_TEST(test_btic_init1) { btic_init(NULL,NULL); } END_TEST // test if the normal init call works with commandline arguments START_TEST(test_btic_init2) { // this shadows the global vars of the same name gint test_argc=2; gchar *test_argv[test_argc]; gchar **test_argvptr; test_argv[0]="check_buzzard"; test_argv[1]="--btic-version"; test_argvptr=test_argv; btic_init(&test_argc,&test_argvptr); } END_TEST /* * Test nonsense args. * * This unfortunately exits the test app. */ #ifdef __CHECK_DISABLED__ // test if the normal init call works with commandline arguments START_TEST(test_btic_init3) { // this shadows the global vars of the same name gint test_argc=2; gchar *test_argv[test_argc]; gchar **test_argvptr; test_argv[0]="check_buzzard"; test_argv[1]="--btic-non-sense"; test_argvptr=test_argv; btic_init(&test_argc,&test_argvptr); } END_TEST #endif TCase *bt_ic_test_case(void) { TCase *tc = tcase_create("BtICTests"); tcase_add_test(tc,test_btic_init0); tcase_add_test(tc,test_btic_init1); tcase_add_test(tc,test_btic_init2); //tcase_add_test(tc,test_btic_init3); return(tc); } buzztard-0.6.0/tests/lib/ic/m-bt-ic.h0000644042355400116100000000214011576360403014217 00000000000000/* $Id: m-bt-ic.h 3214 2011-02-21 10:42:08Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "../../bt-check.h" //-- globals GST_DEBUG_CATEGORY_EXTERN(bt_ic_debug); //-- prototypes extern void bt_ic_setup(void); extern void bt_ic_teardown(void); buzztard-0.6.0/tests/lib/ic/Makefile.in0000644042355400116100000004627311675570635014714 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/lib/ic DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbtic_check_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libbtic_check_la_OBJECTS = s-ic.lo t-ic.lo s-registry.lo \ e-registry.lo libbtic_check_la_OBJECTS = $(am_libbtic_check_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbtic_check_la_SOURCES) DIST_SOURCES = $(libbtic_check_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ noinst_LTLIBRARIES = libbtic-check.la libbtic_check_la_LIBADD = $(BASE_DEPS_LIBS) libbtic_check_la_SOURCES = m-bt-ic.h \ s-ic.c t-ic.c \ s-registry.c e-registry.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 tests/lib/ic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/lib/ic/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbtic-check.la: $(libbtic_check_la_OBJECTS) $(libbtic_check_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbtic_check_la_OBJECTS) $(libbtic_check_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-registry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-ic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-registry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-ic.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtic_check_la_SOURCES) # 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: buzztard-0.6.0/tests/lib/ic/s-registry.c0000644042355400116100000000224411576360403015077 00000000000000/* $Id: s-registry.c 3215 2011-02-21 11:14:51Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-ic.h" //extern TCase *bt_registry_test_case(void); extern TCase *bt_registry_example_case(void); Suite *bt_registry_suite(void) { Suite *s=suite_create("BticRegistry"); //suite_add_tcase(s,bt_registry_test_case()); suite_add_tcase(s,bt_registry_example_case()); return(s); } buzztard-0.6.0/tests/lib/ic/e-registry.c0000644042355400116100000000317011576360403015060 00000000000000/* $Id: e-registry.c 3215 2011-02-21 11:14:51Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-ic.h" //-- globals //-- fixtures static void test_setup(void) { bt_ic_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_ic_teardown(); //puts(__FILE__":teardown"); } //-- tests // test if the normal init call works with commandline arguments (no args) START_TEST(test_registry_create0) { BtIcRegistry *registry; registry=btic_registry_new(); fail_unless(registry!=NULL, NULL); g_object_checked_unref(registry); } END_TEST TCase *bt_registry_example_case(void) { TCase *tc = tcase_create("BticRegistryExamples"); tcase_add_test(tc,test_registry_create0); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/lib/ic/Makefile.am0000644042355400116100000000111511576360403014653 00000000000000## $Id: Makefile.am 3215 2011-02-21 11:14:51Z ensonic $ noinst_LTLIBRARIES = libbtic-check.la libbtic_check_la_LIBADD = $(BASE_DEPS_LIBS) libbtic_check_la_SOURCES = m-bt-ic.h \ s-ic.c t-ic.c \ s-registry.c e-registry.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtic_check_la_SOURCES) buzztard-0.6.0/tests/lib/ic/s-ic.c0000644042355400116100000000217011576360403013620 00000000000000/* $Id: s-ic.c 3214 2011-02-21 10:42:08Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-ic.h" extern TCase *bt_ic_test_case(void); //extern TCase *bt_ic_example_case(void); Suite *bt_ic_suite(void) { Suite *s=suite_create("BtIC"); suite_add_tcase(s,bt_ic_test_case()); //suite_add_tcase(s,bt_ic_example_case()); return(s); } buzztard-0.6.0/tests/lib/Makefile.am0000644042355400116100000000024011576360403014256 00000000000000## $Id: Makefile.am 3214 2011-02-21 10:42:08Z ensonic $ SUBDIRS = core ic .PHONY: splint splint:: for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done buzztard-0.6.0/tests/bt-test-application.c0000644042355400116100000000323511576360404015513 00000000000000/* $Id: bt-test-application.c 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bttestapplication * @short_description: unit test buzztard application * * Dummy application subclass. */ #define BT_CORE #define BT_TEST_APPLICATION_C #include "bt-check.h" #include #include "bt-test-application.h" //-- the class G_DEFINE_TYPE (BtTestApplication, bt_test_application, BT_TYPE_APPLICATION); //-- constructor methods /** * bt_test_application_new: * * Create a new instance. * * Returns: the new instance */ BtApplication *bt_test_application_new(void) { return BT_APPLICATION(g_object_new(BT_TYPE_TEST_APPLICATION,NULL)); } //-- methods //-- wrapper //-- class internals static void bt_test_application_init(BtTestApplication *self) { } static void bt_test_application_class_init(BtTestApplicationClass *klass) { } buzztard-0.6.0/tests/bt-cfg.sh.in0000644042355400116100000000043511576360404013566 00000000000000#!/bin/sh # $Id: bt-cfg.sh.in 3274 2011-03-27 19:24:45Z ensonic $ TESTSONGDIR="@top_srcdir@/tests/songs" TESTRESULTDIR="@top_builddir@/tests/songs" BUZZTARD_CMD=@top_builddir@/src/ui/cmd/buzztard-cmd BUZZTARD_EDIT=@top_builddir@/src/ui/edit/buzztard-edit XFONT_PATH="@XFONT_PATH@" buzztard-0.6.0/tests/bt-test-application.h0000644042355400116100000000426311576360404015522 00000000000000/* $Id: bt-test-application.h 2950 2010-08-30 21:18:41Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_TEST_APPLICATION_H #define BT_TEST_APPLICATION_H #include #include #define BT_TYPE_TEST_APPLICATION (bt_test_application_get_type ()) #define BT_TEST_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_TEST_APPLICATION, BtTestApplication)) #define BT_TEST_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_TEST_APPLICATION, BtTestApplicationClass)) #define BT_IS_TEST_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_TEST_APPLICATION)) #define BT_IS_TEST_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_TEST_APPLICATION)) #define BT_TEST_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_TEST_APPLICATION, BtTestApplicationClass)) /* type macros */ typedef struct _BtTestApplication BtTestApplication; typedef struct _BtTestApplicationClass BtTestApplicationClass; /** * BtTestApplication: * * gconf based implementation object for a buzztard based settings */ struct _BtTestApplication { const BtApplication parent; }; /* structure of the gconf-settings class */ struct _BtTestApplicationClass { const BtApplicationClass parent; }; BtApplication *bt_test_application_new(void); GType bt_test_application_get_type(void) G_GNUC_CONST; #endif // BT_TEST_APPLICATION_H buzztard-0.6.0/tests/bt-cmd-encode.sh0000754042355400116100000000245211576360404014423 00000000000000#!/bin/sh # $Id: bt-cmd-encode.sh 2665 2009-12-07 23:05:56Z ensonic $ # run buzztard-cmd --command=encode on all example and test for crashes . ./bt-cfg.sh E_SONGS="$TESTSONGDIR/buzz*.xml \ $TESTSONGDIR/combi*.xml \ $TESTSONGDIR/melo*.xml \ $TESTSONGDIR/simple*.xml" T_SONGS="$TESTSONGDIR/broken*.xml \ $TESTSONGDIR/test*.xml" rm -f /tmp/bt_cmd_encode.log mkdir -p $TESTRESULTDIR res=0 trap crashed TERM crashed() { echo "!!! crashed" res=1 } # test examples for song in $E_SONGS; do echo "testing $song" audio=`basename $song .xml` audio="$TESTRESULTDIR/$audio.ogg" echo >>/tmp/bt_cmd_encode.log "== $song.ogg ==" GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,bt-*:4" libtool --mode=execute $BUZZTARD_CMD 2>>/tmp/bt_cmd_encode.log -q --command=encode --input-file=$song --output-file=$audio if [ $? -ne 0 ]; then res=1; fi done # test formats song="$TESTSONGDIR/simple1.xml" for format in ogg mp3 wav flac m4a raw; do echo "testing $format" audio=`basename $song .xml` audio="$TESTRESULTDIR/$audio.$format" echo >>/tmp/bt_cmd_encode.log "== $song.$format ==" GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,bt-*:4" libtool --mode=execute $BUZZTARD_CMD 2>>/tmp/bt_cmd_encode.log -q --command=encode --input-file=$song --output-file=$audio if [ $? -ne 0 ]; then res=1; fi done exit $res; buzztard-0.6.0/tests/bt-test-plugin.c0000644042355400116100000003751411576360404014515 00000000000000/* $Id: bt-test-plugin.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * gstreamer test plugin for unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION::bttestplugin: * @short_description: test gstreamer element for unit tests * * Two stub elements for unit-tests. The Polyphonic elemnt use the monophonic * one for its voices. Thus prefix the parameter names with 'g-' for 'global' * (in the monophonic class) and 'v-' for 'voice' in the poly class. */ /* @todo: * - implement the tempo, property-meta ifaces in the test machines * - add a trigger param to the machines * - the trigger param counts how often it gets triggered * - the count is exposed as a read-only param */ #include "bt-check.h" //-- property ids enum { ARG_BPM=1, // tempo iface ARG_TPB, ARG_STPT, ARG_VOICES, // child bin iface ARG_ULONG, ARG_DOUBLE, ARG_SWITCH, ARG_COUNT }; //-- pad templates /* static GstStaticPadTemplate sink_pad_template = GST_STATIC_PAD_TEMPLATE ( "sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") ); */ static GstStaticPadTemplate src_pad_template = GST_STATIC_PAD_TEMPLATE ( "src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") ); //-- tempo interface implementation static void bt_test_tempo_change_tempo(GstBtTempo *tempo, glong beats_per_minute, glong ticks_per_beat, glong subticks_per_tick) { GST_INFO("changing tempo to %lu BPM %lu TPB %lu STPT",beats_per_minute,ticks_per_beat,subticks_per_tick); } static void bt_test_tempo_interface_init(gpointer g_iface, gpointer iface_data) { GstBtTempoInterface *iface = g_iface; iface->change_tempo = bt_test_tempo_change_tempo; } //-- child proxy interface implementation static GstObject *bt_test_child_proxy_get_child_by_index(GstChildProxy *child_proxy, guint index) { GST_INFO("machine %p, getting child %u of %lu",child_proxy,index,BT_TEST_POLY_SOURCE(child_proxy)->num_voices); g_return_val_if_fail(indexnum_voices,NULL); return(g_object_ref(g_list_nth_data(BT_TEST_POLY_SOURCE(child_proxy)->voices,index))); } static guint bt_test_child_proxy_get_children_count(GstChildProxy *child_proxy) { return(BT_TEST_POLY_SOURCE(child_proxy)->num_voices); } static void bt_test_child_proxy_interface_init(gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; iface->get_child_by_index = bt_test_child_proxy_get_child_by_index; iface->get_children_count = bt_test_child_proxy_get_children_count; } //-- test_mono_source static void bt_test_mono_source_get_property(GObject *object,guint property_id,GValue *value,GParamSpec *pspec) { BtTestMonoSource *self = BT_TEST_MONO_SOURCE(object); switch (property_id) { case ARG_ULONG: g_value_set_ulong(value, self->ulong_val); break; case ARG_DOUBLE: g_value_set_double(value, self->double_val); break; case ARG_SWITCH: g_value_set_boolean(value, self->switch_val); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); break; } } static void bt_test_mono_source_set_property(GObject *object,guint property_id,const GValue *value,GParamSpec *pspec) { BtTestMonoSource *self = BT_TEST_MONO_SOURCE(object); switch (property_id) { case ARG_ULONG: self->ulong_val = g_value_get_ulong(value); break; case ARG_DOUBLE: self->double_val = g_value_get_double(value); break; case ARG_SWITCH: self->switch_val = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); break; } } static void bt_test_mono_source_init(GTypeInstance *instance, gpointer g_class) { BtTestMonoSource *self = BT_TEST_MONO_SOURCE(instance); GstElementClass *klass = GST_ELEMENT_GET_CLASS(instance); GstPad *src_pad; src_pad = gst_pad_new_from_template(gst_element_class_get_pad_template(klass,"src"),"src"); gst_element_add_pad(GST_ELEMENT(self),src_pad); } static void bt_test_mono_source_class_init(BtTestMonoSourceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->set_property = bt_test_mono_source_set_property; gobject_class->get_property = bt_test_mono_source_get_property; g_object_class_override_property(gobject_class, ARG_BPM, "beats-per-minute"); g_object_class_override_property(gobject_class, ARG_TPB, "ticks-per-beat"); g_object_class_override_property(gobject_class, ARG_STPT, "subticks-per-tick"); g_object_class_install_property(gobject_class,ARG_ULONG, g_param_spec_ulong("g-ulong", "ulong prop", "ulong number parameter for the test_mono_source", 0, G_MAXULONG, 0, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); g_object_class_install_property(gobject_class,ARG_DOUBLE, g_param_spec_double("g-double", "double prop", "double number parameter for the test_mono_source", -1000.0, 1000.0, 0, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); g_object_class_install_property(gobject_class,ARG_SWITCH, g_param_spec_boolean("g-switch", "switch prop", "switch parameter for the test_mono_source", FALSE, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); } static void bt_test_mono_source_base_init(BtTestMonoSourceClass *klass) { GstElementClass *element_class = GST_ELEMENT_CLASS(klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_pad_template)); gst_element_class_set_details_simple(element_class, "Monophonic source for unit tests", "Source/Audio/MonoSource", "Use in unit tests", "Stefan Kost "); } GType bt_test_mono_source_get_type(void) { static GType type = 0; if (type == 0) { const GTypeInfo info = { sizeof(BtTestMonoSourceClass), (GBaseInitFunc)bt_test_mono_source_base_init, // base_init NULL, // base_finalize (GClassInitFunc)bt_test_mono_source_class_init, // class_init NULL, // class_finalize NULL, // class_data sizeof(BtTestMonoSource), 0, // n_preallocs (GInstanceInitFunc)bt_test_mono_source_init, // instance_init NULL // value_table }; const GInterfaceInfo tempo_interface_info = { (GInterfaceInitFunc) bt_test_tempo_interface_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; type = g_type_register_static(GST_TYPE_ELEMENT,"BtTestMonoSource",&info,0); g_type_add_interface_static(type, GSTBT_TYPE_TEMPO, &tempo_interface_info); } return type; } //-- test_poly_source static GObjectClass *poly_parent_class=NULL; static void bt_test_poly_source_get_property(GObject *object,guint property_id,GValue *value,GParamSpec *pspec) { BtTestPolySource *self = BT_TEST_POLY_SOURCE(object); switch (property_id) { case ARG_ULONG: g_value_set_ulong(value, self->ulong_val); break; case ARG_DOUBLE: g_value_set_double(value, self->double_val); break; case ARG_SWITCH: g_value_set_boolean(value, self->switch_val); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); break; } } static void bt_test_poly_source_set_property(GObject *object,guint property_id,const GValue *value,GParamSpec *pspec) { BtTestPolySource *self = BT_TEST_POLY_SOURCE(object); BtTestMonoSource *voice; gulong i,num_voices; switch (property_id) { case ARG_VOICES: num_voices=self->num_voices; self->num_voices = g_value_get_ulong(value); GST_INFO("machine %p, changing voices from %lu to %lu",object,num_voices,self->num_voices); if(self->num_voices>num_voices) { for(i=num_voices;inum_voices;i++) { voice=g_object_new(BT_TYPE_TEST_MONO_SOURCE,NULL); self->voices=g_list_append(self->voices,voice); GST_DEBUG(" adding voice %p, ref_ct=%d",voice, G_OBJECT_REF_COUNT(voice)); gst_object_set_parent(GST_OBJECT(voice), GST_OBJECT(self)); GST_DEBUG(" parented voice %p, ref_ct=%d",voice, G_OBJECT_REF_COUNT(voice)); } } else if(self->num_voicesself->num_voices;i--) { voice=g_list_nth_data(self->voices,(i-1)); self->voices=g_list_remove(self->voices,voice); gst_object_unparent(GST_OBJECT(voice)); } } break; case ARG_ULONG: self->ulong_val = g_value_get_ulong(value); break; case ARG_DOUBLE: self->double_val = g_value_get_double(value); break; case ARG_SWITCH: self->switch_val = g_value_get_boolean(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); break; } } static void bt_test_poly_source_finalize(GObject *object) { BtTestPolySource *self = BT_TEST_POLY_SOURCE(object); GST_DEBUG(" !!! self=%p",object); if(self->voices) { GList* node; for(node=self->voices;node;node=g_list_next(node)) { GST_DEBUG(" free voice %p, ref_ct=%d",node->data, G_OBJECT_REF_COUNT(node->data)); gst_object_unparent(node->data); node->data=NULL; } g_list_free(self->voices); self->voices=NULL; } G_OBJECT_CLASS(poly_parent_class)->finalize(object); } static void bt_test_poly_source_init(GTypeInstance *instance, gpointer g_class) { BtTestPolySource *self = BT_TEST_POLY_SOURCE(instance); GstElementClass *klass = GST_ELEMENT_GET_CLASS(instance); GstPad *src_pad; src_pad = gst_pad_new_from_template(gst_element_class_get_pad_template(klass,"src"),"src"); gst_element_add_pad(GST_ELEMENT(self),src_pad); } static void bt_test_poly_source_class_init(BtTestPolySourceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); poly_parent_class=g_type_class_peek_parent(klass); gobject_class->set_property = bt_test_poly_source_set_property; gobject_class->get_property = bt_test_poly_source_get_property; //gobject_class->dispose = bt_test_poly_source_dispose; gobject_class->finalize = bt_test_poly_source_finalize; g_object_class_override_property(gobject_class, ARG_BPM, "beats-per-minute"); g_object_class_override_property(gobject_class, ARG_TPB, "ticks-per-beat"); g_object_class_override_property(gobject_class, ARG_STPT, "subticks-per-tick"); g_object_class_override_property(gobject_class, ARG_VOICES, "children"); g_object_class_install_property(gobject_class,ARG_ULONG, g_param_spec_ulong("v-ulong", "ulong prop", "ulong number parameter for the test_poly_source", 0, G_MAXULONG, 0, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); g_object_class_install_property(gobject_class,ARG_DOUBLE, g_param_spec_double("g-double", "double prop", "double number parameter for the test_poly_source", -1000.0, 1000.0, 0, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); g_object_class_install_property(gobject_class,ARG_SWITCH, g_param_spec_boolean("g-switch", "switch prop", "switch parameter for the test_poly_source", FALSE, G_PARAM_READWRITE|GST_PARAM_CONTROLLABLE)); } static void bt_test_poly_source_base_init(BtTestPolySourceClass *klass) { GstElementClass *element_class = GST_ELEMENT_CLASS(klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_pad_template)); gst_element_class_set_details_simple(element_class, "Polyphonic source for unit tests", "Source/Audio/PolySource", "Use in unit tests", "Stefan Kost "); } GType bt_test_poly_source_get_type(void) { static GType type = 0; if (type == 0) { const GTypeInfo info = { sizeof(BtTestPolySourceClass), (GBaseInitFunc)bt_test_poly_source_base_init, // base_init NULL, // base_finalize (GClassInitFunc)bt_test_poly_source_class_init, // class_init NULL, // class_finalize NULL, // class_data sizeof(BtTestPolySource), 0, // n_preallocs (GInstanceInitFunc)bt_test_poly_source_init, // instance_init NULL // value_table }; const GInterfaceInfo tempo_interface_info = { (GInterfaceInitFunc) bt_test_tempo_interface_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; const GInterfaceInfo child_proxy_interface_info = { (GInterfaceInitFunc) bt_test_child_proxy_interface_init, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; const GInterfaceInfo child_bin_interface_info = { NULL, /* interface_init */ NULL, /* interface_finalize */ NULL /* interface_data */ }; type = g_type_register_static(GST_TYPE_ELEMENT,"BtTestPolySource",&info,0); g_type_add_interface_static(type, GSTBT_TYPE_TEMPO, &tempo_interface_info); g_type_add_interface_static(type, GST_TYPE_CHILD_PROXY, &child_proxy_interface_info); g_type_add_interface_static(type, GSTBT_TYPE_CHILD_BIN, &child_bin_interface_info); } return type; } //-- test_mono_processor //-- test_poly_processor //-- plugin handling #if !GST_CHECK_VERSION(0,10,16) static #endif gboolean bt_test_plugin_init(GstPlugin * plugin) { //GST_INFO("registering unit test plugin"); gst_element_register(plugin,"buzztard-test-mono-source",GST_RANK_NONE,BT_TYPE_TEST_MONO_SOURCE); gst_element_register(plugin,"buzztard-test-poly-source",GST_RANK_NONE,BT_TYPE_TEST_POLY_SOURCE); //gst_element_register(plugin,"buzztard-test-mono-processor",GST_RANK_NONE,BT_TYPE_TEST_MONO_PROCESSOR); //gst_element_register(plugin,"buzztard-test-poly-processor",GST_RANK_NONE,BT_TYPE_TEST_POLY_PROCESSOR); return TRUE; } #if !GST_CHECK_VERSION(0,10,16) GST_PLUGIN_DEFINE_STATIC( GST_VERSION_MAJOR, GST_VERSION_MINOR, "bt-test", "buzztard test plugin - several unit test support elements", bt_test_plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://www.buzztard.org" ); #endif buzztard-0.6.0/tests/gtkdoccomplete.sh0000754042355400116100000000230011576360404015016 00000000000000#!/bin/sh # $Id: gtkdoccomplete.sh 2032 2008-10-15 13:22:57Z ensonic $ res=0 fails=0 checks=0 report="\n" echo -n "Running suite(s): " for dir in ../docs/reference/bt-*; do file=$dir/*-undocumented.txt; if [ -e "$file" ]; then echo -n `basename $dir` "" checks=$(($checks+3)) if [ `head -n1 $file | cut -d% -f1` -ne "100" ]; then res=1 fails=$(($fails+1)) report=$report`echo -n $file`":1:E: undocumented symbols\n" fi file=$dir/*-unused.txt; if [ -e "$file" ]; then lines=`wc -l $file | cut -f1 -d\ ` if [ $lines -gt 0 ]; then res=1 fails=$(($fails+1)) report=$report`echo -n $file`":1:E: $lines unused documentation entries\n" fi fi file=$dir/*-undeclared.txt; if [ -e "$file" ]; then lines=`wc -l $file | cut -f1 -d\ ` if [ $lines -gt 0 ]; then res=1 fails=$(($fails+1)) report=$report`echo -n $file`":1:E: $lines undeclared symbols\n" fi fi fi done echo if [ $checks -gt 0 ];then rate=$((($checks-$fails)*100/$checks)) echo -n "$rate%: Checks: $checks, Failures: $fails" if [ $fails -gt 0 ]; then echo -e -n $report else echo fi fi exit $res buzztard-0.6.0/tests/xmlvalid.sh0000754042355400116100000000132711665720406013643 00000000000000#!/bin/sh # $Id: xmlvalid.sh 3716 2011-12-01 15:45:09Z ensonic $ # test validity of xml files if [ -z $srcdir ]; then srcdir=. fi XML_OPTS="--noout --nonet" E_SONGS="$srcdir/songs/buzz*.xml $srcdir/songs/combi*.xml $srcdir/songs/melo*.xml $srcdir/songs/simple*.xml" # do wellformed checking xmllint $XML_OPTS $E_SONGS if [ $? -ne 0 ]; then exit 1; fi # check the schema itself xmllint $XML_OPTS $srcdir/../docs/buzztard.xsd if [ $? -ne 0 ]; then exit 1; fi # do schema validation xmllint $XML_OPTS --schema $srcdir/../docs/buzztard.xsd $E_SONGS if [ $? -ne 0 ]; then exit 1; fi # test the docs xmllint $XML_OPTS --xinclude --postvalid $srcdir/../docs/help/bt-edit/C/buzztard-edit.xml if [ $? -ne 0 ]; then exit 1; fi buzztard-0.6.0/tests/ui/0000755042355400116100000000000011675570677012175 500000000000000buzztard-0.6.0/tests/ui/edit/0000755042355400116100000000000011675570700013105 500000000000000buzztard-0.6.0/tests/ui/edit/e-bt-machine-actions.c0000644042355400116100000000601111576360404017054 00000000000000/* $Id: e-bt-machine-actions.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // this tests triggering certain dialog resposes static struct { GtkDialog *dialog; gint response; } dialog_data; static gboolean leave_dialog(gpointer user_data) { if (dialog_data.dialog) { gtk_dialog_response(dialog_data.dialog,dialog_data.response); return FALSE; } else { BtMainWindow *main_window=BT_MAIN_WINDOW(user_data); // need to get get the dialog here g_object_get(main_window,"dialog",&dialog_data.dialog,NULL); return TRUE; } } // create app and then unconditionally destroy window BT_START_TEST(test_about_dialog) { BtEditApplication *app; GError *err=NULL; BtMainWindow *main_window; BtSong *song; BtMachine *machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window && song g_object_get(app,"main-window",&main_window,"song",&song,NULL); fail_unless(main_window != NULL, NULL); fail_unless(song != NULL, NULL); // create a source machine machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); dialog_data.dialog=NULL; dialog_data.response=GTK_RESPONSE_ACCEPT; g_idle_add(leave_dialog,(gpointer)main_window); bt_machine_action_about(machine,main_window); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_unref(machine); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_actions_example_case(void) { TCase *tc = tcase_create("BtMachineActionsExamples"); tcase_add_test(tc,test_about_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-signal-analysis-dialog.c0000644042355400116100000000610711576360404020353 00000000000000/* $Id: e-bt-signal-analysis-dialog.c 3250 2011-03-16 16:19:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // load a song and show machine properties dialog BT_START_TEST(test_signal_analysis_dialog) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; BtWire *wire; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); machine=bt_setup_get_machine_by_id(setup,"beep1"); fail_unless(machine != NULL, NULL); wire=bt_setup_get_wire_by_src_machine(setup,machine); fail_unless(wire != NULL, NULL); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); if((dialog=GTK_WIDGET(bt_signal_analysis_dialog_new(GST_BIN(wire))))) { // if we miss gst-plugins like level or spectrum, we don't get the dialog gtk_widget_show_all(dialog); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); } // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free objects g_object_unref(wire); g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_signal_analysis_dialog_example_case(void) { TCase *tc = tcase_create("BtSignalAnalysisDialogExamples"); tcase_add_test(tc,test_signal_analysis_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-settings-dialog.c0000644042355400116100000000233111576360404017126 00000000000000/* $Id: s-bt-settings-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_settings_dialog_test_case(void); extern TCase *bt_settings_dialog_example_case(void); Suite *bt_settings_dialog_suite(void) { Suite *s=suite_create("BtSettingsDialog"); //suite_add_tcase(s,bt_settings_dialog_test_case()); suite_add_tcase(s,bt_settings_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-render-progress-dialog.c0000644042355400116100000000516011576360404020374 00000000000000/* $Id: e-bt-render-progress-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; BtRenderDialog *render_settings; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create parent render_settings=bt_render_dialog_new(); fail_unless(render_settings!=NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_render_progress_new(render_settings)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); gtk_widget_destroy(GTK_WIDGET(render_settings)); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_render_progress_dialog_example_case(void) { TCase *tc = tcase_create("BtRenderProgressDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-render-dialog.c0000644042355400116100000000231311576360404016545 00000000000000/* $Id: s-bt-render-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_render_dialog_test_case(void); extern TCase *bt_render_dialog_example_case(void); Suite *bt_render_dialog_suite(void) { Suite *s=suite_create("BtRenderDialog"); //suite_add_tcase(s,bt_render_dialog_test_case()); suite_add_tcase(s,bt_render_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-controller-learn-dialog.c0000644042355400116100000000241611576360404020554 00000000000000/* $Id: s-bt-controller-learn-dialog.c 2689 2010-01-09 12:05:45Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_controller_learn_dialog_test_case(void); extern TCase *bt_controller_learn_dialog_example_case(void); Suite *bt_controller_learn_dialog_suite(void) { Suite *s=suite_create("BtControllerLearnDialog"); //suite_add_tcase(s,bt_controller_learn_dialog_test_case()); suite_add_tcase(s,bt_controller_learn_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-pattern-page.c0000644042355400116100000000630311576360404016405 00000000000000/* $Id: e-bt-pattern-page.c 3221 2011-02-22 10:19:55Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // test some key presses BT_START_TEST(test_editing) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPagePatterns *pattern_page; BtSong *song; BtSetup *setup; BtMachine *src_machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load a song bt_edit_application_load_song(app,check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); g_object_unref(song); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // make sure the pattern view shows something src_machine=bt_setup_get_machine_by_id(setup,"beep1"); g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); g_object_get(G_OBJECT(pages),"patterns-page",&pattern_page,NULL); bt_main_page_patterns_show_machine(pattern_page,src_machine); // show page gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); while(gtk_events_pending()) gtk_main_iteration(); // send a '.' key-press check_send_key((GtkWidget *)pattern_page,'.'); // send a '0' key-press check_send_key((GtkWidget *)pattern_page,'0'); // @TODO: assert some pattern changes g_object_unref(pattern_page); g_object_unref(src_machine); g_object_unref(setup); g_object_unref(pages); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_pattern_page_example_case(void) { TCase *tc = tcase_create("BtPatternPageExamples"); tcase_add_test(tc,test_editing); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-preset-properties-dialog.c0000644042355400116100000000251611576360404022371 00000000000000/* $Id: s-bt-machine-preset-properties-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_preset_properties_dialog_test_case(void); extern TCase *bt_machine_preset_properties_dialog_example_case(void); Suite *bt_machine_preset_properties_dialog_suite(void) { Suite *s=suite_create("BtMachinePresetPropertiesDialog"); //suite_add_tcase(s,bt_machine_preset_properties_dialog_test_case()); suite_add_tcase(s,bt_machine_preset_properties_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-render-progress-dialog.c0000644042355400116100000000241111576360404020406 00000000000000/* $Id: s-bt-render-progress-dialog.c 2671 2009-12-14 22:33:47Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_render_progress_dialog_test_case(void); extern TCase *bt_render_progress_dialog_example_case(void); Suite *bt_render_progress_dialog_suite(void) { Suite *s=suite_create("BtRenderProgressDialog"); //suite_add_tcase(s,bt_render_progress_dialog_test_case()); suite_add_tcase(s,bt_render_progress_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-rename-dialog.c0000644042355400116100000000240211576360404020136 00000000000000/* $Id: s-bt-machine-rename-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_rename_dialog_test_case(void); extern TCase *bt_machine_rename_dialog_example_case(void); Suite *bt_machine_rename_dialog_suite(void) { Suite *s=suite_create("BtMachineRenameDialog"); //suite_add_tcase(s,bt_machine_rename_dialog_test_case()); suite_add_tcase(s,bt_machine_rename_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-main-window.c0000644042355400116100000000227311576360404016267 00000000000000/* $Id: s-bt-main-window.c 2672 2009-12-15 22:47:47Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_main_window_test_case(void); extern TCase *bt_main_window_example_case(void); Suite *bt_main_window_suite(void) { Suite *s=suite_create("BtMainWIndow"); //suite_add_tcase(s,bt_main_window_test_case()); suite_add_tcase(s,bt_main_window_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-machine-rename-dialog.c0000644042355400116100000000543211576360404020126 00000000000000/* $Id: e-bt-machine-rename-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; GError *err=NULL; BtMainWindow *main_window; BtSong *song; BtMachine *machine; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window and close it g_object_get(app,"main-window",&main_window,"song",&song,NULL); fail_unless(main_window != NULL, NULL); fail_unless(song != NULL, NULL); // create a source machine machine=BT_MACHINE(bt_source_machine_new(song,"synth","buzztard-test-mono-source",0,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_machine_rename_dialog_new(machine)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_unref(machine); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_rename_dialog_example_case(void) { TCase *tc = tcase_create("BtMachineRenameDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-machine-preset-properties-dialog.c0000644042355400116100000000471411576360404022355 00000000000000/* $Id: e-bt-machine-preset-properties-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; gchar *name=NULL,*comment=NULL; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_machine_preset_properties_dialog_new(NULL,&name,&comment)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_preset_properties_dialog_example_case(void) { TCase *tc = tcase_create("BtMachinePresetPropertiesDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-machine-properties-dialog.c0000644042355400116100000000632211576360404021052 00000000000000/* $Id: e-bt-machine-properties-dialog.c 3301 2011-04-04 21:48:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static gint run_ix=0; static gchar *machine_ids[]={"beep1","echo1"}; static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // load a song and show machine properties dialog BT_START_TEST(test_machine_properties_dialog) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); machine=bt_setup_get_machine_by_id(setup,machine_ids[run_ix++]); fail_unless(machine != NULL, NULL); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog=GTK_WIDGET(bt_machine_properties_dialog_new(machine)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); // play for a while to trigger dialog updates bt_song_play(song); bt_song_update_playback_position(song); while(gtk_events_pending()) gtk_main_iteration(); bt_song_stop(song); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free objects g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_properties_dialog_example_case(void) { TCase *tc = tcase_create("BtMachinePropertiesDialogExamples"); tcase_add_test(tc,test_machine_properties_dialog); tcase_add_test(tc,test_machine_properties_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-missing-song-elements-dialog.c0000644042355400116100000000715311576360404021506 00000000000000/* $Id: e-bt-missing-song-elements-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_empty_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_missing_song_elements_dialog_new(NULL,NULL)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; GList *missing_machines=NULL; GList *missing_waves=NULL; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); missing_machines=g_list_append(missing_machines,"TestGenerator"); missing_waves=g_list_append(missing_waves,"/home/user/sounds/ploink.wav"); missing_waves=g_list_append(missing_waves,"/home/user/sounds/meep.wav"); // create, show and destroy dialog dialog=GTK_WIDGET(bt_missing_song_elements_dialog_new(missing_machines,missing_waves)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_missing_song_elements_dialog_example_case(void) { TCase *tc = tcase_create("BtMissingSongElementsDialogExamples"); tcase_add_test(tc,test_create_empty_dialog); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-sequence-page.c0000644042355400116100000001072011576360404016536 00000000000000/* $Id: e-bt-sequence-page.c 3236 2011-03-09 14:55:44Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // activate tracks BT_START_TEST(test_active_machine) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPageSequence *sequence_page; BtSong *song; BtSetup *setup; BtMachine *src_machine1; BtMachine *src_machine2; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load a song bt_edit_application_load_song(app,check_get_test_song_path("test-simple3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); g_object_unref(song); GST_INFO("song loaded"); // get window and page g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); g_object_get(G_OBJECT(pages),"sequence-page",&sequence_page,NULL); src_machine1=bt_setup_get_machine_by_id(setup,"sine1"); fail_unless(src_machine1 != NULL, NULL); GST_INFO("sine1 %p,ref_count=%d",src_machine1,G_OBJECT_REF_COUNT(src_machine1)); src_machine2=bt_setup_get_machine_by_id(setup,"sine2"); fail_unless(src_machine2 != NULL, NULL); GST_INFO("sine2 %p,ref_count=%d",src_machine2,G_OBJECT_REF_COUNT(src_machine2)); g_object_unref(setup); // show page gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_SEQUENCE_PAGE); while(gtk_events_pending()) gtk_main_iteration(); // need to focus the sequence page to make the key events work gtk_widget_grab_focus((GtkWidget *)sequence_page); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("sine1 %p,ref_count=%d",src_machine1,G_OBJECT_REF_COUNT(src_machine1)); GST_INFO("sine2 %p,ref_count=%d",src_machine2,G_OBJECT_REF_COUNT(src_machine2)); // make screenshot check_make_widget_screenshot((GtkWidget *)sequence_page,"0"); // emit key presses to go though the tracks // send a '->' key check_send_key((GtkWidget *)sequence_page,GDK_Right); // make screenshot check_make_widget_screenshot((GtkWidget *)sequence_page,"1"); GST_INFO("sine1 %p,ref_count=%d",src_machine1,G_OBJECT_REF_COUNT(src_machine1)); GST_INFO("sine2 %p,ref_count=%d",src_machine2,G_OBJECT_REF_COUNT(src_machine2)); // send a '<-' key-press twice check_send_key((GtkWidget *)sequence_page,GDK_Left); check_send_key((GtkWidget *)sequence_page,GDK_Left); // make screenshot check_make_widget_screenshot((GtkWidget *)sequence_page,"2"); GST_INFO("sine1 %p,ref_count=%d",src_machine1,G_OBJECT_REF_COUNT(src_machine1)); GST_INFO("sine2 %p,ref_count=%d",src_machine2,G_OBJECT_REF_COUNT(src_machine2)); g_object_unref(src_machine1); g_object_unref(src_machine2); g_object_unref(sequence_page); g_object_unref(pages); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_sequence_page_example_case(void) { TCase *tc = tcase_create("BtSequencePageExamples"); tcase_add_test(tc,test_active_machine); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/t-bt-pattern-page.c0000644042355400116100000001372111576360404016426 00000000000000/* $Id: t-bt-pattern-page.c 3221 2011-02-22 10:19:55Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // show pattern page with empty pattern and emit key-presses BT_START_TEST(test_editing1) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPagePatterns *pattern_page; BtSong *song; BtSetup *setup; BtMachine *src_machine; GError *err=NULL; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window && song g_object_get(app,"song",&song,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); // create a source machine src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","fakesrc",0,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); // make sure the pattern view shows something g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); g_object_get(G_OBJECT(pages),"patterns-page",&pattern_page,NULL); bt_main_page_patterns_show_machine(pattern_page,src_machine); // show page gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("sending events"); // send a '.' key-press check_send_key((GtkWidget *)pattern_page,'.'); // send a '0' key-press check_send_key((GtkWidget *)pattern_page,'0'); GST_INFO("test done"); g_object_unref(pattern_page); g_object_unref(src_machine); g_object_unref(setup); g_object_unref(pages); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application g_object_unref(song); GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // show pattern page with empty pattern and emit mouse klicks BT_START_TEST(test_editing2) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPagePatterns *pattern_page; GtkWidget *pattern_editor; BtSong *song; BtSetup *setup; BtMachine *src_machine; GdkEventButton *e; GError *err=NULL; GList *list; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window && song g_object_get(app,"song",&song,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); // create a source machine src_machine=BT_MACHINE(bt_source_machine_new(song,"gen","fakesrc",0,&err)); fail_unless(src_machine!=NULL, NULL); fail_unless(err==NULL, NULL); // make sure the pattern view shows something g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); g_object_get(G_OBJECT(pages),"patterns-page",&pattern_page,NULL); bt_main_page_patterns_show_machine(pattern_page,src_machine); // show page gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("object types: %s",G_OBJECT_TYPE_NAME(pattern_page)); list=gtk_container_get_children(GTK_CONTAINER(pattern_page)); // 1st is toolbat, 2nd is scrollable window pattern_editor=gtk_bin_get_child(GTK_BIN(g_list_nth_data(list,1))); g_list_free(list); GST_INFO("object types: %s",G_OBJECT_TYPE_NAME(pattern_editor)); GST_INFO("sending events"); // send a left mouse button press (hopefully on the tick number column) e=(GdkEventButton *)gdk_event_new(GDK_BUTTON_PRESS); e->window=g_object_ref(gtk_widget_get_window((GtkWidget *)pattern_editor)); e->button=1; // left-button e->x=10.0; e->y=100.0; e->state=GDK_BUTTON1_MASK; gtk_main_do_event((GdkEvent *)e); while(gtk_events_pending()) gtk_main_iteration(); gdk_event_free((GdkEvent *)e); GST_INFO("test done"); g_object_unref(pattern_page); g_object_unref(src_machine); g_object_unref(setup); g_object_unref(pages); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application g_object_unref(song); GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_pattern_page_test_case(void) { TCase *tc = tcase_create("BtPatternPageTests"); tcase_add_test(tc,test_editing1); tcase_add_test(tc,test_editing2); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-change-log.c0000644042355400116100000000226411576360404016042 00000000000000/* $Id: s-bt-change-log.c 2868 2010-05-17 21:37:45Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_change_log_test_case(void); extern TCase *bt_change_log_example_case(void); Suite *bt_change_log_suite(void) { Suite *s=suite_create("BtChangeLog"); //suite_add_tcase(s,bt_change_log_test_case()); suite_add_tcase(s,bt_change_log_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/Makefile.in0000644042355400116100000006341611675570635015113 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/ui/edit DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbt_edit_check_la_DEPENDENCIES = \ $(top_builddir)/src/ui/edit/libbtedit.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am_libbt_edit_check_la_OBJECTS = s-bt-about-dialog.lo \ e-bt-about-dialog.lo s-bt-change-log.lo e-bt-change-log.lo \ s-bt-controller-learn-dialog.lo \ e-bt-controller-learn-dialog.lo s-bt-crash-recover-dialog.lo \ e-bt-crash-recover-dialog.lo s-bt-edit-application.lo \ e-bt-edit-application.lo s-bt-interaction-controller-menu.lo \ e-bt-interaction-controller-menu.lo s-bt-machine-actions.lo \ e-bt-machine-actions.lo s-bt-machine-page.lo \ e-bt-machine-page.lo s-bt-machine-preset-properties-dialog.lo \ e-bt-machine-preset-properties-dialog.lo \ s-bt-machine-preferences-dialog.lo \ e-bt-machine-preferences-dialog.lo \ s-bt-machine-properties-dialog.lo \ e-bt-machine-properties-dialog.lo \ s-bt-machine-rename-dialog.lo e-bt-machine-rename-dialog.lo \ s-bt-main-window.lo e-bt-main-window.lo \ s-bt-missing-framework-elements-dialog.lo \ e-bt-missing-framework-elements-dialog.lo \ s-bt-missing-song-elements-dialog.lo \ e-bt-missing-song-elements-dialog.lo s-bt-pattern-page.lo \ e-bt-pattern-page.lo t-bt-pattern-page.lo \ s-bt-pattern-properties-dialog.lo \ e-bt-pattern-properties-dialog.lo s-bt-render-dialog.lo \ e-bt-render-dialog.lo s-bt-render-progress-dialog.lo \ e-bt-render-progress-dialog.lo s-bt-sequence-page.lo \ e-bt-sequence-page.lo s-bt-settings-dialog.lo \ e-bt-settings-dialog.lo s-bt-signal-analysis-dialog.lo \ e-bt-signal-analysis-dialog.lo s-bt-tip-dialog.lo \ e-bt-tip-dialog.lo libbt_edit_check_la_OBJECTS = $(am_libbt_edit_check_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbt_edit_check_la_SOURCES) DIST_SOURCES = $(libbt_edit_check_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ noinst_LTLIBRARIES = libbt-edit-check.la libbt_edit_check_la_LIBADD = \ $(top_builddir)/src/ui/edit/libbtedit.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) libbt_edit_check_la_SOURCES = m-bt-edit.h \ s-bt-about-dialog.c e-bt-about-dialog.c \ s-bt-change-log.c e-bt-change-log.c \ s-bt-controller-learn-dialog.c e-bt-controller-learn-dialog.c \ s-bt-crash-recover-dialog.c e-bt-crash-recover-dialog.c \ s-bt-edit-application.c e-bt-edit-application.c \ s-bt-interaction-controller-menu.c e-bt-interaction-controller-menu.c \ s-bt-machine-actions.c e-bt-machine-actions.c \ s-bt-machine-page.c e-bt-machine-page.c \ s-bt-machine-preset-properties-dialog.c e-bt-machine-preset-properties-dialog.c \ s-bt-machine-preferences-dialog.c e-bt-machine-preferences-dialog.c \ s-bt-machine-properties-dialog.c e-bt-machine-properties-dialog.c \ s-bt-machine-rename-dialog.c e-bt-machine-rename-dialog.c \ s-bt-main-window.c e-bt-main-window.c \ s-bt-missing-framework-elements-dialog.c e-bt-missing-framework-elements-dialog.c \ s-bt-missing-song-elements-dialog.c e-bt-missing-song-elements-dialog.c \ s-bt-pattern-page.c e-bt-pattern-page.c t-bt-pattern-page.c \ s-bt-pattern-properties-dialog.c e-bt-pattern-properties-dialog.c \ s-bt-render-dialog.c e-bt-render-dialog.c \ s-bt-render-progress-dialog.c e-bt-render-progress-dialog.c \ s-bt-sequence-page.c e-bt-sequence-page.c \ s-bt-settings-dialog.c e-bt-settings-dialog.c \ s-bt-signal-analysis-dialog.c e-bt-signal-analysis-dialog.c \ s-bt-tip-dialog.c e-bt-tip-dialog.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 tests/ui/edit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/ui/edit/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbt-edit-check.la: $(libbt_edit_check_la_OBJECTS) $(libbt_edit_check_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbt_edit_check_la_OBJECTS) $(libbt_edit_check_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-about-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-change-log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-controller-learn-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-crash-recover-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-edit-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-interaction-controller-menu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-actions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-preferences-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-preset-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-machine-rename-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-main-window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-missing-framework-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-missing-song-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-pattern-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-pattern-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-render-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-render-progress-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-sequence-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-settings-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-signal-analysis-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-tip-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-about-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-change-log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-controller-learn-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-crash-recover-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-edit-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-interaction-controller-menu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-actions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-preferences-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-preset-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-machine-rename-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-main-window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-missing-framework-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-missing-song-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-pattern-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-pattern-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-render-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-render-progress-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-sequence-page.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-settings-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-signal-analysis-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-tip-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-bt-pattern-page.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbt_edit_check_la_SOURCES) # 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: buzztard-0.6.0/tests/ui/edit/e-bt-main-window.c0000644042355400116100000001144511576360404016252 00000000000000/* $Id: e-bt-main-window.c 2689 2010-01-09 12:05:45Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper /* static gboolean timeout(gpointer data) { GST_INFO("shutting down the gui"); gtk_main_quit(); //gtk_widget_destroy(GTK_WIDGET(data)); return FALSE; } */ //-- tests // this tests triggering certain dialog resposes static struct { GtkDialog *dialog; gint response; } dialog_data; static gboolean leave_dialog(gpointer user_data) { if (dialog_data.dialog) { gtk_dialog_response(dialog_data.dialog,dialog_data.response); return FALSE; } else { BtMainWindow *main_window=BT_MAIN_WINDOW(user_data); // need to get get the dialog here g_object_get(main_window,"dialog",&dialog_data.dialog,NULL); return TRUE; } } // test message dialog BT_START_TEST(test_message_dialog1) { BtEditApplication *app; BtMainWindow *main_window; app=bt_edit_application_new(); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog_data.dialog=NULL; dialog_data.response=GTK_RESPONSE_ACCEPT; g_idle_add(leave_dialog,(gpointer)main_window); bt_dialog_message(main_window,"title","headline","message"); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application g_object_checked_unref(app); } BT_END_TEST // test question dialog BT_START_TEST(test_question_dialog1) { BtEditApplication *app; BtMainWindow *main_window; gboolean res; app=bt_edit_application_new(); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog_data.dialog=NULL; dialog_data.response=GTK_RESPONSE_ACCEPT; g_idle_add(leave_dialog,(gpointer)main_window); res=bt_dialog_question(main_window,"title","headline","message"); fail_unless(res == TRUE, NULL); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application g_object_checked_unref(app); } BT_END_TEST // test open a song, but cancel BT_START_TEST(test_open_song) { BtEditApplication *app; BtMainWindow *main_window; app=bt_edit_application_new(); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog_data.dialog=NULL; dialog_data.response=GTK_RESPONSE_CANCEL; g_idle_add(leave_dialog,(gpointer)main_window); bt_main_window_open_song(main_window); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application g_object_checked_unref(app); } BT_END_TEST // test open a song, but cancel BT_START_TEST(test_save_song_as) { BtEditApplication *app; BtMainWindow *main_window; app=bt_edit_application_new(); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog_data.dialog=NULL; dialog_data.response=GTK_RESPONSE_CANCEL; g_idle_add(leave_dialog,(gpointer)main_window); bt_main_window_save_song_as(main_window); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free everything g_object_checked_unref(app); } BT_END_TEST TCase *bt_main_window_example_case(void) { TCase *tc = tcase_create("BtMainWindowExamples"); tcase_add_test(tc,test_message_dialog1); tcase_add_test(tc,test_question_dialog1); tcase_add_test(tc,test_open_song); tcase_add_test(tc,test_save_song_as); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-machine-preferences-dialog.c0000644042355400116100000000562411576360404021163 00000000000000/* $Id: e-bt-machine-preferences-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // load a song and show machine properties dialog BT_START_TEST(test_machine_preferences_dialog) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); machine=bt_setup_get_machine_by_id(setup,"beep1"); fail_unless(machine != NULL, NULL); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); dialog=GTK_WIDGET(bt_machine_preferences_dialog_new(machine)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free objects g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_preferences_dialog_example_case(void) { TCase *tc = tcase_create("BtMachinePreferencesDialogExamples"); tcase_add_test(tc,test_machine_preferences_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-sequence-page.c0000644042355400116100000000231111576360404016551 00000000000000/* $Id: s-bt-sequence-page.c 3219 2011-02-21 21:15:08Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_sequence_page_test_case(void); extern TCase *bt_sequence_page_example_case(void); Suite *bt_sequence_page_suite(void) { Suite *s=suite_create("BtSequencePage"); //suite_add_tcase(s,bt_sequence_page_test_case()); suite_add_tcase(s,bt_sequence_page_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-tip-dialog.c0000644042355400116100000000452511576360404016053 00000000000000/* $Id: e-bt-tip-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_tip_dialog_new()); fail_unless(dialog!=NULL, NULL); GST_INFO("dialog created"); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_tip_dialog_example_case(void) { TCase *tc = tcase_create("BtTipDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-pattern-properties-dialog.c0000644042355400116100000000573011576360404021125 00000000000000/* $Id: e-bt-pattern-properties-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; GError *err=NULL; BtMainWindow *main_window; BtSong *song; BtMachine *machine=NULL; BtPattern *pattern; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window and song g_object_get(app,"main-window",&main_window,"song",&song,NULL); fail_unless(main_window != NULL, NULL); fail_unless(song != NULL, NULL); // create a source machine machine=BT_MACHINE(bt_source_machine_new(song,"gen","buzztard-test-mono-source",0,&err)); fail_unless(machine!=NULL, NULL); fail_unless(err==NULL, NULL); // new_pattern pattern=bt_pattern_new(song, "test", "test", /*length=*/16, machine); fail_unless(pattern!=NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_pattern_properties_dialog_new(pattern)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_unref(pattern); g_object_unref(machine); g_object_unref(song); g_object_checked_unref(app); } BT_END_TEST TCase *bt_pattern_properties_dialog_example_case(void) { TCase *tc = tcase_create("BtPatternPropertiesDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-page.c0000644042355400116100000000230211576360404016345 00000000000000/* $Id: s-bt-machine-page.c 3052 2010-11-24 21:04:11Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_page_test_case(void); extern TCase *bt_machine_page_example_case(void); Suite *bt_machine_page_suite(void) { Suite *s=suite_create("BtMachinePage"); //suite_add_tcase(s,bt_machine_page_test_case()); suite_add_tcase(s,bt_machine_page_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-preferences-dialog.c0000644042355400116100000000244311576360404021175 00000000000000/* $Id: s-bt-machine-preferences-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_preferences_dialog_test_case(void); extern TCase *bt_machine_preferences_dialog_example_case(void); Suite *bt_machine_preferences_dialog_suite(void) { Suite *s=suite_create("BtMachinePreferencesDialog"); //suite_add_tcase(s,bt_machine_preferences_dialog_test_case()); suite_add_tcase(s,bt_machine_preferences_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-interaction-controller-menu.c0000644042355400116100000000451111576360404021457 00000000000000/* $Id: e-bt-interaction-controller-menu.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // view all tabs BT_START_TEST(test_create_menu) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *menu; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); GST_INFO("main_window->ref_ct=%d",G_OBJECT_REF_COUNT(main_window)); // make menus menu=(GtkWidget *)bt_interaction_controller_menu_new(BT_INTERACTION_CONTROLLER_RANGE_MENU); fail_unless(menu != NULL, NULL); gtk_widget_destroy(menu); menu=(GtkWidget *)bt_interaction_controller_menu_new(BT_INTERACTION_CONTROLLER_TRIGGER_MENU); fail_unless(menu != NULL, NULL); gtk_widget_destroy(menu); gtk_widget_destroy(GTK_WIDGET(main_window)); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_interaction_controller_menu_example_case(void) { TCase *tc = tcase_create("BtInteractionControllerMenuExamples"); tcase_add_test(tc,test_create_menu); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/m-bt-edit.h0000644042355400116100000000221111576360404014752 00000000000000/* $Id: m-bt-edit.h 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "../../bt-check.h" #include "../../../src/ui/edit/bt-edit.h" //-- globals GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); GST_DEBUG_CATEGORY_EXTERN(bt_edit_debug); //-- prototypes extern void bt_edit_setup(void); extern void bt_edit_teardown(void); buzztard-0.6.0/tests/ui/edit/e-bt-machine-page.c0000644042355400116100000000741411576360404016340 00000000000000/* $Id: e-bt-machine-page.c 3210 2011-02-17 21:35:56Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper //-- tests // view all tabs BT_START_TEST(test_machine_ref) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPageMachines *machines_page; BtSong *song; BtSetup *setup; BtMachine *src_machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get the empty song g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); g_object_unref(song); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); fail_unless(pages != NULL, NULL); g_object_get(G_OBJECT(pages),"machines-page",&machines_page,NULL); fail_unless(machines_page != NULL, NULL); /* remove some other pages // (ev. run for all combinations - if a test using all pages fails?) gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_INFO_PAGE); gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_WAVES_PAGE); gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_SEQUENCE_PAGE); gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); */ // show page gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_MACHINES_PAGE); g_object_unref(pages); // add and get a source machine bt_main_page_machines_add_source_machine(machines_page,"beep1","simsyn"); src_machine=bt_setup_get_machine_by_id(setup,"beep1"); fail_unless(src_machine != NULL, NULL); g_object_unref(setup); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("machine %p,ref_count=%d has been created",src_machine,G_OBJECT_REF_COUNT(src_machine)); // remove the machine and check that it is disposed bt_main_page_machines_delete_machine(machines_page,src_machine); g_object_unref(machines_page); while(gtk_events_pending()) gtk_main_iteration(); g_object_checked_unref(src_machine); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_machine_page_example_case(void) { TCase *tc = tcase_create("BtMachinePageExamples"); tcase_add_test(tc,test_machine_ref); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-properties-dialog.c0000644042355400116100000000243411576360404021070 00000000000000/* $Id: s-bt-machine-properties-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_properties_dialog_test_case(void); extern TCase *bt_machine_properties_dialog_example_case(void); Suite *bt_machine_properties_dialog_suite(void) { Suite *s=suite_create("BtMachinePropertiesDialog"); //suite_add_tcase(s,bt_machine_properties_dialog_test_case()); suite_add_tcase(s,bt_machine_properties_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-settings-dialog.c0000644042355400116100000000535011576360404017114 00000000000000/* $Id: e-bt-settings-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; GEnumClass *enum_class; GEnumValue *enum_value; guint i; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_settings_dialog_new()); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // snapshot all dialog pages enum_class=g_type_class_peek_static(BT_TYPE_SETTINGS_PAGE); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { g_object_set(G_OBJECT(dialog),"page",i,NULL); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),enum_value->value_nick); while(gtk_events_pending()) gtk_main_iteration(); } } gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_settings_dialog_example_case(void) { TCase *tc = tcase_create("BtSettingsDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-crash-recover-dialog.c0000644042355400116100000000237111576360404020035 00000000000000/* $Id: s-bt-crash-recover-dialog.c 3298 2011-04-04 20:13:53Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_crash_recover_dialog_test_case(void); extern TCase *bt_crash_recover_dialog_example_case(void); Suite *bt_crash_recover_dialog_suite(void) { Suite *s=suite_create("BtCrashRecoverDialog"); //suite_add_tcase(s,bt_crash_recover_dialog_test_case()); suite_add_tcase(s,bt_crash_recover_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-change-log.c0000644042355400116100000003220511576360404016022 00000000000000/* $Id: e-bt-change-log.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- test class typedef struct { const GObject parent; BtChangeLog *change_log; gint val; } BtTestChangeLogger; typedef struct { const GObjectClass parent; } BtTestChangeLoggerClass; static gboolean bt_test_change_logger_change(const BtChangeLogger *owner,const gchar *data) { BtTestChangeLogger *self = (BtTestChangeLogger *)owner; gboolean res=FALSE; if(!strncmp(data,"set_val ",8)) { self->val=atoi(&data[8]); GST_DEBUG("val=%d",self->val); res=TRUE; } return res; } static void bt_test_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data) { BtChangeLoggerInterface * const iface = g_iface; iface->change = bt_test_change_logger_change; } static void bt_test_change_logger_dispose(GObject *object) { BtTestChangeLogger *self = (BtTestChangeLogger *)object; g_object_unref(self->change_log); } static void bt_test_change_logger_init(BtTestChangeLogger *self) { self->change_log=bt_change_log_new(); } static void bt_test_change_logger_class_init(BtTestChangeLoggerClass * const klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->dispose = bt_test_change_logger_dispose; } G_DEFINE_TYPE_WITH_CODE(BtTestChangeLogger, bt_test_change_logger, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(BT_TYPE_CHANGE_LOGGER, bt_test_change_logger_interface_init)); static BtTestChangeLogger *bt_test_change_logger_new(void) { return((BtTestChangeLogger *)g_object_new(bt_test_change_logger_get_type(),NULL)); } //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // test lifecycle/refcounts BT_START_TEST(test_create_and_destroy1) { BtChangeLog *cl; cl=bt_change_log_new(); fail_unless(cl != NULL, NULL); g_object_checked_unref(cl); } BT_END_TEST BT_START_TEST(test_create_and_destroy2) { BtEditApplication *app; BtMainWindow *main_window; BtChangeLog *cl; app=bt_edit_application_new(); GST_INFO("app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); cl=bt_change_log_new(); GST_INFO("cl=%p, cl->ref_ct=%d",cl,G_OBJECT_REF_COUNT(cl)); fail_unless(cl != NULL, NULL); // close window g_object_get(app,"main-window",&main_window,NULL); gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); g_object_unref(cl); g_object_checked_unref(app); } BT_END_TEST // test single undo/redo actions BT_START_TEST(test_undo_redo_1) { BtEditApplication *app; BtMainWindow *main_window; BtChangeLog *cl; BtTestChangeLogger *tcl; gboolean can_undo,can_redo; // testing the change log needs a active song as a context app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_new_song(app); cl=bt_change_log_new(); fail_unless(cl != NULL, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(!can_redo, NULL); // create a test instance that implements changelogger iface tcl=bt_test_change_logger_new(); fail_unless(tcl != NULL, NULL); // make 1 change tcl->val=5; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 0"),g_strdup("set_val 5")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // undo & verify bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==0, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(can_redo, NULL); // redo & verify bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==5, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // close window g_object_get(app,"main-window",&main_window,NULL); gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); g_object_unref(tcl); g_object_unref(cl); g_object_checked_unref(app); } BT_END_TEST // test double undo/redo actions BT_START_TEST(test_undo_redo_2) { BtEditApplication *app; BtMainWindow *main_window; BtChangeLog *cl; BtTestChangeLogger *tcl; gboolean can_undo,can_redo; // testing the change log needs a active song as a context app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_new_song(app); cl=bt_change_log_new(); fail_unless(cl != NULL, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(!can_redo, NULL); // create a test instance that implements changelogger iface tcl=bt_test_change_logger_new(); fail_unless(tcl != NULL, NULL); // make 2 changes tcl->val=5; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 0"),g_strdup("set_val 5")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); tcl->val=10; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 5"),g_strdup("set_val 10")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // undo & verify bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==5, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(can_redo, NULL); bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==0, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(can_redo, NULL); // redo & verify bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==5, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(can_redo, NULL); bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==10, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // close window g_object_get(app,"main-window",&main_window,NULL); gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); g_object_unref(tcl); g_object_unref(cl); g_object_checked_unref(app); } BT_END_TEST // test single and then double undo/redo actions BT_START_TEST(test_undo_redo_3) { BtEditApplication *app; BtMainWindow *main_window; BtChangeLog *cl; BtTestChangeLogger *tcl; gboolean can_undo,can_redo; // testing the change log needs a active song as a context app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_new_song(app); cl=bt_change_log_new(); fail_unless(cl != NULL, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(!can_redo, NULL); // create a test instance that implements changelogger iface tcl=bt_test_change_logger_new(); fail_unless(tcl != NULL, NULL); // make 1 change tcl->val=2; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 0"),g_strdup("set_val 2")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // undo & verify bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==0, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(can_redo, NULL); // redo & verify bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==2, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // make 2 changes tcl->val=5; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 2"),g_strdup("set_val 5")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); tcl->val=10; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 5"),g_strdup("set_val 10")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // undo & verify bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==5, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(can_redo, NULL); bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==2, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(can_redo, NULL); // redo & verify bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==5, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(can_redo, NULL); bt_change_log_redo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==10, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // close window g_object_get(app,"main-window",&main_window,NULL); gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); g_object_unref(tcl); g_object_unref(cl); g_object_checked_unref(app); } BT_END_TEST // test truncating the undo/redo stack BT_START_TEST(test_stack_trunc) { BtEditApplication *app; BtMainWindow *main_window; BtChangeLog *cl; BtTestChangeLogger *tcl; gboolean can_undo,can_redo; // testing the change log needs a active song as a context app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_new_song(app); cl=bt_change_log_new(); fail_unless(cl != NULL, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(!can_redo, NULL); // create a test instance that implements changelogger iface tcl=bt_test_change_logger_new(); fail_unless(tcl != NULL, NULL); // make 1 change tcl->val=5; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 0"),g_strdup("set_val 5")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // undo & verify bt_change_log_undo(tcl->change_log); GST_DEBUG("val=%d",tcl->val); fail_unless(tcl->val==0, NULL); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(!can_undo, NULL); fail_unless(can_redo, NULL); // make 1 change tcl->val=10; bt_change_log_add(tcl->change_log,BT_CHANGE_LOGGER(tcl),g_strdup("set_val 0"),g_strdup("set_val 10")); g_object_get(cl,"can-undo",&can_undo,"can-redo",&can_redo,NULL); fail_unless(can_undo, NULL); fail_unless(!can_redo, NULL); // close window g_object_get(app,"main-window",&main_window,NULL); gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); g_object_unref(tcl); g_object_unref(cl); g_object_checked_unref(app); } BT_END_TEST TCase *bt_change_log_example_case(void) { TCase *tc = tcase_create("BtChangeLogExamples"); tcase_add_test(tc,test_create_and_destroy1); tcase_add_test(tc,test_create_and_destroy2); tcase_add_test(tc,test_undo_redo_1); tcase_add_test(tc,test_undo_redo_2); tcase_add_test(tc,test_undo_redo_3); tcase_add_test(tc,test_stack_trunc); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-crash-recover-dialog.c0000644042355400116100000000545011576360404020020 00000000000000/* $Id: e-bt-crash-recover-dialog.c 3298 2011-04-04 20:13:53Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; GList *crash_logs=NULL; BtChangeLogFile crash_log; time_t t; gchar dts[100]; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create test data crash_log.log_name="chip_music.bzt"; crash_log.song_file_name="unsaved song"; t=time(NULL); strftime(dts,99,"%c",localtime(&t)); crash_log.change_ts=dts; crash_log.mtime=0; // only used for sorting crash_logs=g_list_prepend(crash_logs,&crash_log); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_crash_recover_dialog_new(crash_logs)); fail_unless(dialog!=NULL, NULL); GST_INFO("dialog created"); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free test data g_list_free(crash_logs); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_crash_recover_dialog_example_case(void) { TCase *tc = tcase_create("BtCrashRecoverDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/e-bt-missing-framework-elements-dialog.c0000644042355400116100000000711711576360404022535 00000000000000/* $Id: e-bt-missing-framework-elements-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_empty_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_missing_framework_elements_dialog_new(NULL,NULL)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; GList *missing_elements=NULL; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // add a space here, so that it cannot be filtered missing_elements=g_list_append(missing_elements,"level "); missing_elements=g_list_append(missing_elements,"-> You will not see any level-meters"); // create, show and destroy dialog dialog=GTK_WIDGET(bt_missing_framework_elements_dialog_new(NULL,missing_elements)); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_missing_framework_elements_dialog_example_case(void) { TCase *tc = tcase_create("BtMissingFrameworkElementsDialogExamples"); tcase_add_test(tc,test_create_empty_dialog); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-pattern-page.c0000644042355400116100000000227611576360404016430 00000000000000/* $Id: s-bt-pattern-page.c 3052 2010-11-24 21:04:11Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" extern TCase *bt_pattern_page_test_case(void); extern TCase *bt_pattern_page_example_case(void); Suite *bt_pattern_page_suite(void) { Suite *s=suite_create("BtPatternPage"); suite_add_tcase(s,bt_pattern_page_test_case()); suite_add_tcase(s,bt_pattern_page_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-signal-analysis-dialog.c0000644042355400116100000000240711576360404020370 00000000000000/* $Id: s-bt-signal-analysis-dialog.c 3247 2011-03-16 07:59:56Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_signal_analysis_dialog_test_case(void); extern TCase *bt_signal_analysis_dialog_example_case(void); Suite *bt_signal_analysis_dialog_suite(void) { Suite *s=suite_create("BtSignalAnalysisDialog"); //suite_add_tcase(s,bt_signal_analysis_dialog_test_case()); suite_add_tcase(s,bt_signal_analysis_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-about-dialog.c0000644042355400116100000000453511576360404016372 00000000000000/* $Id: e-bt-about-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_about_dialog_new()); fail_unless(dialog!=NULL, NULL); GST_INFO("dialog created"); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_about_dialog_example_case(void) { TCase *tc = tcase_create("BtAboutDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-missing-song-elements-dialog.c0000644042355400116100000000246011576360404021520 00000000000000/* $Id: s-bt-missing-song-elements-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_missing_song_elements_dialog_test_case(void); extern TCase *bt_missing_song_elements_dialog_example_case(void); Suite *bt_missing_song_elements_dialog_suite(void) { Suite *s=suite_create("BtMissingSongElementsDialog"); //suite_add_tcase(s,bt_missing_song_elements_dialog_test_case()); suite_add_tcase(s,bt_missing_song_elements_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-render-dialog.c0000644042355400116100000000460011576360404016530 00000000000000/* $Id: e-bt-render-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // create, show and destroy dialog dialog=GTK_WIDGET(bt_render_dialog_new()); fail_unless(dialog!=NULL, NULL); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_render_dialog_example_case(void) { TCase *tc = tcase_create("BtRenderDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-edit-application.c0000644042355400116100000000234011576360404017257 00000000000000/* $Id: s-bt-edit-application.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_edit_application_test_case(void); extern TCase *bt_edit_application_example_case(void); Suite *bt_edit_application_suite(void) { Suite *s=suite_create("BtEditApplication"); //suite_add_tcase(s,bt_edit_application_test_case()); suite_add_tcase(s,bt_edit_application_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-pattern-properties-dialog.c0000644042355400116100000000243611576360404021143 00000000000000/* $Id: s-bt-pattern-properties-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_pattern_properties_dialog_test_case(void); extern TCase *bt_pattern_properties_dialog_example_case(void); Suite *bt_pattern_properties_dialog_suite(void) { Suite *s=suite_create("BtPatternPropertiesDialog"); //suite_add_tcase(s,bt_pattern_properties_dialog_test_case()); suite_add_tcase(s,bt_pattern_properties_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/Makefile.am0000644042355400116100000000362611576360404015066 00000000000000## Makefile.am for tests/ui/edit noinst_LTLIBRARIES = libbt-edit-check.la libbt_edit_check_la_LIBADD = \ $(top_builddir)/src/ui/edit/libbtedit.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) libbt_edit_check_la_SOURCES = m-bt-edit.h \ s-bt-about-dialog.c e-bt-about-dialog.c \ s-bt-change-log.c e-bt-change-log.c \ s-bt-controller-learn-dialog.c e-bt-controller-learn-dialog.c \ s-bt-crash-recover-dialog.c e-bt-crash-recover-dialog.c \ s-bt-edit-application.c e-bt-edit-application.c \ s-bt-interaction-controller-menu.c e-bt-interaction-controller-menu.c \ s-bt-machine-actions.c e-bt-machine-actions.c \ s-bt-machine-page.c e-bt-machine-page.c \ s-bt-machine-preset-properties-dialog.c e-bt-machine-preset-properties-dialog.c \ s-bt-machine-preferences-dialog.c e-bt-machine-preferences-dialog.c \ s-bt-machine-properties-dialog.c e-bt-machine-properties-dialog.c \ s-bt-machine-rename-dialog.c e-bt-machine-rename-dialog.c \ s-bt-main-window.c e-bt-main-window.c \ s-bt-missing-framework-elements-dialog.c e-bt-missing-framework-elements-dialog.c \ s-bt-missing-song-elements-dialog.c e-bt-missing-song-elements-dialog.c \ s-bt-pattern-page.c e-bt-pattern-page.c t-bt-pattern-page.c \ s-bt-pattern-properties-dialog.c e-bt-pattern-properties-dialog.c \ s-bt-render-dialog.c e-bt-render-dialog.c \ s-bt-render-progress-dialog.c e-bt-render-progress-dialog.c \ s-bt-sequence-page.c e-bt-sequence-page.c \ s-bt-settings-dialog.c e-bt-settings-dialog.c \ s-bt-signal-analysis-dialog.c e-bt-signal-analysis-dialog.c \ s-bt-tip-dialog.c e-bt-tip-dialog.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbt_edit_check_la_SOURCES) buzztard-0.6.0/tests/ui/edit/s-bt-interaction-controller-menu.c0000644042355400116100000000245211576360404021477 00000000000000/* $Id: s-bt-interaction-controller-menu.c 2659 2009-12-04 14:01:47Z ensonic $ * * Buzztard * Copyright (C) 2009 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_interaction_controller_menu_test_case(void); extern TCase *bt_interaction_controller_menu_example_case(void); Suite *bt_interaction_controller_menu_suite(void) { Suite *s=suite_create("BtInteractionControllerMenu"); //suite_add_tcase(s,bt_interaction_controller_menu_test_case()); suite_add_tcase(s,bt_interaction_controller_menu_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-missing-framework-elements-dialog.c0000644042355400116100000000252311576360404022547 00000000000000/* $Id: s-bt-missing-framework-elements-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_missing_framework_elements_dialog_test_case(void); extern TCase *bt_missing_framework_elements_dialog_example_case(void); Suite *bt_missing_framework_elements_dialog_suite(void) { Suite *s=suite_create("BtMissingFrameworkElementsDialog"); //suite_add_tcase(s,bt_missing_framework_elements_dialog_test_case()); suite_add_tcase(s,bt_missing_framework_elements_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-controller-learn-dialog.c0000644042355400116100000000557311576360404020545 00000000000000/* $Id: e-bt-controller-learn-dialog.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create_dialog) { BtEditApplication *app; BtMainWindow *main_window; GtkWidget *dialog; BtIcRegistry *ic_registry; BtIcDevice *device=NULL; GList *node,*list; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get a device that implements learn iface g_object_get(app,"ic-registry",&ic_registry,NULL); g_object_get(ic_registry,"devices",&list,NULL); for(node=list;node;node=g_list_next(node)) { device=BTIC_DEVICE(node->data); if(BTIC_IS_LEARN(device)) break; } g_list_free(list); g_object_unref(ic_registry); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); if(device && BTIC_IS_LEARN(device)) { // create, show and destroy dialog dialog=GTK_WIDGET(bt_interaction_controller_learn_dialog_new(device)); fail_unless(dialog!=NULL, NULL); GST_INFO("dialog created"); gtk_widget_show_all(dialog); // leave out that line! (modal dialog) //gtk_dialog_run(GTK_DIALOG(dialog)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(dialog),NULL); gtk_widget_destroy(dialog); } // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_controller_learn_dialog_example_case(void) { TCase *tc = tcase_create("BtControllerLearnDialogExamples"); tcase_add_test(tc,test_create_dialog); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-about-dialog.c0000644042355400116100000000230411576360404016400 00000000000000/* $Id: s-bt-about-dialog.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_about_dialog_test_case(void); extern TCase *bt_about_dialog_example_case(void); Suite *bt_about_dialog_suite(void) { Suite *s=suite_create("BtAboutDialog"); //suite_add_tcase(s,bt_about_dialog_test_case()); suite_add_tcase(s,bt_about_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/e-bt-edit-application.c0000644042355400116100000007144711624270306017252 00000000000000/* $Id: e-bt-edit-application.c 3577 2011-08-21 20:55:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //-- globals //-- fixtures static void test_setup(void) { bt_edit_setup(); } static void test_teardown(void) { bt_edit_teardown(); } //-- helper /* static gboolean timeout(gpointer data) { GST_INFO("shutting down the gui"); gtk_main_quit(); //gtk_widget_destroy(GTK_WIDGET(data)); return FALSE; } */ //-- tests // create app and then unconditionally destroy window BT_START_TEST(test_create) { BtEditApplication *app; BtMainWindow *main_window; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); GST_INFO("main_window->ref_ct=%d",G_OBJECT_REF_COUNT(main_window)); // make screenshot check_make_widget_screenshot(GTK_WIDGET(main_window),NULL); { BtCheckWidgetScreenshotRegions regions[]={ { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_TYPE, NULL, NULL, BT_TYPE_MAIN_MENU, GTK_POS_LEFT }, { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_TYPE, NULL, NULL, BT_TYPE_MAIN_TOOLBAR, GTK_POS_LEFT }, { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_TYPE, NULL, NULL, BT_TYPE_MAIN_STATUSBAR, GTK_POS_LEFT }, { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_LABEL, NULL, "Grid", G_TYPE_INVALID, GTK_POS_RIGHT }, { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NONE, NULL, NULL, G_TYPE_INVALID, 0 } }; check_make_widget_screenshot_with_highlight(GTK_WIDGET(main_window),"highlight",regions); } // close window GST_INFO("main_window->ref_ct=%d",G_OBJECT_REF_COUNT(main_window)); // needs a main-loop (version 1,2) gtk_widget_destroy(GTK_WIDGET(main_window)); // version 1 while(gtk_events_pending()) gtk_main_iteration(); /* GST_INFO("mainlevel is %d",gtk_main_level()); while(g_main_context_pending(NULL)) g_main_context_iteration(NULL,FALSE); // after this loop the window should be gone // version 2 (makes the window visible :( ) g_timeout_add(2000,timeout,main_window); gtk_main(); // version 3 (does not work) g_object_checked_unref(main_window); */ // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST static gboolean finish_main_loops(gpointer user_data) { // this does not work for dialogs (gtk_dialog_run)! gtk_main_quit(); return FALSE; } // create app and then unconditionally destroy window BT_START_TEST(test_run) { BtEditApplication *app; BtMainWindow *main_window; BtSettings *settings=bt_settings_make(); app=bt_edit_application_new(); fail_unless(app != NULL, NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); GST_INFO("main_window->ref_ct=%d",G_OBJECT_REF_COUNT(main_window)); // avoid the about dialog g_object_set(settings,"news-seen",PACKAGE_VERSION_NUMBER,NULL); g_object_unref(settings); // run and quit g_idle_add(finish_main_loops,NULL); bt_edit_application_run(app); gtk_widget_destroy(GTK_WIDGET(main_window)); // free application g_object_checked_unref(app); } BT_END_TEST // create a new song BT_START_TEST(test_new1) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; gboolean unsaved; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // create a new song bt_edit_application_new_song(app); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song); GST_INFO("song created"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song BT_START_TEST(test_load1) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; gboolean unsaved; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // make screenshot check_make_widget_screenshot(GTK_WIDGET(main_window),"song"); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song, free it, load another BT_START_TEST(test_load2) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song1,*song2; gboolean unsaved; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load first song bt_edit_application_load_song(app, check_get_test_song_path("melo1.xml")); g_object_get(app,"song",&song1,NULL); fail_unless(song1 != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song1); GST_INFO("song 1 loaded"); // load second song bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song2,NULL); fail_unless(song2 != NULL, NULL); fail_unless(song2 != song1, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song2); GST_INFO("song 2 loaded"); // do events (normaly done by check_make_widget_screenshot()) while(gtk_events_pending()) gtk_main_iteration(); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song, free it, load another BT_START_TEST(test_load3) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; GstElement *bin; gboolean unsaved; guint num; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); g_object_get(app,"bin",&bin,NULL); GST_INFO("song.elements=%d",GST_BIN_NUMCHILDREN(bin)); // load for first time bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song); GST_INFO("song loaded"); num=GST_BIN_NUMCHILDREN(bin); GST_INFO("song.elements=%d",num); // load song for second time bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song); GST_INFO("song loaded again"); GST_INFO("song.elements=%d",GST_BIN_NUMCHILDREN(bin)); fail_unless(num == GST_BIN_NUMCHILDREN(bin), NULL); // do events (normaly done by check_make_widget_screenshot()) while(gtk_events_pending()) gtk_main_iteration(); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application gst_object_unref(bin); GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song with a ui page disabled static void test_load_ui_page_disabled(gint page_num) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtSong *song; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // get window and remove a page g_object_get(app,"main-window",&main_window,NULL); GST_INFO("main window win=%p, win->ref_ct=%d",main_window,G_OBJECT_REF_COUNT(main_window)); fail_unless(main_window != NULL, NULL); g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); fail_unless(pages != NULL, NULL); gtk_notebook_remove_page(GTK_NOTEBOOK(pages),page_num); g_object_unref(pages); GST_INFO("removed page number %d",page_num); // load song bt_edit_application_load_song(app, check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_unref(song); GST_INFO("song loaded"); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } // load a song with machines view disabled BT_START_TEST(test_load_machines_view_disabled) { test_load_ui_page_disabled(BT_MAIN_PAGES_MACHINES_PAGE); } BT_END_TEST // load a song with patterns view disabled BT_START_TEST(test_load_patterns_view_disabled) { test_load_ui_page_disabled(BT_MAIN_PAGES_PATTERNS_PAGE); } BT_END_TEST // load a song with sequence view disabled BT_START_TEST(test_load_sequence_view_disabled) { test_load_ui_page_disabled(BT_MAIN_PAGES_SEQUENCE_PAGE); } BT_END_TEST // load a song with info view disabled BT_START_TEST(test_load_info_view_disabled) { test_load_ui_page_disabled(BT_MAIN_PAGES_INFO_PAGE); } BT_END_TEST // load a song with waves view disabled BT_START_TEST(test_load_waves_view_disabled) { test_load_ui_page_disabled(BT_MAIN_PAGES_WAVES_PAGE); } BT_END_TEST // load a song and play it BT_START_TEST(test_load_and_play1) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; gboolean unsaved; gboolean playing; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("test-simple1.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); playing=bt_song_play(song); fail_unless(playing == TRUE, NULL); while(gtk_events_pending()) gtk_main_iteration(); bt_song_stop(song); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); g_object_unref(song); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song, free it, load another song and play it BT_START_TEST(test_load_and_play2) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song1,*song2; gboolean unsaved; gboolean playing; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load first song bt_edit_application_load_song(app, check_get_test_song_path("melo1.xml")); g_object_get(app,"song",&song1,NULL); fail_unless(song1 != NULL, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); g_object_unref(song1); GST_INFO("song 1 loaded"); // load second song bt_edit_application_load_song(app, check_get_test_song_path("melo2.xml")); g_object_get(app,"song",&song2,NULL); fail_unless(song2 != NULL, NULL); fail_unless(song2 != song1, NULL); // song should be unchanged g_object_get(app,"unsaved",&unsaved,NULL); fail_unless(unsaved == FALSE, NULL); GST_INFO("song 2 loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); playing=bt_song_play(song2); fail_unless(playing == TRUE, NULL); while(gtk_events_pending()) gtk_main_iteration(); bt_song_stop(song2); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); //GST_INFO("mainlevel is %d",gtk_main_level()); //while(g_main_context_pending(NULL)) g_main_context_iteration(/*context=*/NULL,/*may_block=*/FALSE); g_object_unref(song2); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // view all tabs BT_START_TEST(test_tabs1) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPagePatterns *pattern_page; BtSong *song; BtSetup *setup; BtWave *wave; BtMachine *src_machine; GtkWidget *child; GList *children; guint i,num_pages; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load a song and a sample bt_edit_application_load_song(app,check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); wave=bt_wave_new(song,"test","file:///tmp/test.wav",1,1.0,BT_WAVE_LOOP_MODE_OFF,0); fail_unless(wave != NULL, NULL); // sample loading is async while(gtk_events_pending()) gtk_main_iteration(); // stimulate ui update g_object_notify(G_OBJECT(app),"song"); while(gtk_events_pending()) gtk_main_iteration(); // free resources g_object_unref(wave); g_object_unref(song); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // view all tabs g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); // make sure the pattern view shows something src_machine=bt_setup_get_machine_by_id(setup,"beep1"); g_object_get(G_OBJECT(pages),"patterns-page",&pattern_page,NULL); bt_main_page_patterns_show_machine(pattern_page,src_machine); g_object_unref(pattern_page); g_object_unref(src_machine); g_object_unref(setup); children=gtk_container_get_children(GTK_CONTAINER(pages)); fail_unless(children != NULL, NULL); //num_pages=gtk_notebook_get_n_pages(GTK_NOTEBOOK(pages)); num_pages=g_list_length(children); for(i=0;iref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // view all tabs BT_START_TEST(test_tabs_playing) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtMainPagePatterns *pattern_page; BtSong *song; BtSetup *setup; BtWave *wave; BtMachine *src_machine; GList *children; guint i,num_pages; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // load a song and a sample bt_edit_application_load_song(app,check_get_test_song_path("melo3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); g_object_get(song,"setup",&setup,NULL); wave=bt_wave_new(song,"test","file:///tmp/test.wav",1,1.0,BT_WAVE_LOOP_MODE_OFF,0); fail_unless(wave != NULL, NULL); // sample loading is async while(gtk_events_pending()) gtk_main_iteration(); // stimulate ui update g_object_notify(G_OBJECT(app),"song"); while(gtk_events_pending()) gtk_main_iteration(); // free resources g_object_unref(wave); g_object_unref(song); GST_INFO("song loaded"); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // view all tabs g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); // make sure the pattern view shows something src_machine=bt_setup_get_machine_by_id(setup,"beep1"); g_object_get(G_OBJECT(pages),"patterns-page",&pattern_page,NULL); bt_main_page_patterns_show_machine(pattern_page,src_machine); g_object_unref(pattern_page); g_object_unref(src_machine); g_object_unref(setup); children=gtk_container_get_children(GTK_CONTAINER(pages)); fail_unless(children != NULL, NULL); //num_pages=gtk_notebook_get_n_pages(GTK_NOTEBOOK(pages)); num_pages=g_list_length(children); // play for a while to trigger screen updates bt_song_play(song); for(i=0;iref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song and remove a machine BT_START_TEST(test_machine_view_edit0) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("test-simple1.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); GST_INFO("song loaded"); g_object_get(song,"setup",&setup,NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // remove a source machine=bt_setup_get_machine_by_id(setup,"sine1"); GST_INFO("setup.machine[sine2].ref_count=%d",G_OBJECT_REF_COUNT(machine)); bt_setup_remove_machine(setup,machine); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[sine2].ref_count=%d",G_OBJECT_REF_COUNT(machine)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine)==1,NULL); g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song and remove machines BT_START_TEST(test_machine_view_edit1) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("test-simple2.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); GST_INFO("song loaded"); g_object_get(song,"setup",&setup,NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // remove a source machine=bt_setup_get_machine_by_id(setup,"sine1"); GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); bt_setup_remove_machine(setup,machine); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine)==1,NULL); g_object_unref(machine); // remove an effect machine=bt_setup_get_machine_by_id(setup,"amp1"); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); bt_setup_remove_machine(setup,machine); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine)==1,NULL); g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song and remove machines // (same as above with order in which we remove the machines swapped) BT_START_TEST(test_machine_view_edit2) { BtEditApplication *app; BtMainWindow *main_window; BtSong *song; BtSetup *setup; BtMachine *machine; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); bt_edit_application_load_song(app, check_get_test_song_path("test-simple3.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); GST_INFO("song loaded"); g_object_get(song,"setup",&setup,NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); // remove an effect (this remes the wires) machine=bt_setup_get_machine_by_id(setup,"amp1"); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); bt_setup_remove_machine(setup,machine); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine)==1,NULL); g_object_unref(machine); // check a source machine=bt_setup_get_machine_by_id(setup,"sine1"); GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine)); g_object_unref(machine); // remove a source machine=bt_setup_get_machine_by_id(setup,"sine2"); GST_INFO("setup.machine[sine2].ref_count=%d",G_OBJECT_REF_COUNT(machine)); bt_setup_remove_machine(setup,machine); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[sine2].ref_count=%d",G_OBJECT_REF_COUNT(machine)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine)==1,NULL); g_object_unref(machine); g_object_unref(setup); g_object_unref(song); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST // load a song and remove machines BT_START_TEST(test_machine_view_edit3) { BtEditApplication *app; BtMainWindow *main_window; BtMainPages *pages; BtSong *song; BtSetup *setup; BtWire *wire; BtMachine *machine1,*machine2; app=bt_edit_application_new(); GST_INFO("back in test app=%p, app->ref_ct=%d",app,G_OBJECT_REF_COUNT(app)); fail_unless(app != NULL, NULL); // sine1 ! amp1 ! master + sine2 ! amp1 //bt_edit_application_load_song(app, check_get_test_song_path("test-simple3.xml")); // sine1 ! amp1 ! master bt_edit_application_load_song(app, check_get_test_song_path("test-simple2.xml")); g_object_get(app,"song",&song,NULL); fail_unless(song != NULL, NULL); GST_INFO("song loaded"); g_object_get(song,"setup",&setup,NULL); // get window g_object_get(app,"main-window",&main_window,NULL); fail_unless(main_window != NULL, NULL); g_object_get(G_OBJECT(main_window),"pages",&pages,NULL); fail_unless(pages != NULL, NULL); // remove some other pages // (ev. run for all combinations - if a test using all pages fails?) gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_INFO_PAGE); gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_WAVES_PAGE); // FIXME: having the sequence page enabled/disabled makes a difference // between ref-leak and too many unrefs //gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_SEQUENCE_PAGE); //gtk_notebook_remove_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); g_object_unref(pages); // remove wire machine1=bt_setup_get_machine_by_id(setup,"sine1"); GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine1)); machine2=bt_setup_get_machine_by_id(setup,"amp1"); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine2)); wire=bt_setup_get_wire_by_machines(setup,machine1,machine2); GST_INFO("setup.wire[sine1->amp1].ref_count=%d",G_OBJECT_REF_COUNT(wire)); bt_setup_remove_wire(setup,wire); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.wire[sine1->amp1].ref_count=%d",G_OBJECT_REF_COUNT(wire)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(wire)==1,NULL); g_object_unref(wire); // remove a source GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine1)); bt_setup_remove_machine(setup,machine1); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[sine1].ref_count=%d",G_OBJECT_REF_COUNT(machine1)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine1)==1,NULL); g_object_unref(machine1); // remove an effect GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine2)); bt_setup_remove_machine(setup,machine2); while(gtk_events_pending()) gtk_main_iteration(); GST_INFO("setup.machine[amp1].ref_count=%d",G_OBJECT_REF_COUNT(machine2)); // ref count should be 1 now fail_unless(G_OBJECT_REF_COUNT(machine2)==1,NULL); g_object_unref(machine2); g_object_unref(setup); g_object_unref(song); // close window gtk_widget_destroy(GTK_WIDGET(main_window)); while(gtk_events_pending()) gtk_main_iteration(); // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_checked_unref(app); } BT_END_TEST TCase *bt_edit_application_example_case(void) { TCase *tc = tcase_create("BtEditApplicationExamples"); tcase_add_test(tc,test_create); tcase_add_test(tc,test_run); tcase_add_test(tc,test_new1); tcase_add_test(tc,test_load1); tcase_add_test(tc,test_load2); tcase_add_test(tc,test_load3); tcase_add_test(tc,test_load_machines_view_disabled); tcase_add_test(tc,test_load_patterns_view_disabled); tcase_add_test(tc,test_load_sequence_view_disabled); tcase_add_test(tc,test_load_info_view_disabled); tcase_add_test(tc,test_load_waves_view_disabled); tcase_add_test(tc,test_load_and_play1); tcase_add_test(tc,test_load_and_play2); tcase_add_test(tc,test_tabs1); tcase_add_test(tc,test_tabs_playing); tcase_add_test(tc,test_machine_view_edit0); tcase_add_test(tc,test_machine_view_edit1); tcase_add_test(tc,test_machine_view_edit2); tcase_add_test(tc,test_machine_view_edit3); // we *must* use a checked fixture, as only this runs in the same context tcase_add_checked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/edit/s-bt-machine-actions.c0000644042355400116100000000232711576360404017100 00000000000000/* $Id: s-bt-machine-actions.c 2689 2010-01-09 12:05:45Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_machine_actions_test_case(void); extern TCase *bt_machine_actions_example_case(void); Suite *bt_machine_actions_suite(void) { Suite *s=suite_create("BtMachineActions"); //suite_add_tcase(s,bt_machine_actions_test_case()); suite_add_tcase(s,bt_machine_actions_example_case()); return(s); } buzztard-0.6.0/tests/ui/edit/s-bt-tip-dialog.c0000644042355400116100000000226411576360404016067 00000000000000/* $Id: s-bt-tip-dialog.c 2686 2010-01-08 21:24:57Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-edit.h" //extern TCase *bt_tip_dialog_test_case(void); extern TCase *bt_tip_dialog_example_case(void); Suite *bt_tip_dialog_suite(void) { Suite *s=suite_create("BtTipDialog"); //suite_add_tcase(s,bt_tip_dialog_test_case()); suite_add_tcase(s,bt_tip_dialog_example_case()); return(s); } buzztard-0.6.0/tests/ui/cmd/0000755042355400116100000000000011675570677012740 500000000000000buzztard-0.6.0/tests/ui/cmd/s-bt-cmd-application.c0000644042355400116100000000232411576360403016714 00000000000000/* $Id: s-bt-cmd-application.c 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-cmd.h" extern TCase *bt_cmd_application_test_case(void); extern TCase *bt_cmd_application_example_case(void); Suite *bt_cmd_application_suite(void) { Suite *s=suite_create("BtCmdApplication"); suite_add_tcase(s,bt_cmd_application_test_case()); suite_add_tcase(s,bt_cmd_application_example_case()); return(s); } buzztard-0.6.0/tests/ui/cmd/m-bt-cmd.h0000644042355400116100000000220311576360403014406 00000000000000/* $Id: m-bt-cmd.h 1742 2008-04-16 06:30:00Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "../../bt-check.h" #include "../../../src/ui/cmd/bt-cmd.h" //-- globals GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); GST_DEBUG_CATEGORY_EXTERN(bt_cmd_debug); //-- prototypes extern void bt_cmd_setup(void); extern void bt_cmd_teardown(void); buzztard-0.6.0/tests/ui/cmd/Makefile.in0000644042355400116100000004651011675570635014725 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/ui/cmd DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbt_cmd_check_la_DEPENDENCIES = \ $(top_builddir)/src/ui/cmd/libbtcmd.la $(am__DEPENDENCIES_1) am_libbt_cmd_check_la_OBJECTS = s-bt-cmd-application.lo \ e-bt-cmd-application.lo t-bt-cmd-application.lo libbt_cmd_check_la_OBJECTS = $(am_libbt_cmd_check_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbt_cmd_check_la_SOURCES) DIST_SOURCES = $(libbt_cmd_check_la_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ noinst_LTLIBRARIES = libbt-cmd-check.la libbt_cmd_check_la_LIBADD = \ $(top_builddir)/src/ui/cmd/libbtcmd.la \ $(BASE_DEPS_LIBS) libbt_cmd_check_la_SOURCES = m-bt-cmd.h \ s-bt-cmd-application.c e-bt-cmd-application.c t-bt-cmd-application.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 tests/ui/cmd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/ui/cmd/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbt-cmd-check.la: $(libbt_cmd_check_la_OBJECTS) $(libbt_cmd_check_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbt_cmd_check_la_OBJECTS) $(libbt_cmd_check_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e-bt-cmd-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/s-bt-cmd-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t-bt-cmd-application.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbt_cmd_check_la_SOURCES) # 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: buzztard-0.6.0/tests/ui/cmd/e-bt-cmd-application.c0000644042355400116100000000702511576360403016701 00000000000000/* $Id: e-bt-cmd-application.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-cmd.h" //-- globals //-- fixtures static void test_setup(void) { bt_cmd_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_cmd_teardown(); } //-- tests BT_START_TEST(test_create_app) { BtCmdApplication *app; app=bt_cmd_application_new(TRUE); fail_unless(app != NULL, NULL); fail_unless(G_OBJECT_REF_COUNT(app) == 1, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // postive test, this test should not fail BT_START_TEST(test_play1) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); ret = bt_cmd_application_play(app, check_get_test_song_path("test-simple1.xml")); fail_unless(ret==TRUE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // postive test, this test should not fail BT_START_TEST(test_play2) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); ret = bt_cmd_application_play(app, check_get_test_song_path("test-simple2.xml")); fail_unless(ret==TRUE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // Tests to play one song after another // This is a positive test. BT_START_TEST(test_play3) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); ret = bt_cmd_application_play(app, check_get_test_song_path("test-simple1.xml")); fail_unless(ret==TRUE, NULL); ret = bt_cmd_application_play(app, check_get_test_song_path("test-simple2.xml")); fail_unless(ret==TRUE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // Tests if the info method works as expected. // This is a positive test. BT_START_TEST(test_info1) { BtCmdApplication *app; gboolean ret=FALSE; gchar *tmp_file_name; app=bt_cmd_application_new(TRUE); tmp_file_name=g_build_filename(g_get_tmp_dir(),"test-simple1.xml.txt",NULL); ret = bt_cmd_application_info(app, check_get_test_song_path("test-simple1.xml"), tmp_file_name); fail_unless(ret==TRUE, NULL); fail_unless(file_contains_str(tmp_file_name, "song.song_info.name: \"test simple 1\""), NULL); // remove tmp-file and free filename g_unlink(tmp_file_name); g_free(tmp_file_name); // free application g_object_checked_unref(app); } BT_END_TEST TCase *bt_cmd_application_example_case(void) { TCase *tc = tcase_create("BtCmdApplicationExamples"); tcase_add_test(tc,test_create_app); tcase_add_test(tc,test_play1); tcase_add_test(tc,test_play2); tcase_add_test(tc,test_play3); tcase_add_test(tc,test_info1); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/cmd/t-bt-cmd-application.c0000644042355400116100000000710511576360403016717 00000000000000/* $Id: t-bt-cmd-application.c 3069 2010-11-26 22:59:48Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include "m-bt-cmd.h" //-- globals //-- fixtures static void test_setup(void) { bt_cmd_setup(); GST_INFO("================================================================================"); } static void test_teardown(void) { bt_cmd_teardown(); } //-- tests // tests if the play method works without exceptions if we put NULL as filename. // This test is a negative test BT_START_TEST(test_play1) { BtCmdApplication *app=NULL; gboolean ret=FALSE; GstBin *bin=NULL; BtSettings *settings=NULL; app=bt_cmd_application_new(TRUE); fail_unless(G_OBJECT_REF_COUNT(app) == 1, NULL); check_init_error_trapp("bt_cmd_application_play","BT_IS_STRING(input_file_name)"); ret = bt_cmd_application_play(app, NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(ret==FALSE, NULL); g_object_get(G_OBJECT(app),"bin",&bin,"settings",&settings,NULL); fail_unless(bin!=NULL, NULL); fail_unless(settings!=NULL, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // file not found test. this is a negative test BT_START_TEST(test_play2) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); check_init_error_trapp("bt_cmd_application_play","BT_IS_STRING(input_file_name)"); ret = bt_cmd_application_play(app, ""); fail_unless(check_has_error_trapped(), NULL); fail_unless(ret==FALSE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // test if the info method works with NULL argument for the filename, // This is a negative test BT_START_TEST(test_info1) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); check_init_error_trapp("bt_cmd_application_info","BT_IS_STRING(input_file_name)"); ret = bt_cmd_application_info(app, NULL, NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(ret==FALSE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST // test if the info method works with a empty filename. // This is a negative test BT_START_TEST(test_info2) { BtCmdApplication *app; gboolean ret=FALSE; app=bt_cmd_application_new(TRUE); check_init_error_trapp("bt_cmd_application_info","BT_IS_STRING(input_file_name)"); ret = bt_cmd_application_info(app, "", NULL); fail_unless(check_has_error_trapped(), NULL); fail_unless(ret==FALSE, NULL); // free application g_object_checked_unref(app); } BT_END_TEST TCase *bt_cmd_application_test_case(void) { TCase *tc = tcase_create("BtCmdApplicationTests"); tcase_add_test(tc,test_play1); tcase_add_test(tc,test_play2); tcase_add_test(tc,test_info1); tcase_add_test(tc,test_info2); tcase_add_unchecked_fixture(tc, test_setup, test_teardown); return(tc); } buzztard-0.6.0/tests/ui/cmd/Makefile.am0000644042355400116100000000123511576360403014675 00000000000000## $Id: Makefile.am 2855 2010-05-12 20:36:52Z ensonic $ noinst_LTLIBRARIES = libbt-cmd-check.la libbt_cmd_check_la_LIBADD = \ $(top_builddir)/src/ui/cmd/libbtcmd.la \ $(BASE_DEPS_LIBS) libbt_cmd_check_la_SOURCES = m-bt-cmd.h \ s-bt-cmd-application.c e-bt-cmd-application.c t-bt-cmd-application.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) .PHONY: splint splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbt_cmd_check_la_SOURCES) buzztard-0.6.0/tests/ui/Makefile.in0000644042355400116100000005101411675570635014155 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = tests/ui DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = cmd edit all: all-recursive .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 tests/ui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/ui/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: splint splint:: for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done # 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: buzztard-0.6.0/tests/ui/Makefile.am0000644042355400116100000000024111576360404014127 00000000000000## $Id: Makefile.am 1742 2008-04-16 06:30:00Z ensonic $ SUBDIRS = cmd edit .PHONY: splint splint:: for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done buzztard-0.6.0/tests/Makefile.in0000644042355400116100000012534411675570634013547 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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@ TESTS = $(am__EXEEXT_1) bt-cmd-info.sh bt-cmd-cli.sh bt-edit-cli.sh \ povalid.sh xmlvalid.sh @BUILD_CHECK_TESTS_TRUE@noinst_PROGRAMS = $(am__EXEEXT_1) subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/bt-cfg.sh.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = bt-cfg.sh CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am__libbt_check_la_SOURCES_DIST = bt-check.c bt-check.h \ bt-test-application.c bt-test-application.h bt-test-plugin.c \ bt-test-plugin.h bt-test-settings.c bt-test-settings.h @BUILD_CHECK_TESTS_TRUE@am_libbt_check_la_OBJECTS = bt-check.lo \ @BUILD_CHECK_TESTS_TRUE@ bt-test-application.lo \ @BUILD_CHECK_TESTS_TRUE@ bt-test-plugin.lo bt-test-settings.lo libbt_check_la_OBJECTS = $(am_libbt_check_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent @BUILD_CHECK_TESTS_TRUE@am_libbt_check_la_rpath = @BUILD_CHECK_TESTS_TRUE@am__EXEEXT_1 = bt_core$(EXEEXT) bt_ic$(EXEEXT) \ @BUILD_CHECK_TESTS_TRUE@ bt_cmd$(EXEEXT) bt_edit$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am__bt_cmd_SOURCES_DIST = m-bt-cmd.c @BUILD_CHECK_TESTS_TRUE@am_bt_cmd_OBJECTS = m-bt-cmd.$(OBJEXT) bt_cmd_OBJECTS = $(am_bt_cmd_OBJECTS) @BUILD_CHECK_TESTS_TRUE@bt_cmd_DEPENDENCIES = $(top_builddir)/tests/ui/cmd/libbt-cmd-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) bt_cmd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(bt_cmd_LDFLAGS) $(LDFLAGS) -o $@ am__bt_core_SOURCES_DIST = m-bt-core.c @BUILD_CHECK_TESTS_TRUE@am_bt_core_OBJECTS = m-bt-core.$(OBJEXT) bt_core_OBJECTS = $(am_bt_core_OBJECTS) @BUILD_CHECK_TESTS_TRUE@bt_core_DEPENDENCIES = $(top_builddir)/tests/lib/core/libbtcore-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) bt_core_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(bt_core_LDFLAGS) $(LDFLAGS) -o $@ am__bt_edit_SOURCES_DIST = m-bt-edit.c @BUILD_CHECK_TESTS_TRUE@am_bt_edit_OBJECTS = m-bt-edit.$(OBJEXT) bt_edit_OBJECTS = $(am_bt_edit_OBJECTS) @BUILD_CHECK_TESTS_TRUE@bt_edit_DEPENDENCIES = $(top_builddir)/tests/ui/edit/libbt-edit-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) bt_edit_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(bt_edit_LDFLAGS) $(LDFLAGS) -o $@ am__bt_ic_SOURCES_DIST = m-bt-ic.c @BUILD_CHECK_TESTS_TRUE@am_bt_ic_OBJECTS = m-bt-ic.$(OBJEXT) bt_ic_OBJECTS = $(am_bt_ic_OBJECTS) @BUILD_CHECK_TESTS_TRUE@bt_ic_DEPENDENCIES = $(top_builddir)/tests/lib/ic/libbtic-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) \ @BUILD_CHECK_TESTS_TRUE@ $(am__DEPENDENCIES_1) bt_ic_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(bt_ic_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbt_check_la_SOURCES) $(bt_cmd_SOURCES) \ $(bt_core_SOURCES) $(bt_edit_SOURCES) $(bt_ic_SOURCES) DIST_SOURCES = $(am__libbt_check_la_SOURCES_DIST) \ $(am__bt_cmd_SOURCES_DIST) $(am__bt_core_SOURCES_DIST) \ $(am__bt_edit_SOURCES_DIST) $(am__bt_ic_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive 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__installdirs = "$(DESTDIR)$(songdatadir)" DATA = $(songdata_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DIST_SUBDIRS = lib ui DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ @BUILD_CHECK_TESTS_TRUE@SUBDIRS = lib ui @BUILD_CHECK_TESTS_FALSE@TESTS_BIN = @BUILD_CHECK_TESTS_TRUE@TESTS_BIN = bt_core bt_ic bt_cmd bt_edit # prevent endless loops, this requires bash, see idea in bt-check.c # ulimit -St20; # # adding this can help debug gconfd # GCONF_DEBUG_TRACE_CLIENT=1 # # http://www.cynapses.org/tmp/gcc/malloc_perturb # MALLOC_PERTURB_=$(($RANDOM % 255 + 1)) # # set theme (check which theme is used) # GTK2_RC_FILES=$HOME/.themes/Darkilouche/gtk-2.0/gtkrc # TESTS_ENVIRONMENT = \ CK_DEFAULT_TIMEOUT=20 \ LANG=C \ XDG_CACHE_HOME=$(abs_builddir) \ $(LIBTOOL) --mode=execute @BUILD_CHECK_TESTS_TRUE@noinst_LTLIBRARIES = libbt-check.la @BUILD_CHECK_TESTS_TRUE@libbt_check_la_LIBADD = \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) -lcheck @BUILD_CHECK_TESTS_TRUE@libbt_check_LDFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ $(BT_LDFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs @BUILD_CHECK_TESTS_TRUE@libbt_check_la_SOURCES = \ @BUILD_CHECK_TESTS_TRUE@ bt-check.c bt-check.h \ @BUILD_CHECK_TESTS_TRUE@ bt-test-application.c bt-test-application.h \ @BUILD_CHECK_TESTS_TRUE@ bt-test-plugin.c bt-test-plugin.h \ @BUILD_CHECK_TESTS_TRUE@ bt-test-settings.c bt-test-settings.h @BUILD_CHECK_TESTS_TRUE@libbt_check_la_DEPENDENCIES = /tmp/test.wav @BUILD_CHECK_TESTS_TRUE@bt_core_LDADD = \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/tests/lib/core/libbtcore-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck @BUILD_CHECK_TESTS_TRUE@bt_core_LDFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ $(BT_LDFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs @BUILD_CHECK_TESTS_TRUE@bt_core_SOURCES = \ @BUILD_CHECK_TESTS_TRUE@ m-bt-core.c @BUILD_CHECK_TESTS_TRUE@bt_ic_LDADD = \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/tests/lib/ic/libbtic-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck @BUILD_CHECK_TESTS_TRUE@bt_ic_LDFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ $(BT_LDFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/ic/.libs @BUILD_CHECK_TESTS_TRUE@bt_ic_SOURCES = \ @BUILD_CHECK_TESTS_TRUE@ m-bt-ic.c @BUILD_CHECK_TESTS_TRUE@bt_cmd_LDADD = \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/tests/ui/cmd/libbt-cmd-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck @BUILD_CHECK_TESTS_TRUE@bt_cmd_LDFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ $(BT_LDFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs @BUILD_CHECK_TESTS_TRUE@bt_cmd_SOURCES = \ @BUILD_CHECK_TESTS_TRUE@ m-bt-cmd.c @BUILD_CHECK_TESTS_TRUE@bt_edit_LDADD = \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/tests/ui/edit/libbt-edit-check.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/core/libbuzztard-core.la \ @BUILD_CHECK_TESTS_TRUE@ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ @BUILD_CHECK_TESTS_TRUE@ libbt-check.la $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck @BUILD_CHECK_TESTS_TRUE@bt_edit_LDFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ $(BT_LDFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs \ @BUILD_CHECK_TESTS_TRUE@ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/ic/.libs @BUILD_CHECK_TESTS_TRUE@bt_edit_SOURCES = \ @BUILD_CHECK_TESTS_TRUE@ m-bt-edit.c @BUILD_CHECK_TESTS_TRUE@AM_CPPFLAGS = \ @BUILD_CHECK_TESTS_TRUE@ -I$(top_srcdir)/src/lib/core \ @BUILD_CHECK_TESTS_TRUE@ -I$(top_srcdir)/src/lib/ic \ @BUILD_CHECK_TESTS_TRUE@ -DLOCALEDIR=\"$(localedir)\" \ @BUILD_CHECK_TESTS_TRUE@ -DDATADIR=\"$(datadir)\" \ @BUILD_CHECK_TESTS_TRUE@ -DTESTSONGDIR=\"$(abs_top_srcdir)/tests/songs\" \ @BUILD_CHECK_TESTS_TRUE@ -DG_LOG_DOMAIN=\"buzztard-check\" \ @BUILD_CHECK_TESTS_TRUE@ $(BASE_DEPS_CFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ $(GUI_DEPS_CFLAGS) \ @BUILD_CHECK_TESTS_TRUE@ $(BT_CFLAGS)\ @BUILD_CHECK_TESTS_TRUE@ @VALGRIND_CFLAGS@ songdatadir = $(datadir)/$(PACKAGE)/songs songdata_DATA = \ songs/buzz1.xml \ songs/buzz2.xml \ songs/buzz3.xml \ songs/buzz4.xml \ songs/buzz5.xml \ songs/buzz6.xml \ songs/buzz7.xml \ songs/buzz8.xml \ songs/buzz9.xml \ songs/combi1.xml \ songs/combi2.xml \ songs/combi3.xml \ songs/melo1.xml \ songs/melo2.xml \ songs/melo3.xml \ songs/melo4.xml \ songs/melo5.xml \ songs/melo6.xml noinst_songdata = \ songs/broken1.xml \ songs/broken1.bzt \ songs/broken2.xml \ songs/broken3.xml \ songs/broken4.xml \ songs/example.xml \ songs/samples1.bzt \ songs/samples2.bzt \ songs/simple1.xml \ songs/simple2.xml \ songs/simple3.xml \ songs/simple4.xml \ songs/simple5.xml \ songs/simple6.xml \ songs/simple1.bzt \ songs/simple2.bzt \ songs/simple3.bzt \ songs/simple4.bzt \ songs/simple5.bzt \ songs/test-simple1.xml \ songs/test-simple2.xml \ songs/test-simple3.xml \ songs/test-simple4.xml \ songs/test-simple5.xml EXTRA_DIST = \ $(songdata_DATA) $(noinst_songdata) \ gtkdoccomplete.sh povalid.sh xmlvalid.sh \ bt-cfg.sh.in bt-cmd-info.sh bt-cmd-encode.sh \ bt-cmd-cli.sh bt-edit-cli.sh @USE_VALGRIND_TRUE@VALPREFIX = \ @USE_VALGRIND_TRUE@ CK_FORK=no CK_DEFAULT_TIMEOUT=500 \ @USE_VALGRIND_TRUE@ LANG=C XDG_CACHE_HOME=$(abs_builddir) \ @USE_VALGRIND_TRUE@ G_SLICE=always-malloc G_DEBUG=gc-friendly \ @USE_VALGRIND_TRUE@ GLIBCPP_FORCE_NEW=1 GLIBCXX_FORCE_NEW=1 @USE_VALGRIND_TRUE@VALDEFAULT = @VALGRIND@/bin/valgrind @USE_VALGRIND_TRUE@VALSUPP = @VALGRIND@/lib/valgrind @USE_VALGRIND_TRUE@VALSUPPRESSIONDEF = --suppressions=$(VALSUPP)/default.supp @USE_VALGRIND_TRUE@VALSUPPRESSIONOWN = --suppressions=$(top_builddir)/buzztard.supp \ @USE_VALGRIND_TRUE@ --suppressions=$(top_builddir)/gst.supp \ @USE_VALGRIND_TRUE@ --suppressions=$(top_builddir)/gtk.supp @USE_VALGRIND_TRUE@VALSUPPRESSION = $(VALSUPPRESSIONDEF) $(VALSUPPRESSIONOWN) @USE_VALGRIND_TRUE@VALOPTIONS = --trace-children=yes --num-callers=30 --read-var-info=yes \ @USE_VALGRIND_TRUE@ --tool=memcheck --leak-check=full --leak-resolution=high --track-origins=yes @USE_VALGRIND_TRUE@VALCMD = $(VALPREFIX) $(VALDEFAULT) $(VALOPTIONS) $(VALSUPPRESSION) all: all-recursive .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): bt-cfg.sh: $(top_builddir)/config.status $(srcdir)/bt-cfg.sh.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbt-check.la: $(libbt_check_la_OBJECTS) $(libbt_check_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(am_libbt_check_la_rpath) $(libbt_check_la_OBJECTS) $(libbt_check_la_LIBADD) $(LIBS) 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 bt_cmd$(EXEEXT): $(bt_cmd_OBJECTS) $(bt_cmd_DEPENDENCIES) @rm -f bt_cmd$(EXEEXT) $(AM_V_CCLD)$(bt_cmd_LINK) $(bt_cmd_OBJECTS) $(bt_cmd_LDADD) $(LIBS) bt_core$(EXEEXT): $(bt_core_OBJECTS) $(bt_core_DEPENDENCIES) @rm -f bt_core$(EXEEXT) $(AM_V_CCLD)$(bt_core_LINK) $(bt_core_OBJECTS) $(bt_core_LDADD) $(LIBS) bt_edit$(EXEEXT): $(bt_edit_OBJECTS) $(bt_edit_DEPENDENCIES) @rm -f bt_edit$(EXEEXT) $(AM_V_CCLD)$(bt_edit_LINK) $(bt_edit_OBJECTS) $(bt_edit_LDADD) $(LIBS) bt_ic$(EXEEXT): $(bt_ic_OBJECTS) $(bt_ic_DEPENDENCIES) @rm -f bt_ic$(EXEEXT) $(AM_V_CCLD)$(bt_ic_LINK) $(bt_ic_OBJECTS) $(bt_ic_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-check.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-test-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-test-plugin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-test-settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m-bt-cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m-bt-core.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m-bt-edit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/m-bt-ic.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-songdataDATA: $(songdata_DATA) @$(NORMAL_INSTALL) test -z "$(songdatadir)" || $(MKDIR_P) "$(DESTDIR)$(songdatadir)" @list='$(songdata_DATA)'; test -n "$(songdatadir)" || list=; \ 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)$(songdatadir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(songdatadir)" || exit $$?; \ done uninstall-songdataDATA: @$(NORMAL_UNINSTALL) @list='$(songdata_DATA)'; test -n "$(songdatadir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(songdatadir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(songdatadir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ echo "$$grn$$dashes"; \ else \ echo "$$red$$dashes"; \ fi; \ echo "$$banner"; \ test -z "$$skipped" || echo "$$skipped"; \ test -z "$$report" || echo "$$report"; \ echo "$$dashes$$std"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-recursive all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(songdatadir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-songdataDATA 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 -rf ./$(DEPDIR) -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-songdataDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) check-am \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-TESTS check-am clean clean-generic \ clean-libtool clean-local clean-noinstLTLIBRARIES \ clean-noinstPROGRAMS ctags ctags-recursive distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-songdataDATA 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-recursive uninstall uninstall-am \ uninstall-songdataDATA @BUILD_CHECK_TESTS_TRUE@/tmp/test.wav: @BUILD_CHECK_TESTS_TRUE@ gst-launch-0.10 -q audiotestsrc num-buffers=10 ! wavenc ! filesink location=$@ clean-local: rm -f \ $(top_builddir)/tests/songs/*.txt \ $(top_builddir)/tests/songs/*.ogg \ $(abs_builddir)/buzztard/*.log \ $(top_builddir)/tests/event-sound-cache.tdb.* \ /tmp/test.wav -rmdir $(abs_builddir)/buzztard # run any given test by running make .check %.check: % @$(TESTS_ENVIRONMENT) \ ./$* # gdb any given test by running make .gdb %.gdb: % @CK_FORK=no \ $(TESTS_ENVIRONMENT) \ gdb ./$* # refdbg any given test by running make .refdbg %.refdbg: % @CK_FORK=no \ $(TESTS_ENVIRONMENT) \ refdbg -c "btnum=20 ; logobjs=0 ; $(REFDBG_RULE)" \ ./$* .PHONY: splint coverage valgrind todo @USE_BCOV_TRUE@coverage:: $(TESTS_BIN) @USE_BCOV_TRUE@ echo "command make check" >.bcovdump.all; \ @USE_BCOV_TRUE@ echo "date "`date` >>.bcovdump.all; \ @USE_BCOV_TRUE@ for i in $^; do \ @USE_BCOV_TRUE@ CK_FORK="no" $(TESTS_ENVIRONMENT) bcov \ @USE_BCOV_TRUE@ -l$(top_builddir)/src/lib/core/.libs/libbuzztard-core.so \ @USE_BCOV_TRUE@ -l$(top_builddir)/src/lib/ic/.libs/libbuzztard-ic.so \ @USE_BCOV_TRUE@ ./$$i; \ @USE_BCOV_TRUE@ if test -f .bcovdump; then \ @USE_BCOV_TRUE@ tail -n +5 ~/temp/.bcovdump >>.bcovdump.all; \ @USE_BCOV_TRUE@ rm -f .bcovdump; \ @USE_BCOV_TRUE@ fi \ @USE_BCOV_TRUE@ done # for file in /tmp/bt_core.valgrind.pid*; do grep -q "ERROR SUMMARY: 0 errors from 0 contexts" $file ; if test $? == 0; then rm $file; fi; done # grep -H "ERROR SUMMARY: " /tmp/bt_core.valgrind.pid* | uniq @USE_VALGRIND_TRUE@valgrind:: $(TESTS_BIN) @USE_VALGRIND_TRUE@ for i in $^; do \ @USE_VALGRIND_TRUE@ rm -rf /tmp/$$i.valgrind.pid*; \ @USE_VALGRIND_TRUE@ $(VALCMD) --log-file=/tmp/$$i_valgrind.pid%p ./$$i; \ @USE_VALGRIND_TRUE@ done # valgrind any given test by running make .valgrind @USE_VALGRIND_TRUE@%.valgrind: % @USE_VALGRIND_TRUE@ rm -rf /tmp/$*.valgrind.pid*; \ @USE_VALGRIND_TRUE@ $(VALCMD) --log-file=/tmp/$*.valgrind.pid%p ./$*; splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(buzztard_SOURCES) $(bt_cmd_SOURCES) $(bt_edit_SOURCES) for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done todo:: grep -r -A1 -B6 -Hn --include="*.c" --color=auto "#ifdef __CHECK_DISABLED__" . help:: @echo "make check -- run all checks" @echo "make (test).check -- run the given check once" @echo @echo "make (test).gdb -- start up gdb for the given test" @echo @echo "make valgrind -- valgrind all tests" @echo "make (test).valgrind -- valgrind the given test" @echo @echo "make todo -- check for todos in tests" @echo @echo "BT_CHECKS=\"(testname)\" make (test).check -- run the given testcase only" # 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: buzztard-0.6.0/tests/bt-cmd-info.sh0000754042355400116100000000261611576360404014123 00000000000000#!/bin/sh # $Id: bt-cmd-info.sh 1968 2008-09-07 11:49:04Z ensonic $ # run buzztard-cmd --command=info on all example and test for crashes . ./bt-cfg.sh E_SONGS="$TESTSONGDIR/buzz*.xml \ $TESTSONGDIR/combi*.xml \ $TESTSONGDIR/melo*.xml \ $TESTSONGDIR/samples*.bzt \ $TESTSONGDIR/simple*.xml \ $TESTSONGDIR/simple*.bzt \ $TESTSONGDIR/broken2.xml \ $TESTSONGDIR/test*.xml" T_SONGS="$TESTSONGDIR/broken1.xml \ $TESTSONGDIR/broken1.bzt \ $TESTSONGDIR/broken3.xml" rm -f /tmp/bt_cmd_info.log mkdir -p $TESTRESULTDIR res=0 trap crashed TERM crashed() { echo "!!! crashed" res=1 } # test working examples for song in $E_SONGS; do echo "testing $song" info=`basename $song .xml` info="$TESTRESULTDIR/$info.txt" echo >>/tmp/bt_cmd_info.log "== $song ==" GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,bt-*:4" libtool --mode=execute $BUZZTARD_CMD >$info 2>>/tmp/bt_cmd_info.log --command=info --input-file=$song if [ $? -ne 0 ]; then echo "!!! failed" res=1; fi done # test failure cases for song in $T_SONGS; do echo "testing $song" info=`basename $song .xml` info="$TESTRESULTDIR/$info.txt" echo >>/tmp/bt_cmd_info.log "== $song ==" GST_DEBUG_NO_COLOR=1 GST_DEBUG="*:2,bt-*:4" libtool --mode=execute $BUZZTARD_CMD >$info 2>>/tmp/bt_cmd_info.log --command=info --input-file=$song if [ $? -eq 0 ]; then echo "!!! failed" res=1; fi done exit $res; buzztard-0.6.0/tests/bt-test-plugin.h0000644042355400116100000000677311576360404014525 00000000000000/* $Id: bt-test-plugin.h 2661 2009-12-06 11:52:56Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * gstreamer test plugin for unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_TEST_PLUGIN_H #define BT_TEST_PLUGIN_H #include #include //-- test_mono_source #define BT_TYPE_TEST_MONO_SOURCE (bt_test_mono_source_get_type ()) #define BT_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_TEST_MONO_SOURCE, BtTestMonoSource)) #define BT_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_TEST_MONO_SOURCE, BtTestMonoSourceClass)) #define BT_IS_TEST_MONO_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_TEST_MONO_SOURCE)) #define BT_IS_TEST_MONO_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_TEST_MONO_SOURCE)) #define BT_TEST_MONO_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_TEST_MONO_SOURCE, BtTestMonoSourceClass)) /* type macros */ typedef struct _BtTestMonoSource BtTestMonoSource; typedef struct _BtTestMonoSourceClass BtTestMonoSourceClass; /* monophonic source element */ struct _BtTestMonoSource { GstElement parent; // test properties gulong ulong_val; gdouble double_val; gboolean switch_val; }; /* structure of the test_mono_source class */ struct _BtTestMonoSourceClass { GstElementClass parent_class; }; /* used by TEST_MONO_SOURCE_TYPE */ GType bt_test_mono_source_get_type(void); //-- test_poly_source #define BT_TYPE_TEST_POLY_SOURCE (bt_test_poly_source_get_type ()) #define BT_TEST_POLY_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_TEST_POLY_SOURCE, BtTestPolySource)) #define BT_TEST_POLY_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_TEST_POLY_SOURCE, BtTestPolySourceClass)) #define BT_IS_TEST_POLY_SOURCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_TEST_POLY_SOURCE)) #define BT_IS_TEST_POLY_SOURCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_TEST_POLY_SOURCE)) #define BT_TEST_POLY_SOURCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_TEST_POLY_SOURCE, BtTestPolySourceClass)) /* type macros */ typedef struct _BtTestPolySource BtTestPolySource; typedef struct _BtTestPolySourceClass BtTestPolySourceClass; /* polyphonic source element */ struct _BtTestPolySource { GstElement parent; // test properties gulong ulong_val; gdouble double_val; gboolean switch_val; // the number of voices the plugin has gulong num_voices; GList *voices; }; /* structure of the test_poly_source class */ struct _BtTestPolySourceClass { GstElementClass parent_class; }; /* used by TEST_POLY_SOURCE_TYPE */ GType bt_test_poly_source_get_type(void); //-- test_mono_processor //-- test_poly_processor #endif /* BT_TEST_PLUGIN_H */ buzztard-0.6.0/tests/m-bt-core.c0000644042355400116100000000707211666764274013435 00000000000000/* $Id: m-bt-core.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * core library unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_CHECK #include "bt-check.h" #include "../src/lib/core/libbuzztard-core/core.h" GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); extern Suite *bt_core_suite(void); extern Suite *bt_machine_suite(void); extern Suite *bt_network_suite(void); extern Suite *bt_pattern_suite(void); extern Suite *bt_processor_machine_suite(void); extern Suite *bt_sequence_suite(void); extern Suite *bt_setup_suite(void); extern Suite *bt_sink_machine_suite(void); extern Suite *bt_song_suite(void); extern Suite *bt_song_io_suite(void); extern Suite *bt_song_io_native_suite(void); extern Suite *bt_song_info_suite(void); extern Suite *bt_source_machine_suite(void); extern Suite *bt_wire_suite(void); extern Suite *bt_wire_pattern_suite(void); extern Suite *bt_settings_suite(void); gint test_argc=1; gchar test_arg0[]="check_buzzard"; gchar *test_argv[1]; gchar **test_argvptr; /* common setup and teardown code */ void bt_core_setup(void) { } void bt_core_teardown(void) { } /* start the test run */ int main(int argc, char **argv) { int nf; SRunner *sr; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif g_type_init(); setup_log(argc,argv); setup_log_capture(); test_argv[0]=test_arg0; test_argvptr=test_argv; bt_init(&test_argc,&test_argvptr); bt_check_init(); // set this to e.g. DEBUG to see more from gst in the log gst_debug_set_threshold_for_name("GST_*",GST_LEVEL_LOG); gst_debug_set_threshold_for_name("bt-*",GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_core_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_check_debug,GST_LEVEL_DEBUG); //g_log_set_always_fatal(g_log_set_always_fatal(G_LOG_FATAL_MASK)|G_LOG_LEVEL_CRITICAL); sr=srunner_create(bt_core_suite()); srunner_add_suite(sr, bt_machine_suite()); srunner_add_suite(sr, bt_network_suite()); srunner_add_suite(sr, bt_pattern_suite()); srunner_add_suite(sr, bt_processor_machine_suite()); srunner_add_suite(sr, bt_sequence_suite()); srunner_add_suite(sr, bt_setup_suite()); srunner_add_suite(sr, bt_sink_machine_suite()); srunner_add_suite(sr, bt_song_suite()); srunner_add_suite(sr, bt_song_io_suite()); srunner_add_suite(sr, bt_song_io_native_suite()); srunner_add_suite(sr, bt_song_info_suite()); srunner_add_suite(sr, bt_source_machine_suite()); srunner_add_suite(sr, bt_wire_suite()); srunner_add_suite(sr, bt_wire_pattern_suite()); srunner_add_suite(sr, bt_settings_suite()); srunner_run_all(sr,CK_NORMAL); nf=srunner_ntests_failed(sr); srunner_free(sr); bt_deinit(); //g_mem_profile(); return(nf==0) ? EXIT_SUCCESS : EXIT_FAILURE; } buzztard-0.6.0/tests/povalid.sh0000754042355400116100000000242511576360404013460 00000000000000#!/bin/bash # $Id: povalid.sh 1742 2008-04-16 06:30:00Z ensonic $ # test po i18n files if [ -z $srcdir ]; then srcdir=. fi pwd=`pwd`; cd $srcdir/../po res=0 fails=0; checks=0; report="\n" echo -n "Running suite(s): po-missing" rm -f ./missing intltool-update 2>/dev/null -m checks=$(($checks+1)) if [ -e ./missing ]; then lines=`wc -l ./missing | cut -f1 -d\ ` if [ $lines -gt 0 ]; then res=1 fails=$(($fails+1)) report=$report"po/missing:1:E: $lines unassigned files\n" fi fi echo -n " po-translated" checks=$(($checks+1)) fuzzy=0 missing=0 # we need to redirect to a file-descriptor to avoid a subshell exec 3< <(LANG=C intltool-update -r 2>&1 | grep "translated messages") while read line; do #echo "$line" n=`echo $line| cut -d\ -f5` if [ "$n" != "" ]; then fuzzy=$(($fuzzy+$n)) fi n=`echo $line| cut -d\ -f8` if [ "$n" != "" ]; then missing=$(($missing+$n)) fi done <&3 if [ \( $fuzzy -gt 0 \) -o \( $missing -gt 0 \) ]; then #echo "fail" # we don't fail here #res=1 fails=$(($fails+1)) report=$report"po/*.po:1:E: $fuzzy fuzzy translations, $missing untranslated messages\n" else echo "ok" fi rate=$((($checks-$fails)*100/$checks)) echo echo -n "$rate%: Checks: $checks, Failures: $fails" echo -e -n $report cd $pwd; exit $res buzztard-0.6.0/tests/bt-test-settings.c0000644042355400116100000002012511576360404015045 00000000000000/* $Id: bt-test-settings.c 3005 2010-09-21 15:08:09Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bttestsettings * @short_description: unit test helper for buzztard settings handling * * Non-persistent stub implementation to programmatically test application * settings. */ #define BT_CORE #define BT_TEST_SETTINGS_C #include "bt-check.h" #include #include "bt-test-settings.h" struct _BtTestSettingsPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* key=value array, keys are defined in BtSettings */ GValue *settings[BT_SETTINGS_COUNT]; }; //-- the class G_DEFINE_TYPE (BtTestSettings, bt_test_settings, BT_TYPE_SETTINGS); //-- constructor methods /** * bt_test_settings_new: * * Create a new instance. * * Returns: the new instance */ BtTestSettings *bt_test_settings_new(void) { BtTestSettings *self; self=BT_TEST_SETTINGS(g_object_new(BT_TYPE_TEST_SETTINGS,NULL)); GST_INFO("created new settings object from factory %p",self); return(self); } //-- methods //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void bt_test_settings_get_property(GObject * const object,const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtTestSettings * const self = BT_TEST_SETTINGS(object); GValue *prop=self->priv->settings[property_id]; return_if_disposed(); switch (property_id) { case BT_SETTINGS_AUDIOSINK: case BT_SETTINGS_SYSTEM_AUDIOSINK: case BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY: case BT_SETTINGS_MISSING_MACHINES: case BT_SETTINGS_SYSTEM_TOOLBAR_STYLE: case BT_SETTINGS_FOLDER_SONG: case BT_SETTINGS_FOLDER_RECORD: case BT_SETTINGS_FOLDER_SAMPLE: case BT_SETTINGS_PRESENTED_TIPS: { if(prop) { g_value_set_string(value, g_value_get_string(prop)); } else { g_value_set_static_string(value, ((GParamSpecString *)pspec)->default_value); } } break; case BT_SETTINGS_MENU_TOOLBAR_HIDE: case BT_SETTINGS_MENU_STATUSBAR_HIDE: case BT_SETTINGS_MENU_TABS_HIDE: case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_ACTIVE: case BT_SETTINGS_SHOW_TIPS: { if(prop) { g_value_set_boolean(value, g_value_get_boolean(prop)); } else { g_value_set_boolean(value, ((GParamSpecBoolean *)pspec)->default_value); } } break; case BT_SETTINGS_SAMPLE_RATE: case BT_SETTINGS_CHANNELS: case BT_SETTINGS_NEWS_SEEN: case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT: { if(prop) { g_value_set_uint(value, g_value_get_uint(prop)); } else { g_value_set_uint(value, ((GParamSpecUInt *)pspec)->default_value); } } break; case BT_SETTINGS_WINDOW_XPOS: case BT_SETTINGS_WINDOW_YPOS: case BT_SETTINGS_WINDOW_WIDTH: case BT_SETTINGS_WINDOW_HEIGHT: { if(prop) { g_value_set_int(value, g_value_get_int(prop)); } else { g_value_set_int(value, ((GParamSpecInt *)pspec)->default_value); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_test_settings_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtTestSettings * const self = BT_TEST_SETTINGS(object); GValue *prop=self->priv->settings[property_id]; return_if_disposed(); switch (property_id) { case BT_SETTINGS_AUDIOSINK: case BT_SETTINGS_SYSTEM_AUDIOSINK: case BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY: case BT_SETTINGS_SYSTEM_TOOLBAR_STYLE: case BT_SETTINGS_FOLDER_SONG: case BT_SETTINGS_FOLDER_RECORD: case BT_SETTINGS_FOLDER_SAMPLE: case BT_SETTINGS_PRESENTED_TIPS: { if(!prop) { self->priv->settings[property_id]=prop=g_new0(GValue,1); g_value_init(prop,G_TYPE_STRING); } g_value_set_string(prop, g_value_get_string(value)); } break; case BT_SETTINGS_MENU_TOOLBAR_HIDE: case BT_SETTINGS_MENU_STATUSBAR_HIDE: case BT_SETTINGS_MENU_TABS_HIDE: case BT_SETTINGS_SHOW_TIPS: { if(!prop) { self->priv->settings[property_id]=prop=g_new0(GValue,1); g_value_init(prop,G_TYPE_BOOLEAN); } g_value_set_boolean(prop, g_value_get_boolean(value)); } break; case BT_SETTINGS_SAMPLE_RATE: case BT_SETTINGS_CHANNELS: case BT_SETTINGS_NEWS_SEEN: case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT: { if(!prop) { self->priv->settings[property_id]=prop=g_new0(GValue,1); g_value_init(prop,G_TYPE_UINT); } g_value_set_uint(prop, g_value_get_uint(value)); } break; case BT_SETTINGS_WINDOW_XPOS: case BT_SETTINGS_WINDOW_YPOS: case BT_SETTINGS_WINDOW_WIDTH: case BT_SETTINGS_WINDOW_HEIGHT: { if(!prop) { self->priv->settings[property_id]=prop=g_new0(GValue,1); g_value_init(prop,G_TYPE_INT); } g_value_set_int(prop, g_value_get_int(value)); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_test_settings_dispose(GObject * const object) { const BtTestSettings * const self = BT_TEST_SETTINGS(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_test_settings_parent_class)->dispose(object); } static void bt_test_settings_finalize(GObject * const object) { const BtTestSettings * const self = BT_TEST_SETTINGS(object); guint i; GST_DEBUG("!!!! self=%p",self); // SETTINGS start at 1 for(i=1;ipriv->settings[i]) { g_value_unset(self->priv->settings[i]); g_free(self->priv->settings[i]); } } G_OBJECT_CLASS(bt_test_settings_parent_class)->finalize(object); } static void bt_test_settings_init(BtTestSettings *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_TEST_SETTINGS, BtTestSettingsPrivate); memset(self->priv->settings,0,BT_SETTINGS_COUNT*sizeof(gpointer)); } static void bt_test_settings_class_init(BtTestSettingsClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtTestSettingsPrivate)); gobject_class->set_property = bt_test_settings_set_property; gobject_class->get_property = bt_test_settings_get_property; gobject_class->dispose = bt_test_settings_dispose; gobject_class->finalize = bt_test_settings_finalize; } /* helper to test otherwise readonly settings */ void bt_test_settings_set(BtTestSettings * const self, gchar *property_name, gpointer value) { guint property_id=0; if(!strcmp(property_name,"system-audiosink")) property_id=BT_SETTINGS_SYSTEM_AUDIOSINK; if(!strcmp(property_name,"toolbar-style")) property_id=BT_SETTINGS_SYSTEM_TOOLBAR_STYLE; switch (property_id) { case BT_SETTINGS_SYSTEM_AUDIOSINK: case BT_SETTINGS_SYSTEM_TOOLBAR_STYLE: { gchar **ptr = (gchar **)value; gchar *val = *ptr; GValue *prop=self->priv->settings[property_id]; if(!prop) { self->priv->settings[property_id]=prop=g_new0(GValue,1); g_value_init(prop,G_TYPE_STRING); } g_value_set_string(prop, val); } break; } } buzztard-0.6.0/tests/bt-edit-cli.sh0000754042355400116100000000237611665720406014125 00000000000000#!/bin/sh # $Id: bt-edit-cli.sh 3716 2011-12-01 15:45:09Z ensonic $ # run buzztard-edit commandline options . ./bt-cfg.sh res=0 trap crashed TERM crashed() { echo "!!! crashed" res=1 } # test the output a little echo "testing output" libtool --mode=execute $BUZZTARD_EDIT --help | grep >/dev/null -- "--help-bt-core" if [ $? -ne 0 ]; then exit 1; fi libtool --mode=execute $BUZZTARD_EDIT --version | grep >/dev/null -- "buzztard-edit from buzztard" if [ $? -ne 0 ]; then exit 1; fi # here we test that these don't crash echo "testing options" libtool --mode=execute $BUZZTARD_EDIT >/dev/null --nonsense-option if [ $? -ne 1 ]; then exit 1; fi # other tests would launch the UI - and this is how we could terminate them # http://www.rekk.de/bloggy/2007/finding-child-pids-in-bash-shell-scripts/ if [ ! -z `which 2>/dev/null Xvfb` ]; then Xvfb :9 -ac -nolisten tcp -fp $XFONT_PATH -noreset -screen 0 1024x786x24 -render & xvfb_pid=$! echo "testing startup" DISPLAY=:9 libtool --mode=execute $BUZZTARD_EDIT & btedit_pid=$! sleep 1s && kill $btedit_pid echo "testing startup with options" DISPLAY=:9 libtool --mode=execute $BUZZTARD_EDIT >/dev/null --command=test5 & btedit_pid=$! sleep 1s && kill $btedit_pid kill $xvfb_pid fi exit $res; buzztard-0.6.0/tests/songs/0000755042355400116100000000000011675570677012711 500000000000000buzztard-0.6.0/tests/songs/buzz3.xml0000644042355400116100000000436111642654337014422 00000000000000 a buzz generator followed by a buzz effect buzz 3 demo 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/melo1.xml0000644042355400116100000000577311576360402014363 00000000000000 a two voice melody melo 1 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/simple2.bzt0000644042355400116100000000172211576360402014706 00000000000000PK+·9song.xml­VÛr›0}ïWhx.àKL> ——ö¡Ó—Œ€µ­1HTqܯMjwÆ3¬ÑÙËÙ]VËž‹œ<6BɵÞÞCü%Õïß–ëŒà©4kogm¹¢ôp8ÜtG7Jo©×VÏ&€³ú8 ‚þøòù[ºƒ‚ûBËe ¨e²•T_y¦ä)4çŸUÊmFïq^Ì °þÂù÷ð~µ¸]E‘Ÿ,)‹8ŒFÀl™ÄsF݃%\›8\â‰mòaÀVeÌJ­JÐV€¡˜)žî0?¦—ˆÀÂð*ê·÷ˆ=–°öj«„ç·œ¸Œ¬½‚L›ÿ¤òªÀ2=ñ¼Â·¡GÏýôò‘ìá¸öŽ¥2=6¸Yœ¡[Äóqët`°-—{ßFþ‚BQ†]𨘂1J{Xîj+¤ßßG­ž££WVöD,pü¹Š}t‘}0ʾ—zÊža$M\œƒÜÚ†µDzV¤{bE#l_£BÒ@5œ ŠU[¼®MÒQžMRŽF´çï缸ŠóòηWq¾{?çû«8‡S:l”t8­Éf£Þ§µÙXÖÂiŽêOiµàL—¶ŸòI2c³ÍÝhýp3ªÒî†L¶z€[0ÖèôÂ|sÙ…ù¶Ñð«‡Ìçÿ}ú—ïÿ_—Àp ÖÙyLJÓ ÂöÏ›&á»IOœ:ûwwרõ Øo—ovp¡!éiu8Ý=6\ß ™±ÝE¼å¢ÞÝ, ç¹3pn¦Qm¬œm$­-ly.•æo*xÁ,m£¤ídàW¸[ö]±œã'¥yº7îŠ"¹RåÚS²‘|\Dµu¥lþ‚ÄN›¹“órÓ>Û¬Ö`¯ï.: this song misses external files broken 2 trash 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 100 8 16 buzztard-0.6.0/tests/songs/simple1.bzt0000644042355400116100000000144311576360402014705 00000000000000PK%·9song.xml¥UÍn£0¾÷),îÄ@“4E}€íî¥=¬ö²`¬€Mm’>ýÚü%¨ífµ•f`>ÏÏ7ã=«’Pi.ÅÖ ÷ܰ´y{3 rb­Bo½Â˜:¦´mÛÅhZHµ£^ˆ:ŸÚÛÎAH~|Ê ¬ÀçBÚS:…üê2ìí2Ó¥1Ű8/aH/2¢¹@Rr±ÇœILšœKßö¤å¦ TÕu‰¤cP F»ÃLØ€‰³YSÈh÷Êv(&9¨½ßÂí?0hL!Uòdðù&µatøÆ2…`ÐÏNl+?¸÷£à9Šâ0ˆWë_Œ^XV€ØMàoŸpùÞÇ«»8 ø `i]%a0êfê4Y2êKAédc N2Ú“¢Ñ4uÂj%kT†£¦–.È K’ž4Âmw:’~;’·á¥D±3ÅÖÛX ÏöÄð ?¡å¿k¦ÎóÌtÕÿfóÿË«þûõW¬¯ˆ¢ò\ø§CÏΚ¾œwz¾½-W£ vž§ùϵ™_çp·»í]!TÐ÷v¶./—ó8{Ø!_´Ûy—õÒÞ5Ù^;ç +!ÅRr(Ô.te¼i èÜŠ"mëÛŽƒÑGïw„‹î<ªkµyKÍÝOa 1îôùÀÓwÈÛès(íÂŽ²ç /ÞÒm÷‚´D‡DÉÍPKY’æ¡)PK%·9Y’æ¡)¤song.xmlPK6×buzztard-0.6.0/tests/songs/melo5.xml0000644042355400116100000001447511642663544014375 00000000000000 a three voice melody melo 5 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/test-simple3.xml0000644042355400116100000000563711576360402015676 00000000000000 what a lovely tune test simple 3 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 100 8 16 buzztard-0.6.0/tests/songs/simple2.xml0000644042355400116100000000730111576360402014706 00000000000000 a sine followed by an amp, both playing patterns simple 2 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/test-simple2.xml0000644042355400116100000000411011576360402015656 00000000000000 what a lovely tune test simple 2 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 100 8 16 buzztard-0.6.0/tests/songs/buzz4.xml0000644042355400116100000000403711642656357014427 00000000000000 one buzz drum generator buzz 4 demo 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/test-simple5.xml0000644042355400116100000001107011576360402015664 00000000000000 what a lovely tune test simple 5 dark-wave Stefan Kost 2005-09-20T22:10:56Z 2008-04-06T12:58:20Z 100 8 16 buzztard-0.6.0/tests/songs/simple1.xml0000644042355400116100000000465511576360402014716 00000000000000 a sine linked to the audio-sink with a simple pattern simple 1 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 8 buzztard-0.6.0/tests/songs/melo2.xml0000644042355400116100000000752311642661315014360 00000000000000 a melody and a fake hihat melo 2 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/combi1.xml0000644042355400116100000001110111642656357014511 00000000000000 a three voice melody combi 1 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/buzz8.xml0000644042355400116100000000776311576360402014431 00000000000000 one buzz generator and one buzz effect buzz 8 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/simple5.bzt0000644042355400116100000000207111576360402014707 00000000000000PK3·9song.xmlÝXÍnã ¾ïS ߌóÓ4"îlw/íaµ— Û$A±ÁÜ4}úÿÅnãÆIºÒj¥J&ðÍ0ßÌ00Åw¯i^¨TLð¥ƒFžs|Ãaþö¦‰ŒYåjél´Îîv»Q½4r °xUq´˾ç!øëÇýC´¡)qWšðˆ)/¸øIRª2Ñrý^DDf4{œà”j`ÆW"œÅ8uIšH¤!YBöŒ¯+¢4ȈÖTr@x jt £±³óú076Š¥YBÁÃâ'^S.i¹uwäÅ`Ë Lr½2xÐtE8ø.”ưšÃ‘¤DS7Ö*0´§®wëúÞ£ï/·˜Î~cØàhCøºÏ]ó‡&èv1½YŒo-øÀa–È÷0´¬³0˜`h?8$RhfVìÃÒQŠê< p&EF¥fTAãBmŒ#T3ÌDŒä1OÆC[è}F—N16HDH’˜h¬G–Nj\K¥û"’<5ñ{!Inf‘Ûû4ã=ØÒýÒÙgB5Xo4m¡+Äkqc°£°Œ¦¥+ËßQH3To#ª”Ž x¾fÜ-o¬̬›Ž2Ìõ˜g ù¹‚½ëÆ'é{½ô›QÃùiEbcJiX9N(_ë±kføimf)í¡{Œ ´BQ4@Ô„mz\Ú$Ý#<$ì÷HO.ç<½ŠóìÎ7Wqž_Îùö*ÎhH†õ’FÃ’lÜ»û°4ëó–h¨W~Hªy-YXåÃHõ7{w5ÕM‰\Ú»³SÚŠ ®©ÒJF' œ½ÉN¸•¤Ï d2ùUðÔ%à~v tË`á§ÒL=åY] ¿Ïª‡SX{:úçókô=çýèfvö‡´ìóq,v¼ëårær?_bç?åè åÌãïÿGÇ¿zá|Ýé÷ËÌD¬D­Œ<7!g_yn*ëüŽuþÖ¡±ÿÕéÁŽÉúL:5·O¬týÌ^V4‰ö‰Ôi/ÚÏt«à½¿VÓj8*e&£ ’¤¤tÁ`½¥I_¤VìaÕ<)úœSÓª6ÁšMÌA”$Úªòiš&ªúVa0Ý­ÔNNØ]¥<®×fE/k¥Þê é«•UlêH»…b¶Cn¶¨»Ý—!ü6Õù8º(âñcÿí“ù í° ÷Ž#jq,Âù)ÅCÛs‚ÝgÀ­Ï€FàQ*þ»pù§ÃÕT¯ÎojIkXç ¬³ÕSå5 jqõ¿Q‚oPKuø±·çPK3·9uø±·ç¤song.xmlPK6íbuzztard-0.6.0/tests/songs/samples1.bzt0000644042355400116100000012774311576360402015074 00000000000000PK#rë8wavetable/2600bd7.wav<œ¸ã\×°kiƒÎضçŒmÛ¶mÛ¶mÛ¶=Mj+Mý¯éûüßYWzŠ4ν“vM5:ðÅê\¯SÃA#'äS±X,6Dƒ,Ö’.l‡¥b è;¡ïGʱ$ÙB(Xb–ò¿P°40ž5,- zx¥g!ÿ…¥ƒWÿÿµÆ0B²eßù_ ÿ½Bá}ô¿ÿÿÑì³ÿÿÙÿÆD³ß6fßû÷J—}ýÿç÷¿¹ýo0ÂgºÿÞû·ÿ–P—]JüWÿ·ÄZx¥Í®ƒê¿Ðf×LðZÉ’g×ôÿå°”,¼þ·%dð(Ën•ÿ%°ä°u¤ÿ ÂÿQöAö™þË`BˆX™LMÖ0ÖÖaÖs–%ff7d÷eOcoaŸa¿`Sì [Ï)ÉiÈéÆÇYÊÙϹÎùÀ pÔÜJÜnÜEÜK\/·o&ï¯ÿ,¿Šà•`–°ŽÈ$VIòKëÈÆËï*ÔªêãšßZ›îŒ~¿¾žn¾æ‘J®l'ß)u‰+Šæ žò Ü~ìË^ºmò@ÜÇÔ‰.‰¼aÁ¾þ Þ¨»ëˆCdaýD5 /ý­óçÆ¯š?ï~ïø-ðeÝçÊŸ¶½ïüŽx»÷MÎÛéo¾5¿%Þu~·îÝãw¬÷UÞ{ôýï÷†­?,ýpãý¡ÄÇþ·}|ûQü©î§‰ŸŽ~úõI÷¹åç9ŸÏv}Î÷¥Ã—Å_n |)üµç×Õ_ï}|-þ­û·Ußî}‹|+þ½û÷5ßï~}/ü£ó%?®þðþ ~¶ú9÷繟äOͯ†¿&ü:ôëÓ/þïJ¿þÞôûÞïðïœ?þÌýsöùâoí¿ÃÿnûûìoèoasSóó>óo³Ù|†jiík[o¿ãð8ån­Çè-ä+ì7ÁXðGè^x}d,Ý ª`¾0Ûcíâ²Ä£ÄødþÔÓÔ˜´:s<Ó‚efMaK8;8E¸ç¸µywy¹üûü‚;‚ªÂóÂb¢="D¼T̈‡H>IêJKµ²é²?²zòÃr™b¬â­¢´r…Ò©ÌUíVEU­ÕGÕiu'ÍI [ÛI{H×¶ÔíÐ9uUõ‹õïõù¡È%„mhlXmøl0ûÆbèôêEKa#±c˜+€÷Æ·à¯q Q—˜D'~zSÓ ÓÓ/“"O<#òlÍó0O ž·AÞáy7罞—Ì+ÌW2_«|cò­Éw1ßû||Êü%ò7Î?0ÿÌüóŸÊÿ ÿüÁü¼"§\Nýœ69½rFæÌÊYš³%gÎ霫9rçÀŽÏù‘ó7Ç’ãÈñä8!¬9fxý7çCÎûœg9÷snæ\Ì9ߨœ³*gN΄œÁ9såTË)˜£ËIæ·çÿ˜ÿ~þ#ù×矚¿þæù+åGògò™ó=Ìw4ß’|Cóµ„%”æsæ}’÷@Þùy»ç­™W•וçAž]y&æi“''OÌôÊtÀ4ÅÔÜ”×!îë‰~Dy‚M¼Ãwà#ðÊ8‹mÇ`å±z]жEèOã^ã0ccÔpÕ0ÓPÛÀ3ÜC!MòP?O_OÏÓßÓÍÑÕÔŵç´ã´Å´VÍnMNóF½H]_QQ VåQ½S®QÖUƧý¨â…|†¼‚Ü"Û&k%ãÈÎKKõÒ§’é’R’ßâ5âzâ hŸ¨£H º( Ä„“øóùøfÞF^./ÌÝËmÇesÏsúpTœÛìÑì¼ì—¬i¬¬™Õ™:Ozwºu:•:—ê›Ò¦'§&‹%ÿ$Ö%&ñÓñ¾q4þ,6/V9æb0Ý5ó,º Z+JÓ'é!t!ú{d[¤CDy^n–„Ÿ‡–‡Z„ä¡WÁõÁvAcðG``X L€ößò/ô·õ~ÊwÊ7Ý×À§óýõžñÎñ¶ñæóF<=Û<£=¹ƒÇç¾çÞáïné.îf»ÿ¸®»¶º&¹:¹*ºt®¨ó³ó†s·s–s³¹³’“pòÇWÇmÇ)ÇÇ|Ç8GoG+G}GiG>‡Î!rÄí>û_ûWûkû#ûûUûûqû~û^û.ûvûVûûûFûf¶ÂëööC0Æï®ý¥ý­ý»ÝßÛŽ£€£¬£Ž£¥£—c¤c¶cc¿ã¢ã¡ã‡#à9ó:+ÀÒ pÎp®wžpÞwþv&œZW9W+×h×J×Q×3—Ë%u—t·‡µÚâ¾îþâθ xš{Æz6yî{\­·–ww¥÷Š÷¯Wî«æä[ë»ísùp3ÿdÿ!ÿg?/P904°9ð<”  n ¾ rBUC£CC_CšpÃð¬ðù°+\0Ò3²)ò."§Óóè;t”®=õD‹1C˜Ã ÅŠ ŠˆYbEâã‡ã¶xÑÄÐĉ„7Q!9!y%™LÖM-L=KIÓmÒÒ_Óy3ý2G2¾LY8^n³8ì¦ìuì÷lœÓ‹sˆãâTàNåÞãòy­xx?xø#ø'ø~5ÁLÁCLØF¸EøSX@4TtRUOßs$ $K$Ï%ri;é:é'©AÖŽëŸ2\Þ]¾MþUnPtT¬W¼SÈ•M• ””ie ÕXÕI•EeRwR¯TßWgÔe4ƒ5;5ï4muípíníKH¼et½t+u·t6ªo¤«ß¡¢÷êQ$‚¬B. ß!}ç冖Ž^\©±¸±±q q¾q—ñºñƒ1`£9hu´ :‹nB¡7ÐWèo4ˆr0–+‡ÕÆšc°Øxl¶[­Ãv`{°ØQìv»Œ]®c7`¸Ž]ƒW±3'°#0Æl3¶[ŠÍǦcc±AX/¬-Ö«‚•Âòaj, ¤ýóº ÌÝŽ.G' ½Ñ¦h%4*FƒÆŸÆGÆÆ5Æ)ÆžÆÆBF©Ñgxo¸dØj˜jèb¨f@ ò ¾ ‡´@Š \äþº~“~Œ¾™>GŸÔ½ÓÕÍ×uÕUÐñuß´§´ó´]€;)Í+ ÏXM`©>§ž§n«Î§ö©n©–ª:© ¨üÊkÊEÊvJBiWœSLS4T(Ÿä»åƒå¥åAÙ%ÙLY}™@öRº^ÚIjþì— ”•8ÄÇÄÃťĨã£EåD>áYáha)¡GpR0\PT`ãà÷çãü¼M¼< ïw9·>—ýəÌ)Çq³‚äae­e5‡¹›™š)—q¦÷¥{¤ éw©%©ú©Dò\rd²pòobs¢mB¸Ÿ/wÅöÆzÆt±W̦“ˆž‹Žþ¦·Òíi9ý(2?R;_  “¡Ý¡^!cè}pM°uP|Xhàúøëù¹þ¾E¾F>‘ï…w•·½ñ~óìñ ö”*]rÏt7tËÝ\Û]ý]¥] ç#ç*g7gQgÄq×±ÎÑ‘±¿¶Œ³7´ì.ÛMÛÛP[›Þæµ>°î´N²¶¶–´ ¬fËËËLKWKU‹ÑÂP_¨Ô.j5˜jF•¡ T’´’/ÉKä.r9žìM6'+‘EH-É#Cæ?ææ‡æ+æ£ææ5æEæ™æ±æáæ¾æ®ævææÆæºæÚæjæJæŠæræ²æRæ2ðX^U6W7×4×77077·…±{›™Ç™gÀÖÂ”ŽšÏ›ï™_™˜]æ¸YLbdI²6Ùæ=ž\Nn'Ï“Èdˆ”R©TGjµˆÚOݤ¾QAJc)einbYd9lyh±YÖ"Ö¦Ö¡ÖÕÖÖÖ˜5¯­®m°m•í¼í›c/nomŸf?lnÚó;Z8¦88Þ:RŽâÎ.ÎEÎ+N›s5rMvq}fÖruïsvË=u=“<'<”Çàmë]ä½å {Kûúvù>û´þþ%þ;~v Z`ràlÀ( „Üü4…º‡6‡>‡ á.áõáÏa$Òèø9‚ÒÝé]ô:tPôD4-ÃLb.3)¦nlaìyLïßÿ/œ‘¸ˆ$ê$ç'Ÿ%թΩÝ)Kªdz|úFš—i–Ù˜ù’Éa e]`ÅYuÙKØ/ÙFNoÎŽ—S‘;¸(åµçmåýæáâŸã§ø¹‚%‚×°‡p»…DÕÅ3Ä÷Å6^2n6öˆbŸ˜ÕL FÈÜΉV2ôYz4]œ¶EDúDòE~†w†»†á¡¡v!eèepU°EP|ž¥£8ðÜ¿Ôßܯð¿÷­÷uô¡¾ŸÞÝÞþÞ^ç¼g†§¾GìyíÞæîç.á¦]7]‹]í]ù\.çU8£;8 :ýŽ{޵޾Žòžã“ý„}–½½¨=iû`;n›këj+g“ØHë ëfë8k[k)«Äê´<š,² µ4³”°(,~êuÚC- FRí©š@!9E“¿Ègäò¹–œMŽ!»¯j“åÈ‚$BŠÉ”9h¶š¿™_›Ÿ˜ï˜/˜Ï™›@u¶Ý¼Å¼˜·Ú¼ b%0tyÄ àó! áió%ó-ó á'ó/³Ç6³H9± Yž¬K¶"{‘£ÉYäjry‘|B~'=$˜]ŠªGu¦FSK¨ÝÔeêå¢x–¼–ê–Ζñ–U–c–§«Eh-d͵öµ.°°>¶Ú¬"[ [ÛDÛfÛUiÚKÛÛÛ§Û÷Ù_ÙÃö<ŽFŽ1ŽmŽGs6pŽwîq¾t&%\Ý`û^tY]:w#÷÷÷W·ÌSÃ3ÎsÐóÅ#õÖõNðóþòê}M}³}}~_A/ÿÿ[¿öäŒÀ•€?P:8øø;˜7Ô%´-ô)¤ ·{VEZEVE^Ft+z%ý’ÖD;F7F¿Dq¦'³‹1ƒ;‰Ž…bU ëÞ Ík_¦ä€äѤ7Y)5=u/%ƒZbSúWºPftæb&žÉe-g½cؽهÙvÎÎŽšÛj·o ïOÄoÃßÂÿÅ/()¸(Hê  _Q¨sIQq8s.ˆ£â:’¹’G™´­tµô£T/ë"Û"û.Ãä½ä;ä¿ä„¢‡b»â»Â¨ì¢\¯|­”©Ã9{GSUPPPÿV£š–šEškŸ¦¶›v­ö¡6¬-¦ëžµFŸÓ·ÒOÓÑÔ³‹=ùÈä3Â13´7L1ì1Ü78 c9cãTãfããWcˆ-v[[ ®ø ŽAuXq¬!Ö›€-ç;ƒ=ľa,)ð¼x¼Þ ïŽÅÇà³ð…øz|~?…_Æoãñgø{ü þ§pnǽÜ»p' $nÆã?ðø[üþ¿ŽŸÆá{ñMø |6>‚wÃ[âõñ²x!\ U©ûŽ=Ý­Äfa#°ÎX.pX‡%P ú=î@ç£ÐhYÔ€Fߌ׌»s½uŒl£ÙpðÓ0ÍÐÕPÑ Í’t?2i‡”DD¥¿¢_§¡o¨GôÝÝVÝH]]Ag×^×®ÒöÖV†~ÐìÓŒÓÔ¯ü«>­ž¥n¢6¨-ªÓªÙ°G•Yy\9VY[)T¾…ý5PQR•_“/7–ëä?dûdƒdeeAé%éti©DúF²ZÒQ‚H¾‰·Š{ˆ ±*Ýþ¢‚"³pp °  Xø{Á+ ðóvðºò ¼OÜ Üö\5÷ g)§‡Ã¹ËžÆ®Èö³N²†° ²þdvgºėôF8Vå釩9©)Ìr T¾¶ÄÞD¯šø_oÄïÆfÇjÆ"Ìyf$SŠqD€3ˆ~§wÒ=h#ý)²>Ò.¢‹¼¿hֆ߇6…:„°ËÁ.A,ø3°7Ð;P8àòŸôñWñ3¾;¾y¾Æ>¥ï£w§w0”öÜñ,ótðä÷ØÝçÝsÜMÜ:÷o×I×LWS—ÉåqÞr®vös–sr‡ òlç( –ù(:ßÞË^Õ®¶;lm{lSl]l•l[ØúÊzκÞ:ÙÚÑZÊZ3³å‘å¤eeš¥¿¥©¥¢Åd[BÔê)u…:H­ïMõ¡ÚPu¨ŠTQÊD)(>Å^’$?“¯ÉÇä]ò:y ðyŒëMëOkÒª·U´µ³£>gûh‹Ù{{ØG R÷ÛG G?Ç2ÇYÇÇYÂÙÎ9˹ßùêð®Ö®`“]wywo÷*¨¿ÝnÌÓÔ3ÕsØóÕ#ñVóŽôîò¾óò¡òáÛë{ïùëø'øøÿø 6o˜@ùàÈàa`&jZz†ë‡ç„¯…™põȤȅH8R2êÚM—ŽŽŒžÍZå8æC3Õb3c7c™Xƒø¼øó¸,Ñ*±)ñ¨Ù/y$éjNMÝN ÒMÓ«ÒïÓÔÛ‡¡Þ®ÌšÁzÀ’²Û²·³Í좜1œ‹œ$§w%÷—à âä…y5øsùÏù*A'ÁnEPR8AxUÈ5­}¡â^âCb§¸´d‚äŠ$)©'/}&•ƒU®“½—éåÝä[¡ÚÆ];?&ewå6å7pʪ5ª×*±º!œ¹×ÔQ0Ê¡šš¶™v®öŠÖ«ÍZr¹î®.ª+¤ï¢_.éÒçÏšÆõ áʺξøÆƎƙƃÆ'Æ Ñ´ìN·½€ÿåb}¡ŽÞÕò;̉^uð.ø|¾¿Lü…pE‰ªDc¢1OÌ%V;‰#Äiâ ñ„xK|%~á Md–I`™¤&¹I !φÞc™2DÆð6â7|ãñœ¸G\…©$¶kˆÄdbÑhIÔ!Jy)‘Æïâgñ­°=T sý—ü^@÷ÀºÀ“/X58>x,h)ׄž†ø@Òá+á`¸|dxäX„ŠäÐ=éôOÚíÝýE™®ÌVæ+ƒÆºÇ¶Å¾ÅˆxïøÎ8 úàĉ„'Q)9)y=™NÖM-H=I)ÒmÒ›Ó?Òy2ƒ2G3LEÖ4Ö–€Ý‚½Žý…—3€s’æÔäÎá>ÏÖèÛxx…øÃ F§ùµ /ZaGáNáïl~VD‹ª‰çŠˆ%’V’u’/TÚ[ºSúWZX6DvXæ”——Ÿûå¥cÇ^¨Ð‡+*Ê"ª~ªÝª¯*ƒº­z©ú±š­©©™¨9«qjòi;ƒ/ÝÓÒÚ²pÆoÖ=×¥uõýõ›ôOõQ}Q¤²9˜•¡ºaˆa£áŽ2hŒ5ŒýŒËgÁØXh!´):]µ÷g4‚¢X-¬ 6 [‡:91žƒ×Ã;·æá;€¥OðŸÀR!a Š5ˆVD?b$t9±‹8}H¼&Ú‰ ‘"¸&… 1å505•3U1U5Õ0Õ1Õ3Õ750åÂPßÔÐTÛT ¢²©‚©´©¤© ) …o‰L)`¬“øt}LÜ$ÎûˆõÄ|b"1˜è ü®Bä‚M¸ÀsâgðͰlÃñNÀü¸`?±GØ!l6|µ †c<̆>A¢ËÑAh´$*F-ÆûÆÆÙÆîÆšF­1`xf8j˜Ù¦²Af È&d’‹@Õ»YªÖÓônÈTttUu"Ý'íQíTÈc­ ¨ºHÓI“OãWßT/ƒýƒ«]ª+ªªਿ•Ç”“•5•<åKÅVEw¨ñ­òSòiòºr‘ü™l­¬« —ý–î––“z%ç$ã%•%Qñ ñ qM1[|[4GTGÄÝÎÖ²„w3µ þ5þ ~U~”wŽ7ŽWŠçâžàáàþæìâtåè9Ø+ØMÙ\öÈû•Y‘̨̙Lá •ÞîœFÒoR«SSüÔÝäŒd•d0q&1,Q4a‰ïŽ÷Šãñ±µ±–1qì!³ˆ©Ëd¢7£Ó£U£ú"=Ž.K»#§"Ã"E#ŽðÑðˆpɰ7t"4,T2äž NV 2ë¹Pã¿ôoôwö›ü”ï0Pµš/å}à]ííêÍëuy.zæyš{ô@ÕSPs6qëÝf×רó ¹ÂÎÇÎÍÎÁÎZNµÓâ¸ìXíèï¨éÐ8ö{ö­ö‰öVPësí¿mסÎhko+oSÛ‚ÖwÖ PïO:ÕªXdõXÞ[®[öYV@½ÜÓÒÐRÞ’Ç"´D(3ÔÒשSÔ®,SÇR}©©šà”…¨jJ@±¨(é–R`ßÈ/äò-ùŠ|I>'Ÿ’Ï`x¯þ9éò8­(ë'`¬RQ8U¦T…Ê¥ÚR=©¡Ôdjµ>ë§÷©w”•ŠP" a)kɵt² ³Ì¶l“~`ùn XäÀÖº°ô­k¬Ç­­,›ÉV²ÆTÛ6Û5Ûw[µ68úû~û»Ë®tTrtuÌst¼t„¸³®s(¸ýeç_`keWÈQ—\¤K宿ê^ï¾ëö¸óxZz¦{Žz¾C]_Ë;Ê»ßûÉ+òU÷ ÷m÷½òqü•üÃü»ýýŠ@½À´À¹€37Ø9¸2ø8È‚¼9ö´5”?Ü#¼%ü&¬ˆ4‰,ˆÜŽÄ#UéIô9Ú—õÔãQw´$3‚9ÆØ™bPÝ9cEãÃâÇãÞxÙÄøÄ…¨’œž¼d§ê§¥ž¥ä@×-éo@×þ™Cg¦kë*+ŪÇ^Ê~ÉVr:svpHNîîY.íśË{Ì“ñÛC…ÿƒ_@0HpBTNÞWm&Z ®jwï“â‚’¡’“’ ¤¬t¼ô¢”–V—M“Ý¥e5ä³ä·äiymÅ Åu£¨¤œ <«ô*‹©©ö¨~ªŒêNêÕê'ê´ºšfŒæˆæÆ¨m©]¶êÓ[] •ª_W@ß^¿PNOêõHCd,²y$¢†N`f‡ o IC!cKã8ã6ãM£Å(A+ ÑYP+ßC£\¬ VêúiØfì"ö ó`B l ìH| ö<öîÃÅN”'êíˆAÄb!±üò"^8níõ±¯Ìf¦ £fÞE×F[F¥ÑgôRºͧGEGÄ‘'áEá¦aqøqhy¨YHz\ì4¿v <þ3PWVóg|}+}í}„òžðNöÖñ ½ï=Û=9—œMN'§‘Sÿ¦‘3É9 É¥ä*r=¹…Ü ß8E^ ïƒ??É?@^šäµM`µUa^²F»ˆÚBÊ¿¤þq…–¼`³--ý,S-«,‡-·--~‹²D=àí4ëëEë[«Ç*µ•°µ° ·­´°½²mZ{{'ûTûNÈ;f»L¶­cŠc˜¬Ç¡“ì\ã¼ê´:宪®®•®ëÙ6Ôúîîî˜§³gç’ÇêÑzÃ^9æýé•ûêû&ûŽù~ù´þþéþó~ÊO:–ÁaÁÝÁ¯A=ìí¡;¡h¨|xdøXØÎéÙùÑÑmèôSZ uÎÂèƒ(—©ÏÌcn3œXƒØüؽ?^?¾$þ .J4I,K¼J(“í“›’ß’¦TßÔþ™*•ž>›§«dffîf¸¬¦¬•¬÷,ŒÝ‹½ídãŒæ\âÄ9u¸ ¹/¹j^'ÞÞ_^A8Îñƒüª‚é‚[ž°©p¥ðÐ(ê)Ú+"EÄ#ÄÇÅ>q9ÉDÉeIBRM:KzSÊ’Õ—Í–Ý–ñäuäsåwäy-ÅtÅe måDåi¥[YX5PµKõC¥W·V/WßW'ÔU5#55ß5ˆ¶©v®ö¼ÖªÅumtót—tV®o®Ÿ¥?¡ÿ®#Õ‘ÈäâDŒ†\Ã0ÃfÃ-ƒË ‹ëc\bF­¨+Šåb°™ØNìöŒV€ãxe Ù@|:¾?ŒßÂ_â$Nã"§­J4#º@?|s±“8@œ} ¤üõ¾ƒðyãÛÄú MR“ ¬„áß3!ßÄ21 ì!(â'ìkâ>q¦rŒØMl€©N%†½Àœëg *‚EøÀ©_à×ð°<³ñ¡x¼&^WƒÉþÆb§±MØ ¬7Ö+‰)±0Xúut:í‹ÖG ¢¼¬Ë2Î3ö6Ö2¢FÆðÉpưÒ0ÀPß`2D‘—È!dÒ)‹ð‘ú‹ú%ú>úJz¹þ¯î¼n‘®—®¼Ž 6{D;SÛB‹išš•š^šRš„ú™z›z°ºœš¥~®Ú{¬¼*¥|ªÜ¨ì§,¡¤wKíøìYùDym9_þZ¶IÖC–#³KOK'H«IÓ’»’Å’f¥ä½x£¸«8øhŸh¨¨È!<&&,!t NoK |pŒá—æxgx£ÁhÜãÜ¡ÜB\3g§'ç;{+»+[Ã~ÇZÍjÁ’²edêg2éëé©é*é`êLjdªxÊ’ÜŸì“$’ß[]úÄ»øšx˸<þ$¶ V/–bn2“˜Ê =- ЧéQtqpÚãà´%#NpÚ¡áâa˜Î¨PÙP0xœ¶Z0¸˜¨Ó®Í:­ÙwÄ7ÂWÉ—ôÞ÷.ó¶÷^»çŒg†§‘Gåùî>äã®ã–¹¿¹Ž¸Æ»ê»é¼à\èìâ,æL8^gyÛ̑Ǵ¿°´·³óì?l—ml#lMmm\Ûë-ënë,k/ðÙœÿZ][ÖXÆZ:[jZ Yäà²?©‡Ôjðn,Øf3ª"ا†âPò/øéCò*yŒÜA®‚N#Ç“ÃÈ^d²%Ùˆ¬CV!Ë’%ÉBd>2/‰‘i µ©Ï>¢ðž‰Ì!‹%`¼jd=²1Ù–ìFö#‡““Èy@ë­ä~ò,y¬ø+é ¤Œ"€òu¨6༳©5Ôaêõ|7Ei--u,-c,‹ÁÆoX¾€ëʬŭͬC­K­û¬·­?¬)+n«fëi›iÛk»o£l{q{ûûfûu;i9Jy§:ö8ž:B๠œ£[œ÷~'æjàãÚîz⊸ò»[¹gº¹¿¹%žžaý^xRžÒÞ>Þõ°o _/ßFß_ÊWÞ?Ä¿ÓÿÎ/ Ô LœX¦`‡àªà#°Üª¡ ¡“!G¨P¸Ox{ømXi –{?¢kÑÓè«tŒ®=õƒåŽdN2¦LlTìtÌ+?§ã•SW©Díäìäƒ$ꬩ7)]ºSzGúg:X‘Œ'S–5‰uÅf7`/c¿ËíÂÙÎùËÉî47À­Ê›Á»Ëð›òWñßðA7ÁYPΗ“BŸ°‚hšèŠ(-j ž'~$HšH–H^H”Ò–ÒÕÒ·R¬ƒl£ì‹L/ï"ß +×*Z)–+ž+DÊÊùÊ[Ê„²Šj”ê¸Ê¦Ê ž»î?ϧ9¤ù­ÑÃù?S{QkÑ¢º–ºYº³º?:­>W?I@ÿVÏAJ"=‘EÈyä"3T4ô4,Ê|3d EŒmŒ£Œ[Œ·Œ¿,´(Ú‰®@O¢oPªÂJµ†b‹°=Øuì#æÃxx~¼ Þlr*¾߇_Ç_áð Î#ôDA¢"Ñ€è@ô'FsˆEÄ&bqœ÷ñxN¼[ýKØ Ø ¦‰(Á‰ãðƒça ®7kµf õGâ 0ûq†8 SÙ$Ÿ = ü¶ш¨D&ŒŸˆâVüs¶a>Ÿ ¡5^/„+ñö È{ÛˆMÇúc ±2‚Ñ`¹7Ð=è´?Ú-„ŠP»ñ™q?äAƺƼƔá‡áªa£a”¡™¡ˆ!ƒüBÎ"«!H=ĈxôOô»Ás[ésôQÝÝ>Ý8]#¡skoi×ii+jEÚ/šcšiš&LcU_T/V·WçS{TwT+TU9*·ò²r®²•R¯ü­8®˜ ¨¥à+^É·ÈûÊ‹È}²+qÈ„²wÒíÒ^Ò))9!+©,Iˆ¯‹çŠsÅñ3ÑrQ[‘FôQ¸^ØEh~lc |çïäwåcüo¼í¼®<#ï3w·¸î[ÎjNKŽ’ó„½ˆÝ„ÍeßfMgÕ`1™‹™q™2Oúhzhº@úWjOª{ÊzŸ\—l‘%%æ'ê%ÒñÛñ©ñÊñpìllt¬xÌÁd2™?Ñ=ÑÑ<ѯôfº Ò_"›""ÚȇðÆp‡°!ü)´=Ô5„‡þ€ õæ­£Q ˆÿš8“ÄÿÚ·É×Í—ãsxÏUÕóJÁuwyzÊ{bî‡PéörwG]]ë\ý\e],×ç^ç8g}§Þiw\q¬pô†ºYìøc¿l_iïo¯b×Û½¶‡¶ý¶é¶Î¶²6¥Ím}b= llmj-f•Z]–×–3––)–ÞP·³¨-Ñì¯]g¨íÔ|j 8n.UÊKɨ8é$¿OÁmO;É•@ʉä²'ÙžlÌ­J–#‹q1RGÊIÉ#ÙdÒœ2'ÌQs,Qxž‚à’Bø\ ãÏ…ÂÈdC²Ù‰ìOŽ;^>¼\øù‚üsM‘r pª.Õ™BMûÞþûŠ"©…XJYê[º[&@ö8b¹gùa‰Yk9k«,ZZ-V®­-×6ضÄvÌöÒæ·iì¡ ˜aßchwÙ5Ž*ŽŽùŽãŽŽ„£ˆ³µsªsŸó…3êÌïjášâ:èzëJ»J¹»º»¯¸]nƒ'×3ɳßóÑÃõVòònñ¾ðf¼å}ƒ|[}¯|i_EÿPÿÿ¿2›mgp »×_9¡Ú¡I¡3@àá^á-áOaU¤Edqäa„ ž ŽÐ£ãÀîh)f8s‚q2EcÃcGc®X±øðø‰¸;^*1"q&L”ONL^N2Éj©i©[)Vº~zaúiZ’i“Y—ù’1²z²ö²(VQö(ö9v˜]™3‹s›Ãç6宿~ࢼ¼½<’W”?’–âW÷½/à ›û¾D]E;D?À}ˆˆââ’1’3’°¤²tªôŠ4*­&›gcLVE>E~E•WTŒSœV¸Å”ƒ••”FU{Õ*Õ O]K=I}VíPç×t‚ ÷‘&¥)« Ýª}­eëªê†è¶ë^êÒºÒú^ú5ú›z·Eš"“ÝÈk$4´1Ì04¼0„ ¸1×8ĸÊxÁøÍÈͶ掟@Ÿ£.T‚ÀæA½~ û„¹1nûmÂçàð£@àwPçGq9‘‡(MÔ/í~: ø»Èyš¸@Ü&žÀd-ÀÞ0ð6 ö+ÛUf½WcÒ™Mö—²üÏ€ãDˆpV`ñwâ=|ÿ>q X¼ŸØL,¶!ˆ\¢ø¯†àü7þ¿Š„œ0(Ü6ë¿ <€}Ç`DZõجX|QLŽÐè5t:í þ›ƒrQÒxϸ￶\Ô7|5œ3,ÿ­gÀ ä-r™‹tG* rÄ¢¿ª_¡¤¯«×꺛ºµºÁºj:¥Î yo‘¶›¶”6¥y£Ù­¥©­Qh~¨ª'««µjRuF5UÕH…¨þBý2CÙP©Q~WPŒRTV¤äOåëå=ä…å^ÙEØ÷µebÙéfii©SrV2(œßÏ7‹Å¯E«EíDZÑ7áNa/(~ ö ú rþþ ~a>Å;ÌÂ+Ìsppû‚“œý`À&ÎO0àÎl”ý•µ™Õ¥c½É¬Ê4ˈ3Ó Ò Ó¬ô­ÔŒTõTžGò5¢ÊR&JL1¤™|KÞCÝOn ÓÁ[{“Édm0ßbd~ચ”\2Ä ›AçÍn3e¶š™ÿšÿd¯¸ù÷g7;à“0™1³`lر x\xœ Së4MN!—Ã\ÀÜî’oÈ?¤äPZªU Œ¼5ZHí€e| ¶NSrKK]KWË8Ë °á[–Ï–°Ei-6<Ø:ßzÀzßJYy¶¶z¶!¶¶C¶'6—Mn/goUÂ.û»Ó®rTtôrÌss¼w¤Å“ÏÅ9®Ö®‰Àâ—®¤«°x‘û²›rë= <==Ÿ€ÅÕ¼C¼Û½Ï½ioß``ñ;ŸÀ_Û?ÖØÿÃAó¯7WÑ`ïàÆàÛ $Ô 4+t5ä •  ïë#í#k#Ï"ºaöj€4°xjô|4-ËŒaÎ0~¦$äú31o¬ Øð©x(^.16q>NTJNN^M¦“õRóSSâtÓôêô«´:Ó1³)ó=“ŸÕŸu„åd•ac_fÓìڜٜÇ·w÷=áõäíãÙ€Åãøgø‘l;Ä]OØH¸\ø\¨umýå÷[Ä…$ƒ%Ç$NI)épéI©OZZ6ZvFæ‘•‘•;å…ýû¿„²‹rƒò­Rçô\ÕuU@UJ=H½SýI­Ð4ÔÌÒœ×84ù´íµK´·³í¾tKt7tN¦o©Ÿ­?®ÿª"•ÈJä:bG”†š†A†Õà~¤Ab¬hìlœa<`¼k´¥h)´-:]‡^jQ Vk…ÞÝÀ¾`!L†ÀkãñQø"| ~ „ÄxWùˆòD]¢-Ðx1ƒXBl$Ë^"î/€¨ßhìÍò˜cdÛ$&Q¶EXV‰%0Mlˆ @ãÄ'âñ€¸Jœ"Ž»‰5ÄJ ý˜¬7&ª%‚qX‚/ø}ü¾_‚OÄ{á-ÀÙsp9Nc°Ç`Åk±YXo¬1V Scôz%kÅÐ&hqT‚/ÇŒKÃŒ…,ã_ÃÃ.ÃtCCYƒÌð¹‰lEF#Í$•ÅAý,}})=GÿKwB7O×QWB—Ò~ÐÐNÐ6ÒâZæ6dÇþšÒš´ú…z›z$äM¡ú“ê€j¬ª¦J¤ú Ü¯©¬¦ä(_)6*ú)Š+bòÛòeò¶r\þGv\6VVUÆ’=–®’v¤ß%{á)-‰ˆ¯ˆg‹ëˆ9â‡àÅÍD*Ñ;á&ðbTøU°[ÐKP@ðˆ<€_ˆ|ˆ×ŸWˆgãäöç̹/'ç{'»;cfmbu"¿³h™‘gž‚iä¦9@ä™@äXòý哾ĩĨD©„#~ Þ/žÿÛë3Ä>3ë™vŒšy]m•EŸg[EôóȲHK òËðŠp›°:ü>´.Ô!„†¾wû ‘O‘+‘oùç‘@ä¾¾R¾÷¦w‘·…ñþñœ«ç‘z>¹‘k»eî/®£àl€ÈçyçgGggˆ¼×1)Û*A‘wÛ'Ú›Û Ù3¶O¶s¶@äF¶|¶”õ«õ2y¼µ ø£Ö°|²\µì°Ì¶ô³4±”±è-q0ãG`Æ›³DîHÕ§JS%¤ÂÀÅ×äò$xñjr9žôlEÖ—"‹8ðXDr€Çs¨köšÍ?ÍßÍ_ÌŸ³ÃgóWó7ó,›@ë9nΘ9¤˜Ô(Y€,IV$ë’Íaª}É3€É›€þ§ÉoI’¤Ie JRµ¨6Ô@ðãåÔ^êõòGœÒƒÓÿóã‰Ù~µw-¿,i‹ÎZÖÚÚ:̺Äz$Û³V`+fkbf[f;i{m ÙôöjöÞöö#ö7öwÔs q¬r\tüp¥sÇïgQW'×l×I×gÇ]ÆÝÓ½Ä}Ñmq#žúÀäž÷ž·20ùŸ'½e|ý³-IðãAþþ7~A F`làPàG@lœ¼ K„„v…¾„´á–áEá›áX¸bdTähÄÉO÷¦·Ñ_h}´äö—QÓœYÈ/~/ÎNÔO,HQrTµÀ¶Î©\ª¢ê>ê-ê—j¦ºf¼æ¨æÆí;vNëÐbºæºYºs:J§ÖçBeý¯•‚…”Ez Ë‘ËÈoDj¨dègXj¸U¹ÀXÒØÞ8 ,ñ¡ÑcT ÑNàÛЫèw4æÁja=±iØìö ³ƒ!ãxy¼ÞŸ‚¯Å€!¿Ä-x —Ëõ‰6ÀËñÄlb5±8N\·}M|%þa#D’àëL„)¿©ˆ©°©¸©¼©‚©’©\öw¸ ÿË™J›Šš À8(˜³ ø_ve[.ÞOÀ•Oûˆ @ýÉÄ0¢Ñ¼¼Ôl6ãoñ;øq|#>†·‡ìñÏ”£Ø/ì v[dîd.‚)±䜫°–ÓÑh4/š1þ5Þ1î6Î4öSFŒaÃ[ÃÃ2Ã`C]b ¡®8ŒÌ†íW"ô—¡ê¤¯¥Wë)0å5ººÊÙßåÎhçk;h iÍ Í6ÍP0e¹æ§ú˜rCµ:kʳ «ê²¦#™$©.Ɉˆˆ[Š¥â7¢õ¢î"“èpŸ°¿° Ð&8$&("póñ‡ó‹ñ¼ã`ÊEyîîPn®sˆ3„S”cgf`bÿadõaåeýÎìÌôÊ`™oé­é.iMú]juªeJ–zž\šlœä'$fÁ9ÁJ܈OWÓ± ± ±Š±0sžËTeBÑKÑ)ÑÊÙéJt4r92%R-B‡o…§‡ë„Ùỡy¡†!qèEpm°C þì  üüSýõýÿ+ßz__ŽÏë½èémîU{¿yyÆyjy„žÏî½@æn!¸òApå\—Þeu^u.svu–W~ç8ä˜êhå(èHØ_qfCe^Ò.²[m7l›lcl­€M<›ÅzǺ×:ÛÚÓZÛj²²¬--‡-Ë,c,,5,„…kqQŸ¨Ôj8i_ª5øiaJMq)ùƒ|A^#O»Èõ`ËSÁ–{‘É&ÀÓòY[F²¶Ì#“æ(p×gö¡f‹™g6ƒ1ÿÍ>³š]f/¸tØœ2óHi–ÌùÈâd9²&L­-Lu09œG®,pŒ¼ú_ÛEœTRyÁÜs©.ÔPjµ:Bݦ>RŠmÁ-,Í-ý-³,Û--¯-n ßšßZÇÚË:ÙºÉzÉúÁ¶ªm•l²=y/Ù¾Øâ¶|ö\û ûrûYû'{Ü^ÀÑÈ1Ò±ÑqÍñ×!qVtöp.ržr~qr\%]Ý\óÍß]"wEw÷Z÷-·×mò´ðÌöõüðH½Õ½£¼»½o½_ßPßßk×_Ù?$ÛGB¨ Ù÷dàOÀl\¼d‚eBCCûCßÍmÂËÃÂépÈøÈéˆ7RŒHï¢ÓD´[tSôCTÉ´bV1ÏI¬ylqìiLo_g·{’&[$W%ß%5©v©©Ï)<Ý#½7mNÌ ÊÉ82eXã³×‰ÕdÏg?` 8-8+9ï8:nWîvîono(ïÏÏ+ÏŸÌ¿ÂOñë æ î Ä–•Â÷B¨›hs^q_ñ!0æbÀæã—¤¤t¤ôŒÔ/-'';'óƒ1’Ÿ»åÅCÀ˜)E>ewåfå¥\ÕDµ@uKE«Ê©‡ª÷¨¿ªUšFš9š‹·&¯¶£v¥öŽ6¬-¨ë¢[ª»¦óé}kýLý)ý/½© AÖg»Ój†Ön,…±2Tî󌇌Ï~£­lž†nGo¢¿Ð4J`Õ°îØdl#v{‰Ù°öï·»–ø`|.¾ ?–úwá)\E_nLt!†3ÿÙò>â,qXú‘øMØÁ”£ŒXi2f{¤7•2W2U6Uƒø× ­n¶'ZU sySIS1S!S>–mÕ˜8¦$ðÙSúS¼Nœßs™NŒ„\Ð:ÛÓËö˜°áïΧÀåçã#ñ®x.^Gð d•7Øel6Œ5ƒ*@%Ðßè]tº‚6F‹7Ûa 2.64æó3·®6Æš X†Èd52©`HHÿL¿[?¶m}L÷JwP7U×BW@Ó¾ÐîËz³!ûKÞRMwMYMBý²è ueµ@ýñÿ¼ù½r7xs%¼y›b ¢4xó=ù*yðf ª¦)²2žì™t´‹4Ô*9-™(©*I‰ï‰Š›gù¼IÔøüW¸_8HXL蜌”„ùçùøù4ï2o¯/Î½ÊÆ­Ás.s¦sªqâìëìiìªl†u‰5ŽUŽåÏœÌ ÏϸÒGÓCÒÓŽÔþTÿTþìh=“¦ä¯Ä¶D·’øßïׯßÅÖÄÚÆ±—Ì p)ó"º"Ú Ìù½’nE+Àœ×DZEÔ‘7áµáŽa}øKhG¨g¨@ˆ  –úÓàüåžú×ú;eû¨ðMðU÷q|Ͻë½=¼…¼~ÏUÏO;Éãt_rÏw·vçq;]—\‹\]E]´ó±s›s¸³–S夗Ë=åBÇ/ûeû  O-;bØžÙdûOT´©l^ë ëqëbë¨õKX%Våå¬e½e’¥+ð9¿ElñR€Ï©•ÀçžTSª"PQJÑ$E~‹=KîÍÒù_‹ò?s® ¾[èj å$ŸÌ˜i஘üœù“ù½ù­ù…ùÄKó+^›ßÁ{Ÿá³Ÿ0Æ?R‡²m2R›½­Y\¼Ù¼|,9›\En…|p|Nþ"=dŠTPy¨òT£ìió©mÔiê>õƒ S2Xò–Ö–¡––]P ¼·ø, k1k#k_ë\ëëmëkÒj°U‡­0ݶËvÏf¶ñí…í-ì#ììçí?ì,GÈmãÛN‡ÎYÓÙß¹ÜyÍùÇ)wUrõv-s]q™]*¨\F¹wºŸºƒîBžVžž@h¹·¶w´w¿÷—„„þèãûkøGú÷ù?ûåÜÀ”À© „nœ¼ô‹‡ú=iÂÍÁžoƒ=WŠŒŽ{&èÎôFú--6.Š>‰r˜ºÌLæeªÇÆÇ.Æü±²ñ±ñ3qO¼lbtâl—(—ž<•ô$ˤƤΦB©Jé é«édºVfFæn†ÅjÄZÀzÌ’°Û°×²?±õœžœ]ŠSLå(7À-Ǜ̻ÂKðjóòïóE‚‚5‚7½°ƒp›ð›õíYDÅÅ'ÄNqÉH8û\’²ÒáÒSRŸ´Œl¤ì„Ì%+þ|HNÉ (z(v(>)ÔÊ–Ê¥Ê{Ê´²šj‚ê$øsuõ*¨š9šÙþß4ZmCítp8J«Ó5ÑMþ®“éëêÇé÷êßèúHd!rüY`¨`èf˜o8fxgH ›Ç7oÍF1ZmŽAW£gзhÕa°vØXl vüù7–ÆP¼Þï‹OͶ0ßʶi¤p-‘CT—íL r.&¶‡‰+Ä#âX¯‹,“Ȥææ>—W7Õ15453µ2µ0µ5µ7µ1µƒÇ¶ðØÊÔÒÔ¢D5`vY°é.­Vdzm‰÷Ä3 õ9˜Ç&˜×4ðèž0ïêD1ÂHˆ€Ôd¶oÛÿZœãíðªx\އ°/Øì¶›ˆuÆjb&ŒƒÙÐÇè t):m–G•¨ßøÞxʸÌ8ÄØÈXÄÈ3þ2\5l2L4´33ð Kåþýê÷ÓOô{ô“õ­ôEÓ¯ÓtMu&]@ûH»E;X[C+ÕþÖœÖÌÒ´Ôäý¿«2 «iÕÕZUUq ûs²² 2 ¸¦X¨h§@äÇåäµäBùKÙ:YoYŽÌ!=)$­!åHŸIÖK:I‰Y|@ Ÿ V :´‚Ÿüü®Ùû'lçõæåáýæîâöææçš9»98y9¿Ù»Ø}ØyØ?XÛX=Yëgf{¦sF›ù’ÞîœÖýçÑÒÔ«ärðIòIbv¢A"¿Ÿ¯ÇnÄ&ÇjÄæ*3•©ÆÐÑ+ÑIÑ*Qš¾AO§kÑÉȽÈìH½/òÎÅ–aaøehU¨mHúÜì,tNÃ\=À <ô¯ô·ó£þ¿¾c¾1YN¿ônööóóÒž›žåžŽžü¯û†{‘»³;ÇrÝu­uõtUp¥¯œ{œ F§ÓqDZÁ1ÔQÇ8ìö‡öÍöÑöFö­¿‘šÿtöº¸f™Ëgö—ÀµÁ'Ù¾cB‡CBD¸}xEøq8®™¹ñdmz/Ø4í]}Õ2-™¥Ì3Fk6ý0Æ‹7Œ/Œß³õ ¢d“ä¢äã¤8Õ"µ"õ*¥L·K¯OL3Ý2{2³w]8Êr³Ê°Ç³/°v ÎlÎ}ŸÛ‚»’ûŽ«çuÉ^ÓQ?êN¿”`œà’ !¨#œ-| Ššˆ–‰^‰Tâvâµâ÷bDÒY²EòU‚I»KwJ¿K1Y7Ù¶lŒòõò·r•¢µb¹â±‚§¬«œ¦¼¬ +K©«öª¾«´êVêÅê;꨺”f f»æFt£= ý¢•êjêÆêöë¾êDújúÁúMúGú°¾Ò™‰E> \C)CWÃBÃIÃ'ËXÈØÌ8Þ¸Ùx ª}>Zm‹ŽG×£Ð("X¬ 6[‡Ì¶t°q⿞p³ñøqüþ÷à,B—½¶£Ñ‹ä\Iì!Ž—‰Äkâ'AK' °æNW5Õ4åšš¥[Ÿ;™ºš:ÃÐÕÔ%;t2u4uj7ƒ1Ñ«‚u—Ê^éa0I³=‘ÀÿÏàÕÿúÈís_JL"íˆzDYÂDHÕvÈ wñÓø6|>ïŒ×ʶy„±ÏØmì¶ êƒÞX.V“`ôz݈NE;£UQ#3~1^1n1N4v0–1*ŒNÃcÃ~ÃLCC5ƒÖà@ ;‘ Hk¤0ÂB>êOêé»èKê¹ú¯ºÓººnºR:Žî£ö¨vš¶©6¯Ö«¹£Y£éNÍÖ¼êgœº–Z¢þ¤:¨N-V}RTŽ…}+U¾UìR UTP$ä÷åËååy䨫¦ÊêÈIJ÷plô—–z$ç$S%5$<ÉSñjq[±^üM´]4PTT䞎VÒ‚k‚邺‚ XÂ|~¾ˆÿ”·œ×œ'ç½ä®à¶áª²½4Úr4œWìuàrö ÖŠl¹—™™YæyzUºYZš~–Z”j˜â¥î'ç$ë'ÙÉ»‰Y‰ê‰tüJ|f–ÖWb“b•b!æ23‘©ÌD¢£S¢•€Ö—éÉÙ«é®E¦FjD2á;áùá†aiøк5Ðú кO°`Ð8˜¨ÈøŸøWøÛgi}${åGÚûÌ»ÁÛÓ[ØëZ/ð´ñ»ûœ{–»¥uÛÁð¹:» ‚U?rnv”99Î9:º;Ê:ŽïöÓöeö^öJv…Ýf»kÛj›dkm+aÛlÖÖ]`šÿkõH[þXîZZ[†YZYʫӔzI]¤vP ©QT'ª>U’B)!$“/È;à¸ÛÀug‘£ÈÞ@ê†@ê’di$•@Ü¿ z²ŒþÇç6ýÈ|Ï|Ç|Ã|Ë|Í|5;Ü€¸ñÐüû£ù›™2Û³ÔN›E0#™Ÿ,AV!­Éî0—)@ì@ì‹ä#ò3i#c¤”"¨rTª,ß<àõ)àõO*BI,…-µ--“-+-Ç-aÍ’ÌZÅÚÞ:κÒzÊúÒê²JmEmͳ­Ò§l¯m›Æ^ÙÞÕ>Û¾×þÀî°Ë•¡*™ë8æxíˆ9ò:›:GÁÖ}àô8 ®º®‘®Í%ý.ÜÝÄ=Þ½ßýÚq—öt÷¬€ºÇíÁ¼M¼Ó¼'²=–ëÁ><èûì“úëøÇùúúÕÆ@ë k _°CpIðN0,÷_Û‡2ù0k&\.22rÌ:ÝÌú#­Îšõý(›©ÅÌ€£,ÊT‰MŒ]ˆcåâ£ã'âþxéĨĩ„?Q*9*y&L–KK]LÑ`ÖSþ3ëÙ™{˜õRÖ –œÝž½‘ý‘mâtçìá˜Á¬sOr}ÜòPs^ã%yuø³ùø|0ëe‚—˜õ&áW!.ê.Ú%ú#Ê7:(¶e/<$±IŠH‡JOHÒâ²Á²2‹¬€¼¯|§ü§UtP¬W¼RH”• ”·•Œ²¢jœí?U(ðz‘ú–:¬. <ئy£ádï ¶GûVËÕUÑ ÑmÑ=Ö%tÅôÝõKõõ”^ƒÔF†!›{ˆ 1êF6nlEöÃ9Æ#ƧF·Q‰VrÍDw¢·ÐŸ(ƒæÅªcݰéØìöˆÍÃóáUð6ø0|.¾?Äþ†»ñ ¸õ?b·!úcˆÄjb?q–¸E<%>fÂG$²¼FM9¦àÊ5MuMLÍÁ¡[ƒKw1õ6õ5õ3 0õ7õ€ÿ½M=MÝ€Úíáóf0^=0ìJ¦Òðݼ&½Ifb›ÈˆY¿>Jì$Öó‰É@ìD}¢ [ĶfÛAŽàëÁ®Gàðx!\ vý »ýÏ®«cÆÃ(ô)z]ŽFÛ€]kЀññœq½q¤±¥±(Øõà ÃÃ8CCÇð 9¬A!¹`×ý3ý~ý}s}~=­{¥Û­¯k®Ãu>°ëmÚ‘ÚÚZØõYÍ|M{M!M0{u^uquTõPµAÕWULUÞ»î®,ª )n(+Z(tŠ_PS‘W•gddkd]eùeNéé i})Oúìº{Ö®‹G‰Ë‰iÑ¿+ô‰„¢§Â•ÂÖB½ðƒ`› › Àü_ïo8¯$ÏË=ËÍ-ËõsÎqÆr*rÂìsàØ~Ö)ÖV–'s&3!S>ãOŸIJ—HûRÇSCSER–äÁä€dÁ$•8ÈIüïŽ÷ŽñŸ±í±ž±<±oÌv¦cb~DwD{D‰èOz݇ÎCÿŠì‹ôˆØÂ‡ÃCÃ¥ÃÁйЄP•P*x#8/Ø$( ¾¬täXü§àÌ®îgùŸùÖø:øòøÞóÞÞF^µ÷‡ç°gŒ§¦GìùàÞçé®é»¿ºŽ¸&»¹ .§ó†s¥³—³¬“çüà8é˜åèè(áÈØ?ÙO5öü?bï°Mb—µÉlëëaëBëkk!+ßj±<¾­°Œµt°ÔGå[<Ôêz¶z Õ‡jMU¥ QZ*MºÉ/ä3ò2y˜ÜB.%gMÈfÙ–dðc)&Y$c™]f‡Ù ýØýϬ?d[DÞ@¼Í¶ƒ|5ÿ²ÿkñ«fùÖ õ¿Öêº0ÕÎÙ¾3`N›ÀçÏ‘wÉw$I†Hv1ª:Õ†êGM¤–Q»¨óÔê7¥ä@ìº@ìÑ–%Ù¾_-Ál[HCë@ë<ënëMë7kŠڪٺڦضخؾے¶<öºöö`ØoìŒÝä¨Ê*Ç%Ç7 »µsŠóóµ3é,âjãšæ:èzåŠ»Š¸Û»çºOº¸ÅžJžžMž{¯Çämæé=åýíÕør}|G}?|*®¢ÿˆÿ70»Q`:dh{€¶® Þ &€ÙÃCû€ÙêpSÈé7ÃÑp`öáÉGw£7ÑoiE´Itaôn4­ÅLa.1a¦blLìLÌ+?wgï÷x,aOOŽLžLú’e³­!ÁTùô¤ôå4“®ž™ž¹•á²rY YÏX2vköö{6Æé–íñü¯5ä×Ë­ø³ëóç³E‚æ‚•‚×µ°³p‹ð‡0¯¨OöÞ=9âÀl»¸˜d¨ä¨Ä)))!=.uK‹É†ÉÉì²yù`6¦è¢Ø¤xŸ½ëã|¨žeÕ(ÕaÕ/`võJõ=u\]N3˜ýQ#ÐÖÒŽÕÔ~Ç®Ž}P÷IÇ×WÔ÷Ǿ§÷ëó ÍÉÈ~ä’F C}?ÝpÀðüÿzÜ­4ž7~3¦Œ…ÐFè0 Ø)ô9êG•X™l%ØAìöc0^ oŠ÷ÁgâkðCø-ü›K艢@ìÖDb"±Ø Ä>OÜÃþA¸‰‘"$Ùk§ÿ]Õ÷FÀâ¶àÕÝÎLCLÃM£L£M#MãLcaÏGÀ{ý² ïjj.^ÏTܼ¸©@öŠj!PÛEü%¾µo§`nëˆyÄ8˜{"—(ým1ŠÿÅßáW€Ú«ð)°¼ÍðòP°q7ö»ŒíÂæb±¶ÙëýÂèGô ä¨}ðjeïRñÇxݸË8ÅØÑXÁ(7º û s *©dPÜ`Ùû©`Ù…´þ‹þ,Xv/}9½DÿWwM·T×WWQ'ÓýÊÞO²³¶ˆ6®y®Ù©­©¯Qdï'9r-¡v©nª«:© «håå*e'ea¥WqY1[Ñ\aPXä§åSäõä2ù{Ù^ÙPYYTzS:_ÚJŠHIöÂ1SJßÏ×KůDëDE˜èw¶íº¸Ð+8'˜(¨&ˆñïÀ1˜Ëðòñšò¼§àÙ-¹rî;ðìÖç5{5x¶’ý޵–ÕŽ¥f½Ë¬Í´Ï(2oÒkÒÍÓ²ôóÔ2¨3Å©çÙVQöþiÂÄÃø¨K¹ñ±¹±ú1nì>³iÀp™ÇѥцQAô1½ŒnFKè—‘5‘¶Uä}xs¸GØþ çè€P±7x*81X#˜ ܬ´ hßüÛýƒü%üAß ß<_sâûã=âç­éxß{¶xyÊ{Rî'îÍîî n¶ûµk—k¸«–Kæúê<æœtÉq†Ï;c&GÈþȾÇ>ÞÞÊ^Äž±}³]°­»lh˱e¬_­W¬›­¬­­:+mùh¹fÙmYhdin)mÑZ’`­Á^7Só©aÙž%)#%È^‹ò𼦽\ ¦=L»Ù8{gµB$JªH.™Î¶]Ûͳ­oͯ²®}ß|×|Ý|3ëÛÿâ¼÷<ü•ùðü'„ ¾E›Sf°‡ PЬ¦Ý’ìIÊ^§²–Üó½I¾…e‘|JO¦jRÍ «L¦–S{²÷U³e{H—±4´tÏ^xì?×F­•ÀµÇXW[OZŸZ-V±­€­‘­¿m±í¨í¹ÍcSÛ+Ø;Ú§ÚwÛoÙ­v±£œ£“c†c¯ã‰ÃçÀœ¹àÚw6§ÖUÕ5ȵÆuÃeuiÝõÜ£Ü[aDÜ<­¡:áùå‘{ëxG{÷x_{¾JÿýΘôUò€½ûÆÏTŒ  üè‚-‚óƒ×ƒî`ñP¯ÐæÐË8\/<=|>ì  ˆì‰|¨é6ô"ú>¡kD'G/D}Ñ2Ù«±­LÁXïØÞØ·ïßÿ7&:&¶&¾&ŒÉÎÉ-ÉI4Õ)µ-õ%…§{¦w§¦ d¯ÇveJ°†€ŸxX娨—ÙQvuÎt·ۻ€ûŒ+âµä­â½á©ùù›ùßøy}{VAaápá!¡GXB4ZtF䕟‡Ä²W Ò’ Ò‰ÒóÒ ´‚l¬ì¤Ì#+&*? §äù=ÜJ ÷Bå]e È=BuDõWeR·U/WßVÇÔ¥4ýܯÀ¶«áíÕ~Ð uÕt#u[ÁÿR`Û]À¶ÿÝEH‡4@Æ#»‘gHÁ £À!ï\­±†±qØö[cÈhD« ÝÐ9è.ôúecù³=A¦b[± Øûì½/òãÕðvøðì½/Îgï}Ì^™] \·#1ˆ˜ìÞDv? >€k{Áµ9àÚ¸©°©œ©º©>¸%ØtO óÐ,³Ç™&˜¦dc “³ô$fãôÆ·Öÿ»z»Œ© LGc›RD€°»_@†8“½žå»ûíˆÚÀnœüþ¿ˆïÁ—áð~Yv£Ù; ½Â®b;±yÀîæ™´Ùþz×`ç ý²wb¡¿wÝ3] Ñƒ†W†ã†E†Þ†êÄàÏÞ³mÒ)…‘ŸPÉ,×÷ÕWÑËõ$°{MönRÝÏl¯NÚ¢Yvo׌ÔÔÒH4_ÕÇÕSÕMÔ˜Ú¦º Z j«Ê«r*/f¯b1*IÅ)ÅTEC…Zñöþ(0n–ü©l­¬»,ŸÌÆ=IZKÊ—¾”lt•˜$ñ1ñHqYqHtY4[”+’Š^× Û áÁ.AA…Œ»߯;ÅÁ+ÃósÏsÇq+rÜ œñœ*š}•=‰]•e]fMdUfE3—3“3•2‘ô¹ô„t…t u:5*U"eKJLJþMìIôH‰ïññîqSü{lG¬G ‹}a¶1„ùÝí5F?Ó;è^t~úOdo¤_¤ðÿÝß½ãP­+ôªäÖAmðK`g öÊí‹þéþzÙ«Y¶úzûŠû"Þ[ÞEÞV^ÌKzN{fxztž¿îSîiîfn£ÛêºàšçjëÊï :978‡;k:ÕNÒqÙ±ÂÑê|©Ãl¿j_mj¯g7Ùö7¶ã¶¶¶Z6ܲ~´^ޱ¶¦ýc÷`÷Îì݆š»u–E»Ïg¯gMu¡Pe(ØÉö£¾MžŽ®!ç“À¸;’MÉ:`ÜEH©#¥$›LA{€Åf°í@ï—@éÇÀê‡@ì‡YŠ?€×Ï!^ƒ{2÷þgÞasÒÌ#å0•íÚeÈÙ>"=!CL&ý×{ïX÷_2 ìF¨"`Ý­Ý“€Ýû¨«Àn;°[c)ÖÝÁ2ʲèÿ~”X‹dœm×þjX[E[ÛD°î¶_6–½€½1l«ö3ö÷ö„=¯£‘c„cãšã·Cì,ãìêœí<ì|çŒ; g­û€ë+á*êîê^à>ïþ™m×äÙè¹ï‰z {;xx/y=^ 2ð,ß)ŸÙ‡ø›ú§ùÏù­~,Ð.°(p3à v® > f‚ÕB£BÇBæî^~fEªE&DNEœ‘‚tOz3ý‘ÖD[<ˆò˜:ÌLæ:Ã0•bãbgc^°îñqo¼dbTâx™(‘œ<št&‹¥†¤N¦¼©Òé±P=ÒéŠPI^ÍÄ2UY3X·Y,vCöBöc¶˜ÓŒ³–ó†£åvänæ~ãb¼¾¼Ý<’W˜?Œ’ïåWŒ\D5…3„7„a]Ñ\Ñ_ÜX¼HüL,–4“,“<–¥¤K¥¤|YÙÙ=K^_>C~5{Ë8£ŠüÊžÊíÊJe¶§ÈuUPUR= Û·Z®©§™ õ¸ECh[/®hÚ|º¶ºº :§Õ7ÕO×ÑÓ‹ªÈd%r ±!C-Ã0ÃÚlßj¸eã<ãAã `7‚ÖD{ sѽè=ÔŠò±‚X¬?6XwØĤxQ<ïŠÃ—âðk`¶<ëˆÂDU¢9Ñ›IÌÉ^árޏM¼ëv ÁSFM…L¥MÁžsÝmÀ¸»›ú¹ÿÅXàõdàöT ÷Tx6Õ4è=Ì{°©°»ƒ©U¶•»°»„)¿Ik’›Ø¦0a!~oˆ[ÄYðîMÄ"b*1hO4%*ù %‘Èö¹…„ú`:>oƒWÁ ãbÜ‹}Áîb°ÅØh¬Vñ jFï¢ÇÐ¥è´Y¶¯µÓø,Û×zT$9Ƙá§á²a=d»†Â† ò9ÛqR1 ýãlŸ‘ú}L÷\·W7A×R—GÖ>ÖnÔŽÖÖÓjµ”æ¢f‘¦£¦¨&¦~©Þª¬®®æª?©ö«Æªj«dªïÊ}Ê1ÊÚJ¥ò›â°b‚¢šB¨x U×y99#»-[.k+Ãdfé  wµ,½×IºdÛK‰G‰+ˆã¢[¢y¢&"±è£p“°«þìýÞGù#ùeø~ÞIÞD^U^‚{ƒ;[ƒ›àÜäÌâÔçp9w٠صÙöÖ\V}›u733S'“IßIÏJ×IgRWSsRµR±äµä”d•d$q11)Q)‰Ÿ‹OŠ—Ó±‹± ±ò± s–ÃT`èè%p¤ŠÑ(}…žNW§S‘ë‘é‘Ú‘LøaxQ¸Yö˜­¡N!"ô;x 84X2 \ Ì 4ˆ¯üëü=ýyüvßYß_]ŸØ÷Á»Ý;Ä[Æó<ò¬óôòñDÜwÝ+ÜÝÜEÝ´ëkk «’‹ëúè<âœàlæ$œ~Ç}ÇFàN]‡Þá²ßËþÙžß·½·°-ÍÒÛhc¬¬ç­ë¬cÞ¥¬*kÀòÁrÁ²Ù2|µ>°On gï¹q”ZGM£R­€’…)9•"ä'ò>yž<<—m-iLV%KùI}¶¥ä_ûö?ç~ ¾}×|Í|Ù|Ê|Ò|Ì|({gã}æÝÙØiÞ ±^5Ÿ1_4_®?š¿7ÿ2Sf¯™ÉöÂÖ“ù`ÊÕÀ¿;’}³}H–“;É£`ßÏÉ?däA5PŒªCµ£†P3aYR7©O”ƒâY XjXÚY†Y@=ñß‹({Ç÷ÖÖ½Ö;Ö¿Ö´5/l‹î¶Y¶=¶{6Ò&€ú¤¥}Œ}ƒýšý·]à(áhç˜ìØåxèð‚{×v÷¾î­‚ZglùÛ.‡Kîýïs/Ü1waOgÏBÏ%åÑyx'zx¿x¥¾*¾á¾=¾÷>¿š”O¶_íÀ¸ÀQpou°ipNðJÐ,êÚz†k…'…O…áü‘‘­‘·Ý„^@ߢãtÅèØèɨ=Z„éÇìf~1x¬klsìS ‰·‹¯‹¿Ë-k¯²dËäªäˤ<Õ:µ*û»dûôºô»´>{]Ì· ÆêÉÚÉúÍÊÇîÇ>ȶ° s†pŽqlœÒ`5ç¹neÞ$Þ^’W›?›—Ï4,<H„-…«„o…ZQÑÑg*î*Þ*þ*Æ$Ý$;$ß$&iwéé7©QÖQ¶QöN¦–·–/—?• ¹Š¹Š›Š˜¢¼r”ò¨’TPk¯V=QqÔµÕãÕ'Õf5¦it¸© h h»iWhokCÚbº.ºº›:¯.¯¾~–þ8ð›TBúwnfù]ø½ÁpÃ`6HŒåŒ=s²=ýÂF-¸wwtºøýåa°ºàÞ3°MàÞo1oöžµ€ßcñå`µWðW8…Çpuö*ñ\¢1„˜A¬$vljkÄ3â+Aý×j‚‚5—2U6Õ·›îeêt Ž=É4Í4Ó4Û4b®iŽi¼š‘åøØ¬1õÖw†o54Õ„ PÊ”þ­4ñMQ â=ñ¸Lû^DL!]ˆÆKŠZ"‰»ñÏø=ü¾*…Ñx{¼d-Ãþ`±SØZl2¬[ÈQ"̾DO¢ëÑ)PyTA (müh¼dÜdole,a”­††½†™†Î† ‰Á[q2i‚ࣣ?¦Ÿ¯ï¦/©çé?ëNèfëÚèŠêRÚçÚ=Ù^˜Ö£¹¢Y£é£)£IªŸ«w¨G©k¨EêªCªñªº*©êKöÊZÙ»|îT VTP°ÏäkäÝääÙyÙ4Y®L&ûÇH/ia©GrQ2ERG‘<¯wâߢ¢¡¢¢ ð¢pš°¦0-¸ ÇÝ¿»Î?ç¯à·â«ùoxyxï w+˜ÊýÂÙÊéÊ1r¾°·³»² öOÖnV/V>ÖÏÌÞLßLÞÌ÷ô®ttžô×ÔöT÷žúšÜ–ì”Ä’Ÿ]†Äg¨XÛǵñ±M±Ž1]ì=³‘éÀh˜÷ÑõYÿþDo¥{Ðý3²;Ò'’ù>.v‡Î†Æ…ª‡’Á{ÁÅÁ–Ayðc`{ O PÀá?ãŸâ¯íúßø¶øú€û½×¼ó½­½Fï_Ï)Ï4OcüûLö7JÌít]v-quqs1ÎgÎmPÝ×sê²÷ü\íä¨åP:¬ö[öMööúö|ö˜í­í”m™­/P µÑÖOàßkÁ¿ÿ]5£¶q—-[,3-ý-¹–⥅¦~ÁOP©YÔPª=¼(¥¡¤›üJ>"/û²W1Ž'“]Á¾kƒ+ÿï7J.¸·LÚ’íEò¼ûžù&Pü’ù¼ùt–äÇÌ'²L? gàý‹ææÛ`å/€ùŸá[VÈQsÆ, U0ÅÂd9²Ùœì sš¾¿–ÜKžMþ$C@pUœªýÁÿÝãã:õŽrS ³”ÏöÒžfÙj¹hyi±Z¸Ö¼ÖjÖ.µÖ[OY_eï®TÊÖÊ6ƶþ¿û„"öªö¾öyöcö—v¯qÔvôs,vœÍ^a^ÜÙÂ9ѹ¶tÀ‰»ºÆºv¸ž¹B®ü°/¦»¸?¸9ž²žÞžÕž÷¶ðÎð÷þð*|5|c}û}|"Uÿ`ø{¿(P+06°/ð% ÖN žZ³w ]ºJ†ª„G…„ÿ„õ‘6‘呇6]ƒžL_¤}t‰èèþèh¦ ³‰y˨b­c+cÏbÒx“øâø“¸ Ñ ±4ñ0!J6H.ÌÞé£ajiêqJ–n•^•~•ÖeÚe6g¾Ãû²ö±(V öHöYvˆ]•3™s‡“âÔçÎç>áÊymxëxŸy(¿;ßÌÏ+*8(p Š G O ýÂr¢‰PíÆEÕÄSÅÅ)q8/H"’Š`Wç¤Ai9Ùèl?À×Ñì‘—ëm+/e}åTå¥GYDÕUµIõ\ÅUWSQRÿT+54S4'55zm}íÔlÛ·DWM7D·U÷XÕÔ·×ÏŠÐs‘’H'd6ry$‘<Ù6”M†k†¿.pª©q„qµñŒñµ1hT åÐÖèht9˜é}Ô‚&Q=Vk 6>[ƒÅî`Ÿ0ÆÁ5xq¼:Þ ïÂgãëðíøiü6þÿ‚“¸gBC``ÄEˆÒD%¢QøÚ‚èуèIô"úýÁ›‡àq01þ‚÷ú݈D¢%ѨKT&ÊʼnBOȈ4Η™Ÿâ7ð³ø~|¾Ÿ‚Æ;ãñªxA\™½ÃýOì)vÛ…-Ã&aý°æXi Ãx˜ }^Aw¡‹Ñh´:š€m¿4ž3n4N6v3V3âÆŒáá®aŸa¾¡—¡¶ÁdH#?‘«Èd<Ò)ˆRG¿#ÛO»ˆž­ÿ©;§[ [º–Õ¹µ´»µ“´-µµQÍ+Í!Í$MKM>MXý${c}µFmS]S-ƒ=XV•Q~óž¬l¨Ô)IÅEÅ|E{E~…O~ ÈÝ]^\•Ý—­—õ—•’Å¥¥€Ý%¤ÉCÉrIWI~‰G|AKÏ ÐJúKd_dT¤F„yÞ.N„†6„ú„J…Á§Á ÁÁ²Átày`g`x F@øá?éŸéoåÏï÷úîûÖù†øªùd¾?ÞËÞ%Þ¾ÞÊ^…×ì¹æYåâ©åÑ{¼î§îÝî™îöîòn™ÛîºçÚãšáêž®s…œœçœë㜜Uœ¨3îøé¸ë8ìX ÆÞÖQÕ‘Ï!kÿd¿i?j_mŸnïoog¯n/d×ÙÓ6í‡í‰íªíˆm+d™¶á¶>¶¶¶\[%[ [›Î&°e¬a`¢ÕúÝúèø,÷ªõ¢õ4Äë!ëðÞÝÖÖí;`Ø ¯÷À»¬GaŒsÖKÖÖ»ð­Ö7ÖoÖ?VL-nÚÔ6ÜVØVÎVÓÖÈÖÎÖ æ;êˆÍ¶ý¶‹¶‡¶`ÎQߎڋÛkÙ[ÛاÙWÚwÚÏÙÙÿØ£v‰#?¬WkÈg3¡.9éxâøãH9Pg9gç@çlçVçEç§Ç)vråºú¸f•¯¹¾»b.Ì]ÍÝÕ=ŽÅ}ÍýÅrçñÔó ð,ðö<óx=JoEo ô>ï#¯Ç«Ïîå›ç;ê{ãc|yü ý#ýý·ü¿"P!Ð3°$p.ð#À–ö€œ}&ø3( •‡=¾4t1D†Ô`Ý#Â;ÂO‘p¾HËÈ´ÈñÈ÷ˆ®B¦7Ñiš.í]½µE LfsœùÎ(buccbûbŸc¢xµøˆønppn¢jbXbgâ]‚—¬–‘Ü—|Ÿ§j¤Æ¤¦¾Åë±|"ý7dšC•y!ãȘX­X‹X×Y~VAvöjövœ]š3³…ó’ÃæVåãîå~àJx5yx‡x?xj~cþdþIþ¾ìhºà´à¯@'l&œ)<+¤„ˆ¨±hšè„è‡H%΋%•%C$[$$QIaigééYéo©BVC6X¶IvOæ“¡òÆòñòmòGrŸW4PŒTlRÜPØre%ewååå eXiPÕRõS-QîTjuEu'õõõUõwuRkªiºBب9¯y­qk$Ú"Pùw­Óž&ýÐFµr]a]m]'ÝPð˺#`÷ou”.®“êóéËèëé;êé'ëé7ë÷ëÏá^ê¿è-ú>©!z$R)ƒTCê"Í‚‘ÞÈd2™ŒLCæ"‹ÅÈrd²Y±YÏVðW!KáÓ¹³IÈXd82é‹tGÚ#-ÆHM¤2R É`ˆ რô”þ³þ©þ†þ´~Ÿ~“~±~š~”¾°¶¦¾œ>^¡OꜺϺ‡ºóº]ºUºéºÁºöº:º:.­µißkoik7Àš÷Õ6ӖѵMóBsA³]3G3HÓBS^ƒhRjRýX}\½˜Ü^]E©“ªßª{ªªùªªFª*¾ŠR>PîWÎWöSÖUæU&?›“ —QÈù=ù.ùty'y9¹Lî”Ý–m‘M’µV efé5é:é0ii^iXòVrX2WÒ]RV"’ü_¯÷W«ÄVÑ5Ñ&°î:"Tä>nŽÖêÝ÷›Àê tÿ&5¿*_ÊÿÅ;Ç[ÊëÆ+ÅcÃr§q[rósÜGœmœáœ:‡b_d/a÷`—f'YXXSXYË›¹YŸéŸ©’e¾¥O¥g¤;¤ ¦éÔ0ó‘©:)mÊ’¼œ\–ì•,“dƒŸIÌH´HäK„ãâ[ã#ãõãHÜ»[«SÝ/2K™L%FÂü…³ry´´bTµÒ×éuôPº>Ð~ð®Ý‘I‘Ö‘"‘TøkøLxyx@¸vØö‡^‡‡@Å]3„…ÁwÁSÁåÁÁÁ†ÁAVиؘèÈ äð”ÿ¡ÿ°©ð¿‚ñ'|?}÷€3+||Ý|u|…} _,ñ±÷”w£w¶w¸·“·–·¤Wçåx½žožÇž³ž}žµž¹žÑž^ž6!ÊxòzTއvÛÝßܯÝwÝ—Ü'ÝûÝÛÜ+Ü‹ÁD'¸‡¹û»»¹Ûº›»sݵܕÝåÜ¥ÜÜÝyܨqkÜ*È+r™[ ¡p‹³ÏdJ·Ú­…qP7á6Á7J¸K»+Gk»º[¸;¹»À”‡¹ÇÃ\º×Y÷Ü/üšÝ~wÚ-ñ ž‚žŠžÚžVžîžaž©ž%ž-žCßžÃÚx~ö…U‘ ‘ö°·E®¯S‘:—D/£OÐoéGkDûµF_FýQ#SƒéÃ,aN2ï†Ék[»ûãÆKÆÛƧÅ÷â†D½ÄàĚĵğ„ Y:Ù-9'y(žHNµJMKíM=KERyÒMÒãÒ;ÓÒ¾4žÉÍŒ+˜qg ¬ú¬á¬M¬Û,'KË®ÍÊ^ϾÁ¶²5œšœœÕà;$GÊ­ÂíÉ]Ì=ÇýÁðJóºóæñŽò>òR¼¢ü6üi`KOù>*È l\¾K…e…]„³…‡…Ï…A!&ª+,Z.:/ú Ÿ#n(&^!>/þ(fÄy$õ$$K$Ç$Ï%^‰JZNÚQ:¼í¼ôƒ4"ÕÉÊËÚËÆÉրݿ”9dy޼®¼·|²|ƒüŒü¹Ü&ç*EEEkÅPÅÅVÅYÅ3ÅoET¡RQÖP¶SQÎT®WR^S¾Vš•¥@…ªJ¨j«Z©úªÆ¨f©Ö«ö©N«n@~ø¢²ª"*¶Z¡FÕEÔåÕ5ÕÍ€r½ÔCÔãÔÓÕ³zëÕ;ÔÔÇÔgÕÕ7Õw…/ÔoÔÕŸÕ¿!̶l8Õµ lxî‚WvµØù²Î/õõøÖ õCõõ õ%õiõõ>õ&õõ2õ<˜Ó˜cu;u u=`l)u~5¢©3ª ÊËøLuKu–yj¡j¢j°ª‹ª±ªºª˜Ê¨«h¥UùNyGyF¹[¹Z9]9LÙIÙHYA™G)S2 ‹ââ¦â¸bl§aŠÎŠ:Š’ DÁV8åäwä‡äëåÓäýäÍå东 'ê{Ù5Ù>ÙbÙØþ5deR™_úYzCº[ºX:BÚFZAj¦%$%Ç%«%$%5%„„-±Š‹ˆ—‰GŠ[ŠËŠÕâ°è“èªh‹hª¨‡¨¶((#ü%¼'ÜÇF_ w>!Kø[pK°G0[ÐKPC€ âü/ü+üMü üü2|%ßÃ{ÇÚÞ ^}^~^Šû{…»;žÛ–[Š+áÚ88{8³8Ý8U8Ž—ý‚}”½€ÝŽcŒM³Þ±N²–°ú³rèÑÌÇÌ™ÌÊÌÐL£L¾L:ý5})½6="Ý,]8ÍJÿL]KmIOµNK RdòNr[rr²#Ð]‘t%ž&'æ%ú%j'°D,þ9~!¾&>&Þ"^".Œ[bbbób½c5cx,Á|e.3[˜IL{`½ž‰D?í×G'F;E+EQ†þJ_£·Óséþt#º(-¡=‘w‘ ‘-‘™‘~‘F‘u„ ß  ¯ O ÷ 7 — kÃqp¾¡ ¡Ý¡E¡q¡n¡†¡2!<$Á /÷Wg‡;*BVÐ3@àOàMà^àl`o`C`Q` Ô=m!KT  ä ¨¢@Âð;ü¿üüÏ k\ó_ðñïñoó¯õ/÷/ôÏòOóOðöõò÷ö÷òwñ·÷·ƒ¬ÒÂßÔߢD=ˆºÙÇ‘ ÛÈߨßÜßÒ߯îÑÛßÏ?²ÑH˜Ö4˜æ"ÿ2 êvÿnÈRgü—Àyûßø¿cþˆ?åÁ’Âòš&Þ‘IyµPÝ \ < ¼ P_ MÁÁÁ¦Áî°îÓ!'î Þ ¾ þ úƒì6TxÜ2Ô34&4/´)t$t=ô*D…¢Àå|á*á&áÞáñáeá]áKá§a3¸´ÄB1U¼L¼9Ô~‹¡¼ÿÏÄM‰j‰î‰É‰-‰K‰‰pB G]Ûä¨äªä‰ä³¤+)OM5M I-MI=MYR¢tÑt£ôô’ôáô³´5-ÎË4Ë Ë,ÏË<Ë83V V ÖÖ*ÖqÖ+–¥f—g·ceo`Ÿg¿e‡Ø:NNGÎxÎFÎEÎGÍA¸¹¹“¸›¸—¸Ÿ¹a®W×Ü}#ïï/þ^(?š¿’Œÿœoçó9‚º‚>‚¹‚í‚«‚o‚ @-,>?T¸@¸[x]øEªDEE D}Áì7‰N‰žŠ(QJ¤4›!^'>!~$þ&ƒéç“Ô´– ”Ì’¬•‘Ü”¼—8$,©JZXZ]ÚRÚrÁBévé émé;é_iP*”édEdUde ˜$[Õþ~Ù9ÙMÙ Ùo™M‘qäJ¹I^\^2E3p;òáò‰òyòEòµò-ò}òãòsò+ò»ò'ò×òòoò¿r‡Ü)÷ËCrFž–³…H!U¨j…V¡S’X6L \f ¼o„±T 9Œ-PðyBNÃT¼•þ@|”¿ƒ õP~K~ rÕ1ù~ùùFùrX’9òqòa@Ûnò6ò†òjò²ÕP¹BΓGeÙ_ÙgÙ3XŸ3²ƒ²Í²å²YÿȺÀו•å•)e,Y@JIßJïK/HH7‘ÇI‡HÛIJË‚=Ë¥)؆ߠzº$Ù[u†d4鱤lk©$&&ÅoÅ7ÄÇÄÄóÄÃÅ=ÅõÅeÄ1Wì}݆Jl“h®h˜¨½¨†¨¸H!Š ÍÂÂKÂ=°wÇ ;³‹ 5ˆ€Áçð]¼—pmçÍå ä5ç•᡼÷÷!÷8w%P¼·ø¸ëâ¼âœãlçLçôâÔçæ坨Ø[Ø3Ø=Ù¹ìlÛ Góy0•é¬^¬º¬Â,Ë“y›¹˜Ù”™•é“©›)’‘dÜéwé é­é™é¾é†éâiq:˜zŸº Ö>75(ÕÌŒ‰vŒÖŠ–ŒbQnÔOÿ¤ŸÓWèƒ`þóè1t/º].Fã´€ŽF,‘‘G‘K‘C–A]?2Ò*‚†‘ò‘¢,"°#á°-ü+ü6ü(|=|2¼/¼ìrQxzxlx(ð¬c¸U¸q¸V¸äBáœ0Ö„%a~8Š…!Ȳ†~‡~†>A¼„œò$ô(t?t't+t3t-t5t%t òÌåÐ9x<Ÿ}¼ºï]÷®?¯…î†n‡„Ã7_†Þ„Þ‡¾…¾‡~…Ì!;Ä¿¿X(À<5a=P¶P¸t¸B¸F¸xp›p7¨h†sg†B~Û>kp%|Üøcøwئìˆ"‚D EÊFjEšD:FúDFÃVXÙÙ9¹ Dþ±G˜ŸÖÓùèJt=º ݇MÏ¢×Ð;è3ôMú l_?¦ÕÑ|ÑòÀèŽPkM«Þœ¾}¥¢á¨„Á˜RL=ÈÒƒ˜iÌ f?syÊüd‚ '†ÅJÅrcÁ¶gÇ6ÇŽÆîÄ>ÅÜ1TtÅãuãâÃâsâ›ãÇãâ_À¾… S¢3}S«7á®?‰%Ë'›'$§&×?H~O’ÒTNªFªCjXjqjwêJêmÊ•b¥ñtÅt‹ôÀôìô–ôùôÓ´%N#™rÀôþ™™ptŸÌ<ÉüÍÄ3«Ô¦ýX3à8ÍzÂ2³’`ìeØÙ}ÙÓî'ÙOØfvø^’Ó„Ó—3³žsœóó¯â–à6‡ŸÀ]Å=̽ÇýÊ p%¼‚¼Ú@úѼż=¼+¼·<+Å7ðËòó{ñÇóWð÷ñ¯Âmã§øZAQA-AGðûÙ‚ ‚#`loAR Vö÷6,€jüðÿ•ð8?OdU5ï%š%Z%Ú%: |y)ú.r‹"‰WçŠ[‹{A=0E¼P¼V¼¸tQ|Gü\üElûÄQ1["—€\E%e S4´”tô„Ša8ç É|ÉR°Ï’m@ºÃ’S’ó’«CîKžH^H^JÞI>¿I~KÌRb‘Ø$v‰ •†"(ñÁð¿ðÁ{>‰>uÀxˆß`·ß$_%a:/¡:y,¹'¹%¹T=Î{X²W²S²I²N²L²H2S2E2V2LÒ–­½¤•¤‘¤Ž¤²¤¬¤ˆ$/,½B"”$űCüKüIüL|O|E|F¼_¼M¼J¼@`ϧè³èÍè™è¡èÖèÊè< Óp°ÈÎÑfÑzѪÑ2Ñ‚P%¨£â(+¦}´•þA¢=£ïÑ7èKôIú½ê‡MôZz½€žÜ›FO„,2šJ¡ÑýÀS»Ó]éNèvm-éVešÃТyöuø¤-ÝÆèBw¦»Á·zÁ·ûÃtFÐ#é±ôx˜òt¨TÐKèUôzz ½ÞG¢e/Ò·é;°Toè/@[ŠvÐ^:NghaTE¢ya-JA½S;Ú8Ú:Ú-Ú;:4:²à¢èêèŽèþèÉè•èÝèKØ£Ž(e1aò3e™ªL#¦-Ó Ô\fäÔÌiæ&°ù+CÂ6N0¢+«[¾Y¬klplRl~l}lwìLìFìyì[Ì‹Æxq}¼p¼B<ö_ÿø(àõÚøžø™øíøÛøÏ¸œ[™È›(ÈM´MôOŒMÌO¬KJ\N%LE’¶ä—äãäÕä‘äŽäÒäôäèd/8ë$Ë%ó%5IA2gö—ÄóÄÄ©Ä>8ß$&$†%º%Z&êý $à*î“ñÏññ[ñóPŸo‰¯ŠÏOŒ÷Ž·7Ž×¦‹q äƒd,sÆþÄ>Æ^BV¸ ü9uÁúØŠØÜØÔØøØX_àS; TýX­X¥XéX‘X>pK5d AŒ‹34`œŒòÆwæóžyÉ<†¸ËÜb®0— œbN0‡™ƒà¦{™Ì6ˆMë!V3« V@,ÏÆ å2fi6–óåÙÏVC¬…XÏl`6I·3»˜ÝöÃTÀ´ÏÀ<®0Wa~w ~yμ`ÞÁr| 636X2?Þ²b˜ –Ú3AµSÖ£r¬*¬S“XëXÇXX?XÓ±±ÉçÇ–Ç6ĶÆö3ŸŽ]ŽÝŠ=†mó1ö3fybt,\VÆñ|ñ°kÄÄ[Å»Äû‚OOˆÏŠ/НŸ_‡ºëmüGÜÆSpºiÀ°K$*&ê$Z@®¼ž™XšØ˜Ø›8‘¸žxxŸøÆÍ$°ŸMÉɪɆÉöÉÞÉQõ'7$÷%Ï$o%_ÀñaKF’ì”2•'U*U <¡ E 2\“Ú™:‘º–z–ú’²§¢)NZ fQ6]'Ý2Ý3="=#½,½=}4}ìüCÚ–¦Ó<ð‘™ò™ú™v™¾™1à)«2»ÁÔog^e~d<™dFÆ"X%XÕXMYÝXCXSY‹Y›YGXWXXŸX+Ìâ²µà@åÙõÙíØ½Ùcس٫Ù;á̺Á~ÁþÆv°¶c€J¸'—ÓŽÓ›3š3‹³‚³s”s…óˆó‘cæ8Žœ‹q‹p+spÛr{sGr§r—p×s÷rOs¯qŸp?rÿr½ÜWÈÓðòóŠûsy­€þÁùg‚õ¯åíäáåÝæ=ûÿÁ³ð|<†ÇæË äá…J *?—ߜߞß?€? ²Âtþ"þJþÿkÏ<£¥(º¶]Ý=3äC‰*ˆ‚¢˜PPAA¢¨ ‚‚`BɈJ H•`Q’QrF ÉI8d‰"™3ÓÝõ^µ»gÎñy}Ö»¾ôã[ë9÷ªîžé™žêªÚ×¾wŸ¢¢Ó¢_FçG—F¿‹þˆƒÜIŽ8==½Lµ‰eå‹"_\+»šÝ«»ÌQ'V?öHìñX“X³XËØ³±V±cmcbc]á_wÔõ‹õ ˆ Dƒbo¡!hXl(”Î~˜h(2gó¹7ѨßîëÁµºát;“¥ÚÇZóÏñ[-cOò»bõP-úr/œ½ÝHmS&V?\$–Ë‹ÆT,Î}œFG¢éÑÑ-Ñ ÑuÑÑeäÃ/£3¢“Èc¢Ã£ƒ¢ý¢Ý£/G;DŸ>Å(5ˆÖÄ=ß½*—ŒŒæŠ:Q/r6r2r0² :ÿYYùG=>2:2”ü*”~!ò³R7rO¤r¤B¤T¤p$gD;WœãÎAg»³ÁYí,rf:Ó±ÔnN'çç §Sƒ<“SÖ)‚ó¶œKö)*½­öÏøïy8ð ö({ˆÝËîj¿`?i7°`%U°‹ÃqÛ¾ÌúJ·~£^\dÍÆWŒ±ãË;XÏXYu¬ªÖÍVIVgÌÊP§UºÚF­¹P͆êcÔ ÕSµÇ©4Vª»UyÖx>¥ÔE|̽A¯Ösõ =N¿­ûé.º•n¦ëêût%]†hɦ¯øgüþ&q4ËŸˆ‹è÷ô;aüš~ÿ&*áü~Ä¿LU¼ÇÛíy3½IÞ(ï-¯·÷’÷•s=¯Þë:¯˜—Û³½Ëî17ÝÝ÷—»sÝéî§î(÷-ØßÅm ýºuÜêî­î P¡ ›ËÕ‰K‰S‰ƒ‰=‰Í8½eø½™d‚ñä‚a‰‰‰—íÏ&žL4JÔKÔJT!+ܘ({ %ò$r$T"¿?ÿ#~8¾+¾=¾1þœZ__€³œŸ†ÃFÇß‹‡fɽã=a[·øËñNñ¶d‘çÑ3è)ôDüÉx²Jc<ꣴGÐÃÒÄ¢™­Ù×ãl}y÷QÔöŸnÌw›Òž‚ -â-ÉOÏÆ_Äë¶ãW^Âñvwá·{Æûâ}ߤ7ÃèÓ(ú6–ND_Ä? kçÇ—ÄWÅWÇ$çmŠo‹ïîþ?ýfÄýx4‘=‘/Q8Q2qM¢|¢B¢rân8\+ÑçÜ<ÑwJtKôLôÇCLŒI|’ø *XœX‘ø1±‘Œ»/qLèì%¢nš[Ä-í–FWwë»Ü§Ü–nGæ«7.û|ö$fñk²ø÷ðz~û¤{ÎM¸Q˜]ŒY¿‘|¿÷ר{Æ{ÁëêõñÃîqÞgÞœÁïø}À;í]ô"Ô……ýkýŠ~eÖÖCx‰V~g\Å`ÿmH> _¾Ô_ëÿæïõøç}ßÏ© ³J+àÐÔè§t˜ÞŸ>ªÏÒóõ*ý#îå>¥3tD¥©ê:u+Þ¦®j¤ZªUÕW V£qï_PÏ® bvPÛžR—•²òX% }%⪎ÕÈjaµµ^µúZì¬ ÖLªâUxªÖA|ý˶ó£†ú÷صí¦öSv;ûjé·ì‘°š=Ç^l¯Á£m·Ø'ìKd€N§$¨äTqjB…ÆNK§Œèáôw†9#‰Ðc.UÀj¼ß&*÷tÈò|ÑN,’Ú”!7T‚>5¨ðD£Ò:Ò*Ò&Ò9Ò-Ò‹L182 ^ŽŒ#_LÁ_΂aó"ó#KÉßGÖB¶ŸÉÛ";"{p¡é‘Ãd’ã‘‘ÓèBä¯ÈEDòø‘DD#µ¢‘¨ÍcÑh4;6GزK‹qá¬-² ¨ù®Ë5â‘óT+¡Spõ:]ÓÉ^»#;#[¨f~¡7ëéתÈòÈô5½ý"2=212‰;xŸºgXdPäMîìµÈ+TB­#ÏGšÃàÆ‘G pÍH5òd¥ÈM‘ðÍ%#E#i(ñ ç‚sš±Kwv;[_õBæ…äÚéŒñ8òî;T\ýœžÎ+N{§•Ó J?Bf®§oqÊ㱋1W9`uœÜ}Ê>lï¶7Û?ᷗḿÀsƒÙÃì¾Pû»ýŒý„ý°]‡•P™j¯Œ]ÌÎog·-ûŠuÊ:býnm²~²VX ¬¯¬©øñ1ÖP«¿ÕÓêhµÆ•?fÕ³ª[wX7²ò®²òYËÃsü¡öã>~Æ£/Ä¥OS«QTœ}©;;©çÔÔ 5Õ½êUVWùñì¾¾ OêƒÔ©¿è5z1tŸ¦ÇCá{wÝçÓœh©EÔܦoÐ¥tœ¼Ò—ýÓDÕ.œÒ:¥?ÏŸéOñÇúï{}üWývÔÆMý†Då}þmþõþÕÄi.¨ŸðÎyǽƒÞvo“·Î[A<ÏÁëOôÆPaöÞðº{¯xm¼çñl!ÀƒÞ}^eï&Üiï*/Ÿ—“lp/¸§ñxû!ÇV÷gw®o±û;ËæNp? ¾ãußtûº¯º¯@ÖxÄnS·±û°[Ï}"ÝãÞåÞâÞ ¡ÊºW»% U!7¯›ÃÍæF\Ëõ—É çgÉ"'G‡É%ûÈ&»ÛÛ`ݦÄ/Ô?&~H¬Å•®N¬J¬L,Ç¡.M,J,IÌO, ÍK|‹¾IÌ…‘ß$æÐ¾JM›ËÑ·lç¡´…È|{)ùj%Z•øž«¯•_ù…ßÜŒ¶CÙ=‰½‰ôç´=•8MÏÓÛDÂMX®ãfwsÂÞna·¸[’z¨wX‘Ìx—[• ©¦[×m@¶lâ6sŸv_pÛ¹/¹]Ýžîënw°;Ü —Ç3‚ÓÜÙîw»ÌýŽŒû‹»™qÞïÑgÝ+®v#ää^q¯”WŽ™¹‡]ƒ|ÝÐ{Z·ö:ã´ûz½Ìè8o²÷¹7—9^á­'Óo÷öRßòÎ{.ž÷]ÿ}£‡_ïï7ö›³jÚû]ü^þ>Šõ4?þ­¿Ä_ãÿìoñ÷ù§ ¹‡3Ï¥‹è«uy}«®¢ÐõpèÍY©õ«}>ýC˜>]ÍzþNÿ¤·à×ë?õeíë콘ºVUP·µUÕ”¶ •lw5@ ƒï㉚Ùê[µ ÿ›0þ¸úKÅ•måÂ1]m]gU¤®Nô5´šáëÛZ]pVý¡ý(kNk¦5×Zb}gýˆûÚaí·ŽYg¬Ë–¶bv»°]ʾŽH¿ˆ¯n×·ÿOãÞ:Ø!B_{°=œª|¬ý‰=ÕžiϵÚËaÇz{#®o·½ŒpÒ>CNÈ +DàL>júâNi§Œs=>ñ6ççXTÓ©í<ä4DO8ͧçp“íœÎËN§Yãu§¯ÓÇy r†PMŒp†ã;ßC£ ÜÎh|èXh÷±3Þù”6Ñ™àLB“©OEÓÐt45ÜÏ`?ƒW3y=-Ë'¦:ShØNæœO¸æ84ÖùÐùˆß{?üíáhè pÞpz£žÔ:]éó+T=¸ƒ6ÎóÎ3ÜOsçIçqôª}k8Õ{©ng*BárÎuŒÊUNQF'QÊæØŽg'ì ÂäÔUéö^ò벬aóJ{©½>ςГû±öû=(=Ðîc÷´»ÙÈЭ¨Ï𨠭döî¶+áµËÚ¥…Ùi¶ck˳Î[Yç·¶’ñ×Yß[K¡÷—Ö4ë3k¼õ¡5ÂÂJé…;0 šõó(Ž¡–u¯UٺźÕUÔÊoå´+¡.â-Cój“úž/Rsp“!ú5B½‰Kï®:âKZ²‚àÕ«©Êp½œ*­Š¨\*ž=CŸÑ'ô½ ºoÐkõ ½€˜˜ª§è±zŒ®-]ugý¢~Z?¡Óõuu}/œ¯¨ËAú¢:ή- æþôú{üþF"ñ;™¿ÀÿÒŸáOò?öGû#ü¡Pÿu¿+UtÿYÿ)ÿ1ÿaÿA¿:~ÿvÿf¿¬ ±^ØOósøŽïzWȧ¼£ä½Þfo‹·\°Ê[æ-$ÌöfÀO½¼÷¡ÈÛÞ ¯?°‡÷µAG¯­×Š ¡9ù¡¡×ˆ Q‡ñ€d‰ÊT 7C¤rÞ d‹«½xÉB*ÍËååð²{1r‡ò,/§yŽD9ÑN»§Üè¸{”œrÀ=ä„véî^wŸ»;Ô.w'ÛmîÑ6´=Ëvg·ÊÙà»h;Ùîæ¿s¥}\ï{‚¥Ž9Æ/þéžá·Ï»îeú⻊žE¼lô1§—‡þDÅÈw%¸‹2øá¸«›¼[¸¿;¼*¨:î¸w^×{5Fͼâ•_ô:Aà.ŒUOÆì 2êPo™u´÷¡Ðø3o:µÖ—Þ7Þ|o)Tþ.ÿ ™7{»¼ß½tfä8¾ú¬wÙKxFg÷óøü«˜»«Éáü[auU2z ¿®ß€9nâ·ðŸó_¤ºë쿵ûùƒX ï±"ÆùŸÂîÏY#óü…øƒ5þO¬œ-¬ tÿÿ„ֿ컾Ãêʇ'/É˱æ ËïÃi<¤e5¶¤¶l§_†è½ô\ú;¬Øñz«w¶þV/Ñ+õ:ý³Þ¬wë}ú(æ<®ÝÓÙXùáû5ÄÁêUU=ãVMÔ“êy(ÿ.þuÕÿQô±š f¨/Õ7j™Z í7¨-j—Ú§Žyç!¾ee·r[…­âÖ5ÖõÄçøûšV]b¶)¿ÜÙêJ4÷µYo[ïàöÇY“ˆõYÖkžµ׿V²ÀVòÀ>ë™à´uŽ\aYð";ù €]ľ †”¡¨`ßbßIUPÕ®F%_Ë®kµ§Bhn·„>­ìíövGûe» Lêi÷ fèg÷‡Ro‘5†C¬‘xË1ö‡xL“A>µ'Ø“àÙTû3{†=¶Í²gÛ_¡9d–oDóвÌ{ZB[Ìv <4Z,ÛàõÑâP‹ìù|g|ÿ[ŽçÚ_sÕ9\{6úœßšA%c~y }˜@_Æ¡èÛ(òÛ{ö»ö;ðu(ùný&wÑ{ée¿Æ}uáþ:‘Ûr¿Ïs×-¸û¦¨cÑ€ŒYÇ®i×°ïe”ª0V•ì›É¦åÈ©WÛ%ÉÂŒh;‡ÃC{Vœ±>˘·“‡÷0 ›¬ ÌÈ÷ÖJ¸<Ÿ<=Ûú2O²>†Í£ ó0k |~Ýêaucn;0ÃÏ[-ñÚM˜óº†uŸu·u;•Þ¬ˆ2Vi«¤UÄJc•ÄÄgàÀϪ“¸ðƒ¬£j›ú/¾N­f…-TsÕWês5UMdå}„/†3€7ï‰;Iµ‡åϪÐü1x^[|z\J%UžJ´4«º°Ê«r«d÷ñ2çq4ǨW÷ëð}#>g^ãYã¿Ò3ôgú=N GBúAÄPb©+©­~A?£›é&øú‡tmüS5}7Ñw3þ¾,Ü/® áòsël°ß÷3üKÐÿnÿ •´qü›ü þþ÷þ œÙÿkôÕödb~¬ÿ¡äƒaÔÈ =àBWÿ%ê¶ÔæÏÁ‹fP£‘ÿ~ïAªƒêþ½þ]Tï·ú•p‚×û×áKù%É…ýüÐ'—#cؾ‘®PñŸƒN§Ðqœäa´ß;@Ù ¿và/·K6Ùˆ~!§üÛ~ðÖŠÖÐVz«É2«½å-ckÚRo Zê-b»8ÔB^/Niç–ñÎ2!¦ùî ÚJ¹Òw´5rýuüÚzùÅ òû¿ÑÍÞVzµƒ¾íAûèë~éóQï„wÌ; iÿâ~. Ë^O¬=‹{ú†»¹¸÷4rA¡oIø{-Y´< ®ÈHÝæßɨU×ôk3– ¨µ2²O’{[â¢[‘‡;øñÒݘƒÞ~_¿?32Ôî¿ëôß'kÂ|BÏö¿bþø‹ýåþjæt=œ6¤Þ «÷ã·BëÓþ9ÿ"ëÀ;ªsê4VÇU¬’R¬–ëáv%}§¾Kßjëº!ëê)ÝOÑV¿Äz{M¿Îê{“58‚ªrœþTœùzŽþF/dµ®Ñßë©=7ëízÞ«°¦Oësú’¾¢me±Ús²ê ±úÍó˜ÔÍDDeu—ªê'ˆ—§pð­ {GõŠz Wô†~˜ ã?T㈷ÏàülêaCúÅ8ûµê'hÿ›ÚLŒîÆá&b¹gÕ%bØÃëÇP+/Ž¿(1^×UÁºÙº•è¿ T³î‡µ©ê[©šZO’ž†Ï[m¬vV'ë%êSô$?ôµ@–!Ö[Öp(3ÒM®xßúîL`;M'oÌ$s|…[œk}m-Â7.BK­eÐj¹µšŠâ;ÈµŽœò³hóˆ¶ÑÚŒ¶ mdšÝÖN8·ÃÚÅѶ{ð¢¿[{­t޲ÝGK‡†d@tˆ×G9{£ClÓŽ°=D;Ìù£òÎA>e¾·—kìE»…¨æ7¶òËæ÷7Ó£ôiƒôo퇰×+…¸K¹Ÿ…dÆyäÇo¸ÇYÜñçÜùTF`’õ úÈËØ|d!›Ž`¬† Œ]?«7TîI¶}2wÂ=·‡Í/P}µ´žbä›0Ãè‡ñÒµ­˜û¨Ñî@·P­U°ÊYeQ TÄ*d€Ø9¬lÛ²|æû2úKaüÁJHW¿ã¶ã6ÂîÐ*ÜÁø=>[ÍRÓÕÖÔx>V½‡“¢ÞRYu½ y7Ö`'ÕV½Í[°2ŸPUCáy-u¿º¢ß©nE×£2Bõ"*¿Ê‡oɦ"ÝÕZ_€í§õ)"áîæwø¾Eo"FÖ)+qñKˆœo üçP~²ž@T½åGé¡DÚp¾'Q÷¤o#¤oAD> ë¦N6´¯ŽÏºKßAÜÞ¤+H —Ö%t1œXŸøÎ¥cÚÑ —–ð/ óþÿ$:LØïïƒ {ümä‚Íä‚_ý_pw?âñÖ@UÔËñ|&3|ëÏEsp_ˆ¦Aœ©þDÈ3Ñ>&_Œ…FøcÐ(ôîñ]jÿ·É †Vƒý·ð”ƒÑ 6Г­Ñ´>lûˆúR{ôÅ}¾éúàCM-’To¿§lÍqöýdŸü^o®ñ†Ðñ ò•¹ú~Åh¯Þ¢C¤'CÉiÃéÕ;ìMGÒ×÷é³éûGÜÃ8Ú'hš(dÌÝN§BšÉ}Ïd¾bæBÚoýùh!¼]ä/e¬–âŽW2j†½kȪëÉŸQCáßàðV‡°øwÆ=]xü‡œl|m¨|É¿™5²u„ŒƒÙËÍ,ÐEP1æõZ}¾]ü^‰,_UÑ÷ó«ãµkQó=Œßn¬›¢§pÝÏèç`wVO'Üw7VROÝ›55€jq¨†OñkîHþ™žÍgë/õ\\ù"x¾ò½¬TÃôMzÕçï¬âƒú0µèI*Ò³Âv—NÛÊQÙ…ïyñ6E!|Iu­PÞp¾þý.u1óÕmmUÿ¨zœxjN\=«ž#ÂÚ¨ª³zY¨ß 'Õ—ºx0ñ8\½Kd~@„ŽSŸ«Sp]ÓÕL¼¾ÉóÕ²Àr¢zµZ£ÖS]ÿ¤~Á©m%æwû{ðné8¸#ê•ÀIÈp–zà"”ˆ+Wiê‚•A.\_nªõB0å*j„¸Ákð„e¡ÍõøÃòÖM’/LÆ0$º "Uµî¡Ö¿VͪNyÕDµPQ}ê‹úÖ#ÖC´@ZÐc´Æ²o,z\Úãá¾ -8c>õ˜´à;ÈM áb®Ô€«Ö§Õ“_©Ë¾¶<}0=0ÙÌô(èÝ=ô´ Y®2º“þ߆ã­ÄÝÜÄ}™;»{¼Ž{½–;.-.¸cpcaèZ¼™å²r¢lVÒ:–²´ò?ÃÛ+Œæyuêþ)#|œ‘>‚ªýŒü¼“yØF~ÞL–þÙù ¯E«Ñ ´/b&çãªçà«g¢éjóü™šÄœ ŸÇ1ÿàF²F a¬‹!z«¤¿êÇjé±{²zº©®p»3¢ƒj§ZCïV¬/ÃïfüqaøCP¼¾ªÃZ¬ÉïeeÞÍú¼CÝÆJ½•¢_«J±Ž Õ ª* eGQVºqí.¾ý |?‡w?E4Ñ„ò»qñÛ!ýoz^þ'¢h-±´R/#®]†ø³õL˜?COAñRãõXý!¾j4ü¡ß&B‡âµÒLxÚù5bø"¹³DtkÉ ­ô³úib½9U@Sý8Ñß5@õt]]G¸`ü\5}¯®JmPUߎǻz˜*áfXRžZázT†üq5ºF—”Ê¡¸.ŠŠPA¢¶/¨óŠò Ü(Ù%”Š ©Ì¿‰L¦±©3L¾Ñ¾Ò[Ì“ÀmºlÐ-å.£Kè¼d£¿`ßtšfXxJ²Ó ö' ãqÿ-82ûœ3Ì<%^ö”T3æ»r¿àèY®y –^a›Á6ίÆéƒ‡”6\µð½Qúœþ™ûÉ'÷WÒš;.kK‘GK oËJV½U$ÇÞ‚nÝ…ªÊSŽêŒmMý ù¸c^:ìa2t#fÂäê¦äìÌг°¸•и­nÏü½$Oë^E=uæ¶/sÜŸÙ¤‡ 3ûïÁç‘zŒú#ý1ŒžÀ:™£§²r¾`ý|Å*úÍG‹p+ô*ÖØô#ú‰µ·joÑ[Cr料ÜO•yHÅgÕž†Ÿ—u× íáX”2^=ЇɦrP£æ£ågý‚ëEÔUÂö¸«‰²´r¾<1s±s Žþ<ýÝx£jª*±e¼}-"­¾8üGˆ½FD ‰CCþ–êèÿ|Èÿ¶Äk2@GÕu£’î®^'¦ûH6 •À›ø³¡ÄþÛd…wÐH5šêû4NÚÇðbšŒ>†Ì NŸ OfA–YðÅd Ó¾•ܱ78ú,ƒBËåÙÑrˆ´ZòÉjaÔ÷Ôük¥j­zýLžÙ@ûšý‚·4mYg#úýfyg³Ú$͸ÏM"CÀ-ò™ä¹­©÷7É76ÊÖpr£¼³‘«ý6󫆞?K–û¾ü@¿ÖKÏÖ¨ï8þ­æÈ¸Ü ™{1÷e8»’ý*yµœ»]Ê› jøá¢yŒ‹ótÃøc“e g id^ÃãÉðx"£<–±'\6m´z_ØüÛ2CCÅK7ÝŸ¹ëÇ,õbV{Ð^…Ñ]˜ë8ìvÌ|VÀ ¬†çX-Y- õ㪠k¥«æÖNVPÖRM<„aö}¬¯ª8ð;YsY{Q…ÜeÔ5¬Ï’¨˜¬ÚB¬ß¼ð;Þ<'ëÚ0ܬrOŽÇYÿ—Ñ9bá 4ÿwsšÏ~¦ï‡é{$~vBõíÄÓoÄÕoúWâëgâl-iþ¯&—éåx'óìf¡^ ñ9}‰fãògŠÓŸF OÅïOBû ýÇ!ëÆ ÷%½ ÞCïŠg{[òÃêðaì‡ÀŠ·Ð`è1X¼]¶ýÉo@•~´Þ’?zC™^ÐÆð¦;í5ô*¥›î‹^&³uF/C§Î´NȪ½îÀ¾#{£v¨=kËÚÓ ÑÚd‘ÉK/¢Ö»Öä¨ÖèEö/ÊQkyžðBxœù­Örsݶråvá/uu ûbZRA_»Ðë®l»ÉÖäHCUsw=PO¹ë×¥™‘è' Fh€È<ÑÄÈ f ‡HÖ}›‘5ã;BFü]¶£˜ƒQÌÇûÌŒ™¡±ðx<ÍPÙpy‚Ì£™ÏÉøè)Ìí4ñÓÓÄSOg;Cöfû9ìž¡g±f Ãg±:¾¢Í_0­Y7f-AË úJ¸¾šõeȾ^ÿ dÿOnVáæßwÊMGX±‡aü¡üIáü_蔿ˆ®è Ö¼qíZ[x™Š ís!yˆ”|8ž‚ÄMaá}qx_Jx_â—Oo\REx_ ÏdT9¤þ=Df5b³QZÕFõ„ÿ¡GˆæGiÔcDvSô$j&ñÞB=M{˜|`<[kQÚ£d†Nê%¼]'ØñФ+íUZwɯIë%N°¹£—êÍÑë¨7êC{Cœb?qŒo¤^÷>õãu_ùTo!Uo¹†¹Rw¹VOQyyÜCÎ$·¦u§õã×äSÝE¯ ÷ºI^3ê*}î¾×-u7]„‹¯ˆ‡}…##s×/±íˆÚËÞdÊ2.mØš12#õBHÒÅõš14z^*¬–lÍ3é–â…[2êÍûæäâfá<4Þ6æ6’™zTÈkjµ‡˜Á@ueFÍ3ÚÌrMyb\ôýª:3o¸|¯8ê*è^YfmÜ!îúvqØ·«+‰g¨ */ÏP®CeQöf½•fkTŒx•ȬÈâ²6 àIò Õó Ùó²nOÉ%û<"³šsÊÿO³³¾sCý+ݰß8xÓ”"ˆóÿÕQ‘!™àº ÎÞäƒó4£¿ä9މ§ãd‡cä‡Cì£C’%yû¥>þíÒ{‰ÈDæ©6±5ñº™ÿumsÇzœÚ:bÚäá+9Z…Vp´-ÑK…¦ŸÇÖx½yÈÐâëP_™d–PÅxCSY|.Õ…aÎTÞ™*¾1 Ò$¶“¡”i86Ôš(š’ìSñšãåÈ*”ûXŽ2? Ïš§ŸÈÑùÞ§’×&ȃëM’ß0¿;Qè8Ezò…ôðséó¬ðÌÿ;æ¢o„†ßʽ·‡†ŠæYÙ"‰¥BÇ¥h9„\"£•IÊ€–FßK[ËvÛµŒó:dúã¾^HúƒÌÄæeCÈÕ_%·ÿY72SF[CÎm™ÿÃïí’¶Gš™ù=² ÒYûY†ÅEf–ÿòü!þÛ°ù+è¸T§8:ËÖø€Õ¦feÐ.KÅyEV©Y« äÒŒ1NF…+Úfk)óDÆ‚ê+Þ¸ù˜D‰¦åe›&Ñ’ñÓˆÊ[Êõ k…ˆ¸"wÅBïoŽK²-ƱyUœm±ðý"òl¿°•Ï’}QÉ#…äEä³AD—Ì´ÒòÄÈD{iòLÉ0ׯ ð œâzHQŽV^˜Q‘v3 ©(ÍÅÔ F·B›J8À9Æ#V–º¤²ü¿Á©ªðÉ8È{PUy6eØev?¹«4»_ÈV]èfò™iµÔƒa«6slXø YÎd»:ÂÆ:ò^Q]ÎÕngêÈ7‚OïÔ–§bµä5ålòúfû€TQæÉYЇ¤‡ÕÃ~VîV§ï÷É=$ïç^¹»*’•“#`ø{«ŒPEFÎŒÝM2’ÂÑ-'ã|8èkC}-íj©÷JJ+%OEÌœ“VLÈlf5p EDfõNd5d}å•mqâiÂj³s¦”Cž°ÄdÅÆdÕ^-ÂŠŽ°¢-Yݦ™Z5hš(ð%\"!NKϦ›¨¹$Ñs÷cè~QdÜÐ9øDÚù0ê™(<%OvNgÙ›H=V'$~I&8Eˆ÷:*þë¨Dý¶G$K‚Év@ø°?”qm{ÛGæØ'J—£½’W‚×ûC¦|s0Ë5†íPæH˜•Ž„ç†ß8ð·£tùÝtÙHõ*8·OÎí3=õ¹tyÂôÓômoØGÓ’¹/]H¸í–f*'sÐ2©À³î v#ƒl¹=̘Ûe»Mê­€º[SÚ¾Þ&\ÞF3tN~2³m ?¹kn•í6¹â¹~ð{™ýز|·xé€ç{åNöÊ}í•ûÞ+³aÚy}0÷Ã2ÒGäéÊYÁº0«å”Èxˆ³ò¼ÅèRHôŒëÆ“ÇC¢{âÎ Ñ}qéÁ:Ö}DjWGb‘¸"Äx›ìâãcEÙäy¼‰©œRó_”›£Ü¡CÊú¤¼òŒ'¯Äf^‰Î|ò_,“ ÌSÏaV(n †Íü¯«0GE!{A9*,¤ž ÉU*o”0ÕDá†%Â<d’òNÉðu)Ù–ß1>ÐЧ¤¨4­„¼*%O£J„^±d–}Ю•ó¥å;¥!Z°ˆ0íjyÇ8Î ÿ$¯üzÒ}–’lY@Æ+-$šÏ\´¼2ƹCº™}®ðŒi9BGjf" `žðÓir&-œ•àziáQÞð(-œ§´0c›_Î/GØó“Oòx0gål¡pÆ Ëš;($óWPæÌÜS!qÖÁ6™õ …9½pøªHø$å*™ë¬ïgž+*W.ŽSàÓ“¿n~%¯%WT>ém¾°ÇyÂõ¸ù4¹ãÜá(äÑÉ-#”KÆ0»È䋈¬õX ¯·+¤LyM¦e„?ðP§>AF8Ïþ|èµ.£Ã(5yá¬ä…³’Ìsφ9âŒä‰à‰Ñi9:!UBðêÏ0îOÊöOñy™äXH†ò:È&IZ“mSÌÿ‚ܼÿG˜qŒ‡Èr1w¨\¡ò¤ŽrKÖÏ•Åä ý€yÎÌWà³™AG\E@N3ûÁŠpÃ(ˆ‡ÊøC“«4¹R})tØ—ÿ¦K©óI/ž‘Š×däf®į́¸œ…ØWÂHõ&®ìDj•'Â>dz¬sWžòg®rWö^øZ‡^KþmžóCþ+y6ó}3>æ\'ÁxéTìø;ç‡ç‚½f¤äﻩQN2'ÙÜT¬&RñO@&÷®¤hx1K.»˜¥Æ¹RfŽ;/Ï·.…ï^L16ùùóá¹Ì÷.e¹æ¥“-Ðe™÷KYÞ»˜:Ð-IæËYÚßç9ëŽ ¹Û+álÇS,gQr\2 —©¬£è¥ÖFrŒ½ÔJHnýÔ®x–{4õi—ì§2ã2z/ϰ¸ú PK#rë8áàƒ\­¬¬Û¤wavetable/2600bd7.wavPK6½9=~È' €ð¬song.xmlUTˆ˜¤HUxPK†G¯buzztard-0.6.0/tests/songs/buzz6.xml0000644042355400116100000000707311576360402014421 00000000000000 three buzz generators buzz 6 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/buzz5.xml0000644042355400116100000000654611642656357014437 00000000000000 a buzz generator followed by a buzz effect and a drum loop buzz 5 demo 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/melo4.xml0000644042355400116100000001177211642661300014355 00000000000000 a two voice melody melo 4 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/buzz2.xml0000644042355400116100000000367011642654307014420 00000000000000 one buzz generator buzz 2 demo 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/combi3.xml0000644042355400116100000002741511642656455014531 00000000000000 a three voice melody combi 1 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/simple4.xml0000644042355400116100000001206011576360402014706 00000000000000 one sine amp combi is playing a pattern, the other is free for realtime control simple 4 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/buzz9.xml0000644042355400116100000000577311642656342014436 00000000000000 two panned buzz generator buzz 9 demo 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/broken1.bzt0000644042355400116100000000035511576360402014675 00000000000000PKi‰7 ¶VrSV broken1.xmlUT ÈÌ[GÈÌ[GUxôd³±¯ÈÍQ(K-*ÎÌϳU2Ô3PRHÍKÎOÉÌK·U qÓµP²·ã²I*ÊÏNÍS*Î+¶UÊ())°Ò×///׃H¤eæ¤ëå¥ë+éÛqqPKi‰7 ¶VrSV ¤broken1.xmlUTÈÌ[GUxPKF‘buzztard-0.6.0/tests/songs/broken4.xml0000644042355400116100000000031111576360402014671 00000000000000 buzztard-0.6.0/tests/songs/simple3.xml0000644042355400116100000001224311576360402014710 00000000000000 multiple sines connected to one amp simple 3 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/broken3.xml0000644042355400116100000000036511576360402014701 00000000000000 this song misses external files%ÎÿJèå“Û?ü^ÛŸœ³ý{¿P£o$ÔñE«Óô4ÆßH§ý䣯êŽNxwBÚrÕ\Õ¡íÉ6ÍycÅxyv‹sÖ¾oçà­›ð›Ï:}…“ñ¹N*ÃÊÇÞ9²ñ„r&¤b«òçˆ[\‹Žëë†ÇD mw™ºÄU,Þèê`‘²%¤º¾Ö©¤ SÆkÛî΂Hš¹é¨LŠÆGå·¾".xvö¨N‰&lÜRs÷ßC»ª™¼ûÁïÀ£°]vѲA¸åßDAö¢(ÿ0ˆÝÉðÈú`³0ntÀúöuÛ]nØ2‡kþp‰~üPK-M †PK.·9-M †¤song.xmlPK6¼buzztard-0.6.0/tests/songs/melo3.xml0000644042355400116100000001000611576360402014346 00000000000000 a two voice melody melo 3 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/combi2.xml0000644042355400116100000002616211642656323014520 00000000000000 a five voice melody combi 2 chip-music 2006-01-12T22:10:56Z 2006-01-12T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/simple6.xml0000644042355400116100000000323011576360402014707 00000000000000 a mising machine simple 6 dark-wave 2009-12-03T22:10:56Z 2009-12-03T22:10:56Z 120 4 8 buzztard-0.6.0/tests/songs/simple4.bzt0000644042355400116100000000206011576360402014704 00000000000000PK1·9song.xmlÝXÍ’Ú8¾ç)T¾îÙægJ8°Ù\f©\¦d[€ [r$yòôiù<ƒÁ@¶jw«(,¬¯[ýµZÝjÈç·,E¯Li.ÅÒñGžó9üD¢âçOCU‚`V襳1&_`¼ÛíFÍÔHª5v*ÀâM'Ðn\NžçãoyŠ7,£.ÚP3ÒÉBȯ4c:§1«æ¿È˜šÒŒv À9!ɘ¡!áb%C)Ò¾h–£XfG\£<¥{.Öˆ¢œÔø™ C¾”_)ÆÐJ*¤M ψ £dJp©•°$Ô<ËS†&—?Éš Å„ª­»£¯Œàê¡…ÙH>¶¢ý%µ!¸~GbXÁ071:òS×{tï9¾·˜Î¾| ñ†Šu ž»ðñ'Ïþãbú°O,ø Qž…~àlÄäQ†Ú‰¨Ò¡?ƒ; ¸r—f¦ÈC’+™3e8ÓIã 8O·#Äaßh‘pù^Ý:Èìs¶tÊ18 •Mj(²Y:Õà]÷U¦E»øJÓÞú>^§ïÑ–í—Î>—ºÅz£éºF¼u; «]µpmù; Yî7ƃ`Ì´–ʸ(Ö\¸•ñ­Õ’Ã<,t’aaÄNäNt½\½¹ÝÏ·Øù¯rô rEö³ÎþGǿηžþNšÄ‡ ýŽ«æÀmÚL´i®ÇkÊËÏ^m:mÁ±n«à½šà &hÕ\£¤Z¿ÒqÔl4š kRÑŒV»vÚ෩ŵqÝ8iö£`Ь¶'{6(T4ÞêêN›Òˆ¥º~Öqý­2N{ôqw–‰¤™›•¥7:*½õq‘°7+êýmvì–šÛ¹]¢éx?Tü ©é4ºÌ`ñãàí“ùí¸$÷Ž£ıŒ’³-Ïvç€Zç€F`C7û†›hð„ch”2‹kþÈ?ýPK&ÜQð®iPK1·9&ÜQð®i¤song.xmlPK6äbuzztard-0.6.0/tests/songs/samples2.bzt0000644042355400116100000042546411576360402015076 00000000000000PKò¼9œ„’;+Psong.xmlUT ˜¤HÔ—¤HUxôd½T=oÛ0Ýó+eJŠãÄ­iPHÚ%Šn'éb¡H–¤,;¿¾¤å¯4C¡üx÷ÞÝ»#-~½î$Y¡uB«Í&)½.ÏxÕ¿¾z° Yå´õÞŒ Ã0Ù§&Ú. ÅÚ5oHÃù6§iÆ~~x¬[ì ÊyP5•k ¥@‡Î@cþA×à·6=–¼C%W]öÊ /±!N«%gÛ‡Þ·Ú–ŸA‘{íQÚoA,D0fi8H­MþCÖ/h’íΨší)Ϋ¼5ïM•`>ë8jþ§ÙóƒY ®%wâÓ†£.à;ñ¯m³“GÂöß«òìPK ½9 wavetable/UT S˜¤HS˜¤HUxôdPK½9¸À7¤¸½t!wavetable/Clap.wavUT S˜¤HS˜¤HUxôd¼ý˜Å÷=WuOØ%çœAÉQ$HR$Š IQA” `BÀœ¨ ˆ¢€€ä$çœs^6ç™î®÷Tu÷tÏì.úùþþÏ»ý,l˜©®ºuï¹ç†êíÞ±}û7ÊI¤ÏS½Û½:r\Ù(BÅÕv9!3^ D"Qä•Á㼦#YÌF‘÷Ø òµ£g­M][*Bß½½v}ÿG}]åó Ÿž~öÛë܉-u¬Ž.3þ÷‘åzov¼õÚÕ×â< R›'”»S,¡Â#-ufÎ[™®”}Ê_ÁMc–Æ,r¹:;”/ÕÙr™¨Æ…”œ]ô›òl\ÎýÜ.Ú9×ÇMÇbuNú–”ri_¦„%-|x#ÝóÞÈMönÒÞÔöä4Í~>³lj¹”ÓJf÷Ïy+›f§geÇå\Ê­¤Æ± $[šàì2-|hÌE>鈺¹"lQð×0ú†J”BÞß•j[ÍEú©cÕ‡Úeö§öƒ¢e7Ì“}5gaîYk³:guÍh’Q3û®ç]õ‚¶†AnœÍ]¥ÜÝ‚k‡ìrWqßv>çøRê$m‘¶Ó´ԇ~Eò y·œ-_‘I+èH–â멪TÖ^fÕÕáž7sd­Ê˜Ó;÷ïqoRnsÏ'Þ3Êio°¢¨µ´«Ú%·rrŽ "ÁåƒÎºŠ8så,y‡s™3Þñº£®T”tg*$0NùÐó¥w„ÚG+­ÝQG«ã¼oå®ËRÊj÷ØÓ4‡ô#ßÈ<ú´çŒ#Æéuqô—ËËqÒ,z•¾K_# YG6‚d§H;v_‹`­Ù+Ub½¿x7{ï{[) ÞúÊ#å u«ZG[¬Ýb±´”"Ÿo99f9æ8ª8×:ßsÉ®‹Ž?å±Ò@’ÅŽ²ò¤ k¥÷¾éà™àÝàY£¼å c%ï6Y;{çÃ?-÷ÓüäK5×¼Xë•ÇDª>ðàÀ~5_)"ß‹Øzà×*k_¾Ù,ìõjeŸûzØïoVèz»ýžgf´¥-ZTûL]z?òòÄÞ e_¿ ß}÷ì'¾ñL,t7n|ä™]/$œûüÁEwó»«·ªûÐÑ$%,Ñ}G½ÒuïO›å²oÔ‹ÚT£qµŠîT´žk÷’Ìù=gîÃnדÏÜ9Û2yPûÈÅþ©øW¹Ôòo—ßTžÔßÒ8¢Ü¡èh&%eÞNÛw׸ݿïX°õáίŽ,ÛsîÀ—ߺ}9éG±âYuš6~õéûç·h¹·Í´^—{ÏíÜ£¹TW.4Û;!³j¶'õäÃò7ç]éwtÂ?#ö9;õ~r‚’ŸU,çuåx°§PLHI%2³Ÿ:“®rsNW¿È\•Ö ýñF¬«_·yùo"ïEÖ/œÓÅ•û ÆÅ¨s'®…=ÊÌê“U9ý¼÷Ú@è)—qMí$;G§Ç=ʹ›~yÆñì#Ou¬–4#­\fræ×™eÏú1³DÎËj gv˜Vør\llãB;£Ë†¿Ú5h¹£ª³oÈÕ e®tžwCÎsÙ-r>˸”Ü QI®›ñON¬wƒ÷–÷oϺìÜìÊZwtøÈµ‘£#’‚+9^pú%앨ÔðîÎuÒÒUÉÉþ*³dÆÞô#éé³eµ}QêÆ:Ò«Ž^ŽúÒ;¤k¨{c”!Êo¸:šmÔ¾TkªkXÇ×Uùk–K^—“dgÏ«ßyKy¾ðPÏ9­=ÝÕ\V>-×wýt5¸Oð°  WEçpÇ/Ž…NÕ±Ï9×ýÈ]Õ5ÁÙUªª…©^u ÛÅêû¹“s/ç¬Í®—õrf•¬¶Ù4ç¯ì‰9}=ñÞfÚ.šãx)èû!„ =Ò"h¦c}‡ij²RD§öÓŠkG¼/{Ï{{*æ~‘]:+1sröŸ¹G½Ï*'”ËZ,­—ÿ?–›9—¸ê¹Î;g;*ÊñR;©;ƒ­/Ö:©ÕV–L#›1«çÕñj´zß«zVå>“›ëIPo‘Ÿ¥¦rG?Ç|Ù-$—Hkz¾C{R•ü@2Iy²ƒ½Å²»¬½ Ý—Ë;'¸>weºF¸ »¿sÍpæÈ¤„hÕ½=½Ã<Ÿ`äs¯æ|埒ÿàΕ#Ŷ,8w,bMñé™oF•)ânWè™ðヱáYõ÷>ë¨ÕAëxåÑžnç?ºëHí}o×íÁRõ «Ékâ«ÿÞ¢ÉK%Ç<Ýg~ƒ¯kõ*ñlÄÝ´¹×co=w¬ÅÑN¾|{iÚú™<*aböõâOÕ-^½B¹½Õ+Çsüéþ2rNÉ…MþjòjõÒ%ÞÍ|÷ÄÅM]÷î9ßâìÕSáwj¤r­)2,:!¢lÔ+ÞÐëO|yãçëŠý³èÞy)¶TlåÅû”{¦NÃÖ/¶¯Ö°]¹¡Å•ØQjKÑÍì“û­ÏW<¶lw×-'¿Ë:5­Ô½ˆ’šz烓žKd>r]Ž[_êP‰1%N;‡'O¿ÿàaƒÔ_“ö¥¼’Ú#ñNRÕ”‘ÎÞíù3¬Ná«e×îÛ¨^›=í>kߥUúkªi=%LJ¾˜Y)eUîpÚ-{Ãkg†Þ¸mï†M›O{M»Uæþ÷g=ú:iûmÏÕ×…Ëîb1Uû•™UB)6'd MgmBÊ*µ²ÐùˆÁÅäâSbvížé> |îý ÷Lz¡ŒŠÙçhnÈ©¨NÅJû¦È;…[D‡…^­öõ>PgçLÊh˜²'éïÛéWê^Ýtùóëî÷K»J<®MA%BjÑ©ž³êÑ  ˜ß‹tˆI ý:8IÊÈ­˜6<µUJNZçŒéY¥ê9œÛ‡>t3Ê]¤pô!Sƒ>s§9‚&ÓÞâÙ ÒÓ3ë(£Hu÷9×tWã†AÓñUç ½Ò ’á ÏHM|5aMÂ+ Õ±äÝYÕ×èLG›ð‘1bÛǾ«Ä8"cÂ&· àü•Ng{ÔÉêKZÙ«¯#}UâºÄÖÉc“§>ºþð›GkJ&üpêQ¿ÔöY¼+Õ7hk÷Ëaí¢–FÿÑ9´dˆêÎtoqMw>Ü6¨¡k€ûkW}Šž—78ë9·9fÒ+ê4%(÷Ó¬ 2¯f¯ñìöÞUºh͵íäÇ&g÷Ø Ÿœ¯Ë äuŽ7©ÒÚ« ðÎòfy/zË« Ù·Rç®"®wõ ùAqîYòeê"9Z;6ˆ6”Ÿ‘›;Iad¦6Zý^©oÜßû­g°çO)ï]o¤:ŒýCâ`³D>DÏÒ÷Èhv]«F^aƒ4ªÞ9 ŒWyŽßj÷°Ÿó@±æ-[½²¨ÿ·•^ ­™“‘[ݽ4¤¾vöf÷c=ŽÜÜ[nç ­¯îš¸}ü¶ÑG]-’¹"2²øe_«Ûäé?;-lw«IdÝîåv—ωkY?²Zðxr/û{Ï Žú™/¿|qåÝïî¾þ€ªÜGÜ=bgD­ªXè9šòàvÂH&¹ßT^ùöHèÖ%+­l¼Y9‘õ°jè³%6—¨SùN™Êe+ÔhTŸµx½Í¾&IåΔ*]tš˜ßïòų/Ý”®z;æ.w½W¨\éë•äâEÕfÉM•.‘—‹ŠT¨~äLi[¦ò òN¹+N¼x¤Ò¾¨}Iïšz¦]B²tX¾¦|œU/¼tl| ­iBËä&ÝKÝux©Ç™S%f£»oDVá&EW½ñ[ÄêðÕ¡“Ýw]—\³ÓN߬qeÝù×Oœßºn[…}ývná…K·?J]Ín‡|Ü$ä u[j|nψõXõj–óÄ-™•U,«‚¶.hIôŽÂéE#ÊW¬Ñ±öþ:'ª6+ùs‰ÓŃŠ> ËYø½ðÕô“¬÷o =MzøÙà gnºÑ5itæÞŒ´´2YW©wjß*z{Ç™ž;*ízt(öü3 ÅÔY!½KŸ­§Õ\\ã³ ¹Ú¦Õž(ôA…'j¼X¾R…Z¥_›ÝŒü”=ÿáÞëWoõ¼_7£·ZáûJb‹8Oªír5iFÄl9ÑÛ ºýUö±û%ä$–|°çü¦³mo^»Súî¸Ϧ¯U—J •x1ÎYøDñò_ÕþµÎ75oUP wWÇÝ */$ r(Žǧ¹e­»Ù÷Úµ[³â7¥ÎK)sæÕ°k£¯=¸6ÿþ‡ wÝîù(!õjÚ†ôvê Â' ¿^ëƒV5Û—k×®ùµ:…ªÍ(]6¶eDmçXµÒÕ;-#äÁ××ß¹w›^ßw¾þÙ-§.œ*~­Ïûi ´G¡_utNŽªV$»H÷²ÇÊN.2±øseë—z!fpèàÝÊ)á÷J\;t!ëlÓëR†zßS·Ññò­³Ò™49–éîÜ<¬žc$ÐìcÇÝ g4+NîhÇÔ6Úav޽Ÿ}Cz¬pƒsbŸGßf%È—Îd—Ç{2íí)qöƒµñ)IrZx23¦¤'(·ó‚2µ\3¢þ*~¡$-ÒU*z;ñó¤¬ÔÁ©£ÒdD&…ÝŸu¯Ô£OR·§ÿãy“Þ–þ”S‚¶F,ŒZZêƒZmê}Xç¥J?ÆM‹Š(÷vÑ%E>Ù.½¡õ~”vïÆð‹+Ï>=ðTç3Ó®¸ýσÏÓãr³ÕCΤ ¶aë# ÇÕ*^åF©©EgÚíX–9(-#³±÷W6A:àXí.î8£5`mÉéÌ©í2î§ŽÎ\’Ý×óIÖgɵӇglI;™=NZáÚòtìéÂ=‹[ì`¡Q#"Ê»k¨Û³Ë¥ýrûÐeùÆ÷Ú%WËù^‘é€àS¡?‡¬ŒH w…M ©är9ß Úò^HñØ*¥K—R~]…Ye?.^§PçˆeÁ•?ç6L»•yÊs>w`f·Ä™ñÝoiöœ¹zçµÛmn^¿í¾W)~[bÓì×ä¯B? +÷FܺÂ{bïǰ°ßÜ'ÛÈMÖÝ»?grÚð»Þì?5ýŽºÁ9 jDìøBJd»ÐîrKöùT™[#§ž·ù9¤P¡†%j”¸PhFp®–è=‘ñsêçËòœ¡/ѷɇ3¨DèÅÐ΢¤›·AöáÔoR—¥>—:,£µ·„»dt»˜Ä˜ÑqÁE¥#ÞÞ!êR%4gtv§Œ¥ coíº©Ü÷>þhIJnzeÏ»Ò÷ÁWÂr”lX")®^©½¥•nPfLɩł {£GE~9)¦hÔÍУ®oYtæ–Ä¥¾I¼“üVFtʾ Ü÷^»ñèzÆíwŸzp%qxêú4-ùPÚ·¹ŸÒkîÎa#~ŠÖ+(5xfØ[a©Á»cH<©ê¸z)æÍ"YEÞ*|,bvÐ8ç~ú7!¿èX§n÷LÊíã)›3:}kJÍ4WæÏYîœ×³¿Ëm­%‘ÚCuƒôÈÑÚÑ$øï°Ûï¬C®ŸÜ$ädð6w;B<«³Jf~–±6»Š÷¢VW}%»gæ²,àeNˆWÑÒ”¥¶óXDZLFä¦ÐÏ]ÉM»²KžáÙs¿Ìæ©‘Ó8=+ù§ø ÷ž}Ð$YÍzC®u¥å'änn%(Õéu ú,8+xCè£È¬Èܹê]­½.ejOæh9Ìóƒ¶Ý’ì~Óñ6™­¾èeŠK)Ó)g·çžBsJ¤¿˜>)åDâƒÔO”…Î%¡c*Ƕé="äMéǑІSÃ:§hãs÷§½ŸúMrãäi YCrŽåö––„ˆ¹ÑÞÐGd,{àî=¡ð°¨ Áóƒ¾uÍtže]=C¼µs›eVÊh‘±*½DÊê¤S‰Ÿ?Ú‘X)µbv}5Ž®r¾üaä­¨Ãg†xCâžyBÎ&½½+³–fåŒS÷Ò Ò<ºÍñ£û'÷™à7Üu¤Mt“£¶û7ç^'uþ@¿%{]‡> îãìÖy§yæåŒÎ<2æarüü{ûî>qÿÞýþ sSS‚2.{BéD×Ù¢Í#££Gž ÷†m¸±?bCtBô½ˆ©!wƒÊ8·Ó¦RW‡Û1Á±’íÍ“õcvÙÜì\)÷‹ô—RO¦uÍÉ,œ1957%:í»ŒÖYáY%<½¤×\uƒ~ Zæšê¬KãØR­8[ÉÂÉ(:™ì¤ûœ7]EÝ×CZFwIŒ .t:|hp÷y×Qçb¬ŽönõÖótÈÜ›þ0kVÎdOSµ¿’칚5/}tÖ•lÉs"wq¶–Õ8ëBÖåœ7”>rÕ «®»r› ëÁ‰ÁÇ 6[+¢nPç«¥ÔúênrÝÝ3lghJØöèë1ïFO oá¨Â:ª»Õîê@Ï·9 rž÷ÜP{ëyG±1¤ƒzÅ‘3)sLú‰´¤´ÚéŸdöS>3G]¯:‚¤»¤³£GÈÓZØ7!Ûƒ¢ÝX˜Z}N–IûV‰óÊY–áÊjê W?QnyËi´Jd9HË8“\W‚? ÷FN‹Ñ?²{ĺÐ~!÷‚ê]p?rÏwïT‡x^È}Û[Lm¬}Ê‚IyÒ“Ld_iï°¥R´«hpÝà5ÁBÚÍsp?2,ô³ÐØ ä¤'ÙhÖO­äù9'7«vÖƒÌðÌY¯dÿž]%7ZCªÈKC?Kª´J~]¦«Õ’j°:HéIñ´÷>çYûŒg¿w¾:ˆ|'7vmq¯ Y¶1l[È… Iî?Ü‚ÁÏõqž“¦“]Úl푺]¹¡ÜR/(!ž¾¹›³Ã3'¦ONÎX–9-ç}oG%R©ª´RƒY ¡ÃX_RRîî¬ïšî$ÅI+éÖ^=­TÕd¶@KPKi·´¡d0í)tŽq4Øùƒs¦ë]÷ûîxg5gU¹;!,žU¡Ãȧ¬¹ö¢·}®Û#©kµÁÚ%ÈíYŸûkÎìììì2žtï.užúº2L}’ý@¿—¿”KHé74“¼@¾ÕÞRG¨•êj3øžV¹¼/i‰ô5gÙàñÁ5ƒ¸†:VÊS…¥‰Ž_‡äÕ´™GN³-,ƒ$¿Ò©´iζ«u”O¨g˜ç¦g ®$åY֞Ζ::æº~ußrýåœè˜.»¥òÒ ù¹¤ÜG&Ò=­±6•”–þ’ÚÑsl—ÖA{Z›«=ÒNi_±Þ¬Sµ·Xeø³aôKò+9ÅrX.é+Í¥§Y5u¤·ªg{ΠlšÕ<ë­ìÐÜ6ÞIÚÇt›ÜÅñ|™¡?ÓÙòïΡîgÜ']«œõAµ¤kòCufÈG©—³®Ú;ê|e¼w…'ÆS×ìÜi9“à9Ndñ|¢þÆ‚¤z–¸Ha²“4¡C¥ºŽÞ§¿J=ä‡4‹#Ù”Éß8æJ÷h<¡õW6+Tª]Rú)y[{Žxz¨óÉ×òs®âAßu R<´Wè´Ü%åUô[6]yÙóiNÍœ9‡r‚sfgeÖÎjŸýAÎ;9!9csÞ9ÞDïÏê笗‚œ©®µAUC3ÃoEÆFZ1 ¬{¨+ôNȇÁÝ\åH í–·Jn÷¬¸Œ¿ÒžJ딞‘™›-åÌÉžžu8£UúÓé=2WdOú.j“‘Òór1G§Çùž«ˆ{žkžëg—ä¾î^\:äÝàB!îŠÁ߹˻¢œËämÒ§ÔÅþP½7½Ý½!°À_sæŒðÄ{+ßx«x†åvñD{÷{~ö ðDy{+Dû†µ¥Å冎yŽz® ŒùthõÐäàw‚~qÞ¡?²Ú¬4#ìU-Kݦƨ¼u<#<Õ<_æžÈý6·^îK¹{²ÏŸ½"·=쥒¢y¶yŠ)¯ÀʳwØl ’:ÊC%\ƒƒ~ N uou•ÅOw„Ëã¥Dz ך+Íu¨Îy®®?¡N§c¾Ô”6cõT§òWñŒöó{FçVôtð´öÔð>ôþ&<ÛëÊ\%K¹ Öeß°ÉÚHíYö«É"0ÛZŠö,ɤ«¤ r'ÇdÇOŽ™ò!ú6,½)'ɱò Z™Î`ïhkÔÂêe7Äûºw‚²V¤mÑ“/0£®ô/ú‡¤IK¤è2üÉF±SìwR:éóÐ+FHÔQÕù»c¨ü…Ôˆnfw´hÖ„]Òvªo©ïÀBßÓždcµUÚKÚ0X¨&(߀•Îô<çùÅÓÕûÈSÄSÛÓÔSÍ[DmÍÖѹò›Îº.‡+Ñùг…sŠë¡û;÷:Wœóey9Íj#ÕjêMe»²G©«.×®‘7¤ r G9GÇÇ·òmú ©Æ¶i•´OÔ¢Ê]Û3&§~ÎÌÜ-Þ3êv€´¢é*`ÀJ¶œ¥Ã¤vÒ“’F‰ÔMª*÷r¼ä ŽeŽ!ÎÕÎ7œÇëÝW{œÅ\Ó]'œ'åëÒKÒÚ†|Äzk•FÞõž%¹±¹cröfÏÊn=+ë·Ì™s3ÞL/•Ñ,뉜1ž‘ÊOêLm?{ŸŒ!íiU©¸tCúMî ¿%{É•ä Ò1©©T–#»XC’HÑ i¤”öÐ8z|OÊ‘¡d#™M~$ãÈÛd)D0륽­­Ó2´•ZemºÚT}Y]¦~«ÖR¿Pžö^É]›;ÀSϻͻÃ[D‰R(ÔúZ-6¥/úQ~-M“Ÿ€níÈÓë<éœí,âxCÞ"?'ï‘NÓÝ@ùÙ^̰ˆv[½§¬ô¾éMò®P–©%µH-V{BûL{K…˜áÄLÎ~‚–¥’Ýd1y‘xXix­t·4@Þ)wÜstr6snpÜwlvÔsÔu$Êr´Ôv¿šµÓâÔ!J9åo/õvöLɃxUõ…÷¥®T«i‹´_Ùä*¹GêÒîôEú¦ iOi¸ü”c¬ã˜¼^.'o¤o’l!ëÀ–iŵ'µµëÚCVúœ%Í”¯ÈµõäQR"yФ±ÀÍâ´¡j˜zRé¥:ÀSÀ¿6b¬x¹ö©6Z{W›¥±cŒ‘ÖAsÜvvqýæzÍÕÎÕĵܙìhïFîJ‘à)iÄAdVDk­®PÒ½Ÿy#¼_{¦{.zRá’<_€¹}•»$ç·œrGyyoge‡2I]¥EŒw«›BѺ ZØPº%½/Ç:~uTqu®t~î¬ã\àØ~ð9îó1ù„]Q¿VŠ*•ÁJ[¥ â~ÕÛJY¦´SßW³•¯•AÊËÊ¥Œò ðv­w³÷÷šrU³d_‘ôK鲜æØâLøï:/9§9;ÖÈ©Rsi݉™ŒbåÙ1í„ö ›EªÐ*4ˆ£GÉ`°›zt6]dxŸ†Óê4šxØ‘Ì^Á;.hïhm ó_´ÝÚm½ÖOë¡ÍÓnC§_`SÙZàÏuò=-)}%eHóä*@>¯ü‰ü¢òc¤(yìv¦êP+"ÍA 3W=¡„*=¼›<£=¯zvx*{W{—+QÚÖºä:ŽYÌ:Çly¿´P"EH¯ÓW»/±ºLf)Z{v޽J4²†FK¥¤,ºž¤KèHú'ý¶ )d™ÉÜì(´êUí4¼HCpð ê u¥öû•}Å>ÇŽÌ É-ò9DJQFŽ“Žd:KÃÚNjiZ$‹f}Ù‚‘>›{Q>(ï“ïÈçäOåB²,ׄ6>Jã$]IKÐJ$„%«³”©ÞåžÛ¹€A%swäöC8ì}E9¤<©NQï©ok%X]2™&IÝ?8'»2\!îW¬»®»—»³û¶ë'h^,h&w·´žÎ"X+­¼êVÊy»x¶Áf–ä>Âu5÷dîèÜ¡¹?å¶ëM;æý¬é¥’ºHí¥]Ñ:°,v‰(4H¾%or”tvqîw†»n9'8ÏAŸe9BŠ'?±w5¢­V_RË«²š«õrÔ£ÚRVŸÌ"éúþvJ?JU¥’t0¼ÖXpæRê³êuœúªºO-ô. »*ɦð,59EjÐeô i—T_ž o•§È¹Ò:i¦ÔZšLÇ’&ìMíZHm£œöžðþâè}Õ;Ü;Í»ÇÛAyZ} »z˜ _‘WH$X¯D4öI†NÕ‘nJåwä'dMš+IÒ~ZLz[š/½*¡ è§´>½M6“/±Wd «Îî"v|Ž c¯²ˆÁÚ°?´ W¼VwõKµŽ¯LÆÌÏj³·I¼ÿÝí¹KJW¤òY)FZNߢQtÙÏÎ {‡Tƒåòß¾ äÜ%O’KËK¥ÚÒ^Ú‘¾KÞg©ð³0ö*¥✛Þ/¼ßy3¼T¹ïÍôNWš©iêYmØÃzú¦"‹›á¨kï!“i³ÔGK7BÿbHÄv+ •ËÉÒŸ$±ó¬ù›¤"`ä ÈaXØwä"Û­íV»ª9ÊBEñ>ë öF{'{#€ Û•£JCø‡sêZõ{u¿ÚÌÉÃÖNôo¬ð Zž>E×ЦÒR©†ü¾¼R¾.–ïË…ŽÝr9N*O»‘klÛÉ–"v,Ǧÿ_ç fƒØ8 g{V†yµ‡@ŽûZvþ²˜Ã§ðV+ˆ‹–×û†®¦—iWi±´RZ ½ ÿ¯Ñâ’[Z›,N¢Y m‡ZT]¨ôUZ+C•ëÊõºš¤Uw©ÕƒðkÕãŠK®nÂOfCË>SC´mÚû¬:Öþ ­‰è&$Ÿ—›#"+–RÕUÄõ1pâŒ|BZGW“pò%+ÌÎÀîj.íšzBÝŒ‘KiÓµí9Ö•µ‚FŒd?°›¬Ðî>éIoÒQÒßÒi)H>-ý‘n!GY 묽«þ­\ó6ñÞ÷lô¬õ¤y¦{y» Æ]=ÍÑþ‚ü•Ž–ÊËÃäÑЇoqÕ“[KCàÉ›‘oÙ>-H[¬NU7ª5áõŸgc!Ϧ,ŠÖæ93µ~ì K½KÛOÑ4›V‘ZIÁçWNK?KOHGi5:‘¬b‰Ú3Ú ¬¥‰¶CkÄ~ÆMF,qV›V1òY ýËPãÕkê?œW©ÖÚ±íì â¤sh+é°tq~¢´VúD*)}‰(qØÅkì|{MÖ a¦Ýd'ÈBŒ]K—º RÞ*gÈäÏä;ÒuZ”.ƒ~®a·´4pïæýÞÛ l/<ßïPå¼RCýZ÷P- Ä=«½ ùlwI?Ên‡Ûäø]n뽫•¤t=ØCùVz\{M«¢5Ï8«U‡ífhµÙ$öû›­fïí3µÚ?Úíð§´{Úö48ÂØck`ÁU) ³Ý/uG4º‰.‚=.&g=܇”a×GkaûKÔÔõêHð)0Σl>ù–N”°s›äíò 9ÚÑÌQ˱On$$m£W‰L³šC¡ªÊhøÞ»ð¯n¥¬{ž¢*Ôæøù eüñ-¥üY¢ZF¯Ue ;E¾¡m`_G¤¹½<\)÷•Ÿ—_—ÇÊmådi¢Ô@z@ß³9F–¯–…<”]AçÑžôi@ÖAC×`·pÖ ûOkíµaÚNí¼ÒYm?¢ªÙÚ³Ø³Š¸Úh/k«!­ƒ¬7¹C^„…¼»;(%@3KËQðQË¥ñR´´š¾ÛoD«RJ÷‘ЩÞàFŸAò‡Ôþj,¢·’ð…—ƨÅÔrj õM H”vMÛÊ~&ŸÒjÒûÒŒ;:z“Î¥mé?¤ Ù[êϾfÉØ“±ä}ÄsÈz0ÂEàÝÈ›äÄ{1d»ªõÕ¶ÃßT+?*³•¿”x¥Ž:Mý9F« &qEûƒM#ãè«Rcù†ÜÕñbÍO]WÁS7IqÒtúì¸6) Ïe™Œ` +I AôÒ±Ow¶J»¯–UW*3••)ÊÄ´ï)ŸÃóÖÁ]TõY-–•%…oÎE$û’ü¼ÉYv¼îXç8âXëœãØXÇa¹±øñMC¬½‰~BKÓÍd ù€ü [G~†7]Hþ‚ïx4$w±[»0öLµ¼`Wõs ¯[k +Ùª%j¹š›5c±=ÌEª"êLjA#¿'Át(b¹CT:-–R¤J°“0ùO©…t…¾ ­­G>C´>1óØBOµ˜Ýbe²ÒN‘á %¥‘ò¬å X`ÈçÖþltþ(âÏbðµ§é,ú ½}‰&k!…bÀ€Úm |Oy­„­IšªFB‡Ök¡¬#ÈZ³"Œiqðí²lxÈ/Û†Òþt>ÆT1O†Hy°ô°´†T¨^ ñ}šIæCfŸ2Êæi/j µ¦ˆ¬.kϲEl9 ¤)Šßh¸C}|·‰yY{ò5â‘^ôú<°âŒ<É‘ìhæâ|Ë9Ú9Þùs©óC'sÄ9€_)ˆôÖ«÷•*Ê'ÞHïaÏ*ÏŸðg<9ˆ{‹*o+”Bê+ê%õeí”Ö63”ÁÎ £/Ózôv¨ #wÀÛž$ÃÉˤ,9ÎæÂot`Ïñë ÞJ 7೦öž MȲø1‘´Æ=MFÂ?¶£{0ÓR¬ÜÈ3Cž(×—oIK }€!ñ·ÁõÁã¼€Øè}ædãqËÔaàsÃÔ5ª¦V‡Tž€´—¨MÔÊDe’²^¡øíuúðàDÿ >Í.³q$‹¼B·Ó(0±“RIØé‹ò rS9[Z˜_¥ßÒvÐô$„¬DôП}™þÅ>`ÃÙö:ûŽ‚÷«‹™?¤x‰ô‚¶u%=È«°†Fd/kÁnjïÃ+<¡½¤}ƒ;Ò.Âëc »lΖ'ˆD.°o`m!ì)ö»Äj`¿.“t¸Ü)èë\:žö£5!ÛoI_Äõ'Àú»a„ެk‹½ž­ÕCø¾á{u¹zJUÔ®Ú\ ­ žð+»Ï4V’t‡œg’­ä)M{ÁQ´ëxN_úí{ÔÈoä9¢bV“±Sµñù-Ði ¤Ó•~@Ò­xO3i•Tû1Nn%KÀ³— Ÿƒt-ýФ•€`uÉf¬cœö¡ú¾²Ä[Ò»ßó±§µ'Ä#yšzf{4õÎ÷ÖT.)¿©ïh-±ú½ä'ÚGz ‘‰ã}ÇZÇOŽg—ä1²S^ޱ‹ƒOÇlŸ£è$ú#øXI©‹ôµtH:#­–F#’ýŠæ’väö"üAêR%ÓÛÑ{ƳÀó•gŽg¡çwÏrÏO]ï o-å[%I}Ñ’£ˆƒd?–ÊÉ‹dUwȈñ¯Ê7Á$/ÉûåyòSàaoKe¤5ð6ñÐPî^|êdZL¼¤¶±Ãø—×ÕÎð3-ÔçÀ÷¾‚o®é—c?‚±öÂŽ­@,AÁÕ*ÃÓG ò’_:>FT~Qn)•¾¥;€›ÍÙ¯Zim…:˜V\ R¯+«…—ùC¹¯¼v9Yóh£°ŸƒÉ9ìÉFZHzV(õDLs»è¢G7”Å<ÍNki­4·–©–Ðz#Î e³Yqò!ì4‘œ‡…¶;þºÖ•åj?Á3;ÀÊ6€q]Rk€›Tr!ô"=/Í~ÛzQ*"­¥ÏS‰þLZ’t¶ÜóS6[xñó ­¦¡UÆÿëµ2ÐЇB·‹“rˆ²S`àÙÝà]· .¸xˆb´`ú$í®A¯ýúÂ3F’ N•ÄÖ‹‘ÿ×\Û9îK ûQØã,‚ÍM€g¸JZЯ¡…kèw@†Wiúý±$••*aKK dÿ"½ï¤aæÃÁ‹O#ò߬­ÒÖjÀ;wi‹Áö k[Õ÷ÀÕ窩¿¨±·3áW4µ¤Y,tIG C;H߃­ÕŒ€–,‘¦@++Àšþ¡Ÿã.!ô7 Ù~`C–„±‚ÝO×fh³´`³"ÌRà‚+À†ºk/hC´¡Z­ð¡¦Àñ«ÚVš\ cé5ZWê ì'ÒUºŸ®£ÑŰÝ%°·–ôoŠ8¿ »¨íCs ž&Ìêx„âàì±Àœ>ÚXÜyµæÕZ°‰`¢+Ù)ææŽ%Ûá «Áƒ—¢Õi-ZYÄS“0îvºÎƒ E”övê `ysx³Cˆšš°²ð(o²ì:¿†ø<9Kž¢;i'ØãÓòLðÏ{òN¹·¼FzHëÒÏ€j±¬»¶~t¿ò+b¼ÕÊY pI5NuªiÐéGJˆÚC=NsP« Ž|Å’˜Ý2r…dBÖ`;³É7°¡…äWDgO“Ëì+6\í5àð|õ ôªEv!>hDߣ×iséi*¤ö”ô¤"-¦„v%;€eµqˆö j~±Ø årèûyìnm0•߀–™à½/±áCSY=¬{$Ö7üNŽ’R 2ùÜd-ðò |ý mC›!Z¯LKÒâø· Cߥ£‚ Ï`Xs?x¦Ù¬Û n[\£Z°ÝѸÓs༥á™2Ôt5üx>îÛ“ma51ÀŽJÃ庎³ŽžÎ½ÎR®N¸d×ç G+Çù]i4}•ŒeóµÃj°ÚO9ìíéÍò¬ôLò¼âîùȳÃíá½ìí§ÜU^WSÔ7µëZ¶–ÉàfÓÉ1RŽŽÅþÞ§€¤GáYŽÑÝШo`çi ØE/©‰t 8uŠ4%‹åE²p0¹0– û,=Z+ªu€&ŸÖʃYüÅ$HéwØqCú)F¬&½l^&-’úIç W“H ›Åú±ÆÐ›â¬_¹²­€Ù´'­àùÛ"æ^GªB§#¥¾Ò8ée©ž”ýnGAûFšäp$” ÕÖBc&(Å• ÀòÅÞCˆaz@›JªªûUÚ Õ`Î0 Ó,öÓþ÷[rc ?7RÚ"Ý’îJgñÿLÜ©¢‹ºBÀB¯ªá>[±[c°æTàÌçZhûÔeêêD‚Õ`Iï! Û ëT´ ÐP6xp÷ª™nµŽ–—6JƒáI6;z8·9¯;w;§;+;rdÈUåvROÚ¼É>ÓÖ¨‰Jå/ï³ÞPo‚çž'ÄÛÅû›·$P¾:¶@Àš»~D$QZþ+øUØ@&B3é,)Üd°ÜY.&ã¤}Ð<'N\äÖ rfZ4´®6s°ƒÚ4ÄŒÕÀ„a÷vh.°—£¬9I^¢çh%ø¤ Ò5Džk¥iÒPDé‰ô'èu<$RÌe(Pj lf“ú¶ÚV-¡jJ‚r]IUJ©½aE«Õ“ê5U­ Ë:®=ÁV±–àuŸÓrÒtŒ{Rº!Ö#†{>¤.Ðñ/xrX|ò´ÂÍ–BʪzQ½5—~ÙŽa71ÊLàJɆ‡®û] îâ&7Ù~ìÑDÓëØFvA䲎‘Xà`{Ø\0Ï °âúÀœY-v v5{6±Ì> üRàû Ø8ÓZ³)l0ãCøÐŠàÒWh}éci›t^ºˆù”v#æ}[Š•æÒ¢t!¼é20­`vRûXÚ<«­6(=Vð¬+tb¤%l›ÊÞÁç/ì0´¢(<_!’ÊþAL9„uÂõ"â¡ìeŒV©ÝÕnk7ñyU;‡XÂë ”ªËª!&è¿7ãîdQÀ¶¤ ý Ìk+"á‰ò6ùˆüâ– Ò›Ðâð9'éMz¾¯=D*‘‰ì.f×3­†˜¸²VLKS·ï~TWqzÀ8Øs@¹Oè]q¯AìK ÞfH7 ô¸ÁfDY‘žˆÉªbU`©¯ÃÇÞA ø ƒÎÜÀ<ÚÈÍå`ùüàëØÛ4xŽAˆ×‚Ñ?'P õo´1Ú@ØÍÄ>}1Ÿ§´§¡¯k_h˵´£Xõ5|ÄÞü ï{_ ÇÊ[‚ÏŽ… _fѸkÄ ÉuÒš.º< '€T-é5òÅiðåþ¬væ6öw9ØÁŸð9¥4Æ©´©Á ¿Ê#Oˆÿ°«,Ýc·±7Hoò%YMv Þ¼FâÁÎV#Æ Ö^”ìƒOiË*ã½Á,l#S+?žmc1¸o*¢½xÚ²Lš%•Hݤjðu³ ß8r’mļXßJxâß¡sh߀ÜOc´(Všð $¾’-f ðÿiJš!fxœjve2â™ÏñU kŒ;n"IðÔ!4~¦£xµ˜û%Pç#ò üdøœ ôC:Ž6n¿ùÏd½YÛùWѼ`é*ÿÈPsÔâ°²qï)JÇ]Í`=Éâ%µ0Êgt"9¸fÓø¾M ß!ÖN`«1¯÷Ùï,žUDd3žÌà5\0»,ð‰UàÓ„gwÙv¯Ê‚Þ¶Áüö >möo3Ý M]€ÈÖECþ%È 6Ÿõ`•àa<ØýƒÚ2Øê0²,íIö _± c¹Á·Ÿ–ÃîD‘Ãð'#Øó¸^– „¶pË‚ÙmÄÎJ¤2ØÃ(2—ì†O £28̧¤±âíÂØß?€0g Û ¯™Öü>îÞÑÚ=X¯ óØ [cE!Fô°kðæß¯¸†ù;ô;K«Ûÿ ȓΈŒ»>`9¬0v¾VÖ1]&æñ#ä8÷¸Æ2™“ÆÜ+bÔ㡤4d0ù“¨¤ýÞæ:Í¢ ô,ÝÖS‰†­Ô$w‹ÙЭíЫ‹Ðùûâ.Ï‘E؉çáYoÓppâ2Rt^¿ ½/›ÈÞƒ¥ÌÑJh":~Jm­vGt?T€ï†«€ WKbwj²½¬;9]ùûy—–€þÏ€çx^JGlÖ ñã\hËu ^0\ »z ^çoÄB£š¥µ"ZmØÿFD¥õXÖ vZÌ {Hw’U%sH1:“º1ê‡ð]Á¨é|ÚÚø3Øž ôÿÜo›Žu.޽ȚÁZ˰ ³+~·±x0©tRˆ†ÓdðÂÏñýcp‚—à3¦ƒÕ„Äñ×° *cÀ…-ð/›‡°Ø\ìÃ`dYàØí¤¶Ö|WS4§ÿ2¾|œ¬˜øyé¡ô±ìt u|ïøÅñ£—#Gž&ç""ø ¶Z‹¼ÏnåíP{©u§ò¹òŠÒIi©<­ Tf ǪϨ£€Í÷Õ§€·µЀsˆº#•úVDDýbž3iGgÑ34xû„T^Š‘déîÿ}|´+â÷ÒôÖV„ü ýN¾¨¹À›Æ©Õjj¤JÕ(µ"›T°¥@ìl<ÖÉj@VyvŸB;J‹¥4ÄøÝã€Ïä*òéSéiÄP«èpD ¿#>ëÁ¾Ñ²Ôj-õ¼ò™ÒE©©4V(_(;Ií«®Q#Àzwi•Da 0¼ý“ÖÖH ä¿åHGG}GIÄÛ?"ö—æI1ö"ZŒqР“ö:D-£>Röƒãm…”î*É·~ú3G°’mtûy²D©¾²¬¤ç© ¿í.ÓÕô{ú&¸]Iš‹hw%ä×ü(“=ÂŽŸDzÿŸ/ž ´ï ýÉÅÿ9C[ˆÝVµg°Ë—]¶F¼8x7hW{Q{1²Š'%a;ïK+°‚’’J÷až»YD:‘\ ÷DJ1ð!EX Áìiôðo"aVÁz.ÀdÑtøíÌ´uЕÀ ¬zô,œ]‡güJ{I«ŽHa ¬°›ZVõ*Á¿ÜjUhÓê^5S-Ëê õ$쫬ÖN{xsU öôÃîÎWº ¦4U)n÷} –Ú„–€mlCþ¿2*Œ¸uVqkú¯©LoƒMuò¬k©ÂÒµC°ä`À×ÁêÁî&‹×O^_Íf.`oWXרë"ÐÅ>Ø•¸[Kàýjò‰!a±o‰Ë#šØ«-*®×hµúì3à|]hîNÈ5&^úR*.͇ø,âö+\ö—úºÚP­¤6†_yv¶X=ïò 0¤X@ë¹Þ%!ðör žÿ= h}øÎâ¸J!jìƒŸ•%Mà·'‚ë÷¶?AJƒ‰yY$bœ†xE' X[øÛ’`\^0Ù½˜ÿtìðûàäŸb=WYæ? ¸™Eªb'ž›F_£}±#eh0Í&—±'5BlU >x?¸ÏX[®š¦J@Úˆ `o÷B§ë‚m¼]Ä«íá'ElžMJ˦Ac²h]i’t¸ÑOž$¿%?#Kò/RMiî5šÜû=­õÓRÔùjµ‰Úñ¼ú"|äXõ{u£zYejm8EØIg²–ßLÓhqŒQ1ÛjD }€=™ä9B¶“õxÍ/Щ:Ðû×£®ÖÞ>ðŽîVð/O –û øü¹1vú4â“Yä"˜rZˆªˆD6ÞÛ,­ ‡f&²T0øŠ`^Ãág6bç9§b•?cž„gÎ…–³ÙˆzÞ}©¯OÞ ;‹Š†f߆ŸðÀâo…-þ¥ý6¿T;ƒxª}#»æ.cßœ¸JÂ*FÂ㩤]F3èÒ@i²4UzCj*eÓŸè“ô¼K&¼ÊïXGsXß2 `K­æÀgm0¢„D­%XénD4É‚±7#¯‰Zäx`ÝDèÀ$D7ó!¯íXÕ*0‚-XýïXã7äG`Ç{°£$ô38é pÝ*ˆK«Ãžß€…,zŸ{Qk4'σ•ƒ÷[LÎ fé .°Œ†ÞÏö!}ßBݨ ¬=ì­,+н‘™ ‰DcöcØŸØß ¬ùmÜ1,àGŒÖŸÔ[ÞŒ5 ¯ƒˆt "¿FÀ—d5a Ää¿j¹ZOè5}L‡­Äç¯XÅxÇCÐemL_ç<ÎÙ”wûJ?Kë¥]Ò9)YÊnI›¥w὎ӗẑƒXÝqø§Gê•Û¶W‚•+ÞmÞ?¼¿xWzOx%°Þw•J!õ-õ”ZWûó ÜyßèHº-õ•ËO;V;2.g®ãªc¡ãIÇr´ –Õ†–>™ƒ¨ç.É@ÄW£µ¤­ðÙv‡nÕ¦9Ð×Ï# }ÁGŸ–„ëÒ€ëE`¹‹`3ýérz“z`7ÇèI†ŽÞdS1çð€­µ`šq°“X-ÚäUsÔ Ãí‚ÖvXB|D³ÎŽMF¶¥ zÕ÷:Ð 0Ò<·â~H7‚5‚Ÿþþ¨lóØÔQŠkŽÙ?´mNcè= ÔTDèÕÁÊrà³rEœ\ØÝ\ýU {gேøŠM‚'îÄ*"¦8¬-†ÿQì߸sb_øÝáàéCØHxÆÝÐÄ ŒT<¶ìm$lá,8Ð%²›ü‰~M~ÀÊþ€u-…wüÈ7?ýVܹý t ë啬Ìòr¶w_ûÛT+‰hé°ºZ]¥nB4¥Ö×&bíq`M»à›/:CgêÃCªˆ{{šª°¦²R)p…Þ§§èßàto€1ÆÐаnÐ\Bî™.âs8ÊDXM »ª-‡å€8å]ÜëkŒ¿N;»èk¹nØ•L#ÿ`ç XX$¬¾¬é!ðè[xõhp¥¿ñº ë`ì[OÖ¸Zì£(pñiø¬¯x‰¬:pqCïc®£ï4„—«€ÈÕM¯å¾Çé fà… ö@O¦C>1RU°·'!±ÀÙÞ`Œ“ «K¡I9¬të{èävx®Û$Q¯— >/¤;è##•²èZ A0˜|e²¨ñH[  ÄÎW«+¬Å„i²£ÔœÐ†.Ú,-EëÆ~c7¡ÁEà-¢a‘øt ÌbŒ•é9¶çèK}޼ˆ8}fq‘dB\4\#GS~Џ§ØL0¾ŽxO¼³:aˆÍˆ.…žð5ÀK[‚¡~®œ M‡ËAÜ–Šøm#¬»7ô 9ÖËŒ‡î\DÄ´Zû ßèQÖ2i¾÷:¼í6–‚Èæ 2èw¬âyDÛ÷i;i‰DåvˆÆÉC䯲"í„Ïm&ݦ“h~¿µ1‡¤]Vw‚Ç}ª¾8¶-Ø]Cµ‡ú b4î íë ÿóýÞƒl›Kc¥UÒE)>çœèáýqN©´t»+ÑŸ`?ÇY–¨}¢5ÑÜÚUØÙ u°ÚIíˆqû‚½®~§^P+¿j¥aï«ÁdÃ!×áë.‘\H“Yvª'ÀL€µ¯ [ñùxË ðÐ}È8Xý°¾‘˜Óipy•&Ñè»Ðƒ°ŒºàÃS!áÛÐæyˆ‚>„¯}Eë/ô¬öºö­¶ ž#H4‹=`M±‡{H |}4\Å.n•#×CÌÅ5(8ØÔþôpÄÁ`í_€½‡žÔÀþÆýxÅ» J?Aœ7 ÿ×…üŽy÷Â8çe‡²•¢ã(I=ÄOŒ¨™j[D-E`í—Áv«AWšB£ÂW¼­j¾Fg_bgK„?:ö ú³ ¡±q<9 ôû Ìù%ü¼v³FéF^Çl>Áëþú _? Íâ+™{¬oWš× (÷ƽÛL€®I'²\𪠈¦÷ŸBÄöì®æþ £8|ÅXìD_ŒWxίÚ`ìÏâÞ•¡·Ç.‚L¶3‹Ã|Z‚üˆÙLZÌÞœ~ûV ÿVv<Ž‚•ÖD<À{ï4ð×_a#á!^Ãü>SÛ éd± éP ýnìQxÎ䓨0u¤­iEš‹‘gã÷5ÀîV"ºŠÙwoL×Nj»±ûKµ?áa6h»àñ½Zu Ô/XwuìÍ Rˆñ1vì]Ú…Êt)v²&ÉFäú1,+‚Ý·\[¾l @¶:°¸‰l0‰;öFÄú7°±.vüKú3¯óâ|B·Còíà»Rà1¦€ueÚiðäßü -ÄWçq4Ç|·0fÓhÒòê ùV /™4D´Ø˜´€zþï)hýHð¦]ääÞ~ ù ðf Öÿ,ŽBÓ6ƒÙŽ=ÓXÑÛ±1ÑÑ(D½Sçõ§õ å{1÷ä{l~6âÛˆ‰î¨ÇÔÝ`k»ÕðU¼®ÕÕž§Y¦ÄÏ6ÄÙ‚èW4 qâ}©³ü•¼HþN)?)_"d‚›^„u^Âyµ™°ü4õ ¼ëßê2õ7u " cêõ¦š ãw“µ@±7¡5Ï«cÿ€w~‡h¨•4NZTÙ#­‘æHã¥.R¤tÈÞ€ÞE”2¯3ñ-÷^¿"&j­•’{Õ ü_±ÑsÚ m<¸Å*-I«ýú»ÕÜm7"pZ˜…ƒÇ'ÁwÜ#7¡Aó0neD  ¿Ÿ€¨ï!.;Ÿ ”hÃE—Ã×}-ß;IAU8Ó¬ã<‰6N¢¿™?O»IW‚c•£§™_싘é2b¤‰¢èxÇ!õ¾ZLë Ï»1T1`ý+àžKa=%¡ŸÃvoXìÙ4`[I©³ÔŸ¥dðÚÁðh«É˰œ}ˆ4*²ÚJí{0Ñ©è8mÆ¢½hlb1ß9¶–V+œN[¼ ½C¡fo^•Žâ=M"È%pœÏÙ'Xç¯Àäí`aG €I¸² úv†v·ƒLë"^ôà7w±‹+“ïÁrßRËf•€¯âq/d^Š–¥Åàñ“É9¡³#DK:4uæøû‘MƒžÂšÜ`×ay?`¿ƒÍì‚ý1­pk0!ˆY3Ö0 aæ+|·u|­ž‚ëCÄ}¿ ö𝆂‹6ƒ}´ÂŒ›“Xróì KŽƒþİB¬$¸oÄeGX Ä”¿Ã®Â k/‚1o ñ4L"FòÐØÕýt&x¯Dש]d{‰9Ù­;x÷D÷ijE~J¨s±Å=íºà|÷µtD(MÙ(Hö&t¦´¦„ˆ³KÀÒ›ö`ù½À²Z3ãÀ5D¡Áø]}H¯öe âÛþÀ'Øäzèæ håhàÆ<ø„  Æä(LI`áôsøý/hïÀ{C{žÇ ‡]Žx¶,9 ›©ø›6ñA(øoüû“Ú;ÐÁ­¢€wÀЂnƒ~g³Âð']¡i“`‡Êõ¦oA*ßÐyàÕ_Ð1ôYZ¸yó!VQüí4N?ÉvA{iU´t ÉBõ[õGàÀ5UU£«ÔÇo>ÓŽjeÀç® œO‘'€Nóévz:Àa«€Ã^A¬Ò•jðù¯‘*ÀÑðÕcÙóˆÙ »¤mƒm/ÑþÀÿ÷ÁÙÛAçþ„V…¬ö“BôØI*m ”>“>–^'¾w¤Ùd 0¾æy˜°QåØyp©@hS€É¥0Ú(hÈø÷æÂ½Ÿ¦ ‚õt‡O«ý‘áiÎÁ2ö°“ØÑ ìi ,‡$¬~¸+Ï:6ÆŽ?Å:³çÀ±ë±pv±ÅfèñeMƒ×/'*d%XYpÜÆ¸ÿtøÍLV¶¸ ü­xò‹¢¯“È+F ò|HNC“0—b¸S&°=^³3vç-¬y8@-’Þø˜ó‹Àô®ˆ§ªàqˆ•‹ã>á?‡>Š•ßŽ°¼bЉªx_-pÓêðêOâ>%«áSÒI(îꂦSìo"ˆ8 &º/€NÆ@“fƒ·€?Ì…üok©Z(4«=î1Lé xî­ðïaÐî¡yoÂ×~ËüœäÉAÄRQpqŒÇ³ƒãqß ²L¨¢ÐHX”òŠa…1z Ä ƒ …ˆý—·€¼“À=ØŽÉ V’É&c5•€L­açOÀVšM5ÇìKÞ3Û¤Û.ôö±%|j]xøùKÀÕùGØÒBàÏzvQqH¢1dÄß ïô)üÇxXÝrp‘pàÇD}c!õ¡@Áö؃h0—¼?ƒ=s >d 8Æ7Xч`üß÷Ù[Њ^ІîÀŒ‘øéhÆZÃ?ü^{œ÷:¢ˆ=äO2Ñô;Ðùž˜iF¼ ž¶³ü >o'0ê8á1hïߘ÷ XÐHýE\ LÀσÚéKàƒàÿ‡ƒ ΃œ·ÁK%)ÂÁ¥Åբ̀eý)×ÅNvŽÉd3´¿¼ÊRmŠö²6@ ¶¼ñkk…5| ‰]Áj£áOºAï~€§:I€±; 'Q@øÚ¸ÊÑPøÖƒ¸ï X›Æx”8 :¨h‡_~¬ÑFÀkÖÞӾіágwÁ/( ?í…ìÂ&OÂN„¾í:„Ò¢ˆ¨Ë·4Ƽ£è ÎdØc5Ì7ñzqû÷;Ðk6pbÛ©‡¦g±è8÷#€¥£‰U†ÇÙ†ô3› .À;boÀÇE#J{#_Ö•¡MÀ1»ÒžˆUÛBWo@ú“(² z_ž%ƒn€ßýS[„˜òm ¸¥ ¾ve=ôD…'á}ó_Cî[ÅlÀ»ß‡öÕ€íÞÄþš­ds`+ýVB¼ÂÂòLÂ\NbÞÙе ÐäÎгOÁ1Ï#ÆM$WÀ‘x§É8ŒÕ¾â0¢“qàèO⽜×w‚¯U®‘Ф+ˆÙã°ͱ–Ú´$ Ã>ç’$ø‹Å`[u¡[ÿ@ƒ:ÂÖ’µ Ú^¬âw±ž9ð¹s°/ûáZbEñ¬tr EtÕŠö¡#è{ô3àó,ð“á= ZÜQÀFÄû£€=O{jAa½ïCÊ+ð›ÝX׬,UØk8"ìò°3ÞŸÿ"…Öˆ• —ïc×öb÷þ€o? \d:¾š ï¹_tapÍk÷½ Tù”,"ÛÉ1¬èô›Kf,?„\Ç.| vÔ“5ޤ€ íþž†‡B  {ž%l~9øù1ì}0pƒ×Øn‘RØõ‘X׈+§ àQ§Ó @ã6ˆ5¢aä÷ÁŸæBŸŠ“½°äì„ö•Ö>­´VX+©=¡uÔújCµ‘ˆlù©²elüÀT ×#V}\¼âÄUô(½Ai2½Dÿ„Ç*Bƒ³¼®R;{ l âW}±Âyíª–¨¹äMaé_@A` ü”Ò@øºLZMê(½O×TR‡Ô¤C¶Á¦BÙ60á–Z1Í¥)j6âÎ5YÕÔ’Z Øödìö^í‘6ÔKx¡tÖ¾œg(¿tg08ùNzÞ¡'è2ìûÓ¢«ý+XR)’ D^k›É>ƒD§c¯¦á_ýÿïðó•ð8ãß?°Ã7 ƒ~~mØ,p÷aƒßagáUGaá^¬¬fßžz0xÖpòö*øõ›$‹81«2`Õ1·hèÝ1ò¤öðø5Qç ä8Æ |z-XjEVVõ⌠°¶é¸ßzvFÔ×.açgC;ÇAO&a?³}ˆ\›Ã¶‹³°—iÍj´‡o,‚q»ÿ#Vûûz>œc4¬XÉõ8¸{2,?z\sù¶¿èµ Ò܆‹×%~ƒõÃþ2XÂ^ØÄXÅeè4ï%*»Hð9ç!‰ÃØß•âóØoÂRŤjYˆ^@ŠrXWkö2d~Â;Òö“HÚ~K÷Ыô"öêìRHç(âˆîðñØ¥•XëtÁë7ÀÂ51ªÐbIÀÝ‹ªÈ3@£Æ‚»4{é¹£ø–²Jć0ÛxèñCv×}\ñ"oà„§ª¶+,™gÇ:B7_ÞŽAlÑ÷Š{u‘HR¨Þ ˆö9Ðä6prY޵ ßOÅk[’Š`Áø¬ŠHÿH®4® PìIxï§±¯ÁsÌš¯‡mÅ;C˜ _ÄO½ü½í „»n9xóf:Þ:˜Ã;ºž‡”Z૚¬{6ðo4ït.§=üó{ˆœb> §;p‡¿n“ÁrZACJKე§ +=ïu8¦ô<Ö7—l†opCÚM ‚w^Ñr¿Æ÷V– Þò;¬Œç›oi›0×w‘ýR¾ÿ¹ýH Á÷Æ}¶B§bàß^„TBZ»À0î/˜K4¢ÇTr–õ%æý6<ÀdHgÄn;ÈHb ¸T(ý¶×~í<“(\‘Ãp ûRQ£wúb¡m$Ù ²Œ€%…BkãŒHä ü×>0Ã}@ŽtVV02ã½EàǦÃKϤoÓ–4¤ ìp·°®(DØœÃü Ÿ¿s8&E< 뛟‡½Þ®y £žÁ*o`mi°t/îNz¿á§ØJc†1»ñ¢;»2MœùºÝºŽž#ºçJož€N7‡n¹W€Îkã tj$øf=¢¸_qñ~ÉõøÉiȘó»û°ïì´6X`È3`ö#`yßþ ›úYÔxg‘ïá—¦‘wÁ:cü Œú#0o PþèþlàØ¯@ºEðFÁ‚§óüÆihô위Y–} aØkBø÷5D6f/˜T=ð‚^ðÜÁmÏྣ°›!ä$õ¬¬t·6««Œ˜Ë ¦«­ã𓞈ø‰ÏvÊ%Äé}àû‰SCS1^yðä-à‰C`m @•@økØ^‘ù@›®}/øñ=i%aÉ}ás¾ƒï<Ž=ïPxIÄWoá yR3î#Î<6‡þ„ÂG_‡Íž…ž<À,Âñ®F¢vñ4tšçnncý{á§6¼ Þyîpï»/jø•`åS ãÐç#°¾³ä.04—ðjÇÌ~%¤?| &äq{ù»ˆ}¦À£L…Ü?Dü4š …e·†òX´&´5ëtê…ëEÄ-\ß6C«¢/žs…½Ü‚8ô ¹Š¨è(Pïkü¬/æÝóÀΞÆÞ}÷¸U`à ðˆã°§k1ëŒð™à0Nð_õUDÇ¢|ž ÿ…“îŠN›htþ½ >Š•ïƒ-ï=ÔïÀ#ö„=4œÃDÇ“G{tOS´¢`·¡S;¡qˆ4GA—Cw ¦.ƒ¥ÄP ³_…èëuȯ<Ã\RåŸg°ÝŒïì[) Žñ»tBØÃ°ƒå`+"¾ ä~òÿ‡±×Ø«øwô`æ{ûS’ù~/˜>ìJ¿¤3è;´/8 pýuØš†QÁzzÁ³—‡í; ŸYZ:> ¹<ßk`¿Obv¼W© f6 žæ+`ãû°ê1ðç}Àº»ÙZa5u ÃH1¾‹ÂgŸ‡Ì6Búk ëûØ)D|á%!ŽQ°«¼.‘r 0‹ç¶ymH¤®RøŠwUWÀ]¹'dÀæ{Ãièàqü{c_„þÄÈ‹°çßAO6b/P(ø¢ FÓ’ü|pô”Ç\Ë —ŸaÇßÅ >ž†¯_‡Þ¥í€l?‚fNF¼ù#[íŸ _ú!4ñsàÂzQáM‡l‹ÁJÚ@¾ÃpõÇ{«Ý³¡+WqÝÞD‘›áÎOãßšÀdº‰•_†$·c–ßà# ¥½!û¾¢ëmXcè~?XÅg‚»œÇHp7.«pŒÒˆú:ôâMH}"v`5,.ºVSVû-sÑÊ[ðxŒ—÷]cÝa ÏáãÞ} †8Òú¿›¯–O/C[yÆ$Þ[‚ü[/F#V€m;Ç.…ˆzg.æâ>T„=¶çõ»Àû´öÖBrTÇÎìÞ¯B,½Þb=´ö,¤ÆWB0J4Ær_îÁ÷oÀ«V·ÖƒiK…NvÇì?ÄÎŒ†už;Þì,¤¶ ºú#0úÁ²ßù—)XÉRèçàÄZÜÇÇp·4M†ŠÎü˜áèíÛd:|Âv m6‰E,ô4pöÚ™ÖE|ôBxªçjXÅŸð†Càk™¢qÅ–†ÔÚv†DŸoê{šÁc‡CØwÞíØ ?sÖ® VÒðÿiS# ­Êa.NV bÕ…å9YŽ– ].س/{,d dOG÷Á¾qü{KH 7aÓç`gûÁü=@ yØ=Þ+Ñ:ѺÄ;¸xVg;®Í¸÷¬G!ÅÃ@SBÊœ©‡Á”…Þ×z·zt‚ÜZb^€'…ë5¬¦3$[ +V….ƒ&|Kæç«8[ú÷Ú€àØz¼o2ìj3¹Œh%’óW0çí`3¯ÀhìZ Á(è]]è‘^*ƪÃzAÚ?aÖg±±@gqïÉä¬ýÖ{¼¸5:ü”` ÷±’@c°?S` ¿@wÁïÜÀj˜yø‘w€%?bÖAfÀˆI<ìs3bÞ›ðö1Yœrœ«‹HRApN;xì²v ×mÄß2~^±÷ Ðó_p‡›À÷òÒ(ðƒ5À©ÝâY03}ŸbÎ#€ݱo¼:÷6®‘Jkì{¬°(3]…??ƒ•^Åwi˜i8VTÙïë ý*:>xoçd°Ú!Ðî†Ø¥Pì6?y°xº`&ä?Oø‰¯Á3'aã¡Q‹1?ž÷M‚;à«y…¶ ¤Ïë„ó ÿ¿âóghäTèc{x7‰Ü‚e­ÏÄÎ̃u­Å÷|„à¨úQ ÈXWÔH*Bwà{p÷×YKø 'KŒ“rÃg4‡ û¥^rN‚…ÿ L`…:/bEïc'¾NNÃÚÞqë;˜WÌ‚W*A¢å ½Gº´àF<‹¬)?©„Wqæþäþ!¤ý3÷wÄ×ÛÃ} yw?á]øG —ï€ 4Fe!LÕ2Áõ˜ÁÊág0ËW`Û¼óþXP+wŽÓûšÊãßàÜ÷ÀbK¹Ò'hê]£€(¥I.ön+<çLŒð2îÒ ¨\ƒUYŽËC ‘Óà-vÂ?;ŒœÏkFb Y ?ñ't™Wk¿ÇžVÇ ¹ƒ¹,ƒ×ÿöv•w|®oX)øÅ:àçüïÛ[¬KíIÞ€žLÃÌ߃4Ga¬¢g¯:äPwæÜ²"¬—_Ú…Ýlûþm28ôÛ¸Æc¯ÞÅw‰“~â>Û°oÿ'n€‰j@µXŒÑZý™?úxÃÓ@ÎB"ÓpR°õ-°Ý@µ›°ß 0ÙXu|Ö'vy· vn¸À”ÞX1ïx‰¨›.úo8¿å½  Õ_Ã×~/êŸanÃ!u{ÜøúÎk;«y v2úü0ñ>®«Ø¡?!‹×1þ³ÐªFÂw^ÇJþ€4ÇazÂbÇ+ô„÷둇BO¾5Õ„žNÁ¾¬"[ñyõ3à™{ENh fÞ× c>uE/Ö»G`¢>Ó`ºƒ1Ï©ä_à†;Rœ/…@Í`Ý#ij£~ƒ/Z‹kôw>tîchnwÈ“ÛâAì÷,ìÇ`ØRK R%°›Â¸Êâë6ïÖÞ«Š3ê+ËDuï|üy ä.HàSð'nÙ.qe˜ÅGð ƒÄÊG`äo!e~ö8ñ̯×ÃwÜëfCNÂOS”Äû+cÎ¥`%a—U!ÍŽØõEîóøºv·,S…ޤ`ϽŒÿfÎܸ¸_) &éð;û¡½s¡qS eco9n-R-ÜçÁyÇÎHò t Bª/jk³ £ƒØKXÝiøðàßCƒøº‚±º³XÇàÕ*híO‚éŠÏÙøn/$@ïÂÖâáÏbM ¥ØÑ\Á`k‰Þ>ÀZޏ#aûÃ}:Ì»D2°‚-@û9ìÌïK\ÜËó\ÖrXÎqŒ“ 0½O5XDñŒÄç3ÐßÐŽO´ËáŸW`Îß`Îð»jÛ+xÈ6àøw¢¢9 ’ѯËkø†èu,0}&ld´4:ƒ;UÂîµÅÚß„öÍ+û ˆ¾ ?wôö¢~ oqZ½ š°a%v·Ðo^¸YœÁž^À¿‡ð~ês-ö›Ç²Ið§e°†gD<0¶Í}çÓâiCÝ /¯@F\R¯à÷D/¡Þ•óøÃçð—cÁ)ø÷Fœý,>_Äz¦Âî÷cd ]mH§ƒÈMñ¬dcŒP 8Í+$2t†÷åp+N«¯`þGq±ôASçÎï‹|ɃŸ,ÿ²@Tæ@_À߯ü‹˜º•µ=¸Œwo´ùs6Þ…UèR~ ³cÄò[„Gâã_Ù@½óA…Ô#0視×ü®µ;¬¦ìóXþ¡;Ã1“ ŸNÀ¬§°ªj°#Lâ.Æ9Ùó¬Ànãœwðà÷:ZâÅZ ¤+¨+º(C«¸ÏÛ†ÁŸï“KRàýö©˜åqîw!â™öˆ4í¦vTÛ%N¦œ×®#6| eˆ*G-Öú5RUYÌûU ×—ãJŒ»ìq©à \oc\~Ö³%æÅ½~ü[ûXOÄXœ¥G‰Üâ%¬ûö]@±ýã9ñìŒ[Ám‘[=ˆŸ€,ø^Äúw‰LäJ£ºùHT÷¢ZKâ™®H> h…ñZ{YáÙªb a·-¡“]0«¡‡]E–"ïKÙøcùØ'÷oëaëÁöyOì#Q÷.,,HG1Þ¿=DDz_A{~„Tàÿéðþq/†yo€ý½-j-+=Á³vÐí×r}\˜ ^ø#®Å"’?…µf‰h¢.vb(¢¾¹äz°ÜÃàºûñÕbðÁE„ÝÒ+ ÉÝÀ<—‰\öÀÇ·€ã“› _ íÃjn‹3Ã¥1j[̘[þBçgAßyüÞš^²Êù¯µxßàîàê{˜ý[Øé70ã©s%vç$^õ#ÊÐì’ð¥!¿ðW¼w½þçøÕVt°7ƒ¬ëÏ›C¯ù9Ÿ'~+ˆOVrCàëCçÁÝ:¿2Y%òÌ[¡áÇñÚtÑ÷W så{m€-C‰ŸAæ¼"8¶< šøœ¨½ðÚÊeìånÁR6`B¾ü,Ô9Áwî² ë9‚ݾdÌäзۘQ6âÎ \Á¢æáºä¯ùy¶Žs¢4QÝ9{œ„EÞÄwIø™Wðº0è¡›ðgÎ{¡5¹xu.4”[¢É²* ¼çWe|Wž˜{z®éGp‰\0Ûj.?ÝQäâ+aý¹‚ÆÌ7Š,ûZ óHèf“Çñ¦ö¥.p¸¹x&j'¼»=³v¡3¾o'v§¹àGe0Û4È…wdÿŠÈ„×KyEöw¡ìÀ]vCZGijl®àºù]õ‹ °¹ðlËhå‚»¼ „€¨ñà\G ïϬ†‡aÞ·1Çmâ\úJýœ†Ôu©e‰èbâ\Lc‘Ùä™JŽeµ±–Â$GË¢FÄOÇlO£à¾éOÑkvsJä‹@šOBbmEWE{¬³¾¯ )óȃç*C¢D‹Çi¼ :¨Î#´_€ï« ?öóጭŽÈv%½€Ø/Ák>'¢ª¢°íû˜Ë ): >‡5ó³ÐÜSŒ?y×L©„]àöÑkâYŠrX‹>/ÚÏýèyÌâ:¤pC|÷>Œw_Õiž­Œ]®Ï"Æÿ¶¿Q0­L[ÐN´3mNËSœBLÂjÃÉ90‹Ñ¬«"žxW» ÂÅŸñõHc?ÉÒ¬`ö—óDîy.ùEx¡7E-™3±wãïáÿ1À°!ÂG?)zg½ÐÍSBãÖ s+L¹’!¥æxeW‘Í(ü¯r…ĺaˆ:C$,( {x ÷¾‡=ÏÀ yD­à™ïm"ªýœäáÏÿáOR^¿ºE0Œ5¸÷á.ãýܳºì%DßMH5Òr‚µe ïr=‡Yž…]¦À&BÀ4JA ê`=O`Ox'rêˆ:H%ÑÀ³•}.Š‹GgÅu ^ˆ×%Qu*‹w´…d†‘)@Ñ%ˆØ7‘ â|êd¬]ggLä-· ¾ð 0t’¨æ~<ýZ¶Jäøó;½"Î(‚™ñìCU1§ª˜UU‘»òb—1ËÐepíØÙï‡]ÂrÅ©Ž¿Ü—õ€ô;‹ç7WM芛☠·{ƒ÷uðêêÈäŽÀºÐb^¿iD)vºîÞ#õƒÎ½])Îô>ñ‚ÅÙ;˜ÓYa‰{€Üców¤]äX$*+`]°k›EVè¢xÚïô«mi/ÎRr6È«‘ƒ¡;õEL–…WÝ}Nx>+YäÿÊb—ªa¯êc÷ªa”PàI¼È,ó§Œáì֩ĉ N-¼¶ð@5D­9hîÅ+®Bü D'°‚cà0»ãBW¸5ÞÁ=‰¨ŸÈvˆ>·v¢«}ìä Q~QþHæuè{GQ.)¢üt¼ûV»\TxøG¢rð™ÈnÎÞ~´b•ð;œÏqœá`M¡9OA.O „ª‚kcÖ•¡|ÕCžçoÚànõñ“ŠX¡ž?)‡ïêa\*åÅ3(¤˜ b:^CÚ-þÇNìÎ.hÎIÝ ¢£ã)ïKÞ„]Ú‚ù€4xŽþ.~Ÿ,¼÷wœIñè¿8fÖ3àÏJx š1‰L%3È4àþ$QOî"ª&œ·¦BŸN †¶Ÿœó Ì\§»:b\ü§zÁ#æ}ÂËœwFÄ:N(`.åpççpþ<ï`]ܯð~9žE/5G`gùS'‚`ű"ÏTCø‘Æø· ð?9åöX÷˜K±â_î=~fò~p®±?aæã=Þ9Œûgˆ¿É3/ Ö<±Ør ˜{žœgÞ~û›8q4û‡¨éüÇbÄyïAEŒÊŸ!ùŽàc?™æD”͹È5¬/V¬÷Fó| ìmsøç^°ˆ7 càž<ÓÍóÏ­  a"ãpÉ@Þ?µüè¬gŽù© OÇ×ü0 ð›xm2‹†~ôÆ.½‹Ñ>Aœý<õx`þ¸OOqî½,²%î^NàN4“ßã(lê6°–½¹òÒ:д:˜i%|Ï3ž1x‡[°£D¼ë0´‰wr ­ÿ@ôaM…4ô,ûnÝü 6?Ï"™d³í„Œ_Y W ë>À²ç±ãÏŠˆ¨l¡ŒÀ±Lá79yŠM"'¶_í)ÃèCàU”0ÁÜ"€Øå 'M`9±N5òüR8öêŽÈ&nÏ,Z,β.×Ü-êi›Ýð¥ºz3H§9þ¯‰UœUØÇCaG¯sAJ<÷™‚ûßÑ_ ï6®$ð°¾Ø» Â/¸Å*î îq ’åì:¿åø,¹æP¯ 1Pó¤Èríÿ'CáÙ ¶å½sŠ`ºÙ¢³ê>~ ²å>a;°e,j©È{/QÉjoŽ‹L<¾K¶ˆTUhŸke ïäÏê-þ¢ÅtD‘ßOásß‚­uÄïK`þ™˜÷qƒ9ü³Lô‰ü!lz¸ÓzÜå:F†´Ÿ† f¿‚8?}+­hðîy—ë ìã |ŹÃIá-/ÂÞ®ˆ^DÞùœ-:Ÿ«C‹zb¤ÉˆÆ–":;+ž¥~‡\Fœ¶–̇ݾ <¬«öbܘËö2ëÊZ |RÄuA×Å×vdýÁÛf`¾ÛE&3{ð Ø×D¬÷;QAü6;sî„×…tÊB/K })ÙDb×5Xé-qNÈÔŽ3éS W'4ƒç”Ûˆ¿‰ÐWw¬ý0ãÐe ;yïÓãkÎ?ˆ\æ!Áù¯ˆŽ@/öYÏUGã†Á+p¶tï< ¼Ìnƒ™œ‡ïÂ.Ò„Å`†¼Û‹×:ˉÿ¹×ÒÙIi‘õª%r´ŽGÁfB›ô®Ó+XÑI±¦ýЗ"9 r,7ÅÓ²¸gâ,[8÷Ï`ejoé¦À/½%ò‰ 0vtåŽèÝ=„±öãߘ)çÐ;ŠQBa=¸ÂDÖ ¬J_-?ãõHäÿŠªÄ6§ í4Ü=\¼ÒÄÀhçS¼S8AÄ´iøLÿ\ ž,òûq¢ ®(,‹ïbüL…ÜÖ}ÔèV¸…]IÑ&ï†åÞØ#òweª#²óœÏ‘ã!Zˆ/o™‰Wó\¦i.H•W ‰¹ýx|?Jâ»0Ùò?GŒ[‚O~úˆðàÛÁé6‰H™×öx…”ç'â„/¨%NÞ5çlmç}ÝCDVËŒ(8{-2~¯Áö†ˆNöxW%Ñ ¬³dÞyò. éÇz‹N¹øŠÿ]7`cÙDp¨/ðJý?ØÁ‹U¢¨I„ˆ¿qÆ«'Evò¾Ž¦°Í–"‚l *²ü0ÏÕô†ý 4ê CD^²ƒÈYוþªÂŸÅ‰gÇÞ7žvø;ìvŽˆ 爾Ž[›E/8×ñÛÐÏháqV:Øå„”ùSñJ•ûÖâI ±öq°åwÁMÛ¨&b‚¨ÿ>Vtræ]³±Ò/ð:õñâ¹ât.E¿ ŠOE¬Ç†O é)˜ÑHÑÌeý.^Uà8×Wô{Õ„&gÚöçÀ#¿ Éò§ñ ½>oCÂïƒ5|û¯Ç¾ßÁ= á=ü¬ÀÑE±üB~B´3H<?¯!"ò ‘×€g(·Á66 Ù ½Ùýá~ðžÈÃkˆ†£°bž;{JÔiF‚ß¼/ªøÏcÇ*NÿP0µ-ØíïD—ÇXÌp dÁ9ÔÑçÃëz¯faha#ìc/Œ0JÔ&ÃêßÎñÞÍ.Ø{ÎþÂD&Çèø=)l3Ý*rªçÅÓ’¹/§[âz$ö•×y”š%N{òÊï²ã‡gþúB—ûâÿÎ"³Y{Ï‘‚³SÝy¤›Fd 3ÖqrŸ`ÃçÄÉî?y⨨à•ŸD_lHŠcDq£Ÿ¡P¿¡È®ÕÁwqci"[t#nüSð×y`Z?‹'‰ÄJy+kHHi¢ÃÀž£âˆÇ?ÍN]Ž<–ŽWqÜ»ŠE5϶©,jÉNƒí]7žú¸Ùˆò¶BvŠ:GG=ãXÃÇfšaßyçšžû~UÔF‡"´´’x¾ái1&¯­ÀJ–÷oOC9!j— Í;Ââ’EÆ0[Äö:UÇ(5 [./â#ýyÐÁ™û“G¢s?ûþ„÷g%sðo†Q_ÖãÚ3ØŸ ‚ Ü–­{™0ŒTDØvm‘{섵ð˜›ó¤¦X§nÍ™˜Ûe‘;Þ&*õ<[²UœÕ8,"Ô+Ø•æ²8!¡W%[A§ÚŠ.ëÚ»—ޏEýó´•ÿ¥#§,Àç¯@Ëå—×R‹ìF"t3XDÕ­!Û7Èûä30%~*b"dÜ,ºÈ¹ò'NÉâlF6>s }é"ÆËäóáWŽðÉB‡ï‰³y9¢››¼âUœ¥iŒŸ”p æËræˆ šžMŬx&õ:dqÞˆûN`gõøšË4Ûzºˆ2=ðÀ!пÒ"CÃOuóleH¥5XJ3ü„Çz•ÅIÁ¾“±;G ã5¢Ëx¾Ò#Mž9=%4…3—à º¡Áb¦¼F¤sq†u(,WðÕ4¬’𓑸"D½·˜Ñ§Î£qa7ûÄ«OÝDå Ÿ¨Ùðø¤´ŸÍIìxïÇx´il2u4ôzOôœsìÚ+üçe6WVÍ{àú‰ç¦qÿøFî"²äÕp÷"ÂÚ4Ì‘÷˜_1x(gzþe¿ðÐ;}•§[¢FáÂ\t=m$2¡ÜêzŠ:ûKâd·¼7q€7|QdiyäÇÿ‚œ$þFèèØ7¢tëú³n¢k·7{ÑìñD®E°É#ØÝ4Á¼¾+4?Säø9µ~Ö:L˜×fৰ΢ny˜»¾u¾x²Ê·¢2ú…¸¾ŸßÅþqÏË_çtkáõ‹§D]ôu¬a(æÞMœœ{ W èH‘Ç 8œ*"ųƉ‚‹Û=†©"ŸÁ3«ºÅpO4 ó/ª~œa71A®8_¾Sä³–`½?#rY(¢—Åâéî«€w¼&Á+r¼* ¤áHͳNõëhaèÊs¸G7üßVÄõEÝ«¦ñLy3â§ÃáÌ(INìŸÐêmø9?)$ÎSY°Ê"kù„ÈU°Ó1‚{rÍöˆ“—JÚN}qí8 Î<™¼I±ªŠÓ†ÜÊx]k[œ5ó'“EŠ*çç5Deº¢è#Š5zTBD¾…wÚx`Çiк;@æã@¹mFGÈVÜó~š,¼§ní:–D ¬_¡ÂÅ ÎTVä@+‹zHyÁ‹c0‹0ÜI/Ua«‰âNzlvVT9Kì8Bà3¯ò•}•E0r¬èÛV”-j§7ÄIŽ«¢J{CDÈÄ,P´°è2l*rÏŠ}ë$2ª¼gš÷JdŠì‹^W>jà9œ“ ž¯á5w„â£ê±Eæ%ž,‚ï\Bœ+‘P´¨¹°Ò}p麱jO¤ VÎ;—Ѝìˆè)¹gÔLtæÏ;¢Ähº¿®‡«ŽÈV0²cTt% ÈÑãºè†º$¤÷@<]ƒŠÜß}žA`˜·GìZ–±g.1C0N¿\"ÞûÃûßôëøªkEªˆ_²}þ#Wdû ¿ËcÒ(ѹTRä0K‹ìnMèaSñÜ«§3¯‰ß„ŠÜÃèÖXÈZÃB~–®•Èk"—¤ó(ž÷«&˜RsìZ\¼ï %l±¾èå-#´*³äùQ~Fî(”gãöù*ËŒ*3çh7EO±,:ŸŠˆ½Ò;k FÄ«TüdcK̶¬½‘èü,'|7yw=ïDH4öÊÃx†$ÛØÑ+"kÍÑIÏ2p^sSDÉ‚-óȹ”È·q4á•Õ†—q‰¬‹˜ëVqÖž?ãy°ôö°ô[D+?³þÏ«r¨†‚5Ã,¹t[‹jí“"ǯZ¸‹ÿ”Úȵ@ßK½—Žà;·°V®½2v8SÈï¼á×ùÎ=v×Em¯ƒ?õ!2¯+jåŒÞ~ç' ›å!ÍBâ¯ÌIâì÷œ]ÁHGà%wŠnþÀq.`µp¼b¢o †È–•Ù½gÎYsvâÁ(zEIïÿy dÉŸM…w4Kƒá5^ÊwîUÇûùß#¸‰ûmYTAφ,gâ_ž=] ݸ€Q‚±Oã}o"bùPô¨¿*žaÁûŠˆZâ ‘mçYÞKÌ=Ãe‘9áQa8°£„À7^Ý©,"ï8*q¸8jDºþ'8utÉŸl`D¸`¢¥*x ï60ü –A"¨³Ú4aó †Õ_Õ$þ4™s"ï~Ñw]µ–{"›™.lÞ+ªÕn£ºÇŸì×~—?éEópŸQ¿+ Ôs\·õ“f¹b7²ÄºnO4<)*.ÇD~騨—óS‘¼ èþ¨(f_Oܧ|»ê}”/‰ÊBUì5!nHý˱C¿ý?‹'{¬UþÓâoŠd+Š0"›BmJ‰(‹çÌ ‹(§¤è­&*Íz6¶ª`™E…fò<ÿ Ä!2 %D$Vۨ̔‘%cé"ªZb?ë kä²¼k±<æ\Xô&cω®ËmXç_¸×ïø\.:¯‘¯Q†áõ:æì÷]uOixÜ\xz^ÿv`¿2OÞê.v?^0¤L¡³:Ÿ© ÐŽGpÍa»mqµöÓ4B<Ââîc7¹WÖwø€È°íYÈ“"–º$NÁÞÂ}î‹Ø-]DÔŠ‘ÍðÍÉq–ÓðaÇpˆçH8}Ì]·‚`ÁÏ‹ñK?-b<Ƹ¿ä={×E·^íÔ{2 üÍQJ¦ÑÁû·ù§[Ø(—Zm‘Ój„«¡¨ê5¤êFý:]hôUÑÝuÝÈóÊìiñ7®CŠ÷Åß·º¯yÍöª8™!b Ϊ" EÅŒ?‡;ˆ½é,j/ Dm!ëËKä.ÅyQƒâ³Ù!ªc&_ZmX.z…6?ö`–0óTQÙ-$Î<ðìS9‘Õm ´¾èŒ¨.2óüŽEDF\ïýúŠð¹z¡nÂïqÆcàm)Q™*,ž£ þ®°™3ÂjN^޳Ð\Ñ¥[bUqBOêr{QçvÈã¦R¾š#ÇÞ{"îØ#:ä×aukÅ¿ëDMp¿ðñ‚‰¸…Æ×4ž¾8€¼&bàQdø@?ÒC<ùûIÑ™¦a†WE^m›8wÌ«ÅKEÅ~·Ñeím’È!yƒ¾¯…Œ¸%Xèž"<)cºq ï-|O1!ó²bÿõȧªèU7ó?¢ª“ ýäˆvMÔÉyÜs\<-èˆèxÐñí¦^¶q'ž×`†¦…‹gNVU–º".¨+¼KÁ@t}#"'”adb2 ;~$XÔÑr(vGø‡ÂzùÊÓÄ|Yà@Œ¨+ĉle£ËªšqòDâÔÌ]Áîô<è^Qk:)bÒd‘J‰.ý‚‹–šÃÏÄ=.Ñͪ3jž›7f“&ÎADÁRÊŠÎÒJ"úãe¤ŒÐÛÂ"ÿ'‹s%EÞä¼Qß8*øþ~Áµô:?ÅnõÎñÊÌ&–ÂìÜâ™à)F~÷žx*RŠÀáKda·!¢~ÄÏe”2ê[uD›ŽÒ<íl—Ëøð·„/¹e|uEtéÏ@¸&â³$Ã_rtâ±HœðTõ ûè zÜ`üÒ¸/ïýx$ºŸtÍ{røóë¹î^À¼9#åÏe*,j&… {Ù± }º¾Ô=så ½æžõ¶àEì¨wgd‹s,.á£eÂ+ú› ùdnÁFeÚŒ‰’}Ò³3ÛhymŒ÷Hòl¸Sñœ÷ñÌŽ½¢óaµ‘!^)ò¡»DŽõæw×誈uöºâ¹Ëâ]Û·çš ¯×HÃO—3Nd‹ îÑ×¾ ô£²ÌkÖü))Œ¨9I<‡R·û¡z´Æ£ÏV"öäÑg+‘™âHÅó¾¸Uó ïQ3£ÀFvô¬Øñ{Æ9TÎ7ù©ž⪊¯K@6Á»O¸pÏ`õº¾è{¢×¤LrCÔ"¹¥$ y›uÈ`Qw(ƒ9›ŒÖÌšë–SÒð¥Å×Å…®D ´Ðc¿sF%•[2·¡ãз‹FFå¶À ]Bz7l”èQ(/º¯u~ÕPÄŸ¼c©¸xªˆ$²WÙÂ÷g z(ðç¶8É‘(´%MdY²“c>­áù*=3! ¾ÎÄé/EÄ Ùb¬T£ ’&˜_¦kêv ×XÊ æÙ®Zâ9iÕDö„÷ÑÙã´GyŒS\bá5{õÐ]ƒ'^ÂuYÄöwELœëc°¡FýE?ï#,1B°ýÒ«Ñ¡F÷ˆ"¢[ži»/vö†ÑGc²=7¯‰ÑB*¡"ë¤×v 6S\T•tæ"ò5ÔÈר†’Ûv™9}æû‹‹ªqUѹÏ-¦*äÆÏ‡åŠgqž‡èÝû»D‡“^é:"¢ØË¢¥³`§qW½Šé»”#âöTÁMíŒ4²‚åèµê‘ÁgÌ|¯Ç¯"ábå(¸Oã9¨d!#ýdO¬¨W˜RFøÀ(Á#²ºñYÏ&ÞÙ¶˜éëô™‰jü¯QcNªàz¼B‰¥ 7lš ³ù;Â{$ ˜kb˜r1a%¼/µ–ˆHkàkn÷1"Ʀ"šeÄØúªõø”¹H‘i¨ úÈ‹ŒOS£‹¨:~ZBXš.›4‘§¼aô,ñ>ÎÄÎí3üáyñ´›â¤«ÇاláõâM£üœÈúèÙõt£O$R°r½‚É™ªÙ¥g>õl¥Îô«`M:ƒ(aôµ7z$Š®gf‰2Å xß¹Îsâ´ÝAqó¾ ºO’ÄÉ^B;6:Љ'rëÑm ÑM¡Gôz^&ÚÈg˜²ÎOÉг»©â9ˆ·„ýqVtWijŒZ¤•Õó3…­-ú ôìZœqžŸªLw[Œ¦Ç’7Qõì™GÔ£¢Äß%)+ú@õ3gæ5ªu)º¥ ½0c(}æ£K5j¥ª‡†¹ÛP?…E/ŽŽúE…¿—ŒlNºˆýRÅ•,üö#_¥üžQK½+æ›bXŒÎSda: 0+j"Ë-‹¨Ð%|¦ÞÃw9NìJI0¼¾QWTPô¨”çny®…×ux¯Äãïcð¾^uÞ.êGDò‚Q!»oœ(ÉÜLóEú: ]Å3A:ÿ®bœIj ªÕ¦åÔÝw‘å’E§ÜeCë/ˆ¨EÏ`å $Çñh¡ïNÁ‰œ&÷òz´£³wÎ;÷‰Ž×ÃF·O‚¨µòþ7§°dýdo1a<¦‘ò*PÁ”u?UÞ訊L[ÇtÅðJŒéqGÈÐ;}½[ÂþõÎﻆ‡M5êÁæY=‚0½G1ÁÌÈSnT$‰ô,Ò]aº‡LõùH¯“Ñiz³W·š¯§´¢ð¸±Æ.ÝÚn‹‹ŽŸWŒ,¹Ùo£wRÖœ«¥/F¬dô’…~›ïÜMÁ’N‹þLžé?*z¯Š=Ô;ôJM„‘Yå'¼øóaºˆÜYGñ̤Z"?ã„m$‰*ú÷]¨‹:4?¡ÀûÓÌÕcC]çÂè°À»#C&ük¬‘A†w4µUÏŽyŒC6fä*‹®'Em€?û¼¡¨ò.÷ñÓ°+:O;(rfOßQÑc}Id«‰g"ðÚO„zœ+Îz‡Šº¢­<¼2Q¬É#Ö$ùæèHiæ‰Ldp‡X# (dèžËÓ«ï^³R™a\(\¼–úp?Cà°Î­Î [îF2²…nõC}uÆQÿ2.—¯º¡k¤*òO&ÖgˆŽ7tFg2$¯‘§Ò‘1Y ¡e7º®{ ^©Ç5Ä“dêž¼¬èÑ0²R3ó™:cpˆµz LO4úwo|ú¶—ð¸Û!2,Å^V0ž"SDœÎg¢÷÷‘xJÓ]‘Õ3-zé¦Q«ôQ[°Ànƒ&æòóñÍ ;*/zù³ RELabþm1«›F†R¯$X¼&YÄ„:Â6²F±bOc¼‡Yõ+%âóhŸÞëœÍœ½þ¬á#‡¦÷@êØä1ØŸGp."zÈ#DVEÿK&b†hHÄ“=¹ßqˆSzÇ25||¦Oo³º‡‰On£¶é4jžz'¥ÝëØgäá8GÏõ_!\Ý×DÎ;^d¼=Æ^›¹l={–c¬BG ¹ ?ɌںÎ`SE Q1ê´‘†èyÎPƒ¯‡üØ+8€ùèì@Çâ4ñ½…Ë^#ká0>-›Ð­Âk`O®ßõØÅäçzÖ¥¢O ¸«÷äüYgOºÕfúì•»bî5äãg¹õû+†åe<&Ihƒy%5f¯á]t.¬g!\„l3»D ùôB?™™cdž½†,¼”‘—« ¸AE#^0³IÄ—÷=-ºdyg2?é²ÛˆyN1O‚ðRAF7ŽÎ4kŠH¾”‡E¹ ‘4[t£ÇEúþ§;gbM²áo¶x[œ^Õ;³}^ÇÊ"óÈ­¦ˆmÍÈV·½q¶Uòesu ÐŒ¬|¦‘ ´ò\|\Ùg&3²I±"Ïã^#ÓW3H7xhšXƒ…ä¹FÏ¿ê‹æÌÝ0gai…ËÐ ÝF‹xTÇ‚—˜yÿ(#ƒTØçodñÄ¥‡žÔc¢Kì¬QÕíÔŠ¦=ûÑsmºŽWŒ«¦ØÃ:";XWTΫ‹\¥7è~7]ìÌ ã¹ G…÷Õ{qx'Ž™)¹jdRŒóU&*'2>µDN¦–ˆJÊYT·!UÓÌ Š×†N›5ñ§³1¢3ž2cI3;’lTdÒ $´öGiƒD·Jq3™:¼.ÉGÒ«n‰"*x`Ôw É4úJ¢}}KºþñÚ¿þ$¬4QO»âãÔ—DI?žhÄ5f÷¼bœŸ <ªˆÐ¸"o Þ=Øw »18€þ3ý5nUáiSD>…çЮ±ùu#·rÛ˜EŠðfn‘a.-¢;ι ,÷½“~•¹Æ¿9†NçÚºMÓ ¯c¾^1"Ç0£7ÂȾ˜W„ÐùFÌ¢ÇjÅ ïi¢‡nÃ9;ÑÏ$]32ÞgE¤Î9_¢è/q\Œ6"oÓCÇÕòX A"Wà1Îôè7ðÈ%&‹óÚ’ÈÓýËú_¸*ìcn.áee#',ÔÊ7qDO7ºt­Iû¬Ç’‘CÖk%EmxÌëED5‰×½ô(Ï´]} gÄJÏ9 ½+St˜\Úˆøø.WAƳCT£Dt“ Æ‘-vÆâïöªVœÑÁB}µt«fr]ü…ÅkF?L¼øKjšx"E¬Èëò˜§¾qÙ¬È6z«Uƒ%{xU覎Q ãuIéá¢SµœÑ©­?ãS?á¥ÛX*ætMdJŽÏC1ëFfà5ꬥE‡M-ãjŠŒHqÃcê22s«ßîé'ˆï<õŽïoDèç$_n"ÛÈNê8evŒ¹ \wL4NTDõêM)£É´2…åØ4Æd‡I§XS\†ß×O¼2jÂz~5ć fþU¶S˜0_æ8ÍÈ9{Œ¾ÅpC‡ô–Ý/á2ë}7}övVdäõܯžïKY)‡ëDúò"z%=Ò—íÕóK÷¡q¶¸?1øé§uV¦ù¢'Óõ»ôìJ‘w2ë᪯é|P¯§é]×E—Æ=¿§yr3bæt‚l½~:³–fäeá®ÛØ_Ù—•Ðñ0Ç–­¶sO=*4Ÿ•fú3¥ïtªQÃpèã¿…þ„wwúª&“pØ*ªY&zlæ³î]xöLV¨/š-ld«Šü¿°ø«Áz?,•“ŒLòM_†0A¬#ÕÇ ôˆEÏøêxRVt8˜ C÷’•Dý4Æ8Æû™oŠx낸.‰î=ohz«£û"ÇxÒˆ^—*%NÞ•O_×sèf¤’à‹T.ûFφèý1z6;ÈñèýSeúègæJ5’ ¸'²@ú 8½¿Ë-"†hà #…ÍE îdľ:*„øòMqF.¢/!ûî’jœP¸-æ~ɨG^1t×ÊÇê F³U\Â}õ•pŸåEÞ6ÔˆöÌùHF¤Ù¢Á c¾f4hÏp†ݳ&‚do𢣗aT°ÌŠ‘i×:ï7OW8 ¾kJÆÄdž¶—2ú'ͧÌdû*fºæÝ2º0“ýίX'|b…üC*曯ޥóPDÝúÉ!+H}´ž­0ùF–Áï3 æ˜ctD¸ Nê«uE †iðôhCòzÄàõím¢Ñ)ôÈð!©FÝÏìJÔ­'Â@<37Y 2â=Šö=÷D5ÑÌRÞ3*0fô(Íz ¨o¼8㨮!viåj’\î o9Õ6›îÃRB¾ IIQw¬ 8¥ÞÿnœÆÌ5"¿Dͦî¤|—‘·7¹šYÃ7{òõh9ÍÈú›ÞËiœ‚ ö1ÍØ¿l£ãʬ«£žeÇ_®*XÜÝÜÃ(Ÿ¤õw™ønæ5Ì f¶áqÒ|²P|yyÓ–‚Lžs1ë„^Ÿ¿3«}V|œ-îcV`U›EQbžv“ ­uy‹ãÉ(¥}<ÃâÑœÉeèrGÔí®y½â£çrR~\·Ñ_£Ÿ\¨büì*¶³Ì¦–¤uÛ›†W¸/"‹,›_§¾LŒ™µçOrŒˆ^6ðÀ\—ìë¸7³‰ÔxÆ€~ ´ñœ©jFAEÁzõ™yŒþ\½¢¡ŸÑÒ#ããøê¤èF¸nœ“Ó=.õ±*³Û§¬ñD×JFgš™Õ0QÉcœ'Kòåj²|º$ùV`E¬’-Ç%ð!Üw"Á+Xqš $XõÐÛ¬ŸÞ:°ZÝfƒllp+ dUút}Ïñeš3Œ®_¶KM]_­ØÛÌk¾Ü±]‡sŒqÍNi˲LNì4ò“ÔWÐ5Ä!t8̰>=£jÖ›"ÅI<“;Zu?{þ/ÝwšÕô‹Ö‰P§Q› ñ¡u˜ï²ØœµFÕ‡Yw2ÑÐÌ›½¶zìaDtfç£Y‰×ù„Õјâën¹âëY¿`I9ˆ=g)ùìﺙÇÊõá’ÇøJóUâL)ëR 1²!FÇF”Ï+ºlX`b¥dÌÝãˈ&ûXF¼Á5SD^È”yˆ¯Þa‹€‚Œ¾ŧëÙf3Ÿ Yûoú=—“Xñ¼>?¯OÇýù€Žö^cT·qé¶f›S¨o½Š‘Á0óžfTgIÀÊ(H¾4sÅ:ê¬ÝeÄ$æýôX{¥ùØ—µÖ '½RmŽãðå2<¦“˜Ù3ÝÏëúb¯iEøÖgâŽÓ¸‹½[I÷’º¿5q"ÛVÙ’‰=Ÿ"ûb-S›Â Dˆ1|r¸‘Ù0-V5ú‡ôÎ΃_éÑ•UKËðu;d1³im°_–ÍŠ¢M¼öõY(¨çv_¬dØY§ 2ºv¬>0£îgæcÒ O4ºôü¢¦çÓ~=ˆ²OK̃u?ËÖÂl¸ffßMþ ù8‰¥ù¦·õ:îÏUõlG²¡I>Ý5y•™“У¾bÆÙ…b¾('\dY(11Äãëm2-,Ç—9L7ü‡É(݆½Ú-ÕÒêóK§È4ªºLMMÈòÕAÂÜ`!#¨³K9ÀYçÍš×çRŒ]{dÓ3³sÉìÝ3÷#Lhl¸m.#ÂÐ µó;k\¾¼\¬1Ó(CŽ’ÍVÍ|^¢/ËmV¿ô^Xo3òÉfoƒ×ÈC$ùØ‹YÍH·¡š=2tžÛÌÓ(¾3.¦…^eËF™rµ*n9†Ö›w¶W¹ìlÑB.9 ªÉŒzµjÃ7³†íŸƒsr6?ì¼Å”³s-«¢>oD}¹¡`¿ŒZ!_¯ƒ˜5ÒÑCvǯ/Žç2nìÚ¬š5¬P#“WÄÈiÅyÿP#î0Ÿ±šëó_>Ú»C%[¦Âª¢˜Õ½§ÁªoFût*Ò†mÌÇiùž¢?Iñ‘1VŽmÁÄâNn[_‚‰=A¾+Øçý£~›¹:Åï¹ i>þkÆñø,ʦLžâô].ƒWúçè6(>9æØjV½ÂŽ9–>[·"¾X9Ä—{óÏm˜]IŠm¾Ôvwt„Óí,Ëà%vomz—?,‰Zý%f\¤ë½j»ÌHÉb¾–_sûjÔgÉú¼2m¬Æô™Y>]µ,ÅŒ7ƒ|þ1؇ÈÖz½ÆeÖ‰L†#Û,Ù̈š‘´b‹ôL/åô¡ó­R1¸™¹23²VýË.3N1ïcÅ-ªm¯d_.ÐÞ¯fص×I§9f„£s‘ýØ·éçÌœW £3åãñi¤½ï;o&ÚþÁ|R2£( µì݉á‘#}‘C°MB^RèŒ#YøÈ?foy'3ªu‹qZVgá«é¹LvæË ˜½Ti>^™äë|7;_,íuúâA+Œ2|µÃ‡‹¦·7Ÿ\aÛÆ,–¦X‡ƒØ9šÉýLoeîŸÕM ÞeŒ¨Ï&,”ñú:TÍ39FGŸ‘•e4QÛÔ «ƒÇé'U}dàµL|Šðqð0ÃÛR_Œ™OHxþP\‰Æ.{|¹FÓÄú¼™·– „ÐŒ}µê$¦wÕ%b1¯ì<«ÖehÙÆ,ÛÐ_erqÕgG#V3XSˆ-:“m—ùl(¡Út7×@6³÷ÍŠ²n»õÚ³æé…@Ïlöšý{úi•$q&Ŭ6\2NÐê™°d£wÚŒ­x8ÔW·rõÖŠ6Éšù+f2#AÙ†¤f<â5ü׆¨ÌÏ¿˜Û)ˆXg!Âü: MD·Ÿ¡°ûPs§Í]4³×ÔV9÷½2µ2Ë`~V¤“lëíεY›ÃǸ"lzŒ-w`fd­,ЃbÅî_¿‚y’ÄŽnƒµ„zo2FÍ8•bò³—ÁÌU:}Ù‰™H8ÕÖ‘eê¼U}±âgSýuÜÄs?ôZ£™Ù°‰Ý&c´?ÓÊd›&§)b«–„ùÎ̘ٗ4_ܼî‰ó}Ý9Y¶úS¥ÇŠü³^K+ëË~éh·°O@¤nFP©>>dîÅá,Fnz7=¿eC.³Þj°Yó©:æZ.OýÙ‰¾Ü‹ßu0£aËØ+Ò¦EYž×ž¯‘mÌÜ©Ú=¤êÇf¾ ŒÓö:ó̸ÉM­úpŠQõ0ù‡•A1ë;þûidÚ¬¸Mó“¬åÏL_iYLŽíŒDºßeg?ªºXk²¼ª[g®Ìh8ÌÈâXÈmê´™£±×Dò“»•°z®sYŽÏÿæ}¿C¸Œ\·½‹ÊŸÑ˜{Ÿcˈ$ûúÓ|ƒ•™³ªéjÅ=q6K öñ!Ûí™Ù$¿üršÁÂÍ£~¾>Ú—°òö>)“»xmù󤌙)·Ë7´r‹Á6_æÃI3ê ü°¢qÓëÛ½êÛ%3æÈ´!¢Å5M?å¦ù!«ÖÄÊ…ÛNç„ù:Qͼ°ÎMM±s63â1™e¡y;=²}q¿EÚã/ Ï~hàÏçœ6i[H«ÏÄô-öº´ÉzÓýªÓ–üLT3¹®™¡‰ôñr{¶ßâÊV¶;›Y¬Î|Ž¢—YISoò‹<,&i ­³&745D³gGV‡O:f…ËÎOÌÓ£ö*MšS˜U_3ž6³±VÀ¿^b”ðßMS«"lò³²&^fžò4sŽ 6?iæ¶¶^“ÓÄ–lž4ŸAaÅúÖ ”[ŠuzBï I2îdïb6‘Ȭf›99ó lV òø´ÆãóÖnX¼ËÎ7- ñ2+n°b7ÓÛÊ>ü÷ÇÓ‡YÚª0+C£ŒcâX ®XŒÃŒÜMYi6û¢>¹X1»É!ù*rü¼xJ€vÚ«ÅâšÝƒþ—U›’Œì±•y²ܬꘑU¿2{ ÌxËgÍ<šÉü9«uæÒn&ÖÈ6»7u;Ú—ë ñ!¯ÙMœmøSûy‡$[,`F§N›[}5zÈz޽ËUg—fe¼¯WÓ¬W˜iú +dûÊB`«†bJSÏ:dÞÔô¨™ÌÎ6¬\—)SëÌ–\òa§Ã/3fÙ’™é3}j`$§Ù¬-×fmv¤Vü|‚¥áöÚ‘åqBýzÍ^½Záõ³ @oìŸqµ¢|K²|&YLY¾/Wtd¶wØX¾ÎÌ®Y{iz~³Ú€+v‹QýüM ¯·² ^ƒ—Zó÷ÏU™\ˆÍ;9mwµçf-KÕOmÙ5ÐeóF^·HóÅŸ~Þn»æ +«ä_ äHþ˜bqé@¤³ú‘¬øYÉG íµO'±žÄmå³$›ý[½W91yà‡…ÒöÞVs-ÖùE‹eÚ­ÉêÒ3%fôìµ]rÒ©ù?mü”<¯—üöÁí‡!öª¸Ù[âaö™&žšò0óRªMKì™A§Ÿ$òÊË>8ïÙuÂÌ…„ÛrŠ&G2£!«÷ÎÞb‹T<6ü3ŸPfc!1F¬®³ÝB­g²fÕA3ÖM±]f¿Š•g2#8«ãÕÌ„šý<Ä6r†odëä¶ê§É–E¹‰ý#áF@O“©Ï¶½>ŒËöËûî£oÛwÍ´0Ì6µÙžy5ggZƒ¥kVWS(ÉÛËdq1s–V÷ŽÅ­Ùº£ÿ¬­,£ÝæL ²ø˜)!ÿº„Õb×Rÿœe 7³ª}þ1i Ó²gײ|öd^ÌžMs®f…™GuøÙ˜Ó†ŒZ^6רc{ÖRò+Ûd`ÏU˜hoEt”س”æ9*‹5[žÊ?oãoþ™üvѪÜX¹ýi2fLle#¬¸2ÃÇSý³ø–­j´ùÁòè•=‹gzZ§Ÿ²x¶¿~¨Ìª®šZb¯'h¶ïíÕ£_οòeý-'ëÉ&ƒó·X»œía–žûËÀâk&˰¢Ùoµþ1±Æ¿Ëª]˜™]ÿŒ¾eq&ë ñá¶ÿük"f'œ=¢·ë²¾Ø|â›Å¨Ì3r›çLVœåCXó‰TöÌD¶Í7˜¹ÇM+pÁ>&dÕöóã5w6‘TµéˆÇ·*;ϰÖè ¤í90³Ö?CkÇB͇aµ‹sÙs`vvbï’³#¡â‹uó³+kD{7‹µ†@“ÈZmÇ«ò`uYXO°?wÌäÖ™ûæñCqñí£[(eJÚÿ©aĪÅäŸ1«x™Ìz6˜yO;ç7lß~ÝÊp{lÚî_m°v×òî¦î(~XlG2K†–÷ó×N¯o¦vöÏX¾Í߇Û+¦öÏî-ìùšÀÊIþúàÍv½ð¿ìÏž Œ6½~k²gí\Å´t·aSæÞ2_68‡ÙóŒæZìçÀ®Æüý~6ËaysÚ„H~únõÄÝó:ŠY^Þí쟡öG ót•–&oߊՉàŸ·?ÁÃÎíÞ¿ßÞ¿Ší.ºlÇ;}Ä‚Ð!0¿Øå`Õsmhš‹4gm?­øÍúð¯¢9ýðßa“‰}dÌ·ôпËÇÞ“lë-ØBìšü3ž¦]øó’¼¶`—£å!¬^®ÀÎÄ@Ä$ùÜÕŸ YØd¯FZhheåõ>³’`>Í:ÕlV2b:‡Íš-ßⳤü"SKÖ–L=ÊÛi¤ùtÆÒ‹ŸÛ­‹ÜÃ.W+ofÏ`X9:ó>v=d~?ñ¯ºý˜€ìgV^ÇŸÚŸ8¾þ@ Ð óvµK •ýc<;ZÎÊÑø³nëîþz•ÓÍÙ˜8êßÿeÏÜ[¦ka%öl…æwW‹ [³à¯ôg&™yû.šûg±ºüÙÉÆ­l£$iB¢US¶z>ïdá¿É˜,žÈ­ÃŽCy­ÝÔÿþ«{ÐcËcÙ­ßâÁ6Vá˜Ò³jçÖ3²lÙZ¶ü_Öäû®Êßø÷xäÍ^Ú;ÌOËâ,ïâô–æÙ¥›¿œYký·u΂ÙP!o¾90“g¾Nõi¿`VáŸ9·vÖäŒl-ðÔE~~ÐÎùìŒÖÂ<õ0i{½0°‚ë°º@Ëó÷‡v_˜w_÷Ë.}›’òÙ10þãØäg%$`„¼;c½ßõø{}ó½ZÀ>ø#}àŸíüßê»3Þßúý+—ûàÿÓ‚Ñßí•ØÀY¢ª=»ã̳;/³2þ‘…å?ìs°³\;ú[èaE¯VöÀÊþ"Š5º=ûÈ”-™šlÀ釸þ¾ØÒ‹Àµ]µçèýùc ^Ûgˆ•r€Ôí&«Èì•¶?÷9'ß:¿Ý¿»ª¨}­–§´wœÚϰ[üÊz.jà:Ìny{¶!oþ5ïSÏíò äúùåBìg°í]&¯Í?öõ?ÁÍßmi©­5°‹Ê¿¦n¯ÎYqŒALݰã] &Ø+^³Î_ùc5ÓOdjåë[^?Kðçnvýܯ¼ÌØÌjzrqV–ȲŒ@ì•òh…+ —×kØ?ìqµÿG~¯Î‹fö FÞÀ;ÙßoêSàëßm—jÞ×åŸû ÙöÖ‰5ë·o÷sküü,K²ÙU g´K%ÐF Z“]ÿ>§@Y<~ÖêóŸIà^ØW–7ËË ,ç¯Oö‘e¿hÄß_IùHÓçüíÔÞÓd·œ@à À»Åh~»ûøÝ±äå¥i~Ò DýÀˆ?¿=´¤k¿‡¥«ÚäoÕF~Vû¸½15¨ ÕúÛ¹µFûLìºaye»¤ýå—77dro`þ8¯Þr³@ÛλŠüòm–Üí±§æÍtù#‹§kàÈÿnßú|í÷õÏïÙ+ãvîÏx- óljÀÓ¾3–\-ïäß]g¯bú׌ó2v“)øŸ õ×;Û ¬ Úghe”ìQ¯ý©Z–-çµ”ü‘,¿:Qþ¶cgèöÞ„¼’Ïëw;°k'».X3ü½^~ìüÞã3äŸ5zÜ}-”Sü$¨…þ9'ûl󎚟ßú¯3²@îW°µF›”ؽOþ{ŸŸì>)0f¦’ö¯û×Ȭ|¡UÁ±ŸýŒ#òË…ºüøµaûKÄ?ª Œ Þ%ëÃŽ/þˆìï£=”µCvË(Ø'™ï²ß//gŒ}ò‹‡ü{"ìø@, Ìø{±ü´.oÆ °“·¾îÏ|«"þw4eèûÿ½Êm¾ÓB¿@~šßŠük¶y}o £/ˆ1ý»ùsŠ‚^M¾¶ûêÇ1ª‚ï™×r ®ÖÙñíñøõøYJÓ¼K`®ÏºCÁ‘OÞèÇž“Ê/¦§y´*ÿ´ »*~Xä/—Ç1+{öÍÔu´ d¾þÝNНïŠå»²ükµy+a(ášÞÔ×ógYæßSpä±\s·óÿ0ïáϳ¼,om!PŽyw,gÝ)¿‘ ÊãçÏLÉ™,ÎëÇà”L²î˜Gw’ÀÌ\~™os×=¾ ŒÕ¥˜µ÷õüï–—ýæÍ\[k³kT~ºd÷ Ìáý™hàG ªz3ÿ8­ ·2]yÈ óguþº¨íù}mוÀ¹Ú±=R{¼7ÏçìëøwµÏÔâ]þ̳à÷æ?š9ƒÀŠ˜¿·´ßÇÂB{¶1¯”ä<šduí›ïìÚð¯`Xs+áòË;å·Ãyóy¥m_¥?#ôÿ¿ ™êóãw ¿ûç§9k†}_òfój`þùë…ÿý÷3oÅ4/·Îï9;iÊÁH>òµ3áüì<ïJ$âä_¶üל˜ý.}äÝ™ÀLzþ]Äv_£ä‘ðãò`ö¼‡Õ?u'‹‚±ÆÎñòÚ¥=â·zÐì7žÙß?äÑÉ?«bÏDåµ€ü<¿¿Ìò«ïæ­TúkU^kô#–ÅõìuÎ@ûï¾!ï~äŸ×±ÿo_éà »æþ÷ùkåCìcý÷¬‡oòçÊëÕL]´w‡å­ýúWÓ¬Ï\²|5„|¨…4àýµi}#çÏe73ÿŸä÷*ûë­Ÿ[Ú›_OªµÇVœRÇËßþòV¬õ&0R ü°Ï-E3þR±´Àâ v6Ÿw±fgE­gìÚ˜ ¬'ùÇ]öÕúó]¶ó5`ÖÿŶíã?n¯í¹•ü÷#¿]µ$mgdæxÿ6ÿlª¹Z–„ νägqùÙL VÙõ1ÿ=¥sôŸ¥Å‰¼`|~sô—CÞS/Y”@m-xö“s`Ÿ³ ±@Û,H²–Ƕdúo»áϼvæ?N^, Ì@øËøo׿À•â¶ÿû úÔ>ËÈ++“ïä×Áô¸{XcÄGì¯Ï ùÏÊzm ûW-üýµ5ƒü*6öì¤=ÊÏ‹þìÊž ò0ÿJ_`v%[Y˜š7¢ ¬Î4N FùçLü?þÍÛõ8/Æz˼ ûxö»èòäͽøÏƾŸùéîãóyóË–µÚ_Áüî¿­Á>}þÙÉ>ÿ…=.Ó쿲ÀýÿoPð(y? Ï?þ´Ñ¼Vž?o-øùåÕó¾*ÐŽóCZû¬ÚyþÕݼÈ-èyAVd¯«ÛOžù׺ÌY[£æ—õ Ü›ü^pàß|CAúg®üßòmùáu ä7¾=kè‹ü-ÚŠPòV >{dišÿY„¼U?°V­ó«XëÏ[™}|fë¿Zžÿw2ÎßgüQPF÷qBüµ&ÿ\š¿[£þ÷¹Ùsç;™JàŒý­ÔŽ:ö¬Nþ³ÊËÌ, É_¯Ñ#ïåõõº=>ê·WéIÀ¬÷Ú5 t*(Oè¿ÏÈ,ÖgŽñx¿dÍÒ®«ù׊ÿ·¼P~ëóçšm¼yb–À$bïÓ-¸̾2‹õå§åùÏòßð.ð£ +ÉoŒü|ØãmŒÌÌÎmYž¼óòßYkT03kçý# ü+y%“w.–üír/86|¼/ö_Yþ1h GÎo?ÿ÷»äþm”ÿ›…Xw±V”?˼[ n<®“Ó²ìÀÝñ·õ@Ü(hUæ;¯¿½SËs÷ü~Zðšý=Åãk þ<¿ÈÛþžüîˆÇv;Ék}ÿwm œƒÿÇÿMÿËå¯3y-¬ N¶¼÷Èoì:õ¸µäE–ü2ùeò߇ÿ‚ævüûoŒÌ_£ šCàl ÊHå7ã¼Y¸üæ\Ðik^ÿ¾ëÞR€—yü«ÿ]óÞÿñRÊû¾ÿ¢ïyÙn€RXëåßþÒüï²üù(hÿýýùñŒü°ößü‹?âüû>ü/³ý7ÌÎoEÓ¹Àý·»çÏÉüÇûw$(ÈךÒ5¿œÓµž¼ë+hFùÿ&ÿÚFAUYÿZÉÿUßÿ+âæ¿×ÿ»¾t_ÿ{çÅèÿ<.¶ÐòÙÝÀnÿ|ÎÀ¿Ž–÷µÿ·ñó×À;?îzܸùÉÒú°g ‘|´[°–”?¶ßëñ÷lŸÃšÿmWþWý²˜ÀãQí¿Í£ ÿ’÷iSyuÃß?rÇéIþ¹Ê¼²ûo¨úß4Å®ùeDó;0Òò·ûèþ5ÑüjZÀ•ÿ| ¶Šÿ7Îòoìè¿z\û»'÷Ç£…•Iô[ Î'þß0"¿wò²Ç­¯ ßå‰Î0¯¾ç7GýÉo½ÑÓ¿˜w½ÿõÃæIøÕÞÇÛhþùcÈ÷¤€½´çüFÊßþ‹TóFö±-ìD!Ë;>~ì‚gíDÿÖ)[°üü×úï;–W[ Î’ÿû¼ü?þ­åqnÎÍþ•Ï‹ÃyOü|äüò¢ÍÐ囫?‹Ï»ÒÇ}dyöñ¯ñþÙ»Væ7Âõ'¿¹ý¿äUý?ü­É_ß÷ŽÿÛ½òÿY~2x\ß\~ì¨àú·Œ˜?Î[ÿ÷Uåå#y;s컟¿<îÿ½ÿ¼íXc˜ö?w[µÙõ5pæÿ— -pnöQü}q`¹}´Ç_0K¶ël~~ö¿ø[Ë{ÿ¼òË‘[ˆù_Ç(è#¿Wç?^Þ5å?–}Þ×_WÍÏùW3 dsÞÿ2ãÿþñïžàßfð¸÷þ× áãÇ(˜¿<“ÇñD“-åßà?bàçÿ·ö/#,lx|¤[pGS~«{|µæÿmMÿÎ¥¬ÙTá´¤_ðøö‘þ¿›ÿùø/«³˜Ú˜·ãå¿Ì<ÿõþ_÷-úב, œÉÛé‚gò_^õø9å?î;?\±lÎþaïçý÷q¿’üÇÈ+áü,÷ßï‘ÿ®æï·óz²ÇùÀzÀ¿Í¥ »¤­YZ’~|$TÐüÿ/ZXÊüo£þ¯Öô©÷¾· yüÏÃýËé¿¿£ ÇûõüõØÒœÀùÌÄòÏEd‘3|<[ø¯6š÷㿽۞÷y¼gü/sÍ/b1£‚؈Åþí]M$5 ÝÙ+gîópC„‰ÙŸâ¶#!qàÏÏ0«V”8ñdzã¤jD¿ËölW=;Žã$vª:îqþzEí½¢EÔÖs@r4úÝóÞ²;j—²5¸¹0Âì÷˜º&ç8{vIº<¶µ= ÍzF¼$·×8Mùè2/Åx:á–Ö85¾´¶¶&u×Pë\Ñè¡_iÏ:úLSï,qÉpsüô)‚qݨ=µ0æR8­5Ý+sÿ®!ÉR[Z^jQÄi«õ«üˆxÓÈá½£«!µÐ§µG_-’aöÖÆV»C\o¿X¼ñ‚÷‡2:êßô߈ >cnµpeÛ{9X¤×æ;K‚]a’²ÒgÝ—­A™J{¥þ@û÷Zþºù?z!áFø\Pì1VópT‹¶=Jµ°wÓíµÒ˜•ÏIºõ>Îy Þ6ìÛïE$a vCFƒÎ•W…×V`šýé~ÿ$=_ZYâmðö¢ìS–·Ùëk,ÆIš¡WÆìE#@«í¬gÏ·Ý‹vïÈeÛˆéÙéŒûz²Hªˆe´»°FìÈEäʺ³gd`:X;YÊGO~í}}OáR¹ú8£màfä^ß‹W_˲1ŽY]ÊSïB"[tîDï¡~Ì×óú?†££ƒ÷\ ¯-–›G[íB<¬ÞÓ‚›i¢úô°V[­U}eÓî…ûìÛÌŽ„Û-DØZ^îgìÜëÄÙJße¬ÇøD rWæ飙%Ùß#Ñ™çÞ{gt¤{êR²Ý÷ÎãøéŸÒÞ'äõ\ï¸È¿C¯›‰€Ø]}h•#;OÛÏhQ 9pyÔxeׂ4R[ËÅúû3—ý›U|V/ÐT\Z™±tÖˆßè+Æ ‹wæáWE§QO^_l†l×£œîy(~¬i¬Ïìx߬\ÁËðgz :kÑ’ælfô{]h÷C2rç¯^¾$s£½tÎç‘ìUTW?hœõ?>²yõÇbEÞž Â¬å“Æf w¯º$NÜëê\ı¬‰Àº5ô Îѹ „ÌÃë IçtEç~;nž•d cÈ{l–‘/ËÕ5ÒïÝêaØ~²DÏËg‹•;ÑRX"­Ï‰¸ôÖ>(3ÆMý‹·‰¿Ýöâ…ߪÙ¹*šï)«Ý~)*ñž¢³žX&­Õž¶Ä‚SŸàÑ«×D8Yvÿÿ«* ó<µÇúš§›Ês$ù™¿ºžŒ2h£ÎÓÿ¹1R×@ŠŒ²®ñJ‰^¥ôe%è}ì¢Ú½Òê1îväœÇžqŒ£êÒë¥Í2Ç>³·â޶cŸ™ÈÖ¡¶lû²ª?œ]<­¡6hÇeT¿£àÛ³úXŽDÎ*ÀóÜ‚üKÞŠ¤zÚÌc¯ÌÖ·‹Ä]ç7xÄdÎÐjy¼_zG_çÍÉ}[®ÁmPÚH=­}.©ÚΫe–&g?âføt >ú÷ ú¹4öþo?ïJ_Và+ñüŒX£Fb)'+ñï¯ÞQm²íI=ugdÀæB߉Té‚—öqoÄÙyV™mÆš•yuôãÕº½®½7ç‰vºèùsVáÖݾóXÒSÇ7÷¢|èùáj•Â>Ûòý¼·ÌG¤‘Ñ£c•Ýj1©éÌeÏ|ÞÌßë«°owW®Ô놜Mx+É<²Çôõ’QÚŠ,Ï,Ç'ƒ|8‡/_°blá;ÂU6иÏbù#0kõóø­˜Þ+"GÖ~:*;¤!l+*£(øö¢™w_¶«]3ytÜ ~=ã²îãs“1Y#O^Ñûж¸Ö¶¥ËŠ ³‡äí–#㸬í=‡ÌåíÏÎŽ†cTÈãß~~Ož/òUƤ³ºè˜)¹0îaÚg]¹w Ðs~…Gÿ¥´QÛñÕ¯ý>'Ë•™O?Ϊö\ÈSçsÕÚ|«úÈ=·£Q!o]—á³tÃû8g&â4š»äÓ[Õ¯Š<6è«K+泌qçëW”owDðº¤ÕDZö™ÎrgÞyWy¦öÖ™Ú:‡ç¶Y°½iíŽØZ¥ïµGÖNǺm×Î<Ä™Mäû, Ê‹Uå(›ü¿¸U}¸__òè#kµÕ ufö³¬zÎ4΃®¹2fg4*Í“3²×"sý¢ÍJ~߃Ë,µ-ÊéÿKd°û_f¯ŸEez5å%Gyô“6kg‰=R¢Àóª{ôá¤û~ãèù™ë£Xsg{$þ˜^Z&»×W7›YÏ{%q hìXÿú½ ‰Ðg:ÑáÝ¿E÷{ÈÉŸØ‘ßa!ï·ç"ùÊÙ€[7ÊßÉO ò×ó[[í˜åÐñm½¥Æ#³_“ÑOü½¾Ž‚Iôä<Ç>³îËëÝLOéלÈ=í¸øóú–§ä坿8ÎpʯÙ¼ýo‰ñW·µEéÜ>ŠZ)ªß4½¶®æW^­Í²õœëuQ3y‘g6ž¬ÑPM>¯.|›sޯ᳅ßrUº&yj®_ÙO´læA4öø02Ëñgó÷[n}çØçÇk«ùîhãO~Ὤ•1ZѲiÜæè3õdž±$߈õ:SÝùrl=h¼“2äh”1C%¨‘&Ú¾—”]ûAžñ%ù„c¶6¹|•‘Ž.Ùëû=«ÆlYλŽlëÁHb7za˵æ>ÊÆµ¾¯Å$E@uñÔ&e¾ñý6›U3­v[±æA°rÆeŒ®­âþÄíJÆ_!µ¢ÇL¥G’‘Ù;³•ËØØÒ1ŸéËÞSãœG3môJ ²ÏÖyÓF­€[.}<µßeǧ}•™,Ðqkår+¥ßyöÙÑ×rëÞÚþ[%KZ?‘ü¸<ËýõÜxk…•ñyÖ®„¶Aò­7Çy1CçÑÃ",sZìîC¬½çð«ösžã3¹ÛžIòO=¯¬³bÚQÿÏx~ÀŸõ÷{Ÿ›gØÞJ¼­}}xܘny$»ikÇ5냬ÕeÌVìò|«´•µ ­?´s"Ö×ÜÜ¿'«ˆ]ñ\½ }öagï‚U\ÁŒÀÊöôçÁôu®íœ4æMõ;[c`kd„–¬$Eñ>m=Ȉs}ÆØÞ)E¹óx+Ï-õ»ÆœGf{³á]Óæäíèí›cù™Ðßw’Î峤«—Ï Ù’bL–¬®>/©ÃèèuðØRÎPv>Úøg˜Û“Ô9³÷EýÞ¬,5©Ót0´>os8k舌étMîïA«"1rÅÞ§»Ï+9-ÖÁã!q¸ßú—‹Ý‘9$]gÉè‰LŸñž¿˜ÏQÿ·ŽÊ™užÏCzÒ2ªQœa-¶ŸOÐ9vÜ'#¿^®å´ëõ[{*WBõïo0T/—÷Ém´Cµ—"Íü•³ýÍUŒ5‚>r? ™…ù^ÄÇ{ýK¿^¯÷óÜt®B4²®ñsøös’¹äŽIŸç¿¬Zç¬4òô@WÉÒ¬âoÑÚ!j[伬e!/d®Lÿèµ/m˜ÏšŽàX=U¥=¨D 7o¬ý|+Áj©;#Áñ1'.Zi×ku]x½ÖþãÚoW\qÅj¼Öùø »—+®¸âŠ+®¸âŠüzÿðñ‡—ï?¼ÿíþáýÇ/_>?<~ú÷öáñŸOܾüû¯?o¿ýêî功?üòöåÛÛ7÷?þþÓ/Ÿ¾¾»ûæÝÝ÷ïî¾{óö?PK½9Rufø/uwavetable/BD%20Full.wavUT T˜¤HT˜¤HUxôdí½\ÜXûþd|—âÐR uw¡îîîîÞnÝuëîîînÔ]¡¥´P¼¸O’÷šÌ3@m·»ÏóüÞîÏ CrrrrŸë{_'ÓÝÍ›4O&‰®õ»42zRa‚ HD£±´IP„ 1¨ÿ¤þ;&‘„=Q›X@\ ®ˆéÄ$ö =\+TïV”˺Ÿn•:3iTÂ˸ _«ÇºÅ<ˆú#òC„säŽÈ2Q £›ÅdÆX}m·'>0!>15‰H9’™’Ú<ýdFË,9+­¼¬¶ÑÝ¢{3ŽL¦;1†7G¸E2ÿÐÀ!ûFï}°ÛvWƒ¶-ÙÒl³|cû ²õ§Öm_7mÝøuC×y­?±¡×¦?77ÞReëÀ­í¶ÞÛÒfKÇ-î[›l#w¬ÚÙw׸ÝÏ÷ìÝç~Àñ`àÁé‡Þ|ôÅqÁÉ>'7žZyfæ¹ÊÈKM¯Ìºfu³èí¬;¼{N"î{ÜýÙ/oüß íéþulbËÔ÷|eqíæÑŠ÷Q(!é' °L²¾cûÚ¾z¡®Î/\«{Ìõ:TÄÕç¹ïîïJ×*ß¾Ò’ª]jŽñïÚàtãŒfI-Åm×´oÒqp'¯Î—;¯í2£ëœnE»wêÞ ûƒntW—®óº]":·ìҭ˺Î×;9vjÛñJ‡Á¦·wn·³ÍËV›Z,j¶½‰_ãþÆ4¬ÕàV=ïºýëì¯Å¯©­Þ¾ºuµù•S+„”[¦oÉj~ }–™ëùÖ-Èy–£·Ý%«² âÖª/#ÕöUÍä§ Jz·8Æ7Ê&B¦)¼6zSïeÏç]Ÿöyìù0éî–Û^7ï^^W^»bu¥ìå·«^¨wîÊéò' ¿{ôý‘‡ëö>¼úPµCQË,z j—7ø\y°ò¡ã‡ûÝz¼ÁÉ'ûÚ}Ú÷¬ì¼üBúÅ­—^ÞsåÄÕ×–_rC{sõm¿€Œ»NJ?Úÿ¸Ñ“[Ow?ŸüòÀ«ù¯7½±x;ômÒ[qàú Û‚—~|Òûs©°[ტŠÅ^‹Ÿ|4­sÖ%eM¦n9[‹Êäˆ>H“,)Ûi›œN»zy òLõ:éÝÚW]¡Ìúr…*¨\£ªUõÔcjøŸ­7°Áˆí¯h2¢éíf -V·nÛ®IÇÈΩ]»wŸÕcHϸžzî5¹WÛ^M{Ííµ±¹—¸—UOuw²ûû®Û»°Çw~ÛiT§7vØÛÞ¦ýµvmÛ]hû¸ÍÚÖ3ZõjI´XØl\“2ê5(QOìïY{Íö5JTo]­RÕ˜Ê+Õ¯ .›^ºh©àâÍ}]\¤­—­‡¿Û—¾NµßÙ]·¾jñD²\¨¥f±ZíÕù†Œ ©ò¤© Åâ¢bÚFµßêðé@p©÷›ßE¾òrÉs×gíŸ xðÀÿ~±{ç&Üv¾Ùíz³k®¶»2øÒ nç‹ëp¶Âñé§žüx"üx㣎m>úìH…#ç¿?ÔúPÜÁ7ì|èÐáëGš-qìÁñV'›žÊ<zúü™¥gÛŸ+zžºpéÂð‹µ/Å]ZtY{ùô•kW/]Ó^÷»YåÖéÛ½ßK¿ßý¡òÑ¡'º§ ž7|9þÕÈ×;ÞÜ}ëX3¨÷û—ú} iñ¹t˜$|nDBäÂèb±¿fÅJh“”œâšÑV.T]ÖÔ¦;°ÓÉ—¼ŽÂ,q%Y7ËùÖëmßÙ¿vÜèäæ2ÁÕŽ™çÚÂû¼úTöK.±ºô²}Ê[W”WRUyZmF ×Zkó÷«ÇÖ4²n¢kJµhißzi›Fítí§u|ÝéKçä.õºmì>¦ÇùÒží{Nî9¬gÙžòztë~­[Ón¯»6ëÔ¥y—cvÎê4¥ÓÙŽ/;\l?·ÝŶSÛöi+i»¤Í¦Ö'Z½mù¨Å˜æ»š4–7¬Ü`[½%uù©S¢vXÍJ5ÚWëQå@¥ÆËU(]¾\9»²ÏJ×)U¼„¿ßºbQEÛ{/+¼Ìó®{·.oœN;®¶/i»Ýj¨Å6é%ñ!ÉWŒ»¶šÊG^&cy*“4!áá×Ö1VQQá[ÂznR;¸Çû*äÛÚ¯·¼L|ÞðÙå'ó×xôâAýûGî6 ½ÝìÖÄñ×B¯_¹pyØ¥ÑÏ\Ðw<ïqÎæ¬í™Ñ§¯ >ùô„ˉÃÇ:6óX£cþÇ®kw|ùñ»Ç³Žû8xbîÉž§\Nï;]åLЙ gÇœ;{çÜÍó÷. »øöâ‚Ký.÷¿ÒðjÔÕM×_¯uCqãñÍE·ºÝ®y‡½£Â}ÿxÿÔCçÇåŸ }÷lè‹/¯½êüÚíM‘·Cßí<ôö½_pé5BÚ~ñyAḛ̀¥_V…ôŠž['nk¼ Þó‹…W{ =¸Us•ºd8.TÞñœ} »63­¦Z,“®onàï¢V½˜úºr{ÕùÌ­éÛR÷&ÏH¬_è«$Æ=ªZD›/kBß²©¼ç½GдwßT~=óåëçÝž¹?M}¼æQ‡å»ïrOr7íÎãÛ×o]»yóFÈõôkž×f]}{ÅáJ¿Ë·/BÝ¿àvaÇùjçÏ«zîÁÙîg¿ž™|ÆíÌáÓî§oŸ:~êS‚ÓMNo8ýì4u¦ã™ÛgJœ½r¶Ý¹às Îw¹Pì¢àR䥽—[_^}rõàµ×;Þ¨pSvëã­-·kÝÑÞ¹0ãn“{ÂûOïÏPîaÐê>Žx<ý‰ÓÓ¬§‚çž/|^V~Õîu‹7ußvy7=pSЃ÷ñ¢‚S>Ƈ<þtäóùÐaÉ_¢ÂFÜŠ<µ ºKŒWlV쫯×ãnÆßMxŸ˜–ÄKqH­œ6>ýJFzf)ù ÅGe=õuMc] =‚å‘ë(OþV—脸‘ô­¬¿¥Âj²Mšíxûp‡Ö…®:9º v½çVÎc­§ ð¤"¯½køì+Føµ)¾±Ä‡’6¥;–Y]öm9a…RÛWZTùqEU›ê~5š×Vkfí5uÎø?­û¨Þ™ú'j¸«ÑÆÆK›Ìn:±ÙøæZ nY¯•}ëÔÖwÛ,i[¦ÝévÅÛjïÕáÏÁœ:6íØ¾cóŽe:j:œèСCRû¹ímÛïmW¤Ýá¶¥ÛiS¨ÍüÖI­Ú·:Ù2£Eõó›¿hfݬuÓ™M6þܨx£Y Ÿ5°k0¨~@=çz}ênö]ǾN¯Ú‡kEÕ,QsR»Õ³ª}­ú ÊÞÊ“*5©èT!¢Ü•²kËL(ݱTÅ’¼¯ýÎûn-¶ÈgTÑŽÞ5‹/ìì¥õq¿ívÔuË4ç¡N= µsôw(J’¶ ¶>i5Ų†…FzVÒW,´ä¿§ºÏÙÚÌ^]†¦z‡2N^>kvÆ“4çÔþÉGåñãöÇZÄŒ‰ Šh~?¬yèëO}C2‚ÿüPá}HàòwmÞ:¾‰}õàåù{Ÿo¶îé¬'Ó/z´óáÕ!÷Éûåïõ¿».àù»;=n»ÅÜìvóü Ë®G\ëy-äêà«Wæ]‘\Ùu¹úåw—Æ^²¾tãâЋÎŸ\Xx¡Ùû ‰çŸŸ?q~çùíˆçow>ý|á ƒ.\¿`qÄÅ×k]:w©Ìå³—ë_yseÔUËk—¯õ¹.¼qîFÿ›v·ßš»þ"àNÀì»5îÉï¿?àçÃO×?jó˜ÿäâ“áO]ž={6ñ¹Ó‹Û/¿”½:ÿªÏké›3oº¼µ|öîVà¡ µïg~Üê£oùéó§+Ÿ—†v+ÿ…þ>|OĸÈêQtT@ô²˜v±ö_ß~]×1Þ.áMºÄnI…“ã’Ï¥ÌNmæ–ž‘þ"ãHæÂ¬òÆŠ’J[¡&4B­¥Î‹®Ât`ÇëÉT&ÏOÐK¸Zt_ÌHªË&X³Œ²²³if;Íî¸ýª¯SKçñ.+]¹]síë™éÅx[uòq/ææëàg]\P"³DLÉ÷¥î—>[fsÙ™å”o^¡dEQ¥ÈJW+¯­2´j½jöÕ#«Ÿª1­fÃZÂÚ¯ko¨ÓÉß¶î˺Ö«[_UÿTƒ¾ í=k4­±w“;M:7MlúG3IóÝÍ‹·8Ò¢XËM-µ-;¶ÚÛ*¢U¡Öþ­»·Úzdë¾­µ.Ü:µÕåVc[y¶ºÝ²kË„S[-4'›OhÚ´yÓsMœšüÑø]£ŠÖ6LlP¿Ášú±õÔÛT7Ñ¿®ÿº:‘µ«Õ^QëKÍ:57ÖH«Þ¦újtÕþUª¸W™YùS%ÿJ*J*Nª\¾Jùíå>—Í,#/Y*¡dX‰âïý¾øÆKñÑuö.U¤váN^ã=WyvìïjíZÕ¥‡ó§½…ž8Ê¼ÚØ·ÛaûØ&ÃÚÙºžUËy{e·¥ážÄM\Zä/l+èÆïËëGõ!Û زŒ5§½¥Y©î¬²S¾–/Ϊ‘™¾2­Zêçä¹I¾‰ñsâŠý³8ºv”6âzø¬/ÍÃÜBS>=9þqCðìcÞ 8þÝœ·ëÞyýèUÚK·—-_Ì}~éYúÓ*Og?yöØãñ”G/–{¸ñsèýÀ{õî]º[óîã€Î_#¸³ëv•Û¯nM½å}ëñÍÉ7‹Ý º±øFýÔ{×^o~Ýåzâµ+×þ¼Ö÷ZÍkN×ÔW¿@“/_=tuûÕW×_Ý„ïG®Þ¾úéªîª÷µv×^ ¸&¹ÞéúëÚë}o<¾Qý扛Åo¸Uáö•ÛMï„Ü™`q÷Ðݺ÷>ß›}ßçÁã#Z<:÷¨ëcÝã}O=MxºâY¹çïžO}áöòú˯„¯w¿®þæí›aouo×¾ó¼Ø8(8hè{Õû%\‚—ýxæc¥‹!u>½ý4ÿs­Peè…°q_J…G„o‹hÉ:5 Ú2æjÌÀXé×_ÛÆeÅ­‹¯˜ð6at¢EÒ±¤†É“'§X¥L­•ö6mx:›¾>Ã7ózfǬø¬™rkÅ!…¿ò­r¬ÊN}^ÝUCkŽi{è¤ô]zSƒÕ²·‰ådwª OÈæ—‹&‰JÚIkËŠY¸ZZ[1VÉÖ6×lÚ͵âÐÞ±f¡¢Nç8çû.‡\ç¹uv/î¡ñxê¹ÝkDá EE®zÏ.Z߇ñ¹[l†oU¿,¿CÅ»””¼QrX)çÒ¥G•±.{ºl«r åV–/]ái…¡ÉJ[*Uªü¸rÿ*Š*K«ºT;V­Zõ‡ÕÛ×ø\cpÍ„šãkikM«MמWG]gš¿Òlݯu{Ö{Q¯AýSõ,jÚ ]Ó -jô¼QñÆ“_kÌ4®ÜdX“õM.4yÝ$¥ Ý„mB6•7 or¿ÉÎ&#›”o’ÜøPã®uv4ªÖèiÃÎ £ŒlPPýÐz½ê½¨Û°î ÿRþ;êð댮Q«U­‹5½j.¬‘^½gõ;ÕJWÛTUWeP•—•ëT>PÉ¢Ò¿VèVáYùZå•s(·²,UvJ™ÔÒK¿/ÕºÔÓ’MK>*ѬD@ñÚÅoø5ö{ä[Õw~±s>ï‹ê¼‹z·-2½ð¯OKO‰îçݲ\«¹Îp¹âL8·rÚT(ܱ¨ãh‡;öNöÃì®ÚÚÙ¶¹fmk=Öê¡¥—å ‹@YIÙ iŒ¤¦dƒ8KÔ^tTH{ Îó%üÞ¼sŸjKî$’ØŠìDæ,ª+­ªÝ­yªÎPÙ©ª*;+ÆËçf­ÍÜ™q$ýxÚ¡Ô})Û’×%-Lœž0%~BÜð¯ýc»Æt‹îÕ'rpÄøðé_þ Ûzåó«O)!ö!µ? ^óáÎ{uP i7ß Þux»ïMâ떯Ͼrz5ïeú‹!/Ÿw}þìYËg/žvyõdÜâÉêÇÞo>êÿˆx´ûa“‡iv÷’î^¼;ûn»»Eï*ì ˜Ð& T€4 é΋;§ïl¹³èÎø;½ï4¿SíN©;Þw\ï8ß±¹#CØßq¹SøN‰;•ñ·^wÆÞYqçøçwäw|Ú,·tþwçß}q·ð½±÷ÞÞ«s×}ÝýÁÞ=¨÷ðÒÃr>*öøäã*O®=©÷ôñÓÎÏ>?ò<õùì–/·¿,óêæ«Ö¯?¿õFófù[§w»Þ <X+èvPã÷ß·ýô¡Kppp×Á»‡„„tÁœmýùáç¡—BK†í ³ù²ì ûeBxdx눫¾‘ë#éÈQ¯¢ºF'DÏq‹½ÛþkÌ×)qñ[ã‹&œIðO|”Ø"éMR÷ää¾)1)ƒS#S{¤½Kk™~%Ý7c[†}æªLAÖô¬ô¬ò@yÅEE1å%¡§ŠTuPßUWÒìרkkuÚqºh]Wú9݈¹ÍÔb¯±Õ‰K„?ylD=£ºóxÓùV‚#‚Â0ál‘·ø±x¼ÄKúBú‡¬¤E¨ÅJK« «CÖ½mìmŸÛη+ga¿Ñ¡±£ÊñP¡6NZ§½ÎM\’]Ö¹Vqûà6ÁÝÊã¢GwÏ,ÏÅ^®…Ïn\äY‘®Þ Þ“‹ }Öø¸Û^ÌÓw·¯ß~?¯â»Š{–ØV±äê’¼RÓK¥—Z:´t‡2×Ê+»©,Und¹7媖ß]žWaD…7*WÜ\1£b«JÇ+YVYùQe·*ãª<®â]uzÕU=ªM¬ö´šgõqÕïV·©1°Æ‰ªÍjnªQÓ»ÖZ‡jÅ×*W{Ríóµ“k{Õé\gEÛuâëØøWñïâ?Ý»ÿaÿÓþ7üøßõ¿âÀ…ÿÿŽþü¥þŸê«3¾N¥:ѵ7×n\;¶ÖŸµ*Õz[stMIÍ}5Ê׸_½mõÕúW‹ª:¢jj•±U¢*¨V©G¥;T|\¡a…›å«–¿Z®F¹ eË•=Q¦D™Ã¥}J.U¬Ô¡’ÅKž+Q¹Äùâ5Šßókë÷Þ·¯oJ±éŨb+}\|Ž­Qôw;ï"Ëh ¯,ìSøªW¯8ÏùžNž§=ZxD¸OqW»õw põs]âòѹ¨ó§—…JZêæPÞa‹½È~š]ŒmGÛ6Õlö@[©-ÇXÆXô¶ø(ë*{+m/}+i%y#î&þ$ê.z/ì.LL¨ùóù2þF^aÞ>ª8u‘l@>#ÚoÙ®ìgf G¤St£t)ÚqÚTÍHÍWu/õ;U+ÕeYå.…T1YœU#kg¦6£sÆ™t*½SÚÁÔô”º)Ë’ß&¹$õMÜ“ï?4îÐ×ÄX¿ØA1W£í¢»FmüQ£ŸF=}øôøÓ Og?5j‚ ¢ØS×§¶OÅOé'YOâŸD>‰@D"ŸD=‰~÷$ùIúõÁSç§~O+<­‰cÚ?펣ç<ÝûôÎÓOOO-Ÿ•zÖìÙˆg«Ÿ]yóÌòyÝçcŸïyüÜýE÷›^|xáñrØË‹/E¯º½:úŠyÕïõ×EÞÌ}ó¦ùÛsoÝß-{'7 ðe` ãA®ïÿ|O~˜ôá뇮Áσ|¼ð±xÈöËOó?)> ûø¹nè©P×°Eaaý¿¼üR5|g¸4bbÄçˆú‘‡#­¢ÆEFU>-s'Æ)vlìÃXï¯3¾¾úê7?.8®\üâøø’ Ó&Ø%J<—H$µNÚœ”šÔ%ùQrÍ”£)©+RU©ƒÓ^¦ÕLß—.Í“ñ6£jæ¦Lef§¬3Y–ò¡ò;rgÅDÅS…‡r¼ò‘ÒK5AõH嬮¾©¶ÐtÒÐdhêk×j?kKè¦êêè¾ôA:®Ç¬f‚ov4{‰ˆD:QŸÜ@&“µ¨%Ôªo.ï#¯ 5?–_W°_@  „ED‹D‰¢Îâ»âJ’}+él©B:T&ëjñ΢…å]ËšV¬*XŸ°.n³ÏÆÃvƒ­µÝ ;ÖnŠ}šýP‡Ï¨Hž9ú:YÈËi­á<Æ9̹©Ë9/×¥®I®Ü.¸9`>»×ðØè‘åÑÚó˜'ß«·×/Qáž…Of w(r ˆºHKï­Þ_½k]\ômQwŸ1>·|„ÅZ[_,´XQß¡¾Ç}Ó|Ëù÷;ë—âçW|Hñ#Å“‹—*1¸ÄÑ%å•?^þyù´òNj¢ž˜Xa]…ãnWøP!©]Áª¢[EߊحbéŠÅñ“kE«ŠL…„ ¯+©0¯BŸ •+ˆ+¼/¿¯üò¥Ê§–;]nt9ïroÊÎ-[±lb™ýeÚ”I)½ªt…ÒïJ-åPêRÉN%3Kl.Q£Ä‡âã‹‹Šïõ«ãêû‡¯¥ï‘bõŠ}ô™ìcçsªh³¢1Þó¼=¼/iW$¥ðšÂe ?ñàÅóÚëYÇ3Âc‘‡Çs÷áîÖî—ݺY¹w×pËe„‹«ËCç±ÎnÎϦ9•tú\hm¡F…Tާ9z9~tXçе¿b?Ѿœ}¢ÝA»¾v|»5¶…l·Û·¹d]ÃúºUs«–,“,ÆYð-vȪËB¤H­¤‡$M$1ââ¢âÑ@‘TtFØY¨ì4$ò7ñòÓy»xyéÔ6ª9¥ ÷’íH–8Fô$¬ˆ»ìDÖ f–35˜xzÝšÖêŽëºëdºÚZ'm€f´ÆE ¥vR¨†¨,U—”=•:ÅE#E¸|¼°üfV笸Ì9™N™'3ü3^¤L—§ý‘¦K•ªM™–"OŸœš4:)-qLbRBÿ„ñ]â?ÄuŽ{ûµå×g±-c_ÆtˆùÝ3:2jT”*ra¤Cäñˆ†ïÃG‡KÃ|ñÿ¶$¬lØëÐÉ¡EC?/ø\ís§}Ÿz~²ùô$diHóëWW~l÷±ÐÇÈàsÁ³ƒ[»'}¸ýaㇱš(ú}üþÂû-ïÿxßý}½÷^ïÉ÷ñA¯‚®í Z4/hlP÷ &AUƒ|‚œƒ$At *0=0.0,08ð]à«ÀÏ ž>ÇÏ/_~ü˜¨¤‚ÄAöA.AEƒÊÕ jÔ.hPи ¹A«ƒ] z¤²~ïû¾îû.ïǼ_ú~ÿû€÷_ÞëÞ{|¨ý¡÷‡9~xñAùÁ}ž¼780Xô±ÖÇ üúÑ'd`ÈþÈßOc>]úDjòyÃç/ŸË‡Î }ê6<ìj˜Ý—!_®}± ~9\Ñ;ât„$r@äH'Œãí(ÇèÑ7£­cÀ ‰cûÆ^ˆ|íôuß×̯ ã6ÄEÅ•Ÿÿ8Þ.¡wÂÑyBÝÄʼnÏm’º$íNŠM*™<*ùTrzr唩)—S2RÊ¥ŽN=œ“Z$­OÚ&ø&Ëô¦é3ÓϦM÷Ì蘱4ãFFF†OfïÌ™ŠÌÆYë³"³*ËçÉ_Ê݃gjE]å2¸*WUÕ^U„ª´z’úŒ:Ií§é¯Ù©ù¨qжAMvOKk«ëÆèè>ëìèæôú2@{2™%Ì&ñd;²KQ©¥°ÞDb9q•H" #‹’×ÈTÒ›jO-¦nP©”7¯ oï&/çËï‰ÌÇ—  æ îh¿p¾ð¾P$j!Z+ y‰‹Ïˆq ÉI¤¤¢tŽôµÔ[6YöPæl1Úâ®E!ËÑPT'«QV¬Ü¬ÇYß³v·™bóÌÆËvœí-[©]{»vj»æö;íSì«;,pxáàâ8Àñ¨c†c­B‹ =/dãÔÉi³Sˆ“‹sOçΡÎn.=\6»¼s±wíàºÚõ±+áVÃm¢ÛQ·(7w÷ŽîKÝo¸§ºóèæ±Âã¦GºGÏv¨s.{Æ{:xÕòáµÅë—Ü˳pó o/|¿pza"Í‹Œ+²µÈÝ"_‹X{Wõîë½Èû„÷{ow‘¢m‹N,º©èù¢ï‹ª‹:úTòéâ3ÁgÏ%Ÿ> ×bµ‹u+6š}¶ØËbÉÅ,|‹û6òíí;Ýw‹ïi߇¾¡¾ _K¿"~ÕýZûõõ›è·Äo“ßA¿‹~·ý^û…ø}ñ‹÷KóKöKôKð‹Âo!x÷þzÐo£ß¿á~-üJúIüb|oú®ªûŠ|ƒŠí,6¤X©b)8ÿtŸÚ>ª¢—Ñ»²E¿zïñîïíéXdi‘E ï,ܲ°Îë´W_/{¯ûžã<==Ÿ{L÷(æñÊ}¶{9÷nËÜêºeºîvmâªv9éÒËÅÎåó4çJΉN»:8‰œ Í(T­Âñ¢ãHGÇ(‡=ýŠ8„Ûï·lïka·Çn€Ÿ]’í%ÛY¶õl…¶Ïm6Øtµ)j“f}Éz®ukëh«³Vs­ÚYyX¥[Þ³\g9Ȳš¥Ä2ØâˆÅ‹Î~ñ²m²†²$éFi}i’d3W%>,î,Нˆ†‹\D÷…Ó…U„I‚ÂáA8#¿-ß’ÿŒ·ˆ×ˆ'â=¡VP­)õœ\Mv%=Éèï`¢¡bï²KجÉa&3õó–ÞN¦«ÐŒîžn©®ƒ®¨.A{Z;EÛXk©}§Ù®ª)«ÉP_RÏP×U ÕOU+UíT¶ª åe¥»ò£b£¢«ÂVñê\]ž’µ?«{–Eֵ̡™Î™÷3¦dTÈM_”î—þ0mXš,íhj“Ô¯)ËSʦ¼Kžšì”|1©G¸'±qbbÂÚ„Ê ãçÇ—‰F½T6.øë’¯U¾†Æ®Šm«‰9uq‹y½:ºC´CtPÔÖ¨ÞQÞQñ‘'#§DÖ´ˆüq4bZDˈ¢tøëð½á3û‡— ·ÿòøËQx¿á_š~)õÅæ‹*ìSX@ØÉ°­asÃÆ…õ kV-¬xX¡0Ë02,#4<ômè£Ð+¡‡C·†n ]ºS UõU³T×T™ª’ê~ê-êjBSU3B³CóRCi«j‡h7@¹3µÞºöº9ºcº`.O÷¤çÓGèw4MgÚ!£w1™$Æ‘õg‡°‹Ù#ì+VÎ:µˆ¾Äâ0ñ’È œÈšdory|FföTUª5›ÚG= )k^y^gÞLÞÞž‚ç¯ËÈ_Á?ÅÍ×ðý çKauá`á&á¡JXJÔ ÿXÄŠ*ŠGˆ÷Š?Šm%-%‹%­¤ªtŠô¼4EZV6NvZ–$+g1Öâ¤E¢…Ÿå`Ëý––…­zXm´zm%³nf½Ðú¦µÜº”Í0TÓ!66¶ m§Ùž²±u±ke7Çî¼]¬‹}KûöÇì?Ù[9ø;ŒvØéðÜAåàíØÂqŠã>ǧŽYŽž…Zš^ho¡Ç…’ Ù:Õpêã4×iŸÓ]§X'KhWOçYÎ{œï:G8 ]J¸´pî²Ìå˜ËS—x±«k=×¾®3\·¹^r}çšîjáæçÖµä,·­nÝžƒZ7;÷’î Ü{¹Ou_á¾y†ˆ=<<ªx´ñî1ßc‹ÇiG¡¨çEÐÓÊžM=»{Žôœç¹Õó„ç-Ïwž1žZO;/o¯ò^õ½:xõ÷å5Õk¾×*¯^ǼÎ{ÝñzåõÑ+Ü+Ö+Ñ+Á+Ò+Ô+ƒøâäõÔë¦×¯]^«½æyöêâÕÀ«„—¥W²ç ÏÓž+<‡zú{òLËVxôñ(í¡v¿ï¾Ò½«»£û{·½nÃÝʹe¹^pçZÊ5Ñå„ËX—*.Zç«ÐóÚÎ|ç{Nsœê; îZR¨i!Q¡Žë»:º:~vØîÐס´ƒÜþªý,ûöRû7v›P!—´ÓÚ¾€Ûém[Ü6Óæ†ÍB›66…¡ëw­WYw·.kMZ¿¶:h5ͪ™•³U´å%(ûË––Q×,Ö[Œ±hfál‘*{$Û,›(ë +#Ë¢¥·¤›¥“¥¤•¤6ÒdÉÉ1ÉBÉ@I=‰»„”DŠ‰ŠŠ{¢ÚŽõyŠÂ„{‘ÞÂ/‚ƒPÿJ9ÿ¿߉É;Á›ÎkÉsæEP§Q¥t¥|Q?†×@–'Iòq„˜At |%ûŒÝÍŽc±îló„ÙÏLÅü)ÉPL(}^A¥Ð.t†î¥îf[]eX¡½†98D[Gë Õ\×lÔŒÒ4Ö¸kÒÕ÷Ô›Ô#ÔõÕꯪ›ª?UÝU¥UŒò¹r“rˆ²ºR |¥Ø©¡¨¤`ååëä]åžòð¬ÝY}²<³Â2wdvÏ,”ù.ceF« QF@úìôÊéqiÒú¥9¥½NŸZ;5#åpJû”·É«“['[&¿KÚÔ)É.éuâºÄî‰^‰Ñ '¦$ÔI'¼‹ß?.Þ?Þ2þKÜé¸q]ãJÄ1_¿žþºèkï¯Õ¾Ú͈}{&vuìäØŽ±Ubc©Øø˜—1—bvÄ,ŒÓ#¦qL…÷iŒ.:!úsô«è;Ñ£Fo^½(zzô¸è!Ñý¢{D·‰n]'ºVtµèÊÑe£‹G‹öá¢0~*‡(]ï—Ä×’Ñe¢+FWŠ®Ý(ºUtûè.8ºoôàè‘ÑS¢gGÏþ3zCô®èÃÑPA?Œ~MÆØÄxÇ”‰©Ó0¦mLߘ13b–Çl‰9s%æiÌ瘤mŒ,¶pl…؆±]cGÅΊ]»/öRìËØ˜X:Öñk¹¯M¿öû:ãë–¯¾¾þšøUç×@L&ë=ÈI¨¬ŽwÈO`ˆ%UšjŠL¡ÖRÇÁ‘0JK9ñ*ðšó†£ÛûÁ MøåQ£ç¯âŸORù¶‚ꂞ‚™‚Ýð Q±°œ°#jºÝ J¦ÐUÔP4V´Mt_”*r·O¿S’²’¾’µ’’d‰›´…t†ô„ô³T _>D¶Iv_–%ó²hi1Ãâ°Å ²¬eË…–'-?Zò¬ÊXu²šmuÌ*ÐJmåiÝØz¤õëËÖ!Ö¬µ·M3›Q6+mNÚ¼µÉ´q´­nÛËv¦ívÛë¶a¶´­»]m»îv“ìÖÙ²{no'¶÷³obßÏ~šýzûSöOìÃíÕöNåš: tøÃaÃQ‡{Ÿ²¤ŽŽÕÛ8qœ==êxÃñc‚#QÈ¡P±Bµ u*4õóêBû ].ô¬Ð§Bi…NNN% Ãœ:MsZæ´Ýé”Óm§7 —ÒIäìâìã\Õ¹™sç‘PíEÎë÷9Ÿw¾íüÆ9Ì9Ù™v¶tñpñs©èÒÀ¥µKw—Q.S]¹¬vÙâ²Óåª÷S.ç\n¸ÜwyâòÊ%Èå£KˆËDˆK Ë —G.w]®ã÷r—?\¹tp©áâíbí¢tþâ|Çy¯óçÎþÎÎÎNOö:Mujéäî_èj¡5…*_ˆ(äxÀq”c=Gkã¬ÃB‡^Iö7í×a”ÊÚöÏívÙ±ó·³µ µ=a;ömÛ,›‡ðCljÛXØ„YŸµ^jÝä ¬?Z±ZbÕÛª²•¥U˜å1ËY–,ËYZZÆ[<²Øc1Õ¢Eq žE¤ì6è1^Ö^V^f#K–>’–.‘”Ö•• ¤Q’{’=’ù’!’æ’â±$EüR|N¼EÅ™LoÔ]ë˜Ì&ŒQ36lq¶.ÛÏ.Euv}ÎF±jÖνÑ•­ƒ‹¹A¼&b aO'k‘íPÛM!—“»È ä#ò#™L’”U‚ò§:PC©Y`ÒaêõšŠ£hÊŽW‚W‡×7’·€·•w†÷˜ÁSñlùÅ1»»ó'ñWóññ#ø ßtê"˜$X+8%x-HØ+€OS„[„7…_„¬ÐGÔ\4Z´NtE*"Å~â6âIP™â±XRJÒ^2Y²Er].IËHÛJÇIWJOIßJåR'YmYÙ\ÙnÙ-ÙaáiQߢ¯Ål‹W-‚-Ò-l x-,YαÜmyÍ2Ð2ÕRfUÔª&ø5Þj%*ëVAViVbk/ëJÖm¬ZO¶^n}Àúªõkë(k…µÔÆË¦ªMK›¾6m–ÙlÕîÙÙ|µÑÙXÛzÛV´mbÛÍv¤í,Û5¶{mÏÙÞ·ý`›d«µ•ÙyØ•³k`×Í®¿Ý»ivKì6Øí‡çºm÷Ò.Ü.ÍŽ´·´wµ/a_ž¡}{û>öÃí§Ø/±ßlÐþŒý-ûgöí¿ÚgÚ–NEÊÁ5whïÐÃaÃX‡Ë69ìq8:ÜrxäðÂáƒC¸CœC (©u`øŽbGKG€×ÑÎŽøYêÈGh2°g˜Ã‡ûÁÖmKÐb'‡ª8‹Ø!g>i¿Ò~´}kûrèaœÝôzŽ]W»òv»(ÛÛ-¶cmÛÙ–²¥lClÎÚüi3Ц†ƒM’õCëÝÖS­;€9ë(«›VÛ¬&Zµ¶*aÅu.Y®µgÙÖ²”¥À2Òâ¶ÅV‹?,ºYT·(d‘.{);.[&.k%+%Á·Ü•î’.”•6‘úI¥Ò$ÉKÉ)ÉÉ$I'I‰³„‡‹ï‰ŠWˆ'ˆ»‹k=bqš(Xt[tD´J4IÔ[ÔTTIä.≒„„ƒÂ¨ ;  Ë ]@ xAàà¢`—`¥àAøïú‚27…@ˇçÙÀÍoÈwæ§ñžñóæòºó*ò¬xqÔ=¸ù¹T/ªåF©È@ò"¹‰üƒìNV'Hñ™¸Mì##ˆÖDE‘P³_@¨ãìv2Û•­Ãc%l:ó¹Oô'3‰éÉ4BèÎAªWô%z;æð º]™v§ùt².XwWwT·J7E×O×XWJg«Sjõµ'µkP…ö³ŠieÚtÍ{8¦½ššÁšæš2kMšú•ú´z…z$¸UR-UÇ«¨ö¨¦©:ªÊ©$ªåuåj¸§:Je¼â†bbˆ¢¶Â^'¿._-$¯%·”É:—µ(«GVÙ,*+üšžÙ>³D&/3$ãLÆ’Œ>PIPìQúxª>éuÒÝÓ•iAiÒÖ§MEÍ^7Í'M”–””z#u_êòÔ ©½R§–KuM姦¥|Nyœr9åHÊæ”¥)ÓSF¥ôNi›Òõ¿_Š{ŠmŠ(…IÎHŽOŽLN~ü$ù^òäKÉg’%ïOÞ¼=ykòzhüŠä¥É‹¹X„X˜¼ y>¾/æ~Z”¼$y9öX…X“¼GlOÞ—q(ùDò9´u-ùZ}‚Öß'NŽNNJ–'k“IÐÖ6Å5¥hJ©”Š)5Rê§´HéÒ ®dLÊÔ”¹)ËRÖ§ìB¯Ï¥Ü@ÿSÂSS²R˜iªSªOjÙÔš`w§Ôþ©cS礮LÝ‘z,õzê³ÔÔøT xã™V”ïš6Æ­rz«ôAésÓ·§_L›ž’.É(–Q?£oÆÌŒí×2B2t™µ3{fNËÜœy9ó}¦"³PVuÜ™Y;áu¾dòÂòz`Ñ|ù~ù=y„œPVÔSôUÌRlW\S|T(ŽÊJÊöÊQÊåÊÃÊûÊH%£tUUQu@³Xµ[uEõV•¬©‹¨k©;«G©©·«/©_¨£ÔµÆWã¯é"ÍÑlÐÕÜÑj5ŒÆ^ë«­©m©í« ] Ý¤=¬½®}¥Ôfhù:G]18úzºöºAº™ºÍ¨·Þè’ubº]›îN¥—ÑèÛô:3žL¦%3™Æ¬aŽ07™×L,£e¬Ù"lu¶5ÛŸÈ.b·°'Ø6a³X1áJ”&jmˆ~ÄXb.ˆu€¸@< >€Y B„9XŒ¬B6"»CÀ­EäFòÈuŸ|OÆ’JR@¢|1s[S}©QÔ j9µ:~=§Â©,JÄsá•áùóÚñò¦òVðöò.òžòÂxY<¿(¿&¿(.+ÿÿ?†Oó•m#‹{· =|V+áááá=a¸º‹j‰º‹¦Š6ŠÎ‹^‹’DRqqq#T˳À³ â7âd±TRLÒ@ÒK2êvõu¨D!±–—Ö“v—N.—î—ÞJ㥬´¬„¬¬›l´l>ÙQÙY,QÆÈl,ŠZÔ°hmÑßb¢Å"‹MG-nX¼²øb‘fAZÚYz[V´llÙÙr°ådËE–-B…ï[¾³Œ²Ì‚w³±ò²*gU˪¹U«¡VS¬Y­·ÚkuÖê¶ÕK««¯V™V„µ•µ»uqÑߺ…uWëÖc­gÂUl´Þk}l¼oýÊú“u¬ušµÎZdccãnSܦ"ÜG›ö6}l†ƒ•³lÁn¶ÙesÌæ²M€Í›76!6a6q66ÊVhkmëd놷-k[Ù¶¦­¿m}ÛàisÛ–¶­l[#Zr¯&x¿¶m5ìåkëiko+°UÙ$Ú|²y†v÷Û¬²™bÓߦ9íaóI´²¾Ž>.¶–W°¶·NµzkuÁj®²‹U5+G+¥eåyŒÈTË®–5,]-5Ÿ,®Yl·˜k1ÈÂß‘EÀ í”Í”õ—5’“ eñÒ'Ò#Ò¥ÒáÒV¨ÂæÂ*Bo¡Ä ÞƒMç{À¦™È°î‚&‚ª‚¢{ø¥4~$ÿ-ÿ.²p/êªAüÎü¦üªü|O¾ŸåEòx»yÓxxÕx®<-õ™ºCí¡æP¨FTqJB%‘oÈËär9lJ–# ‘:"šxA\$¶ ‰ÑD'Ÿð!¬-;`/¢V\ÁþÁd[±ÕÀ/VÃÄ0o˜˜¯ë˜ÙÌH¦SŸ)˸1bFAGѯé›ô1z#=‡M÷ ›Òi/ZB+tѺ—º«ºÃºuºYºÑº>º¦ºr:'O—¬ ‚;¨] žõÕ6Ó–×Òj5‘šÇšÓšµšÉšnšššÂž&FýP}X½L=BÝœ#Zœê¡jêéþªº*W•RùVyF¹R9LÙPé¥T+g+à…:ùù9x²1ò–òRr™<>ëQÖ±¬?³FÛ•ϲÏRf†dÞÎ<¹üd›ôŽéÝÑ—áéãÒ§¦ÏI_’¾¾fWúÁô“éçÓo ×¯Ò?¤‡§'¦g¦kÓù–Np£¥2ªdøg4Ïè”Ñ/cdÆd\ñªŒm‡ànc‚3b3ä¼L»Ì¢™•2evÊ -ÏÜžyãö63.S oT4«fV‡¬aYs²6e̺—õ1+=K*÷Kê"/ÿ>é¶K’$´ÄRê!--­%m)í!&*],Ýö–^—>–I£¤RBf-ó”•–Õ5–µ“õ–M‘-éÿ•ø1Ù%Ù]8ˆ`Y´,U¦‘ -l-Ü-ü,*XÔ¶hfÑ p8Ø8Ûb‰ÅZ‹m‡,ÎX\±¸kñÒâ£E”E’…Ü‚µZ:XzXúY–·¬iÙȲ•e'Ëžð‰£-§À+.±\m¹ÅråË3–W,o[>²|eùÞò“e„e¼eš¥Ò’G¥VVVÞV>V¾V¥@Ô V•­ªXUYý­Y5³jlÕ?ù[Õy*âï%à;­¬¬øVjËËHxÑû–çàJÿÄûY¶³¬mY=",,-nY±Xg1TjcQÅÂÕ‚•ÅÊ^áŠwÊÊFÉ:ËjÊ Ë²Dé;éUénx¦aÒ6ÒÊR7©Hš&ù ¹%9 Y.#é"ñ—øIl%Jq˜ø‘ø´x“xŽx„¸­¸*î—L,}=mÍ µU¡ÔÂ8ÜëÛÂCÂõÂyÂQÂîÂ&pê……–B õÁȨՂY‚1‚¾‚Ö‚ÚpPKŽŸˆlzʿǿ¿’?‡?ž?˜ß…ßUTI¾+ß’Oò3x1¼`ÞsÞÞyø«­¼•¼ù¼‰¼a¼~¼¼º¼â<;ž’ ¡nÁm-A­ÖU›7Ø•F~À 8B®%§‘ƒÉvdmÒ´&ÕDñœ8Oì&VÓˆaDW̯r¨DξÆü;Æng—ƒbCØŽl¶[”µgI6‰@Åy‹9‰9¼ ,ËôcÚ2uáÈ 3¶ ɤ¿Ð/é;ôz7½ŠžMƒ´£ýé2pgRZ¥‹ÕéîëÎévëVêf@E:é€j®:‘.S¦}¢=¯Ý­]®¤í§m¥­¢u×’ÚxÍ+èÓÍ,MMM)85¹ú³ú¶zz¾zº‰º„Z¦NQ½TQ­SMVuSUW¹¨tÊPå]åAåRåeeE¥“R§ˆ€rW¬Uü:¿‰¢œÂIA(äAÐØcò òyòÑòžòfò*ò¢r;9!OƒKx¯p6ëÔyIÖ´¬‘Yý²:f5˪“U)«x–g–c–,‹ÌÒdfe¦fÆgF€ˆo3ŸdÞ˼™y5óbæ©Ìcp€û2÷dîÌÜš¹1sMæêÌ•™+2—e.ábaæ‚Ìùx-Èœ‡ï‹ðÎR¼–cUØwŽØï² GïÉÜŸy(ó8Z<‡v¯ƒ÷3g¾È|_ó)3<3gOÉLÏTe2™‚,i–5zæ¶”©«dÕÎj”Õ2«}V7ô~HÖ¨¬‰ð@ó³Vdm„:u"ë"®ñqÖ›¬¬È¬¤¬¬,&K‚ë÷—W–7·’w“‹fƒF[À£óò»ò7òpyŠœ–[¡N(×ÔA1H1E±L±KqVq_ñ^‘¨`öJ?e-e[å@åpÍá_+c•:¥ÊOUŽz¤jžj“ê¸ê¶*P¯bA©RêzpR#ÕóÔÕÇÔ·ÔïÔ±ðRVš¢šjš–šžš±š…šš#ðì/QéÈ52äFYxùöÚþÚqÚ9ÚµÚ=Ú³ÚÚ÷ •R+Ð9èŠè*êêëÚêzëF€UKtuût§t×uOtÁº]¦ŽÑIhGº(]®C7§;Ñ}è‘ôz>ý'½‰ÞOŸ¥ïÒt4­¤ep\˜¨Ù†0S™%ÌfTq—™‡Ljº,†ÏÚÁy•gë‚_½ØìTv!»†Ý ÿu•}€yƦ°ZV@ØDq¢"|Xs¢#86œ˜B, V›@²ãÄ%â.fc0æd¡"x˜Ÿ.¤7Y†¬žµ"»’ÈQää|r%jÐä)ò*üÙkòù•Ì" Ê‚r¡Š‚jµ¨fTj5•ë*j'|ÚêDŹV”W…ׄו7•]¼³¼û¼¼Dóá{ókðÛðûó'ò—À¯Ûùñplv‚â‚Z ÛÁdÁðí¤ @%Ó,„^ÂòÂÂNÂ!Â?Pï@]~[øR&L"¨ayQ]QQoÑhÑLðn›èˆè’è(P)JiE"±£¸¨¸‚¸¶¸ªþÁâñpxË@¿}âSâëÐÛwPÝ8q–˜K$ö/IiIUI}I+I'I?ÉHx¿9’e’õ’’ƒ’Ó’«ðÏ%ðq’ ‰N—ZJ I½à +HkJ‚¤½¤ƒ¤#¥¥3 ÷+¥›¤;¥‡ÁÊ+ÒÛÒ‡Ò—Ò÷ÒPiŒ4ÌTƒšbpÓQæ.ó‘•’U’U—Õ“5?;ɺËúÈËFÊÆË¦Ê¦ËæÊ–ÈVÊÖÃYn—í‘”‘’•i®rq¯ëx]–]Ä»§eÇÁÝý²­8f9Žžõ‘µ•Õ—UÄ™œd™Z ç =+Ý#]-%GÛXZ^ê.Ã9EI^Kn¢Ø(™:õ”4–”•¸IHI‚8X|W|L¼A"{‹Zäƒð¾ðœp—p¥pºp¸°+(UYXTh+$„)‚PÁSÁUÁÁføô)¨kº š jJœBA?šÄ¿/µ¿¿˜ÿ4¿/¿=¿¿2ª#W¾8•ÉûÊûÌ{Í{À»Ì;Š<[:joŠ®Š6  ¿¢ª¢ŒÂJUÈB ï§„çH–ÇË£¡ôŸååïåoå¯å¯äÏåOäåää÷ä`çM¼nÉï wñî}üM¿ÇcùSù3óGÂO† ­py¤<-'ÉSå™r…\+gå”B +,v g…§¢ˆ¢˜¢$è\YQ½«¯h¬h ÂtSôe†)Æ(&á æ+–À©®WlSìQVœT\T\WÜUÆ¥‹²¿r”rŠr><ïVå!å9åmå3e°2Z™¡$TÖpOeÁ¦Vªž Ó ÕŸªí+ÂUi*Rm¯öUWS7ƒ“©ž¥^£Þ/õH¬NPë@©Âš ššŽšÁš©š¥š­šcàÔsM£±ÖzÁ¡ëIÕžjr`·öüûsmˆ6sUNºbºJ«zéFê¦p¾jî„îšî¡.P¡KÒ©8gåA—€·ª‹¼ëÈÑj=—^Ao¤÷ÐÇè‹ôMú!ýš³RA-‚‘2öŒS®«)Ó™ÄLBv¯F–Ÿb®1O˜L“Î0ŒëÄú°X¶Û™ÀŽÆžÌ$iRB9P…©2TuªÕŽêM ¦Â¯­¥vC'®Q©÷ [ÅãÙò ó*ðêC[úòÆðfóVóö€mw @¼toºUä7äwàßð×óð/ðïƒpQ|9Ÿ'°x J j š º †€s k;GW÷oá‚dø9¡Ð¼+%¬&l$l'ì%*œ(œ êmî^ùž …_Pýg ¡Xd'r•U5µu‡ŠÆ‰¦Á+ü)ZE> : Þ‚>¿}EˆâÀD¥ˆ ÅVࢇ¸˜¸ ö#öJöHvIvH¶H6HÖHVI–⨩’q’ r¹¤š¤¸Äç%%âhü¾ø|Óñ*ñtñPqgq#qE±—ØFL‰ÓqÍoDw9:-ý!"ê,j"ªŠ1+$ŠäÂáa€ð µJ8C8LØCØBXCXBè, U‚xA°à1îÏT$ËÓ#=­ueáÅm<#¥ó¯ñOð÷â~/âOkïÆoůNùñÝøÖ|Š/ç%ñ¾ÀÛ?ä]áàíãmä-çÍâƒóïÉkÏkΫëWå_%â1”œJ "¨Ôsê!<ÖETW{©-Ôx­YÔdj45˜êEu· _KSR“1ä;òy†ÜM®&çcÈÞ¨æôür'-Iµ^(ñ’¸MœE ¸X† 'z­‰úDeÂpÆl#àÆâØO˜ƒ÷ØËìqv7»]ÊÎb'°CÙžl;ŽfåXoÖ…µdy¬ŠI‚; †?»9~ŠÙÏlb–ãg†2½Q¿6cê0•˜âŒ;œšÑ@'¢é`ú@_¢Ð;è5ôm8Ý‹nK×§+ÑÅP áÙâu!º§P££º­º¥º?tCàÚê*è¼t–:­6N¤ €¢mÓ.ÖN€okßæ­µÒj5_5o57¡…›5ó5£5=àÞ*A)-5*uœú½úžúœz¿z=*þ±ê>êÖê:êÒjµµšP§«¾ª>©ž«n©Î©ª¶©V¨¨þPQ RõPµW5SÕUUU•SùªcÙP6šM`3XË',Q#z>DiÔ‹µ‰FD ¢Ñ,FŒÃ,œIÌ'þ$Ö;0/gˆË˜£1S‰Oph D:<CH Ò3Ùó¹Y‹lH¶$;=È~ä0rÜÚ\r9¹ŽÜFî'O’—É#Ù8²‰);T·Å©JT]ª<Ûj,5“ZJm€¦œÛQКTJKIxN<Ð͟ג×7„7‰7—·’·wˆw‘w—÷uvOΣPw»¡þ®È¯ ë ÎáOƒê­åïàF­~ZøŽÆOï¾é&ðZVÔ´tôA•?Nð‡`.Ôt4uà˜àœàºàžà™ ~  ” tžP*´º ‹ Ë « ë [ Û » û G‰Ó…s…‹á*Ö ·€ŒÁÆs« ãás(úa¨0J˜‡(jà…"œ¢£È nÑ´¬‡RGÔPÔ\ÔVÔQÔMÔKÔ_4X4B4F4Q4]4ô\"Z)Z'Ú7¹[´OtHtLtJtNtQtUtS º/z$z¢¾‰‚á~>‰ÂEQ¢h„ák Bÿs$ÞÃ_ƒ±ßkÑ ÑSÑ=Ñ ÑyÑqÑ~ÑVÑjÑø¥‘¢~`R+Q}QeôÍMd+ˆÔpNŸ…¯@¦ ¸¶-™±Üg$š k K£B°’Â,A¬à#<Ô ¸å]‚µ¨'ô.ªUOPIà'pH:~ ?È#ŽQ{ॖðgðÇòð;ó›ñëàNÜÅWðâya¼7 Ô Þ9ÞÞNÞZÞbÞLÞÞP^/pª©‘S^¼B<äU,ßÿ‚ºOÝ .PG9R­¦TS¨QÔ@ªHÕª‰ ,EùR^”3j-KJD±¤’L#ãÈ/d0ù Y{eï€d'Øýì6v-\ÙLv";œíÇvÃìmÌÖa+±¥Á3WÖŽ³,£Ñ¢™OÌ;æ)À\aNCv2ëAµ¹ÌTf,¸Ö‹é¥¨*·,S”qb,á×2éd¨J0ýоO_…gÛƒy)=‹G¤»][aÚlSÙvCwR·K·Z7šÖG×ZW*çç¦F…¢}¢½¢=5\¢ ÷ÖEÛL[M[\ë¬iUš8Mˆæ…æ¶æ¬æ€f“f¹f–fœf¦+”¶®¦Š¦¤ÆSã ‘h\¤Ž„ª_¨¨¯ƒ}Ç@¿íê ê•êÅê9êéêÉêqPðÁÐñîê®Ðó`bSuCu=±¼Geuu9uu)h~q¸‘bp†EÕÞˆ"êÂj/°ÓSí®vÃKÿ“!¼ðoìUûÃ1~ê8º´º,Zªˆ«ª««k¢ýúˆ†êÆð7-qÖöêNèAOô¤Ÿz zˆz¸z=I=½œ­žþ.G¯×¢ï›Áš½êƒàÍ õY0çºú¸þ×øVýAýY®ŽQ'ªÓÔJ5 I4ÖG»ÆGS ~©:F¨‰¦¦³¦Fl”fŠf¼ÓZÍ6Í~xâ+šÍSM r¼& .J >yjKj«jhÛh»ã>LÐÎÖþ©Ý¤Ý§= oýPûVŠ»%רJ\u~ºŠ¸‹ÍP©ôå<Õ|Ý*ÝÝÝÔ1÷áÔ?‚T©:5|•5íBûÐeèêtº%Ý™îM¥'€U éU`Õú(}Îÿ>ê¤ ú3C§ÐrZGóü•r®4jªZLCTW혮¨³3£˜ Ì4f³ˆù“YËl…ç:Ìœd.2×Q—=gÞ3‘Èj9Ã2bÖ–uc‹±eQÅÕc›³Ø>¨ëƲSPá-bW`;ؘ+Ù›ì}0ì5ûýÂÆ²Él«e)BLØ Jô ŠÂ‘•Éj¡rl†ú±#XÖ—LŒ"Æc>Î" ¶\žm!ö‡ˆã¨7/7ˆÌ\=ÓBˆp"µh&¡Õø¤Œ´Åüö ‹’%É d5².Ù~­Ù‹DŽ"'’3áØVñí‚2œ‚g»E>$_“É(2ÚAQT!ªT¥*UlëDõƒo›LÍ¡–ƒn{P5_¦îR/©`*ŠJ¦ų€næ•âUáÕãµàu†‡ÊÍæ-å­çöóNò.ñnñACx‘¼^&OÇð-ù…ø^¨äËñ«ñýùMø­¡›½ùCø£áð¦ñçó—ƒ}[ «Gøgø—À¿{ü'ü—ÐÛü/üp0“¯á³|>”ØVPHà.("(VÔø À ¶ttƒ«èG8J0^0U0K0O°H°\°Z°^°þp?ÜÇIPò28y[p~ä…àའD&ˆé‚,Ô$„|¡Xh!´:„n D1ð³´°œ°"Z­WÙ $m+ì–töOû ‚©Ã„#ÁÕ1 ÌXáh¼Æ Ç#&'!&à§1øë¨5O §z€S­àþë ›ÊQ%(oÊr¤¬(1EQZRA¦€T‘ä'2ˆ|ƒúêrñ2y–£æ\Û'TΠJgéƒô6èÔ|úzÝ—îH7Ž•¢=hšO«uIº0ÝÝ]ÝÝ!Ý6ÝŸºÙº ºº.ºæºÚºrº¢ºB:‰ŽÖ¦i£µÁÚgÚÛ¨öhwi×t³ ¯Ãà:k[kjkh+hKh‹h]´vZ©–Òj ÉÉšXÍÍGÍ;ðïÔú†æ²æ”û0ô{·f»f‹f½fˆ¸L³X³P3dœ®ù*?U3ŒG8R3ndˆf0ô f^ú¯4ý1€‹AÜû¹ïƒ°÷P5ÇŽÖŒE;ã5àg¦ åéš™8Ç4c ¹•ÜK’\#ï’OÉwäg2tS,œ›-å*EU†*5¡ÚRݨþЪqÔÔ<0n=µƒ:Ê]¤nRÀ¹T8õ¤“S4ÅG}nÇsíüxåxUyµy A¼öðu}àìFñ&ò¦ÁÝ-†¿[ÇÛÂÛ=Æ;úÝà€¯xïxÁpQp|ɼ ž$ùB¾ŒoÃw„Wðä…g(Í/ϯʯůÇoÄo/Øžßߋߎp(\áxþü™üyð†KÀÈUüuüMü­p‰{øùGù'¡öùWø×ù·øwù¡ÿÏù¯AÍü¸Ç3ìLæ§ó³ø*¾%X`jØ Žð6nOÐÔGà š””U˃,UÕ5µu@šºˆzˆúÜW¼WQ {TTÄ%Å…'ÀJ ‘t8c?šŠÞ<ͯ¡§Çø{Ñ÷5¸’Yü)üQ¸Æ¸Þf¨*óKò‹ð]øÖ|ŸAÅ€Ê!„÷ê&ï<<ÔnÞ&ŒòBÞ ¸(ýç'ºòÚðã~Tä•äžLÙò$<Ч¡Ò¨8øpýÓ©GÔmÜÓÓÔ!jµ‰ZE-¥fP“87Õ›ê J5¦ü©jTEd†åI9Q6””âQ:ÔDéd"òç ù£ÔC¸ªëàÔ9pê0¹uÔr=¹’cÕr²p 9‚Bö'{’á¸Z!G\5À®È]gÒŠ"•ˆ&>Äâ2q s`'æÃrx°é ØHb ªÀvDs¢Q“¨H”D•èF8Vpc8–É&a~a?²oÙçìö\Ù°ì»sv=»ów;< 63»+ˆÖÍÕje¶[>ÍuÕ$,¥%”!n-Œù²½€nÜc; %ÙÏì`6pl›Í±m(Ó—éŽj¹9S—©ßæË¸3vŒ”!%œ[4ý‘~M?„ާÓ;éõðn³Q‘£{ÒméÆP¿òt1Úu»€Ö †ƒ{© Ð]ÕåvèÖëCIÇé†éúëºéÚA_èjé*ÁÑùè1†{w\Î_³¯ˆ#'ãø?ÓÐÚLPw6Úž‚,Ä™–#⼫@“õp:›µ[´Û´;Ч½p=´‡µGÑÏÓÚ³èñeí5íMí-m€ö¼Ðí \Ñ[\×í'\a$®3^›Œ+ÎÒ*µ-£%u°ßRg‡Àãâ ÇTFWDªñj Ü^×\ ®«›¬›µ y³n7Fù´î2øôãþ^Š;¤ËÒiu½œÚFï¥ÐgèËô-Üå—ô{:¤J¢3hÍÒBT9Œ+ãÍ”`ʃUµá¬²YÕŸ†ì™ÄÌ@´YŽŒÚÈlË¡•Þ_ÝAÖ=a^1àÕgð*™^iá¶ø¨¾,Ḡ±.àVaÖ‡-çU‰­Œn̶b۳݌üšÀNcçÀýÉ®Á¶³{ÙÃìqö,{ »‹ºïû`((Š¥`.8Ƈ#³É ¸2=ËJe1÷ª5PI6 -àÎÚˆ® Z_ÌСðhàÑôkŽsàÓ²©¶‰ØFì&p\;EœÇüÖû5=Ù^oP³†_0ûã¡Y„†`áÚ¤¤5Yˆt‡>ø‘eÈJP‹ºdc²%Ùuo?r(4e œÛr9´f ¹›…šÚ-…®§¶P;©ý¨ÞOS¨«Ô-TóO¡—ÔGê <^<êü ø<-EòàŸ5XˆçÆóâKóÊó*óªóêÀû5‚KhÅkÇëö‚&‚2äBOáMçÍâ̓^/å­à­7‚ÛAÈ}`äÞ Þi¨úeÞUò6<È#ÞSx‘WpŒïxA¼¼O f$/–Ÿ’rfòä<OË£y,!D| ߬°G ÁÓ¸ÁYz#|ÀS?¤¿,|f~Ep¥ œO ðµ(S_QÏúŸýñ~müµö©†½ËÁ%•B+Þ|ÐÈg°±Yž}HFÂAôwèë#ôû2®âÈ´×·×:‹7W?~¸¯ê„F¼š¼ àSQðÉ®™ÏÓ¡ªHAuޱ~C=¯¾Ž{p‚:È1j5îÏ<8© ¸cƒ©>¨SÚSÍ©†¨ZªQå©’ ”åŒjFJÑ¤Š£T òà#ê—äòÜÔPê4yŒ<ˆŒÙŠÌYüYLÎ#g£RšLާƒS½PAé9ÕœªGÖ!k’UÁª2 •Y˜ô$]I'ÒÔ’€[$ÉJ"ÞKO¯@â²ú*·SÄabò~ ± ÕÝtÔy£0;úb¦V‹¨†º°$áƒ*±aCHËbÓ0c0CØ ¸²§ìCø²k˜«gÙ“˜·ûØ]ìðl5üÙ"ÌꙨM§°ãØ‘˜é}Ùl'¶ |Z¶[\«E(eðbÝ ö¬+dIV IcÁ¶p°-úòˆ¹ËÜ€âœeŽrtÛ-Z‚ z3žšº'Ó‘i‰*[ïÝJ3E7Æžã› î-zˆ ý.} *x˜ÞMo¢WÒ‹è™ô$èä@èeGèf#º]‰.I{ÃË9¢öÒ$­ÕÉáât‘pAÐÞ'ºº;ºëÐ⳺º#ºýÐæº-º ºµðËtKà'æèfêþ€~OGëF‚Šƒáûëúéú@Ý{躃‘]tut¹h«kƒh­kÅEK] îÕm®k†W .ZrÑ ûµæöo‹hÓít7º¡Ýºž8Co]_œ«?Î9g(h2B7J7L¯›ˆ~ME說³usA˜…èórøÔ•º5ºu¸ŽM¸šº¸®}ºƒàÎQ\çiÝ9ÝEÝ\÷-8ÛºGº§ºpJAº`ŒË]F(Q—¦ËÔ)Á$U‚ãç@»`$½éâ`SExdŽNè.t/z=”MO¤§ÃI-Á½XOoÅ]9DŸDr•¥žÓïP•„ãÞ8ÅÐF†šÅ™ñÀÝ-WU÷º>ÓŒiÍtBmÓ‡_5–™ _5—YÄ,cV£2°êÜþyTF7‘Cà­^1ï˜`¸«H¸«x&¼’3j†fHVÀŠYkÃ:°ÎÈÇ"lQ«Ǭª VmälCdn °«òØ@¯ÈíÉ¨Ûæ"ۗíGöïÁ¢¶;…Yq…óaØ' Ø[ö=fMÁq,~LΪYšeY<™µ¢-*Fg•ðÍŠ~Ï*•‰ê˜uˆzphMÁ´¶ðhˆn`Zø´A˜·#‰±àÚ$b*1 nm.·ù'ȶŽ#Û.b?Øv„8NœÛ.׈[Ä=âñœx E&B‰Hâ+"Z‚$ έt¤0YŒ,I–‡¾¼[k²#Ùì ÷6‚Çn>¹µô¨•žqÇÉ3ä%TÛ¨ºŸƒsïÉOdH—H¦‘rR?Çí,Á»B”UšX‚*GU‚B֦ꡢoFµ¤Ú|]©žPÐ~ ßj 5‘ãß,¨ëBhìŸPÚõÐÛ­p~»©}Pß#Ðà3Ôyê xx¾!Nð1õ nð-¸L…P¡`c$íN ’àÓ¨L0R J2à$Ÿ'„ÿñ,y6 ¥#ÏŠï×X„çÃó5KðJñÊ€œyUà"«Ã·ÔãÕG4„‡iÊkV´æµ…¯ìÄë gÓ×<íŽôã U‡ð†‚¬ÃÁÖQ¼Ñ ÌXÞ8.r¿ëß¿ŽÂ>#°çÞ@^xÔî¼.hµ5ÎÐg«³WD?Š£W^ z!ôVƳ¸ŽL\ÓW8§*ˆûdß]¸á˨ŽatvSÛ¨ ÔJ8¨¹ÅIÔXj(tOx¨vŸjqk}¥¨b¸úÕ>Ü!=¡Ôd&*”¯d$ 'õ–|A>‚;¿É1êÜú~8©­äF¸÷ääÁ,ò£—Œ ¨ê Nðú-Éf¨‹ês~ª G©’¤/éMzp”²GeAŠI>8E£²R™D‘B$ c•_À¬`x®7ÈÕGÈÙâ:Øuš8JìƒûÚD¬Fý¶€˜¼Ÿ~ ÁlèAtÁZ`¦ÔŬ©ŒùS uaŽbv˜a‚G°¬3/Ž,ŽÉ>c^¾Åü|–À™]ż=ÇÑ컇ÝÉne7±ë0·ÿä<ÚÌö©ìDÌûQœSëÇöb»³¡ ­Ùfl#h„žmÕØŠlèG1°ÍŠbe±Ë@k2™(OçÜÞ1/™ÇLjé‹ÌiŽn»˜ÍÌTÛ ™™pocQƒëùÖ JׄñG…^Ž)Žj]O8ÃghZÆ% ¢¥?ЯèGô=ú&jý³ô ú ½Õÿz½Œ^­AO¡ÇCyGЃè~Ðánt'º=ÝšnA7¡Òõ Ñµèjtèu9º”»œEº0í%wƒž;Ñ…ÀF{ÚŽ¶´¢-à?$1B„Bûù&Áã^‚ÄwýO#—²52ª8|v%¦S‡{RÕ†éÀtezÁQ aF2ã8NÍá8¥_ÜŒŠf¯‘Tç@ªðU÷à«^À×`>1_Àª¯¨‡R‘9 FÃ0 …:IweƒšÉ ¬òb½‘i%ÙÒl¶ r¯&[‡­Ï6€ÏjƶDÅÕ¼êŠê«²u;ÔÉŽaÇ#‹ÿ@…6]È.cW²ká¾¶ ß÷pô:Éža/°—ÙëìmÌŠ‡ðaOQïéö‘óbј=‰pc¨ •˜Q Åy2æ™ a_æL¸Á™&Š‚f%0Ë ¦¬¦ç™?QŸhÖ ³µ æl¢3ªÏîFª $ÃÀµÑÄ8Ô¦ÙŽm±X ²­DݺØÂ¹¶ý¨d£ž=e¸JÜ$îB)ž/¡zßJDpÎ-º¢ÝÒàÝìIgνùBÊÁ¿U'kC¥šp®´«79.n$9–œ]›…|H·‚\ ÅÛåÛ‹ý(<ݸº+ ÞmÔïQÅë©÷Ü j~!£Á¾x2‰L%3À?%ÜC’ŸRRPІ²‡Þ:S®”'U„* öKC+R•ÁÄÐfp±!ÈØZÝŠjÍî>v»èAõâ9€¿1 ¤Vާ&#¦Â‡Ì fR³¡ùó©Ðþ¥Ôrsµ†ZÇÑs3|¤ž ;à]vQ{¨½ð”‡¨Ã`é1ê8xzD= ws‘º®^Wopqq Œ½ÊÞ¥î!îCÿûüíö¸#®âÈ‹ òY´t~õΠgÑ&œ5ú²ýš"Må˜4 T@õù;â*›Sà‚kPUàœôd*B¹£b°Ã˜‰Á&l’cLàŸÂ1ÒïÉ7÷G¸·+}'ÈÃF>­'W‘Ëpïæq|šLN0®ö $ûà.wÆÝn B|”Påà£ô„ò"Ý#¨„,ᤄ$$H¡FeÁO¥‰Dü Cž}@%õY÷ŒxL<àHu¬ºF\FVž'Î'ˆcÈÓÄ^pkȵÕÙ2bjµÈî ÈóÈø¾F~µBWs¤:Qõ_Ìb`˜áŠÙ–¨…˜k «e˜)˜‡q˜‘¨-CØ`6} šéÙ=x³›pg—1“Ï¢=ÎÁÜÞ ¶ÃHµÕì Ô­®Í„L†&ŒÙ†±ƒÙpl½Pçv†~è][S°­.[ ¾­ t¦ œ›/ªdOèkÇZqë’¹|‹†n…À½½fž2÷™ÛÌUT᧘#Ì>f'³…YˬäÜ,f*3Í e2½™.L;ø¸&¨ìk3Õ˜ŠLèh1¦0hWÊj O'€«ÓÁdÑit Ô7†Ž¤¿ÐŸéÐ/~¾„{xqNâ6Xx¾ï }‰¾H_ ÏÁžFœÑG‡@ÉPù}`ånz;±#'¶s¯Ü¯ú0ìc8b7b{ÑÖ~´x-æÎpg:Žóéã$Hr}8ž\@Ÿ.£gWпëèå-Ð%.õ>ý½D?E<§_àz^ãºé \a0®ó3HÿÞ( î(ŽŽ§édŒE:IËi%HDÓC¡22bTV7Ɖq• 3>ŒS dªÿTc\ž¹)F¼-ǧðQp'F¢ê˜Èüúcµ”Y»µ‰ÙŽÊd?sˆ9Ž:å÷¬êÕC££z{Æ­ÆsϬ²£©ÈR9 K\¹•À¢È›`UYÔHUMµY#«šƒVmshÕÓÈ«!¨³F²£‘—ØI¨½¦!SgÃqÍ·ƒ\+Ø5ÈäMì6dõv?{y~ù~uÜ5äÿ̃‡p`Ï9~rûÌù°hö+ÏQ,ÍÄ\Rý‰*Qˆ`™5*GÌ<½3ÓóÌ‹ðÑ|1+KrOÏ*¡Î¬Æ1­6ªNÕô>­%Ñ^­¼Z¸µDoÌï˜åC‰áF²M &£v ˜ %XH,†&¬@UkX‘ܺžµ$ÎBG®7 *÷Œ|{ ¾}äø -J&ÉQ?ë GA­¤P-¨—žr…É¢P´¨½Ë‘•áåj@ëê£*oÚµ!Ûw]É ^?¨âr89 Ô›­œBN#g³É¹äBTøKÉåàßjÔûëÉMäPp'vtö œßx¿S áyø¿Ëä5òy qŽá>¸ø˜| …~A¾‚R¿#á'‚ÉPîÏdüa$t<N#‘Z¦@ÛõÄÌ䘩‚ÚkIÈIPØ)=Eð(RÊ<°EmAÔ áãZx€©žp4ErÈêÇE D)DiDYª X[>OTàÞÓ¿Ê`ŸRTIª8Ž.Šv¼Ðª;h­ÿìž-eEÉÐ>E¢¼Õ ŸYð¸Id®%׌«|+~‚«¿‹‘¸†q9‡:Æ‘i7¹#¸ÕÄJŽNsá¤õt‡±wÝw£èÔtjª¤!Y—ãSU²"Y–,E'}P»x.ðP¤-iEÊH*=¡ô.JŽj'Ž>¹E„çê-ñ Nê)ñ0‡Q7ru¾êœÕaâ Ç©=È¿mÄVdâFäãðj²s1²trurödïb,ry15[/dy'¢=²¾Ñ³ .·ŠX+‹™â‡9ã¦g˜=æ”*Eæ ?F£~Ì&Y椞e_0GCØlæìö%fïÌâû¨Eo³70¯¯€içP£fSm?æþ.v;ǵ P½_[ }Xˆúv6<Ût(Ç$Ô¼c9ß6έ?Û£ç[ð­%ôGÏ·ÚÜó6ߊoðoެ-kÁŠY>K°Z([÷ì-z÷ºÞÃ=… r¿Ì\€>‡NêÜvèæzf5ó'Tt!3´›ÞM„¾Žb†Ã `úÁô€öv‚·ƒÇkÉ4ÿ1  Íu Ð5ÁÁ*Lex‰ ˆr bi¦$S\ôEƒÓðfŠpQá•÷ÄËnŒ;^®\¸ œúï®fïeÿîÆ…{ÎÑž\x¡U}ëÞ8“Ÿ—zP=)…þ”A”C”G+¢§•Ðß*èw50¦S WQε.®¨>®«ÓÌi†ëlɴ·eÚãÚ;ýݘîpº}˜¾ðI1:Cà}G`¤Æ0ãQ#LÆÈMgf0³1Ž ™ÅðN+0²ë˜ðOÛPSìåèt”9ÉœÁ=¸ G}wä>·æ÷N*„ eÂë~IF7¥_ù#P·ˆX)*½ŸÒ?¯rCUS$‡S匜ªNÕƒÃoÂqJïª:rœêNõG> †³Æ9«q©&£žšÎ±jhµ€]„:kª­ÈÍ5ìzv#»Ùº Žk7»ãÖaö({}¹­_;¼nB¯g&ü æøŽY¢'X·š˜Ê1LïÅT˜M:ø1Çøà˜£êFkT–9aºb6zbN!|@3?¢8¢ˆV†(ªUת¹Vn­Ñ€h„yÝ,‡lí¹'kz²õÊñlCQÇŽ"Æã‰I¨k§m³Œ¾MÏ6ýšäŽn[¡.»@·9îíøv þMÿÜí!ñ:¥g\ tKïâ¡c±Ð³$èšžt*èͱŽå“@ÿ,À;;ÒŠè‚ÊÝÔ+bä^)Ž|àòªÕ ¢µ ¥þ¨ø îo ¶ [ƒmá:¡º]á z½}ÀÄ â`xÁaPæ‘ÐçÑpãÈñ ä$Ž‘zJN‡~Ï)ç@Éç“ ÀËE æhû ÄJx=7×’ëÀÎ ÐýÍPÿ­ èvŽ¡zŠî%÷ ûÉMGGAÕˆ“äi.΂!çÀØ äEðäÇÚKðŸWÈ«\èºÆ…þgýß.bßóÜQgAçShéÚ<†¶á\{pn=‰6¡WkÑÇèñô^ï–fS9¿4–c’Þ1õňtã¨ÔŽã’þsú•½šÕÊœs*Iúå<ƒrÁ½°çÜ“ÌèŸôÏ¢ tÒû'=bpWõþé*™÷¸×¯qÏŸãÞ?BÜnÁC]ÍáÓäÉq#¡öƒO»8/µÙ´~j ê¦ÄrdÙøªù`ÔlŽRÓÁ©)ÈÆ‰`ÕxÐj òs$*°¡ÈÖ¨Çú!w{"‹;£RkƒÌnndW¢²¿æBi¢æ…/øU3Æ#˜æ‘ f” 5¢£Áù1æ_H–†ù˜„yÇÆ²Q˜§á˜¯¡Ñ>bþ‰ö3û˜v³ü6{‹sj—P·žeO#N€lG¡ z¶í…Fì„Vl…fl`×BAVp|[]™}™¥1¸·q¨”GB‰†ý[w#ßZAµ³õs\EÔߥX?îé›;ëÌ1Î*(f, §a”ç’™8æ+Ü\$Ô3´ „–¾‚¦>b þ€ ¸Á\a.Â݃òžBƒ bÂéíw‚‚Û¡ÐÛ Ó› Öë¡Ùk™5ÐîUˆ•Pñ?¹XŽX ]_‚×"ÄBf3¯ÜwCÌ3ÆÜœŸô?ÏAä¾7?ç¨hc!×Ö"®Í%ˆ¥ˆeˆåÜ9W V"V¡7«Ñ'}¬ãb=zºýÝ ¯º•ëývf®EÿÚØÃñæBÏœ£ þqç$®þ4FáFãÆä2\ï5èsq4z€q{‚Ñ{1|Ãù¦Ì'Œ¬~/ã¬'S F=ƒ‘cüÕFÅç\”k ŸíÈÊ#”Uœ-‰Z¥<Ǩjl ¶î°ÁMéŸTµaÛRQåtG.ôå8epT£r85…óT3@ªYȤù©s¤Z N­5!Õväà.äâ~ö²òê®cÈQ=±Î gÏ!sõ+†W®+€#×cŽ]/Á®7ì;TsÁ˜Ÿ0¾püŠÁüÐ;°DŽ`iýz¢‚c˜u¡~UѰ®( D fœždúF[Ô‘„cÍÜ0;õî¬0ü™Q,‡i%1õke1—+€k•‰ª×jrŽ­NŽgkƱ­5·©g[g#Ûô¾MO·AĨÆ0n´ñy[6áæBoBw–CÖ@‹6p„Û}Ò;¸ƒÄx¸P¯3ç.AÓ®ƒt·ˆ;P9ížA÷^o@¼ /˜cžžzPÈâ+‘@$C3S‰4Tö™PP½×ãþÇã„d@B$ä“R µ•‚†–kx{„´¸¼  tÙ££éÖ‡7(éC)ý¸(/(‹(¿Q Ú^Σ*T¾:¢µÈÚ=G낤õÀp) 9¢6š‚«úh©§«ž¯íŒÑÞ$ôÄíÚ \1D.ºCÿ³þÝN9¯8ª-Úk–[ }=…pª~UãXT‰£QiÎ)ùâú ãjÝqíΓô~Éc$•(x&®Y…5¬ë%ÃMë}S4F?ÔH¦wÜÚžÞ9=‚sº‹åîÞ ŽM—ŒÞé¤ ›örlÚŽÐû§ Ȉը|V¢þYfôPóQÍ!fr|š–C¨ñÄ8dÖhj„‘Pƒwý‘}ýƒ½À©DwÔ\]›À«v¨ÂÚ­À¬æDSdpCdr=Ôjµ8vUF®—GÖ—æÜ—/æ„7æ†'æ‰+fŒ#æŽ-f‘æ“¢sLO1½Ó²jÌ@+GE©'YJËbQqæòìdzÑÞa~¿Æ<×?G{ŠYÿÈH¶Î±ÝD-{íEhÄy¨ÅihÆ ¨Ç¨ÈŽoÙîm çßÖAyV‚pËP3ë7—cÜ 0n 7Œa\£ìgtq] síŒ>® œ\}(aM®*[ÉÈ:ýz¥ëÍñΕu‚’ڣⷂ®J¡®"h,Ÿ¥À>ž@Çè}žAŽÈ„"§‚„IL"|_^✖žY7¥·¸|½‡Ì}À±ë)²ùØõšc×d{²þs¿¢9‚éX"æH2fŠžaz'&ç(¦æ¼͹1É ŽL„'Á¼“ifpfvÜS³l¢¹`¦º‰V„[s,ÊqMÿÉ?nõ±çÖÊr~­çزÙVÃȶlߦ_‘lŽê¶%Ô¢ÙªdOŽoý9¾ æ>õoppã8ÂMæ>S2ŒË¦Ü"è—áÜjŽuë‰Ð¸-ÜzåNèÞo?Tð0¨wÔ; îùÎrì»żݼÞoCIï@Oõ|> Ÿr4|‰xGðêûÞ d|F|?Ÿ¡p_zRF"¢ ÛÑ f <ÜŒƒ–ǃž Pu}$Aßõ$MC¤ƒ¥zšêyª@(¹PCƒÐ"t\èË," Ö¾ê7 Á3²—Ï?™?ç}·7i<ž Y´©Ã948ŸŠsFYèM:ú–jäP÷Iˆh\™~ÏÀ£‰·œWz†±zŒQ»Ï1é6ÆSÿÌé Ǥs“N©tN{¸´wh;îÕfãºÞZãÊÞŸ¸§¹\ÊöMz.M6:§qȉÑpNz2 ›†pþ©?¢/ToŽNÝ‘QÙtꈪrMϧVȻȿfðVMNÕEvú#Gk#j"c«#s« *!“+ §Ëpä*n$WÌO£ÿrâ˜=æŒ5ÂÒèà ë‰<#ÅÌ;-fŸÞ‘)1õ®,ÝH³dn1óö«‘hQlâ æµÞ¥år-ó^¿þ¨gÛ«º=1:·PŠ»ßn §gÜ%Žrç8ʄ⃇;Ÿ}åvrœÛŒªÚÀ¹UÜ38ÃZå|hÛlîS“zÒM‚î‡þ2Ònê÷~PÈžPÊîlWÔõ¡žm¡¢­Pí7g›¢î×¥¶.”¶6ôVÏÀj `¶28¨ P䲈2PçRˆ’ cq„4Û—-†ðá¢(ÞPt}xå ÏÂÃ$ ú{ö±…s¢ˆ1¼9f裘ñ«>|¹—/׳â\”à¢$ú¾—æSWTHÿªÀѦ"^•pÅU¸Ð_¿ž>51ú§Mu9é?!Ñ£Õ£Öc×Ìè™ôLj&¨Ô#­çRoŽLÿ¤_éËfÓ8îsz¥§ÓtÎEµwT¿â÷'G¨ÕÜšŸÞKm4R*ÛOe3*ÛQãuŠsUq꺑T·www‘…Z=6®¾àü–žZo½ïP!— ôúÌåøD²^O/ý bH7¹óèÏ­çÞ]D?õý=Ã]ƒDÇp­ž0é]’á)S6Öa,WsNi9G¤EÄŒ¿žIúÕ<½_Ò»¥© Òd3¿4Ò蘆 r¸Ô ÑÃÈ%=“:pTÒ»¦ÖÈ‘Ö9\jŠÜÑû§Æ0ø¨¼tÒç^ä P“åe¹Ð¯–DΖà²×y¬¯×¼9Ï•K.g#»ì8ïe9¢g—”£—sI€ÅC•¨g˜b´‘c’é=™že™˜¡¹4Kâæ®žh_9¢ÅpÅ9µÔ©_àÖÂrȦg[0G7=ß„ËæÛ è‡žqO9=y”‡r7Œ>î2G¹ FÊ‚^àžÃ6ú¹}ÜŠ¥þs&Û¡uÙ¬[ 4Ðnxgpvó9o7ÇH½iˆ©ÐÒÉPÔ‰ ß8ĸ½QìH.F@w‡!ôë›z‚@ôç¢ÛÑÑ›{õBôäh©ç¥>ºq+aÙax_ÿ^W.ºpzß5ç·®fÑÍæ¿u3i³›±ÍÜП½GA ¡ïe¿œW?Ž+Ù1Àƒ¸'Jz¤¡Ü³¥a¸zýg!F!Fs1†‹qF 8¤_ÏûƒÉépÌ3rž@Í㘴£ÒRn}ïOxl=™ÖrÞÉœL;86éÔ^£ƒ:Œû{wù¸‘O¹k~z:]æèt¢§S6Ÿ8:ÝçüÔãj žQÏ8_õ‚£”SRe³JO«`.W?ýV(2ø áÈi½óŠÎ¡W·†˜lâ¿ôÌÀ/÷DLÍ1,›bz†(fàÅÕ|.„9<“p<“™0Í@5}Íic¤š~ÒÁ„lúψd¯Eºٖ׿ù"Šçð­ W…{òfðq5ÏßêB‘êC™ ¤kÊ­U¶à4Ì@ºöÐ6íô¼Ó{»îÜêe/Žz}9E€Ð³OïôW3õ~/›ƒŽ…ªŽƒ¶Žçê~'ƒ‹Ù1•#äœ/ÔvEzZÎâ^fÎå>%0—ÓîyAçCÉõ±0' NrIÎ˾b9šÅ îe`oA±:ç{v¬áb5÷Zó÷•\¬àÂÐêŸÆó-3ödb¡±×†«™Íùà9šj\·3%Ñ(n<‡idXÁÀ­áõ5º$½OÊvJæLjÅ9t Dj̹%êqO¥ôDª…¨‰¨ÎeI5ŽJ.UâØT‘cSYäU®~Ê&S d]6ô¡¯· Œ*Â娞SžÈYw.\áÌ9.'®‚³çÈeÍ‘KÏ. nõPbä—ÐH0¾Ñ‡œX6Ų9¦_[Tqë‹ Žgzšeäð,•«@“9ª%qdKà"Þè× |‹æ"›oá&Œ3¥\^ÎéI—ͺWÜ8ƒ›{„xh䜞twŒŽNïé®™ñNïëΚ﨑yzwÐŒ|öécG@}lâ4vb=GC}¬þꩨ•\èŸìéCOÉeœRë¿b‰I,6‹EÜË4æ‰EÆýr÷4¼›‹û,æ‘ûÓ’œ³ç~]f˹øÓøUïwVpW±"'Vr¤Ñ_ájnµNï†ôÏ–Ö!6pìÉæÏfŽ@zmËáþ»,ÚÇE¶_:l¤Ò±*Ööôd2ø¦‹F2]Ë!ÓM£sºc²Ö÷€û„û##ŸôÕ¹‹zÃeŽ)>p„úÈE6¥>q” 3R*ÜHªH®3ðÊ@,³ k†IFn¥p¹Ÿj¤W†‘_YÜÓ0%Ç0•чi9Šé?áÁäPÌ@2Ê„dcsBOµl®e;µìÕGë§fg\‡t0’M϶BÜüwâ”ÀÅŒožF¾éÕ£ˆ‘r—íáJpŸüÏöqeMHW‘S«*9k–ÕÏä²W. Ì˦^£‡×”{Rלóy-8Å4¬k¶6²POC=³‰h`b§2¢+÷Ù•nœw7Ò²;÷µ§Ñ½ŒÑ›[ÝÒícö³!úrÏû›Ä€œÐûÌœú0’×4qdÈ}lCò|”'_ƒLÚÈ=cÿœ§Eý¹¾úÛ›»’žÜµØÓ…[¥3ÉÅ ã×Ü8έvãôÛðýhÎ÷£Ü›#ÆŸ ó=Ž™|=š§­cfïåžó¸1N_Ç=ËíõIãUœÌ¹šì8ÍE.mοFä"z_dˆ+Ft[Á»ÎÑÈà‘rYt7‡F¸»ò#’a]ï)·²÷œ»ƒ/92½æ"›Lz6rŸ 2º§`. Ï«>ÉdΧˆ>èdpT1\æeSÊà®â¹ÌÌ^#L2rË@-ç62Œùž•C-¹¹ ,×…êAWÒF–å®-fû2ÊÌ›™SM”ãÕÄÆYœŸmÙ®Í@8“I»ï昣¦¤s6ÒÎ5gÒ“S£\Úå²ÎàéüŒÌ3P¯dŽ»+m\!ÒGycT0!`e.ªÃÀÂlÖà ¯2ÂðS.üÍ¢.õŒä¬oò½¾Ù÷úÆ•®†9Ñ(ç'oóGîžrŽÈý«Á­4Îù-û½ì÷ÍÿnÊ“ÜU·úƯõs(c£ó©CÃÈF©š yªp£YÉd.{•.Û •âîLIŽ?Ź;ægdP±_T4ÇœQanÏ+Çe3ÈÕŒ?¹a £±Š2§‘H¶Æl´Î‰l:rWfR“0°ÊÀ+7ܼàWyÆY“K®\‚eó+;²g¡6ÑÔœKSç¯á»Âdõ1+Û²ùf`\šQô‘]צW*³©—M<ó :óÕèïbìËõyQœNe»=s¯g`_öºf°‘Á\þÞHÁ@ÿ÷Öè³}à+NO³éø‚ÓX# ‘MÊÜ0ýíQ‘ý—‡faPvÃjØýœU±9Šÿ ßÞÙ?=Ì·÷³½_Ù?åïKnͯä©Ñï<5^éSã5g_ýóœqyi Èe;£×F”Ë!‰‚¸È%ÑÇ™®è…å¬è…ïm„‘K&tŠÊñN±Ü§- LŠË¡R6—rÙdpUB¥}UöÊ idgp6¹äÆ NaÌySz©òÐ+;h~VM]Yî#™‡i<“Ÿrù–ëÖr×!Íé&ÍÑ…lÊYäY¡´2Ò.×Ïå®Uf/ûUˆS+SætÍ‹Ü'tžfü3u|ÞÆ¯¹aXé,š£§y iJÊâÆ(a¹ì,eÔë’œ^—̾–æÜEãO¥ ü^Ú¨þ¥s(P*ç]ñe Øßü·ìÌ_¹‘ÝwÃwƒÃÉ¥Lq£ËñÍYóÍY…ó1ŽX6sŠ™SØ8æž9.(›?yP6…œó1ÈÑŒDæžÈÆŒC†Ì1p(×)™)—Cæ‘M¤ÜïB#Ÿ„FJeßd•0Ûiñr>¹‘ë¹rç‘qRqó« (ˆg:3ª©r(¦4™ÙyVr“È2¾äÆZ7ÓÄÙe“/Íèñ ./ÅȽ”œUMÓ•Í\Ç—½¾™]kÇ?›k|’—ËÀlFš8ˆœßs=bxŽOü’ÃKÃ3@ƒcüldgn|6ùj ê§oF®Û4üdPvÓŸr©œÛ’黿‘Ûê§<¯œ#?›ô17BÍ~Ëý=›/¹‘=_¸Q 7ãLîF#:gÕ.ÛEŸ«f×'_ÍÜ‘)‰ó()çÎggBvU”jR)™*ƒ{†•aä’©³Ê¥”!g³_ßâ–Úäé—Ö„XtÁä|ƃ-€e¤É÷\šQ&s˜oüÎ3a?ßfŒåèFîú¤)íL‰'ËþìL+3î<žm>þåþ”ÆC×fS±PŽš:çq†ÎfáòÍp5#ª«‰s0ýÍÀZ·Ã5çÓ£ÍÃͤ%ós™·”K¼ý6¿§<¯ükl…rÆÌÑ„3ÆÔíä÷<¹Ô±Î¹‹†:Æ"’æñARc†dóÇð *×шoòS^"åÍä‚ÂøaÎü–iE˜ûɲç§i™[qfÓÍÔ»H§6óoêo„*çœy˜óQa\ÃÉ¥_–‰ eæ©sý i]]M™»šœ‡É& šÍËïÿnxVhî+rž&äcl|¿çªy¼É“Ǽg<27¾æ|ýjâOâò¸•\N$äð"÷köyóöÄtïį?w59Ùd4s«Ô"­W”f|¥]}n•“YÀ_6 ¡0~ÍæP^")9–?ÛTFZ™2K“\¹O¾rçm2wÌgT޹ǘýn˜ŸÙŒË;s³ýšù<ÿ–ùöâç¬ÈÌB˜³bù-}2å ¸ç'5c¢Ô„ÙJi‘‡–y~3w‹æŸj±6ûž½jjº>UÐûy•Ü:çï6„µÙWëïpÁô¬Vy~Ëæ„• ýóÿ5×ÅXæ^Ù4²é’ý5—.’œ»{OrW›Åf{åúQc„yî^☾Ã/°rÊ^ÏËO¤ï‘¨`™ç·)§L‰eê»rk@Óz0/Ã̉•»’Ÿwµ1›a¦ßéœõÚøIÇü”3_oÑæù›6G4f‘÷÷ÜÈf`.•&ª”Ÿˆßú{6%Mëïü¼Ì«–æš)Ïq”ù#ï1¹ž3ÓŒ¾f‘™£Ñ™&‘‘sTf>.gó:Ó¬½ümdæi!ÿß2óœß´J0'ˆ9GL¯8—&Šœ±Í­H )¹ÉÈç½WæTQ˜ j³œPçäÚl/ÓÌÒšüfžŸ´É÷ÜüþÞ<0udŒÙ|3ŸŸ¦œÊ?M‰Wc3ùÙ ñ=ý Ì”ä[GPFÕ2×/~žÈ]÷áçùIøe4§§i/üNuŸ»gAtÍLܙ®Áš¯k™¶"6‹o÷'ûye.r]pîO¹Ÿ×Ÿnæí›i/³ã›ðƒÊãgÌïA~Æä¾É¤oùÓ§Læ“ý‘óÊKÂ,«¾Ç¨¼[þ:-ÿ_LgƒùfúwÓJasßËëØʜR¦[nOÍ÷È~¦^ðßó‡ùù¾·Ç·ö¡óh¦éÞ¹iÚ—üjNçiÅüœl4ÈÞ?{5+o_²ÏZЦú›{̯)o[ŒÙùÍ{£3q-ùÇ® kÊOóû^Pmc~ÿsgªé‘Ùw w–|7¿=ï¾M ócòf{~1}·`Å0åcö¹³÷ý~/ j© ïß?ÿ·Zû™íG#öWÈ•wíõWx\ðXýè,?ÓË‚Zýù«ûö}üµ3çí‚ õ£¶ò+¾yëyû^ðå]4ŸïæÛ®± cr{U01 Ε¼û<ú·ZP R1Ó㙎7m%ÿö-tTÞ9`J¶üG›÷,ÿ_óŸå[+DõáûÏEòöþÛ5J^Gð£ý ÑlÝÍý^PóSÐù«•ïoùï°ùZ·9g¾5ò·”{§ îMÞ1ÿ^®™ÏîŸÛ¾u¼é~K ÌgÚ[ó+Ì;bßïù•›Žæ_!Vƒú—ýÁ¨ô÷Úþ™³¬ý¿Õ¢]ósdÿT0?¿¥$yï×™R°R¼oþ3´ï÷gÝ·\SÁ-|«ÿæ_P¾ÿßºŽŸüϾ}E¹gÉöïñ©àQ+HƒóØ÷®(ÿu}kŸ‚´õçÔȼåŸUÈ‚ÏfÎÆ‚Fðg®± ÜÎ{žÜ1,è<·fzç Úç{¿›ÿ-o/¿µçÏnß›3õ ÿŒ†þ³êÿë[^­ÍíaÁz_ð»m%òçFä×yžÿ ¿{ä¶­Ÿ¯c¾¿Ï÷Z7ÌÉ‚Ÿâþz?³ÿÞYþùu*ïö3}ûwÎp¶o±äç[0?6[†ŸM_¿ÚÃo¯CýZ mæfÉÏöæÇZúíµ­¿ÒüDúYÍÉÛ«Ÿ;Ûßéç÷îûÿÆöÏôûï¶÷mz˜ö¶ ïøw¶ü³öçûeÞηZýõþd?£øþ9~¦¿~§MgÛ:¿ó_‹ù]û¹ÌÛùöž¹ûÿ½>\SîjO~•ûkíæ}nzmyÏŸ´þÊÙ ZýûÑqæùóWH˜}l^.˜+Á÷ŽûõíïØ¯Ÿñ¯UÐf¾™çûÏ·øŸŸñ¿c3ÿ„Aî|(X[ïö»òçwéPÞv~nÜÒÏõ+¿ýúy̵ígú›«3ßò­¿~Ý?>£é™ÿ©í×úýý}óR£ =ýÕJúŸ¹þìkþÔ$ÿ>?×Ïï©å··‚ÿýƒ¹VþÓŠ’= ]A~Ý7ÿÜÔ_]•ùË- ­¿6ò¿r†oÿ­àÿ€©’ý¸Oßû—4÷çû×ü3­˜ïó½Ñû;#jÞâ?“Ç¥êû§tµ`þø˜ïýþ{¶éïÏ· ú5o.ý¥þÂñ¿ÆªŸi-ï=3¯C~V‡ÿ)ýùÝÛ?ßËü~øçÆï¯ž«à¼ü{íæo%{û}5þc¶üšýß¹ýìµþçgùÏÖ¤ÿ\û¹û™×:ç¬ßêÃïk5W‹þn;¿£7ÿ|›¦.÷WŽø¹™Þïß›ù׾ߋߕy¿£­¿Ÿc¿¾¢ñ«íÿê1ÿÅ3ϯ¿ÞJþZäŸ^W)ØGý·øŸö,ä×rïÂïÿŸ×_© óþw“LUáïÜÅüù—ÿ¼y×W š§æÿþî¯mßêýïjéßߨ<›á½oïý3-~ÿlßËÿoÏS·óë=û7HñëÛêŸëÁ¯z?óÿBÍ[ÿÖ_Ìÿ-kÞ”Wûý-þÞíŸø/1üµÍt¦ýî±Ê_SüÝóü®ºù÷ú¥ß™·Uc­Wæ«rßoíçWÖÿßös›)¿¾½}ï3WÿL~ölÿ–nþ“žþßTÿoU*?Ì»ßÏ÷ôï{¿wüïß~TMþ\õñ»uýÿmÿoû'¶Ÿ]9üq;?[õÿÊ:ñ¯ôêgü›éo?Þ¾ï6~Åmþ³Êÿk¾÷ÇÿÕœ‚[2¯œ¿·ïÿVåö¿¬Ôß÷Âß¿cæÿMÅ_Y[úùõÓžütóß<ËÏ•{/ó{½_m˼]Óãýú¿Ýê.ïLGçgöÿßšÕ¹ÛïbÀ²æÙeÞþ½ëÏß÷ïÕ‘¿ó~üÞƒbßfû5Wösûþ¯Î“ÿËÛRgÿ›·+Wÿ©ñÿÞú‘élýwRðÞÿ‹ùc^ ýêq¿wÏüGý›#úŸžÿ?ïx¿¿.÷Oo߯rÿÞöמ6ÿúÊé¯ýjÏö¿¨†íÇÕqÁÿ^¼…‚ÛýïÜ~옳þùvþ~¶ý=úû·‚æÜ·Uì¯Î9Ós˜zõïý_{6˜w5àÇgù•s4‹~ÍáýÚ^eõîï®7üx篶ü3Û϶þ«™hž?nýŸßþ3sþ÷Þ½_ÃÏ­ÊüÜZõ/k~Çö=¾æ×áï·ò+ë}?Ó‹Ÿ?:û¼+ï¯ü+ÊŸ]µùëO8~ýéÆÏåû?¹åçÛÏ™—§æ®ù×ëoÓ–ò·ùsÇýßðßÿäöýOjÿç¶_Ÿu¿÷ü¦³àw<Õ.è¿;Æÿù;”·Fú_yžûíÿ‹Ì÷5êûwìwΙßý¤)ïSÜß•Õÿ} û×9ós­gŸãŸiÿç¶\ÖæÞƒ¿ÇXÓþÊ‘¿þøïlÅSÿÅýOg÷ßÛ~®ÿ?»ÏÿöXüýM?šÌ¿òßýúÖùvÏ‚i— ¿kµþ÷÷ÿûÑýÇçÿÏÏß¿~þ\ýú»:Ÿ¿åüÛ¿±ÿ;®àß}¯Çÿ=õï÷·w–üšáeDÏöŸ¿Ú33þí§ûÿi2äÝ vmÅó[Gÿ³ÛïwÃÿÉsÿð3ë¶üŒgùµs˜öÿW{÷×>ñozüƒ‚ý•£þÙ~çïù¿ýÜö÷>½ò;tþ?¯ÿ©íçŸÈÿ®u6Ó•»_{æùkgÉ»Šôk=/x=5oëÿ=oK÷.ÿþ¿ƒ1ÿ7 îí[•3}Zö³k9yïüÏ^eÁŸ¡ù+-ý¿íŸÚò;ûoo?"ÆTágþÍʯ>Wþw6ógÌßë™'¾ÕÞ·´:ï‘ßþÿQ¬A?:ûÏ®sÿ>kÞ›_ï¿éÝþíŒ*ø‰Úï=ƒiäß¾=¾ßË? ùÑçZ¾ÿ¦gü{ãó=ýúûãþ×Úþ]õ­é™ÿÛTñuûùÿªþ?1âæ3÷WŽüñAñ¿iûþȿ׿zVSobþ ìûüÿ{Û·=Ò_É—_Û~T¿ýÚÙþž²›ÿ·.¿ßÎI÷÷¶o‘òç{bÚÖ·ÿí•é5~»îûù­ Ï\þßfÈïXQýý>þ{súûë{ÿËÛÿR¦ýþÿó÷çÚüç·õúgöïWø×ùí‰W^ö×{–¿]Ó¯ÿ÷÷GÛ·y—ׯþÿcû=+Ò·ûsãø­Ùú»Ô…ÌwÏÿïnyuègï®ù~¿²jòmåûù6þʳݿòoaù¿¹åÍÿÿ…>›Ÿýç}æÿ÷·¼ëÕùýœ×ú™–þííŸÿ¿NÉ‚YQp[ÿ|þ¤=ß:ç?Ñ—ÿPéç¶¿7¾ÿ]U[6} ú?õþxûÞÓ²¿«fÿæößuOþÊö«½7דß{õÇ›äfÌϵ‘›dž÷¿ÝzÁ£õÿ.wË£ßëòvkÕ¼c§zøÞ¼M“¶Í;6é䈟;Ž3­pDZ“Ç *Üdì„¡ƒ W+[{4nÓ”Â_ Ívh$ÃOË—¯\¦|2å«ÔÿPK½9‡I5]@Ëô±wavetable/Crash%20Hi.wavUT T˜¤HT˜¤HUxôdœct$]E/ŠÍ8cÛ¶ß±mÛ¶mÛ¶mÛ¶'3™LœféâëoåWÖJº*·žçœ½W'iݨ~ý”St¨Ý¾^ÿacs…`è£îQv„0Ð·×Ø^3C_ó…Onùº´53{³(ÏìÀ{uê ¦è[Í{ü3ºa•ãOP=ä0&ŠÐñBéOîúâ¤t‡k™ùÀ k¾Y|#ÍNâqtŠ”@YK[Îk6áÉ8½ mŽÊ!\”¿9šÊ=±ÊHød'ÌÉä¼9Ñ‚ÊÄäMÔÅÒfZÜËŒ  ¥#wæºQ½¥» ¿ûgØcýHà„7ÌHÖâ‚'X {­ä±eq-Œ”ìkÔöª`KÙœ3ÓªéG­§ê=÷w)ꦆ…ßÝŒÌþW? ¤¯Ñ&g´ ¼H}ŸÑSÿfV1Ò4ðUÀt†­sæC¹/çi‘#æVÄè¨Bl_zjâÞoƒþ¬Lï˜ÔùwíÄ3©ËãáolC²+·»AD·í iùn˜ÅiUÖê™ß©…©ßs/cPÚÀ•üÃ<ßÞwxÛûQÍMoMœé+þ³þÏ|?K§ æ3[&š¾¼gTF$Gª–³tÔÚ¬»ó½Ì½8Û…èËYÇä?˜¯S–ÌY×GU:–ép¶1ùže-ži@ÎVÑ §l%Peÿ}ßò¤1¿íÿR¿¹>]ÿTôØgßî‘{‹_D<»ôêÕ¯Ãß–ÿ¾úkfJõÀðäÉo¦iùÌÎA¹ëf®h¯æ<œ§f‘ÈRÙò›9ÇæØèî-m² _‹7{ÓÜⓘ!9Vffa_áhàv®Œ¹i„×[NÞC°”Qî÷h¿wyÒÍ@)› TH®ùø‘¿œ6Mo£—Í8úwyúÑÀaŽ VHi\€ZˆŸ–‚¶-±<‹ùYÚèg »áI„•Ý Âz;⥴ë3+ÝmÓåã`8*õÆqB)ƒþþ“;ÙŸÊÛ\£ žÖÞ¨@=a×—¹™l.Ì8åU|Ï~þðåçÕ’·½RÛqÀY r»š¡LÎ\1&Á¾0âR–Ù×…½SÂbo†gkjðBÍ;øß§õ,ÒÓÛ=¯E¾|ú«Š±ÔªTÞ‘Z7Y’ÒJÝ.G³}¾ûUÚÚ5qqïПZã¤y‡}¹Q„µ“y|Æ!AÎV¢`õâÅr· ;ö%jnÔÁ0ÃXÈ*VäJ¾šêñÈV#ǬÌù³, †ú®¤–ñŸ¤ Žw|Ž–“Væ;«G¶Œü%õG hÕ'8›þ§”#­X_—Æ5õœ ßd+­•J®ÿyÐïÝ{xIX”Ôqü02ßu¿å¥x_°C²\?„_AÓÛ‚þͶ%Ï—œÍ•4«óhÔ,Í#ƒÂX& ¶ñ;þ´ýšùS6ß»¨–™)éß}}åí Œ‰}¡Î”H:hîPz„_ï&e׋īàbØv1¥óå!a¿•¥b*º„yÙ!‡Þæþ9ÉkÌ¥,ˆp»ºûïàJaq7WºÚL¼”ö4a«ÖC{êHR…ô½$ÜÅ•"öá¶y¨²•#®ÖßÕä¤í<:mì‰Ö£À(O ˜ .wÅà!æ8žÝüë¼>Ýv@¹.­Ëõ´¸\ 0ÆlÍÛ>w·°»þæ'÷Ÿpž©¿j¦&I¹¨±ªö¤q¿ãRû&ýú½èÏ dÙ{41h]`²62¹À÷¿(O)£ŠrÓݾu-ˆ®à s¾°>ê¿|'ÉÀرԅBWïˆ)aÏáWvÝY0:"öZ¦|QËè-ШQ{b^ÀCèñŠDÄÞ$ßý›Óó8KÄcjDèéUôüHÍâL¼ü›ÝÚû잯º0„#v%ð^søk§-†§¤BJN«Gà(ê)µÿuçr4Z¨"¯eY‰Õ=ÌåIq®ÏW¡`“l¥®ÂAg¿ì2ëê”"æ[š%‡T4¥¹§ÿ¿¿®~>úýîß ž*‰•R-^ߺžzìáo~­‘P+¹FZuI ëîäÆ4_¸PŒ ݹlëgioàñ‚÷JöÌ\¾…v°P‚­Eâˆ?§eR°@Ñp诹þàªÍþ49[Ü¿¸3¯$•Ëß’>y_'âŒáÁUÿ i©ê½`Ž´ùw/pD\! q¸#^¨M#åÃS"/²FøDDÖÌ œ—” 9Þþ-ú_Ä®ðcÎ# $/G.ËNÅñ]VÓŠxr µÁpgªÛO|û¹øÿ»´Ýé³Ëýs\£§¨MÙ™@¢Ð<¢sÌ4ÖgjÙÁ:i» mO°éš­xX~=á눑?ŽQoô¦ØùóÃüê꘤¨7¶Z™rg/}TmÏïæ¶ïZãÄKä4Ìáõ¼áx1ÕŽmŒ7¥ïy×à}Aï4<\ŒvT…ýÿõÑDmfGúïlÊÛÖÚFvQ1¤ù1b¦'1“Â’¬AZLDZÄžÌs0×G„¹S/ nf;˜?»û6ÿ›Xô˱0«ýTMkÛÞÁ{F?ÒçgË/¿âk%yðºgˆBêdHƦŒÏÁt»Ë~ÚôÚ—g¿‘ErŒÖFè?ÛùÝâzX(ºDôËPpÛòžßÇIß‚RúpOHUþsŒ‹ú.]þÙ%î™ÀåCh™Î’ó|KÌ Ðx¬Ùö!¹ïdÙ¨ÌñH›¦?dñaÞƒmgýü™„NÙŸfyŒÕ7çÞtµžºnd9aK:ËGÓ®~íf¦}‚ë¿~x÷œW… íÿÄÅôžŒÝ}‘Ìýóomð—Ü)áT||¨©Ž 唞DœÎ´?fg”Ël™Äà£ð™®öQ®üiÙ'°ÁîEÎü‘ âi4.âP‰ŒB‡c¯gúfßí_e ‹p pŸý×îi¼w©»FD ibúšt앹n¦–tïÛvÏÇ$ŸÓÇedæS}ÿ6øsóUˤáQMÄ,¯ÒžþœAGdž÷qƒ…å.áb¶á9®dí‘…;òJ tÝI-åÍ…š9Џº¿‡ÍR±¿¶E–]ŽÀ»„ú¿ûùÿF¦É þ‚wÅ‹ÙRÔ¿F¼ðó:m¬üð¶J®‡E<‘²¼r6~ÐëfÔÏØ)zô­i}S¦$} LUëÈNR“?нuLl‰’ýÅ®î[êFGw¯˜·1Ùù~-‡»BXiå£\Ø“?-`ÿ6Þµ&ªypÌ÷î6|ëù«†^ZÒïˆEtWJ„øG~ç`‰\ v‚EØD5"{Sç€ÔÏ Ü,`õd‡ñJ´;¬Nx?v4%ñG›@À} ˆÁ¤ ‡÷åÓ¥i~rÞWVr·º{޳eî^Ù*çI¸ F»âV.Göùêëok3¾H5Åj.[ïqX×øÁú þú/_v)nÛ!¾&e*…]{"/$·MûÁçé›Íôªð,sÑœkœ8Ìc5ü—˜nËw“Åi¶`>[—¨×Q¥ÕT´Ê³2i¿¶P냗 ÕØ‹(#—¥¸^ÞîÍÑŸñKïÛ}mÆëGIy'þÍ‘O±Veš Þ¥‰8HÞþþà)ŠZPþSÆ({a.0@›Eꃴ=2”h¨µÌ=Ò½îé‰ÍSO„ÍŒAéOÿ®²âðÙÏDžÓ.Òoê:‘m ¬h•äŽ yþ}—6ÆÓ+½›°d6 8ŠfݨLO“lr*L ÜPâbß:«2ÝZfqÖu7'˜½k ½Òhþ§·qNy®¾Mïû#ÌZŠû!!ËyþÕüü]Ku‰lãJ[ôÿÀXË÷+(«å£N¸^K32{þsz#GD@•ƒ%|…•â#ÚËd¬`ËÕW<5~ê·ejÏ,Qx€§…¶âê”\_Ú–(qjC§s h?é-}®ÿòßÉçÃE’o(1 :Ó+[Q'À¹øLºÂ¶:v~óôÎ( ±ç±éa÷Ý_­Qqg“gÊ"а³¿Ýþ{ÎW® Ê9cFZš¿u ñ†ý6×ɼ\dgZà³5°ÊŠq”t®•Ar°‹0ÿõ>GÉÑ{…íRÕÈOžf´2):Lâ%þžX´ÝQëØ¿‡>Ä»ÎûŒBó„ 4#XýåËXÿåŒdÙ&ŒB¯l6Oãd¿ö­—;Û¾†Õ‘šdœÿ½€üýâ.|éïéËŸqvTß:JØV©¿@;«‹1ܸ¹8ë [XB…½y¢K—+]¬¿Ò›’ýÊJ8?m“ç6ߊ×ë-|­ýë&­tž#•ÞUñ\²í^î g‘!R»íì<ó%b¡s5™œ±^8be½Tö‡r)\^’ÑSÞ­ Zº^ØŠÛ»Ø$ºAko=”—ÒŠŒÑi ГL ]sÒ—šÙ®D-!Ìëïé¯ë?È`Ðn»ª¾$’pÁãñnCÍÒÝž Úˆ4b‘aÈcHN«›8I—D‘½D_#¶ÁYZOtCØY5ºïçiaÄÉ¿ððDùž5ìºghüVV½ìêì, ¶Zã…âxÖ‡;è}¨9šÔN —Äù[µwÂG^ú[dLÕtwÑl·€'˜Íñî#o‘à¼p¯{†GI>g$ùJè.uŠm‘£Ÿð)­ZJŒo».»'¬‹ÛæŸ0˜È‹»ºcРG+­‘;ö$Í‘º‘Z ¨å–·ß³×Áõh_ÿ`©ED<ÞjL¦w¬Ü,–Åã\2UP?K]ƒí%ùõ@ªV0<ÔQ×’éZo¹4=ócÕ_mÀ‚| ©‰ºá¾àÝAÂÐfÚ˜•zG°LV(¹UD©4“{‡ï‰‰QÃÅ«Š÷1w·ýë`Ew+ùyšñvÑ¸è·Æ‡_µžþ=eDá~ÆWøg$4Jïe%ú¡õ@mÑ-öH`È÷=¡<Ëx™Ô[N»4ÀÏ|;#£÷šuµ, b¸’à¨F£)B¸$©Ìйv‡wWzòú2­¯¶Á¿F}ó%9ÕEÏð–Bo`7ß ªfÅ·3wKÏèUãÒRŒÿ›=þ8ín§d„ap8©-»a’>JŒê/ïMZ”òHÎåöÃŽÎl&7Ze¼J3IU;vDA¶âoÁErBØÖ7ãỬéǪ̃#B]ê§­ˆ›¯•VvªGàuËgµ‡€g=ãjf+㉥Y"î¢yÚN”î.åÌee!È7㡨»›…Á_‰ésýí¹M<àxyK8¢SAI ïmºë y˜˜Ö$xAnç4¢Q¼)¼ð—LÞ 'Æ /ì­”ÖèÞ~V{é¹ã›0Ó¿/øÆ&Øšh”ÞöóY|7>„Hé5¸ ‘Ì—w³Þít.nE>Kÿ4ËŠ žÐF8G-u.EI?Ý­ÔRÂðj>fO3Çï$OUç+q#¯Iªz{š-ÝÃP93,,Ã5û.VÆE}¶î¦Q¯)­Œ©Úz–ÙÌ‹|NÝ=Ñ]ž•÷¿gÚÓ»XZ¦zÏ良wœï"o‹á^*v˜žcÁ}Òø°*ð)m:¡ÜEœ´ ÉäzîXý±ï3çžÂž¶RªãŠã¾ëVF[uF•Ä‹‚ìè¹Í±Õ{4ñÚn?äìl·4Xë{‹Š9ã…ø¶7wâ5àŒ|*V fw;róQ4ë$èæ½?SÌ1K„Q=Ì«ø²ðYM°3å™\'ýÅï(–×YՖ⸋^%ÎÈh ¼q­÷·ü›Ãšn¸žøÖyÂeÑþ»<ÖYØMl½ gÀÉwªñJ^øUË‹ã"ÏÚvY.2ÕÝÜ6“õÒªêYÔF`ƒo§Fl;líüýS¥àÐ ÕcËÀû’÷Ÿ g…2ÀëfqÒΑÎï%ù2FV [ž ÖÁv7,¿äW„hÈ:¤m—Uû œ +ûANN óäkÉ3_1Ú‚ÒxsÀRŽÓÂqË)´p” %6ö•Ea×A!ubØh}T\Ð(ÂîHöÐNd‡2QL ËË£åifŠ–—7’"í3Qé„i3Ä[Æž`žGɯô õþÁ3óofn2ŸÏpœVÂÙR!Z ²1l(*Æ9“L)­¸˜=l–Ó«®±"P±è[Ö4·P_u¢w¸=âíd5׌wào¨òرGZ^q%ZýG?C$×yû;òV‰‰}bvL™kÝ\âÐØœN:‘úl[!ÛjvT²jòó™ÝÑU@RòÀÔ¥öx´âÓ²w¤K9ÃÐç 'Ÿäø ÿ8Ÿ¶Ì)d ä¡ýÎj-0 1þHï98Ìþ“”°J%OñÄûl¿Ü6¸™>ŽXCT·¤ü®ydƒ¡°Õüad–, ¡ííªf‘ÇðT° v–ŒòÖ†È¹êæ”7)õuØ@/õ±Ž6އ€¯0‘ ÖÍXkœ {Ö!ðÚ³I+ GG¾szm’yAv2"=b9èœX Õ%¼r¾ûOÐV¶>¶-,¿VÞ±Ô<õ„»’£)îßšÙÒ#Ê‚y}³Øí¨ƒäá¿uÖmÐ@Ë­MDƒÄªÖ£¢¤?ÄÌÂÒ,ØJøär*IÒi\UXˆ¯ê%õj°­«Qx–ôËñ·póhÝq8hA¬ö†Ÿ¸è ô52¾ÛÙp¹œOû`’:;Ëgº_µ.Jˆß‰_7Ÿa á›…¼fÖào%öÝö*|Ÿ&¶øÙO¿¶#B²3î&fónFž*1t?ŽúÁt6MšÂpL -J”÷ÒI8—‰Ž’ ~Œ>†—#/²²¿ž{êÑðæØž«ë0Bð 1(m•¿Yú7å—ÇðG‹î"~—þjvãŸcND!ç$­ô÷+ ëåÝáGÂ Š¿ :3´Ç¿:i/må¼a <,CìòëZzbÆ"a³c¾Z VCûåß…Iæû”À‘O—écñ=þ§òÛY’» kë{©NÍ:Å~Ì{Ç7”~çÅìÝ]×q±tZ7_¸H<6ȨÚñõZ¼röìžgmNx”„P[û6éò¿ƒ_ºƒ1[Ãi{^Nn‹*È£’”lN«§= ûèÚ$DZ»ý[´_Áòʳ¬ƒbÂXš¯SðOÊVá^Öj­Ÿ±ƒÆkÍ¿0_Ølu <gR3«iÔ1w®¯5Þèùä m“½½<4Iüóé1ÙÝyu3ä’tW(*öÙ³©óÈõ`¤4×õ—±Zk1z/µvæÎ[FË”ÂIVd„•½Ž»¾üoyï,üE®¦lçwy´Ž´ÓéçÍR3Ì?ô›ÖRŠwP ƒçv­Ä½S»%ß§9¢šÅ& 3Œ×LœÔk #ðVǽÈb0)žþnC÷DH™æ«KR{¤dxÚƒù™»e©¢_úžþãkúzÜÜ=^Š6[¡Üb´?ý!a®Ý3SÏíw‘ #ÈéIf9PÛçÔ«þš¸¢mVD%É“X2í;î%zÄ{öLΑÊñKM^Á.òïa»Å<)<…û¿ÃßÚJ¤^ør:õÍ#e‹)£Þ4γ[É{ïÓ¶aû•wÐË7p¤ì·%’($å]gKä²Òˆà‚À+ô1¬@ØžÀÆŒ¥(%’)YÍòòBÐ'cQðwzR5ìGx W¦àöŸÝ2Ø7ʳìhü¿n¾Müµ}[tf[ÇÔ¤ÔÈÀAýšÍ­,OÿÇ“”–V_P^läg/‘Tãkcã¯ÛåÒqs¬î8âÊ꘸øµRêti_dRôc4æ1‹¦Ž¢jØ%µ\Ê·¥Ç{‹˜×¤èho¦lPÜáá‘è®Cü?ßäÄLº—¦[}ä=övø”ò‘-ùÓ„¼Ù@ u rñpW–È5¶ÜBñ¿Ó‹­Õ‰øøˆ¦H­¤|ÖZû}!,XËÜf-7 ÙJº§ˆÓ=}õþ6×»Ø#2OµÏùóà¹á[>Wq¡ïÀïD£«º4ü¦³HúIßW#ÖLp–°‡¬~&óhiV?Ø@ØãJ‡éôNPì ð ߣ‘àqÿ>-'¦OÚojÒÇ5Ç.T„›Ú’†Ê¹ÕZBÇÿ±·£ø‰ˆBªâHÕ·Å]ñN{ÅÎt/ÿÓ+xOñóJ ù’M±Ný+jDâé꾘pìNuó¶_ø³y8ðMÇ»îÄÇï|6c8[à8þX2”kŽ%šžÐÉ8‚«¹ÝÑ­ý{Òr¥åI£á73Mƒóýõ?©‰o«Ô1N¦§øWò1@ñ#Â4çpå_pŸg§8ÔVžOóÖÑÇ8=ö.j6vÉÛ2m1¹–都™±=±£¹@½!††-¬]¢×¸˜ÎÊÉ›cÏÆÜ0XÜÖ„ód™#[dvWMy¼UÝ;ÂX‰_(-ðhü)”^ÖU+\á¬)ÍLq{±ã4Db¸ ¾88ž­PJDü“–|Xך4TÖfzþ Jf]s›¿f ½c_+½§%„Ji So9ÊkMþY9©²U(Âûü .òž. [Ö^™Êí)[|ýÐW÷_× ô ¶®¹¹Z­ÆOÛ¨rª+è·Î€«ašó\âÄv4¶rv€SBû¸Ç¼ÊnJÙñF&IèUã™õ„j8l9Wú([xnÃý,#15I+ŠÇ©?·ýNßd®‡¥TÑ"éFlD>‘E+‡¶1CµªDµ¿>ôÍ÷íR#ß•FÂLm&B›ÏÓý½ü2‰ÐŽîlîK»ÂÂÈ”½é—¤#1åÝë½S{2Áî‘c²Ü³­DY`ßXx‚¾ó ¶Yjký»ÖÂßZ?m3í`ÏþïSœm¶ßBÇ´$±XØ[1ø$¸:½5As§F¼äq$ȈžßßÎpnt­†Z°¨ÏX§<Ž•Ãú Øö«ŸžI­á\v—OÔ¿+ú Ml¦ZÌÙNó¤Üò>WÜÕðÚ@s÷u@÷aGyñ‚/z/´5bTäQù½&¤ä6¾Ë«ªÔ7˜A~ø¹óÑÇÙr˜RË{ÝÊ¥¨z 5²rg¤ãGâ#iµ­"ù•~Œ¶_Giœ".–&¨Sôý·µOPž·eTÉ(Œ6ÓÞ0é §µ”ü€¸Ô‘4¼ Ü¢Sä§Ê ãÉçúGªx“„æ×£ÊÀj_†üé÷êìƒÐäD+å¿ ‡Z4K¯È…èG⢴§Á0z!SY¥pÒ!ïxr¹Õ÷Ê|µ–48-!¥¥ÔDZß^B^›^.õøÀ6S¹gE{F%KL+¹3ë(žô¦yr A4cû„ç® ^Œ6· ‰¢{‰ŽS»ú¢ø`8[8-ows|¢=ÉfRN|£Ö +ô‹l$,¢¾?á®è _+:í½Âê*ß·ÿ1´Ãò¯È=HMß샽…ŸA­Ðã€$ Jjœ>\އ¥ î9ÖúôîÞ¿${t\ÔCá9šÚUü,ŒõLÓw²“Êa{,¾`W‰ü`éJ%—œMÎãÝD£@¦ü¹Í©žÄô+ôeDVåªpÍ ÷*þ¾ŠÛÙ)ØÏ”ÁZOú‚ë¹è/’N.ñḡ²Y܆ HóÁß`5c*˜,Á¥|]I½°Õâný…¯˜þ ^GÝÌ]°¹œ ,ú±·ä¼8Mõõ¤ƒlá3 uäáø(Ui3âò8cÈmÿò„Ïã½Ô“î"œàsÂíô¶Ò2ÛzØB>ÕÊa߄ߔVx ¾%a°yS{Œ…µÃ›f͆}÷/Åœ!]—þŠÉðb šu’LòO„¬â¢¯6;ËýP~œY,‡·›Ãyqö9y‹÷’01¼ý1­á9ÊŠÚØVÀeþªÖp³Øn›,÷W`;tUndçòÏÖaÞþÄ=Wt'Ç%Ž3ÚÚ*ºT4Q¼ªÞ)~êËΪ¤„”â©ù_aDXß°†ÐÏŠzûf 3Þ³;ŽÞ8'1ƒ-õ~¨z§ÿg£„ÔEÎîØj³YGV#¦¬s\¿³4uod¼ÜÈJ;³“ÅÒ×4[:]§õ CQ¢˜ßcüȨ–ñ HJ%~UY,æ dõvÆÇœù¥Žè•TäKŽH_j}²²Â)Î;ŽEè â»ücû¥åó…ÍË`Œj HøE<…{ %ùÁ`So ‹ØK…ý@'è[|ZÚk46 8…è±ÎKzëOüïMû¨˜JaõL5í’§:È¢VQÿ¸Ž¢áÁ¿FVpUt*‡Í܆/Ü&^tÖì(BºCª;eÇöô\ ˽Éqñµóó-Ëì}bäµsçg0ÝèÍŸ ‹àlž ³ïŽÚàîïŸï@&’‚âW¶Áë6„™ø´pÿ0zúªÑ…ÒVHÑ\Ë2cø[Ê;ôiÂ*éL§[õvæ‡fÐ=Ö&ÎiC°[zÁsX߸té0K€9¢Å‡Ãwàl`}*_£Ÿ´®R¼c¼»‘zžÚÌ—ƒ™Í.¡)¸é-â¯LÊ‹ùÂÞ{ÆŒ@Có'0äMè¾¥”Äõ}c½¥â™:‡ú{‹[õìµ]±ìº |ؘï^ªôµ­I)«]ñz2ʸË÷‚da:Ü €?ä]¶…aõ‹ÉßõóÂ,1¿wžo–ñ")—4†ñf‡7aé6^È£¥â¡ í/úq8yiÔ&F$I«ÓËðƒJ´¶Z¯*8,mÀgî¢×Ê,y­Ü÷Ò&ù °«ð/n,'±¥fi¡-.„¶‚¬ô»l•>àyð³µEøÂ÷ëÛØK~Pj,fgopu¹…ö[Ã…d¾ãçüÀgÓ¼Æ8ïs!Ÿ­‡°M¸È&€?kz^X’ÑÜ*e²×]´xê+Ãri»ŒãÖ\P[1ä‚™ù8Îg ŠTÖžÛmõÒx=¬®ÑóÊtçqáˆo¸/ w~2¯æµœreeð’‡ ›x…Ýõ~H{jLsÝÊ6>Ä*ªnRÿz¯{ºêãÅüaKÅI°2Ò²¤î¶–Ù"Å'J9G!¡²ØKýE'˜iÖ++Ú`ä•eKʪ,‡ ÙàRãS¼‹®Æ3妮Mü€žªyC§ßÜq…ÖÞ[ÉÐ_$zÑJú‡ÐÊ%Í—óBS÷UØÎÿÈzZ°¨PŶÁÑKéì+¡£gÒÃÀKñƒ<^¹g¸‚Ð\þâOáMõ^G(¿ ? æXë[°µ¾3ÐÏ_¬T&;Qø|Ýó,°LhI.§ûXA9M¹‡×˜íÜãÜo‰õÀ,϶Þ$y¬6ÑuCþÊsÂB”Ö;n‹ ¤ ‘TÈ[Z[ãi“Ñ\Í2æH¥À<´ÚÙÒêï)Lžš^ØSùXæM6Zƒ4Åéjã>bUM ôÃc\Ãs éÚCËzá3ð©<Ô&c¥Á5#šÓêehäÚgß­|OË]ô`´2Á1|Ñßä?ñBWvù…TAˆþTñÕ°U’œGG²Zx-ŠCÅQOJÁè›4>ù§ÞLmnŸÌªñõ°ÜDO²ÎrKe?¬é«EÊaÆšÛ}oŒq¶ž/ò÷ –à/äööÎ×—ww†È¯yo½ÝD{³mjId*iͬBm{n8’áé¦"ô ß#¦9®jo‚øgу¢Ù º íE9ŽfzÂGGhK=‘x6Ð:ÔÞJ†0Ô,¬ß¤¸ï¶ûP¯ cåûJ 4?ý’5S —Láí‰rÈ_QÐÌ„^9®*ùY^|ɽÇÅëj{’R dIºýg­U9üKÄeÓáCf€£òO!ªiÕd{q%¡Œhc•I#ó–~/”¬yµEú]qž\G °|ÏôB¦[È!¾–£t=F*u±Å²€¬¸'ߣµƒCá<«’­¤C—³ rÂÁÍÖñžDr€Å|-a¬¤yøG# Øö'Ô©s1((l0†ú;z®…fNåµäi‘myp×À³Ô Ö1ù¨Ìðx<šµÊfœô#æ¨ÈÒÿÂÌü¸òP*ÄG¢)‹›ì[ÅH´žÀ4Ç[]ϕĶI’ñÕ]0Oÿ 7 6 ævõ‹l¡üÎñ°Œ›`‰½FxtÌ,뎯 yÎÈ×÷éÿz«2™/EâD\ RL8Y»DNy›úËϤûjy)¿8Èÿ:奿‰ú5ºŽ<Ý»ØÇŸ—͸¨gEJAÞEÎc;cç`ggÐkâ³`9y퟇Ù;]¶tk©VÉÌF‡ˆœYíëQk«¼¾I>åú'Ü5Öú?ù±‹î‹á'…0owOCZý‡UijF[œQ±&þlVa1ï‡^Ëýy}Ô]"ë%ÙëÝ k Òuùu ’Îçã3Ö t8”ÚX®quT¡ùÖÛ´¹>…å—çÛæ ‡Í‹B8òë2+F4³ üV%”Ê.I¤] >X×5Ëö$¤•ÖF Íé0)7hжjÜSPyéh&úÀgÞ×Ì<¡_uYL÷„}èi»5ÅÓ”Éà(ª)öp¬¶]‚»{Øaf»,”«ôËp¿f½²VñM ™ŒgËy-eŸØÍËyOØ´<3Žó'(´?²uf6a¶Y_î)ßçä3¼¡9¸X”V`¼TÌ-Oãn0V?“ñ’‹NR»zGzF"ÂVü\œhœ²bÈH$Ë·]ûìÍziDË0«òü¼½>Rèa¿ëÚï¬"ÿ툟ƒöééæûr£©ç=¿#6t6r,á¿Ln —‘®Z™H©lh›;›-H+u³³½2Še§»LÅ÷ƒ–7 -…rOp‰$²>à½ÐHZÀ+èÔ5DŸs¥ë,L›ïÙá.—°´_¤pl‡7’–>·ñÓ¸o\T?Û5dŠOA«*/”vÌ¿™^l`…xÚžßVÙ`étŽÚØ–_M²¦zž:À'Õû¸€¾!8M`=å  IFo½-e%‹}Äb¸zg^±bÌ’WúH·X›ÚUD »NHWòžï ¯c{k½â{X7¡±ÙMœ/®ÑFq¸ÔiØò™9Izào/œ'Þ—ÏÚ>ÑY EŠTöÞÃçÜÏí'¶`«À'k¿ã”}+=m Þ²†Fua›5“çäXŸI_óƒ,‚OÇ×¥ml¡ú}>8Q™å®çlm6ûû"IÛüølh^ Þ3Ú(%•=,`¶4 ç°.v±·e;ù* lŽ_ì'9¦G` <,l?ߟüÂ(tëï$§X þÐæyôà3ˆ˜Øn5zmÔN* ž+è*>Ÿº…§J˜}7.Êìfw£«ô†Í±^Éý…)Út­µ¤: ÃÎÞ¢þ¾ü¦BùN2'ÊÍT»ùÆ|rá‚ÊiûI’C¯†®6¼8r£)bWyажÖÛÄkv“Hïèaß#ÿGã ^ú!§F›©þ·Æ14Ó}èZï«´ßh»wTnyoš5GhÄ^'eÈ^Ÿ´TLJ¨eœ³yp@ÊW`³?²ß¶Úyýtˆß –Æ”ç®~0·^8½†9Ó™YŠsÆ—ãn$Ž£7Å48Rä΃?™5á8+“Áa5§œrð9,•“2±.ê(°Ò—Ë÷€es}3·»¥|§·¬«­¨nØÚK‹=mUÙH¹¾Û"©Ær> E7Hu׸¨üç :é|¢ÕOZ˜~v Ï¡´€3Í8¶HÚjt Ôe…²"ç¯øÒdQ³þú;éÿøKe´-³E˜àl¡„‘r¾qV X<€Ð5Ûfù¸•.t”7šëõ8Z N‚G…Xù0œj6³lâ$É}jžÊ¼¿«®:=X:ñ¨÷†­³«ï Á 3KÙ´ÏþÅœÛÃ4ÐPBa¹íM‚•ŒBä”yEZNpßu6ÌpY×¥#‘côuqG¬,öXõD¡¹¶hX _`ÛrÜ=c ?‚JI»íï"ßô40_ƒµY Á £ùb+?ö+½µ§f:.6';ƒ5hn9‹ó¥˜M$™¼›ù*÷h^Õ Óµõ¨¶ZE<Ɉ~Èú ùP'y,X{°R°Î –•„ep±˜¤„³<ÂFrÊXgPNêèË´ð¾ý±m i®ßœÑ âdÛ997`8/À S¢×€/Åx¹µPø­v0M¿ámAL>}á‘bŒ™ƒ—wµ‚ŠV9ÖÀš+Ž$µ7SÀÿ´êÒépËžµÐYåa[ÔAžþyE°Z™¢ïj¨2ìÅ–è}A/9‹‡ì³Óá¼ möˆ(e˜ëq{qCyBšzh?œÑü’9ÇxFæ„Ã;þïü*ŠöÏ NÞI£íÍÁWrUøÅN“|¬µ¸_G·@)'ÿàCõöú*]°[V«H#]<‹tƒUW†ËÇy1jÃm#¹¥wà<(ª¥¾¬—WÚ. Ó›z›‚í0¿SÿÓÞ S•¯âb³}ÚÊà,‹n^ÇÞÃó´îÓç¡~{­$¯º‚#SPVõ˜ó<9è1µÄà²-tw 8åŸkL6·X-ä %‘­ÒÎR WB1dŽ>žô`0dMiîºJkºÔ·‰wîŽk„[Nrl’žàEÂ~vÞÑFò}Ò9ú@œ%Uâ»õÝÆAêañ+e4?$´Þ{ZÛ¥à}¥ÖJSØjr/¾7çÓLp¼¹œ-ᢜ¥À«Ÿp ÿ3ú± © BÙØ>Íj7Ù󾃬ž¾ÚúŠ–ÂÁ´ìa>%Pþ!e²æ²ùư³YÖ¿98YEJ{š¶mé`¸^Ãh1ºŽ(OŠŽ„ZÎÏ.8®…j¬|׸¨$-S®ÃÆÎËNÇ G`Ÿø§-\ ¬àOÓö¸üò|:Áê¦g2rÓYè(ÿÌßóŒD»æ´#)—œ•'Y]qg«È9¸}°M‡íÙFXHì ÞóJn5ÖÖ„fNœœ>›wvÝF=«—þÍÈBGrY#òÿò ¡[äŽjèqâ˜ÄrxŸ²Oê$¦©I¶*ô1x-øÑ*îDt±‰ØLÊ%ôiúí7xe+«¬Ô¯»°K)‹ÑNÆónf³ÉÛ­»ô,v©e*奟’®ÿ DØ‚Ž3Æ’”¼Á¢Ü+_Ä{´'lªÐŸ §ROË`]ù­’®õ·jIméÒEXEh¯¦Ïñ•à¤Âj5‹7 +fk˜õMeoɹ ™JÚ AW\ñpT80Û7…ö¾Š…ðQ´]jik€~Ò!$šN'€(t %ËmÌyVé¾ùÈXF’“FM£ùsÝgÌ;Zå ûá7ÆS²Ô–áøßéc¬t+;lO²°(GùPO'K=;u<*ï㓵íÜÎ<0'f’4ó ³[;ÑÇ1 †™ØF)—!x¾„Üt}Žˆ%õbÞV=»‹_ñ•³V(;Ôûò¶¿u´ä]S2ù÷£ž`2YlM[;Æq’>)µŠù\F¦t›„Pc« aü®§T¢_ükǾH¦t9 5½Ò`Á©½¹SÃï½7›Ù¢×¸Îxï{&KÓ'¶ö¶³ð #Íîr¥c°¦þ4•W…]Uʲ‘ 6¸-P]ê¯LÀ9Ä7‡'ZÈ£ÔW*°Yó|5@5i¡üLYCnè<ØÈ(£ÔRG ±ZŸàWµ]t)q•'Ÿ¯8»£^OšöI;#å ß,ç£-@6vÙK¡à&yÃç@Χ¡=ྴç5†™_pvå ä–~‘÷PW(G„ÓW~ úÔTµ®âé3ù!F‰RŒ/Æ :ÿض‰+‹þcòXµ$pÃ)p3,Âþèµ…}Î8ZÎ;d’²ã_´RX3­]FqR€t£Ið¸4>3òóðR°^ðWí]ߌmžßb®è›âL ³‰æ&<ÂÖ@¤¬7O§MfD yç8´u=Q8ïmÖ¤Œ£f<& («e3R¥öL°ˆï|ü‡à5[åZÁcé °7fKyo ³¶ /Ð!c®Ñܱ= +‰y÷‚æ‚ ÿ̪t›¯?ås©‘j«¤ù¤.r>›íå¹Í¤¶m¡ã’T™7öÍõÝÀšÒ†ÍÔŒB‚({ÄeÞ„Œ`‡ðÌþBˆ-BϤ»¨{`¶Ñçà"Ú£¬¿‹QZ|p»©”²§xú‹ŽIèuïvmpà†ê|µÞ©‡i®?œ2¼ÉõÅÒ·N^{=¯56޲ìJ”\d!SÁ^÷WáŠo¶q žDÙÕ©Ž•â4´‚%iI^TpÉeµüÝøQi²Ò—Ô¦°Rš±Ô“ÉŒ7‚¯¶V£ @{°v|hˆƒèK7v ¹ÄrÁE[¤ ,!"‰¥kPo³¶yo—4ñ¥5Ïx mJ5±&xÉ–ƒà ÓŒû,Yé'¾%ǃh#±;: ²Ðt‹v1ŒÖ6iè*i—ø™Óï™Íe·ùEx)æOz«¸ ÒD–!–g ¥¼GŒ¹ ^l΢¥ð1å4Ø¢÷ç©hk ^ò«ô¼AX焬‡P<cCá>Ü5XkÀ V¤Ïp >'·ÄÛx»•U_Œ·)»`Vh襸5Yà\XŠáOØ]ATË*%„%„uiVpP$™ Jx®þB5ô=]@ªm<ëzOë™%÷“MZ…]¦µ¬ÂmPÛ`kVÖh†›‡Ûäòf˜ñ›7±W“øv{:iŸ…f®œj +©Å˜³Èq´rÓøéïÂ>ƒtÉ7iS xôÐ ÁéòÚŠ¶#Ûäyö ~—eGés1¯8ÿVëÀ±d'&¤È#ØHUíÊ'öÆ©ð==¡ï3FášòT ”‚Ï]ŸÔ ¾%Þ*hë(“û¸/â¾Ñz q³âeë<§ô¢PÇÊÓxc³7û'JzÏ+4GÕIr.ç°ï!½±úSÃ[„/Òé+|‹»˜ò [ä«Q‹¤ÑòòyÛ-PVE-Ðwa¯ø“ö3SPU%®€:<Å7³ïZK1›½ rh­ÍìíÍÞg'„ÜE#qy)» ¤²sÜ(®|¨ÿ"5å=î5ôM`6‰Dõ€jÔ²T5=¢§Ä}½ÉCV üSŠ2¯Þ wÄéø ÔUN2¬…Ö,¶Ý¤ßQ[é):&—SS‘WãŒÙ¼ö‘æÞú¨_‚ÝpAÐÞ5_ë;àÑMÇ™=ù;ÚKrè{Á+ûAµX’5¹J i—ë½DÂ#âNÇ{)~Eïè•ñ µ~­ŸÓòšU„nFãàhžW|(õd pÎ<)·zàÊଵ–Âsy £›‚>ñÒ¹±‰¬' ª0eÊš&pYàAà:x//u…f ¬–Îÿâ ð—Ô7Ö¿ZmijÂ’`RáÞm•âûà;”ä°Fêyne j¤WJì¹}‘3K(3däòf;Ž’U¤ßC–¡çâßPG~`·ø ²ŠU mëQöíä—­Ÿ,C¬"þEÁ´•”G‰“Oæi]Å»òõPƒïi[/µ.‰òáã´²¹€Æ³‚b[§™_ቤÝ)ŒƒEà"¨ù_*(%mÍ€hf ޤ­í՗ૹÐJg'•9ö{0—†‚QÁ¬EˆËÜ_àø£<=…f*±·ñu›ˆÀãå9ÁAæ ümƒñyü¬¥É"qSu-ž³˜}}“Á@©¡,‹³´Þm4î²í÷yg¤*F@Üáîb{e?¯ðÞÔ K‹”êB9nµæ•p>! \7Ÿiùù•XÞò­II—.HíX}“?6D~Îÿã”—‚õñvUX)47îèGá~å…ì‡Ðk¬1Ø*K½ÅO¼vð <-V3æ1ºÃÎÄ×ð÷ÏÌm‚€ìèáßîíB‡áÑ舰—/ÓÓFf Ï}´$&òt,Çëùo2„5‘)ÙåÌp©ßAwKÃàPØR8Bú†žã=6{¤¾lVhG‡y¯³S1rñ{`ˆ9še«i–î&àõÆ!ý_"àcT¯àCTPl„ \ÀŸ“îf~A€¶ð¬ô‡*Êc9òŸ×ÿÃuÅ6蛫«X,V›§ÙK/…"Cžs!ô݇ÌHóÙ &ˆKà/2™×@ëQÜ_ϰ[ॕ™šqÜê.²ÕÂF¶šfÅ™yoò´7ßYmàyŒ;rý"Z&ÞTZËÈœ«…œ6+…„H`í¼açfüÚ×=¥@p¬+ýÌlX+~“^Â|´—QØðWPZŒ7­’´/hß*%ZÛùwc5­$ÏKÉ5È'ÿwæV‹óàBs0lÿ)KñhøÉ\m´6šSÅßI+À¦)Ùì;‘ßúä›é+ ÷ËÐv£ If¥h²%¦ÂÃ$´©Â¥;n-f™ù:œ®WÚ×à¿Á¯ä:¤øŠâÕÒ½ù©¡Î{ÔhÉ¢×V0º…Âéô^0…ÖýÀë8Ï*Î6ì$…–àGÀDЖÿ¤×¬üè…Ü÷H_–]\‹“€Æ}x#þ —Á5t,Za/V—Á_ž„6£±ÆVÐM¼NÝ<™GèAfaçËŒr…Q}£lpRˆFÃ$X$èÛÌæpJ(‰ã¥(c”1 '³–ü7è@ô õÓ±¬x)”ÆÑ<­f'ü‡ÈÇe•€Ù5+Rˆ‡¬‚^ŠÑÒP½²g…ðÍCY«¬ l=܃î“zÕà zIŽ  2k²ÔÏ–.VåãõӴаë’Ÿ/ .±–ƒvb3a¡(ðæ,T×[ðæ=µ¾³Å|%,<þÉç^§e D_E‚¢x-ú—Í¡uéC´Ðn iÚg#Ž.¤ËxW3ÏÁÓÊy²†-gázñ«|¸pø„¦ŸhC¬ [(b-Äœ²^âaoÍêƒ\<݆ȳÑ2\YZ+<·Ö3k—VcywzÉŒ7/¢)t4›/Œ°ê“Ñ´?„OâNÀxÈ žÌ”öYœ,Ä9Ä÷Âãfð1«'¶P.)9Ååô†v…ÕÄÕÒ áTêàÕCyWÒÊìùe6ÉmÀF½eˆŽÞ«Cù©Œï©å‚cPQõØØ­;Ô…:á}ò-ÑâNV nPêJ3as´9U]êÔº¼8?Ç‹€#â.yíhì–Ýå—ÂUášqÕ¸…£qA˜H÷˜#XeüèFËÀYÖf£()Ÿ•‡™|×^†ˆ|:UãqÆ~²/ºÈ&èdÙé8XÌžM)Îò‘F –_I;Ábš¯Ùa…r_õœNÛ€ M Ò>›Çø1a¾”…¾E8 &› ÜAFZíÙ;XCzº1™F‘ü1p 983BIê.'‹@Ebðµ0B¸«°{ )›O¾qMô‰¥ÐT«)¬>q4—<í´p¡X/¶¶°³¸ ¿7Ñ,ü¤üÖàÁ]ü!ˆÛ#b¶²VÑ Âeq8,³©lŒ’ ɼ ɧI¥ j3A£óé1« ŽGἬ¹—èp¼¦qd¡`¾Âż<"f™ÕfÓh 𥪗ø1_âµz@,4b©°9›Ïº‹A¬Ug3³1ìZŒòûˤu¶ª:+;¶™»½Üñ.GÐmþ¿úXf±Õ°®ÐÄMppÕB?-}+H6q·ŒKo®E€Xišë†’þð2>¡¥¶u°‹æ5·“ÖÂ_¡¾¢ù ¸B Ç °¹Î=›xyy£<^yÇF{çh „ÏNìVùíŒzÞ/Fo4K,&þ‚³Ì]ÚŽ•b¡½› Æš¬w4]ÿÉÏ “ÁlZyIµw•&ˆmÈ2—\—âälJ4™QÞCn‚örŽJ¡vobeÑë²TeªØß*ÌúŸbÑ_x&D8–)?ANr"0K¯Átðï‚Mâæ]z&J×@nmó³½.ÈÀÁXôü´ü„OŠ ìw¥t‚Æ´›¬¹Äl@ â¹qšÒ÷±± p%¬Ë;ñÿBújNØYúÆœÖ_B´llœðV™õ²Ú ˆ´X¸ ³ƒÒÆqc=Ÿ·‹Ûð\š‹] ôx•Gà#üG^.¦ˆÍÛF@ª)–GÙq6ÔÊÅð8.Šá_ý'­CN°CJwðÕb c´)ÊÇó‚p²õÔl‡Âñ1TÚ0<¹èÄ‘½f hÀ>‰”ƒ¸#´†4‹°\Zrá:p Ëi.góEÞ€?Órz1´Xú gLÞ˜y-±#ê‚ëÍȲ.»Ð%3ÆzÄ’bÂlá \@=Æ[ÜKZÝ|xLßéôÏE¯Oéð ¦uÖwŽò¡ì­ÕœgCù{, «¡VlêðÖV’—wäÉ8',M_®8p¾Lüˆ÷°X²ÏB ð Ó©þ/¾nì@(§èÌ‚RGñ6Èúñ‰4™‡L´š´Ô8ï…âñO9Ëj-e?Á <š¡«àYçmÀ6òŒüñ ?ñY2ÛÜÊñ1âÉ4ǰqÐoFáR$©‰Îã^Ö\”ˆn ²V|&laL ¸%zÁ,ø“Ó‹[Åá ,Šœ Õöš!Kx‚Ç(«\"èHþ’—…¿Á]« ¬)”$]­œ!¿½(CCñ<< f²Æq! $òj$Ö¸bÝ„DJͧ¡g; 6…ÚÃ&špŸAôz•ÅWhwHXd¨Íê€Å¬¼/=Ç< U€#ÐXÌ%cÍ,Eøã¬nä˜Uµ“ãY  Ã}¤itø&8a«$y 9ñ/½…¶•.X ]·Ÿ~‰ÔŸóG¤²°Th‹ c™º‚MyfE{Ë¿QМO¢ÁvTMgáþR;Cs Y¤^KkcþCù¥ÑÐ¥Ðó]R:¸FgÙÁüà±¼-ÔÑsxvþ–EÃ4±¼’ ýÖòò˜;ài°pˆN¤õùÉP~]‚g™›ç;a-Þ„2B¡4x„ßKÍÁ<ó9F ¼CüEÎlÕF“]uì/ð9fƒUð}‹qž½†±¡äMãÅr\Õ—!¯í%^ »ô!zf²YÜ ÛQ4ýn¬ ºÙ=é ¦51êREò€sÚiv!Ôã?¤Âø ´H9}i¨‰5La”ð ^R5ñÊ]MgYçÁWñš J³š`,ŠÂå°»¸S¬ŠÎ˜]¬Ûð<r‚=` ~ˆY÷áöfh”ÑÑú mâQ´Û*ª æhêHR¬, ~çùÀ0P«ìÎI·ál. ³ +Ûϯó—ä3uñ%|®ÕÔÿä• ¡“0‚/gõ¤ÞèYŽîË·!ç?Ízi€t1Ä•¬lzv–4F5Ð3‹X†Ôì䛄\ô©¶1`޵@ï¡T[Šï­º¬ƒðÏ¢Cø8˜.6ª«ò§öö’”aqFùP›í­ÀIžÂï’Çd!C—ð a+<LrC{ê©÷Ñ=ëO`‚‹0é†Ãå` ëÌ9z…çóÚ´&ÜfãSÂ]bYmQ•bñD«³y&g#­vB1û'éK gFZU>&v…{¬SÚO}ûWð’à8/JLJ h´´0ÔA§a¤’!¼Ö¿°YB'!8Ú`}Ô,A«H¤6$ä©Ù¹ FcÞÓ:ÓÂLP‚43¦ž˜Ñî¤ï“r¯£r¡V²Ìc$C"¸~ËçVð›ô†õÓ·…Òå%ßMÏ1¯Ü[r’jô l"GJw5'9!Dâ"òa.+Å[à ÝÁ"K`*8/ÈmÑ{Z×Ü®K0<Ôz«@4}ê_güÀ3Õ©ø@ðº÷˜µTPgqDð‰~ÙÚÊ£Ãr[é‹U\ïÁêácü¼°Xø¥ù´{ô¼"½¥–öž}iâX¡$¿Å'Ñ—|›$ˆw­c‹ç݆,©°’ÕèXÂÿ…ºæ 9Eªàà$½ ̧Ci%Σ ,'”iΕàæš«)e–[Íh1Úš…fV‚Ïá|°^h ‡+ÀØu3·Åà°0O<ê’¡ùækXóÞ¢MóL¶€<¡íB³_ÞžK(Lõ,$‰öê®®ØÅ1›Ù’=⥧Ò_œ©M¡wÄž¸›ù›‡­ÑJaûmÎ0‡ºª˜p¯ƒ‡2“H *ÏåŽôszVcZ…?Ê]Å!¬—u„ö†;Z¨  &{Mj³e¨ ãB‰Ü VDLü ûч<³tUY jÍ|Û­3By)lEsÂ[p0oòó`ël­5s å+Yëgj𭤼˜> <0ûCEý¬”^ÆÊ„§ãÝb&8E¯d #‹€Gªƒ{ZïÌ&4;^® ¦Y^®ñBá¯(öÆÑº‡,1u(¡Uy{¢Þƒ-¤k ¯äÕ¬Fc£#]ªn {-&Zeõ™ÆI«!ŒµÕUf,L²ÑAè>|ΚZr(wÁp3¨ÀZGy_Pþ‚áÁЄ£ý¸Wü‚“Y&¾/—qu!Þ\˜^‰ÅÉ´{Ãë Åòr'¼J„+,ÒLÔí‘VÑ’fqÑ…/ëÉHs—•Uh¥ô…cšµÛH1{˜ƒÉ.óS<¼ƒ£`<9FWÐÑæ TOœÍ2ÓÿÿWÚx¾ª°|*°‹•„!¡DMãhë¿©,p ’ûñÂÌ‹— « åA9”B£4Ÿ+ž€wQ9f &õ 'tÆ ÍæuÚ…·%Áw>m%ƒÁTõŠ0ÎZäÏ0ö"m7J{i%2¿‚mé;ó…Þ_8nÏ!9áV>~Á£R°l%@~ú|1FmZ¥*×Ðô`{ó/Ú%#ô6Fwöœ¯R…X൜څ£”µ½rkÕ‚'ø>¡ ÔYEz}:Y€Ó…}Bý£¶×Sæ¡ÏÆ)ã!¸%>‘JÊÛENÒ´:f«¬t³½Cód5á~á¿j´öòm¬[ð ¥¢ ”Ðj¸ª”G ª“ʨ˜ Ül:ùk*;ÀÜh¨ÎÊ[»I6¾Ai«š†>X^­thþ¢y0Œ]†Œ~Ô~^´ã3 £²<œEá´‡eHÖY|Bå`7ÝÁŸ¢‹<]Ó­$RŒGáý¶UŽªBèîõîä‚Ð]è ëÖhC\J¨‡2ñ¥¦DÒYÿ•‚¬°%¡4ð“-·ó´ÃIð$ŽÃY`tFÁt}SBvþM¥÷l·& ã”g¬[à¡…Z*I˜±©¼ ‡ …æd þ£Ü†Ë¬íè¼Å¾ýüåÉV©2u°Ùô…aàùf[žG(ª8éFc"Û'ÍSWó[ÆuÐW\&b¡mh,$‡f¢mˆ«‘˜/ø7õ¹5HÝ¡<€c#üÀ2¹“\m£õÍÜþŽúÖЕW*yͦúJº“_€×:ak[ ­°ý‚gŒñ ­ÐµA“Ñ^ú ¥A8|¤V"xÒÍŠGÕo¡„Ùlk¬`%X-ZŸ¥ñœ¸.ª³hÖ?GYC†Ð ¬‹‚UüyA}º ÕÂè^’ƒ`åµfe˜IçH_wÖTÜŒêÁI¨šZ\6hgâ§‘¼ |ŠÁpad(å‹X¥¬b¸‚´<ä·—Ø<ó[°ªÕoU cÌìéâYFÊŠgÔß¼¹ úáŽà¼Q“Å ëù3ÖÆX«‰RŠ8Íœì胿\k¤ŽZ1ÓM3±uâ5¹‹xPLå‚u´é¼²­†í{É7¢Cì0ÉÊFâIŠMdzis—o§ª1ú¤%|«Ÿ¦(;jh-g E¶·öX÷ÙD¹¿R†‡&1_p¤q̳àO¶‹¼e½YQÁ/L—˲0 Ú†·m¸Ei^Ÿ~§£Q¤ÚZ:ªZ½¬$!BüÆîë±ôVÈH&‚t»VšxQ„ö‰…¡¼šñŠ®£j( øL–’B0_ˆš—¡XŸì5V²Bè2ÂrA]à2Ø.‘ר^ ­Ys›`§ä<ÙNJ³\0‘ȞЬm2$ó|Ÿ¢g4*¸Þ°L“”ùÖVËá%Ôf£9fE2Õ–ºÉƒa&ÞÈ ˆ÷lµ¬ V1ØG;B¯|Ÿ~å?¬³ü¸ýŒÅ5(F |´µV58Ëšbe‚ǰ6X?´MFz#ne¥Œ&ú>þ[î€>’¨½ð 6÷ØK´æ4‹×Q’-Ìž[hæçBCa­4]~ßzöKº V„ëÌqÖ8\]ÊÎŽò­¸H¨íÚeè^¤ÿÍü‘0 ÿ´nXKÀ%ðtë›Õ1dç‹yUë*a³]öóލZÄ~!*È¢%|4Oi]Ø1ˆ¥b t˜fìxÿ:…;@æ eN€¹ÉPƒmÃeÑ4« =Êsà1<Ú8nˆÃtžWʦTåÍbæpºI˜!>ƒëù&k=倊“çàµø%6ƒB³…E )˾âs¡6­³æ5rN\ˆ¢p˜~×?‚|Où[®€µô8C<Ã( N h‚õ’OÅýB I7<¬)ö¢n!ŽRÉá…ÐufÏÉWPÆPý èE¥šûRŒl¤C){MH6/ÐÅ¡+HB‚€Ñ":N(.Tá5AgcºÞ„œ ù)܇?1?š3¬DÀ„âCöÇCµ½RC´&dSigøI~‡'¢ü°HÈïñÕìµüX*ÀÒ‰B{"èÚ¢²nyœ¾®ø®2X%õYäÇ`Zœïæyð„V6°ðÀLã }Î K{ac 7ꀵhžoåô5&3ŽÃßP Xüc…Ae¸U¬†šÑXá„\Têdu7üÐ#7‘[I¼-xB‰´ˆì3âYNi-êÍVèµuÚ"Äñ“l"HF=¬€ÿ+Ù+´ÇÝI¬|„F‚ž¤ ÏJ„b¸¤ÐÆ«oÖ’?âïh²4LX¾yÝPw ÓéOiý2êü濊JõAzÆèFË „‡ðe´£7Uð?µ‰ðÍjüØ'(ëÑ'~ˆ}6#Î;¡`‹ëÈpÝ ,À£aIf¡¶~š;¸ÄæÃkr„°š45ïé§`y|™vå€ ~b—@4xÈnXƒI-8/„éì>ÍúLû€gRT“WÆsÑ œ*oA7ô[A-pšØäÒÒôö ±Ày’g¦T³9 ÊÃ¥¨š¹6}Ž7—Ùm–Ý2¡#ýÉfga±$A;íG˜-°åsã¾ ?ðj0• äíh“Ç}†*3íTºã[›^ÓrH£•t!‰-¤'Ùtö×äx ÚMG0Uš([8H½t?Ä  ½¯?#4Ïæóè:üMÕ«Ò¿D@ÏD$æ@ÿø~Cí”Æ+ÁÑÒ$© lA:,ä¸í´ÌÆ-”(· Yt±øPM…ÇiwºÈªHŽ‚µòoø—~£…Í~¦Êfr¬e{L îð^Ô!Ÿ»ûß²uRÎi7VÃv"A`>8J˜#&°9à§0a­ê¬ ø„ 7B99¼&óÓZU«0ôÂÂô£%ãxKÒVY[A$ØJÀi*ÏmÅ…&p OFýádö,ç(I`5 ‡0UÇàÔŠw±æÂ^ŽœjO˜%ıƒÐùÁ]pÇ’M7z-ÔÀÇÙN:ôÅ‹yëýÃ2ÀRÞ‹•sÉ*R—·ñÁPv„+tBš Ô¿v3½?‰´N =ø«$z.·çýéßí?Á›½”Ѥ2h'CQGõi5Ío\OÈ€ÌZ£bè0 jÐÙÖnð -…/žÀY¸… v Ò ÊDK²†à&$ œ•®74]âé9Eâ1dG-  è†n’’ô ˜ˆd0V[<‹ª(›ÅÆg|¨ð§cˆ ‡Í à4Z†S-F ¿ÄЮ¢è?ÀñÅ8(7/ÒyIÚo>H·/X•ì°²4¶§NÐà|÷Ã2h$ݧg uÿ ÜȼàËoý&‰¼p‰m7šyoú•R‹ƒoÚ÷GžWC÷·(6—ávð„{á^¼æÒ·¡ìøWa?€ß‡¦¼ÙÿÃéXP‰í4NöÒèPÿäçãÁ(±5øX¤·Féâ)¨‘o´ÿÃïòF|4o€O€¯ÆP:|Å?¤Ò"GËñ×µŒ2Zš·Ä êt‰¯Ö¯×ã/òñü@²[¹øPq9»@FÀrØ<¬ ?À&˜‹Èt¯!^n”ð¯¤åí%œ™á,OoUúŸÔTø9ÿÀް!ì º„_ Kñ cÛƒ9/ÇÚ°\À^)VøÜ齨)¼?n*"áý¤×±F¢Îx48Ç׳­Á7ÁÒ1 - y… €E˜Bš³ê8(ÄJ y3ó2ß&,WI´%Ú?2Aj‰ðf†v VljàšÉì®/'…½ÒlrÙúNjÑ£(ŠÇkÀ¨C.©½ì“aO¾–ç5çöG»au&OÙl ÃP-¶Lßêò‡ÒN{¥¾‘•„’FƒQV[XA³`#x[-L‡ éXó?#Ä-¬4í&M•=@OLŸ›Û¹†J„h¤3ko ÐYGájøÕe¿ÌìüKÑ;Z£4» Ø ¾A«ÄÊCØŠôä±!Ë"`a±çÍȤ—g}„¯Êxa41¬3ü=g|{ÌGÑs$…—þ“kƒ¿iØA|Ì6ÓýDÔ÷ÒjÒaÛ$á}p“U¸¼·û[Ú% Y)$ ž¨ü÷Â|È&¤µY [UcÝY0…µÆ%EElÏZh‰&â[8 Ý ¹éU>ŽU ™äeª‡fõÛKç±íŒð`+n tU&ŠÚjkïÆð!é|=ÌÇB>yÐ*AÞòp8 ÀSBä*„òÒ‚MÀ[6œÿ¡Ã—С LÓ¯ƒSÂYt†OeÇi<'…œ’¿×‡ê}x}ÔCÌ#>CµC^ÕŸ¾C/Å»€²8¾|’jJQwðXën>áßAs0ÍøŠê)ÏŸá}ø3›HÑ=à;zîЙÀŸpWâ°>~J–›Û…÷¡ä¹ Æà·‚[>#y=V–Œaï±K¸Ä§š uiÈúq€Ú°¶,–]bm…Oh8Ù`œ9̾‡ß¦çèp”fµÇÓpO=™g†[º®JÒ´Ýj¢¹øh)‡-xo oñ¼p3Jg}Ít²‰çðS>&”`óX2h [[ˆ‡D…°ø<ÌLÞ/ªÁ-¼Y¨Ö¢ ¡ÝiI¼t.džȱ < 9̓¼"¤p&´)†ÐÜJ2'ÓIXÀc Á¶ÐÕ  l" …•Ì)V/6œ`©!.­/¶†‡øVn±l³¹Èøc¸HJC‡H&s6Âí( ÂÛ`iˆâ ÚbP>ó„QŒ,äCÄm¡Þ‚ßÀ§ D˜C˜*t…5Ù<ÒÝW¿ UÀ>c—·7Y(#Pf:ž´çq{!yoµäOØDx4ô¬¦ðÁÚI­;8'lÂË@[ý$è$ü‚QÆAS€‰âq<þÙjpöE§äõ‚7İ·¤hîˆòÊ|›Ø_.&Nqöà[øDžŸŽ2z›©—3ñ¥Ò‚—ÖF™5­#¤+8–W#>Ö›7"¯ô4ì‡2Ø6ø 堋̃¬œØT:»ÓC¡íÛÅŠÉ@-‚F€.Ömú—Aµðy3^Fr‘9 -ẅÌf›@;¡#]ا?c¤[â,mî7‡CUPyûïƒ ð{C"Á,pL€U‰¬ï¦…ÅüJ|‘,²º“efYîµØ ÆËÐä쑲×@›¤Lø{G² ¾E¾ÇY6óÿ¿GS|ÀùmÙ„Æ^=y†Ý²[Цù¾àØÍ‹€à+6«‡<ì8lVU2@è'ai,jªÞ²do„Ê[ô³¬®+Ÿ•z⡾ÛÊG†2µ·ø'q[èLà—b{«vðŠyìÃWBä0ÕZgf㥄B&‚  ·Yf8ä‡È½œõ¯±Ð€| n3Ûól¬¸P ç ¥Ás뉑Æ|l ¬Ž‡ÃÅèî«ÀÝài(eÓðSlCû@#æƒÙñçÐ9Ï¢§ŒúúT«ƒ°?4?Zcè6¶I($me_ézÔš ÖAD ·Óá¬!z:ñnú{m!^«Dˆ›áVó˜Q ?‘j+§ä¡°„•Ëôð+¸¥°Sj%ôµš›=è„gÀd^ê¡­™@ÛÀÚ¤‡¶Å㱌ޒ£äÐ(t µäᤤUÍL'ƒå¶ªÉ>k¾@&³2oÈ;Áb-\-d>ƒá8Œe@ØA¨£Ö°Q<••¢”ÜG: еìÛJ­ñ0nX_ôìÆž«²íf&³ xû³=¡=º`ÍñͲ²aU¬%~å7¬\à^B¦Ñ(Ô¼ßP1±“4'5huRÍ:ö Ë•™ÂTÒ²‘™Ò ©.~ å³u–•þ£áf+Bi.g÷á>4Ô Ìô±Š4³VÚ˜²OAåQþâ-À:ša|gyPˆC'×›q­¨+&£å Wg1x>ìæá ¡YëÏ ˜ªùÆËC§ÕׄðAÐXB+K%ñI0,$íiú4D ÀöÐóDšÅAW©~Ny°Iðk&„á'Âb¡ ;"úÜnŒ ‘ð¡4D}ŽZZS©ÁfóxXXŽT˃/Ö¶Šòé%È  CFWPœ)ã±Zcsûˆ"éJý6œ€ó£çx›¸S¨Çó˜%ó·°ôL,"V«ƒ£V ãáH“Xvs0k•"Puçuæ•Ù)¾hl:ÌŽ¶ûõfü¤¹Òˆ yê ñ?ᡵ€*`Ž5W³ÉŸ…)è È̈́ڢ4ÚŽÂB yHŒïØD&…,/ÁÊ¡w +âaYx—M°jŸ…é[øƒ¿„ç@¯ ¿¦n’‰?ÀGÅp>—}„á‚„Ðv^\ËjŒ‡qB¸Ø‡ÃÆ` /BÏX™x>ÑÖˆŸ±‡2ͤ1>Àryá-·¬L@Ÿ¢GÖ0£\#Vűð: _S…, ;™Âv±Ïô:‰Ë‹Q¡d]l.×_³"ø(ÛÂ> ;àxt9ø~sÙ›£çB6Û'ÞÞxMÚ±ØÂn~3¥!ö€ÇpéJNÑàšÔW( zñ‡!;8K«Ã…ð®ù&h@gÐ'vݼNÂ/VºõG,/̆±Â Þ”œçŸÀ^~Ô‚`gT€{IAöޝDDlˆVEÈË'™ÕH}pEJ™Ð>#NŸÌfƒAp,ÏJ¾Óñü0* ËðW`!þˆ¢Ynv‹â—hŒ™…]Å áz«Ž¹“ÖBWåÂâyk‘~t œ%ùB­¢ù ˆ` V„mô[ÜÀ%2á=©¢õn¸Òyè8hÏÃÅ;ø}GºÑ|B|‚õ„=ç1 «P¦#h3R&£½8#Ä~Ñæyz—FwµwzW˜eåa0EƒI ȇšƒ¸6^óâ[4̶ðUc ·à%¾„lÅ…ú!8Á2ô6æ ^=´ °,Iû/¨[³3¨”Ô^,Âד¾2Žz° JF:ÚÆªÔ¸JÅÉMk;E.X4@ûà[êbcÀ ¡ž<+ÖT}E(1zÂëƒSð þÅž“BS<䆋²ƒÕ¤·uö·º¢ Ò¾3ŽÓ˜]î‰Üì‹ÙÓ,p2äLÿÿ{¸i¨=ÛlÝàCùqòüÊ=`„ùÈ¢ø¥ZÐ6Kš–Èî ãq$¾ÅŸ±1°<Ëû¡ #qñ_l6|jðê`[ùnq´´¦„6t m2èËô¥Uˆeåào4 l"]éA^7ÁCÙgƒ}`~zø ÂêÑoø.N ÙùW³«•ŠÖˆŸ`GÞ…Ô" ÀwP6â }af¢Cxn'Ä¢¬x®Ï{ÐKæG ÉIx‹°ö${é*Fðx–cÏ7/ZCÅ}𘵊>Ö™û`SáøŽÀãáAZÂ:H…£Š¸ |5g‘l ‡g`Ü ¦²'d§Õ„ÌmÀýay´€3³"ØFêi°‘xÎ"›@^Á‹âc|F8 ½³õÍÕiiÜ·d2WI´u ÃÙ ‚Áª¼,‹-Z˜žŽŠû„lx¨YÕ ‡ÔB•Q4Þ‚g<¡E‘uø¢‰ÞY½­¼lÇK‘[´#L%МÆï‘ld ¯0[ÞâÑ|>芧ƒ× ÞÍÎZå¬tzl+(àbÚÐ\ir®Šú…~DóÅ£®m…½hDUû÷æ@^ ¾3ºÈsQé£rñ‡â…þœØÖÚøM¦²mãûvBO–†9ˆìöMQIõf±ÏvÖ8¥7éA”“¯Éå¶Ã²,&Ró'‘ƒ£‹é¶¡dò&]FUUÕ¢"è3[Uš/«†åæ'/fØGÒy]”¦=Ò›u2û3g á½Âÿà¥öµ¾T& _mTXf6³‡ñan)îˆàõ]Œ²zŠýõŒÊ‡ ?$‰tËì)&…å1^§ Q«¢6s&ñ¡ì„JÙÈþ…½šzn¿¬ns.›2²›ŸÛ‡˜W¢ ñIý;¿>Ó¶KÕÇy›èe¤4¾à‹F%ñ£.'/P)ñ‰í‚¨mnŒ,­jÉò—»ÙÃÛõëèt>à§"/Ð6qƒæó|°…Ùj‡~ƒ«s=1A~ RÑ4úNWTu"¡ÇØú&ª ‡ÚWÙ·«Ñ`ÛóÄ[ˆÜa꘮b®¤Cr¾YA¡t1å)Ôûœš&ˆvFqñ‚:ÊqF¥°RFiÝԞΜÌÙæ…ýË«íÿØoª-\GþlËd”z+"—Njô2öÑÊÀ?¡Ç¯.GñÛöÏy¤Áô“ñ”ÚEôRwd¤ˆ¤J:Ï¿ˆb4C6$ï¢4 %m´¡Êëªr¨®¬úÊoDRJ ¦qT53.pWMv•UÄ@qM%5G«¯èµðá ª¾Qiõ žed56§:«‘t‹ÚË©"¯Ô“ìy‘±Äh»£>7Oée2¿Ñ\·ÛîL™mï3´iÿV· tUl§ç\ <ÒÖÃHÅcÀb1›u¸ H9ŒÜô™j@ÇÐa÷å \Bæ± 7¢FpMz‹ÒŠæqÎaä1ñˆbº›q¾5ß1“Ó_z<5«Æ«¢¦ƒQ=æ2—‘UÖyé³¼®#Ãu}t ÷©´-˜ãCÝ¿PEÙD_Ð_‘Ùõ[ü€n¨µª.:¥½ú&@åK,Çrû5–³3mååx>‹Ú0–¿1ÂŒ2‚ÕT3Jw0> ›ÇѹäaSÕWŒßŒQª=×1†Û>ÍQ‹T„VWdÛ°JÆ1:¨3òr1(l+U3KQYQ‹®‹µÆ(*¦’©œ°SQÎQòdØ:=FÕÛtmÝL·2Ÿ¨Ü¶«aµÅlþ˜w¨Aú[tOUO:ÄÔ%z.¾Ñ½ô$J‹ Õžýlwi¬î©ÚW™yŒÃ¶*üDåÐíÍ6:µ½·}5ãåN±‰GP9De$/3†'4fÒlþ˾ٞA¤”½åC#£h)ºŠ™|HPøª°|â T¢?Ô(ýƒh)ûËN²¬.o¡†ÛëG5Ñëx25´ý ~}™—XÏÖ, ©EI¤ú˜kù-^¬…€JY@$0 ú±U“¢§‡â¥áËÅ‹(C½Æ%Ef›)þPÝ8±XÉлt¥lFúEî¶]âÞz$†.o‚\ÓõC=^åãŠÔT¥W%ôM5Eô [&f›ÍÌ:9§Ö³Ñƒ&à0îÇÅyU‡èþV÷1^ K ~|M|œ>·½myy>ŠçòUÎE“õpÝ^Þ»Ñ÷T¥‰ê þSD·ü‰™0*‘YT‡‹ÆÆmu$²„jO¹iâàcî®:êÓ²­íCôЧàÇ^º-3N¡Ü+§ˆ/åGb«UHÿ+ƈÔò„z9Ø|M,6ÖËqº¾îJé()=ÐY¹€|G_èÂr·7N(ŸÒJ¬Ü_½ÅgÔL±Ÿ{ªâKã€3ûéc\Lm¹6%RÃUÛÑÁ\o~až¦§áYÃû¨Ãª¥HNw¨2]cƒ#×+Šr\Þ\¬ëèÑæ"g+IìÕ0D};úE¤½ÔGªU’’ 'úñÆp¦®ÜAÔ×h³ìlKi(^§:q ÄÖ,n£ÓØkñ%[_#ŸŽ´¿a.åíRÈ,r4Íã‡Ü7è{º¯äÌô ¿¡m\\ØÄm ÌHº&ŠY ¥å@èFéÁ\Ld+x¸8LOô×@g“2ãŒTA§fS—ùÃwoP ]QV}ßüF?£ÞòQG'áàkaºggŒ©¢–}¿½ÈoÛ#_‹ª‘‹?2ÒÛ>6RQu=…;PgyÜv½^ªCàsÈæ÷xŽ~¶Š·E?½^-2©ßlYÃ;«™/DÝ.¬¡z·ªAÄ`>¦ËS_ÉYhwà·i2WâwEW¹1:QUƒM bŸ¹è¡ÊÃר±QÛØmž6»òVn,6“©«¹rÒLÕT.¥ûfµÛìþ7]hÝZï°÷àjÆmî ‡‰Ëb,–˜ïhS­µ¿¥Êi²°X¨«EU6ÿÙåZ݆Qr©ÌÅMÁ¦žR7š"~õø:UèÖtW¦¤ÓÔÏ8¯wÙóá¿àZÆ# wâŸe>Ú¡ S5ß>OÿÁŸÈA¶üš ü+ª’h!P¿›5øù€J¨4ªMÔ³©íkzݾTo@ ¤6–ˆ/4#zÖØÎ‡Ý0z‰õÔY?ŽlgŸ+s†5²¿ÊN(…èƒØ{hÞ§T²&MP¿EUVßÓJ"»95D|Õ²ÕO°XvHÜEÿVè#G¢CyWÿÊWdðýCjÿÂ÷õQUS;˜óªŒ¹g<_äì¼VOP£î™u„Ö;í­tè{—‹šeÌ?dŰâF_AôXM¥ùÆ#°”,"uëÅ;ü¹λùG±R.¡‚‚©€úØ>N¯5F†e—Ôm{~u²^CoÐTÝP âŽ—óÅM½Œs~1K>§Áü‡s!Î.rÑj5GÈŽ ò„m+÷Õ-õuû\žÖÝxŸG¢Š¤©ò}rTì|ô„†€k-R{ô/ò{[Û9Þ¼9ŒîÙ6Š&º˜^iWuE=c¹œÊùuqýÐLC¿Š‹ô„grnÎIKFyyVØõ½^$£ˆMâ×ESÙ•ÖRâ°fr&êöª"ÚË*ÒNçyŸš­rò ¥Ÿ‰ìÆ:GuÕ¯öŒ¢œí±H¯·o³7P·õþ†þáïUfµ‘> 9“¾ Fº…Úqp칬Jvã–±kæÕÅrÛcYULÐ9èscìZMÜå`ÕTW7åÜTŒjp"Ú-¥ØkjÏ®.›eÅ*c¾ØOýÈ3ãtV½¯ëOÌÖøÒˆý¶çòWÕVïW?Úss>àx7ùŒô˜îH…µP9xÕ—‡Á·Ëwº˜ý¼YGe£²ÆzdΤd¶ýF/ùg‹º‘Q¯Ã=¢÷à#Ь ¼+¨ëGìïÉ'¶žFJþ͔̜ëè×TDP5Jjù¹&jBÓµVËÌšfñ¾mÕ¥o·©›šF-IéÎ|—R ~Ÿ¢T”Õr3ß þ2-gÖGÔ3uNž=ÍMÌ;Q'#ÒVT¾¯ZØË"£¾“»Du­#3sy’ºŠ{\\-Õ£y/—”MD:ý§ê¦²šËtsùwT3ô•€ÎËI¢…¸BWQ/©»H vѪhœ·¥–ù­¶=$£Ã2«8«ó©Mj iÙÌâKõ ÷Î_Póu=œVýŒ!b ee­Š Æhã¤X£*˜x…Ñ&lØbVÓ 9 º¯´r¼Ì$6©~*-vžš§rsµÆ¬&’‰a°Ëb{”ÙŽßá™4Ó›}U-X`:KL31oçS5ÌÕj™Û6^Ô§êÔH™„mží’½…2å c¢,IZ]ÕO™ä×ò0xñ_œŸÇó(Û]82ÂLÆŸq ¾žDΗ¦y¬†[ƒé¤à‹f=‰ÿA5®Ç3d*®Öê!>¦B|W¦r`‡ãŒïÁLs‰Bz†®,úˆ¢=4W”ë³r¥Ó§ô ¾HéŒêâEà#EE>y‡Ç›7õß”ž+ ãg±'Ð’S‰„"±¨,©“æ;ô‚ ˆê²˜ºù›¹…æÈ2²šªÆ‹©`-›dzÚhÖ …ÈE…ήž æ5Ù¨6P<7çÙWª+ÔA&ÔyíWÍåœÅ–B—ÝE?Ó ù¥Ñƒ+˜]Ôtk,ô~ú«©9›¼"VŠ6ÔT§ ãøù…ÐQsº]Ñ_r0ÝAÿÔL}MÅB®Gù˜Ú‡è>U’›éfWÝZ\—ÿ_:é›fqµ}õVÝÉܨåm•ÄRì45ͧôòSÙVü@KU6û¯*¥Ü%—ñ8û“»íýŒRaùOy¾G]e;™š›:þ' !޲͕ï‰Vt¹»W~,ÖR>¦>0O©z"CØŸ"ET?{w™Æ˜bä+Å;#ŸÛ—«Fú1…ËJ¨‡ÏÕSš`k`[Ã+t¸ì×4˘@åõ0½’¿c…àöžæõ>5¶=™é”æ¨áæ]Ê"ÎÒ2j¦™Ývš^£áô‘^Ï Dw™ÒÖ…ODTWmÍåø ýI+èù™|®wé´Œûð5Î# Ñ™"VÏq—(¥v«}öT\X}•ßà\^ŸÔ™y¡ÚÌQâ]±L5JÖÈÃßh¥³l£lkmŠç₨ FÑ/Æï¨Ô©ô)ÕŒJs:ÕC|,½í­QïK"nî˜Ð¨Ô<¤¯y(§F‡y ¨SK}.Ê"¿¿¢šê¶úS’»èW=Ù^š"";™© ]ªs”ß`£³È)jcQåÇÓJ~BUŒßćâzspV>,RÛ~T15V§•†ß“WÌBæ*ÕMÏâŽtHɳÌqöYY…þQSU~*et1€›Z€§|ÅǸ—ÐÈÏÍ";ú¿ä"œòè;f-Õ\waæMœJUæ aE óŠÙû¬Tn&ª/OT«¨¬ü\¬¤ÂüB=çÎèj‰gœÑþÂ܆þÖNµ!ã1L¢—¨G*+CÞ†ËÅ`µ•ôd6Œ´F^1]بšž"2Ñq²½ ¾…y¨Î –М*ÂB-ìmÍÒ”ŒúÓ)±…žóïz±Ê.ꊹü˜2Зè >æ¢úºÆ’úg]Ÿ«ŠâÝrâD=y†hbTæd*ƒºÏeŒzÆ ±{z 6#Õ3ì! 꺼PMÍãýª4­gÁéê¸õ@5ü7)8äIÑÌøW¶àDzîMÄ9½J¦º\Tu+BïP ëýÅNÚHmPYRÈϸ©ž@Á:êÐe*&÷ó{ö\ª077§ð`àÍê=j§Oªµü½ö©¬¯ðz¹J âMj™~ƒ²‚9L¥Ä§”ƒó:‹ ˆÐEDBÙXÌ5úÃÌÉꙞ¦~Ö©hº8@•…M©¾Öt_\¥H^®ÞÑ·o%ôpóKýƒ}g‹åèDšR!‘½[v±]ä¥tô‘LeDÒ%ÇU,õµç©fZ†W"·ŸèúWt ô4±\T‚«Š¢7½ªþT ä/za³ŒôÜ!*3*T'c°˜ªWØ¡ ¶ äü\}@?Á&“h ÿ©>W‹ù”øMVàbæ(ª)ÿ)Qk¨›j½y,ùŒ\'zò,û'j,:¸F]ã âSº-z§äÔ›þDý1°ä°§ÛÜ÷Tä³'ýˆ^4…X Fï‹:o†Îùgô‹VèJ—ómÞ&úÒ’r‰þDb&«UOôAÞÆѹO’+eñ„Jé¡ög¦ ¶F2‹¾¡“Q:àß8½LE³ìÔ/x«8ƒŽÿ¶ý˜ž%ß—Ûx¯:UŠ b;úætúzý2¯ÑDv£pàÒ;r¬¨®Þá!¢¶H!RŠs⨑]ì·—Dí>¤Çʧjyظ,ËskDãjäæZôh=¨Ù¹:¢r=·ƒÝ¯Ócx­Íå“tZtEÆ¥P«yª(/&‰t7p¯Uº_—ÅŒÛJ£Ž”BN¤FÕ ¬a =£ ¼ÆŠkæûWàÀ“é]õä;¢æá|‘¾‰çCw°mtǨ.gàõ”€òp>äSu(]G)]„òâüíºž9IMx¾ên?¬æØJ™Ðó'Ôéh ýÊ›Àqÿ½¸.—ÛÞãµ0¯GÖ§ò2×åÃêg••·ð4£§üÈ\dï£÷Ð1!ŒÑºfÔm]†æë„Fyü«†QV™J,×5(‘|MWצý³±U¶~µDöDˆ*rC¼"ò‰-ð~ š'Úr[î*/ˆJâ{tëeDãg*Å6>¬ÃÐÏç¢Y´†šp¾ÄsÄÑU\â[jŸÈ‹K¢Þæ*¦îê±:;êñ%•–‰C|”磦wŒÃ\YïÓ{)‘ÑO¤ Á¨Ç¡h„>ÿjÿnmiàá<>ˆì}¬†:žÃKøs˜>4›Á;y”šaÞä[\ ¼½ýATUþWì3Rɦü1ÕF%°‰ãºÙpNNÛä™\ ¥º‡-È#²šhFš#D6Û5cL§ó™Ã¹Š6R@–äoÍ\*¿nHGÄ1¯W©áæÝSþ,Gñ@³32uY‘¢t)YX\§p£­P—x¥3Í@ã¸/Oä¶²¿lü¿–zÔ>„Ϩ֪ÕDÄH5VõeVËzz9O­DýLDù(µü^ä£Z¨WÇx/µ¥Ú¨RQvÑVîäå\ÚøV4”‰l¸žþLÌ´ EnµÔKõ º…ÊSþŽnï2e¿i¿L³ùºý2æ/äœvrS úÕ¨í_ê"ð;­ÙAÿ.¦ûe±EŸåGò¶üD~%Ç#’¦ƒÑf‘¥e1ñ8ÙJ0¬“”Fv’•E ½Rž7‘~Ö ÑGL³_´çÓý¨wS=Ñõ?Wdàû¿ÜAŒâžè£/ ä1êú74…Þãd?.®›È5RÊ¢˜_'£¡í{ñ>ºéJÒÌÍ&-§vÈè@þ™°ˆISE~®d|DΑÅ›tV3·ÑeÔST'*%¾“)¯ËFŽïУ¼Ylç¢`Љx¯:EùÅDî¬v˜{õß<þ{¸ÕÐ~C/¢½º¤ˆà ög`6Jð'ÿÂk8DÖ‘)¯A]ïJUàÓü‘܈â_}Ù4鞘]õu;O'Ñh…ÑR=Þ¼­º`}( 'TuìROÑ¡ ù«H¬Gª¾¨ø i:¥˜Gew°™O©%˜âU}‹ß–ŒŸdJž¥—Ò ªFÝ©ç0.IŸËÛè>µ§PW Û¯ÍoéEf/-aé:BUTçtYã²þ½¹Vχ·ËâòuþÔ¬¤ŸŠe¶“b{”Ýžö‰¼Æ4Q[4ϨIt“@¿â¢„¸H-D6ÊÍ…x6'¡&”Rîuè˜p*)¾çr*#'Eozª›€w7í(?ªØ\½‹“rFΉžµ.òy¹.,6Ú®7‹¤â°>ˆ þÕö1]@oJFP¤~€|M"æˆNè ËÑëŽkå<‡ˆf®vðYOtº–VÝù!÷Ô[ù8jcj-@×N¯‹Ö\EŸ?û›3‰ý¢ÑÏD ™G|Æ“Ô$î!ÒQþ–§Ô«3DAÔÐ*õ+=P_ÁÛey*­“oÈÀЧnbúð?ÌMü¦m‡1ž;ªîfo]—¦QgðÀäœKÿÅèä4}œ7Rn1ÎÆ…ìéõ&0¢ºâ…¢rp?ðŒ$´G¥×)ÌVE”×;9?W¤Zòc^¥¾ãêÔSU€öoó=]$–Û;UÕOæTj"…¶‰œ”P}kÖ»½ O$™ÀZ'Ë´¨´ïƒ³ü©éú·®æ ´uk¸E/1‘V«‡jõ¤~\H|¹¯÷ø¾}ïÃnÿ¥›èˆ.ˆùz†ªO,ZÉTÅìfn§'â15ƒè¡ú]—² Öœ\t`âÏyO€§fŠM`vÓqƒQ_–qVª.m±*­fˆâ&"äˆ^¯ïósôBõ©±XBÅ©¥.¦Ó‘ûÒ 1Y¤‹énfSŸr}ªJçQwòf^‚Ê8S.%IûôDÅjøÜgrŒ¨Èméº8€E9t µ—‹Šã<ŸF‹ÛèÜ }ÛÚgž4oP#?%‰ºùÿ$ÇRq] ÒQ`æƒE~ÙEG˜Gõ®IÙeqÝì4JLÍ9“N3äa‘ŠÒ ƒÞ¥ˆµrl"3SÔ¡‹4†‹éêœ^®•#d*Ã÷¹+âd=xÇþE·Ðs©˜ÑRÎöçÛè'ƒE ácº½Î+Мћ¯‹¿åD&¼A=Ô{ÅS ßå(] ÝÀ•Ÿr]ÕEÏe[aÓÅ9‘QØ+ÞT]Ìíú"¿9äÛÔd]HôcÅè¿ç{<×yUñCÎ Ž\FˆU´@ä©8Μ_u5GÓLÙ]H|G#ùwµ‘wÉfòSõ“½——d{ù¥¾¯ ÃoÈô‰²óú]ž7Ò;ꄾ©Зõ…us3LǨ (Æ3õP®AaÂñ‰õôBp©Ô¬¼ å9¨8—áš\J?DwZ…F‰‡ÔNuRK¯G©£hA@s‘_|I·¹#ØÖS£äÔ”qe™Þ–Á6›ž™§L­¿Gu¸ÊGÍ$f1Î*2‹’”…®¡ÃiªÑâoýšB™eiñàüœNËC”Yÿd.·÷W™Eq•·¡?Ê#·È®ž`/¹è}*BãQÓNÒ`ÔÁý¨%y©na®Ö)£ò&¿‡Žqz],?QM1Fž¤'ºG¨Æ”L¤ÕééKêe¶Ò夽d˜QXß1¿ãôjŸn+ÖËýTQ?UéûÔ]L»9-‡‹²‚éž:ªÒˆz´ž¿ç}ú&M•³èŸ§¦ê#ûŸúuœ×X¾†+Á ª¯¹ @/wôE}žÿž‚¤´4ZV9ù0=¤ˆÊŒ¨Ø¹ià7Å[òCYŒnêè”'!Vþ©Åj~ F•‘Ò\üJÿð þWÿ¦–£+Šö")XÁ5XhŸÑ3y¹˜ V®ŽÛ·¨o(…´IÇUbp~DLYÊ$¦Ðe¾«¦©Å"µ‘[ïU9éSúTv”Õ© ôºO)áÝ{àŸð¿”øKt§Ît|1/r+'íÒ‹ùoš)Ó3>ÀÕ‘³ÅÑ…N_Ëôü¶½¸J‹ÞõÊÉIÕEý!­¦qâu`Ū%þ¢ @ˆƒ\ 1Sþß žÚƒDv=Údñ3/Roë ”T^çjþ˜VRjñ#¢g"Zoh,’ñ `ÀÊZ2/¨Bº¯& ö0„ïIÆ wã2úœNBQ]RÉ‹¢0zêª!þÁ.SReÚÓ¡kó4T©ElçÄâ´œ¥'ê'¨fÏô=u™Ô“£×Y@ë€w}(?WEÔããê€Ù‰SÈ)`/ ùuó;½C<DwΧÿón÷ S܃óúAÌßLéªî¯#i,5ý‘[Pc•q—/ëžz¨®BE8;»xKý¤{ÏoÓg¢98ïaîNÍu!žÆçù4U;ÿRµÔ?r²¢7M§uª¢}‡ ÇÛÒËuz“9†émgEAŽT¹ôTª|´˜w‹â5ݰïmü¥¯OózXì,Mâ.º8°æ *ÝLøóº*‹Öº»>Iw°×ÆÀÆc:‚Wˆ2è÷sA>­Û›Ó´ãDn†øøë¹G4¥¿Ž­yu"M]„溺ÎHÑþX§¥¢´T5Õ€šá<˜óÕ“wщNÓ›T 1—~B®t¢ÐóßÒ‰EAã/pŠUj¹ýªÙVŒ2vˆ}¼ZÿÉ?Ó15B£V"­X%žó³»ú›oóDP1Ñ…3ƒ#f¢ò¢25挎{(܈¢€ª«õ÷(B ç&æn³W‘r³‘JŒ6Úæ´2+r&>¤Rï'£+˜GÕe.‘S¿¯&ð2ÙAn‡µŽëjœýÎX½)°lXÚX=›Ž#â逸x52DåØˆZ}–®!ºRskÔÄ¥ü=¡S_S}Q÷>@ÌG϶•‹ˆ3@©T|V¥Ö è ­•e)úZïF^¡ö:•½¤zC4“;ä:îdVQih¿œ‹Î®$]Ô‰–É+à9è3\7‘ü…3ë…Ü_n–åźºê¥mÀóæ`Îv·L_‹XªÅsÁJ~ã7Õj½Îå÷²/Ï1ó©-”PfùuC©/'ç‚” 5ý6:E7ÁÆñ§¬u[ìÆ&÷RÊKIÐÕì¥Ý¼^kè#ªÊGÔŒ³¨Cª ] â±”«˜Ãíop#ù®±ˆš¢Þ׉×lwä*Ný©¿ ÒÀ–û¨'¸¨‹}l¤;ê¿+>¥T´H^Y¼.º"G~åÜŸîèB*!ââ §:–Ú 6ßQ7U¬áæ~3 ˜VäßqìµFÞ—ÅôHå3»ê3⊬""yÝÐ3OÔ£©7ì_^ÿ«ÛR:ŽÑ‡×ÑJ ~ì@ýº=êK1ú™ÿ¤ r1:%£3zŸêiÖã)’мÍsPo{‹»àn›Ô5•™¾“MŽA=Õ©¨%øýqØ0–ÿáïÄlù”vè´|Ÿ‰Öb(â;Oå)|HçæH ²£ûïÃï=õ`l± Z%D[Q• « æ>#WËb=ªæÛtŒöˆòè«þA-9‡=µ¤wéîÛnå:LL£Ä1Dâ-tÀŠ×€K—R·ù¢ì(>Ð×ÌÓz¤„b ¦þÜ»ÐR:)"±ÇMœŒ—Ò:±“*P0²Æ\Yy¿¤)"%E+7¥’ô%,·€ñ0äÆU~ŽüIN«PÛ¿»º¯#u6zG¤ñwú88SipÎ…ò£*ÀËÃÅnj‹¨l®¾¼üƒÒ`âûé,µ£÷P›^èºLˆ@¦^<‹—€M a“ÓR29 ½Îµ€È!ï3: ª¨fZQ.›€ SôrÎ ‘¼±°Î¦›M¾ÛœÏëôÞ_eÈx‘Õ­LÒ&ÄQWN6T=¥WëCúl9…«€#~@;é_QSÔ&tdœPîà×U}Š“ÐÉ?ÔŽ»ˆ‡Q¦Ò}ô¢U­uާe럀´o9àÔŒ4À¥¶ðwdç Ø_ô E…9¨=¨pÔ’")Í#¥D™TlÕõ9‚î!îSr[¤oaùßÅ£; Blå7) |û³º¬¾¤ïÄÛˆ‚ûz¬š«W±Vó×Ô6]HÉÁ–çñ)jO»¨Í‡ëþõåÁ®ßã,"…øXž^e†—«Òq¬z•3q^]˜z^¾‹þrº©:‚á'¿¯»¢&o€…Jˆ2ôßVßë«ô7­ÁÚÐùg7ü™:Ò"=‡QJT ÖtDÿÎéG¶ƒaç¹=§Ó—ôL²Ó¯àx»tðí¯D=qÕræR$ÐO¿‡~v2*ÿC*,{‹:tÖ|LÈÃ?ë5œýÕSôÃeè3Xû4§" Fô UFGß öý‘ø6má¿a±6è¶& ÆMÖ-x¢îª[£âäA^N§•ZÒujJÉø¼®+½K5é,È1DwyðÀ«¢5I.l™*Þ¸¾çÚ¢¢,"Š2ëa¨9¸Ñ6ʈ~žŽ Dâœõ¬RÚN@¥L©_ Ã"Ї'Cz17‰Ÿ¿î‚NÏC¹¥wÁ)›¡:fGýÊ%4éÍGÍ·B]ÈL£¨°èKõiøÇ4°Û0J=É®« ÷îÓe0ÞUê˜~þ(‰LLµ…Æêb\ö CWú„3ˆ‹àÍçh'иtßÊ›hxG=~ºŸ÷Ð zLe.§D§ü=]¡ÁÈ„"‘˜Š<»È‹PÇÊð8}T'›POns1.Ìñ =@O»Ý+Š8m*.è¤ÐkÍ£9™^¤3Ñ~%žÐr£ßàpúËñÉ àù2]Ö«ˆüÂå8‡ØJàx1Xý6pþ5ºÖµs ðƒˆ’š: xÚÏ4`‰Þ«K ë?ã–¢ø.ò]ý#åé)?02­C]úŒ¼ŽÍB´%äÆ@¤§üˆ³RYtP‘èIr°¢"ûgÇwk}§ûñç`™Eè(<ÔP7GtåEõìíÎtrt)‡Åu.Êio…Э™zØÈ›"©˜Ì¿1x5E5^N³F8˜'‹´°A:Z-:#‚Ûê0ÔŒƒà`½q+á•ôü-ØÅQ]Uÿ«jñQG¬5›?Ð@‘[¡Ó\]y$wƒOU$9Í »âmÑwU0Іr¡8L|ˆº×Uo2¼7ø³A ›9r ÝâÊè5¿A¿|ˆ[áÏvt|7QAWµ~¤G Glé [kN†¾ê[ž ¿œˆWQ%‘Wœåô4FtDeœAÙÄzÂÃuE ßN‘XŽæ‡êX5ƒ££‘Ž+ñ\ƒ$ªÔW`¼­Q“£JüÌËHCx:$ü,| ®x‘w"Û×éwÁöï/N¡fçiè &p›ü˜wcìl%¢éÀÉ|T û/Š^³¼8ŽÌ “ð0ñ™Xn°Q½W÷§$b#ŸÓTižNŽkÜïYÏs7úˆwè¯Q76ÒôèßÐ`UO0î ˆÆ§ˆ’jX×à¬ð|3tX§ql¸òYÔÐÜ@?©7«Úñ½ ¸_Ñ)ЧBi¨—žª/ O|›q+pèô:£çžZ<ŠG #ÿü 'U€»Ñày¸5Ýãœèôµz¸L.úŒZÐX|Ž®ÌãèudK{D×ø)=º•Œ¨ý™€+#tMt-¥’RÓ2à£Þ>E[DMڇʳ5o8Â)µÇ€(Èñí4Ña_¡âLGµü•ˆ$4R_×ûБ^¤¹ô1Er =Io@_qv΂zp‚ÛêZˆáõô–°¿ÃÁ2Ö`ŤT“÷èÉ\ˆ8ŒjÍFÑ5dä§à2Ç‘Ÿÿˆô2'e>}B3Ðêý¦Ç™OUFQMÖ§Õà7ãxz—j|S¯âf";8‘}ÞǨ½›é=ñˆêé=*/:Úéž^¢kq!d^ñ57Ã+4‹Bß3ŸÑ‚r›{qJI…ºÚ ,t#å¢0VúÕ³èOnÂŽïÀ|—n/ ¿)Ká|Q?ƒ3Ä}DÏÀŠ¿‰ªs Î@xä)ú§z5—߈òˆ¼±ül~L¡Þã­ô{ï¢NGÇÿ!j×SÏ›t`YiÔ‚UȒɨ¦[u®.ó%:›ôˆ«Nèxo‚#]ÒýÉmh8Íh¾X\tã>à…é/Q_…_vÁ»ù;pÊ¥ô.çAwЃ^§Á“P=ËЗ@›º4‡îò{z*˜Ý].&Ú î/B—òÌ9-å@¯”Ÿñuj n5'¢ú.àˆög<œm½€ÿ毹&=Bœžä*ˆ†Eðè{ü”?Š=ÄÑÊXÓ¿£V¾¡]õq°ñáüX?EÝûÙ<ø¼š*Ó tµs!û^BŒ_Ó9†jUwCÌþÍgÄGb÷Ôc¹½èJåÀ f£ÒîäsœLÉÁ,{ë^°WAš|U¼‚Žðp³9Üݵ«+öòºØL-x-r±>mFn–¢,ÙaÇdF‰‘½ËaGú>z˜™ô6|ý>úѪ`7¹/xÊytvÇ€cã í) Ù½]{Zp¢^è—&òrÔÎyNôœƒ¨„º9•ó ÇÕ8AI€)}ñïZ0… ж=O¦ŸÅ80žÙÜÆ!·¯#âÇ¡V(G÷ nø.ÿª+@×H¾Â¥ø†ª¢OðHxé]ìâsð´ÈÁœT•;§Cl®ãl@· "=zËäÔú˜TCü‹l¬‹xþ+D‚9µæ|ÑpÌå,ú„0àâï܉s¢ÇîB 夦è„î#㎟º#û[Q t1ärªkM‚5R‚m&@/¹Ÿš£®n«ÿŠöðŸè ªÒ$ÄÊ à4ðÛtûHŒŽî n€8X8 {\ãªÈ¬“Àì@ãOhö:÷°÷sп ïÓ·x1Zñ»T•¾N'‚ÅѾ§¡ÚeF^…-4jÞ 0Ý7éÔ†NÀ|¼obn/Ø-)=—ùŒ:PDS$¥ñC¨!_Ã/ÃáÁ¯ÀÎÏÀß%¸7'å²øm;4Û &q58AêG €žYùgx3 å¥7Ð¥| ÿŽúŽ.6‡ër~ä]ꂵrcÅçz0pºì¾lî ÄTVì(-2k&ÒN+† òwÑû´¨ò9]A ê.b8øÙR¾…Ž®ìÑèÖžXÏ»ÀwÃQÉ=盛 út²mPû£sz†8ýŠz°M?ÕÉÐ3ïB<€H ¯¢’VálèGò#z ªŠü=BÉÅ~îîÑ’ò¢:l“¿ùGøu*"Ž"·»€±VGe=ŠÊRCü,Ðf`Uc1˜Ò¢ªþ‰Õ3"¦7ÙÚÓLž¦ß§:À{Á×W€Mlçou2n‡*ѳ֓3Òøx´¯Œê]:ÉÈ}Y~±>¹[˜Þ ͤ,.PU1¶Ù ´kŠHO¿Â²Ía±Oà×Õ°ã)Ø5=Õwôn~Aç©.ÝG\Ü® F¬ŸÇŒ²<Ñ0xtI§Eo°˜*òxç'h2u¿&"ì70ò÷imAv€–å)ì÷ý.¾¢ÆÜ’O;,_¬ƒJ¤Àk^ãþ°äRÈùModÇ'l®cÕ0`m8ÕAFÍBgö,-“XÉÍà;´¬ð[F µ$…~*ýkþ;+JÕÑKž»i®Û„GðeÄÚGàæ5À(néô)öw7bW)ÚÐE*èSZ—¤Gèá_Cç5?)0ü4øÕ"Ê"2ŠŽœ‹b§—y ¼¶Ù††­Ïp`Ù cKD]6Ô¼r|Æ—B·Ðõ¢%l;Z7®ÞCËÔ®¼¨ Ë‹ºÙ ¨_ÈÖµy :¨ªèÒˆ¶äà¢ç€0K°ïĵ}xTõ½`«Ñe» khæà®;wGMÿ §¡ë|h˜€ßäÔˆƒ©ü˜ÂQütC §7D•£7¹6²ýz®ÃðÔìv6ðp?¸4²rôÿRQQ>YÍÍõ;èÉ 5&£8’ ûxÆÿ ˜øè“2Ç ÑDpË‘@Å"°u+dÖhô ãQiÒQ_œ Yú ¿¾ŒѲHÝ]Ã@n‹øH6ø:"%vݳ;zjúQ‘Ó{ÚÊ+uQ-Š}BÛŠúáhUtÃB,§õ@Ç–´øô+á…¨I°Ïi!ôýÒ:ŸìÈÅŽ;ïü/g‡ývãß±ðé¯_ŽŸÇîó}Câgú:˜\ìª%v÷!wFž  KNZISÊû¸38b"x¶•“‡UwcO‘=¡ºÖ¥1ðózþ¸÷ ì:=F_Žz² Ü}*u?|¤¿@ÕÞ ž~œ+ |›3³ \§ á7ð˜eˆÑ"ˆaG_™{JƒšØÚ¨?åjˆ”Àô!@¦%ˆËõÀ½ÅعãÓŽ½ðç.vuˆøpø7B\íÊ÷D;‰jØq•þ Cç//€²©±VVQO|Œ _ÇÌaâm±™xÒ~¶DO…S«Ç€|åÑIíáô »ãɈ¡à°Çub?,žö݉:¸ŽCn]øÒÁLªÃã3’'й¥ÁÎî"V“"NËâÕoðÔ-`ViԊ䈸Üȃèa>@õù‰ë¡ DìäG÷׆+ 358‹æ÷÷¸-Fîø…—£ÎV¢›à‡{ÐÁ”†V©Ñ7žA–G+›‘«#{RÁVѯ˜ÎÞ¯5¤FÀªWP‡š#²‡qDW'TÛC\]ôþþ+E ÚÍÀËA¿ªÈ˜Pe‡/³s7ômwø7ô€_£“©‰Hü Ü£;°ê1pú/@=œ‰¾ìsØpÞ»†œø»-‡Ø^‹ìk‹xÝö~õ ;8çq¼þ¶ÿòZ ‚¶.€#@ ý v[“Ì1²l)úüºà·‘Õ@×à‘õy^¯ã)½hG™°öMT‹Èžpxã;®ƒæ’ðÍB°–£ðȰÑ@Þ*È€êäø„peØe7,šyœyvÞ‰0 à‡À š@Æg@÷ÖÈ£sˆ†/Á8Ón@ÃíNŒœ€èHÎŽ;Ó“°F)°†ÜX51"¿4°¼:Xw$}ÝöCFM…eS‰ŸÅ’žÀ;þ.‘ǧ±Ç ¨4s`¯1ÈŽ¨[ i ð¼ ½{f7IŒ˜(Œ˜Ë.“ ? q4!°\ KŸ}#`ãIøÙE—wåÏó "»’ž`Å$È®dô"u$z£00…°ç|ˆØ¿;©2ÈÀë;ðJgàÚydGwØÐ¶6€œîöß u=<­Á!n#j®À»ÏQ‹.q:äoêÉÓPӫçà±tˆÓ¨9³ŒÉ+3›™Pçj¡†$À‘Ôøû<²$ì„þ ØòÎþ{1±îkÔÖ͆lH\+ 6›øô/<ü¯Óg‰é/vx¦ú…D´†]VGn:®¦LÅ‘ªÀv}ŽT5h$vkÇ¿v¬÷ üX¨ö¢¦ú¦ÓÈœuØm]àõudf#Äb2øK o³¢¢¤r~ªÔ›æ¹U&ýÖ†>{Ï Dj 佬¿Î¿­îÀB¿rp˜ó¸x*Ä_6xï"÷ÐaìW h™‚ÎÀ–õŸµ±³§üð#)æØ€Ã{€2Eñj9¢î$"(+"æO0›YØoqX$ "a ¸ÂV°Õjˆýèã¶Â'éBÕáÑG˜+åF÷L4ˆô&b! Gׇó;®ûÀvø×q5Ëá›9Ðú>v÷>椆mbõp ësD}FX} ä¥@$–ÓÍŽ|}l7?2×qU< ìV»<‡*òjNIøO"î"°Ú)X; ¸íèñ°· <ëðâ]`Z]¬Öñ81~¹?ßÄ‘ûÜÞº‚¯ñÊÁ» ù¿Øë DŽF%( kG" Tö»8£<‘BEè–ÅyUÇaípÚ'‡µÂ±›äøÃ¨y[PÿÃÚ™^ †Ws?üÝ;1ñï`‹]o‡'/Â2¹`¥¬X-|µ¸‘™¶ b‡|‰\Í 4M‚Šš>¬Ž]ÿŽêä¨áI±GrÚÐQ7%"üoD["TùâØ¿†Ý#°;–+Û]Å>{G"‚î£&”ƒ¥3bWQðò.ì$´x<ÇL x¸H޽‚< v‚!:<^~N ÿ½†÷Ó£[ü–¡» æX«™¨,[¡ÉsX1 ±ôöX µÕÁ9íìð¸cHDãaì69VÍ Û§DV'GŒ%DÆÇœÁбʎN-#bá)Ì~ìSB·sÈRÉÏ‘åàYc8‚µ ì1Œ>µAÓ¼øsˆ‘zg?Ão/àï,XÿÙ+ذƒèeKÀ66̆Sð®:¦Ào/‡ K¼`GΤBïàè¾kÀjgÑ]Ý‚ŸCã´ˆã͈êŒÈ:‰Êå¸ç˜û°Á~EÉq0)þ8¼ù9â#4`éq~ÈÌ„}:ø6âš°ß×á±Rxÿ(rÉQžb÷'˜‘ö"H:lIŽ Ík_ÂzI!Ï}ïä%Ç®28%ßrÊSˆóÛˆÝg@ ´ðÁ ô“ÏÙ!),rƒ³_SâOuÔ§çðÕ9Ä•ÃNI±Î`·ƒ±&ÀÎònÁ>Ûœ‡´°Œ‚g_#‡¯ãgû¯$ü–º*ØS¢‹}†¿B«HXì…ó]jìèÀJ;ŽÞzÜF=Çq\ÅëÔÀп/ ObÌ×l¾ú±CŸ ˜w GS!6ÂÏ‘°BBxБvXë1tŠ•@ïì°†5¯9ÿbG¼'ƒ¥ì8×Ä\ÇÕjÇ3é‘_‰ Û†øyŒ³Âœ‘îȉ(ç~_‡=“B¿‡°C¤s®ã_Š@urÔ6›³r?Å Óé+G.(Hr¼ xçüÝ”ã>¼”îÕ]I‡æš•ÃQaO®8ëf6§å¢œ«„9Ù±ö œé@DG”¦ Ç„³ˆž§m¢œÖ6°NޤÀŒã°cbXÛ Ž®ß±šù¹Ïá …£I±²tÎH„™ ¹‰˜~ šÐÚpæ ÃÕí´È;±ñVts`e¤ãá¼'ðÆÉÈñô°#çŸ;}Î{0Žu ¬*Q Ù‘!aȳ(D>9õwôä)qô.Ð*R³ â#qf"ä~ayæêð½ÃÒ àYÅŽ=&t¾~ÝÒ;±Z:ýì8¦àBÝì„ȳ Xÿ!3õ-±3N¿²œ£ÛºàÔ*´O„9— 359ú¹pg4Ga7)p”œQâ83%¤vþ 3×c2ÞtZú¬yÇ™!ŒÜMy9<ɶ"œþ7°Nj§'ì°â3Ì7œÞ×8C:9Ãލ‘Øùc'VE83Ä…Ú¥øyŒ||âŒvƃã]åôd¤³â†¿B6G†εəQ¯¬äð³#¶”SÃH§n/3œ yþ*3ÃùÁÎUìN\uHqÈNÏj§¤Hgt:<—؉䉎£IO±BgÔ9²“oÉñ›Àœ§lw2Ǻ;Ö‰Ö±_ÇÙê•×?Žêî\W:µ7gH§GíÎWä”äx×pZóåÊì”@Î  œe¼ŠÍpg]yîôõÓWú8ÞyiÅÒ¹ƒ8ç‡9ýdò«âáŒ`v®+^é'¿³SçðWžpÄÂK½VziñÈa¡('&;Þ5œ^ú1ÌyŽxµR'B¾ÜtæÃK 8ö­ûsø0üÕ.É)ëåN¢=æœkCܼÔÛtzŽñæÄý*„ó]ù{ÒN/Edžã=Û«Úù2 §eÄ«l¹ÞK‹¿ü#_é"_í™_YP½ÒûåÙ†óÇæddÿGŸùÒšäb±èÙÑѳbÌzäÌ¿—»‹ž½ºú¿Zc¾zmÿ¿óÿŽ*·ýêOôùQ¯òÀõÜè¹/Ïׯþ~‰ýÚ/#Z¿ª/}¥ÿï‡]΋~'Zjôê®g¾´€¯!^Ű|?zuö=\Ïž%Èó]ß¿³¥Ï„›áñ{̹VG¼wb5<çyÛ@¸ýθôŽök[wYò•ïo»¹ÏõÖÝówé¡+XÙÓzžïz꣣û™VÒÌÿ³Uô|+‹Æüœ'½GŒd+«F¯,=¼ëí«y1Qó·tYOºI|‰rwákÑV‘ÿ'9Ð\×éÕܘ¸Û$6#Æf¾døÊÆÀCºä…ëj®1í¾—˜Ã¬4Ž‘xøÎbë5Ü£È߈ÅcvëŸ4³ÎYéÃîQí+ç‚Á8ß3BŸŒTÃ5C13^Ú7xí­ê^à¼p—ïÏW1gÄ.Ó¬G°õ+ö#4]ï;¸aí¹Àó…Ÿó¼3Ðs©œ— Wæç_Rì}o•ý¾ßÅcñ¡å¬¿ÚàÁÛÒ³º‡fwM‚áû\1è.ÁÓƒÌѨ½s(æ?^=£Ú*Ê}Éu­M¡çE°ØíÍ}‚‘íy¾oĉˈZÙ;&<}ä~vlFLßç*?8„óßï’äÉhb7Þ+º®8êÝg·f\+¤/M\û!ß+ûÂñø¾yf`kzžïÛïþ#9¾F :Z˜;æŠ7¬öl&Ó„:bÇd| ÷.4þ˜ëËá©i0š‹¡Kvø²?„ô¼Baq¡àQpgºsŠ 9‚“ç«#õä:ñ£¡+âúB=ï}­Zœ»ò5WÉþ¤zž£y`[xâÍÿs}YÀÛ~¡JˆŸá½nܬÃ7‚‘åÁqYÙuýà|ïÿª—ç+÷ß]5¼WÏÝÅø]sÌk+„Vß¼sS[JïûÜwõ–/žçÙõº¢8|¯êˆ;ÿxy¶¯«±•ênVŒ§<³6nQùïÇ£ÿŽzwIÞGüí?ص=)æwo}\×w_×3Ób£‹{–úÓ×õ•ÄvêvãRÿ\}æÉI¼%Z[ß{¶{ñµ²§2(n;õ·b •ýÉ´ž¸; NS×|ðôA° %ðýÚ§ïá©g°«[õ=¾¢.tmb~ VF°Ý»çœøÉ|«ëÁÁT+K…Þ%[!p Uý!vÌ™Ákáûl_:ùz7¸µ‚ݧo [ïÓÕúž¹\\{{#˜±Vû´ÚuP=äXEƒ»4ßÝ¥«vGFßëÅf¸ç\ÌÐ}¡eìØF Üž¬ýWM‚«WV¶ÛÞÝíïϯÁß©·’ïþ*î{¾yVòI …ûyžísþï¹®Œfq×>:"ÜŸa´B•@WF}Ï U¯`+L £ž=ŒçQ÷l炱v±¨·'Ý­j•[žä¹ÁY9°¦Ö9;™îÌÅý}¿[íÆ=k¼×q=æß1²µ×YV™—ý{®ê¹RÌðýÌ’…‹=¬c53Æîž‘ã­W(šûê=|ùÅú<÷Lô7Ó“÷ZE“•½\׋Ž`­Ÿë;¾#/î_ÌÞýGwp²¬£*6raýþÖóÏú¢çz~ Tí½íL2Ø.Ç›#yžüªÖ+Xáb ó†É®ˆþ®j‡žîu¯–V«óô™utˤ\÷¿ñá®[pÚX[Õ·^1{¶¬¯ó½‘ ´]¸ÿêÜPg¸W³@Ü«¡»×<ð^)X¼ŸsõÅ›ƒ•Š>±—êï9kWm}éo…›æ`žÕµÒÂ×4#æ7ÏWVûŒyíû•ë þ î^öµooÍ}×,ï=…ºZl8€§õ=„*ÑZG÷Þ)>/Fë>ܱ$¶•Ùÿy±óE ¼ˆýüIõäè¾çZ÷Ü1žõÞ¿»Ï]ÿøãnV:Ƭã9×7ïŠÑÂZSÏó ë9î¯YÐßõPâ&´Hrp=OŒýâU9Ãw´…n§Øiürw&뉾çù>Ï;cëùøò‡ufzŸgÍ<¼?5d•1Öˆ8‘á*+tkz{ÖIø®Zžü1Ð*±¯{Vx·¸‰Ö)fç¡èâiqßõ|ÆÜ½çˆ™zÇO…‹ÖuÎ÷üà˜œw §³UäÆÝ*Ái쮽ë{þ>½šŽÞ ÀúHlF´Õüß%±¡\³ð'+˜+о˜‚7B‡ö©ÑÀ|+ +åoÇqñÝÿ‹˜v _פ¼Ñ×áÿ1>sý†“Ðq×÷±­[8xîâ/šCÇjÏØµŽdÿ±3Ëw­œ{¾: ßZ»r#oY¾eXåoø³¹7ÿð³Á¬»áê·Pgºó ÷(ˆ­&þ}ízÔ;æ‚ó\°::ãåo®q}FèkY#¸¯¨ñ®ÒîG­´·’ª§âÂyãV3üI‹»$#¾V ¼¾ç»Ñ¯ü=ßíûù”Pu$ÕzNL·N0OgøÊBï£VúÇ<åïN¶µÕ}I÷?#ÅË}?9vWâ½5´º»œ.¡­j=üu®¿û—ý*úü¸éä‹®{¶Þ{lô=¹ú(°®qÞy?œÏý36þ¯=û“å™EÁÏõb±­a±‰N_yæŸÝÄÌô–ã›±Y±»ø¡íÄ¿WiÁËnwž=“oY¡¬j•-þ×NCÿÇ<Ï ¬µ«]ƒõ³Õ÷6Òôåþ ƒ•4ß÷c$«Gà÷¼.·|£ˆ»«X²²Q(úyÊ}?â®­»/BGÑPÏ^Ñó.U൭;+.`m!÷³¼;_«øÚGp׬¢‡;ï &»ë᮳¥*AHr¿7âo•˜Hñ½GkžÌ+°f¡|>ØK*¦¯üpµ†¿ÚoõÙ ÷è·¶I ëÈÁhnU1Íp×$Ô•­Îw×À=Í mmo+zïÞ×Ý¿˜ñ¿øßÄ}WI_b=ËzøúLƒ¿û®èOr|=uáøb^ž¹̬À²ƒyÇýH Œ4?æ·Äð5Ç7&øÖ±Ì̘á}oÜ5CÑ&F¢§–ž¯BÛ§ÿûœÖïÏË}Ÿe…*ž1êwZĆqŬí‘VÖó_ÍCY×{u×(þ3¬ùŸ¯sƒÕëåBýþ¬¸¡¡»ÅÞ¢gÆ­¦ÅDcx_ÿ±®pV•M[ÜEv·~ ªãÿ³¨žžôgíÀ}‡¿sü£m°< ÅGÆÅ`z(1ï9‚}!æu`‰Öó½QÜéýû;ô}z[ÇŸŒ¸gBÜ9V0•.˜»¢V»­‡p]5˜ Vvðx£Jllî Ÿ¬†{>„23ÙÁéfÍâò !þt.Ò-p„þœ‚÷U¤ÿ݈áìVû fuïn_»ý¶‘g⊎±Û è±^ß“}­ÜÇ—–øéÅàâÑjv\õó¼·órX_GŒ–ñ#Å·t+®ÌLAÖH—˜ mNèǢ׈mïŒ>~b½òœ“Õÿ›¬ò^-fUö@6ÿ’b>ã¯~º[E¸Íò}ÇÉuï¾õðQ>'ä©m Õb¤zjî]#üËð¯Qà3ÜcÄ÷šq탋îФFËí«õu/p¦Ó‡XÍp]ÙÛßñg‘ø¨žÁv¢±ï«ïÞ594«ÄÇg‘ý=S#%”=ßY/ÓßÖö M'OÍ⦡ÿž%æ·¸ÅSŒd÷5‚=/6{ŒÑ?6ݱõµÇß¡?SåûÓÁu•®óý3tß^ þQŒœP‡û‰ËE¿k¥Qü=û³rìçZ3çP%žã®eìX²÷Ný¯SQ}Çk®ùþ?yÌßÓþ=·{˜îû+2ºÊõ}MÁ}%×3ƒ‘é똫 W‹ëNæ¯Ö«U\¾ "zë| &²½s-PÅð>ßõn¢¿ÎO¸ýøúܵ+/ŠþÛ×üKò¯M´G‚½_à½òÿ¦ëðÔÉú^§;»ö5â»ûŒY1>‘È_ƒÇD_1å©‹õU½•· º»þn%)ÆzÁíË{•è,¶Ò.x‰®¹ë[ûàäÄ~Ä…O¼ÁÞ5‰–쾂µw—Æ%ž¼õÖÔ×±ÓÖ×çꬾSÕ·Œàî:xÖÀ¸iꮯ¯èï»XÿÿÆÿßGÜPï¿ñßøoü7þÿÿÆã¿ñßøoü7Bõj7j\ÿÖ®_£AíF5§ÅëF=ºÊÖ¨G¿îí²ÕèÑ»cûl¥ß*‚3ª×¯)q4Õ®Ú°ÚkxU¬H‘…Š”-T¤ ÉÿPKò¼9œ„’;+P €song.xmlUT˜¤HUxPK ½9 ÀAfwavetable/UTS˜¤HUxPK½9¸À7¤¸½t! €£wavetable/Clap.wavUTS˜¤HUxPK½9Rufø/u € Àwavetable/BD%20Full.wavUTT˜¤HUxPK½9‡I5]@Ëô± €^wavetable/Crash%20Hi.wavUTT˜¤HUxPKz¤)buzztard-0.6.0/tests/songs/buzz1.xml0000644042355400116100000000363411642651164014415 00000000000000 one buzz generator buzz 1 chip 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/melo6.xml0000644042355400116100000002013411642661513014355 00000000000000 a three voice melody and hihats melo 6 chip-music 2011-10-04T21:44:56Z 2011-10-04T21:44:56Z 120 4 16 buzztard-0.6.0/tests/songs/broken1.xml0000644042355400116100000000012611576360402014672 00000000000000 buzztard-0.6.0/tests/songs/test-simple4.xml0000644042355400116100000001006511576360402015666 00000000000000 what a lovely tune test simple 4 dark-wave Stefan Kost 2005-09-20T22:10:56Z 2008-03-29T09:04:34Z 100 8 16 buzztard-0.6.0/tests/songs/example.xml0000644042355400116100000000600411576360402014765 00000000000000 what a lovely tune example dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/buzz7.xml0000644042355400116100000000627211576360402014422 00000000000000 three buzz generators and one buzz effect buzz 7 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/simple5.xml0000644042355400116100000001266311576360402014720 00000000000000 one sine-amp combi playing a fast pattern and one sine playing a slow one simple 5 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 120 4 16 buzztard-0.6.0/tests/songs/test-simple1.xml0000644042355400116100000000340111576360402015657 00000000000000 what a lovely tune test simple 1 dark-wave 2005-09-20T22:10:56Z 2005-09-20T22:10:56Z 100 8 16 buzztard-0.6.0/tests/Makefile.am0000644042355400116100000001773611673622514013534 00000000000000## $Id: Makefile.am 3776 2011-12-19 11:51:38Z ensonic $ if BUILD_CHECK_TESTS SUBDIRS = lib ui TESTS_BIN = bt_core bt_ic bt_cmd bt_edit ##TESTS_BIN = bt_core else TESTS_BIN = endif TESTS = \ $(TESTS_BIN) \ bt-cmd-info.sh \ bt-cmd-cli.sh \ bt-edit-cli.sh \ povalid.sh \ xmlvalid.sh # prevent endless loops, this requires bash, see idea in bt-check.c # ulimit -St20; # # adding this can help debug gconfd # GCONF_DEBUG_TRACE_CLIENT=1 # # http://www.cynapses.org/tmp/gcc/malloc_perturb # MALLOC_PERTURB_=$(($RANDOM % 255 + 1)) # # set theme (check which theme is used) # GTK2_RC_FILES=$HOME/.themes/Darkilouche/gtk-2.0/gtkrc # TESTS_ENVIRONMENT = \ CK_DEFAULT_TIMEOUT=20 \ LANG=C \ XDG_CACHE_HOME=$(abs_builddir) \ $(LIBTOOL) --mode=execute if BUILD_CHECK_TESTS noinst_PROGRAMS=$(TESTS_BIN) /tmp/test.wav: gst-launch-0.10 -q audiotestsrc num-buffers=10 ! wavenc ! filesink location=$@ noinst_LTLIBRARIES = libbt-check.la libbt_check_la_LIBADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) -lcheck libbt_check_LDFLAGS = \ $(BT_LDFLAGS) \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs libbt_check_la_SOURCES = \ bt-check.c bt-check.h \ bt-test-application.c bt-test-application.h \ bt-test-plugin.c bt-test-plugin.h \ bt-test-settings.c bt-test-settings.h libbt_check_la_DEPENDENCIES = /tmp/test.wav bt_core_LDADD = \ $(top_builddir)/tests/lib/core/libbtcore-check.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck bt_core_LDFLAGS = \ $(BT_LDFLAGS) \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs bt_core_SOURCES= \ m-bt-core.c bt_ic_LDADD = \ $(top_builddir)/tests/lib/ic/libbtic-check.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck bt_ic_LDFLAGS = \ $(BT_LDFLAGS) \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/ic/.libs bt_ic_SOURCES= \ m-bt-ic.c bt_cmd_LDADD = \ $(top_builddir)/tests/ui/cmd/libbt-cmd-check.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ libbt-check.la $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck bt_cmd_LDFLAGS = \ $(BT_LDFLAGS) \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs bt_cmd_SOURCES= \ m-bt-cmd.c bt_edit_LDADD = \ $(top_builddir)/tests/ui/edit/libbt-edit-check.la \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ libbt-check.la $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) $(LIBM) -lcheck bt_edit_LDFLAGS = \ $(BT_LDFLAGS) \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/core/.libs \ -Wl,--rpath -Wl,$(abs_top_builddir)/src/lib/ic/.libs bt_edit_SOURCES= \ m-bt-edit.c AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DDATADIR=\"$(datadir)\" \ -DTESTSONGDIR=\"$(abs_top_srcdir)/tests/songs\" \ -DG_LOG_DOMAIN=\"buzztard-check\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS)\ @VALGRIND_CFLAGS@ endif songdatadir = $(datadir)/$(PACKAGE)/songs songdata_DATA = \ songs/buzz1.xml \ songs/buzz2.xml \ songs/buzz3.xml \ songs/buzz4.xml \ songs/buzz5.xml \ songs/buzz6.xml \ songs/buzz7.xml \ songs/buzz8.xml \ songs/buzz9.xml \ songs/combi1.xml \ songs/combi2.xml \ songs/combi3.xml \ songs/melo1.xml \ songs/melo2.xml \ songs/melo3.xml \ songs/melo4.xml \ songs/melo5.xml \ songs/melo6.xml noinst_songdata = \ songs/broken1.xml \ songs/broken1.bzt \ songs/broken2.xml \ songs/broken3.xml \ songs/broken4.xml \ songs/example.xml \ songs/samples1.bzt \ songs/samples2.bzt \ songs/simple1.xml \ songs/simple2.xml \ songs/simple3.xml \ songs/simple4.xml \ songs/simple5.xml \ songs/simple6.xml \ songs/simple1.bzt \ songs/simple2.bzt \ songs/simple3.bzt \ songs/simple4.bzt \ songs/simple5.bzt \ songs/test-simple1.xml \ songs/test-simple2.xml \ songs/test-simple3.xml \ songs/test-simple4.xml \ songs/test-simple5.xml EXTRA_DIST = \ $(songdata_DATA) $(noinst_songdata) \ gtkdoccomplete.sh povalid.sh xmlvalid.sh \ bt-cfg.sh.in bt-cmd-info.sh bt-cmd-encode.sh \ bt-cmd-cli.sh bt-edit-cli.sh clean-local: rm -f \ $(top_builddir)/tests/songs/*.txt \ $(top_builddir)/tests/songs/*.ogg \ $(abs_builddir)/buzztard/*.log \ $(top_builddir)/tests/event-sound-cache.tdb.* \ /tmp/test.wav -rmdir $(abs_builddir)/buzztard # run any given test by running make .check %.check: % @$(TESTS_ENVIRONMENT) \ ./$* # gdb any given test by running make .gdb %.gdb: % @CK_FORK=no \ $(TESTS_ENVIRONMENT) \ gdb ./$* # refdbg any given test by running make .refdbg %.refdbg: % @CK_FORK=no \ $(TESTS_ENVIRONMENT) \ refdbg -c "btnum=20 ; logobjs=0 ; $(REFDBG_RULE)" \ ./$* ## todo: check if code has been compiled using --enable-debug ## ##check-local: ## echo "========================================" ## echo "No check based tests will run" ## echo "build with --enable-debug=yes" ## echo "========================================" .PHONY: splint coverage valgrind todo if USE_BCOV ## LD_PRELOAD=../src/lib/core/.libs/libbuzztard-core.so.0.6.0 CK_FORK=no bcov -l../src/lib/core/.libs/libbuzztard-core.so.0.6.0 ./.libs/bt_cmd ## LD_PRELOAD=../src/lib/core/.libs/libbuzztard-core.so CK_FORK=no bcov -l../src/lib/core/.libs/libbuzztard-core.so ./.libs/bt_cmd ## CK_FORK=no bcov -l../src/lib/core/.libs/libbuzztard-core.so ./.libs/bt_cmd coverage:: $(TESTS_BIN) echo "command make check" >.bcovdump.all; \ echo "date "`date` >>.bcovdump.all; \ for i in $^; do \ CK_FORK="no" $(TESTS_ENVIRONMENT) bcov \ -l$(top_builddir)/src/lib/core/.libs/libbuzztard-core.so \ -l$(top_builddir)/src/lib/ic/.libs/libbuzztard-ic.so \ ./$$i; \ if test -f .bcovdump; then \ tail -n +5 ~/temp/.bcovdump >>.bcovdump.all; \ rm -f .bcovdump; \ fi \ done endif if USE_VALGRIND VALPREFIX = \ CK_FORK=no CK_DEFAULT_TIMEOUT=500 \ LANG=C XDG_CACHE_HOME=$(abs_builddir) \ G_SLICE=always-malloc G_DEBUG=gc-friendly \ GLIBCPP_FORCE_NEW=1 GLIBCXX_FORCE_NEW=1 VALDEFAULT = @VALGRIND@/bin/valgrind VALSUPP = @VALGRIND@/lib/valgrind VALSUPPRESSIONDEF = --suppressions=$(VALSUPP)/default.supp VALSUPPRESSIONOWN = --suppressions=$(top_builddir)/buzztard.supp \ --suppressions=$(top_builddir)/gst.supp \ --suppressions=$(top_builddir)/gtk.supp VALSUPPRESSION = $(VALSUPPRESSIONDEF) $(VALSUPPRESSIONOWN) VALOPTIONS = --trace-children=yes --num-callers=30 --read-var-info=yes \ --tool=memcheck --leak-check=full --leak-resolution=high --track-origins=yes VALCMD = $(VALPREFIX) $(VALDEFAULT) $(VALOPTIONS) $(VALSUPPRESSION) # for file in /tmp/bt_core.valgrind.pid*; do grep -q "ERROR SUMMARY: 0 errors from 0 contexts" $file ; if test $? == 0; then rm $file; fi; done # grep -H "ERROR SUMMARY: " /tmp/bt_core.valgrind.pid* | uniq valgrind:: $(TESTS_BIN) for i in $^; do \ rm -rf /tmp/$$i.valgrind.pid*; \ $(VALCMD) --log-file=/tmp/$$i_valgrind.pid%p ./$$i; \ done # valgrind any given test by running make .valgrind %.valgrind: % rm -rf /tmp/$*.valgrind.pid*; \ $(VALCMD) --log-file=/tmp/$*.valgrind.pid%p ./$*; endif splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(buzztard_SOURCES) $(bt_cmd_SOURCES) $(bt_edit_SOURCES) for dir in $(SUBDIRS); do $(MAKE) -C $$dir splint ; done ##find . -name "*.c" -exec grep -A7 -Hn "#ifdef __CHECK_DISABLED__" {}; echo "--" \; ##grep -r -A7 -Hn --include="*.c" --color=auto "#ifdef __CHECK_DISABLED__" . todo:: grep -r -A1 -B6 -Hn --include="*.c" --color=auto "#ifdef __CHECK_DISABLED__" . help:: @echo "make check -- run all checks" @echo "make (test).check -- run the given check once" @echo @echo "make (test).gdb -- start up gdb for the given test" @echo @echo "make valgrind -- valgrind all tests" @echo "make (test).valgrind -- valgrind the given test" @echo @echo "make todo -- check for todos in tests" @echo @echo "BT_CHECKS=\"(testname)\" make (test).check -- run the given testcase only" buzztard-0.6.0/tests/bt-check.h0000644042355400116100000001221211617040711013300 00000000000000/* $Id: bt-check.h 3522 2011-08-05 19:17:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * testing helpers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CHECK_H #define BT_CHECK_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include #include //-- glib/gobject #include #include #include //-- gtk/gdk #include #include //-- gstreamer #include //-- buzztard #include #include "bt-test-application.h" #include "bt-test-plugin.h" #include "bt-test-settings.h" extern gint test_argc; extern gchar **test_argvptr; #ifndef GST_CAT_DEFAULT #define GST_CAT_DEFAULT bt_check_debug #endif #ifndef BT_CHECK GST_DEBUG_CATEGORY_EXTERN(GST_CAT_DEFAULT); #endif //-- wrappers for START_TEST and END_TEST #define CHECK_VERSION (CHECK_MAJOR_VERSION * 10000 + CHECK_MINOR_VERSION * 100 + CHECK_MICRO_VERSION) #if CHECK_VERSION <= 903 #define BT_START_TEST(__testname) \ static void __testname (void)\ {\ GST_DEBUG ("test beg ----------------------------------------------------------------------"); \ tcase_fn_start (""# __testname, __FILE__, __LINE__); #else #define BT_START_TEST(__testname) \ static void __testname (int _i __attribute__((unused)))\ {\ GST_DEBUG ("test beg ----------------------------------------------------------------------"); \ tcase_fn_start (""# __testname, __FILE__, __LINE__); #endif #define BT_END_TEST \ GST_DEBUG ("test end ----------------------------------------------------------------------\n"); \ } /* Hack to allow run-time selection of unit tests to run via the * BT_CHECKS environment variable (test function names, comma-separated) * (borrowed from gstreamer) */ gboolean _bt_check_run_test_func (const gchar * func_name); #if CHECK_VERSION <= 903 static inline void __bt_tcase_add_test (TCase * tc, TFun tf, const char * fname, int signal) { if (_bt_check_run_test_func (fname)) { _tcase_add_test (tc, tf, fname, signal); } } #else #if CHECK_VERSION <= 906 static inline void __bt_tcase_add_test (TCase * tc, TFun tf, const char * fname, int signal, int start, int end) { if (_bt_check_run_test_func (fname)) { _tcase_add_test (tc, tf, fname, signal, start, end); } } #else static inline void __bt_tcase_add_test (TCase * tc, TFun tf, const char * fname, int signal, int allowed_exit_value, int start, int end) { if (_bt_check_run_test_func (fname)) { _tcase_add_test (tc, tf, fname, signal, allowed_exit_value, start, end); } } #endif #endif #define _tcase_add_test __bt_tcase_add_test //-- testing helper methods extern void bt_check_init(void); #define g_object_checked_unref(obj) \ {\ gpointer __objref=obj;\ g_assert(__objref);\ GST_INFO("object %p ->ref_count: %d",__objref,G_OBJECT(__objref)->ref_count);\ g_object_add_weak_pointer(__objref,&__objref);\ g_object_unref(__objref);\ fail_unless(__objref == NULL, NULL);\ } extern void check_init_error_trapp(gchar *method, gchar *test); extern gboolean check_has_error_trapped(void); extern void setup_log(int argc, char **argv); extern void setup_log_capture(void); extern const gchar *check_get_test_song_path(const gchar *name); extern gboolean file_contains_str(gchar *tmp_file_name, gchar *string); extern gboolean check_gobject_properties(GObject *toCheck); extern void check_setup_test_server(void); extern void check_setup_test_display(void); extern void check_shutdown_test_display(void); extern void check_shutdown_test_server(void); enum _BtCheckWidgetScreenshotRegionsMatch { BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NONE = 0, BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_TYPE = (1<<0), BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_NAME = (1<<1), BT_CHECK_WIDGET_SCREENSHOT_REGION_MATCH_LABEL = (1<<2), }; typedef enum _BtCheckWidgetScreenshotRegionsMatch BtCheckWidgetScreenshotRegionsMatch; struct _BtCheckWidgetScreenshotRegions { BtCheckWidgetScreenshotRegionsMatch match; gchar *name; gchar *label; GType type; GtkPositionType pos; }; typedef struct _BtCheckWidgetScreenshotRegions BtCheckWidgetScreenshotRegions; extern void check_make_widget_screenshot(GtkWidget *widget, const gchar *name); extern void check_make_widget_screenshot_with_highlight(GtkWidget *widget, const gchar *name, BtCheckWidgetScreenshotRegions *regions); extern void check_send_key(GtkWidget *widget, guint keyval); #endif /* BT_CHECK_H */ buzztard-0.6.0/tests/bt-test-settings.h0000644042355400116100000000454311576360404015060 00000000000000/* $Id: bt-test-settings.h 2951 2010-08-31 15:23:05Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_TEST_SETTINGS_H #define BT_TEST_SETTINGS_H #include #include #include #define BT_TYPE_TEST_SETTINGS (bt_test_settings_get_type ()) #define BT_TEST_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_TEST_SETTINGS, BtTestSettings)) #define BT_TEST_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_TEST_SETTINGS, BtTestSettingsClass)) #define BT_IS_TEST_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_TEST_SETTINGS)) #define BT_IS_TEST_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_TEST_SETTINGS)) #define BT_TEST_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_TEST_SETTINGS, BtTestSettingsClass)) /* type macros */ typedef struct _BtTestSettings BtTestSettings; typedef struct _BtTestSettingsClass BtTestSettingsClass; typedef struct _BtTestSettingsPrivate BtTestSettingsPrivate; /** * BtTestSettings: * * gconf based implementation object for a buzztard based settings */ struct _BtTestSettings { const BtSettings parent; /*< private >*/ BtTestSettingsPrivate *priv; }; /* structure of the gconf-settings class */ struct _BtTestSettingsClass { const BtSettingsClass parent; }; BtTestSettings *bt_test_settings_new(void); extern void bt_test_settings_set(BtTestSettings * const self, gchar *property_name, gpointer value); GType bt_test_settings_get_type(void) G_GNUC_CONST; #endif // BT_TEST_SETTINGS_H buzztard-0.6.0/tests/m-bt-cmd.c0000644042355400116100000000525711667173331013240 00000000000000/* $Id: m-bt-cmd.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * command line app unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_CHECK #include "bt-check.h" #include "../src/ui/cmd/bt-cmd.h" GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); GST_DEBUG_CATEGORY_EXTERN(bt_core_debug); GST_DEBUG_CATEGORY_EXTERN(bt_cmd_debug); extern Suite *bt_cmd_application_suite(void); gint test_argc=1; gchar test_arg0[]="check_buzzard"; gchar *test_argv[1]; gchar **test_argvptr; /* common setup and teardown code */ void bt_cmd_setup(void) { } void bt_cmd_teardown(void) { GST_INFO("................................................................................"); } /* start the test run */ int main(int argc, char **argv) { int nf; SRunner *sr; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif g_type_init(); setup_log(argc,argv); setup_log_capture(); test_argv[0]=test_arg0; test_argvptr=test_argv; bt_init(&test_argc,&test_argvptr); bt_check_init(); GST_DEBUG_CATEGORY_INIT(bt_cmd_debug, "bt-cmd", 0, "music production environment / command ui"); // set this to e.g. DEBUG to see more from gst in the log gst_debug_set_threshold_for_name("GST_*",GST_LEVEL_WARNING); gst_debug_set_threshold_for_name("bt-*",GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_core_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_cmd_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_check_debug,GST_LEVEL_DEBUG); //g_log_set_always_fatal(g_log_set_always_fatal(G_LOG_FATAL_MASK)|G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL); g_log_set_always_fatal(g_log_set_always_fatal(G_LOG_FATAL_MASK)|G_LOG_LEVEL_CRITICAL); sr=srunner_create(bt_cmd_application_suite()); srunner_run_all(sr,CK_NORMAL); nf=srunner_ntests_failed(sr); srunner_free(sr); bt_deinit(); return(nf==0) ? EXIT_SUCCESS : EXIT_FAILURE; } buzztard-0.6.0/tests/bt-cmd-cli.sh0000754042355400116100000000513311576360404013734 00000000000000#!/bin/sh # $Id: bt-cmd-cli.sh 2918 2010-08-07 21:31:27Z ensonic $ # run buzztard-cmd commandline options . ./bt-cfg.sh # test the output a little echo "testing output" libtool --mode=execute $BUZZTARD_CMD --help | grep >/dev/null -- "--help-bt-core" if [ $? -ne 0 ]; then exit 1; fi libtool --mode=execute $BUZZTARD_CMD --version | grep >/dev/null -- "buzztard-cmd from buzztard" if [ $? -ne 0 ]; then exit 1; fi # here we test that these don't crash echo "testing options" libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --quiet libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=info libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=play libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=convert libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=encode libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=does_not_exist libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --input-file libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --input-file=$TESTSONGDIR libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --output-file libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --output-file=$TESTRESULTDIR # do something real echo "testing scenarios" echo "... play" libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=play --input-file=$TESTSONGDIR/test-simple1.xml libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=play -q --input-file=$TESTSONGDIR/simple1.xml libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=play -q --input-file=$TESTSONGDIR/simple6.xml libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=convert -q --input-file=$TESTSONGDIR/test-simple1.xml --output-file=$TESTRESULTDIR/test-simple1.out.xml echo "... convert" if [ ! -r $TESTRESULTDIR/test-simple1.out.xml ]; then exit 1; fi rm -f $TESTRESULTDIR/test-simple1.out.xml echo "... encode" libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=encode -q --input-file=$TESTSONGDIR/test-simple1.xml --output-file=$TESTRESULTDIR/test-simple1.ogg if [ ! -r $TESTRESULTDIR/test-simple1.ogg ]; then exit 1; fi rm -f $TESTRESULTDIR/test-simple1.ogg libtool --mode=execute $BUZZTARD_CMD >/dev/null 2>&1 --command=encode -q --input-file=$TESTSONGDIR/test-simple1.xml --output-file=$TESTRESULTDIR/test-simple1 if [ ! -r $TESTRESULTDIR/test-simple1.ogg ]; then exit 1; fi rm -f $TESTRESULTDIR/test-simple1.ogg # check what happens when we face a broken setup #GST_PLUGIN_SYSTEM_PATH=/tmp GST_PLUGIN_PATH=/tmp ./src/ui/cmd/buzztard-cmd --command=play --input-file=tests/songs/melo3.xml buzztard-0.6.0/tests/m-bt-ic.c0000644042355400116100000000457411666764274013104 00000000000000/* $Id: m-bt-ic.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * interaction controller library unit tests * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_CHECK #include "bt-check.h" #include "../src/lib/ic/libbuzztard-ic/ic.h" GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); GST_DEBUG_CATEGORY_EXTERN(btic_debug); extern Suite *bt_ic_suite(void); extern Suite *bt_registry_suite(void); gint test_argc=1; gchar test_arg0[]="check_buzzard"; gchar *test_argv[1]; gchar **test_argvptr; /* common setup and teardown code */ void bt_ic_setup(void) { } void bt_ic_teardown(void) { } /* start the test run */ int main(int argc, char **argv) { int nf; SRunner *sr; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif g_type_init(); setup_log(argc,argv); setup_log_capture(); test_argv[0]=test_arg0; test_argvptr=test_argv; btic_init(&test_argc,&test_argvptr); gst_init(NULL,NULL); bt_check_init(); // set this to e.g. DEBUG to see more from gst in the log gst_debug_set_threshold_for_name("GST_*",GST_LEVEL_DEBUG); gst_debug_set_threshold_for_name("bt-*",GST_LEVEL_DEBUG); gst_debug_category_set_threshold(btic_debug,GST_LEVEL_DEBUG); gst_debug_category_set_threshold(bt_check_debug,GST_LEVEL_DEBUG); //g_log_set_always_fatal(g_log_set_always_fatal(G_LOG_FATAL_MASK)|G_LOG_LEVEL_CRITICAL); sr=srunner_create(bt_ic_suite()); srunner_add_suite(sr, bt_registry_suite()); srunner_run_all(sr,CK_NORMAL); nf=srunner_ntests_failed(sr); srunner_free(sr); //g_mem_profile(); return(nf==0) ? EXIT_SUCCESS : EXIT_FAILURE; } buzztard-0.6.0/mkinstalldirs0000754042355400116100000000370411675570446013141 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # 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 case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do 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 # End: # mkinstalldirs ends here buzztard-0.6.0/omf.make0000644042355400116100000000403211576360407011741 00000000000000# # No modifications of this Makefile should be necessary. # # This file contains the build instructions for installing OMF files. It is # generally called from the makefiles for particular formats of documentation. # # Note that you must configure your package with --localstatedir=/var/lib # so that the scrollkeeper-update command below will update the database # in the standard scrollkeeper directory. # # If it is impossible to configure with --localstatedir=/var/lib, then # modify the definition of scrollkeeper_localstate_dir so that # it points to the correct location. Note that you must still use # $(localstatedir) in this or when people build RPMs it will update # the real database on their system instead of the one under RPM_BUILD_ROOT. # # Note: This make file is not incorporated into xmldocs.make because, in # general, there will be other documents install besides XML documents # and the makefiles for these formats should also include this file. # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # omf_dest_dir=$(datadir)/omf/$(docname) scrollkeeper_localstate_dir = $(localstatedir)/scrollkeeper CLEANFILES += *.out omf: omf_timestamp omf_timestamp: $(omffile) -for file in $(omffile); do \ scrollkeeper-preinstall $(docdir)/$(docname).xml $$file $$file.out; \ done touch omf_timestamp install-data-hook-omf: $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir) for file in $(omffile); do \ $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \ done -scrollkeeper-update -p $(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir) uninstall-local-omf: -for file in $(srcdir)/*.omf; do \ basefile=`basename $$file`; \ rm -f $(DESTDIR)$(omf_dest_dir)/$$basefile; \ done -rmdir $(DESTDIR)$(omf_dest_dir) -scrollkeeper-update -p $(scrollkeeper_localstate_dir) buzztard-0.6.0/ChangeLog0000644042355400116100000075467111675570571012125 000000000000002011-12-25 Stefan Sauer * NEWS: Releasing. 2011-12-23 Stefan Sauer * docs/reference/bt-ic/buzztard-ic.types.in: Fix leftover -methods.h file references. 2011-12-22 Stefan Sauer * NEWSLETTER: Collect NEWS. 2011-12-22 Stefan Sauer * src/ui/edit/ruler.c: Experiments with log rulers. 2011-12-20 Stefan Sauer * po/LINGUAS: * po/zh_CN.po: * po/zh_CN.po (added): Add new translation. 2011-12-19 Stefan Sauer * configure.ac: * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: * src/ui/cmd/Makefile.am: * src/ui/dec/Makefile.am: * src/ui/edit/Makefile.am: * tests/Makefile.am: Add LIBM check and link it where needed. 2011-12-14 Stefan Sauer * configure.ac: * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: * src/ui/cmd/Makefile.am: * src/ui/edit/Makefile.am: * tests/Makefile.am: Split BT_LIBS into BT_LDFLAGS and BT_LIBS. Sanitize link order. 2011-12-12 Stefan Sauer * src/lib/core/settings.c: Fix choosing a default audiosink. First we were leaking strings. Next we were copying the feature to the name. Also make the procedure smarter - if the plugin in the settings does not exists or is incompatible, disregard it. This improves the situation that might happen after a distro upgrade. 2011-12-12 Stefan Sauer * tests/lib/core/t-sink-machine.c: Add two more tests. 2011-12-08 Stefan Sauer * src/ui/edit/sequence-view.c: Remove leftover define. 2011-12-08 Stefan Sauer * src/lib/core/song.c: Check the right var in g_return_if_fail(). * src/ui/edit/main-toolbar.c: Stop the playback-pos timer when song is stopped. 2011-12-08 Stefan Sauer * src/ui/edit/machine-properties-dialog.c: Don't unref the weak pointer if the object is gone already. 2011-12-08 Stefan Sauer * src/ui/edit/main-statusbar.c: Check the result, to handle the case where we load a new song while playing and we still get some signal emitted for the old song. 2011-12-08 Stefan Sauer * src/lib/core/pattern.c: Fix the enum blending logic even more. 2011-12-08 Stefan Sauer * src/lib/core/persistence.c: * src/ui/edit/main-page-patterns.c: Support the enum note type. 2011-12-08 Stefan Sauer * src/lib/core/libbuzztard-core/childproxy.h: Whitespace. 2011-12-08 Stefan Sauer * src/lib/ic/control.c: * src/ui/edit/main-page-patterns.c: Use new enums from gst-buzztard. 2011-12-07 Stefan Sauer * src/lib/core/machine.c: Some elements (like ladspa) don't use "src" and "sink" as pad-names. Scanning the pads lists in that case. 2011-12-07 Stefan Sauer * src/ui/edit/pattern-editor.c: Map keypad numbers to regular numbers. 2011-12-07 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-edit/buzztard-edit.types: Add the ruler widget to the docs. * src/ui/edit/Makefile.am: * src/ui/edit/panorama-popup.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/ruler.c: * src/ui/edit/ruler.h: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/volume-popup.c: * src/ui/edit/vruler.c (deleted): * src/ui/edit/vruler.h (deleted): * src/ui/edit/hruler.c (deleted): * src/ui/edit/hruler.h (deleted): Remove the {h,v}ruler front-ends and add _new method to ruler. 2011-12-06 Stefan Sauer * src/ui/edit/ruler.c: * src/ui/edit/ruler.h: Remember backing-store width and height - no need to used deprecated gdk api to fetch it. 2011-12-06 Stefan Sauer * src/ui/edit/ruler.c: Cleanup the drawing code and add more docs. 2011-12-06 Stefan Sauer * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/signal-analysis-dialog.c: Use gtk_widget_add_events instead of calling set+get. 2011-12-06 Stefan Sauer * src/ui/edit/panorama-popup.c: * src/ui/edit/ruler.c: * src/ui/edit/ruler.h: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/volume-popup.c: Add a draw-pos property in our own ruler to get rid of the class method hack. Use the new property to only show the pos-marker in spectrum-view. Clean up the metrics to deal with out unit-range. 2011-12-05 Stefan Sauer * src/ui/edit/sequence-view.c: Improve positioning of the playline to avoid cairo spreading the line over pixel boundaries. Also make invalidation area 1 pixel taller to fix left-over lines when seeking backwards. 2011-12-04 Stefan Sauer * src/ui/cmd/bt-cmd.c: * src/ui/edit/bt-edit.c: * tests/m-bt-cmd.c: * tests/m-bt-core.c: * tests/m-bt-edit.c: * tests/m-bt-ic.c: Enclose deprecated g_thread api in ifdefs. 2011-12-04 Stefan Sauer * design/gobject/gobjectnotify.c: * design/hal/halwatch.c: Update test apps. g_thread_init() is deprecated in glib 2.31 and was already commented out in the examples. 2011-12-04 Stefan Sauer * src/ui/edit/sequence-view.c: Use the right window for the overlay lines. 2011-12-04 Stefan Sauer * src/ui/edit/tools.h: And commit the replacement api. 2011-12-04 Stefan Sauer * src/ui/edit/settings-page-audiodevices.c: Replace more deprecated combo_box test api. 2011-12-04 Stefan Sauer * src/ui/edit/sequence-view.c: Convert from gdk to cairo. 2011-12-04 Stefan Sauer * src/ui/edit/ruler.c: Fix the widgets. 2011-12-04 Stefan Sauer * src/ui/edit/Makefile.am: * src/ui/edit/gtkvumeter.c: * src/ui/edit/hruler.c: * src/ui/edit/hruler.h: * src/ui/edit/panorama-popup.c: * src/ui/edit/ruler.c: * src/ui/edit/ruler.h: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/volume-popup.c: * src/ui/edit/vruler.c: * src/ui/edit/vruler.h: * src/ui/edit/hruler.h (svn:keywords, svn:eol-style): * src/ui/edit/vruler.h (svn:keywords, svn:eol-style): * src/ui/edit/hruler.c (svn:keywords, svn:eol-style): * src/ui/edit/vruler.c (svn:keywords, svn:eol-style): * src/ui/edit/ruler.c (svn:keywords, svn:eol-style): * src/ui/edit/ruler.h (svn:keywords, svn:eol-style): * src/ui/edit/ruler.h (added): * src/ui/edit/vruler.c (added): * src/ui/edit/vruler.h (added): * src/ui/edit/hruler.c (added): * src/ui/edit/hruler.h (added): * src/ui/edit/ruler.c (added): Add a copy of gtk's former ruler widget. 2011-12-04 Stefan Sauer * src/ui/edit/panorama-popup.c: * src/ui/edit/tools.h: My editors save-all is broekn, great. Too more files belonging to the commit two down below. 2011-12-04 Stefan Sauer * src/ui/edit/volume-popup.c: Fix wrong gtk_widget_hide_all() replacement. 2011-12-04 Stefan Sauer * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-window.c: * src/ui/edit/panorama-popup.c: * src/ui/edit/render-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/tools.h: * src/ui/edit/volume-popup.c: Replace more deprecated API (mainly combobox-text). 2011-12-03 Stefan Sauer * configure.ac: Fix deprecation flags. 2011-12-03 Stefan Sauer * src/ui/edit/about-dialog.c: And two more deprecated functions replaced. 2011-12-03 Stefan Sauer * src/ui/edit/about-dialog.c: * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/tip-dialog.c: Remove 3 function that got deprecated without replacement in gtk 2.24. 2011-12-03 Stefan Sauer * po/cs.po: * po/da.po: * po/de.po: * po/fi.po: * po/fr.po: * po/id.po: * po/nl.po: * po/nn.po: * po/vi.po: Update translations from translationproject.org 2011-12-02 Stefan Sauer * NEWSLETTER: Wrote and send newsletter. 2011-12-02 Stefan Sauer * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: * tests/Makefile.am: Fix left over files (make distcheck warnings). 2011-12-01 Stefan Sauer * configure.ac: * docs/reference/bt-ic/Makefile.am: * docs/reference/bt-ic/buzztard-ic-docs.sgml: * docs/reference/bt-ic/buzztard-ic-sections.txt.in: * src/lib/ic/Makefile.am: * docs/reference/bt-ic/buzztard-ic-sections.txt.in (added): * docs/reference/bt-ic/buzztard-ic-sections.txt (deleted): Make doc sections fully conditional. 2011-12-01 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: Doc maintenance. 2011-12-01 Stefan Sauer * po/POTFILES.in: * src/ui/edit/Makefile.am: Fix desktop file handling (again). 2011-12-01 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-sections.txt: Doc maintenance. 2011-12-01 Stefan Sauer * tests/bt-edit-cli.sh: * tests/xmlvalid.sh: Test script cleanups. 2011-12-01 Stefan Sauer * src/lib/core/libbuzztard-core/song.h: Forgot to save the file. This belongs to last commit. 2011-12-01 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/song.c: The xml pipeline stuff is deprecated upstream and removed in 0.11. Its also of limited use, so remove it too. 2011-12-01 Stefan Sauer * src/lib/core/setup.c: Add a ref to a commit that helps us a bit. * tests/lib/core/e-network.c: Split the dynamic linking tests. 2011-11-29 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Small doc update. 2011-11-29 Stefan Sauer * design/gst/dynlink3.c: * design/gst/dynlink3.sh: Add more checks for return values. 2011-11-27 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/wire.c: Fix warnings about droping const. 2011-11-25 Stefan Sauer * design/input/gstinput.c: Make fake input toy more flexible. 2011-11-25 Stefan Sauer * design/gst/dynlink3.c: 0.11 porting. 2011-11-15 Stefan Sauer * design/gst/dynlink3.c: * design/input/gstinput.c: * design/input/uinput.c: * src/lib/core/setup.c: * src/lib/core/sink-bin.c: * design/input/uinput.c (added): * design/input/gstinput.c (added): More examples. 2011-11-08 Stefan Sauer * src/lib/ic/input-device.c: Add a missing cast to avoid reinterpreting the values in a wrong way (caused skips in controller movements). 2011-11-02 Stefan Sauer * design/gst/tonematrix.c: Add tempo and scale controls. 2011-11-02 Stefan Sauer * design/gst/tonematrix.c: More de-crufting. 2011-11-02 Stefan Sauer * design/gst/tonematrix.c: Remove some cruft and add more comments. 2011-11-02 Stefan Sauer * design/gst/tonematrix.c: * design/gst/tonematrix.c (added): Add a toy example. 2011-10-28 Stefan Sauer * src/lib/core/setup.c: More debug logging. 2011-10-28 Stefan Sauer * src/lib/core/setup.c: Refactor updating play_seek_event, remove dead code. 2011-10-26 Stefan Sauer * src/lib/core/song.c: Update comments. 2011-10-26 Stefan Sauer * design/gst/controller.c: * design/gst/dynlink2.c: * design/gst/dynlink3.c: * design/gst/dynlink4.c: * design/gst/dynlink4.sh: * design/gst/seekinit.c: * design/gst/dynlink4.sh (svn:executable): * design/gst/seekinit.c (added): * design/gst/dynlink4.sh (added): * design/gst/dynlink4.c (added): More test apps and cleanups in the others. 2011-10-20 Stefan Sauer * design/gst/dynlink3.sh: * design/gst/dynlink3.sh (svn:executable): * design/gst/dynlink3.sh (added): * design/gst/dynlink2.sh (added): * design/gst/dynlink.sh (deleted): It is easier to have two scripts. 2011-10-20 Stefan Sauer * design/gst/dynlink.sh: * design/gst/dynlink2.c: * design/gst/dynlink3.c: * design/gst/dynlink.sh (added): * design/gst/dynlink3.c (added): * design/gst/dynlink2.sh (deleted): More test code. 2011-10-19 Stefan Sauer * src/lib/core/song.c: * src/ui/edit/signal-analysis-dialog.c: Comments and logging. 2011-10-19 Stefan Sauer * src/lib/core/wire.c: Lower latency. 2011-10-13 Stefan Sauer * src/lib/core/sink-bin.c: Add (commented out) hack to record in realtime. * src/ui/edit/render-progress.c: Actually return the proper code on EOS to not always remove the file. 2011-10-13 Stefan Sauer * src/ui/edit/render-progress.c: Improve error handling. Delete partial output files on error. 2011-10-13 Stefan Sauer * src/lib/core/sink-bin.c: Add a queue in record+play mode to play branch as well. 2011-10-13 Stefan Sauer * src/lib/core/song.c: Also stop if pipeline is not in NULL state. This helps to stop in error cases. 2011-10-13 Stefan Sauer * src/lib/core/machine.c: Ensure unique machine names. * tests/lib/core/t-machine.c: Add a test for renaming failure. 2011-10-13 Stefan Sauer * design/gst/dynlink2.c: Check more return codes. Cleanup the signal watch. Do a seek to kickstart the pipeline. 2011-10-13 Stefan Sauer * design/gst/dynlink2.c: Turn printf into locking. * design/gst/dynlink2.sh: * design/gst/dynlink2.sh (svn:executable): * design/gst/dynlink2.sh (added): Add starter for convenience. 2011-10-13 Stefan Sauer reviewed by: patch by: * design/gst/dynlink2.c: * po/cs.po: * po/da.po: * po/de.po: * po/fi.po: * po/fr.po: * po/id.po: * po/nl.po: * po/nn.po: * po/vi.po: * src/lib/core/setup.c: 2011-10-12 Stefan Sauer * design/gst/dynlink.c: Cleanups. * design/gst/dynlink2.c: * design/gst/dynlink2.c (added): Another test program. 2011-10-07 Stefan Sauer * AUTHORS: * src/ui/edit/about-dialog.c: More translation preps. 2011-10-07 Stefan Sauer * README: Update README. * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/tip-dialog.c: Spell check ui strings. 2011-10-07 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/core.c: * src/lib/core/libbuzztard-core/core.h: * src/lib/core/tools.c: * tests/m-bt-cmd.c: * tests/m-bt-core.c: * tests/m-bt-edit.c: Improve valgrinding experience in the tests by explicitly cleaning up at the end of tests. 2011-10-07 Stefan Sauer * buzztard.supp: Add a test function to the suppressions. 2011-10-07 Stefan Sauer * src/lib/core/setup.c: Cleanup docs and comments. Fix the graph depth for wires. 2011-10-04 Stefan Sauer * src/lib/core/setup.c: Improve pad_block handling. 2011-10-04 Stefan Sauer * src/lib/core/wave.c: Don't leak the pipeline. 2011-10-04 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/wire.c: Add assert to ensure that we don't create existing objects and leak the previous instances. 2011-10-04 Stefan Sauer * tests/lib/core/t-source-machine.c: Fix bogus test. 2011-10-04 Stefan Sauer * NEWSLETTER: Wrote and sent NEWS. * TODO: Update TODO. 2011-10-04 Stefan Sauer * tests/songs/melo5.xml: Also commit song that I forgot to save. 2011-10-04 Stefan Sauer * buzztard.supp: Update the suppression file. 2011-10-04 Stefan Sauer * tests/Makefile.am: * tests/songs/buzz1.xml: * tests/songs/buzz2.xml: * tests/songs/buzz3.xml: * tests/songs/buzz4.xml: * tests/songs/buzz5.xml: * tests/songs/buzz9.xml: * tests/songs/combi1.xml: * tests/songs/combi2.xml: * tests/songs/combi3.xml: * tests/songs/melo2.xml: * tests/songs/melo5.xml: * tests/songs/melo6.xml: * tests/songs/melo6.xml (added): Tune the demo songs a bit. Replace some binary only buzz machines with ported machines. 2011-10-04 Stefan Sauer * src/ui/edit/main-window.c: Don't deref song==NULL. Add a todo comment. 2011-09-29 Stefan Sauer * tests/lib/core/e-song-io-native.c: Don't leak the wavelevel from the test. 2011-09-29 Stefan Sauer * src/lib/core/song.c: Also kill the timeout when stopping the stop. * tests/lib/core/t-network.c: * tests/lib/core/t-song.c: Stop the song in the tests. 2011-09-28 Stefan Sauer * tests/lib/core/e-song-io-native.c: More logging. 2011-09-28 Stefan Sauer * src/lib/core/wire.c: Don't do pad_blocking for deactive wires when add/remove wire- analyzers. Fixes #29 2011-09-28 Stefan Sauer * src/lib/core/setup.c: Disable locking src-pads when removing elements. That is not needed, as we stop the elements anyway and also remove them. 2011-09-26 Stefan Sauer * tests/lib/core/e-song-io-native.c: No need to create an extra test sample. 2011-09-26 Stefan Sauer * src/lib/core/setup.c: A better fix for the lockup in when dynamically editing a song. The locked_state order did not help and eventually made it worse. The key is to not block the pad if it is flushing. 2011-09-23 Stefan Kost * src/lib/core/setup.c: * tests/lib/core/e-network.c: Add more logging. Fix oder of changing the element state and locking to prevent lockup. 2011-09-22 Stefan Sauer * src/ui/edit/main-menu.c: Don't leak recent_info. 2011-09-21 Stefan Sauer * NEWSLETTER: Start writing down what we did this month. * buzztard.supp: Update suppression file. 2011-09-21 Stefan Sauer * src/ui/edit/main-page-sequence.c: * src/ui/edit/sequence-grid-model.c: Don't leak strings in the model and filters. 2011-09-20 Stefan Sauer * src/lib/core/pattern.c: * src/ui/edit/edit-application.c: Some logging cleanup. * tests/Makefile.am: Small valgrind test tweaks. 2011-09-20 Stefan Sauer * src/ui/edit/pattern-list-model.c: Fix leak of pattern ref. 2011-09-20 Stefan Sauer * src/ui/edit/main-window.c: Don't leak "since" string for unsaved-changes warning message. 2011-09-16 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/processor-machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/sink-machine.c: * src/lib/core/song.c: * src/lib/core/source-machine.c: * src/lib/core/wire.c: * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: Unify logging of ref_ct more to easy grepping. 2011-09-16 Stefan Sauer * src/ui/edit/main-pages.c: * src/ui/edit/tools.c: * src/ui/edit/tools.h: Add an env-var that allows us in debug mode to configure a few things in the UI for easier testing. 2011-09-16 Stefan Sauer * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/main-page-sequence.c: Unify logging of ref_ct more to easy grepping. 2011-09-16 Stefan Sauer * src/lib/core/machine.c: Make debugging code more clearly. * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wire-canvas-item.c: Unify logging of ref_ct more to easy grepping. 2011-09-16 Stefan Sauer * src/ui/edit/change-log.c: But also don't use an invalidated filename. 2011-09-16 Stefan Sauer * src/ui/edit/change-log.c: Don't overwrite (and leak) the ptr array. 2011-09-16 Stefan Sauer * src/ui/edit/pattern-editor.c: Chain-up in unrealize() to not leak the gdk_window. 2011-09-16 Stefan Sauer * src/ui/edit/machine-list-model.c: Don't leak pixbufs. 2011-09-15 Stefan Sauer * src/ui/edit/main-menu.c: Use change_log from instance instead of getting a new one. 2011-09-15 Stefan Sauer * src/ui/edit/machine-list-model.c: * src/ui/edit/pattern-list-model.c: Remove weak pointers in dispose. 2011-09-15 Stefan Sauer * src/lib/core/song.c: Also disconnect signal handler on async done. 2011-09-15 Stefan Sauer * src/lib/ic/abs-range-control.c: * src/lib/ic/input-device.c: * src/lib/ic/libbuzztard-ic/abs-range-control.h: Use long for the parameters. Makes valgrind happy on 64 bit too. 2011-09-15 Stefan Sauer * configure.ac: Improve valgrind detection. 2011-09-15 Stefan Sauer * tests/bt-check.c: Raise the memory limmit for the tests from 256Mb to 1Gb. That fixes the tests on 64bit. * tests/m-bt-cmd.c: * tests/m-bt-core.c: * tests/m-bt-edit.c: * tests/m-bt-ic.c: Cleanup the tests. 2011-09-15 Stefan Sauer * docs/help/bt-edit/C/aspell.pws: * docs/help/bt-edit/C/buzztard-edit.xml: Spell check docs. 2011-09-15 Stefan Sauer * src/ui/edit/main-page-info.c: Disconnect on_song_changed in dispose. Fixes the tests even more. 2011-09-15 Stefan Sauer * NEWSLETTER: Sent news. 2011-09-14 Stefan Kost * src/ui/edit/main-page-sequence.c: Disconnect on_song_changed in dispose. Fixes the tests. 2011-09-14 Stefan Kost * po/POTFILES.in: Add new file. 2011-09-07 Stefan Sauer * tests/lib/core/e-sequence.c: Disable a failing test and explain. * tests/m-bt-edit.c: Move g_set_appname() so that we don't call it multiple times when running with fork disabled. 2011-08-31 Stefan Sauer * src/ui/edit/main-page-machines.c: Cache the setup in the instance to avoid lots of lookups. 2011-08-30 Stefan Sauer * src/ui/edit/main-page-machines.c: Implement 'unmute all'. 2011-08-30 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-canvas-item.h: * src/ui/edit/wire-canvas-item.c: Add more properties to make the dialog state trackable. 2011-08-30 Stefan Sauer * src/ui/edit/main-page-patterns.c: Fix newlines in changelog after column edits. 2011-08-30 Stefan Sauer * src/ui/edit/main-page-patterns.c: Undo/redo for wire-params on wire-removal. 2011-08-30 Stefan Sauer * src/ui/edit/main-page-machines.c: No need to log position on removal as we track position now. 2011-08-30 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-page-machines.c: * src/ui/edit/wire-canvas-item.c: * src/ui/edit/wire-canvas-item.h: Undo/Redo for machine property window and wire analyzer window. 2011-08-29 Stefan Sauer * src/ui/edit/main-page-machines.c: Fix ',' -> '.' bug in sources. Dunno how this ever worked. 2011-08-29 Stefan Sauer * src/ui/edit/main-page-machines.c: Prepare to handle more machine/wire state for undo/redo. 2011-08-29 Stefan Sauer * src/ui/edit/sequence-grid-model.c: Log improvements. 2011-08-29 Stefan Sauer * src/lib/core/marshal.list: * src/lib/core/sequence.c: Add track-{added,removed} signals. * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Rework undo redo for machine-removed. After a lot of experiments, leave a big comment in bt_main_page_machines_delete_machine() and explain the troubles. Use signal handler blocking as a solution until we have a better idea. 2011-08-29 Stefan Sauer * src/ui/edit/main-page-patterns.c: Remove new lines in changelog caused by single pattern edits. 2011-08-29 Stefan Sauer patch by: davef1@users.sourceforge.net * src/lib/ic/ic_private.h: Fix the build. 2011-08-27 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Improve user-docs on sequence editing (labels and patterns). * src/ui/edit/main-page-sequence.c: Expand sequence on edit (like we did for labels). 2011-08-27 Stefan Sauer * docs/reference/bt-core/Makefile.am: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/lib/core/libbuzztard-core/childproxy.h: * src/lib/core/libbuzztard-core/core.h: * src/lib/core/libbuzztard-core/machine.h: * src/lib/core/libbuzztard-core/persistence.h: * src/lib/core/libbuzztard-core/version.h.in: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/settings.c: * src/lib/core/setup.c: * src/lib/core/song-info.c: * src/lib/core/song.c: * src/lib/core/wire-pattern.c: * src/ui/edit/change-log.c: * src/ui/edit/change-logger.c: * src/ui/edit/machine-list-model.c: * src/ui/edit/main-page-info.c: * src/ui/edit/object-list-model.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-list-model.c: * src/ui/edit/sequence-grid-model.c: Improve and fix API docs. 2011-08-26 Stefan Sauer * src/ui/edit/Makefile.am: * src/ui/edit/about-dialog.h: * src/ui/edit/bt-edit.h: * src/ui/edit/change-log.h: * src/ui/edit/change-logger.h: * src/ui/edit/crash-recover-dialog.h: * src/ui/edit/edit-application.h: * src/ui/edit/interaction-controller-learn-dialog.h: * src/ui/edit/interaction-controller-menu.h: * src/ui/edit/machine-canvas-item.h: * src/ui/edit/machine-list-model.h: * src/ui/edit/machine-menu.h: * src/ui/edit/machine-preferences-dialog.h: * src/ui/edit/machine-preset-properties-dialog.h: * src/ui/edit/machine-properties-dialog.h: * src/ui/edit/machine-rename-dialog.h: * src/ui/edit/main-menu.h: * src/ui/edit/main-page-info.h: * src/ui/edit/main-page-machines.h: * src/ui/edit/main-page-patterns.h: * src/ui/edit/main-page-sequence.h: * src/ui/edit/main-page-waves.h: * src/ui/edit/main-pages.h: * src/ui/edit/main-statusbar.h: * src/ui/edit/main-toolbar.h: * src/ui/edit/main-window.h: * src/ui/edit/missing-framework-elements-dialog.h: * src/ui/edit/missing-song-elements-dialog.h: * src/ui/edit/object-list-model.h: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-list-model.h: * src/ui/edit/pattern-properties-dialog.h: * src/ui/edit/playback-controller-socket.h: * src/ui/edit/render-dialog.h: * src/ui/edit/render-progress.h: * src/ui/edit/sequence-grid-model.h: * src/ui/edit/sequence-view.h: * src/ui/edit/settings-dialog.h: * src/ui/edit/settings-page-audiodevices.h: * src/ui/edit/settings-page-directories.h: * src/ui/edit/settings-page-interaction-controller.h: * src/ui/edit/settings-page-playback-controller.h: * src/ui/edit/settings-page-shortcuts.h: * src/ui/edit/signal-analysis-dialog.h: * src/ui/edit/tip-dialog.h: * src/ui/edit/ui-resources.h: * src/ui/edit/wire-canvas-item.h: * src/ui/edit/machine-preset-properties-dialog-methods.h (deleted): * src/ui/edit/interaction-controller-learn-dialog-methods.h (deleted): * src/ui/edit/machine-preferences-dialog-methods.h (deleted): * src/ui/edit/machine-menu-methods.h (deleted): * src/ui/edit/settings-page-directories-methods.h (deleted): * src/ui/edit/tip-dialog-methods.h (deleted): * src/ui/edit/about-dialog-methods.h (deleted): * src/ui/edit/machine-list-model-methods.h (deleted): * src/ui/edit/wire-canvas-item-methods.h (deleted): * src/ui/edit/settings-page-audiodevices-methods.h (deleted): * src/ui/edit/render-dialog-methods.h (deleted): * src/ui/edit/sequence-view-methods.h (deleted): * src/ui/edit/render-progress-methods.h (deleted): * src/ui/edit/main-menu-methods.h (deleted): * src/ui/edit/settings-dialog-methods.h (deleted): * src/ui/edit/interaction-controller-menu-methods.h (deleted): * src/ui/edit/pattern-properties-dialog-methods.h (deleted): * src/ui/edit/settings-page-playback-controller-methods.h (deleted): * src/ui/edit/main-pages-methods.h (deleted): * src/ui/edit/main-page-machines-methods.h (deleted): * src/ui/edit/missing-song-elements-dialog-methods.h (deleted): * src/ui/edit/main-window-methods.h (deleted): * src/ui/edit/main-page-sequence-methods.h (deleted): * src/ui/edit/settings-page-interaction-controller-methods.h (deleted): * src/ui/edit/machine-canvas-item-methods.h (deleted): * src/ui/edit/sequence-grid-model-methods.h (deleted): * src/ui/edit/signal-analysis-dialog-methods.h (deleted): * src/ui/edit/playback-controller-socket-methods.h (deleted): * src/ui/edit/change-logger-methods.h (deleted): * src/ui/edit/change-log-methods.h (deleted): * src/ui/edit/machine-rename-dialog-methods.h (deleted): * src/ui/edit/pattern-list-model-methods.h (deleted): * src/ui/edit/edit-application-methods.h (deleted): * src/ui/edit/main-statusbar-methods.h (deleted): * src/ui/edit/main-page-patterns-methods.h (deleted): * src/ui/edit/missing-framework-elements-dialog-methods.h (deleted): * src/ui/edit/main-page-waves-methods.h (deleted): * src/ui/edit/main-toolbar-methods.h (deleted): * src/ui/edit/machine-properties-dialog-methods.h (deleted): * src/ui/edit/crash-recover-dialog-methods.h (deleted): * src/ui/edit/settings-page-shortcuts-methods.h (deleted): * src/ui/edit/object-list-model-methods.h (deleted): * src/ui/edit/ui-resources-methods.h (deleted): * src/ui/edit/main-page-info-methods.h (deleted): Get rid of extra header files (part 4). 2011-08-26 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: Sort entries. * docs/reference/bt-core/buzztard-core.types.in: Add missing class. 2011-08-26 Stefan Sauer * src/lib/ic/libbuzztard-ic/abs-range-control.h: * src/lib/ic/libbuzztard-ic/control.h: * src/lib/ic/libbuzztard-ic/device.h: * src/lib/ic/libbuzztard-ic/gudev-discoverer.h: * src/lib/ic/libbuzztard-ic/hal-discoverer.h: * src/lib/ic/libbuzztard-ic/ic.h: * src/lib/ic/libbuzztard-ic/input-device.h: * src/lib/ic/libbuzztard-ic/midi-device.h: * src/lib/ic/libbuzztard-ic/registry.h: * src/lib/ic/libbuzztard-ic/trigger-control.h: Remove some less helpful comments. 2011-08-26 Stefan Sauer * src/lib/core/libbuzztard-core/song-io-native.h: Re-add extern in one place. * src/ui/cmd/bt-cmd.h: Add missing include change from last commit. 2011-08-26 Stefan Sauer * src/ui/cmd/Makefile.am: * src/ui/cmd/cmd-application.h: * src/ui/cmd/cmd-application-methods.h (deleted): Get rid of extra header files (part 3). 2011-08-26 Stefan Sauer * docs/reference/bt-core/Makefile.am: Skip one more header. 2011-08-26 Stefan Sauer * src/lib/core/Makefile.am: * src/lib/core/libbuzztard-core/Makefile.am: * src/lib/core/libbuzztard-core/application.h: * src/lib/core/libbuzztard-core/childproxy.h: * src/lib/core/libbuzztard-core/core.h: * src/lib/core/libbuzztard-core/gconf-settings.h: * src/lib/core/libbuzztard-core/machine.h: * src/lib/core/libbuzztard-core/pattern.h: * src/lib/core/libbuzztard-core/persistence.h: * src/lib/core/libbuzztard-core/plainfile-settings.h: * src/lib/core/libbuzztard-core/processor-machine.h: * src/lib/core/libbuzztard-core/sequence.h: * src/lib/core/libbuzztard-core/settings.h: * src/lib/core/libbuzztard-core/setup.h: * src/lib/core/libbuzztard-core/sink-machine.h: * src/lib/core/libbuzztard-core/song-info.h: * src/lib/core/libbuzztard-core/song-io-native-bzt.h: * src/lib/core/libbuzztard-core/song-io-native-xml.h: * src/lib/core/libbuzztard-core/song-io-native.h: * src/lib/core/libbuzztard-core/song-io.h: * src/lib/core/libbuzztard-core/song.h: * src/lib/core/libbuzztard-core/source-machine.h: * src/lib/core/libbuzztard-core/wave.h: * src/lib/core/libbuzztard-core/wavelevel.h: * src/lib/core/libbuzztard-core/wavetable.h: * src/lib/core/libbuzztard-core/wire-pattern.h: * src/lib/core/libbuzztard-core/wire.h: * src/lib/core/libbuzztard-core/gconf-settings-methods.h (deleted): * src/lib/core/libbuzztard-core/wavelevel-methods.h (deleted): * src/lib/core/libbuzztard-core/song-io-native-xml-methods.h (deleted): * src/lib/core/libbuzztard-core/song-io-native-methods.h (deleted): * src/lib/core/libbuzztard-core/settings-methods.h (deleted): * src/lib/core/libbuzztard-core/plainfile-settings-methods.h (deleted): * src/lib/core/libbuzztard-core/wave-methods.h (deleted): * src/lib/core/libbuzztard-core/application-methods.h (deleted): * src/lib/core/libbuzztard-core/song-methods.h (deleted): * src/lib/core/libbuzztard-core/wire-methods.h (deleted): * src/lib/core/libbuzztard-core/sink-machine-methods.h (deleted): * src/lib/core/libbuzztard-core/sequence-methods.h (deleted): * src/lib/core/libbuzztard-core/wavetable-methods.h (deleted): * src/lib/core/libbuzztard-core/song-io-methods.h (deleted): * src/lib/core/libbuzztard-core/pattern-methods.h (deleted): * src/lib/core/libbuzztard-core/song-io-native-bzt-methods.h (deleted): * src/lib/core/libbuzztard-core/song-info-methods.h (deleted): * src/lib/core/libbuzztard-core/setup-methods.h (deleted): * src/lib/core/libbuzztard-core/source-machine-methods.h (deleted): * src/lib/core/libbuzztard-core/machine-methods.h (deleted): * src/lib/core/libbuzztard-core/sink-bin-methods.h (deleted): * src/lib/core/libbuzztard-core/processor-machine-methods.h (deleted): * src/lib/core/libbuzztard-core/wire-pattern-methods.h (deleted): * src/lib/core/libbuzztard-core/persistence-methods.h (deleted): * src/lib/core/libbuzztard-core/childproxy-methods.h (deleted): Get rid of extra header files (part 2). 2011-08-25 Stefan Sauer * src/lib/ic/Makefile.am: * src/lib/ic/libbuzztard-ic/Makefile.am: * src/lib/ic/libbuzztard-ic/abs-range-control.h: * src/lib/ic/libbuzztard-ic/device.h: * src/lib/ic/libbuzztard-ic/gudev-discoverer.h: * src/lib/ic/libbuzztard-ic/hal-discoverer.h: * src/lib/ic/libbuzztard-ic/ic.h: * src/lib/ic/libbuzztard-ic/input-device.h: * src/lib/ic/libbuzztard-ic/learn.h: * src/lib/ic/libbuzztard-ic/midi-device.h: * src/lib/ic/libbuzztard-ic/registry.h: * src/lib/ic/libbuzztard-ic/trigger-control.h: * src/lib/ic/libbuzztard-ic/input-device-methods.h (deleted): * src/lib/ic/libbuzztard-ic/device-methods.h (deleted): * src/lib/ic/libbuzztard-ic/learn-methods.h (deleted): * src/lib/ic/libbuzztard-ic/hal-discoverer-methods.h (deleted): * src/lib/ic/libbuzztard-ic/registry-methods.h (deleted): * src/lib/ic/libbuzztard-ic/abs-range-control-methods.h (deleted): * src/lib/ic/libbuzztard-ic/gudev-discoverer-methods.h (deleted): * src/lib/ic/libbuzztard-ic/midi-device-methods.h (deleted): * src/lib/ic/libbuzztard-ic/control-methods.h (deleted): * src/lib/ic/libbuzztard-ic/trigger-control-methods.h (deleted): Get rid of extra header files (part 1). 2011-08-25 Stefan Sauer * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-ic/Makefile.am: * src/ui/edit/edit-application.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/sequence-grid-model.h: Update API docs. 2011-08-25 Stefan Sauer * src/ui/edit/main-page-info.c: Clamp beat and tpb values to the paramspec bounds. 2011-08-25 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Explain extra sequence header combo boxes. 2011-08-24 Stefan Sauer * src/lib/core/song-info.c: Improve description. 2011-08-24 Stefan Sauer * src/ui/edit/main-page-sequence.c: * src/ui/edit/sequence-grid-model.c: * src/ui/edit/sequence-grid-model.h: Add a beats position format. 2011-08-24 Stefan Sauer * src/lib/core/sequence.c: Add comments. Remove commented out code. 2011-08-24 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Document the pos-format and label switcher header columns. 2011-08-24 Stefan Sauer * src/ui/edit/main-page-sequence.c: Fix sequence length updates. Before the cursor could get stuck at the end and not be able to expand. 2011-08-24 Stefan Sauer * src/ui/edit/pattern-list-model.c: Fix null ptr access. 2011-08-24 Stefan Sauer * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Fix GValue type for flip operation. 2011-08-24 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Mention note-off key (1) in manual. 2011-08-23 Stefan Sauer * src/ui/edit/btmemoryaudiosrc.c: Remove "samplesperbuffer" property - not used. * src/ui/edit/machine-preferences-dialog.c: No more need to supress "samplesperbuffer" properties. 2011-08-22 Stefan Sauer * src/ui/edit/machine-preferences-dialog.c: Update the skip_property filter to hide more stuff from base classes and interfaces. 2011-08-22 Stefan Sauer * src/lib/core/sink-bin.c: * src/ui/edit/main-toolbar.c: Fix master-volume synch between toolbar and master properties window. Spotted by waffel. 2011-08-22 Stefan Sauer * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: Also set the tooltips on the label. 2011-08-21 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/song-methods.h: * src/lib/core/song-io.c: * src/lib/core/song.c: * src/ui/edit/change-log.c: * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/render-progress.c: * tests/lib/core/e-song.c: * tests/ui/edit/e-bt-edit-application.c: Big refactoring moving the unsaved state out of the core library to the application. This avoids such state tracking in the library, which might need to be done differently for different apps. 2011-08-21 Stefan Sauer * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/ui/edit/main-page-waves.c: Move flagging wave related changes to UI. Flag more changes to be able to save afterwards. Add notes for undo/redo. Avoid signal loops. Fixes bug #21. 2011-08-21 Stefan Sauer * src/ui/edit/main-page-info.c: Small todo planning update. 2011-08-21 Stefan Sauer * src/ui/edit/main-page-info.c: Store song_info in instance to avoid lookup for each edit. * src/ui/edit/main-page-sequence.c: May on song_change code more robust for sequence ref in instance. 2011-08-21 Stefan Sauer * src/lib/core/song-info.c: * src/ui/edit/main-page-info.c: Move flagging info fields to the UI. 2011-08-21 Stefan Sauer * src/lib/core/sequence.c: * src/ui/edit/main-toolbar.c: Move flagging loop related changes to the UI. 2011-08-21 Stefan Sauer * src/lib/core/machine.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: Move flagging machine::state changes to the UI. 2011-08-21 Stefan Sauer * src/ui/edit/main-window.c: Only warn about unsaved songs when having things in the undo/redo stack. 2011-08-21 Stefan Sauer * src/ui/edit/main-page-patterns.c: Fix NULL ptr access when removing last pattern for a machine. 2011-08-21 Stefan Sauer * src/ui/edit/main-page-machines.c: Fix grouping of undo/redo for new machines. 2011-08-21 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/wire-pattern.c: Remove more song_set_set_unsaved() calls. 2011-08-21 Stefan Sauer * NEWSLETTER: * TODO: Collect NEWS. More planning comments. 2011-08-21 Stefan Sauer * src/ui/edit/main-page-sequence.c: Take new grid-model into use. 2011-08-21 Stefan Sauer * src/lib/core/sequence.c: Add a rows-changed signal to notify of edits. * src/ui/edit/main-page-sequence.c: #ifdef out more of the refreshing code. * src/ui/edit/sequence-grid-model.c: Use the new signal. 2011-08-20 Stefan Sauer * ChangeLog-0.1: * ChangeLog-0.2: * ChangeLog-0.3: * ChangeLog-0.4: * ChangeLog-0.5: * ChangeLog-0.1 (added): * ChangeLog-0.2 (added): * ChangeLog-0.3 (added): * ChangeLog-0.4 (added): * ChangeLog-0.5 (added): Split ChangeLog 2011-08-20 Stefan Sauer * src/ui/edit/main-page-sequence.c: Add more #ifdefs for list_store access. 2011-08-20 Stefan Sauer * src/ui/edit/sequence-grid-model.c: Handle pattern=NULL when updating after pattern renames. 2011-08-20 Stefan Sauer * src/ui/edit/tip-dialog.c: Add the missing ',' for tips entries. 2011-08-20 Stefan Sauer * src/ui/edit/tip-dialog.c: Add more tips. 2011-08-20 Stefan Sauer * src/ui/edit/main-page-patterns.c: Remember machine and pattern when saving a song. 2011-08-20 Stefan Sauer * src/lib/core/machine.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-page-machines.c: Undo/redo for renaming the machine. Also be more cautios on flagging the song as dirty on canvas scroll events. 2011-08-20 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-machines-methods.h: * src/ui/edit/main-page-machines.c: Move the machine-rename dialog handling to mchine page for undo/redo handling. 2011-08-19 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: A convenience method for marking the song as dirty. Avoids getting the song first and help us to later move the flag. * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-sequence.c: Call the new method. 2011-08-19 Stefan Sauer * src/lib/core/song.c: * src/ui/edit/change-logger.h: Add more comments, docs and planning. 2011-08-19 Stefan Sauer * src/lib/core/pattern.c: Don't mark the song as dirty here anymore (more such changes needed). * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: Merge the song::unsaved + change-log::can-undo. This way we can and a change and the song is clean again. 2011-08-19 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-edit/buzztard-edit.types: * docs/reference/bt-ic/buzztard-ic-sections.txt: * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: * src/lib/ic/learn.c: * src/ui/edit/btmemoryaudiosrc.h: * src/ui/edit/change-logger.h: * src/ui/edit/edit-application-methods.h: Update the API docs. 2011-08-19 Stefan Sauer * src/ui/edit/main-page-patterns.c: Don't chomp undo/redo strings as the whitespace matters. 2011-08-18 Stefan Sauer * src/ui/edit/pattern-editor.c: Add a ',' to font-names to make sure the last word is not tried to be interpreted as size. 2011-08-16 Stefan Sauer * src/ui/edit/main-page-sequence.c: Small rename for consistency. 2011-08-16 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/setup.c: Fix property description. * src/lib/core/sequence.c: Add a properties hashtable to sequence as well. * src/ui/edit/main-page-machines.c: Add todo. * src/ui/edit/main-page-sequence.c: Remember step-filter and position-format with song. 2011-08-16 Stefan Sauer * src/ui/edit/change-log.c: Add more todo/design comments. 2011-08-16 Stefan Sauer * src/lib/ic/input-device.c: Fix two "variable set but not used [-Werror=unused-but-set-variable]" warnings. 2011-08-16 Stefan Sauer * src/lib/core/sequence.c: TODO comments. * src/ui/edit/main-page-sequence.c: * src/ui/edit/sequence-grid-model.c: Improvements on the grid-model use. Replace extra label-menu-model with a filtered model on the sequence-{list-store,grid-model}. Split refresh code into model and view (column) refresh. 2011-08-11 Stefan Sauer * src/ui/edit/main-page-machines.c: Emit position-changed signal after undo of machine movement to update the wire-line. Fixes #6 2011-08-11 Stefan Sauer * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: Fix synchronisation of mute/solo/bypass state between machine and sequence view. 2011-08-11 Stefan Sauer * src/lib/core/machine.c: Assume state=NORMAL if not present. Don't parse NULL and crash. 2011-08-11 Stefan Sauer * src/lib/core/machine.c: Save machine state with song. Fixes #14. 2011-08-10 Stefan Sauer * src/ui/edit/machine-properties-dialog.c: Remember the state of the preset-pane. Fixes #8. 2011-08-10 Stefan Sauer * src/ui/edit/main-page-patterns.c: Track base-octave settings per machine and also save with the song. Fixes #16. 2011-08-10 Stefan Sauer * src/ui/edit/Makefile.am: Add missing makefile changes from last commit. * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-shortcuts.c: More planning. 2011-08-10 Stefan Sauer * src/ui/edit/bt-edit.h: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-shortcuts-methods.h: * src/ui/edit/settings-page-shortcuts.c: * src/ui/edit/settings-page-shortcuts.h: * src/ui/edit/settings-page-shortcuts.c (added): * src/ui/edit/settings-page-shortcuts.h (added): * src/ui/edit/settings-page-shortcuts-methods.h (added): Add empty settings page for planning. 2011-08-10 Stefan Sauer * src/ui/edit/settings-page-directories.c: Remove some left-overs from copying that file. 2011-08-09 Stefan Sauer * src/lib/ic/device.c: * src/lib/ic/gudev-discoverer.c: Swap the name-lookup order. Otherwise we seem to end up with two variants of names. * src/lib/ic/learn.c: Fix typo in log message * src/ui/edit/interaction-controller-menu.c: Ensure we don't register signal handler twice. 2011-08-09 Stefan Sauer * src/ui/edit/main-window.c: * tests/bt-check.c: Comments. 2011-08-09 Stefan Sauer * src/ui/edit/main-page-machines.c: * src/ui/edit/ui-resources.c: More logging for startup time analysis. 2011-08-09 Stefan Sauer * src/ui/edit/interaction-controller-menu.c: Also update menu when we plug/unplug devices. 2011-08-09 Stefan Sauer * src/ui/edit/interaction-controller-menu.c: Switch menu insensitive if we don't have controllers. Also don't create and add an empty submenu in that case. 2011-08-09 Stefan Sauer * src/lib/ic/gudev-discoverer.c: * src/lib/ic/input-device.c: Add a access check to skip device-nodes we can't read from earlier. Tweak logging and comments. 2011-08-09 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/settings.c: * src/lib/core/tools.c: * src/ui/edit/machine-menu.c: * src/ui/edit/settings-page-audiodevices.c: Add a variant of the registry filter helper that gives us a list of factories instead of factory names. We need the factories anyway for further filtering and this way avoid the lookups. 2011-08-09 Stefan Sauer * src/ui/edit/main-page-sequence.c: * src/ui/edit/sequence-grid-model.c: Improve the sequence grid model and take it conditionally into use (off by default). 2011-08-07 Stefan Sauer * design/gui/initfocus.c: * design/gui/initfocus.c (added): Small focus test program. 2011-08-07 Stefan Sauer * src/ui/edit/machine-properties-dialog.c: Set focus on the first parameter, when we show the window. 2011-08-05 Stefan Sauer * src/ui/edit/main-page-sequence.c: * src/ui/edit/sequence-grid-model.c: Prepare using the new sequence grid model. 2011-08-05 Stefan Sauer * src/ui/edit/main-page-sequence.c: Remove fetching and releasing the song here (not used). 2011-08-05 Stefan Sauer * tests/bt-check.c: * tests/bt-check.h: * tests/ui/edit/e-bt-edit-application.c: Improve the screenshot code. We now have match flags and also can match by containing label widgets. Also refactor the code more and add drop-shadow generation. No need to run external scripts anymore. 2011-08-04 Stefan Sauer * tests/bt-check.c: * tests/bt-check.h: * tests/ui/edit/e-bt-edit-application.c: Cleanup the screenshot implementation and add a first version of annotated screenshots. 2011-08-04 Stefan Sauer * src/lib/ic/gudev-discoverer.c: Logging cleanup. 2011-08-04 Stefan Sauer * configure.ac: Add more more optional dependency, that people would probably still rather have than miss. 2011-08-03 Stefan Sauer * src/lib/ic/midi-device.c: Logging cleanup. 2011-08-03 Stefan Sauer * configure.ac: Show if we are going to run the tests using Xvfb. 2011-08-02 Stefan Sauer * NEWSLETTER: Sent NEWS. 2011-08-02 Stefan Sauer * docs/reference/bt-cmd/tmpl/.cvsignore (deleted): * docs/reference/bt-edit/tmpl/.cvsignore (deleted): * docs/reference/bt-core/tmpl/.cvsignore (deleted): * docs/reference/bt-ic/tmpl/.cvsignore (deleted): Remove more files we don't need anymore. 2011-08-02 Stefan Sauer * docs/reference/bt-cmd/tmpl/_dummy.sgml (deleted): * docs/reference/bt-edit/tmpl/_dummy.sgml (deleted): * docs/reference/bt-core/tmpl/_dummy.sgml (deleted): * docs/reference/bt-ic/tmpl/_dummy.sgml (deleted): Remove files we don't need anymore. 2011-08-01 Stefan Sauer * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/pattern-properties-dialog.c: Use api from gtk-2.20 if we have it. 2011-08-01 Stefan Sauer * src/ui/edit/interaction-controller-learn-dialog.c: Make okay insensitive unless we have detected a control. Add a label telling people what to do. 2011-08-01 Stefan Sauer * src/lib/ic/learn.c: Change the device name in *all* the places where it matters. 2011-08-01 Stefan Sauer * src/lib/ic/learn.c: Fix the mkdir call for creating the controller-maps dir. Improve the file naming by chopping off the protocol prefix. 2011-08-01 Stefan Sauer reviewed by: patch by: * NEWSLETTER: * src/lib/core/sink-bin.c: * src/lib/ic/learn.c: 2011-08-01 Stefan Sauer * TODO: * src/ui/edit/change-log.c: Undo/redo documentation updates. * src/ui/edit/main-page-patterns.c: Implement voice add/remove. * src/ui/edit/main-page-sequence.c: Undo/redo planning. 2011-08-01 Stefan Sauer * docs/reference/bt-ic/buzztard-ic-sections.txt: * src/lib/ic/abs-range-control.c: * src/lib/ic/control.c: * src/lib/ic/device.c: * src/lib/ic/input-device.c: * src/lib/ic/learn.c: * src/lib/ic/libbuzztard-ic/abs-range-control-methods.h: * src/lib/ic/libbuzztard-ic/device-methods.h: * src/lib/ic/libbuzztard-ic/learn-methods.h: * src/lib/ic/libbuzztard-ic/trigger-control-methods.h: * src/lib/ic/midi-device.c: * src/lib/ic/trigger-control.c: Implement cache for learned controls. Refactor the code base to have the controller hashtables in the device base-class. 2011-07-28 Stefan Sauer * src/lib/core/song.c: Reset song-info:change-dts on first change to unsaved. This fixes us showing huge timespan of unsaved edits when loading a song and changing it. 2011-07-28 Stefan Sauer * TODO: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Collect remaining undo/redo tasks. 2011-07-27 Stefan Sauer * src/ui/edit/machine-list-model.c: Disconnect signal handlers when destroying model. 2011-07-27 Stefan Sauer * src/ui/edit/machine-list-model.c: Fix the comparison, return values are not -1,0,1, but <=> 0 2011-07-27 Stefan Sauer * src/ui/edit/machine-list-model.c: * src/ui/edit/pattern-list-model.c: Add more logging. 2011-07-27 Stefan Sauer * src/ui/edit/pattern-list-model.c: Fix a NULL ptr deref. 2011-07-25 Stefan Sauer * src/lib/core/song.c: Commenting and downgrade some logging again. 2011-07-25 Stefan Sauer * TODO: * src/lib/core/sink-bin.c: * src/ui/edit/settings-page-audiodevices.c: Planning. 2011-07-25 Stefan Sauer * src/ui/edit/main-page-patterns.c: Use correct type to fix a crash on 64bit. 2011-07-24 Stefan Sauer * design/gst/loop2.c: * design/gst/loop3.c: * design/gst/loop3.c (added): Improve the tests. We're getting closer. 2011-07-22 Stefan Sauer * docs/reference/bt-cmd/buzztard-cmd-docs.sgml: * docs/reference/bt-core/buzztard-core-docs.sgml: * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-ic/buzztard-ic-docs.sgml: Update the introduction. 2011-07-21 Stefan Sauer * src/lib/core/tools.c: Make the element check a bit safer. 2011-07-18 Stefan Sauer * design/gst/loop2.c: Add comments. * src/lib/core/sink-bin.c: Put some ifdef'ed testing code back. 2011-07-18 Stefan Sauer * src/ui/edit/main-toolbar.c: Tune the scrubbing values a bit and add a define for the max-rate. 2011-07-18 Stefan Sauer * src/ui/edit/settings-page-audiodevices.c: And also hide sinks with RANK_NONE (e.g. hides apexsink). 2011-07-18 Stefan Kost * src/ui/edit/settings-page-audiodevices.c: Hide sinks not derived from BaseAudioSink (e.g. hides sfsink). 2011-07-18 Stefan Kost * design/gst/loop2.c: Add more notes to the test. * src/lib/core/sink-bin.c: Add/update some comments. 2011-07-16 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/sequence-grid-model-methods.h: * src/ui/edit/sequence-grid-model.c: * src/ui/edit/sequence-grid-model.h: * src/ui/edit/sequence-grid-model-methods.h (added): * src/ui/edit/sequence-grid-model.c (added): * src/ui/edit/sequence-grid-model.h (added): Add start of new data model. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-sequence.c: Remove unused variable. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-sequence.c: Fix typo in log. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-sequence.c: Take out log to warning changes that are only meant to be temporal. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-patterns.c: Added comment with idea about the remaining undo/redo issue. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-patterns.c: Remove unneeded updates. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-patterns.c: Added some logging to check for double updates. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-patterns.c: Update selected item in pattern-menu on model changes. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-patterns.c: We need to make a copy of the treepath when changing it. 2011-07-11 Stefan Sauer * src/ui/edit/main-page-machines.c: Update comments. 2011-07-11 Stefan Sauer * src/lib/core/sequence.c: Swap an _unref with an _unuse. 2011-07-11 Stefan Sauer * src/lib/ic/learn.c: * src/ui/edit/settings-page-playback-controller.c: Planning. 2011-07-09 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Small doc update for machine section. 2011-07-09 Stefan Sauer * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-patterns.c: Remove obsolete warning dialogs (as we now have undo/redo). 2011-07-09 Stefan Sauer * src/lib/core/sequence.c: Remove listening for pattern removal. We'll have to handle that from the app. * src/ui/edit/main-page-sequence.c: Update the sequence on pattern removal. 2011-07-08 Stefan Sauer * src/ui/edit/main-page-sequence.c: Implemented the undo/redo for pattern removal and added a comment, why its not effective. 2011-07-08 Stefan Sauer * design/gst/loop2.c: Make the example more complex, still we can't demo the issue here. 2011-07-08 Stefan Sauer * docs/help/bt-edit/C/buzztard-edit.xml: Fix xml validity warnings. 2011-07-08 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: Add a new method for iterating patterns of a track. 2011-07-08 Stefan Sauer * design/gobject/gsignalorder.c: * design/gst/loop2.c: * design/gobject/gsignalorder.c (added): * design/gst/loop2.c (added): Add test code. 2011-07-08 Stefan Sauer * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: Allow to iterate the tracks, by passing a start position. * src/ui/edit/main-page-sequence.c: Use new method. Sketch out pattern-remove undo/redo. 2011-07-08 Stefan Sauer * src/ui/edit/main-page-machines.c: Comment update. 2011-07-08 Stefan Sauer * src/ui/edit/change-log.c: Improve api docs. 2011-07-08 Stefan Sauer * src/lib/ic/learn.c: Planning. 2011-07-08 Stefan Sauer * src/lib/core/pattern.c: Notify voice changes. 2011-07-07 Stefan Sauer * src/ui/edit/render-dialog.c: Make enter activate the default dialog action. 2011-07-07 Stefan Sauer * src/ui/edit/pattern-properties-dialog.c: Make enter activate the default dialog action. 2011-07-07 Stefan Sauer * src/ui/edit/main-page-patterns.c: Fix gvalue checks to not access unset gvalues. 2011-07-07 Stefan Sauer * src/ui/edit/interaction-controller-learn-dialog.c: Add comments. Select the suggested name and make enter activate the default dialog action. 2011-07-06 Stefan Sauer * src/lib/ic/device.c: Sort control list by name. 2011-07-06 Stefan Sauer * src/ui/edit/interaction-controller-menu.c: Update menu after learn. 2011-07-06 Stefan Sauer * src/lib/core/pattern.c: Add missing 'static' keyword to signal handler. 2011-07-06 Stefan Sauer * src/ui/edit/main-page-patterns.c: Rename misnamed enums. 2011-07-06 Stefan Sauer * src/ui/edit/main-page-patterns.c: Use the new api to use appropriate no-values in pattern-editor. 2011-07-06 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/machine-methods.h: * src/lib/core/machine.c: Expose two methods to get parameter no-values. We'll need that for the pattern editor to use them for clearing cells. 2011-07-06 Stefan Sauer * src/ui/edit/main-page-patterns.c: Don't trigger no-values. 2011-07-06 Stefan Sauer * src/lib/ic/device.c: Add a notify when changing the control-list. * src/ui/edit/interaction-controller-menu.c: Better logging. Add todo comments for the menu-updating. 2011-07-06 Stefan Sauer * src/ui/edit/main-page-sequence.c: Improve saving data when tracks get removed. 2011-07-06 Stefan Sauer * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: Export a function to be able to loop over tracks. 2011-07-06 Stefan Sauer * src/lib/ic/input-device.c: Add more logging. * src/ui/edit/interaction-controller-menu.c: Add a missing ref. 2011-07-05 Stefan Sauer * src/ui/edit/main-page-sequence.c: Add undo/redo for multi-column del and fix a off by one for label column undo/redo. 2011-07-04 Stefan Sauer * src/ui/edit/main-page-sequence.c: Add undo/redo for multi-column ins. 2011-07-03 Stefan Sauer * src/ui/edit/main-page-sequence.c: Handle undo/redo for single columns ins/del. 2011-07-01 Stefan Sauer * src/ui/edit/main-page-sequence.c: Handle undo/redo for label edits. 2011-07-01 Stefan Sauer * NEWSLETTER: Sent News. 2011-07-01 Stefan Sauer * NEWS: Mention keyboard shortcuts among the doc updates. 2011-07-01 Stefan Sauer * src/ui/edit/main-page-sequence.c: Implement undo/redo of the sequence data on length changes. For that also handled undo/redo for the label column. 2011-07-01 Stefan Sauer * src/ui/edit/main-page-sequence.c: Factor out sequence_region serialisation code. 2011-07-01 Stefan Sauer * NEWSLETTER: Write news. 2011-07-01 Stefan Sauer * src/ui/edit/main-page-sequence.c: Factor out common code. 2011-06-30 Stefan Sauer * src/ui/edit/main-page-sequence.c: Implement undo/redo for sequence loop-start/end and length. 2011-06-30 Stefan Sauer * src/ui/edit/main-page-patterns.c: Remove obsolete comment. 2011-06-29 Stefan Sauer * src/ui/edit/main-page-sequence.c: Implement undo/redo for single pattern edits in sequence. 2011-06-29 Stefan Sauer * src/ui/edit/main-page-sequence.c: More undo/redo preparations. Factor out track deserialisation. Add undo/redo command parameters. 2011-06-29 Stefan Sauer * src/ui/edit/main-page-sequence.c: The pattern list updates itself on usage changes now. No need to manually trigger it. 2011-06-28 Stefan Sauer * src/ui/edit/main-page-machines.c: Add a warning log for unhandled properties. * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-properties-dialog.c: Refactor code, to be able to implementa undo/redo for pattern property changes (name and length so far). 2011-06-28 Stefan Sauer * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-edit/buzztard-edit.types: * src/ui/edit/crash-recover-dialog.c: Fix docblob and add dialog to the docs. 2011-06-25 Stefan Sauer * src/ui/edit/main-page-sequence.c: More undo/redo preparations. 2011-06-25 Stefan Sauer * src/ui/edit/main-page-patterns.c: Fix undo/redo of groups. 2011-06-25 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Fix out of rage enum value. Allow to also blend enums. 2011-06-25 Stefan Sauer * configure.ac: Also link to gio explicitely. 2011-06-25 Stefan Sauer * src/ui/edit/main-menu.c: Add two items to help menu to get to web-irc chat and to the bug tracker. 2011-06-25 Stefan Sauer * src/ui/edit/main-page-machines.c: Log the initial position. 2011-06-25 Stefan Sauer * src/ui/edit/change-log.c: Also write to change log on undo/redo. We need to do this to recover correctly when one adds something and then does undo. 2011-06-25 Stefan Sauer * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: Change method to allow adding tracks at any index. * tests/lib/core/e-network.c: * tests/lib/core/e-pattern.c: * tests/lib/core/e-sequence.c: * tests/lib/core/e-wire-pattern.c: * tests/lib/core/t-sequence.c: Update tests. * src/ui/edit/main-page-sequence.c: Flesh out undo/redo for adding/removing tracks. 2011-06-24 Stefan Sauer * src/ui/edit/crash-recover-dialog.c: Close dialog when last entry was deleted. 2011-06-23 Stefan Sauer * src/lib/buzztard.xml.in: Readd the glob, but with a low weight. * src/ui/edit/main-menu.c: * src/ui/edit/main-window.c: Make the workaround conditional on the right glib version. 2011-06-23 Stefan Sauer * src/ui/edit/main-menu.c: * src/ui/edit/main-window.c: Retest glib bug (still there) and sync the comments. 2011-06-23 Stefan Sauer * src/ui/edit/main-page-patterns.c: Fix trigger-switch mapping to not produce wrong enums. 2011-06-23 Stefan Sauer * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Fix interpolation (for negative step values) and non int types. Fix off by 1 in flip that leaft the middle pair unchanged. 2011-06-21 Stefan Sauer * src/lib/core/libbuzztard-core/sequence-methods.h: * src/lib/core/sequence.c: * src/ui/edit/main-page-sequence.c: Fix copy and paste for columns. Fix a crasher in wrong printf format. Fix insert/delete on the label column. Fix insert-full-rows for labels by talking the labels[] pointer after resizing. 2011-06-20 Stefan Sauer * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/persistence.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: Support more GTypes. Use macros to reduce the LOC. 2011-06-20 Stefan Kost * src/ui/edit/main-page-patterns.c: Use the new flip operators. 2011-06-20 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/pattern-methods.h: * src/lib/core/libbuzztard-core/wire-pattern-methods.h: * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Add flip operation. 2011-06-20 Stefan Kost * src/lib/core/sequence.c: Fix sequence repairs to also take previous patterns into account. Makes the 'break' patterns work. 2011-06-20 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: Support more GTypes. 2011-06-20 Stefan Kost * src/ui/edit/main-page-sequence.c: Avoid rebuilding the whole sequence when expanding. 2011-06-20 Stefan Kost * src/ui/edit/main-page-sequence.c: Minor fixup in position formatting. 2011-06-20 Stefan Kost * src/ui/edit/main-page-sequence.c: Make adding solo/bypass patterns using '_' work again. 2011-06-20 Stefan Kost * src/ui/edit/pattern-list-model.c: Fix sort order in pattern list, keep internal patterns at the top in a pre-defined order. 2011-06-20 Stefan Kost * src/lib/core/pattern.c: Planning. 2011-06-20 Stefan Kost * src/lib/core/libbuzztard-core/pattern.h: * src/lib/core/pattern.c: Reorder enum. 2011-06-20 Stefan Kost * src/ui/edit/main-page-patterns.c: Planning and comment update. 2011-06-20 Stefan Kost * src/ui/edit/main-page-patterns.c: Refresh context menu on new patterns (after adding generators). Also update statusbar on edits. 2011-06-20 Stefan Kost * TODO: Planning. * docs/help/bt-edit/C/buzztard-edit.xml: Add shortcut tables. Add a lot of explanations. 2011-06-17 Stefan Kost * src/lib/core/machine.c: Handle more basic GTypes. 2011-06-17 Stefan Kost * src/ui/edit/tip-dialog.c: Add another tip. 2011-06-17 Stefan Kost * src/ui/edit/machine-menu.c: Add a blacklist filter for known-not-so-useful elements. 2011-06-17 Stefan Kost * docs/help/bt-edit/C/buzztard-edit.xml: Flesh out the pattern-view docs a bit. Tell abut keys for editing. Add links to the keyboard shortcuts on the wiki for pattern and sequence view. 2011-06-16 Stefan Kost * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Make the build succeed with missing too old gobject introspections, by touching the files. 2011-06-13 Stefan Kost * src/lib/core/setup.c: Add '.' to the end of sentences in the docs. 2011-06-12 Stefan Kost * src/ui/edit/pattern-list-model.c: Use the new signals from sequence to update the is-used state dynamically. 2011-06-12 Stefan Kost * src/lib/core/sequence.c: Add a hashtable to track pattern usage. Use it to speedup the methods instead of scanning the whole sequence. Add two signals to notify of first and last use. 2011-06-12 Stefan Kost * configure.ac: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/tools.h: Bump gtk+ (2.10.12) requiremtns, remove backwards compat defines and fallback code. * src/ui/edit/main-page-sequence.c: Also remove fallback code. Simplify the sequence expasion code and get rid of one obscure extra state. 2011-06-12 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-sequence.h: Get rid of SEQUENCE_ROW_ADDITION_INTERVAL define and use the bars from song-info instead. Rework the coloring and use a single boolean column for the 'shade' flag instead. This speeds up the cell-data function and saves memory. 2011-06-12 Stefan Kost * src/ui/edit/main-page-sequence.c: Remove two more columns. Only listen for pattern removal to lessen the amount of updates we do (fixes a FIXME). Clarify some comments. 2011-06-12 Stefan Kost * src/ui/edit/main-page-sequence.c: Remove unused column. Replace pos var with i to save one var. 2011-06-08 Stefan Kost * NEWSLETTER: Collect news. 2011-05-23 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Use the new models and remove the old code. * src/ui/edit/pattern-list-model.c: * src/ui/edit/pattern-list-model.h: Add a unused column too, as we can't invert when assigning it to a cell- renderer. 2011-05-17 Stefan Kost * src/ui/edit/main-page-sequence.c: Use the key in the pattern-list model fro key-lookups. Avoids duplicated pattern_keys arrays and fixes disparity between sort-order and key-ppatern relation. 2011-05-17 Stefan Kost * po/LINGUAS: * po/fr.po: * po/fr.po (added): Add french translations. 2011-05-14 Stefan Kost * src/ui/edit/main-page-patterns.c: Fix selection of new pattern. * src/ui/edit/pattern-list-model.c: More logging and some idea comments. 2011-05-14 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/machine-methods.h: * src/lib/core/machine.c: Add method to get pattern per name. * src/lib/core/pattern.c: Clarify property scope. * src/ui/edit/pattern-properties-dialog.c: Use new method and fix uniquness check. 2011-05-13 Stefan Kost * src/ui/edit/main-page-patterns.c: Also fix the type order for pattern page. 2011-05-13 Stefan Kost * src/lib/core/persistence.c: Move the varargs processing closer to where we actually need it. * src/lib/core/processor-machine.c: * src/lib/core/sink-machine.c: * src/lib/core/source-machine.c: Add missing va_end. 2011-05-13 Stefan Kost * src/lib/core/wave.c: One more round and handle the (unlikely) case of tmpfile() failing. 2011-05-13 Stefan Kost * tests/bt-check.c: Disable unused testing code. 2011-05-13 Stefan Kost * src/lib/core/machine.c: Remove unused variable. 2011-05-13 Stefan Kost * src/lib/core/sequence.c: Remove copy'n'paste left-over variable. 2011-05-13 Stefan Kost * src/ui/dec/bt-dec.c: Comment out code block and add a comment why this is actualy not run right now. 2011-05-13 Stefan Kost * src/lib/core/wave.c: Always free the local fd. 2011-05-13 Stefan Kost * src/ui/edit/main-page-sequence.c: Fix order of types in pattern-list. 2011-05-13 Stefan Kost * src/ui/cmd/cmd-application.c: Add error handling when we can't open the output file. 2011-05-13 Stefan Kost * src/lib/core/wave.c: Rework fd/FILE handling. We're using fileno to get file numbers. Still we want to use fclose() to close the files. 2011-05-12 Stefan Kost * src/lib/core/wave.c: Don't leak the FILE handle. 2011-05-12 Stefan Kost * src/ui/edit/playback-controller-socket.c: Both len and term are unsigned, term can be 0, but then len would be 1. So use len in the check. 2011-05-12 Stefan Kost * src/lib/core/song-io-native-bzt.c: File-name and err can be NULL. 2011-05-12 Stefan Kost * src/lib/core/machine.c: Fix variable type. 2011-05-12 Stefan Kost * src/ui/dec/bt-dec.c: Update the _loop() function pause handling. Avoid the FLOW_IS_FATAL macro like other gst elements. Handle segmented seeks. 2011-05-12 Stefan Kost * src/ui/edit/buzztard-edit.desktop.in: * src/ui/edit/buzztard-edit.desktop.in (added): Readd src for desktop file (again). 2011-05-12 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-ic/Makefile.am: * src/ui/edit/pattern-editor.h: Doc cleanups. 2011-05-11 Stefan Kost * src/ui/edit/pattern-list-model.c: Treat internal patterns as "always-used". 2011-05-11 Stefan Kost * src/ui/edit/main-page-patterns.c: Fixme updates. * src/ui/edit/main-page-sequence.c: Prepare for use of pattern-model in sequence view. 2011-05-09 Stefan Kost * NEWSLETTER: Sent news. 2011-05-05 Stefan Kost * NEWSLETTER: Collecting news. 2011-05-02 Stefan Kost * src/ui/edit/main-page-patterns.c: Add all the alternative code paths to use the new model. 2011-05-02 Stefan Kost * src/ui/edit/machine-list-model.c: * src/ui/edit/machine-list-model.h: * src/ui/edit/pattern-list-model.c: * src/ui/edit/pattern-list-model.h: Add enums for column ids. 2011-04-29 Stefan Kost * src/lib/core/machine.c: * src/ui/edit/machine-list-model.c: * src/ui/edit/machine-menu.c: * src/ui/edit/main-menu.c: * src/ui/edit/pattern-list-model.c: * src/ui/edit/tip-dialog.c: * tests/bt-check.c: * tests/lib/core/e-song-io-native.c: * tests/lib/core/t-source-machine.c: Clang checker cleanups. 2011-04-28 Stefan Kost * src/ui/edit/machine-list-model.c: * src/ui/edit/pattern-list-model.c: Small model cleanups. 2011-04-28 Stefan Kost * configure.ac: Don't muck with CFLAGS in configure - it is for the user. 2011-04-28 Stefan Kost * src/ui/edit/panorama-popup.h: * src/ui/edit/volume-popup.h: Single include fixes. 2011-04-27 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/pattern-list-model-methods.h: * src/ui/edit/pattern-list-model.c: * src/ui/edit/pattern-list-model.h: * src/ui/edit/pattern-list-model.c (svn:keywords, svn:eol-style): * src/ui/edit/pattern-list-model-methods.h (svn:keywords, svn:eol- style): * src/ui/edit/pattern-list-model.h (svn:keywords, svn:eol-style): * src/ui/edit/pattern-list-model-methods.h (added): * src/ui/edit/pattern-list-model.c (added): * src/ui/edit/pattern-list-model.h (added): WIP version of new model for pattern lists. 2011-04-27 Stefan Kost * src/ui/edit/Makefile.am: Generate the desktop file. 2011-04-27 Stefan Kost * src/lib/core/pattern.c: Simple fix for "Add parameter check for 'param' when deserializing.". 2011-04-24 Stefan Kost * src/ui/edit/pattern-editor.h: * src/ui/edit/ui-resources.h: * src/ui/edit/wire-canvas-item.c: Documentation fixes. 2011-04-20 Stefan Kost * src/lib/core/pattern.c: Add parameter check for 'param' when deserializing. * src/ui/edit/main-page-machines.c: Also handle machine voices in undo/redo. 2011-04-20 Stefan Kost * src/ui/edit/main-page-patterns.c: Fix the regexp more (there was a misplaced ','). 2011-04-20 Stefan Kost * src/ui/edit/change-logger.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: Relax the rexexp-patterns and fix some. Add more logging. 2011-04-19 Stefan Kost * src/ui/edit/main-page-sequence.c: Make sequence view colors dynamic and update on theme changes. We're now using darker shades on dark themes. 2011-04-19 Stefan Kost * NEWSLETTER: Collect NEWS. * src/ui/edit/main-page-sequence.c: Planning. 2011-04-19 Stefan Kost * src/ui/edit/main-page-patterns.c: Fully switch to use the machine model. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: Downgrade more log statements again. * src/ui/edit/main-page-patterns.c: Add signal handler listening for pattern removal also in the model case. Makes undo/redo work again here. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: * src/ui/edit/main-page-patterns.c: Downgrade the log statements again. 2011-04-18 Stefan Kost * src/ui/edit/main-statusbar.c: Experiment with a main_loop_lag monitor. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: * src/ui/edit/main-page-patterns.c: Keep list sorted when renaming machines. 2011-04-18 Stefan Kost * configure.ac: * src/lib/core/tools.c: Use the timestamp function from gstreamer. 2011-04-18 Stefan Kost * src/ui/edit/main-page-sequence.c: Try different hack for the space eating sequence view column. 2011-04-18 Stefan Kost * src/ui/edit/main-page-sequence.c: Fix the label-menu cell renderer layout setup. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: Delete node before notifying (in contrast to what the gtk+ api docs say). Anything else will create small window of inconsistency * src/ui/edit/main-page-patterns.c: Make listening to machine menu deletions work. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: g_sequence_search gives the insertion position (we have to go one back). * src/ui/edit/main-page-patterns.c: Improvements on handing row-insert/delete of the model. 2011-04-18 Stefan Kost * src/ui/edit/machine-list-model.c: Add proper sorting. 2011-04-14 Stefan Kost * Makefile.am: Hide more commands. * src/lib/core/libbuzztard-core/sink-bin.h: Whitespace. 2011-04-14 Stefan Kost * src/ui/edit/machine-list-model.c: * src/ui/edit/main-page-patterns.c: WIP changes on the machine-list model use. 2011-04-13 Stefan Kost * src/ui/edit/main-page-machines.c: Add comment, remove todo. 2011-04-13 Stefan Kost * docs/Makefile.am: * docs/help/bt-edit/C/Makefile.am: * docs/help/bt-edit/Makefile.am: * docs/reference/Makefile.am: Trim Makefile output. 2011-04-13 Stefan Kost * configure.ac: * docs/reference/bt-ic/buzztard-ic-docs.sgml: * docs/reference/bt-ic/buzztard-ic-sections.txt: * docs/reference/bt-ic/buzztard-ic.types.in: * src/lib/ic/registry.c: Fix warnings in btic docs. Handle conditional Api. 2011-04-13 Stefan Kost * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/tools.c: Remove unused test code, this has to work via refdbg or alike. 2011-04-13 Stefan Kost * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Use silent rules for gobject-introspection. 2011-04-12 Stefan Kost * src/ui/edit/machine-list-model-methods.h: * src/ui/edit/machine-list-model.c: * src/ui/edit/main-page-patterns.c: Conditionally use the new model. 2011-04-11 Stefan Kost * src/ui/edit/machine-list-model.c: Shuffle the order in delete, to signal first and then delete. Add some comments. 2011-04-10 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/machine-list-model-methods.h: * src/ui/edit/machine-list-model.c: * src/ui/edit/machine-list-model.h: * src/ui/edit/machine-list-model.h (svn:keywords, svn:eol-style): * src/ui/edit/machine-list-model-methods.h (svn:keywords, svn:eol- style): * src/ui/edit/machine-list-model.c (svn:keywords, svn:eol-style): * src/ui/edit/machine-list-model-methods.h (added): * src/ui/edit/machine-list-model.c (added): * src/ui/edit/machine-list-model.h (added): Start a new model for the machine-list. 2011-04-09 Stefan Kost * src/ui/edit/object-list-model-methods.h: * src/ui/edit/object-list-model.c: Finalize implementation. * src/ui/edit/settings-page-interaction-controller.c: Make use of the new moduel in two places. 2011-04-08 Stefan Kost * src/ui/edit/object-list-model-methods.h: * src/ui/edit/object-list-model.c: Fully implemented. 2011-04-08 Stefan Kost * src/lib/core/machine.c: Whitespace. 2011-04-08 Stefan Kost * src/ui/edit/main-page-patterns.c: Use enums for the list-store columns one more time. 2011-04-08 Stefan Kost * src/ui/edit/change-logger.h: Comment fix. 2011-04-08 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/object-list-model-methods.h: * src/ui/edit/object-list-model.c: * src/ui/edit/object-list-model.h: * tests/ui/edit/e-bt-edit-application.c: * src/ui/edit/object-list-model-methods.h (svn:keywords, svn:eol- style): * src/ui/edit/object-list-model.h (svn:keywords, svn:eol-style): * src/ui/edit/object-list-model.c (svn:keywords, svn:eol-style): * src/ui/edit/object-list-model.c (added): * src/ui/edit/object-list-model.h (added): * src/ui/edit/object-list-model-methods.h (added): Add first step of our own model. 2011-04-06 Stefan Kost * src/ui/edit/main-page-patterns.c: Naming update. 2011-04-06 Stefan Kost * gst.supp: * gtk.supp: * tests/Makefile.am: * gtk.supp (added): Add another supression file. Add and tune valgrind options. Fix the valgrind rule for single tests. 2011-04-05 Stefan Kost * src/ui/edit/main-page-patterns.c: Also init width=0 to avoid accessing it uninitialized from pattern editor. 2011-04-05 Stefan Kost * tests/Makefile.am: Use separate files per pid for valgrind logs. * tests/ui/edit/e-bt-edit-application.c: Tinker with the test to get more trace points. * tests/ui/edit/e-bt-machine-properties-dialog.c: Whitespace. 2011-04-05 Stefan Kost * docs/help/bt-edit/C/Makefile.am: * docs/help/bt-edit/C/buzztard-edit.xml: * docs/help/bt-edit/C/figures/about.png: * docs/help/bt-edit/C/figures/crash-recovery.png: * docs/help/bt-edit/C/figures/interaction-controller-learn.png: * docs/help/bt-edit/C/figures/machine-preferences.png: * docs/help/bt-edit/C/figures/machine-properties.png: * docs/help/bt-edit/C/figures/machine-rename.png: * docs/help/bt-edit/C/figures/main-window.png: * docs/help/bt-edit/C/figures/missing-gstreamer-elements.png: * docs/help/bt-edit/C/figures/missing-song-elements.png: * docs/help/bt-edit/C/figures/page-info-view.png: * docs/help/bt-edit/C/figures/page-machine-view.png: * docs/help/bt-edit/C/figures/page-pattern-view.png: * docs/help/bt-edit/C/figures/page-sequence-view.png: * docs/help/bt-edit/C/figures/page-wavetable-view.png: * docs/help/bt-edit/C/figures/pattern-properties.png: * docs/help/bt-edit/C/figures/preset-properties.png: * docs/help/bt-edit/C/figures/recording-progress.png: * docs/help/bt-edit/C/figures/recording-settings.png: * docs/help/bt-edit/C/figures/settings-audio.png: * docs/help/bt-edit/C/figures/settings-colors.png: * docs/help/bt-edit/C/figures/settings-directories.png: * docs/help/bt-edit/C/figures/settings-ic.png: * docs/help/bt-edit/C/figures/settings-pc.png: * docs/help/bt-edit/C/figures/settings-shortcuts.png: * docs/help/bt-edit/C/figures/signal-analysis.png: * docs/help/bt-edit/C/figures/tip.png: * docs/help/bt-edit/C/figures/missing-song-elements.png (svn:mime- type): * docs/help/bt-edit/C/figures/about.png (svn:mime-type): * docs/help/bt-edit/C/figures/signal-analysis.png (svn:mime-type): * docs/help/bt-edit/C/figures/missing-gstreamer-elements.png (svn:mime- type): * docs/help/bt-edit/C/figures/recording-progress.png (svn:mime-type): * docs/help/bt-edit/C/figures/crash-recovery.png (svn:mime-type): * docs/help/bt-edit/C/figures/preset-properties.png (svn:mime-type): * docs/help/bt-edit/C/figures/machine-rename.png (svn:mime-type): * docs/help/bt-edit/C/figures/recording-settings.png (svn:mime-type): * docs/help/bt-edit/C/figures/tip.png (svn:mime-type): * docs/help/bt-edit/C/figures/interaction-controller-learn.png (svn :mime-type): * docs/help/bt-edit/C/figures/tip.png (added): * docs/help/bt-edit/C/figures/crash-recovery.png (added): * docs/help/bt-edit/C/figures/preset-properties.png (added): * docs/help/bt-edit/C/figures/signal-analysis.png (added): * docs/help/bt-edit/C/figures/interaction-controller-learn.png (added): * docs/help/bt-edit/C/figures/machine-rename.png (added): * docs/help/bt-edit/C/figures/about.png (added): * docs/help/bt-edit/C/figures/recording-settings.png (added): * docs/help/bt-edit/C/figures/missing-gstreamer-elements.png (added): * docs/help/bt-edit/C/figures/recording-progress.png (added): * docs/help/bt-edit/C/figures/missing-song-elements.png (added): Update figures. 2011-04-04 Stefan Kost * src/ui/edit/signal-analysis-dialog.c: Fix non-sense labels. 2011-04-04 Stefan Kost * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-crash-recover-dialog.c: * tests/ui/edit/s-bt-crash-recover-dialog.c: * tests/ui/edit/s-bt-crash-recover-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/e-bt-crash-recover-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/s-bt-crash-recover-dialog.c (added): * tests/ui/edit/e-bt-crash-recover-dialog.c (added): Add another test to get a screenshot for the crash-recover dialog. Also set the application name to get a nicer screenshot for the about dialog. 2011-04-04 Stefan Kost * src/ui/dec/bt-dec.c: Also rename debug category. 2011-04-04 Stefan Kost * docs/help/bt-edit/C/Makefile.am: * docs/help/bt-edit/C/buzztard-edit.xml: Add more images. 2011-04-04 Stefan Kost * docs/help/bt-edit/C/buzztard-edit.xml: Describe all remaining dialogs. 2011-04-03 Stefan Kost * NEWS: Update the NEWS. * docs/help/bt-edit/C/buzztard-edit.xml: Review and extend help. 2011-04-03 Stefan Kost * src/ui/edit/main-page-sequence.c: Planning. 2011-04-03 Stefan Kost * src/lib/core/song-io.c: Remove default implementations for load/save (chaining up does not make sense here anyway). Check that we have an implementation in _load/_save instead. This is more robust as a plugin could just do klass->save=NULL; anyway. * src/ui/edit/main-window.c: When building the format list for the save-as dialog skip plugins that can't save. 2011-04-03 Stefan Kost * src/ui/edit/pattern-properties-dialog.c: Unbreak renaming the pattern. 2011-04-03 Stefan Kost * src/ui/edit/main-page-sequence.c: Add a gross hack for something that looks like an ugly bug in gtk+. We need a spacer to eat the remainder of the sequence headers. In the past a label containing a whitespace worked fine. Now gtk+ seems to try to be smart and skip the rendering of it :/. We're now using "#####" as a text and copy base color to fg and text. 2011-04-03 Stefan Kost * src/ui/edit/gtkvumeter.c: * src/ui/edit/gtkvumeter.h: Remove unused code. Add private comment to instance declaration. 2011-04-03 Stefan Kost * tests/.cvsignore: * tests (svn:ignore): Maintenance. * tests/bt-check.c: Indent. 2011-04-03 Stefan Kost * src/ui/edit/main-menu.c: Also check for unsaved when loading from recent menu. 2011-04-03 Stefan Kost * src/ui/edit/bt-edit.gtkrc: * src/ui/edit/main-page-sequence.c: Tune border sizes and padding a bit. We still have some unwanted whitespace in the sequence headers. 2011-04-03 Stefan Kost * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/main-menu.c: Use non-stock menu-item and button for crash recovery as the stock labels did not really fit. Add extra explanation to crash recover dialog. 2011-04-02 Stefan Kost * src/ui/edit/main-page-sequence.c: Use weak pointers for the cached vu-meter. 2011-04-02 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: Finetune the vu-meter-update skipping. We don't compare against the last value anymore. This can cause problem if a processing the deferred meter update gets lost and we then skip. Instead activate skipping for a series of max- or min-volume. Apply the same to seqeunce view. Saves a total of 213327 updates for Aenathon.bmx. 2011-04-02 Stefan Kost * src/ui/edit/gtkvumeter.c: Eventually skip a redraw when setting min/max. 2011-04-02 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Add a G_STMT_BEG/END to macro. 2011-04-02 Stefan Kost * src/ui/edit/machine-canvas-item.c: Change the idle-data from two pointers to a proper struct. Add init/free macros. Avoid recalculating the level-meter value by having it in the struct now. 2011-04-01 Stefan Kost * NEWSLETTER: Wrote and send NEWS. 2011-04-01 Stefan Kost * tests/bt-check.c: Update bug comment with status. * tests/lib/ic/.cvsignore: * tests/lib/ic (svn:ignore): * docs/reference/bt-edit (svn:ignore): * docs/reference/bt-cmd (svn:ignore): * tests/lib/ic/.cvsignore (added): Maintainance. 2011-04-01 Stefan Kost * src/ui/edit/machine-canvas-item.c: Skip vu-meter updates if the value has not changed. Saves 166359 updates for Aenathon.bmx. 2011-04-01 Stefan Kost * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Thanks to help from gi irc channel, fix the gi build. 2011-03-31 Stefan Kost * design/udev/udevls.c: Add udev version in comment where the issue if fixed. * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Cleanup gi parts in makefile and make failure non-fatal as the tools give me a hard time right now. 2011-03-27 Stefan Kost * configure.ac: * tests/bt-cfg.sh.in: * tests/bt-edit-cli.sh: Also set xfont-path in shellscript to suppress more noise. * tests/bt-check.c: Add a comment pointing to the bug that produces the XRANDR warning noise. 2011-03-27 Stefan Kost * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/ui/edit/pattern-properties-dialog.c: * tests/lib/core/e-machine.c: * tests/lib/core/e-network.c: * tests/lib/core/e-pattern.c: Make BtPattern::voices read-only. Change it on the machine only. Use notify signal to keep patterns in sync. 2011-03-27 Stefan Kost * src/lib/core/sequence.c: Set last tracks field to NULL when removing a track to avoid double unref. Optimize the priv->machines array access. 2011-03-27 Stefan Kost * po/POTFILES.in: Also rename the wire-analysis-dialog here. 2011-03-27 Stefan Kost * src/lib/core/setup.c: Eventually mark objects as floating after removing them. 2011-03-26 Stefan Kost * src/ui/edit/pattern-properties-dialog.c: Only apply changed values to minimize notifies. 2011-03-26 Stefan Kost * src/lib/core/pattern.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: Planning. 2011-03-26 Stefan Kost * src/lib/core/machine.c: * src/lib/core/pattern.c: Keep voices in sync between pattern and machine. We are changing the voices from pattern view right now (maybe that should be changed). Fix voice-parameter lookup in pattern serialisation/deserialisation (off by 1). 2011-03-26 Stefan Kost * src/ui/edit/main-page-patterns.c: Don't update patterns twice when changing number of tracks. Add FIXME for missing undo/redo. 2011-03-25 Stefan Kost * src/ui/edit/signal-analysis-dialog.c: Disconnect only the handler for this dialog. Otherwise the fft stops in all other windows too. 2011-03-22 Stefan Kost * tests/ui/edit/e-bt-edit-application.c: Add a set of tests for loading songs while having some ui pages removed. 2011-03-22 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-waves.c: Disconnect on_song_changed on dispose. Helps the tests. 2011-03-18 Stefan Kost * src/lib/core/sink-bin.c: Use new helper to attach analyzers. * src/ui/edit/machine-canvas-item.c: Add context menu entry to show signal analyzer on the master. * src/ui/edit/signal-analysis-dialog.c: Fix setting the analzzers on the master. 2011-03-18 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/tools.c: * src/lib/core/wire.c: Move some code from wire to tool and make it more generic so that we can use it from sink-bin too. 2011-03-18 Stefan Kost * src/lib/ic/gudev-discoverer.c: Handle "change" action too. 2011-03-17 Stefan Kost * src/ui/edit/signal-analysis-dialog.c: Setting the analyzers (non yet taken into use). 2011-03-17 Stefan Kost * src/lib/core/sink-bin.c: Add analyzer property. 2011-03-17 Stefan Kost * src/lib/core/sink-bin.c: Always add the tee to prepare for pluging analysers. 2011-03-17 Stefan Kost * src/ui/dec/bt-dec.c: Free the song only in dispose and not in reset to make it reusable. 2011-03-16 Stefan Kost * src/ui/edit/signal-analysis-dialog-methods.h: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: * tests/ui/edit/e-bt-signal-analysis-dialog.c: Change the the wire field to a more generic bin. Add FIXME comments where we will need to make changes for the SinkMachine. 2011-03-16 Stefan Kost * docs/reference/bt-edit/buzztard-edit.types: Also renename the wire-dialog to signal-dialog here. 2011-03-16 Stefan Kost * src/lib/core/machine.c: Fix typos in log messages. 2011-03-16 Stefan Kost * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/signal-analysis-dialog-methods.h: * src/ui/edit/signal-analysis-dialog.c: * src/ui/edit/signal-analysis-dialog.h: * src/ui/edit/wire-canvas-item.c: * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-signal-analysis-dialog.c: * tests/ui/edit/s-bt-signal-analysis-dialog.c: * src/ui/edit/signal-analysis-dialog-methods.h (added): * src/ui/edit/signal-analysis-dialog.c (added): * src/ui/edit/signal-analysis-dialog.h (added): * tests/ui/edit/s-bt-signal-analysis-dialog.c (added): * tests/ui/edit/e-bt-signal-analysis-dialog.c (added): * src/ui/edit/wire-analysis-dialog-methods.h (deleted): * src/ui/edit/wire-analysis-dialog.c (deleted): * src/ui/edit/wire-analysis-dialog.h (deleted): * tests/ui/edit/e-bt-wire-analysis-dialog.c (deleted): * tests/ui/edit/s-bt-wire-analysis-dialog.c (deleted): Rename WireAnalysisDialog to SignalAnalysisDialog. This is in preparation for using the dialog also on the master. 2011-03-15 Stefan Kost * tests/ui/edit/e-bt-edit-application.c: Comments and tweaking of the test. 2011-03-15 Stefan Kost * src/lib/core/setup.c: First remove elements and then mark them as floating again. * src/ui/edit/main-page-patterns.c: Comment. 2011-03-15 Stefan Kost * NEWSLETTER: News have been sent. 2011-03-14 Stefan Kost * src/ui/edit/wire-canvas-item.c: Disconnect signal handlers when changing wire-ends. 2011-03-11 Stefan Kost * src/lib/core/sink-bin.c: * src/lib/core/wire.c: * src/ui/edit/wire-analysis-dialog.c: Planning and comment updates. 2011-03-11 Stefan Kost * src/ui/edit/pattern-editor.c: Also free the cairo context here. 2011-03-11 Stefan Kost * src/lib/core/wire.c: Fix channel negotiation and plugin of converters for stereo path away from master. We have to also look at channel-ranges. 2011-03-10 Stefan Kost * src/ui/edit/wire-analysis-dialog.c: Don't leak the cairo context. 2011-03-10 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/wire-analysis-dialog.c: Improve spectrum and level message handling. Avoid leaking data in error cases. 2011-03-09 Stefan Kost * src/ui/edit/wire-analysis-dialog.c: Point to the released version. 2011-03-09 Stefan Kost * tests/ui/edit/e-bt-sequence-page.c: Improve the test. 2011-03-09 Stefan Kost * src/ui/edit/wire-analysis-dialog.c: Handle multi-channel spectrum if gstreamer plugin can do it. (feature https://bugzilla.gnome.org/show_bug.cgi?id=593482) 2011-03-09 Stefan Kost * configure.ac: * src/lib/core/settings.c: * src/ui/edit/settings-page-audiodevices.c: Prepare for soon to be deprecated API. 2011-03-06 Stefan Kost * src/lib/core/setup.c: Spell checking. 2011-03-05 Stefan Kost * NEWSLETTER: Collect and draft news. 2011-02-24 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: Add one methods to set transitent window relation ship. Saves some code and avoids us to fecth the main-window ref. * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-window.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/wire-canvas-item.c: Use new api for child-windows. 2011-02-23 Stefan Kost * src/ui/edit/render-dialog.c: Set default response. 2011-02-23 Stefan Kost * src/ui/edit/machine-canvas-item.c: Make machine windows transient to the main-window. * src/ui/edit/tip-dialog.c: Set a default respose for the dialog. 2011-02-22 Stefan Kost * configure.ac: * src/lib/core/core.c: Check for mmx/sse intrinsics and configure the FPU to DAZ|FZ mode. This allows us to drop denormal checks. 2011-02-22 Stefan Kost * tests/bt-check.c: Remove a assert. 2011-02-22 Stefan Kost * tests/bt-check.c: * tests/bt-check.h: * tests/ui/edit/e-bt-pattern-page.c: * tests/ui/edit/e-bt-sequence-page.c: * tests/ui/edit/t-bt-pattern-page.c: Fix event injecttion (need to ref gdk window). Add a helper for injecting key-presses. 2011-02-22 Stefan Kost * tests/m-bt-ic.c: * tests/m-bt-ic.c (svn:keywords, svn:eol-style): * tests/m-bt-ic.c (added): Add missing test suite main source. 2011-02-21 Stefan Kost * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-pattern-page.c: * tests/ui/edit/e-bt-sequence-page.c: * tests/ui/edit/s-bt-sequence-page.c: * tests/ui/edit/e-bt-sequence-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-sequence-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-sequence-page.c (added): * tests/ui/edit/s-bt-sequence-page.c (added): Add a test suite for the sequence page. 2011-02-21 Stefan Kost * design/udev/udevls.c: Add invocation example. 2011-02-21 Stefan Kost * design/udev/udevls.c: * design/udev/udevls.c (svn:keywords, svn:eol-style): * design/udev (added): * design/udev/udevls.c (added): Add a small testapp to try to reproduce a udev issue. 2011-02-21 Stefan Kost * src/lib/ic/gudev-discoverer.c: Add a hack to work-around a libudev bug. 2011-02-21 Stefan Kost * tests/lib/ic/Makefile.am: * tests/lib/ic/e-registry.c: * tests/lib/ic/s-registry.c: * tests/lib/ic/s-registry.c (svn:keywords, svn:eol-style): * tests/lib/ic/e-registry.c (svn:keywords, svn:eol-style): * tests/lib/ic/s-registry.c (added): * tests/lib/ic/e-registry.c (added): Add a simple check for the registry. 2011-02-21 Stefan Kost * configure.ac: * tests/Makefile.am: * tests/lib/Makefile.am: * tests/lib/ic/Makefile.am: * tests/lib/ic/m-bt-ic.h: * tests/lib/ic/s-ic.c: * tests/lib/ic/t-ic.c: * tests/lib/ic/s-ic.c (svn:keywords, svn:eol-style): * tests/lib/ic/t-ic.c (svn:keywords, svn:eol-style): * tests/lib/ic/Makefile.am (svn:keywords, svn:eol-style): * tests/lib/ic/m-bt-ic.h (svn:keywords, svn:eol-style): * tests/lib/ic (added): * tests/lib/ic/Makefile.am (added): * tests/lib/ic/s-ic.c (added): * tests/lib/ic/t-ic.c (added): * tests/lib/ic/m-bt-ic.h (added): Add boilerplate for btic test suite. 2011-02-19 Stefan Kost * tests/Makefile.am: Improve targets for running tests under valgrind/refdbg. 2011-02-19 Stefan Kost * src/lib/ic/gudev-discoverer.c: Fix ref-leak and uninitialized memory access. 2011-02-18 Stefan Kost * tests/Makefile.am: Add a refdbg makefile rule. 2011-02-17 Stefan Kost * tests/ui/edit/e-bt-edit-application.c: Narrow down the test failure more. * tests/ui/edit/e-bt-machine-page.c: Remove old comment. 2011-02-16 Stefan Kost * src/ui/edit/pattern-editor.c: Add more todo comments. Fix negative pageup overflow. 2011-02-16 Stefan Kost * src/ui/edit/main-page-patterns.c: Transform GValues directly to floats when reding out the pattern for the pattern-editor widget. This avoids formatting them strings as a intermediate format. 2011-02-16 Stefan Kost * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Fully switch to cairo. 2011-02-15 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: Add new API to docs. 2011-02-15 Stefan Kost * src/ui/edit/pattern-editor.c: Fix y character positioning by adding height. 2011-02-15 Stefan Kost * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Start porting to use cairo. * src/ui/edit/ui-resources-methods.h: * src/ui/edit/ui-resources.c: Add new methods to get rgb colors directly. 2011-02-15 Stefan Kost * design/led/setled.c: Add another link. 2011-02-14 Stefan Kost * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Cache a few more lookups. 2011-02-14 Stefan Kost * src/ui/edit/main-page-waves.c: Ideas. 2011-02-14 Stefan Kost * src/ui/edit/main-page-sequence.c: Just unref as we have checked for NULL already. Saver setting for new cursor column. 2011-02-14 Stefan Kost * src/lib/core/wire.c: Be more verbose. * tests/refcountfilter.pl: Be more verbose. * tests/ui/edit/e-bt-edit-application.c: Add yet another variant for the test. 2011-02-10 Stefan Kost * src/ui/edit/main-page-machines.c: Fix the reffing. 2011-02-10 Stefan Kost * tests/m-bt-edit.c: Cleanup before and after the tests to be paranoid (when test dies the cleanup could be skipped). 2011-02-10 Stefan Kost * src/lib/core/song-io.c: * src/ui/edit/change-log.c: Use glib dir reading functions. 2011-02-09 Stefan Kost * src/ui/edit/edit-application.c: * tests/Makefile.am: * tests/m-bt-edit.c: Use XDG_CACHE_HOME dir instead of suppressing the crash check. Remove all eventual left-overs in tear-down. 2011-02-09 Stefan Kost * tests/lib/core/e-song-io-native.c: * tests/ui/edit/e-bt-edit-application.c: Add more tests and unify the ref-count logging. Apparently we unref a machine somewhere too much (looks like pattern-view). 2011-02-09 Stefan Kost * src/ui/edit/pattern-editor.c: Use more local variables to avoid pointer derefs and make calls shorter. More comemnts and formatting cleanups. 2011-02-08 Stefan Kost * src/ui/edit/pattern-editor.c: Improve variable naming for readablility. Keep max_y an int in bt_pattern_editor_draw_column() to fix the comparission and with that the disappearing pattern when scrolling down (y get negative). 2011-02-08 Stefan Kost * src/ui/edit/main-page-machines.c: Also take new position from machine and not from properties to avoid race in event handling. 2011-02-08 Stefan Kost * design/led/setled.c: Cleanups on the log messages and more comments. 2011-02-08 Stefan Kost * src/ui/edit/change-log.c: Move the crashlog check to else branch. * src/ui/edit/edit-application.c: * tests/Makefile.am: Use an envvar to disable the crashlog check during tests. 2011-02-08 Stefan Kost * design/led/setled.c: * design/led/setled.c (svn:keywords, svn:eol-style): * design/led (added): * design/led/setled.c (added): Add a keyboard led hack. 2011-02-07 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-machines.c: Update machine pos for every move and make it undo/redoable. 2011-02-06 Stefan Kost * docs/help/bt-edit/C/Makefile.am: * docs/help/bt-edit/C/buzztard-edit.xml: Small doc fixes and better pdf creation. 2011-02-06 Stefan Kost * configure.ac: * src/lib/ic/Makefile.am: * src/lib/ic/gudev-discoverer.c: * src/lib/ic/hal-discoverer.c: * src/lib/ic/ic_private.h: * src/lib/ic/libbuzztard-ic/Makefile.am: * src/lib/ic/libbuzztard-ic/gudev-discoverer-methods.h: * src/lib/ic/libbuzztard-ic/gudev-discoverer.h: * src/lib/ic/libbuzztard-ic/hal-discoverer-methods.h: * src/lib/ic/libbuzztard-ic/hal-discoverer.h: * src/lib/ic/libbuzztard-ic/ic.h: * src/lib/ic/libbuzztard-ic/registry-methods.h: * src/lib/ic/registry.c: * src/lib/ic/libbuzztard-ic/hal-discoverer.h (svn:keywords, svn:eol- style): * src/lib/ic/gudev-discoverer.c (svn:keywords, svn:eol-style): * src/lib/ic/hal-discoverer.c (svn:keywords, svn:eol-style): * src/lib/ic/libbuzztard-ic/gudev-discoverer.h (svn:keywords, svn:eol- style): * src/lib/ic/libbuzztard-ic/hal-discoverer-methods.h (svn:keywords, svn :eol-style): * src/lib/ic/libbuzztard-ic/gudev-discoverer-methods.h (svn:keywords, svn:eol-style): * src/lib/ic/libbuzztard-ic/hal-discoverer.h (added): * src/lib/ic/libbuzztard-ic/hal-discoverer-methods.h (added): * src/lib/ic/libbuzztard-ic/gudev-discoverer.h (added): * src/lib/ic/libbuzztard-ic/gudev-discoverer-methods.h (added): * src/lib/ic/hal-discoverer.c (added): * src/lib/ic/gudev-discoverer.c (added): Refactor the device discovery. We now have separate discoverer objects. This way we have less ifdefs in the registry and we have pre- pared to add more discoverers in the future (jack-midi, alsa-seq). 2011-02-03 Stefan Kost * pixmaps/hicolor/16x16/buzztard.png: * pixmaps/hicolor/48x48/buzztard.png: * pixmaps/hicolor/scalable/buzztard.svg: Get rid of the old logo. 2011-02-03 Stefan Kost * NEWSLETTER: Sent NEWS. * docs/help/bt-edit/C/Makefile.am: Use dblatex to make the pdf. * docs/help/bt-edit/C/buzztard-edit.xml: Fix a typo. 2011-02-03 Stefan Kost * NEWSLETTER: Collect NEWS. 2011-02-02 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-machines.c: Add a "connect machines" context menu entry. This is easier to discover than the shft-drag. 2011-01-31 Stefan Kost * src/ui/edit/main-page-machines.c: Planning. 2011-01-31 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Make key-repeat work by listening for key-press-event and not key-release-event. 2011-01-30 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/wire-canvas-item.c: Simplify the handling of the machine position updates. It now updates according to the machine position while moving and only updates the machine properties hash when releasing the mouse. 2011-01-30 Stefan Kost * src/ui/edit/change-log.c: Improve the API docs. Update TODO comments. Cleanup on sucessful recovery. 2011-01-30 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Also show a dialog when recovery failed. 2011-01-30 Stefan Kost * src/ui/edit/main-page-machines.c: Add more TODO comments. 2011-01-30 Stefan Kost * src/ui/edit/main-page-patterns.c: Add a missing return value. 2011-01-30 Stefan Kost * src/ui/edit/change-log.c: Write the groups in reverse order to journal. 2011-01-29 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/main-page-machines.c: Update TODO comments. 2011-01-29 Stefan Kost * src/ui/edit/main-page-machines.c: Implement undo/redo for machine:state. Update TODOs. 2011-01-29 Stefan Kost * src/lib/ic/midi-device.c: Fix leftover unused var. 2011-01-26 Stefan Kost * src/lib/ic/ic_private.h: * src/lib/ic/midi-device.c: Add an attempt to send a midi identity request. 2011-01-26 Stefan Kost * NEWSLETTER: Collect news. 2011-01-26 Stefan Kost * src/ui/edit/main-window.c: Tell how much time has passed since last save or creation time. 2011-01-26 Stefan Kost * src/lib/buzztard.xml.in: Remove the glob, as with this we steal the xml extension. The issue is that most cases don't do proper matching. As a result calling help from some apps, would invoke us instead of the help browser. 2011-01-26 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Don't leak context menus. 2011-01-26 Stefan Kost * src/lib/ic/midi-device.c: Improve midi command parsing. Add defines. Remove testing leftovers. Add support for pitch-wheel and continous control events. 2011-01-19 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: Disconnect the machine-id-changed handler. * src/ui/edit/machine-properties-dialog.c: Disconnect the wire-src-id-changed handler when the wire is removed or window is closed. 2011-01-19 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: Update titles and labels and machine name changes. 2011-01-18 Stefan Kost * src/ui/edit/machine-canvas-item.c: Whitespaces. * src/ui/edit/main-page-machines.c: Make undo/redo for machine pos work. 2011-01-18 Stefan Kost * src/ui/edit/main-page-machines-methods.h: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: Unify group handling on item removal. Make one internal method returning sucess status. 2011-01-16 Stefan Kost * src/ui/edit/main-page-machines.c: Add set_machine_property command to store/restore machine pos. 2011-01-16 Stefan Kost * src/ui/edit/main-page-patterns.c: Fix null-ptr deref in pattern-data serialisation. 2011-01-16 Stefan Kost * src/ui/edit/main-page-patterns.c: Implement undo/redo pattern data on pattern/machine removal. 2011-01-16 Stefan Kost * src/ui/dec/bt-dec.c: Improve typefinding and caps. We're now putting the mimetype into a format field of the container caps. 2011-01-16 Stefan Kost * src/ui/edit/Makefile.am: Fix make distcheck. 2011-01-14 Stefan Kost * configure.ac: * src/ui/edit/Makefile.am: * src/ui/edit/buzztard-edit.desktop.in.in (deleted): Fix desktop-file. The version field in there is the spec version. Also finally fix double .in resolving. 2011-01-13 Stefan Kost * src/ui/edit/main-page-patterns.c: Add undo/redo for insert/delete. 2011-01-12 Stefan Kost * src/ui/edit/main-page-patterns.c: Refactor undo/redo code. We can now take snapshots before and after changes and then log the respective undo/redo. 2011-01-12 Stefan Kost * src/ui/edit/main-page-patterns.c: Don't iterate over PatternGroup array size. 2011-01-12 Stefan Kost * src/ui/edit/main-page-patterns.c: Have full undo/redo for blend/randomize/.. 2011-01-11 Stefan Kost * src/ui/edit/change-log.c: Use a much bigger buffer for reading the actual changelog data lines. 2011-01-11 Stefan Kost * src/ui/edit/main-page-patterns.c: Have undo/redo for blend/randomize/.. (single dolumns only). 2011-01-11 Stefan Kost * src/ui/edit/main-page-patterns.c: Change pattern data serialisation to use columns with n-ticks. Update deserialisation in the same way. We can reuse this for other edits. 2011-01-10 Stefan Kost * src/ui/edit/main-page-patterns.c: Use enums for switch-case more often. Another TODO comment for undo/redo of pattern data. 2011-01-10 Stefan Kost * src/lib/core/buzzcallbacks.c: Whitespace cleanup. * src/ui/edit/main-page-patterns.c: Remove old ifdef'ed code. Use enums for switch-case. TODO comment. 2010-12-20 Stefan Kost * NEWSLETTER: Collect news. * src/ui/edit/change-log.c: Update status. * src/ui/edit/main-page-patterns.c: Planning. 2010-12-20 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Close the dialog after a good recovery. Inform the user. 2010-12-20 Stefan Kost * src/ui/edit/main-menu.c: Check for unsaved changes before invoking the song recovery from the menu. Ensure we have an empty song if we proceed. 2010-12-20 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-window-methods.h: * src/ui/edit/main-window.c: Add a new methods to check if current song is unsaved and if so ask the user to confirm loosing the changes. 2010-12-20 Stefan Kost * src/ui/edit/change-log.c: For new songs we need to copy the events to the new log. 2010-12-20 Stefan Kost * src/lib/core/setup.c: Log machine id. * src/ui/edit/main-page-patterns.c: We need to create wire-patterns as needed. 2010-12-20 Stefan Kost * src/ui/edit/main-page-patterns.c: Add unod/redo for wire-columns. 2010-12-18 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Better default size. 2010-12-16 Stefan Kost * src/ui/edit/ui-resources.c: * src/ui/edit/wire-canvas-item.c: G_OBJECT_REF_COUNT() checks for obj!=NULL now. 2010-12-16 Stefan Kost * src/lib/core/machine.c: * src/lib/core/sequence.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * tests/lib/core/e-processor-machine.c: * tests/lib/core/e-sink-machine.c: * tests/lib/core/e-source-machine.c: When returning pattern-lists in machine ref them. Change the code to unref the machines when using the lists. Add a trickt in debug mode to catch unexpected pattern finalization. 2010-12-16 Stefan Kost * src/ui/edit/main-page-patterns.c: Fix a leak. 2010-12-16 Stefan Kost * src/ui/edit/main-page-machines.c: Handle item==NULL. 2010-12-16 Stefan Kost * src/ui/edit/edit-application.c: Cleanup debugging code. 2010-12-16 Stefan Kost * src/lib/core/song.c: G_OBJECT_REF_COUNT() checks for obj!=NULL now. 2010-12-16 Stefan Kost * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Use the right variable in warning. 2010-12-16 Stefan Kost * configure.ac: Use -Bsymbolic linker flag where supported. 2010-12-16 Stefan Kost * src/lib/core/gconf-settings.c: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/setup.c: * src/lib/core/song.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/lib/core/wire-pattern.c: * tests/bt-check.c: Fixes for a build with debug disabled. 2010-12-14 Stefan Kost * NEWSLETTER: Wrote and sent news. 2010-12-13 Stefan Kost * src/lib/core/sink-bin.c: Planning. 2010-12-10 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: Make string and checkbox preferences work. Add todos. * src/ui/edit/machine-properties-dialog.c: Whitespace. 2010-12-06 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/wire-analysis-dialog.c: Use g_value_dup_object() instead of get & ref. 2010-12-05 Stefan Kost * tests/refcount.gdb: Small fixups (tops and removed testing left-overs). * tests/refcount2.gdb: * tests/refcount2.gdb (added): Try to catch traces for more objects. 2010-12-04 Stefan Kost * TODO: Brooming. 2010-12-04 Stefan Kost * src/ui/edit/bt-edit.gtkrc: * src/ui/edit/main-page-waves.c: Use slim treeviews on the waves pages as well. 2010-12-04 Stefan Kost * src/ui/edit/main-menu.c: Use a toggle menu for fullscreen like anyone else. Gtk is not showing the icons in the menu anymore anyway (by default). 2010-12-04 Stefan Kost * src/ui/edit/main-page-sequence.c: Ensure that we set a (empty) model on pattern-list to show the columns. 2010-12-04 Stefan Kost * src/ui/edit/main-window.c: Use same detailed warning when losing unsaved changed due to "new" like we do for "Load". 2010-12-04 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Formatting and comment. 2010-12-02 Stefan Kost * src/lib/core/machine.c: * src/lib/core/setup.c: Avoid scanning the lists twice when removing entries. 2010-12-02 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Try tuning listview a bit. * src/ui/edit/main-page-sequence.c: Indenting. 2010-12-02 Stefan Kost * src/ui/edit/crash-recover-dialog.c: First get next entry and then delete and reselect. 2010-12-02 Stefan Kost * src/ui/edit/crash-recover-dialog.c: Reselect an entry after removing one. 2010-12-01 Stefan Kost * src/ui/edit/main-page-sequence.c: Remove unused var and the related ref/unref. 2010-11-29 Stefan Kost * src/ui/edit/main-page-patterns.c: Unref previous pattern before setting new active pattern. 2010-11-29 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/change-log-methods.h: * src/ui/edit/machine-menu.c: API docs update. 2010-11-29 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-page-patterns-methods.h: * src/ui/edit/main-page-patterns.c: Also refactor 2 internaly used methods into static functions and cache the current machine. 2010-11-29 Stefan Kost * src/ui/edit/main-page-sequence-methods.h: And also commit the changes in the header for prev. commit. 2010-11-29 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-page-sequence.c: We wwere using this function only one and that was even localy, so remove it. 2010-11-28 Stefan Kost * tests/refcount.gdb: * tests/refcountfilter.pl: * tests/refcount.gdb (added): * tests/refcountfilter.pl (added): Add scripts for ref-count debugging. 2010-11-28 Stefan Kost * docs/reference/bt-cmd/.cvsignore: * docs/reference/bt-edit/.cvsignore: Ignore more. 2010-11-28 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: Add new api to check if the change log has an active context. * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: Change handling of groups, so that we tap into the object lifecycle. This avoid duplicated object traversal. 2010-11-28 Stefan Kost * src/ui/edit/main-page-sequence.c: Fix a temporary ref-leak. This fixes the test_machine_ref test. 2010-11-28 Stefan Kost * src/ui/edit/main-page-sequence.c: Avoid some re-fetching of data. Code cleanups. 2010-11-28 Stefan Kost * src/lib/core/sequence.c: Fix format string. * src/ui/edit/main-page-sequence.c: Add a lot more ref count logging. Whitespace and comment cleanups. 2010-11-28 Stefan Kost * tests/ui/edit/e-bt-machine-page.c: Reshuffle refs. 2010-11-28 Stefan Kost * tests/bt-check.h: Make macros free of side effects by using the temp var. 2010-11-28 Stefan Kost * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/tools.c: Some attempt for tagging ref-counts to aid debugging. Unused as of side effects. 2010-11-27 Stefan Kost * src/ui/edit/main-menu.c: Fix the build. 2010-11-27 Stefan Kost * src/lib/core/sequence.c: More logging and code cleanup. * src/lib/core/setup.c: More logging. * src/ui/edit/main-menu.c: Small name cleanup. 2010-11-27 Stefan Kost * tests/bt-check.h: * tests/bt-test-plugin.c: * tests/lib/core/e-song-io-native.c: * tests/ui/cmd/e-bt-cmd-application.c: * tests/ui/cmd/t-bt-cmd-application.c: * tests/ui/edit/e-bt-about-dialog.c: * tests/ui/edit/e-bt-change-log.c: * tests/ui/edit/e-bt-controller-learn-dialog.c: * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-interaction-controller-menu.c: * tests/ui/edit/e-bt-machine-actions.c: * tests/ui/edit/e-bt-machine-page.c: * tests/ui/edit/e-bt-machine-preferences-dialog.c: * tests/ui/edit/e-bt-machine-preset-properties-dialog.c: * tests/ui/edit/e-bt-machine-properties-dialog.c: * tests/ui/edit/e-bt-machine-rename-dialog.c: * tests/ui/edit/e-bt-missing-framework-elements-dialog.c: * tests/ui/edit/e-bt-missing-song-elements-dialog.c: * tests/ui/edit/e-bt-pattern-page.c: * tests/ui/edit/e-bt-pattern-properties-dialog.c: * tests/ui/edit/e-bt-render-dialog.c: * tests/ui/edit/e-bt-render-progress-dialog.c: * tests/ui/edit/e-bt-settings-dialog.c: * tests/ui/edit/e-bt-tip-dialog.c: * tests/ui/edit/e-bt-wire-analysis-dialog.c: * tests/ui/edit/t-bt-pattern-page.c: Use out gobject-ref count accessor macro. 2010-11-27 Stefan Kost * src/lib/core/machine.c: * src/lib/core/wire.c: Deactivate deep-notifies. 2010-11-26 Stefan Kost * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/processor-machine.c: * src/lib/core/setup.c: * src/lib/core/sink-machine.c: * src/lib/core/source-machine.c: Add more ref count logging and unify the log lines. 2010-11-26 Stefan Kost * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: * src/ui/cmd/Makefile.am: * src/ui/edit/Makefile.am: Remove double libintl entries and reorder libs. 2010-11-25 Stefan Kost * src/ui/edit/main-page-sequence.c: Disconnect more signal handlers when shutting down. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: More ref-leak fixes. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Comment and logging changes. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: Fix a few ref count leaks. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: Remove left over quarks. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Small logging update. 2010-11-25 Stefan Kost * configure.ac: Tell wheter we build check based unit test in final sumary. 2010-11-25 Stefan Kost * src/ui/edit/main-page-patterns.c: * tests/ui/edit/e-bt-machine-page.c: Try to remove other pages to narrow down ref-leak. 2010-11-25 Stefan Kost * po/POTFILES.in: Add new source files. 2010-11-24 Stefan Kost * tests/ui/edit/e-bt-machine-page.c: Fix some silly typos in the new test. 2010-11-24 Stefan Kost * tests/ui/edit/e-bt-change-log.c: Make change-log test work again. 2010-11-24 Stefan Kost * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-change-log.c: * tests/ui/edit/e-bt-machine-page.c: * tests/ui/edit/s-bt-machine-page.c: * tests/ui/edit/s-bt-pattern-page.c: * tests/ui/edit/e-bt-machine-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-machine-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-machine-page.c (added): * tests/ui/edit/s-bt-machine-page.c (added): Add a new test for machine page. 2010-11-24 Stefan Kost * tests/ui/edit/e-bt-change-log.c: A few updates for API changes. We seem to still have a ref-leak. 2010-11-24 Stefan Kost * configure.ac: Handle gconf-less build better. 2010-11-16 Stefan Kost * src/ui/edit/main-page-machines.c: Try the new undo/redo groups and include wires when removing a machine. 2010-11-15 Stefan Kost * src/ui/edit/main-page-machines.c: More planning on change groups. 2010-11-15 Stefan Kost * src/ui/edit/change-log.c: Redo groups in reverse order. 2010-11-14 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: Implement change grouping into signle undo/redo-able items. 2010-11-14 Stefan Kost * src/ui/edit/change-log.c: Set log to be line-buffered so that we don't need to call fflush(). Add more planning comments. 2010-11-14 Stefan Kost * src/ui/edit/main-page-patterns.c: Add undo/redo for add/remove patterns. 2010-11-13 Stefan Kost * NEWSLETTER: Wrote and sent news. 2010-11-11 Stefan Kost * src/ui/edit/change-log.c: Free the logfile also if there is no new song. * src/ui/edit/edit-application.c: Set song to NULL to be sure that noone reds it afterwards. * src/ui/edit/main-page-machines.c: Unref the change-log to ensure that the log is removed at exit. 2010-11-11 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/change-log.h: Sort the log entries by mtime. * src/ui/edit/crash-recover-dialog.c: Set a better initial size. 2010-11-11 Stefan Kost * src/ui/edit/main-page-waves.c: Disable a minimal size hack, as it was still causing clipping on some font+theme combos. 2010-11-11 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-page-machines-methods.h: * src/ui/edit/main-page-machines.c: * src/ui/edit/wire-canvas-item.c: Implement serializing wire removal. 2010-11-11 Stefan Kost * src/ui/edit/main-page-waves.c: Set the fixed chars width of index column in wavetable list. Whitespace fixes. 2010-11-10 Stefan Kost * docs/help/bt-edit/C/buzztard-edit.xml: Add small tracker tutorial and improve wavetable section. * omf.make: Fix srcdir!=builddir 2010-11-09 Stefan Kost * docs/help/bt-edit/C/buzztard-edit.xml: Small doc clarification for using the wave-table. 2010-11-08 Stefan Kost * src/ui/edit/main-page-machines.c: Basic undo/redo of adding/removing wires. Removing needs to serialize the action still. 2010-11-08 Stefan Kost * src/ui/edit/main-toolbar.c: Properly reset trickplay modes. Spotted by Joe Pea. 2010-11-07 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/lib/core/libbuzztard-core/setup-methods.h: * src/lib/core/setup.c: * src/ui/edit/change-logger-methods.h: * src/ui/edit/change-logger.c: * src/ui/edit/change-logger.h: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu-methods.h: * src/ui/edit/machine-menu.c: * src/ui/edit/main-page-machines-methods.h: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: Refactor adding/removing machines, so that we have the main work in the machine-page class. Implement basic undo/redo there. 2010-11-07 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-edit/Makefile.am: Also move the man-page rules into the conditional section. 2010-11-04 Stefan Kost * configure.ac: Allow disabling the gobject introspection to get things building if gi got changed. Should Fix #3102744. 2010-11-02 Stefan Kost * src/ui/dec/bt-dec.c: Comment fix and TODO update. 2010-11-02 Stefan Kost * src/ui/edit/main-page-machines.c: Add change-logger iface and add todo comments. * src/ui/edit/main-page-patterns.c: Fix string leak and add more comments. Factor out code to update machine and pattern. 2010-11-02 Stefan Kost * NEWS: Prepare NEWS * NEWSLETTER: Prepare monthly NEWS 2010-10-15 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/change-log.c: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: Add a menu item for recovering change-log entries. Refactor code in edit application to expose running the dialog as public method. 2010-10-15 Stefan Kost * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: * src/ui/edit/edit-application.c: Add a "crash-logs" property to change log to get acccess to the found crash logs. Make bt_change_log_crash_check private. 2010-10-13 Stefan Kost * src/lib/core/pattern.c: * src/lib/core/sequence.c: * src/lib/core/wire-pattern.c: Do a two pass update we insert/delete wos/columns so that we invalidate what was there before and what is after the change. This fixes not updating e.g. the cell on the cursor when inserting. Fixes #3086450. 2010-10-13 Stefan Kost * NEWSLETTER: News sent. * src/lib/core/machine.c: Small comment fix. * src/lib/core/sequence.c: Whitespace fix. * tests/Makefile.am: Use target in rule. 2010-10-06 Stefan Kost * design/input/jstest.c: Fix a leak in a test. 2010-09-25 Stefan Kost * NEWSLETTER: Collect things I did. * src/ui/edit/change-log.c: * src/ui/edit/crash-recover-dialog.c: More planning. Handle return code more. Allow deleting left over crash logs. * src/ui/edit/edit-application.c: Comment and disable a sanity check in releases. 2010-09-24 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/crash-recover-dialog.c: Move planning. * src/ui/edit/main-page-patterns.c: Don't crash when having no pattern. 2010-09-24 Stefan Kost * src/lib/ic/registry.c: Add a comment with udevadm example. * src/ui/edit/change-log.c: Create unique change-log names. Add some more thoughts. * src/ui/edit/crash-recover-dialog.c: Update doc-blob. Add more thoughts. * src/ui/edit/settings-dialog.c: Remove commented out line. 2010-09-24 Stefan Kost * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/settings-dialog.c: Improve dialog layouts. 2010-09-24 Stefan Kost * src/lib/ic/registry.c: Get human readable names from gudev. 2010-09-24 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/main-page-patterns.c: Register ChangeLoggers and run reply. 2010-09-23 Stefan Kost * src/ui/edit/change-log.c: Flesh out recovery a bit more. 2010-09-23 Stefan Kost * src/lib/core/gconf-settings.c: Defer loading gconf keys until we need them. * src/ui/cmd/cmd-application.c: Remove hack running mainloop as a thread. This was causing some tests to fails as we quiteed the mainloop from the main-thread. 2010-09-22 Stefan Kost * src/ui/cmd/bt-cmd.c: Remove testing left-over. * src/ui/edit/about-dialog-methods.h: * src/ui/edit/tip-dialog-methods.h: * src/ui/edit/tip-dialog.c: * src/ui/edit/tip-dialog.h: Clean up copy and paste comments. * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/change-log.c: * src/ui/edit/change-log.h: * src/ui/edit/crash-recover-dialog-methods.h: * src/ui/edit/crash-recover-dialog.c: * src/ui/edit/crash-recover-dialog.h: * src/ui/edit/edit-application.c: * src/ui/edit/crash-recover-dialog-methods.h (svn:keywords, svn:eol- style): * src/ui/edit/crash-recover-dialog.h (svn:keywords, svn:eol-style): * src/ui/edit/crash-recover-dialog.c (svn:keywords, svn:eol-style): * src/ui/edit/crash-recover-dialog.c (added): * src/ui/edit/crash-recover-dialog.h (added): * src/ui/edit/crash-recover-dialog-methods.h (added): Add basic crash recover dialog. Gather more info in the crash log checker. Setup most of the workflow for replay. 2010-09-22 Stefan Kost * design/settings/gconftest.c: Add gconf tracing var. 2010-09-22 Stefan Kost * design/settings/gconftest.c: * design/settings/gconftest.c (svn:keywords, svn:eol-style): * design/settings (added): * design/settings/gconftest.c (added): Add a simple gconf test. * src/lib/core/gconf-settings.c: Handle more errors and add more logging. 2010-09-21 Stefan Kost * design/gobject/gobjectlife.c: * design/gobject/gobjectnotify.c: * design/gobject/gobjectpropflags.c: * design/gobject/gobjectprops.c: * design/gobject/gobjectprops.c (svn:keywords, svn:eol-style): * design/gobject/gobjectnotify.c (svn:keywords, svn:eol-style): * design/gobject/gobjectlife.c (svn:keywords, svn:eol-style): * design/gobject/gobjectpropflags.c (svn:keywords, svn:eol-style): * design/gobject/gobjectprops.c (added): * design/gobject/gobjectnotify.c (added): * design/gobject/gobjectpropflags.c (added): * design/gobject/gobjectlife.c (added): Add gobject tests. 2010-09-21 Stefan Kost * src/lib/core/wave.c: Set loader pipeline state to NULL before freeing. 2010-09-21 Stefan Kost * src/lib/core/gconf-settings.c: * src/lib/core/plainfile-settings.c: * tests/bt-test-settings.c: Small string gvalue optimization. 2010-09-21 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-ic/Makefile.am: Update doc makefiles for srcdir!=builddir. * src/lib/core/settings.c: * src/lib/ic/registry.c: * src/ui/edit/change-log.c: * src/ui/edit/edit-application.c: * src/ui/edit/ui-resources.c: Use weak_pointers to nullify singleton on last finalize. Allows us to avoid finalize impls here and there. 2010-09-21 Stefan Kost * Makefile.am: Remove some more shave leftovers. * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Fix distcheck for generated pc file. * src/lib/core/gconf-settings.c: Also disconnect the signal watch. 2010-09-20 Stefan Kost * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: More use of G_DEFINE_TYPE in ui. 2010-09-20 Stefan Kost * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/sequence-view.c: * src/ui/edit/tip-dialog.c: More use of G_DEFINE_TYPE in ui. 2010-09-20 Stefan Kost * src/ui/edit/main-page-sequence.c: Fix assertion in focus() vmethod impl. 2010-09-20 Stefan Kost * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/panorama-popup.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/ui-resources.c: * src/ui/edit/volume-popup.c: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-analysis-dialog.c: More use of G_DEFINE_TYPE in ui. 2010-09-20 Stefan Kost * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/wire-canvas-item.c: More use of G_DEFINE_TYPE in ui. 2010-09-20 Stefan Kost * NEWS: Allow running make distcheck. * src/lib/ic/registry.c: Whitespace. * src/ui/edit/tools.h: Fix include, we don't need the local one anymore. * tests/bt-check.c: Fix build with deprecated api. 2010-09-19 Stefan Kost * src/lib/ic/registry.c: Add one extra comment. * src/ui/edit/about-dialog.c: * src/ui/edit/change-log.c: * src/ui/edit/change-logger.c: * src/ui/edit/edit-application.c: * src/ui/edit/gtkvumeter.c: Start using G_DEFINE_TYPE in ui. 2010-09-19 Stefan Kost * src/lib/ic/registry.c: Add oss midi devices. Add info about how to get better names. Fix the build when using HAL. 2010-09-15 Stefan Kost * src/lib/core/gconf-settings.c: Debug logging. * src/lib/ic/registry.c: Don't hide devices without controls, if the implement learn iface. 2010-09-15 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-cmd/buzztard-cmd-docs.sgml: * docs/reference/bt-cmd/buzztard-cmd-sections.txt: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-core/buzztard-core-docs.sgml: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-ic/Makefile.am: * docs/reference/bt-ic/buzztard-ic-docs.sgml: * docs/reference/bt-ic/buzztard-ic-sections.txt: * src/lib/core/libbuzztard-core/song-io.h: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/libbuzztard-core/wire.h: * src/lib/core/tools.c: * src/ui/edit/change-log.c: Documentation cleanup. 2010-09-14 Stefan Kost * src/lib/ic/registry.c: Add basic midi device filtering and pointer to how it was done in hal. 2010-09-14 Stefan Kost * NEWS: * docs/reference/bt-ic/buzztard-ic-sections.txt: * src/lib/ic/device.c: * src/lib/ic/libbuzztard-ic/device-methods.h: * src/lib/ic/registry.c: Use "sound" as subsytem for "alsa/oss". Dump device properties. Hide devices with no controls. 2010-09-14 Stefan Kost * src/lib/ic/input-device.c: * src/lib/ic/midi-device.c: Remove crap from _new() functions. 2010-09-14 Stefan Kost * configure.ac: * src/lib/ic/ic.c: * src/lib/ic/ic_private.h: * src/lib/ic/registry.c: Initial port for hal->gudev. 2010-09-13 Stefan Kost * src/lib/ic/registry.c: Check more errors and add more logging. * src/ui/cmd/bt-cmd.c: * src/ui/dec/bt-dec.c: Also init btic here (as we might load songs with ic-assignments. 2010-09-13 Stefan Kost * configure.ac: Remove commented out liboil code. 2010-09-10 Stefan Kost * NEWSLETTER: Gather NEWS. * src/ui/edit/main-page-patterns.c: Log object name too. 2010-09-08 Stefan Kost * src/ui/dec/bt-dec.c: Don't leak file extension array. 2010-09-07 Stefan Kost * src/lib/core/core.c: * src/lib/core/wave.c: Whitespace. * src/lib/core/wavelevel.c: Add missing weak_unref, fixes valgrind warning. * src/lib/core/wavetable.c: Reflow. 2010-09-07 Stefan Kost * src/lib/core/machine.c: Whitespaces. * src/lib/core/wire.c: Fix leaked pads. 2010-09-06 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/dec/bt-dec.c: * src/ui/edit/about-dialog.c: * src/ui/edit/machine-actions.c: * src/ui/edit/machine-actions.h: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/tools.c: * src/ui/edit/tools.h: Refactor for upcomming help iface removal. Use a common gtk_show_uri_simple(), not that we don't need the machine_help action anymore. 2010-09-05 Stefan Kost * src/lib/ic/learn.c: No need for the one time init check. 2010-09-05 Stefan Kost * src/lib/ic/learn.c: Small paramspec flag update. 2010-09-03 Stefan Kost * src/lib/ic/control.c: * src/lib/ic/device.c: This got fixed at some point in time. 2010-09-03 Stefan Kost * NEWSLETTER: Collect NEWS. 2010-09-03 Stefan Kost * src/lib/ic/abs-range-control.c: * src/lib/ic/control.c: * src/lib/ic/device.c: * src/lib/ic/input-device.c: * src/lib/ic/learn.c: * src/lib/ic/midi-device.c: * src/lib/ic/registry.c: * src/lib/ic/trigger-control.c: Use G_DEFINE_TYPE and co. 2010-09-02 Stefan Kost * src/lib/core/application.c: * tests/m-bt-edit.c: More logging. * tests/ui/edit/e-bt-controller-learn-dialog.c: In any case destroy the main window. Fixes the test. 2010-09-02 Stefan Kost * src/lib/core/song-info.c: Whitespace. * src/ui/edit/bt-edit.h: * src/ui/edit/main-window.c: Convert time to local timezone and show in local format. Also use different message for existing and new songs. 2010-09-01 Stefan Kost * src/lib/core/settings.c: * tests/lib/core/e-sink-machine.c: * tests/lib/core/e-song-io-native.c: * tests/lib/core/e-song.c: * tests/lib/core/t-sink-machine.c: * tests/m-bt-edit.c: * tests/ui/edit/e-bt-edit-application.c: More test cleanup and extra logging for test settings. We definitely have to use the factory method to get the singleton. 2010-08-31 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-edit/Makefile.am: Fix build without gtk-doc. 2010-08-31 Stefan Kost * src/ui/cmd/cmd-application.c: * src/ui/dec/bt-dec.c: More G_DEFINE_TYPE and co. use. 2010-08-31 Stefan Kost * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Removed the delayed focus grabs as we have overridden the vmethods. The idle ones where breaking the tests. * tests/bt-check.c: Try to kill those [Xlib: extension "RANDR" missing on display ":1.0".] messages once more, to no avail. * tests/m-bt-edit.c: Cleanup some commented out stuff. 2010-08-31 Stefan Kost * src/ui/Makefile.am: * src/ui/dec/bt-dec.c: Enable bt-dec now. Add a built-in app subclass to fix gobject warnings (btapp is now abstract). Fix typefinder to match only known mimetypes. Remove left-over parameter on the app-constructor. 2010-08-31 Stefan Kost * src/lib/core/libbuzztard-core/settings-private.h: * tests/bt-test-settings.c: * tests/bt-test-settings.h: Add missing entries to test settings. * tests/m-bt-edit.c: * tests/ui/edit/e-bt-controller-learn-dialog.c: * tests/ui/edit/e-bt-edit-application.c: WIP of getting some sane default settings. Tests fails as the tips dialog is comming up by default. 2010-08-31 Stefan Kost * src/lib/core/application.c: * tests/Makefile.am: * tests/bt-check.h: * tests/bt-test-application.c: * tests/bt-test-application.h: * tests/bt-test-plugin.c: * tests/bt-test-settings.c: * tests/lib/core/e-machine.c: * tests/lib/core/e-network.c: * tests/lib/core/e-pattern.c: * tests/lib/core/e-processor-machine.c: * tests/lib/core/e-sequence.c: * tests/lib/core/e-setup.c: * tests/lib/core/e-sink-machine.c: * tests/lib/core/e-song-info.c: * tests/lib/core/e-song-io-native.c: * tests/lib/core/e-song.c: * tests/lib/core/e-source-machine.c: * tests/lib/core/e-wire-pattern.c: * tests/lib/core/t-machine.c: * tests/lib/core/t-network.c: * tests/lib/core/t-pattern.c: * tests/lib/core/t-sequence.c: * tests/lib/core/t-setup.c: * tests/lib/core/t-sink-machine.c: * tests/lib/core/t-song-io-native.c: * tests/lib/core/t-song-io.c: * tests/lib/core/t-song.c: * tests/lib/core/t-source-machine.c: * tests/lib/core/t-wire.c: * tests/ui/edit/e-bt-edit-application.c: * tests/bt-test-application.h (svn:keywords, svn:eol-style): * tests/bt-test-application.c (svn:keywords, svn:eol-style): * tests/bt-test-application.c (added): * tests/bt-test-application.h (added): Big test cleanup. Use a test application to be able to make application an abstract base class. Simplify some of the test settings use. 2010-08-30 Stefan Kost * src/lib/core/childproxy.c: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/persistence.c: Use G_DEFINE_INTERFACE and conditioaly add glib defines for people with older glibs. 2010-08-30 Stefan Kost * src/lib/core/wire.c: Remove threadbarrier experiemnt and use "silent" property on queue if available. 2010-08-29 Stefan Kost * src/lib/core/application.c: * src/lib/core/gconf-settings.c: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/plainfile-settings.c: * src/lib/core/settings.c: More G_DEFINE_TYPE usage. libbuzztardcore is done. 2010-08-29 Stefan Kost * src/lib/core/libbuzztard-core/processor-machine.h: * src/lib/core/libbuzztard-core/sink-machine.h: * src/lib/core/libbuzztard-core/source-machine.h: * src/lib/core/processor-machine.c: * src/lib/core/sink-machine.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io-native.c: * src/lib/core/source-machine.c: Kill more dummy implementations (dispose/finalize and properties). Lets add those when we actualy need them. 2010-08-29 Stefan Kost * src/lib/core/libbuzztard-core/settings.h: * src/lib/core/libbuzztard-core/song-io-native-xml.h: * src/lib/core/libbuzztard-core/song-io-native.h: * src/lib/core/processor-machine.c: * src/lib/core/sequence.c: * src/lib/core/settings.c: * src/lib/core/setup.c: * src/lib/core/sink-bin.c: * src/lib/core/sink-machine.c: * src/lib/core/song-info.c: * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io-native.c: * src/lib/core/song-io.c: * src/lib/core/song.c: * src/lib/core/source-machine.c: More G_DEFINE_TYPE usage. Also kill PrivateData where we don't needed. 2010-08-28 Stefan Kost * src/lib/core/wave.c: * src/lib/core/wavelevel.c: * src/lib/core/wavetable.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: Start using G_DEFINE_TYPE and co. 2010-08-26 Stefan Kost * src/lib/core/sink-bin.c: Emit errors for all missing eleemnts. * src/ui/cmd/cmd-application.c: Start the main loop arctually for real. * src/ui/edit/main-toolbar.c: Whitespace. * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: Catch missing element errors here too. Cut the path part from the file-name, as we will use that with recording dir. 2010-08-26 Stefan Kost * src/lib/core/wire.c: Comment out the threadbarrier test. We're going to do this differently. * src/ui/cmd/cmd-application.c: Use a separate thread for the main-loop. This gives us better error handling. Remove the polling code. 2010-08-25 Stefan Kost * src/lib/core/sink-bin.c: * src/ui/cmd/cmd-application.c: Now we're catching the error and stopping. 2010-08-24 Stefan Kost * src/lib/core/Makefile.am: * src/lib/core/core.c: * src/lib/core/libbuzztard-core/core.h: * src/lib/core/sink-bin.c: * src/ui/cmd/cmd-application.c: Initial code to post missing element errors and catch them in bt-cmd. 2010-08-23 Stefan Kost * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-pages.c: * src/ui/edit/tools.c: Focus grab improvements. Override the container focus() method as we have a good idea what we'd like to focus on instead. * src/ui/edit/pattern-editor.c: Add idea. 2010-08-20 Stefan Kost * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Get rid of _docus_child hacks. Now sometimes the grab on pattern page fails. 2010-08-19 Stefan Kost * design/gui/pixbufs.c: * design/gui/svgcanvas2.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/tools.c: * src/ui/edit/ui-resources.c: * design/gui/pixbufs.c (svn:keywords, svn:eol-style): * design/gui/pixbufs.c (added): Experiemnt with the svg icon failure on suse-11.3. Add a new pixbuf tester. File a bug to suse with the fix. Make our icons for now blurry, but correctly sized in all cases. 2010-08-18 Stefan Kost * design/gui/rulers.c: Add Comments and use a define for a constant. 2010-08-18 Stefan Kost * design/gui/rulers.c: * design/gui/rulers.c (added): Add new test toy. * design/gui/stylecolors.c: Small style cleanups. 2010-08-16 Stefan Kost * src/ui/edit/pattern-editor.c: Fix assertion - this needs the gdk-window first. 2010-08-16 Stefan Kost * src/ui/edit/wire-analysis-dialog.c: Add idea and go back from 5fps to 10fps. 2010-08-16 Stefan Kost * po/LINGUAS: * po/fi.po: * po/fi.po (added): Add finish translation. 2010-08-15 Stefan Kost * tests/bt-test-settings.c: Fix bogus double assignments. 2010-08-13 Stefan Kost * src/ui/edit/change-log.c: Added truncating and renaming. Turn changeLog inactive if we can't get a suitable diretory. * src/ui/edit/main-window.c: Show last save date in check-quit dialog. 2010-08-11 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/edit-application.c: Implement sanity checks in the crash log scan. 2010-08-11 Stefan Kost * src/lib/core/song.c: * src/ui/edit/wire-analysis-dialog.c: Remove comemnted out code and fixed todo comments. 2010-08-11 Stefan Kost * src/lib/core/wire.c: Set "max-size-buffer" to 2 to avoid disconts. Add some test code for threadbarrier patch. * src/ui/edit/wire-analysis-dialog.c: Init the gradient. Set "max-size-buffer" to 10 to fix spectrum resets due to disconts. Raise the floor a bit. 2010-08-11 Stefan Kost * src/ui/edit/wire-analysis-dialog.c: Add precission parameter. Cache log10 values. Fix the height scaling and invert data so that we can memset the empty spectrum (floor=0). 2010-08-08 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/tools.h: Add a new macro to check for empty gvalues. Fixes the checking that otherwise could be disabled with compiler flags. Also this variant is cheaper. * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/sequence.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: Use new BT_IS_GVALUE macro. Move lots of self->priv->.. dereferences out of loops. This allows the compiler to avoid refetching e.g. the loop end condition for each cycle. Strangely this makes the code a bit bigger. 2010-08-08 Stefan Kost * src/lib/core/sink-machine.c: Whitespace and get rid of obsolete prototype. * src/ui/cmd/cmd-application.c: Check for empty songs befor playing. * tests/bt-cmd-cli.sh: Add more echo cmds to get better feedback. 2010-08-07 Stefan Kost * src/ui/dec/bt-dec.c: Fix new name in comments. * src/ui/edit/change-log.c: Fix off by one in stack truncation. * tests/ui/edit/e-bt-edit-application.c: Do the event loop before closing the window to fix late signal handlers. 2010-08-07 Stefan Kost * tests/bt-check.c: Check function in in separate field in new log handler. Now the core test pass again. 2010-08-07 Stefan Kost * src/ui/dec/bt-dec.c: Update comments. * tests/bt-check.c: * tests/m-bt-edit.c: Catch up with gstreamer logging subsystem behavioural changes. 2010-08-07 Stefan Kost * configure.ac: * src/ui/dec (added): * src/ui/bin (deleted): * src/ui/bin/bt-dec.c (deleted): * src/ui/bin/bt-dec.h (deleted): * src/ui/bin/Makefile.am (deleted): * src/ui/dec/bt-dec.h (added): * src/ui/dec/bt-dec.c (added): * src/ui/dec/Makefile.am (added): And also rename the dir. 2010-08-07 Stefan Kost * src/lib/core/application.c: * src/ui/bin/Makefile.am: * src/ui/bin/bt-dec.c: * src/ui/bin/bt-dec.h: * src/ui/cmd/cmd-application.c: * src/ui/edit/edit-application.c: * src/ui/bin/bt-dec.c (added): * src/ui/bin/bt-dec.h (added): * src/ui/bin/bt-bin.h (deleted): * src/ui/bin/bt-bin.c (deleted): Rename bt-bin to bt-dec and go for the separate pipeline approach. Thus we can also revert the change to appliation to make the bin setable. 2010-08-06 Stefan Kost * src/ui/edit/main-toolbar.c: Reduce variable scope. * src/ui/edit/wire-analysis-dialog.c: Use cairo to paint the graphs. Add log mapping for the spectrum (needs work for the ruler). Make spectrum graph look nicer. Fix scaling of the volume level bars. 2010-07-15 Stefan Kost * src/ui/bin/bt-bin.c: Send EOS in fakesink callback now. 2010-07-15 Stefan Kost * src/lib/core/song.c: Revert some temp logging and log more seek details elsewhere. * src/ui/bin/bt-bin.c: Update comments. Improve seek handling, but still no stopping :/ 2010-07-15 Stefan Kost * src/lib/core/song-io.c: Fix comment typo. * src/ui/edit/bt-edit.h: * src/ui/edit/change-log.c: * src/ui/edit/edit-application.c: Run crash log scan on app launch. Make it build and skip current active log. 2010-07-13 Stefan Kost * src/ui/bin/bt-bin.c: Handle queries better and update todo. 2010-07-13 Stefan Kost * src/lib/core/sink-bin.c: Fix enum value. * src/lib/core/song.c: Whitespace and logging. * src/ui/bin/bt-bin.c: * src/ui/bin/bt-bin.h: Now seeking and rate changes work. Also pausing, stopiing and playing several times works. Seeking still needs detail fixes. 2010-07-09 Stefan Kost * NEWSLETTER: Sent news. * src/ui/bin/bt-bin.c: Some alternative ideas. 2010-07-08 Stefan Kost * src/lib/core/wave.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-toolbar.c: Improved error logging. 2010-07-08 Stefan Kost * src/lib/core/machine.c: Whitespace. * src/lib/core/song-info.c: Init taglist more and use better version cehck. * src/lib/core/song.c: Send tags. Some attempts to sync things with bt-bin. * src/ui/bin/bt-bin.c: * src/ui/bin/bt-bin.h: Keep bin-pad. Add basic src-pad event and query. 2010-07-07 Stefan Kost * src/lib/core/libbuzztard-core/sink-bin.h: * src/lib/core/sink-bin.c: Add pass-thru mode needed for bt-bin. * src/ui/bin/bt-bin.c: Set up the chain of ghostpads. gst-launch playbin2 works! 2010-07-06 Stefan Kost * NEWSLETTER: Write news. 2010-07-05 Stefan Kost * NEWSLETTER: Collect news. 2010-06-27 Stefan Kost * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io.c: * src/ui/bin/bt-bin.c: Now actually load songs from memory. 2010-06-27 Stefan Kost * configure.ac: * src/lib/core/song.c: * src/ui/bin/Makefile.am: * src/ui/bin/bt-bin.c: * src/ui/bin/bt-bin.h: * src/ui/bin/bt-bin.c (svn:keywords, svn:eol-style): * src/ui/bin/bt-bin.h (svn:keywords, svn:eol-style): * src/ui/bin/Makefile.am (svn:keywords, svn:eol-style): * src/ui/bin (added): * src/ui/bin/bt-bin.h (added): * src/ui/bin/Makefile.am (added): * src/ui/bin/bt-bin.c (added): Add initial version of bt-bin (buzztard song-player for gstreamer based players). Not build by default yet. 2010-06-22 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/song-io-methods.h: * src/lib/core/libbuzztard-core/song-io.h: * src/lib/core/song-io-native.c: * src/lib/core/song-io.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: * src/ui/edit/change-log.h: * src/ui/edit/edit-application.c: * src/ui/edit/main-page-machines.c: * tests/lib/core/e-song-info.c: * tests/lib/core/e-song-io-native.c: * tests/lib/core/e-song-io.c: * tests/lib/core/e-song.c: * tests/lib/core/t-sink-machine.c: * tests/lib/core/t-song-io-native.c: * tests/lib/core/t-song-io.c: * tests/lib/core/t-song.c: BtSongIO api changes: have a init function instead of detect, add GTypes to the plugin module info. Have a generic detect function. Add a second song_io constructure for in memory data. 2010-06-22 Stefan Kost * src/lib/core/setup.c: White space. * src/lib/core/tools.c: Reword API docs. * src/lib/core/application.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/edit-application.c: Make 'bin' a construct only, but writable property so that subclasses can set the container. 2010-06-14 Stefan Kost * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: Ideas about api changes for bt-bin. 2010-06-14 Stefan Kost * docs/reference/bt-cmd/buzztard-cmd-docs.sgml: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit.xml: * docs/reference/bt-edit/buzztard-edit.xml (added): Add man-page for buzztard-edit and move the man pages to separate section in the interface docs. 2010-06-14 Stefan Kost * docs/reference/bt-cmd/buzztard-cmd.xml: Update page to get rid of all warnings. 2010-06-13 Stefan Kost * configure.ac: * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-cmd/buzztard-cmd-docs.sgml: * docs/reference/bt-cmd/buzztard-cmd.xml: * docs/reference/bt-cmd/buzztard-cmd.xml (added): Add a man-page for buzztard-cmd. 2010-06-10 Stefan Kost * src/ui/edit/change-log.c: Downgrade some logging. * src/ui/edit/main-page-patterns.c: Take machine and pattern into account for undo/redo. 2010-06-10 Stefan Kost * tests/ui/edit/e-bt-change-log.c: Add test for checking that edits after undo, truncate the stack. 2010-06-09 Stefan Kost * design/gst/.cvsignore: * design/gui/.cvsignore: * design/gui/canvas-redraw.c: * design/input/.cvsignore: * design/input (svn:ignore): * design/gui/canvas-redraw.c (svn:keywords, svn:eol-style): * design/gst (svn:ignore): * design/gui (svn:ignore): * design/input/.cvsignore (added): * design/gui/canvas-redraw.c (added): More svn maintenance. 2010-06-08 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/main-page-patterns.c: More undo/redo planning. 2010-06-08 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Use glib types for portability and consistency. 2010-06-08 Stefan Kost * docs/reference/.cvsignore: * po/.cvsignore: * src/ui/cmd/.cvsignore: * src/ui/edit/.cvsignore: * po (svn:ignore): * src/ui/edit (svn:ignore): * docs/reference (svn:ignore): * src/ui/cmd (svn:ignore): Ignore more files. 2010-06-08 Stefan Kost * docs/help/bt-edit/C/.cvsignore: * docs/reference/bt-cmd/.cvsignore: * docs/reference/bt-core/.cvsignore: * docs/reference/bt-edit/.cvsignore: * docs/reference/bt-ic/.cvsignore: * docs/reference/bt-ic (svn:ignore): * design/gui (svn:ignore): * docs/reference/bt-edit (svn:ignore): * docs/reference/bt-core (svn:ignore): * src/ui/edit (svn:ignore): * docs/reference (svn:ignore): * design/bmxdump (svn:ignore): * design/gui/pixmaps (svn:ignore): * docs/help/bt-edit/C (svn:ignore): * src/ui/cmd (svn:ignore): * docs/reference/bt-cmd (svn:ignore): Ignore more files. 2010-06-08 Stefan Kost * .cvsignore: * design/gst/.cvsignore: * design/gui/.cvsignore: * docs/help/bt-edit/.cvsignore: * docs/help/bt-edit/C/.cvsignore: * src/lib/core/.cvsignore: * src/lib/ic/.cvsignore: * (svn:ignore): * src/lib/core (svn:ignore): * design/gst (svn:ignore): * docs/help/bt-edit (svn:ignore): * src/lib/ic (svn:ignore): * design/gui (svn:ignore): * docs/help/bt-edit/C (svn:ignore): Repository maintenance. 2010-06-08 Stefan Kost * src/ui/edit/change-log.c: More comments. * src/ui/edit/main-page-patterns.c: Implement for voice data. More comments. 2010-06-08 Stefan Kost * docs/buzztard.xsd: * src/lib/core/machine.c: * src/lib/core/sequence.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: * tests/songs/combi1.xml: * tests/songs/combi2.xml: * tests/songs/combi3.xml: * tests/songs/melo1.xml: * tests/songs/melo2.xml: * tests/songs/melo3.xml: * tests/songs/melo4.xml: * tests/songs/melo5.xml: * tests/songs/simple1.xml: * tests/songs/simple2.xml: * tests/songs/simple3.xml: * tests/songs/simple4.xml: * tests/songs/simple5.xml: * tests/songs/simple6.xml: * tests/xmlvalid.sh: Improve xsd schema and make songs validatable. Read older tags as a fallback. Avoid saving empy lists in some places 2010-06-07 Stefan Kost * src/ui/edit/main-page-patterns.c: Use enums values instead of numbers in two more places. 2010-06-06 Stefan Kost * tests/bt-check.c: Allow wildcards in BT_CHECKS. * tests/ui/edit/e-bt-change-log.c: Add another test. 2010-06-06 Stefan Kost * NEWSLETTER: Sent NEWS. 2010-06-04 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/settings-methods.h: * src/lib/core/settings.c: * src/lib/core/sink-bin.c: * src/ui/edit/main-page-waves.c: Also sync the sinks used in wave table to the settings. Move code to figure the sink name from sink-bin to settings and use it in wave table too. Switch file-choser preview to playbin2. 2010-05-24 Stefan Kost * src/lib/core/machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: Fix spelling in comments/debug log, found by linitian :). 2010-05-24 Stefan Kost * src/lib/core/machine.c: * src/lib/core/song-io.c: * src/lib/core/song.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/render-dialog.c: Fix spelling in comments/debug log, found by linitian :). 2010-05-21 Stefan Kost * src/ui/edit/change-log.c: Only log if we have a log. * tests/ui/edit/e-bt-change-log.c: Improve the test and actualy make them work. 2010-05-20 Stefan Kost * tests/ui/edit/e-bt-change-log.c: Further implement the change log tester object and run a few basic tests. 2010-05-19 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-editor.h: Use the new enum values more. 2010-05-19 Stefan Kost * src/ui/edit/main-page-patterns.c: Fully restore cursor pos on undo/redo. * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Use an enum instead of the group type. Add typedefs for the enums. 2010-05-18 Stefan Kost * src/ui/edit/change-log.c: More design comments. * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-editor.c: Move cursor (need group and param still). * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-change-log.c: * tests/ui/edit/s-bt-change-log.c: * tests/ui/edit/e-bt-change-log.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-change-log.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-change-log.c (added): * tests/ui/edit/e-bt-change-log.c (added): Add initial tests for undo/redo. 2010-05-14 Stefan Kost * src/ui/edit/main-menu.c: Add menu accelerators for undo/redo. Some reformatting. 2010-05-14 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/main-page-patterns.c: More undo/redo implementation for patterns. More ideas about the serialisation and replay. 2010-05-13 Stefan Kost * src/lib/core/sequence.c: Make one more method static. 2010-05-13 Stefan Kost * src/lib/core/machine.c: * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/wave.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: Use g_type_qname() for error domain. Also experiemnt and add more info for G_DEFINE_TYPE usage. 2010-05-13 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Update widgets after we set the qdata, as the update functions need it and would otherwise trigger asserts. 2010-05-13 Stefan Kost * autogen.sh: Also kill shave from default args. 2010-05-12 Stefan Kost * NEWSLETTER: Sent news and start collecting new ones. * src/ui/edit/change-logger.c: Fix typo in log section name. 2010-05-12 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-edit/Makefile.am: * src/lib/core/Makefile.am: * src/ui/cmd/Makefile.am: * src/ui/edit/Makefile.am: * tests/Makefile.am: * tests/ui/cmd/Makefile.am: * tests/ui/edit/Makefile.am: Rework library linking order. We have to put needed libraries behind libraries that need them. This hopefully now fixes --as-needed fully. 2010-05-10 Stefan Kost * NEWSLETTER: Collecting news. * docs/reference/bt-cmd/Makefile.am: Revert change (yes saving a file before committing is great). * src/ui/edit/machine-properties-dialog.c: More prototyping for remaining copy'n'paste functions. * src/ui/edit/main-page-patterns.c: Whitespaces. 2010-05-09 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-edit/Makefile.am: Docs don't build with --as-needed. We could turn it off, but thats not portable :/ (linking would fail on linkers that don't know this). * src/ui/cmd/Makefile.am: * src/ui/edit/Makefile.am: Add all needed libraries to LIBADD of the convinience libraries. 2010-05-09 Stefan Kost * configure.ac: Correct commented out test, just for the case we'll need this again later on. 2010-05-09 Stefan Kost * src/ui/edit/gtkvumeter.c: Add cast to fix build warnings. 2010-05-09 Stefan Kost * src/ui/edit/main-page-waves.c: Revert some testing left overs. 2010-05-09 Stefan Kost * src/lib/core/persistence.c: Remove dummy code. * src/ui/edit/machine-properties-dialog.c: Code cleanups (use make_param for wire groups too). Use g_slice for callback user-data. More refactoring for copy'n'paste. * src/ui/edit/main-page-patterns.c: Skip empty lines when pasting. 2010-05-04 Stefan Kost * src/ui/edit/main-page-patterns.c: Move variable to inner scope. 2010-05-04 Stefan Kost * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-edit/buzztard-edit.types: Update docs for latest API additions and fix some typos. 2010-05-04 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/tools.c: * src/ui/edit/tools.h: Add a new helper to create the gtk target list to lessen the copy and paste. 2010-05-04 Stefan Kost * src/ui/edit/panorama-popup.c: * src/ui/edit/volume-popup.c: Copyright header cleanups. * src/ui/edit/change-logger-methods.h (svn:keywords): * src/ui/edit/wave-viewer.h (svn:keywords): * src/lib/ic/ic_private.h (svn:keywords): * src/ui/edit/wave-viewer.c (svn:keywords): * src/ui/edit/change-logger.c (svn:keywords): * src/ui/edit/panorama-popup.h (svn:keywords): * src/lib/core/wire-pattern.c (svn:keywords): * src/ui/edit/change-logger.h (svn:keywords): * src/lib/core/core_private.h (svn:keywords): * src/ui/edit/panorama-popup.c (svn:keywords): Svn Maintenance: svn propset svn:keywords 'Id' src/*/*/*.{c,h} 2010-05-04 Stefan Kost * src/ui/edit/panorama-popup.c: * src/ui/edit/volume-popup.c: Fix assertions by getting the GdkWindow after showing the popup. 2010-05-03 Stefan Kost * src/lib/core/sink-bin.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Code cleanups. 2010-05-03 Stefan Kost * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-page-patterns.c: Add copy for parameter values in property dialog (more stuff needed). 2010-05-03 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: * src/ui/edit/change-logger-methods.h: * src/ui/edit/change-logger.c: * src/ui/edit/change-logger.h: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/change-logger-methods.h (added): * src/ui/edit/change-logger.c (added): * src/ui/edit/change-logger.h (added): Add change logger iface. Add undo/redo to menu. Add prototype to pattern editor. * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/wire-canvas-item.c: Cleanup menu code (separators). 2010-05-03 Stefan Kost * src/lib/core/machine.c: Do read from trigger params. 2010-05-03 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Handle default combo values out of enum value range. 2010-05-02 Stefan Kost * src/lib/core/sink-bin.c: Disable audioconvert in encoder pipe, we use float anyway. * src/lib/core/machine.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: Enable dithering and noiseshaping on recording. 2010-04-29 Stefan Kost * src/ui/edit/change-log.c: Add header to log and do a bit more drafting. 2010-04-29 Stefan Kost * src/ui/edit/change-log.c: * src/ui/edit/change-log.h: * src/ui/edit/edit-application.c: Create and remove the journal file. * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/btmemoryaudiosrc.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-editor.h: API doc fixes. * src/lib/core/song-info.c: Copy and paste typo fix. * src/ui/edit/main-window.c: Better error reporting. * src/lib/core/song.c: Experiments. 2010-04-28 Stefan Kost * design/gst/controller.c: Tweak example. * src/ui/edit/change-log.c: Add cache dir and property. * src/ui/edit/edit-application.c: Fix typo. 2010-04-28 Stefan Kost * TODO: * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/change-log-methods.h: * src/ui/edit/change-log.c: * src/ui/edit/change-log.h: * src/ui/edit/change-log-methods.h (svn:keywords, svn:eol-style): * src/ui/edit/change-log.h (svn:keywords, svn:eol-style): * src/ui/edit/change-log.c (svn:keywords, svn:eol-style): * src/ui/edit/change-log-methods.h (added): * src/ui/edit/change-log.c (added): * src/ui/edit/change-log.h (added): Boilerplate for change log journaling. * src/ui/edit/ui-resources.h: Whitespace. 2010-04-27 Stefan Kost * design/gst/controller.c: * design/gst/controller.c (svn:keywords, svn:eol-style): * design/gst/controller.c (added): Add another example. * design/gst/states3a.c: Small example cleanups. 2010-04-26 Stefan Kost * src/lib/core/machine.c: No need to get the pad, we have that pre-cached. 2010-04-24 Stefan Kost * src/lib/core/Makefile.am: Remove buzztard-ic pkg config file for core gir generation to avoid cyclic dependency. Only external libs are needed here. 2010-04-20 Stefan Kost * src/lib/core/wave.c: Whitespaces. 2010-04-20 Stefan Kost * src/lib/core/processor-machine.c: * src/lib/core/sink-machine.c: * src/lib/core/source-machine.c: Fix portability issues caused by passing NULL for va_list. 2010-04-13 Stefan Kost * src/lib/core/song.c: Update TODO. * src/ui/edit/main-page-sequence.c: Downgrade a log. * src/ui/edit/main-toolbar.c: Use a define for the seek factor and timeouts. 2010-04-13 Stefan Kost * download-translations: * po/LINGUAS: * po/vi.po: * download-translations (svn:executable): * download-translations (added): * po/vi.po (added): Add new translation and add the script from gstreamer for managing them. 2010-04-13 Stefan Kost * configure.ac: Also tell about GI_TYPELIB_PATH for custum install locations. 2010-04-13 Stefan Kost * tests/bt-test-plugin.c: Switch to _set_details_simple to avoid using deprecated function. 2010-04-13 Stefan Kost * omf.make: Fix omf_dest_dir to get help catalogs into cotrrect place. 2010-04-13 Stefan Kost * configure.ac: Also check for typelib dir. Both dirs are not yet used. 2010-04-12 Stefan Kost * NEWSLETTER: Wrote NEWS. Collect for next round. * TODO: Add idea for updating translations. * src/lib/core/sink-bin.c: Remove old attempt to prestart sink-bin elements. * src/lib/core/song.c: Fix seek event in backwards playback. * src/ui/edit/main-page-sequence.c: Comment. * tests/songs/broken2.xml: Whitespaces. 2010-04-07 Stefan Kost * shave.in (deleted): * shave-libtool.in (deleted): Previous commit also switched to automake silent rules (if available). Lets complete this and remove shave again. 2010-04-07 Stefan Kost * configure.ac: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-ic/buzztard-ic-sections.txt: * src/lib/core/Makefile.am: * src/lib/core/core_private.h: * src/lib/core/libbuzztard-core/core.h: * src/lib/core/libbuzztard-core/version.h.in: * src/lib/ic/Makefile.am: * src/lib/ic/ic_private.h: * src/lib/ic/libbuzztard-ic/ic.h: * src/lib/ic/libbuzztard-ic/version.h.in: Improve out of sourcedir builds. 2010-04-04 Stefan Kost * src/ui/edit/btmemoryaudiosrc.c: Make ping pong playback work again. Remove unneeded _get_times vmethod. Use gst_element_class_set_details_simple() to save relocs. * src/ui/edit/main-page-waves.c: Use queries on the source to make playpos indicators work again. Fix play beg/end values if no loop is set. 2010-03-31 Stefan Kost * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-interaction-controller-menu.c: Destroy window, to unref the app. * tests/ui/edit/e-bt-machine-actions.c: Fix comment. 2010-03-31 Stefan Kost * tests/ui/edit/Makefile.am: * tests/ui/edit/s-bt-pattern-page.c: * tests/ui/edit/t-bt-pattern-page.c: * tests/ui/edit/t-bt-pattern-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/t-bt-pattern-page.c (added): Add two new tests to cover the issue reported in #2980015. 2010-03-31 Stefan Kost * tests/bt-test-settings.c: Add missing new settings. 2010-03-31 Stefan Kost * src/ui/edit/pattern-editor.c: Don't refresh cursor in pattern that have no groups. Fixes #2980015. 2010-03-30 Stefan Kost * src/lib/core/tools.c: gst_pad_get_caps_reffed() is only available in gstreamer-0.10.26. Use a less optimal function, if we don't have it. 2010-03-30 Stefan Kost * configure.ac: Improve checking of non-std install prefix. 2010-03-29 Stefan Kost * COPYING: * COPYING (added): Add LGPL COPYING file as automake cannot be asked to copy that one instead of a GPL one. 2010-03-24 Stefan Kost * src/lib/core/sink-bin.c: Rework state-change handling. No more fiddling with the bus. Keep sink locked in READY to keep connection to pulse/jack. 2010-03-24 Stefan Kost * src/lib/core/song.c: Logging and code cleanups. Also don't warn in the case of success. 2010-03-24 Stefan Kost * src/ui/edit/settings-page-audiodevices.c: More detailed logging. 2010-03-23 Stefan Kost * src/ui/edit/machine-menu.c: Whitespace. * src/ui/edit/settings-page-audiodevices.c: Idea comment. 2010-03-23 Stefan Kost * src/ui/edit/settings-page-audiodevices.c: Improve filtering. 2010-03-23 Stefan Kost * src/ui/edit/about-dialog.c: * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/sequence-view.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Add more logging and fix a ref-count cycle between edit-application and playback-controller-socket. 2010-03-15 Stefan Kost * src/lib/core/machine.c: No need to copy static strings. * src/ui/edit/buzztard-edit.desktop.in.in: According to this post http://lists.fedoraproject.org/pipermail/devel/2010-March/133523.html we should add this flag. 2010-03-06 Stefan Kost * NEWSLETTER: Wrote and send NEWS. 2010-02-26 Stefan Kost * design/gui/levelmeter.c: * src/ui/edit/gtkvumeter.c: * design/gui/levelmeter.c (svn:keywords, svn:eol-style): * design/gui/levelmeter.c (added): Add an standalone example for the level meter widget and tune the resize behaviour. Previously it was overdrawing the max border. 2010-02-24 Stefan Kost * src/lib/core/song.c: * src/ui/edit/main-toolbar.c: Add fast forward and backward seeking. Its including several work-arounds already and still needs more work. 2010-02-24 Stefan Kost * src/ui/edit/bt-edit.c: Add code to sanity check registry search path and the apps libdir. Disable as it does not work as expected (bug filed). 2010-02-19 Stefan Kost * src/lib/ic/ic_private.h: * tests/m-bt-edit.c: Rename symbol to fix the build after filtering. 2010-02-18 Stefan Kost * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Filter symbols in the libraries. 2010-02-18 Stefan Kost * src/ui/edit/main-page-sequence.c: Allow scrubbing on the timeline. Fix some issues with view updates when inserting/deleting. Reduce the motion event overhead on the sequence views. 2010-02-17 Stefan Kost * src/lib/core/machine.c: Use default values for trigger params that are not using property meta. 2010-02-14 Stefan Kost * src/lib/core/sequence.c: Comment. * src/ui/edit/main-page-sequence.c: Downgrade the log levels again. 2010-02-14 Stefan Kost * src/ui/edit/machine-properties-dialog.c: We only need to change the event mask for older gtk-versions. 2010-02-14 Stefan Kost * src/lib/core/sequence.c: Logging. * src/ui/edit/main-page-sequence.c: Fix copy and pasting. Don't mismatch pattern name and id. 2010-02-14 Stefan Kost * NEWSLETTER: Sent news. * src/ui/edit/main-page-sequence.c: Don't select beyond tracks. 2010-02-11 Stefan Kost * src/ui/edit/gtkvumeter.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/panorama-popup.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/sequence-view.c: * src/ui/edit/tools.c: * src/ui/edit/tools.h: * src/ui/edit/volume-popup.c: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-analysis-dialog.c: More gtk-3 fixes (GtkSelectiondata::target, GtkObject::flags) 2010-02-11 Stefan Kost * NEWSLETTER: Add idea for news. * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/machine-actions.c: * src/ui/edit/machine-canvas-item-methods.h: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Allow to show machine dialogs also from pattern/sequence view. 2010-02-10 Stefan Kost * src/ui/edit/main-menu.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/tools.h: Fix stupid typo. Handle GtkObject::flags in one case. 2010-02-10 Stefan Kost * src/ui/edit/main-window.c: More gtk-3 fixes (GtkSelectiondata::data, GtkDialog::vbox). 2010-02-10 Stefan Kost * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/tools.h: More gtk-3 fixes (GtkWidget::allocation). 2010-02-10 Stefan Kost * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/pattern-editor.c: More gtk-3 fixes (GtkWidget::parent). 2010-02-10 Stefan Kost * src/ui/edit/edit-application.c: * src/ui/edit/machine-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/panorama-popup.c: * src/ui/edit/tools.h: * src/ui/edit/volume-popup.c: * src/ui/edit/wire-analysis-dialog.c: More gtk-3 fixes (GtkWidget::window, GtkWidget::child). 2010-02-09 Stefan Kost * src/ui/edit/machine-actions.c: * src/ui/edit/machine-actions.h: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-properties-dialog.c: * tests/ui/edit/e-bt-machine-actions.c: Move more common code to machine-actions and harmonize the parameter type and ordering. Add more ideas. * src/ui/edit/main-page-machines.c: Make one method static. Comment formatting. * src/ui/edit/settings-page-audiodevices.c: Ideas. 2010-02-08 Stefan Kost * src/lib/core/song-info.c: * tests/bt-check.c: Comment only fixes. 2010-02-07 Stefan Kost * src/lib/core/core.c: Small init tuning and whitespace fixes. * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/setup.c: * src/lib/core/tools.c: Better logging of pad-link failure. * src/lib/core/wire.c: We need to plug converters in more cases. Fixes hangs of songs-playback due to unlinked components. 2010-02-03 Stefan Kost * src/lib/core/machine.c: Don't try to read trigger params. Default is no value anyway. 2010-01-30 Stefan Kost * src/lib/core/machine.c: Also treat non readable properties as triggers. With this we can get rid of some of the buzz property flags. 2010-01-28 Stefan Kost * buzztard.schemas.in: * src/lib/core/gconf-settings.c: * src/lib/core/libbuzztard-core/settings-private.h: * src/lib/core/settings.c: * src/ui/edit/edit-application.c: * src/ui/edit/main-window.c: Remember window position and size. 2010-01-27 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-window-methods.h: * src/ui/edit/main-window.c: Refactor main loops starting and termination at bit. 2010-01-27 Stefan Kost * design/gui/notebook.c: * src/ui/edit/main-pages.c: * design/gui/notebook.c (added): Add a test case for weired gtk behaviour. 2010-01-27 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/tools.h: Add a return_val_if_disposed macro too. * src/ui/edit/main-menu.c: Set cached main_window=NULL in dispose. * src/ui/edit/main-pages.c: Add comments about a possible gtk+ bug in notbook initialisation. * src/ui/edit/main-page-sequence.c: Try savig more ref/unrefs. Still fighting a bit with initialisation sequence and ensuring we can cache main-window, 2010-01-26 Stefan Kost * src/ui/cmd/bt-cmd.c: * src/ui/edit/bt-edit.c: Add one letter commandline options and also allow one letter commands. We can do that as all commands are still starting with unique letters. 2010-01-26 Stefan Kost * src/lib/core/childproxy.c: Comment. * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Use new child proxy of main-window more. 2010-01-25 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: Use plain C casts here. We checked these already. 2010-01-25 Stefan Kost * configure.ac: Autofoo cleanups. 2010-01-24 Stefan Kost * docs/reference/bt-core/buzztard-core-docs.sgml: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-core/buzztard-core.types.in: * src/lib/core/Makefile.am: * src/lib/core/childproxy.c: * src/lib/core/core_private.h: * src/lib/core/libbuzztard-core/Makefile.am: * src/lib/core/libbuzztard-core/childproxy-methods.h: * src/lib/core/libbuzztard-core/childproxy.h: * src/lib/core/libbuzztard-core/core.h: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-window.c: * src/lib/core/libbuzztard-core/childproxy.h (svn:keywords, svn:eol- style): * src/lib/core/libbuzztard-core/childproxy-methods.h (svn:keywords, svn :eol-style): * src/lib/core/childproxy.c (svn:keywords, svn:eol-style): * src/lib/core/childproxy.c (added): * src/lib/core/libbuzztard-core/childproxy.h (added): * src/lib/core/libbuzztard-core/childproxy-methods.h (added): Add BtChildProxy interface (a pure GObject based variant of GstChildProxy without signals). Make use of that for setting the statusbar::status. * src/lib/core/persistence.c: Formating. 2010-01-24 Stefan Kost * NEWSLETTER: Collect NEWS. * src/ui/edit/machine-canvas-item.c: Fix label positioning and clipping. * src/ui/edit/main-page-machines.h: Tune the machine label size a bit. 2010-01-24 Stefan Kost * src/ui/edit/main-menu.c: Less g_object_set/get, grab main-window when we get mapped and reuse. Need to do that elsewhere. 2010-01-24 Stefan Kost * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-sequence.c: Don't deref NULL (mistake in prev commit). 2010-01-24 Stefan Kost * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Add page specific hints for status bar. 2010-01-24 Stefan Kost * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: Fix table layout. 2010-01-24 Stefan Kost * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/settings-page-audiodevices.c: Add property probing code. Needs new setting and ui still. 2010-01-24 Stefan Kost * src/ui/edit/settings-page-audiodevices.c: Probe audiodevices to only list working ones. Also add todo for device selection via property probe. 2010-01-24 Stefan Kost * src/ui/edit/about-dialog.c: * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Removed unnedded G_OBJECT type casts here too. 2010-01-23 Stefan Kost * src/ui/edit/bt-edit.c: * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wire-canvas-item.c: Use the new macro for accessing the ref-count of GObjects. 2010-01-23 Stefan Kost * src/ui/cmd/cmd-application.c: Removed unnedded G_OBJECT type casts here. 2010-01-23 Stefan Kost * src/lib/ic/registry.c: * src/ui/edit/edit-application.c: * src/ui/edit/ui-resources.c: Set singleton to NULL in finalize. 2010-01-23 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/application.c: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/sequence.c: * src/lib/core/settings.c: * src/lib/core/setup.c: * src/lib/core/sink-bin.c: * src/lib/core/song.c: * src/lib/core/wire.c: * src/lib/ic/abs-range-control.c: * src/lib/ic/control.c: * src/lib/ic/device.c: * src/lib/ic/input-device.c: * src/lib/ic/midi-device.c: * src/lib/ic/registry.c: * src/lib/ic/trigger-control.c: Use a macro for accessing the ref-count of GObjects. 2010-01-23 Stefan Kost * src/lib/ic/registry.c: * src/ui/edit/edit-application.c: * src/ui/edit/ui-resources.c: No need for G_OBJECT typechecks when reffing singletons. 2010-01-23 Stefan Kost * src/lib/ic/registry.c: Turn into proper singleton. 2010-01-22 Stefan Kost * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/processor-machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/sink-bin.c: * src/lib/core/sink-machine.c: * src/lib/core/song-info.c: * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io.c: * src/lib/core/song.c: * src/lib/core/source-machine.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: Core is cleaned fro superflous typechecking casts. 2010-01-21 Stefan Kost * src/lib/core/machine.c: * src/ui/edit/main-page-patterns.c: Kill more casts from signal handlers. 2010-01-21 Stefan Kost * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/processor-machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/sink-bin.c: * src/lib/core/sink-machine.c: * src/lib/core/song-info.c: * src/lib/core/song-io.c: * src/lib/core/source-machine.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/lib/core/wire.c: Get rid of G_OBJECT casts from setters and getters in core too. 2010-01-21 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Refactor to reduce merge a big blob of identical code. 2010-01-21 Stefan Kost * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Get rid of some more unneded G_OBJECT casts in g_object_(set|get). 2010-01-20 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: Get rid of some unneded G_OBJECT casts. 2010-01-20 Stefan Kost * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-actions.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/wire-analysis-dialog.c: Add more comments for translatable strings. 2010-01-19 Stefan Kost * src/ui/edit/edit-application.c: * src/ui/edit/main-page-info-methods.h: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines-methods.h: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns-methods.h: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence-methods.h: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves-methods.h: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages-methods.h: * src/ui/edit/main-pages.c: * src/ui/edit/main-window-methods.h: * src/ui/edit/main-window.c: And last batch of removing the "app" property usage. 2010-01-19 Stefan Kost * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-statusbar-methods.h: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar-methods.h: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/sequence-view-methods.h: * src/ui/edit/sequence-view.c: 4th batch of removing the "app" properties. 2010-01-19 Stefan Kost * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-menu-methods.h: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu-methods.h: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/main-menu-methods.h: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-window.c: * src/ui/edit/pattern-properties-dialog-methods.h: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket-methods.h: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/wire-analysis-dialog-methods.h: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: * tests/ui/edit/e-bt-interaction-controller-menu.c: * tests/ui/edit/e-bt-pattern-properties-dialog.c: * tests/ui/edit/e-bt-wire-analysis-dialog.c: 3rd batch of removing the "app" properties. 2010-01-19 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-preferences-dialog-methods.h: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog-methods.h: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog-methods.h: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog-methods.h: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/render-dialog-methods.h: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress-methods.h: * src/ui/edit/render-progress.c: * tests/ui/edit/e-bt-machine-preferences-dialog.c: * tests/ui/edit/e-bt-machine-preset-properties-dialog.c: * tests/ui/edit/e-bt-machine-properties-dialog.c: * tests/ui/edit/e-bt-machine-rename-dialog.c: * tests/ui/edit/e-bt-render-dialog.c: * tests/ui/edit/e-bt-render-progress-dialog.c: 2nd batch of removing the "app" properties. 2010-01-19 Stefan Kost * po/POTFILES.in: Add two missing files. 2010-01-18 Stefan Kost * src/ui/edit/about-dialog-methods.h: * src/ui/edit/about-dialog.c: * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/missing-framework-elements-dialog-methods.h: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog-methods.h: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/settings-dialog-methods.h: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices-methods.h: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories-methods.h: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller-methods.h: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller-methods.h: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog-methods.h: * src/ui/edit/tip-dialog.c: * src/ui/edit/ui-resources.c: * tests/ui/edit/e-bt-about-dialog.c: * tests/ui/edit/e-bt-missing-framework-elements-dialog.c: * tests/ui/edit/e-bt-missing-song-elements-dialog.c: * tests/ui/edit/e-bt-settings-dialog.c: * tests/ui/edit/e-bt-tip-dialog.c: Turn BtEditApplication into a signelton. First batch of removing the properties. 2010-01-18 Stefan Kost * src/ui/edit/ui-resources.c: Turn into a proepr singleton. 2010-01-18 Stefan Kost * src/lib/core/machine.c: Fix crashers in logging due to wrong macro usage. 2010-01-17 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/wire-canvas-item.c: Planning. 2010-01-17 Stefan Kost * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: Use new vbox to not modify the spacing of the dialogs own vbox. 2010-01-17 Stefan Kost * src/ui/edit/main-window.c: Fix two more places where we accessed ->vox of a GtkDialog. 2010-01-16 Stefan Kost * src/lib/core/machine.c: Adding some const, small cleaups. * src/lib/core/sink-bin.c: Whitespace. * src/lib/core/wire.c: Also use fast pad_link in wire. Only analyzers left using slower api. 2010-01-15 Stefan Kost * src/ui/edit/about-dialog.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/tip-dialog.c: Use dialog accessors instead of sealed variabled. Fixes #2916141. * src/ui/edit/tools.h: Add dialog accessors for older gtk+ versions. 2010-01-15 Stefan Kost * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: Unify dialog layout. 2010-01-15 Stefan Kost * src/lib/core/machine.c: Remove two vars. 2010-01-14 Stefan Kost * NEWSLETTER: Collecting news. 2010-01-14 Stefan Kost * src/lib/core/machine.c: Use gst_pad_link/unlink. This is most unambigous & faster. 2010-01-13 Stefan Kost * Makefile.am: * configure.ac: * tests/Makefile.am: reenable and tweak bcov support. * tests/bt-check.c: Only limmit resources if we run in fork mode. * tests/bt-test-plugin.c: * tests/bt-test-settings.c: Terminology fix in the comments. 2010-01-10 Stefan Kost * src/lib/core/machine.c: * src/lib/core/wire.c: Remove code that is commented out. * src/lib/core/wave.c: Add todo. 2010-01-10 Stefan Kost * src/lib/core/machine.c: * src/lib/core/sink-bin.c: Turn some gst_element_{link,unlink} into gst_element_{link,unlink}_pads. 2010-01-10 Stefan Kost * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/wire-analysis-dialog.c: Use Quarks directly when dealing with bus messages. Saves hashtable lookups and strcmps. 2010-01-10 Stefan Kost * src/lib/core/sink-bin.c: * src/lib/core/song.c: * src/ui/edit/edit-application.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Remove asserts after code that derefs the pointer already. 2010-01-10 Stefan Kost * src/ui/edit/gtkvumeter.c: * src/ui/edit/gtkvumeter.h: Remove dead code. 2010-01-10 Stefan Kost * src/ui/edit/bt-edit.c: Fix the build for old gtk version. * src/ui/edit/edit-application.c: Get rid of goto Error. 2010-01-09 Stefan Kost * src/ui/edit/about-dialog.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/sequence-view.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: _new() never fail - removed if statements. Alse make 'app' more often write-only and remove getter. 2010-01-09 Stefan Kost * src/ui/cmd/cmd-application.c: Remove getter, there is no other class that might want to read the property back. 2010-01-09 Stefan Kost * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-controller-learn-dialog.c: * tests/ui/edit/e-bt-machine-actions.c: * tests/ui/edit/e-bt-main-window.c: * tests/ui/edit/e-bt-pattern-properties-dialog.c: * tests/ui/edit/s-bt-controller-learn-dialog.c: * tests/ui/edit/s-bt-machine-actions.c: * tests/ui/edit/s-bt-controller-learn-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/e-bt-machine-actions.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-controller-learn-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/s-bt-machine-actions.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-machine-actions.c (added): * tests/ui/edit/e-bt-controller-learn-dialog.c (added): * tests/ui/edit/s-bt-machine-actions.c (added): * tests/ui/edit/s-bt-controller-learn-dialog.c (added): Add tests for two more dialogs. 2010-01-09 Stefan Kost * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: Small refactoring and cleanup. * src/ui/edit/tip-dialog.c: Use english comments :) 2010-01-08 Stefan Kost * src/ui/edit/about-dialog.c: * src/ui/edit/edit-application.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-info.c: * src/ui/edit/main-page-machines.c: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/main-pages.c: * src/ui/edit/main-statusbar.c: * src/ui/edit/main-toolbar.c: * src/ui/edit/main-window.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/playback-controller-socket.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/sequence-view.c: * src/ui/edit/settings-dialog.c: * src/ui/edit/settings-page-audiodevices.c: * src/ui/edit/settings-page-directories.c: * src/ui/edit/settings-page-interaction-controller.c: * src/ui/edit/settings-page-playback-controller.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Code formatting. 2010-01-08 Stefan Kost * docs/reference/bt-edit/buzztard-edit.types: Add tip dialog type. * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/render-dialog.c: * src/ui/edit/render-progress.c: * src/ui/edit/tip-dialog.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wire-analysis-dialog.c: Clean up dialogs * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-tip-dialog.c: * tests/ui/edit/s-bt-tip-dialog.c: * tests/ui/edit/e-bt-tip-dialog.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-tip-dialog.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-tip-dialog.c (added): * tests/ui/edit/s-bt-tip-dialog.c (added): Add test for tip dialog. 2010-01-08 Stefan Kost * src/lib/core/machine.c: And fix one loader. 2010-01-08 Stefan Kost * configure.ac: * docs/reference/bt-core/buzztard-core-docs.sgml: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-core/buzztard-core.types.in: * src/lib/core/Makefile.am: * src/lib/core/libbuzztard-core/Makefile.am: * src/lib/core/libbuzztard-core/persistence-methods.h: * src/lib/core/libbuzztard-core/persistence.h: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/persistence.c: * src/lib/core/processor-machine.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/sink-machine.c: * src/lib/core/song-info.c: * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io.c: * src/lib/core/song.c: * src/lib/core/source-machine.c: * src/lib/core/wave.c: * src/lib/core/wavelevel.c: * src/lib/core/wavetable.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: * src/lib/core/persistence-selection.c (deleted): * src/lib/core/libbuzztard-core/persistence-location.h (deleted): * src/lib/core/libbuzztard-core/persistence-selection.h (deleted): * src/lib/core/persistence-location.c (deleted): Remove persistens selection and location. We don't use this for copy/paste and we will also do the undo/redo differently. 2010-01-08 Stefan Kost * Makefile.am: * configure.ac: * tests/Makefile.am: Add bcov support (but disabled now). * tests/bt-check.h: Update for future check version. 2010-01-08 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: * src/ui/edit/main-menu.c: * src/ui/edit/render-dialog.c: * src/ui/edit/tip-dialog.c: Finish tip-of-the-day implementation. 2010-01-07 Stefan Kost * buzztard.schemas.in: Fix description. * src/lib/core/settings.c: Add new settings as object properties. 2010-01-07 Stefan Kost * docs/reference/bt-edit/buzztard-edit-docs.sgml: * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/Makefile.am: * src/ui/edit/bt-edit.h: * src/ui/edit/main-menu.c: * src/ui/edit/tip-dialog-methods.h: * src/ui/edit/tip-dialog.c: * src/ui/edit/tip-dialog.h: * src/ui/edit/tip-dialog.h (svn:keywords, svn:eol-style): * src/ui/edit/tip-dialog-methods.h (svn:keywords, svn:eol-style): * src/ui/edit/tip-dialog.c (svn:keywords, svn:eol-style): * src/ui/edit/tip-dialog-methods.h (added): * src/ui/edit/tip-dialog.c (added): * src/ui/edit/tip-dialog.h (added): Add basic tip dialog. 2010-01-06 Stefan Kost * src/lib/core/persistence-location.c: * src/lib/core/persistence-selection.c: * src/lib/core/persistence.c: * src/lib/core/wave.c: * src/lib/core/wavelevel.c: * src/lib/core/wavetable.c: * src/lib/ic/learn.c: * src/ui/cmd/bt-cmd.c: * src/ui/edit/about-dialog.c: * src/ui/edit/interaction-controller-learn-dialog.c: * src/ui/edit/interaction-controller-menu.c: * src/ui/edit/machine-menu.c: * src/ui/edit/machine-preferences-dialog.c: * src/ui/edit/machine-preset-properties-dialog.c: * src/ui/edit/machine-properties-dialog.c: * src/ui/edit/machine-rename-dialog.c: * src/ui/edit/main-page-waves.c: * src/ui/edit/missing-framework-elements-dialog.c: * src/ui/edit/missing-song-elements-dialog.c: * src/ui/edit/pattern-properties-dialog.c: * src/ui/edit/sequence-view.c: * src/ui/edit/ui-resources.c: * src/ui/edit/wire-analysis-dialog.c: Add G_UNLIKELY() to _get_type function 2010-01-06 Stefan Kost * buzztard.schemas.in: * src/lib/core/gconf-settings.c: * src/lib/core/libbuzztard-core/settings-private.h: Add new settings for tip-of-the-day. 2010-01-02 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/core_private.h: * src/lib/core/libbuzztard-core/machine.h: * src/lib/core/libbuzztard-core/sink-bin.h: * src/lib/core/libbuzztard-core/song-io.h: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/persistence.c: * src/lib/core/wave.c: * src/lib/core/wire.c: * src/ui/edit/gtkvumeter.c: * src/ui/edit/interaction-controller-menu.h: * src/ui/edit/machine-menu.h: * src/ui/edit/pattern-editor.h: * src/ui/edit/ui-resources.h: API doc cleanup. 2009-12-24 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-core/buzztard-core.types.in: Doc fixes for BtPersistence. 2009-12-16 Stefan Kost * src/lib/core/libbuzztard-core/Makefile.am: Also disable the file we skip here. * src/lib/core/Makefile.am: * src/lib/ic/Makefile.am: Repair the gir-building to scan only what we build. We get linker errors otherwise. * src/lib/core/sink-bin.c: Fix a warning from the gir-scanner. 2009-12-16 Stefan Kost * src/ui/edit/main-window.c: * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-main-window.c: * tests/ui/edit/s-bt-main-window.c: * tests/ui/edit/s-bt-main-window.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-main-window.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-main-window.c (added): * tests/ui/edit/s-bt-main-window.c (added): Move the dialog tests to new file and add similar for two more main-window functions. 2009-12-15 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/main-window-methods.h: * src/ui/edit/main-window.c: * src/ui/edit/tools.c: * src/ui/edit/tools.h: * tests/m-bt-edit.c: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-render-progress-dialog.c: * tests/ui/edit/s-bt-render-progress-dialog.c: * tests/ui/edit/s-bt-render-progress-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/e-bt-render-progress-dialog.c (svn:keywords, svn:eol- style): * tests/ui/edit/e-bt-render-progress-dialog.c (added): * tests/ui/edit/s-bt-render-progress-dialog.c (added): Move dialog helpers to main window and add tests for them. Also add a basic test for the render progress dialog. 2009-12-11 Stefan Kost * src/lib/core/tools.c: Use the right function to free the list. 2009-12-11 Stefan Kost * src/lib/core/sink-bin.c: This is now fixed upstream. Make the hack version dependent. 2009-12-10 Stefan Kost * NEWSLETTER: Sent news. 2009-12-10 Stefan Kost * tests/bt-check.c: Whitespace. * tests/bt-test-settings.c: Fix copy'n'paste bgs and make more fake settings work. * tests/ui/edit/e-bt-edit-application.c: More UI tst coverage. 2009-12-08 Stefan Kost * tests/bt-test-settings.c: * tests/bt-test-settings.h: Allow to test normaly read-only settings. * tests/lib/core/e-sink-machine.c: Test sink selection for empty settings. * tests/lib/core/e-pattern.c: * tests/lib/core/e-song.c: Fix failing tests. 2009-12-08 Stefan Kost * src/lib/core/libbuzztard-core/sink-bin.h: * src/lib/core/sink-bin.c: * tests/bt-cmd-encode.sh: Add the mp4 (acc) output. 2009-12-06 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/core.c: * src/lib/core/libbuzztard-core/machine-methods.h: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/machine.c: * src/lib/core/song.c: * src/lib/core/tools.c: Remove some hardly used debug code. 2009-12-06 Stefan Kost * src/lib/core/core.c: * src/lib/core/tools.c: * src/ui/edit/edit-application.c: Fix docs for the list handling and don't free list twice. 2009-12-06 Stefan Kost * tests/lib/core/e-song.c: Check a few more basics. 2009-12-06 Stefan Kost * src/lib/core/tools.c: Add one more element to the checklist and reorder. * src/lib/core/wire-pattern.c: Free unneded gvalues when resizing. * tests/bt-test-plugin.c: * tests/bt-test-plugin.h: Add more properties. * tests/lib/core/e-pattern.c: * tests/lib/core/e-wire-pattern.c: More test coverage. 2009-12-06 Stefan Kost * src/lib/core/pattern.c: Fix a leak found by new tests. * src/lib/core/song.c: * src/lib/core/tools.c: Doc typo fixes, comments and todos. * tests/bt-cmd-cli.sh: * tests/bt-edit-cli.sh: Ideas. * tests/lib/core/e-pattern.c: * tests/lib/core/e-song.c: * tests/lib/core/e-wire-pattern.c: More tests (pattern resize, song-idle loops, wire-pattern editing). 2009-12-04 Stefan Kost * src/ui/edit/machine-properties-dialog.c: * tests/bt-edit-cli.sh: * tests/m-bt-edit.c: * tests/songs/melo3.xml: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-interaction-controller-menu.c: * tests/ui/edit/e-bt-machine-preset-properties-dialog.c: * tests/ui/edit/e-bt-machine-properties-dialog.c: * tests/ui/edit/s-bt-interaction-controller-menu.c: * tests/ui/edit/e-bt-interaction-controller-menu.c (svn:keywords, svn :eol-style): * tests/ui/edit/s-bt-interaction-controller-menu.c (svn:keywords, svn :eol-style): * tests/ui/edit/s-bt-interaction-controller-menu.c (added): * tests/ui/edit/e-bt-interaction-controller-menu.c (added): More ui test coverage (dialog variants for effects, interaction controller menu test, run UI under Xvfb, trigger more screen updates). 2009-12-04 Stefan Kost * src/lib/core/song.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/ui/cmd/cmd-application.c: * src/ui/edit/tools.c: * tests/Makefile.am: * tests/bt-cmd-cli.sh: * tests/m-bt-edit.c: * tests/songs/melo3.xml: * tests/ui/edit/Makefile.am: * tests/ui/edit/e-bt-edit-application.c: * tests/ui/edit/e-bt-pattern-page.c: * tests/ui/edit/s-bt-pattern-page.c: * tests/ui/edit/e-bt-pattern-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/s-bt-pattern-page.c (svn:keywords, svn:eol-style): * tests/ui/edit/e-bt-pattern-page.c (added): * tests/ui/edit/s-bt-pattern-page.c (added): Even better test coverage (test key-presses on pattern editor, ensure pattern page shows pattern, test more bt-cmd corner cases, change test wave to be in /tmp). 2009-12-04 Stefan Kost * tests/Makefile.am: * tests/bt-check.c: * tests/lib/core/e-pattern.c: * tests/songs/simple1.xml: * tests/songs/simple6.xml: * tests/ui/edit/e-bt-edit-application.c: * tests/songs/simple6.xml (added): Improve coverage further (pattern-remove-row, song with missing machine, add test wave). 2009-11-28 Stefan Kost * docs/reference/bt-core/buzztard-core-docs.sgml: * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-core/buzztard-core.types.in: Also hide disabled class here. * tests/lib/core/e-pattern.c: More tests needed here. 2009-11-28 Stefan Kost * tests/lib/core/e-pattern.c: * tests/lib/core/e-song.c: * tests/lib/core/e-wire-pattern.c: * tests/lib/core/t-song.c: More tests. 2009-11-27 Stefan Kost * src/lib/core/song-io.c: Turn g_asserts into g_Return_val_if_fail. This is public api. * tests/lib/core/e-song.c: * tests/lib/core/e-wire-pattern.c: * tests/lib/core/t-song-io.c: * tests/lib/core/t-song.c: More tests. 2009-11-27 Stefan Kost * src/lib/core/Makefile.am: * src/lib/core/libbuzztard-core/core.h: * tests/lib/core/t-settings.c: Don't build and test (unused) plainfile settings for now. 2009-11-26 Stefan Kost * tests/lib/core/e-wire-pattern.c: * tests/lib/core/s-wire-pattern.c: * tests/lib/core/e-wire-pattern.c (svn:keywords, svn:eol-style): * tests/lib/core/s-wire-pattern.c (svn:keywords, svn:eol-style): * tests/lib/core/e-wire-pattern.c (added): * tests/lib/core/s-wire-pattern.c (added): And add new files. 2009-11-26 Stefan Kost * tests/lib/core/Makefile.am: * tests/lib/core/e-pattern.c: * tests/lib/core/e-song-info.c: * tests/m-bt-core.c: Add more tests. 2009-11-26 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-core/buzztard-core.types.in: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-ic/Makefile.am: Doc fixes. Sinkbin did not appear as gobject. * src/lib/core/song-io.c: Comment cleanup. 2009-11-26 Stefan Kost * src/ui/edit/main-page-patterns.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: Rename some structs for consistency. 2009-11-26 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: Fi copy'n'paste. * src/ui/edit/pattern-editor.h: Fix the build (yeah). 2009-11-26 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * docs/reference/bt-edit/buzztard-edit.types: * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-pages.c: * src/ui/edit/pattern-editor.c: * src/ui/edit/pattern-editor.h: * src/ui/edit/wave-viewer.c: * src/ui/edit/wire-canvas-item.c: Doc xref fixes and general doc maintenance. 2009-11-26 Stefan Kost * src/lib/core/sink-bin.c: And unbreak the build. 2009-11-25 Stefan Kost * src/lib/core/sink-bin.c: Reactivate the work-around, while the bug is open. Fix a typo in enum type name. 2009-11-25 Stefan Kost * src/lib/ic/device.c: * src/lib/ic/learn.c: Doc xref fixes. 2009-11-25 Stefan Kost * src/lib/core/application.c: * src/lib/core/libbuzztard-core/sequence.h: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/persistence.c: * src/lib/core/sequence.c: * src/lib/core/setup.c: * src/lib/core/song-io-native-bzt.c: * src/lib/core/song-io-native-xml.c: * src/lib/core/song-io.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: Doc xref fixes. 2009-11-19 Stefan Kost * src/lib/core/libbuzztard-core/machine.h: * src/lib/core/libbuzztard-core/pattern.h: * src/lib/core/libbuzztard-core/setup.h: * src/lib/core/libbuzztard-core/tools.h: * src/lib/core/libbuzztard-core/wave.h: * src/lib/core/libbuzztard-core/wavetable.h: * src/lib/core/libbuzztard-core/wire-pattern.h: * src/lib/core/libbuzztard-core/wire.h: * src/lib/core/machine.c: * src/lib/core/pattern.c: * src/lib/core/setup.c: * src/lib/core/wave.c: * src/lib/core/wavetable.c: * src/lib/core/wire-pattern.c: * src/lib/core/wire.c: * src/ui/edit/machine-canvas-item.c: * src/ui/edit/machine-canvas-item.h: Remove unneeded slots in classes for signals. 2009-11-13 Stefan Kost * src/lib/core/sink-bin.c: Add workaround for enum type issue. 2009-11-12 Stefan Kost * pixmaps/popup-menu.png: Somewhat better image. * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Add popup to those pages too. * src/ui/edit/main-page-machines.c: Convert the menu-button back to a plain button and add comment. 2009-11-11 Stefan Kost * pixmaps/Makefile.am: * pixmaps/popup-menu.png: * pixmaps/popup-menu.png (svn:mime-type): * pixmaps/popup-menu.png (added): Add a popup-menu icon. Please anyone submit a better one please. * src/ui/edit/main-page-machines.c: Add context menu icon to toolbar. 2009-11-05 Stefan Kost * src/ui/edit/main-menu.c: Fix broken theme icons. 2009-11-05 Stefan Kost * src/lib/core/machine.c: Keep converters for sinkmachine (some sinks don't need it). Fixes regression of yesterday optimizations for e.g. alsa. * src/lib/core/wire.c: Disable some unneeded code. 2009-11-05 Stefan Kost * src/lib/core/machine.c: Remove unsued static method too. * src/ui/edit/btmemoryaudiosrc.c: White space. 2009-11-05 Stefan Kost * src/lib/core/machine.c: Remove function, we don't need anymore also from the code. 2009-11-05 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/core.c: * src/lib/core/core_private.h: * src/lib/core/libbuzztard-core/machine-methods.h: * src/lib/core/machine.c: * src/lib/core/setup.c: * src/lib/core/wire.c: Use a fixed internal format. This allows us to avoid plugging audioconvert elements in wires and machines. Now we plug them only if the machine cannot support the internal format. This gives 7 -> 1 sec speedup for load & play of Aenathron. 2009-11-05 Stefan Kost * src/ui/edit/buzztard-edit.desktop.in.in: Check with desktop-file-validate from desktop-file-utils and fixup. 2009-11-03 Stefan Kost * NEWSLETTER: Sent news. * src/ui/edit/gtkvumeter.c: More pixel tweaking. 2009-11-02 Stefan Kost * NEWSLETTER: Write News. * src/lib/core/machine.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: Comments. 2009-11-02 Stefan Kost * src/ui/cmd/bt-cmd.c: * src/ui/edit/bt-edit.c: Fix i18n domain for options. 2009-10-31 Stefan Kost * src/ui/edit/gtkvumeter.c: Fix blurry pixels. Fix drwing over the borders and make it a bit faster too. 2009-10-30 Stefan Kost * src/ui/edit/main-menu.c: * tests/bt-check.c: Comments. 2009-10-30 Stefan Kost * po/de.po: * po/nn.po: Update translations. * src/lib/core/core.c: * src/lib/ic/ic.c: * src/ui/cmd/bt-cmd.c: * src/ui/edit/bt-edit.c: Cleanup i18n support. 2009-10-28 Stefan Kost * src/ui/edit/main-statusbar.c: The context-descriptions are not shown in the UI. No need to translate. 2009-10-28 Stefan Kost * src/lib/core/sequence.c: * src/ui/edit/main-statusbar.c: Comments and cleanup. 2009-10-27 Stefan Kost * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/ui/edit/edit-application-methods.h: * src/ui/edit/edit-application.c: Factor out locking the UI. * src/ui/edit/main-menu.c: Add a reload registry item. 2009-10-25 Stefan Kost * src/ui/edit/main-menu.c: Add options to debug menu to allow generating variants of dot-graphs. 2009-10-25 Stefan Kost * src/lib/core/machine.c: * src/lib/core/wire.c: Better naming on bin elements. 2009-10-21 Stefan Kost * docs/help/bt-edit/C/buzztard-edit.xml: Small docu update. * src/ui/edit/wire-analysis-dialog.c: * src/ui/edit/wire-canvas-item.c: Commenting. 2009-10-21 Stefan Kost * NEWSLETTER: Collect News. * src/lib/ic/control.c: Planning. * configure.ac: * src/ui/edit/bt-edit.h: Make gnomevfs totally conditional. * src/ui/edit/playback-controller-socket.c: * src/ui/edit/wave-viewer.c: Fix some build bugs, when building without gnomevfs. 2009-10-21 Stefan Kost * src/ui/edit/main-window.c: Now we have extra info and patches for both issues. Update info. 2009-10-21 Stefan Kost * configure.ac: * src/lib/core/core.c: * src/lib/core/core_private.h: * src/lib/core/song-io-native.c: * src/ui/edit/bt-edit.c: Move gnome-vfs to the ui-deps. We need some configure work to practically remove it. 2009-10-19 Stefan Kost * src/lib/core/wire.c: Turn the optimization off again and explain why, plus some ideas how we could get it still. 2009-10-18 Stefan Kost * src/lib/core/machine.c: * src/lib/core/wire.c: Potential massive performance gain in loading and time to play. For now enabled by default. If it works, we can make it permanent. 2009-10-18 Stefan Kost * src/lib/core/machine.c: Get rid of some more double type-checks. 2009-10-18 Stefan Kost * src/ui/edit/machine-menu.c: More logging. * src/ui/edit/machine-canvas-item.c: * src/ui/edit/settings-page-interaction-controller.c: Planning. 2009-10-18 Stefan Kost * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Add branch hinting to pre-condition checks. * src/lib/core/sequence.c: Remove expensive type cehcks in sequence updates. 2009-10-18 Stefan Kost * src/ui/edit/machine-menu.c: Don't cut prefix for non wrapper plugins. 2009-10-16 Stefan Kost * src/ui/edit/interaction-controller-menu.c: Add idea. * src/ui/edit/settings-page-interaction-controller.c: Add controller list (more to come). 2009-10-16 Stefan Kost * NEWSLETTER: Collect news. * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Use GDK_SELECTION_CLIPBOARD for widget and not for screen. Seems to fix the issue with the lost content and allows to paste the data in a debug build to a text editor. 2009-10-15 Stefan Kost * src/ui/edit/main-window.c: Sync file-chooser code and reenable xml detetion workaround. 2009-10-15 Stefan Kost * src/ui/edit/machine-menu.c: Fix the build. 2009-10-14 Stefan Kost * src/lib/core/machine.c: Remove a now obsolete todo. * src/ui/edit/interaction-controller-menu.c: Don't create empty submenus. * src/ui/edit/machine-menu.c: Add comments. * src/ui/edit/machine-properties-dialog.c: Add "reset" and "reset all" items to context menu. 2009-10-13 Stefan Kost * docs/reference/bt-edit/buzztard-edit-docs.sgml: * src/ui/edit/btmemoryaudiosrc.c: Add missing docs. * tests/Makefile.am: Use $(LIBTOOL) instead of hardcoded one. 2009-10-12 Stefan Kost * src/ui/edit/machine-canvas-item.c: Small refactoring. * src/ui/edit/main-page-patterns.c: * src/ui/edit/main-page-sequence.c: Planning. 2009-10-12 Stefan Kost * src/lib/core/machine.c: Start level decay faster. * src/ui/edit/gtkvumeter.c: Redraw level if either value changed. Fixes stuck level meters. * src/ui/edit/machine-canvas-item.c: * src/ui/edit/main-page-sequence.c: * src/ui/edit/main-toolbar.c: Now hopefuly proper decay and peak values. 2009-10-12 Stefan Kost * NEWSLETTER: Wrote and sent news. 2009-10-10 Stefan Kost * src/lib/core/pattern.c: * src/ui/edit/main-page-patterns.c: Don't paste beyond the pattern length. * src/ui/edit/main-page-sequence.c: Implement paste for sequence. 2009-10-08 Stefan Kost * src/lib/core/sequence.c: Add a quick path for the pattern-counting. 2009-10-07 Stefan Kost * src/ui/edit/main-page-patterns.c: Comments. * src/ui/edit/main-page-sequence.c: Implement copy. * src/ui/edit/main-toolbar.c: Whitespace 2009-10-04 Stefan Kost * tests/lib/core/e-sequence.c: Make test cover whole pattern changes. This already test the sequence optimization a bit. 2009-10-04 Stefan Kost * src/lib/core/sequence.c: When setting patterns, only mark non empty cells as invalid. This speeds up song loading, it needs more test to be sure its correct thing to do. * tests/lib/core/e-sequence.c: Add a test for having two tracks for same machine and test parameter shadowing. 2009-10-04 Stefan Kost * src/lib/core/libbuzztard-core/wire-pattern-methods.h: * src/lib/core/wire-pattern.c: * src/ui/edit/main-page-patterns.c: Implement copy'n'paste stuff for wire patterns too. 2009-10-03 Stefan Kost * src/lib/core/machine.c: Move variabled to narrower scope. * src/lib/core/sequence.c: Comments. * src/ui/edit/main-page-patterns.c: Only define text paste targets for debug purpose, but then define some more. 2009-10-03 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/wire-pattern-methods.h: * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: Also copy wire patterns when copying patterns. 2009-09-28 Stefan Kost * docs/reference/bt-cmd/Makefile.am: * docs/reference/bt-core/Makefile.am: * docs/reference/bt-edit/Makefile.am: * docs/reference/bt-ic/Makefile.am: Update gtk-doc makefiles rules. 2009-09-27 Stefan Kost * src/lib/core/sink-bin.c: Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=596366 * src/ui/cmd/cmd-application.c: Add more logging. 2009-09-21 Stefan Kost * src/lib/core/sequence.c: Small code reflow to avoid recalculating values. 2009-09-20 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/pattern-methods.h: * src/lib/core/pattern.c: * src/ui/edit/main-page-patterns.c: Cut, copy and paste works for patterns now. Still needs handling of wire-patterns. 2009-09-19 Stefan Kost * src/lib/core/pattern.c: * src/ui/edit/main-page-patterns.c: Improve the pasting code to receive the data and parse it. 2009-09-19 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/pattern-methods.h: * src/lib/core/pattern.c: * src/ui/edit/main-page-patterns.c: Enable copy in patterns. Still WIP. 2009-09-18 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * src/lib/core/libbuzztard-core/machine-methods.h: * src/lib/core/machine.c: * src/lib/core/setup.c: * src/lib/core/wire.c: * src/ui/edit/main-page-machines.c: We don't need the setup to lookup wires. Add new function to lookup wire from machines wire-list. 2009-09-18 Stefan Kost * src/ui/edit/about-dialog.c: Switch back to devel mode. * src/ui/edit/machine-properties-dialog.c: Set labels to signle_line mode to make window resizes faster. * src/ui/edit/main-statusbar.c: Add ideas. 2009-09-17 Stefan Kost * src/lib/core/machine.c: * src/lib/core/setup.c: * src/lib/core/wire.c: * src/ui/edit/machine-canvas-item.c: Use more lightweight API (machine-wire lists). Add ideas to get rid of one more function. 2009-09-15 Stefan Kost * src/ui/edit/machine-properties-dialog.c: Use more lightweight API (machine-wire lists). 2009-09-15 Stefan Kost * src/lib/core/libbuzztard-core/machine.h: Add doc comments for public members. * src/lib/core/pattern.c: * src/ui/edit/main-page-patterns.c: Some more work on clipboard support. Also use machine-wire lists. 2009-09-14 Stefan Kost * docs/reference/bt-core/buzztard-core-sections.txt: * docs/reference/bt-edit/buzztard-edit-sections.txt: * src/lib/core/libbuzztard-core/pattern-methods.h: * src/lib/core/libbuzztard-core/wire-pattern-methods.h: * src/lib/core/pattern.c: * src/lib/core/wire-pattern.c: * src/ui/edit/main-menu.c: * src/ui/edit/main-page-patterns-methods.h: * src/ui/edit/main-page-patterns.c: Implement pattern_selection_apply() helper to save some code. Implement deleting (clearing) the selections in patterns. More thinking for cut, copy and paste. 2009-09-06 Stefan Kost * configure.ac: Bump *all* versions. 2009-09-06 Stefan Kost * configure.ac: Back to development. buzztard-0.6.0/src/0000755042355400116100000000000011675570644011177 500000000000000buzztard-0.6.0/src/lib/0000755042355400116100000000000011675570644011745 500000000000000buzztard-0.6.0/src/lib/core/0000755042355400116100000000000011675570675012701 500000000000000buzztard-0.6.0/src/lib/core/song-io-native-xml.c0000644042355400116100000001224611576360371016415 00000000000000/* $Id: song-io-native-xml.c 2946 2010-08-29 11:00:11Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsongionativexml * @short_description: class for song input and output in builtin native format * * This internal #BtSongIONative module implements loading and saving of an own * xml format without externals. */ #define BT_CORE #define BT_SONG_IO_NATIVE_XML_C #include "core_private.h" static GQuark error_domain=0; //-- the class G_DEFINE_TYPE (BtSongIONativeXML, bt_song_io_native_xml, BT_TYPE_SONG_IO_NATIVE); //-- methods static gboolean bt_song_io_native_xml_load(gconstpointer const _self, const BtSong * const song) { const BtSongIONativeXML * const self=BT_SONG_IO_NATIVE_XML(_self); gboolean result=FALSE; gchar * const file_name; guint len; gpointer data; gchar *status; g_object_get((gpointer)self,"file-name",&file_name,"data",&data,"data-len",&len,NULL); GST_INFO("native io xml will now load song from \"%s\"",file_name?file_name:"data"); const gchar * const msg=_("Loading file '%s'"); if(file_name) { status=g_alloca(1+strlen(msg)+strlen(file_name)); g_sprintf(status,msg,file_name); } else { status=g_alloca(1+strlen(msg)+4); g_sprintf(status,msg,"data"); } g_object_set((gpointer)self,"status",status,NULL); xmlParserCtxtPtr const ctxt=xmlNewParserCtxt(); if(ctxt) { xmlDocPtr song_doc; if(data && len) { // parse the file from the memory block song_doc=xmlCtxtReadMemory(ctxt,data,len,NULL,NULL,0L); } else { // open the file from the file_name argument song_doc=xmlCtxtReadFile(ctxt,file_name,NULL,0L); } if(song_doc) { if(!ctxt->valid) { GST_WARNING("the supplied document is not a XML/Buzztard document"); } else if(!ctxt->wellFormed) { GST_WARNING("the supplied document is not a wellformed XML document"); } else { xmlNodePtr const root_node=xmlDocGetRootElement(song_doc); if(root_node==NULL) { GST_WARNING("xmlDoc is empty"); } else if(xmlStrcmp(root_node->name,(const xmlChar *)"buzztard")) { GST_WARNING("wrong document type root node in xmlDoc src"); } else { GError *err=NULL; bt_persistence_load(BT_TYPE_SONG,BT_PERSISTENCE(song),root_node,&err,NULL); if(err!=NULL) { g_error_free(err); } else result=TRUE; } } if(song_doc) xmlFreeDoc(song_doc); } else GST_ERROR("failed to read song file '%s'",file_name); } else GST_ERROR("failed to create file-parser context"); if(ctxt) xmlFreeParserCtxt(ctxt); g_free(file_name); g_object_set((gpointer)self,"status",NULL,NULL); return(result); } static gboolean bt_song_io_native_xml_save(gconstpointer const _self, const BtSong * const song) { const BtSongIONativeXML * const self=BT_SONG_IO_NATIVE_XML(_self); gboolean result=FALSE; gchar * const file_name; g_object_get((gpointer)self,"file-name",&file_name,NULL); GST_INFO("native io xml will now save song to \"%s\"",file_name); const gchar * const msg=_("Saving file '%s'"); gchar * const status=g_alloca(1+strlen(msg)+strlen(file_name)); g_sprintf(status,msg,file_name); //gchar * const status=g_alloca(1+strlen(_("Saving file '%s'"))+strlen(file_name)); //g_sprintf(status,_("Saving file '%s'"),file_name); g_object_set((gpointer)self,"status",status,NULL); xmlDocPtr const song_doc=xmlNewDoc(XML_CHAR_PTR("1.0")); if(song_doc) { xmlNodePtr const root_node=bt_persistence_save(BT_PERSISTENCE(song),NULL); if(root_node) { xmlDocSetRootElement(song_doc,root_node); if(xmlSaveFile(file_name,song_doc)!=-1) { result=TRUE; GST_INFO("xml saved okay"); } else GST_ERROR("failed to write song file \"%s\"",file_name); } } g_free(file_name); g_object_set((gpointer)self,"status",NULL,NULL); return(result); } //-- wrapper //-- class internals static void bt_song_io_native_xml_init(BtSongIONativeXML *self) { } static void bt_song_io_native_xml_class_init(BtSongIONativeXMLClass * klass) { BtSongIOClass * const btsongio_class = BT_SONG_IO_CLASS(klass); error_domain=g_type_qname(BT_TYPE_SONG_IO_NATIVE_XML); //g_type_class_add_private(klass,sizeof(BtSongIONativeXMLPrivate)); btsongio_class->load = bt_song_io_native_xml_load; btsongio_class->save = bt_song_io_native_xml_save; } buzztard-0.6.0/src/lib/core/song-io-native.c0000644042355400116100000000531511576360371015616 00000000000000/* $Id: song-io-native.c 2946 2010-08-29 11:00:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsongionative * @short_description: class for song input and output in builtin native format * * Buzztard stores its songs in a own file-format. This internal io-module * implements loading and saving of this format. * The format is an archive, that contains an XML file and optionally binary * data, such as audio samples. */ #define BT_CORE #define BT_SONG_IO_NATIVE_C #include "core_private.h" //-- the class G_DEFINE_ABSTRACT_TYPE (BtSongIONative, bt_song_io_native, BT_TYPE_SONG_IO); //-- plugin detect static gboolean bt_song_io_init(void); /** * bt_song_io_native_module_info: * * Buzztard native format song loader/saver metadata. */ BtSongIOModuleInfo bt_song_io_native_module_info = { bt_song_io_init, { #ifdef USE_GSF { 0, "buzztard song with externals", "audio/x-bzt", "bzt" }, #endif { 0, "buzztard song without externals", "audio/x-bzt-xml", "xml" }, { 0, NULL, NULL, NULL } } }; static gboolean bt_song_io_init(void) { static gboolean first_run=TRUE; if(first_run) { #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-bsl", 0, "music production environment / buzz song io plugin"); #ifdef USE_GSF bt_song_io_native_module_info.formats[0].type=BT_TYPE_SONG_IO_NATIVE_BZT; bt_song_io_native_module_info.formats[1].type=BT_TYPE_SONG_IO_NATIVE_XML; #else bt_song_io_native_module_info.formats[0].type=BT_TYPE_SONG_IO_NATIVE_XML; #endif first_run=FALSE; } return(TRUE); } //-- methods //-- wrapper //-- class internals static void bt_song_io_native_init(BtSongIONative *self) { } static void bt_song_io_native_class_init(BtSongIONativeClass * const klass) { //g_type_class_add_private(klass,sizeof(BtSongIONativePrivate)); } buzztard-0.6.0/src/lib/core/wavetable.c0000644042355400116100000003320511624236405014722 00000000000000/* $Id: wavetable.c 3576 2011-08-21 17:14:43Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwavetable * @short_description: the list of #BtWave items in a #BtSong * * Each wave table entry can constist of multiple #BtWaves, were each of the * waves has a #BtWavelevel with the data for a note range. */ /* @todo: defer freeing waves if playing * - buzzmachines don't ref waves * - we can replace waves in the wavetable, but we should put the old ones in a to-be-freed list * - on song::stop we clear them */ #define BT_CORE #define BT_WAVETABLE_C #include "core_private.h" //-- signal ids enum { WAVE_ADDED_EVENT, WAVE_REMOVED_EVENT, LAST_SIGNAL }; //-- property ids enum { WAVETABLE_SONG=1, WAVETABLE_WAVES, WAVETABLE_MISSING_WAVES }; struct _BtWavetablePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the wavetable belongs to */ G_POINTER_ALIAS(BtSong *,song); /* @idea: change to GPtrArray, the baseptr does not change when modifying and * we can save the 'index' field in BtWave */ GList *waves; // each entry points to a BtWave GList *missing_waves; // each entry points to a gchar* }; static guint signals[LAST_SIGNAL]={0,}; //-- the class static void bt_wavetable_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtWavetable, bt_wavetable, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_wavetable_persistence_interface_init)); //-- constructor methods /** * bt_wavetable_new: * @song: the song the new instance belongs to * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtWavetable *bt_wavetable_new(const BtSong * const song) { return(BT_WAVETABLE(g_object_new(BT_TYPE_WAVETABLE,"song",song,NULL))); } //-- private methods //-- public methods /** * bt_wavetable_add_wave: * @self: the wavetable to add the wave to * @wave: the new wave instance * * Add the supplied wave to the wavetable. This is automatically done by * #bt_wave_new(). * * Returns: %TRUE for success, %FALSE otheriwse */ gboolean bt_wavetable_add_wave(const BtWavetable * const self, const BtWave * const wave) { gboolean ret=FALSE; g_assert(BT_IS_WAVETABLE(self)); g_assert(BT_IS_WAVE(wave)); if(!g_list_find(self->priv->waves,wave)) { gulong index; BtWave *other_wave; // check if there is already a wave with this id ad remove if so g_object_get((gpointer)wave,"index",&index,NULL); if((other_wave=bt_wavetable_get_wave_by_index(self,index))) { GST_DEBUG("replacing old wave with same id"); self->priv->waves=g_list_remove(self->priv->waves,other_wave); //g_signal_emit((gpointer)self,signals[WAVE_REMOVED_EVENT], 0, wave); /* @todo: if song::is-playing==TRUE add this to a self->priv->old_waves * and wait for song::is-playing==FALSE and free then */ g_object_unref(other_wave); } self->priv->waves=g_list_append(self->priv->waves,g_object_ref((gpointer)wave)); g_signal_emit((gpointer)self,signals[WAVE_ADDED_EVENT], 0, wave); ret=TRUE; } else { GST_WARNING("trying to add wave again"); } return ret; } /** * bt_wavetable_remove_wave: * @self: the wavetable to remove the wave from * @wave: the wave instance * * Remove the supplied wave from the wavetable. * * Returns: %TRUE for success, %FALSE otheriwse */ gboolean bt_wavetable_remove_wave(const BtWavetable * const self, const BtWave * const wave) { gboolean ret=FALSE; g_assert(BT_IS_WAVETABLE(self)); g_assert(BT_IS_WAVE(wave)); if(g_list_find(self->priv->waves,wave)) { self->priv->waves=g_list_remove(self->priv->waves,wave); g_signal_emit((gpointer)self,signals[WAVE_REMOVED_EVENT], 0, wave); g_object_unref((gpointer)wave); ret=TRUE; } else { GST_WARNING("trying to remove wave that is not in the list"); } return ret; } /** * bt_wavetable_get_wave_by_index: * @self: the wavetable to search for the wave * @index: the index of the wave * * Search the wavetable for a wave by the supplied index. * The wave must have been added previously to this wavetable with bt_wavetable_add_wave(). * Unref the wave, when done with it. * * Returns: #BtWave instance or %NULL if not found */ BtWave *bt_wavetable_get_wave_by_index(const BtWavetable * const self, const gulong index) { const GList *node; gulong wave_index; g_assert(BT_IS_WAVETABLE(self)); for(node=self->priv->waves;node;node=g_list_next(node)) { BtWave * const wave=BT_WAVE(node->data); g_object_get(wave,"index",&wave_index,NULL); if(index==wave_index) return(g_object_ref(wave)); } return(NULL); } /** * bt_wavetable_remember_missing_wave: * @self: the wavetable * @str: human readable description of the missing wave * * Loaders can use this function to collect information about wavetable entries * that failed to load. * The front-end can access this later by reading BtWavetable::missing-waves * property. */ void bt_wavetable_remember_missing_wave(const BtWavetable * const self, const gchar * const str) { GST_INFO("missing wave %s",str); self->priv->missing_waves=g_list_prepend(self->priv->missing_waves,(gpointer)str); } //-- io interface static xmlNodePtr bt_wavetable_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtWavetable * const self = BT_WAVETABLE(persistence); xmlNodePtr node=NULL; GST_DEBUG("PERSISTENCE::wavetable"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("wavetable"),NULL))) { bt_persistence_save_list(self->priv->waves,node); } return(node); } static BtPersistence *bt_wavetable_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { const BtWavetable * const self = BT_WAVETABLE(persistence); xmlNodePtr child_node; GST_DEBUG("PERSISTENCE::wavetable"); g_assert(node); for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"wave\0",5))) { GError *err=NULL; BtWave * const wave=BT_WAVE(bt_persistence_load(BT_TYPE_WAVE,NULL,child_node,&err,"song",self->priv->song,NULL)); if(err!=NULL) { // collect failed waves gchar * const name, * const uri; g_object_get(wave,"name",&name,"uri",&uri,NULL); gchar * const str=g_strdup_printf("%s: %s",name, uri); bt_wavetable_remember_missing_wave(self,str); g_free(name); g_free(uri); GST_WARNING("Can't create wavetable: %s",err->message); g_error_free(err); } g_object_unref(wave); } } return(BT_PERSISTENCE(persistence)); } static void bt_wavetable_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_wavetable_persistence_load; iface->save = bt_wavetable_persistence_save; } //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_wavetable_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtWavetable * const self = BT_WAVETABLE(object); return_if_disposed(); switch (property_id) { case WAVETABLE_SONG: { g_value_set_object(value, self->priv->song); } break; case WAVETABLE_WAVES: { g_value_set_pointer(value,g_list_copy(self->priv->waves)); } break; case WAVETABLE_MISSING_WAVES: { g_value_set_pointer(value,self->priv->missing_waves); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_wavetable_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtWavetable * const self = BT_WAVETABLE(object); return_if_disposed(); switch (property_id) { case WAVETABLE_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for wavetable: %p",self->priv->song); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wavetable_dispose(GObject * const object) { const BtWavetable * const self = BT_WAVETABLE(object); GList* node; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); // unref list of waves if(self->priv->waves) { for(node=self->priv->waves;node;node=g_list_next(node)) { GST_DEBUG(" free wave : %p (%d)",node->data,G_OBJECT_REF_COUNT(node->data)); g_object_try_unref(node->data); node->data=NULL; } } G_OBJECT_CLASS(bt_wavetable_parent_class)->dispose(object); } static void bt_wavetable_finalize(GObject * const object) { const BtWavetable * const self = BT_WAVETABLE(object); GST_DEBUG("!!!! self=%p",self); // free list of waves if(self->priv->waves) { g_list_free(self->priv->waves); self->priv->waves=NULL; } // free list of missing_waves if(self->priv->missing_waves) { const GList* node; for(node=self->priv->missing_waves;node;node=g_list_next(node)) { g_free(node->data); } g_list_free(self->priv->missing_waves); self->priv->missing_waves=NULL; } G_OBJECT_CLASS(bt_wavetable_parent_class)->finalize(object); } //-- class internals static void bt_wavetable_init(BtWavetable *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WAVETABLE, BtWavetablePrivate); } static void bt_wavetable_class_init(BtWavetableClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtWavetablePrivate)); gobject_class->set_property = bt_wavetable_set_property; gobject_class->get_property = bt_wavetable_get_property; gobject_class->dispose = bt_wavetable_dispose; gobject_class->finalize = bt_wavetable_finalize; /** * BtWavetable::wave-added: * @self: the wavetable object that emitted the signal * @wave: the new wave * * A new wave item has been added to the wavetable */ signals[WAVE_ADDED_EVENT] = g_signal_new("wave-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_WAVE // param data ); /** * BtWavetable::wave-removed: * @self: the setup object that emitted the signal * @wave: the old wave * * A wave item has been removed from the wavetable */ signals[WAVE_REMOVED_EVENT] = g_signal_new("wave-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_WAVE // param data ); g_object_class_install_property(gobject_class,WAVETABLE_SONG, g_param_spec_object("song", "song contruct prop", "Set song object, the wavetable belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVETABLE_WAVES, g_param_spec_pointer("waves", "waves list prop", "A copy of the list of waves", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVETABLE_MISSING_WAVES, g_param_spec_pointer("missing-waves", "missing-waves list prop", "The list of missing waves, don't change", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/libbuzztard-core/0000755042355400116100000000000011675570675016163 500000000000000buzztard-0.6.0/src/lib/core/libbuzztard-core/sink-machine.h0000644042355400116100000000511611625546407020614 00000000000000/* $Id: sink-machine.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SINK_MACHINE_H #define BT_SINK_MACHINE_H #include #include #include "machine.h" #define BT_TYPE_SINK_MACHINE (bt_sink_machine_get_type ()) #define BT_SINK_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SINK_MACHINE, BtSinkMachine)) #define BT_SINK_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SINK_MACHINE, BtSinkMachineClass)) #define BT_IS_SINK_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SINK_MACHINE)) #define BT_IS_SINK_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SINK_MACHINE)) #define BT_SINK_MACHINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SINK_MACHINE, BtSinkMachineClass)) /* type macros */ typedef struct _BtSinkMachine BtSinkMachine; typedef struct _BtSinkMachineClass BtSinkMachineClass; /** * BtSinkMachine: * * Sub-class of a #BtMachine that implements a signal output * (a machine with inputs only). */ struct _BtSinkMachine { const BtMachine parent; }; struct _BtSinkMachineClass { const BtMachineClass parent; }; /** * BtSinkMachinePatternIndex: * @BT_SINK_MACHINE_PATTERN_INDEX_BREAK: stop the pattern * @BT_SINK_MACHINE_PATTERN_INDEX_MUTE: mute the machine * @BT_SINK_MACHINE_PATTERN_INDEX_OFFSET: offset for real pattern ids * * Use this with bt_machine_get_pattern_by_index() to get the command patterns. */ typedef enum { BT_SINK_MACHINE_PATTERN_INDEX_BREAK=0, BT_SINK_MACHINE_PATTERN_INDEX_MUTE, BT_SINK_MACHINE_PATTERN_INDEX_OFFSET } BtSinkMachinePatternIndex; GType bt_sink_machine_get_type(void) G_GNUC_CONST; BtSinkMachine *bt_sink_machine_new(const BtSong * const song, const gchar * const id, GError **err); #endif // BT_SINK_MACHINE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/pattern.h0000644042355400116100000001376111625546407017730 00000000000000/* $Id: pattern.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PATTERN_H #define BT_PATTERN_H #include #include #define BT_TYPE_PATTERN (bt_pattern_get_type ()) #define BT_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PATTERN, BtPattern)) #define BT_PATTERN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PATTERN, BtPatternClass)) #define BT_IS_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PATTERN)) #define BT_IS_PATTERN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PATTERN)) #define BT_PATTERN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PATTERN, BtPatternClass)) /* type macros */ typedef struct _BtPattern BtPattern; typedef struct _BtPatternClass BtPatternClass; typedef struct _BtPatternPrivate BtPatternPrivate; /** * BtPattern: * * Holds a sequence of events for a #BtMachine. */ struct _BtPattern { const GObject parent; /*< private >*/ BtPatternPrivate *priv; }; struct _BtPatternClass { const GObjectClass parent; }; #define BT_TYPE_PATTERN_CMD (bt_pattern_cmd_get_type()) /** * BtPatternCmd: * @BT_PATTERN_CMD_NORMAL: just working * @BT_PATTERN_CMD_BREAK: no more notes * @BT_PATTERN_CMD_MUTE: be quiet immediately * @BT_PATTERN_CMD_SOLO: be the only one playing * @BT_PATTERN_CMD_BYPASS: be uneffective (pass through) * * A pattern has a command field for every tick. * The commands are only used in static internal patterns. */ typedef enum { BT_PATTERN_CMD_NORMAL=0, BT_PATTERN_CMD_BREAK, BT_PATTERN_CMD_MUTE, BT_PATTERN_CMD_SOLO, BT_PATTERN_CMD_BYPASS } BtPatternCmd; GType bt_pattern_get_type(void) G_GNUC_CONST; GType bt_pattern_cmd_get_type(void) G_GNUC_CONST; #include "machine.h" #include "song.h" BtPattern *bt_pattern_new(const BtSong * const song, const gchar * const id, const gchar * const name, const gulong length, const BtMachine * const machine); BtPattern *bt_pattern_new_with_event(const BtSong * const song, const BtMachine * const machine, const BtPatternCmd cmd); BtPattern *bt_pattern_copy(const BtPattern * const self); gulong bt_pattern_get_global_param_index(const BtPattern * const self, const gchar * const name, GError **error); gulong bt_pattern_get_voice_param_index(const BtPattern * const self, const gchar * const name, GError **error); GValue *bt_pattern_get_global_event_data(const BtPattern * const self, const gulong tick, const gulong param); GValue *bt_pattern_get_voice_event_data(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param); gboolean bt_pattern_set_global_event(const BtPattern * const self, const gulong tick, const gulong param, const gchar * const value); gboolean bt_pattern_set_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param, const gchar * const value); gchar *bt_pattern_get_global_event(const BtPattern * const self, const gulong tick, const gulong param); gchar *bt_pattern_get_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param); gboolean bt_pattern_test_global_event(const BtPattern * const self, const gulong tick, const gulong param); gboolean bt_pattern_test_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param); BtPatternCmd bt_pattern_get_cmd(const BtPattern * const self, const gulong tick); gboolean bt_pattern_tick_has_data(const BtPattern * const self, const gulong tick); void bt_pattern_insert_row(const BtPattern * const self, const gulong tick, const gulong param); void bt_pattern_insert_full_row(const BtPattern * const self, const gulong tick); void bt_pattern_delete_row(const BtPattern * const self, const gulong tick, const gulong param); void bt_pattern_delete_full_row(const BtPattern * const self, const gulong tick); void bt_pattern_delete_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_pattern_delete_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick); void bt_pattern_blend_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_pattern_blend_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick); void bt_pattern_flip_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_pattern_flip_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick); void bt_pattern_randomize_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_pattern_randomize_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick); void bt_pattern_serialize_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param, GString *data); void bt_pattern_serialize_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick, GString *data); gboolean bt_pattern_deserialize_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param, const gchar *data); #endif /* BT_PATTERN_H */ buzztard-0.6.0/src/lib/core/libbuzztard-core/source-machine.h0000644042355400116100000000547311625546407021156 00000000000000/* $Id: source-machine.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SOURCE_MACHINE_H #define BT_SOURCE_MACHINE_H #include #include #include "machine.h" #define BT_TYPE_SOURCE_MACHINE (bt_source_machine_get_type ()) #define BT_SOURCE_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SOURCE_MACHINE, BtSourceMachine)) #define BT_SOURCE_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SOURCE_MACHINE, BtSourceMachineClass)) #define BT_IS_SOURCE_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SOURCE_MACHINE)) #define BT_IS_SOURCE_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SOURCE_MACHINE)) #define BT_SOURCE_MACHINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SOURCE_MACHINE, BtSourceMachineClass)) /* type macros */ typedef struct _BtSourceMachine BtSourceMachine; typedef struct _BtSourceMachineClass BtSourceMachineClass; /** * BtSourceMachine: * * Sub-class of a #BtMachine that implements a signal generator * (a machine with outputs only). */ struct _BtSourceMachine { const BtMachine parent; }; struct _BtSourceMachineClass { const BtMachineClass parent; }; /** * BtSourceMachinePatternIndex: * @BT_SOURCE_MACHINE_PATTERN_INDEX_BREAK: stop the pattern * @BT_SOURCE_MACHINE_PATTERN_INDEX_MUTE: mute the machine * @BT_SOURCE_MACHINE_PATTERN_INDEX_SOLO: play only this machine * @BT_SOURCE_MACHINE_PATTERN_INDEX_OFFSET: offset for real pattern ids * * Use this with bt_machine_get_pattern_by_index() to get the command patterns. */ typedef enum { BT_SOURCE_MACHINE_PATTERN_INDEX_BREAK=0, BT_SOURCE_MACHINE_PATTERN_INDEX_MUTE, BT_SOURCE_MACHINE_PATTERN_INDEX_SOLO, BT_SOURCE_MACHINE_PATTERN_INDEX_OFFSET } BtSourceMachinePatternIndex; GType bt_source_machine_get_type(void) G_GNUC_CONST; BtSourceMachine *bt_source_machine_new(const BtSong * const song, const gchar * const id, const gchar * const plugin_name, const glong voices, GError **err); #endif // BT_SOURCE_MACHINE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song.h0000644042355400116100000000473111665720072017212 00000000000000/* $Id: song.h 3715 2011-12-01 15:41:45Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_H #define BT_SONG_H #include #include #include "application.h" #define BT_TYPE_SONG (bt_song_get_type ()) #define BT_SONG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG, BtSong)) #define BT_SONG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG, BtSongClass)) #define BT_IS_SONG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG)) #define BT_IS_SONG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG)) #define BT_SONG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG, BtSongClass)) /* type macros */ typedef struct _BtSong BtSong; typedef struct _BtSongClass BtSongClass; typedef struct _BtSongPrivate BtSongPrivate; /** * BtSong: * * Song project object * (contains #BtSongInfo, #BtSetup and #BtSequence) */ struct _BtSong { const GObject parent; /*< private >*/ BtSongPrivate *priv; }; /** * BtSongClass: * @parent: parent class type * * Base class for songs */ struct _BtSongClass { const GObjectClass parent; /*< private >*/ }; GType bt_song_get_type(void) G_GNUC_CONST; BtSong *bt_song_new(const BtApplication * const app); gboolean bt_song_play(const BtSong * const self); gboolean bt_song_stop(const BtSong * const self); gboolean bt_song_pause(const BtSong * const self); gboolean bt_song_continue(const BtSong * const self); gboolean bt_song_update_playback_position(const BtSong * const self); // for debugging void bt_song_write_to_highlevel_dot_file(const BtSong * const self); void bt_song_write_to_lowlevel_dot_file(const BtSong * const self); #endif // BT_SONG_H buzztard-0.6.0/src/lib/core/libbuzztard-core/application.h0000644042355400116100000000405611625546407020553 00000000000000/* $Id: application.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_APPLICATION_H #define BT_APPLICATION_H #include #include #define BT_TYPE_APPLICATION (bt_application_get_type ()) #define BT_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_APPLICATION, BtApplication)) #define BT_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_APPLICATION, BtApplicationClass)) #define BT_IS_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_APPLICATION)) #define BT_IS_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_APPLICATION)) #define BT_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_APPLICATION, BtApplicationClass)) /* type macros */ typedef struct _BtApplication BtApplication; typedef struct _BtApplicationClass BtApplicationClass; typedef struct _BtApplicationPrivate BtApplicationPrivate; /** * BtApplication: * * base object for a buzztard based application */ struct _BtApplication { const GObject parent; /*< private >*/ BtApplicationPrivate *priv; }; struct _BtApplicationClass { const GObjectClass parent; }; GType bt_application_get_type(void) G_GNUC_CONST; #endif // BT_APPLICATION_H buzztard-0.6.0/src/lib/core/libbuzztard-core/settings-private.h0000644042355400116100000000475211576360370021561 00000000000000/* $Id: settings-private.h 2951 2010-08-31 15:23:05Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PRIVATE_H #define BT_SETTINGS_PRIVATE_H #include "settings.h" /* don't forget to add entries to tests/bt-test-settings.c */ enum { /* ui */ BT_SETTINGS_NEWS_SEEN=1, BT_SETTINGS_MISSING_MACHINES, BT_SETTINGS_PRESENTED_TIPS, BT_SETTINGS_SHOW_TIPS, BT_SETTINGS_MENU_TOOLBAR_HIDE, BT_SETTINGS_MENU_STATUSBAR_HIDE, BT_SETTINGS_MENU_TABS_HIDE, BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY, BT_SETTINGS_WINDOW_XPOS, BT_SETTINGS_WINDOW_YPOS, BT_SETTINGS_WINDOW_WIDTH, BT_SETTINGS_WINDOW_HEIGHT, /* preferences */ BT_SETTINGS_AUDIOSINK, BT_SETTINGS_SAMPLE_RATE, BT_SETTINGS_CHANNELS, BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_ACTIVE, BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT, BT_SETTINGS_FOLDER_SONG, BT_SETTINGS_FOLDER_RECORD, BT_SETTINGS_FOLDER_SAMPLE, /* @idea: additional application settings */ BT_SETTINGS_SYSTEM_AUDIOSINK, BT_SETTINGS_SYSTEM_TOOLBAR_STYLE, /* @idea: additional system settings BT_SETTINGS_SYSTEM_TOOLBAR_DETACHABLE gconf:desktop/gnome/interface/toolbar_detachable BT_SETTINGS_SYSTEM_TOOLBAR_ICON_SIZE gconf:desktop/gnome/interface/toolbar_icon_size BT_SETTINGS_SYSTEM_MENUBAR_DETACHABLE gconf:desktop/gnome/interface/menubar_detachable BT_SETTINGS_SYSTEM_MENU_HAVE_ICONS gconf:desktop/gnome/interface/menus_have_icons BT_SETTINGS_SYSTEM_MENU_HAVE_TEAROFF gconf:desktop/gnome/interface/menus_have_tearoff BT_SETTINGS_SYSTEM_KEYBOARD_LAYOUT gconf:desktop/gnome/peripherals/keyboard/{kbd,xkb}/layouts */ BT_SETTINGS_COUNT }; #endif // BT_SETTINGS_PRIVATE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/Makefile.in0000644042355400116100000004415711675570634020156 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/lib/core/libbuzztard-core DIST_COMMON = $(libbtcore_HEADERS) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/version.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.h CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = 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__installdirs = "$(DESTDIR)$(libbtcoredir)" HEADERS = $(libbtcore_HEADERS) $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ libbtcoredir = $(includedir)/libbuzztard-core libbtcore_HEADERS = \ core.h \ tools.h \ version.h \ \ application.h \ childproxy.h \ gconf-settings.h\ machine.h \ pattern.h \ persistence.h \ plainfile-settings.h \ processor-machine.h \ sequence.h \ settings.h \ setup.h \ sink-bin.h \ sink-machine.h \ song.h \ song-info.h \ song-io.h \ song-io-native.h \ song-io-native-bzt.h \ song-io-native-xml.h \ source-machine.h \ wavetable.h \ wave.h \ wavelevel.h \ wire.h \ wire-pattern.h # yet unused sources # plainfile-settings.h \ # noinst_HEADERS = settings-private.h # DISTCLEANFILES is for files generated by configure DISTCLEANFILES = version.h 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 src/lib/core/libbuzztard-core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/core/libbuzztard-core/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): version.h: $(top_builddir)/config.status $(srcdir)/version.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libbtcoreHEADERS: $(libbtcore_HEADERS) @$(NORMAL_INSTALL) test -z "$(libbtcoredir)" || $(MKDIR_P) "$(DESTDIR)$(libbtcoredir)" @list='$(libbtcore_HEADERS)'; test -n "$(libbtcoredir)" || list=; \ 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_HEADER) $$files '$(DESTDIR)$(libbtcoredir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libbtcoredir)" || exit $$?; \ done uninstall-libbtcoreHEADERS: @$(NORMAL_UNINSTALL) @list='$(libbtcore_HEADERS)'; test -n "$(libbtcoredir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(libbtcoredir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libbtcoredir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libbtcoredir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libbtcoreHEADERS 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: uninstall-libbtcoreHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags 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-libbtcoreHEADERS 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 uninstall uninstall-am uninstall-libbtcoreHEADERS # 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: buzztard-0.6.0/src/lib/core/libbuzztard-core/setup.h0000644042355400116100000000643311625546407017411 00000000000000/* $Id: setup.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETUP_H #define BT_SETUP_H #include #include #include "machine.h" #include "wire.h" #define BT_TYPE_SETUP (bt_setup_get_type ()) #define BT_SETUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETUP, BtSetup)) #define BT_SETUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETUP, BtSetupClass)) #define BT_IS_SETUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETUP)) #define BT_IS_SETUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETUP)) #define BT_SETUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETUP, BtSetupClass)) /* type macros */ typedef struct _BtSetup BtSetup; typedef struct _BtSetupClass BtSetupClass; typedef struct _BtSetupPrivate BtSetupPrivate; /** * BtSetup: * * virtual hardware setup * (contains #BtMachine and #BtWire objects) */ struct _BtSetup { const GObject parent; /*< private >*/ BtSetupPrivate *priv; }; struct _BtSetupClass { const GObjectClass parent; }; GType bt_setup_get_type(void) G_GNUC_CONST; BtSetup *bt_setup_new(const BtSong * const song); gboolean bt_setup_add_machine(const BtSetup * const self, const BtMachine * const machine); gboolean bt_setup_add_wire(const BtSetup * const self, const BtWire * const wire); void bt_setup_remove_machine(const BtSetup * const self, const BtMachine * const machine); void bt_setup_remove_wire(const BtSetup * const self, const BtWire * const wire); BtMachine *bt_setup_get_machine_by_id(const BtSetup * const self, const gchar * const id); BtMachine *bt_setup_get_machine_by_type(const BtSetup * const self, const GType type); GList *bt_setup_get_machines_by_type(const BtSetup * const self, const GType type); BtWire *bt_setup_get_wire_by_src_machine(const BtSetup * const self, const BtMachine * const src); BtWire *bt_setup_get_wire_by_dst_machine(const BtSetup * const self, const BtMachine * const dst); BtWire *bt_setup_get_wire_by_machines(const BtSetup * const self, const BtMachine * const src, const BtMachine * const dst); GList *bt_setup_get_wires_by_src_machine(const BtSetup * const self, const BtMachine * const src); GList *bt_setup_get_wires_by_dst_machine(const BtSetup * const self, const BtMachine * const dst); gchar *bt_setup_get_unique_machine_id(const BtSetup * const self, const gchar * const base_name); void bt_setup_remember_missing_machine(const BtSetup * const self, const gchar * const str); #endif // BT_SETUP_H buzztard-0.6.0/src/lib/core/libbuzztard-core/version.h.in0000644042355400116100000000217311626121152020323 00000000000000/* $Id: version.h.in 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_VERSION_H #define BT_VERSION_H /* * buzztard version stamp; determined from configure.ac */ #define BT_MAJOR_VERSION @BT_MAJOR_VERSION@ #define BT_MINOR_VERSION @BT_MINOR_VERSION@ #define BT_MICRO_VERSION @BT_MICRO_VERSION@ #endif // BT_VERSION buzztard-0.6.0/src/lib/core/libbuzztard-core/wire-pattern.h0000644042355400116100000001126511625545030020660 00000000000000/* $Id$ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WIRE_PATTERN_H #define BT_WIRE_PATTERN_H #include #include #define BT_TYPE_WIRE_PATTERN (bt_wire_pattern_get_type ()) #define BT_WIRE_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WIRE_PATTERN, BtWirePattern)) #define BT_WIRE_PATTERN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WIRE_PATTERN, BtWirePatternClass)) #define BT_IS_WIRE_PATTERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WIRE_PATTERN)) #define BT_IS_WIRE_PATTERN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WIRE_PATTERN)) #define BT_WIRE_PATTERN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WIRE_PATTERN, BtWirePatternClass)) /* type macros */ typedef struct _BtWirePattern BtWirePattern; typedef struct _BtWirePatternClass BtWirePatternClass; typedef struct _BtWirePatternPrivate BtWirePatternPrivate; /** * BtWirePattern: * * Class that holds a sequence of automation events for a #BtWire. */ struct _BtWirePattern { const GObject parent; /*< private >*/ BtWirePatternPrivate *priv; }; struct _BtWirePatternClass { const GObjectClass parent; }; GType bt_wire_pattern_get_type(void) G_GNUC_CONST; #include "song.h" #include "wire.h" BtWirePattern *bt_wire_pattern_new(const BtSong * const song, const BtWire * const wire, const BtPattern * const pattern); BtWirePattern *bt_wire_pattern_copy(const BtWirePattern * const self, const BtPattern * const pattern); GValue *bt_wire_pattern_get_event_data(const BtWirePattern * const self, const gulong tick, const gulong param); gboolean bt_wire_pattern_set_event(const BtWirePattern * const self, const gulong tick, const gulong param, const gchar * const value); gchar *bt_wire_pattern_get_event(const BtWirePattern * const self, const gulong tick, const gulong param); gboolean bt_wire_pattern_test_event(const BtWirePattern * const self, const gulong tick, const gulong param); gboolean bt_wire_pattern_tick_has_data(const BtWirePattern * const self, const gulong tick); void bt_wire_pattern_insert_row(const BtWirePattern * const self, const gulong tick, const gulong param); void bt_wire_pattern_insert_full_row(const BtWirePattern * const self, const gulong tick); void bt_wire_pattern_delete_row(const BtWirePattern * const self, const gulong tick, const gulong param); void bt_wire_pattern_delete_full_row(const BtWirePattern * const self, const gulong tick); void bt_wire_pattern_delete_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_wire_pattern_delete_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick); void bt_wire_pattern_blend_column(const BtWirePattern * const self, const gulong start_tick,const gulong end_tick, const gulong param); void bt_wire_pattern_blend_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick); void bt_wire_pattern_flip_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_wire_pattern_flip_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick); void bt_wire_pattern_randomize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); void bt_wire_pattern_randomize_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick); void bt_wire_pattern_serialize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param, GString *data); void bt_wire_pattern_serialize_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, GString *data); gboolean bt_wire_pattern_deserialize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param, const gchar *data); #endif /* BT_WIRE_PATTERN_H */ buzztard-0.6.0/src/lib/core/libbuzztard-core/childproxy.h0000644042355400116100000000605311670066207020427 00000000000000/* $Id: childproxy.h 3759 2011-12-08 07:51:35Z ensonic $ * * Buzztard * Copyright (C) 2005 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CHILD_PROXY_H #define BT_CHILD_PROXY_H #include #include G_BEGIN_DECLS #define BT_TYPE_CHILD_PROXY (bt_child_proxy_get_type ()) #define BT_CHILD_PROXY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_CHILD_PROXY, BtChildProxy)) #define BT_IS_CHILD_PROXY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_CHILD_PROXY)) #define BT_CHILD_PROXY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), BT_TYPE_CHILD_PROXY, BtChildProxyInterface)) typedef struct _BtChildProxy BtChildProxy; /* dummy object */ typedef struct _BtChildProxyInterface BtChildProxyInterface; /** * BtChildProxyInterface: * @get_child_by_name: virtual method to fetch the child by name * @get_child_by_index: virtual method to fetch the child by position * @get_children_count: virtual method to get the children count * * #BtChildProxy interface. */ struct _BtChildProxyInterface { /*< private >*/ GTypeInterface parent; /*< public >*/ /* virtual methods */ GObject *(*get_child_by_name)(BtChildProxy *parent,const gchar *name); GObject *(*get_child_by_index) (BtChildProxy *parent,guint index); guint (*get_children_count) (BtChildProxy *parent); }; GType bt_child_proxy_get_type(void) G_GNUC_CONST; GObject *bt_child_proxy_get_child_by_name(BtChildProxy *parent,const gchar *name); GObject *bt_child_proxy_get_child_by_index(BtChildProxy *parent,guint index); guint bt_child_proxy_get_children_count(BtChildProxy *parent); gboolean bt_child_proxy_lookup(GObject *object,const gchar *name,GObject **target,GParamSpec **pspec); void bt_child_proxy_get_property(GObject *object,const gchar *name,GValue *value); void bt_child_proxy_get_valist(GObject *object,const gchar *first_property_name,va_list var_args); void bt_child_proxy_get(gpointer object,const gchar *first_property_name,...) G_GNUC_NULL_TERMINATED; void bt_child_proxy_set_property(GObject *object,const gchar *name,const GValue *value); void bt_child_proxy_set_valist(GObject *object,const gchar *first_property_name,va_list var_args); void bt_child_proxy_set(gpointer object,const gchar *first_property_name,...) G_GNUC_NULL_TERMINATED; G_END_DECLS #endif // BT_CHILD_PROXY_H */ buzztard-0.6.0/src/lib/core/libbuzztard-core/processor-machine.h0000644042355400116100000000566511625546407021700 00000000000000/* $Id: processor-machine.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PROCESSOR_MACHINE_H #define BT_PROCESSOR_MACHINE_H #include #include #include "machine.h" #define BT_TYPE_PROCESSOR_MACHINE (bt_processor_machine_get_type ()) #define BT_PROCESSOR_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PROCESSOR_MACHINE, BtProcessorMachine)) #define BT_PROCESSOR_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PROCESSOR_MACHINE, BtProcessorMachineClass)) #define BT_IS_PROCESSOR_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PROCESSOR_MACHINE)) #define BT_IS_PROCESSOR_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PROCESSOR_MACHINE)) #define BT_PROCESSOR_MACHINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PROCESSOR_MACHINE, BtProcessorMachineClass)) /* type macros */ typedef struct _BtProcessorMachine BtProcessorMachine; typedef struct _BtProcessorMachineClass BtProcessorMachineClass; /** * BtProcessorMachine: * * Sub-class of a #BtMachine that implements an effect-processor * (a machine with in and outputs). */ struct _BtProcessorMachine { const BtMachine parent; }; struct _BtProcessorMachineClass { const BtMachineClass parent; }; /** * BtProcessorMachinePatternIndex: * @BT_PROCESSOR_MACHINE_PATTERN_INDEX_BREAK: stop the pattern * @BT_PROCESSOR_MACHINE_PATTERN_INDEX_MUTE: mute the machine * @BT_PROCESSOR_MACHINE_PATTERN_INDEX_BYPASS: bypass the machine * @BT_PROCESSOR_MACHINE_PATTERN_INDEX_OFFSET: offset for real pattern ids * * Use this with bt_machine_get_pattern_by_index() to get the command patterns. */ typedef enum { BT_PROCESSOR_MACHINE_PATTERN_INDEX_BREAK=0, BT_PROCESSOR_MACHINE_PATTERN_INDEX_MUTE, BT_PROCESSOR_MACHINE_PATTERN_INDEX_BYPASS, BT_PROCESSOR_MACHINE_PATTERN_INDEX_OFFSET } BtProcessorMachinePatternIndex; GType bt_processor_machine_get_type(void) G_GNUC_CONST; BtProcessorMachine *bt_processor_machine_new(const BtSong * const song, const gchar * const id, const gchar * const plugin_name, const glong voices, GError **err); #endif // BT_PROCESSOR_MACHINE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/wavelevel.h0000644042355400116100000000464011625546407020241 00000000000000/* $Id: wavelevel.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WAVELEVEL_H #define BT_WAVELEVEL_H #include #include #define BT_TYPE_WAVELEVEL (bt_wavelevel_get_type ()) #define BT_WAVELEVEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WAVELEVEL, BtWavelevel)) #define BT_WAVELEVEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WAVELEVEL, BtWavelevelClass)) #define BT_IS_WAVELEVEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WAVELEVEL)) #define BT_IS_WAVELEVEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WAVELEVEL)) #define BT_WAVELEVEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WAVELEVEL, BtWavelevelClass)) /* type macros */ typedef struct _BtWavelevel BtWavelevel; typedef struct _BtWavelevelClass BtWavelevelClass; typedef struct _BtWavelevelPrivate BtWavelevelPrivate; /** * BtWavelevel: * * A tone level for a #BtWave. In most cases a #BtWave has only one * #BtWavelevel. */ struct _BtWavelevel { const GObject parent; /*< private >*/ BtWavelevelPrivate *priv; }; struct _BtWavelevelClass { const GObjectClass parent; }; /** * BT_WAVELEVEL_DEFAULT_ROOT_NOTE: * * Default base-note for a wavelevel (c-3). */ #define BT_WAVELEVEL_DEFAULT_ROOT_NOTE (1+(4*16)) GType bt_wavelevel_get_type(void) G_GNUC_CONST; #include "song.h" #include "wave.h" BtWavelevel *bt_wavelevel_new(const BtSong * const song, const BtWave * const wave, const guchar root_note, const gulong length, const glong loop_start, const glong loop_end, const gulong rate, gconstpointer sample); #endif // BT_WAVELEVEL_H buzztard-0.6.0/src/lib/core/libbuzztard-core/machine.h0000644042355400116100000002051111626121152017631 00000000000000/* $Id: machine.h 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_H #define BT_MACHINE_H #include #include #include #define BT_TYPE_MACHINE (bt_machine_get_type ()) #define BT_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE, BtMachine)) #define BT_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE, BtMachineClass)) #define BT_IS_MACHINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE)) #define BT_IS_MACHINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE)) #define BT_MACHINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE, BtMachineClass)) /* type macros */ typedef struct _BtMachine BtMachine; typedef struct _BtMachineClass BtMachineClass; typedef struct _BtMachinePrivate BtMachinePrivate; /** * BtMachine: * @src_wires: read-only list of outgoing #BtWire objects * @dst_wires: read-only list of incomming #BtWire objects * * Base object for a virtual piece of hardware (generator, effect, ...). */ struct _BtMachine { const GstBin parent; /*< public >*/ /*< read-only >*/ GList *src_wires; GList *dst_wires; /*< private >*/ BtMachinePrivate *priv; }; /** * BtMachineClass: * @check_type: sanity check that the given input/output characteristics are * okay for the implementation * * Base class for machines. */ struct _BtMachineClass { /*< private >*/ const GstBinClass parent; /*< public >*/ /* virtual methods for subclasses */ gboolean (*check_type)(const BtMachine * const machine, const gulong pad_src_ct, const gulong pad_sink_ct); }; #define BT_TYPE_MACHINE_STATE (bt_machine_state_get_type()) /** * BtMachineState: * @BT_MACHINE_STATE_NORMAL: just working * @BT_MACHINE_STATE_MUTE: be quiet * @BT_MACHINE_STATE_SOLO: be the only one playing * @BT_MACHINE_STATE_BYPASS: be uneffective (pass through) * * A machine is always in one of the 4 states. * Use the "state" property of the #BtMachine to change or query the current state. */ typedef enum { BT_MACHINE_STATE_NORMAL=0, BT_MACHINE_STATE_MUTE, BT_MACHINE_STATE_SOLO, BT_MACHINE_STATE_BYPASS, /*< private >*/ BT_MACHINE_STATE_COUNT } BtMachineState; GType bt_machine_get_type(void) G_GNUC_CONST; GType bt_machine_state_get_type(void) G_GNUC_CONST; gboolean bt_machine_enable_input_pre_level(BtMachine * const self); gboolean bt_machine_enable_input_post_level(BtMachine * const self); gboolean bt_machine_enable_output_pre_level(BtMachine * const self); gboolean bt_machine_enable_output_post_level(BtMachine * const self); gboolean bt_machine_enable_input_gain(BtMachine * const self); gboolean bt_machine_enable_output_gain(BtMachine * const self); gboolean bt_machine_activate_adder(BtMachine * const self); gboolean bt_machine_has_active_adder(const BtMachine * const self); gboolean bt_machine_activate_spreader(BtMachine * const self); gboolean bt_machine_has_active_spreader(const BtMachine * const self); // pattern handling #include "pattern.h" #include "wire.h" void bt_machine_add_pattern(const BtMachine *self, const BtPattern *pattern); void bt_machine_remove_pattern(const BtMachine *self, const BtPattern *pattern); BtPattern *bt_machine_get_pattern_by_id(const BtMachine * const self, const gchar * const id); BtPattern *bt_machine_get_pattern_by_name(const BtMachine * const self,const gchar * const name); BtPattern *bt_machine_get_pattern_by_index(const BtMachine * const self, const gulong index); gchar *bt_machine_get_unique_pattern_name(const BtMachine * const self); gboolean bt_machine_has_patterns(const BtMachine * const self); // global and voice param handling gboolean bt_machine_is_polyphonic(const BtMachine * const self); gboolean bt_machine_is_global_param_trigger(const BtMachine * const self, const gulong index); gboolean bt_machine_is_voice_param_trigger(const BtMachine * const self, const gulong index); gboolean bt_machine_is_global_param_no_value(const BtMachine * const self, const gulong index, GValue * const value); gboolean bt_machine_is_voice_param_no_value(const BtMachine *const self, const gulong index, GValue * const value); GValue *bt_machine_get_global_param_no_value(const BtMachine * const self, const gulong index); GValue *bt_machine_get_voice_param_no_value(const BtMachine * const self, const gulong index); glong bt_machine_get_global_wave_param_index(const BtMachine * const self); glong bt_machine_get_voice_wave_param_index(const BtMachine * const self); void bt_machine_set_global_param_default(const BtMachine * const self, const gulong index); void bt_machine_set_voice_param_default(const BtMachine * const self, const gulong voice, const gulong index); void bt_machine_set_param_defaults(const BtMachine *const self); glong bt_machine_get_global_param_index(const BtMachine * const self, const gchar * const name, GError **error); glong bt_machine_get_voice_param_index(const BtMachine * const self, const gchar * const name, GError **error); GParamSpec *bt_machine_get_global_param_spec(const BtMachine * const self, const gulong index); GParamSpec *bt_machine_get_voice_param_spec(const BtMachine * const self, const gulong index); void bt_machine_get_global_param_details(const BtMachine * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val); void bt_machine_get_voice_param_details(const BtMachine * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val); GType bt_machine_get_global_param_type(const BtMachine * const self, const gulong index); GType bt_machine_get_voice_param_type(const BtMachine * const self, const gulong index); void bt_machine_set_global_param_value(const BtMachine * const self, const gulong index, GValue * const event); void bt_machine_set_voice_param_value(const BtMachine * const self, const gulong voice, const gulong index, GValue * const event); const gchar *bt_machine_get_global_param_name(const BtMachine * const self, const gulong index); const gchar *bt_machine_get_voice_param_name(const BtMachine * const self, const gulong index); gchar *bt_machine_describe_global_param_value(const BtMachine * const self, const gulong index, GValue * const event); gchar *bt_machine_describe_voice_param_value(const BtMachine * const self, const gulong index, GValue * const event); // controller handling void bt_machine_global_controller_change_value(const BtMachine * const self, const gulong param, const GstClockTime timestamp, GValue *value); void bt_machine_voice_controller_change_value(const BtMachine * const self, const gulong voice, const gulong param, const GstClockTime timestamp, GValue *value); //-- interaction control void bt_machine_bind_parameter_control(const BtMachine * const self, GstObject *object, const gchar *property_name, BtIcControl *control); void bt_machine_unbind_parameter_control(const BtMachine * const self, GstObject *object, const char *property_name); void bt_machine_unbind_parameter_controls(const BtMachine * const self); //-- settings void bt_machine_randomize_parameters(const BtMachine * const self); void bt_machine_reset_parameters(const BtMachine * const self) ; //-- linking BtWire *bt_machine_get_wire_by_dst_machine(const BtMachine * const self, const BtMachine * const dst); //-- debug helper GList *bt_machine_get_element_list(const BtMachine * const self); void bt_machine_dbg_print_parts(const BtMachine * const self); #if 0 void bt_machine_dbg_dump_global_controller_queue(const BtMachine * const self); void bt_machine_dbg_dump_voice_controller_queue(const BtMachine * const self); #endif #endif // BT_MACHINE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song-io-native-xml.h0000644042355400116100000000444311625546407021705 00000000000000/* $Id: song-io-native-xml.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_IO_NATIVE_XML_H #define BT_SONG_IO_NATIVE_XML_H #include #include #include "song-io-native.h" #define BT_TYPE_SONG_IO_NATIVE_XML (bt_song_io_native_xml_get_type ()) #define BT_SONG_IO_NATIVE_XML(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG_IO_NATIVE_XML, BtSongIONativeXML)) #define BT_SONG_IO_NATIVE_XML_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG_IO_NATIVE_XML, BtSongIONativeXMLClass)) #define BT_IS_SONG_IO_NATIVE_XML(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG_IO_NATIVE_XML)) #define BT_IS_SONG_IO_NATIVE_XML_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG_IO_NATIVE_XML)) #define BT_SONG_IO_NATIVE_XML_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG_IO_NATIVE_XML, BtSongIONativeXMLClass)) /* type macros */ typedef struct _BtSongIONativeXML BtSongIONativeXML; typedef struct _BtSongIONativeXMLClass BtSongIONativeXMLClass; /** * BtSongIONativeXML: * * object for song input and output in native zip/xml format */ struct _BtSongIONativeXML { const BtSongIONative parent; }; /** * BtSongIONativeXMLClass: * @parent: parent class type * * Class for song input and output in native zip/xml format */ struct _BtSongIONativeXMLClass { const BtSongIONativeClass parent; /*< private >*/ }; GType bt_song_io_native_xml_get_type(void) G_GNUC_CONST; #endif // BT_SONG_IO_NATIVE_XML_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song-info.h0000644042355400116100000000400311625546407020137 00000000000000/* $Id: song-info.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_INFO_H #define BT_SONG_INFO_H #include #include #define BT_TYPE_SONG_INFO (bt_song_info_get_type ()) #define BT_SONG_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG_INFO, BtSongInfo)) #define BT_SONG_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG_INFO, BtSongInfoClass)) #define BT_IS_SONG_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG_INFO)) #define BT_IS_SONG_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG_INFO)) #define BT_SONG_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG_INFO, BtSongInfoClass)) /* type macros */ typedef struct _BtSongInfo BtSongInfo; typedef struct _BtSongInfoClass BtSongInfoClass; typedef struct _BtSongInfoPrivate BtSongInfoPrivate; /** * BtSongInfo: * * holds song metadata */ struct _BtSongInfo { const GObject parent; /*< private >*/ BtSongInfoPrivate *priv; }; struct _BtSongInfoClass { const GObjectClass parent; }; GType bt_song_info_get_type(void) G_GNUC_CONST; BtSongInfo *bt_song_info_new(const BtSong * const song); #endif // BT_SONG_INFO_H buzztard-0.6.0/src/lib/core/libbuzztard-core/version.h0000644042355400116100000000211011675570643017726 00000000000000/* $Id: version.h.in 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_VERSION_H #define BT_VERSION_H /* * buzztard version stamp; determined from configure.ac */ #define BT_MAJOR_VERSION 0 #define BT_MINOR_VERSION 6 #define BT_MICRO_VERSION 0 #endif // BT_VERSION buzztard-0.6.0/src/lib/core/libbuzztard-core/plainfile-settings.h0000644042355400116100000000453011625546407022046 00000000000000/* $Id: plainfile-settings.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PLAINFILE_SETTINGS_H #define BT_PLAINFILE_SETTINGS_H #include #include #include "settings.h" #define BT_TYPE_PLAINFILE_SETTINGS (bt_plainfile_settings_get_type ()) #define BT_PLAINFILE_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PLAINFILE_SETTINGS, BtPlainfileSettings)) #define BT_PLAINFILE_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PLAINFILE_SETTINGS, BtPlainfileSettingsClass)) #define BT_IS_PLAINFILE_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PLAINFILE_SETTINGS)) #define BT_IS_PLAINFILE_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PLAINFILE_SETTINGS)) #define BT_PLAINFILE_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PLAINFILE_SETTINGS, BtPlainfileSettingsClass)) /* type macros */ typedef struct _BtPlainfileSettings BtPlainfileSettings; typedef struct _BtPlainfileSettingsClass BtPlainfileSettingsClass; typedef struct _BtPlainfileSettingsPrivate BtPlainfileSettingsPrivate; /** * BtPlainfileSettings: * * gconf based implementation object for a buzztard based settings */ struct _BtPlainfileSettings { const BtSettings parent; /*< private >*/ BtPlainfileSettingsPrivate *priv; }; struct _BtPlainfileSettingsClass { const BtSettingsClass parent; }; GType bt_plainfile_settings_get_type(void) G_GNUC_CONST; BtPlainfileSettings *bt_plainfile_settings_new(void); #endif // BT_PLAINFILE_SETTINGS_H buzztard-0.6.0/src/lib/core/libbuzztard-core/tools.h0000644042355400116100000001676311623460026017406 00000000000000/* $Id: tools.h 3527 2011-08-09 09:07:57Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_TOOLS_H #define BT_TOOLS_H #ifndef BT_TOOLS_C #include //-- gst registry extern GList *bt_gst_registry_get_element_factories_matching_all_categories(const gchar *class_filter); extern GList *bt_gst_registry_get_element_names_matching_all_categories(const gchar *class_filter); extern gboolean bt_gst_element_factory_can_sink_media_type(GstElementFactory *factory,const gchar *name); extern GList *bt_gst_check_elements(GList *list); extern GList *bt_gst_check_core_elements(void); //-- gst safe linking extern gboolean bt_bin_activate_tee_chain(GstBin *bin, GstElement *tee, GList* analyzers, gboolean is_playing); extern gboolean bt_bin_deactivate_tee_chain(GstBin *bin, GstElement *tee, GList* analyzers, gboolean is_playing); //-- gst debugging extern const gchar *bt_gst_debug_pad_link_return(GstPadLinkReturn link_res,GstPad *src_pad,GstPad *sink_pad); //-- gst compat #if !GST_CHECK_VERSION(0,10,15) #define GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(bin, details, name) #endif //-- glib compat & helper extern GType bt_g_type_get_base_type(const GType type); //-- cpu load monitoring extern guint bt_cpu_load_get_current(void); #endif // !BT_TOOLS_C //-- glib compat & helper /** * return_if_disposed: * * Checks self->priv->dispose_has_run and * if %TRUE returns. * This macro is handy to use at the start of all class routines * such as #GObjectClass.get_property(), #GObjectClass.set_property(), * #GObjectClass.dispose(). */ #define return_if_disposed() if(self->priv->dispose_has_run) return /** * return_val_if_disposed: * @a: return value * * Checks self->priv->dispose_has_run and * if %TRUE returns with the supplied arg @a. * This macro is handy to use at the start of e.g. idle handlers. */ #define return_val_if_disposed(a) if(self->priv->dispose_has_run) return(a) /** * BT_IS_GVALUE: * @v: pointer to a GValue * * checks if the supplied gvalue is initialized (not all fields zero). */ #define BT_IS_GVALUE(v) (G_VALUE_TYPE(v)!=G_TYPE_INVALID) /** * BT_IS_STRING: * @a: string pointer * * checks if the supplied string pointer is not %NULL and contains not just '\0' */ #define BT_IS_STRING(a) (a && *a) /** * safe_string: * @a: string pointer * * passed the supplied string through or return an empty string when it is NULL * * Returns: the given string or an empty string in the case of a NULL argument */ #define safe_string(a) ((gchar *)(a)?(gchar *)(a):"") /* @idea g_alloca_printf #define g_alloca_printf(str,format,...) \ sprintf((str=alloca(g_printf_string_upper_bound(format, args)),format, args) */ // since glib 2.13.0 #ifndef G_PARAM_STATIC_STRINGS #define G_PARAM_STATIC_STRINGS (G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB) #endif // since glib 2.24.0 #ifndef G_DEFINE_INTERFACE #define G_DEFINE_INTERFACE(TN, t_n, T_P) G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, ;) #define G_DEFINE_INTERFACE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TN, t_n, T_P) {_C_;} _G_DEFINE_INTERFACE_EXTENDED_END() #define _G_DEFINE_INTERFACE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PREREQ) \ \ static void type_name##_default_init (TypeName##Interface *klass); \ \ GType \ type_name##_get_type (void) \ { \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ GType g_define_type_id = \ g_type_register_static_simple (G_TYPE_INTERFACE, \ g_intern_static_string (#TypeName), \ sizeof (TypeName##Interface), \ (GClassInitFunc)type_name##_default_init, \ 0, \ (GInstanceInitFunc)NULL, \ (GTypeFlags) 0); \ if (TYPE_PREREQ) \ g_type_interface_add_prerequisite (g_define_type_id, TYPE_PREREQ); \ { /* custom code follows */ #define _G_DEFINE_INTERFACE_EXTENDED_END() \ /* following custom code */ \ } \ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ } \ return g_define_type_id__volatile; \ } /* closes type_name##_get_type() */ #endif //-- gobject ref-count debugging & helpers /* GCC 4.1 introduced this crazy warning that complains about casting between different pointer types. The question is why this includes void* ? Sadly they don't gave tips how they belive to get rid of the warning. #define bt_type_pun_to_gpointer(val) \ (((union { gpointer __a; __typeof__((val)) __b; }){__b:(val)}).__a) */ /** * g_object_try_weak_ref: * @obj: the object to reference * * If the supplied object is not %NULL then reference it via * g_object_add_weak_pointer(). */ #define g_object_try_weak_ref(obj) if(obj) g_object_add_weak_pointer(G_OBJECT(obj),(gpointer *)&obj##_ptr); /* #define g_object_try_weak_ref(obj) \ if(obj) { \ gpointer *ptr=&bt_type_pun_to_gpointer(obj); \ GST_DEBUG(" reffing : %p",ptr); \ g_object_add_weak_pointer(G_OBJECT(obj),ptr); \ } */ /** * g_object_try_weak_unref: * @obj: the object to release the reference * * If the supplied object is not %NULL then release the reference via * g_object_remove_weak_pointer(). */ #define g_object_try_weak_unref(obj) if(obj) g_object_remove_weak_pointer(G_OBJECT(obj),(gpointer *)&obj##_ptr); /* #define g_object_try_weak_unref(obj) \ if(obj) { \ gpointer *ptr=&bt_type_pun_to_gpointer(obj); \ GST_DEBUG(" unreffing : %p",ptr); \ g_object_remove_weak_pointer(G_OBJECT(obj),(gpointer *)&bt_type_pun_to_gpointer(obj)); \ } */ /** * G_POINTER_ALIAS: * @type: the type * @var: the variable name * * Defines a anonymous union to handle gcc-4.1s type punning warning that one * gets when using e.g. g_object_try_weak_ref() */ #define G_POINTER_ALIAS(type,var) \ union { \ type var; \ gconstpointer var##_ptr; \ } /** * G_OBJECT_REF_COUNT: * @obj: the object (may be %NULL) * * Read the objects reference counter. Implemented as a macro, so don't use * expressions for @obj. * * Returns: the reference counter. */ #define G_OBJECT_REF_COUNT(obj) ((obj)?((G_OBJECT(obj))->ref_count):0) /** * g_object_try_ref: * @obj: the object to reference * * If the supplied object is not %NULL then reference it via * g_object_ref(). * * Returns: the referenced object or %NULL */ #define g_object_try_ref(obj) (obj)?g_object_ref(obj):NULL /** * g_object_try_unref: * @obj: the object to release the reference * * If the supplied object is not %NULL then release the reference via * g_object_unref(). */ #define g_object_try_unref(obj) if(obj) g_object_unref(obj) #endif // !BT_TOOLS_H buzztard-0.6.0/src/lib/core/libbuzztard-core/sequence.h0000644042355400116100000001067111625546407020060 00000000000000/* $Id: sequence.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SEQUENCE_H #define BT_SEQUENCE_H #include #include #include "pattern.h" #include "machine.h" #define BT_TYPE_SEQUENCE (bt_sequence_get_type ()) #define BT_SEQUENCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SEQUENCE, BtSequence)) #define BT_SEQUENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SEQUENCE, BtSequenceClass)) #define BT_IS_SEQUENCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SEQUENCE)) #define BT_IS_SEQUENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SEQUENCE)) #define BT_SEQUENCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SEQUENCE, BtSequenceClass)) /* type macros */ typedef struct _BtSequence BtSequence; typedef struct _BtSequenceClass BtSequenceClass; typedef struct _BtSequencePrivate BtSequencePrivate; /** * BtSequence: * * Starting point for the #BtSong timeline data-structures. * Holds a series of array of #BtPatterns for time and tracks, which define the * events that are sent to a #BtMachine at a time. */ struct _BtSequence { const GObject parent; /*< private >*/ BtSequencePrivate *priv; }; struct _BtSequenceClass { const GObjectClass parent; }; GType bt_sequence_get_type(void) G_GNUC_CONST; BtSequence *bt_sequence_new(const BtSong * const song); void bt_sequence_repair_damage(const BtSequence * const self); glong bt_sequence_get_track_by_machine(const BtSequence * const self,const BtMachine * const machine,gulong track); glong bt_sequence_get_tick_by_pattern(const BtSequence * const self,gulong track, const BtPattern * const pattern,gulong tick); BtMachine *bt_sequence_get_machine(const BtSequence * const self,const gulong track); gboolean bt_sequence_add_track(const BtSequence * const self,const BtMachine * const machine, const glong ix); gboolean bt_sequence_remove_track_by_ix(const BtSequence * const self, const gulong ix); gboolean bt_sequence_remove_track_by_machine(const BtSequence * const self,const BtMachine * const machine); gboolean bt_sequence_move_track_left(const BtSequence * const self, const gulong track); gboolean bt_sequence_move_track_right(const BtSequence * const self, const gulong track); gchar *bt_sequence_get_label(const BtSequence * const self, const gulong time); void bt_sequence_set_label(const BtSequence * const self, const gulong time, const gchar * const label); BtPattern *bt_sequence_get_pattern(const BtSequence * const self, const gulong time, const gulong track); gboolean bt_sequence_set_pattern_quick(const BtSequence * const self, const gulong time, const gulong track, const BtPattern * const pattern); void bt_sequence_set_pattern(const BtSequence * const self, const gulong time, const gulong track, const BtPattern * const pattern); GstClockTime bt_sequence_get_bar_time(const BtSequence * const self); GstClockTime bt_sequence_get_loop_time(const BtSequence * const self); gulong bt_sequence_limit_play_pos(const BtSequence * const self, const gulong play_pos); gboolean bt_sequence_is_pattern_used(const BtSequence * const self,const BtPattern * const pattern); void bt_sequence_insert_rows(const BtSequence * const self, const gulong time, const glong track, const gulong rows); void bt_sequence_insert_full_rows(const BtSequence * const self, const gulong time, const gulong rows); void bt_sequence_delete_rows(const BtSequence * const self, const gulong time, const glong track, const gulong rows); void bt_sequence_delete_full_rows(const BtSequence * const self, const gulong time, const gulong rows); void bt_sequence_update_tempo(const BtSequence * const self); #endif // BT_SEQUENCE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song-io-native.h0000644042355400116100000000434511625553627021112 00000000000000/* $Id: song-io-native.h 3607 2011-08-25 23:15:35Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_IO_NATIVE_H #define BT_SONG_IO_NATIVE_H #include #include #include "song-io.h" #define BT_TYPE_SONG_IO_NATIVE (bt_song_io_native_get_type ()) #define BT_SONG_IO_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG_IO_NATIVE, BtSongIONative)) #define BT_SONG_IO_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG_IO_NATIVE, BtSongIONativeClass)) #define BT_IS_SONG_IO_NATIVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG_IO_NATIVE)) #define BT_IS_SONG_IO_NATIVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG_IO_NATIVE)) #define BT_SONG_IO_NATIVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG_IO_NATIVE, BtSongIONativeClass)) /* type macros */ typedef struct _BtSongIONative BtSongIONative; typedef struct _BtSongIONativeClass BtSongIONativeClass; /** * BtSongIONative: * * object for song input and output in native zip/xml format */ struct _BtSongIONative { const BtSongIO parent; }; /** * BtSongIONativeClass: * @parent: parent class type * * Class for song input and output in native zip/xml format */ struct _BtSongIONativeClass { const BtSongIOClass parent; /*< private >*/ }; GType bt_song_io_native_get_type(void) G_GNUC_CONST; extern BtSongIOModuleInfo bt_song_io_native_module_info; #endif // BT_SONG_IO_NATIVE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/core.h0000644042355400116100000000525411643613122017166 00000000000000/* $Id: core.h 3679 2011-10-07 15:10:09Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CORE_H #define BT_CORE_H //-- glib/gobject #include #include #include //-- gstreamer #include #include #include #include #include #include #include #include #include #include // needs 0.10.22 //#include //#include //-- gstbuzztard #include #include #include #include //-- libbtcore #include "childproxy.h" #include "persistence.h" #include "application.h" #include "gconf-settings.h" #include "machine.h" #include "pattern.h" #include "processor-machine.h" #include "sequence.h" #include "settings.h" #include "setup.h" #include "sink-bin.h" #include "sink-machine.h" #include "song-info.h" #include "song-io-native-bzt.h" #include "song-io-native-xml.h" #include "song-io-native.h" #include "song-io.h" #include "song.h" #include "source-machine.h" #include "wave.h" #include "wavelevel.h" #include "wavetable.h" #include "wire-pattern.h" #include "wire.h" #include "tools.h" //-- prototypes ---------------------------------------------------------------- #ifndef BT_CORE_C GOptionGroup *bt_init_get_option_group(void); void bt_init_add_option_groups(GOptionContext * const ctx); gboolean bt_init_check(int *argc, char **argv[], GError **err); void bt_init(int *argc, char **argv[]); void bt_deinit(void); extern const unsigned int bt_major_version; extern const unsigned int bt_minor_version; extern const unsigned int bt_micro_version; #endif #endif // BT_CORE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/gconf-settings.h0000644042355400116100000000433011625546407021175 00000000000000/* $Id: gconf-settings.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_GCONF_SETTINGS_H #define BT_GCONF_SETTINGS_H #include #include #include "settings.h" #define BT_TYPE_GCONF_SETTINGS (bt_gconf_settings_get_type ()) #define BT_GCONF_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_GCONF_SETTINGS, BtGConfSettings)) #define BT_GCONF_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_GCONF_SETTINGS, BtGConfSettingsClass)) #define BT_IS_GCONF_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_GCONF_SETTINGS)) #define BT_IS_GCONF_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_GCONF_SETTINGS)) #define BT_GCONF_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_GCONF_SETTINGS, BtGConfSettingsClass)) /* type macros */ typedef struct _BtGConfSettings BtGConfSettings; typedef struct _BtGConfSettingsClass BtGConfSettingsClass; typedef struct _BtGConfSettingsPrivate BtGConfSettingsPrivate; /** * BtGConfSettings: * * gconf based implementation object for a buzztard based settings */ struct _BtGConfSettings { const BtSettings parent; /*< private >*/ BtGConfSettingsPrivate *priv; }; struct _BtGConfSettingsClass { const BtSettingsClass parent; }; GType bt_gconf_settings_get_type(void) G_GNUC_CONST; BtGConfSettings *bt_gconf_settings_new(void); #endif // BT_GCONF_SETTINGS_H buzztard-0.6.0/src/lib/core/libbuzztard-core/wire.h0000644042355400116100000000606011625546407017213 00000000000000/* $Id: wire.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WIRE_H #define BT_WIRE_H #include #define BT_TYPE_WIRE (bt_wire_get_type ()) #define BT_WIRE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WIRE, BtWire)) #define BT_WIRE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WIRE, BtWireClass)) #define BT_IS_WIRE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WIRE)) #define BT_IS_WIRE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WIRE)) #define BT_WIRE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WIRE, BtWireClass)) /* type macros */ typedef struct _BtWire BtWire; typedef struct _BtWireClass BtWireClass; typedef struct _BtWirePrivate BtWirePrivate; /** * BtWire: * * A link between two #BtMachine instances. */ struct _BtWire { const GstBin parent; /*< private >*/ BtWirePrivate *priv; }; struct _BtWireClass { const GstBinClass parent; }; /** * BT_WIRE_MAX_NUM_PARAMS: * * Maximum number of parameters per wire. */ #define BT_WIRE_MAX_NUM_PARAMS 2 GType bt_wire_get_type(void) G_GNUC_CONST; #include "song.h" #include "wire-pattern.h" BtWire *bt_wire_new(const BtSong *song, const BtMachine *src_machine, const BtMachine *dst_machine, GError **err); gboolean bt_wire_reconnect(BtWire *self); void bt_wire_add_wire_pattern(const BtWire * const self, const BtPattern * const pattern, const BtWirePattern * const wire_pattern); BtWirePattern *bt_wire_get_pattern(const BtWire * const self, const BtPattern * const pattern); glong bt_wire_get_param_index(const BtWire *const self, const gchar * const name, GError **error); GParamSpec *bt_wire_get_param_spec(const BtWire * const self, const gulong index); GType bt_wire_get_param_type(const BtWire * const self, const gulong index); const gchar *bt_wire_get_param_name(const BtWire * const self, const gulong index); void bt_wire_get_param_details(const BtWire * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val); void bt_wire_controller_change_value(const BtWire * const self, const gulong param, const GstClockTime timestamp, GValue * const value); GList *bt_wire_get_element_list(const BtWire *self); void bt_wire_dbg_print_parts(const BtWire *self); #endif // BT_WIRE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/wave.h0000644042355400116100000000527111625546407017212 00000000000000/* $Id: wave.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WAVE_H #define BT_WAVE_H #include #include #define BT_TYPE_WAVE (bt_wave_get_type ()) #define BT_WAVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WAVE, BtWave)) #define BT_WAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WAVE, BtWaveClass)) #define BT_IS_WAVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WAVE)) #define BT_IS_WAVE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WAVE)) #define BT_WAVE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WAVE, BtWaveClass)) /* type macros */ typedef struct _BtWave BtWave; typedef struct _BtWaveClass BtWaveClass; typedef struct _BtWavePrivate BtWavePrivate; /** * BtWave: * * A single waveform. */ struct _BtWave { const GObject parent; /*< private >*/ BtWavePrivate *priv; }; struct _BtWaveClass { const GObjectClass parent; }; #define BT_TYPE_WAVE_LOOP_MODE (bt_wave_loop_mode_get_type()) /** * BtWaveLoopMode: * @BT_WAVE_LOOP_MODE_OFF: no loop * @BT_WAVE_LOOP_MODE_FORWARD: forward looping * @BT_WAVE_LOOP_MODE_PINGPONG: forward/backward looping * * #BtWave clips can be played using several loop modes. */ typedef enum { BT_WAVE_LOOP_MODE_OFF=0, BT_WAVE_LOOP_MODE_FORWARD, BT_WAVE_LOOP_MODE_PINGPONG } BtWaveLoopMode; GType bt_wave_loop_mode_get_type(void) G_GNUC_CONST; GType bt_wave_get_type(void) G_GNUC_CONST; #include "song.h" #include "wavelevel.h" BtWave *bt_wave_new(const BtSong * const song, const gchar * const name, const gchar * const uri, const gulong index, const gdouble volume, const BtWaveLoopMode loop_mode, const guint channels); gboolean bt_wave_add_wavelevel(const BtWave * const self, const BtWavelevel * const wavelevel); BtWavelevel *bt_wave_get_level_by_index(const BtWave * const self,const gulong index); #endif // BT_WAVE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/settings.h0000644042355400116100000000445611672045412020104 00000000000000/* $Id: settings.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_H #define BT_SETTINGS_H #include #include #define BT_TYPE_SETTINGS (bt_settings_get_type ()) #define BT_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS, BtSettings)) #define BT_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS, BtSettingsClass)) #define BT_IS_SETTINGS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS)) #define BT_IS_SETTINGS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS)) #define BT_SETTINGS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS, BtSettingsClass)) /** * BtSettingsFactory: * * Factory method that creates a new settings instance. * * Returns: the setting implementation */ typedef gpointer (*BtSettingsFactory)(void); /* type macros */ typedef struct _BtSettings BtSettings; typedef struct _BtSettingsClass BtSettingsClass; /** * BtSettings: * * base object for a buzztard based settings */ struct _BtSettings { const GObject parent; }; struct _BtSettingsClass { const GObjectClass parent; /* class methods */ //gboolean (*get)(const gpointer self); //gboolean (*set)(const gpointer self); }; GType bt_settings_get_type(void) G_GNUC_CONST; BtSettings *bt_settings_make(void); void bt_settings_set_factory(BtSettingsFactory factory); gchar *bt_settings_determine_audiosink_name(const BtSettings * const self); #endif // BT_SETTINGS_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song-io-native-bzt.h0000644042355400116100000000521611625546407021703 00000000000000/* $Id: song-io-native-bzt.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_IO_NATIVE_BZT_H #define BT_SONG_IO_NATIVE_BZT_H #include #include #include "song-io-native.h" #define BT_TYPE_SONG_IO_NATIVE_BZT (bt_song_io_native_bzt_get_type ()) #define BT_SONG_IO_NATIVE_BZT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG_IO_NATIVE_BZT, BtSongIONativeBZT)) #define BT_SONG_IO_NATIVE_BZT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG_IO_NATIVE_BZT, BtSongIONativeBZTClass)) #define BT_IS_SONG_IO_NATIVE_BZT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG_IO_NATIVE_BZT)) #define BT_IS_SONG_IO_NATIVE_BZT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG_IO_NATIVE_BZT)) #define BT_SONG_IO_NATIVE_BZT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG_IO_NATIVE_BZT, BtSongIONativeBZTClass)) /* type macros */ typedef struct _BtSongIONativeBZT BtSongIONativeBZT; typedef struct _BtSongIONativeBZTClass BtSongIONativeBZTClass; typedef struct _BtSongIONativeBZTPrivate BtSongIONativeBZTPrivate; /** * BtSongIONativeBZT: * * object for song input and output in native zip/xml format */ struct _BtSongIONativeBZT { const BtSongIONative parent; /*< private >*/ BtSongIONativeBZTPrivate *priv; }; /** * BtSongIONativeBZTClass: * @parent: parent class type * * Class for song input and output in native zip/xml format */ struct _BtSongIONativeBZTClass { const BtSongIONativeClass parent; /*< private >*/ }; GType bt_song_io_native_bzt_get_type(void) G_GNUC_CONST; gboolean bt_song_io_native_bzt_copy_to_fd(const BtSongIONativeBZT * const self, const gchar *file_name, gint fd); gboolean bt_song_io_native_bzt_copy_from_uri(const BtSongIONativeBZT * const self, const gchar *file_name, const gchar *uri); #endif // BT_SONG_IO_NATIVE_BZT_H buzztard-0.6.0/src/lib/core/libbuzztard-core/sink-bin.h0000644042355400116100000000700411576360370017754 00000000000000/* $Id: sink-bin.h 3320 2011-04-14 14:35:04Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SINK_BIN_H #define BT_SINK_BIN_H #include #include #define BT_TYPE_SINK_BIN (bt_sink_bin_get_type ()) #define BT_SINK_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SINK_BIN, BtSinkBin)) #define BT_SINK_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SINK_BIN, BtSinkBinClass)) #define BT_IS_SINK_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SINK_BIN)) #define BT_IS_SINK_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SINK_BIN)) #define BT_SINK_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SINK_BIN, BtSinkBinClass)) /* type macros */ typedef struct _BtSinkBin BtSinkBin; typedef struct _BtSinkBinClass BtSinkBinClass; typedef struct _BtSinkBinPrivate BtSinkBinPrivate; /** * BtSinkBin: * * Sub-class of a #GstBin that implements a signal output * (a machine with inputs only). */ struct _BtSinkBin { const GstBin parent; /*< private >*/ BtSinkBinPrivate *priv; }; /* structure of the sink_bin class */ struct _BtSinkBinClass { const GstBinClass parent; }; #define BT_TYPE_SINK_BIN_MODE (bt_sink_bin_mode_get_type()) /** * BtSinkBinMode: * @BT_SINK_BIN_MODE_PLAY: play the song * @BT_SINK_BIN_MODE_RECORD: record to file * @BT_SINK_BIN_MODE_PLAY_AND_RECORD: play and record together * @BT_SINK_BIN_MODE_PASS_THRU: output audio on sometimes src pad * * #BtSinkMachine supports several modes of operation. Playing is the default * mode. Passthru is only needed if the song is plugged in another pipeline. */ typedef enum { BT_SINK_BIN_MODE_PLAY=0, BT_SINK_BIN_MODE_RECORD, BT_SINK_BIN_MODE_PLAY_AND_RECORD, BT_SINK_BIN_MODE_PASS_THRU } BtSinkBinMode; #define BT_TYPE_SINK_BIN_RECORD_FORMAT (bt_sink_bin_record_format_get_type()) /** * BtSinkBinRecordFormat: * @BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS: ogg vorbis * @BT_SINK_BIN_RECORD_FORMAT_MP3: mp3 * @BT_SINK_BIN_RECORD_FORMAT_WAV: wav * @BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC: ogg flac * @BT_SINK_BIN_RECORD_FORMAT_MP4_AAC: mp4 aac * @BT_SINK_BIN_RECORD_FORMAT_RAW: raw * * #BtSinkMachine can record audio in several formats. */ typedef enum { BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS=0, BT_SINK_BIN_RECORD_FORMAT_MP3, BT_SINK_BIN_RECORD_FORMAT_WAV, BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC, BT_SINK_BIN_RECORD_FORMAT_MP4_AAC, BT_SINK_BIN_RECORD_FORMAT_RAW } BtSinkBinRecordFormat; /* used by SINK_BIN_TYPE */ GType bt_sink_bin_get_type(void) G_GNUC_CONST; /* used by SINK_BIN_MODE_TYPE */ GType bt_sink_bin_mode_get_type(void) G_GNUC_CONST; /* used by SINK_BIN_RECORD_FORMAT_TYPE */ GType bt_sink_bin_record_format_get_type(void) G_GNUC_CONST; #endif // BT_SINK_BIN_H buzztard-0.6.0/src/lib/core/libbuzztard-core/Makefile.am0000644042355400116100000000133711625546407020132 00000000000000## $Id: Makefile.am 3604 2011-08-25 22:30:29Z ensonic $ libbtcoredir = $(includedir)/libbuzztard-core libbtcore_HEADERS = \ core.h \ tools.h \ version.h \ \ application.h \ childproxy.h \ gconf-settings.h\ machine.h \ pattern.h \ persistence.h \ plainfile-settings.h \ processor-machine.h \ sequence.h \ settings.h \ setup.h \ sink-bin.h \ sink-machine.h \ song.h \ song-info.h \ song-io.h \ song-io-native.h \ song-io-native-bzt.h \ song-io-native-xml.h \ source-machine.h \ wavetable.h \ wave.h \ wavelevel.h \ wire.h \ wire-pattern.h # yet unused sources # plainfile-settings.h \ # noinst_HEADERS = settings-private.h # DISTCLEANFILES is for files generated by configure DISTCLEANFILES = version.h buzztard-0.6.0/src/lib/core/libbuzztard-core/wavetable.h0000644042355400116100000000467011625546407020224 00000000000000/* $Id: wavetable.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WAVETABLE_H #define BT_WAVETABLE_H #include #include #define BT_TYPE_WAVETABLE (bt_wavetable_get_type ()) #define BT_WAVETABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WAVETABLE, BtWavetable)) #define BT_WAVETABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WAVETABLE, BtWavetableClass)) #define BT_IS_WAVETABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WAVETABLE)) #define BT_IS_WAVETABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WAVETABLE)) #define BT_WAVETABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WAVETABLE, BtWavetableClass)) /* type macros */ typedef struct _BtWavetable BtWavetable; typedef struct _BtWavetableClass BtWavetableClass; typedef struct _BtWavetablePrivate BtWavetablePrivate; /** * BtWavetable: * * A table of #BtWave objects. */ struct _BtWavetable { const GObject parent; /*< private >*/ BtWavetablePrivate *priv; }; struct _BtWavetableClass { const GObjectClass parent; }; GType bt_wavetable_get_type(void) G_GNUC_CONST; #include "song.h" #include "wave.h" BtWavetable *bt_wavetable_new(const BtSong * const song); gboolean bt_wavetable_add_wave(const BtWavetable * const self, const BtWave * const wave); gboolean bt_wavetable_remove_wave(const BtWavetable * const self, const BtWave * const wave); BtWave *bt_wavetable_get_wave_by_index(const BtWavetable * const self, const gulong index); void bt_wavetable_remember_missing_wave(const BtWavetable * const self, const gchar * const str); #endif // BT_WAVETABLE_H buzztard-0.6.0/src/lib/core/libbuzztard-core/song-io.h0000644042355400116100000001057011625546407017621 00000000000000/* $Id: song-io.h 3604 2011-08-25 22:30:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SONG_IO_H #define BT_SONG_IO_H #include #include #include "song.h" #define BT_TYPE_SONG_IO (bt_song_io_get_type ()) #define BT_SONG_IO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SONG_IO, BtSongIO)) #define BT_SONG_IO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SONG_IO, BtSongIOClass)) #define BT_IS_SONG_IO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SONG_IO)) #define BT_IS_SONG_IO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SONG_IO)) #define BT_SONG_IO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SONG_IO, BtSongIOClass)) /* type macros */ typedef struct _BtSongIO BtSongIO; typedef struct _BtSongIOClass BtSongIOClass; typedef struct _BtSongIOPrivate BtSongIOPrivate; /** * BtSongIO: * * base object for song input and output plugins */ struct _BtSongIO { const GObject parent; /*< private >*/ BtSongIOPrivate *priv; }; /** * bt_song_io_virtual_load: * @self: song-io instance * @song: song object to load * * Subclasses will override this methods with the loader function. * * Returns: %TRUE for success */ typedef gboolean (*bt_song_io_virtual_load)(gconstpointer self, const BtSong * const song); /** * bt_song_io_virtual_save: * @self: song-io instance * @song: song object to save * * Subclasses will override this methods with the saver function. * * Returns: %TRUE for success */ typedef gboolean (*bt_song_io_virtual_save)(gconstpointer const self, const BtSong * const song); /** * BtSongIOClass: * @parent: parent class type * @load: virtual method for loading a song * @save: virtual method for saving a song * * Base class for song input and output plugins */ struct _BtSongIOClass { const GObjectClass parent; /* class methods */ bt_song_io_virtual_load load; bt_song_io_virtual_save save; }; /** * BtSongIOInit: * * Function to init the plugin. * * Returns: %TRUE if the plugin was initialized fine */ typedef gboolean (*BtSongIOInit)(void); /* @todo: additional fields: * - wheter it support load/save? (we have vmethods * - some flags? * * Ugly: * - still duplicated info with usr/share/mime database * - files are detected twice (e.g. nautilus, buzztard) * - pass the media-type as a comamndline option and map it right away */ /** * BtSongIOFormatInfo: * @type: the io module #GType * @name: format name * @mime_type: mime type * @extension: file extension * * Metadata structure for #BtSongIO plugins describing one format. */ typedef struct { GType type; const gchar *name; const gchar *mime_type; const gchar *extension; } BtSongIOFormatInfo; /** * BT_SONG_IO_MODULE_INFO_MAX_FORMATS: * * Maximum number of #BtSongIOFormatInfo per plugin (10). */ #define BT_SONG_IO_MODULE_INFO_MAX_FORMATS 10 /** * BtSongIOModuleInfo: * @init: pointer to init function, can be %NULL. * @formats: %NULL terminated array of formats supported by this plugin * * Metadata structure for #BtSongIO plugins. */ typedef struct { BtSongIOInit init; BtSongIOFormatInfo formats[BT_SONG_IO_MODULE_INFO_MAX_FORMATS]; } BtSongIOModuleInfo; GType bt_song_io_get_type(void) G_GNUC_CONST; BtSongIO *bt_song_io_from_file(const gchar * const file_name); BtSongIO *bt_song_io_from_data(gpointer *data, guint len, const gchar *media_type); const GList *bt_song_io_get_module_info_list(void); gboolean bt_song_io_load(BtSongIO const *self, const BtSong * const song); gboolean bt_song_io_save(BtSongIO const *self, const BtSong * const song); #endif // BT_SONG_IO_H buzztard-0.6.0/src/lib/core/libbuzztard-core/persistence.h0000644042355400116100000000674111626121152020562 00000000000000/* $Id: persistence.h 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PERSISTENCE_H #define BT_PERSISTENCE_H #include #include #include #include #include #define BT_TYPE_PERSISTENCE (bt_persistence_get_type()) #define BT_PERSISTENCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PERSISTENCE, BtPersistence)) #define BT_IS_PERSISTENCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PERSISTENCE)) #define BT_PERSISTENCE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), BT_TYPE_PERSISTENCE, BtPersistenceInterface)) /* type macros */ typedef struct _BtPersistence BtPersistence; /* dummy object */ typedef struct _BtPersistenceInterface BtPersistenceInterface; /** * BtPersistenceInterface: * @save: virtual method to serialize an object to an xml node * @load: virtual method to deserialze an object from an xml node * * #BtPersistence interface */ struct _BtPersistenceInterface { /*< private >*/ const GTypeInterface parent; /*< public >*/ /* virtual methods */ xmlNodePtr (*save)(const BtPersistence * const self, xmlNodePtr const node); BtPersistence* (*load)(const GType type, const BtPersistence * const self, xmlNodePtr node, GError **err, va_list var_args); }; GType bt_persistence_get_type(void) G_GNUC_CONST; // string formatting helper extern const gchar *bt_persistence_strfmt_uchar(const guchar val); extern const gchar *bt_persistence_strfmt_long(const glong val); extern const gchar *bt_persistence_strfmt_ulong(const gulong val); extern const gchar *bt_persistence_strfmt_double(const gdouble val); extern const gchar *bt_persistence_strfmt_enum(GType enum_type,gint value); // string parsing helper extern gint bt_persistence_parse_enum(GType enum_type,const gchar *str); // list helper extern gboolean bt_persistence_save_list(const GList *list, xmlNodePtr const node); // hashtable helper extern void bt_persistence_collect_hashtable_entries(gpointer const key, gpointer const value, gpointer const user_data); extern gboolean bt_persistence_save_hashtable(GHashTable *hashtable, xmlNodePtr const node); extern gboolean bt_persistence_load_hashtable(GHashTable *hashtable, xmlNodePtr node); // gvalue helper extern gboolean bt_persistence_set_value(GValue* const gvalue, const gchar * const svalue); extern gchar *bt_persistence_get_value(GValue * const gvalue); // wrapper extern xmlNodePtr bt_persistence_save(const BtPersistence * const self, xmlNodePtr const parent_node); extern BtPersistence *bt_persistence_load(const GType type, const BtPersistence * const self, xmlNodePtr node, GError **err, ...); #endif // BT_PERSISTENCE_H buzztard-0.6.0/src/lib/core/wavelevel.c0000644042355400116100000003507711576360371014761 00000000000000/* $Id: wavelevel.c 2974 2010-09-07 20:43:24Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwavelevel * @short_description: a single part of a #BtWave item * * #BtWavelevel contain the digital audio data of a #BtWave to be used for a * certain key-range. */ #define BT_CORE #define BT_WAVELEVEL_C #include "core_private.h" //-- property ids enum { WAVELEVEL_SONG=1, WAVELEVEL_WAVE, WAVELEVEL_ROOT_NOTE, WAVELEVEL_LENGTH, WAVELEVEL_LOOP_START, WAVELEVEL_LOOP_END, WAVELEVEL_RATE, WAVELEVEL_DATA }; struct _BtWavelevelPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the wavelevel belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the wave the wavelevel belongs to */ G_POINTER_ALIAS(BtWave *,wave); /* the keyboard note associated to this sample */ guchar root_note; /* the number of samples */ gulong length; /* the loop markers, -1 means no loop */ glong loop_start,loop_end; /* the sampling rate */ gulong rate; // data format gconstpointer *sample; // sample data }; //-- the class static void bt_wavelevel_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtWavelevel, bt_wavelevel, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_wavelevel_persistence_interface_init)); //-- constructor methods /** * bt_wavelevel_new: * @song: the song the new instance belongs to * @wave: the wave the new wavelevel belongs to * @root_note: the keyboard note this sample is related * @length: the number of samples * @loop_start: the start of the loop * @loop_end: the end of the loop * @rate: the sampling rate * @sample: the sample data * * Create a new instance * * Returns: the new instance or NULL in case of an error */ BtWavelevel *bt_wavelevel_new(const BtSong * const song, const BtWave * const wave, const guchar root_note, const gulong length, const glong loop_start, const glong loop_end, const gulong rate, gconstpointer sample) { return(BT_WAVELEVEL(g_object_new(BT_TYPE_WAVELEVEL,"song",song,"wave",wave, "root-note",root_note,"length",length,"loop_start",loop_start, "loop_end",loop_end,"rate",rate,"data",sample,NULL))); } //-- private methods //-- public methods //-- io interface static xmlNodePtr bt_wavelevel_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtWavelevel * const self = BT_WAVELEVEL(persistence); xmlNodePtr node=NULL; GST_DEBUG("PERSISTENCE::wavelevel"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("wavelevel"),NULL))) { // only serialize customizable properties xmlNewProp(node,XML_CHAR_PTR("root-note"),XML_CHAR_PTR(bt_persistence_strfmt_uchar(self->priv->root_note))); xmlNewProp(node,XML_CHAR_PTR("rate"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->rate))); xmlNewProp(node,XML_CHAR_PTR("loop-start"),XML_CHAR_PTR(bt_persistence_strfmt_long(self->priv->loop_start))); xmlNewProp(node,XML_CHAR_PTR("loop-end"),XML_CHAR_PTR(bt_persistence_strfmt_long(self->priv->loop_end))); } return(node); } static BtPersistence *bt_wavelevel_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtWavelevel * const self = BT_WAVELEVEL(persistence); xmlChar *root_note_str,*rate_str,*loop_start_str,*loop_end_str; glong loop_start,loop_end; gulong rate; guchar root_note; GST_DEBUG("PERSISTENCE::wavelevel"); g_assert(node); // only deserialize customizable properties root_note_str=xmlGetProp(node,XML_CHAR_PTR("root-note")); rate_str=xmlGetProp(node,XML_CHAR_PTR("rate")); loop_start_str=xmlGetProp(node,XML_CHAR_PTR("loop-start")); loop_end_str=xmlGetProp(node,XML_CHAR_PTR("loop-end")); root_note=root_note_str?atol((char *)root_note_str):0; rate=rate_str?atol((char *)rate_str):0; loop_start=loop_start_str?atol((char *)loop_start_str):-1; loop_end=loop_end_str?atol((char *)loop_end_str):-1; g_object_set(self,"root-note",root_note,"rate",rate, "loop-start",loop_start,"loop-end",loop_end, NULL); xmlFree(root_note_str);xmlFree(rate_str); xmlFree(loop_start_str);xmlFree(loop_end_str); return(BT_PERSISTENCE(persistence)); } static void bt_wavelevel_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_wavelevel_persistence_load; iface->save = bt_wavelevel_persistence_save; } //-- wrapper //-- g_object overrides static void bt_wavelevel_constructed(GObject *object) { BtWavelevel *self=BT_WAVELEVEL(object); if(G_OBJECT_CLASS(bt_wavelevel_parent_class)->constructed) G_OBJECT_CLASS(bt_wavelevel_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); g_return_if_fail(BT_IS_WAVE(self->priv->wave)); // add the wavelevel to the wave bt_wave_add_wavelevel(self->priv->wave,self); } /* returns a property for the given property_id for this object */ static void bt_wavelevel_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtWavelevel * const self = BT_WAVELEVEL(object); return_if_disposed(); switch (property_id) { case WAVELEVEL_SONG: { g_value_set_object(value, self->priv->song); } break; case WAVELEVEL_WAVE: { g_value_set_object(value, self->priv->wave); } break; case WAVELEVEL_ROOT_NOTE: { g_value_set_uchar(value, self->priv->root_note); } break; case WAVELEVEL_LENGTH: { g_value_set_ulong(value, self->priv->length); } break; case WAVELEVEL_LOOP_START: { g_value_set_long(value, self->priv->loop_start); } break; case WAVELEVEL_LOOP_END: { g_value_set_long(value, self->priv->loop_end); } break; case WAVELEVEL_RATE: { g_value_set_ulong(value, self->priv->rate); } break; case WAVELEVEL_DATA: { g_value_set_pointer(value, self->priv->sample); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_wavelevel_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtWavelevel * const self = BT_WAVELEVEL(object); return_if_disposed(); switch (property_id) { case WAVELEVEL_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for wavelevel: %p",self->priv->song); } break; case WAVELEVEL_WAVE: { self->priv->wave = BT_WAVE(g_value_get_object(value)); g_object_try_weak_ref(self->priv->wave); GST_DEBUG("set the wave for wavelevel: %p",self->priv->wave); } break; case WAVELEVEL_ROOT_NOTE: { self->priv->root_note = g_value_get_uchar(value); GST_DEBUG("set the root-note for wavelevel: %d",self->priv->root_note); } break; case WAVELEVEL_LENGTH: { self->priv->length = g_value_get_ulong(value); GST_DEBUG("set the length for wavelevel: %lu",self->priv->length); } break; case WAVELEVEL_LOOP_START: { self->priv->loop_start = g_value_get_long(value); if(self->priv->loop_start!=-1) { // make sure its less then loop_end/length if(self->priv->loop_end>0) { if(self->priv->loop_start>=self->priv->loop_end) self->priv->loop_start=self->priv->loop_end-1; } else if(self->priv->length>0) { if(self->priv->loop_start>=self->priv->length) self->priv->loop_start=self->priv->length-1; } else self->priv->loop_start=-1; } GST_DEBUG("set the loop-start for wavelevel: %ld",self->priv->loop_start); } break; case WAVELEVEL_LOOP_END: { self->priv->loop_end = g_value_get_long(value); if(self->priv->loop_end!=-1) { // make sure its more then loop-start if(self->priv->loop_start>-1) { if(self->priv->loop_endpriv->loop_start) self->priv->loop_end=self->priv->loop_start+1; } // make sure its less then or equal to length if(self->priv->length>0) { if(self->priv->loop_end>self->priv->length) self->priv->loop_end=self->priv->length; } else self->priv->loop_end=-1; } GST_DEBUG("set the loop-start for wavelevel: %ld",self->priv->loop_start); } break; case WAVELEVEL_RATE: { self->priv->rate = g_value_get_ulong(value); GST_DEBUG("set the rate for wavelevel: %lu",self->priv->rate); } break; case WAVELEVEL_DATA: { g_free(self->priv->sample); self->priv->sample = g_value_get_pointer(value); GST_DEBUG("set the data-pointer for wavelevel: %p",self->priv->sample); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wavelevel_dispose(GObject * const object) { const BtWavelevel * const self = BT_WAVELEVEL(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); g_object_try_weak_unref(self->priv->wave); G_OBJECT_CLASS(bt_wavelevel_parent_class)->dispose(object); } static void bt_wavelevel_finalize(GObject * const object) { const BtWavelevel * const self = BT_WAVELEVEL(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->sample); G_OBJECT_CLASS(bt_wavelevel_parent_class)->finalize(object); } static void bt_wavelevel_init(BtWavelevel *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WAVELEVEL, BtWavelevelPrivate); self->priv->root_note = BT_WAVELEVEL_DEFAULT_ROOT_NOTE; } //-- class internals static void bt_wavelevel_class_init(BtWavelevelClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtWavelevelPrivate)); gobject_class->constructed = bt_wavelevel_constructed; gobject_class->set_property = bt_wavelevel_set_property; gobject_class->get_property = bt_wavelevel_get_property; gobject_class->dispose = bt_wavelevel_dispose; gobject_class->finalize = bt_wavelevel_finalize; g_object_class_install_property(gobject_class,WAVELEVEL_SONG, g_param_spec_object("song", "song contruct prop", "Set song object, the wavelevel belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_WAVE, g_param_spec_object("wave", "wave contruct prop", "Set wave object, the wavelevel belongs to", BT_TYPE_WAVE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // @idea make this an own type g_object_class_install_property(gobject_class,WAVELEVEL_ROOT_NOTE, g_param_spec_uchar("root-note", "root-note prop", "the base note associated with the sample", 0, G_MAXUINT8, 0, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_LENGTH, g_param_spec_ulong("length", "length prop", "length of the sample", 0, G_MAXLONG, // loop-pos are LONG as well 0, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_LOOP_START, g_param_spec_long("loop-start", "loop-start prop", "start of the sample loop", -1, G_MAXLONG, -1, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_LOOP_END, g_param_spec_long("loop-end", "loop-end prop", "end of the sample loop", -1, G_MAXLONG, -1, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_RATE, g_param_spec_ulong("rate", "rate prop", "sampling rate of the sample", 0, G_MAXULONG, 0, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVELEVEL_DATA, g_param_spec_pointer("data", "data prop", "the sample data", G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/sink-bin.c0000644042355400116100000012205111660376543014470 00000000000000/* $Id: sink-bin.c 3706 2011-11-15 05:49:20Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsinkbin * @short_description: bin to be used by #BtSinkMachine * * The sink-bin provides switchable play and record facillities. * It also provides controlable master-volume. * * In play and record modes it plugs a chain of elements. In combined play and * record mode it uses a tee and plugs both pipleines. */ /* @todo: detect supported encoders * get gst mimetype from the extension * and then look at all encoders which supply that mimetype * check elements in "codec/encoder/audio", "codec/muxer/audio" * build caps using this mimetype * gst_element_factory_can_src_caps() * problem here is that we need extra option for each encoder (e.g. quality) * * @todo: add properties for bpm and master volume, * - bpm * - tempo-iface is implemented, but is hidden from the ui * (the iface properties are not controlable) * - we could have separate properties and forward the changes * * @todo: for upnp it would be nice to stream on-demand * * @todo: add parameters for sampling rate and channels * - channels can be used in the capsfilter * - sampling rate could be used there too * - both should be sink-bin properties, so that we can configure them * externaly * * @todo: add a metronome * - add a (controlable) gboolean "metronome-beat", "metronome-tick" properties * - add controller pattern to make them emit notifies * - need to update on length changes and bpm/tpb changes * - use a pad-probe like master_volume_sync_handler (consider reusing) to sync them * - the gtk-ui can have two on-screen leds * - sink-bin could use the keyboard leds to indicate them (with #ifdef LINUX) */ #define BT_CORE #define BT_SINK_BIN_C #include "core_private.h" #include /* define this to get diagnostics of the sink data flow */ //#define BT_MONITOR_SINK_DATA_FLOW /* define this to verify continuos timestamps */ //#define BT_MONITOR_TIMESTAMPS /* this requires gstreamer-0.10.16 */ #ifndef GST_TIME_AS_USECONDS #define GST_TIME_AS_USECONDS(time) ((time) / G_GINT64_CONSTANT (1000)) #endif //-- property ids enum { SINK_BIN_MODE=1, SINK_BIN_RECORD_FORMAT, SINK_BIN_RECORD_FILE_NAME, SINK_BIN_INPUT_GAIN, SINK_BIN_MASTER_VOLUME, SINK_BIN_ANALYZERS, // tempo iface SINK_BIN_TEMPO_BPM, SINK_BIN_TEMPO_TPB, SINK_BIN_TEMPO_STPT, }; struct _BtSinkBinPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* change configuration at next convinient point? */ gboolean pending_update; /* mode of operation */ BtSinkBinMode mode; BtSinkBinRecordFormat record_format; guint sample_rate, channels; gchar *record_file_name; /* ghost-pads of the bin */ GstPad *sink,*src; /* we need to hold the reference to not kill the notifies */ BtSettings *settings; gulong bus_handler_id; /* tee */ G_POINTER_ALIAS(GstElement *,tee); /* master volume */ G_POINTER_ALIAS(GstElement *,gain); gulong mv_handler_id; gdouble volume; /* sink format */ G_POINTER_ALIAS(GstElement *,caps_filter); /* tempo handling */ gulong beats_per_minute; gulong ticks_per_beat; gulong subticks_per_tick; /* master analyzers */ GList *analyzers; }; //-- the class static void bt_sink_bin_configure_latency(const BtSinkBin * const self,GstElement *sink); static void bt_sink_bin_tempo_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSinkBin, bt_sink_bin, GST_TYPE_BIN, G_IMPLEMENT_INTERFACE (GSTBT_TYPE_TEMPO, bt_sink_bin_tempo_interface_init)); //-- tempo interface implementations static void bt_sink_bin_tempo_change_tempo(GstBtTempo *tempo, glong beats_per_minute, glong ticks_per_beat, glong subticks_per_tick) { BtSinkBin *self=BT_SINK_BIN(tempo); gboolean changed=FALSE; if(beats_per_minute>=0) { if(self->priv->beats_per_minute!=beats_per_minute) { self->priv->beats_per_minute=(gulong)beats_per_minute; g_object_notify(G_OBJECT(self),"beats-per-minute"); changed=TRUE; } } if(ticks_per_beat>=0) { if(self->priv->ticks_per_beat!=ticks_per_beat) { self->priv->ticks_per_beat=(gulong)ticks_per_beat; g_object_notify(G_OBJECT(self),"ticks-per-beat"); changed=TRUE; } } if(subticks_per_tick>=0) { if(self->priv->subticks_per_tick!=subticks_per_tick) { self->priv->subticks_per_tick=(gulong)subticks_per_tick; g_object_notify(G_OBJECT(self),"subticks-per-tick"); changed=TRUE; } } if(changed) { GstElement *element = gst_bin_get_by_name(GST_BIN(self),"player"); GST_DEBUG("changing tempo to %lu BPM %lu TPB %lu STPT",self->priv->beats_per_minute,self->priv->ticks_per_beat,self->priv->subticks_per_tick); if(element) { bt_sink_bin_configure_latency(self,element); gst_object_unref(element); } else { GST_INFO("no player object created yet."); } } } static void bt_sink_bin_tempo_interface_init(gpointer g_iface, gpointer iface_data) { GstBtTempoInterface *iface = g_iface; iface->change_tempo = bt_sink_bin_tempo_change_tempo; } //-- enums GType bt_sink_bin_mode_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_SINK_BIN_MODE_PLAY, "BT_SINK_BIN_MODE_PLAY", "play" }, { BT_SINK_BIN_MODE_RECORD, "BT_SINK_BIN_MODE_RECORD", "record" }, { BT_SINK_BIN_MODE_PLAY_AND_RECORD, "BT_SINK_BIN_MODE_PLAY_AND_RECORD", "play-and-record" }, { BT_SINK_BIN_MODE_PASS_THRU, "BT_SINK_BIN_MODE_PASS_THRU", "pass-thru" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtSinkBinMode", values); } return type; } GType bt_sink_bin_record_format_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS, ".ogg", "ogg-vorbis" }, { BT_SINK_BIN_RECORD_FORMAT_MP3, ".mp3", "mp3" }, { BT_SINK_BIN_RECORD_FORMAT_WAV, ".wav", "wav" }, { BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC, ".flac", "ogg-flac" }, { BT_SINK_BIN_RECORD_FORMAT_RAW, ".raw", "raw" }, { BT_SINK_BIN_RECORD_FORMAT_MP4_AAC, ".m4a", "mp4-aac" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtSinkBinRecordFormat", values); } return type; } //-- helper methods /* * bt_sink_bin_activate_analyzers: * @self: the sink-bin * * Add all analyzers to the bin and link them. */ static void bt_sink_bin_activate_analyzers(const BtSinkBin * const self) { GstState state; gboolean is_playing=TRUE; if(!self->priv->analyzers) return; //g_object_get(self->priv->song,"is-playing",&is_playing,NULL); if((gst_element_get_state(GST_ELEMENT(self),&state,NULL,GST_MSECOND)==GST_STATE_CHANGE_SUCCESS)) { if(statepriv->tee,self->priv->analyzers,is_playing); } /* * bt_sink_bin_deactivate_analyzers: * @self: the sink-bin * * Remove all analyzers to the bin and unlink them. */ static void bt_sink_bin_deactivate_analyzers(const BtSinkBin * const self) { GstState state; gboolean is_playing=TRUE; if(!self->priv->analyzers) return; //g_object_get(self->priv->song,"is-playing",&is_playing,NULL); if((gst_element_get_state(GST_ELEMENT(self),&state,NULL,GST_MSECOND)==GST_STATE_CHANGE_SUCCESS)) { if(statepriv->tee,self->priv->analyzers,is_playing); } static void bt_sink_bin_configure_latency(const BtSinkBin * const self,GstElement *sink) { if(GST_IS_BASE_AUDIO_SINK(sink)) { if(self->priv->beats_per_minute && self->priv->ticks_per_beat) { // configure buffer size (e.g. GST_SECONG*60/120*4 gint64 chunk=GST_TIME_AS_USECONDS((GST_SECOND*60)/(self->priv->beats_per_minute*self->priv->ticks_per_beat)); // FIXME: having a smaller chunk size helps with latency: // - live playback // - changing properties // maybe we can make this an option (for fast machines) chunk>>=6; GST_INFO("changing audio chunk-size for sink to %"G_GUINT64_FORMAT" µs = %"G_GUINT64_FORMAT" ms", chunk, (chunk/G_GINT64_CONSTANT(1000))); g_object_set(sink, "latency-time",chunk, "buffer-time",chunk<<1, NULL); } } } static void bt_sink_bin_clear(const BtSinkBin * const self) { GstBin * const bin=GST_BIN(self); GstElement *elem; GST_DEBUG_OBJECT(self,"clearing sink-bin : %d",GST_BIN_NUMCHILDREN(bin)); if(bin->children) { GstStateChangeReturn res; self->priv->caps_filter=NULL; self->priv->tee=NULL; // does not seem to be needed //gst_ghost_pad_set_target(GST_GHOST_PAD(self->priv->sink),NULL); //GST_DEBUG("released ghost-pad"); while(bin->children) { elem=GST_ELEMENT_CAST (bin->children->data); GST_DEBUG_OBJECT(elem," removing elem=%p (ref_ct=%d),'%s'", elem,(G_OBJECT_REF_COUNT(elem)),GST_OBJECT_NAME(elem)); gst_element_set_locked_state(elem,FALSE); if((res=gst_element_set_state(elem,GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) GST_WARNING("can't go to null state"); else GST_DEBUG("->NULL state change returned '%s'",gst_element_state_change_return_get_name(res)); gst_bin_remove (bin, elem); } if(self->priv->src) { gst_pad_set_active(self->priv->src,FALSE); gst_element_remove_pad(GST_ELEMENT(self),self->priv->src); self->priv->src=NULL; } } GST_DEBUG("done"); } static gboolean bt_sink_bin_add_many(const BtSinkBin * const self, GList * const list) { const GList *node; GST_DEBUG("add elements: list=%p",list); for(node=list;node;node=node->next) { gst_bin_add(GST_BIN(self),GST_ELEMENT(node->data)); } return(TRUE); } static void bt_sink_bin_link_many(const BtSinkBin * const self, GstElement *last_elem, GList * const list) { const GList *node; GST_DEBUG("link elements: last_elem=%s, list=%p",GST_OBJECT_NAME(last_elem),list); if(!list) return; for(node=list;node;node=node->next) { GstElement * const cur_elem=GST_ELEMENT(node->data); if(!gst_element_link(last_elem,cur_elem)) { GST_WARNING("can't link elements: last_elem=%s, cur_elem=%s", GST_OBJECT_NAME(last_elem),GST_OBJECT_NAME(cur_elem)); } last_elem=cur_elem; } } #define BT_SINK_BIN_MISSING_ELEMENT(elem_name) bt_sink_bin_missing_element(self,elem_name,__FILE__,GST_FUNCTION,__LINE__) static void bt_sink_bin_missing_element(const BtSinkBin * const self, const gchar *elem_name, const gchar *file, const gchar *func, const gint line) { gchar *msg=g_strdup_printf("Can't instantiate %s element", elem_name); gst_element_message_full(GST_ELEMENT(self),GST_MESSAGE_ERROR, GST_CORE_ERROR,GST_CORE_ERROR_MISSING_PLUGIN, msg,g_strdup (msg),file,func,line); } static GList *bt_sink_bin_get_player_elements(const BtSinkBin * const self) { GList *list=NULL; gchar *plugin_name; GST_DEBUG("get playback elements"); if(!(plugin_name=bt_settings_determine_audiosink_name(self->priv->settings))) { return(NULL); } GstElement * const element=gst_element_factory_make(plugin_name,"player"); if(!element) { /* @todo: if this fails * - check if it was audiosink in settings and if so, unset it and retry * - else check if it was system-audiosink and if so, what? */ GST_WARNING("Can't instantiate '%s' element",plugin_name);goto Error; } if(GST_IS_BASE_SINK(element)) { // enable syncing to timestamps g_object_set(element, "sync",TRUE, /* if we do this, live pipelines go playing, but still sources don't start */ /*"async", FALSE,*/ /* <- this breaks scrubbing on timeline */ /* this helps trickplay and scrubbing, there seems to be some time issue * in baseaudiosink */ /*"slave-method",2,*/ /*"provide-clock",FALSE, */ #if GST_CHECK_VERSION(0,10,24) /* this does not lockup anymore, but does not give us better latencies */ /*"can-activate-pull",TRUE,*/ #endif NULL); bt_sink_bin_configure_latency(self,element); } list=g_list_append(list,element); Error: g_free(plugin_name); return(list); } static GList *bt_sink_bin_get_recorder_elements(const BtSinkBin * const self) { GList *list=NULL; GstElement *element; GST_DEBUG("get record elements"); // @todo: check extension ? // @todo: need to lookup encoders by caps // start with a queue element=gst_element_factory_make("queue","record-queue"); // @todo: if we have/require gstreamer-0.10.31 ret rid of the check if(g_object_class_find_property(G_OBJECT_GET_CLASS(element),"silent")) { g_object_set(element,"silent",TRUE,NULL); } list=g_list_append(list,element); /* element=gst_element_factory_make("audioconvert","record-convert"); list=g_list_append(list,element); */ // generate recorder elements switch(self->priv->record_format) { case BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS: // vorbisenc ! oggmux ! filesink location="song.ogg" /* we use float internaly anyway if(!(element=gst_element_factory_make("audioconvert","makefloat"))) { GST_INFO("Can't instantiate 'audioconvert' element");goto Error; } list=g_list_append(list,element); */ if(!(element=gst_element_factory_make("vorbisenc","vorbisenc"))) { BT_SINK_BIN_MISSING_ELEMENT("'vorbisenc'"); goto Error; } list=g_list_append(list,element); if(!(element=gst_element_factory_make("oggmux","oggmux"))) { BT_SINK_BIN_MISSING_ELEMENT("'oggmux'"); goto Error; } list=g_list_append(list,element); break; case BT_SINK_BIN_RECORD_FORMAT_MP3: // lame ! id3mux ! filesink location="song.mp3" if(!(element=gst_element_factory_make("lamemp3enc","lame"))) { if(!(element=gst_element_factory_make("lame","lame"))) { // FIXME: for some reason this does not show up on the bus /*GstCaps *caps=gst_caps_from_string("audio/mpeg, mpegversion=1, layer=3"); gst_element_post_message(GST_ELEMENT(self), gst_missing_encoder_message_new(GST_ELEMENT(self), caps)); gst_caps_unref(caps); */ BT_SINK_BIN_MISSING_ELEMENT("'lamemp3enc'/'lame'"); goto Error; } } list=g_list_append(list,element); if(!(element=gst_element_factory_make("id3mux","id3mux"))) { BT_SINK_BIN_MISSING_ELEMENT("'id3mux'"); goto Error; } list=g_list_append(list,element); break; case BT_SINK_BIN_RECORD_FORMAT_WAV: // wavenc ! filesink location="song.wav" if(!(element=gst_element_factory_make("wavenc","wavenc"))) { BT_SINK_BIN_MISSING_ELEMENT("'wavenc'"); goto Error; } list=g_list_append(list,element); break; case BT_SINK_BIN_RECORD_FORMAT_OGG_FLAC: // flacenc ! oggmux ! filesink location="song.flac" if(!(element=gst_element_factory_make("flacenc","flacenc"))) { BT_SINK_BIN_MISSING_ELEMENT("'flacenc'"); goto Error; } list=g_list_append(list,element); if(!(element=gst_element_factory_make("oggmux","oggmux"))) { BT_SINK_BIN_MISSING_ELEMENT("'oggmux'"); goto Error; } list=g_list_append(list,element); break; case BT_SINK_BIN_RECORD_FORMAT_MP4_AAC: // faac ! mp4mux ! filesink location="song.m4a" if(!(element=gst_element_factory_make("faac","faac"))) { BT_SINK_BIN_MISSING_ELEMENT("'faac'"); goto Error; } list=g_list_append(list,element); if(!(element=gst_element_factory_make("mp4mux","mp4mux"))) { BT_SINK_BIN_MISSING_ELEMENT("'mp4mux'"); goto Error; } list=g_list_append(list,element); break; case BT_SINK_BIN_RECORD_FORMAT_RAW: // no element needed break; } // create filesink, set location property element=gst_element_factory_make("filesink","filesink"); g_object_set(element, "location",self->priv->record_file_name, // only for recording in in realtime and not as fast as we can "sync",TRUE, NULL); list=g_list_append(list,element); return(list); Error: for(;list;list=list->next) { gst_object_unref(GST_OBJECT(list->data)); } g_list_free(g_list_first(list)); return(NULL); } #ifdef BT_MONITOR_SINK_DATA_FLOW static GstClockTime sink_probe_last_ts=GST_CLOCK_TIME_NONE; static gboolean sink_probe(GstPad *pad, GstMiniObject *mini_obj, gpointer user_data) { if(GST_IS_BUFFER(mini_obj)) { if(sink_probe_last_ts==GST_CLOCK_TIME_NONE) { GST_WARNING("got SOS at %"GST_TIME_FORMAT,GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(mini_obj))); } sink_probe_last_ts=GST_BUFFER_TIMESTAMP(mini_obj)+GST_BUFFER_DURATION(mini_obj); } else if(GST_IS_EVENT(mini_obj)) { GST_WARNING("got %s at %"GST_TIME_FORMAT, GST_EVENT_TYPE_NAME(mini_obj), GST_TIME_ARGS(sink_probe_last_ts)); if(GST_EVENT_TYPE(mini_obj)==GST_EVENT_EOS) { sink_probe_last_ts=GST_CLOCK_TIME_NONE; } } return(TRUE); } #endif static gboolean bt_sink_bin_format_update(const BtSinkBin * const self) { GstStructure *sink_format_structures[2]; GstCaps *sink_format_caps; if(!self->priv->caps_filter) return(FALSE); // always add caps-filter as a first element and enforce sample rate and channels sink_format_structures[0]=gst_structure_from_string("audio/x-raw-int, " "channels = (int) 2, " "rate = (int) 44100, " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }, " "width = (int) { 8, 16, 24, 32 }, " "depth = (int) [ 1, 32 ], " "signed = (boolean) { true, false };", NULL ); sink_format_structures[1]=gst_structure_from_string("audio/x-raw-float, " "channels = (int) 2, " "rate = (int) 44100, " "width = (int) { 32, 64 }, " "endianness = (int) { LITTLE_ENDIAN, BIG_ENDIAN }", NULL ); gst_structure_set(sink_format_structures[0], "rate",G_TYPE_INT,self->priv->sample_rate, "channels",G_TYPE_INT,self->priv->channels, NULL); gst_structure_set(sink_format_structures[1], "rate",G_TYPE_INT,self->priv->sample_rate, "channels",G_TYPE_INT,self->priv->channels, NULL); sink_format_caps=gst_caps_new_full(sink_format_structures[0],sink_format_structures[1],NULL); GST_INFO("sink is using: sample-rate=%u, channels=%u",self->priv->sample_rate,self->priv->channels); g_object_set(self->priv->caps_filter,"caps",sink_format_caps,NULL); gst_caps_unref(sink_format_caps); return(TRUE); } /* * bt_sink_bin_update: * @self: the #BtSinkBin * * Needs to be called after a series of property changes to update the internals * of the bin. * * Returns: %TRUE for success */ static gboolean bt_sink_bin_update(const BtSinkBin * const self) { GstElement *audio_resample,*tee,*audio_sink; GstState state; gboolean defer=FALSE; // check current state if(gst_element_get_state(GST_ELEMENT(self),&state,NULL,0)==GST_STATE_CHANGE_SUCCESS) { if(state>GST_STATE_READY) defer=TRUE; } else defer=TRUE; if(defer) { GST_INFO("defer switching sink-bin elements"); self->priv->pending_update=TRUE; return(FALSE); } GST_INFO("clearing sink-bin"); // remove existing children bt_sink_bin_clear(self); GST_INFO("initializing sink-bin"); self->priv->caps_filter=gst_element_factory_make("capsfilter","sink-format"); bt_sink_bin_format_update(self); audio_resample=gst_element_factory_make("audioresample","sink-audioresample"); tee=self->priv->tee=gst_element_factory_make("tee","sink-tee"); gst_bin_add_many(GST_BIN(self),self->priv->caps_filter,tee,audio_resample,NULL); if(!gst_element_link_pads(self->priv->caps_filter,"src",audio_resample,"sink")) { GST_WARNING("Can't link caps-filter and audio-resample"); } #ifdef BT_MONITOR_TIMESTAMPS { GstElement *identity=gst_element_factory_make("identity","identity"); g_object_set(identity,"check-perfect",TRUE,"silent",FALSE,NULL); gst_bin_add(GST_BIN(self),identity); if(!gst_element_link_pads(audio_resample,"src",identity,"sink")) { GST_WARNING("Can't link audio-resample and identity"); } if(!gst_element_link_pads(identity,"src",tee,"sink")) { GST_WARNING("Can't link identity and tee"); } } #else if(!gst_element_link_pads(audio_resample,"src",tee,"sink")) { GST_WARNING("Can't link audio-resample and tee"); } #endif // add new children switch(self->priv->mode) { case BT_SINK_BIN_MODE_PLAY:{ GList * const list=bt_sink_bin_get_player_elements(self); if(list) { bt_sink_bin_add_many(self,list); bt_sink_bin_link_many(self,tee,list); g_list_free(list); } else { GST_WARNING("Can't get playback element list"); return(FALSE); } break; } case BT_SINK_BIN_MODE_RECORD:{ GList * const list=bt_sink_bin_get_recorder_elements(self); if(list) { bt_sink_bin_add_many(self,list); bt_sink_bin_link_many(self,tee,list); g_list_free(list); } else { GST_WARNING("Can't get record element list"); return(FALSE); } break; } case BT_SINK_BIN_MODE_PLAY_AND_RECORD:{ // add player elems GList *list1=bt_sink_bin_get_player_elements(self); if(list1) { GstElement *element; /* element=gst_element_factory_make("audioconvert","play-convert"); list1=g_list_prepend(list1,element); */ // start with a queue element=gst_element_factory_make("queue","play-queue"); // @todo: if we have/require gstreamer-0.10.31 ret rid of the check if(g_object_class_find_property(G_OBJECT_GET_CLASS(element),"silent")) { g_object_set(element,"silent",TRUE,NULL); } list1=g_list_prepend(list1,element); bt_sink_bin_add_many(self,list1); bt_sink_bin_link_many(self,tee,list1); g_list_free(list1); } else { GST_WARNING("Can't get playback element list"); return(FALSE); } // add recorder elems GList * const list2=bt_sink_bin_get_recorder_elements(self); if(list2) { bt_sink_bin_add_many(self,list2); bt_sink_bin_link_many(self,tee,list2); g_list_free(list2); } else { GST_WARNING("Can't get record element list"); return(FALSE); } break; } case BT_SINK_BIN_MODE_PASS_THRU:{ GstPad *target_pad=gst_element_get_request_pad(tee,"src%d"); self->priv->src=gst_ghost_pad_new("src",target_pad); gst_pad_set_active(self->priv->src,TRUE); gst_element_add_pad(GST_ELEMENT(self),self->priv->src); break; } default: g_assert_not_reached(); } // set new ghostpad-target if(self->priv->sink) { GstPad *sink_pad=gst_element_get_static_pad(self->priv->caps_filter,"sink"); GstPad *req_sink_pad=NULL; GST_INFO("updating ghostpad: %p", self->priv->sink); if(!sink_pad) { GST_INFO("failed to get static 'sink' pad for element '%s'",GST_OBJECT_NAME(self->priv->caps_filter)); sink_pad=req_sink_pad=gst_element_get_request_pad(self->priv->caps_filter,"sink_%d"); if(!sink_pad) { GST_INFO("failed to get request 'sink' request-pad for element '%s'",GST_OBJECT_NAME(self->priv->caps_filter)); } } GST_INFO ("updating ghost pad : elem=%p (ref_ct=%d),'%s', pad=%p (ref_ct=%d)", self->priv->caps_filter,(G_OBJECT_REF_COUNT(self->priv->caps_filter)),GST_OBJECT_NAME(self->priv->caps_filter), sink_pad,(G_OBJECT_REF_COUNT(sink_pad))); /* @bug: https://bugzilla.gnome.org/show_bug.cgi?id=596366 * at least version 0.10.24-25 suffer from it, fixed with * http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=c6f2a9477750be536924bf8e70a830ddec4c1389 */ #if !GST_CHECK_VERSION(0,10,26) { GstPad *peer_pad; if((peer_pad=gst_pad_get_peer(self->priv->sink))) { gst_pad_unlink(peer_pad,self->priv->sink); } #endif if(!gst_ghost_pad_set_target(GST_GHOST_PAD(self->priv->sink),sink_pad)) { GST_WARNING("failed to link internal pads"); } #if !GST_CHECK_VERSION(0,10,26) if(peer_pad) { gst_pad_link(peer_pad,self->priv->sink); gst_object_unref(peer_pad); } } #endif GST_INFO(" done, pad=%p (ref_ct=%d)",sink_pad,(G_OBJECT_REF_COUNT(sink_pad))); // request pads need to be released if(!req_sink_pad) { gst_object_unref(sink_pad); } } if((audio_sink=gst_bin_get_by_name(GST_BIN(self),"player"))) { #ifdef BT_MONITOR_SINK_DATA_FLOW GstPad *sink_pad=gst_element_get_static_pad(audio_sink,"sink"); if(sink_pad) { sink_probe_last_ts=GST_CLOCK_TIME_NONE; gst_pad_add_data_probe(sink_pad,G_CALLBACK(sink_probe),(gpointer)self); gst_object_unref(sink_pad); } #endif GST_INFO_OBJECT(self,"kick and lock audio sink"); #if 0 /* we need a way to kick start the audiosink and actualy open the device * so that we show up in pulseaudio or qjackctrl */ gst_element_set_state(audio_sink, GST_STATE_PAUSED); { GstPad *p=GST_PAD_PEER(GST_BASE_SINK_PAD(audio_sink)); GstBuffer *b; gst_pad_alloc_buffer_and_set_caps(p,G_GUINT64_CONSTANT(0),1,GST_PAD_CAPS(p),&b); gst_pad_push(p,b); } #endif gst_element_set_state(audio_sink, GST_STATE_READY); gst_element_set_locked_state(audio_sink, TRUE); gst_object_unref(audio_sink); } GST_INFO("done"); return(TRUE); } //-- event handler static void on_audio_sink_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtSinkBin *self = BT_SINK_BIN(user_data); GST_INFO("audio-sink has changed"); gchar * const plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); GST_INFO(" -> '%s'",plugin_name); g_free(plugin_name); // exchange the machine switch(self->priv->mode) { case BT_SINK_BIN_MODE_PLAY: case BT_SINK_BIN_MODE_PLAY_AND_RECORD: bt_sink_bin_update(self); break; default: break; } } static void on_system_audio_sink_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtSinkBin *self = BT_SINK_BIN(user_data); GST_INFO("system audio-sink has changed"); gchar * const plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); gchar *sink_name; // exchange the machine (only if the system-audiosink is in use) g_object_get((gpointer)settings,"system-audiosink-name",&sink_name,NULL); GST_INFO(" -> '%s' (sytem_sink is '%s')",plugin_name,sink_name); if (!strcmp(plugin_name,sink_name)) { // exchange the machine switch(self->priv->mode) { case BT_SINK_BIN_MODE_PLAY: case BT_SINK_BIN_MODE_PLAY_AND_RECORD: bt_sink_bin_update(self); break; default: break; } } g_free(sink_name); g_free(plugin_name); } static void on_sample_rate_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtSinkBin *self = BT_SINK_BIN(user_data); GST_INFO("sample-rate has changed"); g_object_get((gpointer)settings,"sample-rate",&self->priv->sample_rate,NULL); bt_sink_bin_format_update(self); } static void on_channels_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtSinkBin *self = BT_SINK_BIN(user_data); GST_INFO("channels have changed"); g_object_get((gpointer)settings,"channels",&self->priv->channels,NULL); bt_sink_bin_format_update(self); // @todo: this would render all panorama/balance elements useless and also // affect wire patterns - how do we want to handle it } static gboolean master_volume_sync_handler(GstPad *pad,GstBuffer *buffer, gpointer user_data) { BtSinkBin *self = BT_SINK_BIN(user_data); gst_object_sync_values(G_OBJECT(self),GST_BUFFER_TIMESTAMP(buffer)); return(TRUE); } //-- methods //-- wrapper //-- class internals static GstStateChangeReturn bt_sink_bin_change_state(GstElement * element, GstStateChange transition) { const BtSinkBin * const self = BT_SINK_BIN(element); GstElement *audio_sink; GstStateChangeReturn res; GST_INFO_OBJECT(self,"state change on the sink-bin: %s -> %s", gst_element_state_get_name(GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name(GST_STATE_TRANSITION_NEXT (transition))); res = GST_ELEMENT_CLASS(bt_sink_bin_parent_class)->change_state(element,transition); switch(transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: if(self->priv->pending_update) { self->priv->pending_update=FALSE; bt_sink_bin_update(self); } else { if((audio_sink=gst_bin_get_by_name(GST_BIN(self),"player"))) { GST_DEBUG_OBJECT(self,"lock audio sink"); gst_element_set_locked_state(audio_sink, TRUE); gst_object_unref(audio_sink); } } break; case GST_STATE_CHANGE_READY_TO_PAUSED: if((audio_sink=gst_bin_get_by_name(GST_BIN(self),"player"))) { GST_DEBUG_OBJECT(self,"unlock audio sink"); gst_element_set_locked_state(audio_sink, FALSE); gst_object_unref(audio_sink); } break; default: break; } return(res); } /* returns a property for the given property_id for this object */ static void bt_sink_bin_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSinkBin * const self = BT_SINK_BIN(object); return_if_disposed(); switch (property_id) { case SINK_BIN_MODE: { g_value_set_enum(value, self->priv->mode); } break; case SINK_BIN_RECORD_FORMAT: { g_value_set_enum(value, self->priv->record_format); } break; case SINK_BIN_RECORD_FILE_NAME: { g_value_set_string(value, self->priv->record_file_name); } break; case SINK_BIN_INPUT_GAIN: { g_value_set_object(value, self->priv->gain); } break; case SINK_BIN_MASTER_VOLUME: { if(self->priv->gain) { // FIXME: do we need a notify (or weak ptr) to update this? g_object_get(self->priv->gain,"volume",&self->priv->volume,NULL); GST_DEBUG("Get master volume: %lf",self->priv->volume); } g_value_set_double(value,self->priv->volume); } break; case SINK_BIN_ANALYZERS: { g_value_set_pointer(value, self->priv->analyzers); } break; // tempo iface case SINK_BIN_TEMPO_BPM: g_value_set_ulong(value, self->priv->beats_per_minute); break; case SINK_BIN_TEMPO_TPB: g_value_set_ulong(value, self->priv->ticks_per_beat); break; case SINK_BIN_TEMPO_STPT: g_value_set_ulong(value, self->priv->subticks_per_tick); break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_sink_bin_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSinkBin * const self = BT_SINK_BIN(object); return_if_disposed(); switch (property_id) { case SINK_BIN_MODE: { self->priv->mode=g_value_get_enum(value); if((self->priv->mode==BT_SINK_BIN_MODE_PLAY) || (self->priv->mode==BT_SINK_BIN_MODE_PASS_THRU)) { if(self->priv->record_file_name) { g_free(self->priv->record_file_name); self->priv->record_file_name=NULL; } bt_sink_bin_update(self); } else { if(self->priv->record_file_name) { bt_sink_bin_update(self); } } } break; case SINK_BIN_RECORD_FORMAT: { self->priv->record_format=g_value_get_enum(value); if(((self->priv->mode==BT_SINK_BIN_MODE_RECORD) || (self->priv->mode==BT_SINK_BIN_MODE_PLAY_AND_RECORD)) && self->priv->record_file_name) { bt_sink_bin_update(self); } } break; case SINK_BIN_RECORD_FILE_NAME: { g_free(self->priv->record_file_name); self->priv->record_file_name = g_value_dup_string(value); if((self->priv->mode==BT_SINK_BIN_MODE_RECORD) || (self->priv->mode==BT_SINK_BIN_MODE_PLAY_AND_RECORD)) { bt_sink_bin_update(self); } } break; case SINK_BIN_INPUT_GAIN: { GstPad *sink_pad; g_object_try_weak_unref(self->priv->gain); self->priv->gain = GST_ELEMENT(g_value_get_object(value)); GST_DEBUG("Set initial master volume: %lf",self->priv->volume); g_object_try_weak_ref(self->priv->gain); g_object_set(self->priv->gain,"volume",self->priv->volume,NULL); sink_pad=gst_element_get_static_pad(self->priv->gain,"sink"); self->priv->mv_handler_id=gst_pad_add_buffer_probe(sink_pad,G_CALLBACK(master_volume_sync_handler),(gpointer)self); gst_object_unref(sink_pad); } break; case SINK_BIN_MASTER_VOLUME: { if(self->priv->gain) { self->priv->volume=g_value_get_double(value); g_object_set(self->priv->gain,"volume",self->priv->volume,NULL); GST_DEBUG("Set master volume: %lf",self->priv->volume); } } break; case SINK_BIN_ANALYZERS: { bt_sink_bin_deactivate_analyzers(self); self->priv->analyzers=g_value_get_pointer(value); bt_sink_bin_activate_analyzers(self); } break; // tempo iface case SINK_BIN_TEMPO_BPM: case SINK_BIN_TEMPO_TPB: case SINK_BIN_TEMPO_STPT: GST_WARNING("use gstbt_tempo_change_tempo()"); break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_sink_bin_dispose(GObject * const object) { const BtSinkBin * const self = BT_SINK_BIN(object); GstStateChangeReturn res; GstElement *audio_sink; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_INFO("!!!! self=%p",self); if((res=gst_element_set_state(GST_ELEMENT(self),GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to null state"); } GST_DEBUG("->NULL state change returned '%s'",gst_element_state_change_return_get_name(res)); g_signal_handlers_disconnect_matched(self->priv->settings,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); g_object_unref(self->priv->settings); if(self->priv->mv_handler_id && self->priv->gain) { GstPad *sink_pad=gst_element_get_static_pad(self->priv->gain,"sink"); if(sink_pad) { gst_pad_remove_buffer_probe(sink_pad,self->priv->mv_handler_id); gst_object_unref(sink_pad); } } g_object_try_weak_unref(self->priv->gain); GST_INFO("self->sink=%p, refct=%d",self->priv->sink,G_OBJECT_REF_COUNT(self->priv->sink)); gst_element_remove_pad(GST_ELEMENT(self),self->priv->sink); GST_INFO("sink-bin : children=%d",GST_BIN_NUMCHILDREN(self)); if((audio_sink=gst_bin_get_by_name(GST_BIN(self),"player"))) { GST_DEBUG_OBJECT(self,"unlock audio sink before dispose"); gst_element_set_locked_state(audio_sink, FALSE); gst_element_set_state(audio_sink, GST_STATE_NULL); gst_object_unref(audio_sink); } GST_INFO("chaining up"); G_OBJECT_CLASS(bt_sink_bin_parent_class)->dispose(object); GST_INFO("done"); } static void bt_sink_bin_finalize(GObject * const object) { const BtSinkBin * const self = BT_SINK_BIN(object); GST_DEBUG("!!!! self=%p",self); GST_INFO("sink-bin : children=%d",GST_BIN_NUMCHILDREN(self)); g_free(self->priv->record_file_name); G_OBJECT_CLASS(bt_sink_bin_parent_class)->finalize(object); } static void bt_sink_bin_init(BtSinkBin *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SINK_BIN, BtSinkBinPrivate); // watch settings changes self->priv->settings=bt_settings_make(); //GST_DEBUG("listen to settings changes (%p)",self->priv->settings); g_signal_connect(self->priv->settings, "notify::audiosink", G_CALLBACK(on_audio_sink_changed), (gpointer)self); g_signal_connect(self->priv->settings, "notify::system-audiosink", G_CALLBACK(on_system_audio_sink_changed), (gpointer)self); g_signal_connect(self->priv->settings, "notify::sample-rate", G_CALLBACK(on_sample_rate_changed), (gpointer)self); g_signal_connect(self->priv->settings, "notify::channels", G_CALLBACK(on_channels_changed), (gpointer)self); g_object_get(self->priv->settings, "sample-rate",&self->priv->sample_rate, "channels",&self->priv->channels, NULL); self->priv->volume=1.0; self->priv->sink=gst_ghost_pad_new_no_target("sink",GST_PAD_SINK); gst_element_add_pad(GST_ELEMENT(self),self->priv->sink); bt_sink_bin_update(self); GST_INFO("done"); } static void bt_sink_bin_class_init(BtSinkBinClass * klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const element_class = GST_ELEMENT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSinkBinPrivate)); gobject_class->set_property = bt_sink_bin_set_property; gobject_class->get_property = bt_sink_bin_get_property; gobject_class->dispose = bt_sink_bin_dispose; gobject_class->finalize = bt_sink_bin_finalize; element_class->change_state = bt_sink_bin_change_state; // override interface properties g_object_class_override_property(gobject_class, SINK_BIN_TEMPO_BPM, "beats-per-minute"); g_object_class_override_property(gobject_class, SINK_BIN_TEMPO_TPB, "ticks-per-beat"); g_object_class_override_property(gobject_class, SINK_BIN_TEMPO_STPT, "subticks-per-tick"); g_object_class_install_property(gobject_class,SINK_BIN_MODE, g_param_spec_enum("mode", "mode prop", "mode of operation", BT_TYPE_SINK_BIN_MODE, /* enum type */ BT_SINK_BIN_MODE_PLAY, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SINK_BIN_RECORD_FORMAT, g_param_spec_enum("record-format", "record-format prop", "format to use when in record mode", BT_TYPE_SINK_BIN_RECORD_FORMAT, /* enum type */ BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SINK_BIN_RECORD_FILE_NAME, g_param_spec_string("record-file-name", "record-file-name contruct prop", "the file-name to use for recording", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SINK_BIN_INPUT_GAIN, g_param_spec_object("input-gain", "input-gain prop", "the input-gain element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SINK_BIN_MASTER_VOLUME, g_param_spec_double("master-volume", "master volume prop", "master volume for the song", 0.0, 1.0, 1.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|GST_PARAM_CONTROLLABLE)); g_object_class_install_property(gobject_class,SINK_BIN_ANALYZERS, g_param_spec_pointer("analyzers", "analyzers prop", "list of master analyzers", G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); gst_element_class_set_details_simple (element_class, "Master AudioSink", "Audio/Bin", "Play/Record audio", "Stefan Kost "); } //-- plugin handling #if !GST_CHECK_VERSION(0,10,16) static #endif gboolean bt_sink_bin_plugin_init(GstPlugin * const plugin) { gst_element_register(plugin,"bt-sink-bin",GST_RANK_NONE,BT_TYPE_SINK_BIN); return TRUE; } #if !GST_CHECK_VERSION(0,10,16) GST_PLUGIN_DEFINE_STATIC( GST_VERSION_MAJOR, GST_VERSION_MINOR, "bt-sink-bin", "buzztard sink bin - encapsulates play and record functionality", bt_sink_bin_plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://www.buzztard.org" ); #endif buzztard-0.6.0/src/lib/core/settings.c0000644042355400116100000004533411672045311014613 00000000000000 /* $Id: settings.c 3771 2011-12-12 21:49:20Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettings * @short_description: base class for buzztard settings handling * * Under the gnome platform GConf is a locical choice for settings managment. * Unfortunately there currently is no port of GConf for other platforms. * This class wraps the settings management. Depending on what settings managment * capabillities the configure script find on the system one of the * subclasses (#BtGConfSettings,#BtPlainfileSettings) will be used. * * In any case it is always sufficient to talk to this class instance. Single * settings are accessed via normat g_object_get() and g_object_set() calls. If * the backends supports it changes in the settings will be notified to the * application by the GObject::notify signal. */ /* @todo: how can we decouple application specific settings for core settings? * We'd need to register schemas and create the GObject properties as needed. */ #define BT_CORE #define BT_SETTINGS_C #include "core_private.h" #include #include static BtSettingsFactory bt_settings_factory=NULL; static BtSettings *singleton=NULL; //-- the class G_DEFINE_ABSTRACT_TYPE (BtSettings, bt_settings, G_TYPE_OBJECT); //-- helper static gchar *parse_and_check_audio_sink(gchar *plugin_name) { gchar *sink_name,*eon; if(!plugin_name) return(NULL); GST_DEBUG("plugin name is: '%s'", plugin_name); // this can be a whole pipeline like "audioconvert ! osssink sync=false" // seek for the last '!' if(!(sink_name=strrchr(plugin_name,'!'))) { sink_name=plugin_name; } else { // skip '!' and spaces sink_name++; while(*sink_name==' ') sink_name++; } // if there is a space following put '\0' in there if((eon=strstr(sink_name," "))) { *eon='\0'; } if ((sink_name!=plugin_name) || eon) { // no g_free() to partial memory later gchar * const temp=plugin_name; plugin_name=g_strdup(sink_name); g_free(temp); } if (BT_IS_STRING(plugin_name)) { GstPluginFeature *f; gboolean invalid=FALSE; if ((f=gst_registry_lookup_feature(gst_registry_get_default(), plugin_name))) { if(GST_IS_ELEMENT_FACTORY(f)) { gboolean can_int_caps,can_float_caps; can_int_caps=bt_gst_element_factory_can_sink_media_type((GstElementFactory *)f,"audio/x-raw-int"); can_float_caps=bt_gst_element_factory_can_sink_media_type((GstElementFactory *)f,"audio/x-raw-float"); if(!(can_int_caps || can_float_caps)) { GST_INFO("audiosink '%s' has no compatible caps", plugin_name); invalid=TRUE; } } else { GST_INFO("audiosink '%s' not an element factory", plugin_name); invalid=TRUE; } gst_object_unref(f); } else { GST_INFO("audiosink '%s' not in registry", plugin_name); invalid=TRUE; } if(invalid) { g_free(plugin_name); plugin_name=NULL; } } return(plugin_name); } //-- constructor methods /** * bt_settings_make: * * Create a new instance. The type of the settings depends on the subsystem * found during configuration run. * * Settings are implemented as a singleton. Thus the first invocation will * create the object and further calls will just give back a reference. * * Returns: the instance or %NULL in case of an error */ BtSettings *bt_settings_make(void) { if(G_UNLIKELY(!singleton)) { GST_INFO("create a new settings object"); if(G_LIKELY(!bt_settings_factory)) { #ifdef USE_GCONF singleton=(BtSettings *)bt_gconf_settings_new(); #else singleton=(BtSettings *)bt_plainfile_settings_new(); #endif GST_INFO("settings created %p",singleton); } else { singleton=bt_settings_factory(); GST_INFO("created new settings object from factory %p",singleton); } g_object_add_weak_pointer((GObject *)singleton,(gpointer*)(gpointer)&singleton); } else { GST_INFO("return cached settings object %p (refct=%d)",singleton,G_OBJECT_REF_COUNT(singleton),g_thread_self()); singleton=g_object_ref(singleton); } return(BT_SETTINGS(singleton)); } //-- methods /** * bt_settings_set_factory: * @factory: factory method * * Set a factory method that creates a new settings instance. This is currently * only used by the unit tests to exercise the applications under various * conditions. Normal applications should NOT use it. */ void bt_settings_set_factory(BtSettingsFactory factory) { if(!singleton) { bt_settings_factory=factory; } else { GST_WARNING("can't change factory while having %d usages",G_OBJECT_REF_COUNT(singleton)); } } /** * bt_settings_determine_audiosink_name: * @self: the settings * * Check the settings for the configured audio sink. Pick a fallback if none has * been chosen. Verify that the sink works. * * Returns: the elemnt name, free when done. */ gchar *bt_settings_determine_audiosink_name(const BtSettings * const self) { gchar *audiosink_name,*system_audiosink_name; gchar *plugin_name=NULL; g_object_get((GObject *)self,"audiosink",&audiosink_name,"system-audiosink",&system_audiosink_name,NULL); if(BT_IS_STRING(audiosink_name)) { GST_INFO("get audiosink from config"); plugin_name=parse_and_check_audio_sink(audiosink_name); audiosink_name=NULL; } if(!plugin_name && BT_IS_STRING(system_audiosink_name)) { GST_INFO("get audiosink from system config"); plugin_name=parse_and_check_audio_sink(system_audiosink_name); system_audiosink_name=NULL; } if(!plugin_name) { // @todo: try autoaudiosink (if it exists) // iterate over gstreamer-audiosink list and choose element with highest rank const GList *node; GList * const audiosink_factories=bt_gst_registry_get_element_factories_matching_all_categories("Sink/Audio"); guint max_rank=0,cur_rank; gboolean can_int_caps,can_float_caps; GST_INFO("get audiosink from gst registry by rank"); /* @bug: https://bugzilla.gnome.org/show_bug.cgi?id=601775 */ GST_TYPE_AUDIO_CHANNEL_POSITION; for(node=audiosink_factories;node;node=g_list_next(node)) { GstElementFactory * const factory=node->data; const gchar *feature_name = gst_plugin_feature_get_name((GstPluginFeature *)factory); GST_INFO(" probing audio sink: \"%s\"",feature_name); // can the sink accept raw audio? can_int_caps=bt_gst_element_factory_can_sink_media_type(factory,"audio/x-raw-int"); can_float_caps=bt_gst_element_factory_can_sink_media_type(factory,"audio/x-raw-float"); if(can_int_caps || can_float_caps) { // get element max(rank) cur_rank=gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory)); GST_INFO(" trying audio sink: \"%s\" with rank: %d",feature_name,cur_rank); if((cur_rank>=max_rank) || (!plugin_name)) { g_free(plugin_name); plugin_name=g_strdup(feature_name); max_rank=cur_rank; GST_INFO(" audio sink \"%s\" is current best sink", plugin_name); } } else { GST_INFO(" skipping audio sink: \"%s\" because of incompatible caps",feature_name); } } gst_plugin_feature_list_free(audiosink_factories); } GST_INFO("using audio sink : \"%s\"",plugin_name); g_free(system_audiosink_name); g_free(audiosink_name); return(plugin_name); } //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_settings_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const GObjectClass * const gobject_class = G_OBJECT_GET_CLASS(object); // call implementation gobject_class->get_property(object,property_id,value,pspec); } /* sets the given properties for this object */ static void bt_settings_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { GObjectClass * const gobject_class = G_OBJECT_GET_CLASS(object); // call implementation gobject_class->set_property(object,property_id,value,pspec); } //-- class internals static void bt_settings_init(BtSettings * self) { } static void bt_settings_class_init(BtSettingsClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); gobject_class->set_property = bt_settings_set_property; gobject_class->get_property = bt_settings_get_property; // ui g_object_class_install_property(gobject_class,BT_SETTINGS_NEWS_SEEN, g_param_spec_uint("news-seen", "news-seen prop", "version number for that the user has seen the news", 0, G_MAXUINT, 0, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_MISSING_MACHINES, g_param_spec_string("missing-machines", "missing-machines prop", "list of tip-numbers that were shown already", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_PRESENTED_TIPS, g_param_spec_string("presented-tips", "presented-tips prop", "list of missing machines to ignore", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_SHOW_TIPS, g_param_spec_boolean("show-tips", "show-tips prop", "show tips on startup", TRUE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_MENU_TOOLBAR_HIDE, g_param_spec_boolean("toolbar-hide", "toolbar-hide prop", "hide main toolbar", FALSE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_MENU_STATUSBAR_HIDE, g_param_spec_boolean("statusbar-hide", "statusbar-hide prop", "hide bottom statusbar", FALSE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_MENU_TABS_HIDE, g_param_spec_boolean("tabs-hide", "tabs-hide prop", "hide main page tabs", FALSE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY, g_param_spec_string("grid-density", "grid-density prop", "machine view grid detail level", "low", /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_WINDOW_XPOS, g_param_spec_int("window-xpos", "window-xpos prop", "last application window x-position", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_WINDOW_YPOS, g_param_spec_int("window-ypos", "window-ypos prop", "last application window y-position", G_MININT, G_MAXINT, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_WINDOW_WIDTH, g_param_spec_int("window-width", "window-width prop", "last application window width", -1, G_MAXINT, -1, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_WINDOW_HEIGHT, g_param_spec_int("window-height", "window-height prop", "last application window height", -1, G_MAXINT, -1, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // audio settings g_object_class_install_property(gobject_class,BT_SETTINGS_AUDIOSINK, g_param_spec_string("audiosink", "audiosink prop", "audio output gstreamer element", "autoaudiosink", /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_SAMPLE_RATE, g_param_spec_uint("sample-rate", "sample-rate prop", "audio output sample-rate", 1, 96000, GST_AUDIO_DEF_RATE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_CHANNELS, g_param_spec_uint("channels", "channels prop", "number of audio output channels", 1, 2, 2, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // playback controller g_object_class_install_property(gobject_class,BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_ACTIVE, g_param_spec_boolean("coherence-upnp-active", "coherence-upnp-active", "activate Coherence UPnP based playback controller", FALSE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT, g_param_spec_uint("coherence-upnp-port", "coherence-upnp-port", "the port number for the communication with the coherence backend", 0, G_MAXUINT, 7654, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // directory settings g_object_class_install_property(gobject_class,BT_SETTINGS_FOLDER_SONG, g_param_spec_string("song-folder", "song-folder prop", "default directory for songs", g_get_home_dir(), /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_FOLDER_RECORD, g_param_spec_string("record-folder", "record-folder prop", "default directory for recordings", g_get_home_dir(), /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_FOLDER_SAMPLE, g_param_spec_string("sample-folder", "sample-folder prop", "default directory for sample-waveforms", g_get_home_dir(), /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // system settings g_object_class_install_property(gobject_class,BT_SETTINGS_SYSTEM_AUDIOSINK, g_param_spec_string("system-audiosink", "system-audiosink prop", "system audio output gstreamer element", "autoaudiosink", /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,BT_SETTINGS_SYSTEM_TOOLBAR_STYLE, g_param_spec_string("toolbar-style", "toolbar-style prop", "system tolbar style", "both", /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/marshal.h0000644042355400116100000000410311667370631014406 00000000000000 #ifndef __bt_marshal_MARSHAL_H__ #define __bt_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* VOID:OBJECT,ULONG (./marshal.list:4) */ extern void bt_marshal_VOID__OBJECT_ULONG (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,OBJECT,ULONG (./marshal.list:5) */ extern void bt_marshal_VOID__ULONG_OBJECT_ULONG (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,ULONG (./marshal.list:6) */ extern void bt_marshal_VOID__ULONG_ULONG (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* VOID:ULONG,ULONG,ULONG (./marshal.list:7) */ extern void bt_marshal_VOID__ULONG_ULONG_ULONG (GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* __bt_marshal_MARSHAL_H__ */ buzztard-0.6.0/src/lib/core/core.c0000644042355400116100000002161111643613122013672 00000000000000/* $Id: core.c 3679 2011-10-07 15:10:09Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:libbtcore * @short_description: core library of the buzztard application framework * * The library offers base objects such as #BtApplication and #BtSong. */ /* @todo add check_version stuff like in gstreamer */ #define BT_CORE #define BT_CORE_C #include "core_private.h" #ifdef HAVE_SCHED_SETSCHEDULER #include #if HAVE_MLOCKALL #include #endif #endif #if HAVE_XMMINTRIN_H #include #endif /** * bt_major_version: * * buzztard version stamp, major part; determined from #BT_MAJOR_VERSION */ const unsigned int bt_major_version=BT_MAJOR_VERSION; /** * bt_minor_version: * * buzztard version stamp, minor part; determined from #BT_MINOR_VERSION */ const unsigned int bt_minor_version=BT_MINOR_VERSION; /** * bt_micro_version: * * buzztard version stamp, micro part; determined from #BT_MICRO_VERSION */ const unsigned int bt_micro_version=BT_MICRO_VERSION; GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); static gboolean bt_initialized = FALSE; GstCaps *bt_default_caps=NULL; //-- helper methods /* we have no fail cases yet, but maybe in the future */ static gboolean bt_init_pre (void) { #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ //-- initialize gobject g_type_init (); return TRUE; } static gboolean bt_init_post (void) { gboolean res=FALSE; //-- initialize dynamic parameter control module gst_controller_init(NULL,NULL); gst_pb_utils_init(); GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-core", 0, "music production environment / core library"); #if GST_CHECK_VERSION(0,10,16) /* @todo: requires gst-0.10.16 */ extern gboolean bt_sink_bin_plugin_init (GstPlugin * const plugin); gst_plugin_register_static(GST_VERSION_MAJOR, GST_VERSION_MINOR, "bt-sink-bin", "buzztard sink bin - encapsulates play and record functionality", bt_sink_bin_plugin_init, VERSION, "LGPL", PACKAGE, PACKAGE_NAME, "http://www.buzztard.org"); #endif bt_default_caps=gst_caps_new_simple("audio/x-raw-float", "width",G_TYPE_INT,32, "channels",GST_TYPE_INT_RANGE,1,2, "rate", GST_TYPE_INT_RANGE, 1, G_MAXINT, "endianness",G_TYPE_INT,G_BYTE_ORDER, NULL); GST_DEBUG("init xml"); //-- initialize libxml // set own error handler //xmlSetGenericErrorFunc("libxml-error: ",&gitk_libxmlxslt_error_func); // initialize the xml parser xmlInitParser(); // xmlInitParser does that for us //xmlXPathInit(); // we don't use entities xmlSubstituteEntitiesDefault(0); xmlLoadExtDtdDefaultValue=FALSE; // do not always load DTD default values xmlDoValidityCheckingDefaultValue=FALSE; // do not validate files #if 0 // I just got // switching scheduler failed: Die Operation ist nicht erlaubt // see /etc/security/limits.conf #ifdef HAVE_SCHED_SETSCHEDULER // @idea; only do this in non-debug builds //http://www.gnu.org/software/libc/manual/html_node/Basic-Scheduling-Functions.html { struct sched_param p={0,}; p.sched_priority=sched_get_priority_min(SCHED_RR); //p.sched_priority=sched_get_priority_max(SCHED_RR); if(sched_setscheduler(0,SCHED_RR,&p)<0) { GST_WARNING("switching scheduler failed: %s",g_strerror(errno)); } else { GST_INFO("switched scheduler"); #if HAVE_MLOCKALL if(mlockall(MCL_CURRENT)<0) GST_WARNING("locking memory pages failed: %s",g_strerror(errno)); #endif } } #endif #endif #if HAVE_XMMINTRIN_H // @todo: we need to probe the CPU capabilities // see http://www.mail-archive.com/linux-audio-dev@music.columbia.edu/msg19520.html // [linux-audio-dev] Channels and best practice // _MM_FLUSH_ZERO_ON = FZ _mm_setcsr(_mm_getcsr() | 0x8040); // set DAZ and FZ bits #endif res=TRUE; return(res); } static gboolean parse_goption_arg(const gchar * opt, const gchar * arg, gpointer data, GError ** err) { gboolean ret=TRUE; if (!strcmp (opt, "--bt-version")) { g_printf("libbtcore-%d.%d.%d from "PACKAGE_STRING"\n",BT_MAJOR_VERSION,BT_MINOR_VERSION,BT_MICRO_VERSION); } else { // @todo: need to set error here ret=FALSE; } return(ret); } //-- core initialisation /** * bt_init_get_option_group: * * Returns a #GOptionGroup with libbtcore's argument specifications. The group * is set up to use standard GOption callbacks, so when using this group in * combination with GOption parsing methods, all argument parsing and * initialization is automated. * * This function is useful if you want to integrate libbtcore with other * libraries that use GOption (see g_option_context_add_group() ). * * Returns: a pointer to a GOption group. Should be dereferenced after use. */ GOptionGroup *bt_init_get_option_group(void) { GOptionGroup *group; static GOptionEntry bt_args[] = { {"bt-version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer)parse_goption_arg, N_("Print the buzztard core version"), NULL}, {NULL} }; group = g_option_group_new("bt-core", _("Buzztard core options"),_("Show buzztard core options"), NULL, NULL); g_option_group_set_parse_hooks(group, (GOptionParseFunc)bt_init_pre, (GOptionParseFunc)bt_init_post); g_option_group_add_entries(group, bt_args); g_option_group_set_translation_domain(group, PACKAGE_NAME); return group; } /** * bt_init_add_option_groups: * @ctx: main option context * * Adds all option groups to the main context the core library will pull in. */ void bt_init_add_option_groups(GOptionContext * const ctx) { g_option_context_add_group(ctx, gst_init_get_option_group()); g_option_context_add_group(ctx, bt_init_get_option_group()); } /** * bt_init_check: * @argc: (inout): pointer to application's argc * @argv: (array length=argc) (inout): pointer to application's argv * @err: pointer to a #GError to which a message will be posted on error * * Initializes the Buzztard core library. * * This function will return %FALSE if Buzztard core could not be initialized * for some reason. If you want your program to fail fatally, * use bt_init() instead. * * Returns: %TRUE if Buzztard core could be initialized. */ gboolean bt_init_check(int *argc, char **argv[], GError **err) { GOptionContext *ctx; gboolean res; if(bt_initialized) { //g_print("already initialized Buzztard core"); return(TRUE); } ctx = g_option_context_new(NULL); bt_init_add_option_groups(ctx); res = g_option_context_parse(ctx, argc, argv, err); g_option_context_free(ctx); if(res) { // check for missing core elements (borked gstreamer install) GList *missing; if((missing=bt_gst_check_core_elements())) { GList *node; for(node=missing;node;node=g_list_next(node)) { GST_WARNING("missing core element '%s'",(gchar *)node->data); } } bt_initialized=TRUE; } return(res); } /** * bt_init: * @argc: (inout): pointer to application's argc * @argv: (array length=argc) (inout): pointer to application's argv * * Initializes the Buzztard Core library. * * * This function will terminate your program if it was unable to initialize * the core for some reason. If you want your program to fall back, * use bt_init_check() instead. * * * WARNING: This function does not work in the same way as corresponding * functions in other glib-style libraries, such as gtk_init(). In * particular, unknown command line options cause this function to * abort program execution. */ void bt_init(int *argc, char **argv[]) { GError *err = NULL; if(!bt_init_check(argc, argv, &err)) { g_print("Could not initialized Buzztard core: %s\n", err ? err->message : "unknown error occurred"); if(err) { g_error_free(err); } exit(1); } } /** * bt_deinit: * * It is normally not needed to call this function in a normal application * as the resources will automatically be freed when the program terminates. * This function is therefore mostly used by testsuites and other memory * profiling tools. */ void bt_deinit(void) { // release some static ressources gst_caps_replace(&bt_default_caps,NULL); // deinit libraries gst_deinit(); } buzztard-0.6.0/src/lib/core/wave.c0000644042355400116100000010232011642675631013715 00000000000000/* $Id: wave.c 3675 2011-10-04 21:33:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwave * @short_description: one #BtWavetable entry that keeps a list of #BtWavelevels * * Represents one instrument. Contains one or more #BtWavelevels. */ /* @todo: save sample file length and/or md5sum in file: * - if we miss files, we can do a xsesame search and use the details to verify * - when loading, we might also use the details as a sanity check * @idea: record wave-entries * - record wave from alsasrc * - like we load & decode to tempfile, use this to record a sound * - needs some dedicated ui for choosing the input, and format (m/s) * - recording from song playback * - would be nice to have ui in song-recorder to select a wavetable slot * - this would disable the file-selector, record to tempfile and load from * there * - all recording features need some error handling when saving to plain xml * song (no waves included) * @todo: bpm support * - listen for tags when loading and show BPM for waves if we have it * -if we don't have bpm, but have the bpm detect plugin, offer detection in * context menu * - if we have bpm and its different from song-bpm offer adjust in the contect * menu to change base_notes to match it * @todo: when loading a wave from filesystem we need to somehow also make a * copy of the original file to ensure that we can save it */ #define BT_CORE #define BT_WAVE_C #include "core_private.h" //-- signal ids enum { LOADING_DONE_EVENT, //WAVELEVEL_ADDED_EVENT, LAST_SIGNAL }; //-- property ids enum { WAVE_SONG=1, WAVE_WAVELEVELS, WAVE_INDEX, WAVE_NAME, WAVE_URI, WAVE_VOLUME, WAVE_LOOP_MODE, // OFF, FORWARD, PINGPONG WAVE_CHANNELS }; struct _BtWavePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the wave belongs to */ G_POINTER_ALIAS(BtSong *,song); /* each wave has an index number, the list of waves can have empty slots */ gulong index; /* the name of the wave and the the sample file */ gchar *name; gchar *uri; /* wave properties common to all wavelevels */ gdouble volume; BtWaveLoopMode loop_mode; guint channels; /* number of channels (1,2) */ GList *wavelevels; // each entry points to a BtWavelevel /* wave loader */ GstElement *pipeline,*fmt; gint fd,ext_fd; FILE *tf,*ext_tf; }; static GQuark error_domain=0; static guint signals[LAST_SIGNAL]={0,}; //-- the class static void bt_wave_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtWave, bt_wave, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_wave_persistence_interface_init)); //-- enums GType bt_wave_loop_mode_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_WAVE_LOOP_MODE_OFF, "off", "off" }, { BT_WAVE_LOOP_MODE_FORWARD, "forward", "forward" }, { BT_WAVE_LOOP_MODE_PINGPONG, "ping-pong", "ping-pong" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtWaveLoopMode", values); } return type; } //-- helper static void on_wave_io_error(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"ERROR: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); //g_signal_emit(G_OBJECT(self),signals[LOADING_DONE_EVENT], 0, FALSE); //wave_loader_free(self); } static void on_wave_io_warning(const GstBus * const bus, GstMessage * message, gconstpointer user_data) { GError *err = NULL; gchar *dbg = NULL; gst_message_parse_warning(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"WARNING: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); //g_signal_emit(G_OBJECT(self),signals[LOADING_DONE_EVENT], 0, FALSE); //wave_loader_free(self); } static void wave_loader_free(const BtWave *self) { if(self->priv->pipeline) { GstBus *bus; bus=gst_element_get_bus(self->priv->pipeline); gst_bus_remove_signal_watch(bus); gst_object_unref(bus); gst_element_set_state(self->priv->pipeline,GST_STATE_NULL); gst_object_unref(self->priv->pipeline); self->priv->pipeline=NULL; self->priv->fmt=NULL; } if(self->priv->ext_tf) { // ext_fd is fileno() of a ext_tf fclose(self->priv->ext_tf); self->priv->ext_tf=NULL; self->priv->ext_fd=-1; } else if(self->priv->ext_fd!=-1) { close(self->priv->ext_fd); self->priv->ext_fd=-1; } if(self->priv->tf) { // fd is fileno() of a tf fclose(self->priv->tf); self->priv->tf=NULL; self->priv->fd=-1; } else if(self->priv->fd!=-1) { close(self->priv->fd); self->priv->fd=-1; } } static void on_wave_loader_new_pad(GstElement *bin,GstPad *pad,gboolean islast,gpointer user_data) { // @todo: if we pass the pad in user_data we can use gst_pad_link() if(!gst_element_link(bin,GST_ELEMENT(user_data))) { GST_WARNING("Can't link output of wave decoder to converter."); } } static void on_wave_loader_eos(const GstBus * const bus, const GstMessage * const message, gconstpointer user_data) { BtWave *self=BT_WAVE(user_data); BtWavelevel *wavelevel; GstPad *pad; GstCaps *caps; gint64 duration; guint64 length=0; gint channels=1,rate=GST_AUDIO_DEF_RATE; GstFormat format=GST_FORMAT_TIME; gpointer data=NULL; struct stat buf={0,}; GST_INFO("sample loading done, eos from %s",GST_MESSAGE_SRC_NAME(message)); // query length and convert to samples if(!gst_element_query_duration(self->priv->pipeline, &format, &duration)) { GST_WARNING("getting sample duration failed"); } // get caps for sample rate and channels if((pad=gst_element_get_static_pad(self->priv->fmt,"src"))) { caps=GST_PAD_CAPS(pad); if(caps && GST_CAPS_IS_SIMPLE(caps)) { GstStructure *structure = gst_caps_get_structure(caps,0); gst_structure_get_int(structure,"channels",&channels); gst_structure_get_int(structure,"rate",&rate); length=gst_util_uint64_scale(duration,(guint64)rate,GST_SECOND); } else { GST_WARNING("No caps or format has not been fixed."); } gst_object_unref(pad); } GST_INFO("sample decoded: channels=%d, rate=%d, length=%"GST_TIME_FORMAT, channels, rate, GST_TIME_ARGS(duration)); if(!(fstat(self->priv->fd, &buf))) { if((data=g_try_malloc(buf.st_size))) { /* mmap is unsave for removable drives :( * gpointer data=mmap(void *start, buf->st_size, PROT_READ, MAP_SHARED, self->priv->fd, 0); */ if(lseek(self->priv->fd,0,SEEK_SET) == 0) { ssize_t bytes; bytes=read(self->priv->fd,data,buf.st_size); self->priv->channels=channels; g_object_notify(G_OBJECT(self),"channels"); wavelevel=bt_wavelevel_new(self->priv->song,self, BT_WAVELEVEL_DEFAULT_ROOT_NOTE,(gulong)length, -1,-1, /* loop */ rate, (gconstpointer)data); g_object_unref(wavelevel); /* emit signal so that UI can redraw */ GST_INFO("sample loaded (%"G_GSSIZE_FORMAT"/%ld bytes)",bytes,buf.st_size); g_signal_emit(self,signals[LOADING_DONE_EVENT], 0, TRUE); } else { GST_WARNING("can't seek to start of sample data"); g_signal_emit(self,signals[LOADING_DONE_EVENT], 0, FALSE); } } else { GST_WARNING("sample is too long (%ld bytes), not trying to load",buf.st_size); g_signal_emit(self,signals[LOADING_DONE_EVENT], 0, FALSE); } } else { GST_WARNING("can't stat() sample"); g_signal_emit(self,signals[LOADING_DONE_EVENT], 0, FALSE); } gst_element_set_state(self->priv->pipeline,GST_STATE_NULL); } /* * bt_wave_load_from_uri: * @self: the wave to load * @uri: the location to load from * * Load the wavedata from the @uri. * * Returns: %TRUE if the wavedata could be loaded */ static gboolean bt_wave_load_from_uri(const BtWave * const self, const gchar * const uri) { gboolean res=TRUE; GstElement *src,*dec,*conv,*sink; GstBus *bus; GstCaps *caps; GST_INFO("about to load sample %s / %s",self->priv->uri,uri); // this leaks! //GST_INFO("current dir is %s", g_get_current_dir()); // check if the url is valid // if(!uri) goto invalid_uri; // create loader pipeline self->priv->pipeline=gst_pipeline_new("wave-loader"); src=gst_element_make_from_uri(GST_URI_SRC,uri,NULL); //dec=gst_element_factory_make("decodebin2",NULL); dec=gst_element_factory_make("decodebin",NULL); conv=gst_element_factory_make("audioconvert",NULL); self->priv->fmt=gst_element_factory_make("capsfilter",NULL); sink=gst_element_factory_make("fdsink",NULL); // configure elements caps=gst_caps_new_simple("audio/x-raw-int", "rate", GST_TYPE_INT_RANGE,1,G_MAXINT, "channels",GST_TYPE_INT_RANGE,1,2, "width",G_TYPE_INT,16, "endianness",G_TYPE_INT,G_BYTE_ORDER, "signed",G_TYPE_BOOLEAN,TRUE, NULL); g_object_set(self->priv->fmt,"caps",caps,NULL); gst_caps_unref(caps); if(!(self->priv->tf=tmpfile())) { res=FALSE; GST_WARNING ("Can't create tempfile."); goto Error; } self->priv->fd=fileno(self->priv->tf); g_object_set(sink,"fd",self->priv->fd,"sync",FALSE,NULL); // add and link gst_bin_add_many(GST_BIN(self->priv->pipeline),src,dec,conv,self->priv->fmt,sink,NULL); res=gst_element_link(src,dec); if(!res) { GST_WARNING ("Can't link wave loader pipeline (src ! dec)."); goto Error; } res=gst_element_link_many(conv,self->priv->fmt,sink,NULL); if(!res) { GST_WARNING ("Can't link wave loader pipeline (conf ! fmt ! sink)."); goto Error; } g_signal_connect(dec,"new-decoded-pad",G_CALLBACK(on_wave_loader_new_pad),(gpointer)conv); /* @todo: during loading wave-data (into wavelevels) * - use statusbar for loader progress ("status" property like in song_io) * - should we do some size checks to avoid unpacking the audio track of a full * video on a machine with low memory * - if so, how to get real/virtual memory sizes? * mallinfo() not enough, sysconf()? */ bus=gst_element_get_bus(self->priv->pipeline); gst_bus_add_signal_watch_full(bus, G_PRIORITY_HIGH); g_signal_connect(bus, "message::error", G_CALLBACK(on_wave_io_error), (gpointer)self); g_signal_connect(bus, "message::warning", G_CALLBACK(on_wave_io_warning), (gpointer)self); g_signal_connect(bus, "message::eos", G_CALLBACK(on_wave_loader_eos), (gpointer)self); gst_object_unref(bus); // play and wait for EOS if(gst_element_set_state(self->priv->pipeline,GST_STATE_PLAYING)==GST_STATE_CHANGE_FAILURE) { GST_WARNING ("Can't set wave loader pipeline for %s / %s to playing",self->priv->uri,uri); gst_element_set_state(self->priv->pipeline,GST_STATE_NULL); res=FALSE; } else { GST_INFO("loading sample ..."); } /* no need to *wait* for eos, we fire loading done signal */ Error: if(!res) wave_loader_free(self); return(res); } /* bt_wave_save_to_fd: * * Write the sample data as a wav to a filedescriptor and keep it open */ static gboolean bt_wave_save_to_fd(const BtWave * const self) { gboolean res=TRUE; GstElement *pipeline; GstElement *src,*fmt,*enc,*sink; BtWavelevel *wavelevel; GstBus *bus; GstCaps *caps; //gchar *fn_wav; gulong srate,length,size,written; gint16 *data; FILE *tf=NULL; gint fd; // we should have a wave loaded g_assert(self->priv->wavelevels->data); if(!(tf=tmpfile())) { res=FALSE; GST_WARNING ("Can't create tempfile."); goto Error; } fd=fileno(tf); if(!(self->priv->ext_tf=tmpfile())) { res=FALSE; GST_WARNING ("Can't create tempfile."); goto Error; } self->priv->ext_fd=fileno(self->priv->ext_tf); // the data is in the wave-level :/ wavelevel=BT_WAVELEVEL(self->priv->wavelevels->data); g_object_get(wavelevel, "data",&data, "length",&length, "rate",&srate, NULL); size=length*self->priv->channels*sizeof(gint16); GST_INFO("about to format data as wav to fd=%d, %d bytes to write",self->priv->ext_fd, size); // create saver pipeline pipeline=gst_pipeline_new("wave-saver"); src=gst_element_factory_make("fdsrc",NULL); fmt=gst_element_factory_make("capsfilter",NULL); enc=gst_element_factory_make("wavenc",NULL); sink=gst_element_factory_make("fdsink",NULL); GST_DEBUG("%p ! %p ! %p ! %p",src,fmt,enc,sink); // configure elements caps=gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT,srate, "channels",G_TYPE_INT,self->priv->channels, "width",G_TYPE_INT,16, "endianness",G_TYPE_INT,G_BYTE_ORDER, "signed",G_TYPE_BOOLEAN,TRUE, NULL); g_object_set(fmt,"caps",caps,NULL); gst_caps_unref(caps); g_object_set(src,"fd",fd,"num-buffers",1,"blocksize",size,NULL); g_object_set(sink,"fd",self->priv->ext_fd,"sync",FALSE,NULL); // add and link gst_bin_add_many(GST_BIN(pipeline),src,fmt,enc,sink,NULL); res=gst_element_link_many(src,fmt,enc,sink,NULL); if(!res) { GST_WARNING ("Can't link wave loader pipeline (src ! dec)."); goto Error; } bus=gst_element_get_bus(pipeline); //gst_bus_add_signal_watch_full(bus, G_PRIORITY_HIGH); //g_signal_connect(bus, "message::error", G_CALLBACK(on_wave_io_error), (gpointer)self); //g_signal_connect(bus, "message::warning", G_CALLBACK(on_wave_io_warning), (gpointer)self); GST_INFO("run pipeline"); written=write(fd,data,size); size-=written; GST_INFO("wrote %d, todo %d",written, size); lseek(fd,0,SEEK_SET); // play and wait for EOS if(gst_element_set_state(pipeline,GST_STATE_PLAYING)==GST_STATE_CHANGE_FAILURE) { GST_WARNING ("Can't set wave saver pipeline for to playing"); gst_element_set_state(pipeline,GST_STATE_NULL); res=FALSE; } else { GstMessage *msg; // we have num-buffers //gst_element_send_event(src,gst_event_new_eos()); // we need to run this sync'ed with eos GST_INFO("waiting for EOS"); msg=gst_bus_poll(bus,GST_MESSAGE_EOS,GST_CLOCK_TIME_NONE); if(msg) { gst_message_unref(msg); } } gst_object_unref(bus); gst_element_set_state(pipeline,GST_STATE_NULL); gst_object_unref(pipeline); GST_INFO("sample saved"); Error: if(tf) fclose(tf); if(!res) wave_loader_free(self); return(res); } static gboolean bt_wave_save_from_fd(const BtWave * const self, BtSongIONative *song_io, const gchar * const uri) { gchar *fn,*fp; // need to rewrite path for target filename if(!(fn=strrchr(self->priv->uri,'/'))) fn=self->priv->uri; else fn++; fp=g_strdup_printf("wavetable/%s",fn); GST_INFO("saving external uri=%s,%s -> zip=%s",uri,self->priv->uri,fp); bt_song_io_native_bzt_copy_from_uri(BT_SONG_IO_NATIVE_BZT(song_io),fp,uri); g_free(fp); return(TRUE); } //-- constructor methods /** * bt_wave_new: * @song: the song the new instance belongs to * @name: the display name for the new wave * @uri: the location of the sample data * @index: the list slot for the new wave * @volume: the volume of the wave * @loop_mode: loop playback mode * @channels: number of audio channels * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtWave *bt_wave_new(const BtSong * const song, const gchar * const name, const gchar * const uri, const gulong index, const gdouble volume, const BtWaveLoopMode loop_mode, const guint channels) { return(BT_WAVE(g_object_new(BT_TYPE_WAVE,"song",song,"name",name,"uri",uri,"index",index,"volume",volume,"loop-mode",loop_mode,"channels",channels,NULL))); } //-- private methods //-- public methods /** * bt_wave_add_wavelevel: * @self: the wavetable to add the new wavelevel to * @wavelevel: the new wavelevel instance * * Add the supplied wavelevel to the wave. This is automatically done by * #bt_wavelevel_new(). * * Returns: %TRUE for success, %FALSE otheriwse */ gboolean bt_wave_add_wavelevel(const BtWave * const self, const BtWavelevel * const wavelevel) { gboolean ret=FALSE; g_assert(BT_IS_WAVE(self)); g_assert(BT_IS_WAVELEVEL(wavelevel)); if(!g_list_find(self->priv->wavelevels,wavelevel)) { ret=TRUE; self->priv->wavelevels=g_list_append(self->priv->wavelevels,g_object_ref((gpointer)wavelevel)); //g_signal_emit((gpointer)self,signals[WAVELEVEL_ADDED_EVENT], 0, wavelevel); } else { GST_WARNING("trying to add wavelevel again"); } return ret; } /** * bt_wave_get_level_by_index: * @self: the wave to search for the wavelevel * @index: the index of the wavelevel * * Search the wave for a wavelevel by the supplied index. * The wavelevel must have been added previously to this wave with bt_wave_add_wavelevel(). * Unref the wavelevel, when done with it. * * Returns: #BtWavelevel instance or %NULL if not found */ BtWavelevel *bt_wave_get_level_by_index(const BtWave * const self,const gulong index) { BtWavelevel *wavelevel; if((wavelevel=g_list_nth_data(self->priv->wavelevels,index))) { return(g_object_ref(wavelevel)); } return(NULL); } //-- io interface static xmlNodePtr bt_wave_persistence_save(const BtPersistence * const persistence, const xmlNodePtr const parent_node) { const BtWave * const self = BT_WAVE(persistence); xmlNodePtr node=NULL; xmlNodePtr child_node; GST_DEBUG("PERSISTENCE::wave"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("wave"),NULL))) { BtSongIONative *song_io; // we need to have a uri if(!self->priv->uri) self->priv->uri=g_strdup(self->priv->name); xmlNewProp(node,XML_CHAR_PTR("index"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->index))); xmlNewProp(node,XML_CHAR_PTR("name"),XML_CHAR_PTR(self->priv->name)); xmlNewProp(node,XML_CHAR_PTR("uri"),XML_CHAR_PTR(self->priv->uri)); xmlNewProp(node,XML_CHAR_PTR("volume"),XML_CHAR_PTR(bt_persistence_strfmt_double(self->priv->volume))); xmlNewProp(node,XML_CHAR_PTR("loop-mode"),XML_CHAR_PTR(bt_persistence_strfmt_enum(BT_TYPE_WAVE_LOOP_MODE,self->priv->loop_mode))); // check if we need to save external data g_object_get(self->priv->song,"song-io",&song_io,NULL); if (song_io) { if(BT_IS_SONG_IO_NATIVE_BZT(song_io)) { gchar *uri=NULL; if(self->priv->ext_fd==-1) { // need to write in memory data to a wav bt_wave_save_to_fd(self); } uri=g_strdup_printf("fd://%d",self->priv->ext_fd); bt_wave_save_from_fd(self,song_io,uri); g_free(uri); } g_object_unref(song_io); } // save wavelevels if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("wavelevels"),NULL))) { bt_persistence_save_list(self->priv->wavelevels,child_node); } } return(node); } static BtPersistence *bt_wave_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtWave *self; BtPersistence *result; BtSongIONative *song_io; gchar *uri=NULL; GST_DEBUG("PERSISTENCE::wave"); g_assert(node); xmlChar * const index_str=xmlGetProp(node,XML_CHAR_PTR("index")); const gulong index=index_str?atol((char *)index_str):0; xmlChar * const name=xmlGetProp(node,XML_CHAR_PTR("name")); xmlChar * const uri_str=xmlGetProp(node,XML_CHAR_PTR("uri")); xmlChar * const volume_str=xmlGetProp(node,XML_CHAR_PTR("volume")); const gdouble volume=volume_str?g_ascii_strtod((char *)volume_str,NULL):0.0; xmlChar * const loop_mode_str=xmlGetProp(node,XML_CHAR_PTR("loop-mode")); gint loop_mode=bt_persistence_parse_enum(BT_TYPE_WAVE_LOOP_MODE,(char *)loop_mode_str); if(loop_mode==-1) loop_mode=BT_WAVE_LOOP_MODE_OFF; if(!persistence) { BtSong *song=NULL; gchar *param_name; // we need to get parameters from var_args (need to handle all baseclass params param_name=va_arg(var_args,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(var_args, gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(var_args,gchar*); } /* @todo: ugly hack, don't pass uri_str yet, this would trigger loading * which we do below (see also: bt_wave_constructed) */ self=bt_wave_new(song,(gchar*)name,NULL,index,volume,loop_mode,0); result=BT_PERSISTENCE(self); g_object_set(self,"uri",uri_str,NULL); } else { self=BT_WAVE(persistence); result=BT_PERSISTENCE(self); g_object_set(self,"index",index,"name",name,"uri",uri_str,"volume",volume,"loop-mode",loop_mode,NULL); } xmlFree(index_str); xmlFree(name); xmlFree(volume_str); xmlFree(loop_mode_str); // check if we need to load external data g_object_get(self->priv->song,"song-io",&song_io,NULL); if (song_io) { gboolean unpack_failed=FALSE; if(BT_IS_SONG_IO_NATIVE_BZT(song_io)) { gchar *fn,*fp; // need to rewrite path if(!(fn=strrchr((gchar *)uri_str,'/'))) fn=(gchar *)uri_str; else fn++; fp=g_strdup_printf("wavetable/%s",fn); GST_INFO("loading external uri=%s -> zip=%s",(gchar *)uri_str,fp); // we need to copy the files from zip and change the uri to "fd://%d" if((self->priv->ext_tf=tmpfile())) { self->priv->ext_fd=fileno(self->priv->ext_tf); if(bt_song_io_native_bzt_copy_to_fd(BT_SONG_IO_NATIVE_BZT(song_io),fp,self->priv->ext_fd)) { uri=g_strdup_printf("fd://%d",self->priv->ext_fd); } else { fclose(self->priv->ext_tf); self->priv->ext_tf=NULL; self->priv->ext_fd=-1; unpack_failed=TRUE; } } else { unpack_failed=TRUE; } g_free(fp); } else { uri=g_strdup((gchar *)uri_str); } g_object_unref(song_io); if(unpack_failed) { goto WaveUnpackError; } } else { uri=g_strdup((gchar *)uri_str); } // try to load wavedata if(!bt_wave_load_from_uri(self,uri)) { goto WaveLoadingError; } else { GList *lnode=self->priv->wavelevels; for(node=node->children;node;node=node->next) { if((!xmlNodeIsText(node)) && (!strncmp((gchar *)node->name,"wavelevel\0",10))) { /* loading the wave already created wave-levels, * here we just want to override e.g. loop, sampling-rate */ if(lnode) { BtWavelevel * const wave_level=BT_WAVELEVEL(lnode->data); bt_persistence_load(BT_TYPE_WAVELEVEL,BT_PERSISTENCE(wave_level),node,NULL,NULL); lnode=g_list_next(lnode); } } } } Done: g_free(uri); xmlFree(uri_str); return(result); WaveUnpackError: GST_WARNING("Failed to unpack wave %lu, uri='%s'",index,uri_str); if(err) { g_set_error(err, error_domain, /* errorcode= */0, "Failed to unpack wave %lu, uri='%s'",index,uri_str); } goto Done; WaveLoadingError: GST_WARNING("Failed to load wave %lu, uri='%s'",index,uri); if(err) { g_set_error(err, error_domain, /* errorcode= */0, "Failed to load wave %lu, uri='%s'",index,uri); } goto Done; } static void bt_wave_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_wave_persistence_load; iface->save = bt_wave_persistence_save; } //-- wrapper //-- g_object overrides static void bt_wave_constructed(GObject *object) { BtWave *self=BT_WAVE(object); gboolean okay=TRUE; if(G_OBJECT_CLASS(bt_wave_parent_class)->constructed) G_OBJECT_CLASS(bt_wave_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); // some SongIO loaders load the wave themself and set the data if(self->priv->uri) { // @todo: move stuff from bt_wave_persistence_load() into bt_wave_load_from_uri() // try to load wavedata if(!bt_wave_load_from_uri(self,self->priv->uri)) { GST_WARNING("Can't load wavedata from %s",self->priv->uri); okay=FALSE; } } if(okay) { BtWavetable *wavetable; // add the wave to the wavetable of the song g_object_get((gpointer)(self->priv->song),"wavetable",&wavetable,NULL); bt_wavetable_add_wave(wavetable,self); g_object_unref(wavetable); } } /* returns a property for the given property_id for this object */ static void bt_wave_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtWave * const self = BT_WAVE(object); return_if_disposed(); switch (property_id) { case WAVE_SONG: { g_value_set_object(value, self->priv->song); } break; case WAVE_WAVELEVELS: { g_value_set_pointer(value,g_list_copy(self->priv->wavelevels)); } break; case WAVE_INDEX: { g_value_set_ulong(value, self->priv->index); } break; case WAVE_NAME: { g_value_set_string(value, self->priv->name); } break; case WAVE_URI: { g_value_set_string(value, self->priv->uri); } break; case WAVE_VOLUME: { g_value_set_double(value, self->priv->volume); } break; case WAVE_LOOP_MODE: { g_value_set_enum(value, self->priv->loop_mode); } break; case WAVE_CHANNELS: { g_value_set_uint(value, self->priv->channels); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_wave_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtWave * const self = BT_WAVE(object); return_if_disposed(); switch (property_id) { case WAVE_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for wave: %p",self->priv->song); } break; case WAVE_INDEX: { self->priv->index = g_value_get_ulong(value); GST_DEBUG("set the index for wave: %lu",self->priv->index); } break; case WAVE_NAME: { g_free(self->priv->name); self->priv->name = g_value_dup_string(value); GST_DEBUG("set the name for wave: %s",self->priv->name); } break; case WAVE_URI: { g_free(self->priv->uri); self->priv->uri = g_value_dup_string(value); GST_DEBUG("set the uri for wave: %s",self->priv->uri); } break; case WAVE_VOLUME: { self->priv->volume = g_value_get_double(value); } break; case WAVE_LOOP_MODE: { self->priv->loop_mode = g_value_get_enum(value); } break; case WAVE_CHANNELS: { self->priv->channels = g_value_get_uint(value); GST_DEBUG("set the channels for wave: %d",self->priv->channels); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wave_dispose(GObject * const object) { const BtWave * const self = BT_WAVE(object); GList* node; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); // unref list of wavelevels if(self->priv->wavelevels) { for(node=self->priv->wavelevels;node;node=g_list_next(node)) { GST_DEBUG(" free wavelevels : %p (%d)",node->data,G_OBJECT_REF_COUNT(node->data)); g_object_try_unref(node->data); node->data=NULL; } } wave_loader_free(self); G_OBJECT_CLASS(bt_wave_parent_class)->dispose(object); } static void bt_wave_finalize(GObject * const object) { const BtWave * const self = BT_WAVE(object); GST_DEBUG("!!!! self=%p",self); // free list of wavelevels if(self->priv->wavelevels) { g_list_free(self->priv->wavelevels); self->priv->wavelevels=NULL; } g_free(self->priv->name); g_free(self->priv->uri); G_OBJECT_CLASS(bt_wave_parent_class)->finalize(object); } //-- class internals static void bt_wave_init(BtWave *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WAVE, BtWavePrivate); self->priv->volume=1.0; self->priv->fd=-1; self->priv->ext_fd=-1; } static void bt_wave_class_init(BtWaveClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); error_domain=g_type_qname(BT_TYPE_WAVE); g_type_class_add_private(klass,sizeof(BtWavePrivate)); gobject_class->constructed = bt_wave_constructed; gobject_class->set_property = bt_wave_set_property; gobject_class->get_property = bt_wave_get_property; gobject_class->dispose = bt_wave_dispose; gobject_class->finalize = bt_wave_finalize; /** * BtWave::loading-done: * @self: the setup object that emitted the signal * @success: the result * * Loading the sample has finished with @result. */ signals[LOADING_DONE_EVENT] = g_signal_new("loading-done", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, // return type 1, // n_params G_TYPE_BOOLEAN // param data ); g_object_class_install_property(gobject_class,WAVE_SONG, g_param_spec_object("song", "song contruct prop", "Set song object, the wave belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_WAVELEVELS, g_param_spec_pointer("wavelevels", "wavelevels list prop", "A copy of the list of wavelevels", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_INDEX, g_param_spec_ulong("index", "index prop", "The index of the wave in the wavtable", 0, G_MAXULONG, 0, /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_NAME, g_param_spec_string("name", "name prop", "The name of the wave", "unamed wave", /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_URI, g_param_spec_string("uri", "uri prop", "The uri of the wave", NULL, /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_VOLUME, g_param_spec_double("volume", "volume prop", "The volume of the wave in the wavtable", 0, 1.0, 1.0, /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_LOOP_MODE, g_param_spec_enum("loop-mode", "loop-mode prop", "mode of loop playback", BT_TYPE_WAVE_LOOP_MODE, /* enum type */ BT_WAVE_LOOP_MODE_OFF, /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WAVE_CHANNELS, g_param_spec_uint("channels", "channels prop", "number of channels in the sample", 0, 2, 0, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/core_private.h0000644042355400116100000000555211576360371015451 00000000000000/* $Id: core_private.h 2845 2010-05-04 09:17:32Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CORE_PRIVATE_H #define BT_CORE_PRIVATE_H #ifdef HAVE_CONFIG_H # include "config.h" #endif //-- ansi c #define __USE_ISOC99 /* for isinf() and co. */ #include #include #include #include #include #include //#define _XOPEN_SOURCE /* glibc2 needs this */ #define __USE_XOPEN #include #include #include #include #include //-- locale #ifdef HAVE_X11_XLOCALE_H /* defines a more portable setlocale for X11 (_Xsetlocale) */ #include #else #include #endif //-- libxml2 #include #include #include #include #include //-- i18n #ifndef _ #ifdef ENABLE_NLS #include #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define __(String) (String) #define N_(String) (String) #ifdef gettext #undef gettext #endif #define gettext(String) (String) #ifdef dgettext #undef dgettext #endif #define dgettext(Domain,String) (String) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #endif //-- gconf #ifdef USE_GCONF #include #endif #include "libbuzztard-core/core.h" #include "marshal.h" #include "version.h" /** * bt_default_caps: * * Default caps to avoid plugging converters. Used in #BtWires and #BtMachines. */ extern GstCaps *bt_default_caps; //-- defines for workarounds --------------------------------------------------- /** * XML_CHAR_PTR: * @str: the string to cast * * Cast to xmlChar* */ #define XML_CHAR_PTR(str) ((xmlChar *)(str)) #define GST_CAT_DEFAULT bt_core_debug #ifndef BT_CORE_C GST_DEBUG_CATEGORY_EXTERN(GST_CAT_DEFAULT); #endif #endif // BT_CORE_PRIVATE_H buzztard-0.6.0/src/lib/core/Makefile.in0000644042355400116100000021766111675570634014676 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/lib/core DIST_COMMON = $(am__dist_gir_DATA_DIST) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libbuzztard-core.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = libbuzztard-core.pc CONFIG_CLEAN_VPATH_FILES = 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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibsdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libbuzztard_core_la_DEPENDENCIES = \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) am__libbuzztard_core_la_SOURCES_DIST = core.c libbuzztard-core/core.h \ tools.c libbuzztard-core/tools.h libbuzztard-core/version.h \ buzzcallbacks.c application.c libbuzztard-core/application.h \ childproxy.c libbuzztard-core/childproxy.h gconf-settings.c \ libbuzztard-core/gconf-settings.h machine.c \ libbuzztard-core/machine.h pattern.c \ libbuzztard-core/pattern.h persistence.c \ libbuzztard-core/persistence.h processor-machine.c \ libbuzztard-core/processor-machine.h sequence.c \ libbuzztard-core/sequence.h settings.c \ libbuzztard-core/settings.h \ libbuzztard-core/settings-private.h setup.c \ libbuzztard-core/setup.h sink-bin.c \ libbuzztard-core/sink-bin.h sink-machine.c \ libbuzztard-core/sink-machine.h song.c libbuzztard-core/song.h \ song-info.c libbuzztard-core/song-info.h song-io.c \ libbuzztard-core/song-io.h song-io-native.c \ libbuzztard-core/song-io-native.h song-io-native-bzt.c \ libbuzztard-core/song-io-native-bzt.h song-io-native-xml.c \ libbuzztard-core/song-io-native-xml.h source-machine.c \ libbuzztard-core/source-machine.h wavetable.c \ libbuzztard-core/wavetable.h wave.c libbuzztard-core/wave.h \ wavelevel.c libbuzztard-core/wavelevel.h wire.c \ libbuzztard-core/wire.h wire-pattern.c \ libbuzztard-core/wire-pattern.h marshal.h marshal.c @USE_GCONF_TRUE@am__objects_1 = libbuzztard_core_la-gconf-settings.lo am__objects_2 = libbuzztard_core_la-marshal.lo am_libbuzztard_core_la_OBJECTS = libbuzztard_core_la-core.lo \ libbuzztard_core_la-tools.lo \ libbuzztard_core_la-buzzcallbacks.lo \ libbuzztard_core_la-application.lo \ libbuzztard_core_la-childproxy.lo $(am__objects_1) \ libbuzztard_core_la-machine.lo libbuzztard_core_la-pattern.lo \ libbuzztard_core_la-persistence.lo \ libbuzztard_core_la-processor-machine.lo \ libbuzztard_core_la-sequence.lo \ libbuzztard_core_la-settings.lo libbuzztard_core_la-setup.lo \ libbuzztard_core_la-sink-bin.lo \ libbuzztard_core_la-sink-machine.lo \ libbuzztard_core_la-song.lo libbuzztard_core_la-song-info.lo \ libbuzztard_core_la-song-io.lo \ libbuzztard_core_la-song-io-native.lo \ libbuzztard_core_la-song-io-native-bzt.lo \ libbuzztard_core_la-song-io-native-xml.lo \ libbuzztard_core_la-source-machine.lo \ libbuzztard_core_la-wavetable.lo libbuzztard_core_la-wave.lo \ libbuzztard_core_la-wavelevel.lo libbuzztard_core_la-wire.lo \ libbuzztard_core_la-wire-pattern.lo $(am__objects_2) libbuzztard_core_la_OBJECTS = $(am_libbuzztard_core_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent libbuzztard_core_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libbuzztard_core_la_CFLAGS) $(CFLAGS) \ $(libbuzztard_core_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbuzztard_core_la_SOURCES) DIST_SOURCES = $(am__libbuzztard_core_la_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive am__dist_gir_DATA_DIST = BuzztardCore-0.0.gir DATA = $(dist_gir_DATA) $(pkgconfig_DATA) $(typelibs_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = libbuzztard-core @USE_GCONF_FALSE@GCONF_SETTINGS_SRC = @USE_GCONF_TRUE@GCONF_SETTINGS_SRC = gconf-settings.c libbuzztard-core/gconf-settings.h # these sources (also mentioned above) are generated. BUILT_SOURCES = marshal.h marshal.c lib_LTLIBRARIES = libbuzztard-core.la libbuzztard_core_la_LIBADD = \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) \ -lgstaudio-0.10 -lgstpbutils-0.10 libbuzztard_core_la_LDFLAGS = \ $(BT_LDFLAGS) \ -export-symbols-regex ^_?\(bt_\|Bt\|BT_\).* \ -version-info @BT_VERSION_INFO@ libbuzztard_core_la_SOURCES = \ core.c libbuzztard-core/core.h \ tools.c libbuzztard-core/tools.h \ libbuzztard-core/version.h \ buzzcallbacks.c \ \ application.c libbuzztard-core/application.h\ childproxy.c libbuzztard-core/childproxy.h\ $(GCONF_SETTINGS_SRC) \ machine.c libbuzztard-core/machine.h \ pattern.c libbuzztard-core/pattern.h \ persistence.c libbuzztard-core/persistence.h \ processor-machine.c libbuzztard-core/processor-machine.h \ sequence.c libbuzztard-core/sequence.h \ settings.c libbuzztard-core/settings.h libbuzztard-core/settings-private.h \ setup.c libbuzztard-core/setup.h \ sink-bin.c libbuzztard-core/sink-bin.h \ sink-machine.c libbuzztard-core/sink-machine.h \ song.c libbuzztard-core/song.h \ song-info.c libbuzztard-core/song-info.h \ song-io.c libbuzztard-core/song-io.h \ song-io-native.c libbuzztard-core/song-io-native.h \ song-io-native-bzt.c libbuzztard-core/song-io-native-bzt.h \ song-io-native-xml.c libbuzztard-core/song-io-native-xml.h \ source-machine.c libbuzztard-core/source-machine.h \ wavetable.c libbuzztard-core/wavetable.h \ wave.c libbuzztard-core/wave.h \ wavelevel.c libbuzztard-core/wavelevel.h \ wire.c libbuzztard-core/wire.h \ wire-pattern.c libbuzztard-core/wire-pattern.h \ \ $(BUILT_SOURCES) # yet unused sources # plainfile-settings.c libbuzztard-core/plainfile-settings.h \ # libbuzztard_core_la_CFLAGS = \ -I$(builddir)/libbuzztard-core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) noinst_HEADERS = core_private.h marshal.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libbuzztard-core.pc @USE_GIR_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libbuzztard_core_la_SOURCES)) @USE_GIR_FALSE@BUILT_GIRSOURCES = @USE_GIR_TRUE@BUILT_GIRSOURCES = BuzztardCore-0.0.gir @USE_GIR_TRUE@girdir = $(datadir)/gir @USE_GIR_TRUE@dist_gir_DATA = $(BUILT_GIRSOURCES) @USE_GIR_TRUE@typelibsdir = $(libdir)/girepository @USE_GIR_TRUE@typelibs_DATA = $(dist_gir_DATA:.gir=.typelib) @USE_GIR_TRUE@TXML = $(dist_gir_DATA:.gir=.gir.txml) EXTRA_DIST = \ libbuzztard-core.pc.in \ marshal.list # CLEANFILES is for files generated by make CLEANFILES = marshal.c marshal.h \ $(pkgconfig_DATA) \ $(typelibs_DATA) $(TXML) \ $(BUILT_GIRSOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .c .gir .lo .o .obj .typelib $(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 src/lib/core/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/core/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): libbuzztard-core.pc: $(top_builddir)/config.status $(srcdir)/libbuzztard-core.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @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 " $(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)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbuzztard-core.la: $(libbuzztard_core_la_OBJECTS) $(libbuzztard_core_la_DEPENDENCIES) $(AM_V_CCLD)$(libbuzztard_core_la_LINK) -rpath $(libdir) $(libbuzztard_core_la_OBJECTS) $(libbuzztard_core_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-buzzcallbacks.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-childproxy.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-core.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-gconf-settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-marshal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-persistence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-processor-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-settings.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-setup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-sink-bin.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-sink-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song-info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song-io-native-bzt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song-io-native-xml.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song-io-native.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song-io.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-song.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-source-machine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-wave.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-wavelevel.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-wavetable.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-wire-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_core_la-wire.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libbuzztard_core_la-core.lo: core.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-core.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-core.Tpo -c -o libbuzztard_core_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-core.Tpo $(DEPDIR)/libbuzztard_core_la-core.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='core.c' object='libbuzztard_core_la-core.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-core.lo `test -f 'core.c' || echo '$(srcdir)/'`core.c libbuzztard_core_la-tools.lo: tools.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-tools.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-tools.Tpo -c -o libbuzztard_core_la-tools.lo `test -f 'tools.c' || echo '$(srcdir)/'`tools.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-tools.Tpo $(DEPDIR)/libbuzztard_core_la-tools.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tools.c' object='libbuzztard_core_la-tools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-tools.lo `test -f 'tools.c' || echo '$(srcdir)/'`tools.c libbuzztard_core_la-buzzcallbacks.lo: buzzcallbacks.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-buzzcallbacks.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-buzzcallbacks.Tpo -c -o libbuzztard_core_la-buzzcallbacks.lo `test -f 'buzzcallbacks.c' || echo '$(srcdir)/'`buzzcallbacks.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-buzzcallbacks.Tpo $(DEPDIR)/libbuzztard_core_la-buzzcallbacks.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='buzzcallbacks.c' object='libbuzztard_core_la-buzzcallbacks.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-buzzcallbacks.lo `test -f 'buzzcallbacks.c' || echo '$(srcdir)/'`buzzcallbacks.c libbuzztard_core_la-application.lo: application.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-application.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-application.Tpo -c -o libbuzztard_core_la-application.lo `test -f 'application.c' || echo '$(srcdir)/'`application.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-application.Tpo $(DEPDIR)/libbuzztard_core_la-application.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='application.c' object='libbuzztard_core_la-application.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-application.lo `test -f 'application.c' || echo '$(srcdir)/'`application.c libbuzztard_core_la-childproxy.lo: childproxy.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-childproxy.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-childproxy.Tpo -c -o libbuzztard_core_la-childproxy.lo `test -f 'childproxy.c' || echo '$(srcdir)/'`childproxy.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-childproxy.Tpo $(DEPDIR)/libbuzztard_core_la-childproxy.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='childproxy.c' object='libbuzztard_core_la-childproxy.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-childproxy.lo `test -f 'childproxy.c' || echo '$(srcdir)/'`childproxy.c libbuzztard_core_la-gconf-settings.lo: gconf-settings.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-gconf-settings.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-gconf-settings.Tpo -c -o libbuzztard_core_la-gconf-settings.lo `test -f 'gconf-settings.c' || echo '$(srcdir)/'`gconf-settings.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-gconf-settings.Tpo $(DEPDIR)/libbuzztard_core_la-gconf-settings.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gconf-settings.c' object='libbuzztard_core_la-gconf-settings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-gconf-settings.lo `test -f 'gconf-settings.c' || echo '$(srcdir)/'`gconf-settings.c libbuzztard_core_la-machine.lo: 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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-machine.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-machine.Tpo -c -o libbuzztard_core_la-machine.lo `test -f 'machine.c' || echo '$(srcdir)/'`machine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-machine.Tpo $(DEPDIR)/libbuzztard_core_la-machine.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='machine.c' object='libbuzztard_core_la-machine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-machine.lo `test -f 'machine.c' || echo '$(srcdir)/'`machine.c libbuzztard_core_la-pattern.lo: 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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-pattern.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-pattern.Tpo -c -o libbuzztard_core_la-pattern.lo `test -f 'pattern.c' || echo '$(srcdir)/'`pattern.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-pattern.Tpo $(DEPDIR)/libbuzztard_core_la-pattern.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pattern.c' object='libbuzztard_core_la-pattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-pattern.lo `test -f 'pattern.c' || echo '$(srcdir)/'`pattern.c libbuzztard_core_la-persistence.lo: persistence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-persistence.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-persistence.Tpo -c -o libbuzztard_core_la-persistence.lo `test -f 'persistence.c' || echo '$(srcdir)/'`persistence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-persistence.Tpo $(DEPDIR)/libbuzztard_core_la-persistence.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='persistence.c' object='libbuzztard_core_la-persistence.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-persistence.lo `test -f 'persistence.c' || echo '$(srcdir)/'`persistence.c libbuzztard_core_la-processor-machine.lo: processor-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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-processor-machine.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-processor-machine.Tpo -c -o libbuzztard_core_la-processor-machine.lo `test -f 'processor-machine.c' || echo '$(srcdir)/'`processor-machine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-processor-machine.Tpo $(DEPDIR)/libbuzztard_core_la-processor-machine.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='processor-machine.c' object='libbuzztard_core_la-processor-machine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-processor-machine.lo `test -f 'processor-machine.c' || echo '$(srcdir)/'`processor-machine.c libbuzztard_core_la-sequence.lo: sequence.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-sequence.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-sequence.Tpo -c -o libbuzztard_core_la-sequence.lo `test -f 'sequence.c' || echo '$(srcdir)/'`sequence.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-sequence.Tpo $(DEPDIR)/libbuzztard_core_la-sequence.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sequence.c' object='libbuzztard_core_la-sequence.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-sequence.lo `test -f 'sequence.c' || echo '$(srcdir)/'`sequence.c libbuzztard_core_la-settings.lo: settings.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-settings.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-settings.Tpo -c -o libbuzztard_core_la-settings.lo `test -f 'settings.c' || echo '$(srcdir)/'`settings.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-settings.Tpo $(DEPDIR)/libbuzztard_core_la-settings.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='settings.c' object='libbuzztard_core_la-settings.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-settings.lo `test -f 'settings.c' || echo '$(srcdir)/'`settings.c libbuzztard_core_la-setup.lo: setup.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-setup.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-setup.Tpo -c -o libbuzztard_core_la-setup.lo `test -f 'setup.c' || echo '$(srcdir)/'`setup.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-setup.Tpo $(DEPDIR)/libbuzztard_core_la-setup.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='setup.c' object='libbuzztard_core_la-setup.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-setup.lo `test -f 'setup.c' || echo '$(srcdir)/'`setup.c libbuzztard_core_la-sink-bin.lo: sink-bin.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-sink-bin.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-sink-bin.Tpo -c -o libbuzztard_core_la-sink-bin.lo `test -f 'sink-bin.c' || echo '$(srcdir)/'`sink-bin.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-sink-bin.Tpo $(DEPDIR)/libbuzztard_core_la-sink-bin.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sink-bin.c' object='libbuzztard_core_la-sink-bin.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-sink-bin.lo `test -f 'sink-bin.c' || echo '$(srcdir)/'`sink-bin.c libbuzztard_core_la-sink-machine.lo: sink-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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-sink-machine.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-sink-machine.Tpo -c -o libbuzztard_core_la-sink-machine.lo `test -f 'sink-machine.c' || echo '$(srcdir)/'`sink-machine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-sink-machine.Tpo $(DEPDIR)/libbuzztard_core_la-sink-machine.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='sink-machine.c' object='libbuzztard_core_la-sink-machine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-sink-machine.lo `test -f 'sink-machine.c' || echo '$(srcdir)/'`sink-machine.c libbuzztard_core_la-song.lo: song.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song.Tpo -c -o libbuzztard_core_la-song.lo `test -f 'song.c' || echo '$(srcdir)/'`song.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song.Tpo $(DEPDIR)/libbuzztard_core_la-song.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song.c' object='libbuzztard_core_la-song.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song.lo `test -f 'song.c' || echo '$(srcdir)/'`song.c libbuzztard_core_la-song-info.lo: song-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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song-info.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song-info.Tpo -c -o libbuzztard_core_la-song-info.lo `test -f 'song-info.c' || echo '$(srcdir)/'`song-info.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song-info.Tpo $(DEPDIR)/libbuzztard_core_la-song-info.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song-info.c' object='libbuzztard_core_la-song-info.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song-info.lo `test -f 'song-info.c' || echo '$(srcdir)/'`song-info.c libbuzztard_core_la-song-io.lo: song-io.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song-io.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song-io.Tpo -c -o libbuzztard_core_la-song-io.lo `test -f 'song-io.c' || echo '$(srcdir)/'`song-io.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song-io.Tpo $(DEPDIR)/libbuzztard_core_la-song-io.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song-io.c' object='libbuzztard_core_la-song-io.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song-io.lo `test -f 'song-io.c' || echo '$(srcdir)/'`song-io.c libbuzztard_core_la-song-io-native.lo: song-io-native.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song-io-native.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song-io-native.Tpo -c -o libbuzztard_core_la-song-io-native.lo `test -f 'song-io-native.c' || echo '$(srcdir)/'`song-io-native.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song-io-native.Tpo $(DEPDIR)/libbuzztard_core_la-song-io-native.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song-io-native.c' object='libbuzztard_core_la-song-io-native.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song-io-native.lo `test -f 'song-io-native.c' || echo '$(srcdir)/'`song-io-native.c libbuzztard_core_la-song-io-native-bzt.lo: song-io-native-bzt.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song-io-native-bzt.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song-io-native-bzt.Tpo -c -o libbuzztard_core_la-song-io-native-bzt.lo `test -f 'song-io-native-bzt.c' || echo '$(srcdir)/'`song-io-native-bzt.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song-io-native-bzt.Tpo $(DEPDIR)/libbuzztard_core_la-song-io-native-bzt.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song-io-native-bzt.c' object='libbuzztard_core_la-song-io-native-bzt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song-io-native-bzt.lo `test -f 'song-io-native-bzt.c' || echo '$(srcdir)/'`song-io-native-bzt.c libbuzztard_core_la-song-io-native-xml.lo: song-io-native-xml.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-song-io-native-xml.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-song-io-native-xml.Tpo -c -o libbuzztard_core_la-song-io-native-xml.lo `test -f 'song-io-native-xml.c' || echo '$(srcdir)/'`song-io-native-xml.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-song-io-native-xml.Tpo $(DEPDIR)/libbuzztard_core_la-song-io-native-xml.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='song-io-native-xml.c' object='libbuzztard_core_la-song-io-native-xml.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-song-io-native-xml.lo `test -f 'song-io-native-xml.c' || echo '$(srcdir)/'`song-io-native-xml.c libbuzztard_core_la-source-machine.lo: source-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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-source-machine.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-source-machine.Tpo -c -o libbuzztard_core_la-source-machine.lo `test -f 'source-machine.c' || echo '$(srcdir)/'`source-machine.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-source-machine.Tpo $(DEPDIR)/libbuzztard_core_la-source-machine.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='source-machine.c' object='libbuzztard_core_la-source-machine.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-source-machine.lo `test -f 'source-machine.c' || echo '$(srcdir)/'`source-machine.c libbuzztard_core_la-wavetable.lo: wavetable.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-wavetable.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-wavetable.Tpo -c -o libbuzztard_core_la-wavetable.lo `test -f 'wavetable.c' || echo '$(srcdir)/'`wavetable.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-wavetable.Tpo $(DEPDIR)/libbuzztard_core_la-wavetable.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='wavetable.c' object='libbuzztard_core_la-wavetable.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-wavetable.lo `test -f 'wavetable.c' || echo '$(srcdir)/'`wavetable.c libbuzztard_core_la-wave.lo: 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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-wave.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-wave.Tpo -c -o libbuzztard_core_la-wave.lo `test -f 'wave.c' || echo '$(srcdir)/'`wave.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-wave.Tpo $(DEPDIR)/libbuzztard_core_la-wave.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='wave.c' object='libbuzztard_core_la-wave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-wave.lo `test -f 'wave.c' || echo '$(srcdir)/'`wave.c libbuzztard_core_la-wavelevel.lo: wavelevel.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-wavelevel.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-wavelevel.Tpo -c -o libbuzztard_core_la-wavelevel.lo `test -f 'wavelevel.c' || echo '$(srcdir)/'`wavelevel.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-wavelevel.Tpo $(DEPDIR)/libbuzztard_core_la-wavelevel.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='wavelevel.c' object='libbuzztard_core_la-wavelevel.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-wavelevel.lo `test -f 'wavelevel.c' || echo '$(srcdir)/'`wavelevel.c libbuzztard_core_la-wire.lo: wire.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-wire.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-wire.Tpo -c -o libbuzztard_core_la-wire.lo `test -f 'wire.c' || echo '$(srcdir)/'`wire.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-wire.Tpo $(DEPDIR)/libbuzztard_core_la-wire.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='wire.c' object='libbuzztard_core_la-wire.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-wire.lo `test -f 'wire.c' || echo '$(srcdir)/'`wire.c libbuzztard_core_la-wire-pattern.lo: wire-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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-wire-pattern.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-wire-pattern.Tpo -c -o libbuzztard_core_la-wire-pattern.lo `test -f 'wire-pattern.c' || echo '$(srcdir)/'`wire-pattern.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-wire-pattern.Tpo $(DEPDIR)/libbuzztard_core_la-wire-pattern.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='wire-pattern.c' object='libbuzztard_core_la-wire-pattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-wire-pattern.lo `test -f 'wire-pattern.c' || echo '$(srcdir)/'`wire-pattern.c libbuzztard_core_la-marshal.lo: 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) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -MT libbuzztard_core_la-marshal.lo -MD -MP -MF $(DEPDIR)/libbuzztard_core_la-marshal.Tpo -c -o libbuzztard_core_la-marshal.lo `test -f 'marshal.c' || echo '$(srcdir)/'`marshal.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_core_la-marshal.Tpo $(DEPDIR)/libbuzztard_core_la-marshal.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='marshal.c' object='libbuzztard_core_la-marshal.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_core_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_core_la-marshal.lo `test -f 'marshal.c' || echo '$(srcdir)/'`marshal.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_girDATA: $(dist_gir_DATA) @$(NORMAL_INSTALL) test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)" @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ 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-dist_girDATA: @$(NORMAL_UNINSTALL) @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(girdir)" && rm -f $$files install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ 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|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files install-typelibsDATA: $(typelibs_DATA) @$(NORMAL_INSTALL) test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ 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)$(typelibsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \ done uninstall-typelibsDATA: @$(NORMAL_UNINSTALL) @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_girDATA install-pkgconfigDATA \ install-typelibsDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES 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 -rf ./$(DEPDIR) -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-dist_girDATA uninstall-libLTLIBRARIES \ uninstall-pkgconfigDATA uninstall-typelibsDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check \ ctags-recursive install install-am install-strip \ tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_girDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ install-typelibsDATA 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-recursive \ uninstall uninstall-am uninstall-dist_girDATA \ uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ uninstall-typelibsDATA marshal.h: marshal.list glib-genmarshal --header --prefix=bt_marshal $(srcdir)/marshal.list > marshal.h marshal.c: marshal.list glib-genmarshal --body --prefix=bt_marshal $(srcdir)/marshal.list > marshal.c @USE_GIR_TRUE@BuzztardCore-0.0.gir: $(G_IR_SCANNER) libbuzztard-core.la @USE_GIR_TRUE@ -$(AM_V_GEN)$(G_IR_SCANNER) -v \ @USE_GIR_TRUE@ --namespace=BuzztardCore \ @USE_GIR_TRUE@ --nsversion 0.0 \ @USE_GIR_TRUE@ -I$(builddir)/libbuzztard-core \ @USE_GIR_TRUE@ -I$(srcdir) \ @USE_GIR_TRUE@ -I$(srcdir)/libbuzztard_core/ \ @USE_GIR_TRUE@ -I$(top_srcdir)/src/lib/ic/libbuzztard-ic/ \ @USE_GIR_TRUE@ --add-include-path=$(top_srcdir)/src/lib/ic/ \ @USE_GIR_TRUE@ --identifier-prefix=Bt \ @USE_GIR_TRUE@ --symbol-prefix=bt \ @USE_GIR_TRUE@ --c-include='libbuzztard-core/core.h' \ @USE_GIR_TRUE@ --include=GLib-2.0 \ @USE_GIR_TRUE@ --include=GObject-2.0 \ @USE_GIR_TRUE@ --include=Gst-0.10 \ @USE_GIR_TRUE@ --include=libxml2-2.0 \ @USE_GIR_TRUE@ --include=BuzztardIc-0.0 \ @USE_GIR_TRUE@ --library=libbuzztard-core.la \ @USE_GIR_TRUE@ --libtool="$(top_builddir)/libtool" \ @USE_GIR_TRUE@ --pkg glib-2.0 \ @USE_GIR_TRUE@ --pkg gobject-2.0 \ @USE_GIR_TRUE@ --pkg libgstbuzztard \ @USE_GIR_TRUE@ --pkg libxml-2.0 \ @USE_GIR_TRUE@ --pkg gstreamer-0.10 \ @USE_GIR_TRUE@ --pkg-export libbuzztard-core \ @USE_GIR_TRUE@ --add-init-section="bt_init(NULL,NULL);" \ @USE_GIR_TRUE@ --output $@ \ @USE_GIR_TRUE@ $(gir_sources) || touch $@ @USE_GIR_TRUE@.gir.typelib: @USE_GIR_TRUE@ -$(AM_V_GEN)$(G_IR_COMPILER) --includedir=. --includedir=../ic $(G_IR_COMPILER_OPTS) $< -o $@ || touch $@ .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) -I$(top_srcdir)/src/lib/ic $(libbtcore_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/lib/core/sequence.c0000644042355400116100000026352411634646053014576 00000000000000/* $Id: sequence.c 3645 2011-09-16 13:16:25Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsequence * @short_description: class for the event timeline of a #BtSong instance * * A sequence holds grid of #BtPatterns, with labels on the time axis and * #BtMachine instances on the track axis. It tracks first and last use of * patterns and provides two signals for notification - * #BtSequence::pattern-added and #BtSequence::pattern-removed. * * It supports looping a section of the sequence (see #BtSequence:loop, * #BtSequence:loop-start, #BtSequence:loop-end). * * The #BtSequence manages the #GstController event queues for the #BtMachines * and #BtWires. * It uses a damage-repair based two phase algorithm to update the controller * queues whenever patterns or the sequence changes. */ /* @todo: introduce a BtTrack object * - the sequence will have a list of tracks * - each track has a machine and a array with patterns * - this makes it easier to e.g. pass old track data to track-removed * - also insert/delete can be done per track * - need to be careful to make getting the pattern not slow */ #define BT_CORE #define BT_SEQUENCE_C #include "core_private.h" //-- signal ids enum { PATTERN_ADDED_EVENT, PATTERN_REMOVED_EVENT, SEQUENCE_ROWS_CHANGED_EVENT, TRACK_ADDED_EVENT, TRACK_REMOVED_EVENT, LAST_SIGNAL }; //-- property ids enum { SEQUENCE_SONG=1, SEQUENCE_LENGTH, SEQUENCE_TRACKS, SEQUENCE_LOOP, SEQUENCE_LOOP_START, SEQUENCE_LOOP_END, SEQUENCE_PROPERTIES }; struct _BtSequencePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the sequence belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the number of timeline entries */ gulong length; /* the number of tracks */ gulong tracks; /* loop mode on/off */ gboolean loop; /* the timeline entries where the loop starts and ends * -1 for both mean to use 0...length */ glong loop_start,loop_end; /* machine entries that are the heading of the sequence */ BtMachine **machines; /* label entries that are the description of the time axis */ gchar **labels; /* * BtPattern pointers */ BtPattern **patterns; /* playback range variables */ gulong play_start,play_end; /* cached */ GstClockTime wait_per_position; /* manages damage regions for updating gst-controller queues after changes * each entry (per machine) has another GHashTable * each entry (per parameter) has another GHashTable * with time:changed * @todo: there is quite some overhead because of the nested HashTables * and because of repeted lookups in repair_{global,voice,wire}_damage_entry: * - maybe we could have this instead: * each entry (per machine) has another GHashTable * each entry (per time) has list of changed parameters * - the list of changed parameters could be a fixed bit-array, allocated on * first use * - benefits would be * - one less hashtable (but then the array) * - repair_damage could do the prev-pattern lookup once and reuse for each * changed parameter */ GHashTable *damage; /* we cache the number of time a pattern is referenced. This way way we have a * fast bt_sequence_is_pattern_used() and we can lower the ref-count of the * pattern. We will also add singals to notify on first use and after last * use. */ GHashTable *pattern_usage; /* (ui) properties */ GHashTable *properties; }; static guint signals[LAST_SIGNAL]={0,}; //-- prototypes static void bt_sequence_on_pattern_global_param_changed(const BtPattern * const pattern, const gulong tick, const gulong param, gconstpointer user_data); static void bt_sequence_on_pattern_voice_param_changed(const BtPattern * const pattern, const gulong tick, const gulong voice, const gulong param, gconstpointer user_data); static void bt_sequence_on_pattern_changed(const BtPattern * const pattern, const gboolean intermediate, gconstpointer user_data); static void bt_sequence_on_wire_pattern_wire_param_changed(const BtWirePattern * const wire_pattern, const gulong tick, const BtWire * const wire, const gulong param, gconstpointer user_data); static void bt_sequence_on_wire_pattern_changed(const BtWirePattern * const wire_pattern, const gboolean intermediate, gconstpointer user_data); static void on_wire_pattern_added(BtWire *wire,BtWirePattern *wire_pattern,gpointer user_data); //-- the class static void bt_sequence_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSequence, bt_sequence, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_sequence_persistence_interface_init)); //-- helper methods /* * bt_sequence_get_number_of_pattern_uses: * @self: the sequence to count the patterns in * @pattern: the pattern to check for * * Determine the number of times a pattern is in use. * * Returns: the pattern count */ static inline gulong bt_sequence_get_number_of_pattern_uses(const BtSequence * const self,const BtPattern * const pattern) { return(GPOINTER_TO_UINT(g_hash_table_lookup(self->priv->pattern_usage,pattern))); } /* * bt_sequence_test_pattern: * @self: the #BtSequence that holds the patterns * @time: the requested time position * @track: the requested track index * * Checks if there is any pattern at the given location. * Avoides the reffing overhead of bt_sequence_get_pattern(). * * Returns: %TRUE if there is a pattern at the given location */ static inline gboolean bt_sequence_test_pattern(const BtSequence * const self, const gulong time, const gulong track) { /*g_return_val_if_fail(BT_IS_SEQUENCE(self),FALSE); g_return_val_if_fail(timepriv->length,FALSE); g_return_val_if_fail(trackpriv->tracks,FALSE); */ return(self->priv->patterns[time*self->priv->tracks+track]!=NULL); } static void bt_sequence_use_pattern(const BtSequence * const self, BtPattern *pattern) { guint count=bt_sequence_get_number_of_pattern_uses(self,pattern); GST_DEBUG("init for new pattern %p",pattern); // update use count g_hash_table_insert(self->priv->pattern_usage,(gpointer)pattern,GUINT_TO_POINTER(count+1)); // check if this is the first usage if(count==0) { BtMachine *machine; BtWire *wire; BtWirePattern *wire_pattern; GList *node; // take one shared ref g_object_ref(pattern); // attach a signal handlers g_signal_connect(pattern,"global-param-changed",G_CALLBACK(bt_sequence_on_pattern_global_param_changed),(gpointer)self); g_signal_connect(pattern,"voice-param-changed",G_CALLBACK(bt_sequence_on_pattern_voice_param_changed),(gpointer)self); g_signal_connect(pattern,"pattern-changed",G_CALLBACK(bt_sequence_on_pattern_changed),(gpointer)self); g_object_get(pattern,"machine",&machine,NULL); for(node=machine->dst_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); if((wire_pattern=bt_wire_get_pattern(wire,pattern))) { g_signal_connect(wire_pattern,"param-changed",G_CALLBACK(bt_sequence_on_wire_pattern_wire_param_changed),(gpointer)self); g_signal_connect(wire_pattern,"pattern-changed",G_CALLBACK(bt_sequence_on_wire_pattern_changed),(gpointer)self); g_object_unref(wire_pattern); } else { // we need to wait for the first wire-pattern g_signal_connect(wire,"pattern-created",G_CALLBACK(on_wire_pattern_added),(gpointer)self); } } g_object_unref(machine); g_signal_emit((gpointer)self,signals[PATTERN_ADDED_EVENT],0,pattern); } } static void bt_sequence_unuse_pattern(const BtSequence * const self, BtPattern *pattern) { guint count=bt_sequence_get_number_of_pattern_uses(self,pattern); GST_DEBUG("clean up for pattern %p",pattern); // check if this is the last usage if(count==1) { BtMachine *machine; BtWire *wire; BtWirePattern *wire_pattern; GList *node; // detach a signal handlers g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_pattern_global_param_changed,NULL); g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_pattern_voice_param_changed,NULL); g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_pattern_changed,NULL); g_object_get(pattern,"machine",&machine,NULL); if(machine) { for(node=machine->dst_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); if((wire_pattern=bt_wire_get_pattern(wire,pattern))) { g_signal_handlers_disconnect_matched(wire_pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_wire_pattern_wire_param_changed,NULL); g_signal_handlers_disconnect_matched(wire_pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_wire_pattern_changed,NULL); g_object_unref(wire_pattern); } } g_object_unref(machine); } g_signal_emit((gpointer)self,signals[PATTERN_REMOVED_EVENT],0,pattern); // release the shared ref g_object_unref(pattern); } // update use count if(count>0) { g_hash_table_insert(self->priv->pattern_usage,pattern,GUINT_TO_POINTER(count-1)); } else { GST_WARNING("use count for pattern %p, is 0 while we were expecting it to be >0",pattern); } } static BtPattern *bt_sequence_get_pattern_unchecked(const BtSequence * const self, const gulong time, const gulong track) { //GST_DEBUG("get pattern at time %d, track %d",time, track); return(self->priv->patterns[time*self->priv->tracks+track]); } static BtMachine *bt_sequence_get_machine_unchecked(const BtSequence * const self,const gulong track) { //GST_DEBUG("getting machine : %p,ref_ct=%d",self->priv->machines[track],(self->priv->machines[track]?G_OBJECT_REF_COUNT(self->priv->machines[track]):-1)); return(self->priv->machines[track]); } /* * bt_sequence_resize_data_length: * @self: the sequence to resize the length * @length: the old length * * Resizes the pattern data grid to the new length. Keeps previous values. */ static void bt_sequence_resize_data_length(const BtSequence * const self, const gulong old_length) { const gulong tracks=self->priv->tracks; const gulong new_length=self->priv->length; const gulong old_data_count=old_length*tracks; const gulong new_data_count=new_length*tracks; BtPattern ** const patterns=self->priv->patterns; gchar ** const labels=self->priv->labels; // allocate new space if((self->priv->patterns=(BtPattern **)g_try_new0(gpointer,new_data_count))) { if(patterns) { const gulong count=MIN(old_data_count,new_data_count); // copy old values over memcpy(self->priv->patterns,patterns,count*sizeof(gpointer)); // free old data if(old_length>new_length) { gulong i,j,k; k=new_data_count; for(i=new_length;ipriv->tracks); } // allocate new space if((self->priv->labels=(gchar **)g_try_new0(gpointer,new_length))) { if(labels) { const gulong count=MIN(old_length,new_length); // copy old values over memcpy(self->priv->labels,labels,count*sizeof(gpointer)); // free old data if(old_length>new_length) { gulong i; for(i=new_length;ipriv->length; const gulong new_tracks=self->priv->tracks; //gulong old_data_count=length*old_tracks; const gulong new_data_count=length*new_tracks; BtPattern ** const patterns=self->priv->patterns; BtMachine ** const machines=self->priv->machines; const gulong count=MIN(old_tracks,self->priv->tracks); GST_DEBUG("resize tracks %lu -> %lu to new_data_count=%lu",old_tracks,new_tracks,new_data_count); // allocate new space if((self->priv->patterns=(BtPattern **)g_try_new0(GValue,new_data_count))) { if(patterns) { gulong i; BtPattern **src,**dst; // copy old values over src=patterns; dst=self->priv->patterns; for(i=0;ipriv->tracks]; } // free old data if(old_tracks>new_tracks) { gulong j,k; for(i=0;ipriv->length,new_tracks); } // allocate new space if(new_tracks) { if((self->priv->machines=(BtMachine **)g_try_new0(gpointer,new_tracks))) { if(machines) { // copy old values over memcpy(self->priv->machines,machines,count*sizeof(gpointer)); // free old data if(old_tracks>new_tracks) { gulong i; for(i=new_tracks;ipriv->machines=NULL; } else { GST_INFO("extending sequence machines from %lu to %lu failed",old_tracks,new_tracks); } } /* * bt_sequence_limit_play_pos_internal: * @self: the sequence to trim the play position of * * Enforce the playback position to be within loop start and end or the song * bounds if there is no loop. */ static void bt_sequence_limit_play_pos_internal(const BtSequence * const self) { gulong old_play_pos,new_play_pos; g_object_get(self->priv->song,"play-pos",&old_play_pos,NULL); new_play_pos=bt_sequence_limit_play_pos(self,old_play_pos); if(new_play_pos!=old_play_pos) { GST_WARNING("limit play pos: %lu -> %lu",old_play_pos,new_play_pos); g_object_set(self->priv->song,"play-pos",new_play_pos,NULL); } } /* * bt_sequence_damage_hash_free: * * Helper function to cleanup the damage hashtables * static void bt_sequence_damage_hash_free(gpointer user_data) { if(user_data) g_hash_table_destroy((GHashTable *)user_data); } */ static void bt_sequence_invalidate_param(const BtSequence * const self, const BtMachine * const machine, const gulong time, const gulong param) { GHashTable *hash,*param_hash=NULL; // mark region covered by change as damaged hash=g_hash_table_lookup(self->priv->damage,machine); if(!hash) { hash=g_hash_table_new_full(NULL,NULL,NULL,(GDestroyNotify)g_hash_table_destroy); g_hash_table_insert(self->priv->damage,(gpointer)machine,hash); } else { param_hash=g_hash_table_lookup(hash,GUINT_TO_POINTER(param)); } if(!param_hash) { param_hash=g_hash_table_new(NULL,NULL); g_hash_table_insert(hash,GUINT_TO_POINTER(param),param_hash); } g_hash_table_insert(param_hash,GUINT_TO_POINTER(time),GUINT_TO_POINTER(TRUE)); } /* * bt_sequence_invalidate_global_param: * * Marks the given tick for the global param of the given machine as invalid. */ static void bt_sequence_invalidate_global_param(const BtSequence * const self, const BtMachine * const machine, const gulong time, const gulong param) { bt_sequence_invalidate_param(self,machine,time,param); } /* * bt_sequence_invalidate_voice_param: * * Marks the given tick for the voice param of the given machine and voice as invalid. */ static void bt_sequence_invalidate_voice_param(const BtSequence * const self, const BtMachine * const machine, const gulong time, const gulong voice, const gulong param) { bt_sequence_invalidate_param(self,machine,time,param); } /* * bt_sequence_invalidate_wire_param: * * Marks the given tick for the wire param of the given machine and voice as invalid. */ static void bt_sequence_invalidate_wire_param(const BtSequence * const self, const BtMachine * const machine, const gulong time, const BtWire *wire, const gulong param) { bt_sequence_invalidate_param(self,machine,time,param); } /* * bt_sequence_invalidate_pattern_region: * @self: the sequence that hold the patterns * @time: the sequence time-offset of the pattern * @track: the track of the pattern * @pattern: the pattern that has been added or removed * * Calculated the damage region for the given pattern and location. * Adds the region to the repair-queue. * To determine the regio we need to check patterns before and after this * pattern to handle truncation. */ static void bt_sequence_invalidate_pattern_region(const BtSequence * const self, const gulong time, const gulong track, const BtPattern * const pattern) { const gulong sequence_length=self->priv->length; BtPattern *other_pattern=NULL; BtMachine *machine; BtWire *wire; BtWirePattern *wire_pattern; GList *node; gulong i,j,k; gulong pattern_length,damage_length,other_pattern_time=0; gulong global_params,voice_params,voices,wire_params; gulong param_offset; gulong start=0,length; GST_DEBUG("invalidate pattern %p region for tick=%5lu, track=%3lu",pattern,time,track); /* @todo: if we load a song and thus set a lot of patterns, this is called a * lot. While doing this, there are a few thing that don't change. If we set * 100 patterns for one machine, we query, the machine, its parameters and its * list of incoming wires (and its pattern) again and again. * * It also involves a lot of creating and destoying of hashtables */ /* determine region of change * pos track1 d1 track2 d2 track3 d3 track4 d4 * 0 + p2 + + p2 + * 1 | | | | * 2 | + p1 + # | + p1 + # * 3 | | | # | | | # * 4 + p1 + # + p1 + # | | | # | | | # * 5 | | # | | # | +----+ # | +----+ # * 6 | | # + p2 + | | | # | + p3 + * 7 +----+ # | |-+ +----+ # : | | * 8 : : : : : * * damage regions * track1(t=4,dl=4): 4...7 * p1 (t=4, l=4): 0...3 * track2(t=4,dl=2): 4...5 * p1 (t=4, l=4): 0...1 * p2 (t=6, l=-): ----- * track3(t=2,dl=6): 2...7 * p1 (t=2, l=4): 0...3 * p2 (t=0, l=8): 2...7 * track4(t=2,dl=4): 2...5 * p1 (t=2, l=4): 0...3 * p2 (t=0, l=-): ----- * p3 (t=6, l=-): ----- * * the global damage region is time pos of new pattern + damage-length. The * pattern below new pattern is never repaired (it truncates). The pattern * above is only involved if it would have enlarged the region (track 3,4): * pattern :0 ... MIN(pattern_length,damage_length) * other_pattern:(p1.t+p1+l)-p2.t ... damage_length */ g_object_get((gpointer)pattern,"length",&pattern_length,"machine",&machine,NULL); if(G_UNLIKELY(!pattern_length)) { g_object_unref(machine); GST_WARNING("pattern has length 0"); return; } g_assert(machine); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,"voices",&voices,NULL); damage_length=pattern_length; // check if from time-1 to 0 a pattern starts with a length that would reach over this pattern // and if so expand damage_length if(time>0) { gulong other_pattern_length; // for long sequences we could speedup by knwing the max-pattern-length per machine for(i=time,j=time-1;i>0;i--,j--) { if((other_pattern=bt_sequence_get_pattern_unchecked(self,j,track))) { other_pattern_time=j; g_object_get(other_pattern,"length",&other_pattern_length,NULL); if(j+other_pattern_length>time+damage_length) { damage_length=(j+other_pattern_length)-time; } else { // we don't need to check other_pattern for needed repairs other_pattern=NULL; } break; } } } // check if from time+1 to time+pattern_length another pattern starts (in this track) // and if so truncate damage_length for(i=1;((idst_wires;node;node=g_list_next(node),param_offset++) { wire=BT_WIRE(node->data); g_object_get(wire,"num-params",&wire_params,NULL); if((wire_pattern=bt_wire_get_pattern(wire,pattern))) { for(i=0;ipriv->tracks; glong i,j; GValue *value=NULL,*cur_value; BtPattern *pattern; GST_LOG("repair global damage entry for tick=%5lu",tick); // find all patterns with tick-offsets that are intersected by the tick of the damage for(i=0;ipriv->machines[i]==machine) { // go from tick position upwards to find pattern for track pattern=NULL; for(j=tick;j>=0;j--) { if((pattern=bt_sequence_get_pattern_unchecked(self,j,i))) break; } if(pattern) { gulong length,pos=tick-j; g_object_get(pattern,"length",&length,NULL); if(pospriv->tracks; glong i,j; GValue *value=NULL,*cur_value; BtPattern *pattern; GST_LOG("repair voice damage entry for tick=%5lu",tick); // find all patterns with tick-offsets that are intersected by the tick of the damage for(i=0;ipriv->machines[i]==machine) { // go from tick position upwards to find pattern for track pattern=NULL; for(j=tick;j>=0;j--) { if((pattern=bt_sequence_get_pattern_unchecked(self,j,i))) break; } if(pattern) { gulong length,pos=tick-j; g_object_get(pattern,"length",&length,NULL); if(pospriv->tracks; glong i,j; GValue *value=NULL,*cur_value; BtPattern *pattern; GST_LOG("repair wire damage entry for tick=%5lu",tick); // find all patterns with tick-offsets that are intersected by the tick of the damage for(i=0;ipriv->machines[i]==machine) { // go from tick position upwards to find pattern for track pattern=NULL; for(j=tick;j>=0;j--) { if((pattern=bt_sequence_get_pattern_unchecked(self,j,i))) break; } if(pattern) { gulong length,pos=tick-j; g_object_get(pattern,"length",&length,NULL); if(pospriv->song),"song-info",&song_info,NULL); g_object_get(song_info,"tpb",&ticks_per_beat,"bpm",&beats_per_minute,NULL); /* the number of pattern-events for one playline-step, * when using 4 ticks_per_beat then * for 4/4 bars it is 16 (standart dance rhythm) * for 3/4 bars it is 12 (walz) * correlation of values: * bpm 60 60 * tpb 4 8 * tpm 240 480 bpm*tpb * wpp 0.25 0.125 60/tpm */ const gdouble ticks_per_minute=(gdouble)(beats_per_minute*ticks_per_beat); self->priv->wait_per_position=(GstClockTime)(0.5+((GST_SECOND*60.0)/ticks_per_minute)); // release the references g_object_unref(song_info); GST_INFO("calculating songs bar-time %"G_GUINT64_FORMAT,self->priv->wait_per_position); } //-- event handler /* * bt_sequence_on_pattern_global_param_changed: * * Invalidate the global param change in all pattern uses. */ static void bt_sequence_on_pattern_global_param_changed(const BtPattern * const pattern, const gulong tick, const gulong param, gconstpointer user_data) { const BtSequence * const self=BT_SEQUENCE(user_data); const gulong tracks=self->priv->tracks; const gulong length=self->priv->length; BtMachine *this_machine; gulong i,j,k; g_object_get((gpointer)pattern,"machine",&this_machine,NULL); GST_INFO("pattern %p changed",pattern); // for all occurences of pattern for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtMachine *this_machine; gulong i,j,k; g_object_get((gpointer)pattern,"machine",&this_machine,NULL); // for all occurences of pattern for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtPattern *pattern; BtMachine *this_machine; gulong i,j,k; g_object_get((gpointer)wire_pattern,"pattern",&pattern,NULL); g_object_get(pattern,"machine",&this_machine,NULL); // for all occurences of pattern for(i=0;idst_wires;node;node=g_list_next(node),l++) { if(node->data==(gpointer)wire) break; } param_offset=(global_params+voices*voice_params)+(BT_WIRE_MAX_NUM_PARAMS*l); bt_sequence_invalidate_wire_param(self,this_machine,j+tick,wire,param_offset+param); } } } } } g_object_unref(this_machine); g_object_unref(pattern); // repair damage bt_sequence_repair_damage(self); } static void bt_sequence_on_pattern_changed(const BtPattern * const pattern, const gboolean intermediate, gconstpointer user_data) { const BtSequence * const self=BT_SEQUENCE(user_data); const gulong tracks=self->priv->tracks; const gulong length=self->priv->length; BtMachine *machine; gulong i,j; GST_DEBUG("repair damage after a pattern %p has been changed",pattern); g_object_get((gpointer)pattern,"machine",&machine,NULL); // for all tracks for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtPattern *pattern; BtMachine *machine; gulong i,j; GST_DEBUG("repair damage after a wire-pattern %p has been changed",wire_pattern); g_object_get((gpointer)wire_pattern,"pattern",&pattern,NULL); g_object_get(pattern,"machine",&machine,NULL); // for all tracks for(i=0;idata); if(bt_sequence_get_number_of_pattern_uses(self,pattern)>0) { // we need to wait for the first wire-pattern g_signal_connect(wire,"pattern-created",G_CALLBACK(on_wire_pattern_added),(gpointer)self); } g_object_unref(pattern); } g_list_free(patterns); g_object_unref(machine); } static void on_wire_removed(BtSetup *setup,BtWire *wire,gpointer user_data) { BtSequence *self=BT_SEQUENCE(user_data); BtMachine *machine; BtPattern *pattern; BtWirePattern *wire_pattern; GList *patterns,*node; g_object_get(wire,"dst",&machine,NULL); g_object_get(machine,"patterns",&patterns,NULL); // go over all patterns of the wire.dst for(node=patterns;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); if(bt_sequence_get_number_of_pattern_uses(self,pattern)>0) { if((wire_pattern=bt_wire_get_pattern(wire,pattern))) { g_signal_handlers_disconnect_matched(wire_pattern,G_SIGNAL_MATCH_FUNC,0,0,NULL,bt_sequence_on_wire_pattern_wire_param_changed,NULL); g_object_unref(wire_pattern); } } g_object_unref(pattern); } g_list_free(patterns); g_object_unref(machine); } //-- helper methods //-- constructor methods /** * bt_sequence_new: * @song: the song the new instance belongs to * * Create a new instance. One would not call this directly, but rather get this * from a #BtSong instance. * * Returns: the new instance or %NULL in case of an error */ BtSequence *bt_sequence_new(const BtSong * const song) { return(BT_SEQUENCE(g_object_new(BT_TYPE_SEQUENCE,"song",song,NULL))); } //-- methods /** * bt_sequence_repair_damage: * @self: the #BtSequence * * Works through the repair queue and rebuilds controller queues, where needed. * * There is usualy no need to call that manualy. Only call after soing mass * updates using bt_sequence_set_pattern_quick() functions. * * Since: 0.5 */ void bt_sequence_repair_damage(const BtSequence * const self) { const gulong tracks=self->priv->tracks; gulong i,j,k,l; BtMachine *machine; BtWire *wire; GList *node; gulong global_params,voice_params,voices,wire_params; GHashTable *damage=self->priv->damage,*hash,*param_hash; gconstpointer hash_params[4]; GST_DEBUG("repair damage"); hash_params[0]=(gpointer)self; // repair damage for(i=0;idst_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); g_object_get(wire,"num-params",&wire_params,NULL); hash_params[3]=GUINT_TO_POINTER(wire); // repair damage of wire params for(j=0;j= @track this @machine is on. * * Returns: the track-index or -1 if there is no further track for this * @machine. * * Since: 0.6 */ glong bt_sequence_get_track_by_machine(const BtSequence * const self,const BtMachine * const machine,gulong track) { const gulong tracks=self->priv->tracks; BtMachine **machines=self->priv->machines; for(;track= @tick this @pattern is on. * * Returns: the tick position or -1 if there is no further tick for this * @pattern. * * Since: 0.6 */ glong bt_sequence_get_tick_by_pattern(const BtSequence * const self,gulong track,const BtPattern * const pattern,gulong tick) { const gulong length=self->priv->length; const gulong tracks=self->priv->tracks; BtPattern **patterns=self->priv->patterns; for(;tick=self->priv->tracks) return(NULL); GST_DEBUG("getting machine : %p,ref_ct=%d for track %lu",self->priv->machines[track],G_OBJECT_REF_COUNT(self->priv->machines[track]),track); return(g_object_try_ref(bt_sequence_get_machine_unchecked(self,track))); } /* @todo shouldn't we better make self->priv->tracks a readonly property and offer methods to insert/remove tracks as it should not be allowed to change the machine later on */ /** * bt_sequence_add_track: * @self: the #BtSequence that holds the tracks * @machine: the #BtMachine * @ix: position to add the track at, use -1 to append * * Adds a new track with the @machine at @ix or the end. * * Returns: %TRUE for success */ gboolean bt_sequence_add_track(const BtSequence * const self, const BtMachine * const machine, const glong ix) { g_return_val_if_fail(BT_IS_SEQUENCE(self),FALSE); g_return_val_if_fail(BT_IS_MACHINE(machine),FALSE); BtMachine **machines; gulong tracks=self->priv->tracks+1; const gulong pos=(ix==-1)?self->priv->tracks:ix; g_return_val_if_fail(ix<=(glong)self->priv->tracks,FALSE); GST_INFO("add track for machine %p,ref_ct=%d at position %lu",machine,G_OBJECT_REF_COUNT(machine),pos); // enlarge g_object_set((gpointer)self,"tracks",tracks,NULL); machines=self->priv->machines; if(pos!=(tracks-1)) { // shift tracks to the right BtPattern **src,**dst; const gulong count=tracks-pos; const gulong length=self->priv->length; gulong i; src=&self->priv->patterns[pos]; dst=&self->priv->patterns[pos+1]; for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtMachine **machines=self->priv->machines; BtPattern **src,**dst; BtMachine *machine; gulong i; g_return_val_if_fail(BT_IS_SEQUENCE(self),FALSE); g_return_val_if_fail(ixpriv->patterns[ix+1]; dst=&self->priv->patterns[ix]; for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtPattern **patterns=self->priv->patterns; BtMachine **machines=self->priv->machines; BtPattern *pattern; BtMachine *machine; gulong i,ix=track; g_return_val_if_fail(track>0,FALSE); for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtPattern **patterns=self->priv->patterns; BtMachine **machines=self->priv->machines; BtPattern *pattern; BtMachine *machine; gulong i,ix=track; g_return_val_if_fail(track<(tracks-1),FALSE); for(i=0;i-1) && res) { res=bt_sequence_remove_track_by_ix(self,(gulong)track); } GST_INFO("removed tracks for machine %p,ref_ct=%d,res=%d",machine,G_OBJECT_REF_COUNT(machine),res); return(res); } /** * bt_sequence_get_label: * @self: the #BtSequence that holds the labels * @time: the requested time position * * Fetches the label for the given @time position. Free when done. * * Returns: a copy of the label or %NULL in case of an error */ gchar *bt_sequence_get_label(const BtSequence * const self, const gulong time) { g_return_val_if_fail(BT_IS_SEQUENCE(self),NULL); g_return_val_if_fail(timepriv->length,NULL); return(g_strdup(self->priv->labels[time])); } /** * bt_sequence_set_label: * @self: the #BtSequence that holds the labels * @time: the requested time position * @label: the new label * * Sets a new label for the respective @time position. */ void bt_sequence_set_label(const BtSequence * const self, const gulong time, const gchar * const label) { g_return_if_fail(BT_IS_SEQUENCE(self)); g_return_if_fail(timepriv->length); GST_DEBUG("set label for time %lu",time); g_free(self->priv->labels[time]); self->priv->labels[time]=g_strdup(label); g_signal_emit((gpointer)self,signals[SEQUENCE_ROWS_CHANGED_EVENT],0,time,time); } /** * bt_sequence_get_pattern: * @self: the #BtSequence that holds the patterns * @time: the requested time position * @track: the requested track index * * Fetches the pattern for the given @time and @track position. Unref when done. * * Returns: a reference to the #BtPattern or %NULL when empty */ BtPattern *bt_sequence_get_pattern(const BtSequence * const self, const gulong time, const gulong track) { g_return_val_if_fail(BT_IS_SEQUENCE(self),NULL); g_return_val_if_fail(timepriv->length,NULL); g_return_val_if_fail(trackpriv->tracks,NULL); //GST_DEBUG("get pattern at time %d, track %d",time, track); return(g_object_try_ref(bt_sequence_get_pattern_unchecked(self,time,track))); } /** * bt_sequence_set_pattern_quick: * @self: the #BtSequence that holds the patterns * @time: the requested time position * @track: the requested track index * @pattern: the #BtPattern or %NULL to unset * * A quick version of bt_sequence_set_pattern() that does not repair damaged * area. Useful when doing mass updates. * * Returns: %TRUE if a change has been made. One should call * bt_sequence_repair_damage() in that case. * * Since: 0.5 */ gboolean bt_sequence_set_pattern_quick(const BtSequence * const self, const gulong time, const gulong track, const BtPattern * const pattern) { gboolean changed=FALSE; #ifndef G_DISABLE_ASSERT if(pattern) { BtMachine * const machine; g_return_val_if_fail(BT_IS_PATTERN(pattern),FALSE); g_object_get((gpointer)pattern,"machine",&machine,NULL); if(self->priv->machines[track]!=machine) { GST_WARNING("adding a pattern to a track with different machine!"); g_object_unref(machine); return(FALSE); } g_object_unref(machine); } #endif const gulong index=time*self->priv->tracks+track; BtPattern *old_pattern=self->priv->patterns[index]; GST_DEBUG("set pattern from %p to %p for time %lu, track %lu", self->priv->patterns[index],pattern,time,track); // take out the old pattern if(old_pattern) { bt_sequence_unuse_pattern(self,old_pattern); // mark region covered by old pattern as damaged bt_sequence_invalidate_pattern_region(self,time,track,old_pattern); changed=TRUE; self->priv->patterns[index]=NULL; } if(pattern) { bt_sequence_use_pattern(self,(BtPattern *)pattern); // enter the new pattern self->priv->patterns[index]=g_object_ref((gpointer)pattern); //g_object_add_weak_pointer((gpointer)pattern,(gpointer *)(&self->priv->patterns[index])); // mark region covered by new pattern as damaged bt_sequence_invalidate_pattern_region(self,time,track,pattern); changed=TRUE; } g_signal_emit((gpointer)self,signals[SEQUENCE_ROWS_CHANGED_EVENT],0,time,time); GST_DEBUG("done: %d",changed); return(changed); } /** * bt_sequence_set_pattern: * @self: the #BtSequence that holds the patterns * @time: the requested time position * @track: the requested track index * @pattern: the #BtPattern or %NULL to unset * * Sets the #BtPattern for the respective @time and @track position. */ void bt_sequence_set_pattern(const BtSequence * const self, const gulong time, const gulong track, const BtPattern * const pattern) { g_return_if_fail(BT_IS_SEQUENCE(self)); g_return_if_fail(timepriv->length); g_return_if_fail(trackpriv->tracks); g_return_if_fail(self->priv->machines[track]); if(bt_sequence_set_pattern_quick(self,time,track,pattern)) { // repair damage bt_sequence_repair_damage(self); } } /** * bt_sequence_get_bar_time: * @self: the #BtSequence of the song * * Calculates the length of one sequence bar in microseconds. * Divide it by %G_USEC_PER_SEC to get it in milliseconds. * * Returns: the length of one sequence bar in microseconds */ /* @todo rename to bt_sequence_get_tick_duration(), or turn into property ?*/ GstClockTime bt_sequence_get_bar_time(const BtSequence * const self) { g_return_val_if_fail(BT_IS_SEQUENCE(self),0.0); if(G_UNLIKELY(self->priv->wait_per_position==0.0)) { bt_sequence_calculate_wait_per_position(self); } return(self->priv->wait_per_position); } /** * bt_sequence_get_loop_time: * @self: the #BtSequence of the song * * Calculates the length of the song loop in microseconds. * Divide it by %G_USEC_PER_SEC to get it in milliseconds. * * Returns: the length of the song loop in microseconds */ GstClockTime bt_sequence_get_loop_time(const BtSequence * const self) { g_return_val_if_fail(BT_IS_SEQUENCE(self),0); GST_DEBUG("%lu .. %lu : %"GST_TIME_FORMAT" : %"GST_TIME_FORMAT, self->priv->play_start, self->priv->play_end, GST_TIME_ARGS(self->priv->wait_per_position), GST_TIME_ARGS((self->priv->play_end-self->priv->play_start)*self->priv->wait_per_position)); const GstClockTime res=bt_sequence_get_tick_time(self,self->priv->play_end-self->priv->play_start); return(res); } /** * bt_sequence_limit_play_pos: * @self: the sequence to trim the play position of * @play_pos: the time position to lock inbetween loop-boundaries * * Enforce the playback position to be within loop start and end or the song * bounds if there is no loop. * * Returns: the new @play_pos */ gulong bt_sequence_limit_play_pos(const BtSequence * const self, gulong play_pos) { if(play_pos>self->priv->play_end) { play_pos=self->priv->play_end; } if(play_pospriv->play_start) { play_pos=self->priv->play_start; } return(play_pos); } /** * bt_sequence_is_pattern_used: * @self: the sequence to check for pattern use * @pattern: the pattern to check for * * Checks if the @pattern is used in the sequence. * * Returns: %TRUE if @pattern is used. */ gboolean bt_sequence_is_pattern_used(const BtSequence * const self,const BtPattern * const pattern) { g_return_val_if_fail(BT_IS_SEQUENCE(self),0); g_return_val_if_fail(BT_IS_PATTERN(pattern),0); return(bt_sequence_get_number_of_pattern_uses(self,pattern)>0); } /* * insert_rows: * @self: the sequence * @time: the postion to insert at * @track: the track * @rows: the number of rows to insert * * Insert empty @rows for given @track. */ static void insert_rows(const BtSequence * const self, const gulong time, const gulong track, const gulong rows) { const gulong tracks=self->priv->tracks; const gulong length=self->priv->length; BtPattern **src=&self->priv->patterns[track+tracks*(length-(1+rows))]; BtPattern **dst=&self->priv->patterns[track+tracks*(length-1)]; gulong i; /* ins 3 0 1 2 3 4 * 0 a a a a a . * 1 b b b b . . * 2 c c c . . . * 3 d d . . . a * 4 e src . . . b b * 5 f \ f f c c c * 6 g v g d d d d * 7 h dst e e e e e e */ /* we're overwriting these */ for(i=1;i<=rows;i++) { if(src[i*tracks]) bt_sequence_unuse_pattern(self,src[i*tracks]); } /* copy patterns and move upwards */ for(i=(length-1);i>=(time+rows);i--) { if(*src) { bt_sequence_invalidate_pattern_region(self,i-rows,track,*src); bt_sequence_invalidate_pattern_region(self,i,track,*src); } if(*dst) bt_sequence_invalidate_pattern_region(self,i,track,*dst); *dst=*src; *src=NULL; src-=tracks; dst-=tracks; } } /** * bt_sequence_insert_rows: * @self: the sequence * @time: the postion to insert at * @track: the track * @rows: the number of rows to insert * * Insert one empty row for given @track. * * Since: 0.3 */ void bt_sequence_insert_rows(const BtSequence * const self, const gulong time, const glong track, const gulong rows) { g_return_if_fail(BT_IS_SEQUENCE(self)); const gulong length=self->priv->length; GST_INFO("insert %lu rows at %lu,%ld", rows, time, track); if(track>-1) { insert_rows(self,time,track,rows); bt_sequence_repair_damage(self); } else { gulong j=0; gchar ** const labels=self->priv->labels; // shift label down for(j=length-rows;jpriv->tracks; const gulong length=self->priv->length; gulong j=0; gchar **labels; // don't take the pointer yet, we realloc GST_DEBUG("insert %lu full-rows at %lu / %lu", rows, time, length); g_object_set((gpointer)self,"length",length+rows,NULL); // shift label down labels=self->priv->labels; memmove(&labels[time+rows],&labels[time],((length-rows)-time)*sizeof(gpointer)); for(j=0;jpriv->tracks; const gulong length=self->priv->length; BtPattern **src=&self->priv->patterns[track+tracks*(time+rows)]; BtPattern **dst=&self->priv->patterns[track+tracks*time]; gulong i; /* del 3 0 1 2 3 4 5 * 0 a dst d d d d d d d * 1 b ^ b e e e e e * 2 c / c c f f f r * 3 d src d d d g g g * 4 e e e e e h h * 5 f f f f f f . * 6 g g g g g g . * 7 h h h h h h . */ // not sure why we need the final loop and can't use this scheme /* del 3 0 1 2 3 4 * 0 a dst d d d d d d * 1 b ^ b e e e e * 2 c / c c f f f * 3 d src . . . g g * 4 e e . . . h * 5 f f f . . . * 6 g g g g . . * 7 h h h h h . */ /* we're overwriting these */ for(i=0;ipriv->length; GST_INFO("delete %lu rows at %lu,%ld", rows, time, track); if(track>-1) { delete_rows(self,time,track,rows); bt_sequence_repair_damage(self); } else { gulong j=0; gchar ** const labels=self->priv->labels; // shift label up for(j=0;jpriv->tracks; const gulong length=self->priv->length; gulong j=0; gchar ** const labels=self->priv->labels; GST_DEBUG("delete %lu full-rows at %lu / %lu", rows, time, length); // shift label up for(j=0;jpriv->tracks; const gulong length=self->priv->length; BtPattern **pattern=self->priv->patterns; gulong i,j; GST_INFO("updating gst-controller queues"); bt_sequence_calculate_wait_per_position(self); /* @todo: this is very slow */ for(i=0;ipriv->tracks; const gulong length=self->priv->length; BtPattern **patterns=self->priv->patterns; BtMachine **machines=self->priv->machines; gchar ** const labels=self->priv->labels; xmlNodePtr node=NULL; xmlNodePtr child_node,child_node2,child_node3; gulong i,j; GST_DEBUG("PERSISTENCE::sequence"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("sequence"),NULL))) { xmlNewProp(node,XML_CHAR_PTR("length"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->length))); xmlNewProp(node,XML_CHAR_PTR("tracks"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->tracks))); if(self->priv->loop) { xmlNewProp(node,XML_CHAR_PTR("loop"),XML_CHAR_PTR("on")); xmlNewProp(node,XML_CHAR_PTR("loop-start"),XML_CHAR_PTR(bt_persistence_strfmt_long(self->priv->loop_start))); xmlNewProp(node,XML_CHAR_PTR("loop-end"),XML_CHAR_PTR(bt_persistence_strfmt_long(self->priv->loop_end))); } if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("labels"),NULL))) { // iterate over timelines for(i=0;ipriv->properties)) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("properties"),NULL))) { if(!bt_persistence_save_hashtable(self->priv->properties,child_node)) goto Error; } else goto Error; } } Error: return(node); } static BtPersistence *bt_sequence_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtSequence * const self = BT_SEQUENCE(persistence); xmlNodePtr child_node,child_node2; gboolean sequence_changed=FALSE; GST_DEBUG("PERSISTENCE::sequence"); g_assert(node); xmlChar * const length_str =xmlGetProp(node,XML_CHAR_PTR("length")); xmlChar * const tracks_str =xmlGetProp(node,XML_CHAR_PTR("tracks")); xmlChar * const loop_str =xmlGetProp(node,XML_CHAR_PTR("loop")); xmlChar * const loop_start_str =xmlGetProp(node,XML_CHAR_PTR("loop-start")); xmlChar * const loop_end_str =xmlGetProp(node,XML_CHAR_PTR("loop-end")); const gulong length=length_str?atol((char *)length_str):0; const gulong tracks=tracks_str?atol((char *)tracks_str):0; const gulong loop_start=loop_start_str?atol((char *)loop_start_str):-1; const gulong loop_end=loop_end_str?atol((char *)loop_end_str):-1; const gboolean loop=loop_str?!strncasecmp((char *)loop_str,"on\0",3):FALSE; g_object_set(self,"length",length,"tracks",tracks, "loop",loop,"loop-start",loop_start,"loop-end",loop_end, NULL); xmlFree(length_str); xmlFree(tracks_str); xmlFree(loop_str); xmlFree(loop_start_str); xmlFree(loop_end_str); for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { if(!strncmp((gchar *)node->name,"labels\0",7)) { for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"label\0",6))) { xmlChar * const time_str=xmlGetProp(child_node,XML_CHAR_PTR("time")); xmlChar * const name=xmlGetProp(child_node,XML_CHAR_PTR("name")); bt_sequence_set_label(self,atol((const char *)time_str),(const gchar *)name); xmlFree(time_str); xmlFree(name); } } } else if(!strncmp((const gchar *)node->name,"tracks\0",7)) { BtSetup * const setup; g_object_get(self->priv->song,"setup",&setup,NULL); for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"track\0",6))) { xmlChar * const machine_id=xmlGetProp(child_node,XML_CHAR_PTR("machine")); xmlChar * const index_str=xmlGetProp(child_node,XML_CHAR_PTR("index")); const gulong index=index_str?atol((char *)index_str):0; BtMachine * const machine=bt_setup_get_machine_by_id(setup, (gchar *)machine_id); if(machine) { GST_INFO("add track for machine %p,ref_ct=%d at position %lu",machine,G_OBJECT_REF_COUNT(machine),index); if(indexpriv->machines[index]=machine; GST_DEBUG("loading track with index=%s for machine=\"%s\"",index_str,machine_id); for(child_node2=child_node->children;child_node2;child_node2=child_node2->next) { if((!xmlNodeIsText(child_node2)) && (!strncmp((char *)child_node2->name,"position\0",9))) { xmlChar * const time_str=xmlGetProp(child_node2,XML_CHAR_PTR("time")); xmlChar * const pattern_id=xmlGetProp(child_node2,XML_CHAR_PTR("pattern")); GST_DEBUG(" at %s, machinepattern \"%s\"",time_str,safe_string(pattern_id)); if(pattern_id) { // get pattern by name from machine BtPattern * const pattern=bt_machine_get_pattern_by_id(machine,(gchar *)pattern_id); if(pattern) { // this refs the pattern sequence_changed|=bt_sequence_set_pattern_quick(self,atol((char *)time_str),index,pattern); g_object_unref(pattern); } else { GST_WARNING(" unknown pattern \"%s\"",pattern_id); } xmlFree(pattern_id); } xmlFree(time_str); } } // we keep the ref in self->priv->machines[index] } else { GST_WARNING("index beyond tracks: %lu>=%lu",index,tracks); g_object_unref(machine); } } else { GST_INFO("invalid or missing machine %s referenced at track %lu",(gchar *)machine_id,index); } xmlFree(index_str); xmlFree(machine_id); } } g_object_unref(setup); } else if(!strncmp((gchar *)node->name,"properties\0",11)) { bt_persistence_load_hashtable(self->priv->properties,node); } } } if(sequence_changed) { // repair damage bt_sequence_repair_damage(self); } return(BT_PERSISTENCE(persistence)); } static void bt_sequence_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_sequence_persistence_load; iface->save = bt_sequence_persistence_save; } //-- wrapper //-- default signal handler //-- g_object overrides static void bt_sequence_constructed(GObject *object) { BtSequence *self=BT_SEQUENCE(object); BtSetup *setup; if(G_OBJECT_CLASS(bt_sequence_parent_class)->constructed) G_OBJECT_CLASS(bt_sequence_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); g_object_get((gpointer)(self->priv->song),"setup",&setup,NULL); if(setup) { g_signal_connect(setup,"wire-added",G_CALLBACK(on_wire_added),(gpointer)self); g_signal_connect(setup,"wire-removed",G_CALLBACK(on_wire_removed),(gpointer)self); g_object_unref(setup); } else { GST_WARNING("no setup yet"); } } /* returns a property for the given property_id for this object */ static void bt_sequence_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSequence * const self = BT_SEQUENCE(object); return_if_disposed(); switch (property_id) { case SEQUENCE_SONG: { g_value_set_object(value, self->priv->song); } break; case SEQUENCE_LENGTH: { g_value_set_ulong(value, self->priv->length); } break; case SEQUENCE_TRACKS: { g_value_set_ulong(value, self->priv->tracks); } break; case SEQUENCE_LOOP: { g_value_set_boolean(value, self->priv->loop); } break; case SEQUENCE_LOOP_START: { g_value_set_long(value, self->priv->loop_start); } break; case SEQUENCE_LOOP_END: { g_value_set_long(value, self->priv->loop_end); } break; case SEQUENCE_PROPERTIES: { g_value_set_pointer(value, self->priv->properties); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_sequence_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSequence * const self = BT_SEQUENCE(object); return_if_disposed(); switch (property_id) { case SEQUENCE_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for sequence: %p",self->priv->song); } break; case SEQUENCE_LENGTH: { // @todo remove or better stop the song // if(self->priv->is_playing) bt_sequence_stop(self); // prepare new data const gulong length=self->priv->length; self->priv->length = g_value_get_ulong(value); if(length!=self->priv->length) { GST_DEBUG("set the length for sequence: %lu",self->priv->length); bt_sequence_resize_data_length(self,length); if(self->priv->loop_end!=-1) { if(self->priv->loop_end>self->priv->length) { self->priv->play_end=self->priv->loop_end=self->priv->length; } } else { self->priv->play_end=self->priv->length; } bt_sequence_limit_play_pos_internal(self); } } break; case SEQUENCE_TRACKS: { // @todo remove or better stop the song //if(self->priv->is_playing) bt_sequence_stop(self); // prepare new data const gulong tracks=self->priv->tracks; self->priv->tracks = g_value_get_ulong(value); if(tracks!=self->priv->tracks) { GST_DEBUG("set the tracks for sequence: %lu -> %lu",tracks,self->priv->tracks); bt_sequence_resize_data_tracks(self,tracks); } } break; case SEQUENCE_LOOP: { self->priv->loop = g_value_get_boolean(value); GST_DEBUG("set the loop for sequence: %d",self->priv->loop); if(self->priv->loop) { if(self->priv->loop_start==-1) { self->priv->loop_start=0; g_object_notify(G_OBJECT(self), "loop-start"); } self->priv->play_start=self->priv->loop_start; if(self->priv->loop_end==-1) { self->priv->loop_end=self->priv->length; g_object_notify(G_OBJECT(self), "loop-end"); } self->priv->play_end=self->priv->loop_end; bt_sequence_limit_play_pos_internal(self); } else { self->priv->play_start=0; self->priv->play_end=self->priv->length; bt_sequence_limit_play_pos_internal(self); } } break; case SEQUENCE_LOOP_START: { self->priv->loop_start = g_value_get_long(value); if(self->priv->loop_start!=-1) { // make sure its less then loop_end/length if(self->priv->loop_end>0) { if(self->priv->loop_start>=self->priv->loop_end) self->priv->loop_start=self->priv->loop_end-1; } else if(self->priv->length>0) { if(self->priv->loop_start>=self->priv->length) self->priv->loop_start=self->priv->length-1; } else self->priv->loop_start=-1; } GST_DEBUG("set the loop-start for sequence: %ld",self->priv->loop_start); self->priv->play_start=(self->priv->loop_start!=-1)?self->priv->loop_start:0; bt_sequence_limit_play_pos_internal(self); } break; case SEQUENCE_LOOP_END: { self->priv->loop_end = g_value_get_long(value); if(self->priv->loop_end!=-1) { // make sure its more then loop-start if(self->priv->loop_start>-1) { if(self->priv->loop_endpriv->loop_start) self->priv->loop_end=self->priv->loop_start+1; } // make sure its less then or equal to length if(self->priv->length>0) { if(self->priv->loop_end>self->priv->length) self->priv->loop_end=self->priv->length; } else self->priv->loop_end=-1; } GST_DEBUG("set the loop-end for sequence: %ld",self->priv->loop_end); self->priv->play_end=(self->priv->loop_end!=-1)?self->priv->loop_end:self->priv->length; bt_sequence_limit_play_pos_internal(self); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_sequence_dispose(GObject * const object) { BtSequence * const self = BT_SEQUENCE(object); const gulong tracks=self->priv->tracks; const gulong length=self->priv->length; BtPattern **patterns=self->priv->patterns; BtMachine **machines=self->priv->machines; gchar ** const labels=self->priv->labels; gulong i,j,k; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); // unref the machines GST_DEBUG("unref %lu machines",tracks); for(i=0;idispose(object); GST_DEBUG(" done"); } static void bt_sequence_finalize(GObject * const object) { const BtSequence * const self = BT_SEQUENCE(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->machines); g_free(self->priv->labels); g_free(self->priv->patterns); g_hash_table_destroy(self->priv->damage); g_hash_table_destroy(self->priv->pattern_usage); g_hash_table_destroy(self->priv->properties); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_sequence_parent_class)->finalize(object); GST_DEBUG(" done"); } //-- class internals static void bt_sequence_init(BtSequence * self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SEQUENCE, BtSequencePrivate); self->priv->loop_start=-1; self->priv->loop_end=-1; self->priv->wait_per_position=0.0; self->priv->damage=g_hash_table_new_full(NULL,NULL,NULL,(GDestroyNotify)g_hash_table_destroy); self->priv->pattern_usage=g_hash_table_new(NULL,NULL); self->priv->properties=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); } static void bt_sequence_class_init(BtSequenceClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSequencePrivate)); gobject_class->constructed = bt_sequence_constructed; gobject_class->set_property = bt_sequence_set_property; gobject_class->get_property = bt_sequence_get_property; gobject_class->dispose = bt_sequence_dispose; gobject_class->finalize = bt_sequence_finalize; /** * BtSequence::pattern-added: * @self: the sequence object that emitted the signal * @pattern: the new pattern * * A pattern has been used in the sequence for the first time. */ signals[PATTERN_ADDED_EVENT] = g_signal_new("pattern-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_PATTERN // param data ); /** * BtSequence::pattern-removed: * @self: the sequence object that emitted the signal * @pattern: the old pattern * * The last occurance of pattern has been removed from the sequence. */ signals[PATTERN_REMOVED_EVENT] = g_signal_new("pattern-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_PATTERN // param data ); /** * BtSequence::rows-changed: * @self: the sequence object that emitted the signal * @begin: start row that changed * @end: last row that changed * * The content of the given rows in the sequence has changed. * * Since: 0.6 */ signals[SEQUENCE_ROWS_CHANGED_EVENT] = g_signal_new("rows-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__ULONG_ULONG, G_TYPE_NONE, // return type 2, // n_params G_TYPE_ULONG,G_TYPE_ULONG ); /** * BtSequence::track-added: * @self: the sequence object that emitted the signal * @machine: the machine for the track * @track: the track index * * A new track for @machine has been added with the @track index. * * Since: 0.6 */ signals[TRACK_ADDED_EVENT] = g_signal_new("track-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__OBJECT_ULONG, G_TYPE_NONE, // return type 2, // n_params BT_TYPE_MACHINE,G_TYPE_ULONG ); /** * BtSequence::track-removed: * @self: the sequence object that emitted the signal * @machine: the machine for the track * @track: the track index * * A track for @machine has been removed at the @track index. * * Since: 0.6 */ signals[TRACK_REMOVED_EVENT] = g_signal_new("track-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__OBJECT_ULONG, G_TYPE_NONE, // return type 2, // n_params BT_TYPE_MACHINE,G_TYPE_ULONG ); g_object_class_install_property(gobject_class,SEQUENCE_SONG, g_param_spec_object("song", "song contruct prop", "Set song object, the sequence belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_LENGTH, g_param_spec_ulong("length", "length prop", "length of the sequence in timeline bars", 0, G_MAXLONG, // loop-pos are LONG as well 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_TRACKS, g_param_spec_ulong("tracks", "tracks prop", "number of tracks in the sequence", 0, G_MAXULONG, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_LOOP, g_param_spec_boolean("loop", "loop prop", "is loop activated", FALSE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_LOOP_START, g_param_spec_long("loop-start", "loop-start prop", "start of the repeat sequence on the timeline", -1, G_MAXLONG, -1, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_LOOP_END, g_param_spec_long("loop-end", "loop-end prop", "end of the repeat sequence on the timeline", -1, G_MAXLONG, -1, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_PROPERTIES, g_param_spec_pointer("properties", "properties prop", "hashtable of sequence properties", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/marshal.c0000644042355400116100000002050511667370631014405 00000000000000 #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_char (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) #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 #endif /* !G_ENABLE_DEBUG */ /* VOID:OBJECT,ULONG (./marshal.list:4) */ void bt_marshal_VOID__OBJECT_ULONG (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_ULONG) (gpointer data1, gpointer arg_1, gulong arg_2, gpointer data2); register GMarshalFunc_VOID__OBJECT_ULONG callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; 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_ULONG) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_object (param_values + 1), g_marshal_value_peek_ulong (param_values + 2), data2); } /* VOID:ULONG,OBJECT,ULONG (./marshal.list:5) */ void bt_marshal_VOID__ULONG_OBJECT_ULONG (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_OBJECT_ULONG) (gpointer data1, gulong arg_1, gpointer arg_2, gulong arg_3, gpointer data2); register GMarshalFunc_VOID__ULONG_OBJECT_ULONG callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; 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_OBJECT_ULONG) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_object (param_values + 2), g_marshal_value_peek_ulong (param_values + 3), data2); } /* VOID:ULONG,ULONG (./marshal.list:6) */ void bt_marshal_VOID__ULONG_ULONG (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_ULONG) (gpointer data1, gulong arg_1, gulong arg_2, gpointer data2); register GMarshalFunc_VOID__ULONG_ULONG callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; 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_ULONG) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_ulong (param_values + 2), data2); } /* VOID:ULONG,ULONG,ULONG (./marshal.list:7) */ void bt_marshal_VOID__ULONG_ULONG_ULONG (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_ULONG_ULONG) (gpointer data1, gulong arg_1, gulong arg_2, gulong arg_3, gpointer data2); register GMarshalFunc_VOID__ULONG_ULONG_ULONG callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; 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_ULONG_ULONG) (marshal_data ? marshal_data : cc->callback); callback (data1, g_marshal_value_peek_ulong (param_values + 1), g_marshal_value_peek_ulong (param_values + 2), g_marshal_value_peek_ulong (param_values + 3), data2); } buzztard-0.6.0/src/lib/core/persistence.c0000644042355400116100000003451311670203273015275 00000000000000/* $Id: persistence.c 3762 2011-12-08 18:49:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpersistence * @short_description: object persistence interface * * Classes can implement this interface to store their data as xml and * restore them from xml. They should call the interface methods on their * children objects (which also implement the interface) to serialize/ * deserialize a whole object hierarchy. * */ /* @idea: what if we pass an object instance (ctx) to bt_persistence_{load,save} * instead of the xmlNodePtr. * - loading * const gchar * bt_persistence_context_get_attribute (BtPersistenceContext *ctx, const gchar *name); * GList * bt_persistence_context_get_children (BtPersistenceContext *ctx); * - saving * bt_persistence_context_set_attribute (BtPersistenceContext *ctx, const gchar *name, const gchar *attribute); * BtPersistenceContext * bt_persistence_context_add_child (BtPersistenceContext *ctx, const gchar *name); * * - need some parameters for constructor (e.g. uri) * - BtPersistenceContext would be an abstract baseclass, we would then implement * BtPersistenceContextLibXML2 * - this way we have the libxml2 hidden, we then can support different backends (e.g. for clipboard) */ #define BT_CORE #define BT_PERSISTENCE_C #include "core_private.h" //-- the iface G_DEFINE_INTERFACE (BtPersistence, bt_persistence, 0); //-- string formatting helper /** * bt_persistence_strfmt_uchar: * @val: a value * * Convinience methods, that formats a value to be serialized as a string. * * Returns: a reference to static memory containg the formatted value. */ const gchar *bt_persistence_strfmt_uchar(const guchar val) { static gchar str[20]; g_sprintf(str,"%u",val); return(str); } /** * bt_persistence_strfmt_long: * @val: a value * * Convinience methods, that formats a value to be serialized as a string. * * Returns: a reference to static memory containg the formatted value. */ const gchar *bt_persistence_strfmt_long(const glong val) { static gchar str[20]; g_sprintf(str,"%ld",val); return(str); } /** * bt_persistence_strfmt_ulong: * @val: a value * * Convinience methods, that formats a value to be serialized as a string. * * Returns: a reference to static memory containg the formatted value. */ const gchar *bt_persistence_strfmt_ulong(const gulong val) { static gchar str[20]; g_sprintf(str,"%lu",val); return(str); } /** * bt_persistence_strfmt_double: * @val: a value * * Convinience methods, that formats a value to be serialized as a string. * * Returns: a reference to static memory containg the formatted value. */ const gchar *bt_persistence_strfmt_double(const gdouble val) { static gchar str[G_ASCII_DTOSTR_BUF_SIZE+1]; g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,val); return(str); } // string parsing helper /** * bt_persistence_strfmt_enum: * @enum_type: the #GType for the enum * @value: the integer value for the enum * * Convinience methods, that formats a value to be serialized as a string. * * Returns: a reference to static memory containg the formatted value. */ const gchar *bt_persistence_strfmt_enum(GType enum_type,gint value) { GEnumClass *enum_class=g_type_class_ref(enum_type); GEnumValue *enum_value=g_enum_get_value(enum_class,value); g_type_class_unref(enum_class); return(enum_value->value_nick); } /** * bt_persistence_parse_enum: * @enum_type: the #GType for the enum * @str: the enum value name * * Convinience methods, that parses a enum value nick and to get the * corresponding intger value. * * Returns: the interger value for the enum, or -1 for invalid strings. */ gint bt_persistence_parse_enum(GType enum_type,const gchar *str) { if(!str) return(-1); GEnumClass *enum_class=g_type_class_ref(enum_type); GEnumValue *enum_value=g_enum_get_value_by_nick(enum_class,str); g_type_class_unref(enum_class); return(enum_value?enum_value->value:-1); } //-- list helper /** * bt_persistence_save_list: * @list: a #GList * @doc; the xml-document * @node: the list xml node * * Iterates over a list of objects, which must implement the #BtPersistence * interface and calls bt_persistence_save() on each item. * * Returns: %TRUE if all elements have been serialized. */ gboolean bt_persistence_save_list(const GList *list,xmlNodePtr const node) { gboolean res=TRUE; for(;(list && res);list=g_list_next(list)) { res&=(bt_persistence_save(BT_PERSISTENCE(list->data),node)!=NULL); } return(res); } /* * this isn't as useful as the _save_list version * gboolean bt_persistence_load_list(const GList *list,xmlNodePtr node,const gchar const *name) { gboolean res=TRUE; gulong name_len=strlen(name); for(node=node->children;node;node=node->next) { if((!xmlNodeIsText(node)) && (!strncmp((char *)node->name,name,strlen))) { ... } } */ //-- hashtable helper /** * bt_persistence_collect_hashtable_entries: * @key: hashtable key * @value: hashtable value * @user_data: GList **list * * Gather #GHashTable entries in a list. Should be used with g_hash_table_foreach(). */ void bt_persistence_collect_hashtable_entries(gpointer const key, gpointer const value, gpointer const user_data) { GList **list=(GList **)user_data; *list=g_list_prepend(*list,value); } static void bt_persistence_save_hashtable_entries(gpointer const key, gpointer const value, gpointer const user_data) { xmlNodePtr node; node=xmlNewChild(user_data,NULL,XML_CHAR_PTR("property"),NULL); xmlNewProp(node,XML_CHAR_PTR("key"),XML_CHAR_PTR(key)); xmlNewProp(node,XML_CHAR_PTR("value"),XML_CHAR_PTR(value)); } /** * bt_persistence_save_hashtable: * @hashtable: a #GHashTable with strings * @node: the list xml node * * Iterates over a hashtable with strings and serializes them. * * Returns: %TRUE if all elements have been serialized. */ gboolean bt_persistence_save_hashtable(GHashTable *hashtable, xmlNodePtr const node) { gboolean res=TRUE; g_hash_table_foreach(hashtable,bt_persistence_save_hashtable_entries,(gpointer)node); return(res); } /** * bt_persistence_load_hashtable: * @hashtable: a #GHashTable * @node: the list xml node * * Iterates over the xml-node and deserializes elements into the hashtable. * * Returns: %TRUE if all elements have been deserialized. */ gboolean bt_persistence_load_hashtable(GHashTable *hashtable, xmlNodePtr node) { xmlChar *key,*value; // iterate over children for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node) && !strncmp((char *)node->name,"property\0",9)) { key=xmlGetProp(node,XML_CHAR_PTR("key")); value=xmlGetProp(node,XML_CHAR_PTR("value")); //GST_DEBUG(" [%s] => [%s]",key,value); g_hash_table_insert(hashtable,key,value); // do not free, as the hastable now owns the memory //xmlFree(key);xmlFree(value); } } return(TRUE); } //-- gvalue helper /** * bt_persistence_set_value: * @gvalue: a #GValue * @svalue: the string representation of the value to store * * Stores the supplied value into the given @gvalue. * * Returns: %TRUE for success */ gboolean bt_persistence_set_value(GValue* const gvalue, const gchar *svalue) { GType base_type; g_return_val_if_fail(G_IS_VALUE(gvalue),FALSE); base_type=bt_g_type_get_base_type(G_VALUE_TYPE(gvalue)); // depending on the type, set the GValue switch(base_type) { case G_TYPE_DOUBLE: { //gdouble val=atof(svalue); // this is dependend on the locale const gdouble val=svalue?g_ascii_strtod(svalue,NULL):0.0; g_value_set_double(gvalue,val); } break; case G_TYPE_FLOAT: { const gfloat val=svalue?(gfloat)g_ascii_strtod(svalue,NULL):0.0; g_value_set_float(gvalue,val); } break; case G_TYPE_BOOLEAN: { const gboolean val=svalue?atoi(svalue):FALSE; g_value_set_boolean(gvalue,val); } break; case G_TYPE_STRING: { g_value_set_string(gvalue,svalue); } break; case G_TYPE_ENUM: { if(G_VALUE_TYPE(gvalue)==GSTBT_TYPE_NOTE) { GEnumClass *enum_class=g_type_class_peek_static(GSTBT_TYPE_NOTE); GEnumValue *enum_value; gint val=0; if((enum_value=g_enum_get_value_by_nick(enum_class,svalue))) { val=enum_value->value; } //GST_INFO("mapping '%s' -> %d", svalue, val); g_value_set_enum(gvalue,val); } else { const gint val=svalue?atoi(svalue):0; //GST_INFO("-> %d",val); g_value_set_enum(gvalue,val); } } break; case G_TYPE_INT: { const gint val=svalue?atoi(svalue):0; g_value_set_int(gvalue,val); } break; case G_TYPE_UINT: { const guint val=svalue?atoi(svalue):0; g_value_set_uint(gvalue,val); } break; case G_TYPE_INT64: { const gint64 val=svalue?g_ascii_strtoll(svalue,NULL,10):0; g_value_set_int64(gvalue,val); } break; case G_TYPE_UINT64: { const guint64 val=svalue?g_ascii_strtoull(svalue,NULL,10):0; g_value_set_uint64(gvalue,val); } break; case G_TYPE_LONG: { const glong val=svalue?atol(svalue):0; g_value_set_long(gvalue,val); } break; case G_TYPE_ULONG: { const gulong val=svalue?atol(svalue):0; g_value_set_ulong(gvalue,val); } break; default: GST_ERROR("unsupported GType=%lu:'%s' for value=\"%s\"",(gulong)G_VALUE_TYPE(gvalue),G_VALUE_TYPE_NAME(gvalue),svalue); return(FALSE); } return(TRUE); } /** * bt_persistence_get_value: * @gvalue: the event cell * * Returns the string representation of the given @gvalue. Free it when done. * * Returns: a newly allocated string with the data or %NULL on error */ gchar *bt_persistence_get_value(GValue * const gvalue) { // we're not showing more digits in the pattern view right now //#define FLOAT_BUFFER_LEN 8 #define FLOAT_BUFFER_LEN G_ASCII_DTOSTR_BUF_SIZE GType base_type; gchar *res=NULL; g_return_val_if_fail(G_IS_VALUE(gvalue),NULL); base_type=bt_g_type_get_base_type(G_VALUE_TYPE(gvalue)); // depending on the type, set the result switch(base_type) { case G_TYPE_DOUBLE: { gchar str[FLOAT_BUFFER_LEN+1]; // this is dependend on the locale //res=g_strdup_printf("%lf",g_value_get_double(gvalue)); res=g_strdup(g_ascii_dtostr(str,FLOAT_BUFFER_LEN,g_value_get_double(gvalue))); } break; case G_TYPE_FLOAT: { gchar str[FLOAT_BUFFER_LEN+1]; // this is dependend on the locale //res=g_strdup_printf("%f",g_value_get_float(gvalue)); res=g_strdup(g_ascii_dtostr(str,FLOAT_BUFFER_LEN,g_value_get_float(gvalue))); } break; case G_TYPE_BOOLEAN: res=g_strdup_printf("%d",g_value_get_boolean(gvalue)); break; case G_TYPE_STRING: res=g_value_dup_string(gvalue); break; case G_TYPE_ENUM: if(G_VALUE_TYPE(gvalue)==GSTBT_TYPE_NOTE) { GEnumClass *enum_class=g_type_class_peek_static(GSTBT_TYPE_NOTE); GEnumValue *enum_value; gint val=g_value_get_enum(gvalue); if((enum_value=g_enum_get_value(enum_class,val))) { res=g_strdup(enum_value->value_nick); } else { res=g_strdup(""); } } else { res=g_strdup_printf("%d",g_value_get_enum(gvalue)); } break; case G_TYPE_INT: res=g_strdup_printf("%d",g_value_get_int(gvalue)); break; case G_TYPE_UINT: res=g_strdup_printf("%u",g_value_get_uint(gvalue)); break; case G_TYPE_INT64: res=g_strdup_printf("%"G_GINT64_FORMAT,g_value_get_int64(gvalue)); break; case G_TYPE_UINT64: res=g_strdup_printf("%"G_GUINT64_FORMAT,g_value_get_uint64(gvalue)); break; case G_TYPE_LONG: res=g_strdup_printf("%ld",g_value_get_long(gvalue)); break; case G_TYPE_ULONG: res=g_strdup_printf("%lu",g_value_get_ulong(gvalue)); break; default: GST_ERROR("unsupported GType=%lu:'%s'",(gulong)G_VALUE_TYPE(gvalue),G_VALUE_TYPE_NAME(gvalue)); return(NULL); } return(res); } //-- wrapper /** * bt_persistence_save: * @self: a serialiable object * @parent_node: the parent xml node * * Serializes the given object into @node. * * Returns: the new node if the object has been serialized, else %NULL. */ xmlNodePtr bt_persistence_save(const BtPersistence * const self, xmlNodePtr const parent_node) { g_return_val_if_fail (BT_IS_PERSISTENCE (self), FALSE); return (BT_PERSISTENCE_GET_INTERFACE (self)->save (self, parent_node)); } /** * bt_persistence_load: * @type: a #GObject type * @self: a deserialiable object * @node: the xml node * @err: a GError for deserialisation errors * @...: extra parameters NULL terminated name/value pairs. * * Deserializes the given object from the @node. If @self is NULL and a @type is * given it constructs a new object. * * Returns: the deserialized object or %NULL. */ BtPersistence *bt_persistence_load(const GType type, const BtPersistence * const self, xmlNodePtr node, GError **err, ...) { BtPersistence *result; va_list var_args; if(!self) { GObjectClass *klass; BtPersistenceInterface *iface; g_return_val_if_fail (G_TYPE_IS_OBJECT (type), NULL); klass = g_type_class_ref (type); iface = g_type_interface_peek (klass, BT_TYPE_PERSISTENCE); va_start (var_args, err); result = iface->load (type, self, node, err, var_args); va_end (var_args); g_type_class_unref(klass); } else { g_return_val_if_fail (BT_IS_PERSISTENCE (self), NULL); va_start (var_args, err); result = BT_PERSISTENCE_GET_INTERFACE (self)->load (type, self, node, err, var_args); va_end (var_args); } return (result); } //-- interface internals static void bt_persistence_default_init(BtPersistenceInterface *klass) { } buzztard-0.6.0/src/lib/core/tools.c0000644042355400116100000004004111643613122014100 00000000000000/* $Id: tools.c 3679 2011-10-07 15:10:09Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_CORE #define BT_TOOLS_C #include "core_private.h" //-- gst registry static gboolean bt_gst_registry_class_filter(GstPluginFeature * const feature, gpointer user_data) { const gchar ** categories=(const gchar **)user_data; gboolean res=FALSE; if(GST_IS_ELEMENT_FACTORY(feature)) { const gchar *klass=gst_element_factory_get_klass(GST_ELEMENT_FACTORY(feature)); res=TRUE; while(res && *categories) { GST_LOG(" %s",*categories); // there is also strcasestr() res=(strstr(klass,*categories++)!=NULL); } } return(res); } /** * bt_gst_registry_get_element_factories_matching_all_categories: * @class_filter: path for filtering (e.g. "Sink/Audio") * * Iterates over all available elements and filters by categories given in * @class_filter. * * Returns: list of element factories, use gst_plugin_feature_list_free() after * use. * * Since: 0.6 */ GList *bt_gst_registry_get_element_factories_matching_all_categories(const gchar *class_filter) { g_return_val_if_fail(BT_IS_STRING(class_filter),NULL); GST_DEBUG("run filter for categories: %s",class_filter); gchar **categories=g_strsplit(class_filter,"/",0); GList * list=gst_default_registry_feature_filter(bt_gst_registry_class_filter,FALSE,(gpointer)categories); GST_DEBUG("filtering done"); g_strfreev(categories); return(list); } /** * bt_gst_registry_get_element_names_matching_all_categories: * @class_filter: path for filtering (e.g. "Sink/Audio") * * Iterates over all available elements and filters by categories given in * @class_filter. * * Returns: list of read-only element names, g_list_free after use. */ GList *bt_gst_registry_get_element_names_matching_all_categories(const gchar *class_filter) { const GList *node; GList *res=NULL; g_return_val_if_fail(BT_IS_STRING(class_filter),NULL); GST_DEBUG("run filter for categories: %s",class_filter); GList * const list=bt_gst_registry_get_element_factories_matching_all_categories(class_filter); GST_DEBUG("filtering done"); for(node=list;node;node=g_list_next(node)) { GstPluginFeature * const feature=GST_PLUGIN_FEATURE(node->data); res=g_list_prepend(res,(gpointer)gst_plugin_feature_get_name(feature)); } gst_plugin_feature_list_free((GList *)list); return(res); } /** * bt_gst_element_factory_can_sink_media_type: * @factory: element factory to check * @name: caps type name * * Check if the sink pads of the given @factory are compatible with the given * @name. The @name can e.g. be "audio/x-raw-int". * * Returns: %TRUE if the pads are compatible. */ gboolean bt_gst_element_factory_can_sink_media_type(GstElementFactory *factory,const gchar *name) { GList *node; GstStaticPadTemplate *tmpl; GstCaps *caps; guint i,size; const GstStructure *s; g_assert(GST_IS_ELEMENT_FACTORY(factory)); for(node=(GList *)gst_element_factory_get_static_pad_templates(factory);node;node=g_list_next(node)) { tmpl=node->data; if(tmpl->direction==GST_PAD_SINK) { caps=gst_static_caps_get(&tmpl->static_caps); size=gst_caps_get_size(caps); GST_INFO(" testing caps: %" GST_PTR_FORMAT, caps); for(i=0;idirection); } } return(FALSE); } /** * bt_gst_check_elements: * @list: a #GList with element names * * Check if the given elements exist. * * Returns: a list of element-names which do not exist, %NULL if all elements exist */ GList *bt_gst_check_elements(GList *list) { GList *res=NULL,*node; GstRegistry *registry; GstPluginFeature*feature; g_return_val_if_fail(gst_is_initialized(),NULL); if((registry=gst_registry_get_default())) { for(node=list;node;node=g_list_next(node)) { if((feature=gst_registry_lookup_feature(registry,(const gchar *)node->data))) { gst_object_unref(feature); } else { res=g_list_prepend(res,node->data); } } } return(res); } /** * bt_gst_check_core_elements: * * Check if all core elements exist. * * Returns: a list of elements that does not exist, %NULL if all elements exist. * The list is static, don't free. */ GList *bt_gst_check_core_elements(void) { static GList *core_elements=NULL; static GList *res=NULL; static gboolean core_elements_checked=FALSE; /* @todo: if registry ever gets a 'changed' signal, we need to connect to that and * reset core_elements_checked to FALSE * There is gst_registry_get_feature_list_cookie() now */ if(!core_elements_checked) { core_elements=g_list_prepend(core_elements,"capsfilter"); core_elements=g_list_prepend(core_elements,"queue"); core_elements=g_list_prepend(core_elements,"tee"); core_elements=g_list_prepend(core_elements,"audioconvert"); core_elements=g_list_prepend(core_elements,"adder"); core_elements=g_list_prepend(core_elements,"volume"); core_elements_checked=TRUE; res=bt_gst_check_elements(core_elements); g_list_free(core_elements); core_elements=res; } else { res = core_elements; } return(res); } //-- gst safe linking /* * bt_gst_get_peer_pad: * @elem: a gstreamer element * * Get the peer pad connected to the first pad in the given iter. * * Returns: the pad or %NULL */ static GstPad *bt_gst_get_peer_pad(GstIterator *it) { gboolean done=FALSE; gpointer item; GstPad *pad,*peer_pad=NULL; while (!done) { switch (gst_iterator_next (it, &item)) { case GST_ITERATOR_OK: pad=GST_PAD(item); peer_pad=gst_pad_get_peer(pad); done=TRUE; gst_object_unref(pad); break; case GST_ITERATOR_RESYNC: gst_iterator_resync(it); break; case GST_ITERATOR_ERROR: done=TRUE; break; case GST_ITERATOR_DONE: done=TRUE; break; } } gst_iterator_free(it); return(peer_pad); } #if 0 /* * bt_gst_element_get_src_peer_pad: * @elem: a gstreamer element * * Get the peer pad connected to the given elements first source pad. * * Returns: the pad or %NULL */ static GstPad *bt_gst_element_get_src_peer_pad(GstElement * const elem) { return(bt_gst_get_peer_pad(gst_element_iterate_src_pads(elem))); } #endif /* * bt_gst_element_get_sink_peer_pad: * @elem: a gstreamer element * * Get the peer pad connected to the given elements first sink pad. * * Returns: the pad or %NULL */ static GstPad *bt_gst_element_get_sink_peer_pad(GstElement * const elem) { return(bt_gst_get_peer_pad(gst_element_iterate_sink_pads(elem))); } /** * bt_bin_activate_tee_chain: * @bin: the bin * @tee: the tee to connect the chain to * @analyzers: the list of analyzers * @is_playing: wheter the pipeline is streaming data * * Add the elements from @analyzers to the @bin and link them. Handle pad * blocking in playing mode. * * Return: %TRUE for success */ gboolean bt_bin_activate_tee_chain(GstBin *bin, GstElement *tee, GList* analyzers, gboolean is_playing) { gboolean res=TRUE; const GList* node; GstElement *prev=NULL,*next; GstPad *tee_src,*analyzer_sink; g_return_val_if_fail(GST_IS_BIN(bin),FALSE); g_return_val_if_fail(GST_IS_ELEMENT(tee),FALSE); g_return_val_if_fail(analyzers,FALSE); GST_INFO("add analyzers (%d elements)",g_list_length(analyzers)); // do final link afterwards for(node=analyzers;(node && res);node=g_list_next(node)) { next=GST_ELEMENT(node->data); if(!(res=gst_bin_add(bin,next))) { GST_INFO("cannot add element \"%s\" to bin",GST_OBJECT_NAME(next)); } if(prev) { if(!(res=gst_element_link(prev,next))) { GST_INFO("cannot link elements \"%s\" -> \"%s\"",GST_OBJECT_NAME(prev),GST_OBJECT_NAME(next)); } } prev=next; } GST_INFO("blocking tee.src"); tee_src=gst_element_get_request_pad(tee,"src%d"); analyzer_sink=gst_element_get_static_pad(GST_ELEMENT(analyzers->data),"sink"); if(is_playing) gst_pad_set_blocked(tee_src,TRUE); GST_INFO("sync state"); for(node=analyzers;node;node=g_list_next(node)) { next=GST_ELEMENT(node->data); if(!(gst_element_sync_state_with_parent(next))) { GST_INFO("cannot sync state for elements \"%s\"",GST_OBJECT_NAME(next)); } } GST_INFO("linking to tee"); if(GST_PAD_LINK_FAILED(gst_pad_link(tee_src,analyzer_sink))) { GST_INFO("cannot link analyzers to tee"); } if(is_playing) gst_pad_set_blocked(tee_src,FALSE); gst_object_unref(analyzer_sink); GST_INFO("add analyzers done"); return(res); } /** * bt_bin_deactivate_tee_chain: * @bin: the bin * @tee: the tee to connect the chain to * @analyzers: the list of analyzers * @is_playing: wheter the pipeline is streaming data * * Add the elements from @analyzers to the @bin and link them. Handle pad * blocking in playing mode. * * Return: %TRUE for success */ gboolean bt_bin_deactivate_tee_chain(GstBin *bin, GstElement *tee, GList* analyzers, gboolean is_playing) { gboolean res=TRUE; const GList* node; GstElement *prev,*next; GstPad *src_pad=NULL; GstStateChangeReturn state_ret; g_return_val_if_fail(GST_IS_BIN(bin),FALSE); g_return_val_if_fail(GST_IS_ELEMENT(tee),FALSE); g_return_val_if_fail(analyzers,FALSE); GST_INFO("remove analyzers (%d elements)",g_list_length(analyzers)); if((src_pad=bt_gst_element_get_sink_peer_pad(GST_ELEMENT(analyzers->data)))) { // block src_pad (of tee) if(is_playing) gst_pad_set_blocked(src_pad,TRUE); } prev=tee; for(node=analyzers;(node && res);node=g_list_next(node)) { next=GST_ELEMENT(node->data); if((state_ret=gst_element_set_state(next,GST_STATE_NULL))!=GST_STATE_CHANGE_SUCCESS) { GST_INFO("cannot set state to NULL for element '%s', ret='%s'",GST_OBJECT_NAME(next),gst_element_state_change_return_get_name(state_ret)); } gst_element_unlink(prev,next); prev=next; } for(node=analyzers;(node && res);node=g_list_next(node)) { next=GST_ELEMENT(node->data); if(!(res=gst_bin_remove(bin,next))) { GST_INFO("cannot remove element '%s' from bin",GST_OBJECT_NAME(next)); } } if(src_pad) { if(is_playing) gst_pad_set_blocked(src_pad,FALSE); // remove request-pad GST_INFO("releasing request pad for tee"); gst_element_release_request_pad(tee,src_pad); gst_object_unref(src_pad); } return(res); } //-- gst debugging /** * bt_gst_debug_pad_link_return: * @link_res: pad link result * @src_pad: the source pad * @sink_pad: the sink pad * * Format a nice debug message from failed pad links. * * Returns: the message. The returned string has to be used before the can be * called again, otherwise the previous reult will be overwritten. */ const gchar *bt_gst_debug_pad_link_return(GstPadLinkReturn link_res, GstPad *src_pad, GstPad *sink_pad) { static gchar msg1[5000]; gchar msg2[4000]; static gchar *link_res_desc[] = { "link succeeded", "pads have no common grandparent", "pad was already linked", "pads have wrong direction", "pads do not have common format", "pads cannot cooperate in scheduling", "refused for some reason" }; if (!src_pad || !sink_pad) { /* one of the pads is NULL */ msg2[0]='\0'; } else { switch(link_res) { case GST_PAD_LINK_WRONG_HIERARCHY: { GstObject *src_parent = GST_OBJECT_PARENT(src_pad); GstObject *sink_parent = GST_OBJECT_PARENT(sink_pad); sprintf(msg2," : parent(src) = %s, parent(sink) = %s", (src_parent?GST_OBJECT_NAME(src_parent):"(NULL)"), (sink_parent?GST_OBJECT_NAME(sink_parent):"(NULL)")); break; } case GST_PAD_LINK_WAS_LINKED: { GstPad *src_peer = src_pad->peer; GstPad *sink_peer = sink_pad->peer; sprintf(msg2," : peer(src) = %s:%s, peer(sink) = %s:%s", GST_DEBUG_PAD_NAME(src_peer), GST_DEBUG_PAD_NAME(sink_peer)); break; } case GST_PAD_LINK_WRONG_DIRECTION: { static gchar *dir_name[] = {"unknown", "src", "sink" }; sprintf(msg2," : direction(src) = %s, direction(sink) = %s", ((src_pad->direction<3)?dir_name[src_pad->direction]:"invalid"), ((sink_pad->direction<3)?dir_name[sink_pad->direction]:"invalid")); break; } case GST_PAD_LINK_NOFORMAT: { #if GST_CHECK_VERSION(0,10,26) GstCaps *srcc = gst_pad_get_caps_reffed(src_pad); GstCaps *sinkc = gst_pad_get_caps_reffed(sink_pad); #else GstCaps *srcc = gst_pad_get_caps(src_pad); GstCaps *sinkc = gst_pad_get_caps(sink_pad); #endif gchar *src_caps = gst_caps_to_string(srcc); gchar *sink_caps = gst_caps_to_string(sinkc); sprintf(msg2," : caps(src) = %s, caps(sink) = %s",src_caps,sink_caps); g_free(src_caps);g_free(sink_caps); gst_caps_unref(srcc);gst_caps_unref(sinkc); break; } case GST_PAD_LINK_NOSCHED: case GST_PAD_LINK_REFUSED: case GST_PAD_LINK_OK: default: msg2[0]='\0'; break; } } sprintf(msg1, "%s:%s -> %s:%s : %s%s", GST_DEBUG_PAD_NAME(src_pad),GST_DEBUG_PAD_NAME(sink_pad), link_res_desc[-link_res], msg2); return msg1; } //-- gst compat //-- glib compat & helper /** * bt_g_type_get_base_type: * @type: a GType * * Call g_type_parent() as long as it returns a parent. * * Returns: the super parent type, aka base type. */ GType bt_g_type_get_base_type(GType type) { GType base; while((base=g_type_parent(type))) type=base; return(type); } //-- cpu load monitoring static GstClockTime treal_last=G_GINT64_CONSTANT(0),tuser_last=G_GINT64_CONSTANT(0),tsys_last=G_GINT64_CONSTANT(0); //long clk=1; //long num_cpus; #if WIN32 #include //For GetSystemInfo #endif /* * bt_cpu_load_init: * * Initializes cpu usage monitoring. */ static void GST_GNUC_CONSTRUCTOR bt_cpu_load_init(void) { treal_last=gst_util_get_timestamp(); //clk=sysconf(_SC_CLK_TCK); /* @todo: we might need to handle multi core cpus and divide by num-cores * http://lxr.linux.no/linux/include/linux/cpumask.h #ifndef WIN32 num_cpus = sysconf (_SC_NPROCESSORS_ONLN); #else SYSTEM_INFO si; GetSystemInfo(&si); num_cpus = si.dwNumberOfProcessors; #endif */ } /** * bt_cpu_load_get_current: * * Determines the current CPU load. * * Returns: CPU usage as integer ranging from 0% to 100% */ guint bt_cpu_load_get_current(void) { struct rusage rus,ruc; GstClockTime tnow,treal,tuser,tsys; guint cpuload; // check real time elapsed tnow=gst_util_get_timestamp(); treal=tnow-treal_last; treal_last=tnow; // check time spent load getrusage(RUSAGE_SELF,&rus); getrusage(RUSAGE_CHILDREN,&ruc); tnow=GST_TIMEVAL_TO_TIME(rus.ru_utime)+GST_TIMEVAL_TO_TIME(ruc.ru_utime); tuser=tnow-tuser_last; tuser_last=tnow; tnow=GST_TIMEVAL_TO_TIME(rus.ru_stime)+GST_TIMEVAL_TO_TIME(ruc.ru_stime); tsys=tnow-tsys_last; tsys_last=tnow; // percentage cpuload=(guint)gst_util_uint64_scale(tuser+tsys,G_GINT64_CONSTANT(100),treal); GST_LOG("real %"GST_TIME_FORMAT", user %"GST_TIME_FORMAT", sys %"GST_TIME_FORMAT" => cpuload %d",GST_TIME_ARGS(treal),GST_TIME_ARGS(tuser),GST_TIME_ARGS(tsys),cpuload); //printf("user %6.4lf, sys %6.4lf\n",(double)tms.tms_utime/(double)clk,(double)tms.tms_stime/(double)clk); return(cpuload); } buzztard-0.6.0/src/lib/core/buzzcallbacks.c0000644042355400116100000001355511576360371015616 00000000000000/* $Id: buzzcallbacks.c 3131 2011-01-10 20:01:13Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_CORE #define BT_BUZZCALLBACKS_C #include "core_private.h" #ifdef USE_BML #include /* * we could use some static hashtables to cache the returned structs * if bt_buzz_callbacks_get() is called with a song different from what we have * set there, we flush the hash tables */ // structs typedef struct { int Flags; float Volume; } BuzzWaveInfo; typedef struct { int numSamples; short *pSamples; int RootNote; int SamplesPerSec; int LoopStart; int LoopEnd; } BuzzWaveLevel; // callbacks static void const *GetWave(CHostCallbacks *self, int const i) { // 200 is WAVE_MAX static BuzzWaveInfo res[200]={{0,},}; BtSong *song=BT_SONG(self->user_data); BtWavetable *wavetable; BtWave *wave; BtWaveLoopMode loop_mode; gdouble volume; guint channels; GST_DEBUG("(%p,%d)",self,i); if(G_UNLIKELY(!song)) return(NULL); g_object_get(song,"wavetable",&wavetable,NULL); if(G_UNLIKELY(!wavetable)) return(NULL); if((wave=bt_wavetable_get_wave_by_index(wavetable,i))) { g_object_get(wave,"volume",&volume,"loop-mode",&loop_mode,"channels",&channels,NULL); res[i].Volume=volume; res[i].Flags=0; switch(loop_mode) { case BT_WAVE_LOOP_MODE_OFF: break; case BT_WAVE_LOOP_MODE_FORWARD: res[i].Flags|=1; break; case BT_WAVE_LOOP_MODE_PINGPONG: res[i].Flags|=1+16; break; } if(channels==2) { res[i].Flags|=8; } g_object_unref(wave); GST_DEBUG("= %d, %f",res[i].Flags,res[i].Volume); } else { GST_WARNING("no wave for index %d",i); } g_object_unref(wavetable); return(&res[i]); } // @todo: this is still racy if multiple levels are used static void const *GetWaveLevel(CHostCallbacks *self, int const i, int const level) { // 200 is WAVE_MAX static BuzzWaveLevel res[200]={{0,},}; BtSong *song=BT_SONG(self->user_data); BtWavetable *wavetable; BtWave *wave; BtWavelevel *wavelevel; GST_DEBUG("(%p,%d,%d)",self,i,level); if(G_UNLIKELY(!song)) return(NULL); g_object_get(song,"wavetable",&wavetable,NULL); if(G_UNLIKELY(!wavetable)) return(NULL); if((wave=bt_wavetable_get_wave_by_index(wavetable,i))) { if((wavelevel=bt_wave_get_level_by_index(wave,level))) { gulong length,rate; glong ls, le; guchar root_note; // fill BuzzWaveLevel g_object_get(wavelevel,"length",&length, "rate",&rate, "loop-start",&ls, "loop-end",&le, "root-note",&root_note, "data",&res[i].pSamples, NULL); res[i].numSamples=length; res[i].SamplesPerSec=rate; res[i].RootNote=root_note; res[i].LoopStart=ls; res[i].LoopEnd=le; g_object_unref(wavelevel); } else { GST_WARNING("no wavelevel for index %d",level); } g_object_unref(wave); } else { GST_WARNING("no wave for index %d",i); } g_object_unref(wavetable); return(&res[i]); } static void const *GetNearestWaveLevel(CHostCallbacks *self, int const i, int const note) { // 200 is WAVE_MAX static BuzzWaveLevel res[200]={{0,},}; BtSong *song=BT_SONG(self->user_data); BtWavetable *wavetable; BtWave *wave; GST_DEBUG("(%p,%d,%d)",self,i,note); if(G_UNLIKELY(!song)) return(NULL); g_object_get(song,"wavetable",&wavetable,NULL); if(G_UNLIKELY(!wavetable)) return(NULL); if((wave=bt_wavetable_get_wave_by_index(wavetable,i))) { GList *list,*node; BtWavelevel *wavelevel,*best=NULL; gint max_diff=/*NOTE_MAX*/200+1; guchar root_note; g_object_get(wave,"wavelevels",&list,NULL); for(node=list;node;node=g_list_next(node)) { wavelevel=BT_WAVELEVEL(node->data); g_object_get(wavelevel,"root-note",&root_note,NULL); GST_DEBUG(" note=%d, diff=%d, max_diff=%d", (gint)root_note,abs(note-(gint)root_note),max_diff); if(abs(note-(gint)root_note) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsinkmachine * @short_description: class for signal processing machines with inputs only * * Sinks are machines that do playback or recording of the song. The * sink-machine utilizes the #BtSinkBin to transparently switch elements between * record (encoding) and playback. */ #define BT_CORE #define BT_SINK_MACHINE_C #include "core_private.h" #include //-- the class static void bt_sink_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSinkMachine, bt_sink_machine, BT_TYPE_MACHINE, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_sink_machine_persistence_interface_init)); //-- pad templates static GstStaticPadTemplate machine_sink_template = GST_STATIC_PAD_TEMPLATE ("sink%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); //-- constructor methods /** * bt_sink_machine_new: * @song: the song the new instance belongs to * @id: the id, we can use to lookup the machine * @err: inform about failed instance creation * * Create a new instance. * The machine is automaticly added to the setup from the given song object. You * don't need to add the machine with * #bt_setup_add_machine(setup,BT_MACHINE(machine));. * The element used for this machine is #BtSinkBin which is configured according * to the use-case (playback, recordfing). The playback device is taken from the * #BtSettings. * * Returns: the new instance or %NULL in case of an error */ BtSinkMachine *bt_sink_machine_new(const BtSong * const song, const gchar * const id, GError **err) { return(BT_SINK_MACHINE(g_object_new(BT_TYPE_SINK_MACHINE,"construction-error",err,"song",song,"id",id,"plugin-name","bt-sink-bin",NULL))); } //-- methods //-- io interface static xmlNodePtr bt_sink_machine_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { //BtSinkMachine *self = BT_SINK_MACHINE(persistence); BtPersistenceInterface * const parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(persistence)); xmlNodePtr node=NULL; GST_DEBUG("PERSISTENCE::sink-machine"); // save parent class stuff if((node=parent_iface->save(persistence,parent_node))) { xmlNewProp(node,XML_CHAR_PTR("type"),XML_CHAR_PTR("sink")); } return(node); } static BtPersistence *bt_sink_machine_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtSinkMachine *self; BtPersistence *result; BtPersistenceInterface *parent_iface; GST_DEBUG("PERSISTENCE::sink_machine"); g_assert(node); xmlChar * const id=xmlGetProp(node,XML_CHAR_PTR("id")); if(!persistence) { BtSong *song=NULL; gchar *param_name; va_list va; G_VA_COPY(va,var_args); // we need to get parameters from var_args // @todo: this is duplicated code among the subclasses param_name=va_arg(va,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(va,gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(va,gchar*); } self=bt_sink_machine_new(song,(gchar*)id,err); result=BT_PERSISTENCE(self); va_end (va); } else { self=BT_SINK_MACHINE(persistence); result=BT_PERSISTENCE(persistence); g_object_set(self,"plugin-name","bt-sink-bin",NULL); } xmlFree(id); // load parent class stuff parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(result)); parent_iface->load(BT_TYPE_MACHINE,result,node,NULL,var_args); return(result); } static void bt_sink_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_sink_machine_persistence_load; iface->save = bt_sink_machine_persistence_save; } //-- wrapper //-- bt_machine overrides static gboolean bt_sink_machine_check_type(const BtMachine * const self, const gulong pad_src_ct, const gulong pad_sink_ct) { if(pad_src_ct>0 || pad_sink_ct==0) { GST_ERROR_OBJECT(self,"plugin has %lu src pads instead of 0 and %lu sink pads instead of >0", pad_src_ct,pad_sink_ct); return(FALSE); } return(TRUE); } //-- g_object overrides static void bt_sink_machine_constructed(GObject *object) { BtSinkMachine * const self=BT_SINK_MACHINE(object); GError **err; GST_INFO("sink-machine constructed"); G_OBJECT_CLASS(bt_sink_machine_parent_class)->constructed(object); g_object_get(self,"construction-error",&err,NULL); if(err==NULL || *err==NULL) { BtSong * const song; GstElement * const element; GstElement * const gain; BtSetup *setup; BtMachine *machine=(BtMachine *)self; bt_machine_activate_adder(machine); bt_machine_enable_input_gain(machine); g_object_get(self,"machine",&element,"song",&song,"input-gain",&gain,NULL); g_object_set(element,"input-gain",gain,NULL); g_object_set(song,"master",self,NULL); gst_object_unref(element); gst_object_unref(gain); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been constructed",self,G_OBJECT_REF_COUNT(self)); // add the machine to the setup of the song g_object_get(song,"setup",&setup,NULL); bt_setup_add_machine(setup,machine); g_object_unref(setup); g_object_unref(song); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been added",self,G_OBJECT_REF_COUNT(self)); } } //-- class internals static void bt_sink_machine_init(BtSinkMachine *self) { } static void bt_sink_machine_class_init(BtSinkMachineClass *klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const gstelement_klass = GST_ELEMENT_CLASS(klass); BtMachineClass * const machine_class = BT_MACHINE_CLASS(klass); gobject_class->constructed = bt_sink_machine_constructed; machine_class->check_type = bt_sink_machine_check_type; gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&machine_sink_template)); } buzztard-0.6.0/src/lib/core/wire-pattern.c0000644042355400116100000012775311626121152015377 00000000000000/* $Id: wire-pattern.c 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwirepattern * @short_description: class for an event pattern of a #BtMachine instance * * A wire-pattern contains a grid of events. Events are parameter changes in * #BtWire objects. The events are stored as #GValues. Cells contaning %NULL * have no event for the parameter at the time. * * The wire-patterns are used in normal #BtPattern objects as a group for each * input of the #BtMachine that is the owner of the pattern. * * Wire-patterns synchronize their length to the length of the pattern they * belong to. */ /* we need wire_params (volume,panning ) per input * - only for processor machines sink machine patterns * - volume: is input-volume for the wire * - one volume per input * - panning: is panorama on the wire, if we connect e.g. mono -> stereo * - panning parameters can change, if the connection changes * - mono-to-stereo (1->2): 1 parameter * - mono-to-suround (1->4): 2 parameters * - stereo-to-surround (2->4): 1 parameter */ /* @todo: BtWirePattern is not a good name :/ * - maybe we can make BtPattern a base class and also have BtMachinePattern */ #define BT_CORE #define BT_WIRE_PATTERN_C #include "core_private.h" //-- signal ids enum { PARAM_CHANGED_EVENT, PATTERN_CHANGED_EVENT, LAST_SIGNAL }; //-- property ids enum { WIRE_PATTERN_SONG=1, WIRE_PATTERN_WIRE, WIRE_PATTERN_PATTERN }; struct _BtWirePatternPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the pattern belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the number of ticks */ gulong length; /* the number of dynamic params */ gulong num_params; /* the wire the wire-pattern belongs to */ G_POINTER_ALIAS(BtWire *,wire); /* the pattern the wire-pattern belongs to */ G_POINTER_ALIAS(BtPattern *,pattern); /* an array of GValues (not pointing to) * with the size of length*num_params */ GValue *data; /* signal handler ids */ gint pattern_length_changed; }; static GQuark error_domain=0; static guint signals[LAST_SIGNAL]={0,}; //-- the class static void bt_wire_pattern_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtWirePattern, bt_wire_pattern, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_wire_pattern_persistence_interface_init)); //-- enums //-- helper methods /* * bt_wire_pattern_resize_data_length: * @self: the pattern to resize the length * @length: the old length * * Resizes the event data grid to the new length. Keeps previous values. */ static void bt_wire_pattern_resize_data_length(const BtWirePattern * const self, const gulong length) { const gulong old_data_count= length*self->priv->num_params; const gulong new_data_count=self->priv->length*self->priv->num_params; GValue * const data=self->priv->data; // allocate new space if((self->priv->data=g_try_new0(GValue,new_data_count))) { if(data) { gulong count=MIN(old_data_count,new_data_count); GST_DEBUG("keeping data count=%lu, old=%lu, new=%lu",count,old_data_count,new_data_count); // copy old values over memcpy(self->priv->data,data,count*sizeof(GValue)); // free gvalues if(old_data_count>new_data_count) { gulong i; for(i=new_data_count;ipriv->length, new_data_count,self->priv->length,self->priv->num_params); } else { GST_INFO("extending pattern length from %lu to %lu failed : data_count=%lu = length=%lu * np=%lu)", length,self->priv->length, new_data_count,self->priv->length,self->priv->num_params); //self->priv->data=data; //self->priv->length=length; } } /* * bt_wire_pattern_init_event: * @self: the pattern that holds the cell * @event: the pattern-cell to initialise * @param: the index of the param * * Initialises a pattern cell with the type of the n-th param of the wire. */ static void bt_wire_pattern_init_event(const BtWirePattern * const self, GValue * const event, const gulong param) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); //GST_DEBUG("at %d",param); g_value_init(event,bt_wire_get_param_type(self->priv->wire,param)); g_assert(G_IS_VALUE(event)); } //-- event handler static void on_pattern_length_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data) { BtWirePattern *self=BT_WIRE_PATTERN(user_data); const gulong length=self->priv->length; GST_INFO("pattern length changed : %p",self->priv->pattern); g_object_get((gpointer)(self->priv->pattern),"length",&self->priv->length,NULL); if(length!=self->priv->length) { GST_DEBUG("set the length for wire-pattern: %lu",self->priv->length); bt_wire_pattern_resize_data_length(self,length); } } //-- constructor methods /** * bt_wire_pattern_new: * @song: the song the new instance belongs to * @wire: the wire the pattern belongs to * @pattern: the pattern that gets extended * * Create a new instance. * * Returns: the new instance or %NULL in case of an error */ BtWirePattern *bt_wire_pattern_new(const BtSong * const song, const BtWire * const wire, const BtPattern * const pattern) { return(BT_WIRE_PATTERN(g_object_new(BT_TYPE_WIRE_PATTERN,"song",song,"wire",wire,"pattern",pattern,NULL))); } /** * bt_wire_pattern_copy: * @self: the wire pattern to create a copy from * @pattern: the new pattern for the copy * * Create a new instance as a copy of the given instance. This is usualy done in * sync with bt_pattern_copy(). * * Returns: the new instance or %NULL in case of an error */ BtWirePattern *bt_wire_pattern_copy(const BtWirePattern * const self, const BtPattern * const pattern) { BtWirePattern *wire_pattern; gulong data_count; gulong i; g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),NULL); wire_pattern=bt_wire_pattern_new(self->priv->song,self->priv->wire,pattern); data_count=self->priv->length*self->priv->num_params; // deep copy data for(i=0;ipriv->data[i])) { g_value_init(&wire_pattern->priv->data[i],G_VALUE_TYPE(&self->priv->data[i])); g_value_copy(&self->priv->data[i],&wire_pattern->priv->data[i]); } } GST_INFO(" data copied"); return(wire_pattern); } //-- methods /** * bt_wire_pattern_get_event_data: * @self: the pattern to search for the param * @tick: the tick (time) position starting with 0 * @param: the number of the parameter starting with 0 * * Fetches a cell from the given location in the pattern. If there is no event * there, then the %GValue is uninitialized. Test with BT_IS_GVALUE(event). * * Returns: the GValue or %NULL if out of the pattern range */ GValue *bt_wire_pattern_get_event_data(const BtWirePattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),NULL); g_return_val_if_fail(self->priv->data,NULL); if(G_UNLIKELY(!(tickpriv->length))) { GST_ERROR("tick=%lu beyond length=%lu in wire-pattern",tick,self->priv->length);return(NULL); } if(G_UNLIKELY(!(parampriv->num_params))) { GST_ERROR("param=%lu beyond num_params=%lu in wire-pattern",param,self->priv->num_params);return(NULL); } const gulong index=(tick*self->priv->num_params)+param; g_assert(index<(self->priv->length*self->priv->num_params)); return(&self->priv->data[index]); } /** * bt_wire_pattern_set_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the parameter starting with 0 * @value: the string representation of the value to store * * Stores the supplied value into the specified pattern cell. * * Returns: %TRUE for success */ gboolean bt_wire_pattern_set_event(const BtWirePattern * const self, const gulong tick, const gulong param, const gchar * const value) { gboolean res=FALSE; GValue *event; g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); if((event=bt_wire_pattern_get_event_data(self,tick,param))) { if(BT_IS_STRING(value)) { if(!BT_IS_GVALUE(event)) { bt_wire_pattern_init_event(self,event,param); } if(bt_persistence_set_value(event,value)) { res=TRUE; } else { GST_INFO("failed to set GValue for cell at tick=%lu, param=%lu",tick,param); } } else { if(BT_IS_GVALUE(event)) { g_value_unset(event); } res=TRUE; } if(res) { // notify others that the data has been changed g_signal_emit((gpointer)self,signals[PARAM_CHANGED_EVENT],0,tick,self->priv->wire,param); } } else { GST_DEBUG("no GValue found for cell at tick=%lu, param=%lu",tick,param); } return(res); } /** * bt_wire_pattern_get_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the parameter starting with 0 * * Returns the string representation of the specified cell. Free it when done. * * Returns: a newly allocated string with the data or %NULL on error */ gchar *bt_wire_pattern_get_event(const BtWirePattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),NULL); g_return_val_if_fail(tickpriv->length,NULL); GValue * const event=bt_wire_pattern_get_event_data(self,tick,param); if(event && BT_IS_GVALUE(event)) { return(bt_persistence_get_value(event)); } return(NULL); } /** * bt_wire_pattern_test_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the parameter starting with 0 * * Tests if there is an event in the specified cell. * * Returns: %TRUE if there is an event */ gboolean bt_wire_pattern_test_event(const BtWirePattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); const GValue * const event=bt_wire_pattern_get_event_data(self,tick,param); if(event && BT_IS_GVALUE(event)) { return(TRUE); } return(FALSE); } /** * bt_wire_pattern_tick_has_data: * @self: the pattern to check * @tick: the tick index in the pattern * * Check if there are any event in the given pattern-row. * * Returns: %TRUE is there are events, %FALSE otherwise */ gboolean bt_wire_pattern_tick_has_data(const BtWirePattern * const self, const gulong tick) { const gulong num_params=self->priv->num_params; gulong k; GValue *data; g_return_val_if_fail(BT_IS_WIRE_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); data=&self->priv->data[tick*num_params]; for(k=0;kpriv->length; const gulong num_params=self->priv->num_params; GValue *src=&self->priv->data[param+num_params*(length-2)]; GValue *dst=&self->priv->data[param+num_params*(length-1)]; gulong i; GST_INFO("insert row at %lu,%lu", tick, param); for(i=tick;ipriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _insert_row(self,tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_wire_pattern_insert_full_row: * @self: the pattern * @tick: the postion to insert at * * Insert one empty row for all parameters. * * Since: 0.3 */ void bt_wire_pattern_insert_full_row(const BtWirePattern * const self, const gulong tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); const gulong num_params=self->priv->num_params; gulong j; GST_DEBUG("insert full-row at %lu", tick); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->length; const gulong num_params=self->priv->num_params; GValue *src=&self->priv->data[param+num_params*(tick+1)]; GValue *dst=&self->priv->data[param+num_params*tick]; gulong i; GST_INFO("insert row at %lu,%lu", tick, param); for(i=tick;ipriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _delete_row(self,tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_wire_pattern_delete_full_row: * @self: the pattern * @tick: the postion to delete * * Delete row for all parameters. * * Since: 0.3 */ void bt_wire_pattern_delete_full_row(const BtWirePattern * const self, const gulong tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); const gulong num_params=self->priv->num_params; gulong j; GST_DEBUG("insert full-row at %lu", tick); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->data[param+self->priv->num_params*start_tick]; gulong i,ticks=(end_tick+1)-start_tick; for(i=0;ipriv->num_params; } } /** * bt_wire_pattern_delete_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Randomize values from @start_tick to @end_tick for @param. * * Since: 0.6 */ void bt_wire_pattern_delete_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _delete_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_wire_pattern_delete_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Clear values from @start_tick to @end_tick for all params. * * Since: 0.6 */ void bt_wire_pattern_delete_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); const gulong num_params=self->priv->num_params; gulong j; g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->num_params; GValue *beg=&self->priv->data[param+params*start_tick]; GValue *end=&self->priv->data[param+params*end_tick]; gulong i,ticks=end_tick-start_tick; GParamSpec *property; GType base_type; if(!BT_IS_GVALUE(beg) || !BT_IS_GVALUE(end)) { GST_INFO("Can't blend, beg or end is empty"); return; } property=bt_wire_get_param_spec(self->priv->wire, param); base_type=bt_g_type_get_base_type(property->value_type); GST_INFO("blending gvalue type %s",G_VALUE_TYPE_NAME(end)); // @todo: should this honour the cursor stepping? e.g. enter only every second value switch(base_type) { _BLEND(int,INT) _BLEND(uint,UINT) _BLEND(int64,INT64) _BLEND(uint64,UINT64) _BLEND(float,FLOAT) _BLEND(double,DOUBLE) case G_TYPE_ENUM:{ GParamSpecEnum *p=G_PARAM_SPEC_ENUM (property); GEnumClass *e=p->enum_class; gdouble val1,val2,step; gint v; val1=g_enum_get_value(e,g_value_get_enum(beg))->value; val2=g_enum_get_value(e,g_value_get_enum(end))->value; step=(val2-val1)/(gdouble)ticks; for(i=0;ivalue_type); v=(gint)(val1+(step*i)); // handle sparse enums g_value_set_enum(beg,e->values[v].value); beg+=params; } } break; default: GST_WARNING("unhandled gvalue type %s",G_VALUE_TYPE_NAME(end)); } } /** * bt_wire_pattern_blend_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Fade values from @start_tick to @end_tick for @param. * * Since: 0.3 */ void bt_wire_pattern_blend_column(const BtWirePattern * const self, const gulong start_tick,const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _blend_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0); } /** * bt_wire_pattern_blend_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Fade values from @start_tick to @end_tick for all params. * * Since: 0.3 */ void bt_wire_pattern_blend_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); const gulong num_params=self->priv->num_params; gulong j; for(j=0;jpriv->data[param+self->priv->num_params*start_tick]; GValue *end=&self->priv->data[param+self->priv->num_params*end_tick]; GParamSpec *property; GType base_type; GValue tmp={0,}; property=bt_wire_get_param_spec(self->priv->wire, param); base_type=property->value_type; GST_INFO("flipping gvalue type %s",G_VALUE_TYPE_NAME(base_type)); g_value_init(&tmp,base_type); while(begpriv->num_params; end-=self->priv->num_params; } g_value_unset(&tmp); } /** * bt_wire_pattern_flip_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Flips values from @start_tick to @end_tick for @param up-side down. * * Since: 0.6 */ void bt_wire_pattern_flip_column(const BtWirePattern * const self, const gulong start_tick,const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _flip_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0); } /** * bt_wire_pattern_flip_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Flips values from @start_tick to @end_tick for all params up-side down. * * Since: 0.6 */ void bt_wire_pattern_flip_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); const gulong num_params=self->priv->num_params; gulong j; for(j=0;jminimum+((p->maximum-p->minimum)*rnd))); \ beg+=params; \ } \ } break; static void _randomize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { gulong params=self->priv->num_params; GValue *beg=&self->priv->data[param+params*start_tick]; //GValue *end=&self->priv->data[param+params*end_tick]; gulong i,ticks=(end_tick+1)-start_tick; GParamSpec *property; GType base_type; gdouble rnd; property=bt_wire_get_param_spec(self->priv->wire, param); base_type=bt_g_type_get_base_type(property->value_type); GST_INFO("blending gvalue type %s",g_type_name(property->value_type)); // @todo: should this honour the cursor stepping? e.g. enter only every second value // @todo: if beg and end are not empty, shall we use them as upper and lower // bounds instead of the pspec values (ev. have a flag on the function) switch(base_type) { _RANDOMIZE(int,INT,Int) _RANDOMIZE(uint,UINT,UInt) _RANDOMIZE(int64,INT64,Int64) _RANDOMIZE(uint64,UINT64,UInt64) _RANDOMIZE(float,FLOAT,Float) _RANDOMIZE(double,DOUBLE,Double) case G_TYPE_BOOLEAN:{ for(i=0;ienum_class; gint nv=e->n_values-1; // don't use no_value gint v; for(i=0;ivalue_type); rnd=((gdouble)rand())/(RAND_MAX+1.0); v=(gint)(nv*rnd); // handle sparse enums g_value_set_enum(beg,e->values[v].value); beg+=params; } } break; default: GST_WARNING("unhandled gvalue type %s",G_VALUE_TYPE_NAME(base_type)); } } /** * bt_wire_pattern_randomize_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Randomize values from @start_tick to @end_tick for @param. * * Since: 0.3 */ void bt_wire_pattern_randomize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _randomize_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0); } /** * bt_wire_pattern_randomize_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Randomize values from @start_tick to @end_tick for all params. * * Since: 0.3 */ void bt_wire_pattern_randomize_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); const gulong num_params=self->priv->num_params; gulong j; for(j=0;jpriv->data[param+self->priv->num_params*start_tick]; gulong i,ticks=(end_tick+1)-start_tick; gchar *val; g_string_append(data,g_type_name(bt_wire_get_param_type(self->priv->wire,param))); for(i=0;ipriv->num_params; } g_string_append_c(data,'\n'); } /** * bt_wire_pattern_serialize_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * @data: the target * * Serializes values from @start_tick to @end_tick for @param into @data. * * Since: 0.6 */ void bt_wire_pattern_serialize_column(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param, GString *data) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_return_if_fail(data); _serialize_column(self,start_tick,end_tick,param,data); } /** * bt_wire_pattern_serialize_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @data: the target * * Serializes values from @start_tick to @end_tick for all params into @data. * * Since: 0.6 */ void bt_wire_pattern_serialize_columns(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, GString *data) { g_return_if_fail(BT_IS_WIRE_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_return_if_fail(data); const gulong num_params=self->priv->num_params; gulong j; for(j=0;jpriv->length,FALSE); g_return_val_if_fail(end_tickpriv->length,FALSE); g_return_val_if_fail(self->priv->data,FALSE); g_return_val_if_fail(data,FALSE); const gulong num_params=self->priv->num_params; gboolean ret=TRUE; GType stype,dtype; gchar **fields; fields=g_strsplit_set(data,",",0); // get types in pattern and clipboard data dtype=bt_wire_get_param_type(self->priv->wire,param); stype=g_type_from_name(fields[0]); if(dtype==stype) { gint i=1; GValue *beg=&self->priv->data[param+num_params*start_tick]; GST_INFO("types match %s <-> %s",fields[0],g_type_name(dtype)); while(fields[i] && *fields[i]) { if(*fields[i]!=' ') { if(!BT_IS_GVALUE(beg)) { g_value_init(beg,dtype); } bt_persistence_set_value(beg, fields[i]); } else { if(BT_IS_GVALUE(beg)) { g_value_unset(beg); } } beg+=num_params; i++; } } else { GST_INFO("types don't match in %s <-> %s",fields[0],g_type_name(dtype)); ret=FALSE; } g_strfreev(fields); return(ret); } //-- io interface static xmlNodePtr bt_wire_pattern_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtWirePattern * const self = BT_WIRE_PATTERN(persistence); gchar *id; xmlNodePtr node=NULL; xmlNodePtr child_node,child_node2; GST_DEBUG("PERSISTENCE::wire-pattern"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("wire-pattern"),NULL))) { gulong i,k; gchar *value; BtWire *wire; const gulong length=self->priv->length; const gulong num_params=self->priv->num_params; g_object_get((gpointer)(self->priv->pattern),"id",&id,NULL); xmlNewProp(node,XML_CHAR_PTR("pattern-id"),XML_CHAR_PTR(id)); g_free(id); g_object_get((gpointer)self,"wire",&wire,NULL); // save pattern data for(i=0;ichildren;node;node=node->next) { if((!xmlNodeIsText(node)) && (!strncmp((gchar *)node->name,"tick\0",5))) { tick_str=xmlGetProp(node,XML_CHAR_PTR("time")); tick=atoi((char *)tick_str); // iterate over children for(child_node=node->children;child_node;child_node=child_node->next) { if(!xmlNodeIsText(child_node)) { name=xmlGetProp(child_node,XML_CHAR_PTR("name")); value=xmlGetProp(child_node,XML_CHAR_PTR("value")); //GST_DEBUG(" \"%s\" -> \"%s\"",safe_string(name),safe_string(value)); if(!strncmp((char *)child_node->name,"wiredata\0",9)) { param=bt_wire_get_param_index(self->priv->wire,(gchar *)name,&error); if(!error) { bt_wire_pattern_set_event(self,tick,param,(gchar *)value); } else { GST_WARNING("error while loading wire pattern data at tick %lu, param %lu: %s",tick,param,error->message); g_error_free(error);error=NULL; } } xmlFree(name); xmlFree(value); } } xmlFree(tick_str); } } Done: xmlFree(pattern_id); g_object_try_unref(dst_machine); return(result); NoPatternError: GST_WARNING("No pattern with id='%s'",pattern_id); if(err) { g_set_error(err, error_domain, /* errorcode= */0, "No pattern with id='%s'",pattern_id); } goto Done; } static void bt_wire_pattern_persistence_interface_init(gpointer g_iface, gpointer iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_wire_pattern_persistence_load; iface->save = bt_wire_pattern_persistence_save; } //-- wrapper //-- g_object overrides static void bt_wire_pattern_constructed(GObject *object) { BtWirePattern *self=BT_WIRE_PATTERN(object); if(G_OBJECT_CLASS(bt_wire_pattern_parent_class)->constructed) G_OBJECT_CLASS(bt_wire_pattern_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); g_return_if_fail(BT_IS_WIRE(self->priv->wire)); g_return_if_fail(BT_IS_PATTERN(self->priv->pattern)); // add the pattern to the wire bt_wire_add_wire_pattern(self->priv->wire,self->priv->pattern,self); } /* returns a property for the given property_id for this object */ static void bt_wire_pattern_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtWirePattern * const self = BT_WIRE_PATTERN(object); return_if_disposed(); switch (property_id) { case WIRE_PATTERN_SONG: { g_value_set_object(value, self->priv->song); } break; case WIRE_PATTERN_WIRE: { g_value_set_object(value, self->priv->wire); } break; case WIRE_PATTERN_PATTERN: { g_value_set_object(value, self->priv->pattern); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_wire_pattern_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtWirePattern * const self = BT_WIRE_PATTERN(object); return_if_disposed(); switch (property_id) { case WIRE_PATTERN_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for pattern: %p",self->priv->song); } break; case WIRE_PATTERN_WIRE: { if((self->priv->wire = BT_WIRE(g_value_get_object(value)))) { g_object_try_weak_ref(self->priv->wire); g_object_get((gpointer)(self->priv->wire),"num-params",&self->priv->num_params,NULL); GST_DEBUG("set the wire for the wire-pattern: %p",self->priv->wire); } } break; case WIRE_PATTERN_PATTERN: { g_object_try_weak_unref(self->priv->pattern); if((self->priv->pattern = BT_PATTERN(g_value_get_object(value)))) { g_object_try_weak_ref(self->priv->pattern); g_object_get((gpointer)(self->priv->pattern),"length",&self->priv->length,NULL); bt_wire_pattern_resize_data_length(self,self->priv->length); // watch the pattern self->priv->pattern_length_changed=g_signal_connect((gpointer)(self->priv->pattern),"notify::length",G_CALLBACK(on_pattern_length_changed),(gpointer)self); GST_DEBUG("set the pattern for the wire-pattern: %p",self->priv->pattern); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wire_pattern_dispose(GObject * const object) { const BtWirePattern * const self = BT_WIRE_PATTERN(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); g_object_try_weak_unref(self->priv->wire); if(self->priv->pattern) { g_signal_handler_disconnect(self->priv->pattern,self->priv->pattern_length_changed); g_object_try_weak_unref(self->priv->pattern); } G_OBJECT_CLASS(bt_wire_pattern_parent_class)->dispose(object); } static void bt_wire_pattern_finalize(GObject * const object) { const BtWirePattern * const self = BT_WIRE_PATTERN(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->data); G_OBJECT_CLASS(bt_wire_pattern_parent_class)->finalize(object); } //-- class internals static void bt_wire_pattern_init(BtWirePattern *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WIRE_PATTERN, BtWirePatternPrivate); } static void bt_wire_pattern_class_init(BtWirePatternClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); error_domain=g_type_qname(BT_TYPE_WIRE_PATTERN); g_type_class_add_private(klass,sizeof(BtWirePatternPrivate)); gobject_class->constructed = bt_wire_pattern_constructed; gobject_class->set_property = bt_wire_pattern_set_property; gobject_class->get_property = bt_wire_pattern_get_property; gobject_class->dispose = bt_wire_pattern_dispose; gobject_class->finalize = bt_wire_pattern_finalize; /** * BtWirePattern::param-changed: * @self: the wire-pattern object that emitted the signal * @tick: the tick position inside the pattern * @wire: the wire for which it changed * @param: the parameter index * * signals that a param of this wire-pattern has been changed */ signals[PARAM_CHANGED_EVENT] = g_signal_new("param-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__ULONG_OBJECT_ULONG, G_TYPE_NONE, // return type 3, // n_params G_TYPE_ULONG,BT_TYPE_WIRE,G_TYPE_ULONG // param data ); /** * BtWirePattern::pattern-changed: * @self: the wire-pattern object that emitted the signal * * signals that this wire-pattern has been changed (more than in one place) */ signals[PATTERN_CHANGED_EVENT] = g_signal_new("pattern-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, // return type 0, // n_params G_TYPE_BOOLEAN ); g_object_class_install_property(gobject_class,WIRE_PATTERN_SONG, g_param_spec_object("song", "song contruct prop", "Song object, the pattern belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_PATTERN_WIRE, g_param_spec_object("wire", "wire construct prop", "Wire object, the wire-pattern belongs to", BT_TYPE_WIRE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_PATTERN_PATTERN, g_param_spec_object("pattern", "pattern construct prop", "Pattern object, the wire-pattern belongs to", BT_TYPE_PATTERN, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/pattern.c0000644042355400116100000020712211670210007014415 00000000000000/* $Id: pattern.c 3764 2011-12-08 19:29:10Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpattern * @short_description: class for an event pattern of a #BtMachine instance * * A pattern contains a grid of events. Events are parameter changes in * #BtMachine objects. The events are stored as #GValues. Cells contaning %NULL * have no event for the parameter at the time. * * Patterns can have individual length. The length is meassured in ticks. How * much that is in e.g. milliseconds is determined by #BtSongInfo:bpm and * #BtSongInfo:tpm. * * The number of voices (tracks) is the same in all patterns of a machine. If * the voices are changed on the machine patterns resize themself. * * The patterns are used in the #BtSequence to form the score of a song. */ /* @todo: * - BtWirePattern is not a good name :/ * - maybe we can make BtPattern a base class and also have BtMachinePattern * - pattern editing * - flip ticks cursor-column/selection * -inc/dec cursor-cell/selection * - cut/copy/paste api * - need private BtPatternFragment object * - copy of the data * - pos and size of the region * - column-types * - eventually wire-pattern fragments * - api * fragment = bt_pattern_copy_fragment (pattern, col1, col2, row1, row2); * return a new fragment object, opaque for the callee * fragment = bt_pattern_cut_fragment (pattern, col1, col2, row1, row2); * calls copy and clears afterwards * success = bt_pattern_paste_fragment(pattern, fragment, col1, row1); * checks if column-types are compatible * */ #define BT_CORE #define BT_PATTERN_C #include "core_private.h" //-- signal ids enum { GLOBAL_PARAM_CHANGED_EVENT, VOICE_PARAM_CHANGED_EVENT, PATTERN_CHANGED_EVENT, LAST_SIGNAL }; //-- property ids enum { PATTERN_SONG=1, PATTERN_ID, PATTERN_NAME, PATTERN_LENGTH, PATTERN_VOICES, PATTERN_MACHINE, PATTERN_IS_INTERNAL }; struct _BtPatternPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the pattern belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the id, we can use to lookup the pattern */ gchar *id; /* the display name of the pattern */ gchar *name; /* command patterns are internal (the are not editable) */ gboolean is_internal; /* the number of ticks */ gulong length; /* the number of voices */ gulong voices; /* the number of dynamic params the machine provides per instance */ gulong global_params; /* the number of dynamic params the machine provides per instance and voice */ gulong voice_params; /* the machine the pattern belongs to */ G_POINTER_ALIAS(BtMachine *,machine); /* an array of GValues (not pointing to) * with the size of length*(internal_params+global_params+voices*voice_params) */ GValue *data; }; static guint signals[LAST_SIGNAL]={0,}; /* Internal parameters: * - BtPatternCmd * @todo we need more params: * - BtMachineState * - the machine state (BtMachineState: normal, mute, solo, bypass) */ static const gulong internal_params=1; //-- the class static void bt_pattern_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtPattern, bt_pattern, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_pattern_persistence_interface_init)); //-- enums GType bt_pattern_cmd_get_type(void) { static GType type = 0; if(G_UNLIKELY(type == 0)) { static const GEnumValue values[] = { { BT_PATTERN_CMD_NORMAL,"BT_PATTERN_CMD_NORMAL","normal" }, { BT_PATTERN_CMD_BREAK, "BT_PATTERN_CMD_BREAK", "break" }, { BT_PATTERN_CMD_MUTE, "BT_PATTERN_CMD_MUTE", "mute" }, { BT_PATTERN_CMD_SOLO, "BT_PATTERN_CMD_SOLO", "solo" }, { BT_PATTERN_CMD_BYPASS,"BT_PATTERN_CMD_BYPASS","bypass" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtPatternCmd", values); } return type; } //-- helper methods /* * bt_pattern_resize_data_length: * @self: the pattern to resize the length * @length: the old length * * Resizes the event data grid to the new length. Keeps previous values. */ static void bt_pattern_resize_data_length(const BtPattern * const self, const gulong length) { const gulong old_data_count= length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params); const gulong new_data_count=self->priv->length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params); GValue * const data=self->priv->data; // allocate new space if((self->priv->data=g_try_new0(GValue,new_data_count))) { if(data) { gulong count=MIN(old_data_count,new_data_count); GST_DEBUG("keeping data count=%lu, old=%lu, new=%lu",count,old_data_count,new_data_count); // copy old values over memcpy(self->priv->data,data,count*sizeof(GValue)); // free gvalues if(old_data_count>new_data_count) { gulong i; for(i=new_data_count;ipriv->length, new_data_count,self->priv->length, internal_params,self->priv->global_params,self->priv->voices,self->priv->voice_params); } else { GST_INFO("extending pattern length from %lu to %lu failed : data_count=%lu = length=%lu * ( ip=%lu + gp=%lu + voices=%lu * vp=%lu )", length,self->priv->length, new_data_count,self->priv->length, internal_params,self->priv->global_params,self->priv->voices,self->priv->voice_params); //self->priv->data=data; //self->priv->length=length; } } /* * bt_pattern_resize_data_voices: * @self: the pattern to resize the voice number * @voices: the old number of voices * * Resizes the event data grid to the new number of voices. Keeps previous values. */ static void bt_pattern_resize_data_voices(const BtPattern * const self, const gulong voices) { const gulong length=self->priv->length; //gulong old_data_count=length*(internal_params+self->priv->global_params+ voices*self->priv->voice_params); const gulong new_data_count=length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params); GValue * const data=self->priv->data; // allocate new space if((self->priv->data=g_try_new0(GValue,new_data_count))) { if(data) { gulong i,j; // one row const gulong count =sizeof(GValue)*(internal_params+self->priv->global_params+self->priv->voice_params*MIN(voices,self->priv->voices)); // one row in the old pattern const gulong src_count=internal_params+self->priv->global_params+ voices*self->priv->voice_params; // one row in the new pattern const gulong dst_count=internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params; GValue *src=data; GValue *dst=self->priv->data; GST_DEBUG("keeping data count=%lu, src_ct=%lu, dst_ct=%lu",count,src_count,dst_count); // copy old values over for(i=0;idst_count) { // free gvalues for(j=dst_count;jpriv->voices, new_data_count,self->priv->length, internal_params,self->priv->global_params,self->priv->voices,self->priv->voice_params); } else { GST_INFO("extending pattern voices from %lu to %lu failed : data_count=%lu = length=%lu * ( ip=%lu + gp=%lu + voices=%lu * vp=%lu )", voices,self->priv->voices, new_data_count,self->priv->length, internal_params,self->priv->global_params,self->priv->voices,self->priv->voice_params); //self->priv->data=data; //self->priv->voices=voices; } } /* * bt_pattern_get_internal_event_data: * @self: the pattern to search for the internal param * @tick: the tick (time) position starting with 0 * @param: the number of the internal parameter starting with 0 * * Fetches a cell from the given location in the pattern * * Returns: the GValue or %NULL if out of the pattern range */ static GValue *bt_pattern_get_internal_event_data(const BtPattern * const self, const gulong tick, const gulong param) { gulong index; g_return_val_if_fail(BT_IS_PATTERN(self),NULL); g_return_val_if_fail(self->priv->data,NULL); if(!(tickpriv->length)) { GST_ERROR("tick beyond length");return(NULL); } if(!(parampriv->global_params+self->priv->voices*self->priv->voice_params)) + param; return(&self->priv->data[index]); } /* * bt_pattern_init_global_event: * @self: the pattern that holds the cell * @event: the pattern-cell to initialise * @param: the index of the global dparam * * Initialises a pattern cell with the type of the n-th global param of the * machine. * */ static void bt_pattern_init_global_event(const BtPattern * const self, GValue * const event, const gulong param) { g_return_if_fail(BT_IS_PATTERN(self)); //GST_DEBUG("at %d",param); g_value_init(event,bt_machine_get_global_param_type(self->priv->machine,param)); g_assert(G_IS_VALUE(event)); } /* * bt_pattern_init_voice_event: * @self: the pattern that holds the cell * @event: the pattern-cell to initialise * @param: the index of the voice dparam * * Initialises a pattern cell with the type of the n-th voice param of the * machine. * */ static void bt_pattern_init_voice_event(const BtPattern * const self, GValue * const event, const gulong param) { g_return_if_fail(BT_IS_PATTERN(self)); //GST_DEBUG("at %d",param); g_value_init(event,bt_machine_get_voice_param_type(self->priv->machine,param)); g_assert(G_IS_VALUE(event)); } //-- signal handler static void bt_pattern_on_voices_changed(BtMachine * const machine, const GParamSpec * const arg, gconstpointer const user_data) { const BtPattern * const self=BT_PATTERN(user_data); gulong old_voices=self->priv->voices; g_object_get((gpointer)machine,"voices",&self->priv->voices,NULL); if(old_voices!=self->priv->voices) { GST_DEBUG("set the voices for pattern %s: %lu -> %lu",self->priv->id,old_voices,self->priv->voices); bt_pattern_resize_data_voices(self,old_voices); g_object_notify((GObject *)self,"voices"); } } //-- constructor methods /** * bt_pattern_new: * @song: the song the new instance belongs to * @id: the id, we can use to lookup the pattern * @name: the display name of the pattern * @length: the number of ticks * @machine: the machine the pattern belongs to * * Create a new instance. It will be automatically added to the machines pattern * list. * * Returns: the new instance or %NULL in case of an error */ BtPattern *bt_pattern_new(const BtSong * const song, const gchar * const id, const gchar * const name, const gulong length, const BtMachine * const machine) { return(BT_PATTERN(g_object_new(BT_TYPE_PATTERN,"song",song,"id",id,"name",name,"machine",machine,"length",length,NULL))); } /** * bt_pattern_new_with_event: * @song: the song the new instance belongs to * @machine: the machine the pattern belongs to * @cmd: a #BtPatternCmd * * Create a new default pattern instance containg the given @cmd event. * It will be automatically added to the machines pattern list. * If @cmd is %BT_PATTERN_CMD_NORMAL use bt_pattern_new() instead. * * Don't call this from applications. * * Returns: the new instance or %NULL in case of an error */ BtPattern *bt_pattern_new_with_event(const BtSong * const song, const BtMachine * const machine, const BtPatternCmd cmd) { BtPattern *self; gchar *mid=NULL,*id=NULL,*name=NULL; GValue *event; // track commands in sequencer const gchar * const cmd_names[]={ N_("normal"),N_("break"),N_("mute"),N_("solo"),N_("bypass") }; if(BT_IS_MACHINE(machine)) { g_object_get((gpointer)machine,"id",&mid,NULL); // use spaces/_ to avoid clashes with normal patterns? id=g_strdup_printf("%s___%s",mid,cmd_names[cmd]); name=g_strdup_printf(" %s",_(cmd_names[cmd])); } // create the pattern self=BT_PATTERN(g_object_new(BT_TYPE_PATTERN,"song",song,"is-internal",TRUE,"id",id,"name",name,"machine",machine,"length",1L,NULL)); GST_DEBUG("created pattern: %p,ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); event=bt_pattern_get_internal_event_data(self,0,0); g_value_init(event,BT_TYPE_PATTERN_CMD); g_value_set_enum(event,cmd); g_free(mid); g_free(id); g_free(name); return(self); } /** * bt_pattern_copy: * @self: the pattern to create a copy from * * Create a new instance as a copy of the given instance. * * Returns: the new instance or %NULL in case of an error */ BtPattern *bt_pattern_copy(const BtPattern * const self) { BtPattern *pattern; gchar *id,*name,*mid; gulong data_count; gulong i; g_return_val_if_fail(BT_IS_PATTERN(self),NULL); GST_INFO("copying pattern"); g_object_get((gpointer)(self->priv->machine),"id",&mid,NULL); name=bt_machine_get_unique_pattern_name(self->priv->machine); id=g_strdup_printf("%s %s",mid,name); pattern=bt_pattern_new(self->priv->song,id,name,self->priv->length,self->priv->machine); data_count=self->priv->length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params); // deep copy data for(i=0;ipriv->data[i])) { g_value_init(&pattern->priv->data[i],G_VALUE_TYPE(&self->priv->data[i])); g_value_copy(&self->priv->data[i],&pattern->priv->data[i]); } } GST_INFO(" data copied"); // we also need to copy the wire patterns if(self->priv->machine->dst_wires) { GList *node; BtWire *wire; BtWirePattern *wp,*wp_new; GST_INFO("copying wire-patterns"); for(node=self->priv->machine->dst_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); wp=bt_wire_get_pattern(wire,self); wp_new=bt_wire_pattern_copy(wp,pattern); g_object_unref(wp_new); g_object_unref(wp); } GST_INFO(" wire-patterns copied"); } g_free(mid); g_free(id); g_free(name); return(pattern); } //-- methods /** * bt_pattern_get_global_param_index: * @self: the pattern to search for the global dparam * @name: the name of the global dparam * @error: pointer to an error variable * * Searches the list of registered dparam of the machine the pattern belongs to * for a global dparam of the given name and returns the index if found. * * Returns: the index. If an error occurs the function returns 0 and sets the * error variable. You should always check for error if you use this function. */ gulong bt_pattern_get_global_param_index(const BtPattern * const self, const gchar * const name, GError **error) { gulong ret=0; GError *tmp_error=NULL; g_return_val_if_fail(BT_IS_PATTERN(self),0); g_return_val_if_fail(BT_IS_STRING(name),0); g_return_val_if_fail(error == NULL || *error == NULL, 0); ret=bt_machine_get_global_param_index(self->priv->machine,name,&tmp_error); if (tmp_error!=NULL) { g_propagate_error(error, tmp_error); } return(ret); } /** * bt_pattern_get_voice_param_index: * @self: the pattern to search for the voice dparam * @name: the name of the voice dparam * @error: pointer to an error variable * * Searches the list of registered dparam of the machine the pattern belongs to * for a voice dparam of the given name and returns the index if found. * * Returns: the index. If an error occurs the function returns 0 and sets the * error variable. You should always check for error if you use this function. */ gulong bt_pattern_get_voice_param_index(const BtPattern * const self, const gchar * const name, GError **error) { gulong ret=0; GError *tmp_error=NULL; g_return_val_if_fail(BT_IS_PATTERN(self),0); g_return_val_if_fail(BT_IS_STRING(name),0); g_return_val_if_fail(error == NULL || *error == NULL, 0); ret=bt_machine_get_voice_param_index(self->priv->machine,name,&tmp_error); if (tmp_error!=NULL) { g_propagate_error(error, tmp_error); } return(ret); } /** * bt_pattern_get_global_event_data: * @self: the pattern to search for the global param * @tick: the tick (time) position starting with 0 * @param: the number of the global parameter starting with 0 * * Fetches a cell from the given location in the pattern. If there is no event * there, then the %GValue is uninitialized. Test with BT_IS_GVALUE(event). * * Returns: the GValue or %NULL if out of the pattern range */ GValue *bt_pattern_get_global_event_data(const BtPattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),NULL); g_return_val_if_fail(self->priv->data,NULL); if(G_UNLIKELY(!(tickpriv->length))) { GST_WARNING("tick=%lu beyond length=%lu in pattern '%s'",tick,self->priv->length,self->priv->id);return(NULL); } if(G_UNLIKELY(!(parampriv->global_params))) { GST_WARNING("param=%lu beyond global_params=%lu in pattern '%s'",param,self->priv->global_params,self->priv->id);return(NULL); } //GST_DEBUG("getting gvalue pattern=%s at tick=%lu/%lu and global param %lu/%lu",self->priv->id,tick,self->priv->length,param,self->priv->global_params); const gulong index=(tick*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params)) + internal_params+param; g_assert(index<(self->priv->length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params))); return(&self->priv->data[index]); } /** * bt_pattern_get_voice_event_data: * @self: the pattern to search for the voice param * @tick: the tick (time) position starting with 0 * @voice: the voice number starting with 0 * @param: the number of the voice parameter starting with 0 * * Fetches a cell from the given location in the pattern. If there is no event * there, then the %GValue is uninitialized. Test with BT_IS_GVALUE(event). * * Returns: the GValue or %NULL if out of the pattern range */ GValue *bt_pattern_get_voice_event_data(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),NULL); g_return_val_if_fail(self->priv->data,NULL); if(G_UNLIKELY(!(tickpriv->length))) { GST_ERROR("tick=%lu beyond length=%lu in pattern '%s'",tick,self->priv->length,self->priv->id);return(NULL); } if(G_UNLIKELY(!(voicepriv->voices))) { GST_ERROR("voice=%lu beyond voices=%lu in pattern '%s'",voice,self->priv->voices,self->priv->id);return(NULL); } if(G_UNLIKELY(!(parampriv->voice_params))) { GST_ERROR("param=%lu beyond voice_params=%lu in pattern '%s'",param,self->priv->voice_params,self->priv->id);return(NULL); } const gulong index=(tick*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params)) + internal_params+self->priv->global_params+(voice*self->priv->voice_params) + param; g_assert(index<(self->priv->length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params))); return(&self->priv->data[index]); } /** * bt_pattern_set_global_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the global parameter starting with 0 * @value: the string representation of the value to store * * Stores the supplied value into the specified pattern cell. * * Returns: %TRUE for success */ gboolean bt_pattern_set_global_event(const BtPattern * const self, const gulong tick, const gulong param, const gchar * const value) { gboolean res=FALSE; GValue *event; g_return_val_if_fail(BT_IS_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); if((event=bt_pattern_get_global_event_data(self,tick,param))) { if(BT_IS_STRING(value)) { if(!BT_IS_GVALUE(event)) { bt_pattern_init_global_event(self,event,param); } if(bt_persistence_set_value(event,value)) { if(bt_machine_is_global_param_no_value(self->priv->machine,param,event)) { g_value_unset(event); } res=TRUE; } else { GST_INFO("failed to set GValue for cell at tick=%lu, param=%lu",tick,param); } } else { if(BT_IS_GVALUE(event)) { g_value_unset(event); } res=TRUE; } if(res) { // notify others that the data has been changed g_signal_emit((gpointer)self,signals[GLOBAL_PARAM_CHANGED_EVENT],0,tick,param); } } else { GST_DEBUG("no GValue found for cell at tick=%lu, param=%lu",tick,param); } return(res); } /** * bt_pattern_set_voice_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @voice: the voice number starting with 0 * @param: the number of the global parameter starting with 0 * @value: the string representation of the value to store * * Stores the supplied value into the specified pattern cell. * * Returns: %TRUE for success */ gboolean bt_pattern_set_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param, const gchar * const value) { gboolean res=FALSE; GValue *event; g_return_val_if_fail(BT_IS_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); if((event=bt_pattern_get_voice_event_data(self,tick,voice,param))) { if(BT_IS_STRING(value)) { if(!BT_IS_GVALUE(event)) { bt_pattern_init_voice_event(self,event,param); } if(bt_persistence_set_value(event,value)) { if(bt_machine_is_voice_param_no_value(self->priv->machine,param,event)) { g_value_unset(event); } res=TRUE; } else { GST_INFO("failed to set GValue for cell at tick=%lu, voice=%lu, param=%lu",tick,voice,param); } } else { if(BT_IS_GVALUE(event)) { g_value_unset(event); } res=TRUE; } if(res) { // notify others that the data has been changed g_signal_emit((gpointer)self,signals[VOICE_PARAM_CHANGED_EVENT],0,tick,voice,param); } } else { GST_DEBUG("no GValue found for cell at tick=%lu, voice=%lu, param=%lu",tick,voice,param); } return(res); } /** * bt_pattern_get_global_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the global parameter starting with 0 * * Returns the string representation of the specified cell. Free it when done. * * Returns: a newly allocated string with the data or %NULL on error */ gchar *bt_pattern_get_global_event(const BtPattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),NULL); g_return_val_if_fail(tickpriv->length,NULL); GValue * const event=bt_pattern_get_global_event_data(self,tick,param); if(event && BT_IS_GVALUE(event)) { return(bt_persistence_get_value(event)); } return(NULL); } /** * bt_pattern_get_voice_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @voice: the voice number starting with 0 * @param: the number of the global parameter starting with 0 * * Returns the string representation of the specified cell. Free it when done. * * Returns: a newly allocated string with the data or %NULL on error */ gchar *bt_pattern_get_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),NULL); g_return_val_if_fail(tickpriv->length,NULL); GValue * const event=bt_pattern_get_voice_event_data(self,tick,voice,param); if(event && BT_IS_GVALUE(event)) { return(bt_persistence_get_value(event)); } return(NULL); } /** * bt_pattern_test_global_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @param: the number of the global parameter starting with 0 * * Tests if there is an event in the specified cell. * * Returns: %TRUE if there is an event */ gboolean bt_pattern_test_global_event(const BtPattern * const self, const gulong tick, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); const GValue * const event=bt_pattern_get_global_event_data(self,tick,param); if(event && BT_IS_GVALUE(event)) { return(TRUE); } return(FALSE); } /** * bt_pattern_test_voice_event: * @self: the pattern the cell belongs to * @tick: the tick (time) position starting with 0 * @voice: the voice number starting with 0 * @param: the number of the global parameter starting with 0 * * Tests if there is an event in the specified cell. * * Returns: %TRUE if there is an event */ gboolean bt_pattern_test_voice_event(const BtPattern * const self, const gulong tick, const gulong voice, const gulong param) { g_return_val_if_fail(BT_IS_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); const GValue * const event=bt_pattern_get_voice_event_data(self,tick,voice,param); if(event && BT_IS_GVALUE(event)) { return(TRUE); } return(FALSE); } /** * bt_pattern_get_cmd: * @self: the pattern to query the command from * @tick: the tick (time) position starting with 0 * * Returns the command id in the specified tick row. * * Returns: the command id */ BtPatternCmd bt_pattern_get_cmd(const BtPattern * const self, const gulong tick) { g_return_val_if_fail(BT_IS_PATTERN(self),BT_PATTERN_CMD_NORMAL); g_return_val_if_fail(tickpriv->length,BT_PATTERN_CMD_NORMAL); const GValue * const event=bt_pattern_get_internal_event_data(self,tick,0); if(event && BT_IS_GVALUE(event)) { return(g_value_get_enum(event)); } return(BT_PATTERN_CMD_NORMAL); } /** * bt_pattern_tick_has_data: * @self: the pattern to check * @tick: the tick index in the pattern * * Check if there are any event in the given pattern-row. * * Returns: %TRUE is there are events, %FALSE otherwise */ gboolean bt_pattern_tick_has_data(const BtPattern * const self, const gulong tick) { const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; gulong j,k; GValue *data; g_return_val_if_fail(BT_IS_PATTERN(self),FALSE); g_return_val_if_fail(tickpriv->length,FALSE); data=&self->priv->data[internal_params+tick*(internal_params+global_params+voices*voice_params)]; for(k=0;kpriv->length; gulong params=internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params; GValue *src=&self->priv->data[internal_params+param+params*(length-2)]; GValue *dst=&self->priv->data[internal_params+param+params*(length-1)]; GST_INFO("insert row at %lu,%lu", tick, param); for(i=tick;ipriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _insert_row(self,tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_insert_full_row: * @self: the pattern * @tick: the postion to insert at * * Insert one empty row for all parameters. * * Since: 0.3 */ void bt_pattern_insert_full_row(const BtPattern * const self, const gulong tick) { g_return_if_fail(BT_IS_PATTERN(self)); // don't add internal_params here, bt_pattern_insert_row does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; GST_DEBUG("insert full-row at %lu", tick); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->length; gulong params=internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params; GValue *src=&self->priv->data[internal_params+param+params*(tick+1)]; GValue *dst=&self->priv->data[internal_params+param+params*tick]; GST_INFO("insert row at %lu,%lu", tick, param); for(i=tick;ipriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _delete_row(self,tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_delete_full_row: * @self: the pattern * @tick: the postion to delete * * Delete row for all parameters. * * Since: 0.3 */ void bt_pattern_delete_full_row(const BtPattern * const self, const gulong tick) { g_return_if_fail(BT_IS_PATTERN(self)); // don't add internal_params here, bt_pattern_insert_row does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; GST_DEBUG("insert full-row at %lu", tick); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; gulong i,ticks=(end_tick+1)-start_tick; for(i=0;ipriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); _delete_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_delete_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Clear values from @start_tick to @end_tick for all params. * * Since: 0.6 */ void bt_pattern_delete_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); // don't add internal_params here, bt_pattern_delete_column does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,TRUE); for(j=0;jpriv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; GValue *end=&self->priv->data[internal_params+param+params*end_tick]; gulong i,ticks=end_tick-start_tick; GParamSpec *property; GType base_type; if(!BT_IS_GVALUE(beg) || !BT_IS_GVALUE(end)) { GST_INFO("Can't blend, beg or end is empty"); return; } if(parampriv->global_params) { property=bt_machine_get_global_param_spec(self->priv->machine, param); } else { property=bt_machine_get_voice_param_spec(self->priv->machine, (param-self->priv->global_params)%self->priv->voice_params); } base_type=bt_g_type_get_base_type(property->value_type); GST_INFO("blending gvalue type %s",G_VALUE_TYPE_NAME(end)); // @todo: should this honour the cursor stepping? e.g. enter only every second value switch(base_type) { _BLEND(int,INT) _BLEND(uint,UINT) _BLEND(int64,INT64) _BLEND(uint64,UINT64) _BLEND(float,FLOAT) _BLEND(double,DOUBLE) case G_TYPE_ENUM:{ GParamSpecEnum *p=G_PARAM_SPEC_ENUM (property); GEnumClass *e=p->enum_class; gdouble step; gint v,v1,v2; // we need the index of the enum value and the number of values inbetween v=g_value_get_enum(beg); for(v1=0;v1n_values;v1++) { if (e->values[v1].value==v) break; } v=g_value_get_enum(end); for(v2=0;v2n_values;v2++) { if (e->values[v2].value==v) break; } step=(gdouble)(v2-v1)/(gdouble)ticks; //GST_DEBUG("v1 = %d, v2=%d, step=%lf",v1,v2,step); for(i=0;ivalue_type); v=(gint)(v1+(step*i)); // handle sparse enums g_value_set_enum(beg,e->values[v].value); beg+=params; } } break; default: GST_WARNING("unhandled gvalue type %s",G_VALUE_TYPE_NAME(end)); } } /** * bt_pattern_blend_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Fade values from @start_tick to @end_tick for @param. * * Since: 0.3 */ void bt_pattern_blend_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _blend_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_blend_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Fade values from @start_tick to @end_tick for all params. * * Since: 0.3 */ void bt_pattern_blend_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); // don't add internal_params here, bt_pattern_insert_row does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; for(j=0;jpriv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; GValue *end=&self->priv->data[internal_params+param+params*end_tick]; GParamSpec *property; GType base_type; GValue tmp={0,}; if(parampriv->global_params) { property=bt_machine_get_global_param_spec(self->priv->machine, param); } else { property=bt_machine_get_voice_param_spec(self->priv->machine, (param-self->priv->global_params)%self->priv->voice_params); } base_type=property->value_type; GST_INFO("flipping gvalue type %s",G_VALUE_TYPE_NAME(base_type)); g_value_init(&tmp,base_type); while(begpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _flip_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_flip_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Flips values from @start_tick to @end_tick for all params up-side down. * * Since: 0.5 */ void bt_pattern_flip_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); // don't add internal_params here, bt_pattern_insert_row does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; for(j=0;jminimum+((p->maximum-p->minimum)*rnd))); \ beg+=params; \ } \ } break; static void _randomize_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { gulong params=internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; //GValue *end=&self->priv->data[internal_params+param+params*end_tick]; gulong i,ticks=(end_tick+1)-start_tick; GParamSpec *property; GType base_type; gdouble rnd; if(parampriv->global_params) { property=bt_machine_get_global_param_spec(self->priv->machine, param); } else { property=bt_machine_get_voice_param_spec(self->priv->machine, (param-self->priv->global_params)%self->priv->voice_params); } base_type=bt_g_type_get_base_type(property->value_type); GST_INFO("blending gvalue type %s",g_type_name(property->value_type)); // @todo: should this honour the cursor stepping? e.g. enter only every second value // @todo: if beg and end are not empty, shall we use them as upper and lower // bounds instead of the pspec values (ev. have a flag on the function) switch(base_type) { _RANDOMIZE(int,INT,Int) _RANDOMIZE(uint,UINT,UInt) _RANDOMIZE(int64,INT64,Int64) _RANDOMIZE(uint64,UINT64,UInt64) _RANDOMIZE(float,FLOAT,Float) _RANDOMIZE(double,DOUBLE,Double) case G_TYPE_BOOLEAN:{ for(i=0;ienum_class; gint nv=e->n_values-1; // don't use no_value gint v; for(i=0;ivalue_type); rnd=((gdouble)rand())/(RAND_MAX+1.0); v=(gint)(nv*rnd); // handle sparse enums g_value_set_enum(beg,e->values[v].value); beg+=params; } } break; default: GST_WARNING("unhandled gvalue type %s",G_VALUE_TYPE_NAME(base_type)); } } /** * bt_pattern_randomize_column: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @param: the parameter * * Randomize values from @start_tick to @end_tick for @param. * * Since: 0.3 */ void bt_pattern_randomize_column(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); _randomize_column(self,start_tick,end_tick,param); g_signal_emit((gpointer)self,signals[PATTERN_CHANGED_EVENT],0,FALSE); } /** * bt_pattern_randomize_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * * Randomize values from @start_tick to @end_tick for all params. * * Since: 0.3 */ void bt_pattern_randomize_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); // don't add internal_params here, bt_pattern_randomize_column does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; for(j=0;jpriv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; gulong i,ticks=(end_tick+1)-start_tick; gchar *val; if(parampriv->global_params) { g_string_append(data,g_type_name(bt_machine_get_global_param_type(self->priv->machine,param))); } else { gulong p=param-self->priv->global_params; while(p>=self->priv->voice_params) p-=self->priv->voice_params; g_string_append(data,g_type_name(bt_machine_get_voice_param_type(self->priv->machine,p))); } for(i=0;ipriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_return_if_fail(data); _serialize_column(self,start_tick,end_tick,param,data); } /** * bt_pattern_serialize_columns: * @self: the pattern * @start_tick: the start postion for the range * @end_tick: the end postion for the range * @data: the target * * Serializes values from @start_tick to @end_tick for all params into @data. * * Since: 0.6 */ void bt_pattern_serialize_columns(const BtPattern * const self, const gulong start_tick, const gulong end_tick, GString *data) { g_return_if_fail(BT_IS_PATTERN(self)); g_return_if_fail(start_tickpriv->length); g_return_if_fail(end_tickpriv->length); g_return_if_fail(self->priv->data); g_return_if_fail(data); // don't add internal_params here, _serialize_column does already gulong j,params=self->priv->global_params+self->priv->voices*self->priv->voice_params; for(j=0;jpriv->length,FALSE); g_return_val_if_fail(end_tickpriv->length,FALSE); g_return_val_if_fail(self->priv->data,FALSE); g_return_val_if_fail(data,FALSE); g_return_val_if_fail(param<(self->priv->global_params+self->priv->voices*self->priv->voice_params),FALSE); gboolean ret=TRUE; GType stype,dtype; gchar **fields; fields=g_strsplit_set(data,",",0); // get types in pattern and clipboard data if(parampriv->global_params) { dtype=bt_machine_get_global_param_type(self->priv->machine,param); } else { gulong p=param-self->priv->global_params; while(p>=self->priv->voice_params) p-=self->priv->voice_params; dtype=bt_machine_get_voice_param_type(self->priv->machine,p); } stype=g_type_from_name(fields[0]); if(dtype==stype) { gint i=1; gulong params=internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params; GValue *beg=&self->priv->data[internal_params+param+params*start_tick]; GValue *end=&self->priv->data[internal_params+param+params*end_tick]; GST_INFO("types match %s <-> %s",fields[0],g_type_name(dtype)); while(fields[i] && *fields[i] && (beg<=end)) { if(*fields[i]!=' ') { if(!BT_IS_GVALUE(beg)) { g_value_init(beg,dtype); } bt_persistence_set_value(beg, fields[i]); } else { if(BT_IS_GVALUE(beg)) { g_value_unset(beg); } } beg+=params; i++; } } else { GST_INFO("types don't match in %s <-> %s",fields[0],g_type_name(dtype)); ret=FALSE; } g_strfreev(fields); return(ret); } //-- io interface static xmlNodePtr bt_pattern_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtPattern * const self = BT_PATTERN(persistence);; xmlNodePtr node=NULL; xmlNodePtr child_node,child_node2; GST_DEBUG("PERSISTENCE::pattern"); // @todo: hack, command-patterns start with " " if(self->priv->name[0]==' ') return((xmlNodePtr)1); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("pattern"),NULL))) { const gulong length=self->priv->length; const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; gulong i,j,k; gchar *value; xmlNewProp(node,XML_CHAR_PTR("id"),XML_CHAR_PTR(self->priv->id)); xmlNewProp(node,XML_CHAR_PTR("name"),XML_CHAR_PTR(self->priv->name)); xmlNewProp(node,XML_CHAR_PTR("length"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(length))); // save pattern data for(i=0;ipriv->machine,k))); xmlNewProp(child_node2,XML_CHAR_PTR("value"),XML_CHAR_PTR(value));g_free(value); } } for(j=0;jpriv->machine,k))); xmlNewProp(child_node2,XML_CHAR_PTR("value"),XML_CHAR_PTR(value));g_free(value); } } } } } } return(node); } static BtPersistence *bt_pattern_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtPattern *self; BtPersistence *result; xmlChar *id,*name,*length_str,*tick_str,*value,*voice_str; glong tick,voice,param; gulong length; xmlNodePtr child_node; GError *error=NULL; GST_DEBUG("PERSISTENCE::pattern"); g_assert(node); id=xmlGetProp(node,XML_CHAR_PTR("id")); name=xmlGetProp(node,XML_CHAR_PTR("name")); length_str=xmlGetProp(node,XML_CHAR_PTR("length")); length=length_str?atol((char *)length_str):0; if(!persistence) { BtSong *song=NULL; BtMachine *machine=NULL; gchar *param_name; // we need to get parameters from var_args (need to handle all baseclass params param_name=va_arg(var_args,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(var_args, gpointer); } else if(!strcmp(param_name,"machine")) { machine=va_arg(var_args, gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(var_args,gchar*); } self=bt_pattern_new(song, (gchar*)id, (gchar*)name, length, machine); result=BT_PERSISTENCE(self); } else { self=BT_PATTERN(persistence); result=BT_PERSISTENCE(self); g_object_set(self,"id",id,"name",name,"length",length,NULL); } xmlFree(id);xmlFree(name);xmlFree(length_str); GST_DEBUG("PERSISTENCE::pattern loading data"); // load pattern data for(node=node->children;node;node=node->next) { if((!xmlNodeIsText(node)) && (!strncmp((gchar *)node->name,"tick\0",5))) { tick_str=xmlGetProp(node,XML_CHAR_PTR("time")); tick=atoi((char *)tick_str); // iterate over children for(child_node=node->children;child_node;child_node=child_node->next) { if(!xmlNodeIsText(child_node)) { name=xmlGetProp(child_node,XML_CHAR_PTR("name")); value=xmlGetProp(child_node,XML_CHAR_PTR("value")); //GST_LOG(" \"%s\" -> \"%s\"",safe_string(name),safe_string(value)); if(!strncmp((char *)child_node->name,"globaldata\0",11)) { param=bt_pattern_get_global_param_index(self,(gchar *)name,&error); if(!error) { bt_pattern_set_global_event(self,tick,param,(gchar *)value); } else { GST_WARNING("error while loading global pattern data at tick %ld, param %ld: %s",tick,param,error->message); g_error_free(error);error=NULL; } } else if(!strncmp((char *)child_node->name,"voicedata\0",10)) { voice_str=xmlGetProp(child_node,XML_CHAR_PTR("voice")); voice=atol((char *)voice_str); param=bt_pattern_get_voice_param_index(self,(gchar *)name,&error); if(!error) { bt_pattern_set_voice_event(self,tick,voice,param,(gchar *)value); } else { GST_WARNING("error while loading voice pattern data at tick %ld, param %ld, voice %ld: %s",tick,param,voice,error->message); g_error_free(error);error=NULL; } xmlFree(voice_str); } xmlFree(name); xmlFree(value); } } xmlFree(tick_str); } } return(result); } static void bt_pattern_persistence_interface_init(gpointer g_iface, gpointer iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_pattern_persistence_load; iface->save = bt_pattern_persistence_save; } //-- wrapper //-- g_object overrides static void bt_pattern_constructed(GObject *object) { BtPattern *self=BT_PATTERN(object); if(G_OBJECT_CLASS(bt_pattern_parent_class)->constructed) G_OBJECT_CLASS(bt_pattern_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); g_return_if_fail(BT_IS_STRING(self->priv->id)); g_return_if_fail(BT_IS_STRING(self->priv->name)); g_return_if_fail(BT_IS_MACHINE(self->priv->machine)); // add the pattern to the machine bt_machine_add_pattern(self->priv->machine,self); } /* returns a property for the given property_id for this object */ static void bt_pattern_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtPattern * const self = BT_PATTERN(object); return_if_disposed(); switch (property_id) { case PATTERN_SONG: { g_value_set_object(value, self->priv->song); } break; case PATTERN_ID: { g_value_set_string(value, self->priv->id); } break; case PATTERN_NAME: { g_value_set_string(value, self->priv->name); } break; case PATTERN_LENGTH: { g_value_set_ulong(value, self->priv->length); } break; case PATTERN_VOICES: { g_value_set_ulong(value, self->priv->voices); } break; case PATTERN_MACHINE: { g_value_set_object(value, self->priv->machine); } break; case PATTERN_IS_INTERNAL: { g_value_set_boolean(value, self->priv->is_internal); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_pattern_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { BtPattern * const self = BT_PATTERN(object); return_if_disposed(); switch (property_id) { case PATTERN_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for pattern: %p",self->priv->song); } break; case PATTERN_ID: { g_free(self->priv->id); self->priv->id = g_value_dup_string(value); GST_DEBUG("set the id for pattern: %s",self->priv->id); } break; case PATTERN_NAME: { g_free(self->priv->name); self->priv->name = g_value_dup_string(value); GST_DEBUG("set the display name for the pattern: %s",self->priv->name); } break; case PATTERN_LENGTH: { const gulong length=self->priv->length; self->priv->length = g_value_get_ulong(value); if(length!=self->priv->length) { GST_DEBUG("set the length for pattern: %lu",self->priv->length); bt_pattern_resize_data_length(self,length); } } break; case PATTERN_MACHINE: { if((self->priv->machine = BT_MACHINE(g_value_get_object(value)))) { g_object_try_weak_ref(self->priv->machine); g_object_get((gpointer)(self->priv->machine),"global-params",&self->priv->global_params,"voice-params",&self->priv->voice_params,NULL); g_signal_connect(self->priv->machine,"notify::voices",G_CALLBACK(bt_pattern_on_voices_changed),(gpointer)self); // need to do that so that data is reallocated bt_pattern_on_voices_changed(self->priv->machine,NULL,(gpointer)self); GST_DEBUG("set the machine for pattern: %p (machine-ref_ct=%d)",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); } } break; case PATTERN_IS_INTERNAL: { self->priv->is_internal = g_value_get_boolean(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_pattern_dispose(GObject * const object) { const BtPattern * const self = BT_PATTERN(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); if(self->priv->machine) { g_signal_handlers_disconnect_matched(self->priv->machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_pattern_on_voices_changed,(gpointer)self); } g_object_try_weak_unref(self->priv->song); g_object_try_weak_unref(self->priv->machine); G_OBJECT_CLASS(bt_pattern_parent_class)->dispose(object); } static void bt_pattern_finalize(GObject * const object) { const BtPattern * const self = BT_PATTERN(object); const gulong data_count=self->priv->length*(internal_params+self->priv->global_params+self->priv->voices*self->priv->voice_params); GValue *v; gulong i; GST_DEBUG("!!!! self=%p",self); g_free(self->priv->id); g_free(self->priv->name); if(self->priv->data) { // free gvalues in self->priv->data for(i=0;ipriv->data[i]; if(BT_IS_GVALUE(v)) g_value_unset(v); } g_free(self->priv->data); } G_OBJECT_CLASS(bt_pattern_parent_class)->finalize(object); } //-- class internals static void bt_pattern_init(BtPattern *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_PATTERN, BtPatternPrivate); } static void bt_pattern_class_init(BtPatternClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtPatternPrivate)); gobject_class->constructed = bt_pattern_constructed; gobject_class->set_property = bt_pattern_set_property; gobject_class->get_property = bt_pattern_get_property; gobject_class->dispose = bt_pattern_dispose; gobject_class->finalize = bt_pattern_finalize; /** * BtPattern::global-param-changed: * @self: the pattern object that emitted the signal * @tick: the tick position inside the pattern * @param: the global parameter index * * signals that a global param of this pattern has been changed */ signals[GLOBAL_PARAM_CHANGED_EVENT] = g_signal_new("global-param-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__ULONG_ULONG, G_TYPE_NONE, // return type 2, // n_params G_TYPE_ULONG,G_TYPE_ULONG // param data ); /** * BtPattern::voice-param-changed: * @self: the pattern object that emitted the signal * @tick: the tick position inside the pattern * @voice: the voice number * @param: the voice parameter index * * signals that a voice param of this pattern has been changed */ signals[VOICE_PARAM_CHANGED_EVENT] = g_signal_new("voice-param-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data bt_marshal_VOID__ULONG_ULONG_ULONG, G_TYPE_NONE, // return type 3, // n_params G_TYPE_ULONG,G_TYPE_ULONG,G_TYPE_ULONG // param data ); /** * BtPattern::pattern-changed: * @self: the pattern object that emitted the signal * @intermediate: boolean flag that is %TRUE to signal that more change are comming * * Signals that this pattern has been changed (more than in one place). * When doing e.g. lin inserts, one will receive two updtes, one before and one * after. The first will have @intermediate=TRUE. Applications can use that to * defer change-consolidation. */ signals[PATTERN_CHANGED_EVENT] = g_signal_new("pattern-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE, // return type 1, // n_params G_TYPE_BOOLEAN ); g_object_class_install_property(gobject_class,PATTERN_SONG, g_param_spec_object("song", "song contruct prop", "Song object, the pattern belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_ID, g_param_spec_string("id", "id contruct prop", "pattern identifier (unique per song)", "unamed pattern", /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_NAME, g_param_spec_string("name", "name contruct prop", "the display-name of the pattern", "unamed", /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_LENGTH, g_param_spec_ulong("length", "length prop", "length of the pattern in ticks", 1, G_MAXULONG, 1, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_VOICES, g_param_spec_ulong("voices", "voices prop", "number of voices in the pattern", 0, G_MAXULONG, 0, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_MACHINE, g_param_spec_object("machine", "machine construct prop", "Machine object, the pattern belongs to", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_IS_INTERNAL, g_param_spec_boolean("is-internal", "is-internal construct prop", "internal (cmd-pattern) indicator", FALSE, G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/childproxy.c0000644042355400116100000002411111576360371015137 00000000000000/* $Id: childproxy.c 2949 2010-08-30 13:22:36Z ensonic $ * * Buzztard * Copyright (C) 2005 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btchildproxy * @short_description: Interface for multi child elements. * * This interface abstracts handling of property sets for elements with * children. Imagine elements such as mixers or polyphonic generators. They all * have multiple #GstPad or some kind of voice objects. Another use case are * container elements like #GstBin. * The element implementing the interface acts as a parent for those child * objects. * * By implementing this interface the child properties can be accessed from the * parent element by using bt_child_proxy_get() and bt_child_proxy_set(). * * Property names are written as "child-name::property-name". The whole naming * scheme is recursive. Thus "child1::child2::property" is valid too, if * "child1" and "child2" implement the #BtChildProxy interface. */ /* @idea: allow implementors to provide a lookup cache if they have static * name -> object mappings */ #include "core_private.h" #include //-- the iface G_DEFINE_INTERFACE (BtChildProxy, bt_child_proxy, 0); /* interface vmethods */ /** * bt_child_proxy_get_child_by_name: * @parent: the parent object to get the child from * @name: the childs name * * Looks up a child element by the given name. * * Returns: the child object or %NULL if not found. Unref after usage. * * MT safe. */ GObject *bt_child_proxy_get_child_by_name(BtChildProxy *parent, const gchar *name) { g_return_val_if_fail(BT_IS_CHILD_PROXY(parent),NULL); g_return_val_if_fail(name!=NULL,NULL); return(BT_CHILD_PROXY_GET_INTERFACE(parent)->get_child_by_name(parent,name)); } /** * bt_child_proxy_get_child_by_index: * @parent: the parent object to get the child from * @index: the childs position in the child list * * Fetches a child by its number. * * Returns: the child object or %NULL if not found (index too high). Unref * after usage. * * MT safe. */ GObject *bt_child_proxy_get_child_by_index(BtChildProxy *parent,guint index) { g_return_val_if_fail(BT_IS_CHILD_PROXY(parent),NULL); return(BT_CHILD_PROXY_GET_INTERFACE(parent)->get_child_by_index(parent,index)); } /** * bt_child_proxy_get_children_count: * @parent: the parent object * * Gets the number of child objects this parent contains. * * Returns: the number of child objects * * MT safe. */ guint bt_child_proxy_get_children_count(BtChildProxy *parent) { g_return_val_if_fail(BT_IS_CHILD_PROXY(parent),0); return(BT_CHILD_PROXY_GET_INTERFACE(parent)->get_children_count(parent)); } /* interface methods */ /** * bt_child_proxy_lookup: * @object: object to lookup the property in * @name: name of the property to look up * @target: pointer to a #GObject that takes the real object to set property on * @pspec: pointer to take the #GParamSpec describing the property * * Looks up which object and #GParamSpec would be effected by the given @name. * * Returns: TRUE if @target and @pspec could be found. FALSE otherwise. In that * case the values for @pspec and @target are not modified. Unref @target after * usage. * * MT safe. */ gboolean bt_child_proxy_lookup(GObject *object,const gchar *name,GObject **target,GParamSpec **pspec) { gboolean res=FALSE; gchar **names,**current; g_return_val_if_fail(G_IS_OBJECT(object),FALSE); g_return_val_if_fail(name!=NULL,FALSE); g_object_ref(object); current=names=g_strsplit(name,"::",-1); while(current[1]) { GObject *next; if(!BT_IS_CHILD_PROXY(object)) { GST_INFO("object %p is not a parent, so you cannot request a child by name %s",object,current[0]); break; } next=bt_child_proxy_get_child_by_name(BT_CHILD_PROXY(object),current[0]); if(!next) { GST_INFO ("no such object %s", current[0]); break; } g_object_unref(object); object=next; current++; } if(current[1]==NULL) { GParamSpec *spec=g_object_class_find_property(G_OBJECT_GET_CLASS(object),current[0]); if(spec==NULL) { GST_INFO("no param spec named %s",current[0]); } else { if(pspec) *pspec=spec; if(target) { g_object_ref(object); *target=object; } res=TRUE; } } g_object_unref(object); g_strfreev(names); return(res); } /** * bt_child_proxy_get_property: * @object: object to query * @name: name of the property * @value: a #GValue that should take the result. * * Gets a single property using the BtChildProxy mechanism. * You are responsible for for freeing it by calling g_value_unset() */ void bt_child_proxy_get_property(GObject *object,const gchar *name,GValue *value) { GParamSpec *pspec; GObject *target; g_return_if_fail(G_IS_OBJECT(object)); g_return_if_fail(name!=NULL); g_return_if_fail(G_IS_VALUE(value)); if(!bt_child_proxy_lookup(object,name,&target,&pspec)) goto not_found; g_object_get_property(G_OBJECT(target),pspec->name,value); g_object_unref(target); return; not_found: g_warning("no property %s in object", name); return; } /** * bt_child_proxy_get_valist: * @object: the object to query * @first_property_name: name of the first property to get * @var_args: return location for the first property, followed optionally by more name/return location pairs, followed by NULL * * Gets properties of the parent object and its children. */ void bt_child_proxy_get_valist(GObject *object,const gchar *first_property_name,va_list var_args) { const gchar *name; gchar *error = NULL; GValue value = { 0, }; GParamSpec *pspec; GObject *target; g_return_if_fail(G_IS_OBJECT(object)); name=first_property_name; /* iterate over pairs */ while(name) { if(!bt_child_proxy_lookup(object,name,&target,&pspec)) goto not_found; g_value_init(&value,G_PARAM_SPEC_VALUE_TYPE(pspec)); g_object_get_property(G_OBJECT(target),pspec->name,&value); g_object_unref(target); G_VALUE_LCOPY(&value,var_args,0,&error); if(error) goto cant_copy; g_value_unset(&value); name=va_arg(var_args,gchar *); } return; not_found: g_warning("no property %s in object",name); return; cant_copy: g_warning("error copying value %s in object: %s",pspec->name,error); g_value_unset(&value); return; } /** * bt_child_proxy_get: * @object: the parent object * @first_property_name: name of the first property to get * @...: return location for the first property, followed optionally by more name/return location pairs, followed by NULL * * Gets properties of the parent object and its children. */ void bt_child_proxy_get(gpointer object,const gchar *first_property_name,...) { va_list var_args; g_return_if_fail(G_IS_OBJECT(object)); va_start(var_args,first_property_name); bt_child_proxy_get_valist(object,first_property_name,var_args); va_end(var_args); } /** * bt_child_proxy_set_property: * @object: the parent object * @name: name of the property to set * @value: new #GValue for the property * * Sets a single property using the BtChildProxy mechanism. */ void bt_child_proxy_set_property(GObject *object, const gchar *name,const GValue *value) { GParamSpec *pspec; GObject *target; g_return_if_fail(G_IS_OBJECT(object)); g_return_if_fail(name!=NULL); g_return_if_fail(G_IS_VALUE(value)); if (!bt_child_proxy_lookup(object,name,&target,&pspec)) goto not_found; g_object_set_property(G_OBJECT(target),pspec->name,value); gst_object_unref(target); return; not_found: g_warning("cannot set property %s on object",name); return; } /** * bt_child_proxy_set_valist: * @object: the parent object * @first_property_name: name of the first property to set * @var_args: value for the first property, followed optionally by more name/value pairs, followed by NULL * * Sets properties of the parent object and its children. */ void bt_child_proxy_set_valist(GObject *object,const gchar *first_property_name,va_list var_args) { const gchar *name; gchar *error = NULL; GValue value = { 0, }; GParamSpec *pspec; GObject *target; g_return_if_fail(G_IS_OBJECT(object)); name=first_property_name; /* iterate over pairs */ while(name) { if (!bt_child_proxy_lookup(object,name,&target,&pspec)) goto not_found; g_value_init(&value,G_PARAM_SPEC_VALUE_TYPE(pspec)); G_VALUE_COLLECT(&value,var_args,G_VALUE_NOCOPY_CONTENTS,&error); if(error) goto cant_copy; g_object_set_property(G_OBJECT(target),pspec->name,&value); g_object_unref(target); g_value_unset(&value); name=va_arg(var_args,gchar *); } return; not_found: g_warning("no property %s in object",name); return; cant_copy: g_warning("error copying value %s in object: %s",pspec->name,error); g_value_unset(&value); g_object_unref(target); return; } /** * bt_child_proxy_set: * @object: the parent object * @first_property_name: name of the first property to set * @...: value for the first property, followed optionally by more name/value pairs, followed by NULL * * Sets properties of the parent object and its children. */ void bt_child_proxy_set(gpointer object,const gchar *first_property_name, ...) { va_list var_args; g_return_if_fail(G_IS_OBJECT(object)); va_start(var_args,first_property_name); bt_child_proxy_set_valist(object,first_property_name,var_args); va_end(var_args); } //-- interface internals static void bt_child_proxy_default_init(BtChildProxyInterface *klass) { } buzztard-0.6.0/src/lib/core/marshal.list0000644042355400116100000000024711626775664015151 00000000000000# $Id: marshal.list 3615 2011-08-29 20:50:58Z ensonic $ # extra signal marshallers VOID:OBJECT,ULONG VOID:ULONG,OBJECT,ULONG VOID:ULONG,ULONG VOID:ULONG,ULONG,ULONG buzztard-0.6.0/src/lib/core/song-info.c0000644042355400116100000005510311626121152014642 00000000000000/* $Id: song-info.c 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsonginfo * @short_description: class that keeps the meta-data for a #BtSong instance * * Exposes the meta-data of a song as #GObject properties. These are for one * pure data fields such as author and song name. These fields get used when * recording a song to a file (rendering) in the form of meta-tags. * * Further there are fields that determine rythm and song-speed. The speed is * determined by #BtSongInfo:bpm. The rythm is determined by #BtSongInfo:bars * and #BtSongInfo:tpb. If 'bars' is 16, than on can have 1/16 notes. * And if 'ticks per beat' is 4 one will have 4 beats - a classic 4/4 meassure. * For a 3/4 meassure, 'bars' would be 12. Thus bars = beats * tpb. */ /* @todo: add more metadata * - copyright: GST_TAG_COPYRIGHT * string: "(C) YYYY " * - license: GST_TAG_LICENSE (http://creativecommons.org/licenses/) * - would be nice to use liblicense (not widely packaged :/) * - we'll have liblicense support in gst-0.10.36 */ #define BT_CORE #define BT_SONG_INFO_C #include "core_private.h" enum { SONG_INFO_SONG=1, SONG_INFO_TAGLIST, SONG_INFO_FILE_NAME, SONG_INFO_INFO, SONG_INFO_NAME, SONG_INFO_GENRE, SONG_INFO_AUTHOR, SONG_INFO_BPM, SONG_INFO_TPB, SONG_INFO_BARS, SONG_INFO_CREATE_DTS, SONG_INFO_CHANGE_DTS }; struct _BtSongInfoPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the song-info belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the song-info as tag-data */ GstTagList *taglist; GDate *tag_date; /* the file name of the song */ gchar *file_name; /* freeform info about the song */ gchar *info; /* the name of the tune */ gchar *name; /* the genre of the tune */ gchar *genre; /* the author of the tune */ gchar *author; /* how many beats should be played in a minute */ gulong beats_per_minute; /* how many event fire in one fraction of a beat */ gulong ticks_per_beat; /* how many bars per beat */ gulong bars; /* date stamps */ gchar *create_dts,*change_dts; }; // date time stamp format YYYY-MM-DDThh:mm:ssZ #define DTS_LEN 20 /* default name for new songs */ #define DEFAULT_SONG_NAME _("untitled song") //-- the class static void bt_song_info_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSongInfo, bt_song_info, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_song_info_persistence_interface_init)); //-- helper methods /* static gint safe_strcmp(const gchar *s1, const gchar *s2) { if(!s1 && !s2) return 0; else if(!s1) return -1; else if(!s2) return 1; else return strcmp(s1,s2); } */ static void bt_song_info_tempo_changed(const BtSongInfo * const self) { BtSequence *sequence; g_object_get(self->priv->song,"sequence",&sequence,NULL); bt_sequence_update_tempo(sequence); g_object_unref(sequence); } //-- constructor methods /** * bt_song_info_new: * @song: the song the new instance belongs to * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtSongInfo *bt_song_info_new(const BtSong * const song) { return(BT_SONG_INFO(g_object_new(BT_TYPE_SONG_INFO,"song",song,NULL))); } //-- methods //-- io interface static xmlNodePtr bt_song_info_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtSongInfo * const self = BT_SONG_INFO(persistence); xmlNodePtr node=NULL; GST_DEBUG("PERSISTENCE::song-info"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("meta"),NULL))) { if(!strcmp(self->priv->name,DEFAULT_SONG_NAME)) { BtSongIONative *song_io; gchar *file_path,*file_name,*ext; g_object_get(self->priv->song,"song-io",&song_io,NULL); g_object_get(song_io,"file-name",&file_path,NULL); file_name=g_path_get_basename(file_path); if((ext=strrchr(file_name,'.'))) { *ext='\0'; } GST_INFO("using '%s' instead of default title",file_name); g_object_set((gpointer)self,"name",file_name,NULL); g_free(file_name); g_free(file_path); g_object_unref(song_io); } if(self->priv->info) { xmlNewChild(node,NULL,XML_CHAR_PTR("info"),XML_CHAR_PTR(self->priv->info)); } if(self->priv->name) { xmlNewChild(node,NULL,XML_CHAR_PTR("name"),XML_CHAR_PTR(self->priv->name)); } if(self->priv->genre) { xmlNewChild(node,NULL,XML_CHAR_PTR("genre"),XML_CHAR_PTR(self->priv->genre)); } if(self->priv->author) { xmlNewChild(node,NULL,XML_CHAR_PTR("author"),XML_CHAR_PTR(self->priv->author)); } if(self->priv->create_dts) { xmlNewChild(node,NULL,XML_CHAR_PTR("create-dts"),XML_CHAR_PTR(self->priv->create_dts)); } if(self->priv->change_dts) { xmlNewChild(node,NULL,XML_CHAR_PTR("change-dts"),XML_CHAR_PTR(self->priv->change_dts)); } xmlNewChild(node,NULL,XML_CHAR_PTR("bpm"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->beats_per_minute))); xmlNewChild(node,NULL,XML_CHAR_PTR("tpb"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->ticks_per_beat))); xmlNewChild(node,NULL,XML_CHAR_PTR("bars"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(self->priv->bars))); } return(node); } static BtPersistence *bt_song_info_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { const BtSongInfo * const self = BT_SONG_INFO(persistence); GST_DEBUG("PERSISTENCE::song-info"); g_assert(node); for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { xmlNodePtr const child_node=node->children; if(child_node && xmlNodeIsText(child_node) && !xmlIsBlankNode(child_node)) { xmlChar * const elem=xmlNodeGetContent(child_node); if(elem) { const gchar * const property_name=(gchar *)node->name; GST_DEBUG(" \"%s\"=\"%s\"",property_name,elem); // depending on the name of the property, treat it's type if(!strncmp(property_name,"info",4) || !strncmp(property_name,"name",4) || !strncmp(property_name,"genre",5) || !strncmp(property_name,"author",6) || !strncmp(property_name,"create-dts",10) || !strncmp(property_name,"change-dts",10) ) { g_object_set((gpointer)self,property_name,elem,NULL); } else if(!strncmp(property_name,"bpm",3) || !strncmp(property_name,"tpb",3) || !strncmp(property_name,"bars",4)) { g_object_set((gpointer)self,property_name,atol((char *)elem),NULL); } xmlFree(elem); } } } } return(BT_PERSISTENCE(persistence)); } static void bt_song_info_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_song_info_persistence_load; iface->save = bt_song_info_persistence_save; } //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_song_info_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSongInfo * const self = BT_SONG_INFO(object); return_if_disposed(); switch (property_id) { case SONG_INFO_SONG: { g_value_set_object(value, self->priv->song); } break; case SONG_INFO_TAGLIST: { g_value_set_pointer(value, gst_tag_list_copy(self->priv->taglist)); } break; case SONG_INFO_FILE_NAME: { g_value_set_string(value, self->priv->file_name); } break; case SONG_INFO_INFO: { g_value_set_string(value, self->priv->info); } break; case SONG_INFO_NAME: { g_value_set_string(value, self->priv->name); } break; case SONG_INFO_GENRE: { g_value_set_string(value, self->priv->genre); } break; case SONG_INFO_AUTHOR: { g_value_set_string(value, self->priv->author); } break; case SONG_INFO_BPM: { g_value_set_ulong(value, self->priv->beats_per_minute); } break; case SONG_INFO_TPB: { g_value_set_ulong(value, self->priv->ticks_per_beat); } break; case SONG_INFO_BARS: { g_value_set_ulong(value, self->priv->bars); } break; case SONG_INFO_CREATE_DTS: { g_value_set_string(value, self->priv->create_dts); } break; case SONG_INFO_CHANGE_DTS: { g_value_set_string(value, self->priv->change_dts); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_song_info_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSongInfo * const self = BT_SONG_INFO(object); return_if_disposed(); switch (property_id) { case SONG_INFO_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for song-info: %p",self->priv->song); } break; case SONG_INFO_FILE_NAME: { g_free(self->priv->file_name); self->priv->file_name = g_value_dup_string(value); GST_DEBUG("set the file-name for song_info: %s",self->priv->file_name); } break; case SONG_INFO_INFO: { const gchar *str=g_value_get_string(value); if((self->priv->info!=str) && (!self->priv->info || !str || strcmp(self->priv->info,str))) { g_free(self->priv->info); if(str) { self->priv->info = g_value_dup_string(value); gst_tag_list_add(self->priv->taglist,GST_TAG_MERGE_REPLACE,GST_TAG_DESCRIPTION,self->priv->info,NULL); } else { self->priv->info=NULL; gst_tag_list_remove_tag(self->priv->taglist,GST_TAG_DESCRIPTION); } GST_DEBUG("set the info for song_info: %s",self->priv->info); } } break; case SONG_INFO_NAME: { const gchar *str=g_value_get_string(value); if((self->priv->name!=str) && (!self->priv->name || !str || strcmp(self->priv->name,str))) { g_free(self->priv->name); if(str) { self->priv->name = g_value_dup_string(value); gst_tag_list_add(self->priv->taglist,GST_TAG_MERGE_REPLACE,GST_TAG_TITLE,self->priv->name,NULL); } else { self->priv->name=NULL; gst_tag_list_remove_tag(self->priv->taglist,GST_TAG_TITLE); } GST_DEBUG("set the name for song_info: %s",self->priv->name); } } break; case SONG_INFO_GENRE: { const gchar *str=g_value_get_string(value); if((self->priv->genre!=str) && (!self->priv->genre || !str || strcmp(self->priv->genre,str))) { g_free(self->priv->genre); if(str) { self->priv->genre = g_value_dup_string(value); gst_tag_list_add(self->priv->taglist,GST_TAG_MERGE_REPLACE,GST_TAG_GENRE,self->priv->genre,NULL); } else { self->priv->genre=NULL; gst_tag_list_remove_tag(self->priv->taglist,GST_TAG_GENRE); } GST_DEBUG("set the genre for song_info: %s",self->priv->genre); } } break; case SONG_INFO_AUTHOR: { const gchar *str=g_value_get_string(value); if((self->priv->author!=str) && (!self->priv->author || !str || strcmp(self->priv->author,str))) { g_free(self->priv->author); if(str) { self->priv->author=g_value_dup_string(value); gst_tag_list_add(self->priv->taglist,GST_TAG_MERGE_REPLACE,GST_TAG_ARTIST,self->priv->author,NULL); } else { self->priv->author=NULL; gst_tag_list_remove_tag(self->priv->taglist,GST_TAG_ARTIST); } GST_DEBUG("set the author for song_info: %s",self->priv->author); } } break; case SONG_INFO_BPM: { gulong val=g_value_get_ulong(value); if(self->priv->beats_per_minute!=val) { self->priv->beats_per_minute = g_value_get_ulong(value); #if GST_CHECK_VERSION(0,10,12) gst_tag_list_add(self->priv->taglist, GST_TAG_MERGE_REPLACE,GST_TAG_BEATS_PER_MINUTE, (gdouble)self->priv->beats_per_minute,NULL); #endif bt_song_info_tempo_changed(self); GST_DEBUG("set the bpm for song_info: %lu",self->priv->beats_per_minute); } } break; case SONG_INFO_TPB: { gulong val=g_value_get_ulong(value); if(self->priv->ticks_per_beat!=val) { self->priv->ticks_per_beat = g_value_get_ulong(value); bt_song_info_tempo_changed(self); GST_DEBUG("set the tpb for song_info: %lu",self->priv->ticks_per_beat); } } break; case SONG_INFO_BARS: { gulong val=g_value_get_ulong(value); if(self->priv->bars!=val) { self->priv->bars = g_value_get_ulong(value); bt_song_info_tempo_changed(self); GST_DEBUG("set the bars for song_info: %lu",self->priv->bars); } } break; case SONG_INFO_CREATE_DTS: { const gchar * const dts = g_value_get_string(value); if(dts) { if(strlen(dts)==DTS_LEN) { strcpy(self->priv->create_dts,dts); } } else { time_t now=time(NULL); /* this is ISO 8601 Date and Time Format * %F Equivalent to %Y-%m-%d (the ISO 8601 date format). (C99) * %T The time in 24-hour notation (%H:%M:%S). (SU) */ strftime(self->priv->create_dts,DTS_LEN+1,"%FT%TZ",gmtime(&now)); } } break; case SONG_INFO_CHANGE_DTS: { const gchar * const dts = g_value_get_string(value); if(dts) { if(strlen(dts)==DTS_LEN) { struct tm tm={0,}; strcpy(self->priv->change_dts,dts); // parse date and update tag strptime(dts, "%FT%TZ", &tm); #if GLIB_CHECK_VERSION(2,10,0) g_date_set_time_t(self->priv->tag_date,mktime(&tm)); #else g_date_set_time(self->priv->tag_date,mktime(&tm)); #endif gst_tag_list_add(self->priv->taglist, GST_TAG_MERGE_REPLACE,GST_TAG_DATE, self->priv->tag_date,NULL); } } else { time_t now=time(NULL); strftime(self->priv->change_dts,DTS_LEN+1,"%FT%TZ",gmtime(&now)); #if GLIB_CHECK_VERSION(2,10,0) g_date_set_time_t(self->priv->tag_date,now); #else g_date_set_time(self->priv->tag_date,now); #endif gst_tag_list_add(self->priv->taglist, GST_TAG_MERGE_REPLACE,GST_TAG_DATE, self->priv->tag_date,NULL); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_song_info_dispose(GObject * const object) { const BtSongInfo * const self = BT_SONG_INFO(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->song); G_OBJECT_CLASS(bt_song_info_parent_class)->dispose(object); } static void bt_song_info_finalize(GObject * const object) { const BtSongInfo * const self = BT_SONG_INFO(object); GST_DEBUG("!!!! self=%p",self); g_date_free(self->priv->tag_date); gst_tag_list_free(self->priv->taglist); g_free(self->priv->file_name); g_free(self->priv->info); g_free(self->priv->name); g_free(self->priv->genre); g_free(self->priv->author); g_free(self->priv->create_dts); g_free(self->priv->change_dts); G_OBJECT_CLASS(bt_song_info_parent_class)->finalize(object); } //-- class internals static void bt_song_info_init(BtSongInfo * self) { time_t now=time(NULL); self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SONG_INFO, BtSongInfoPrivate); self->priv->taglist=gst_tag_list_new(); self->priv->name=g_strdup(DEFAULT_SONG_NAME); self->priv->author=g_strdup(g_get_real_name()); // @idea alternate bpm's a little at new_song (user defined range?) self->priv->beats_per_minute=125; // 1..1000 self->priv->ticks_per_beat=4; // 1..128 self->priv->bars=16; // 1..16 // init dates 'YYYY-MM-DDThh:mm:ssZ' self->priv->create_dts=g_new(gchar,DTS_LEN+1); self->priv->change_dts=g_new(gchar,DTS_LEN+1); strftime(self->priv->create_dts,DTS_LEN+1,"%FT%TZ",gmtime(&now)); strncpy(self->priv->change_dts,self->priv->create_dts,DTS_LEN+1); GST_DEBUG("date initialized as %s",self->priv->change_dts); // init taglist self->priv->tag_date=g_date_new(); #if GLIB_CHECK_VERSION(2,10,0) g_date_set_time_t(self->priv->tag_date,now); #else g_date_set_time(self->priv->tag_date,now); #endif gst_tag_list_add(self->priv->taglist, GST_TAG_MERGE_REPLACE, GST_TAG_TITLE, self->priv->name, GST_TAG_ARTIST, self->priv->author, GST_TAG_DATE, self->priv->tag_date, #if GST_CHECK_VERSION(0,10,12) GST_TAG_BEATS_PER_MINUTE, (gdouble)self->priv->beats_per_minute, #endif NULL); } static void bt_song_info_class_init(BtSongInfoClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSongInfoPrivate)); gobject_class->set_property = bt_song_info_set_property; gobject_class->get_property = bt_song_info_get_property; gobject_class->dispose = bt_song_info_dispose; gobject_class->finalize = bt_song_info_finalize; g_object_class_install_property(gobject_class,SONG_INFO_SONG, g_param_spec_object("song", "song contruct prop", "song object, the song-info belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_TAGLIST, g_param_spec_pointer("taglist", "songs taglist", "songs meta data as a taglist", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_FILE_NAME, g_param_spec_string("file-name", "file name prop", "songs file name", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_INFO, g_param_spec_string("info", "info prop", "songs freeform info", "comment me!", /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_NAME, g_param_spec_string("name", "name prop", "songs name", DEFAULT_SONG_NAME, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_GENRE, g_param_spec_string("genre", "genre prop", "songs genre", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_AUTHOR, g_param_spec_string("author", "author prop", "songs author", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_BPM, g_param_spec_ulong("bpm", "bpm prop", "how many beats should be played in a minute", 1, 1000, 125, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_TPB, g_param_spec_ulong("tpb", "tpb prop", "event granularity in one beat", 1, 128, 4, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_BARS, g_param_spec_ulong("bars", "bars prop", "how many bars per meassure", 1, 64, 16, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_CREATE_DTS, g_param_spec_string("create-dts", "creation dts prop", "song creation date time stamp (iso 8601 format)", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_INFO_CHANGE_DTS, g_param_spec_string("change-dts", "changed dts prop", "song changed date time stamp (iso 8601 format)", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/BuzztardCore-0.0.gir0000644042355400116100000000000011675570675016223 00000000000000buzztard-0.6.0/src/lib/core/gconf-settings.c0000644042355400116100000005115011576360371015707 00000000000000/* $Id: gconf-settings.c 3103 2010-12-16 13:29:33Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btgconfsettings * @short_description: gconf based implementation sub class for buzztard * settings handling * * GConf is the standart mechanism used in GNOME to handle persistance of * application settings and status. */ #define BT_CORE #define BT_GCONF_SETTINGS_C #include "core_private.h" #include struct _BtGConfSettingsPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* that is the handle we get config data from */ GConfClient *client; /* flags if there was a write */ gboolean dirty; /* flkags for watched dirs */ gboolean watch_gstreamer, watch_gnome, watch_buzztard; /* signal watch id */ guint gnome_toolbar_style_notify; }; #define BT_GCONF_PATH_GSTREAMER "/system/gstreamer/default" #define BT_GCONF_PATH_GNOME "/desktop/gnome/interface" #define BT_GCONF_PATH_BUZZTARD "/apps/"PACKAGE //-- the class G_DEFINE_TYPE (BtGConfSettings, bt_gconf_settings, BT_TYPE_SETTINGS); //-- event handler static void bt_gconf_settings_notify_toolbar_style(GConfClient * const client, guint cnxn_id, GConfEntry * const entry, gpointer const user_data) { BtGConfSettings *self=BT_GCONF_SETTINGS(user_data); GST_INFO("!!! gconf notify for toolbar style"); g_object_notify(G_OBJECT(self),"toolbar-style"); } //-- helper static gboolean watch_gstreamer(const BtGConfSettings * const self) { gboolean res=TRUE; GError *error=NULL; gconf_client_add_dir(self->priv->client,BT_GCONF_PATH_GSTREAMER,GCONF_CLIENT_PRELOAD_NONE,&error); if(error) { GST_WARNING("can't connect to dir %s: %s",BT_GCONF_PATH_GSTREAMER,error->message); g_error_free(error);error=NULL; res=FALSE; } else { self->priv->watch_gstreamer=TRUE; /* @todo: also listen to BT_GCONF_PATH_GSTREAMER"/audiosink" */ } return res; } static gboolean watch_gnome(const BtGConfSettings * const self) { gboolean res=TRUE; GError *error=NULL; gconf_client_add_dir(self->priv->client,BT_GCONF_PATH_GNOME,GCONF_CLIENT_PRELOAD_NONE,&error); if(error) { GST_WARNING("can't connect to dir %s: %s",BT_GCONF_PATH_GNOME,error->message); g_error_free(error);error=NULL; res=FALSE; } else { self->priv->watch_gnome=TRUE; self->priv->gnome_toolbar_style_notify=gconf_client_notify_add(self->priv->client, BT_GCONF_PATH_GNOME"/toolbar_style", bt_gconf_settings_notify_toolbar_style, (gpointer)self, NULL, &error); if(error) { GST_WARNING("can't listen to notifies on %s: %s",BT_GCONF_PATH_GNOME"/toolbar_style",error->message); g_error_free(error);error=NULL; res=FALSE; } } return res; } static gboolean watch_buzztard(const BtGConfSettings * const self) { gboolean res=TRUE; GError *error=NULL; //gconf_client_add_dir(self->priv->client,BT_GCONF_PATH_BUZZTARD,GCONF_CLIENT_PRELOAD_ONELEVEL,&error); gconf_client_add_dir(self->priv->client,BT_GCONF_PATH_BUZZTARD,GCONF_CLIENT_PRELOAD_NONE,&error); if(error) { GST_WARNING("can't connect to dir %s: %s",BT_GCONF_PATH_BUZZTARD,error->message); g_error_free(error);error=NULL; res=FALSE; } else { self->priv->watch_buzztard=TRUE; } return res; } static void read_boolean(const BtGConfSettings * const self, const gchar *path, GValue * const value) { gboolean prop=gconf_client_get_bool(self->priv->client,path,NULL); GST_DEBUG("application reads '%s' : '%d'",path,prop); g_value_set_boolean(value,prop); } #if 0 static void read_int(const BtGConfSettings * const self, const gchar *path, GValue * const value) { guint prop=gconf_client_get_int(self->priv->client,path,NULL); GST_DEBUG("application reads '%s' : '%u'",path,prop); g_value_set_uint(value,prop); } #endif static void read_int_def(const BtGConfSettings * const self, const gchar *path, GValue * const value, GParamSpecInt * const pspec) { gint prop=gconf_client_get_int(self->priv->client,path,NULL); if(prop) { GST_DEBUG("application reads '%s' : '%i'",path,prop); g_value_set_int(value,prop); } else { GST_DEBUG("application reads [def] '%s' : '%i'",path,pspec->default_value); g_value_set_int(value,pspec->default_value); } } static void read_uint(const BtGConfSettings * const self, const gchar *path, GValue * const value) { guint prop=gconf_client_get_int(self->priv->client,path,NULL); GST_DEBUG("application reads '%s' : '%u'",path,prop); g_value_set_uint(value,prop); } static void read_uint_def(const BtGConfSettings * const self, const gchar *path, GValue * const value, GParamSpecUInt * const pspec) { guint prop=gconf_client_get_int(self->priv->client,path,NULL); if(prop) { GST_DEBUG("application reads '%s' : '%u'",path,prop); g_value_set_uint(value,prop); } else { GST_DEBUG("application reads [def] '%s' : '%u'",path,pspec->default_value); g_value_set_uint(value,pspec->default_value); } } static void read_string(const BtGConfSettings * const self, const gchar *path, GValue * const value) { gchar * const prop=gconf_client_get_string(self->priv->client,path,NULL); GST_DEBUG("application reads '%s' : '%s'",path,prop); g_value_take_string(value,prop); } static void read_string_def(const BtGConfSettings * const self, const gchar *path, GValue * const value, GParamSpecString * const pspec) { gchar * const prop=gconf_client_get_string(self->priv->client,path,NULL); if(prop) { GST_DEBUG("application reads '%s' : '%s'",path,prop); g_value_take_string(value,prop); //g_value_set_string(value,prop); //g_free(prop); } else { GST_DEBUG("application reads [def] '%s' : '%s'",path,pspec->default_value); g_value_set_static_string(value,pspec->default_value); } } static void write_boolean(const BtGConfSettings * const self, const gchar *path, const GValue * const value) { gboolean prop=g_value_get_boolean(value); #ifndef GST_DISABLE_GST_DEBUG gboolean res= #endif gconf_client_set_bool(self->priv->client,path,prop,NULL); GST_DEBUG("application wrote '%s' : '%d' (%s)",path,prop,(res?"okay":"fail")); } static void write_int(const BtGConfSettings * const self, const gchar *path, const GValue * const value) { gint prop=g_value_get_int(value); #ifndef GST_DISABLE_GST_DEBUG gboolean res= #endif gconf_client_set_int(self->priv->client,path,prop,NULL); GST_DEBUG("application wrote '%s' : '%i' (%s)",path,prop,(res?"okay":"fail")); } static void write_uint(const BtGConfSettings * const self, const gchar *path, const GValue * const value) { guint prop=g_value_get_uint(value); #ifndef GST_DISABLE_GST_DEBUG gboolean res= #endif gconf_client_set_int(self->priv->client,path,prop,NULL); GST_DEBUG("application wrote '%s' : '%u' (%s)",path,prop,(res?"okay":"fail")); } static void write_string(const BtGConfSettings * const self, const gchar *path, const GValue * const value) { const gchar *prop=g_value_get_string(value); #ifndef GST_DISABLE_GST_DEBUG gboolean res= #endif gconf_client_set_string(self->priv->client,path,prop,NULL); GST_DEBUG("application wrote '%s' : '%s' (%s)",path,prop,(res?"okay":"fail")); } //-- constructor methods /** * bt_gconf_settings_new: * * Create a new instance. * * Returns: the new instance or %NULL in case of an error */ BtGConfSettings *bt_gconf_settings_new(void) { return(BT_GCONF_SETTINGS(g_object_new(BT_TYPE_GCONF_SETTINGS,NULL))); } //-- methods //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_gconf_settings_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtGConfSettings * const self = BT_GCONF_SETTINGS(object); return_if_disposed(); switch (property_id) { /* ui */ case BT_SETTINGS_NEWS_SEEN: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_uint(self,BT_GCONF_PATH_BUZZTARD"/news-seen",value); } break; case BT_SETTINGS_MISSING_MACHINES: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string(self,BT_GCONF_PATH_BUZZTARD"/missing-machines",value); } break; case BT_SETTINGS_PRESENTED_TIPS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string(self,BT_GCONF_PATH_BUZZTARD"/presented-tips",value); } break; case BT_SETTINGS_SHOW_TIPS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_boolean(self,BT_GCONF_PATH_BUZZTARD"/show-tips",value); } break; case BT_SETTINGS_MENU_TOOLBAR_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_boolean(self,BT_GCONF_PATH_BUZZTARD"/toolbar-hide",value); } break; case BT_SETTINGS_MENU_STATUSBAR_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_boolean(self,BT_GCONF_PATH_BUZZTARD"/statusbar-hide",value); } break; case BT_SETTINGS_MENU_TABS_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_boolean(self,BT_GCONF_PATH_BUZZTARD"/tabs-hide",value); } break; case BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string_def(self,BT_GCONF_PATH_BUZZTARD"/grid-density",value,(GParamSpecString *)pspec); } break; case BT_SETTINGS_WINDOW_XPOS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_int_def(self,BT_GCONF_PATH_BUZZTARD"/window/x-pos",value,(GParamSpecInt *)pspec); } break; case BT_SETTINGS_WINDOW_YPOS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_int_def(self,BT_GCONF_PATH_BUZZTARD"/window/y-pos",value,(GParamSpecInt *)pspec); } break; case BT_SETTINGS_WINDOW_WIDTH: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_int_def(self,BT_GCONF_PATH_BUZZTARD"/window/width",value,(GParamSpecInt *)pspec); } break; case BT_SETTINGS_WINDOW_HEIGHT: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_int_def(self,BT_GCONF_PATH_BUZZTARD"/window/height",value,(GParamSpecInt *)pspec); } break; /* audio settings */ case BT_SETTINGS_AUDIOSINK: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string_def(self,BT_GCONF_PATH_BUZZTARD"/audiosink",value,(GParamSpecString *)pspec); } break; case BT_SETTINGS_SAMPLE_RATE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_uint_def(self,BT_GCONF_PATH_BUZZTARD"/sample-rate",value,(GParamSpecUInt *)pspec); } break; case BT_SETTINGS_CHANNELS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_uint_def(self,BT_GCONF_PATH_BUZZTARD"/channels",value,(GParamSpecUInt *)pspec); } break; /* playback controller */ case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_ACTIVE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_boolean(self,BT_GCONF_PATH_BUZZTARD"/playback-controller/coherence-upnp-active",value); } break; case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_uint(self,BT_GCONF_PATH_BUZZTARD"/playback-controller/coherence-upnp-port",value); } break; /* directory settings */ case BT_SETTINGS_FOLDER_SONG: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string_def(self,BT_GCONF_PATH_BUZZTARD"/song-folder",value,(GParamSpecString *)pspec); } break; case BT_SETTINGS_FOLDER_RECORD: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string_def(self,BT_GCONF_PATH_BUZZTARD"/record-folder",value,(GParamSpecString *)pspec); } break; case BT_SETTINGS_FOLDER_SAMPLE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); read_string_def(self,BT_GCONF_PATH_BUZZTARD"/sample-folder",value,(GParamSpecString *)pspec); } break; /* system settings */ case BT_SETTINGS_SYSTEM_AUDIOSINK: { if (!G_UNLIKELY(self->priv->watch_gstreamer)) watch_gstreamer(self); read_string(self,BT_GCONF_PATH_GSTREAMER"/audiosink",value); } break; case BT_SETTINGS_SYSTEM_TOOLBAR_STYLE: { if (!G_UNLIKELY(self->priv->watch_gnome)) watch_gnome(self); read_string(self,BT_GCONF_PATH_GNOME"/toolbar_style",value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_gconf_settings_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtGConfSettings * const self = BT_GCONF_SETTINGS(object); return_if_disposed(); self->priv->dirty=TRUE; switch (property_id) { /* ui */ case BT_SETTINGS_NEWS_SEEN: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_uint(self,BT_GCONF_PATH_BUZZTARD"/news-seen",value); } break; case BT_SETTINGS_MISSING_MACHINES: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/missing-machines",value); } break; case BT_SETTINGS_PRESENTED_TIPS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/presented-tips",value); } break; case BT_SETTINGS_SHOW_TIPS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_boolean(self,BT_GCONF_PATH_BUZZTARD"/show-tips",value); } break; case BT_SETTINGS_MENU_TOOLBAR_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_boolean(self,BT_GCONF_PATH_BUZZTARD"/toolbar-hide",value); } break; case BT_SETTINGS_MENU_STATUSBAR_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_boolean(self,BT_GCONF_PATH_BUZZTARD"/statusbar-hide",value); } break; case BT_SETTINGS_MENU_TABS_HIDE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_boolean(self,BT_GCONF_PATH_BUZZTARD"/tabs-hide",value); } break; case BT_SETTINGS_MACHINE_VIEW_GRID_DENSITY: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/grid-density",value); } break; case BT_SETTINGS_WINDOW_XPOS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_int(self,BT_GCONF_PATH_BUZZTARD"/window/x-pos",value); } break; case BT_SETTINGS_WINDOW_YPOS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_int(self,BT_GCONF_PATH_BUZZTARD"/window/y-pos",value); } break; case BT_SETTINGS_WINDOW_WIDTH: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_int(self,BT_GCONF_PATH_BUZZTARD"/window/width",value); } break; case BT_SETTINGS_WINDOW_HEIGHT: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_int(self,BT_GCONF_PATH_BUZZTARD"/window/height",value); } break; /* audio settings */ case BT_SETTINGS_AUDIOSINK: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/audiosink",value); } break; case BT_SETTINGS_SAMPLE_RATE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_uint(self,BT_GCONF_PATH_BUZZTARD"/sample-rate",value); } break; case BT_SETTINGS_CHANNELS: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_uint(self,BT_GCONF_PATH_BUZZTARD"/channels",value); } break; /* playback controller */ case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_ACTIVE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_boolean(self,BT_GCONF_PATH_BUZZTARD"/playback-controller/coherence-upnp-active",value); } break; case BT_SETTINGS_PLAYBACK_CONTROLLER_COHERENCE_UPNP_PORT: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_uint(self,BT_GCONF_PATH_BUZZTARD"/playback-controller/coherence-upnp-port",value); } break; /* directory settings */ case BT_SETTINGS_FOLDER_SONG: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/song-folder",value); } break; case BT_SETTINGS_FOLDER_RECORD: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/record-folder",value); } break; case BT_SETTINGS_FOLDER_SAMPLE: { if (!G_UNLIKELY(self->priv->watch_buzztard)) watch_buzztard(self); write_string(self,BT_GCONF_PATH_BUZZTARD"/sample-folder",value); } break; /* system settings */ default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_gconf_settings_dispose(GObject * const object) { const BtGConfSettings * const self = BT_GCONF_SETTINGS(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); if(self->priv->client) { GError *error=NULL; GST_DEBUG("!!!! client=%p, client->ref_ct=%d",self->priv->client,G_OBJECT_REF_COUNT(self->priv->client)); // unregister directories to watch and notifies if(self->priv->watch_gstreamer) { gconf_client_remove_dir(self->priv->client,BT_GCONF_PATH_GSTREAMER,&error); if(error) { GST_WARNING("can't disconnect dir %s: %s",BT_GCONF_PATH_GSTREAMER,error->message); g_error_free(error);error=NULL; } } if(self->priv->watch_gnome) { gconf_client_notify_remove(self->priv->client,self->priv->gnome_toolbar_style_notify); gconf_client_remove_dir(self->priv->client,BT_GCONF_PATH_GNOME,&error); if(error) { GST_WARNING("can't disconnect dir %s: %s",BT_GCONF_PATH_GNOME,error->message); g_error_free(error);error=NULL; } } if(self->priv->watch_buzztard) { gconf_client_remove_dir(self->priv->client,BT_GCONF_PATH_BUZZTARD,&error); if(error) { GST_WARNING("can't disconnect dir %s: %s",BT_GCONF_PATH_BUZZTARD,error->message); g_error_free(error);error=NULL; } } GST_DEBUG("dirs unwatched"); // shutdown gconf client if(self->priv->dirty) { GST_DEBUG("syncing gconf settings"); // only do this if we have written something gconf_client_suggest_sync(self->priv->client,NULL); } g_object_unref(self->priv->client); } GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_gconf_settings_parent_class)->dispose(object); } //-- class internals static void bt_gconf_settings_init(BtGConfSettings * self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_GCONF_SETTINGS, BtGConfSettingsPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->client=gconf_client_get_default(); if(self->priv->client) { gconf_client_set_error_handling(self->priv->client,GCONF_CLIENT_HANDLE_UNRETURNED); } else { GST_WARNING("can't get default gconf client"); } } static void bt_gconf_settings_class_init(BtGConfSettingsClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtGConfSettingsPrivate)); gobject_class->set_property = bt_gconf_settings_set_property; gobject_class->get_property = bt_gconf_settings_get_property; gobject_class->dispose = bt_gconf_settings_dispose; } buzztard-0.6.0/src/lib/core/song.c0000644042355400116100000017232311670213062013716 00000000000000/* $Id: song.c 3767 2011-12-08 19:55:28Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsong * @short_description: class of a song project object (contains #BtSongInfo, * #BtSetup, #BtSequence and #BtWavetable) * * A song is the top-level container object to manage all song-related objects. * * To load or save a song, use a #BtSongIO object. These implement loading and * saving for different file-formats. * * One can seek in a song by setting the #BtSong:play-pos property. Likewise one * can watch the property to display the playback position. * * The #BtSong:play-rate property can be used to change the playback speed and * direction. */ /* idle looping (needed for playing machines live) * - states: * is_playing is_idle * FALSE FALSE no playback * FALSE TRUE play machines * TRUE FALSE play song and machines * true true not supported * * is_playing_changed: // in some of these case we could just seek * if(is_playing) { * if(is_idle) * bt_song_idle_stop(); * bt_song_play(); * } * else { * bt_song_stop(); * if(is_idle) * bt_song_idle_start(); * } * is_idle_change: * if(is_idle) { * if(!is_playing) * bt_song_idle_start(); * } * else { * if(!is_playing) * bt_song_idle_stop(); * } */ /* fast seeking * - see bt_song_change_play_rate() * - there is a problem with wrapping around in loop mode, when playing backwards */ #define BT_CORE #define BT_SONG_C #include "core_private.h" // if a state change not happens within this time, cancel playback // this includes prerolling #ifndef USE_HILDON // 30 seconds for now #define BT_SONG_STATE_CHANGE_TIMEOUT (30*1000) #else // 60 seconds for now #define BT_SONG_STATE_CHANGE_TIMEOUT (60*1000) #endif /* @todo: if we could only go to ready when doing STOP, we could keep the * jack linkage alive (see #ifdef USE_READY_FOR_STOPPED) * todo: * - need to set elements to NULL before removing * problems: * - jack loops last segment it received * http://bugzilla.gnome.org/show_bug.cgi?id=582167 */ //#define USE_READY_FOR_STOPPED 1 //-- property ids enum { SONG_APP=1, SONG_BIN, SONG_MASTER, SONG_SONG_INFO, SONG_SEQUENCE, SONG_SETUP, SONG_WAVETABLE, SONG_PLAY_POS, SONG_PLAY_RATE, SONG_IS_PLAYING, SONG_IS_IDLE, SONG_IO }; struct _BtSongPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the parts of the song */ BtSongInfo* song_info; BtSequence* sequence; BtSetup* setup; BtWavetable* wavetable; /* the playback position of the song */ gulong play_pos,play_end; gdouble play_rate; /* flag to signal playing and idle states */ gboolean is_playing,is_preparing; gboolean is_idle,is_idle_active; /* the application that currently uses the song */ G_POINTER_ALIAS(BtApplication *,app); /* the main gstreamer container element */ GstBin *bin,*master_bin; /* the element that has the clock */ G_POINTER_ALIAS(BtSinkMachine *,master); /* the query is used in update_playback_position */ GstQuery *position_query; /* seek events */ GstEvent *play_seek_event; GstEvent *loop_seek_event; GstEvent *idle_seek_event; GstEvent *idle_loop_seek_event; #if ! GST_CHECK_VERSION(0,10,23) guint expected_segment_done; #endif /* timeout handlers */ guint paused_timeout_id,playback_timeout_id; /* the song-io plugin during i/o operations */ BtSongIO *song_io; }; //-- the class static void bt_song_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSong, bt_song, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_song_persistence_interface_init)); //-- helper static void bt_song_update_play_seek_event(const BtSong * const self) { gboolean loop; glong loop_start,loop_end,length; gulong play_pos=self->priv->play_pos; g_object_get(self->priv->sequence,"loop",&loop,"loop-start",&loop_start,"loop-end",&loop_end,"length",&length,NULL); const GstClockTime bar_time=bt_sequence_get_bar_time(self->priv->sequence); //GST_INFO("rate %lf, loop %d? %ld ... %ld, length %ld, pos %lu",self->priv->play_rate,loop,loop_start,loop_end,length,play_pos); if(loop_start==-1) loop_start=0; if(loop_end==-1) loop_end=length+1; if(play_pos>=loop_end) play_pos=loop_start; // remember end for eos self->priv->play_end=loop_end; GST_INFO("loop %d? %ld ... %ld, length %ld, pos %lu, bar_time %"GST_TIME_FORMAT, loop,loop_start,loop_end,length,play_pos,GST_TIME_ARGS(bar_time)); if(self->priv->play_seek_event) gst_event_unref(self->priv->play_seek_event); if(self->priv->loop_seek_event) gst_event_unref(self->priv->loop_seek_event); /* we need to use FLUSH for play (due to prerolling), otherwise: 0:00:00.866899000 15884 0x81cee70 DEBUG basesink gstbasesink.c:1644:gst_base_sink_do_sync: prerolling object 0x818ce90 0:00:00.866948000 15884 0x81cee70 DEBUG basesink gstbasesink.c:1493:gst_base_sink_wait_preroll: waiting in preroll for flush or PLAYING but not for loop */ if (loop) { self->priv->play_seek_event = gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, play_pos*bar_time, GST_SEEK_TYPE_SET, loop_end*bar_time); self->priv->loop_seek_event = gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, loop_start*bar_time, GST_SEEK_TYPE_SET, loop_end*bar_time); } else { self->priv->play_seek_event = gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, play_pos*bar_time, GST_SEEK_TYPE_SET, loop_end*bar_time); self->priv->loop_seek_event = NULL; } } /* * bt_song_seek_to_play_pos: * @self: #BtSong to seek * * Send a new playback segment, that goes from the current playback position to * the new end position (loop or song end). */ static void bt_song_seek_to_play_pos(const BtSong * const self) { GstEvent *event; gboolean loop; glong loop_end,length; if(!self->priv->is_playing) return; g_object_get(self->priv->sequence,"loop",&loop,"loop-end",&loop_end,"length",&length,NULL); const GstClockTime bar_time=bt_sequence_get_bar_time(self->priv->sequence); GST_INFO("loop %d? %ld, length %ld, bar_time %"GST_TIME_FORMAT,loop,loop_end,length,GST_TIME_ARGS(bar_time)); // we need to flush, otherwise mixing goes out of sync if (loop) { event = gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time, GST_SEEK_TYPE_SET, (loop_end+0)*bar_time); } else { event = gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time, GST_SEEK_TYPE_SET, (length+1)*bar_time); } if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),event))) { GST_WARNING("element failed to seek to play_pos event"); } } static void bt_song_change_play_rate(const BtSong * const self) { GstEvent *event; gboolean loop; glong loop_start,loop_end,length; if(!self->priv->is_playing) return; g_object_get(self->priv->sequence,"loop",&loop,"loop-start",&loop_start,"loop-end",&loop_end,"length",&length,NULL); const GstClockTime bar_time=bt_sequence_get_bar_time(self->priv->sequence); GST_INFO("rate %lf, loop %d?",self->priv->play_rate,loop); bt_song_update_play_seek_event(self); /* in 0.10.24 we do have step events (gst_event_new_step), they require an * initial seek if the direction has changed */ // changing the playback rate should mostly affect sinks // still we need to flush to avoid adder locking up (fixed in 0.10.35.1 - no?) // and we need to give the position to workaround basesrc starting from 0 if (loop) { if(self->priv->play_rate>0.0) { event=gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, //GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time, GST_SEEK_TYPE_SET, loop_end*bar_time); } else { event=gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, //GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, loop_start*bar_time, GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time); } } else { if(self->priv->play_rate>0.0) { event=gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, //GST_SEEK_FLAG_NONE, GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time, GST_SEEK_TYPE_SET, (length+1)*bar_time); } else { event=gst_event_new_seek(self->priv->play_rate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, //GST_SEEK_FLAG_NONE, GST_SEEK_TYPE_SET, G_GINT64_CONSTANT(0), GST_SEEK_TYPE_SET, self->priv->play_pos*bar_time); } } if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),event))) { GST_WARNING("element failed to change playback rate"); } GST_INFO("rate updated"); } /* * bt_song_update_play_seek_event_and_play_pos: * @self: #BtSong to seek * * Prepares a new playback segment, that goes from the new start position (loop * or song start) to the new end position (loop or song end). * Also calls bt_song_seek_to_play_pos() to update the current playback segment. */ static void bt_song_update_play_seek_event_and_play_pos(const BtSong * const self) { bt_song_update_play_seek_event(self); /* the update needs to take the current play-position into account */ bt_song_seek_to_play_pos(self); } static void bt_song_send_tags(const BtSong * const self) { GstTagList * const taglist; GstIterator *it; GstEvent *tag_event; gboolean done; gpointer item; // send tags g_object_get(self->priv->song_info,"taglist",&taglist,NULL); GST_DEBUG("about to send metadata to tagsetters, taglist=%p",taglist); it=gst_bin_iterate_all_by_interface(self->priv->bin,GST_TYPE_TAG_SETTER); done=FALSE; while(!done) { switch(gst_iterator_next(it, &item)) { case GST_ITERATOR_OK: GST_INFO("sending tags to '%s' element",GST_OBJECT_NAME(GST_ELEMENT(item))); gst_tag_setter_merge_tags(GST_TAG_SETTER(item),taglist,GST_TAG_MERGE_REPLACE); gst_object_unref(item); break; case GST_ITERATOR_RESYNC: gst_iterator_resync(it); break; case GST_ITERATOR_ERROR: GST_WARNING("wrong parameter for iterator"); done=TRUE; break; case GST_ITERATOR_DONE: done=TRUE; break; } } gst_iterator_free (it); #if 1 done=FALSE; // should be fixed by: // http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gstreamer/libs/gst/base/gstbasesrc.c.diff?r1=1.139&r2=1.140 // but is not :/ //GST_DEBUG("about to send metadata to all sources"); //it=gst_bin_iterate_sources(self->priv->bin); GST_DEBUG("about to send metadata to all elements"); it=gst_bin_iterate_elements(self->priv->bin); tag_event=gst_event_new_tag(gst_structure_copy(taglist)); while(!done) { switch(gst_iterator_next(it, &item)) { case GST_ITERATOR_OK: GST_DEBUG("sending tags to '%s' element",GST_OBJECT_NAME(GST_ELEMENT(item))); if(!(gst_element_send_event(GST_ELEMENT(item),gst_event_ref(tag_event)))) { //GST_WARNING("element '%s' failed to handle tag event",GST_OBJECT_NAME(GST_ELEMENT(item))); } gst_object_unref(item); break; case GST_ITERATOR_RESYNC: gst_iterator_resync(it); break; case GST_ITERATOR_ERROR: GST_WARNING("wrong parameter for iterator"); done=TRUE; break; case GST_ITERATOR_DONE: done=TRUE; break; } } gst_iterator_free(it); gst_event_unref(tag_event); #endif gst_element_found_tags(GST_ELEMENT(self->priv->bin),taglist); } //-- handler static void on_song_segment_done(const GstBus * const bus, const GstMessage * const message, gconstpointer user_data) { const BtSong * const self = BT_SONG(user_data); //GstStateChangeReturn res; #ifndef GST_DISABLE_GST_DEBUG GstFormat format; gint64 position; #if GST_CHECK_VERSION(0,10,22) guint32 seek_seqnum=gst_message_get_seqnum((GstMessage *)message); #endif gst_message_parse_segment_done((GstMessage *)message,&format,&position); #endif #if 0 /* time it takes from emitting to handling the event, depends on a change in * gstreamer core to timestamp messages */ { GstClockTime delta=GST_CLOCK_DIFF(GST_MESSAGE_TIMESTAMP (message),gst_util_get_timestamp()); GST_WARNING("received SEGMENT_DONE after=%"GST_TIME_FORMAT,GST_TIME_ARGS(delta)); } #endif #if GST_CHECK_VERSION(0,10,22) GST_INFO("received SEGMENT_DONE (%u) bus message: %p, from %s, with fmt=%s, ts=%"GST_TIME_FORMAT, seek_seqnum,message,GST_OBJECT_NAME(GST_MESSAGE_SRC(message)), gst_format_get_name(format),GST_TIME_ARGS(position)); #else GST_WARNING("received SEGMENT_DONE bus message: %p, from %s with fmt=%s, ts=%"GST_TIME_FORMAT, message,GST_OBJECT_NAME(GST_MESSAGE_SRC(message)), gst_format_get_name(format),GST_TIME_ARGS(position)); #endif #if ! GST_CHECK_VERSION(0,10,23) /* @bug: workaround for #575598 */ if(!self->priv->expected_segment_done) { #if GST_CHECK_VERSION(0,10,22) && GST_VERSION_NANO==1 self->priv->expected_segment_done=1; #else GList *sources,*node; sources=bt_setup_get_machines_by_type(self->priv->setup,BT_TYPE_SOURCE_MACHINE); self->priv->expected_segment_done=g_list_length(sources); for(node=sources;node;node=g_list_next(node)) { g_object_unref((GObject *)node->data); } g_list_free(sources); #endif } self->priv->expected_segment_done--; if(self->priv->expected_segment_done) { GST_WARNING("-> skip"); return; } #endif if(self->priv->is_playing || self->priv->is_idle_active) { GstEvent *event; if(self->priv->is_playing) { event=gst_event_ref(self->priv->loop_seek_event); } else { event=gst_event_ref(self->priv->idle_loop_seek_event); } #if GST_CHECK_VERSION(0,10,22) gst_event_set_seqnum(event,gst_util_seqnum_next()); #endif if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),event))) { GST_WARNING("element failed to handle continuing play seek event"); } else { GST_INFO("-> loop"); /* gst_pipeline_set_new_stream_time (GST_PIPELINE (self->priv->bin), 0); gst_element_get_state (GST_ELEMENT (self->priv->bin), NULL, NULL, 40 * GST_MSECOND); */ } } else { GST_WARNING("song isn't playing/idling ?!?"); } } static void on_song_eos(const GstBus * const bus, const GstMessage * const message, gconstpointer user_data) { const BtSong * const self = BT_SONG(user_data); GST_INFO("received EOS bus message from: %s", GST_OBJECT_NAME (GST_MESSAGE_SRC (message))); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->bin)) { self->priv->play_pos=self->priv->play_end; g_object_notify(G_OBJECT(self),"play-pos"); bt_song_stop(self); } } static gboolean on_song_paused_timeout(gpointer user_data) { const BtSong * const self = BT_SONG(user_data); if(self->priv->is_preparing) { GST_WARNING("->PAUSED timeout occurred"); bt_song_write_to_lowlevel_dot_file(self); bt_song_stop(self); } self->priv->paused_timeout_id=0; return(FALSE); } static void on_song_state_changed(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtSong * const self = BT_SONG(user_data); //GST_INFO("user_data=%p,<%s>, bin=%p, msg->src=%p,<%s>", // user_data, G_OBJECT_TYPE_NAME(G_OBJECT(user_data)), // self->priv->bin,GST_MESSAGE_SRC(message),G_OBJECT_TYPE_NAME(GST_MESSAGE_SRC(message))); if(self->priv->is_idle_active) return; if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->bin)) { GstState oldstate,newstate,pending; gst_message_parse_state_changed(message,&oldstate,&newstate,&pending); GST_INFO("state change on the bin: %s -> %s", gst_element_state_get_name(oldstate),gst_element_state_get_name(newstate)); switch(GST_STATE_TRANSITION(oldstate,newstate)) { #ifndef USE_READY_FOR_STOPPED /* - if we do this in READY_TO_PAUSED, we get two PAUSED -> PAUSED transitions * - seeking in READY won't work for video * - seeking in PAUSED would discard prerolled data */ //case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_NULL_TO_READY: // here the formats are negotiated //bt_song_write_to_lowlevel_dot_file(self); // we're prepared to play self->priv->is_preparing=FALSE; // this should be sequence->play_start self->priv->play_pos=0; // seek to start time GST_DEBUG_OBJECT(self->priv->master_bin,"seek event: %"GST_PTR_FORMAT,self->priv->play_seek_event); if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),gst_event_ref(self->priv->play_seek_event)))) { GST_WARNING_OBJECT(self->priv->master_bin, "bin failed to handle seek event"); } break; #endif case GST_STATE_CHANGE_PAUSED_TO_PLAYING: if(!self->priv->is_playing) { GST_INFO("playback started"); self->priv->is_playing=TRUE; g_object_notify(G_OBJECT(self),"is-playing"); } else { GST_INFO("looping"); } if(self->priv->paused_timeout_id) { g_source_remove(self->priv->paused_timeout_id); self->priv->paused_timeout_id=0; } break; default: break; } } } static void on_song_async_done(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtSong * const self = BT_SONG(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->bin)) { GST_INFO("async state-change done"); if(self->priv->paused_timeout_id) { g_source_remove(self->priv->paused_timeout_id); self->priv->paused_timeout_id=0; } bt_song_update_playback_position(self); } } static void on_song_clock_lost(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtSong * const self = BT_SONG(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->bin)) { GST_INFO("clock·lost!·PAUSE·and·PLAY·to·select·a·new·clock"); gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PAUSED); gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PLAYING); } } static void bt_song_on_loop_changed(BtSequence * const sequence, GParamSpec * const arg, gconstpointer user_data) { bt_song_update_play_seek_event_and_play_pos(BT_SONG(user_data)); } static void bt_song_on_loop_start_changed(BtSequence * const sequence, GParamSpec * const arg, gconstpointer user_data) { bt_song_update_play_seek_event_and_play_pos(BT_SONG(user_data)); } static void bt_song_on_loop_end_changed(BtSequence * const sequence, GParamSpec * const arg, gconstpointer user_data) { bt_song_update_play_seek_event_and_play_pos(BT_SONG(user_data)); } static void bt_song_on_length_changed(BtSequence * const sequence, GParamSpec * const arg, gconstpointer user_data) { bt_song_update_play_seek_event_and_play_pos(BT_SONG(user_data)); } static void bt_song_on_tempo_changed(BtSongInfo * const song_info, GParamSpec * const arg, gconstpointer user_data) { bt_song_update_play_seek_event_and_play_pos(BT_SONG(user_data)); } /* required for live mode */ /* * bt_song_idle_start: * @self: a #BtSong * * Works like bt_song_play(), but sends a segmented-seek that loops from * G_MAXUINT64-GST_SECOND to G_MAXUINT64-1. * This is needed to do state changes (mute, solo, bypass) and to play notes * live. * * The application should not be concered about this internal detail. Stopping * and restarting the idle loop should only be done, when massive changes are * about (e.g. loading a song). * * Returns: %TRUE for success */ static gboolean bt_song_idle_start(const BtSong * const self) { GstStateChangeReturn res; GST_INFO("prepare idle loop"); self->priv->is_idle_active=TRUE; // prepare idle loop if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PAUSED))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to paused state"); self->priv->is_idle_active=FALSE; return(FALSE); } GST_DEBUG("state change returned %d",res); // seek to start time if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),gst_event_ref(self->priv->idle_seek_event)))) { GST_WARNING("element failed to handle idle seek event"); } // start idling if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PLAYING))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to playing state"); self->priv->is_idle_active=FALSE; return(FALSE); } GST_DEBUG("state change returned %d",res); GST_INFO("idle loop running"); return(TRUE); } /* * bt_song_idle_stop: * @self: a #BtSong * * Stops the idle loop. * * Returns: %TRUE for success */ static gboolean bt_song_idle_stop(const BtSong * const self) { GstStateChangeReturn res; GST_INFO("stopping idle loop"); #ifdef USE_READY_FOR_STOPPED if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_READY))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to null state"); return(FALSE); } #else if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to null state"); return(FALSE); } #endif GST_DEBUG("state change returned %d",res); self->priv->is_idle_active=FALSE; return(TRUE); } //-- constructor methods /** * bt_song_new: * @app: the application object the songs belongs to. * * Create a new instance. * The new song instance automatically has one instance of #BtSetup, #BtSequence * and #BtSongInfo. These instances can be retrieved via the respecting * properties. * * For example use following code to retrive a BtSequence from the song class: * * BtSequence *sequence; * ... * g_object_get(BT_SONG(song), "sequence", &sequence, NULL); * * * Returns: the new instance or %NULL in case of an error */ BtSong *bt_song_new(const BtApplication * const app) { return(BT_SONG(g_object_new(BT_TYPE_SONG,"app",app,NULL))); } //-- methods /** * bt_song_play: * @self: the song that should be played * * Starts to play the specified song instance from beginning. * This methods toggles the #BtSong:is-playing property. * * Returns: %TRUE for success */ gboolean bt_song_play(const BtSong * const self) { GstStateChangeReturn res; g_return_val_if_fail(BT_IS_SONG(self),FALSE); // do not play again if(self->priv->is_playing) return(TRUE); if(self->priv->is_idle) bt_song_idle_stop(self); GST_INFO("prepare playback"); // update play-pos bt_song_update_play_seek_event_and_play_pos(self); #ifdef USE_READY_FOR_STOPPED if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_READY))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to ready state"); } // code from GST_STATE_CHANGE_NULL_TO_READY in on_song_state_changed() // we're prepared to play self->priv->is_preparing=FALSE; // this should be sequence->play_start self->priv->play_pos=0; GST_DEBUG("seek event"); if(!(gst_element_send_event(GST_ELEMENT(self->priv->master_bin),gst_event_ref(self->priv->play_seek_event)))) { GST_WARNING("bin failed to handle seek event"); } #else // prepare playback self->priv->is_preparing=TRUE; #endif // send tags bt_song_send_tags(self); res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PLAYING); GST_DEBUG("->PLAYING state change returned '%s'",gst_element_state_change_return_get_name(res)); switch(res) { case GST_STATE_CHANGE_SUCCESS: break; case GST_STATE_CHANGE_FAILURE: GST_WARNING("can't go to paused state"); bt_song_write_to_lowlevel_dot_file(self); return(FALSE); break; case GST_STATE_CHANGE_ASYNC: GST_INFO("->PLAYING needs async wait"); // start a short timeout that aborts playback if if get not started self->priv->paused_timeout_id=g_timeout_add(BT_SONG_STATE_CHANGE_TIMEOUT, on_song_paused_timeout, (gpointer)self); break; default: GST_WARNING("unexpected state-change-return %d:%s",res,gst_element_state_change_return_get_name(res)); break; } GST_INFO("playback started"); return(TRUE); } /** * bt_song_stop: * @self: the song that should be stopped * * Stops the playback of the specified song instance. * * Returns: %TRUE for success */ gboolean bt_song_stop(const BtSong * const self) { GstStateChangeReturn res; g_return_val_if_fail(BT_IS_SONG(self),FALSE); GST_INFO("stopping playback, is_playing: %d, is_preparing: %d",self->priv->is_playing,self->priv->is_preparing); if(!(self->priv->is_preparing || self->priv->is_playing) && (GST_STATE(self->priv->bin)==GST_STATE_NULL)) { GST_INFO("not playing"); return(TRUE); } if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_READY))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to ready state"); } GST_DEBUG("->READY state change returned '%s'",gst_element_state_change_return_get_name(res)); #ifndef USE_READY_FOR_STOPPED if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to NULL state"); } GST_DEBUG("->NULL state change returned '%s'",gst_element_state_change_return_get_name(res)); #endif // kill a pending timeout if(self->priv->paused_timeout_id) { g_source_remove(self->priv->paused_timeout_id); self->priv->paused_timeout_id=0; } // do not stop if not playing or not preparing if(self->priv->is_preparing) { self->priv->is_preparing=FALSE; goto done; } if(!self->priv->is_playing) goto done; GST_INFO("playback stopped"); self->priv->is_playing=FALSE; done: g_object_notify(G_OBJECT(self),"is-playing"); if(self->priv->is_idle) bt_song_idle_start(self); return(TRUE); } /** * bt_song_pause: * @self: the song that should be paused * * Pauses the playback of the specified song instance. * * Returns: %TRUE for success */ gboolean bt_song_pause(const BtSong * const self) { g_return_val_if_fail(BT_IS_SONG(self),FALSE); return(gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PAUSED)!=GST_STATE_CHANGE_FAILURE); } /** * bt_song_continue: * @self: the song that should be paused * * Continues the playback of the specified song instance. * * Returns: %TRUE for success */ gboolean bt_song_continue(const BtSong * const self) { g_return_val_if_fail(BT_IS_SONG(self),FALSE); return(gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_PLAYING)!=GST_STATE_CHANGE_FAILURE); } /** * bt_song_update_playback_position: * @self: the song that should update its playback-pos counter * * Updates the playback-position counter to fire all #BtSong:play-pos notify * handlers. * * Returns: %FALSE if the song is not playing */ gboolean bt_song_update_playback_position(const BtSong * const self) { g_return_val_if_fail(BT_IS_SONG(self),FALSE); g_assert(GST_IS_BIN(self->priv->master_bin)); g_assert(GST_IS_QUERY(self->priv->position_query)); //GST_INFO("query playback-pos"); if(G_UNLIKELY(!self->priv->is_playing)) return(FALSE); // query playback position and update self->priv->play-pos; if(gst_element_query(GST_ELEMENT(self->priv->master_bin),self->priv->position_query)) { gint64 pos_cur; gst_query_parse_position(self->priv->position_query,NULL,&pos_cur); if(GST_CLOCK_TIME_IS_VALID(pos_cur)) { // calculate new play-pos (in ticks) const GstClockTime bar_time=bt_sequence_get_bar_time(self->priv->sequence); const gulong play_pos=(gulong)(pos_cur/bar_time); if(play_pos!=self->priv->play_pos) { self->priv->play_pos=play_pos; GST_DEBUG("query playback-pos: cur=%"G_GINT64_FORMAT", tick=%lu",pos_cur,self->priv->play_pos); g_object_notify(G_OBJECT(self),"play-pos"); } } else { GST_WARNING("query playback-pos: invalid pos"); } } else { GST_WARNING("query playback-pos: failed"); } // don't return FALSE in the WARNING case above, we use the return value to // return from time-out handlers return(TRUE); } /** * bt_song_write_to_highlevel_dot_file: * @self: the song that should be written * * To aid debugging applications one can use this method to write out the whole * network of gstreamer elements from the songs perspective into an dot file. * The file will be written to '/tmp' and will be named according the 'name' * property of the #BtSongInfo. * This file can be processed with graphviz to get an image. * * dot -Tpng -oimage.png graph_highlevel.dot * */ void bt_song_write_to_highlevel_dot_file(const BtSong * const self) { FILE *out; gchar * const song_name; g_return_if_fail(BT_IS_SONG(self)); g_object_get(self->priv->song_info,"name",&song_name,NULL); gchar * const file_name=g_alloca(strlen(song_name)+10); g_sprintf(file_name,"/tmp/%s_highlevel.dot",song_name); if((out=fopen(file_name,"wb"))) { GList * const list,*node,*sublist,*subnode; BtMachine * const src,* const dst; GstElement *elem; GstElementFactory *factory; gchar * const id,*label; gchar *this_name=NULL,*last_name,*src_name,*dst_name; gulong index,count; // write header fprintf(out, "digraph buzztard {\n" " fontname=\"Arial\";" " node [style=filled, shape=box, labelfontsize=\"8\", fontsize=\"8\", fontname=\"Arial\"];\n" "\n" ); // iterate over machines list g_object_get(self->priv->setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { BtMachine * const machine=BT_MACHINE(node->data); g_object_get(machine,"id",&id,NULL); fprintf(out, " subgraph cluster_%s {\n" " style=filled;\n" " label=\"%s\";\n" " fillcolor=\"%s\";\n" " color=black\n\n" ,id,id,BT_IS_SOURCE_MACHINE(machine)?"#FFAAAA":(BT_IS_SINK_MACHINE(machine)?"#AAAAFF":"#AAFFAA")); // query internal element of each machine sublist=bt_machine_get_element_list(machine); last_name=NULL; for(subnode=sublist;subnode;subnode=g_list_next(subnode)) { elem=GST_ELEMENT(subnode->data); this_name=gst_element_get_name(elem); factory=gst_element_get_factory(elem); label=(gchar *)gst_element_factory_get_longname(factory); fprintf(out," %s [color=black, fillcolor=white, label=\"%s\"];\n",this_name,label); if(last_name) { fprintf(out," %s -> %s\n",last_name,this_name); g_free(last_name); } last_name=this_name; } g_list_free(sublist); g_free(id); if(last_name) g_free(last_name); fprintf(out," }\n\n"); } g_list_free(list); // iterate over wire list g_object_get(self->priv->setup,"wires",&list,NULL); for(node=list;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,"src",&src,"dst",&dst,NULL); // get last_name of src sublist=bt_machine_get_element_list(src); subnode=g_list_last(sublist); elem=GST_ELEMENT(subnode->data); src_name=gst_element_get_name(elem); g_list_free(sublist); // get first_name of dst sublist=bt_machine_get_element_list(dst); subnode=g_list_first(sublist); elem=GST_ELEMENT(subnode->data); dst_name=gst_element_get_name(elem); g_list_free(sublist); // query internal element of each wire sublist=bt_wire_get_element_list(wire); count=g_list_length(sublist); GST_INFO("wire %s->%s has %lu elements",src_name,dst_name,count); index=0; last_name=NULL; for(subnode=sublist;subnode;subnode=g_list_next(subnode)) { // skip first and last if((index>0) && (index<(count-1))) { elem=GST_ELEMENT(subnode->data); this_name=gst_element_get_name(elem); factory=gst_element_get_factory(elem); label=(gchar *)gst_element_factory_get_longname(factory); fprintf(out," %s [color=black, fillcolor=white, label=\"%s\"];\n",this_name,label); } else if(index==0) { this_name=src_name; } else if ((index==(count-1))) { this_name=dst_name; } if(last_name) { fprintf(out," %s -> %s\n",last_name,this_name); } last_name=this_name; index++; } g_list_free(sublist); /* fprintf(out," %s -> %s\n",src_name,dst_name); */ g_object_unref(src); g_object_unref(dst); } g_list_free(list); // write footer fprintf(out,"}\n"); fclose(out); } g_free(song_name); } /** * bt_song_write_to_lowlevel_dot_file: * @self: the song that should be written * * To aid debugging applications one can use this method to write out the whole * network of gstreamer elements that form the song into an dot file. * The file will be written to '/tmp' and will be named according the 'name' * property of the #BtSongInfo. * This file can be processed with graphviz to get an image. * * dot -Tpng -oimage.png graph_lowlevel.dot * */ void bt_song_write_to_lowlevel_dot_file(const BtSong * const self) { #if !GST_CHECK_VERSION(0,10,15) FILE *out; gchar * const song_name; g_return_if_fail(BT_IS_SONG(self)); g_object_get(self->priv->song_info,"name",&song_name,NULL); g_strcanon(song_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); // @todo: check g_getenv("GST_DEBUG_DUMP_DOT_DIR") for the path // and skip if "" gchar * const file_name=g_alloca(strlen(song_name)+10); g_sprintf(file_name,"/tmp/%s_lowlevel.dot",song_name); if((out=fopen(file_name,"wb"))) { GstIterator *element_iter,*pad_iter; gboolean elements_done,pads_done; GstElement *element,*peer_element; GstPad *pad,*peer_pad; GstPadDirection dir; GstCaps *caps; GstStructure *structure; guint src_pads,sink_pads; const gchar *src_media,*dst_media; gchar *pad_name,*element_name,*peer_pad_name,*peer_element_name; // write header fprintf(out, "digraph buzztard {\n" " rankdir=LR;\n" " fontname=\"Arial\";\n" " fontsize=\"9\";\n" " node [style=filled, shape=box, fontsize=\"8\", fontname=\"Arial\"];\n" " edge [labelfontsize=\"7\", fontsize=\"8\", labelfontname=\"Arial\", fontname=\"Arial\"];\n" "\n" ); element_iter=gst_bin_iterate_elements(self->priv->bin); elements_done = FALSE; while (!elements_done) { switch (gst_iterator_next (element_iter, (gpointer)&element)) { case GST_ITERATOR_OK: element_name=g_strcanon(g_strdup(GST_OBJECT_NAME(element)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); fprintf(out, " subgraph cluster_%s {\n" " fontname=\"Arial\";\n" " fontsize=\"9\";\n" " style=filled;\n" " label=\"<%s>\\n%s\";\n" " color=black;\n\n", element_name,G_OBJECT_TYPE_NAME(element),GST_OBJECT_NAME(element)); g_free(element_name); pad_iter=gst_element_iterate_pads(element); pads_done=FALSE; src_pads=sink_pads=0; while (!pads_done) { switch (gst_iterator_next (pad_iter, (gpointer)&pad)) { case GST_ITERATOR_OK: dir=gst_pad_get_direction(pad); pad_name=g_strcanon(g_strdup(GST_OBJECT_NAME(pad)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); element_name=g_strcanon(g_strdup(GST_OBJECT_NAME(element)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); fprintf(out," %s_%s [color=black, fillcolor=\"%s\", label=\"%s\"];\n", element_name,pad_name, ((dir==GST_PAD_SRC)?"#FFAAAA":((dir==GST_PAD_SINK)?"#AAAAFF":"#FFFFFF")), GST_OBJECT_NAME(pad)); if(dir==GST_PAD_SRC) src_pads++; else if(dir==GST_PAD_SINK) sink_pads++; g_free(pad_name); g_free(element_name); gst_object_unref(pad); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (pad_iter); break; case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: pads_done = TRUE; break; } } if(src_pads && !sink_pads) fprintf(out," fillcolor=\"#FFAAAA\";\n"); else if (!src_pads && sink_pads) fprintf(out," fillcolor=\"#AAAAFF\";\n"); else if (src_pads && sink_pads) fprintf(out," fillcolor=\"#AAFFAA\";\n"); else fprintf(out," fillcolor=\"#FFFFFF\";\n"); gst_iterator_free(pad_iter); fprintf(out," }\n\n"); pad_iter=gst_element_iterate_pads(element); pads_done=FALSE; while (!pads_done) { switch (gst_iterator_next (pad_iter, (gpointer)&pad)) { case GST_ITERATOR_OK: if(gst_pad_is_linked(pad) && gst_pad_get_direction(pad)==GST_PAD_SRC) { if((peer_pad=gst_pad_get_peer(pad))) { if((caps=gst_pad_get_negotiated_caps(pad))) { if(GST_CAPS_IS_SIMPLE(caps)) { structure=gst_caps_get_structure(caps,0); src_media=gst_structure_get_name(structure); } else src_media="!"; gst_caps_unref(caps); //src_media=gst_caps_to_string(caps); //needs to be formatted/filtered and freed later } else src_media="?"; if((caps=gst_pad_get_negotiated_caps(peer_pad))) { if(GST_CAPS_IS_SIMPLE(caps)) { structure=gst_caps_get_structure(caps,0); dst_media=gst_structure_get_name(structure); } else dst_media="!"; gst_caps_unref(caps); } else dst_media="?"; peer_element=gst_pad_get_parent_element(peer_pad); pad_name=g_strcanon(g_strdup(GST_OBJECT_NAME(pad)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); element_name=g_strcanon(g_strdup(GST_OBJECT_NAME(element)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); peer_pad_name=g_strcanon(g_strdup(GST_OBJECT_NAME(peer_pad)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); peer_element_name=g_strcanon(g_strdup(GST_OBJECT_NAME(peer_element)), G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-_", '_'); fprintf(out," %s_%s -> %s_%s [taillabel=\"%s\",headlabel=\"%s\"]\n", element_name,pad_name, peer_element_name,peer_pad_name, src_media,dst_media); g_free(pad_name); g_free(element_name); g_free(peer_pad_name); g_free(peer_element_name); gst_object_unref(peer_element); gst_object_unref(peer_pad); } } gst_object_unref(pad); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (pad_iter); break; case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: pads_done = TRUE; break; } } gst_iterator_free(pad_iter); gst_object_unref(element); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (element_iter); break; case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: elements_done = TRUE; break; } } gst_iterator_free(element_iter); // write footer fprintf(out,"}\n"); fclose(out); } g_free(song_name); #else GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(self->priv->bin, GST_DEBUG_GRAPH_SHOW_ALL, /*GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS|GST_DEBUG_GRAPH_SHOW_STATES,*/ PACKAGE_NAME); #endif } //-- child proxy interface #if 0 /* @todo: this only works if I turn the children into GstObject * the reason is that gst_child_proxy_get_child_by_name() is not a virtual method * in the below case we could still map names to objects */ static GstObject *bt_song_child_proxy_get_child_by_index(GstChildProxy * child_proxy, guint index) { const BtSong * const self = BT_SONG(persistence); GstObject *res = NULL; switch(index) { case 0: res=self->priv->song_info; case 1: res=self->priv->sequence; case 2: res=self->priv->setup; case 3: res=self->priv->wavtable; } if(res) g_object_ref (res); return res; } guint bt_song_child_proxy_get_children_count(GstChildProxy * child_proxy) { return 4; } static void bt_song_child_proxy_init(gpointer g_iface, gpointer iface_data) { GstChildProxyInterface *iface = g_iface; iface->get_children_count = bt_song_child_proxy_get_children_count; iface->get_child_by_index = bt_song_child_proxy_get_child_by_index; } #endif //-- io interface static xmlNodePtr bt_song_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtSong * const self = BT_SONG(persistence); xmlNodePtr node=NULL; GST_DEBUG("PERSISTENCE::song"); if((node=xmlNewNode(NULL,XML_CHAR_PTR("buzztard")))) { xmlNewProp(node,XML_CHAR_PTR("xmlns"),(const xmlChar *)"http://www.buzztard.org/"); xmlNewProp(node,XML_CHAR_PTR("xmlns:xsd"),XML_CHAR_PTR("http://www.w3.org/2001/XMLSchema-instance")); xmlNewProp(node,XML_CHAR_PTR("xsd:noNamespaceSchemaLocation"),XML_CHAR_PTR("buzztard.xsd")); bt_persistence_save(BT_PERSISTENCE(self->priv->song_info),node); bt_persistence_save(BT_PERSISTENCE(self->priv->setup),node); bt_persistence_save(BT_PERSISTENCE(self->priv->sequence),node); bt_persistence_save(BT_PERSISTENCE(self->priv->wavetable),node); } return(node); } static BtPersistence *bt_song_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { const BtSong * const self = BT_SONG(persistence); // @todo: this is a bit inconsistent // gtk is getting labels with progressbar, we could use this then //const gchar * const msg=_("Loading file: '%s'"); //gchar * const status=g_alloca(1+strlen(msg)+40); GST_DEBUG("PERSISTENCE::song"); g_assert(node); for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { if(!strncmp((gchar *)node->name,"meta\0",5)) { //g_sprintf(status,msg,"metadata");g_object_set(G_OBJECT(self->priv->song_io),"status",status,NULL); if(!bt_persistence_load(BT_TYPE_SONG_INFO,BT_PERSISTENCE(self->priv->song_info),node,NULL,NULL)) goto Error; } else if(!strncmp((gchar *)node->name,"setup\0",6)) { //g_sprintf(status,msg,"setup");g_object_set(G_OBJECT(self->priv->song_io),"status",status,NULL); if(!bt_persistence_load(BT_TYPE_SETUP,BT_PERSISTENCE(self->priv->setup),node,NULL,NULL)) goto Error; } else if(!strncmp((gchar *)node->name,"sequence\0",9)) { //g_sprintf(status,msg,"sequence");g_object_set(G_OBJECT(self->priv->song_io),"status",status,NULL); if(!bt_persistence_load(BT_TYPE_SEQUENCE,BT_PERSISTENCE(self->priv->sequence),node,NULL,NULL)) goto Error; } else if(!strncmp((gchar *)node->name,"wavetable\0",10)) { //g_sprintf(status,msg,"wavetable");g_object_set(G_OBJECT(self->priv->song_io),"status",status,NULL); if(!bt_persistence_load(BT_TYPE_WAVETABLE,BT_PERSISTENCE(self->priv->wavetable),node,NULL,NULL)) goto Error; } } } return(BT_PERSISTENCE(persistence)); Error: if(node) { /* @todo: set the GError? */ GST_WARNING("failed to load %s",(gchar *)node->name); } return(NULL); } static void bt_song_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_song_persistence_load; iface->save = bt_song_persistence_save; } //-- wrapper //-- g_object overrides static void bt_song_constructed(GObject *object) { BtSong *self=BT_SONG(object); if(G_OBJECT_CLASS(bt_song_parent_class)->constructed) G_OBJECT_CLASS(bt_song_parent_class)->constructed(object); g_return_if_fail(BT_IS_APPLICATION(self->priv->app)); g_object_get((gpointer)(self->priv->app),"bin",&self->priv->bin,NULL); GstBus * const bus=gst_element_get_bus(GST_ELEMENT(self->priv->bin)); if (bus) { GST_DEBUG("listen to bus messages (%p)",bus); gst_bus_add_signal_watch_full(bus, G_PRIORITY_HIGH); g_signal_connect(bus, "message::segment-done", G_CALLBACK(on_song_segment_done), (gpointer)self); g_signal_connect(bus, "message::eos", G_CALLBACK(on_song_eos), (gpointer)self); g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_song_state_changed), (gpointer)self); g_signal_connect(bus, "message::async-done", G_CALLBACK(on_song_async_done), (gpointer)self); g_signal_connect(bus, "message::clock-lost", G_CALLBACK(on_song_clock_lost), (gpointer)self); gst_object_unref(bus); } /* don't change the order */ self->priv->song_info=bt_song_info_new(self); self->priv->setup =bt_setup_new(self); self->priv->sequence =bt_sequence_new(self); self->priv->wavetable=bt_wavetable_new(self); g_signal_connect(self->priv->sequence,"notify::loop",G_CALLBACK(bt_song_on_loop_changed),(gpointer)self); g_signal_connect(self->priv->sequence,"notify::loop-start",G_CALLBACK(bt_song_on_loop_start_changed),(gpointer)self); g_signal_connect(self->priv->sequence,"notify::loop-end",G_CALLBACK(bt_song_on_loop_end_changed),(gpointer)self); g_signal_connect(self->priv->sequence,"notify::length",G_CALLBACK(bt_song_on_length_changed),(gpointer)self); GST_DEBUG(" loop-signals connected"); g_signal_connect(self->priv->song_info,"notify::tpb",G_CALLBACK(bt_song_on_tempo_changed),(gpointer)self); g_signal_connect(self->priv->song_info,"notify::bpm",G_CALLBACK(bt_song_on_tempo_changed),(gpointer)self); GST_DEBUG(" tempo-signals connected"); bt_song_update_play_seek_event_and_play_pos(BT_SONG(self)); GST_INFO(" new song created: %p",self); } /* returns a property for the given property_id for this object */ static void bt_song_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSong * const self = BT_SONG(object); return_if_disposed(); switch (property_id) { case SONG_APP: { g_value_set_object(value, self->priv->app); } break; case SONG_BIN: { g_value_set_object(value, self->priv->bin); } break; case SONG_MASTER: { g_value_set_object(value, self->priv->master); } break; case SONG_SONG_INFO: { g_value_set_object(value, self->priv->song_info); } break; case SONG_SEQUENCE: { g_value_set_object(value, self->priv->sequence); } break; case SONG_SETUP: { g_value_set_object(value, self->priv->setup); } break; case SONG_WAVETABLE: { g_value_set_object(value, self->priv->wavetable); } break; case SONG_PLAY_POS: { g_value_set_ulong(value, self->priv->play_pos); } break; case SONG_PLAY_RATE: { g_value_set_double(value, self->priv->play_rate); } break; case SONG_IS_PLAYING: { g_value_set_boolean(value, self->priv->is_playing); } break; case SONG_IS_IDLE: { g_value_set_boolean(value, self->priv->is_idle); } break; case SONG_IO: { g_value_set_object(value, self->priv->song_io); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_song_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSong * const self = BT_SONG(object); return_if_disposed(); switch (property_id) { case SONG_APP: { self->priv->app = BT_APPLICATION(g_value_get_object(value)); g_object_try_weak_ref(self->priv->app); GST_DEBUG("set the app for the song: %p",self->priv->app); } break; case SONG_MASTER: { g_object_try_weak_unref(self->priv->master); self->priv->master = BT_SINK_MACHINE(g_value_get_object(value)); g_object_try_weak_ref(self->priv->master); g_object_get((gpointer)(self->priv->master),"machine",&self->priv->master_bin,NULL); GST_DEBUG("set the master for the song: %p (machine-ref_ct=%d)",self->priv->master,G_OBJECT_REF_COUNT(self->priv->master)); } break; case SONG_PLAY_POS: { self->priv->play_pos=bt_sequence_limit_play_pos(self->priv->sequence,g_value_get_ulong(value)); GST_DEBUG("set the play-pos for sequence: %lu",self->priv->play_pos); // seek on playpos changes (if playing) bt_song_seek_to_play_pos(self); } break; case SONG_PLAY_RATE: { self->priv->play_rate=g_value_get_double(value); GST_DEBUG("set the play-rate: %lf",self->priv->play_rate); // update rate (if playing) bt_song_change_play_rate(self); } break; case SONG_IS_IDLE: { self->priv->is_idle=g_value_get_boolean(value); if(!self->priv->is_playing) { if(self->priv->is_idle) bt_song_idle_start(self); else bt_song_idle_stop(self); } GST_DEBUG("idle flag song: %d",self->priv->is_idle); } break; case SONG_IO: { if(self->priv->song_io) g_object_unref(self->priv->song_io); self->priv->song_io=BT_SONG_IO(g_value_dup_object(value)); GST_DEBUG("set the song-io plugin for the song: %p",self->priv->song_io); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_song_dispose(GObject * const object) { const BtSong * const self = BT_SONG(object); GstStateChangeReturn res; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); if(self->priv->playback_timeout_id) g_source_remove(self->priv->playback_timeout_id); if(self->priv->paused_timeout_id) g_source_remove(self->priv->paused_timeout_id); if(self->priv->bin) { if(self->priv->is_playing) bt_song_stop(self); else if(self->priv->is_idle) bt_song_idle_stop(self); if((res=gst_element_set_state(GST_ELEMENT(self->priv->bin),GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to null state"); } GST_DEBUG("->NULL state change returned '%s'",gst_element_state_change_return_get_name(res)); GstBus * const bus=gst_element_get_bus(GST_ELEMENT(self->priv->bin)); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_state_changed,(gpointer)self); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_segment_done,(gpointer)self); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_eos,(gpointer)self); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_async_done,(gpointer)self); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_clock_lost,(gpointer)self); gst_bus_remove_signal_watch(bus); gst_object_unref(bus); } if(self->priv->sequence) { g_signal_handlers_disconnect_matched(self->priv->sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_song_on_loop_changed,(gpointer)self); g_signal_handlers_disconnect_matched(self->priv->sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_song_on_loop_start_changed,(gpointer)self); g_signal_handlers_disconnect_matched(self->priv->sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_song_on_loop_end_changed,(gpointer)self); g_signal_handlers_disconnect_matched(self->priv->sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_song_on_length_changed,(gpointer)self); } if(self->priv->song_info) { g_signal_handlers_disconnect_matched(self->priv->song_info,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_song_on_tempo_changed,(gpointer)self); } GST_DEBUG("sink-machine-ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->master)); if(self->priv->master_bin) gst_object_unref(self->priv->master_bin); g_object_try_weak_unref(self->priv->master); if(self->priv->song_info) { GST_DEBUG("song_info->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->song_info)); g_object_unref(self->priv->song_info); } if(self->priv->sequence) { GST_DEBUG("sequence->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->sequence)); g_object_unref(self->priv->sequence); } if(self->priv->setup) { GST_DEBUG("setup->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->setup)); g_object_unref(self->priv->setup); } if(self->priv->wavetable) { GST_DEBUG("wavetable->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->wavetable)); g_object_unref(self->priv->wavetable); } gst_query_unref(self->priv->position_query); if(self->priv->play_seek_event) gst_event_unref(self->priv->play_seek_event); if(self->priv->loop_seek_event) gst_event_unref(self->priv->loop_seek_event); if(self->priv->idle_seek_event) gst_event_unref(self->priv->idle_seek_event); if(self->priv->idle_loop_seek_event) gst_event_unref(self->priv->idle_loop_seek_event); if(self->priv->bin) { GST_DEBUG("bin-ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->bin)); gst_object_unref(self->priv->bin); } g_object_try_weak_unref(self->priv->app); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_song_parent_class)->dispose(object); GST_DEBUG(" done"); } #ifndef GST_DISABLE_GST_DEBUG static void bt_song_finalize(GObject * const object) { const BtSong * const self = BT_SONG(object); GST_DEBUG("!!!! self=%p",self); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_song_parent_class)->finalize(object); GST_DEBUG(" done"); } #endif //-- class internals static void bt_song_init(BtSong *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SONG, BtSongPrivate); self->priv->position_query=gst_query_new_position(GST_FORMAT_TIME); self->priv->play_rate=1.0; self->priv->idle_seek_event=gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, /* this is ~ 3 hours GST_SEEK_TYPE_SET, (GstClockTime)(10000*GST_SECOND), GST_SEEK_TYPE_SET, (GstClockTime)(10005*GST_SECOND) */ GST_SEEK_TYPE_SET, (GstClockTime)(G_MAXINT64-(2*GST_SECOND)), GST_SEEK_TYPE_SET, (GstClockTime)(G_MAXINT64-1) ); self->priv->idle_loop_seek_event=gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, /* GST_SEEK_TYPE_SET, (GstClockTime)(10000*GST_SECOND), GST_SEEK_TYPE_SET, (GstClockTime)(10005*GST_SECOND) */ GST_SEEK_TYPE_SET, (GstClockTime)(G_MAXINT64-(2*GST_SECOND)), GST_SEEK_TYPE_SET, (GstClockTime)(G_MAXINT64-1) ); GST_DEBUG(" done"); } static void bt_song_class_init(BtSongClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSongPrivate)); gobject_class->constructed = bt_song_constructed; gobject_class->set_property = bt_song_set_property; gobject_class->get_property = bt_song_get_property; gobject_class->dispose = bt_song_dispose; #ifndef GST_DISABLE_GST_DEBUG gobject_class->finalize = bt_song_finalize; #endif g_object_class_install_property(gobject_class,SONG_APP, g_param_spec_object("app", "app contruct prop", "set application object, the song belongs to", BT_TYPE_APPLICATION, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_BIN, g_param_spec_object("bin", "bin construct prop", "songs top-level GstElement container", GST_TYPE_BIN, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_MASTER, g_param_spec_object("master", "master prop", "songs audio_sink", BT_TYPE_SINK_MACHINE, /* object type */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_SONG_INFO, g_param_spec_object("song-info", "song-info prop", "songs metadata sub object", BT_TYPE_SONG_INFO, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_SEQUENCE, g_param_spec_object("sequence", "sequence prop", "songs sequence sub object", BT_TYPE_SEQUENCE, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_SETUP, g_param_spec_object("setup", "setup prop", "songs setup sub object", BT_TYPE_SETUP, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_WAVETABLE, g_param_spec_object("wavetable", "wavetable prop", "songs wavetable sub object", BT_TYPE_WAVETABLE, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_PLAY_POS, g_param_spec_ulong("play-pos", "play-pos prop", "position of the play cursor of the sequence in timeline bars", 0, G_MAXLONG, // loop-positions are LONG as well 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_PLAY_RATE, g_param_spec_double("play-rate", "play-rate prop", "playback rate of the sequence", -5.0, 5.0, 1.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IS_PLAYING, g_param_spec_boolean("is-playing", "is-playing prop", "tell whether the song is playing right now or not", FALSE, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IS_IDLE, g_param_spec_boolean("is-idle", "is-idle prop", "request that the song should idle-loop if not playing", FALSE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IO, g_param_spec_object("song-io", "song-io prop", "the song-io plugin during i/o operations", BT_TYPE_SONG_IO, /* object type */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/processor-machine.c0000644042355400116100000002044311634646053016376 00000000000000/* $Id: processor-machine.c 3645 2011-09-16 13:16:25Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btprocessormachine * @short_description: class for signal processing machines with inputs and * outputs * * Processors are machines that alter incomming audio. */ #define BT_CORE #define BT_PROCESSOR_MACHINE_C #include "core_private.h" #include //-- the class static void bt_processor_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtProcessorMachine, bt_processor_machine, BT_TYPE_MACHINE, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_processor_machine_persistence_interface_init)); //-- pad templates static GstStaticPadTemplate machine_src_template = GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate machine_sink_template = GST_STATIC_PAD_TEMPLATE ("sink%d", GST_PAD_SINK, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); //-- constructor methods /** * bt_processor_machine_new: * @song: the song the new instance belongs to * @id: the id, we can use to lookup the machine * @plugin_name: the name of the gst-plugin the machine is using * @voices: the number of voices the machine should initially have * @err: inform about failed instance creation * * Create a new instance. * The machine is automaticly added to the setup of the given song. You don't * need to call #bt_setup_add_machine(setup,BT_MACHINE(machine));. * * Returns: the new instance or %NULL in case of an error */ BtProcessorMachine *bt_processor_machine_new(const BtSong * const song, const gchar * const id, const gchar * const plugin_name, const glong voices, GError **err) { return(BT_PROCESSOR_MACHINE(g_object_new(BT_TYPE_PROCESSOR_MACHINE,"construction-error",err,"song",song,"id",id,"plugin-name",plugin_name,"voices",voices,NULL))); } //-- methods //-- io interface static xmlNodePtr bt_processor_machine_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtProcessorMachine * const self = BT_PROCESSOR_MACHINE(persistence); const BtPersistenceInterface * const parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(persistence)); xmlNodePtr node=NULL; gchar * const plugin_name; gulong voices; GST_DEBUG("PERSISTENCE::processor-machine"); // save parent class stuff if((node=parent_iface->save(persistence,parent_node))) { xmlNewProp(node,XML_CHAR_PTR("type"),XML_CHAR_PTR("processor")); g_object_get((gpointer)self,"plugin-name",&plugin_name,"voices",&voices,NULL); xmlNewProp(node,XML_CHAR_PTR("plugin-name"),XML_CHAR_PTR(plugin_name)); xmlNewProp(node,XML_CHAR_PTR("voices"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(voices))); g_free(plugin_name); } return(node); } static BtPersistence *bt_processor_machine_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtProcessorMachine *self; BtPersistence *result; BtPersistenceInterface *parent_iface; gulong voices; GST_DEBUG("PERSISTENCE::processor_machine"); g_assert(node); xmlChar * const id=xmlGetProp(node,XML_CHAR_PTR("id")); xmlChar * const plugin_name=xmlGetProp(node,XML_CHAR_PTR("plugin-name")); xmlChar * const voices_str=xmlGetProp(node,XML_CHAR_PTR("voices")); voices=voices_str?atol((char *)voices_str):0; if(!persistence) { BtSong *song=NULL; gchar *param_name; va_list va; G_VA_COPY(va,var_args); // we need to get parameters from var_args (need to handle all baseclass params param_name=va_arg(va,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(va, gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(va,gchar*); } // @todo: we also need the parameters the parent-class would parse // as a a quick hack copied the code from the parent class into the subclasses // see : http://www.buzztard.org/index.php/Gobject_serialisation#Dealing_with_inheritance self=bt_processor_machine_new(song,(gchar*)id,(gchar *)plugin_name,voices,err); result=BT_PERSISTENCE(self); va_end (va); } else { self=BT_PROCESSOR_MACHINE(persistence); result=BT_PERSISTENCE(persistence); // @todo: isn't plugin-name construct-only g_object_set(self,"plugin-name",plugin_name,"voices",voices,NULL); } xmlFree(id); xmlFree(plugin_name); xmlFree(voices_str); // load parent class stuff parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(result)); parent_iface->load(BT_TYPE_MACHINE,result,node,NULL,var_args); return(result); } static void bt_processor_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_processor_machine_persistence_load; iface->save = bt_processor_machine_persistence_save; } //-- wrapper //-- bt_machine overrides static gboolean bt_processor_machine_check_type(const BtMachine * const self, const gulong pad_src_ct, const gulong pad_sink_ct) { if(pad_src_ct==0 || pad_sink_ct==0) { GST_ERROR_OBJECT(self,"plugin has %lu src pads instead of >0 and %lu sink pads instead of >0", pad_src_ct,pad_sink_ct); return(FALSE); } return(TRUE); } //-- g_object overrides static void bt_processor_machine_constructed(GObject *object) { BtProcessorMachine * const self=BT_PROCESSOR_MACHINE(object); GError **err; GST_INFO("processor-machine constructed"); G_OBJECT_CLASS(bt_processor_machine_parent_class)->constructed(object); g_object_get(self,"construction-error",&err,NULL); if(err==NULL || *err==NULL) { GstElement * const element; BtSong * const song; BtSetup *setup; BtPattern *pattern; BtMachine *machine=(BtMachine *)self; g_object_get(self,"machine",&element,"song",&song,NULL); if(GST_IS_BASE_TRANSFORM(element)) { gst_base_transform_set_passthrough((GstBaseTransform *)element,FALSE); } gst_object_unref(element); pattern=bt_pattern_new_with_event(song,machine,BT_PATTERN_CMD_BYPASS); g_object_unref(pattern); bt_machine_activate_adder(machine); bt_machine_activate_spreader(machine); bt_machine_enable_output_gain(machine); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been constructed",self,G_OBJECT_REF_COUNT(self)); // add the machine to the setup of the song g_object_get(song,"setup",&setup,NULL); bt_setup_add_machine(setup,machine); g_object_unref(setup); g_object_unref(song); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been added",self,G_OBJECT_REF_COUNT(self)); } } //-- class internals static void bt_processor_machine_init(BtProcessorMachine *self) { //self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_PROCESSOR_MACHINE, BtProcessorMachinePrivate); } static void bt_processor_machine_class_init(BtProcessorMachineClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const gstelement_klass = GST_ELEMENT_CLASS(klass); BtMachineClass * const machine_class = BT_MACHINE_CLASS(klass); gobject_class->constructed = bt_processor_machine_constructed; machine_class->check_type = bt_processor_machine_check_type; gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&machine_src_template)); gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&machine_sink_template)); } buzztard-0.6.0/src/lib/core/song-io-native-bzt.c0000644042355400116100000003310011576360371016404 00000000000000/* $Id: song-io-native-bzt.c 3363 2011-05-12 14:45:16Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsongionativebzt * @short_description: class for song input and output in builtin native format * * This internal #BtSongIONative module implements loading and saving of an own * xml format with externals. * The format is an archive, that contains an XML file and optionally binary * data, such as audio samples. */ #define BT_CORE #define BT_SONG_IO_NATIVE_BZT_C #include "core_private.h" #ifdef USE_GSF //#include #include #include #include #include #include #include #include #include #endif struct _BtSongIONativeBZTPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; #ifdef USE_GSF GsfInput *input; GsfInfile *infile; GsfOutput *output; GsfOutfile *outfile; #endif }; static GQuark error_domain=0; //-- the class G_DEFINE_TYPE (BtSongIONativeBZT, bt_song_io_native_bzt, BT_TYPE_SONG_IO_NATIVE); //-- public methods /** * bt_song_io_native_bzt_copy_to_fd: * @self: the song-plugin * @file_name: the path to the file inside the song * @fd: a file-descriptor of an opened file to copy @file_name to * * Copies the file specified by @file_name from the song file to the @fd. * * This is a helper for #BtSong persistence. * * Returns: %TRUE on success */ gboolean bt_song_io_native_bzt_copy_to_fd(const BtSongIONativeBZT * const self, const gchar *file_name, gint fd) { gboolean res=FALSE; #ifdef USE_GSF GsfInput *data; #if 1 GsfInfile *infile=self->priv->infile,*tmp_infile=NULL; gchar **parts; gint i=0,num; // bahh, we need to get the dir for the file_name // or use gsf_infile_child_by_vname(infile,parts[0],parts[1],...NULL); parts=g_strsplit(file_name,G_DIR_SEPARATOR_S,0); num=gsf_infile_num_children (infile); while(parts[i] && (num>0)) { GST_INFO("%2d : %s",i,parts[i]); if((tmp_infile=GSF_INFILE(gsf_infile_child_by_name(infile,parts[i])))) { num=gsf_infile_num_children (tmp_infile); i++; } else { GST_WARNING("error opening \"%s\"",parts[i]); num=0; } if(infile!=self->priv->infile) g_object_unref(infile); infile=tmp_infile; } g_strfreev(parts); // get file from zip if((data=GSF_INPUT(tmp_infile))) { #else // this won't work : http://bugzilla.gnome.org/show_bug.cgi?id=540521 // there will be new api in libgsf-1.14.9 // opensuse-11.0 has 1.14.8 // gsf_infile_child_by_aname / gsf_infile_child_by_vaname if((data=gsf_infile_child_by_name(self->priv->infile,file_name))) { #endif const guint8 *bytes; size_t len=(size_t)gsf_input_size(data); GST_INFO ("'%s' size: %" G_GSIZE_FORMAT, gsf_input_name(data), len); if((bytes=gsf_input_read(data,len,NULL))) { // write to fd if((write(fd,bytes,len))) { if(lseek(fd,0,SEEK_SET)==0) { res=TRUE; } else { GST_ERROR("error seeking back to 0 \"%s\"",file_name); } } else { GST_ERROR("error writing data \"%s\"",file_name); } } else { GST_WARNING("error reading data \"%s\"",file_name); } g_object_unref(data); } else { GST_WARNING("error opening \"%s\"",file_name); } #endif return(res); } /** * bt_song_io_native_bzt_copy_from_uri: * @self: the song-plugin * @file_name: the path to the file inside the song * @uri: location of the source file * * Copies the file specified by @uri to @file_name into the song file. * * This is a helper for #BtSong persistence. * * Returns: %TRUE on success */ gboolean bt_song_io_native_bzt_copy_from_uri(const BtSongIONativeBZT * const self, const gchar *file_name, const gchar *uri) { gboolean res=FALSE; #ifdef USE_GSF GsfOutput *data; if((data=gsf_outfile_new_child(self->priv->outfile,file_name,FALSE))) { GError *err=NULL; gchar *src_file_name; gchar *bytes; gsize size; gboolean have_data=FALSE; GST_INFO("src uri : %s",uri); // @idea: what about using gio here src_file_name=g_filename_from_uri(uri,NULL,NULL); if(src_file_name) { if(g_file_get_contents(src_file_name,&bytes,&size,&err)) { have_data=TRUE; } else { GST_ERROR("error reading data \"%s\" : %s",file_name,err->message); g_error_free(err); } } else { if(g_str_has_prefix(uri,"fd://")) { struct stat buf={0,}; gint fd; sscanf (uri, "fd://%d", &fd); GST_INFO("read data from file-deskriptor: fd=%d",fd); if(!(fstat(fd, &buf))) { if((bytes=g_try_malloc(buf.st_size))) { if(lseek(fd,0,SEEK_SET) == 0) { size=read(fd,bytes,buf.st_size); if(size!=buf.st_size) { GST_WARNING("did not write all data"); } have_data=TRUE; } else { GST_WARNING("can't seek in filedeskriptor"); } } } } } if(have_data) { GST_INFO("write %d bytes to sample file", size); if(gsf_output_write(data, (size_t)size, (guint8 const *)bytes)) { res=TRUE; } else { GST_ERROR("error writing data \"%s\"",file_name); } g_free(bytes); } g_free(src_file_name); gsf_output_close(data); g_object_unref(data); } #endif return(res); } //-- methods static gboolean bt_song_io_native_bzt_load(gconstpointer const _self, const BtSong * const song) { gboolean result=FALSE; #ifdef USE_GSF const BtSongIONativeBZT * const self=BT_SONG_IO_NATIVE_BZT(_self); gchar * const file_name; guint len; gpointer data; gchar *status; g_object_get((gpointer)self,"file-name",&file_name,"data",&data,"data-len",&len,NULL); GST_INFO("native io bzt will now load song from \"%s\"",file_name?file_name:"data"); const gchar * const msg=_("Loading file '%s'"); if(file_name) { status=g_alloca(1+strlen(msg)+strlen(file_name)); g_sprintf(status,msg,file_name); } else { status=g_alloca(1+strlen(msg)+4); g_sprintf(status,msg,"data"); } g_object_set((gpointer)self,"status",status,NULL); xmlParserCtxtPtr const ctxt=xmlNewParserCtxt(); if(ctxt) { xmlDocPtr song_doc=NULL; GError *err=NULL; if(data && len) { // parse the file from the memory block self->priv->input=gsf_input_memory_new(data,len,FALSE); } else { // open the file from the file_name argument self->priv->input=gsf_input_stdio_new(file_name,&err); } if(self->priv->input) { // create an gsf input file if((self->priv->infile=gsf_infile_zip_new(self->priv->input, &err))) { GsfInput *data; GST_INFO("'%s' size: %" GSF_OFF_T_FORMAT ", files: %d", gsf_input_name (self->priv->input), gsf_input_size (self->priv->input), gsf_infile_num_children (self->priv->infile)); // get file from zip if((data=gsf_infile_child_by_name(self->priv->infile,"song.xml"))) { const guint8 *bytes; size_t len=(size_t)gsf_input_size(data); GST_INFO ("'%s' size: %" G_GSIZE_FORMAT, gsf_input_name(data), len); if((bytes=gsf_input_read(data,len,NULL))) { song_doc=xmlCtxtReadMemory(ctxt,(const char *)bytes,len,"http://www.buzztard.org",NULL,0L); } else { GST_WARNING("'%s': error reading data",(file_name?file_name:"data")); } g_object_unref(data); } } else { GST_ERROR("'%s' is not a zip file: %s",(file_name?file_name:"data"),err->message); g_error_free(err); } } else { if(err) { GST_ERROR("'%s' error: %s",(file_name?file_name:"data"),err->message); g_error_free(err); } else { GST_ERROR("'%s' error",(file_name?file_name:"data")); } } if(song_doc) { if(!ctxt->valid) { GST_WARNING("the supplied document is not a XML/Buzztard document"); } else if(!ctxt->wellFormed) { GST_WARNING("the supplied document is not a wellformed XML document"); } else { xmlNodePtr const root_node=xmlDocGetRootElement(song_doc); if(root_node==NULL) { GST_WARNING("xmlDoc is empty"); } else if(xmlStrcmp(root_node->name,(const xmlChar *)"buzztard")) { GST_WARNING("wrong document type root node in xmlDoc src"); } else { GError *err=NULL; bt_persistence_load(BT_TYPE_SONG,BT_PERSISTENCE(song),root_node,&err,NULL); if(err!=NULL) { g_error_free(err); } else result=TRUE; } } if(song_doc) xmlFreeDoc(song_doc); } else GST_ERROR("failed to read song file '%s'",(file_name?file_name:"data")); if(self->priv->infile) { g_object_unref(self->priv->infile); self->priv->infile=NULL; } if(self->priv->input) { g_object_unref(self->priv->input); self->priv->input=NULL; } } else GST_ERROR("failed to create file-parser context"); if(ctxt) xmlFreeParserCtxt(ctxt); g_free(file_name); g_object_set((gpointer)self,"status",NULL,NULL); #endif return(result); } static gboolean bt_song_io_native_bzt_save(gconstpointer const _self, const BtSong * const song) { gboolean result=FALSE; #ifdef USE_GSF const BtSongIONativeBZT * const self=BT_SONG_IO_NATIVE_BZT(_self); gchar * const file_name; g_object_get((gpointer)self,"file-name",&file_name,NULL); GST_INFO("native io bzt will now save song to \"%s\"",file_name); const gchar * const msg=_("Saving file '%s'"); gchar * const status=g_alloca(1+strlen(msg)+strlen(file_name)); g_sprintf(status,msg,file_name); //gchar * const status=g_alloca(1+strlen(_("Saving file '%s'"))+strlen(file_name)); //g_sprintf(status,_("Saving file '%s'"),file_name); g_object_set((gpointer)self,"status",status,NULL); xmlDocPtr const song_doc=xmlNewDoc(XML_CHAR_PTR("1.0")); if(song_doc) { gboolean cont=TRUE; GError *err=NULL; // open the file from the file_name argument if((self->priv->output=gsf_output_stdio_new (file_name, &err))) { // create an gsf output file if(!(self->priv->outfile=gsf_outfile_zip_new (self->priv->output, &err))) { GST_ERROR("failed to create zip song file \"%s\" : %s",file_name,err->message); g_error_free(err); cont=FALSE; } } else { GST_ERROR("failed to write song file \"%s\" : %s",file_name,err->message); g_error_free(err); cont=FALSE; } if(cont) { xmlNodePtr const root_node=bt_persistence_save(BT_PERSISTENCE(song),NULL); if(root_node) { xmlDocSetRootElement(song_doc,root_node); if(self->priv->output && self->priv->outfile) { GsfOutput *data; // create file in zip if((data=gsf_outfile_new_child(self->priv->outfile,"song.xml",FALSE))) { xmlChar *bytes; gint size; xmlDocDumpMemory(song_doc,&bytes,&size); if(gsf_output_write(data, (size_t)size, (guint8 const *)bytes)) { result=TRUE; GST_INFO("bzt saved okay"); } else GST_ERROR("failed to write song file \"%s\"",file_name); xmlFree(bytes); gsf_output_close(data); g_object_unref(data); } } } } } if(self->priv->output) { gsf_output_close(GSF_OUTPUT(self->priv->outfile)); g_object_unref(self->priv->outfile); self->priv->outfile=NULL; } if(self->priv->output) { gsf_output_close(self->priv->output); g_object_unref(self->priv->output); self->priv->output=NULL; } g_free(file_name); g_object_set((gpointer)self,"status",NULL,NULL); #endif return(result); } //-- wrapper //-- class internals static void bt_song_io_native_bzt_dispose(GObject * const object) { const BtSongIONativeBZT * const self = BT_SONG_IO_NATIVE_BZT(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_song_io_native_bzt_parent_class)->dispose(object); } static void bt_song_io_native_bzt_init(BtSongIONativeBZT *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SONG_IO_NATIVE_BZT, BtSongIONativeBZTPrivate); } static void bt_song_io_native_bzt_class_init(BtSongIONativeBZTClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); BtSongIOClass * const btsongio_class = BT_SONG_IO_CLASS(klass); error_domain=g_type_qname(BT_TYPE_SONG_IO_NATIVE_BZT); g_type_class_add_private(klass,sizeof(BtSongIONativeBZTPrivate)); gobject_class->dispose = bt_song_io_native_bzt_dispose; btsongio_class->load = bt_song_io_native_bzt_load; btsongio_class->save = bt_song_io_native_bzt_save; } buzztard-0.6.0/src/lib/core/machine.c0000644042355400116100000043367711667760126014406 00000000000000/* $Id: machine.c 3756 2011-12-07 21:53:25Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachine * @short_description: base class for signal processing machines * * Machines are pieces in a #BtSong that generate, process or play media. * * The machine class takes care of inserting additional low-level elemnts to do * signal conversion etc.. Further it provides general facillities like * input/output level monitoring. The resulting machine instance is a box * containing several processing elements. * * A machine can have several #GstElements: * * * adder: * mixes all incoming signals * * * input volume: * gain for incoming signals * * * input pre/post-gain level: * level meter for incoming signal * * * machine: * the real machine * * * output volume: * gain for outgoing signal * * * output pre/post-gain level: * level meter for outgoing signal * * * spreader: * distibutes signal to outgoing connections * * * The adder and spreader elements are activated depending on element type. * The volume controls and level meters are activated as requested via the API. * It is recommended to only activate them, when needed. The instances are cached * after deactivation (so that they can be easily reactivated) and destroyed with * the #BtMachine object. * * Furthermore the machine handles a list of #BtPattern instances. These contain * event patterns that form a #BtSequence. */ /* @todo: we need BtParameterGroup object with an implementation for the * global and one for the voice parameters. Then the machine would have a * self->priv->global_params and self->priv->voice_params * bt_machine_init_global_params() * -> bt_parameter_group_new(self->priv->machines[PART_MACHINE],"global",num_params,GParamSpec **properties) * bt_machine_init_voice_params() * -> bt_parameter_group_new(voice_child,"voice 0",num_params,GParamSpec **properties) * * Do we want one ParameterGroup per voice or just one for all voices? * bt_machine_set_voice_param_value() and bt_machine_voice_controller_change_value() are voice specific * * @todo: API cleanup * - need coherent api to create machine parts * - export the enum ? * * @todo: cache the GstControlSource objects? * - we look them up a lot, its a linear search in a list, locking and ref/unref * - one for each param and again each voice * * @todo: we could determine the pad-names for parts and use gst_element_{link,unlink}_pads * - we get a little speedup if the pad-names are known * - passing NULL for a pad-name is ok */ #define BT_CORE #define BT_MACHINE_C #include "core_private.h" #include // do sanity check for pattern lifecycle //#define CHECK_PATTERN_OWNERSHIP 1 //-- signal ids enum { PATTERN_ADDED_EVENT, PATTERN_REMOVED_EVENT, LAST_SIGNAL }; //-- property ids enum { MACHINE_CONSTRUCTION_ERROR=1, MACHINE_PROPERTIES, MACHINE_SONG, MACHINE_ID, MACHINE_PLUGIN_NAME, MACHINE_VOICES, MACHINE_GLOBAL_PARAMS, MACHINE_VOICE_PARAMS, MACHINE_MACHINE, MACHINE_ADDER_CONVERT, MACHINE_INPUT_PRE_LEVEL, MACHINE_INPUT_GAIN, MACHINE_INPUT_POST_LEVEL, MACHINE_OUTPUT_PRE_LEVEL, MACHINE_OUTPUT_GAIN, MACHINE_OUTPUT_POST_LEVEL, MACHINE_PATTERNS, MACHINE_STATE }; // adder, capsfiter, level, volume are gap-aware typedef enum { /* utillity elements to allow multiple inputs */ PART_ADDER=0, /* helper to enforce common format for adder inputs */ PART_CAPS_FILTER, /* helper to make adder link to next element */ PART_ADDER_CONVERT, /* the elements to control and analyse the current input signal */ PART_INPUT_PRE_LEVEL, PART_INPUT_GAIN, PART_INPUT_POST_LEVEL, /* the gstreamer element that produces/processes the signal */ PART_MACHINE, /* the elements to control and analyse the current output signal */ PART_OUTPUT_PRE_LEVEL, PART_OUTPUT_GAIN, PART_OUTPUT_POST_LEVEL, /* utillity elements to allow multiple outputs */ PART_SPREADER, /* how many elements are used */ PART_COUNT } BtMachinePart; struct _BtMachinePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* used to signal failed instance creation */ GError **constrution_error; /* (ui) properties accociated with this machine */ GHashTable *properties; /* the song the machine belongs to */ G_POINTER_ALIAS(BtSong *,song); /* status in songs pipeline */ gboolean is_added,is_connected; /* the id, we can use to lookup the machine */ gchar *id; /* the name of the gst-plugin the machine is using */ gchar *plugin_name; /* the number of voices the machine provides */ gulong voices; /* the number of dynamic params the machine provides per instance */ gulong global_params; /* the number of dynamic params the machine provides per instance and voice */ gulong voice_params; /* the current state of the machine */ BtMachineState state; /* dynamic parameter control */ GstController *global_controller; GstController **voice_controllers; GstInterpolationControlSource **global_control_sources; GstInterpolationControlSource **voice_control_sources; GParamSpec **global_props,**voice_props; guint *global_flags,*voice_flags; GValue *global_no_val,*voice_no_val; GQuark *global_quarks,*voice_quarks; /* event patterns */ GList *patterns; // each entry points to BtPattern guint private_patterns; /* the gstreamer elements that are used */ GstElement *machines[PART_COUNT]; GstPad *src_pads[PART_COUNT],*sink_pads[PART_COUNT]; /* caps filter format */ gint format; /* 0=int/1=float */ gint channels; gint width; gint depth; /* realtime control (bt-ic) */ GHashTable *control_data; // each entry points to BtMachineData /* src/sink ghost-pad counters for the machine */ gint src_pad_counter, sink_pad_counter; }; typedef struct { const BtIcControl *control; GstObject *object; GParamSpec *pspec; gulong handler_id; } BtControlData; static GQuark error_domain=0; static guint signals[LAST_SIGNAL]={0,}; static gchar *src_pn[]={ "src", /* adder */ "src", /* caps filter */ "src", /* audioconvert */ "src", /* input pre level */ "src", /* input gain */ "src", /* input post level */ "src", /* machine */ "src", /* output pre level */ "src", /* output gain */ "src", /* output post level */ NULL /* tee */ }; static gchar *sink_pn[]={ NULL, /* adder */ "sink", /* caps filter */ "sink", /* audioconvert */ "sink", /* input pre level */ "sink", /* input gain */ "sink", /* input post level */ "sink", /* machine */ "sink", /* output pre level */ "sink", /* output gain */ "sink", /* output post level */ "sink" /* tee */ }; //-- the class static void bt_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_ABSTRACT_TYPE_WITH_CODE (BtMachine, bt_machine, GST_TYPE_BIN, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_machine_persistence_interface_init)); //-- macros #define GLOBAL_PARAM_NAME(ix) self->priv->global_props[ix]->name #define GLOBAL_PARAM_TYPE(ix) self->priv->global_props[ix]->value_type #define VOICE_PARAM_NAME(ix) self->priv->voice_props[ix]->name #define VOICE_PARAM_TYPE(ix) self->priv->voice_props[ix]->value_type //-- enums GType bt_machine_state_get_type(void) { static GType type = 0; if(G_UNLIKELY(type == 0)) { static const GEnumValue values[] = { { BT_MACHINE_STATE_NORMAL,"BT_MACHINE_STATE_NORMAL","normal" }, { BT_MACHINE_STATE_MUTE, "BT_MACHINE_STATE_MUTE", "mute" }, { BT_MACHINE_STATE_SOLO, "BT_MACHINE_STATE_SOLO", "solo" }, { BT_MACHINE_STATE_BYPASS,"BT_MACHINE_STATE_BYPASS","bypass" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtMachineState", values); } return type; } //-- signal handler void bt_machine_on_bpm_changed(BtSongInfo * const song_info, const GParamSpec * const arg, gconstpointer const user_data) { const BtMachine * const self=BT_MACHINE(user_data); gulong bpm; g_object_get(song_info,"bpm",&bpm,NULL); gstbt_tempo_change_tempo(GSTBT_TEMPO(self->priv->machines[PART_MACHINE]),(glong)bpm,-1,-1); } void bt_machine_on_tpb_changed(BtSongInfo * const song_info, const GParamSpec * const arg, gconstpointer const user_data) { const BtMachine * const self=BT_MACHINE(user_data); gulong tpb; g_object_get(song_info,"tpb",&tpb,NULL); gstbt_tempo_change_tempo(GSTBT_TEMPO(self->priv->machines[PART_MACHINE]),-1,(glong)tpb,-1); } //-- helper methods /* * mute the machine output */ static gboolean bt_machine_set_mute(const BtMachine * const self,const BtSetup * const setup) { const BtMachinePart part=BT_IS_SINK_MACHINE(self)?PART_INPUT_GAIN:PART_OUTPUT_GAIN; //if(self->priv->state==BT_MACHINE_STATE_MUTE) return(TRUE); if(self->priv->machines[part]) { g_object_set(self->priv->machines[part],"mute",TRUE,NULL); return(TRUE); } GST_WARNING_OBJECT(self,"can't mute element '%s'",self->priv->id); return(FALSE); } /* * unmute the machine output */ static gboolean bt_machine_unset_mute(const BtMachine *const self, const BtSetup * const setup) { const BtMachinePart part=BT_IS_SINK_MACHINE(self)?PART_INPUT_GAIN:PART_OUTPUT_GAIN; //if(self->priv->state!=BT_MACHINE_STATE_MUTE) return(TRUE); if(self->priv->machines[part]) { g_object_set(self->priv->machines[part],"mute",FALSE,NULL); return(TRUE); } GST_WARNING_OBJECT(self,"can't unmute element '%s'",self->priv->id); return(FALSE); } /* * bt_machine_change_state: * * Reset old state and go to new state. Do sanity checking of allowed states for * given machine. * * Returns: %TRUE for success */ static gboolean bt_machine_change_state(const BtMachine * const self, const BtMachineState new_state) { gboolean res=TRUE; BtSetup *setup; // reject a few nonsense changes if((new_state==BT_MACHINE_STATE_BYPASS) && (!BT_IS_PROCESSOR_MACHINE(self))) return(FALSE); if((new_state==BT_MACHINE_STATE_SOLO) && (BT_IS_SINK_MACHINE(self))) return(FALSE); if(self->priv->state==new_state) return(TRUE); g_object_get(self->priv->song,"setup",&setup,NULL); GST_INFO("state change for element '%s'",self->priv->id); // return to normal state switch(self->priv->state) { case BT_MACHINE_STATE_MUTE: { // source, processor, sink if(!bt_machine_unset_mute(self,setup)) res=FALSE; } break; case BT_MACHINE_STATE_SOLO: { // source GList *node,*machines=bt_setup_get_machines_by_type(setup,BT_TYPE_SOURCE_MACHINE); BtMachine *machine; // set all but this machine to playing again for(node=machines;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); if(machine!=self) { if(!bt_machine_unset_mute(machine,setup)) res=FALSE; } g_object_unref(machine); } GST_INFO("unmuted %d elements with result = %d",g_list_length(machines),res); g_list_free(machines); } break; case BT_MACHINE_STATE_BYPASS: { // processor const GstElement * const element=self->priv->machines[PART_MACHINE]; if(GST_IS_BASE_TRANSFORM(element)) { gst_base_transform_set_passthrough(GST_BASE_TRANSFORM(element),FALSE); } else { // @todo: disconnect its source and sink + set this machine to playing GST_INFO("element does not support passthrough"); } } break; case BT_MACHINE_STATE_NORMAL: //g_return_val_if_reached(FALSE); break; default: GST_WARNING_OBJECT(self,"invalid old machine state: %d",self->priv->state); break; } // set to new state switch(new_state) { case BT_MACHINE_STATE_MUTE: { // source, processor, sink if(!bt_machine_set_mute(self,setup)) res=FALSE; } break; case BT_MACHINE_STATE_SOLO: { // source GList *node,*machines=bt_setup_get_machines_by_type(setup,BT_TYPE_SOURCE_MACHINE); BtMachine *machine; // set all but this machine to paused for(node=machines;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); if(machine!=self) { // if a different machine is solo, set it to normal and unmute the current source if(machine->priv->state==BT_MACHINE_STATE_SOLO) { machine->priv->state=BT_MACHINE_STATE_NORMAL; g_object_notify(G_OBJECT(machine),"state"); if(!bt_machine_unset_mute(self,setup)) res=FALSE; } if(!bt_machine_set_mute(machine,setup)) res=FALSE; } g_object_unref(machine); } GST_INFO("muted %d elements with result = %d",g_list_length(machines),res); g_list_free(machines); } break; case BT_MACHINE_STATE_BYPASS: { // processor const GstElement *element=self->priv->machines[PART_MACHINE]; if(GST_IS_BASE_TRANSFORM(element)) { gst_base_transform_set_passthrough(GST_BASE_TRANSFORM(element),TRUE); } else { // @todo set this machine to paused + connect its source and sink GST_INFO("element does not support passthrough"); } } break; case BT_MACHINE_STATE_NORMAL: //g_return_val_if_reached(FALSE); break; default: GST_WARNING_OBJECT(self,"invalid new machine state: %d",new_state); break; } self->priv->state=new_state; g_object_unref(setup); return(res); } /* * bt_machine_link_elements: * @self: the machine in which we link * @src,@sink: the pads * * Link two pads. * * Returns: %TRUE for sucess */ static gboolean bt_machine_link_elements(const BtMachine * const self, GstPad *src, GstPad *sink) { GstPadLinkReturn plr; if((plr=gst_pad_link(src,sink))!=GST_PAD_LINK_OK) { GST_WARNING_OBJECT(self,"can't link %s:%s with %s:%s: %d",GST_DEBUG_PAD_NAME(src),GST_DEBUG_PAD_NAME(sink),plr); return(FALSE); } return(TRUE); } /* * bt_machine_insert_element: * @self: the machine for which the element should be inserted * @peer: the peer pad element * @pos: the element at this position should be inserted (activated) * * Searches surrounding elements of the new element for active peers * and connects them. The new elemnt needs to be created before calling this method. * * Returns: %TRUE for sucess */ static gboolean bt_machine_insert_element(BtMachine *const self, GstPad * const peer, const BtMachinePart pos) { gboolean res=FALSE; gint i,pre,post; BtWire *wire; GstElement ** const machines=self->priv->machines; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; // look for elements before and after pos pre=post=-1; for(i=pos-1;i>-1;i--) { if(machines[i]) { pre=i;break; } } for(i=pos+1;idst_wires?(BtWire*)(self->dst_wires->data):NULL))) { if(!(res=bt_wire_reconnect(wire))) { GST_WARNING_OBJECT(self,"failed to reconnect wire after linking '%s' before '%s'",GST_OBJECT_NAME(machines[pos]),GST_OBJECT_NAME(machines[post])); } } } else { GST_WARNING_OBJECT(self,"failed to link part '%s' before '%s' again",GST_OBJECT_NAME(machines[pos]),GST_OBJECT_NAME(machines[post])); } } } else if(post==-1) { // unlink old connection gst_pad_unlink(src_pads[pre],peer); // link new connection res=bt_machine_link_elements(self,src_pads[pre],sink_pads[pos]); res&=bt_machine_link_elements(self,src_pads[pos],peer); if(!res) { gst_pad_unlink(src_pads[pre],sink_pads[pos]); gst_pad_unlink(src_pads[pos],peer); GST_WARNING_OBJECT(self,"failed to link part '%s' after '%s'",GST_OBJECT_NAME(machines[pos]),GST_OBJECT_NAME(machines[pre])); // try to re-wire if((res=bt_machine_link_elements(self,src_pads[pre],sink_pads[pos]))) { if((wire=(self->src_wires?(BtWire*)(self->src_wires->data):NULL))) { if(!(res=bt_wire_reconnect(wire))) { GST_WARNING_OBJECT(self,"failed to reconnect wire after linking '%s' after '%s'",GST_OBJECT_NAME(machines[pos]),GST_OBJECT_NAME(machines[pre])); } } } else { GST_WARNING_OBJECT(self,"failed to link part '%s' after '%s' again",GST_OBJECT_NAME(machines[pos]),GST_OBJECT_NAME(machines[pre])); } } } else { GST_ERROR_OBJECT(self,"failed to link part '%s' in broken machine",GST_OBJECT_NAME(machines[pos])); } return(res); } /* * bt_machine_resize_voices: * @self: the machine which has changed its number of voices * * Adjust the private data structure after a change in the number of voices. */ static void bt_machine_resize_voices(const BtMachine * const self, const gulong old_voices) { const gulong new_voices=self->priv->voices; const gulong voice_params=self->priv->voice_params; GST_INFO("changing machine %s:%p voices from %ld to %ld",self->priv->id,self->priv->machines[PART_MACHINE],old_voices,new_voices); // @todo GSTBT_IS_CHILD_BIN <-> GST_IS_CHILD_PROXY (sink-bin is a CHILD_PROXY but not a CHILD_BIN) if((!self->priv->machines[PART_MACHINE]) || (!GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE]))) { GST_WARNING_OBJECT(self,"machine %s:%p is NULL or not polyphonic!",self->priv->id,self->priv->machines[PART_MACHINE]); return; } g_object_set(self->priv->machines[PART_MACHINE],"children",new_voices,NULL); if(old_voices>new_voices) { gulong j; // release params for old voices for(j=new_voices;jpriv->voice_controllers[j]); } } self->priv->voice_controllers=(GstController **)g_renew(gpointer,self->priv->voice_controllers,new_voices); self->priv->voice_control_sources=(GstInterpolationControlSource **)g_renew(gpointer,self->priv->voice_control_sources,new_voices*voice_params); if(old_voicespriv->voice_controllers[j]=NULL; } for(j=old_voices*voice_params;jpriv->voice_control_sources[j]=NULL; } } } /* * bt_machine_get_property_meta_value: * @value: the value that will hold the result * @property: the paramspec object to get the meta data from * @key: the meta data key * * Fetches the meta data from the given paramspec object and sets the value. * The values needs to be initialized to the correct type. * * Returns: %TRUE if it could get the value */ static gboolean bt_machine_get_property_meta_value(GValue * const value, GParamSpec * const property, const GQuark key) { gboolean res=FALSE; gconstpointer const has_meta=g_param_spec_get_qdata(property,gstbt_property_meta_quark); if(has_meta) { gconstpointer const qdata=g_param_spec_get_qdata(property,key); // it can be that qdata is NULL if the value is NULL //if(!qdata) { // GST_WARNING_OBJECT(self,"no property metadata for '%s'",property->name); // return(FALSE); //} res=TRUE; g_value_init(value,property->value_type); switch(bt_g_type_get_base_type(property->value_type)) { case G_TYPE_BOOLEAN: // @todo: this does not work, for no_value it results in // g_value_set_boolean(value,255); // which is the same as TRUE g_value_set_boolean(value,GPOINTER_TO_INT(qdata)); break; case G_TYPE_INT: g_value_set_int(value,GPOINTER_TO_INT(qdata)); break; case G_TYPE_UINT: g_value_set_uint(value,GPOINTER_TO_UINT(qdata)); break; case G_TYPE_ENUM: g_value_set_enum(value,GPOINTER_TO_INT(qdata)); break; case G_TYPE_STRING: /* what is in qdata for this type? for buzz this is a note, so its an int if(qdata) { g_value_set_string(value,qdata); } else { g_value_set_static_string(value,""); } */ g_value_set_static_string(value,""); break; default: if(qdata) { GST_WARNING("unsupported GType for param %s",property->name); //GST_WARNING("unsupported GType=%d:'%s'",property->value_type,G_VALUE_TYPE_NAME(property->value_type)); res=FALSE; } } } return(res); } /* * bt_machine_make_internal_element: * @self: the machine * @part: which internal element to create * @factory_name: the element-factories name * @element_name: the name of the new #GstElement instance * * This helper is used by the family of bt_machine_enable_xxx() functions. */ static gboolean bt_machine_make_internal_element(const BtMachine * const self,const BtMachinePart part,const gchar * const factory_name,const gchar * const element_name) { gboolean res=FALSE; GstElement *m; const gchar * const parent_name=GST_OBJECT_NAME(self); gchar * const name=g_alloca(strlen(parent_name)+2+strlen(element_name)); gpointer item; g_return_val_if_fail((self->priv->machines[part]==NULL),TRUE); // create internal element //strcat(name,parent_name);strcat(name,":");strcat(name,element_name); g_sprintf(name,"%s:%s",parent_name,element_name); if(!(self->priv->machines[part]=m=gst_element_factory_make(factory_name,name))) { GST_WARNING_OBJECT(self,"failed to create %s from factory %s",element_name,factory_name);goto Error; } // disable deep notify { GObjectClass *gobject_class=G_OBJECT_GET_CLASS(m); GObjectClass *parent_class=g_type_class_peek_static(G_TYPE_OBJECT); gobject_class->dispatch_properties_changed=parent_class->dispatch_properties_changed; } // get the pads if(src_pn[part]) { if(!(self->priv->src_pads[part]=gst_element_get_static_pad(m,src_pn[part]))) { GstIterator *it=gst_element_iterate_src_pads(m); gboolean done=FALSE; while (!done) { switch (gst_iterator_next (it, &item)) { case GST_ITERATOR_RESYNC: gst_iterator_resync(it); break; case GST_ITERATOR_OK: self->priv->src_pads[part]=GST_PAD(item); /* fall through */ case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: done=TRUE; break; } } gst_iterator_free(it); if(!self->priv->src_pads[part]) { GST_WARNING_OBJECT(m,"element has no src pads"); } } } if(sink_pn[part]) { if(!(self->priv->sink_pads[part]=gst_element_get_static_pad(m,sink_pn[part]))) { GstIterator *it=gst_element_iterate_sink_pads(m); gboolean done=FALSE; while (!done) { switch (gst_iterator_next (it, &item)) { case GST_ITERATOR_RESYNC: gst_iterator_resync(it); break; case GST_ITERATOR_OK: self->priv->sink_pads[part]=GST_PAD(item); /* fall through */ case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: done=TRUE; break; } } gst_iterator_free(it); if(!self->priv->sink_pads[part]) { GST_WARNING_OBJECT(m,"element has no sink pads"); } } } gst_bin_add(GST_BIN(self),self->priv->machines[part]); res=TRUE; Error: return(res); } /* * bt_machine_add_input_element: * @self: the machine * @part: which internal element to link * * This helper is used by the family of bt_machine_enable_input_xxx() functions. */ static gboolean bt_machine_add_input_element(BtMachine * const self,const BtMachinePart part) { gboolean res=FALSE; GstElement ** const machines=self->priv->machines; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; GstPad *peer; guint i, tix=PART_MACHINE; // get next element on the source side for(i=part+1;i<=PART_MACHINE;i++) { if(machines[i]) { tix=i; GST_DEBUG("src side target at %d: %s:%s",i,GST_DEBUG_PAD_NAME(sink_pads[tix])); break; } } // is the machine connected towards the input side (its sink)? if(!(peer=gst_pad_get_peer(sink_pads[tix]))) { GST_DEBUG("target '%s:%s' is not yet connected on the input side",GST_DEBUG_PAD_NAME(sink_pads[tix])); if(!bt_machine_link_elements(self,src_pads[part],sink_pads[tix])) { GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(self),GST_DEBUG_GRAPH_SHOW_ALL, PACKAGE_NAME "-machine"); GST_ERROR_OBJECT(self,"failed to link the element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE]));goto Error; } GST_INFO("sucessfully prepended element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE])); } else { GST_DEBUG("target '%s:%s' has peer pad '%s:%s', need to insert",GST_DEBUG_PAD_NAME(sink_pads[tix]),GST_DEBUG_PAD_NAME(peer)); if(!bt_machine_insert_element(self,peer,part)) { gst_object_unref(peer); GST_ERROR_OBJECT(self,"failed to link the element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE]));goto Error; } gst_object_unref(peer); GST_INFO("sucessfully inserted element'%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE])); } res=TRUE; Error: return(res); } /* * bt_machine_add_output_element: * @self: the machine * @part: which internal element to link * * This helper is used by the family of bt_machine_enable_output_xxx() functions. */ static gboolean bt_machine_add_output_element(BtMachine * const self,const BtMachinePart part) { gboolean res=FALSE; GstElement ** const machines=self->priv->machines; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; GstPad *peer; guint i, tix=PART_MACHINE; // get next element on the sink side for(i=part-1;i>=PART_MACHINE;i--) { if(machines[i]) { tix=i; GST_DEBUG_OBJECT(self,"sink side target at %d: %s:%s",i,GST_DEBUG_PAD_NAME(src_pads[tix])); break; } } // is the machine unconnected towards the output side (its source)? if(!(peer=gst_pad_get_peer(src_pads[tix]))) { GST_DEBUG("target '%s:%s' is not yet connected on the output side",GST_DEBUG_PAD_NAME(src_pads[tix])); if(!bt_machine_link_elements(self,src_pads[tix],sink_pads[part])) { GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(GST_BIN(self),GST_DEBUG_GRAPH_SHOW_ALL, PACKAGE_NAME "-machine"); GST_ERROR_OBJECT(self,"failed to link the element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE]));goto Error; } GST_INFO("sucessfully appended element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE])); } else { GST_DEBUG("target '%s:%s' has peer pad '%s:%s', need to insert",GST_DEBUG_PAD_NAME(src_pads[tix]),GST_DEBUG_PAD_NAME(peer)); if(!bt_machine_insert_element(self,peer,part)) { gst_object_unref(peer); GST_ERROR_OBJECT(self,"failed to link the element '%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE]));goto Error; } gst_object_unref(peer); GST_INFO("sucessfully inserted element'%s' for '%s'",GST_OBJECT_NAME(machines[part]),GST_OBJECT_NAME(machines[PART_MACHINE])); } res=TRUE; Error: return(res); } /* bt_machine_enable_part: * @part: which internal element to create * @factory_name: the element-factories name * @element_name: the name of the new #GstElement instance * * can replace _enable_{in,out}put_{level,gain} * this is not good enough for adder, ev. okay for spreader */ static gboolean bt_machine_enable_part(BtMachine * const self,const BtMachinePart part,const gchar * const factory_name,const gchar * const element_name) { gboolean res=FALSE; if(self->priv->machines[part]) return(TRUE); if(!bt_machine_make_internal_element(self,part,factory_name,element_name)) goto Error; // configure part switch(part) { case PART_INPUT_PRE_LEVEL: case PART_INPUT_POST_LEVEL: case PART_OUTPUT_PRE_LEVEL: case PART_OUTPUT_POST_LEVEL: g_object_set(self->priv->machines[part], "interval",(GstClockTime)(0.1*GST_SECOND),"message",TRUE, "peak-ttl",(GstClockTime)(0.2*GST_SECOND),"peak-falloff", 50.0, NULL); break; default: break; } if(partpriv->plugin_name,self->priv->id)) goto Error; GST_INFO(" instantiated machine %p, \"%s\", machine->ref_ct=%d",self->priv->machines[PART_MACHINE],self->priv->plugin_name,G_OBJECT_REF_COUNT(self->priv->machines[PART_MACHINE])); res=TRUE; Error: return(res); } static void bt_machine_init_interfaces(const BtMachine * const self) { /* initialize buzz-host-callbacks (structure with callbacks) * buzzmachines can then call c function of the host * would be good to set this as early as possible */ if(g_object_class_find_property(G_OBJECT_CLASS(BT_MACHINE_GET_CLASS(self->priv->machines[PART_MACHINE])),"host-callbacks")) { extern void *bt_buzz_callbacks_get(BtSong *song); g_object_set(self->priv->machines[PART_MACHINE],"host-callbacks",bt_buzz_callbacks_get(self->priv->song),NULL); GST_INFO(" host-callbacks iface initialized"); } // initialize child-proxy iface properties if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { if(!self->priv->voices) { GST_WARNING_OBJECT(self,"voices==0"); //g_object_get(self->priv->machines[PART_MACHINE],"children",&self->priv->voices,NULL); } else { g_object_set(self->priv->machines[PART_MACHINE],"children",self->priv->voices,NULL); } GST_INFO(" child proxy iface initialized"); } // initialize tempo iface properties if(GSTBT_IS_TEMPO(self->priv->machines[PART_MACHINE])) { BtSongInfo *song_info; gulong bpm,tpb; g_object_get((gpointer)(self->priv->song),"song-info",&song_info,NULL); // @todo handle stpb later (subtick per beat) g_object_get(song_info,"bpm",&bpm,"tpb",&tpb,NULL); gstbt_tempo_change_tempo(GSTBT_TEMPO(self->priv->machines[PART_MACHINE]),(glong)bpm,(glong)tpb,-1); g_signal_connect(song_info,"notify::bpm",G_CALLBACK(bt_machine_on_bpm_changed),(gpointer)self); g_signal_connect(song_info,"notify::tpb",G_CALLBACK(bt_machine_on_tpb_changed),(gpointer)self); g_object_unref(song_info); GST_INFO(" tempo iface initialized"); } GST_INFO("machine element instantiated and interfaces initialized"); } /* * bt_machine_check_type: * * Sanity check if the machine is of the right type. It counts the source, * sink pads and check with the machine class-type. * * Returns: %TRUE if type and pads match */ static gboolean bt_machine_check_type(const BtMachine * const self) { BtMachineClass *klass=BT_MACHINE_GET_CLASS(self); GstIterator *it; GstPad *pad; gulong pad_src_ct=0,pad_sink_ct=0; gboolean done; if(!klass->check_type) { GST_WARNING_OBJECT(self,"no BtMachine::check_type() implemented"); return(TRUE); } // get pad counts per type it=gst_element_iterate_pads(self->priv->machines[PART_MACHINE]); done = FALSE; while (!done) { switch (gst_iterator_next (it, (gpointer)&pad)) { case GST_ITERATOR_OK: switch(gst_pad_get_direction(pad)) { case GST_PAD_SRC: pad_src_ct++;break; case GST_PAD_SINK: pad_sink_ct++;break; default: GST_INFO("unhandled pad type discovered"); break; } gst_object_unref(pad); break; case GST_ITERATOR_RESYNC: gst_iterator_resync (it); break; case GST_ITERATOR_ERROR: case GST_ITERATOR_DONE: done = TRUE; break; } } gst_iterator_free(it); // test pad counts and element type if(!((klass->check_type)(self,pad_src_ct,pad_sink_ct))) { return(FALSE); } return(TRUE); } static void bt_machine_init_global_params(const BtMachine * const self) { GParamSpec **properties; guint number_of_properties; if((properties=g_object_class_list_properties(G_OBJECT_CLASS(GST_ELEMENT_GET_CLASS(self->priv->machines[PART_MACHINE])),&number_of_properties))) { GParamSpec *property; GParamSpec **child_properties=NULL; //GstController *ctrl; guint number_of_child_properties=0; guint i,j; gboolean skip; // check if the elemnt implements the GstBtChildBin interface (implies GstChildProxy) if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { GstObject *voice_child; //g_assert(gst_child_proxy_get_children_count(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]))); // get child for voice 0 if((voice_child=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]),0))) { child_properties=g_object_class_list_properties(G_OBJECT_CLASS(GST_OBJECT_GET_CLASS(voice_child)),&number_of_child_properties); g_object_unref(voice_child); } } // count number of controlable params for(i=0;iflags&GST_PARAM_CONTROLLABLE) { // check if this param is also registered as child param, if so skip skip=FALSE; if(child_properties) { for(j=0;jname,child_properties[j]->name)) { GST_DEBUG(" skipping global_param [%d] \"%s\"",i,properties[i]->name); skip=TRUE; properties[i]=NULL; break; } } } if(!skip) self->priv->global_params++; } } GST_INFO("found %lu global params",self->priv->global_params); self->priv->global_props =(GParamSpec ** )g_new0(gpointer,self->priv->global_params); self->priv->global_flags =(guint * )g_new0(guint ,self->priv->global_params); self->priv->global_no_val=(GValue * )g_new0(GValue ,self->priv->global_params); self->priv->global_quarks=(GQuark * )g_new0(GQuark ,self->priv->global_params); self->priv->global_control_sources=(GstInterpolationControlSource **)g_new0(gpointer,self->priv->global_params); for(i=j=0;iflags&GST_PARAM_CONTROLLABLE) { gchar *qname=g_strdup_printf("BtMachine::%s",property->name); GST_DEBUG(" adding global_param [%u/%lu] \"%s\"",j,self->priv->global_params,property->name); // add global param self->priv->global_props[j]=property; self->priv->global_quarks[j]=g_quark_from_string(qname); g_free(qname); // treat readable params as normal ones, others as triggers if(property->flags&G_PARAM_READABLE) { self->priv->global_flags[j]=GSTBT_PROPERTY_META_STATE; } if(GSTBT_IS_PROPERTY_META(self->priv->machines[PART_MACHINE])) { gconstpointer const has_meta=g_param_spec_get_qdata(property,gstbt_property_meta_quark); if(has_meta) { self->priv->global_flags[j]=GPOINTER_TO_INT(g_param_spec_get_qdata(property,gstbt_property_meta_quark_flags)); if(!(bt_machine_get_property_meta_value(&self->priv->global_no_val[j],property,gstbt_property_meta_quark_no_val))) { GST_WARNING_OBJECT(self," can't get no-val property-meta for global_param [%u/%lu] \"%s\"",j,self->priv->global_params,property->name); } } } // use the properties default value for triggers as a no_value if(!BT_IS_GVALUE(&self->priv->global_no_val[j]) && !(property->flags&G_PARAM_READABLE)) { g_value_init(&self->priv->global_no_val[j], property->value_type); g_param_value_set_default(property, &self->priv->global_no_val[j]); } // bind param to machines global controller (possibly returns ref to existing) GST_DEBUG(" added global_param [%u/%lu] \"%s\"",j,self->priv->global_params,property->name); j++; } } g_free(properties); g_free(child_properties); } } static void bt_machine_init_voice_params(const BtMachine * const self) { GParamSpec **properties; guint number_of_properties; // check if the elemnt implements the GstChildProxy interface if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { GstObject *voice_child; // register voice params // get child for voice 0 if((voice_child=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]),0))) { if((properties=g_object_class_list_properties(G_OBJECT_CLASS(GST_OBJECT_GET_CLASS(voice_child)),&number_of_properties))) { GParamSpec *property; guint i,j; // count number of controlable params for(i=0;iflags&GST_PARAM_CONTROLLABLE) self->priv->voice_params++; } GST_INFO("found %lu voice params",self->priv->voice_params); self->priv->voice_props =(GParamSpec ** )g_new0(gpointer,self->priv->voice_params); self->priv->voice_flags =(guint * )g_new0(guint ,self->priv->voice_params); self->priv->voice_no_val=(GValue * )g_new0(GValue ,self->priv->voice_params); self->priv->voice_quarks=(GQuark * )g_new0(GQuark ,self->priv->voice_params); for(i=j=0;iflags&GST_PARAM_CONTROLLABLE) { gchar *qname=g_strdup_printf("BtMachine::%s",property->name); GST_DEBUG(" adding voice_param %p, [%u/%lu] \"%s\"",property, j,self->priv->voice_params,property->name); // add voice param self->priv->voice_props[j]=property; self->priv->voice_quarks[j]=g_quark_from_string(qname); g_free(qname); // treat readable params as normal ones, others as triggers if(property->flags&G_PARAM_READABLE) { self->priv->voice_flags[j]=GSTBT_PROPERTY_META_STATE; } if(GSTBT_IS_PROPERTY_META(voice_child)) { gconstpointer const has_meta=g_param_spec_get_qdata(property,gstbt_property_meta_quark); if(has_meta) { self->priv->voice_flags[j]=GPOINTER_TO_INT(g_param_spec_get_qdata(property,gstbt_property_meta_quark_flags)); if(!(bt_machine_get_property_meta_value(&self->priv->voice_no_val[j],property,gstbt_property_meta_quark_no_val))) { GST_WARNING_OBJECT(self," can't get no-val property-meta for voice_param [%u/%lu] \"%s\"",j,self->priv->voice_params,property->name); } } } // use the properties default value for triggers as a no_value if(!BT_IS_GVALUE(&self->priv->voice_no_val[j]) && !(property->flags&G_PARAM_READABLE)) { g_value_init(&self->priv->voice_no_val[j], property->value_type); g_param_value_set_default(property, &self->priv->voice_no_val[j]); } GST_DEBUG(" added voice_param [%u/%lu] \"%s\"",j,self->priv->voice_params,property->name); j++; } } } g_free(properties); // bind params to machines voice controller bt_machine_resize_voices(self,0); g_object_unref(voice_child); } else { GST_WARNING_OBJECT(self," can't get first voice child!"); } } else { GST_INFO(" instance is monophonic!"); self->priv->voices=0; } } //-- methods /** * bt_machine_enable_input_pre_level: * @self: the machine to enable the pre-gain input-level analyser in * * Creates the pre-gain input-level analyser of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_input_pre_level(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SOURCE_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_INPUT_PRE_LEVEL,"level","input_pre_level")); } /** * bt_machine_enable_input_post_level: * @self: the machine to enable the post-gain input-level analyser in * * Creates the post-gain input-level analyser of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_input_post_level(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SOURCE_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_INPUT_POST_LEVEL,"level","input_post_level")); } /** * bt_machine_enable_output_pre_level: * @self: the machine to enable the pre-gain output-level analyser in * * Creates the pre-gain output-level analyser of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_output_pre_level(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SINK_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_OUTPUT_PRE_LEVEL,"level","output_pre_level")); } /** * bt_machine_enable_output_post_level: * @self: the machine to enable the post-gain output-level analyser in * * Creates the post-gain output-level analyser of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_output_post_level(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SINK_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_OUTPUT_POST_LEVEL,"level","output_post_level")); } /** * bt_machine_enable_input_gain: * @self: the machine to enable the input-gain element in * * Creates the input-gain element of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_input_gain(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SOURCE_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_INPUT_GAIN,"volume","input_gain")); } /** * bt_machine_enable_output_gain: * @self: the machine to enable the output-gain element in * * Creates the output-gain element of the machine and activates it. * * Returns: %TRUE for success, %FALSE otherwise */ gboolean bt_machine_enable_output_gain(BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SINK_MACHINE(self),FALSE); return(bt_machine_enable_part(self,PART_OUTPUT_GAIN,"volume","output_gain")); } /** * bt_machine_activate_adder: * @self: the machine to activate the adder in * * Machines use an adder to allow multiple incoming wires. * This method is used by the #BtWire class to activate the adder when needed. * * Returns: %TRUE for success */ gboolean bt_machine_activate_adder(BtMachine * const self) { gboolean res=FALSE; g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SOURCE_MACHINE(self),FALSE); GstElement ** const machines=self->priv->machines; if(!machines[PART_ADDER]) { gboolean skip_convert=FALSE; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; guint i, tix=PART_MACHINE; // get first element on the source side for(i=PART_INPUT_PRE_LEVEL;i<=PART_MACHINE;i++) { if(machines[i]) { tix=i; GST_DEBUG_OBJECT(self,"src side target at %d: %s:%s",i,GST_DEBUG_PAD_NAME(sink_pads[tix])); break; } } // create the adder if(!(bt_machine_make_internal_element(self,PART_ADDER,"adder","adder"))) goto Error; /* live adder mixes by timestamps and does a timeout if an input is late */ //if(!(bt_machine_make_internal_element(self,PART_ADDER,"liveadder","adder"))) goto Error; // try without capsfilter (>= 0.10.24) if(!g_object_class_find_property(G_OBJECT_CLASS(BT_MACHINE_GET_CLASS(machines[PART_ADDER])),"caps")) { if(!(bt_machine_make_internal_element(self,PART_CAPS_FILTER,"capsfilter","capsfilter"))) goto Error; g_object_set(machines[PART_CAPS_FILTER],"caps",bt_default_caps,NULL); } else { g_object_set(machines[PART_ADDER],"caps",bt_default_caps,NULL); } if(!BT_IS_SINK_MACHINE(self)) { // try without converters in effects #if GST_CHECK_VERSION(0,10,25) skip_convert=gst_caps_can_intersect(bt_default_caps, gst_pad_get_pad_template_caps(sink_pads[PART_MACHINE])); #else GstCaps *c=gst_caps_intersect(bt_default_caps, gst_pad_get_pad_template_caps(sink_pads[PART_MACHINE])); skip_convert=!(c && gst_caps_is_empty(c)); gst_caps_unref(c); #endif } if(skip_convert) { GST_DEBUG_OBJECT(self," about to link adder -> dst_elem"); if(!machines[PART_CAPS_FILTER]) { if(!bt_machine_link_elements(self,src_pads[PART_ADDER], sink_pads[tix])) { GST_ERROR_OBJECT(self,"failed to link the internal adder of machine"); goto Error; } } else { res=bt_machine_link_elements(self,src_pads[PART_ADDER], sink_pads[PART_CAPS_FILTER]); res&=bt_machine_link_elements(self,src_pads[PART_CAPS_FILTER], sink_pads[tix]); if(!res) { gst_pad_unlink(src_pads[PART_ADDER], sink_pads[PART_CAPS_FILTER]); gst_pad_unlink(src_pads[PART_CAPS_FILTER], sink_pads[tix]); GST_ERROR_OBJECT(self,"failed to link the internal adder of machine"); goto Error; } } } else { GST_WARNING_OBJECT(self,"adding converter"); if(!(bt_machine_make_internal_element(self,PART_ADDER_CONVERT,"audioconvert","audioconvert"))) goto Error; if(!BT_IS_SINK_MACHINE(self)) { // only do this for the final mix, if at all g_object_set(machines[PART_ADDER_CONVERT],"dithering",0,"noise-shaping",0,NULL); } GST_DEBUG_OBJECT(self," about to link adder -> convert -> dst_elem"); if(!machines[PART_CAPS_FILTER]) { res=bt_machine_link_elements(self,src_pads[PART_ADDER], sink_pads[PART_ADDER_CONVERT]); res&=bt_machine_link_elements(self,src_pads[PART_ADDER_CONVERT], sink_pads[tix]); if(!res) { gst_pad_unlink(src_pads[PART_ADDER], sink_pads[PART_ADDER_CONVERT]); gst_pad_unlink(src_pads[PART_ADDER_CONVERT], sink_pads[tix]); GST_ERROR_OBJECT(self,"failed to link the internal adder of machine"); goto Error; } } else { res=bt_machine_link_elements(self,src_pads[PART_ADDER], sink_pads[PART_CAPS_FILTER]); res&=bt_machine_link_elements(self,src_pads[PART_CAPS_FILTER], sink_pads[PART_ADDER_CONVERT]); res&=bt_machine_link_elements(self,src_pads[PART_ADDER_CONVERT], sink_pads[tix]); if(!res) { gst_pad_unlink(src_pads[PART_ADDER], sink_pads[PART_CAPS_FILTER]); gst_pad_unlink(src_pads[PART_CAPS_FILTER], sink_pads[PART_ADDER_CONVERT]); gst_pad_unlink(src_pads[PART_ADDER_CONVERT], sink_pads[tix]); GST_ERROR_OBJECT(self,"failed to link the internal adder of machine"); goto Error; } } } GST_DEBUG_OBJECT(self," adder activated"); } res=TRUE; Error: bt_machine_dbg_print_parts(self); bt_song_write_to_lowlevel_dot_file(self->priv->song); return(res); } /** * bt_machine_has_active_adder: * @self: the machine to check * * Checks if the machine currently uses an adder. * This method is used by the #BtWire class to activate the adder when needed. * * Returns: %TRUE for success */ gboolean bt_machine_has_active_adder(const BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); return(self->priv->machines[PART_ADDER]!=NULL); } /** * bt_machine_activate_spreader: * @self: the machine to activate the spreader in * * Machines use a spreader to allow multiple outgoing wires. * This method is used by the #BtWire class to activate the spreader when needed. * * Returns: %TRUE for success */ gboolean bt_machine_activate_spreader(BtMachine * const self) { gboolean res=FALSE; g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(!BT_IS_SINK_MACHINE(self),FALSE); GstElement ** const machines=self->priv->machines; if(!machines[PART_SPREADER]) { GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; guint i, tix=PART_MACHINE; // get next element on the sink side for(i=PART_OUTPUT_POST_LEVEL;i>=PART_MACHINE;i--) { if(machines[i]) { tix=i; GST_DEBUG_OBJECT(self,"sink side target at %d: %s:%s",i,GST_DEBUG_PAD_NAME(src_pads[tix])); break; } } // create the spreader (tee) if(!(bt_machine_make_internal_element(self,PART_SPREADER,"tee","tee"))) goto Error; if(!bt_machine_link_elements(self,src_pads[tix], sink_pads[PART_SPREADER])) { GST_ERROR_OBJECT(self,"failed to link the internal spreader of machine"); goto Error; } GST_DEBUG_OBJECT(self," spreader activated"); } res=TRUE; Error: bt_machine_dbg_print_parts(self); bt_song_write_to_lowlevel_dot_file(self->priv->song); return(res); } /** * bt_machine_has_active_spreader: * @self: the machine to check * * Checks if the machine currently uses an spreader. * This method is used by the #BtWire class to activate the spreader when needed. * * Returns: %TRUE for success */ gboolean bt_machine_has_active_spreader(const BtMachine * const self) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); return(self->priv->machines[PART_SPREADER]!=NULL); } // pattern handling // DEBUG #ifdef CHECK_PATTERN_OWNERSHIP static void check_pattern_ownership (gpointer data, GObject *obj) { BtMachine *self=BT_MACHINE(data); GST_DEBUG("destroyed pattern: %p",obj); if(g_list_find(self->priv->patterns,obj)) { GST_WARNING_OBJECT(self, "pattern %p destroyed, but still in machines pattern list", obj); //g_assert_not_reached(); } } #endif // DEBUG /** * bt_machine_add_pattern: * @self: the machine to add the pattern to * @pattern: the new pattern instance * * Add the supplied pattern to the machine. This is automatically done by * bt_pattern_new(). */ void bt_machine_add_pattern(const BtMachine * const self, const BtPattern * const pattern) { g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(BT_IS_PATTERN(pattern)); if(!g_list_find(self->priv->patterns,pattern)) { gboolean is_internal; self->priv->patterns=g_list_append(self->priv->patterns,g_object_ref((gpointer)pattern)); // DEBUG #ifdef CHECK_PATTERN_OWNERSHIP g_object_weak_ref((GObject *)pattern,check_pattern_ownership,(gpointer)self); #endif // DEBUG // check if its a internal pattern and if it is update count of those g_object_get((gpointer)pattern,"is-internal",&is_internal,NULL); if(is_internal) { self->priv->private_patterns++; GST_DEBUG("adding internal pattern %p,ref_ct=%d, nr=%u",pattern,G_OBJECT_REF_COUNT(pattern),self->priv->private_patterns); } else { GST_DEBUG("adding pattern %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); g_signal_emit((gpointer)self,signals[PATTERN_ADDED_EVENT], 0, pattern); } } else { GST_WARNING_OBJECT(self,"trying to add pattern again"); } } /** * bt_machine_remove_pattern: * @self: the machine to remove the pattern from * @pattern: the existing pattern instance * * Remove the given pattern from the machine. */ void bt_machine_remove_pattern(const BtMachine * const self, const BtPattern * const pattern) { GList *node; g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(BT_IS_PATTERN(pattern)); if((node=g_list_find(self->priv->patterns,pattern))) { // DEBUG #ifdef CHECK_PATTERN_OWNERSHIP g_object_weak_unref((GObject *)pattern,check_pattern_ownership,(gpointer)self); #endif // DEBUG self->priv->patterns=g_list_delete_link(self->priv->patterns,node); GST_DEBUG("removing pattern: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); g_signal_emit((gpointer)self,signals[PATTERN_REMOVED_EVENT], 0, pattern); GST_DEBUG("removed pattern: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); g_object_unref((gpointer)pattern); } else { GST_WARNING_OBJECT(self,"trying to remove pattern that is not in machine"); } } /** * bt_machine_get_pattern_by_id: * @self: the machine to search for the pattern * @id: the identifier of the pattern * * Search the machine for a pattern by the supplied id. * The pattern must have been added previously to this setup with #bt_machine_add_pattern(). * Unref the pattern, when done with it. * * Returns: #BtPattern instance or %NULL if not found */ BtPattern *bt_machine_get_pattern_by_id(const BtMachine * const self,const gchar * const id) { gboolean found=FALSE; BtPattern *pattern; gchar *pattern_id; GList* node; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(BT_IS_STRING(id),NULL); //GST_DEBUG("pattern-list.length=%d",g_list_length(self->priv->patterns)); for(node=self->priv->patterns;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); g_object_get(pattern,"id",&pattern_id,NULL); if(!strcmp(pattern_id,id)) found=TRUE; g_free(pattern_id); if(found) return(g_object_ref(pattern)); } GST_DEBUG("no pattern found for id \"%s\"",id); return(NULL); } /** * bt_machine_get_pattern_by_name: * @self: the machine to search for the pattern * @name: the name of the pattern * * Search the machine for a pattern by the supplied name. * The pattern must have been added previously to this setup with #bt_machine_add_pattern(). * Unref the pattern, when done with it. * * Returns: #BtPattern instance or %NULL if not found */ BtPattern *bt_machine_get_pattern_by_name(const BtMachine * const self,const gchar * const name) { gboolean found=FALSE; BtPattern *pattern; gchar *pattern_name; GList* node; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(BT_IS_STRING(name),NULL); //GST_DEBUG("pattern-list.length=%d",g_list_length(self->priv->patterns)); for(node=self->priv->patterns;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); g_object_get(pattern,"name",&pattern_name,NULL); if(!strcmp(pattern_name,name)) found=TRUE; g_free(pattern_name); if(found) return(g_object_ref(pattern)); } GST_DEBUG("no pattern found for name \"%s\"",name); return(NULL); } /** * bt_machine_get_pattern_by_index: * @self: the machine to search for the pattern * @index: the index of the pattern in the machines pattern list * * Fetches the pattern from the given position of the machines pattern list. * The pattern must have been added previously to this setup with #bt_machine_add_pattern(). * Unref the pattern, when done with it. * * Returns: #BtPattern instance or %NULL if not found */ BtPattern *bt_machine_get_pattern_by_index(const BtMachine * const self, const gulong index) { BtPattern *pattern; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); if((pattern=g_list_nth_data(self->priv->patterns,(guint)index))) { pattern=g_object_ref(pattern); } return(pattern); } /** * bt_machine_get_unique_pattern_name: * @self: the machine for which the name should be unique * * The function generates a unique pattern name for this machine by eventually * adding a number postfix. This method should be used when adding new patterns. * * Returns: the newly allocated unique name */ gchar *bt_machine_get_unique_pattern_name(const BtMachine * const self) { BtPattern *pattern=NULL; gchar *id,*ptr; guint8 i=0; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); id=g_strdup_printf("%s 00",self->priv->id); ptr=&id[strlen(self->priv->id)+1]; do { (void)g_sprintf(ptr,"%02u",i++); g_object_try_unref(pattern); } while((pattern=bt_machine_get_pattern_by_id(self,id)) && (i<100)); g_object_try_unref(pattern); g_free(id); i--; return(g_strdup_printf("%02u",i)); } /** * bt_machine_has_patterns: * @self: the machine for which to check the patterns * * Check if the machine has #BtPattern entries appart from the standart private * ones. * * Returns: %TRUE if it has patterns */ gboolean bt_machine_has_patterns(const BtMachine * const self) { return(g_list_length(self->priv->patterns)>self->priv->private_patterns); } // global and voice param handling /** * bt_machine_is_polyphonic: * @self: the machine to check * * Tells if the machine can produce (multiple) voices. Monophonic machines have * their (one) voice params as part of the global params. * * Returns: %TRUE for polyphic machines, %FALSE for monophonic ones */ gboolean bt_machine_is_polyphonic(const BtMachine * const self) { gboolean res; g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); res=GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE]); GST_INFO(" is machine \"%s\" polyphonic ? %d",self->priv->id,res); return(res); } /** * bt_machine_is_global_param_trigger: * @self: the machine to check params from * @index: the offset in the list of global params * * Tests if the global param is a trigger param * (like a key-note or a drum trigger). * * Returns: %TRUE if it is a trigger */ gboolean bt_machine_is_global_param_trigger(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->global_params,FALSE); if(!(self->priv->global_flags[index]&GSTBT_PROPERTY_META_STATE)) return(TRUE); return(FALSE); } /** * bt_machine_is_voice_param_trigger: * @self: the machine to check params from * @index: the offset in the list of voice params * * Tests if the voice param is a trigger param * (like a key-note or a drum trigger). * * Returns: %TRUE if it is a trigger */ gboolean bt_machine_is_voice_param_trigger(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->voice_params,FALSE); if(!(self->priv->voice_flags[index]&GSTBT_PROPERTY_META_STATE)) return(TRUE); return(FALSE); } /** * bt_machine_is_global_param_no_value: * @self: the machine to check params from * @index: the offset in the list of global params * @value: the value to compare against the no-value * * Tests if the given value is the no-value of the global param * * Returns: %TRUE if it is the no-value */ gboolean bt_machine_is_global_param_no_value(const BtMachine * const self, const gulong index, GValue * const value) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->global_params,FALSE); g_return_val_if_fail(G_IS_VALUE(value),FALSE); if(!BT_IS_GVALUE(&self->priv->global_no_val[index])) return(FALSE); if(gst_value_compare(&self->priv->global_no_val[index],value)==GST_VALUE_EQUAL) return(TRUE); return(FALSE); } /** * bt_machine_is_voice_param_no_value: * @self: the machine to check params from * @index: the offset in the list of voice params * @value: the value to compare against the no-value * * Tests if the given value is the no-value of the voice param * * Returns: %TRUE if it is the no-value */ gboolean bt_machine_is_voice_param_no_value(const BtMachine * const self, const gulong index, GValue * const value) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->voice_params,FALSE); g_return_val_if_fail(G_IS_VALUE(value),FALSE); if(!BT_IS_GVALUE(&self->priv->voice_no_val[index])) return(FALSE); /* GST_WARNING("%s <-> %s",g_strdup_value_contents(&self->priv->voice_no_val[index]),g_strdup_value_contents(value)); with bml-Jeskola-Noise we end up with: ((GstBtTriggerSwitch) EMPTY) <-> ((GstBtTriggerSwitch) 2) where '2' is invalid */ if(gst_value_compare(&self->priv->voice_no_val[index],value)==GST_VALUE_EQUAL) { return(TRUE); } return(FALSE); } /** * bt_machine_get_global_param_no_value: * @self: the machine to get params from * @index: the offset in the list of global params * * Get the neutral value for the machines parameter. * * Returns: the value. Don't modify. * * Since: 0.6 */ GValue *bt_machine_get_global_param_no_value(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->global_params,FALSE); return(&self->priv->global_no_val[index]); } /** * bt_machine_get_voice_param_no_value: * @self: the machine to get params from * @index: the offset in the list of voice params * * Get the neutral value for the machines parameter. * * Returns: the value. Don't modify. * * Since: 0.6 */ GValue *bt_machine_get_voice_param_no_value(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),FALSE); g_return_val_if_fail(indexpriv->voice_params,FALSE); return(&self->priv->voice_no_val[index]); } /** * bt_machine_get_global_wave_param_index: * @self: the machine to lookup the param from * * Searches for the wave-table index parameter (if any). This parameter should * refer to a wavetable index that should be used to play a note. * * Returns: the index of the wave-table parameter or -1 if none. */ glong bt_machine_get_global_wave_param_index(const BtMachine * const self) { const gulong global_params=self->priv->global_params; guint *global_flags=self->priv->global_flags; glong i; g_return_val_if_fail(BT_IS_MACHINE(self),-1); for(i=0;ipriv->voice_params; guint *voice_flags=self->priv->voice_flags; glong i; g_return_val_if_fail(BT_IS_MACHINE(self),-1); for(i=0;ipriv->machines[PART_MACHINE]); return GPOINTER_TO_INT(g_object_get_qdata(param_parent,self->priv->global_quarks[index])); } /* * bt_machine_has_voice_param_default_set: * @self: the machine to check params from * @voice: the voice number * @index: the offset in the list of global params * * Tests if the voice param uses the default at timestamp=0. Parameters have a * default if there is no control-point at that timestamp. When interactively * changing the parameter, the default needs to be updated by calling * bt_machine_voice_controller_change_value(). * * Returns: %TRUE if it has a default there */ static gboolean bt_machine_has_voice_param_default_set(const BtMachine * const self, const gulong voice, const gulong index) { GObject *param_parent=(GObject*)(gst_child_proxy_get_child_by_index((GstChildProxy*)(self->priv->machines[PART_MACHINE]),voice)); gboolean result=GPOINTER_TO_INT(g_object_get_qdata(param_parent,self->priv->voice_quarks[index])); g_object_unref(param_parent); return(result); } /** * bt_machine_set_global_param_default: * @self: the machine * @index: the offset in the list of global params * * Set a default value that should be used before the first control-point. */ void bt_machine_set_global_param_default(const BtMachine * const self,const gulong index) { g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(indexpriv->global_params); if(bt_machine_has_global_param_default_set(self,index)) { GST_WARNING_OBJECT(self,"updating global param %d at ts=0",index); bt_machine_global_controller_change_value(self,index,G_GUINT64_CONSTANT(0),NULL); } } /** * bt_machine_set_voice_param_default: * @self: the machine * @voice: the voice number * @index: the offset in the list of global params * * Set a default value that should be used before the first control-point. */ void bt_machine_set_voice_param_default(const BtMachine * const self,const gulong voice, const gulong index) { g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(indexpriv->voice_params); if(bt_machine_has_voice_param_default_set(self,voice,index)) { GST_WARNING_OBJECT(self,"updating voice %ld param %d at ts=0",voice,index); bt_machine_voice_controller_change_value(self,voice,index,G_GUINT64_CONSTANT(0),NULL); } } /** * bt_machine_set_param_defaults: * @self: the machine * * Sets default values that should be used before the first control-point. * Should be called, if all parameters are changed (like after switching * presets). */ void bt_machine_set_param_defaults(const BtMachine *const self) { const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; GstElement *machine=self->priv->machines[PART_MACHINE]; GstObject *voice; gulong i,j; if(gst_object_get_controller(G_OBJECT(machine))) { for(i=0;ipriv->global_params; glong ret=-1,i; gboolean found=FALSE; g_return_val_if_fail(BT_IS_MACHINE(self),-1); g_return_val_if_fail(BT_IS_STRING(name),-1); g_return_val_if_fail(error == NULL || *error == NULL, -1); for(i=0;i=0)) || ((ret==-1) && ((error && *error) || !error)))); return(ret); } /** * bt_machine_get_voice_param_index: * @self: the machine to search for the voice param * @name: the name of the voice param * @error: the location of an error instance to fill with a message, if an error occures * * Searches the list of registered param of a machine for a voice param of * the given name and returns the index if found. * * Returns: the index or sets error if it is not found and returns -1. */ glong bt_machine_get_voice_param_index(const BtMachine * const self, const gchar * const name, GError **error) { const gulong voice_params=self->priv->voice_params; glong ret=-1,i; gboolean found=FALSE; g_return_val_if_fail(BT_IS_MACHINE(self),-1); g_return_val_if_fail(BT_IS_STRING(name),-1); g_return_val_if_fail(error == NULL || *error == NULL, -1); for(i=0;i=0)) || ((ret==-1) && ((error && *error) || !error)))); return(ret); } /** * bt_machine_get_global_param_spec: * @self: the machine to search for the global param * @index: the offset in the list of global params * * Retrieves the parameter specification for the global param * * Returns: the #GParamSpec for the requested global param */ GParamSpec *bt_machine_get_global_param_spec(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->global_params,NULL); return(self->priv->global_props[index]); } /** * bt_machine_get_voice_param_spec: * @self: the machine to search for the voice param * @index: the offset in the list of voice params * * Retrieves the parameter specification for the voice param * * Returns: the #GParamSpec for the requested voice param */ GParamSpec *bt_machine_get_voice_param_spec(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->voice_params,NULL); return(self->priv->voice_props[index]); #if 0 GstObject *voice_child; GParamSpec *pspec=NULL; GST_INFO(" voice-param %d '%s'",index,VOICE_PARAM_NAME(index)); if((voice_child=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]),0))) { pspec=g_object_class_find_property( G_OBJECT_CLASS(GST_OBJECT_GET_CLASS(voice_child)), VOICE_PARAM_NAME(index)); g_object_unref(voice_child); } return(pspec); #endif } /** * bt_machine_set_global_param_value: * @self: the machine to set the global param value * @index: the offset in the list of global params * @event: the new value * * Sets a the specified global param to the give data value. */ void bt_machine_set_global_param_value(const BtMachine * const self, const gulong index, GValue * const event) { g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(G_IS_VALUE(event)); g_return_if_fail(indexpriv->global_params); GST_DEBUG("set value for %s.%s",self->priv->id,GLOBAL_PARAM_NAME(index)); g_object_set_property(G_OBJECT(self->priv->machines[PART_MACHINE]),GLOBAL_PARAM_NAME(index),event); } /** * bt_machine_set_voice_param_value: * @self: the machine to set the voice param value * @voice: the voice to change * @index: the offset in the list of voice params * @event: the new value * * Sets a the specified voice param to the give data value. */ void bt_machine_set_voice_param_value(const BtMachine * const self, const gulong voice, const gulong index, GValue * const event) { GstObject *voice_child; g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(G_IS_VALUE(event)); g_return_if_fail(voicepriv->voices); g_return_if_fail(indexpriv->voice_params); if((voice_child=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]),voice))) { g_object_set_property(G_OBJECT(voice_child),VOICE_PARAM_NAME(index),event); g_object_unref(voice_child); } } /** * bt_machine_get_global_param_name: * @self: the machine to get the param name from * @index: the offset in the list of global params * * Gets the global param name. Do not modify returned content. * * Returns: the requested name */ const gchar *bt_machine_get_global_param_name(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->global_params,NULL); return(GLOBAL_PARAM_NAME(index)); } /** * bt_machine_get_voice_param_name: * @self: the machine to get the param name from * @index: the offset in the list of voice params * * Gets the voice param name. Do not modify returned content. * * Returns: the requested name */ const gchar *bt_machine_get_voice_param_name(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->voice_params,NULL); return(VOICE_PARAM_NAME(index)); } #define _DETAILS(t,T,p) \ case G_TYPE_ ## T: { \ const GParamSpec ## p *p=G_PARAM_SPEC_ ## T(property); \ if(min_val) g_value_set_ ## t(*min_val,p->minimum); \ if(max_val) g_value_set_ ## t(*max_val,p->maximum); \ } break; static void bt_machine_get_param_details(const BtMachine * const self, GParamSpec *property, GValue **min_val, GValue **max_val) { gboolean done=FALSE; if(min_val || max_val) { GType base_type=bt_g_type_get_base_type(property->value_type); if(min_val) *min_val=g_new0(GValue,1); if(max_val) *max_val=g_new0(GValue,1); if(GSTBT_IS_PROPERTY_META(self->priv->machines[PART_MACHINE])) { if(min_val) done=bt_machine_get_property_meta_value(*min_val,property,gstbt_property_meta_quark_min_val); if(max_val) { if(!bt_machine_get_property_meta_value(*max_val,property,gstbt_property_meta_quark_max_val)) { // if this failed max val has not been set if(done) g_value_unset(*min_val); done=FALSE; } } } if(!done) { if(min_val) g_value_init(*min_val,property->value_type); if(max_val) g_value_init(*max_val,property->value_type); switch(base_type) { _DETAILS(int,INT,Int) _DETAILS(uint,UINT,UInt) _DETAILS(int64,INT64,Int64) _DETAILS(uint64,UINT64,UInt64) _DETAILS(long,LONG,Long) _DETAILS(ulong,ULONG,ULong) _DETAILS(float,FLOAT,Float) _DETAILS(double,DOUBLE,Double) case G_TYPE_BOOLEAN: if(min_val) g_value_set_boolean(*min_val,0); if(max_val) g_value_set_boolean(*max_val,0); break; case G_TYPE_ENUM: { const GParamSpecEnum *enum_property=G_PARAM_SPEC_ENUM(property); const GEnumClass *enum_class=enum_property->enum_class; if(min_val) g_value_set_enum(*min_val,enum_class->minimum); if(max_val) g_value_set_enum(*max_val,enum_class->maximum); } break; case G_TYPE_STRING: // nothing to do for this break; default: GST_ERROR_OBJECT(self,"unsupported GType=%lu:'%s' ('%s')",(gulong)property->value_type,g_type_name(property->value_type),g_type_name(base_type)); } } } } /** * bt_machine_get_global_param_details: * @self: the machine to search for the global param details * @index: the offset in the list of global params * @pspec: place for the param spec * @min_val: place to hold new GValue with minimum * @max_val: place to hold new GValue with maximum * * Retrieves the details of a global param. Any detail can be %NULL if its not * wanted. */ void bt_machine_get_global_param_details(const BtMachine * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val) { GParamSpec *property=bt_machine_get_global_param_spec(self,index); if(pspec) { *pspec=property; } bt_machine_get_param_details(self, property, min_val, max_val); } /** * bt_machine_get_voice_param_details: * @self: the machine to search for the voice param details * @index: the offset in the list of voice params * @pspec: place for the param spec * @min_val: place to hold new GValue with minimum * @max_val: place to hold new GValue with maximum * * Retrieves the details of a voice param. Any detail can be %NULL if its not * wanted. */ void bt_machine_get_voice_param_details(const BtMachine * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val) { GParamSpec *property=bt_machine_get_voice_param_spec(self,index); if(pspec) { *pspec=property; } bt_machine_get_param_details(self, property, min_val, max_val); } /** * bt_machine_get_global_param_type: * @self: the machine to search for the global param type * @index: the offset in the list of global params * * Retrieves the GType of a global param * * Returns: the requested GType */ GType bt_machine_get_global_param_type(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),G_TYPE_INVALID); g_return_val_if_fail(indexpriv->global_params,G_TYPE_INVALID); return(GLOBAL_PARAM_TYPE(index)); } /** * bt_machine_get_voice_param_type: * @self: the machine to search for the voice param type * @index: the offset in the list of voice params * * Retrieves the GType of a voice param * * Returns: the requested GType */ GType bt_machine_get_voice_param_type(const BtMachine * const self, const gulong index) { g_return_val_if_fail(BT_IS_MACHINE(self),G_TYPE_INVALID); g_return_val_if_fail(indexpriv->voice_params,G_TYPE_INVALID); return(VOICE_PARAM_TYPE(index)); } /** * bt_machine_describe_global_param_value: * @self: the machine to get a param description from * @index: the offset in the list of global params * @event: the value to describe * * Described a param value in human readable form. The type of the given @value * must match the type of the paramspec of the param referenced by @index. * * Returns: the description as newly allocated string */ gchar *bt_machine_describe_global_param_value(const BtMachine * const self, const gulong index, GValue * const event) { gchar *str=NULL; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->global_params,NULL); g_return_val_if_fail(G_IS_VALUE(event),NULL); if(GSTBT_IS_PROPERTY_META(self->priv->machines[PART_MACHINE])) { str=gstbt_property_meta_describe_property(GSTBT_PROPERTY_META(self->priv->machines[PART_MACHINE]),index,event); } return(str); } /** * bt_machine_describe_voice_param_value: * @self: the machine to get a param description from * @index: the offset in the list of voice params * @event: the value to describe * * Described a param value in human readable form. The type of the given @value * must match the type of the paramspec of the param referenced by @index. * * Returns: the description as newly allocated string */ gchar *bt_machine_describe_voice_param_value(const BtMachine * const self, const gulong index, GValue * const event) { gchar *str=NULL; GST_INFO("%p voice value %lu %p",self,index,event); g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(indexpriv->voice_params,NULL); g_return_val_if_fail(G_IS_VALUE(event),NULL); if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { GstObject *voice_child; // get child for voice 0 if((voice_child=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(self->priv->machines[PART_MACHINE]),0))) { if(GSTBT_IS_PROPERTY_META(voice_child)) { str=gstbt_property_meta_describe_property(GSTBT_PROPERTY_META(voice_child),index,event); } //else { //GST_WARNING_OBJECT(self,"%s is not PROPERTY_META",self->priv->id); //} g_object_unref(voice_child); } //else { //GST_WARNING_OBJECT(self,"%s has no voice child",self->priv->id); //} } //else { //GST_WARNING_OBJECT(self,"%s is not CHILD_BIN",self->priv->id); //} return(str); } //-- controller handling static gboolean controller_need_activate(GstInterpolationControlSource *cs) { if(cs && gst_interpolation_control_source_get_count(cs)) { return(FALSE); } return(TRUE); } static gboolean controller_rem_value(GstInterpolationControlSource *cs, const GstClockTime timestamp, const gboolean has_default) { if(cs) { gint count; gst_interpolation_control_source_unset(cs,timestamp); // check if the property is not having control points anymore count=gst_interpolation_control_source_get_count(cs); if(has_default) // remove also if there is a default only left count--; // @bug: http://bugzilla.gnome.org/show_bug.cgi?id=538201 -> fixed in 0.10.21 return(count==0); } return(FALSE); } /** * bt_machine_global_controller_change_value: * @self: the machine to change the param for * @param: the global parameter index * @timestamp: the time stamp of the change * @value: the new value or %NULL to unset a previous one * * Depending on whether the given value is NULL, sets or unsets the controller * value for the specified param and at the given time. * If @timestamp is 0 and @value is %NULL it set a default value for the start * of the controller sequence, taken from the current value of the parameter. */ void bt_machine_global_controller_change_value(const BtMachine * const self, const gulong param, const GstClockTime timestamp, GValue *value) { GObject *param_parent; GValue def_value={0,}; GstInterpolationControlSource *cs; const gchar *param_name; g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(parampriv->global_params); param_parent=G_OBJECT(self->priv->machines[PART_MACHINE]); param_name=GLOBAL_PARAM_NAME(param); cs=self->priv->global_control_sources[param]; if(G_UNLIKELY(!timestamp)) { if(!value) { // we set it later value=&def_value; // need to remember that we set a default, so that we can update it // (bt_machine_has_global_param_default_set) g_object_set_qdata(param_parent,self->priv->global_quarks[param],GINT_TO_POINTER(TRUE)); GST_INFO("set global default for %s param %lu:%s",self->priv->id,param,param_name); } else { // we set a real value for ts=0, no need to update the default g_object_set_qdata(param_parent,self->priv->global_quarks[param],GINT_TO_POINTER(FALSE)); } } if(value) { gboolean add=controller_need_activate(cs); gboolean is_trigger=bt_machine_is_global_param_trigger(self,param); if(G_UNLIKELY(value==&def_value)) { // only set default value if this is not the first controlpoint if(!add) { if (!is_trigger) { g_value_init(&def_value,GLOBAL_PARAM_TYPE(param)); g_object_get_property(param_parent,param_name,&def_value); GST_LOG("set global controller: %"GST_TIME_FORMAT" param %s:%s",GST_TIME_ARGS(G_GUINT64_CONSTANT(0)),g_type_name(GLOBAL_PARAM_TYPE(param)),param_name); gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&def_value); g_value_unset(&def_value); } else { gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&self->priv->global_no_val[param]); } } } else { if(G_UNLIKELY(add)) { GstController *ctrl; if((ctrl=gst_object_control_properties(param_parent, param_name, NULL))) { cs=gst_interpolation_control_source_new(); gst_controller_set_control_source(ctrl,param_name,GST_CONTROL_SOURCE(cs)); // set interpolation mode depending on param type gst_interpolation_control_source_set_interpolation_mode(cs,is_trigger?GST_INTERPOLATE_TRIGGER:GST_INTERPOLATE_NONE); self->priv->global_control_sources[param]=cs; } // @todo: is this needed, we're in add=TRUE after all g_object_try_unref(self->priv->global_controller); self->priv->global_controller=ctrl; if(timestamp) { // also set default value, as first control point is not a time=0 GST_LOG("set global controller: %"GST_TIME_FORMAT" param %s:%s",GST_TIME_ARGS(G_GUINT64_CONSTANT(0)),g_type_name(GLOBAL_PARAM_TYPE(param)),param_name); if (!is_trigger) { g_value_init(&def_value,GLOBAL_PARAM_TYPE(param)); g_object_get_property(param_parent,param_name,&def_value); gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&def_value); g_value_unset(&def_value); } else { gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&self->priv->global_no_val[param]); } } } GST_LOG("set global controller: %"GST_TIME_FORMAT" param %s:%s",GST_TIME_ARGS(timestamp),g_type_name(GLOBAL_PARAM_TYPE(param)),param_name); gst_interpolation_control_source_set(cs,timestamp,value); } } else { gboolean has_default=bt_machine_has_global_param_default_set(self,param); GST_LOG("unset global controller: %"GST_TIME_FORMAT" param %s:%s",GST_TIME_ARGS(timestamp),g_type_name(GLOBAL_PARAM_TYPE(param)),param_name); if(controller_rem_value(cs,timestamp,has_default)) { gst_controller_set_control_source(self->priv->global_controller,param_name,NULL); g_object_unref(cs); self->priv->global_control_sources[param]=NULL; gst_object_uncontrol_properties(param_parent, param_name, NULL); } } } /** * bt_machine_voice_controller_change_value: * @self: the machine to change the param for * @voice: the voice number * @param: the voice parameter index * @timestamp: the time stamp of the change * @value: the new value or %NULL to unset a previous one * * Depending on whether the given value is NULL, sets or unsets the controller * value for the specified param and at the given time. * If @timestamp is 0 and @value is %NULL it set a default value for the start * of the controller sequence, taken from the current value of the parameter. */ void bt_machine_voice_controller_change_value(const BtMachine * const self, const gulong voice, const gulong param, const GstClockTime timestamp, GValue *value) { GObject *param_parent; GValue def_value={0,}; GstInterpolationControlSource *cs; const gchar *param_name; g_return_if_fail(BT_IS_MACHINE(self)); g_return_if_fail(parampriv->voice_params); g_return_if_fail(voicepriv->voices); g_return_if_fail(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])); param_parent=(GObject*)(gst_child_proxy_get_child_by_index((GstChildProxy*)(self->priv->machines[PART_MACHINE]),voice)); param_name=VOICE_PARAM_NAME(param); cs=self->priv->voice_control_sources[voice*self->priv->voice_params+param]; if(G_UNLIKELY(!timestamp)) { if(!value) { // we set it later value=&def_value; // need to remember that we set a default, so that we can update it // (bt_machine_has_voice_param_default_set) g_object_set_qdata(param_parent,self->priv->voice_quarks[param],GINT_TO_POINTER(TRUE)); //GST_INFO("set voice default for %s:%lu param %lu:%s",self->priv->id,voice,param,param_name); } else { // we set a real value for ts=0, no need to update the default g_object_set_qdata(param_parent,self->priv->voice_quarks[param],GINT_TO_POINTER(FALSE)); } } if(value) { gboolean add=controller_need_activate(cs); gboolean is_trigger=bt_machine_is_voice_param_trigger(self,param); if(G_UNLIKELY(value==&def_value)) { // only set default value if this is not the first controlpoint if(!add) { if (!is_trigger) { g_value_init(&def_value,VOICE_PARAM_TYPE(param)); g_object_get_property(param_parent,param_name,&def_value); GST_LOG("set voice[%lu] controller: %"GST_TIME_FORMAT" param %s:%s",voice,GST_TIME_ARGS(G_GUINT64_CONSTANT(0)),g_type_name(VOICE_PARAM_TYPE(param)),param_name); gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&def_value); g_value_unset(&def_value); } else { gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&self->priv->voice_no_val[param]); } } } else { if(G_UNLIKELY(add)) { GstController *ctrl; if((ctrl=gst_object_control_properties(param_parent, param_name, NULL))) { cs=gst_interpolation_control_source_new(); gst_controller_set_control_source(ctrl,param_name,GST_CONTROL_SOURCE(cs)); // set interpolation mode depending on param type gst_interpolation_control_source_set_interpolation_mode(cs,is_trigger?GST_INTERPOLATE_TRIGGER:GST_INTERPOLATE_NONE); self->priv->voice_control_sources[voice*self->priv->voice_params+param]=cs; } // @todo: is this needed, we're in add=TRUE after all g_object_try_unref(self->priv->voice_controllers[voice]); self->priv->voice_controllers[voice]=ctrl; if(timestamp) { // also set default value, as first control point is not a time=0 GST_LOG("set voice[%lu] controller: %"GST_TIME_FORMAT" param %s:%s",voice,GST_TIME_ARGS(G_GUINT64_CONSTANT(0)),g_type_name(VOICE_PARAM_TYPE(param)),param_name); if (!is_trigger) { g_value_init(&def_value,VOICE_PARAM_TYPE(param)); g_object_get_property(param_parent,param_name,&def_value); gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&def_value); g_value_unset(&def_value); } else { gst_interpolation_control_source_set(cs,G_GUINT64_CONSTANT(0),&self->priv->voice_no_val[param]); } } } GST_LOG("set voice[%lu] controller: %"GST_TIME_FORMAT" param %s:%s",voice,GST_TIME_ARGS(timestamp),g_type_name(VOICE_PARAM_TYPE(param)),param_name); gst_interpolation_control_source_set(cs,timestamp,value); } } else { gboolean has_default=bt_machine_has_voice_param_default_set(self,voice,param); GST_LOG("unset voice[%lu] controller: %"GST_TIME_FORMAT" param %s:%s",voice,GST_TIME_ARGS(timestamp),g_type_name(VOICE_PARAM_TYPE(param)),param_name); if(controller_rem_value(cs,timestamp,has_default)) { gst_controller_set_control_source(self->priv->voice_controllers[voice],param_name,NULL); g_object_unref(cs); self->priv->voice_control_sources[voice*self->priv->voice_params+param]=NULL; gst_object_uncontrol_properties(param_parent, param_name, NULL); } } g_object_unref(param_parent); } //-- interaction control static void free_control_data(BtControlData *data) { BtIcDevice *device; // stop the device g_object_get((gpointer)(data->control),"device",&device,NULL); btic_device_stop(device); g_object_unref(device); // disconnect the handler g_signal_handler_disconnect((gpointer)data->control,data->handler_id); g_object_unref((gpointer)(data->control)); g_free(data); } static void on_boolean_control_notify(const BtIcControl *control,GParamSpec *arg,gpointer user_data) { BtControlData *data=(BtControlData *)(user_data); gboolean value; g_object_get((gpointer)(data->control),"value",&value,NULL); g_object_set(data->object,data->pspec->name,value,NULL); } #define ON_CONTROL_NOTIFY(t,T) \ static void on_## t ##_control_notify(const BtIcControl *control,GParamSpec *arg,gpointer user_data) { \ BtControlData *data=(BtControlData *)(user_data); \ GParamSpec ## T *p=(GParamSpec ## T *)data->pspec; \ glong svalue,min,max; \ g ## t dvalue; \ \ g_object_get((gpointer)(data->control),"value",&svalue,"min",&min,"max",&max,NULL); \ dvalue=p->minimum+(g ## t)((svalue-min)*((gdouble)(p->maximum-p->minimum)/(gdouble)(max-min))); \ dvalue=CLAMP(dvalue,p->minimum,p->maximum); \ g_object_set(data->object,((GParamSpec *)p)->name,dvalue,NULL); \ } ON_CONTROL_NOTIFY(int,Int) ON_CONTROL_NOTIFY(uint,UInt) ON_CONTROL_NOTIFY(int64,Int64) ON_CONTROL_NOTIFY(uint64,UInt64) ON_CONTROL_NOTIFY(float,Float) ON_CONTROL_NOTIFY(double,Double) /** * bt_machine_bind_parameter_control: * @self: machine * @object: child object (global or voice child) * @property_name: name of the parameter * @control: interaction control object * * Connect the interaction control object to the give parameter. Changes of the * control-value are mapped into a change of the parameter. */ void bt_machine_bind_parameter_control(const BtMachine * const self, GstObject *object, const gchar *property_name, BtIcControl *control) { BtControlData *data; GParamSpec *pspec; BtIcDevice *device; gboolean new_data=FALSE; pspec=g_object_class_find_property(G_OBJECT_GET_CLASS(object),property_name); data=(BtControlData *)g_hash_table_lookup(self->priv->control_data,(gpointer)pspec); if(!data) { new_data=TRUE; data=g_new(BtControlData,1); data->object=object; data->pspec=pspec; } else { // stop the old device g_object_get((gpointer)(data->control),"device",&device,NULL); btic_device_stop(device); g_object_unref(device); // disconnect old signal handler g_signal_handler_disconnect((gpointer)data->control,data->handler_id); g_object_unref((gpointer)(data->control)); } data->control=g_object_ref(control); // start the new device g_object_get((gpointer)(data->control),"device",&device,NULL); btic_device_start(device); g_object_unref(device); /* @todo: controls need flags to indicate whether they are absolute or relative * we conect a different handler for relative ones that add/sub values to current value */ // connect signal handler switch(bt_g_type_get_base_type(pspec->value_type)) { case G_TYPE_BOOLEAN: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_boolean_control_notify),(gpointer)data); break; case G_TYPE_INT: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_int_control_notify),(gpointer)data); break; case G_TYPE_UINT: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_uint_control_notify),(gpointer)data); break; case G_TYPE_INT64: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_int64_control_notify),(gpointer)data); break; case G_TYPE_UINT64: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_uint64_control_notify),(gpointer)data); break; case G_TYPE_FLOAT: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_float_control_notify),(gpointer)data); break; case G_TYPE_DOUBLE: data->handler_id=g_signal_connect(control,"notify::value",G_CALLBACK(on_double_control_notify),(gpointer)data); break; default: GST_WARNING_OBJECT(self,"unhandled type \"%s\"",G_PARAM_SPEC_TYPE_NAME(pspec)); break; } if(new_data) { g_hash_table_insert(self->priv->control_data,(gpointer)pspec,(gpointer)data); } } /** * bt_machine_unbind_parameter_control: * @self: machine * @object: child object (global or voice child) * @property_name: name of the parameter * * Disconnect the interaction control object from the give parameter. */ void bt_machine_unbind_parameter_control(const BtMachine * const self, GstObject *object, const char *property_name) { GParamSpec *pspec; pspec=g_object_class_find_property(G_OBJECT_GET_CLASS(object),property_name); g_hash_table_remove(self->priv->control_data,(gpointer)pspec); } /** * bt_machine_unbind_parameter_controls: * @self: machine * * Disconnect all interaction controls. */ void bt_machine_unbind_parameter_controls(const BtMachine * const self) { g_hash_table_remove_all(self->priv->control_data); } //-- settings #define _RANDOMIZE(t,T,p) \ case G_TYPE_ ## T:{ \ const GParamSpec ## p *p=G_PARAM_SPEC_ ## T(property); \ g_object_set(self,n,(g ## t)(p->minimum+((p->maximum-p->minimum)*rnd)),NULL); \ } break; static void bt_g_object_randomize_parameter(GObject *self, GParamSpec *property) { gdouble rnd=((gdouble)rand())/(RAND_MAX+1.0); const gchar *n=property->name; GST_DEBUG("set random value for property: %s (type is %s)",n,G_PARAM_SPEC_TYPE_NAME(property)); switch (bt_g_type_get_base_type(property->value_type)) { _RANDOMIZE(int,INT,Int) _RANDOMIZE(uint,UINT,UInt) _RANDOMIZE(int64,INT64,Int64) _RANDOMIZE(uint64,UINT64,UInt64) _RANDOMIZE(long,LONG,Long) _RANDOMIZE(ulong,ULONG,ULong) _RANDOMIZE(float,FLOAT,Float) _RANDOMIZE(double,DOUBLE,Double) case G_TYPE_BOOLEAN:{ g_object_set(self,n,(gboolean)(2*rnd),NULL); } break; case G_TYPE_ENUM:{ const GParamSpecEnum *p=G_PARAM_SPEC_ENUM(property); const GEnumClass *e = p->enum_class; gint nv=e->n_values-1; // don't use no_value gint v=nv*rnd; // handle sparse enums g_object_set(self,n,e->values[v].value,NULL); } break; default: GST_WARNING ("incomplete implementation for GParamSpec type '%s'", G_PARAM_SPEC_TYPE_NAME (property)); } } /** * bt_machine_randomize_parameters: * @self: machine * * Randomizes machine parameters. */ void bt_machine_randomize_parameters(const BtMachine * const self) { const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; GObject *machine=G_OBJECT(self->priv->machines[PART_MACHINE]),*voice; gulong i,j; for(i=0;ipriv->global_props[i]); } for(j=0;jpriv->voice_props[i]); } } bt_machine_set_param_defaults(self); } /** * bt_machine_reset_parameters: * @self: machine * * Resets machine parameters back to defaults. */ void bt_machine_reset_parameters(const BtMachine * const self) { const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; GObject *machine=G_OBJECT(self->priv->machines[PART_MACHINE]),*voice; GValue gvalue={0,}; gulong i,j; for(i=0;ipriv->global_props[i], &gvalue); g_object_set_property(machine, GLOBAL_PARAM_NAME(i), &gvalue); g_value_unset(&gvalue); } for(j=0;jpriv->voice_props[i], &gvalue); g_object_set_property(voice, VOICE_PARAM_NAME(i), &gvalue); g_value_unset(&gvalue); } } } //-- linking /** * bt_machine_get_wire_by_dst_machine: * @self: the machine that is at src of a wire * @dst: the machine that is at the dst end of the wire * * Searches for a wire in the wires originating from this machine that uses the * given #BtMachine instances as a target. Unref the wire, when done with it. * * Returns: the #BtWire or NULL * * Since: 0.6 */ BtWire *bt_machine_get_wire_by_dst_machine(const BtMachine * const self, const BtMachine * const dst) { gboolean found=FALSE; BtMachine * const machine; const GList *node; g_return_val_if_fail(BT_IS_MACHINE(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(dst),NULL); // either src or dst has no wires if(!self->src_wires || !dst->dst_wires) return(NULL); // check if self links to dst // ideally we would search the shorter of the lists for(node=self->src_wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,"dst",&machine,NULL); if(machine==dst) found=TRUE; g_object_unref(machine); if(found) return(g_object_ref(wire)); } GST_DEBUG("no wire found for machines %p:%s %p:%s",self,GST_OBJECT_NAME(self),dst,GST_OBJECT_NAME(dst)); return(NULL); } //-- debug helper // used in bt_song_write_to_highlevel_dot_file GList *bt_machine_get_element_list(const BtMachine * const self) { GList *list=NULL; gulong i; for(i=0;ipriv->machines[i]) { list=g_list_append(list,self->priv->machines[i]); } } return(list); } void bt_machine_dbg_print_parts(const BtMachine * const self) { /* [A AC IL M OL S] */ GST_INFO("%s [%s %s %s %s %s %s %s %s %s %s]", self->priv->id, self->priv->machines[PART_ADDER]?"A":"a", self->priv->machines[PART_ADDER_CONVERT]?"AC":"ac", self->priv->machines[PART_INPUT_PRE_LEVEL]?"Ipriv->machines[PART_INPUT_GAIN]?"IG":"ig", self->priv->machines[PART_INPUT_POST_LEVEL]?"I>L":"i>l", self->priv->machines[PART_MACHINE]?"M":"m", self->priv->machines[PART_OUTPUT_PRE_LEVEL]?"Opriv->machines[PART_OUTPUT_GAIN]?"OG":"og", self->priv->machines[PART_OUTPUT_POST_LEVEL]?"O>L":"o>l", self->priv->machines[PART_SPREADER]?"S":"s" ); } #if 0 void bt_machine_dbg_dump_global_controller_queue(const BtMachine * const self) { gulong i; FILE *file; gchar *name,*str; GList *list,*node; GstTimedValue *tv; if(!self->priv->global_controller) return; for(i=0;ipriv->global_params;i++) { name=g_strdup_printf("%s"G_DIR_SEPARATOR_S"buzztard-%s_g%02lu.dat",g_get_tmp_dir(),self->priv->id,i); if((file=fopen(name,"wb"))) { fprintf(file,"# global param \"%s\" for machine \"%s\"\n",GLOBAL_PARAM_NAME(i),self->priv->id); GstControlSource *cs; list=NULL; if((cs=gst_controller_get_control_source(self->priv->global_controller,GLOBAL_PARAM_NAME(i)))) { list=gst_interpolation_control_source_get_all(GST_INTERPOLATION_CONTROL_SOURCE(cs)); g_object_unref(cs); } if(list) { for(node=list;node;node=g_list_next(node)) { tv=(GstTimedValue *)node->data; str=g_strdup_value_contents(&tv->value); fprintf(file,"%"GST_TIME_FORMAT" %"G_GUINT64_FORMAT" %s\n",GST_TIME_ARGS(tv->timestamp),tv->timestamp,str); g_free(str); } g_list_free(list); } fclose(file); } g_free(name); } } void bt_machine_dbg_dump_voice_controller_queue(const BtMachine * const self) { gulong i; FILE *file; gchar *name,*str; GList *list,*node; GstTimedValue *tv; if(!self->priv->voice_controllers || !self->priv->voice_controllers[0]) return; for(i=0;ipriv->voice_params;i++) { name=g_strdup_printf("%s"G_DIR_SEPARATOR_S"buzztard-%s_v%02lu.dat",g_get_tmp_dir(),self->priv->id,i); if((file=fopen(name,"wb"))) { fprintf(file,"# voice 0 param \"%s\" for machine \"%s\"\n",VOICE_PARAM_NAME(i),self->priv->id); GstControlSource *cs; list=NULL; if((cs=gst_controller_get_control_source(self->priv->voice_controllers[0],VOICE_PARAM_NAME(i)))) { list=gst_interpolation_control_source_get_all(GST_INTERPOLATION_CONTROL_SOURCE(cs)); g_object_unref(cs); } if(list) { for(node=list;node;node=g_list_next(node)) { tv=(GstTimedValue *)node->data; str=g_strdup_value_contents(&tv->value); fprintf(file,"%"GST_TIME_FORMAT" %"G_GUINT64_FORMAT" %s\n",GST_TIME_ARGS(tv->timestamp),tv->timestamp,str); g_free(str); } g_list_free(list); } fclose(file); } g_free(name); } } #endif //-- io interface static xmlNodePtr bt_machine_persistence_save(const BtPersistence * const persistence, const xmlNodePtr const parent_node) { const BtMachine * const self = BT_MACHINE(persistence); GstObject *machine,*machine_voice; xmlNodePtr node=NULL; xmlNodePtr child_node; gulong i,j; GValue value={0,}; GST_DEBUG("PERSISTENCE::machine"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("machine"),NULL))) { const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; xmlNewProp(node,XML_CHAR_PTR("id"),XML_CHAR_PTR(self->priv->id)); xmlNewProp(node,XML_CHAR_PTR("state"),XML_CHAR_PTR(bt_persistence_strfmt_enum(BT_TYPE_MACHINE_STATE,self->priv->state))); // @todo: also store non-controllable parameters (preferences) // @todo: skip parameters which are default values (is that really a good idea?) machine=GST_OBJECT(self->priv->machines[PART_MACHINE]); for(i=0;ipriv->voice_params && bt_machine_get_voice_param_index(self,GLOBAL_PARAM_NAME(i),NULL)>-1) continue; if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("globaldata"),NULL))) { g_value_init(&value,GLOBAL_PARAM_TYPE(i)); g_object_get_property(G_OBJECT(machine),GLOBAL_PARAM_NAME(i),&value); gchar * const str=bt_persistence_get_value(&value); xmlNewProp(child_node,XML_CHAR_PTR("name"),XML_CHAR_PTR(GLOBAL_PARAM_NAME(i))); xmlNewProp(child_node,XML_CHAR_PTR("value"),XML_CHAR_PTR(str)); g_free(str); g_value_unset(&value); } } for(j=0;jpriv->properties)) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("properties"),NULL))) { if(!bt_persistence_save_hashtable(self->priv->properties,child_node)) goto Error; } else goto Error; } if(bt_machine_has_patterns(self)) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("patterns"),NULL))) { bt_persistence_save_list(self->priv->patterns,child_node); } else goto Error; } if(g_hash_table_size(self->priv->control_data)) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("interaction-controllers"),NULL))) { GList *list=NULL,*lnode; BtControlData *data; BtIcDevice *device; gchar *device_name,*control_name; xmlNodePtr sub_node; g_hash_table_foreach(self->priv->control_data,bt_persistence_collect_hashtable_entries,(gpointer)&list); for(lnode=list;lnode;lnode=g_list_next(lnode)) { data=(BtControlData *)lnode->data; g_object_get((gpointer)(data->control),"device",&device,"name",&control_name,NULL); g_object_get(device,"name",&device_name,NULL); g_object_unref(device); sub_node=xmlNewChild(child_node,NULL,XML_CHAR_PTR("interaction-controller"),NULL); // we need global or voiceXX here if(data->object==(GstObject *)self->priv->machines[PART_MACHINE]) { xmlNewProp(sub_node,XML_CHAR_PTR("global"),XML_CHAR_PTR("0")); } else { if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { GstObject *voice_child; gulong i; gboolean found=FALSE; for(i=0;ipriv->machines[PART_MACHINE]),i))) { if(data->object==voice_child) { xmlNewProp(sub_node,XML_CHAR_PTR("voice"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(i))); found=TRUE; } g_object_unref(voice_child); if(found) break; } } } } xmlNewProp(sub_node,XML_CHAR_PTR("parameter"),XML_CHAR_PTR(data->pspec->name)); xmlNewProp(sub_node,XML_CHAR_PTR("device"),XML_CHAR_PTR(device_name)); xmlNewProp(sub_node,XML_CHAR_PTR("control"),XML_CHAR_PTR(control_name)); g_free(device_name); g_free(control_name); } g_list_free(list); } else goto Error; } } Error: return(node); } static BtPersistence *bt_machine_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtMachine * const self = BT_MACHINE(persistence); xmlChar *name,*global_str,*voice_str,*value_str; xmlNodePtr child_node; GValue value={0,}; glong param,voice; GstObject *machine,*machine_voice; GError *error=NULL; GST_DEBUG("PERSISTENCE::machine"); g_assert(node); if((machine=GST_OBJECT(self->priv->machines[PART_MACHINE]))) { if((value_str=xmlGetProp(node,XML_CHAR_PTR("state")))) { self->priv->state=bt_persistence_parse_enum(BT_TYPE_MACHINE_STATE,(gchar *)value_str); xmlFree(value_str); } for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { // @todo: load prefsdata if(!strncmp((gchar *)node->name,"globaldata\0",11)) { name=xmlGetProp(node,XML_CHAR_PTR("name")); value_str=xmlGetProp(node,XML_CHAR_PTR("value")); param=bt_machine_get_global_param_index(self,(gchar *)name,&error); if(!error) { if(value_str) { g_value_init(&value,GLOBAL_PARAM_TYPE(param)); bt_persistence_set_value(&value,(gchar *)value_str); g_object_set_property(G_OBJECT(machine),(gchar *)name,&value); g_value_unset(&value); bt_machine_set_global_param_default(self, bt_machine_get_global_param_index(self,(gchar *)name,NULL)); } GST_INFO("initialized global machine data for param %ld: %s",param, name); } else { GST_WARNING_OBJECT(self,"error while loading global machine data for param %ld: %s",param,error->message); g_error_free(error);error=NULL; } xmlFree(name);xmlFree(value_str); } else if(!strncmp((gchar *)node->name,"voicedata\0",10)) { voice_str=xmlGetProp(node,XML_CHAR_PTR("voice")); voice=atol((char *)voice_str); name=xmlGetProp(node,XML_CHAR_PTR("name")); value_str=xmlGetProp(node,XML_CHAR_PTR("value")); param=bt_machine_get_voice_param_index(self,(gchar *)name,&error); if(!error) { if(value_str) { machine_voice=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(machine),voice); g_assert(machine_voice); g_value_init(&value,VOICE_PARAM_TYPE(param)); bt_persistence_set_value(&value,(gchar *)value_str); g_object_set_property(G_OBJECT(machine_voice),(gchar *)name,&value); bt_machine_set_voice_param_default(self,voice, bt_machine_get_voice_param_index(self,(gchar *)name,NULL)); g_value_unset(&value); g_object_unref(machine_voice); } GST_INFO("initialized voice machine data for param %ld: %s",param, name); } else { GST_WARNING_OBJECT(self,"error while loading voice machine data for param %ld, voice %ld: %s",param,voice,error->message); g_error_free(error);error=NULL; } xmlFree(name);xmlFree(value_str);xmlFree(voice_str); } else if(!strncmp((gchar *)node->name,"properties\0",11)) { bt_persistence_load_hashtable(self->priv->properties,node); } else if(!strncmp((gchar *)node->name,"patterns\0",9)) { BtPattern *pattern; for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"pattern\0",8))) { GError *err=NULL; pattern=BT_PATTERN(bt_persistence_load(BT_TYPE_PATTERN,NULL,child_node,&err,"song",self->priv->song,"machine",self,NULL)); if(err!=NULL) { GST_WARNING_OBJECT(self,"Can't create pattern: %s",err->message); g_error_free(err); } g_object_unref(pattern); } } } else if(!strncmp((gchar *)node->name,"interaction-controllers\0",24)) { BtIcRegistry *registry; BtIcDevice *device; BtIcControl *control; GList *lnode,*devices,*controls; gchar *name; xmlChar *device_str,*control_str,*property_name; gboolean found; registry=btic_registry_new(); g_object_get(registry,"devices",&devices,NULL); for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"interaction-controller\0",23))) { control=NULL; if((device_str=xmlGetProp(child_node,XML_CHAR_PTR("device")))) { found=FALSE; for(lnode=devices;lnode;lnode=g_list_next(lnode)) { device=BTIC_DEVICE(lnode->data); g_object_get(device,"name",&name,NULL); if(!strcmp(name,(gchar *)device_str)) found=TRUE; g_free(name); if(found) break; } if(found) { if((control_str=xmlGetProp(child_node,XML_CHAR_PTR("control")))) { found=FALSE; g_object_get(device,"controls",&controls,NULL); for(lnode=controls;lnode;lnode=g_list_next(lnode)) { control=BTIC_CONTROL(lnode->data); g_object_get(control,"name",&name,NULL); if(!strcmp(name,(gchar *)control_str)) found=TRUE; g_free(name); if(found) break; } g_list_free(controls); if(found) { if((property_name=xmlGetProp(child_node,XML_CHAR_PTR("parameter")))) { if((global_str=xmlGetProp(child_node,XML_CHAR_PTR("global")))) { bt_machine_bind_parameter_control(self,machine,(gchar*)property_name,control); xmlFree(global_str); } else { if((voice_str=xmlGetProp(child_node,XML_CHAR_PTR("voice")))) { voice=atol((char *)voice_str); machine_voice=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(machine),voice); bt_machine_bind_parameter_control(self,machine_voice,(gchar*)property_name,control); g_object_unref(machine_voice); xmlFree(voice_str); } } xmlFree(property_name); } } xmlFree(control_str); } } xmlFree(device_str); } } } g_list_free(devices); } } } } return(BT_PERSISTENCE(persistence)); } static void bt_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_machine_persistence_load; iface->save = bt_machine_persistence_save; } //-- wrapper //-- gstelement overrides static GstPad* bt_machine_request_new_pad(GstElement *element, GstPadTemplate *templ, const gchar* _name) { BtMachine * const self=BT_MACHINE(element); gchar *name; GstPad *pad, *target; // check direction if(GST_PAD_TEMPLATE_DIRECTION(templ)==GST_PAD_SRC) { target=gst_element_get_request_pad(self->priv->machines[PART_SPREADER],"src%d"); name=g_strdup_printf("src%d", self->priv->src_pad_counter++); GST_INFO_OBJECT(element,"request src pad: %s",name); } else { target=gst_element_get_request_pad(self->priv->machines[PART_ADDER],"sink%d"); name=g_strdup_printf ("sink%d", self->priv->sink_pad_counter++); GST_INFO_OBJECT(element,"request sink pad: %s",name); } if((pad=gst_ghost_pad_new(name,target))) { GST_INFO("%s:%s: %s%s%s",GST_DEBUG_PAD_NAME(target), GST_OBJECT(target)->flags&GST_PAD_BLOCKED?"blocked, ":"", GST_OBJECT(target)->flags&GST_PAD_FLUSHING?"flushing, ":"", GST_OBJECT(target)->flags&GST_PAD_BLOCKING?"blocking, ":""); GST_INFO("%s:%s: %s%s%s",GST_DEBUG_PAD_NAME(pad), GST_OBJECT(pad)->flags&GST_PAD_BLOCKED?"blocked, ":"", GST_OBJECT(pad)->flags&GST_PAD_FLUSHING?"flushing, ":"", GST_OBJECT(pad)->flags&GST_PAD_BLOCKING?"blocking, ":""); if(GST_STATE(element)==GST_STATE_PLAYING) { GST_DEBUG_OBJECT(element,"activating pad"); gst_pad_set_active(pad, TRUE); } gst_element_add_pad(element, pad); } else { GST_WARNING_OBJECT(element,"failed to create ghostpad %s to target %s:%s",name,GST_DEBUG_PAD_NAME(target)); } gst_object_unref(target); g_free(name); return(pad); } static void bt_machine_release_pad(GstElement *element, GstPad *pad) { BtMachine * const self=BT_MACHINE(element); GstPad *target; if(GST_STATE(element)==GST_STATE_PLAYING) { GST_DEBUG_OBJECT(element,"deactivating pad"); gst_pad_set_active(pad, FALSE); } target=gst_ghost_pad_get_target(GST_GHOST_PAD(pad)); gst_element_remove_pad(element, pad); if(gst_pad_get_direction(pad)==GST_PAD_SRC) { GST_INFO_OBJECT(element,"release src pad: %s:%s", GST_DEBUG_PAD_NAME(target)); gst_element_release_request_pad(self->priv->machines[PART_SPREADER],target); } else { GST_INFO_OBJECT(element,"release sink pad: %s:%s", GST_DEBUG_PAD_NAME(target)); gst_element_release_request_pad(self->priv->machines[PART_ADDER],target); } gst_object_unref(target); } //-- gobject overrides static void bt_machine_constructed(GObject *object) { BtMachine * const self=BT_MACHINE(object); BtPattern *pattern; GST_INFO("machine constructed ..."); if(G_OBJECT_CLASS(bt_machine_parent_class)->constructed) G_OBJECT_CLASS(bt_machine_parent_class)->constructed(object); g_return_if_fail(BT_IS_SONG(self->priv->song)); g_return_if_fail(BT_IS_STRING(self->priv->id)); g_return_if_fail(BT_IS_STRING(self->priv->plugin_name)); GST_INFO("initializing machine"); gst_object_set_name(GST_OBJECT(self),self->priv->id); GST_INFO("naming machine : %s",self->priv->id); // name the machine and try to instantiate it if(!bt_machine_init_core_machine(self)) { goto Error; } // initialize iface properties bt_machine_init_interfaces(self); // we need to make sure the machine is from the right class if(!bt_machine_check_type(self)) { goto Error; } GST_DEBUG("machine-ref_ct=%d",G_OBJECT_REF_COUNT(self)); // register global params bt_machine_init_global_params(self); // register voice params bt_machine_init_voice_params(self); GST_DEBUG("machine-ref_ct=%d",G_OBJECT_REF_COUNT(self)); // post sanity checks GST_INFO(" added machine %p to bin, machine->ref_ct=%d",self->priv->machines[PART_MACHINE],G_OBJECT_REF_COUNT(self->priv->machines[PART_MACHINE])); g_assert(self->priv->machines[PART_MACHINE]!=NULL); if(!(self->priv->global_params+self->priv->voice_params)) { GST_WARNING_OBJECT(self," machine %s has no params",self->priv->id); } // prepare common internal patterns for the machine pattern=bt_pattern_new_with_event(self->priv->song,self,BT_PATTERN_CMD_BREAK); g_object_unref(pattern); pattern=bt_pattern_new_with_event(self->priv->song,self,BT_PATTERN_CMD_MUTE); g_object_unref(pattern); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been constructed",self,G_OBJECT_REF_COUNT(self)); return; Error: GST_WARNING_OBJECT(self,"failed to create machine: %s",self->priv->plugin_name); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "failed to setup the machine."); } } /* returns a property for the given property_id for this object */ static void bt_machine_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtMachine * const self = BT_MACHINE(object); return_if_disposed(); switch (property_id) { case MACHINE_CONSTRUCTION_ERROR: { g_value_set_pointer(value, self->priv->constrution_error); } break; case MACHINE_PROPERTIES: { g_value_set_pointer(value, self->priv->properties); } break; case MACHINE_SONG: { g_value_set_object(value, self->priv->song); } break; case MACHINE_ID: { g_value_set_string(value, self->priv->id); } break; case MACHINE_PLUGIN_NAME: { g_value_set_string(value, self->priv->plugin_name); } break; case MACHINE_VOICES: { g_value_set_ulong(value, self->priv->voices); } break; case MACHINE_GLOBAL_PARAMS: { g_value_set_ulong(value, self->priv->global_params); } break; case MACHINE_VOICE_PARAMS: { g_value_set_ulong(value, self->priv->voice_params); } break; case MACHINE_MACHINE: { g_value_set_object(value, self->priv->machines[PART_MACHINE]); } break; case MACHINE_ADDER_CONVERT: { g_value_set_object(value, self->priv->machines[PART_ADDER_CONVERT]); } break; case MACHINE_INPUT_PRE_LEVEL: { g_value_set_object(value, self->priv->machines[PART_INPUT_PRE_LEVEL]); } break; case MACHINE_INPUT_GAIN: { g_value_set_object(value, self->priv->machines[PART_INPUT_GAIN]); } break; case MACHINE_INPUT_POST_LEVEL: { g_value_set_object(value, self->priv->machines[PART_INPUT_POST_LEVEL]); } break; case MACHINE_OUTPUT_PRE_LEVEL: { g_value_set_object(value, self->priv->machines[PART_OUTPUT_PRE_LEVEL]); } break; case MACHINE_OUTPUT_GAIN: { g_value_set_object(value, self->priv->machines[PART_OUTPUT_GAIN]); } break; case MACHINE_OUTPUT_POST_LEVEL: { g_value_set_object(value, self->priv->machines[PART_OUTPUT_POST_LEVEL]); } break; case MACHINE_PATTERNS: { if(self->priv->patterns) { GList *list=g_list_copy(self->priv->patterns); g_list_foreach(list,(GFunc)g_object_ref,NULL); g_value_set_pointer(value,list); } else { g_value_set_pointer(value,NULL); } } break; case MACHINE_STATE: { g_value_set_enum(value, self->priv->state); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_machine_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtMachine * const self = BT_MACHINE(object); return_if_disposed(); switch (property_id) { case MACHINE_CONSTRUCTION_ERROR: { self->priv->constrution_error=(GError **)g_value_get_pointer(value); } break; case MACHINE_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG_OBJECT(self,"set the song for machine: %p",self->priv->song); } break; case MACHINE_ID: { g_free(self->priv->id); self->priv->id = g_value_dup_string(value); GST_INFO_OBJECT(self,"set the id for machine: %s",self->priv->id); if(self->priv->machines[PART_MACHINE]) { GstObject *parent=gst_object_get_parent(GST_OBJECT(self)); if(!parent) { gst_element_set_name(self,self->priv->id); } else { gst_object_unref(parent); } } } break; case MACHINE_PLUGIN_NAME: { g_free(self->priv->plugin_name); self->priv->plugin_name = g_value_dup_string(value); GST_DEBUG_OBJECT(self,"set the plugin_name for machine: %s",self->priv->plugin_name); } break; case MACHINE_VOICES: { const gulong voices=self->priv->voices; self->priv->voices = g_value_get_ulong(value); if(GSTBT_IS_CHILD_BIN(self->priv->machines[PART_MACHINE])) { if(voices!=self->priv->voices) { GST_DEBUG_OBJECT(self,"set the voices for machine: %lu -> %lu",voices,self->priv->voices); bt_machine_resize_voices(self,voices); } } else { GST_WARNING_OBJECT(self,"ignoring change in voices for monophonic machine"); } } break; case MACHINE_GLOBAL_PARAMS: { self->priv->global_params = g_value_get_ulong(value); } break; case MACHINE_VOICE_PARAMS: { self->priv->voice_params = g_value_get_ulong(value); } break; case MACHINE_STATE: { if(bt_machine_change_state(self,g_value_get_enum(value))) { GST_DEBUG_OBJECT(self,"set the state for machine: %d",self->priv->state); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_dispose(GObject * const object) { const BtMachine * const self = BT_MACHINE(object); const gulong voices=self->priv->voices; const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; //GObject *param_parent; guint i,j; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG_OBJECT(self,"!!!! self=%p,%s, song=%p",self,self->priv->id,self->priv->song); // shut down interaction control setup g_hash_table_destroy(self->priv->control_data); // disconnect notify handlers if(self->priv->song) { BtSongInfo *song_info; g_object_get((gpointer)(self->priv->song),"song-info",&song_info,NULL); if(song_info) { GST_DEBUG(" disconnecting song-info handlers"); g_signal_handlers_disconnect_matched(song_info,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_machine_on_bpm_changed,(gpointer)self); g_signal_handlers_disconnect_matched(song_info,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,bt_machine_on_tpb_changed,(gpointer)self); g_object_unref(song_info); } } // unref controllers GST_DEBUG(" releasing controllers, global.ref_ct=%d, voices=%lu", G_OBJECT_REF_COUNT(self->priv->global_controller),self->priv->voices); //param_parent=G_OBJECT(self->priv->machines[PART_MACHINE]); for(j=0;jpriv->global_control_sources[j]); //bt_gst_object_deactivate_controller(param_parent, GLOBAL_PARAM_NAME(j)); } //self->priv->global_controller=NULL; // <- this is wrong, controllers have a refcount on the gstelement g_object_try_unref(self->priv->global_controller); if(self->priv->voice_controllers) { for(i=0;ipriv->machines[PART_MACHINE]),i)); for(j=0;jpriv->voice_control_sources[i*self->priv->voice_params+j]); //bt_gst_object_deactivate_controller(param_parent, VOICE_PARAM_NAME(j)); } //g_object_unref(param_parent); //self->priv->voice_controllers[i]=NULL; // <- this is wrong, controllers have a refcount on the gstelement g_object_try_unref(self->priv->voice_controllers[i]); } } // unref the pads for(i=0;ipriv->src_pads[i]) gst_object_unref(self->priv->src_pads[i]); if(self->priv->sink_pads[i]) gst_object_unref(self->priv->sink_pads[i]); } // gstreamer uses floating references, therefore elements are destroyed, when removed from the bin GST_DEBUG(" releasing song: %p",self->priv->song); g_object_try_weak_unref(self->priv->song); GST_DEBUG(" releasing patterns"); // unref list of patterns if(self->priv->patterns) { GList* node; for(node=self->priv->patterns;node;node=g_list_next(node)) { GST_DEBUG("removing pattern: %p,ref_ct=%d",node->data,G_OBJECT_REF_COUNT(node->data)); // DEBUG #ifdef CHECK_PATTERN_OWNERSHIP g_object_weak_unref((GObject *)node->data,check_pattern_ownership,(gpointer)self); #endif // DEBUG g_object_unref(node->data); node->data=NULL; } } GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_machine_parent_class)->dispose(object); GST_DEBUG(" done"); } static void bt_machine_finalize(GObject * const object) { const BtMachine * const self = BT_MACHINE(object); const gulong global_params=self->priv->global_params; const gulong voice_params=self->priv->voice_params; GValue *v; guint i; GST_DEBUG_OBJECT(self,"!!!! self=%p",self); g_hash_table_destroy(self->priv->properties); g_free(self->priv->id); g_free(self->priv->plugin_name); // unset no_values for(i=0;ipriv->global_no_val[i]; if(BT_IS_GVALUE(v)) g_value_unset(v); } for(i=0;ipriv->voice_no_val[i]; if(BT_IS_GVALUE(v)) g_value_unset(v); } g_free(self->priv->voice_quarks); g_free(self->priv->global_quarks); g_free(self->priv->voice_no_val); g_free(self->priv->global_no_val); g_free(self->priv->voice_flags); g_free(self->priv->global_flags); g_free(self->priv->voice_props); g_free(self->priv->global_props); g_free(self->priv->voice_controllers); g_free(self->priv->global_control_sources); g_free(self->priv->voice_control_sources); // free list of patterns if(self->priv->patterns) { g_list_free(self->priv->patterns); self->priv->patterns=NULL; } if(self->src_wires) { g_list_free(self->src_wires); } if(self->dst_wires) { g_list_free(self->dst_wires); } GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_machine_parent_class)->finalize(object); GST_DEBUG(" done"); } //-- class internals static void bt_machine_init(BtMachine *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE, BtMachinePrivate); // default is no voice, only global params //self->priv->voices=1; self->priv->properties=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); self->priv->control_data=g_hash_table_new_full(NULL,NULL,NULL,(GDestroyNotify)free_control_data); GST_DEBUG("!!!! self=%p",self); } static void bt_machine_class_init(BtMachineClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const gstelement_class = GST_ELEMENT_CLASS(klass); error_domain=g_type_qname(BT_TYPE_MACHINE); g_type_class_add_private(klass,sizeof(BtMachinePrivate)); gobject_class->constructed = bt_machine_constructed; gobject_class->set_property = bt_machine_set_property; gobject_class->get_property = bt_machine_get_property; gobject_class->dispose = bt_machine_dispose; gobject_class->finalize = bt_machine_finalize; // disable deep notify { GObjectClass *parent_class=g_type_class_peek_static(G_TYPE_OBJECT); gobject_class->dispatch_properties_changed=parent_class->dispatch_properties_changed; } gstelement_class->request_new_pad = bt_machine_request_new_pad; gstelement_class->release_pad = bt_machine_release_pad; /** * BtMachine::pattern-added: * @self: the machine object that emitted the signal * @pattern: the new pattern * * A new pattern item has been added to the machine */ signals[PATTERN_ADDED_EVENT] = g_signal_new("pattern-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_PATTERN // param data ); /** * BtMachine::pattern-removed: * @self: the machine object that emitted the signal * @pattern: the old pattern * * A pattern item has been removed from the machine */ signals[PATTERN_REMOVED_EVENT] = g_signal_new("pattern-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_PATTERN // param data ); g_object_class_install_property(gobject_class,MACHINE_CONSTRUCTION_ERROR, g_param_spec_pointer("construction-error", "construction error prop", "signal failed instance creation", G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_PROPERTIES, g_param_spec_pointer("properties", "properties prop", "hashtable of machine properties", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_SONG, g_param_spec_object("song", "song contruct prop", "song object, the machine belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_ID, g_param_spec_string("id", "id contruct prop", "machine identifier", "unamed machine", /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_PLUGIN_NAME, g_param_spec_string("plugin-name", "plugin-name construct prop", "the name of the gst plugin for the machine", "unamed machine", /* default value */ G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_VOICES, g_param_spec_ulong("voices", "voices prop", "number of voices in the machine", 0, G_MAXULONG, 0, G_PARAM_CONSTRUCT|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_GLOBAL_PARAMS, g_param_spec_ulong("global-params", "global-params prop", "number of params for the machine", 0, G_MAXULONG, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_VOICE_PARAMS, g_param_spec_ulong("voice-params", "voice-params prop", "number of params for each machine voice", 0, G_MAXULONG, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_MACHINE, g_param_spec_object("machine", "machine element prop", "the machine element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_ADDER_CONVERT, g_param_spec_object("adder-convert", "adder-convert prop", "the after mixing format converter element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_INPUT_PRE_LEVEL, g_param_spec_object("input-pre-level", "input-pre-level prop", "the pre-gain input-level element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_INPUT_GAIN, g_param_spec_object("input-gain", "input-gain prop", "the input-gain element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_INPUT_POST_LEVEL, g_param_spec_object("input-post-level", "input-post-level prop", "the post-gain input-level element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_OUTPUT_PRE_LEVEL, g_param_spec_object("output-pre-level", "output-pre-level prop", "the pre-gain output-level element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_OUTPUT_GAIN, g_param_spec_object("output-gain", "output-gain prop", "the output-gain element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_OUTPUT_POST_LEVEL, g_param_spec_object("output-post-level", "output-post-level prop", "the post-gain output-level element, if any", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_PATTERNS, g_param_spec_pointer("patterns", "pattern list prop", "a copy of the list of patterns", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_STATE, g_param_spec_enum("state", "state prop", "the current state of this machine", BT_TYPE_MACHINE_STATE, /* enum type */ BT_MACHINE_STATE_NORMAL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/application.c0000644042355400116100000001273311576360371015264 00000000000000/* $Id: application.c 2958 2010-09-02 07:51:06Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btapplication * @short_description: base class for a buzztard based application * * Every application using the libbtcore library should inherit from this class. * * The base class automatically creates a #GstBin element as a container for the * song. This can be retrieved via the #BtApplication:bin property. * When creating #BtSong instances, the #BtApplication instance needs to be * passed to the bt_song_new() constructor, so that it can retrieve the #GstBin * element. * |[ * BtApplication *app; * BtSong *song; * ... * song=bt_song_new(app); * ]| * * Another module the application base class maintains is a settings instance (see * #BtSettings), that manages application preferences. */ #define BT_CORE #define BT_APPLICATION_C #include "core_private.h" enum { APPLICATION_BIN=1, APPLICATION_SETTINGS }; struct _BtApplicationPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the main gstreamer container element */ GstElement *bin; /* a reference to the buzztard settings object */ BtSettings *settings; }; //-- the class G_DEFINE_ABSTRACT_TYPE (BtApplication, bt_application, G_TYPE_OBJECT); //-- helper //-- handler //-- constructor methods //-- methods //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_application_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtApplication * const self = BT_APPLICATION(object); return_if_disposed(); switch (property_id) { case APPLICATION_BIN: { g_value_set_object(value, self->priv->bin); } break; case APPLICATION_SETTINGS: { g_value_set_object(value, self->priv->settings); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_application_dispose(GObject * const object) { const BtApplication * const self = BT_APPLICATION(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); GST_INFO("bin->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->bin)); GST_INFO("bin->numchildren=%d",GST_BIN(self->priv->bin)->numchildren); GST_INFO("settings->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->settings)); if(self->priv->bin) { gst_object_unref(self->priv->bin); } g_object_try_unref(self->priv->settings); G_OBJECT_CLASS(bt_application_parent_class)->dispose(object); GST_DEBUG(" done"); } //-- class internals static void bt_application_init(BtApplication *self) { GST_DEBUG("!!!! self=%p",self); self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_APPLICATION, BtApplicationPrivate); self->priv->bin = gst_pipeline_new("song"); g_assert(GST_IS_ELEMENT(self->priv->bin)); GST_DEBUG("bin->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->bin)); // tried this when debuging a case where we don't get bus messages //gst_pipeline_set_auto_flush_bus(GST_PIPELINE(self->priv->bin),FALSE); // if we enable this we get lots of diagnostics //g_signal_connect (self->priv->bin, "deep_notify", G_CALLBACK(gst_object_default_deep_notify), NULL); self->priv->settings=bt_settings_make(); g_assert(BT_IS_SETTINGS(self->priv->settings)); GST_INFO("app has settings %p",self->priv->settings); } static void bt_application_class_init(BtApplicationClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GST_DEBUG("!!!!"); g_type_class_add_private(klass,sizeof(BtApplicationPrivate)); gobject_class->get_property = bt_application_get_property; gobject_class->dispose = bt_application_dispose; /** * BtApplication:bin * * The top-level gstreamer element for the song, e.g. a #GstPipeline or * #GstBin. */ g_object_class_install_property(gobject_class,APPLICATION_BIN, g_param_spec_object("bin", "bin ro prop", "applications top-level GstElement container", GST_TYPE_BIN, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,APPLICATION_SETTINGS, g_param_spec_object("settings", "settings ro prop", "applications configuration settings", BT_TYPE_SETTINGS, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/setup.c0000644042355400116100000020613211665661620014117 00000000000000/* $Id: setup.c 3713 2011-12-01 11:22:55Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsetup * @short_description: class with all machines and wires (#BtMachine and #BtWire) * for a #BtSong instance * * The setup manages virtual gear in a #BtSong. This is a list of #BtMachines * that are used and the #BtWires that connect them. * * The setup manages the actual GStreamer #GstPipeline content. Freshly created * machines are not yet added to the pipeline. Only once a subgraph from a * source is fully connected to the sink, that subgraph is added o the pipeline. * * Applications can watch the GstObject:parent property to see wheter a machine * is physically inserted into the processing pipeline. */ /* support dynamic (un)linking (while playing) * * When we add a machine, we do nothing else * When we remove a machine, we remove all connected wires * * When we add a wire, we run check_connected(self,master,NULL,NULL). * When we remove a wire, we run check_connected(self,master,NULL,NULL). * * We don't need to handle the not_visited_* lists. Disconnected things are * never added (see update_bin_in_pipeline()). * * When adding/removing a bin while playing, block all src-pads that are * connected to existing elements when linking. * Once the deep scan of the graph is finished, we can unblock all remebered * pads. Also send a seek and a tag event to newly added sources. * * When dynamically adding/removing we ideally do not make any change to the * existing pipeline, but collect a list of machines and wires we want to * add/remove (subgraph). We also need to know if the new subgraph makes any * practical change (does the new wire connect to the master in the end or is * the wire we remove connected). * * Adding wires ---------------------------------------------------------------- * - if the target of new wire is not connecting to the master or the src of the * wire is not reaching a source or connected machine, just add to setup * else -> build subgraph (we want all wires+machines that become fully * connected as the result of adding this wire) * - for the subgraph we would study all wires that are not connected * not_connected = get_list_of_unconnected_wires(); * sub_graph = g_list_append(NULL,this_wire); * do { * found_more=FALSE; * foreach(not_connected) { * if(linked_to_wire_sub_graph(wire,sub_graph) { * sub_graph = g_list_append(sub_graph,wire); * not_connected = g_list_remove(not_connected,wire); * found_more=TRUE; * } * } * } while(found_more); * // now we would need to eliminate disconnected paths again * do { * found_more=FALSE; * foreach(sub_graph) { * // check if wire is connected in real song or subgraph * if(wire_is_not_connected(wire) { * sub_graph = g_list_remove(sub_graph,wire); * found_more=TRUE; * } * } * } while(found_more); * if(!is_empty(sub_graph)) { * src_wires=NULL; * // get all wires in subgraph that are connected to real song in src side * foreach(sub_graph) { * is_src=TRUE; * foreach(sub_graph) { * if(this_wire.src==that_wire.dst) { * is_src=FALSE; * break; * } * } * if(is_src) { * src_wires = g_list_append(src_wires,this_wire); * } * } * foreach(sub_graph) { * // do we need gst_element_set_locked_state(...,TRUE); * update_bin_in_pipeline(...); * } * foreach(src_wires) { * link_wire_and_block(wire,src,dst); * } * foreach(sub_graph) { * if(wire not in src_wires) { * link_wire(wire,src,dst); * gst_element_set_state(PLAYING); * } * } * foreach(src_wires) { * un_block(wire,src); * } * } * * Graph before: * A B * Graph matrix before: * + A B * A * B * Add: A => B * Block: A * Link: A => B * Parent: A, B, A => B * Unblock: A? * Graph after: * A => B * Graph matrix after: * + A B * A = * B * * Graph before: * A B -> C * => D => * Graph matrix before: * + A B C D * A = * B - * C * D = * Add: A => B * Block: A * Link: A => B, B => C * Parent: B, A => B, B => C * Unblock: A * Graph after: * A => B => C * => D => * Graph matrix after: * + A B C D * A = = * B = * C * D = * * Graph before: * A -> B C * => D => * Graph matrix before: * + A B C D * A - = * B * C * D = * Add: B => C * Block: A * Link: A => B, B => C * Parent: B, A => B, B => C * Unblock: A * Graph after: * A => B => C * => D => * Graph matrix after: * + A B C D * A = = * B = * C * D = * * Removing wires -------------------------------------------------------------- * - if the wire is not in the pipeline (not connecting things to the master) * just remove from setup * else -> build subgraph (we want all wires+machines that become disconnected * as the result of removing this wire) * - for the subgraph we would study all wires that are connected * - we can do this similar as for adding * * Graph before: * A => B * Remove: A => B * Block: A * Unlink: A => B * Unparent: A, B, A => B * Unblock: A? * Graph after: * A B * * Graph before: * A => B => C * => D => * Remove: A => B * Block: A * Unlink: A => B, B => C * Unparent: B, A => B, B => C * Unblock: A * Graph after: * A B -> C * => D => * * -- * * We could have an alternative data-structure in setup: * struct Connection[num_src][num_dst] * but its not giving much benefit actually * We could print the song-graph as a matrix for debuging purposes * * -- * * We could have a GHashMap for wires and machines in setup to track if they are * added or not. Then check_connected() can be made two pass. * - GEnum BtSetupConnectionState={DISCONNECTED,DISCONNECTING,CONNECTING,CONNECTED} * [done] * - when we add an element its state is Disconnected * [done] * - when we remove an element we set the state to DISCONNECTING if it was Connected ? * 1. check_connected * - when this is called all elements are either disconnected or connected * - exception is when we remove things * - disconnected elements that should be connected will be set to CONNECTING * - connected elements that should be disconnected will be set to DISCONNECTING * - we run this regardless if the song is playing or not, whenever we update/ * remove things (also in the future we will always play) * 2. update_pipeline * - the elements which are in CONNECTING or DISCONNECTING are our subgraph * - add all machines that are in CONNECTING and set to CONNECTED * - add & link all wires that are in CONNECTING and set to CONNECTED * - unlink and remove all wires that are in DISCONNECTING and set to DISCONNECTED * - remove all machines that are in DISCONNECTING and set to DISCONNECTED * - after this has run all elements are either DISCONNECTED or CONNECTED * - when to run * - we actually don't need to run this if we are not playing * (but in the future we will always play) * - we can run it before playing */ /* @todo: * - each time we/add remove a wire, we update the whole graph. Would be nice * to avoid this when loading songs. */ /* dynamic changes: - we need to block the srcpad into adder - then when blocked, set all elements to NULL (going upstream) - unlink - then release the adder sinkpad to continue */ // uncomment to use pad-blocking, might do more harm than help // see gst-plugins-base/tests/examples/dynamic/sprinkl3.c //#define USE_PAD_BLOCK #define BT_CORE #define BT_SETUP_C #include "core_private.h" //-- signal ids enum { MACHINE_ADDED_EVENT, MACHINE_REMOVED_EVENT, WIRE_ADDED_EVENT, WIRE_REMOVED_EVENT, LAST_SIGNAL }; //-- property ids enum { SETUP_PROPERTIES=1, SETUP_SONG, SETUP_MACHINES, SETUP_WIRES, SETUP_MISSING_MACHINES }; /* state of elements in graph * * CS_DISCONNECTED -> CS_CONNECTING * ^ | * | v * CS_DISCONNECTING <- CS_CONNECTED */ typedef enum { /* start with 1, so that we can differentiate between NULL and DISCONNECTED * when doing g_hash_table_lookup */ CS_DISCONNECTED=1, CS_DISCONNECTING, CS_CONNECTING, CS_CONNECTED } BtSetupConnectionState; #define GET_CONNECTION_STATE(self,bin) \ GPOINTER_TO_INT(g_hash_table_lookup(self->priv->connection_state,(gpointer)bin)) #define GET_GRAPH_DEPTH(self,bin) \ GPOINTER_TO_INT(g_hash_table_lookup(self->priv->graph_depth,(gpointer)bin)) #define SET_GRAPH_DEPTH(self,bin,depth) \ g_hash_table_insert(self->priv->graph_depth,(gpointer)bin,GINT_TO_POINTER(depth)); struct _BtSetupPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the song the setup belongs to */ G_POINTER_ALIAS(BtSong *,song); /* the top-level gstreamer container element */ GstBin *bin; GList *machines; // each entry points to BtMachine GList *wires; // each entry points to BtWire GList *missing_machines; // each entry points to a gchar* /* (ui) properties associated with this song * zoom. scroll-position */ GHashTable *properties; /* state of elements (wires and machines) as BtSetupConnectionState */ GHashTable *connection_state; GList *machines_to_add,*wires_to_add,*machines_to_del,*wires_to_del; /* depth in the graph, master=0, wires odd, machines even numbers */ GHashTable *graph_depth; /* list of blocked pads, to unlock after updates */ #ifdef USE_PAD_BLOCK GSList *blocked_pads; #endif GList *elements_to_play,*elements_to_stop; /* see/newsegment event for dynamically added elements */ GstEvent *play_seek_event; GstEvent *play_newsegment_event; }; static guint signals[LAST_SIGNAL]={0,}; //-- the class static void bt_setup_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSetup, bt_setup, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_setup_persistence_interface_init)); //-- constructor methods /** * bt_setup_new: * @song: the song the new instance belongs to * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtSetup *bt_setup_new(const BtSong * const song) { return(BT_SETUP(g_object_new(BT_TYPE_SETUP,"song",song,NULL))); } //-- private methods static void set_disconnected(const BtSetup * const self, GstBin *bin) { BtSetupConnectionState state=GET_CONNECTION_STATE(self,bin); if(state==0 || state==CS_DISCONNECTING) { g_hash_table_insert(self->priv->connection_state,(gpointer)bin,GINT_TO_POINTER(CS_DISCONNECTED)); } else if(state==CS_CONNECTING) { GST_WARNING_OBJECT(bin,"disallowed state-change from connecting to disconnected"); } else if(state==CS_CONNECTED) { GST_WARNING_OBJECT(bin,"disallowed state-change from connected to disconnected"); } } static void set_disconnecting(const BtSetup * const self, GstBin *bin) { BtSetupConnectionState state=GET_CONNECTION_STATE(self,bin); if(state==CS_CONNECTED) { g_hash_table_insert(self->priv->connection_state,(gpointer)bin,GINT_TO_POINTER(CS_DISCONNECTING)); } else if(state==CS_CONNECTING) { GST_WARNING_OBJECT(bin,"disallowed state-change from connecting to disconnecting"); } } static void set_connecting(const BtSetup * const self, GstBin *bin) { BtSetupConnectionState state=GET_CONNECTION_STATE(self,bin); if(state==CS_DISCONNECTED) { g_hash_table_insert(self->priv->connection_state,(gpointer)bin,GINT_TO_POINTER(CS_CONNECTING)); } else if(state==CS_DISCONNECTING) { GST_WARNING_OBJECT(bin,"disallowed state-change from disconnecting to connecting"); } } static void set_connected(const BtSetup * const self, GstBin *bin) { BtSetupConnectionState state=GET_CONNECTION_STATE(self,bin); if(state==CS_CONNECTING) { g_hash_table_insert(self->priv->connection_state,(gpointer)bin,GINT_TO_POINTER(CS_CONNECTED)); } else if(state==CS_DISCONNECTING) { GST_WARNING_OBJECT(bin,"disallowed state-change from disconnecting to connected"); } else if(state==CS_DISCONNECTED) { GST_WARNING_OBJECT(bin,"disallowed state-change from disconnected to connected"); } } /* * bt_setup_get_wire_by_machine_type: * @self: the setup to search for the wire * @machine: the machine that is at the src or dst of the wire * @type: the type name (src or dst) that the given machine should have in the wire * * Searches for the first wire in setup that uses the given #BtMachine as the given * type. * In other words - it returns the first wire that has the the given #BtMachine as * the given type. * * Returns: the #BtWire or %NULL */ static BtWire *bt_setup_get_wire_by_machine_type(const BtSetup * const self, const BtMachine * const machine, const gchar * const type) { gboolean found=FALSE; BtMachine * const search_machine; GList *node; for(node=self->priv->wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,type,&search_machine,NULL); if(search_machine==machine) found=TRUE; g_object_unref(search_machine); if(found) return(g_object_ref(wire)); } GST_DEBUG("no wire found for %s-machine %p",type,machine); return(NULL); } /* * bt_setup_get_wires_by_machine_type: * @self: the setup to search for the wires * @machine: the machine that is at the src or dst of the wire * @type: the type name (src or dst) that the given machine should have in the wire * * Searches for all wires in setup that uses the given #BtMachine as the given * type. * * Returns: a #GList with the #BtWires or %NULL */ static GList *bt_setup_get_wires_by_machine_type(const BtSetup * const self,const BtMachine * const machine, const gchar * const type) { GList *wires=NULL,*node; BtMachine * const search_machine; for(node=self->priv->wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,type,&search_machine,NULL); if(search_machine==machine) { wires=g_list_prepend(wires,g_object_ref(wire)); } g_object_unref(search_machine); } return(wires); } static gboolean link_wire(const BtSetup * const self,GstElement *wire,GstElement *src_machine,GstElement *dst_machine) { GstPadLinkReturn link_res; GstPad *src_pad,*dst_pad,*peer; gboolean res=TRUE; // link start of wire dst_pad=gst_element_get_static_pad(GST_ELEMENT(wire),"sink"); GST_INFO_OBJECT(dst_pad,"linking start of wire"); if(!(peer=gst_pad_get_peer(dst_pad))) { if((src_pad=gst_element_get_request_pad(GST_ELEMENT(src_machine),"src%d"))) { #if USE_PAD_BLOCK if(/*(BT_IS_SOURCE_MACHINE(src_machine) && (GST_STATE(self->priv->bin)==GST_STATE_PLAYING)) ||*/ (GST_STATE(src_machine)==GST_STATE_PLAYING)) { if(gst_pad_is_active(src_pad)) { if(gst_pad_set_blocked(src_pad,TRUE)) { self->priv->blocked_pads=g_slist_prepend(self->priv->blocked_pads,gst_object_ref(src_pad)); } } } #endif if(GST_PAD_LINK_FAILED(link_res=gst_pad_link(src_pad,dst_pad))) { GST_WARNING("Can't link start of wire : %s", bt_gst_debug_pad_link_return(link_res,src_pad,dst_pad)); res = FALSE; gst_element_release_request_pad(src_machine,src_pad); // @todo: unblock the pad } } else { GST_WARNING_OBJECT(src_machine,"Can't get request pad for src-peer of start of wire"); res = FALSE; } } else { GST_INFO("start of wire is already linked"); gst_object_unref(peer); } gst_object_unref(dst_pad); if (!res) goto Error; // link end of wire src_pad=gst_element_get_static_pad(GST_ELEMENT(wire),"src"); GST_INFO_OBJECT(src_pad,"linking end of wire"); if(!(peer=gst_pad_get_peer(src_pad))) { if((dst_pad=gst_element_get_request_pad(GST_ELEMENT(dst_machine),"sink%d"))) { if(GST_PAD_LINK_FAILED(link_res=gst_pad_link(src_pad,dst_pad))) { GST_WARNING("Can't link end of wire : %s", bt_gst_debug_pad_link_return(link_res,src_pad,dst_pad)); res=FALSE; gst_element_release_request_pad(dst_machine,dst_pad); } } else { GST_WARNING_OBJECT(dst_machine,"Can't get request pad for sink-peer of end of wire"); res=FALSE; } } else { GST_INFO("end of wire is already linked"); gst_object_unref(peer); } gst_object_unref(src_pad); Error: return res; } static void unlink_wire(const BtSetup * const self,GstElement *wire,GstElement *src_machine,GstElement *dst_machine) { GstPad *src_pad,*dst_pad; // unlink end of wire src_pad=gst_element_get_static_pad(wire,"src"); GST_INFO_OBJECT(src_pad,"unlinking end of wire"); if((dst_pad=gst_pad_get_peer(src_pad))) { gst_pad_unlink(src_pad,dst_pad); gst_pad_send_event(dst_pad, gst_event_new_eos()); GST_INFO_OBJECT(dst_pad,"sent eos event"); gst_element_release_request_pad(dst_machine,dst_pad); // unref twice: one for gst_pad_get_peer() and once for the request_pad gst_object_unref(dst_pad);gst_object_unref(dst_pad); } else { GST_WARNING_OBJECT(src_pad, "wire is not linked to dst %s", GST_OBJECT_NAME(dst_machine)); } gst_object_unref(src_pad); // unlink start of wire dst_pad=gst_element_get_static_pad(wire,"sink"); GST_INFO_OBJECT(dst_pad,"unlinking start of wire"); if((src_pad=gst_pad_get_peer(dst_pad))) { #ifdef USE_PAD_BLOCK if(/*(BT_IS_SOURCE_MACHINE(src_machine) && (GST_STATE(self->priv->bin)==GST_STATE_PLAYING)) ||*/ (GST_STATE(src_machine)==GST_STATE_PLAYING)) { GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS(self->priv->bin, GST_DEBUG_GRAPH_SHOW_ALL, PACKAGE_NAME); // this causes trouble if the pads are flushing and/or GST_PAD_ACTIVATE_MODE(pad)==GST_ACTIVATE_NONE // check using gst_pad_is_active //if(!GST_OBJECT_FLAG_IS_SET (dst_pad, GST_PAD_FLUSHING) && !GST_OBJECT_FLAG_IS_SET (src_pad, GST_PAD_FLUSHING)) { if(gst_pad_is_active(src_pad)) { // if we remove the element the pads go flushing and that unblocks // we ref the pad anyway to be able to unblock it later too // otherwise we'd need week refs to zero/remove the element in the list if(gst_pad_set_blocked(src_pad,TRUE)) { self->priv->blocked_pads=g_slist_prepend(self->priv->blocked_pads,gst_object_ref(src_pad)); } } } #endif gst_pad_unlink(src_pad,dst_pad); gst_element_release_request_pad(src_machine,src_pad); // unref twice: one for gst_pad_get_peer() and once for the request_pad gst_object_unref(src_pad);gst_object_unref(src_pad); } else { GST_WARNING_OBJECT(dst_pad, "wire is not linked to src %s", GST_OBJECT_NAME(src_machine)); } gst_object_unref(dst_pad); } /* * update_bin_in_pipeline: * @self: the setup object * * Add or remove machine or wires to/from the main pipeline. */ static gboolean update_bin_in_pipeline(const BtSetup * const self,GstBin *bin,gboolean is_connected,GList **not_visited) { gboolean is_added=(GST_OBJECT_PARENT(bin)!=NULL); if(not_visited) { *not_visited=g_list_remove(*not_visited,(gconstpointer)bin); } GST_INFO_OBJECT(bin,"update object : connected=%d, added=%d", is_connected,is_added); if(is_connected) { if(!is_added) { gst_bin_add(self->priv->bin,GST_ELEMENT(bin)); } } else { if(is_added) { gst_object_ref(GST_OBJECT(bin)); gst_bin_remove(self->priv->bin,GST_ELEMENT(bin)); GST_OBJECT_FLAG_SET(bin,GST_OBJECT_FLOATING); } } return(TRUE); } /* * check_connected: * @self: the setup object * @dst_machine: the machine to start with, usually the master * @depth: graph depth * * Check if a machine is connected. It recurses up on the machines input side. * Its adds connected machines and wires to the song and removed unconnected * ones. It links connected bins and unlinks unconnected ones. * * Returns: %TRUE if there is a connection to a src. */ static gboolean check_connected(const BtSetup * const self,BtMachine *dst_machine,GList **not_visited_machines,GList **not_visited_wires,gint depth) { gboolean is_connected=FALSE,wire_is_connected; BtWire *wire; BtMachine *src_machine; GList *node; SET_GRAPH_DEPTH(self,dst_machine,depth); GST_INFO_OBJECT(dst_machine,"check %d incoming wires",g_list_length(dst_machine->dst_wires)); for(node=dst_machine->dst_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); SET_GRAPH_DEPTH(self,wire,depth+1); // check if wire is marked for removal if(GET_CONNECTION_STATE(self,wire)!=CS_DISCONNECTING) { wire_is_connected=FALSE; g_object_get(wire,"src",&src_machine,NULL); if(BT_IS_SOURCE_MACHINE(src_machine)) { SET_GRAPH_DEPTH(self,src_machine,depth+2); /* for source machine we can stop the recurssion */ wire_is_connected=TRUE; *not_visited_machines=g_list_remove(*not_visited_machines,(gconstpointer)src_machine); } else { /* for processor machine we might need to look further, * but if machine is not in not_visited_machines anymore, * check if it is added or not and return */ BtSetupConnectionState state=GET_CONNECTION_STATE(self,src_machine); if((!g_list_find(*not_visited_machines,src_machine)) && (state==CS_CONNECTING || state==CS_CONNECTED)) { wire_is_connected=TRUE; } else { wire_is_connected|=check_connected(self,src_machine,not_visited_machines,not_visited_wires,depth+2); } } GST_INFO_OBJECT(src_machine,"wire target checked, connected=%d?",wire_is_connected); if(!wire_is_connected) { set_disconnecting(self,GST_BIN(wire)); set_disconnecting(self,GST_BIN(src_machine)); } if(wire_is_connected) { if(!is_connected) { set_connecting(self,GST_BIN(dst_machine)); } set_connecting(self,GST_BIN(src_machine)); set_connecting(self,GST_BIN(wire)); } else { GST_INFO("skip disconnecting wire"); } is_connected|=wire_is_connected; g_object_unref(src_machine); } else { GST_INFO_OBJECT(src_machine,"wire target checked, connected=0?"); } *not_visited_wires=g_list_remove(*not_visited_wires,(gconstpointer)wire); } if(!is_connected) { set_disconnecting(self,GST_BIN(dst_machine)); } *not_visited_machines=g_list_remove(*not_visited_machines,(gconstpointer)dst_machine); GST_INFO("all wire targets checked, connected=%d?",is_connected); return(is_connected); } static void update_play_seek_event(const BtSetup *self) { BtSequence *sequence; gboolean loop; glong loop_end,length; gulong play_pos; GstClockTime bar_time; GstClockTime start, stop; bt_song_update_playback_position(self->priv->song); g_object_get(self->priv->song,"sequence",&sequence,"play-pos",&play_pos,NULL); g_object_get(sequence,"loop",&loop,"loop-end",&loop_end,"length",&length,NULL); bar_time=bt_sequence_get_bar_time(sequence); start=play_pos*bar_time; // configure self->priv->play_seek_event (sent to newly activated elements) if (loop) { stop=(loop_end+0)*bar_time; self->priv->play_seek_event=gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); } else { stop=(length+1)*bar_time; self->priv->play_seek_event=gst_event_new_seek(1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, stop); } self->priv->play_newsegment_event=gst_event_new_new_segment(FALSE, 1.0, GST_FORMAT_TIME, start, stop, start); g_object_unref(sequence); } static gint sort_by_graph_depth_asc(gconstpointer e1, gconstpointer e2,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); gint d1=GET_GRAPH_DEPTH(self,e1); gint d2=GET_GRAPH_DEPTH(self,e2); return(d1-d2); } static gint sort_by_graph_depth_desc(gconstpointer e1, gconstpointer e2,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); gint d1=GET_GRAPH_DEPTH(self,e1); gint d2=GET_GRAPH_DEPTH(self,e2); return(d1-d2); } static void prepare_add_del(gpointer key,gpointer value,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); if(GPOINTER_TO_INT(value)==CS_CONNECTING) { if(BT_IS_MACHINE(key)) { self->priv->machines_to_add=g_list_insert_sorted_with_data(self->priv->machines_to_add,key,sort_by_graph_depth_asc,(gpointer)self); } else { self->priv->wires_to_add=g_list_insert_sorted_with_data(self->priv->wires_to_add,key,sort_by_graph_depth_asc,(gpointer)self); } } else if(GPOINTER_TO_INT(value)==CS_DISCONNECTING) { if(BT_IS_MACHINE(key)) { self->priv->machines_to_del=g_list_insert_sorted_with_data(self->priv->machines_to_del,key,sort_by_graph_depth_desc,(gpointer)self); } else { self->priv->wires_to_del=g_list_insert_sorted_with_data(self->priv->wires_to_del,key,sort_by_graph_depth_desc,(gpointer)self); } } } static void add_machine_in_pipeline(gpointer key,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); GST_INFO_OBJECT(key,"add machine"); update_bin_in_pipeline(self,GST_BIN(key),TRUE,NULL); } static void add_wire_in_pipeline(gpointer key,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); GstElement *src,*dst; GST_INFO_OBJECT(key,"add & link wire"); update_bin_in_pipeline(self,GST_BIN(key),TRUE,NULL); g_object_get(key,"src",&src,"dst",&dst,NULL); link_wire(self,GST_ELEMENT(key),src,dst); // @todo: what to do if it fails? We should always be able to link in theory // maybe dump extensive diagnostics to add debugging g_object_unref(src); g_object_unref(dst); } static void del_wire_in_pipeline(gpointer key,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); GstElement *src,*dst; GST_INFO_OBJECT(key,"remove & unlink wire"); g_object_get(key,"src",&src,"dst",&dst,NULL); unlink_wire(self,GST_ELEMENT(key),src,dst); g_object_unref(src); g_object_unref(dst); update_bin_in_pipeline(self,GST_BIN(key),FALSE,NULL); } static void del_machine_in_pipeline(gpointer key,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); GST_INFO_OBJECT(key,"remove machine"); update_bin_in_pipeline(self,GST_BIN(key),FALSE,NULL); } static void determine_state_change_lists(gpointer key,gpointer value,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); if(GPOINTER_TO_INT(value)==CS_CONNECTING) { // list starts with elements close to the sink GST_DEBUG_OBJECT(GST_OBJECT(key),"added to play list with depth=%d",GET_GRAPH_DEPTH(self,key)); self->priv->elements_to_play=g_list_insert_sorted_with_data(self->priv->elements_to_play,key,sort_by_graph_depth_asc,(gpointer)self); } else if(GPOINTER_TO_INT(value)==CS_DISCONNECTING) { // list starts with elements away from the sink GST_DEBUG_OBJECT(GST_OBJECT(key),"added to stop list with depth=%d",GET_GRAPH_DEPTH(self,key)); self->priv->elements_to_stop=g_list_insert_sorted_with_data(self->priv->elements_to_stop,key,sort_by_graph_depth_desc,(gpointer)self); } } static void activate_element(const BtSetup * const self,gpointer key) { gst_element_set_locked_state(GST_ELEMENT(key),FALSE); if(GST_STATE(GST_OBJECT_PARENT(GST_OBJECT(key)))==GST_STATE_PLAYING) { GST_INFO_OBJECT(GST_OBJECT(key),"set from %s to %s", gst_element_state_get_name(GST_STATE(key)), gst_element_state_get_name(GST_STATE_PLAYING)); if(BT_IS_SOURCE_MACHINE(key)) { // @todo: this is causing the lockups in the tests under valgrind // it is not the flush-flag of the seek // collect-pads needs a newsegment to define the segment on the pad for the clipfunc // seek in ready will ensure it, but is somewhat non-standard // as a downside, we run into trouble at segment done // we're trying to address that with the newsegment below, // but that only needs to be send to the active part we're linking to // see adder-patch, gst-plugins-base: 0cce8ab97d614ef53970292bd403e7f4460d79f9 gst_element_set_state(GST_ELEMENT(key),GST_STATE_READY); if(!(gst_element_send_event(GST_ELEMENT(key),gst_event_ref(self->priv->play_seek_event)))) { GST_WARNING_OBJECT(key,"failed to handle seek event"); } GST_INFO_OBJECT(key,"sent seek event"); } else { if(!(gst_element_send_event(GST_ELEMENT(key),gst_event_ref(self->priv->play_newsegment_event)))) { GST_WARNING_OBJECT(key,"failed to handle newsegment event"); } GST_INFO_OBJECT(key,"sent newsegment event"); } gst_element_set_state(GST_ELEMENT(key),GST_STATE_PLAYING); } } static void deactivate_element(const BtSetup * const self,gpointer key) { gst_element_set_locked_state(GST_ELEMENT(key),TRUE); if(GST_STATE(GST_OBJECT_PARENT(GST_OBJECT(key)))==GST_STATE_PLAYING) { GST_INFO_OBJECT(GST_OBJECT(key),"set from %s to %s", gst_element_state_get_name(GST_STATE(key)), gst_element_state_get_name(GST_STATE_PAUSED)); gst_element_set_state(GST_ELEMENT(key),GST_STATE_READY); } } static void sync_states(const BtSetup * const self) { GList *node; if(self->priv->elements_to_play) { GST_INFO("starting elements"); #ifndef GST_DISABLE_DEBUG for(node=self->priv->elements_to_play;node;node=g_list_next(node)) { GST_INFO_OBJECT(GST_OBJECT(node->data),"will be set from %s to %s, depth=%d", gst_element_state_get_name(GST_STATE(node->data)), gst_element_state_get_name(GST_STATE(GST_OBJECT_PARENT(GST_OBJECT(node->data)))), GET_GRAPH_DEPTH(self,node->data)); } #endif for(node=self->priv->elements_to_play;node;node=g_list_next(node)) { activate_element(self,node->data); } g_list_free(self->priv->elements_to_play); self->priv->elements_to_play=NULL; } if(self->priv->elements_to_stop) { GST_INFO("stoping elements"); #ifndef GST_DISABLE_DEBUG for(node=self->priv->elements_to_stop;node;node=g_list_next(node)) { GST_INFO_OBJECT(GST_OBJECT(node->data),"will be set from %s to %s, depth=%d", gst_element_state_get_name(GST_STATE(node->data)), gst_element_state_get_name(GST_STATE_PAUSED), GET_GRAPH_DEPTH(self,node->data)); } #endif for(node=self->priv->elements_to_stop;node;node=g_list_next(node)) { deactivate_element(self,node->data); } g_list_free(self->priv->elements_to_stop); self->priv->elements_to_stop=NULL; } } static void update_connection_states(gpointer key,gpointer value,gpointer user_data) { const BtSetup * const self=BT_SETUP(user_data); #ifndef GST_DISABLE_GST_DEBUG gchar *states[]={"-","disconnected","disconnecting","connecting","connected"}; GST_INFO_OBJECT(key,"%s",states[GPOINTER_TO_INT(value)]); #endif if(GPOINTER_TO_INT(value)==CS_CONNECTING) { set_connected(self,GST_BIN(key)); } else if(GPOINTER_TO_INT(value)==CS_DISCONNECTING) { set_disconnected(self,GST_BIN(key)); } } static void update_pipeline(const BtSetup * const self) { GST_INFO("updating pipeline ----------------------------------------"); // do *one* g_hash_table_foreach and topologically sort machines and wires into 4 lists g_hash_table_foreach(self->priv->connection_state,prepare_add_del,(gpointer)self); GST_INFO("adding m=%d, w=%d and removing m=%d, w=%d", g_list_length(self->priv->machines_to_add),g_list_length(self->priv->wires_to_add), g_list_length(self->priv->machines_to_del),g_list_length(self->priv->wires_to_del)); // query segment and position update_play_seek_event(self); // {add|del}_wire_in_pipeline can add pads to the self->priv->blocked_pads list // from {link|unlink}_wire. this is more complicated that it needs to be. // // 1.) when (un)linking a sink pad on an active element hat operates in // push mode, we only need to block the most downstream src-pad // (either g_list_first(wires_to_add):src or g_list_last(wires_to_del):src) // 2.) when (un)linking a src pad on an active element hat operates in push // mode, we only need to block the pad itself // // 3.) we either add or remove stuff on exactly on pad at a time in practise // // this should make it easier to split the update into two parts to correctly // handle the async pad blocking GST_INFO("add machines"); g_list_foreach(self->priv->machines_to_add,add_machine_in_pipeline,(gpointer)self); GST_INFO("add and link wires"); g_list_foreach(self->priv->wires_to_add,add_wire_in_pipeline,(gpointer)self); // if we have blocked pads, we would need to ensure here, that the blocking is done // builds elements_to_{play|stop} lists GST_INFO("determine state change lists"); g_hash_table_foreach(self->priv->connection_state,determine_state_change_lists,(gpointer)self); // apply state changes for the above lists GST_INFO("sync states"); sync_states(self); GST_INFO("unlink and remove wires"); g_list_foreach(self->priv->wires_to_del,del_wire_in_pipeline,(gpointer)self); GST_INFO("remove machines"); g_list_foreach(self->priv->machines_to_del,del_machine_in_pipeline,(gpointer)self); // free the lists g_list_free(self->priv->machines_to_add); self->priv->machines_to_add=NULL; g_list_free(self->priv->wires_to_add); self->priv->wires_to_add=NULL; g_list_free(self->priv->machines_to_del); self->priv->machines_to_del=NULL; g_list_free(self->priv->wires_to_del); self->priv->wires_to_del=NULL; #ifdef USE_PAD_BLOCK // unblock src pads // @todo: can this actually ever be >1? we update the pipeline on wire // changes, we can only add or remove one wire at a time // only the src-pad that is (dis)connected to/from the active part needs to be blocked GST_INFO("unblocking %d pads",g_slist_length(self->priv->blocked_pads)); GSList *node; for(node=self->priv->blocked_pads;node;node=g_slist_next(node)) { gst_pad_set_blocked(GST_PAD(node->data),FALSE); gst_object_unref(GST_OBJECT(node->data)); } g_slist_free(self->priv->blocked_pads); self->priv->blocked_pads=NULL; #endif GST_INFO("update connection states"); g_hash_table_foreach(self->priv->connection_state,update_connection_states,(gpointer)self); GST_INFO("pipeline updated ----------------------------------------"); gst_event_replace(&self->priv->play_seek_event,NULL); gst_event_replace(&self->priv->play_newsegment_event,NULL); } /* * bt_setup_update_pipeline: * * Rebuilds the whole pipeline, after changing the setup (adding/removing and * linking/unlinking machines). */ static gboolean bt_setup_update_pipeline(const BtSetup * const self) { gboolean res=FALSE; BtMachine *master; // get master if((master=bt_setup_get_machine_by_type(self,BT_TYPE_SINK_MACHINE))) { GList *not_visited_machines,*not_visited_wires,*node; BtWire *wire; BtMachine *machine; // make a copy of lists and remove all visited items not_visited_machines=g_list_copy(self->priv->machines); not_visited_wires=g_list_copy(self->priv->wires); GST_INFO("checking connections for %d machines and %d wires", g_list_length(not_visited_machines), g_list_length(not_visited_wires)); // ... and start checking connections (recursively) res=check_connected(self,master,¬_visited_machines,¬_visited_wires,0); // remove all items that we have not visited and set them to disconnected GST_INFO("remove %d unconnected wires", g_list_length(not_visited_wires)); for(node=not_visited_wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); set_disconnecting(self,GST_BIN(wire)); } g_list_free(not_visited_wires); GST_INFO("remove %d unconnected machines", g_list_length(not_visited_machines)); for(node=not_visited_machines;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); set_disconnecting(self,GST_BIN(machine)); } g_list_free(not_visited_machines); update_pipeline(self); g_object_unref(master); } GST_INFO("result of graph update = %d",res); return(res); } //-- public methods /** * bt_setup_add_machine: * @self: the setup to add the machine to * @machine: the new machine instance * * Let the setup know that the supplied machine is now part of the song. * * Returns: return true, if the machine can be added. Returns false if the * machine is currently added to the setup. */ gboolean bt_setup_add_machine(const BtSetup * const self, const BtMachine * const machine) { gboolean ret=FALSE; g_return_val_if_fail(BT_IS_SETUP(self),FALSE); g_return_val_if_fail(BT_IS_MACHINE(machine),FALSE); GST_DEBUG("added machine: %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); if(!g_list_find(self->priv->machines,machine)) { ret=TRUE; self->priv->machines=g_list_prepend(self->priv->machines,g_object_ref((gpointer)machine)); set_disconnected(self,GST_BIN(machine)); g_signal_emit((gpointer)self,signals[MACHINE_ADDED_EVENT], 0, machine); GST_DEBUG("added machine: %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); } else { GST_WARNING("trying to add machine %p again",machine); } return ret; } /** * bt_setup_add_wire: * @self: the setup to add the wire to * @wire: the new wire instance * * Let the setup know that the supplied wire is now part of the song. * * Returns: returns true, if the wire is added. Returns false, if the setup * contains a wire witch is link between the same src and dst machines (cycle * check). */ gboolean bt_setup_add_wire(const BtSetup * const self, const BtWire * const wire) { gboolean ret=FALSE; g_return_val_if_fail(BT_IS_SETUP(self),FALSE); g_return_val_if_fail(BT_IS_WIRE(wire),FALSE); // avoid adding same wire twice, we're checking for unique wires when creating // them already if(!g_list_find(self->priv->wires,wire)) { BtMachine *src,*dst; // add to main list self->priv->wires=g_list_prepend(self->priv->wires,g_object_ref((gpointer)wire)); // also add to convenience lists per machine g_object_get((gpointer)wire,"src",&src,"dst",&dst,NULL); src->src_wires=g_list_prepend(src->src_wires,(gpointer)wire); dst->dst_wires=g_list_prepend(dst->dst_wires,(gpointer)wire); set_disconnected(self,GST_BIN(wire)); bt_setup_update_pipeline(self); g_signal_emit((gpointer)self,signals[WIRE_ADDED_EVENT], 0, wire); GST_DEBUG("added wire: %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); g_object_unref(src); g_object_unref(dst); ret=TRUE; } else { GST_WARNING("trying to add wire %p again",wire); } return ret; } /** * bt_setup_remove_machine: * @self: the setup to remove the machine from * @machine: the machine instance to remove * * Let the setup know that the supplied machine is removed from the song. */ void bt_setup_remove_machine(const BtSetup * const self, const BtMachine * const machine) { GList *node; g_return_if_fail(BT_IS_SETUP(self)); g_return_if_fail(BT_IS_MACHINE(machine)); GST_DEBUG("trying to remove machine: %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); if((node=g_list_find(self->priv->machines,machine))) { self->priv->machines=g_list_delete_link(self->priv->machines,node); GST_DEBUG("signaling removal of machine: %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); g_signal_emit((gpointer)self,signals[MACHINE_REMOVED_EVENT], 0, machine); g_hash_table_remove(self->priv->connection_state,(gpointer)machine); g_hash_table_remove(self->priv->graph_depth,(gpointer)machine); GST_DEBUG("removing machine: %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); // this triggers finalize if we don't have a ref gst_element_set_state(GST_ELEMENT(machine),GST_STATE_NULL); if(!GST_OBJECT_FLAG_IS_SET(machine,GST_OBJECT_FLOATING)) { gst_object_ref(GST_OBJECT(machine)); gst_bin_remove(self->priv->bin,GST_ELEMENT(machine)); GST_OBJECT_FLAG_SET(machine,GST_OBJECT_FLOATING); } gst_object_unref(GST_OBJECT(machine)); } else { GST_WARNING("trying to remove machine that is not in setup"); } } /** * bt_setup_remove_wire: * @self: the setup to remove the wire from * @wire: the wire instance to remove * * Let the setup know that the supplied wire is removed from the song. */ void bt_setup_remove_wire(const BtSetup * const self, const BtWire * const wire) { GList *node; g_return_if_fail(BT_IS_SETUP(self)); g_return_if_fail(BT_IS_WIRE(wire)); GST_DEBUG("trying to remove wire: %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); if((node=g_list_find(self->priv->wires,wire))) { BtMachine *src,*dst; // also remove from the convenience lists g_object_get((gpointer)wire,"src",&src,"dst",&dst,NULL); src->src_wires=g_list_remove(src->src_wires,wire); dst->dst_wires=g_list_remove(dst->dst_wires,wire); g_object_unref(src); g_object_unref(dst); set_disconnecting(self,GST_BIN(wire)); bt_setup_update_pipeline(self); self->priv->wires=g_list_delete_link(self->priv->wires,node); GST_DEBUG("signaling removal of wire: %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); g_signal_emit((gpointer)self,signals[WIRE_REMOVED_EVENT], 0, wire); g_hash_table_remove(self->priv->connection_state,(gpointer)wire); g_hash_table_remove(self->priv->graph_depth,(gpointer)wire); GST_DEBUG("removing wire: %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); gst_element_set_state(GST_ELEMENT(wire),GST_STATE_NULL); // this triggers finalize if we don't have a ref if(!GST_OBJECT_FLAG_IS_SET(wire,GST_OBJECT_FLOATING)) { gst_object_ref(GST_OBJECT(wire)); gst_bin_remove(self->priv->bin,GST_ELEMENT(wire)); GST_OBJECT_FLAG_SET(wire,GST_OBJECT_FLOATING); } gst_object_unref(GST_OBJECT(wire)); } else { GST_WARNING("trying to remove wire that is not in setup"); } } /** * bt_setup_get_machine_by_id: * @self: the setup to search for the machine * @id: the identifier of the machine * * Search the setup for a machine by the supplied id. * The machine must have been added previously to this setup with bt_setup_add_machine(). * Unref the machine, when done with it. * * Returns: #BtMachine instance or %NULL if not found */ BtMachine *bt_setup_get_machine_by_id(const BtSetup * const self, const gchar * const id) { gboolean found=FALSE; gchar * const machine_id; const GList* node; g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_STRING(id),NULL); /* find_by_property(gpointer item,gpointer data) { GValue value; g_object_get_property(item,data.key,&value); //a) compare via strcmp(find_by_property(value),find_by_property(data.compare_value)); //b) switch(g_value_get_type(value)) { // G_TYPE_STRING: strcmp(value,data.compare_value); // default: value==data.compare_value; // } //-> what about: gst_value_compare() // @todo method puts key into a gvalue and gets the param-spec by name, then calls generalized search //-> what about: g_param_values_cmp() } struct { gchar *key; GValue compare_value; } data; g_value_init(data.compare_value, G_TYPE_STRING); g_value_set_string(data.compare_value,id); data.key="id"; node = g_list_find_custom(self->priv->machines, data, find_by_property); if(node) return(BT_MACHINE(node->data); */ for(node=self->priv->machines;node;node=g_list_next(node)) { BtMachine * const machine=BT_MACHINE(node->data); g_object_get(machine,"id",&machine_id,NULL); if(!strcmp(machine_id,id)) found=TRUE; g_free(machine_id); if(found) { GST_DEBUG(" getting machine (%s): %p,ref_count %d",id,machine,G_OBJECT_REF_COUNT(machine)); return(g_object_ref(machine)); } } GST_DEBUG("no machine found for id \"%s\"",id); return(NULL); } /** * bt_setup_get_machine_by_type: * @self: the setup to search for the machine * @type: the gobject type (sink,processor,source) * * Search the setup for the first machine with the given type. * The machine must have been added previously to this setup with bt_setup_add_machine(). * Unref the machine, when done with it. * * Returns: #BtMachine instance or %NULL if not found */ BtMachine *bt_setup_get_machine_by_type(const BtSetup * const self, const GType type) { const GList *node; g_return_val_if_fail(BT_IS_SETUP(self),NULL); for(node=self->priv->machines;node;node=g_list_next(node)) { BtMachine * const machine=BT_MACHINE(node->data); if(G_OBJECT_TYPE(machine)==type) { return(g_object_ref(machine)); } } GST_DEBUG("no machine found for this type"); return(NULL); } /** * bt_setup_get_machines_by_type: * @self: the setup to search for the machine * @type: the gobject type (sink,processor,source) * * Gathers all machines of the given type from the setup. * Free the list (and unref the machines), when done with it. * * Returns: the list instance or %NULL if not found */ GList *bt_setup_get_machines_by_type(const BtSetup * const self, const GType type) { GList *machines=NULL; const GList * node; g_return_val_if_fail(BT_IS_SETUP(self),NULL); for(node=self->priv->machines;node;node=g_list_next(node)) { BtMachine * const machine=BT_MACHINE(node->data); if(G_OBJECT_TYPE(machine)==type) { machines=g_list_prepend(machines,g_object_ref(machine)); } } return(machines); } // @todo: remove this, use machine->dst_wires list instead /** * bt_setup_get_wire_by_src_machine: * @self: the setup to search for the wire * @src: the machine that is at the src end of the wire * * Searches for the first wire in setup that uses the given #BtMachine as a source. * In other words - it returns the first wire that starts at the given #BtMachine. * Unref the wire, when done with it. * * Returns: the #BtWire or %NULL */ BtWire *bt_setup_get_wire_by_src_machine(const BtSetup * const self, const BtMachine * const src) { g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(src),NULL); return(bt_setup_get_wire_by_machine_type(self,src,"src")); } // @todo: remove this, use machine->src_wires list instead /** * bt_setup_get_wire_by_dst_machine: * @self: the setup to search for the wire * @dst: the machine that is at the dst end of the wire * * Searches for the first wire in setup that uses the given #BtMachine as a target. * In other words - it returns the first wire that ends at the given #BtMachine. * Unref the wire, when done with it. * * Returns: the #BtWire or %NULL */ BtWire *bt_setup_get_wire_by_dst_machine(const BtSetup *const self, const BtMachine * const dst) { g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(dst),NULL); return(bt_setup_get_wire_by_machine_type(self,dst,"dst")); } // @todo: remove this, use bt_machine_get_wire_by_dst_machine() instead /** * bt_setup_get_wire_by_machines: * @self: the setup to search for the wire * @src: the machine that is at the src end of the wire * @dst: the machine that is at the dst end of the wire * * Searches for a wire in setup that uses the given #BtMachine instances as a * source and dest. * Unref the wire, when done with it. * * Returns: the #BtWire or NULL */ BtWire *bt_setup_get_wire_by_machines(const BtSetup * const self, const BtMachine * const src, const BtMachine * const dst) { gboolean found=FALSE; BtMachine * const machine; const GList *node; g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(src),NULL); g_return_val_if_fail(BT_IS_MACHINE(dst),NULL); // either src or dst has no wires if(!src->src_wires || !dst->dst_wires) return(NULL); // check if src links to dst // ideally we would search the shorter of the lists // FIXME: this also does not really need the setup object ... // -> change to // bt_machine_get_wire_by_{src,dst}(machine,peer_machine); for(node=src->src_wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,"dst",&machine,NULL); if(machine==dst) found=TRUE; g_object_unref(machine); if(found) return(g_object_ref(wire)); } #if 0 for(node=dst->dst_wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,"src",&machine,NULL); if(machine==src) found=TRUE; g_object_unref(machine); if(found) return(g_object_ref(wire)); } for(node=self->priv->wires;node;node=g_list_next(node)) { BtWire * const wire=BT_WIRE(node->data); g_object_get(wire,"src",&src_machine,"dst",&dst_machine,NULL); if((src_machine==src) && (dst_machine==dst)) found=TRUE; g_object_unref(src_machine); g_object_unref(dst_machine); if(found) return(g_object_ref(wire)); } #endif GST_DEBUG("no wire found for machines %p:%s %p:%s",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); return(NULL); } // @todo: remove this, use machine->dst_wires list instead /** * bt_setup_get_wires_by_src_machine: * @self: the setup to search for the wire * @src: the machine that is at the src end of the wire * * Searches for all wires in setup that use the given #BtMachine as a source. * Free the list (and unref the wires), when done with it. * * Returns: a #GList with the #BtWires or %NULL */ GList *bt_setup_get_wires_by_src_machine(const BtSetup * const self, const BtMachine * const src) { g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(src),NULL); return(bt_setup_get_wires_by_machine_type(self,src,"src")); } // @todo: remove this, use machine->src_wires list instead /** * bt_setup_get_wires_by_dst_machine: * @self: the setup to search for the wire * @dst: the machine that is at the dst end of the wire * * Searches for all wires in setup that use the given #BtMachine as a target. * Free the list (and unref the wires), when done with it. * * Returns: a #GList with the #BtWires or %NULL */ GList *bt_setup_get_wires_by_dst_machine(const BtSetup * const self, const BtMachine * const dst) { g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_MACHINE(dst),NULL); return(bt_setup_get_wires_by_machine_type(self,dst,"dst")); } /** * bt_setup_get_unique_machine_id: * @self: the setup for which the name should be unique * @base_name: the leading name part * * The function makes the supplied base_name unique in this setup by eventually * adding a number postfix. This method should be used when adding new machines. * * Returns: the newly allocated unique name */ gchar *bt_setup_get_unique_machine_id(const BtSetup * const self, const gchar * const base_name) { BtMachine *machine; guint8 i=0; g_return_val_if_fail(BT_IS_SETUP(self),NULL); g_return_val_if_fail(BT_IS_STRING(base_name),NULL); if(!(machine=bt_setup_get_machine_by_id(self,base_name))) { return(g_strdup(base_name)); } else { g_object_unref(machine); machine=NULL; } gchar * const id=g_strdup_printf("%s 00",base_name); gchar * const ptr=&id[strlen(base_name)+1]; do { (void)g_sprintf(ptr,"%02u",i++); g_object_try_unref(machine); } while((machine=bt_setup_get_machine_by_id(self,id)) && (i<100)); g_object_try_unref(machine); return(id); } /** * bt_setup_remember_missing_machine: * @self: the setup * @str: human readable description of the missing machine * * Loaders can use this function to collect information about machines that * failed to load. * The front-end can access this later by reading BtSetup::missing-machines * property. */ void bt_setup_remember_missing_machine(const BtSetup * const self, const gchar * const str) { gboolean skip = FALSE; GST_INFO("missing machine %s",str); if(self->priv->missing_machines) { GList *node; for(node=self->priv->missing_machines;node;node=g_list_next(node)) { if(!strcmp(node->data,str)) { skip=TRUE;break; } } } if(!skip) { self->priv->missing_machines=g_list_prepend(self->priv->missing_machines,(gpointer)str); } else { g_free((gchar *)str); } } //-- io interface static xmlNodePtr bt_setup_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { BtSetup * const self = BT_SETUP(persistence); xmlNodePtr node=NULL; xmlNodePtr child_node; GST_DEBUG("PERSISTENCE::setup"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("setup"),NULL))) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("properties"),NULL))) { if(!bt_persistence_save_hashtable(self->priv->properties, child_node)) goto Error; } else goto Error; if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("machines"),NULL))) { bt_persistence_save_list(self->priv->machines,child_node); } else goto Error; if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("wires"),NULL))) { bt_persistence_save_list(self->priv->wires,child_node); } else goto Error; } Error: return(node); } static BtPersistence *bt_setup_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtSetup * const self = BT_SETUP(persistence); xmlNodePtr child_node; gboolean failed_parts=FALSE; GST_DEBUG("PERSISTENCE::setup"); g_assert(node); for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { if(!strncmp((gchar *)node->name,"machines\0",9)) { GType type=0; //bt_song_io_native_load_setup_machines(self,song,node->children); for(child_node=node->children;child_node;child_node=child_node->next) { if(!xmlNodeIsText(child_node)) { /* @todo: it would be smarter to have nodes name like "sink-machine" * and do type=g_type_from_name((gchar *)child_node->name); */ if(!strncmp((gchar *)child_node->name,"machine\0",8)) { xmlChar * const type_str=xmlGetProp(child_node,XML_CHAR_PTR("type")); if(!strncmp((gchar *)type_str,"processor\0",10)) { type=BT_TYPE_PROCESSOR_MACHINE; } else if(!strncmp((gchar *)type_str,"sink\0",5)) { type=BT_TYPE_SINK_MACHINE; } else if(!strncmp((gchar *)type_str,"source\0",7)) { type=BT_TYPE_SOURCE_MACHINE; } else { GST_WARNING("machine node has no type"); } if(type) { GError *err=NULL; BtMachine *machine=BT_MACHINE(bt_persistence_load(type,NULL,child_node,&err,"song",self->priv->song,NULL)); if(err!=NULL) { // collect failed machines gchar * const plugin_name; g_object_get(machine,"plugin-name",&plugin_name,NULL); // takes ownership of the name bt_setup_remember_missing_machine(self,plugin_name); failed_parts=TRUE; GST_WARNING("Can't create machine: %s",err->message); g_error_free(err); } g_object_unref(machine); } xmlFree(type_str); } } } } else if(!strncmp((gchar *)node->name,"wires\0",6)) { for(child_node=node->children;child_node;child_node=child_node->next) { if(!xmlNodeIsText(child_node)) { GError *err=NULL; // @todo: rework construction BtWire * const wire=BT_WIRE(bt_persistence_load(BT_TYPE_WIRE,NULL,child_node,&err,"song",self->priv->song,NULL)); if(err!=NULL) { failed_parts=TRUE; GST_WARNING("Can't create wire: %s",err->message); g_error_free(err); } g_object_unref(wire); } } } else if(!strncmp((gchar *)node->name,"properties\0",11)) { bt_persistence_load_hashtable(self->priv->properties,node); } } } if(failed_parts) { bt_song_write_to_lowlevel_dot_file(self->priv->song); } return(BT_PERSISTENCE(persistence)); } static void bt_setup_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_setup_persistence_load; iface->save = bt_setup_persistence_save; } //-- wrapper //-- g_object overrides /* returns a property for the given property_id for this object */ static void bt_setup_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSetup * const self = BT_SETUP(object); return_if_disposed(); switch (property_id) { case SETUP_PROPERTIES: { g_value_set_pointer(value, self->priv->properties); } break; case SETUP_SONG: { g_value_set_object(value, self->priv->song); } break; case SETUP_MACHINES: { /* @todo: this is not good, lists returned by bt_setup_get_xxx_by_yyy * returns a new list where one has to unref the elements */ g_value_set_pointer(value,g_list_copy(self->priv->machines)); } break; case SETUP_WIRES: { /* @todo: this is not good, lists returned by bt_setup_get_xxx_by_yyy * returns a new list where one has to unref the elements */ g_value_set_pointer(value,g_list_copy(self->priv->wires)); } break; case SETUP_MISSING_MACHINES: { g_value_set_pointer(value,self->priv->missing_machines); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_setup_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSetup * const self = BT_SETUP(object); return_if_disposed(); switch (property_id) { case SETUP_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); g_object_get((gpointer)(self->priv->song),"bin",&self->priv->bin,NULL); GST_INFO("set the song for setup: %p and get the bin: %p",self->priv->song,self->priv->bin); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_setup_dispose(GObject * const object) { BtSetup * const self = BT_SETUP(object); GList* node; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); // unref list of wires if(self->priv->wires) { for(node=self->priv->wires;node;node=g_list_next(node)) { if(node->data) { GObject *obj=node->data; GstElement *src,*dst; GST_DEBUG_OBJECT(obj," free wire: %p, ref=%d, floating? %d",obj,G_OBJECT_REF_COUNT(obj),GST_OBJECT_FLAG_IS_SET(obj,GST_OBJECT_FLOATING)); g_object_get(obj,"src",&src,"dst",&dst,NULL); unlink_wire(self,GST_ELEMENT(obj),src,dst); g_object_unref(src); g_object_unref(dst); if(GST_OBJECT_FLAG_IS_SET(obj,GST_OBJECT_FLOATING)) { gst_element_set_state(GST_ELEMENT(obj),GST_STATE_NULL); gst_object_unref(obj); } else if(self->priv->bin) { gst_bin_remove(self->priv->bin,GST_ELEMENT(obj)); } node->data=NULL; } } } // unref list of machines if(self->priv->machines) { for(node=self->priv->machines;node;node=g_list_next(node)) { if(node->data) { GObject *obj=node->data; GST_DEBUG_OBJECT(obj," free machine: %p, ref=%d, floating? %d",obj,G_OBJECT_REF_COUNT(obj),GST_OBJECT_FLAG_IS_SET(obj,GST_OBJECT_FLOATING)); if(GST_OBJECT_FLAG_IS_SET(obj,GST_OBJECT_FLOATING)) { gst_element_set_state(GST_ELEMENT(obj),GST_STATE_NULL); gst_object_unref(obj); } else if(self->priv->bin) { gst_bin_remove(self->priv->bin,GST_ELEMENT(obj)); } node->data=NULL; } } } if(self->priv->bin) { GST_DEBUG_OBJECT(self->priv->bin,"release bin: %p, ref=%d, num_children=%d",self->priv->bin,G_OBJECT_REF_COUNT(self->priv->bin),GST_BIN_NUMCHILDREN(self->priv->bin)); gst_object_unref(self->priv->bin); self->priv->bin=NULL; } g_object_try_weak_unref(self->priv->song); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_setup_parent_class)->dispose(object); } static void bt_setup_finalize(GObject * const object) { BtSetup * const self = BT_SETUP(object); GST_DEBUG("!!!! self=%p",self); // free list of wires if(self->priv->wires) { g_list_free(self->priv->wires); self->priv->wires=NULL; } // free list of machines if(self->priv->machines) { g_list_free(self->priv->machines); self->priv->machines=NULL; } // free list of missing_machines if(self->priv->missing_machines) { const GList* node; for(node=self->priv->missing_machines;node;node=g_list_next(node)) { g_free(node->data); } g_list_free(self->priv->missing_machines); self->priv->missing_machines=NULL; } g_hash_table_destroy(self->priv->properties); g_hash_table_destroy(self->priv->connection_state); g_hash_table_destroy(self->priv->graph_depth); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_setup_parent_class)->finalize(object); } //-- class internals static void bt_setup_init(BtSetup * self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETUP, BtSetupPrivate); self->priv->properties=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); self->priv->connection_state=g_hash_table_new(NULL,NULL); self->priv->graph_depth=g_hash_table_new(NULL,NULL); } static void bt_setup_class_init(BtSetupClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSetupPrivate)); gobject_class->set_property = bt_setup_set_property; gobject_class->get_property = bt_setup_get_property; gobject_class->dispose = bt_setup_dispose; gobject_class->finalize = bt_setup_finalize; /** * BtSetup::machine-added: * @self: the setup object that emitted the signal * @machine: the new machine * * A new machine item has been added to the setup. */ signals[MACHINE_ADDED_EVENT] = g_signal_new("machine-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_MACHINE // param data ); /** * BtSetup::wire-added: * @self: the setup object that emitted the signal * @wire: the new wire * * A new wire item has been added to the setup. */ signals[WIRE_ADDED_EVENT] = g_signal_new("wire-added", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_WIRE // param data ); /** * BtSetup::machine-removed: * @self: the setup object that emitted the signal * @machine: the old machine * * A machine item has been removed from the setup. */ signals[MACHINE_REMOVED_EVENT] = g_signal_new("machine-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_MACHINE // param data ); /** * BtSetup::wire-removed: * @self: the setup object that emitted the signal * @wire: the old wire * * A wire item has been removed from the setup. */ signals[WIRE_REMOVED_EVENT] = g_signal_new("wire-removed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_WIRE // param data ); g_object_class_install_property(gobject_class,SETUP_PROPERTIES, g_param_spec_pointer("properties", "properties prop", "hashtable of setup properties", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SETUP_SONG, g_param_spec_object("song", "song contruct prop", "Set song object, the setup belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SETUP_MACHINES, g_param_spec_pointer("machines", "machine list prop", "A copy of the list of machines", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SETUP_WIRES, g_param_spec_pointer("wires", "wire list prop", "A copy of the list of wires", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SETUP_MISSING_MACHINES, g_param_spec_pointer("missing-machines", "missing-machines list prop", "The list of missing machines, don't change", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/Makefile.am0000644042355400116100000001162711673622514014650 00000000000000## $Id: Makefile.am 3776 2011-12-19 11:51:38Z ensonic $ SUBDIRS = libbuzztard-core if USE_GCONF GCONF_SETTINGS_SRC = gconf-settings.c libbuzztard-core/gconf-settings.h else GCONF_SETTINGS_SRC = endif # these sources (also mentioned above) are generated. BUILT_SOURCES = marshal.h marshal.c lib_LTLIBRARIES = libbuzztard-core.la libbuzztard_core_la_LIBADD = \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) \ -lgstaudio-0.10 -lgstpbutils-0.10 libbuzztard_core_la_LDFLAGS = \ $(BT_LDFLAGS) \ -export-symbols-regex ^_?\(bt_\|Bt\|BT_\).* \ -version-info @BT_VERSION_INFO@ libbuzztard_core_la_SOURCES = \ core.c libbuzztard-core/core.h \ tools.c libbuzztard-core/tools.h \ libbuzztard-core/version.h \ buzzcallbacks.c \ \ application.c libbuzztard-core/application.h\ childproxy.c libbuzztard-core/childproxy.h\ $(GCONF_SETTINGS_SRC) \ machine.c libbuzztard-core/machine.h \ pattern.c libbuzztard-core/pattern.h \ persistence.c libbuzztard-core/persistence.h \ processor-machine.c libbuzztard-core/processor-machine.h \ sequence.c libbuzztard-core/sequence.h \ settings.c libbuzztard-core/settings.h libbuzztard-core/settings-private.h \ setup.c libbuzztard-core/setup.h \ sink-bin.c libbuzztard-core/sink-bin.h \ sink-machine.c libbuzztard-core/sink-machine.h \ song.c libbuzztard-core/song.h \ song-info.c libbuzztard-core/song-info.h \ song-io.c libbuzztard-core/song-io.h \ song-io-native.c libbuzztard-core/song-io-native.h \ song-io-native-bzt.c libbuzztard-core/song-io-native-bzt.h \ song-io-native-xml.c libbuzztard-core/song-io-native-xml.h \ source-machine.c libbuzztard-core/source-machine.h \ wavetable.c libbuzztard-core/wavetable.h \ wave.c libbuzztard-core/wave.h \ wavelevel.c libbuzztard-core/wavelevel.h \ wire.c libbuzztard-core/wire.h \ wire-pattern.c libbuzztard-core/wire-pattern.h \ \ $(BUILT_SOURCES) # yet unused sources # plainfile-settings.c libbuzztard-core/plainfile-settings.h \ # libbuzztard_core_la_CFLAGS = \ -I$(builddir)/libbuzztard-core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) noinst_HEADERS = core_private.h marshal.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libbuzztard-core.pc marshal.h: marshal.list glib-genmarshal --header --prefix=bt_marshal $(srcdir)/marshal.list > marshal.h marshal.c: marshal.list glib-genmarshal --body --prefix=bt_marshal $(srcdir)/marshal.list > marshal.c if USE_GIR gir_sources=$(patsubst %,$(srcdir)/%, $(libbuzztard_core_la_SOURCES)) BuzztardCore-0.0.gir: $(G_IR_SCANNER) libbuzztard-core.la -$(AM_V_GEN)$(G_IR_SCANNER) -v \ --namespace=BuzztardCore \ --nsversion 0.0 \ -I$(builddir)/libbuzztard-core \ -I$(srcdir) \ -I$(srcdir)/libbuzztard_core/ \ -I$(top_srcdir)/src/lib/ic/libbuzztard-ic/ \ --add-include-path=$(top_srcdir)/src/lib/ic/ \ --identifier-prefix=Bt \ --symbol-prefix=bt \ --c-include='libbuzztard-core/core.h' \ --include=GLib-2.0 \ --include=GObject-2.0 \ --include=Gst-0.10 \ --include=libxml2-2.0 \ --include=BuzztardIc-0.0 \ --library=libbuzztard-core.la \ --libtool="$(top_builddir)/libtool" \ --pkg glib-2.0 \ --pkg gobject-2.0 \ --pkg libgstbuzztard \ --pkg libxml-2.0 \ --pkg gstreamer-0.10 \ --pkg-export libbuzztard-core \ --add-init-section="bt_init(NULL,NULL);" \ --output $@ \ $(gir_sources) || touch $@ BUILT_GIRSOURCES = BuzztardCore-0.0.gir girdir = $(datadir)/gir dist_gir_DATA = $(BUILT_GIRSOURCES) typelibsdir = $(libdir)/girepository typelibs_DATA = $(dist_gir_DATA:.gir=.typelib) TXML = $(dist_gir_DATA:.gir=.gir.txml) .gir.typelib: -$(AM_V_GEN)$(G_IR_COMPILER) --includedir=. --includedir=../ic $(G_IR_COMPILER_OPTS) $< -o $@ || touch $@ else BUILT_GIRSOURCES= endif EXTRA_DIST = \ libbuzztard-core.pc.in \ marshal.list # CLEANFILES is for files generated by make CLEANFILES = marshal.c marshal.h \ $(pkgconfig_DATA) \ $(typelibs_DATA) $(TXML) \ $(BUILT_GIRSOURCES) .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) -I$(top_srcdir)/src/lib/ic $(libbtcore_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/lib/core/song-io.c0000644042355400116100000004022411624270306014320 00000000000000/* $Id: song-io.c 3577 2011-08-21 20:55:31Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsongio * @short_description: base class for song input and output * * A base class for #BtSong loader and saver implementations. A #BtSongIO module * needs to be installed as a shared library into LIBDIR/songio. It is * recognized, if it exports a #BtSongIOModuleInfo structure. At runtime the * detect method of each module is called with the chosen file-name. The module * should return its #GType if it can handle the format or %NULL else. * * Such a module should overwrite the bt_song_io_load() and/or bt_song_io_save() * default implementations. * * There is an internal subclass of this called #BtSongIONative. * * * This API is not yet fully stable. Please discuss with the deverloper team if * you intend to write a io plugin. * */ #define BT_CORE #define BT_SONG_IO_C #include "core_private.h" //-- property ids enum { SONG_IO_FILE_NAME=1, SONG_IO_DATA, SONG_IO_DATA_LEN, SONG_IO_STATUS }; struct _BtSongIOPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* used to load or save the song file */ gchar *file_name; gpointer *data; guint len; /* informs about the progress of the loader */ gchar *status; }; /* list of registered io-classes, each entry points to a BtSongIOModuleInfo * structure for each plugin */ static GList *plugins=NULL; //-- the class G_DEFINE_ABSTRACT_TYPE (BtSongIO, bt_song_io, G_TYPE_OBJECT); //-- helper methods /* * bt_song_io_register_plugins: * * Registers all song-io plugins for later use by bt_song_io_from_file(). */ static void bt_song_io_register_plugins(void) { GDir *dir; /* @idea: the plugin list now has structures * so that we could keep the modules handle. * we need this to close the plugins at sometime ... (do we?) */ GST_INFO("register song-io plugins..."); // register internal song-io plugin if(bt_song_io_native_module_info.init && bt_song_io_native_module_info.init()) { plugins=g_list_append(plugins,(gpointer)&bt_song_io_native_module_info); } // registering external song-io plugins GST_INFO(" scanning external song-io plugins in "LIBDIR G_DIR_SEPARATOR_S PACKAGE "-songio"); if((dir=g_dir_open(LIBDIR G_DIR_SEPARATOR_S PACKAGE "-songio",0,NULL))) { const gchar *entry_name; gpointer bt_song_io_module_info=NULL; gchar plugin_name[FILENAME_MAX]; // 1.) scan plugin-folder (LIBDIR/songio) while((entry_name=g_dir_read_name(dir))) { // skip names starting with a dot if(*entry_name=='.') continue; g_sprintf(plugin_name,LIBDIR G_DIR_SEPARATOR_S PACKAGE "-songio"G_DIR_SEPARATOR_S"%s",entry_name); // skip symlinks if(g_file_test(plugin_name,G_FILE_TEST_IS_SYMLINK)) continue; // skip files other than shared librares if(!g_str_has_suffix(entry_name,"."G_MODULE_SUFFIX)) continue; GST_INFO(" found file '%s'",plugin_name); // 2.) try to open each as g_module //if((plugin=g_module_open(plugin_name,G_MODULE_BIND_LAZY))!=NULL) { GModule * const plugin=g_module_open(plugin_name,G_MODULE_BIND_LAZY|G_MODULE_BIND_LOCAL); if(plugin!=NULL) { // 3.) gets the address of GType bt_song_io_detect(const gchar *); if(g_module_symbol(plugin,"bt_song_io_module_info",&bt_song_io_module_info)) { if(!g_list_find(plugins,bt_song_io_module_info)) { BtSongIOModuleInfo *info=(BtSongIOModuleInfo *)bt_song_io_module_info; // 4.) store the g_module handle and the function pointer in a list (uhm, global (static) variable) if(info->init && info->init()) { plugins=g_list_append(plugins,bt_song_io_module_info); } } else { GST_WARNING("%s skipped as duplicate",plugin_name); g_module_close(plugin); } } else { GST_WARNING("%s is not a songio plugin",plugin_name); g_module_close(plugin); } } else { GST_WARNING("%s is not a shared object",plugin_name); } } g_dir_close(dir); } } /* @todo add proper mime-type detection (gio) */ #if 0 GFile *file; GFileInfo *info; file=g_file_new_for_path(file_name); if((info=g_file_query_info(file,G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,G_FILE_QUERY_INFO_NONE,NULL,NULL))) { const gchar *mime_type=g_file_info_get_content_type(info); g_object_unref (info); } g_object_unref (file); #endif /* * bt_song_io_detect: * @file_name: the full filename of the song or %NULL * @media_type: the media-type for the song or %NULL * * Factory method that returns the GType of the class that is able to handle * the supplied file or media-type. * * Returns: the type of the #BtSongIO sub-class that can handle the supplied file * and %NULL otherwise */ static GType bt_song_io_detect(const gchar *file_name, const gchar *media_type) { GType type=0; const GList *node; BtSongIOModuleInfo *info; guint i; gchar *lc_file_name = NULL, *ext = NULL; GST_INFO("detecting loader for file '%s', type '%s'", safe_string(file_name),safe_string(media_type)); if(!plugins) bt_song_io_register_plugins(); // try all registered plugins for(node=plugins;node;node=g_list_next(node)) { info=(BtSongIOModuleInfo *)node->data; GST_INFO(" trying..."); i=0; while(info->formats[i].type) { if (media_type && info->formats[i].mime_type) { if(!strcmp (media_type, info->formats[i].mime_type)) { type=info->formats[i].type; break; } } else if (file_name) { if(!lc_file_name) { lc_file_name=g_ascii_strdown(file_name,-1); ext = strrchr(lc_file_name,'.'); } if(ext && info->formats[i].extension) { if (!strcmp (&ext[1], info->formats[i].extension)) { type=info->formats[i].type; break; } } } i++; } if(type) { GST_INFO(" found one: %s!", info->formats[i].name); break; } } g_free(lc_file_name); return(type); } /* * bt_song_io_update_filename: * * Grab the file-name from the path in song-io and store it in song-info. Does * nothing if we load from memory. */ static void bt_song_io_update_filename(const BtSongIO * const self, const BtSong * const song) { if(self->priv->file_name) { BtSongInfo *song_info; gchar *file_path=self->priv->file_name; gboolean need_free=FALSE; if(!g_path_is_absolute(file_path)) { gchar *cur_path=g_get_current_dir(); file_path=g_build_filename(cur_path,file_path,NULL); g_free(cur_path); need_free=TRUE; } GST_INFO("file path is : %s",file_path); g_object_get((gpointer)song,"song-info",&song_info,NULL); g_object_set(song_info,"file-name",file_path,NULL); g_object_unref(song_info); if(need_free) { g_free(file_path); } } } //-- constructor methods /** * bt_song_io_from_file: * @file_name: the file name of the song * * Create a new instance from the given @file_name. Each installed plugin will * test if it can handle the file type. * * Returns: the new instance or %NULL in case of an error */ BtSongIO *bt_song_io_from_file(const gchar * const file_name) { BtSongIO *self=NULL; GType type = 0; if(!BT_IS_STRING(file_name)) { GST_WARNING("filename should not be empty"); return NULL; } type=bt_song_io_detect(file_name,NULL); if(type) { self=BT_SONG_IO(g_object_new(type,NULL)); self->priv->file_name=g_strdup(file_name); } else { GST_WARNING("failed to detect type for filename %s",file_name); } return(self); } /** * bt_song_io_from_data: * @data: in memory data of the song * @len: the siye of the @data block * @media_type: the media-type of the song, if available * * Create a new instance from the given parameters. Each installed plugin will * test if it can handle the file type. * * Returns: the new instance or %NULL in case of an error */ BtSongIO *bt_song_io_from_data(gpointer *data, guint len, const gchar *media_type) { BtSongIO *self=NULL; GType type = 0; if(!BT_IS_STRING(media_type)) { GST_WARNING("media-type should not be empty"); return NULL; } type=bt_song_io_detect(NULL,media_type); if(type) { self=BT_SONG_IO(g_object_new(type,NULL)); self->priv->data=data; self->priv->len=len; } else { GST_WARNING("failed to detect type for media-type %s",media_type); } return(self); } //-- methods /** * bt_song_io_get_module_info_list: * * Get read only access to list of #BtSongIOModuleInfo entries. * * Returns: the #GList. */ const GList *bt_song_io_get_module_info_list(void) { if(!plugins) bt_song_io_register_plugins(); return (plugins); } //-- wrapper /** * bt_song_io_load: * @self: the #BtSongIO instance to use * @song: the #BtSong instance that should initialized * * load the song from a file. The file is set in the constructor * * Returns: %TRUE for success */ gboolean bt_song_io_load(BtSongIO const *self, const BtSong * const song) { gboolean result; bt_song_io_virtual_load load; g_return_val_if_fail(BT_IS_SONG_IO(self),FALSE); g_return_val_if_fail(BT_IS_SONG(song),FALSE); load=BT_SONG_IO_GET_CLASS(self)->load; GST_INFO("loading song [%s]",self->priv->file_name?self->priv->file_name:"data"); if(!load) { GST_ERROR("virtual method bt_song_io_load(self=%p,song=%p) called without implementation",self,song); return(FALSE); } g_object_set((gpointer)song,"song-io",self,NULL); if((result=BT_SONG_IO_GET_CLASS(self)->load(self,song))) { bt_song_io_update_filename(BT_SONG_IO(self),song); GST_INFO("loading done"); //DEBUG /* { BtSetup * const setup; GList * const list; const GList *node; g_object_get((gpointer)song,"setup",&setup,NULL); g_object_get(setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { const BtMachine * const machine=BT_MACHINE(node->data); if(BT_IS_SOURCE_MACHINE(machine)) { bt_machine_dbg_dump_global_controller_queue(machine); } } g_list_free(list); g_object_unref(setup); } */ //DEBUG } g_object_set((gpointer)song,"song-io",NULL,NULL); GST_INFO("loaded song [%s] = %d",self->priv->file_name?self->priv->file_name:"data",result); return(result); } /** * bt_song_io_save: * @self: the #BtSongIO instance to use * @song: the #BtSong instance that should stored * * save the song to a file. The file is set in the constructor * * Returns: %TRUE for success */ gboolean bt_song_io_save(BtSongIO const *self, const BtSong * const song) { gboolean result; BtSongInfo * const song_info; bt_song_io_virtual_save save; g_return_val_if_fail(BT_IS_SONG_IO(self),FALSE); g_return_val_if_fail(BT_IS_SONG(song),FALSE); save=BT_SONG_IO_GET_CLASS(self)->save; GST_INFO("saving song [%s]",self->priv->file_name); if(!save) { GST_ERROR("virtual method bt_song_io_save(self=%p,song=%p) called without implementation",self,song); return(FALSE); } // this updates the time-stamp g_object_get((gpointer)song,"song-info",&song_info,NULL); g_object_set(song_info,"change-dts",NULL,NULL); g_object_unref(song_info); g_object_set((gpointer)song,"song-io",self,NULL); if((result=BT_SONG_IO_GET_CLASS(self)->save(self,song))) { bt_song_io_update_filename(BT_SONG_IO(self),song); } g_object_set((gpointer)song,"song-io",NULL,NULL); GST_INFO("saved song [%s] = %d",self->priv->file_name,result); return(result); } //-- class internals /* returns a property for the given property_id for this object */ static void bt_song_io_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtSongIO * const self = BT_SONG_IO(object); return_if_disposed(); switch (property_id) { case SONG_IO_FILE_NAME: { g_value_set_string(value, self->priv->file_name); } break; case SONG_IO_DATA: { g_value_set_pointer(value, self->priv->data); } break; case SONG_IO_DATA_LEN: { g_value_set_uint(value, self->priv->len); } break; case SONG_IO_STATUS: { g_value_set_string(value, self->priv->status); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_song_io_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtSongIO * const self = BT_SONG_IO(object); return_if_disposed(); switch (property_id) { case SONG_IO_STATUS: { g_free(self->priv->status); self->priv->status = g_value_dup_string(value); GST_DEBUG("set the status for song_io: %s",self->priv->status); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_song_io_dispose(GObject * const object) { const BtSongIO * const self = BT_SONG_IO(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_song_io_parent_class)->dispose(object); } static void bt_song_io_finalize(GObject * const object) { const BtSongIO * const self = BT_SONG_IO(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->file_name); G_OBJECT_CLASS(bt_song_io_parent_class)->finalize(object); } static void bt_song_io_init(BtSongIO *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SONG_IO, BtSongIOPrivate); } static void bt_song_io_class_init(BtSongIOClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSongIOPrivate)); gobject_class->set_property = bt_song_io_set_property; gobject_class->get_property = bt_song_io_get_property; gobject_class->dispose = bt_song_io_dispose; gobject_class->finalize = bt_song_io_finalize; g_object_class_install_property(gobject_class,SONG_IO_FILE_NAME, g_param_spec_string("file-name", "filename prop", "full filename for load save operations", NULL, /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IO_DATA, g_param_spec_pointer("data", "data prop", "in memory block pointer for load save operations", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IO_DATA_LEN, g_param_spec_uint("data-len", "data-len prop", "in memory block length for load save operations", 0,G_MAXUINT,0, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SONG_IO_STATUS, g_param_spec_string("status", "status prop", "status of load save operations", NULL, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/core/source-machine.c0000644042355400116100000001727511634646053015670 00000000000000/* $Id: source-machine.c 3645 2011-09-16 13:16:25Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsourcemachine * @short_description: class for signal processing machines with outputs only * * Sources are machines that generate audio. */ #define BT_CORE #define BT_SOURCE_MACHINE_C #include "core_private.h" #include //-- the class static void bt_source_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSourceMachine, bt_source_machine, BT_TYPE_MACHINE, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_source_machine_persistence_interface_init)); //-- pad templates static GstStaticPadTemplate machine_src_template = GST_STATIC_PAD_TEMPLATE ("src%d", GST_PAD_SRC, GST_PAD_REQUEST, GST_STATIC_CAPS_ANY); //-- constructor methods /** * bt_source_machine_new: * @song: the song the new instance belongs to * @id: the id, we can use to lookup the machine * @plugin_name: the name of the gst-plugin the machine is using * @voices: the number of voices the machine should initially have * @err: inform about failed instance creation * * Create a new instance * The machine is automaticly added to the setup from the given song object. You * don't need to add the machine with * #bt_setup_add_machine(setup,BT_MACHINE(machine));. * * Returns: the new instance or %NULL in case of an error */ BtSourceMachine *bt_source_machine_new(const BtSong * const song, const gchar * const id, const gchar * const plugin_name, const glong voices, GError **err) { return(BT_SOURCE_MACHINE(g_object_new(BT_TYPE_SOURCE_MACHINE,"construction-error",err,"song",song,"id",id,"plugin-name",plugin_name,"voices",voices,NULL))); } //-- methods //-- io interface static xmlNodePtr bt_source_machine_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtSourceMachine * const self = BT_SOURCE_MACHINE(persistence); const BtPersistenceInterface * const parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(persistence)); xmlNodePtr node=NULL; gchar * const plugin_name; gulong voices; GST_DEBUG("PERSISTENCE::source-machine"); // save parent class stuff if((node=parent_iface->save(persistence,parent_node))) { xmlNewProp(node,XML_CHAR_PTR("type"),XML_CHAR_PTR("source")); g_object_get((gpointer)self,"plugin-name",&plugin_name,"voices",&voices,NULL); xmlNewProp(node,XML_CHAR_PTR("plugin-name"),XML_CHAR_PTR(plugin_name)); xmlNewProp(node,XML_CHAR_PTR("voices"),XML_CHAR_PTR(bt_persistence_strfmt_ulong(voices))); g_free(plugin_name); } return(node); } static BtPersistence *bt_source_machine_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtSourceMachine *self; BtPersistence *result; BtPersistenceInterface *parent_iface; xmlChar * const id=xmlGetProp(node,XML_CHAR_PTR("id")); xmlChar * const plugin_name=xmlGetProp(node,XML_CHAR_PTR("plugin-name")); xmlChar * const voices_str=xmlGetProp(node,XML_CHAR_PTR("voices")); const gulong voices=voices_str?atol((char *)voices_str):0; if(!persistence) { BtSong *song=NULL; gchar *param_name; va_list va; G_VA_COPY(va,var_args); // we need to get parameters from var_args param_name=va_arg(va,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(va, gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(va,gchar*); } self=bt_source_machine_new(song,(gchar*)id,(gchar *)plugin_name,voices,err); result=BT_PERSISTENCE(self); va_end (va); } else { self=BT_SOURCE_MACHINE(persistence); result=BT_PERSISTENCE(persistence); g_object_set(self,"plugin-name",plugin_name,"voices",voices,NULL); } xmlFree(id); xmlFree(plugin_name); xmlFree(voices_str); // load parent class stuff parent_iface=g_type_interface_peek_parent(BT_PERSISTENCE_GET_INTERFACE(result)); parent_iface->load(BT_TYPE_MACHINE,result,node,NULL,var_args); return(result); } static void bt_source_machine_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_source_machine_persistence_load; iface->save = bt_source_machine_persistence_save; } //-- wrapper //-- bt_machine overrides static gboolean bt_source_machine_check_type(const BtMachine * const self, const gulong pad_src_ct, const gulong pad_sink_ct) { if(pad_src_ct==0 || pad_sink_ct>0) { GST_ERROR_OBJECT(self,"plugin has %lu src pads instead of >0 and %lu sink pads instead of 0", pad_src_ct,pad_sink_ct); return(FALSE); } return(TRUE); } //-- g_object overrides static void bt_source_machine_constructed(GObject *object) { BtSourceMachine * const self=BT_SOURCE_MACHINE(object); GError **err; GST_INFO("source-machine constructed"); G_OBJECT_CLASS(bt_source_machine_parent_class)->constructed(object); g_object_get(self,"construction-error",&err,NULL); if(err==NULL || *err==NULL) { GstElement * const element; BtSong * const song; BtSetup *setup; BtPattern *pattern; BtMachine *machine=(BtMachine *)self; g_object_get(self,"machine",&element,"song",&song,NULL); if(GST_IS_BASE_SRC(element)) { // don't ever again get the idea to turn of is_live for basesrc elements // if they are live, they are, no matter what we want // we get "can't record audio fast enough" if(gst_base_src_is_live((GstBaseSrc *)element)) { if(GST_IS_BASE_AUDIO_SRC(element)) { g_object_set(element,"buffer-time",150*GST_MSECOND,NULL); } } } gst_object_unref(element); pattern=bt_pattern_new_with_event(song,machine,BT_PATTERN_CMD_SOLO); g_object_unref(pattern); bt_machine_activate_spreader(machine); bt_machine_enable_output_gain(machine); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been constructed",self,G_OBJECT_REF_COUNT(self)); // add the machine to the setup of the song g_object_get(song,"setup",&setup,NULL); bt_setup_add_machine(setup,machine); g_object_unref(setup); g_object_unref(song); GST_INFO_OBJECT(self,"machine %p,ref_ct=%d has been added",self,G_OBJECT_REF_COUNT(self)); } } //-- class internals static void bt_source_machine_init(BtSourceMachine *self) { } static void bt_source_machine_class_init(BtSourceMachineClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const gstelement_klass = GST_ELEMENT_CLASS(klass); BtMachineClass * const machine_class = BT_MACHINE_CLASS(klass); gobject_class->constructed = bt_source_machine_constructed; machine_class->check_type = bt_source_machine_check_type; gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&machine_src_template)); } buzztard-0.6.0/src/lib/core/wire.c0000644042355400116100000015026011666464236013732 00000000000000/* $Id: wire.c 3710 2011-11-27 20:21:24Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwire * @short_description: class for a connection of two #BtMachines * * Abstracts connection between two #BtMachines. After creation, the elements * are connected. In contrast to directly wiring #GstElements this insert needed * conversion elements automatically. * * Furthermore each wire has a volume and if possible panorama/balance element. * Volume and panorama/balance can be sequenced like machine parameters in * #BtWirePattern objects. */ #define BT_CORE #define BT_WIRE_C #include "core_private.h" //-- signal ids enum { PATTERN_CREATED_EVENT, LAST_SIGNAL }; //-- property ids enum { WIRE_CONSTRUCTION_ERROR=1, WIRE_PROPERTIES, WIRE_SONG, WIRE_SRC, WIRE_DST, WIRE_GAIN, WIRE_PAN, WIRE_NUM_PARAMS, WIRE_ANALYZERS }; // capsfiter, convert, pan, volume are gap-aware typedef enum { /* queue to avoid blocking when src has a spreader */ PART_QUEUE, /* used to link analyzers */ PART_TEE, /* volume-control element */ PART_GAIN, /* wire format conversion elements */ PART_CONVERT, /*PART_SCALE, unused right now */ /* panorama / balance */ PART_PAN, /* how many elements are used */ PART_COUNT } BtWirePart; struct _BtWirePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* used to signal failed instance creation */ GError **constrution_error; /* (ui) properties accociated with this machine */ GHashTable *properties; /* the song the wire belongs to */ G_POINTER_ALIAS(BtSong *,song); /* status in songs pipeline */ gboolean is_added,is_connected; /* which machines are linked */ BtMachine *src,*dst; /* src/sink ghost-pad of the wire */ GstPad *src_pad,*sink_pad; /* the number of dynamic params the wire provides */ gulong num_params; /* dynamic parameter control */ GstController *wire_controller[BT_WIRE_MAX_NUM_PARAMS]; GstInterpolationControlSource *wire_control_sources[BT_WIRE_MAX_NUM_PARAMS]; GParamSpec *wire_props[BT_WIRE_MAX_NUM_PARAMS]; /* event patterns in relation to patterns of the target machine */ GHashTable *patterns; // each entry points to BtWirePattern using BtPattern as a key /* the gstreamer elements that is used */ GstElement *machines[PART_COUNT]; GstPad *src_pads[PART_COUNT],*sink_pads[PART_COUNT]; /* wire analyzers */ GList *analyzers; }; static GQuark error_domain=0; static guint signals[LAST_SIGNAL]={0,}; static gchar *src_pn[]={ "src", /* queue */ "\0src%d",/* tee */ "src", /* gain */ "src", /* convert */ "src" /* pan */ }; static gchar *sink_pn[]={ "sink", /* queue */ "sink", /* tee */ "sink", /* gain */ "sink", /* convert */ "sink" /* pan */ }; //-- the class static void bt_wire_persistence_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtWire, bt_wire, GST_TYPE_BIN, G_IMPLEMENT_INTERFACE (BT_TYPE_PERSISTENCE, bt_wire_persistence_interface_init)); //-- pad templates static GstStaticPadTemplate wire_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); static GstStaticPadTemplate wire_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); // macros #define WIRE_PARAM_NAME(ix) self->priv->wire_props[ix]->name #define WIRE_PARAM_TYPE(ix) self->priv->wire_props[ix]->value_type //-- helper methods /* * bt_wire_link_elements: * @self: the wire in which we link * @src,@sink: the pads * * Link two pads. * * Returns: %TRUE for sucess */ static gboolean bt_wire_link_elements(const BtWire * const self, GstPad *src, GstPad *sink) { GstPadLinkReturn plr; if((plr=gst_pad_link(src,sink))!=GST_PAD_LINK_OK) { GST_WARNING_OBJECT(self,"can't link %s:%s with %s:%s: %d",GST_DEBUG_PAD_NAME(src),GST_DEBUG_PAD_NAME(sink),plr); return(FALSE); } return(TRUE); } /* * bt_wire_make_internal_element: * @self: the wire * @part: which internal element to create * @factory_name: the element-factories name * @element_name: the name of the new #GstElement instance * * This helper is used by the bt_wire_link() function. */ static gboolean bt_wire_make_internal_element(const BtWire * const self, const BtWirePart part, const gchar * const factory_name, const gchar * const element_name) { gboolean res=FALSE; const gchar * const parent_name=GST_OBJECT_NAME(self); gchar * const name=g_alloca(strlen(parent_name)+2+strlen(element_name)); g_return_val_if_fail((self->priv->machines[part]==NULL),TRUE); // create internal element //strcat(name,parent_name);strcat(name,":");strcat(name,element_name); g_sprintf(name,"%s:%s",parent_name,element_name); if(!(self->priv->machines[part]=gst_element_factory_make(factory_name,name))) { GST_WARNING_OBJECT(self,"failed to create %s from factory %s",element_name,factory_name);goto Error; } // disable deep notify { GObjectClass *gobject_class=G_OBJECT_GET_CLASS(self->priv->machines[part]); GObjectClass *parent_class=g_type_class_peek_static(G_TYPE_OBJECT); gobject_class->dispatch_properties_changed=parent_class->dispatch_properties_changed; } // get the pads if(src_pn[part]) { if(src_pn[part][0]!='\0') { self->priv->src_pads[part]=gst_element_get_static_pad(self->priv->machines[part],src_pn[part]); } else { self->priv->src_pads[part]=gst_element_get_request_pad(self->priv->machines[part],&src_pn[part][1]); } } if(sink_pn[part]) self->priv->sink_pads[part]=gst_element_get_static_pad(self->priv->machines[part],sink_pn[part]); gst_bin_add(GST_BIN(self),self->priv->machines[part]); res=TRUE; Error: return(res); } //-- helper methods static void bt_wire_init_params(const BtWire * const self) { self->priv->wire_props[0]=g_object_class_find_property( G_OBJECT_CLASS(GST_ELEMENT_GET_CLASS(self->priv->machines[PART_GAIN])), "volume"); if(self->priv->machines[PART_PAN]) { self->priv->wire_props[1]=g_object_class_find_property( G_OBJECT_CLASS(GST_ELEMENT_GET_CLASS(self->priv->machines[PART_PAN])),"panorama"); self->priv->num_params=2; } } /* * bt_wire_activate_analyzers: * @self: the wire * * Add all analyzers to the bin and link them. */ static void bt_wire_activate_analyzers(const BtWire * const self) { gboolean is_playing; GstObject *parent; if(!self->priv->analyzers) return; // need to do pad_blocking in playing if the wire is active g_object_get(self->priv->song,"is-playing",&is_playing,NULL); if((parent=gst_object_get_parent((gpointer)self))) { gst_object_unref(parent); } else { is_playing=FALSE; } bt_bin_activate_tee_chain(GST_BIN(self),self->priv->machines[PART_TEE],self->priv->analyzers,is_playing); } /* * bt_wire_deactivate_analyzers: * @self: the wire * * Remove all analyzers to the bin and unlink them. */ static void bt_wire_deactivate_analyzers(const BtWire * const self) { gboolean is_playing; GstObject *parent; if(!self->priv->analyzers) return; // need to do pad_blocking in playing if the wire is active g_object_get(self->priv->song,"is-playing",&is_playing,NULL); if((parent=gst_object_get_parent((gpointer)self))) { gst_object_unref(parent); } else { is_playing=FALSE; } bt_bin_deactivate_tee_chain(GST_BIN(self),self->priv->machines[PART_TEE],self->priv->analyzers,is_playing); } /* * bt_wire_link_machines: * @self: the wire that should be used for this connection * * Links the gst-element of this wire and tries a couple for conversion elements * if necessary. * * Returns: %TRUE for success */ static gboolean bt_wire_link_machines(const BtWire * const self) { gboolean res=TRUE; BtMachine * const src = self->priv->src; BtMachine * const dst = self->priv->dst; GstElement ** const machines=self->priv->machines; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; GstElement *dst_machine, *src_machine; GstCaps *caps; const GstCaps *dst_caps=NULL; GstPad *pad; gboolean skip_convert=FALSE; guint six,dix; g_assert(BT_IS_WIRE(self)); if(!machines[PART_QUEUE]) { /* @todo: use the queue on demand. * if(bt_machine_activate_spreader(src) * add the queue. * else * remove the queue * * problem: * we need to relink all outgoing wires for this src when adding/removing a wire */ if(!bt_wire_make_internal_element(self,PART_QUEUE,"queue","queue")) return(FALSE); // configure the queue // @idea: if machine on source side is a live-source, should be keep the queue larger? // @todo: if we have/require gstreamer-0.10.31 ret rid of the check if(g_object_class_find_property(G_OBJECT_GET_CLASS(machines[PART_QUEUE]),"silent")) { g_object_set(G_OBJECT(machines[PART_QUEUE]), "max-size-buffers",1, "max-size-bytes",0, "max-size-time",G_GUINT64_CONSTANT(0), "silent",TRUE, NULL); } else { g_object_set(G_OBJECT(machines[PART_QUEUE]), "max-size-buffers",1, "max-size-bytes",0, "max-size-time",G_GUINT64_CONSTANT(0), NULL); } GST_DEBUG("created queue element for wire : %p '%s' -> %p '%s'",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); } if(!machines[PART_TEE]) { if(!bt_wire_make_internal_element(self,PART_TEE,"tee","tee")) return(FALSE); GST_DEBUG("created tee element for wire : %p '%s' -> %p '%s'",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); } if(!machines[PART_GAIN]) { if(!bt_wire_make_internal_element(self,PART_GAIN,"volume","gain")) return(FALSE); GST_DEBUG("created volume-gain element for wire : %p '%s' -> %p '%s'",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); } g_object_get(dst,"machine",&dst_machine,NULL); if((pad=gst_element_get_static_pad(dst_machine,"sink"))) { // this does not work for unlinked pads // @todo: if we link multiple machines to one, we could cache this // it seems to be responsible for ~14% of the loading time // - checking template caps it not enough - as the machine could have // negotiated to mono // - would it make sense to quickly check template caps to exclude some cases? if((caps=gst_pad_get_allowed_caps(pad))) { //if((caps=gst_pad_get_caps(pad))) { GstStructure *structure; const GValue *cv; gint channels=1; GST_INFO_OBJECT(self,"caps on sink pad %"GST_PTR_FORMAT,caps); if(GST_CAPS_IS_SIMPLE(caps)) { structure = gst_caps_get_structure(caps,0); if((cv=gst_structure_get_value(structure,"channels"))) { if(G_VALUE_HOLDS_INT(cv)) { channels=g_value_get_int(cv); } else if(GST_VALUE_HOLDS_INT_RANGE(cv)) { channels=gst_value_get_int_range_max(cv); } else { GST_WARNING_OBJECT(self,"type for channels on wire: %s",g_type_name(gst_structure_get_field_type(structure,"channels"))); } GST_INFO("channels on wire.dst=%d",channels); } else { GST_WARNING_OBJECT(self,"missing channels field in the wires sink machine sink-pad caps"); } } else { gint c,i,size=gst_caps_get_size(caps); for(i=0;ichannels) channels=c; } else { GST_WARNING_OBJECT(self,"missing channels field in the wires sink machine sink-pad caps"); } } } GST_INFO("channels on wire.dst=%d, (checked %d caps)",channels, size); } if(channels>=2) { /* insert panorama */ GST_DEBUG_OBJECT(self,"adding panorama/balance"); if(!machines[PART_PAN]) { if(!bt_wire_make_internal_element(self,PART_PAN,"audiopanorama","pan")) return(FALSE); g_object_set(G_OBJECT (machines[PART_PAN]),"method",1,NULL); } } else { GST_DEBUG("channels on wire.dst=1, no panorama/balance needed"); if(machines[PART_PAN]) { GST_WARNING_OBJECT(self,"releasing panorama/balance"); gst_bin_remove(GST_BIN(self),machines[PART_PAN]); machines[PART_PAN]=NULL; } } gst_caps_unref(caps); } else { GST_INFO("empty caps :("); } dst_caps=gst_pad_get_pad_template_caps(pad); gst_object_unref(pad); } gst_object_unref(dst_machine); g_object_get(src,"machine",&src_machine,NULL); if((pad=gst_element_get_static_pad(src_machine,"src"))) { const GstCaps *src_caps=gst_pad_get_pad_template_caps(pad); #if GST_CHECK_VERSION(0,10,25) skip_convert=gst_caps_can_intersect(bt_default_caps, src_caps); if(skip_convert) { skip_convert&=gst_caps_can_intersect(dst_caps, src_caps); } #else GstCaps *c=gst_caps_intersect(bt_default_caps, src_caps); skip_convert=!(c && gst_caps_is_empty(c)); gst_caps_unref(c); if(skip_convert) { c=gst_caps_intersect(dst_caps, src_caps); skip_convert&=!(c && gst_caps_is_empty(c)); gst_caps_unref(c); } #endif gst_object_unref(pad); } gst_object_unref(src_machine); GST_DEBUG("trying to link machines : %p '%s' -> %p '%s'",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); if(!skip_convert) { GST_WARNING_OBJECT(self,"adding converter"); if(!machines[PART_CONVERT]) { bt_wire_make_internal_element(self,PART_CONVERT,"audioconvert","audioconvert"); // this is off by default anyway //g_assert(machines[PART_CONVERT]!=NULL); //g_object_set(machines[PART_CONVERT],"dithering",0,"noise-shaping",0,NULL); } } else { if(machines[PART_CONVERT]) { GST_WARNING_OBJECT(self,"releasing converter"); gst_bin_remove(GST_BIN(self),machines[PART_CONVERT]); machines[PART_CONVERT]=NULL; } } res=bt_wire_link_elements(self,src_pads[PART_QUEUE],sink_pads[PART_TEE]); res&=bt_wire_link_elements(self,src_pads[PART_TEE],sink_pads[PART_GAIN]); if(res) { six=PART_QUEUE; if(machines[PART_PAN]) { GST_DEBUG("trying to link machines with pan"); if(skip_convert) { res=bt_wire_link_elements(self,src_pads[PART_GAIN],sink_pads[PART_PAN]); if(!res) { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_PAN]); GST_WARNING("failed to link machines with pan and without convert"); } else { dix=PART_PAN; GST_DEBUG(" wire okay with pan and without convert"); } } else { res=bt_wire_link_elements(self,src_pads[PART_GAIN],sink_pads[PART_CONVERT]); res&=bt_wire_link_elements(self,src_pads[PART_CONVERT],sink_pads[PART_PAN]); if(!res) { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_CONVERT]); gst_pad_unlink(src_pads[PART_CONVERT],sink_pads[PART_PAN]); GST_WARNING("failed to link machines with pan and with convert"); } else { dix=PART_PAN; GST_DEBUG(" wire okay with pan and with convert"); } } } else { GST_DEBUG("trying to link machines without pan"); if(skip_convert) { dix=PART_GAIN; GST_DEBUG(" wire okay without pan and with convert"); } else { res=bt_wire_link_elements(self,src_pads[PART_GAIN],sink_pads[PART_CONVERT]); if(!res) { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_CONVERT]); GST_WARNING("failed to link machines without pan and without convert"); } else { dix=PART_CONVERT; GST_DEBUG(" wire okay without pan and without convert"); } } } } if(res) { // update ghostpads GST_INFO ("updating sink ghostpad : elem=%p (ref_ct=%d),'%s', pad=%p (ref_ct=%d)", machines[six],(G_OBJECT_REF_COUNT(machines[six])),GST_OBJECT_NAME(machines[six]), sink_pads[six],(G_OBJECT_REF_COUNT(sink_pads[six]))); if(!gst_ghost_pad_set_target(GST_GHOST_PAD(self->priv->sink_pad),sink_pads[six])) { GST_WARNING("failed to link internal pads for sink ghostpad"); } GST_INFO ("updating src ghostpad : elem=%p (ref_ct=%d),'%s', pad=%p (ref_ct=%d)", machines[dix],(G_OBJECT_REF_COUNT(machines[dix])),GST_OBJECT_NAME(machines[dix]), src_pads[dix],(G_OBJECT_REF_COUNT(src_pads[dix]))); if(!gst_ghost_pad_set_target(GST_GHOST_PAD(self->priv->src_pad),src_pads[dix])) { GST_WARNING("failed to link internal pads for src ghostpad"); } /* we link the wire to the machine in setup as needed */ } else { GST_INFO("failed to link the machines"); gst_pad_unlink(src_pads[PART_QUEUE],sink_pads[PART_TEE]); gst_pad_unlink(src_pads[PART_TEE],sink_pads[PART_GAIN]); // print out the content of both machines (using GST_DEBUG) bt_machine_dbg_print_parts(src); bt_wire_dbg_print_parts(self); bt_machine_dbg_print_parts(dst); } return(res); } /* * bt_wire_unlink_machines: * @self: the wire that should be used for this connection * * Unlinks gst-element of this wire and removes the conversion elements from the * song. */ static void bt_wire_unlink_machines(const BtWire * const self) { GstElement ** const machines=self->priv->machines; GstPad ** const src_pads=self->priv->src_pads; GstPad ** const sink_pads=self->priv->sink_pads; g_assert(BT_IS_WIRE(self)); // check if wire has been properly initialized if(self->priv->src && self->priv->dst && machines[PART_QUEUE] && machines[PART_TEE] && machines[PART_GAIN]) { GST_DEBUG("unlink machines '%s' -> '%s'",GST_OBJECT_NAME(self->priv->src),GST_OBJECT_NAME(self->priv->dst)); gst_pad_unlink(src_pads[PART_QUEUE],sink_pads[PART_TEE]); gst_pad_unlink(src_pads[PART_TEE],sink_pads[PART_GAIN]); if(machines[PART_CONVERT]) { if(machines[PART_PAN]) { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_CONVERT]); gst_pad_unlink(src_pads[PART_CONVERT],sink_pads[PART_PAN]); } else { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_CONVERT]); } } else { if(machines[PART_PAN]) { gst_pad_unlink(src_pads[PART_GAIN],sink_pads[PART_PAN]); } } } } /* * bt_wire_connect: * @self: the wire that should be used for this connection * * Connect two machines with a wire. The source and destination machine must be * passed upon construction. * Each machine can be involved in multiple connections. The method * transparently add spreader or adder elements in such cases. It further * inserts elements for data-type conversion if necessary. * * Same way the resulting wire should be added to the setup using #bt_setup_add_wire(). * * Returns: true for success */ static gboolean bt_wire_connect(const BtWire * const self) { gboolean res=FALSE; BtWire *other_wire; BtMachine * const src=self->priv->src; BtMachine * const dst=self->priv->dst; gchar *name,*src_name,*dst_name; g_assert(BT_IS_WIRE(self)); // move this to connect? if((!src) || (!dst)) { GST_WARNING("trying to add create wire with NULL endpoint(s), src=%p and dst=%p",src,dst); return(res); } GST_DEBUG("self=%p, src->ref_ct=%d, dst->ref_ct=%d",self,G_OBJECT_REF_COUNT(src),G_OBJECT_REF_COUNT(dst)); GST_DEBUG("trying to link machines : %p '%s' [%p %p] -> %p '%s' [%p %p]", src,GST_OBJECT_NAME(src),src->src_wires, src->dst_wires, dst,GST_OBJECT_NAME(dst),dst->dst_wires, dst->src_wires); /* check that we don't have such a wire yet */ if(src->src_wires && dst->dst_wires) { if((other_wire=bt_machine_get_wire_by_dst_machine(src,dst)) && (other_wire!=self)) { GST_WARNING("trying to add create already existing wire: %p!=%p",other_wire,self); g_object_unref(other_wire); goto Error; } g_object_try_unref(other_wire); } if(src->dst_wires && dst->src_wires) { if((other_wire=bt_machine_get_wire_by_dst_machine(dst,src)) && (other_wire!=self)) { GST_WARNING("trying to add create already existing wire (reversed): %p!=%p",other_wire,self); g_object_unref(other_wire); goto Error; } g_object_try_unref(other_wire); } // name the wire g_object_get(src,"id",&src_name,NULL); g_object_get(dst,"id",&dst_name,NULL); name=g_strdup_printf("%s_%s",src_name,dst_name); gst_object_set_name(GST_OBJECT(self),name); GST_INFO("naming wire : %s",name); g_free(name); g_free(src_name); g_free(dst_name); // if there is already a wire from src && src has not yet an spreader (in use) if((other_wire=(src->src_wires?(BtWire*)(src->src_wires->data):NULL))) { if(!bt_machine_has_active_spreader(src)) { GST_DEBUG(" other wire from src found"); bt_wire_unlink_machines(other_wire); // create spreader (if needed) if(!bt_machine_activate_spreader(src)) { g_object_unref(other_wire); goto Error; } // correct the link for the other wire if(!bt_wire_link_machines(other_wire)) { GST_ERROR("failed to re-link the machines after inserting internal spreader");goto Error; } } } // if there is already a wire to dst && dst has not yet an adder (in use) if((other_wire=(dst->dst_wires?(BtWire*)(dst->dst_wires->data):NULL))) { if(!bt_machine_has_active_adder(dst)) { GST_DEBUG(" other wire to dst found"); bt_wire_unlink_machines(other_wire); // create adder (if needed) if(!bt_machine_activate_adder(dst)) { g_object_unref(other_wire); goto Error; } // correct the link for the other wire if(!bt_wire_link_machines(other_wire)) { GST_ERROR("failed to re-link the machines after inserting internal adder");goto Error; } } } GST_DEBUG("link prepared, src->ref_ct=%d, dst->ref_ct=%d",G_OBJECT_REF_COUNT(src),G_OBJECT_REF_COUNT(dst)); if(!bt_wire_link_machines(self)) { GST_ERROR("linking machines failed : %p '%s' -> %p '%s'",src,GST_OBJECT_NAME(src),dst,GST_OBJECT_NAME(dst)); goto Error; } else { // register params bt_wire_init_params(self); } GST_DEBUG("linking machines succeeded, src->ref_ct=%d, dst->ref_ct=%d",G_OBJECT_REF_COUNT(src),G_OBJECT_REF_COUNT(dst)); res=TRUE; Error: return(res); } //-- constructor methods /** * bt_wire_new: * @song: the song the new instance belongs to * @src_machine: the data source (#BtSourceMachine or #BtProcessorMachine) * @dst_machine: the data sink (#BtSinkMachine or #BtProcessorMachine) * @err: inform about failed instance creation * * Create a new instance. * The new wire is automaticall added to a songs setup. You don't need to call * #bt_setup_add_wire(setup,wire);. * * Returns: the new instance or %NULL in case of an error */ BtWire *bt_wire_new(const BtSong * const song, const BtMachine * const src_machine, const BtMachine * const dst_machine, GError **err) { return(BT_WIRE(g_object_new(BT_TYPE_WIRE,"construction-error",err,"song",song,"src",src_machine,"dst",dst_machine,NULL))); } //-- methods /** * bt_wire_reconnect: * @self: the wire to re-link * * Call this method after internal elements in a #BtMachine have changed, but * failed to link. * * Returns: %TRUE for success and %FALSE otherwise */ gboolean bt_wire_reconnect(BtWire * const self) { g_return_val_if_fail(BT_IS_WIRE(self),FALSE); // @todo: should not be needed anymore as we have ghostpads! GST_DEBUG("relinking machines '%s' -> '%s'",GST_OBJECT_NAME(self->priv->src),GST_OBJECT_NAME(self->priv->dst)); bt_wire_unlink_machines(self); return(bt_wire_link_machines(self)); } /** * bt_wire_add_wire_pattern: * @self: the wire to add the wire-pattern to * @pattern: the pattern that the wire-pattern is associated with * @wire_pattern: the new wire-pattern instance * * Add the supplied wire-pattern to the wire. This is automatically done by * #bt_wire_pattern_new(). */ void bt_wire_add_wire_pattern(const BtWire * const self, const BtPattern * const pattern, const BtWirePattern * const wire_pattern) { g_hash_table_insert(self->priv->patterns,(gpointer)pattern,(gpointer)g_object_ref((gpointer)wire_pattern)); // notify others that the pattern has been created g_signal_emit((gpointer)self,signals[PATTERN_CREATED_EVENT],0,wire_pattern); } /** * bt_wire_get_pattern: * @self: the wire that has the pattern * @pattern: the pattern that the wire-pattern is associated with * * Gets the wire-pattern that hold the automation data for this @wire. * * Returns: a reference to the wire-pattern, unref when done. */ BtWirePattern *bt_wire_get_pattern(const BtWire * const self, const BtPattern * const pattern) { BtWirePattern *wire_pattern; if((wire_pattern=g_hash_table_lookup(self->priv->patterns,pattern))) { g_object_ref(wire_pattern); } return(wire_pattern); } /** * bt_wire_get_param_index: * @self: the wire to search for the param * @name: the name of the param * @error: the location of an error instance to fill with a message, if an error occures * * Searches the list of registered param of a wire for a param of * the given name and returns the index if found. * * Returns: the index or sets error if it is not found and returns -1. */ glong bt_wire_get_param_index(const BtWire *const self, const gchar * const name, GError **error) { const gulong num_params=self->priv->num_params; glong ret=-1,i; gboolean found=FALSE; g_return_val_if_fail(BT_IS_WIRE(self),-1); g_return_val_if_fail(BT_IS_STRING(name),-1); g_return_val_if_fail(error == NULL || *error == NULL, -1); for(i=0;i=0)) || ((ret==-1) && ((error && *error) || !error)))); return(ret); } /** * bt_wire_get_param_spec: * @self: the wire to search for the param * @index: the offset in the list of params * * Retrieves the parameter specification for the param * * Returns: the #GParamSpec for the requested param */ GParamSpec *bt_wire_get_param_spec(const BtWire * const self, const gulong index) { g_return_val_if_fail(BT_IS_WIRE(self),NULL); g_return_val_if_fail(indexpriv->num_params,NULL); return(self->priv->wire_props[index]); } /** * bt_wire_get_param_type: * @self: the wire to search for the param type * @index: the offset in the list of params * * Retrieves the GType of a param * * Returns: the requested GType */ GType bt_wire_get_param_type(const BtWire * const self, const gulong index) { g_return_val_if_fail(BT_IS_WIRE(self),G_TYPE_INVALID); g_return_val_if_fail(indexpriv->num_params,G_TYPE_INVALID); return(WIRE_PARAM_TYPE(index)); } /** * bt_wire_get_param_name: * @self: the wire to get the param name from * @index: the offset in the list of params * * Gets the param name. Do not modify returned content. * * Returns: the requested name */ const gchar *bt_wire_get_param_name(const BtWire * const self, const gulong index) { g_return_val_if_fail(BT_IS_WIRE(self),NULL); g_return_val_if_fail(indexpriv->num_params,NULL); return(WIRE_PARAM_NAME(index)); } /** * bt_wire_get_param_details: * @self: the wire to search for the param details * @index: the offset in the list of params * @pspec: place for the param spec * @min_val: place to hold new GValue with minimum * @max_val: place to hold new GValue with maximum * * Retrieves the details of a voice param. Any detail can be %NULL if its not * wanted. */ #define _DETAILS(t,T,p) \ case G_TYPE_ ## T: { \ const GParamSpec ## p *p=G_PARAM_SPEC_ ## T(property); \ if(min_val) g_value_set_ ## t(*min_val,p->minimum); \ if(max_val) g_value_set_ ## t(*max_val,p->maximum); \ } break; void bt_wire_get_param_details(const BtWire * const self, const gulong index, GParamSpec **pspec, GValue **min_val, GValue **max_val) { GParamSpec *property=bt_wire_get_param_spec(self,index); if(pspec) { *pspec=property; } if(min_val || max_val) { GType base_type=bt_g_type_get_base_type(property->value_type); if(min_val) { *min_val=g_new0(GValue,1); g_value_init(*min_val,property->value_type); } if(max_val) { *max_val=g_new0(GValue,1); g_value_init(*max_val,property->value_type); } switch(base_type) { _DETAILS(int,INT,Int) _DETAILS(uint,UINT,UInt) _DETAILS(int64,INT64,Int64) _DETAILS(uint64,UINT64,UInt64) _DETAILS(long,LONG,Long) _DETAILS(ulong,ULONG,ULong) _DETAILS(float,FLOAT,Float) _DETAILS(double,DOUBLE,Double) case G_TYPE_BOOLEAN: if(min_val) g_value_set_boolean(*min_val,0); if(max_val) g_value_set_boolean(*max_val,0); break; case G_TYPE_ENUM: { const GParamSpecEnum *enum_property=G_PARAM_SPEC_ENUM(property); const GEnumClass *enum_class=enum_property->enum_class; if(min_val) g_value_set_enum(*min_val,enum_class->minimum); if(max_val) g_value_set_enum(*max_val,enum_class->maximum); } break; default: GST_ERROR("unsupported GType=%lu:'%s' ('%s')",(gulong)property->value_type,g_type_name(property->value_type),g_type_name(base_type)); } } } /** * bt_wire_controller_change_value: * @self: the wire to change the param for * @param: the parameter index * @timestamp: the time stamp of the change * @value: the new value or %NULL to unset a previous one * * Depending on wheter the given value is NULL, sets or unsets the controller * value for the specified param and at the given time. */ /* @todo: we have no default value handling here (see machine) */ void bt_wire_controller_change_value(const BtWire * const self, const gulong param, const GstClockTime timestamp, GValue * const value) { GObject *param_parent=NULL; const gchar *param_name; GstInterpolationControlSource *cs; g_return_if_fail(BT_IS_WIRE(self)); g_return_if_fail(parampriv->num_params); switch(param) { case 0: param_parent=G_OBJECT(self->priv->machines[PART_GAIN]); break; case 1: param_parent=G_OBJECT(self->priv->machines[PART_PAN]); break; default: GST_WARNING("unimplemented wire param"); break; } param_name=WIRE_PARAM_NAME(param); cs=self->priv->wire_control_sources[param]; if(value) { gboolean add=TRUE; // check if the property is alredy controlled if(cs && gst_interpolation_control_source_get_count(cs)) { add=FALSE; } if(G_UNLIKELY(add)) { GstController *ctrl; if((ctrl=gst_object_control_properties(param_parent, param_name, NULL))) { cs=gst_interpolation_control_source_new(); gst_controller_set_control_source(ctrl,param_name,GST_CONTROL_SOURCE(cs)); // set interpolation mode depending on param type gst_interpolation_control_source_set_interpolation_mode(cs,GST_INTERPOLATE_NONE); self->priv->wire_control_sources[param]=cs; } // @todo: is this needed, we're in add=TRUE after all g_object_try_unref(self->priv->wire_controller[param]); self->priv->wire_controller[param]=ctrl; } //GST_INFO("set wire controller: %"GST_TIME_FORMAT" param %d:%s",GST_TIME_ARGS(timestamp),param,name); gst_interpolation_control_source_set(cs,timestamp,value); } else { if(self->priv->wire_controller[param]) { gboolean remove=TRUE; //GST_INFO("%s unset global controller: %"GST_TIME_FORMAT" param %d:%s",self->priv->id,GST_TIME_ARGS(timestamp),param,self->priv->global_names[param]); if(cs) { gst_interpolation_control_source_unset(cs,timestamp); if(gst_interpolation_control_source_get_count(cs)) { remove=FALSE; } } if(remove) { gst_controller_set_control_source(self->priv->wire_controller[param],param_name,NULL); g_object_unref(cs); self->priv->wire_control_sources[param]=NULL; gst_object_uncontrol_properties(param_parent, param_name, NULL); } } } } //-- debug helper GList *bt_wire_get_element_list(const BtWire * const self) { GList *list=NULL; gulong i; for(i=0;ipriv->machines[i]) { list=g_list_append(list,self->priv->machines[i]); } } return(list); } void bt_wire_dbg_print_parts(const BtWire * const self) { gchar *sid=NULL, *did=NULL; if(self->priv->src) g_object_get(self->priv->src,"id",&sid,NULL); if(self->priv->dst) g_object_get(self->priv->dst,"id",&did,NULL); /* [Q T G C P] */ GST_INFO("%s->%s [%s %s %s %s %s %s %s]", safe_string(sid), safe_string(did), self->priv->machines[PART_TEE]?"Q":"q", self->priv->machines[PART_TEE]?"T":"t", self->priv->machines[PART_GAIN]?"G":"g", self->priv->machines[PART_CONVERT]?"C":"c", self->priv->machines[PART_PAN]?"P":"p" ); g_free(sid); g_free(did); } //-- io interface static xmlNodePtr bt_wire_persistence_save(const BtPersistence * const persistence, xmlNodePtr const parent_node) { const BtWire * const self = BT_WIRE(persistence); gchar * const id; xmlNodePtr node=NULL; xmlNodePtr child_node; GST_DEBUG("PERSISTENCE::wire"); if((node=xmlNewChild(parent_node,NULL,XML_CHAR_PTR("wire"),NULL))) { gdouble gain; gfloat pan; g_object_get(self->priv->src,"id",&id,NULL); xmlNewProp(node,XML_CHAR_PTR("src"),XML_CHAR_PTR(id)); g_free(id); g_object_get(self->priv->dst,"id",&id,NULL); xmlNewProp(node,XML_CHAR_PTR("dst"),XML_CHAR_PTR(id)); g_free(id); // serialize gain and panorama g_object_get(self->priv->machines[PART_GAIN],"volume",&gain,NULL); xmlNewProp(node,XML_CHAR_PTR("gain"),XML_CHAR_PTR(bt_persistence_strfmt_double(gain))); if(self->priv->machines[PART_PAN]) { g_object_get(self->priv->machines[PART_PAN],"panorama",&pan,NULL); xmlNewProp(node,XML_CHAR_PTR("panorama"),XML_CHAR_PTR(bt_persistence_strfmt_double((gdouble)pan))); } if(g_hash_table_size(self->priv->properties)) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("properties"),NULL))) { if(!bt_persistence_save_hashtable(self->priv->properties,child_node)) goto Error; } else goto Error; } if(self->priv->patterns) { if((child_node=xmlNewChild(node,NULL,XML_CHAR_PTR("wire-patterns"),NULL))) { GList *list=NULL; g_hash_table_foreach(self->priv->patterns,bt_persistence_collect_hashtable_entries,(gpointer)&list); bt_persistence_save_list(list,child_node); g_list_free(list); } else goto Error; } } Error: return(node); } static BtPersistence *bt_wire_persistence_load(const GType type, const BtPersistence * const persistence, xmlNodePtr node, GError **err, va_list var_args) { BtWire *self; BtPersistence *result; BtSetup *setup = NULL; xmlChar *src_id, *dst_id, *gain_str, *pan_str; xmlNodePtr child_node; GST_DEBUG("PERSISTENCE::wire"); g_assert(node); src_id=xmlGetProp(node,XML_CHAR_PTR("src")); dst_id=xmlGetProp(node,XML_CHAR_PTR("dst")); if(!persistence) { BtSong *song=NULL; BtMachine *src_machine,*dst_machine; gchar *param_name; // we need to get parameters from var_args (need to handle all baseclass params param_name=va_arg(var_args,gchar*); while(param_name) { if(!strcmp(param_name,"song")) { song=va_arg(var_args, gpointer); } else { GST_WARNING("unhandled argument: %s",param_name); break; } param_name=va_arg(var_args,gchar*); } g_object_get(song,"setup",&setup,NULL); src_machine=bt_setup_get_machine_by_id(setup,(gchar *)src_id); dst_machine=bt_setup_get_machine_by_id(setup,(gchar *)dst_id); self=bt_wire_new(song,src_machine,dst_machine,err); result=BT_PERSISTENCE(self); g_object_try_unref(src_machine); g_object_try_unref(dst_machine); if(*err!=NULL) { goto Error; } } else { self=BT_WIRE(persistence); result=BT_PERSISTENCE(self); } xmlFree(src_id); xmlFree(dst_id); if((gain_str=xmlGetProp(node,XML_CHAR_PTR("gain")))) { gdouble gain=g_ascii_strtod((gchar *)gain_str,NULL); g_object_set(self->priv->machines[PART_GAIN],"volume",gain,NULL); xmlFree(gain_str); } if(self->priv->machines[PART_PAN] && (pan_str=xmlGetProp(node,XML_CHAR_PTR("panorama")))) { gfloat pan=g_ascii_strtod((gchar *)pan_str,NULL); g_object_set(self->priv->machines[PART_PAN],"panorama",pan,NULL); xmlFree(pan_str); } for(node=node->children;node;node=node->next) { if(!xmlNodeIsText(node)) { if(!strncmp((gchar *)node->name,"properties\0",11)) { bt_persistence_load_hashtable(self->priv->properties,node); } /* "patterns" is legacy, we need "wire-patterns" as a node name to be unique */ else if(!strncmp((gchar *)node->name,"wire-patterns\0",14) || !strncmp((gchar *)node->name,"patterns\0",9)) { BtWirePattern *wire_pattern; for(child_node=node->children;child_node;child_node=child_node->next) { if((!xmlNodeIsText(child_node)) && (!strncmp((char *)child_node->name,"wire-pattern\0",13) || (!strncmp((char *)child_node->name,"pattern\0",8)))) { GError *err=NULL; wire_pattern=BT_WIRE_PATTERN(bt_persistence_load(BT_TYPE_WIRE_PATTERN,NULL,child_node,&err,"song",self->priv->song,"wire",self,NULL)); if(err!=NULL) { GST_WARNING("Can't create wire-pattern: %s",err->message); g_error_free(err); } g_object_unref(wire_pattern); } } } } } Done: g_object_try_unref(setup); return(result); Error: goto Done; } static void bt_wire_persistence_interface_init(gpointer const g_iface, gpointer const iface_data) { BtPersistenceInterface * const iface = g_iface; iface->load = bt_wire_persistence_load; iface->save = bt_wire_persistence_save; } //-- wrapper //-- class internals static void bt_wire_constructed(GObject *object) { BtWire * const self=BT_WIRE(object); BtSetup * const setup; if(G_OBJECT_CLASS(bt_wire_parent_class)->constructed) G_OBJECT_CLASS(bt_wire_parent_class)->constructed(object); if(BT_IS_SINK_MACHINE(self->priv->src)) goto SrcIsSinkMachineError; if(BT_IS_SOURCE_MACHINE(self->priv->dst)) goto SinkIsSrcMachineError; if(self->priv->src==self->priv->dst) goto SrcIsSinkError; GST_INFO("wire constructor, self->priv=%p, between %p and %p",self->priv,self->priv->src,self->priv->dst); if(self->priv->src && self->priv->dst) { if(!bt_wire_connect(self)) { goto ConnectError; } // add the wire to the setup of the song g_object_get((gpointer)(self->priv->song),"setup",&setup,NULL); bt_setup_add_wire(setup,self); g_object_unref(setup); } else { goto NoMachinesError; } return; ConnectError: GST_WARNING("failed to connect wire"); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "failed to connect wire."); } return; SrcIsSinkMachineError: GST_WARNING("src is sink-machine"); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "src is sink-machine."); } return; SinkIsSrcMachineError: GST_WARNING("sink is src-machine"); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "sink is src-machine."); } return; SrcIsSinkError: GST_WARNING("src and sink are the same machine"); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "src and sink are the same machine."); } return; NoMachinesError: GST_WARNING("src and/or sink are NULL"); if(self->priv->constrution_error) { g_set_error(self->priv->constrution_error, error_domain, /* errorcode= */0, "src=%p and/or sink=%p are NULL.",self->priv->src,self->priv->dst); } return; } /* returns a property for the given property_id for this object */ static void bt_wire_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtWire *const self = BT_WIRE(object); return_if_disposed(); switch (property_id) { case WIRE_CONSTRUCTION_ERROR: { g_value_set_pointer(value, self->priv->constrution_error); } break; case WIRE_PROPERTIES: { g_value_set_pointer(value, self->priv->properties); } break; case WIRE_SONG: { g_value_set_object(value, self->priv->song); } break; case WIRE_SRC: { g_value_set_object(value, self->priv->src); } break; case WIRE_DST: { g_value_set_object(value, self->priv->dst); } break; case WIRE_GAIN: { g_value_set_object(value, self->priv->machines[PART_GAIN]); } break; case WIRE_PAN: { g_value_set_object(value, self->priv->machines[PART_PAN]); } break; case WIRE_NUM_PARAMS: { g_value_set_ulong(value, self->priv->num_params); } break; case WIRE_ANALYZERS: { g_value_set_pointer(value, self->priv->analyzers); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_wire_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtWire *const self = BT_WIRE(object); return_if_disposed(); switch (property_id) { case WIRE_CONSTRUCTION_ERROR: { self->priv->constrution_error=(GError **)g_value_get_pointer(value); } break; case WIRE_SONG: { self->priv->song = BT_SONG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->song); //GST_DEBUG("set the song for wire: %p",self->priv->song); } break; case WIRE_SRC: { self->priv->src=BT_MACHINE(g_value_dup_object(value)); GST_DEBUG("set the source element for the wire: %p, ref_ct=%d",self->priv->src,G_OBJECT_REF_COUNT(self->priv->src)); } break; case WIRE_DST: { self->priv->dst=BT_MACHINE(g_value_dup_object(value)); GST_DEBUG("set the target element for the wire: %p, ref_ct=%d",self->priv->dst,G_OBJECT_REF_COUNT(self->priv->dst)); } break; case WIRE_NUM_PARAMS: { self->priv->num_params = g_value_get_ulong(value); } break; case WIRE_ANALYZERS: { bt_wire_deactivate_analyzers(self); self->priv->analyzers=g_value_get_pointer(value); bt_wire_activate_analyzers(self); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wire_dispose(GObject * const object) { const BtWire *const self = BT_WIRE(object); guint i; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG_OBJECT(self,"!!!! self=%p",self); // unref controllers GST_DEBUG(" releasing controllers"); if(self->priv->machines[PART_GAIN] && self->priv->wire_props[0]) { g_object_try_unref(self->priv->wire_control_sources[0]); //bt_gst_object_deactivate_controller(G_OBJECT(self->priv->machines[PART_GAIN]), WIRE_PARAM_NAME(0)); self->priv->wire_controller[0]=NULL; } if(self->priv->machines[PART_PAN] && self->priv->wire_props[1]) { g_object_try_unref(self->priv->wire_control_sources[1]); //bt_gst_object_deactivate_controller(G_OBJECT(self->priv->machines[PART_PAN]), WIRE_PARAM_NAME(1)); self->priv->wire_controller[1]=NULL; } // remove the GstElements from the bin // @todo: is this actually needed? bt_wire_unlink_machines(self); // removes helper elements if in use bt_wire_deactivate_analyzers(self); // unref the pads for(i=0;ipriv->src_pads[i]) { if(src_pn[i][0]!='\0') { gst_object_unref(self->priv->src_pads[i]); } else { gst_element_release_request_pad(self->priv->machines[i],self->priv->src_pads[i]); gst_object_unref(self->priv->src_pads[i]); } } if(self->priv->sink_pads[i]) gst_object_unref(self->priv->sink_pads[i]); } // remove ghost pads gst_element_remove_pad(GST_ELEMENT(self),self->priv->src_pad); gst_element_remove_pad(GST_ELEMENT(self),self->priv->sink_pad); g_object_try_weak_unref(self->priv->song); //gstreamer uses floating references, therefore elements are destroyed, when removed from the bin GST_DEBUG(" releasing the dst %p, dst->ref_ct=%d", self->priv->dst,G_OBJECT_REF_COUNT(self->priv->dst)); g_object_try_unref(self->priv->dst); GST_DEBUG(" releasing the src %p, src->ref_ct=%d", self->priv->src,G_OBJECT_REF_COUNT(self->priv->src)); g_object_try_unref(self->priv->src); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_wire_parent_class)->dispose(object); GST_DEBUG(" done"); } static void bt_wire_finalize(GObject * const object) { BtWire * const self = BT_WIRE(object); GST_DEBUG_OBJECT(self,"!!!! self=%p",self); g_hash_table_destroy(self->priv->properties); g_hash_table_destroy(self->priv->patterns); G_OBJECT_CLASS(bt_wire_parent_class)->finalize(object); } static void bt_wire_init(BtWire *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WIRE, BtWirePrivate); self->priv->num_params = 1; self->priv->properties=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,g_free); self->priv->patterns=g_hash_table_new_full(NULL,NULL,NULL,(GDestroyNotify)g_object_unref); self->priv->src_pad=gst_ghost_pad_new_no_target("src",GST_PAD_SRC); gst_element_add_pad(GST_ELEMENT(self),self->priv->src_pad); self->priv->sink_pad=gst_ghost_pad_new_no_target("sink",GST_PAD_SINK); gst_element_add_pad(GST_ELEMENT(self),self->priv->sink_pad); GST_DEBUG("!!!! self=%p",self); } static void bt_wire_class_init(BtWireClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); GstElementClass * const gstelement_klass = GST_ELEMENT_CLASS(klass); // g_type_qname() is ((TypeNode *)type)->qname; // seems to be save to call in _class_init //error_domain=g_quark_from_static_string("BtWire"); error_domain=g_type_qname(BT_TYPE_WIRE); g_type_class_add_private(klass,sizeof(BtWirePrivate)); gobject_class->constructed = bt_wire_constructed; gobject_class->set_property = bt_wire_set_property; gobject_class->get_property = bt_wire_get_property; gobject_class->dispose = bt_wire_dispose; gobject_class->finalize = bt_wire_finalize; // disable deep notify { GObjectClass *parent_class=g_type_class_peek_static(G_TYPE_OBJECT); gobject_class->dispatch_properties_changed=parent_class->dispatch_properties_changed; } gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&wire_src_template)); gst_element_class_add_pad_template(gstelement_klass, gst_static_pad_template_get(&wire_sink_template)); /** * BtWire::pattern-created: * @self: the wire-pattern object that emitted the signal * @tick: the tick position inside the pattern * @param: the parameter index * * signals that a param of this wire-pattern has been changed */ signals[PATTERN_CREATED_EVENT] = g_signal_new("pattern-created", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, // return type 1, // n_params BT_TYPE_WIRE_PATTERN // param data ); g_object_class_install_property(gobject_class,WIRE_CONSTRUCTION_ERROR, g_param_spec_pointer("construction-error", "construction error prop", "signal failed instance creation", G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_PROPERTIES, g_param_spec_pointer("properties", "properties prop", "list of wire properties", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_SONG, g_param_spec_object("song", "song construct prop", "the song object, the wire belongs to", BT_TYPE_SONG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_SRC, g_param_spec_object("src", "src ro prop", "src machine object, the wire links to", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_DST, g_param_spec_object("dst", "dst ro prop", "dst machine object, the wire links to", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_GAIN, g_param_spec_object("gain", "gain element prop", "the gain element for the connection", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_PAN, g_param_spec_object("pan", "panorama element prop", "the panorama element for the connection", GST_TYPE_ELEMENT, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_NUM_PARAMS, g_param_spec_ulong("num-params", "num-params prop", "number of params for the wire", 0, BT_WIRE_MAX_NUM_PARAMS, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_ANALYZERS, g_param_spec_pointer("analyzers", "analyzers prop", "list of wire analyzers", G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/buzztard.xml.in0000644042355400116100000000134611600712550014643 00000000000000 buzztard song buzztard song (xml) buzztard-0.6.0/src/lib/Makefile.in0000644042355400116100000006026311675570634013740 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/lib DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/buzztard.xml.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = buzztard.xml CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive 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__installdirs = "$(DESTDIR)$(sharedmimepackagedir)" DATA = $(sharedmimepackage_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = ic core # generate and install .xml mime info file sharedmimedir = $(datadir)/mime sharedmimepackagedir = $(sharedmimedir)/packages sharedmimepackage_in_files = buzztard.xml.in sharedmimepackage_DATA = $(sharedmimepackage_in_files:.xml.in=.xml) CLEANFILES = $(sharedmimepackage_DATA) EXTRA_DIST = $(sharedmimepackage_in_files) all: all-recursive .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 src/lib/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): buzztard.xml: $(top_builddir)/config.status $(srcdir)/buzztard.xml.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-sharedmimepackageDATA: $(sharedmimepackage_DATA) @$(NORMAL_INSTALL) test -z "$(sharedmimepackagedir)" || $(MKDIR_P) "$(DESTDIR)$(sharedmimepackagedir)" @list='$(sharedmimepackage_DATA)'; test -n "$(sharedmimepackagedir)" || list=; \ 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)$(sharedmimepackagedir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(sharedmimepackagedir)" || exit $$?; \ done uninstall-sharedmimepackageDATA: @$(NORMAL_UNINSTALL) @list='$(sharedmimepackage_DATA)'; test -n "$(sharedmimepackagedir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(sharedmimepackagedir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sharedmimepackagedir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(sharedmimepackagedir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-sharedmimepackageDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-local uninstall-sharedmimepackageDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-data-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-hook 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-sharedmimepackageDATA install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-local \ uninstall-sharedmimepackageDATA @INTLTOOL_XML_RULE@ buzztard.xml: buzztard.xml.in # update mime database install-data-hook: test -z "$(UPDATE_MIME_DATABASE)" || $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(sharedmimedir)"; uninstall-local: uninstall-sharedmimepackageDATA test -z "$(UPDATE_MIME_DATABASE)" || $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(sharedmimedir)"; .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/lib/ic/0000755042355400116100000000000011675570651012336 500000000000000buzztard-0.6.0/src/lib/ic/input-device.c0000644042355400116100000004043311656324121015006 00000000000000/* $Id: input-device.c 3705 2011-11-08 22:08:15Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticinputdevice * @short_description: buzztards interaction controller input device * * Event handling for input devices (joystick,hdaps,wiimote). */ /* * http://linuxconsole.cvs.sourceforge.net/linuxconsole/ruby/utils/ * http://www.frogmouth.net/hid-doco/linux-hid.html * * http://gentoo-wiki.com/HOWTO_Joystick_Setup * http://www.wiili.org/index.php/Wiimote * * This is lowlevel * http://libhid.alioth.debian.org/ */ #define BTIC_CORE #define BTIC_INPUT_DEVICE_C #include "ic_private.h" #include #include #include #include #include enum { DEVICE_DEVNODE=1 }; struct _BtIcInputDevicePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; gchar *devnode; /* io channel */ GIOChannel *io_channel; gint io_source; }; //-- the class G_DEFINE_TYPE (BtIcInputDevice, btic_input_device, BTIC_TYPE_DEVICE); //-- helper #define test_bit(bit, array) (array[bit>>3] & (1<<(bit&0x7))) static gboolean register_trigger_controls(const BtIcInputDevice * const self,int fd) { guint ix; guint8 key_bitmask[KEY_MAX/8 + 1]; const gchar *name = NULL; gulong key; memset(key_bitmask, 0, sizeof(key_bitmask)); if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) < 0) { GST_WARNING("evdev ioctl : %s",g_strerror(errno)); return(FALSE); } // read details for (ix = 0; ix < KEY_MAX; ix++) { if (test_bit(ix, key_bitmask)) { GST_DEBUG("Key 0x%02x", ix); switch (ix) { case BTN_0 : name="Button 0"; break; case BTN_1 : name="Button 1"; break; case BTN_2 : name="Button 2"; break; case BTN_3 : name="Button 3"; break; case BTN_4 : name="Button 4"; break; case BTN_5 : name="Button 5"; break; case BTN_6 : name="Button 6"; break; case BTN_7 : name="Button 7"; break; case BTN_8 : name="Button 8"; break; case BTN_9 : name="Button 9"; break; case BTN_LEFT : name="Left Button"; break; case BTN_RIGHT : name="Right Button"; break; case BTN_MIDDLE : name="Middle Button"; break; case BTN_SIDE : name="Side Button"; break; case BTN_EXTRA : name="Extra Button"; break; case BTN_FORWARD : name="Forward Button"; break; case BTN_BACK : name="Back Button"; break; case BTN_TRIGGER : name="Trigger Button"; break; case BTN_THUMB : name="Thumb Button"; break; case BTN_THUMB2 : name="Second Thumb Button"; break; case BTN_TOP : name="Top Button"; break; case BTN_TOP2 : name="Second Top Button"; break; case BTN_PINKIE : name="Pinkie Button"; break; case BTN_BASE : name="Base Button"; break; case BTN_BASE2 : name="Second Base Button"; break; case BTN_BASE3 : name="Third Base Button"; break; case BTN_BASE4 : name="Fourth Base Button"; break; case BTN_BASE5 : name="Fifth Base Button"; break; case BTN_BASE6 : name="Sixth Base Button"; break; case BTN_DEAD : name="Dead Button"; break; case BTN_A : name="Button A"; break; case BTN_B : name="Button B"; break; case BTN_C : name="Button C"; break; case BTN_X : name="Button X"; break; case BTN_Y : name="Button Y"; break; case BTN_Z : name="Button Z"; break; case BTN_TL : name="Thumb Left Button"; break; case BTN_TR : name="Thumb Right Button "; break; case BTN_TL2 : name="Second Thumb Left Button"; break; case BTN_TR2 : name="Second Thumb Right Button "; break; case BTN_SELECT : name="Select Button"; break; case BTN_MODE : name="Mode Button"; break; case BTN_THUMBL : name="Another Left Thumb Button "; break; case BTN_THUMBR : name="Another Right Thumb Button "; break; case BTN_TOOL_PEN : name="Digitiser Pen Tool"; break; case BTN_TOOL_RUBBER : name="Digitiser Rubber Tool"; break; case BTN_TOOL_BRUSH : name="Digitiser Brush Tool"; break; case BTN_TOOL_PENCIL : name="Digitiser Pencil Tool"; break; case BTN_TOOL_AIRBRUSH : name="Digitiser Airbrush Tool"; break; case BTN_TOOL_FINGER : name="Digitiser Finger Tool"; break; case BTN_TOOL_MOUSE : name="Digitiser Mouse Tool"; break; case BTN_TOOL_LENS : name="Digitiser Lens Tool"; break; case BTN_TOUCH : name="Digitiser Touch Button"; break; case BTN_STYLUS : name="Digitiser Stylus Button"; break; case BTN_STYLUS2 : name="Second Digitiser Stylus Button"; break; default: GST_INFO("Unknown key: %d",ix); } if(name) { // BtIcTriggerControl *control; // create controller instances and register them key=(((guint)EV_KEY)<<16)|(guint)ix; /*control = */btic_trigger_control_new(BTIC_DEVICE(self),name,key); } } } return(TRUE); } static gboolean register_abs_range_controls(const BtIcInputDevice * const self,int fd) { guint ix; guint8 abs_bitmask[ABS_MAX/8 + 1]; struct input_absinfo abs_features; const gchar *name = NULL; gulong key; memset(abs_bitmask, 0, sizeof(abs_bitmask)); if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask) < 0) { GST_WARNING("evdev ioctl : %s",g_strerror(errno)); return(FALSE); } // read details for (ix = 0; ix < ABS_MAX; ix++) { if (test_bit(ix, abs_bitmask)) { GST_DEBUG("Absolute Axis 0x%02x", ix); switch (ix) { case ABS_X : name="X axis";break; case ABS_Y : name="Y axis";break; case ABS_Z : name="Z axis";break; case ABS_RX : name="X rate axis";break; case ABS_RY : name="Y rate axis";break; case ABS_RZ : name="Z rate axis";break; case ABS_THROTTLE : name="Throttle";break; case ABS_RUDDER : name="Rudder";break; case ABS_WHEEL : name="Wheel";break; case ABS_GAS : name="Accelerator";break; case ABS_BRAKE : name="Brake";break; case ABS_HAT0X : name="Hat zero, x axis";break; case ABS_HAT0Y : name="Hat zero, y axis";break; case ABS_HAT1X : name="Hat one, x axis";break; case ABS_HAT1Y : name="Hat one, y axis";break; case ABS_HAT2X : name="Hat two, x axis";break; case ABS_HAT2Y : name="Hat two, y axis";break; case ABS_HAT3X : name="Hat three, x axis";break; case ABS_HAT3Y : name="Hat three, y axis";break; case ABS_PRESSURE : name="Pressure";break; case ABS_DISTANCE : name="Distance";break; case ABS_TILT_X : name="Tilt, X axis";break; case ABS_TILT_Y : name="Tilt, Y axis";break; case ABS_MISC : name="Miscellaneous";break; default: GST_INFO("Unknown absolute axis : 0x%02x ", ix); } memset(&abs_features, 0, sizeof(abs_features)); if(ioctl(fd, EVIOCGABS(ix), &abs_features) < 0) { GST_WARNING("evdev EVIOCGABS ioctl : %s",g_strerror(errno)); } else { GST_DEBUG("min: %d, max: %d, flatness: %d, fuzz: %d", abs_features.minimum,abs_features.maximum, abs_features.flat, // default = middle value abs_features.fuzz // tolerance ); if(name) { // BtIcAbsRangeControl *control; // create controller instances and register them key=(((guint)EV_ABS)<<16)|(guint)ix; /*control = */btic_abs_range_control_new(BTIC_DEVICE(self),name,key, (glong)abs_features.minimum, (glong)abs_features.maximum, (glong)abs_features.flat); } } } } // create controller instances and register them return(TRUE); } static gboolean register_controls(const BtIcInputDevice * const self) { int fd; guint ix; guint8 evtype_bitmask[EV_MAX/8 + 1]; GST_INFO("checking controls : %s",self->priv->devnode); if ((fd = open(self->priv->devnode, O_RDONLY)) < 0) { GST_WARNING("evdev open failed on device %s: %s",self->priv->devnode,g_strerror(errno)); return(FALSE); } GST_INFO("opened device : %s",self->priv->devnode); // query capabillities and register controllers // FIXME: doing that for e.g. js0/js1 fails slowly memset(evtype_bitmask, 0, sizeof(evtype_bitmask)); if(ioctl(fd, EVIOCGBIT(0, sizeof(evtype_bitmask)), evtype_bitmask) < 0) { GST_WARNING("evdev ioctl : %s",g_strerror(errno)); } else { // check supported event types for (ix = 0; ix < EV_MAX; ix++) { if (test_bit(ix, evtype_bitmask)) { switch (ix) { case EV_SYN: break; case EV_KEY: GST_INFO("Keys or Buttons"); register_trigger_controls(self,fd); break; case EV_REL : GST_INFO("Relative Axes"); break; case EV_ABS: GST_INFO("Absolute Axes"); register_abs_range_controls(self,fd); break; case EV_MSC: GST_INFO("Miscellaneous"); break; case EV_LED: GST_INFO("LEDs"); break; case EV_SND: GST_INFO("Sounds"); break; case EV_REP: GST_INFO("Repeat"); break; case EV_FF: GST_INFO("Force Feedback"); break; default: GST_INFO("Unknown event type: 0x%04hx", ix); } } } } close(fd); return(TRUE); } //-- handler static gboolean io_handler(GIOChannel *channel,GIOCondition condition,gpointer user_data) { BtIcInputDevice *self=BTIC_INPUT_DEVICE(user_data); BtIcControl *control; GError *error=NULL; struct input_event ev; guint key; gboolean res=TRUE; //GST_INFO("io handler : %d",condition); if(condition & (G_IO_IN | G_IO_PRI)) { g_io_channel_read_chars(self->priv->io_channel, (gchar *)&ev, sizeof(struct input_event),NULL,&error); if(error) { GST_WARNING("iochannel error when reading: %s",error->message); g_error_free(error); } else { key=(((guint)ev.type)<<16)|(guint)ev.code; if((control=btic_device_get_control_by_id(BTIC_DEVICE(self),key))) { switch(ev.type) { case EV_KEY: //GST_INFO("key/button event: value %d, code 0x%x",ev.value,ev.code); g_object_set(control,"value",(gboolean)ev.value,NULL); break; case EV_ABS: //GST_INFO("abs axis event: value %d, code 0x%x",ev.value,ev.code); g_object_set(control,"value",(glong)ev.value,NULL); break; default: GST_INFO("unhandled control event: type 0x%x, value %d, code 0x%x",ev.type,ev.value,ev.code); } } } } if(condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) { res=FALSE; } if(!res) { GST_INFO("closing connection"); self->priv->io_source=-1; } return(res); } //-- constructor methods /** * btic_input_device_new: * @udi: the udi of the device * @name: human readable name * @devnode: device node in filesystem * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtIcInputDevice *btic_input_device_new(const gchar *udi,const gchar *name,const gchar *devnode) { return(BTIC_INPUT_DEVICE(g_object_new(BTIC_TYPE_INPUT_DEVICE,"udi",udi,"name",name,"devnode",devnode,NULL))); } //-- methods static gboolean btic_input_device_start(gconstpointer _self) { BtIcInputDevice *self=BTIC_INPUT_DEVICE(_self); GError *error=NULL; // start the io-loop self->priv->io_channel=g_io_channel_new_file(self->priv->devnode,"r",&error); if(error) { GST_WARNING("iochannel error for open(%s): %s",self->priv->devnode,error->message); g_error_free(error); return(FALSE); } g_io_channel_set_encoding(self->priv->io_channel,NULL,&error); if(error) { GST_WARNING("iochannel error for settin encoding to NULL: %s",error->message); g_error_free(error); g_io_channel_unref(self->priv->io_channel); self->priv->io_channel=NULL; return(FALSE); } self->priv->io_source=g_io_add_watch_full(self->priv->io_channel, G_PRIORITY_LOW, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, io_handler, (gpointer)self, NULL); return(TRUE); } static gboolean btic_input_device_stop(gconstpointer _self) { BtIcInputDevice *self=BTIC_INPUT_DEVICE(_self); // stop the io-loop if(self->priv->io_channel) { if(self->priv->io_source>=0) { g_source_remove(self->priv->io_source); self->priv->io_source=-1; } g_io_channel_unref(self->priv->io_channel); self->priv->io_channel=NULL; } return(TRUE); } //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void btic_input_device_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcInputDevice * const self = BTIC_INPUT_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_DEVNODE: { g_value_set_string(value, self->priv->devnode); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_input_device_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcInputDevice * const self = BTIC_INPUT_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_DEVNODE: { self->priv->devnode = g_value_dup_string(value); //g_assert(!btic_device_has_controls(BTIC_DEVICE(self))); register_controls(self); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_input_device_dispose(GObject * const object) { const BtIcInputDevice * const self = BTIC_INPUT_DEVICE(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); btic_input_device_stop(self); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_input_device_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_input_device_finalize(GObject * const object) { const BtIcInputDevice * const self = BTIC_INPUT_DEVICE(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->devnode); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_input_device_parent_class)->finalize(object); GST_DEBUG(" done"); } static void btic_input_device_init(BtIcInputDevice *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_INPUT_DEVICE, BtIcInputDevicePrivate); } static void btic_input_device_class_init(BtIcInputDeviceClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); BtIcDeviceClass * const bticdevice_class = BTIC_DEVICE_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcInputDevicePrivate)); gobject_class->set_property = btic_input_device_set_property; gobject_class->get_property = btic_input_device_get_property; gobject_class->dispose = btic_input_device_dispose; gobject_class->finalize = btic_input_device_finalize; bticdevice_class->start = btic_input_device_start; bticdevice_class->stop = btic_input_device_stop; g_object_class_install_property(gobject_class,DEVICE_DEVNODE, g_param_spec_string("devnode", "devnode prop", "device node path", NULL, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/hal-discoverer.c0000644042355400116100000001730511576360372015334 00000000000000/* $Id: hal-discoverer.c 3185 2011-02-06 21:05:08Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btichaldiscoverer * @short_description: hal based device discovery * * Discover input and midi devices using hal. */ #define BTIC_CORE #define BTIC_HAL_DISCOVERER_C #include "ic_private.h" struct _BtIcHalDiscovererPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; LibHalContext *ctx; DBusError dbus_error; DBusConnection *dbus_conn; }; //-- the class G_DEFINE_TYPE (BtIcHalDiscoverer, btic_hal_discoverer, G_TYPE_OBJECT); //-- helper static void on_device_added(LibHalContext *ctx, const gchar *udi) { gchar **cap; gchar *hal_category; gchar *temp,*parent_udi; gchar *name,*devnode,*type; size_t n; BtIcDevice *device=NULL; if(!(cap=libhal_device_get_property_strlist(ctx,udi,"info.capabilities",NULL))) { return; } if(!(hal_category=libhal_device_get_property_string(ctx,udi,"info.category",NULL))) { libhal_free_string_array(cap); return; } name=libhal_device_get_property_string(ctx,udi,"info.product",NULL); for(n=0;cap[n];n++) { // midi devices seem to appear only as oss under hal? // @todo: try alsa.sequencer if(!strcmp(cap[n],"alsa.sequencer")) { temp=libhal_device_get_property_string(ctx,udi,"info.parent",NULL); parent_udi=libhal_device_get_property_string(ctx,temp,"info.parent",NULL); libhal_free_string(temp); devnode=libhal_device_get_property_string(ctx,udi,"alsa.device_file",NULL); GST_INFO("alsa device added: type=%s, device_file=%s, vendor=%s", libhal_device_get_property_string(ctx,udi,"alsa.type",NULL), devnode, libhal_device_get_property_string(ctx,parent_udi,"info.vendor",NULL) ); // create device device=BTIC_DEVICE(btic_midi_device_new(udi,name,devnode)); libhal_free_string(devnode); libhal_free_string(parent_udi); } if(!strcmp(cap[n],"oss")) { type=libhal_device_get_property_string(ctx,udi,"oss.type",NULL); if(!strcmp(type,"midi")) { devnode=libhal_device_get_property_string(ctx,udi,"oss.device_file",NULL); GST_INFO("midi device added: product=%s, devnode=%s", name,devnode); // create device device=BTIC_DEVICE(btic_midi_device_new(udi,name,devnode)); libhal_free_string(devnode); } libhal_free_string(type); } #ifdef HAVE_LINUX_INPUT_H else if(!strcmp(cap[n],"input")) { devnode=libhal_device_get_property_string(ctx,udi,"input.device",NULL); GST_INFO("input device added: product=%s, devnode=%s", name,devnode); // create device device=BTIC_DEVICE(btic_input_device_new(udi,name,devnode)); libhal_free_string(devnode); } #endif } libhal_free_string_array(cap); // finished checking devices regarding capabilities, now checking category if(!strcmp(hal_category,"alsa")) { gchar *alsatype = libhal_device_get_property_string(ctx,udi,"alsa.type",NULL); if(!strcmp(alsatype,"midi")) { devnode=libhal_device_get_property_string(ctx,udi,"linux.device_file",NULL); GST_INFO("midi device added: product=%s, devnode=%s", name,devnode); // create device device=BTIC_DEVICE(btic_midi_device_new(udi,name,devnode)); libhal_free_string(devnode); } libhal_free_string(alsatype); } if(device) { btic_registry_add_device(device); } else { GST_DEBUG("unknown device found, not added: name=%s",name); } libhal_free_string(hal_category); libhal_free_string(name); } static void on_device_removed(LibHalContext *ctx, const gchar *udi) { btic_registry_remove_device_by_udi(udi); } static void hal_scan(BtIcHalDiscoverer *self, const gchar *subsystem) { gchar **devices; gint i,num_devices; if((devices=libhal_find_device_by_capability(self->priv->ctx,subsystem,&num_devices,&self->priv->dbus_error))) { GST_INFO("%d %s devices found, trying add..",num_devices,subsystem); for(i=0;ipriv->ctx,devices[i]); } libhal_free_string_array(devices); } } //-- constructor methods /** * btic_hal_discoverer_new: * * Create a new instance * * Returns: the new instance */ BtIcHalDiscoverer *btic_hal_discoverer_new(void) { return(g_object_new(BTIC_TYPE_HAL_DISCOVERER,NULL)); } //-- methods //-- wrapper //-- class internals static void btic_hal_discoverer_dispose(GObject * const object) { const BtIcHalDiscoverer * const self = BTIC_HAL_DISCOVERER(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); libhal_ctx_free(self->priv->ctx); dbus_error_free(&self->priv->dbus_error); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_hal_discoverer_parent_class)->dispose(object); GST_DEBUG(" done"); } static GObject *btic_hal_discoverer_constructor(GType type,guint n_construct_params,GObjectConstructParam *construct_params) { BtIcHalDiscoverer *self; self=BTIC_HAL_DISCOVERER(G_OBJECT_CLASS(btic_hal_discoverer_parent_class)->constructor(type,n_construct_params,construct_params)); // init dbus dbus_error_init(&self->priv->dbus_error); self->priv->dbus_conn=dbus_bus_get(DBUS_BUS_SYSTEM,&self->priv->dbus_error); if(dbus_error_is_set(&self->priv->dbus_error)) { GST_WARNING("Could not connect to system bus %s", self->priv->dbus_error.message); goto done; } dbus_connection_setup_with_g_main(self->priv->dbus_conn,NULL); dbus_connection_set_exit_on_disconnect(self->priv->dbus_conn,FALSE); GST_DEBUG("dbus init okay"); // init hal if(!(self->priv->ctx=libhal_ctx_new())) { GST_WARNING("Could not create hal context"); goto done; } if(!libhal_ctx_set_dbus_connection(self->priv->ctx,self->priv->dbus_conn)) { GST_WARNING("Failed to set dbus connection to hal ctx"); goto done; } GST_DEBUG("hal init okay"); // register notify handler for add/remove libhal_ctx_set_device_added(self->priv->ctx,on_device_added); libhal_ctx_set_device_removed(self->priv->ctx,on_device_removed); if(!(libhal_ctx_init(self->priv->ctx,&self->priv->dbus_error))) { if(dbus_error_is_set(&self->priv->dbus_error)) { GST_WARNING("Could not init hal %s", singleton->priv->dbus_error.message); } goto done; } // scan already plugged devices via hal hal_scan(self,"input"); hal_scan(self,"alsa"); hal_scan(self,"alsa.sequencer"); hal_scan(self,"oss"); done: return((GObject *)self); } static void btic_hal_discoverer_init(BtIcHalDiscoverer *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_HAL_DISCOVERER, BtIcHalDiscovererPrivate); } static void btic_hal_discoverer_class_init(BtIcHalDiscovererClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcHalDiscovererPrivate)); gobject_class->constructor = btic_hal_discoverer_constructor; gobject_class->dispose = btic_hal_discoverer_dispose; } buzztard-0.6.0/src/lib/ic/ic_private.h0000644042355400116100000000522611626642262014553 00000000000000/* $Id: ic_private.h 3613 2011-08-29 07:50:08Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_IC_PRIVATE_H #define BT_IC_PRIVATE_H #ifdef HAVE_CONFIG_H # include "config.h" #endif //-- ansi c #define __USE_ISOC99 /* for isinf() and co. */ #include #include #include #include //#define _XOPEN_SOURCE /* glibc2 needs this */ #define __USE_XOPEN #include #include #include //-- locale #ifdef HAVE_X11_XLOCALE_H /* defines a more portable setlocale for X11 (_Xsetlocale) */ #include #else #include #endif //-- gudev / hal/dbus #if USE_GUDEV #include #elif USE_HAL #include #include #include #include #include #endif //-- i18n #ifndef _ #ifdef ENABLE_NLS #include #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define __(String) (String) #define N_(String) (String) #ifdef gettext #undef gettext #endif #define gettext(String) (String) #ifdef dgettext #undef dgettext #endif #define dgettext(Domain,String) (String) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #endif //-- libbtcore #include #include #if USE_GUDEV #include "libbuzztard-ic/gudev-discoverer.h" #elif USE_HAL #include "libbuzztard-ic/hal-discoverer.h" #endif #ifdef HAVE_LINUX_INPUT_H #include "libbuzztard-ic/input-device.h" #endif #include "libbuzztard-ic/midi-device.h" #include "version.h" #define GST_CAT_DEFAULT btic_debug #ifndef BTIC_CORE_C GST_DEBUG_CATEGORY_EXTERN(GST_CAT_DEFAULT); #endif #endif // BT_IC_PRIVATE_H buzztard-0.6.0/src/lib/ic/abs-range-control.c0000644042355400116100000001572311634456242015741 00000000000000/* $Id: abs-range-control.c 3634 2011-09-15 20:14:25Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticabsrangecontrol * @short_description: buzztards interaction controller single absolute range control * * Absolute range control. The state of the hardware control can be read from * BtIcAbsRangeControl:value. */ #define BTIC_CORE #define BTIC_ABS_RANGE_CONTROL_C #include "ic_private.h" enum { ABS_RANGE_CONTROL_VALUE=1, ABS_RANGE_CONTROL_MIN, ABS_RANGE_CONTROL_MAX, ABS_RANGE_CONTROL_DEF }; struct _BtIcAbsRangeControlPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; glong value; glong min,max,def; }; //-- the class G_DEFINE_TYPE (BtIcAbsRangeControl, btic_abs_range_control, BTIC_TYPE_CONTROL); //-- helper //-- handler //-- constructor methods /** * btic_abs_range_control_new: * @device: the device it belongs to * @name: human readable name * @id: unique identifier per device * @min: minimum value * @max: maximum value * @def: default value * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtIcAbsRangeControl *btic_abs_range_control_new(const BtIcDevice *device,const gchar *name,guint id,glong min,glong max,glong def) { BtIcAbsRangeControl *self=BTIC_ABS_RANGE_CONTROL(g_object_new(BTIC_TYPE_ABS_RANGE_CONTROL,"device",device,"name",name,"id",id,"min",min,"max",max,"def",def,NULL)); if(!self) { goto Error; } // register myself with the device btic_device_add_control(device,BTIC_CONTROL(self)); return(self); Error: g_object_try_unref(self); return(NULL); } //-- methods //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void btic_abs_range_control_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcAbsRangeControl * const self = BTIC_ABS_RANGE_CONTROL(object); return_if_disposed(); switch (property_id) { case ABS_RANGE_CONTROL_VALUE: { g_value_set_long(value, self->priv->value); } break; case ABS_RANGE_CONTROL_MIN: { g_value_set_long(value, self->priv->min); } break; case ABS_RANGE_CONTROL_MAX: { g_value_set_long(value, self->priv->max); } break; case ABS_RANGE_CONTROL_DEF: { g_value_set_long(value, self->priv->def); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_abs_range_control_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcAbsRangeControl * const self = BTIC_ABS_RANGE_CONTROL(object); return_if_disposed(); switch (property_id) { case ABS_RANGE_CONTROL_VALUE: { self->priv->value = g_value_get_long(value); } break; case ABS_RANGE_CONTROL_MIN: { self->priv->min = g_value_get_long(value); } break; case ABS_RANGE_CONTROL_MAX: { self->priv->max = g_value_get_long(value); } break; case ABS_RANGE_CONTROL_DEF: { self->priv->def = g_value_get_long(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_abs_range_control_dispose(GObject * const object) { const BtIcAbsRangeControl * const self = BTIC_ABS_RANGE_CONTROL(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_abs_range_control_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_abs_range_control_init(BtIcAbsRangeControl *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_ABS_RANGE_CONTROL, BtIcAbsRangeControlPrivate); } static void btic_abs_range_control_class_init(BtIcAbsRangeControlClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcAbsRangeControlPrivate)); gobject_class->set_property = btic_abs_range_control_set_property; gobject_class->get_property = btic_abs_range_control_get_property; gobject_class->dispose = btic_abs_range_control_dispose; g_object_class_install_property(gobject_class,ABS_RANGE_CONTROL_VALUE, g_param_spec_long("value", "value prop", "control value", G_MINLONG, G_MAXLONG, 0, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,ABS_RANGE_CONTROL_MIN, g_param_spec_long("min", "min prop", "minimum control value", G_MINLONG, G_MAXLONG, G_MINLONG, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,ABS_RANGE_CONTROL_MAX, g_param_spec_long("max", "max prop", "maximum control value", G_MINLONG, G_MAXLONG, G_MAXLONG, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,ABS_RANGE_CONTROL_DEF, g_param_spec_long("def", "def prop", "default control value", G_MINLONG, G_MAXLONG, 0, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/control.c0000644042355400116100000001430511670066127014076 00000000000000/* $Id: control.c 3758 2011-12-08 07:50:46Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticcontrol * @short_description: buzztards interaction controller single control * * Abstract base class for controls. */ /* @todo: need flags=BTIC_CONTROL_ABS,BTIC_CONTROL_TRIGGER,... to quickly filter * * @todo: new subclasses: * - BTIC_CONTROL_KEY (midi keyboard, computer keyboard) * - value would be a guint with the key-number (see GSTBT_NOTE_*) * - if a midi keyboard is polyphonic, should it register multiple controls? * - when we bind it, we need to smartly assign the controls to voices * - if a synth has 4 voices we assign key0->voice0, key1->voice1, ... * - a max number of e.g. 16 voices shold be enough in practise (given that * one has 10 fingers) * - the device class would implement the voice allocation * - e.g. round-robin, ev. take key-release or velocity into account * - we could have virtual devices to define key-zones * (those could be assigned separately). so if the device is called "midi", * the virtual ones could be named "midi(C-0 B-1)" and "midi(C-1 B-2)" */ #define BTIC_CORE #define BTIC_CONTROL_C #include "ic_private.h" enum { CONTROL_DEVICE=1, CONTROL_NAME, CONTROL_ID }; struct _BtIcControlPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; G_POINTER_ALIAS(BtIcDevice *,device); gchar *name; guint id; }; //-- the class G_DEFINE_ABSTRACT_TYPE (BtIcControl, btic_control, G_TYPE_OBJECT); //-- helper //-- handler //-- constructor methods //-- methods //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void btic_control_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcControl * const self = BTIC_CONTROL(object); return_if_disposed(); switch (property_id) { case CONTROL_DEVICE: { g_value_set_object(value, self->priv->device); } break; case CONTROL_NAME: { g_value_set_string(value, self->priv->name); } break; case CONTROL_ID: { g_value_set_uint(value, self->priv->id); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_control_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcControl * const self = BTIC_CONTROL(object); return_if_disposed(); switch (property_id) { case CONTROL_DEVICE: { self->priv->device = BTIC_DEVICE(g_value_get_object(value)); g_object_try_weak_ref(self->priv->device); } break; case CONTROL_NAME: { self->priv->name = g_value_dup_string(value); } break; case CONTROL_ID: { self->priv->id = g_value_get_uint(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_control_dispose(GObject * const object) { const BtIcControl * const self = BTIC_CONTROL(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); g_object_try_weak_unref(self->priv->device); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_control_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_control_finalize(GObject * const object) { const BtIcControl * const self = BTIC_CONTROL(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->name); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_control_parent_class)->finalize(object); GST_DEBUG(" done"); } static void btic_control_init(BtIcControl *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_CONTROL, BtIcControlPrivate); } static void btic_control_class_init(BtIcControlClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcControlPrivate)); gobject_class->set_property = btic_control_set_property; gobject_class->get_property = btic_control_get_property; gobject_class->dispose = btic_control_dispose; gobject_class->finalize = btic_control_finalize; g_object_class_install_property(gobject_class,CONTROL_DEVICE, g_param_spec_object("device", "device prop", "parent device object", BTIC_TYPE_DEVICE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,CONTROL_NAME, g_param_spec_string("name", "name prop", "control name", NULL, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,CONTROL_ID, g_param_spec_uint("id", "id prop", "control id (for lookups)", 0,G_MAXUINT,0, G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/registry.c0000644042355400116100000001572411576360372014300 00000000000000/* $Id: registry.c 3316 2011-04-13 19:12:28Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticregistry * @short_description: buzztards interaction controller registry * * Manages a dynamic list of controller devices. It uses HAL and dbus. */ /* * http://webcvs.freedesktop.org/hal/hal/doc/spec/hal-spec.html?view=co */ #define BTIC_CORE #define BTIC_REGISTRY_C #include "ic_private.h" enum { REGISTRY_DEVICE_LIST=1 }; struct _BtIcRegistryPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* list of BtIcDevice objects */ GList *devices; #if USE_GUDEV BtIcGudevDiscoverer *gudev_discoverer; #elif USE_HAL BtIcHalDiscoverer *hal_discoverer; #endif }; static BtIcRegistry *singleton=NULL; //-- the class G_DEFINE_TYPE (BtIcRegistry, btic_registry, G_TYPE_OBJECT); //-- helper //-- constructor methods /** * btic_registry_new: * * Create a new instance * * Returns: the new instance */ BtIcRegistry *btic_registry_new(void) { return(g_object_new(BTIC_TYPE_REGISTRY,NULL)); } //-- methods /** * btic_registry_remove_device_by_udi: * @udi: device id * * Remove device identified by the given @udi from the registry. * * Only to be used by discoverers. */ void btic_registry_remove_device_by_udi(const gchar *udi) { BtIcRegistry *self=singleton; GList *node; BtIcDevice *device; gchar *device_udi; g_return_if_fail(self); // search for device by udi for(node=self->priv->devices;node;node=g_list_next(node)) { device=BTIC_DEVICE(node->data); g_object_get(device,"udi",&device_udi,NULL); if(!strcmp(udi,device_udi)) { // remove devices from our list and trigger notify self->priv->devices=g_list_delete_link(self->priv->devices,node); g_object_unref(device); g_object_notify(G_OBJECT(self),"devices"); break; } g_free(device_udi); } } /** * btic_registry_add_device: * @device: new device * * Add the given device to the registry. * * Only to be used by discoverers. */ void btic_registry_add_device(BtIcDevice *device) { BtIcRegistry *self=singleton; g_return_if_fail(self); if(btic_device_has_controls(device) || BTIC_IS_LEARN(device)) { // add devices to our list and trigger notify self->priv->devices=g_list_prepend(self->priv->devices,(gpointer)device); g_object_notify(G_OBJECT(self),"devices"); } else { GST_DEBUG("device has no controls, not adding"); g_object_unref(device); } } //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void btic_registry_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcRegistry * const self = BTIC_REGISTRY(object); return_if_disposed(); switch (property_id) { case REGISTRY_DEVICE_LIST: { g_value_set_pointer(value,g_list_copy(self->priv->devices)); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_registry_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcRegistry * const self = BTIC_REGISTRY(object); return_if_disposed(); switch (property_id) { default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_registry_dispose(GObject * const object) { const BtIcRegistry * const self = BTIC_REGISTRY(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); #if USE_GUDEV g_object_try_unref(self->priv->gudev_discoverer); #elif USE_HAL g_object_try_unref(self->priv->hal_discoverer); #endif if(self->priv->devices) { GST_DEBUG("!!!! free devices: %d",g_list_length(self->priv->devices)); GList* node; for(node=self->priv->devices;node;node=g_list_next(node)) { g_object_try_unref(node->data); node->data=NULL; } } GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_registry_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_registry_finalize(GObject * const object) { const BtIcRegistry * const self = BTIC_REGISTRY(object); GST_DEBUG("!!!! self=%p",self); if(self->priv->devices) { g_list_free(self->priv->devices); self->priv->devices=NULL; } GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_registry_parent_class)->finalize(object); GST_DEBUG(" done"); } static GObject *btic_registry_constructor(GType type,guint n_construct_params,GObjectConstructParam *construct_params) { GObject *object; if(G_UNLIKELY(!singleton)) { object=G_OBJECT_CLASS(btic_registry_parent_class)->constructor(type,n_construct_params,construct_params); singleton=BTIC_REGISTRY(object); g_object_add_weak_pointer(object,(gpointer*)(gpointer)&singleton); GST_INFO("new device registry created"); #if USE_GUDEV singleton->priv->gudev_discoverer=btic_gudev_discoverer_new(); #elif USE_HAL singleton->priv->hal_discoverer=btic_hal_discoverer_new(); #else GST_INFO("no GUDev/HAL support, empty device registry"); #endif } else { object=g_object_ref(singleton); } return object; } static void btic_registry_init(BtIcRegistry *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_REGISTRY, BtIcRegistryPrivate); } static void btic_registry_class_init(BtIcRegistryClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcRegistryPrivate)); gobject_class->constructor = btic_registry_constructor; gobject_class->set_property = btic_registry_set_property; gobject_class->get_property = btic_registry_get_property; gobject_class->dispose = btic_registry_dispose; gobject_class->finalize = btic_registry_finalize; g_object_class_install_property(gobject_class,REGISTRY_DEVICE_LIST, g_param_spec_pointer("devices", "device list prop", "A copy of the list of control devices", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/trigger-control.c0000644042355400116100000001105111615464254015534 00000000000000/* $Id: trigger-control.c 3505 2011-08-01 08:49:45Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btictriggercontrol * @short_description: buzztards interaction controller single trigger control * * Trigger control. The state of the hardware control can be read from * BtIcTriggerControl:value. */ #define BTIC_CORE #define BTIC_TRIGGER_CONTROL_C #include "ic_private.h" enum { TRIGGER_CONTROL_VALUE=1 }; struct _BtIcTriggerControlPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; gboolean value; }; //-- the class G_DEFINE_TYPE (BtIcTriggerControl, btic_trigger_control, BTIC_TYPE_CONTROL); //-- helper //-- handler //-- constructor methods /** * btic_trigger_control_new: * @device: the device it belongs to * @name: human readable name * @id: unique identifier per device * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtIcTriggerControl *btic_trigger_control_new(const BtIcDevice *device,const gchar *name,guint id) { BtIcTriggerControl *self=BTIC_TRIGGER_CONTROL(g_object_new(BTIC_TYPE_TRIGGER_CONTROL,"device",device,"name",name,"id",id,NULL)); if(!self) { goto Error; } // register myself with the device btic_device_add_control(device,BTIC_CONTROL(self)); return(self); Error: g_object_try_unref(self); return(NULL); } //-- methods //-- wrapper //-- class internals /* returns a property for the given property_id for this object */ static void btic_trigger_control_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcTriggerControl * const self = BTIC_TRIGGER_CONTROL(object); return_if_disposed(); switch (property_id) { case TRIGGER_CONTROL_VALUE: { g_value_set_boolean(value, self->priv->value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_trigger_control_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcTriggerControl * const self = BTIC_TRIGGER_CONTROL(object); return_if_disposed(); switch (property_id) { case TRIGGER_CONTROL_VALUE: { self->priv->value = g_value_get_boolean(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_trigger_control_dispose(GObject * const object) { const BtIcTriggerControl * const self = BTIC_TRIGGER_CONTROL(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_trigger_control_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_trigger_control_init(BtIcTriggerControl *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_TRIGGER_CONTROL, BtIcTriggerControlPrivate); } static void btic_trigger_control_class_init(BtIcTriggerControlClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcTriggerControlPrivate)); gobject_class->set_property = btic_trigger_control_set_property; gobject_class->get_property = btic_trigger_control_get_property; gobject_class->dispose = btic_trigger_control_dispose; g_object_class_install_property(gobject_class,TRIGGER_CONTROL_VALUE, g_param_spec_boolean("value", "value prop", "control value", FALSE, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/gudev-discoverer.c0000644042355400116100000002377211620320142015664 00000000000000/* $Id: gudev-discoverer.c 3533 2011-08-09 21:02:22Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticgudevdiscoverer * @short_description: gudev based device discovery * * Discover input and midi devices using gudev. */ #define BTIC_CORE #define BTIC_GUDEV_DISCOVERER_C #include "ic_private.h" struct _BtIcGudevDiscovererPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; GUdevClient *client; }; //-- the class G_DEFINE_TYPE (BtIcGudevDiscoverer, btic_gudev_discoverer, G_TYPE_OBJECT); //-- helper /* remove: subsys= input, devtype= (null), name= event1, number= 1, devnode=/dev/input/event1 remove: subsys= input, devtype= (null), name= js0, number= 0, devnode=/dev/input/js0 remove: subsys= input, devtype= (null), name= input11, number=11, devnode=(null) remove: subsys= hidraw, devtype= (null), name= hidraw0, number= 0, devnode=/dev/hidraw0 remove: subsys= hid, devtype= (null), name=0003:06A3:0502.0008, number=0008, devnode=(null) remove: subsys= usb, devtype=usb_interface, name= 5-5:1.0, number= 0, devnode=(null) remove: subsys= usb, devtype=usb_device, name= 5-5, number= 5, devnode=/dev/bus/usb/005/014 add: subsys= usb, devtype=usb_device, name= 5-5, number= 5, devnode=/dev/bus/usb/005/015 add: subsys= usb, devtype=usb_interface, name= 5-5:1.0, number= 0, devnode=(null) add: subsys= hid, devtype= (null), name=0003:06A3:0502.0009, number=0009, path=(null) add: subsys= hidraw, devtype= (null), name= hidraw0, number= 0, devnode=/dev/hidraw0 add: subsys= input, devtype= (null), name= input12, number=12, devnode=(null) add: subsys= input, devtype= (null), name= js0, number= 0, devnode=/dev/input/js0 add: subsys= input, devtype= (null), name= event1, number= 1, devnode=/dev/input/event1 old HAL output: registry.c:305:hal_scan: 20 alsa devices found, trying add.. registry.c:275:on_device_added: midi device added: product=Hoontech SoundTrack Audio DSP24 ALSA MIDI Device, devnode=/dev/snd/midiC2D1 registry.c:275:on_device_added: midi device added: product=Hoontech SoundTrack Audio DSP24 ALSA MIDI Device, devnode=/dev/snd/midiC2D0 registry.c:305:hal_scan: 0 alsa.sequencer devices found, trying add.. registry.c:305:hal_scan: 14 oss devices found, trying add.. registry.c:249:on_device_added: midi device added: product=ICE1712 multi OSS MIDI Device, devnode=/dev/midi2 registry.c:249:on_device_added: midi device added: product=ICE1712 multi OSS MIDI Device, devnode=/dev/amidi2 */ static void on_uevent(GUdevClient *client,gchar *action,GUdevDevice *udevice,gpointer user_data) { //BtIcGudevDiscoverer *self=BTIC_GUDEV_DISCOVERER(user_data); const gchar *name=g_udev_device_get_name(udevice); const gchar *subsystem=g_udev_device_get_subsystem(udevice); const gchar *udi=g_udev_device_get_sysfs_path(udevice); const gchar *devnode=g_udev_device_get_device_file(udevice); GST_INFO("action=%6s: subsys=%8s, devtype=%15s, name=%10s, number=%2s, devnode=%s, driver=%s", action, subsystem, g_udev_device_get_devtype(udevice), name, g_udev_device_get_number(udevice), devnode, g_udev_device_get_driver(udevice)); if(!devnode || !udi) return; if(!strcmp(action,"remove") || !strcmp(action,"change")) { btic_registry_remove_device_by_udi(udi); } if(!strcmp(action,"add") || !strcmp(action,"change")) { BtIcDevice *device=NULL; GUdevDevice *uparent,*t; const gchar *full_name=NULL; const gchar *vendor_name, *model_name; gboolean free_full_name=FALSE; gchar *cat_full_name; // skip unreadble device descriptors quickly if(access(devnode,R_OK)==-1) { return; } /* FIXME: this is a udev bug, the address changes and this causes valgrind * warnings: http://www.pastie.org/1589552 * we copy it for now */ if (devnode) devnode=g_strdup(devnode); /* dump properties, also available as: * /sbin/udevadm info -qall -p /sys/class/sound/card0 * const gchar* const *props=g_udev_device_get_property_keys(udevice); while(*props) { GST_INFO(" %s: %s", *props, g_udev_device_get_property(udevice,*props)); props++; } */ /* get human readable device name */ uparent=udevice; vendor_name=g_udev_device_get_property(uparent, "ID_VENDOR"); if(!vendor_name) vendor_name=g_udev_device_get_property(uparent, "ID_VENDOR_FROM_DATABASE"); model_name=g_udev_device_get_property(uparent, "ID_MODEL"); if(!model_name) model_name=g_udev_device_get_property(uparent, "ID_MODEL_FROM_DATABASE"); GST_INFO(" v m: '%s' '%s'",vendor_name,model_name); while(uparent && !(vendor_name && model_name)) { t=uparent; if((uparent=g_udev_device_get_parent(t))) { if(!vendor_name) vendor_name=g_udev_device_get_property(uparent, "ID_VENDOR"); if(!vendor_name) vendor_name=g_udev_device_get_property(uparent, "ID_VENDOR_FROM_DATABASE"); if(!model_name) model_name=g_udev_device_get_property(uparent, "ID_MODEL"); if(!model_name) model_name=g_udev_device_get_property(uparent, "ID_MODEL_FROM_DATABASE"); } if(t!=udevice) { g_object_unref(t); } } if(uparent && uparent!=udevice) { g_object_unref(uparent); } GST_INFO(" v m: '%s' '%s'",vendor_name,model_name); if(vendor_name && model_name) { full_name=g_strconcat(vendor_name," ",model_name,NULL); free_full_name=TRUE; } else { full_name=name; } /* FIXME: we got different names with HAL (we save those in songs :/): * http://cgit.freedesktop.org/hal/tree/hald/linux/device.c#n3400 * http://cgit.freedesktop.org/hal/tree/hald/linux/device.c#n3363 */ if(!strcmp(subsystem,"input")) { cat_full_name=g_strconcat("input: ",full_name,NULL); device=BTIC_DEVICE(btic_input_device_new(udi,cat_full_name,devnode)); g_free(cat_full_name); } else if(!strcmp(subsystem,"sound")) { /* http://cgit.freedesktop.org/hal/tree/hald/linux/device.c#n3509 */ if(!strncmp(name, "midiC", 5)) { /* alsa */ cat_full_name=g_strconcat("alsa midi: ",full_name,NULL); device=BTIC_DEVICE(btic_midi_device_new(udi,cat_full_name,devnode)); g_free(cat_full_name); } else if(!strcmp(name, "midi2") || !strcmp(name, "amidi2")) { /* oss */ cat_full_name=g_strconcat("oss midi: ",full_name,NULL); device=BTIC_DEVICE(btic_midi_device_new(udi,cat_full_name,devnode)); g_free(cat_full_name); } } if(free_full_name) { g_free((gchar *)full_name); } if(device) { btic_registry_add_device(device); } else { GST_DEBUG("unknown device found, not added: name=%s",name); } /* FIXME: see above */ g_free((gchar *)devnode); } } static void gudev_scan(BtIcGudevDiscoverer *self, const gchar *subsystem) { GList *list,*node; GUdevDevice *device; if((list=g_udev_client_query_by_subsystem(self->priv->client,subsystem))) { for(node=list;node;node=g_list_next(node)) { device=(GUdevDevice *)node->data; on_uevent(self->priv->client,"add",device,(gpointer)self); g_object_unref(device); } g_list_free(list); } } //-- constructor methods /** * btic_gudev_discoverer_new: * * Create a new instance * * Returns: the new instance */ BtIcGudevDiscoverer *btic_gudev_discoverer_new(void) { return(g_object_new(BTIC_TYPE_GUDEV_DISCOVERER,NULL)); } //-- methods //-- wrapper //-- class internals static void btic_gudev_discoverer_dispose(GObject * const object) { const BtIcGudevDiscoverer * const self = BTIC_GUDEV_DISCOVERER(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); g_object_try_unref(self->priv->client); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_gudev_discoverer_parent_class)->dispose(object); GST_DEBUG(" done"); } static GObject *btic_gudev_discoverer_constructor(GType type,guint n_construct_params,GObjectConstructParam *construct_params) { BtIcGudevDiscoverer *self; /* check with 'udevadm monitor' */ const gchar * const subsystems[]={ /* "input", "sound",*/ NULL }; self=BTIC_GUDEV_DISCOVERER(G_OBJECT_CLASS(btic_gudev_discoverer_parent_class)->constructor(type,n_construct_params,construct_params)); // get a gudev client if(!(self->priv->client=g_udev_client_new(subsystems))) { GST_WARNING("Could not create gudev client context"); goto done; } // register notifications g_signal_connect(self->priv->client,"uevent",G_CALLBACK(on_uevent),(gpointer)self); // check already known devices gudev_scan(self,"input"); gudev_scan(self,"sound"); done: return((GObject *)self); } static void btic_gudev_discoverer_init(BtIcGudevDiscoverer *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_GUDEV_DISCOVERER, BtIcGudevDiscovererPrivate); } static void btic_gudev_discoverer_class_init(BtIcGudevDiscovererClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcGudevDiscovererPrivate)); gobject_class->constructor = btic_gudev_discoverer_constructor; gobject_class->dispose = btic_gudev_discoverer_dispose; } buzztard-0.6.0/src/lib/ic/Makefile.in0000644042355400116100000013731311675570634014334 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/lib/ic DIST_COMMON = $(am__dist_gir_DATA_DIST) $(noinst_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(srcdir)/libbuzztard-ic.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = libbuzztard-ic.pc CONFIG_CLEAN_VPATH_FILES = 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__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \ "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibsdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libbuzztard_ic_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__libbuzztard_ic_la_SOURCES_DIST = ic.c libbuzztard-ic/ic.h \ registry.c libbuzztard-ic/registry.h gudev-discoverer.c \ libbuzztard-ic/gudev-discoverer.h hal-discoverer.c \ libbuzztard-ic/hal-discoverer.h device.c \ libbuzztard-ic/device.h learn.c libbuzztard-ic/learn.h \ input-device.c libbuzztard-ic/input-device.h midi-device.c \ libbuzztard-ic/midi-device.h control.c \ libbuzztard-ic/control.h abs-range-control.c \ libbuzztard-ic/abs-range-control.h trigger-control.c \ libbuzztard-ic/trigger-control.h @USE_GUDEV_TRUE@am__objects_1 = libbuzztard_ic_la-gudev-discoverer.lo @USE_HAL_TRUE@am__objects_2 = libbuzztard_ic_la-hal-discoverer.lo @USE_LINUX_INPUT_TRUE@am__objects_3 = \ @USE_LINUX_INPUT_TRUE@ libbuzztard_ic_la-input-device.lo am_libbuzztard_ic_la_OBJECTS = libbuzztard_ic_la-ic.lo \ libbuzztard_ic_la-registry.lo $(am__objects_1) \ $(am__objects_2) libbuzztard_ic_la-device.lo \ libbuzztard_ic_la-learn.lo $(am__objects_3) \ libbuzztard_ic_la-midi-device.lo libbuzztard_ic_la-control.lo \ libbuzztard_ic_la-abs-range-control.lo \ libbuzztard_ic_la-trigger-control.lo libbuzztard_ic_la_OBJECTS = $(am_libbuzztard_ic_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent libbuzztard_ic_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) \ $(libbuzztard_ic_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbuzztard_ic_la_SOURCES) DIST_SOURCES = $(am__libbuzztard_ic_la_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive am__dist_gir_DATA_DIST = BuzztardIc-0.0.gir DATA = $(dist_gir_DATA) $(pkgconfig_DATA) $(typelibs_DATA) HEADERS = $(noinst_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = libbuzztard-ic @USE_LINUX_INPUT_FALSE@LINUX_INPUT_FILES = @USE_LINUX_INPUT_TRUE@LINUX_INPUT_FILES = input-device.c libbuzztard-ic/input-device.h @USE_GUDEV_FALSE@GUDEV_FILES = @USE_GUDEV_TRUE@GUDEV_FILES = gudev-discoverer.c libbuzztard-ic/gudev-discoverer.h @USE_HAL_FALSE@HAL_FILES = @USE_HAL_TRUE@HAL_FILES = hal-discoverer.c libbuzztard-ic/hal-discoverer.h lib_LTLIBRARIES = libbuzztard-ic.la libbuzztard_ic_la_LIBADD = \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) libbuzztard_ic_la_LDFLAGS = \ $(BT_LDFLAGS) \ -export-symbols-regex ^_?\(btic_\|BtIc\|BTIC_\).* \ -version-info @BT_VERSION_INFO@ libbuzztard_ic_la_SOURCES = \ ic.c libbuzztard-ic/ic.h \ registry.c libbuzztard-ic/registry.h \ $(GUDEV_FILES) $(HAL_FILES) \ \ device.c libbuzztard-ic/device.h \ learn.c libbuzztard-ic/learn.h \ $(LINUX_INPUT_FILES) \ midi-device.c libbuzztard-ic/midi-device.h \ \ control.c libbuzztard-ic/control.h \ abs-range-control.c libbuzztard-ic/abs-range-control.h \ trigger-control.c libbuzztard-ic/trigger-control.h libbuzztard_ic_la_CFLAGS = \ -I$(builddir)/libbuzztard-ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) noinst_HEADERS = ic_private.h libbuzztard-ic/version.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libbuzztard-ic.pc @USE_GIR_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libbuzztard_ic_la_SOURCES)) @USE_GIR_FALSE@BUILT_GIRSOURCES = @USE_GIR_TRUE@BUILT_GIRSOURCES = BuzztardIc-0.0.gir @USE_GIR_TRUE@girdir = $(datadir)/gir @USE_GIR_TRUE@dist_gir_DATA = $(BUILT_GIRSOURCES) @USE_GIR_TRUE@typelibsdir = $(libdir)/girepository @USE_GIR_TRUE@typelibs_DATA = $(dist_gir_DATA:.gir=.typelib) @USE_GIR_TRUE@TXML = $(dist_gir_DATA:.gir=.gir.txml) EXTRA_DIST = \ libbuzztard-ic.pc.in # CLEANFILES is for files generated by make CLEANFILES = \ $(pkgconfig_DATA) \ $(typelibs_DATA) $(TXML) \ $(BUILT_GIRSOURCES) all: all-recursive .SUFFIXES: .SUFFIXES: .c .gir .lo .o .obj .typelib $(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 src/lib/ic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/ic/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): libbuzztard-ic.pc: $(top_builddir)/config.status $(srcdir)/libbuzztard-ic.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)" @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 " $(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)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbuzztard-ic.la: $(libbuzztard_ic_la_OBJECTS) $(libbuzztard_ic_la_DEPENDENCIES) $(AM_V_CCLD)$(libbuzztard_ic_la_LINK) -rpath $(libdir) $(libbuzztard_ic_la_OBJECTS) $(libbuzztard_ic_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-abs-range-control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-control.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-gudev-discoverer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-hal-discoverer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-ic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-input-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-learn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-midi-device.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-registry.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztard_ic_la-trigger-control.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libbuzztard_ic_la-ic.lo: ic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-ic.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-ic.Tpo -c -o libbuzztard_ic_la-ic.lo `test -f 'ic.c' || echo '$(srcdir)/'`ic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-ic.Tpo $(DEPDIR)/libbuzztard_ic_la-ic.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='ic.c' object='libbuzztard_ic_la-ic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-ic.lo `test -f 'ic.c' || echo '$(srcdir)/'`ic.c libbuzztard_ic_la-registry.lo: 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) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-registry.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-registry.Tpo -c -o libbuzztard_ic_la-registry.lo `test -f 'registry.c' || echo '$(srcdir)/'`registry.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-registry.Tpo $(DEPDIR)/libbuzztard_ic_la-registry.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='registry.c' object='libbuzztard_ic_la-registry.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-registry.lo `test -f 'registry.c' || echo '$(srcdir)/'`registry.c libbuzztard_ic_la-gudev-discoverer.lo: gudev-discoverer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-gudev-discoverer.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-gudev-discoverer.Tpo -c -o libbuzztard_ic_la-gudev-discoverer.lo `test -f 'gudev-discoverer.c' || echo '$(srcdir)/'`gudev-discoverer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-gudev-discoverer.Tpo $(DEPDIR)/libbuzztard_ic_la-gudev-discoverer.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='gudev-discoverer.c' object='libbuzztard_ic_la-gudev-discoverer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-gudev-discoverer.lo `test -f 'gudev-discoverer.c' || echo '$(srcdir)/'`gudev-discoverer.c libbuzztard_ic_la-hal-discoverer.lo: hal-discoverer.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-hal-discoverer.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-hal-discoverer.Tpo -c -o libbuzztard_ic_la-hal-discoverer.lo `test -f 'hal-discoverer.c' || echo '$(srcdir)/'`hal-discoverer.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-hal-discoverer.Tpo $(DEPDIR)/libbuzztard_ic_la-hal-discoverer.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='hal-discoverer.c' object='libbuzztard_ic_la-hal-discoverer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-hal-discoverer.lo `test -f 'hal-discoverer.c' || echo '$(srcdir)/'`hal-discoverer.c libbuzztard_ic_la-device.lo: 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) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-device.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-device.Tpo -c -o libbuzztard_ic_la-device.lo `test -f 'device.c' || echo '$(srcdir)/'`device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-device.Tpo $(DEPDIR)/libbuzztard_ic_la-device.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='device.c' object='libbuzztard_ic_la-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-device.lo `test -f 'device.c' || echo '$(srcdir)/'`device.c libbuzztard_ic_la-learn.lo: learn.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-learn.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-learn.Tpo -c -o libbuzztard_ic_la-learn.lo `test -f 'learn.c' || echo '$(srcdir)/'`learn.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-learn.Tpo $(DEPDIR)/libbuzztard_ic_la-learn.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='learn.c' object='libbuzztard_ic_la-learn.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-learn.lo `test -f 'learn.c' || echo '$(srcdir)/'`learn.c libbuzztard_ic_la-input-device.lo: input-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) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-input-device.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-input-device.Tpo -c -o libbuzztard_ic_la-input-device.lo `test -f 'input-device.c' || echo '$(srcdir)/'`input-device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-input-device.Tpo $(DEPDIR)/libbuzztard_ic_la-input-device.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='input-device.c' object='libbuzztard_ic_la-input-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-input-device.lo `test -f 'input-device.c' || echo '$(srcdir)/'`input-device.c libbuzztard_ic_la-midi-device.lo: midi-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) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-midi-device.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-midi-device.Tpo -c -o libbuzztard_ic_la-midi-device.lo `test -f 'midi-device.c' || echo '$(srcdir)/'`midi-device.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-midi-device.Tpo $(DEPDIR)/libbuzztard_ic_la-midi-device.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='midi-device.c' object='libbuzztard_ic_la-midi-device.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-midi-device.lo `test -f 'midi-device.c' || echo '$(srcdir)/'`midi-device.c libbuzztard_ic_la-control.lo: control.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-control.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-control.Tpo -c -o libbuzztard_ic_la-control.lo `test -f 'control.c' || echo '$(srcdir)/'`control.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-control.Tpo $(DEPDIR)/libbuzztard_ic_la-control.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='control.c' object='libbuzztard_ic_la-control.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-control.lo `test -f 'control.c' || echo '$(srcdir)/'`control.c libbuzztard_ic_la-abs-range-control.lo: abs-range-control.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-abs-range-control.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-abs-range-control.Tpo -c -o libbuzztard_ic_la-abs-range-control.lo `test -f 'abs-range-control.c' || echo '$(srcdir)/'`abs-range-control.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-abs-range-control.Tpo $(DEPDIR)/libbuzztard_ic_la-abs-range-control.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='abs-range-control.c' object='libbuzztard_ic_la-abs-range-control.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-abs-range-control.lo `test -f 'abs-range-control.c' || echo '$(srcdir)/'`abs-range-control.c libbuzztard_ic_la-trigger-control.lo: trigger-control.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -MT libbuzztard_ic_la-trigger-control.lo -MD -MP -MF $(DEPDIR)/libbuzztard_ic_la-trigger-control.Tpo -c -o libbuzztard_ic_la-trigger-control.lo `test -f 'trigger-control.c' || echo '$(srcdir)/'`trigger-control.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztard_ic_la-trigger-control.Tpo $(DEPDIR)/libbuzztard_ic_la-trigger-control.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='trigger-control.c' object='libbuzztard_ic_la-trigger-control.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztard_ic_la_CFLAGS) $(CFLAGS) -c -o libbuzztard_ic_la-trigger-control.lo `test -f 'trigger-control.c' || echo '$(srcdir)/'`trigger-control.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-dist_girDATA: $(dist_gir_DATA) @$(NORMAL_INSTALL) test -z "$(girdir)" || $(MKDIR_P) "$(DESTDIR)$(girdir)" @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ 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-dist_girDATA: @$(NORMAL_UNINSTALL) @list='$(dist_gir_DATA)'; test -n "$(girdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(girdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(girdir)" && rm -f $$files install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ 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|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(pkgconfigdir)" && rm -f $$files install-typelibsDATA: $(typelibs_DATA) @$(NORMAL_INSTALL) test -z "$(typelibsdir)" || $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ 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)$(typelibsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \ done uninstall-typelibsDATA: @$(NORMAL_UNINSTALL) @list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(typelibsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(typelibsdir)" && rm -f $$files # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(typelibsdir)"; 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-recursive -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dist_girDATA install-pkgconfigDATA \ install-typelibsDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES 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 -rf ./$(DEPDIR) -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-dist_girDATA uninstall-libLTLIBRARIES \ uninstall-pkgconfigDATA uninstall-typelibsDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dist_girDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-pkgconfigDATA install-ps install-ps-am install-strip \ install-typelibsDATA 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-recursive \ uninstall uninstall-am uninstall-dist_girDATA \ uninstall-libLTLIBRARIES uninstall-pkgconfigDATA \ uninstall-typelibsDATA @USE_GIR_TRUE@BuzztardIc-0.0.gir: $(G_IR_SCANNER) libbuzztard-ic.la @USE_GIR_TRUE@ -$(AM_V_GEN)$(G_IR_SCANNER) -v \ @USE_GIR_TRUE@ --namespace=BuzztardIc \ @USE_GIR_TRUE@ --nsversion 0.0 \ @USE_GIR_TRUE@ -I$(builddir)/libbuzztard-ic \ @USE_GIR_TRUE@ -I$(srcdir) \ @USE_GIR_TRUE@ -I$(srcdir)/libbuzztard-ic/ \ @USE_GIR_TRUE@ --identifier-prefix=BtIc \ @USE_GIR_TRUE@ --symbol-prefix=btic \ @USE_GIR_TRUE@ --c-include='libbuzztard-ic/ic.h' \ @USE_GIR_TRUE@ --include=GLib-2.0 \ @USE_GIR_TRUE@ --include=GObject-2.0 \ @USE_GIR_TRUE@ --include=Gst-0.10 \ @USE_GIR_TRUE@ --library=libbuzztard-ic.la \ @USE_GIR_TRUE@ --libtool="$(top_builddir)/libtool" \ @USE_GIR_TRUE@ --pkg glib-2.0 \ @USE_GIR_TRUE@ --pkg gobject-2.0 \ @USE_GIR_TRUE@ --pkg gstreamer-0.10 \ @USE_GIR_TRUE@ --pkg-export libbuzztard-ic \ @USE_GIR_TRUE@ --add-init-section="btic_init(NULL,NULL);" \ @USE_GIR_TRUE@ --output $@ \ @USE_GIR_TRUE@ $(gir_sources) || touch $@ @USE_GIR_TRUE@.gir.typelib: @USE_GIR_TRUE@ -$(AM_V_GEN)$(G_IR_COMPILER) --includedir=. $(G_IR_COMPILER_OPTS) $< -o $@ || touch $@ .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) -I$(top_srcdir)/src/lib/core $(libbtcore_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/lib/ic/midi-device.c0000644042355400116100000003231611620302753014570 00000000000000/* $Id: midi-device.c 3518 2011-08-03 20:53:46Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticmididevice * @short_description: buzztards interaction controller midi device * * Event handling for midi devices. */ /* * Linux MIDI-HOWTO: http://www.midi-howto.com/ * * use sysex to get device ids (see _constructed) * http://www.borg.com/~jglatt/tech/midispec/identity.htm * http://en.wikipedia.org/wiki/MIDI_Machine_Control#Identity_Request * * to test midi inputs * amidi -l * amidi -d -p hw:2,0,0 */ #define BTIC_CORE #define BTIC_MIDI_DEVICE_C #include "ic_private.h" enum { DEVICE_DEVNODE=1, DEVICE_CONTROLCHANGE }; struct _BtIcMidiDevicePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; gchar *devnode; /* io channel */ GIOChannel *io_channel; gint io_source; /* learn-mode members */ gboolean learn_mode; guint learn_key; guint learn_bits; gchar *control_change; }; //-- the class static void btic_midi_device_interface_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtIcMidiDevice, btic_midi_device, BTIC_TYPE_DEVICE, G_IMPLEMENT_INTERFACE (BTIC_TYPE_LEARN, btic_midi_device_interface_init)); //-- defines #define MIDI_CMD_MASK 0xf0 #define MIDI_CH_MASK 0x0f #define MIDI_CONTROL_CHANGE 0xb0 #define MIDI_PITCH_WHEEL_CHANGE 0xe0 #define MIDI_SYS_EX_START 0xf0 #define MIDI_SYS_EX_END 0xf7 #define MIDI_NON_REALTIME 0x7e //-- helper static void update_learn_info(BtIcMidiDevice *self,gchar *name,guint key,guint bits) { if(self->priv->learn_key!=key) { self->priv->learn_key=key; self->priv->learn_bits=bits; g_object_set(self,"device-controlchange",name,NULL); } } //-- handler static gboolean io_handler(GIOChannel *channel,GIOCondition condition,gpointer user_data) { BtIcMidiDevice *self=BTIC_MIDI_DEVICE(user_data); BtIcControl *control; GError *error=NULL; gsize bytes_read; guchar midi_event[3],cmd; static guchar prev_cmd=0; guint key; gboolean res=TRUE; if(condition & (G_IO_IN | G_IO_PRI)) { g_io_channel_read_chars(self->priv->io_channel, (gchar *)midi_event, 1, &bytes_read, &error); if(error) { GST_WARNING("iochannel error when reading: %s",error->message); g_error_free(error); //res=FALSE; } else { gint have_read=0; guchar *midi_data=&midi_event[1]; GST_LOG("command: %02x",midi_event[0]); cmd=midi_event[0]&MIDI_CMD_MASK; if (cmd<0x80 && prev_cmd) { have_read=1; midi_event[1]=midi_event[0]; midi_event[0]=prev_cmd; midi_data=&midi_event[2]; cmd=prev_cmd&MIDI_CMD_MASK; } // http://www.midi.org/techspecs/midimessages.php // http://www.cs.cf.ac.uk/Dave/Multimedia/node158.html switch(cmd) { case MIDI_CONTROL_CHANGE: g_io_channel_read_chars(self->priv->io_channel,(gchar *) midi_data, 2-have_read, &bytes_read, &error); if(error) { GST_WARNING("iochannel error when reading: %s",error->message); g_error_free(error); } else { GST_DEBUG("control-change: %02x %02x %02x",midi_event[0],midi_event[1],midi_event[2]); key=(guint)midi_event[1]; // 0-119 (normal controls), 120-127 (channel mode message) if(G_UNLIKELY(self->priv->learn_mode)) { static gchar name[20]; sprintf(name,"control-change %u",key); update_learn_info(self,name,key,7); } if((control=btic_device_get_control_by_id(BTIC_DEVICE(self),key))) { g_object_set(control,"value",(gint32)(midi_event[2]),NULL); } prev_cmd=midi_event[0]; } break; case MIDI_PITCH_WHEEL_CHANGE: g_io_channel_read_chars(self->priv->io_channel, (gchar *)midi_data, 2-have_read, &bytes_read, &error); if(error) { GST_WARNING("iochannel error when reading: %s",error->message); g_error_free(error); } else { GST_DEBUG("pitch-wheel-change: %02x %02x %02x",midi_event[0],midi_event[1],midi_event[2]); key=128; if(G_UNLIKELY(self->priv->learn_mode)) { update_learn_info(self,"pitch-wheel-change",key,14); } if((control=btic_device_get_control_by_id(BTIC_DEVICE(self),key))) { gint32 v=(((gint32)midi_event[2])<<7)|(midi_event[1]); g_object_set(control,"value",v,NULL); } prev_cmd=midi_event[0]; } break; default: GST_LOG("unhandled message: %02x",midi_event[0]); break; } } } if(condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) { res=FALSE; } if(!res) { GST_INFO("closing connection"); self->priv->io_source=-1; } return(res); } //-- constructor methods /** * btic_midi_device_new: * @udi: the udi of the device * @name: human readable name * @devnode: device node in filesystem * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtIcMidiDevice *btic_midi_device_new(const gchar *udi,const gchar *name,const gchar *devnode) { return(BTIC_MIDI_DEVICE(g_object_new(BTIC_TYPE_MIDI_DEVICE,"udi",udi,"name",name,"devnode",devnode,NULL))); } //-- methods static gboolean btic_midi_device_start(gconstpointer _self) { BtIcMidiDevice *self=BTIC_MIDI_DEVICE(_self); GError *error=NULL; GST_INFO( "starting the midi device" ); // start the io-loop self->priv->io_channel=g_io_channel_new_file(self->priv->devnode,"r",&error); if(error) { GST_WARNING("iochannel error for open(%s): %s",self->priv->devnode,error->message); g_error_free(error); return(FALSE); } g_io_channel_set_encoding(self->priv->io_channel,NULL,&error); if(error) { GST_WARNING("iochannel error for setting encoding to NULL: %s",error->message); g_error_free(error); g_io_channel_unref(self->priv->io_channel); self->priv->io_channel=NULL; return(FALSE); } self->priv->io_source=g_io_add_watch_full(self->priv->io_channel, G_PRIORITY_LOW, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, io_handler, (gpointer)self, NULL); return(TRUE); } static gboolean btic_midi_device_stop(gconstpointer _self) { BtIcMidiDevice *self=BTIC_MIDI_DEVICE(_self); // stop the io-loop if(self->priv->io_channel) { if(self->priv->io_source>=0) { g_source_remove(self->priv->io_source); self->priv->io_source=-1; } g_io_channel_unref(self->priv->io_channel); self->priv->io_channel=NULL; } return(TRUE); } //-- learn interface static gboolean btic_midi_device_learn_start(gconstpointer _self) { BtIcMidiDevice *self=BTIC_MIDI_DEVICE(_self); self->priv->learn_mode=TRUE; btic_device_start(BTIC_DEVICE(self)); return(TRUE); } static gboolean btic_midi_device_learn_stop(gconstpointer _self) { BtIcMidiDevice *self=BTIC_MIDI_DEVICE(_self); self->priv->learn_mode=FALSE; btic_device_stop(BTIC_DEVICE(self)); return(TRUE); } static BtIcControl* btic_midi_device_register_learned_control(gconstpointer _self, const gchar *name) { BtIcControl *control=NULL; BtIcMidiDevice *self=BTIC_MIDI_DEVICE(_self); GST_INFO("registering midi control as %s", name); /* this avoids that we learn a key again */ if(!(control=btic_device_get_control_by_id(BTIC_DEVICE(self),self->priv->learn_key))) { control=BTIC_CONTROL(btic_abs_range_control_new(BTIC_DEVICE(self),name,self->priv->learn_key,0,(1<priv->learn_bits)-1,0)); btic_learn_store_controller_map(BTIC_LEARN(self)); } return(control); } static void btic_midi_device_interface_init(gpointer const g_iface, gpointer const iface_data) { BtIcLearnInterface *iface = (BtIcLearnInterface *)g_iface; iface->learn_start = btic_midi_device_learn_start; iface->learn_stop = btic_midi_device_learn_stop; iface->register_learned_control = btic_midi_device_register_learned_control; } //-- wrapper //-- class internals static void btic_midi_device_constructed(GObject *object) { const BtIcMidiDevice * const self = BTIC_MIDI_DEVICE(object); #if 0 gint io; #endif if(G_OBJECT_CLASS(btic_midi_device_parent_class)->constructed) G_OBJECT_CLASS(btic_midi_device_parent_class)->constructed(object); btic_learn_load_controller_map(BTIC_LEARN(self)); #if 0 // we never receive anything back :/ if((io=open(self->priv->devnode,O_NONBLOCK|O_RDWR|O_SYNC))>0) { gchar data[17]={0,}; gsize ct; data[0]=MIDI_SYS_EX_START; data[1]=MIDI_NON_REALTIME; data[2]=0x7f; // SysEx channel, set to "disregard" data[3]=0x06; // General Information data[4]=0x01; // Identity Request data[5]=MIDI_SYS_EX_END; GST_INFO("send identity request to: %s",self->priv->devnode); /* for(ct=0;ct<6;ct++) { write(io,&data[ct],1); usleep(5000); } */ if((ct=write(io,data,6))<6) goto done; if((ct=read(io,data,17))<15) goto done; GST_MEMDUMP("reply",(guint8 *)data,15); // 5: manufacturer id (if 0, then id is next two bytes) // 6,7: family code // 8,9: model code // 10,11,12,13: version number done: close(io); } #endif } /* returns a property for the given property_id for this object */ static void btic_midi_device_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcMidiDevice * const self = BTIC_MIDI_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_DEVNODE: { g_value_set_string(value, self->priv->devnode); } break; case DEVICE_CONTROLCHANGE: { g_value_set_string(value, self->priv->control_change); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_midi_device_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcMidiDevice * const self = BTIC_MIDI_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_DEVNODE: { self->priv->devnode = g_value_dup_string(value); } break; case DEVICE_CONTROLCHANGE: { g_free(self->priv->control_change); self->priv->control_change=g_value_dup_string(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_midi_device_dispose(GObject * const object) { const BtIcMidiDevice * const self = BTIC_MIDI_DEVICE(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_midi_device_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_midi_device_finalize(GObject * const object) { const BtIcMidiDevice * const self = BTIC_MIDI_DEVICE(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->devnode); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_midi_device_parent_class)->finalize(object); GST_DEBUG(" done"); } static void btic_midi_device_init(BtIcMidiDevice *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_MIDI_DEVICE, BtIcMidiDevicePrivate); } static void btic_midi_device_class_init(BtIcMidiDeviceClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); BtIcDeviceClass * const bticdevice_class = BTIC_DEVICE_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcMidiDevicePrivate)); gobject_class->constructed = btic_midi_device_constructed; gobject_class->set_property = btic_midi_device_set_property; gobject_class->get_property = btic_midi_device_get_property; gobject_class->dispose = btic_midi_device_dispose; gobject_class->finalize = btic_midi_device_finalize; bticdevice_class->start = btic_midi_device_start; bticdevice_class->stop = btic_midi_device_stop; g_object_class_install_property(gobject_class,DEVICE_DEVNODE, g_param_spec_string("devnode", "devnode prop", "device node path", NULL, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); // override learn interface g_object_class_override_property(gobject_class,DEVICE_CONTROLCHANGE,"device-controlchange"); } buzztard-0.6.0/src/lib/ic/learn.c0000644042355400116100000002227211623461704013517 00000000000000/* $Id: learn.c 3552 2011-08-19 13:23:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticlearn * @short_description: interface for devices with learn function * * An interface which all devices which support interactive learning of * controls should implement. * * The interface comes with an implementation for caching the learned controls. * The implementor needs to call btic_learn_load_controller_map() after * construction and btic_learn_store_controller_map() when a control got added. */ #define BTIC_CORE #define BTIC_LEARN_C #include "ic_private.h" //-- the iface G_DEFINE_INTERFACE (BtIcLearn, btic_learn, 0); //-- helper //-- wrapper static gboolean btic_learn_default_start(gconstpointer self) { GST_ERROR("virtual method btic_learn_start(self=%p) called",self); return(FALSE); // this is a base class that can't do anything } static gboolean btic_learn_default_stop(gconstpointer self) { GST_ERROR("virtual method btic_learn_stop(self=%p) called",self); return(FALSE); // this is a base class that can't do anything } static BtIcControl* btic_learn_default_register_learned_control(gconstpointer self, const gchar *name) { GST_ERROR("virtual method btic_learn_register_learned_control(self=%p) called",self); return(NULL); // this is a base class that can't do anything } //-- interface vmethods /** * btic_learn_start: * @self: the device which implements the #BtIcLearn interface * * Starts the device if needed and enables the learn function. * Starts emission of notify::devide-controlchange signals. * * Returns: %TRUE for success */ gboolean btic_learn_start(const BtIcLearn *self) { return BTIC_LEARN_GET_INTERFACE(self)->learn_start(self); } /** * btic_learn_stop: * @self: the device which implements the #BtIcLearn interface * * Eventually stops the device and disables the learn function. * Stops emission of notify::devide-controlchange signals. * * Returns: %TRUE for success */ gboolean btic_learn_stop(const BtIcLearn *self) { return BTIC_LEARN_GET_INTERFACE(self)->learn_stop(self); } /** * btic_learn_register_learned_control: * @self: the device which implements the #BtIcLearn interface * @name: the name under which to register the control * * Registers the last detected control with name @name. * * Returns: %TRUE for success */ BtIcControl* btic_learn_register_learned_control(const BtIcLearn *self, const gchar* name) { return BTIC_LEARN_GET_INTERFACE(self)->register_learned_control(self, name); } //-- interface methods #define MAP_HEADER "_controller-map_" /* keys of the preset header section */ #define MAP_HEADER_DEVICE_NAME "device-name" /** * btic_learn_store_controller_map: * @self: the device * * Store a map of all controls to disk. Interface implementations should call * this from their btic_learn_register_learned_control() function after they * registered a new control. * * Returns: %TRUE for success */ gboolean btic_learn_store_controller_map(const BtIcLearn *self) { gchar *map_dir,*map_name,*real_device_name,*device_name,*control_name; GKeyFile *out; GError *error = NULL; gchar *data; gsize data_size; GList *controls,*node; BtIcControl *control; glong min_val,max_val,def_val; guint control_id; map_dir=g_build_filename(g_get_user_data_dir(),PACKAGE,"controller-maps",NULL); /* ensure mapdir, set to NULL if we can't make it */ if(g_mkdir_with_parents(map_dir,S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)==-1) goto mkdir_failed; g_object_get((GObject *)self,"name",&device_name,"controls",&controls,NULL); if((real_device_name=strchr(device_name,':'))) { real_device_name=&real_device_name[2]; } else { real_device_name=device_name; } map_name=g_build_filename(map_dir,real_device_name,NULL); g_free(map_dir); /* create gkeyfile */ GST_INFO("store learned controllers under '%s'",map_name); out=g_key_file_new(); g_key_file_set_string(out,MAP_HEADER,MAP_HEADER_DEVICE_NAME,real_device_name); g_free(device_name); /* todo: write control data */ for(node=controls;node;node=g_list_next(node)) { control=BTIC_CONTROL(node->data); g_object_get(control,"name",&control_name,"id",&control_id,"min",&min_val,"max",&max_val,"def",&def_val,NULL); // @todo: we ignore the type right now g_key_file_set_string(out,control_name,"type","abs-range"); g_key_file_set_integer(out,control_name,"id",control_id); g_key_file_set_integer(out,control_name,"min-val",min_val); g_key_file_set_integer(out,control_name,"max-val",max_val); g_key_file_set_integer(out,control_name,"def-val",def_val); g_free(control_name); } g_list_free(controls); /* get new contents, we need this to save it */ if(!(data=g_key_file_to_data(out,&data_size,&error))) goto convert_failed; /* write data */ if(!g_file_set_contents(map_name,data,data_size,&error)) goto write_failed; g_free (data); g_key_file_free(out); g_free(map_name); return(TRUE); /* ERRORS */ mkdir_failed: GST_WARNING("Can't create controll-maps dir: '%s': %s",map_dir, g_strerror(errno)); g_free(map_dir); return(FALSE); convert_failed: GST_WARNING("can not get the keyfile contents: %s", error->message); g_error_free(error); g_free(data); g_key_file_free(out); g_free(map_name); return(FALSE); write_failed: GST_WARNING("Unable to store control-map file %s: %s",map_name,error->message); g_error_free(error); g_free(data); g_key_file_free(out); g_free(map_name); return(FALSE); } /** * btic_learn_load_controller_map: * @self: the device * * Create initial set of controls from a stored control map. Interface * implementations should call this from their #GObjectClass.constructed() function. * * Returns: %TRUE for success */ gboolean btic_learn_load_controller_map(const BtIcLearn *self) { gchar *map_name,*real_device_name,*device_name,*file_device_name; GKeyFile *in; GError *error = NULL; gchar **groups; gsize i, num_groups; gboolean res; glong min_val,max_val,def_val; guint control_id; g_object_get((GObject *)self,"name",&device_name,NULL); if((real_device_name=strchr(device_name,':'))) { real_device_name=&real_device_name[2]; } else { real_device_name=device_name; } map_name=g_build_filename(g_get_user_data_dir(),PACKAGE,"controller-maps",real_device_name,NULL); /* read gkeyfile */ GST_INFO("load learned controllers under '%s'",map_name); in = g_key_file_new (); res=g_key_file_load_from_file (in, map_name, G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS,&error); if(!res || error!=NULL) goto load_error; file_device_name=g_key_file_get_value(in,MAP_HEADER,MAP_HEADER_DEVICE_NAME,NULL); if(!file_device_name || strcmp(file_device_name,real_device_name)) goto wrong_name; g_free(file_device_name); /* read controllers and create controls */ groups=g_key_file_get_groups(in,&num_groups); for(i=0;imessage); g_error_free(error); g_key_file_free(in); g_free(device_name); g_free(map_name); return(FALSE); wrong_name: GST_WARNING("Wrong device name in controller map file %s. Expected %s, got %s", map_name, real_device_name, GST_STR_NULL(file_device_name)); g_key_file_free(in); g_free(file_device_name); g_free(device_name); g_free(map_name); return(FALSE); } //-- interface internals static void btic_learn_default_init(BtIcLearnInterface *iface) { iface->learn_start=btic_learn_default_start; iface->learn_stop=btic_learn_default_stop; iface->register_learned_control=btic_learn_default_register_learned_control; g_object_interface_install_property (iface, g_param_spec_string ("device-controlchange", "the last control detected by learn", "get the last detected control", NULL, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/libbuzztard-ic.pc.in0000644042355400116100000000047611576360372016140 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libbtic Version: @PACKAGE_VERSION@ Description: libbtcore, interaction controller support classes for buzztard based applications Requires: glib-2.0,gthread-2.0,gmodule-2.0 Libs: @BT_LIBDIR@ -lbuzztard-ic Cflags: @BT_INCLUDEDIR@ buzztard-0.6.0/src/lib/ic/ic.c0000644042355400116100000001323711576360372013020 00000000000000/* $Id: ic.c 2981 2010-09-13 21:10:02Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:libbtic * @short_description: interaction controller library of the buzztard * application framework * * The library offers an abstraction of hardware controllers that can be bound * to ui controls. */ #define BTIC_CORE #define BTIC_CORE_C #include "ic_private.h" /** * btic_major_version: * * buzztard version stamp, major part; determined from #BTIC_MAJOR_VERSION */ const unsigned int btic_major_version=BTIC_MAJOR_VERSION; /** * btic_minor_version: * * buzztard version stamp, minor part; determined from #BTIC_MINOR_VERSION */ const unsigned int btic_minor_version=BTIC_MINOR_VERSION; /** * btic_micro_version: * * buzztard version stamp, micro part; determined from #BTIC_MICRO_VERSION */ const unsigned int btic_micro_version=BTIC_MICRO_VERSION; GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); static gboolean btic_initialized = FALSE; //-- helper methods /* we have no fail cases yet, but maybe in the future */ static gboolean btic_init_pre (void) { #ifdef ENABLE_NLS bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); #endif /* ENABLE_NLS */ //-- initialize gobject g_type_init (); //g_log_set_always_fatal(G_LOG_LEVEL_WARNING); return TRUE; } static gboolean btic_init_post (void) { gboolean res=FALSE; GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-ic", 0, "music production environment / interaction controller library"); res=TRUE; //Error: return(res); } static gboolean parse_goption_arg(const gchar *opt, const gchar * arg, gpointer data, GError ** err) { gboolean ret=TRUE; if(!strcmp (opt, "--btic-version")) { g_printf("libbtic-%d.%d.%d from "PACKAGE_STRING"\n",BTIC_MAJOR_VERSION,BTIC_MINOR_VERSION,BTIC_MICRO_VERSION); } else ret=FALSE; return(ret); } //-- ic initialisation /** * btic_init_get_option_group: * * Returns a #GOptionGroup with libbtic's argument specifications. The group * is set up to use standard GOption callbacks, so when using this group in * combination with GOption parsing methods, all argument parsing and * initialization is automated. * * This function is useful if you want to integrate libbtic with other * libraries that use GOption (see g_option_context_add_group() ). * * Returns: a pointer to a GOption group. Should be dereferenced after use. */ GOptionGroup *btic_init_get_option_group(void) { GOptionGroup *group; static GOptionEntry btic_args[] = { {"btic-version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer)parse_goption_arg, N_("Print the buzztard interaction controller version"), NULL}, {NULL} }; group = g_option_group_new("btic-core", _("Buzztard interaction controller options"),_("Show buzztard interaction controller options"), NULL, NULL); g_option_group_set_parse_hooks(group, (GOptionParseFunc)btic_init_pre, (GOptionParseFunc)btic_init_post); g_option_group_add_entries(group, btic_args); g_option_group_set_translation_domain(group, PACKAGE_NAME); return group; } /** * btic_init_check: * @argc: pointer to application's argc * @argv: pointer to application's argv * @err: pointer to a #GError to which a message will be posted on error * * Initializes the Buzztard interaction controller library. * * This function will return %FALSE if Buzztard interaction controller could not * be initialized for some reason. If you want your program to fail fatally, * use btic_init() instead. * * Returns: %TRUE if Buzztard interaction controller could be initialized. */ gboolean btic_init_check(int *argc, char **argv[], GError **err) { GOptionContext *ctx; gboolean res; if(btic_initialized) { //g_print("already initialized Buzztard interaction controller"); return(TRUE); } ctx = g_option_context_new(NULL); g_option_context_add_group(ctx, btic_init_get_option_group()); res = g_option_context_parse(ctx, argc, argv, err); g_option_context_free(ctx); btic_initialized=TRUE; return(res); } /** * btic_init: * @argc: pointer to application's argc * @argv: pointer to application's argv * * Initializes the Buzztard Interaction Controller library. * * * This function will terminate your program if it was unable to initialize * the core for some reason. If you want your program to fall back, * use btic_init_check() instead. * * * WARNING: This function does not work in the same way as corresponding * functions in other glib-style libraries, such as gtk_init(). In * particular, unknown command line options cause this function to * abort program execution. */ void btic_init(int *argc, char **argv[]) { GError *err = NULL; if(!btic_init_check(argc, argv, &err)) { g_print("Could not initialized Buzztard interaction controller: %s\n", err ? err->message : "unknown error occurred"); if(err) { g_error_free(err); } exit(1); } } buzztard-0.6.0/src/lib/ic/device.c0000644042355400116100000002274711620320142013647 00000000000000/* $Id: device.c 3533 2011-08-09 21:02:22Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bticdevice * @short_description: buzztards interaction controller device * * Abstract base class for control devices. Subclasses will provide * functionality to query capabilities and register #BtIcControl instances. * They will also read from the device and trigger the change events on their * controls (via value property). * * This baseclass manages the added controls. The can be queries by calling * btic_device_get_control_by_id() or iterating the list in * BtIcDevice::controls. */ /* @todo: need abstract _start() and _stop() method, whenever we bind/unbind a * control we need to call _start/_stop on the respective device. The * methods inc/dec a counter and if the counter is >0 we run the * g_io_channel */ #define BTIC_CORE #define BTIC_DEVICE_C #include "ic_private.h" enum { DEVICE_UDI=1, DEVICE_NAME, DEVICE_CONTROL_LIST }; struct _BtIcDevicePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* list of BtIcControl objects */ GList *controls; GHashTable *controls_by_id; gchar *udi; gchar *name; /* start/stop counter */ gulong run_ct; }; //-- the class G_DEFINE_ABSTRACT_TYPE (BtIcDevice, btic_device, G_TYPE_OBJECT); //-- helper static gint sort_by_name(const gpointer obj1,const gpointer obj2) { gchar *str1,*str2; gchar *str1c,*str2c; gint res; // @todo: this is fragmenting memory :/ // - we could atleast have a compare func in control g_object_get(obj1,"name",&str1,NULL); g_object_get(obj2,"name",&str2,NULL); str1c=g_utf8_casefold(str1,-1); str2c=g_utf8_casefold(str2,-1); res=g_utf8_collate(str1c,str2c); g_free(str1c);g_free(str1); g_free(str2c);g_free(str2); return(res); } //-- handler //-- constructor methods //-- methods /** * btic_device_add_control: * @self: the device * @control: new control * * Add the given @control to the list that the device manages. Takes ownership * of the control. */ void btic_device_add_control(const BtIcDevice *self, const BtIcControl *control) { guint id; g_return_if_fail(BTIC_DEVICE(self)); g_return_if_fail(BTIC_CONTROL(control)); self->priv->controls=g_list_insert_sorted(self->priv->controls,(gpointer)control,(GCompareFunc)sort_by_name); // we take the ref and unref when we destroy the device g_object_get((GObject *)control,"id",&id,NULL); g_hash_table_insert(self->priv->controls_by_id,GUINT_TO_POINTER(id),(gpointer)control); g_object_notify((GObject *)self,"controls"); } /** * btic_device_get_control_by_id: * @self: the device * @id: he control id * * Look up a control by @id. * * Returns: the found instance or %NULL. This does not increase the ref-count! * * Since: 0.6 */ BtIcControl *btic_device_get_control_by_id(const BtIcDevice *self,guint id) { BtIcControl *control=g_hash_table_lookup(self->priv->controls_by_id,GUINT_TO_POINTER(id)); return(control); } /** * btic_device_has_controls: * @self: the device * * Check if the device has controls. This is useful to check after device * creation. One reason for not having any controls could also be missing * read-permissions on the device node. * * Since: 0.6 */ gboolean btic_device_has_controls(const BtIcDevice *self) { g_return_val_if_fail(BTIC_DEVICE(self),FALSE); return(self->priv->controls!=NULL); } static gboolean btic_device_default_start(gconstpointer self) { GST_ERROR("virtual method btic_device_start(self=%p) called",self); return(FALSE); // this is a base class that can't do anything } static gboolean btic_device_default_stop(gconstpointer self) { GST_ERROR("virtual method btic_device_stop(self=%p) called",self); return(FALSE); // this is a base class that can't do anything } //-- wrapper /** * btic_device_start: * @self: the #BtIcDevice instance to use * * Starts the io-loop for the device. This can be called multiple times and must * be paired by an equal amount of btic_device_stop() calls. * * Returns: %TRUE for success */ gboolean btic_device_start(const BtIcDevice *self) { //const BtIcDevice *self=BTIC_DEVICE(_self); gboolean result=TRUE; self->priv->run_ct++; if(self->priv->run_ct==1) { result=BTIC_DEVICE_GET_CLASS(self)->start(self); } return(result); } /** * btic_device_stop: * @self: the #BtIcDevice instance to use * * Stops the io-loop for the device. This must be called as often as the device * has been started using btic_device_start(). * * Returns: %TRUE for success */ gboolean btic_device_stop(const BtIcDevice *self) { //const BtIcDevice *self=BTIC_DEVICE(_self); gboolean result=TRUE; g_assert(self->priv->run_ct>0); self->priv->run_ct--; if(self->priv->run_ct==0) { result=BTIC_DEVICE_GET_CLASS(self)->stop(self); } return(result); } //-- class internals /* returns a property for the given property_id for this object */ static void btic_device_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { const BtIcDevice * const self = BTIC_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_UDI: { g_value_set_string(value, self->priv->udi); } break; case DEVICE_NAME: { g_value_set_string(value, self->priv->name); } break; case DEVICE_CONTROL_LIST: { g_value_set_pointer(value,g_list_copy(self->priv->controls)); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void btic_device_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { const BtIcDevice * const self = BTIC_DEVICE(object); return_if_disposed(); switch (property_id) { case DEVICE_UDI: { self->priv->udi = g_value_dup_string(value); } break; case DEVICE_NAME: { self->priv->name = g_value_dup_string(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void btic_device_dispose(GObject * const object) { const BtIcDevice * const self = BTIC_DEVICE(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_device_parent_class)->dispose(object); GST_DEBUG(" done"); } static void btic_device_finalize(GObject * const object) { const BtIcDevice * const self = BTIC_DEVICE(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->udi); g_free(self->priv->name); if(self->priv->controls) { g_list_free(self->priv->controls); self->priv->controls=NULL; } g_hash_table_destroy(self->priv->controls_by_id); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(btic_device_parent_class)->finalize(object); GST_DEBUG(" done"); } static void btic_device_init(BtIcDevice *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BTIC_TYPE_DEVICE, BtIcDevicePrivate); self->priv->controls_by_id=g_hash_table_new_full(NULL,NULL,NULL,(GDestroyNotify)g_object_unref); } static void btic_device_class_init(BtIcDeviceClass * const klass) { GObjectClass * const gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtIcDevicePrivate)); gobject_class->set_property = btic_device_set_property; gobject_class->get_property = btic_device_get_property; gobject_class->dispose = btic_device_dispose; gobject_class->finalize = btic_device_finalize; klass->start = btic_device_default_start; klass->stop = btic_device_default_stop; g_object_class_install_property(gobject_class,DEVICE_UDI, g_param_spec_string("udi", "udi prop", "device udi", NULL, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,DEVICE_NAME, g_param_spec_string("name", "name prop", "device name", NULL, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,DEVICE_CONTROL_LIST, g_param_spec_pointer("controls", "control list prop", "A copy of the list of device controls", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/lib/ic/Makefile.am0000644042355400116100000000700211673622514014303 00000000000000## $Id: Makefile.am 3776 2011-12-19 11:51:38Z ensonic $ SUBDIRS = libbuzztard-ic if USE_LINUX_INPUT LINUX_INPUT_FILES=input-device.c libbuzztard-ic/input-device.h else LINUX_INPUT_FILES= endif if USE_GUDEV GUDEV_FILES=gudev-discoverer.c libbuzztard-ic/gudev-discoverer.h else GUDEV_FILES= endif if USE_HAL HAL_FILES=hal-discoverer.c libbuzztard-ic/hal-discoverer.h else HAL_FILES= endif lib_LTLIBRARIES = libbuzztard-ic.la libbuzztard_ic_la_LIBADD = \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) libbuzztard_ic_la_LDFLAGS = \ $(BT_LDFLAGS) \ -export-symbols-regex ^_?\(btic_\|BtIc\|BTIC_\).* \ -version-info @BT_VERSION_INFO@ libbuzztard_ic_la_SOURCES = \ ic.c libbuzztard-ic/ic.h \ registry.c libbuzztard-ic/registry.h \ $(GUDEV_FILES) $(HAL_FILES) \ \ device.c libbuzztard-ic/device.h \ learn.c libbuzztard-ic/learn.h \ $(LINUX_INPUT_FILES) \ midi-device.c libbuzztard-ic/midi-device.h \ \ control.c libbuzztard-ic/control.h \ abs-range-control.c libbuzztard-ic/abs-range-control.h \ trigger-control.c libbuzztard-ic/trigger-control.h libbuzztard_ic_la_CFLAGS = \ -I$(builddir)/libbuzztard-ic \ -I$(top_srcdir)/src/lib/core \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) noinst_HEADERS = ic_private.h libbuzztard-ic/version.h pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libbuzztard-ic.pc if USE_GIR gir_sources=$(patsubst %,$(srcdir)/%, $(libbuzztard_ic_la_SOURCES)) BuzztardIc-0.0.gir: $(G_IR_SCANNER) libbuzztard-ic.la -$(AM_V_GEN)$(G_IR_SCANNER) -v \ --namespace=BuzztardIc \ --nsversion 0.0 \ -I$(builddir)/libbuzztard-ic \ -I$(srcdir) \ -I$(srcdir)/libbuzztard-ic/ \ --identifier-prefix=BtIc \ --symbol-prefix=btic \ --c-include='libbuzztard-ic/ic.h' \ --include=GLib-2.0 \ --include=GObject-2.0 \ --include=Gst-0.10 \ --library=libbuzztard-ic.la \ --libtool="$(top_builddir)/libtool" \ --pkg glib-2.0 \ --pkg gobject-2.0 \ --pkg gstreamer-0.10 \ --pkg-export libbuzztard-ic \ --add-init-section="btic_init(NULL,NULL);" \ --output $@ \ $(gir_sources) || touch $@ BUILT_GIRSOURCES = BuzztardIc-0.0.gir girdir = $(datadir)/gir dist_gir_DATA = $(BUILT_GIRSOURCES) typelibsdir = $(libdir)/girepository typelibs_DATA = $(dist_gir_DATA:.gir=.typelib) TXML = $(dist_gir_DATA:.gir=.gir.txml) .gir.typelib: -$(AM_V_GEN)$(G_IR_COMPILER) --includedir=. $(G_IR_COMPILER_OPTS) $< -o $@ || touch $@ else BUILT_GIRSOURCES= endif EXTRA_DIST = \ libbuzztard-ic.pc.in # CLEANFILES is for files generated by make CLEANFILES = \ $(pkgconfig_DATA) \ $(typelibs_DATA) $(TXML) \ $(BUILT_GIRSOURCES) .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) -I$(top_srcdir)/src/lib/core $(libbtcore_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/lib/ic/libbuzztard-ic/0000755042355400116100000000000011675570651015263 500000000000000buzztard-0.6.0/src/lib/ic/libbuzztard-ic/abs-range-control.h0000644042355400116100000000467511634456242020677 00000000000000/* $Id: abs-range-control.h 3634 2011-09-15 20:14:25Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_ABS_RANGE_CONTROL_H #define BTIC_ABS_RANGE_CONTROL_H #include #include #include "control.h" #include "device.h" /* type macros */ #define BTIC_TYPE_ABS_RANGE_CONTROL (btic_abs_range_control_get_type ()) #define BTIC_ABS_RANGE_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_ABS_RANGE_CONTROL, BtIcAbsRangeControl)) #define BTIC_ABS_RANGE_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_ABS_RANGE_CONTROL, BtIcAbsRangeControlClass)) #define BTIC_IS_ABS_RANGE_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_ABS_RANGE_CONTROL)) #define BTIC_IS_ABS_RANGE_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_ABS_RANGE_CONTROL)) #define BTIC_ABS_RANGE_CONTROL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_ABS_RANGE_CONTROL, BtIcAbsRangeControlClass)) typedef struct _BtIcAbsRangeControl BtIcAbsRangeControl; typedef struct _BtIcAbsRangeControlClass BtIcAbsRangeControlClass; typedef struct _BtIcAbsRangeControlPrivate BtIcAbsRangeControlPrivate; /** * BtIcAbsRangeControl: * * buzztards interaction controller single trigger control */ struct _BtIcAbsRangeControl { const BtIcControl parent; /*< private >*/ BtIcAbsRangeControlPrivate *priv; }; struct _BtIcAbsRangeControlClass { const BtIcControlClass parent; }; GType btic_abs_range_control_get_type(void) G_GNUC_CONST; BtIcAbsRangeControl *btic_abs_range_control_new(const BtIcDevice *device,const gchar *name,guint id,glong min,glong max,glong def); #endif // BTIC_ABS_RANGE_CONTROL_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/gudev-discoverer.h0000644042355400116100000000446411665754555020647 00000000000000/* $Id: gudev-discoverer.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_GUDEV_DISCOVERER_H #define BTIC_GUDEV_DISCOVERER_H #include #include /* type macros */ #define BTIC_TYPE_GUDEV_DISCOVERER (btic_gudev_discoverer_get_type ()) #define BTIC_GUDEV_DISCOVERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_GUDEV_DISCOVERER, BtIcGudevDiscoverer)) #define BTIC_GUDEV_DISCOVERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_GUDEV_DISCOVERER, BtIcRGudevDiscovererClass)) #define BTIC_IS_GUDEV_DISCOVERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_GUDEV_DISCOVERER)) #define BTIC_IS_GUDEV_DISCOVERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_GUDEV_DISCOVERER)) #define BTIC_GUDEV_DISCOVERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_GUDEV_DISCOVERER, BtIcGudevDiscovererClass)) typedef struct _BtIcGudevDiscoverer BtIcGudevDiscoverer; typedef struct _BtIcGudevDiscovererClass BtIcGudevDiscovererClass; typedef struct _BtIcGudevDiscovererPrivate BtIcGudevDiscovererPrivate; /** * BtIcGudevDiscoverer: * * gudev based device discovery for buzztards interaction controller */ struct _BtIcGudevDiscoverer { const GObject parent; /*< private >*/ BtIcGudevDiscovererPrivate *priv; }; struct _BtIcGudevDiscovererClass { const GObjectClass parent; }; GType btic_gudev_discoverer_get_type(void) G_GNUC_CONST; BtIcGudevDiscoverer *btic_gudev_discoverer_new(void); #endif // BTIC_GUDEV_DISCOVERER buzztard-0.6.0/src/lib/ic/libbuzztard-ic/ic.h0000644042355400116100000000273711625554211015745 00000000000000/* $Id: ic.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_IC_H #define BT_IC_H //-- glib/gobject #include #include #include //-- gstreamer #include //-- libbtic #include "control.h" #include "abs-range-control.h" #include "trigger-control.h" #include "device.h" #include "registry.h" #include "learn.h" //-- prototypes ---------------------------------------------------------------- #ifndef BTIC_CORE_C extern GOptionGroup *btic_init_get_option_group(void); extern gboolean btic_init_check(int *argc, char **argv[], GError **err); extern void btic_init(int *argc, char **argv[]); #endif #endif // BT_IC_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/registry.h0000644042355400116100000000426411625554211017217 00000000000000/* $Id: registry.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_REGISTRY_H #define BTIC_REGISTRY_H #include #include #include "device.h" /* type macros */ #define BTIC_TYPE_REGISTRY (btic_registry_get_type ()) #define BTIC_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_REGISTRY, BtIcRegistry)) #define BTIC_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_REGISTRY, BtIcRegistryClass)) #define BTIC_IS_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_REGISTRY)) #define BTIC_IS_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_REGISTRY)) #define BTIC_REGISTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_REGISTRY, BtIcRegistryClass)) typedef struct _BtIcRegistry BtIcRegistry; typedef struct _BtIcRegistryClass BtIcRegistryClass; typedef struct _BtIcRegistryPrivate BtIcRegistryPrivate; /** * BtIcRegistry: * * buzztards interaction controller registry */ struct _BtIcRegistry { const GObject parent; /*< private >*/ BtIcRegistryPrivate *priv; }; struct _BtIcRegistryClass { const GObjectClass parent; }; GType btic_registry_get_type(void) G_GNUC_CONST; BtIcRegistry *btic_registry_new(void); void btic_registry_remove_device_by_udi(const gchar *udi); void btic_registry_add_device(BtIcDevice *device); #endif // BTIC_REGISTRY_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/Makefile.in0000644042355400116100000004430411675570634017256 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/lib/ic/libbuzztard-ic DIST_COMMON = $(am__libbtcore_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/version.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = version.h CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = am__libbtcore_HEADERS_DIST = ic.h version.h registry.h \ gudev-discoverer.h hal-discoverer.h device.h learn.h \ input-device.h midi-device.h control.h abs-range-control.h \ trigger-control.h 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__installdirs = "$(DESTDIR)$(libbtcoredir)" HEADERS = $(libbtcore_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ @USE_LINUX_INPUT_FALSE@LINUX_INPUT_SOURCES = @USE_LINUX_INPUT_TRUE@LINUX_INPUT_SOURCES = input-device.h @USE_GUDEV_FALSE@GUDEV_SOURCES = @USE_GUDEV_TRUE@GUDEV_SOURCES = gudev-discoverer.h @USE_HAL_FALSE@HAL_SOURCES = @USE_HAL_TRUE@HAL_SOURCES = hal-discoverer.h libbtcoredir = $(includedir)/libbuzztard-ic libbtcore_HEADERS = \ ic.h \ version.h \ registry.h \ $(GUDEV_SOURCES) $(HAL_SOURCES) \ \ device.h \ learn.h \ $(LINUX_INPUT_SOURCES) \ midi-device.h \ \ control.h \ abs-range-control.h \ trigger-control.h # DISTCLEANFILES is for files generated by configure DISTCLEANFILES = version.h 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 src/lib/ic/libbuzztard-ic/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/lib/ic/libbuzztard-ic/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): version.h: $(top_builddir)/config.status $(srcdir)/version.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-libbtcoreHEADERS: $(libbtcore_HEADERS) @$(NORMAL_INSTALL) test -z "$(libbtcoredir)" || $(MKDIR_P) "$(DESTDIR)$(libbtcoredir)" @list='$(libbtcore_HEADERS)'; test -n "$(libbtcoredir)" || list=; \ 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_HEADER) $$files '$(DESTDIR)$(libbtcoredir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(libbtcoredir)" || exit $$?; \ done uninstall-libbtcoreHEADERS: @$(NORMAL_UNINSTALL) @list='$(libbtcore_HEADERS)'; test -n "$(libbtcoredir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(libbtcoredir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(libbtcoredir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libbtcoredir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-libbtcoreHEADERS 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: uninstall-libbtcoreHEADERS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool ctags distclean distclean-generic \ distclean-libtool distclean-tags 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-libbtcoreHEADERS 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 uninstall uninstall-am uninstall-libbtcoreHEADERS # 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: buzztard-0.6.0/src/lib/ic/libbuzztard-ic/version.h.in0000644042355400116100000000245511576360371017450 00000000000000/* $Id: version.h.in 2807 2010-04-07 14:43:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_VERSION_H #define BTIC_VERSION_H /* * buzztard version stamp; determined from configure.ac */ #define BTIC_MAJOR_VERSION @BT_MAJOR_VERSION@ #define BTIC_MINOR_VERSION @BT_MINOR_VERSION@ #define BTIC_MICRO_VERSION @BT_MICRO_VERSION@ #ifndef BTIC_CORE_C extern const unsigned int btic_major_version; extern const unsigned int btic_minor_version; extern const unsigned int btic_micro_version; #endif #endif // BTIC_VERSION buzztard-0.6.0/src/lib/ic/libbuzztard-ic/device.h0000644042355400116100000000626411625554211016610 00000000000000/* $Id: device.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_DEVICE_H #define BTIC_DEVICE_H #include #include #include "control.h" /* type macros */ #define BTIC_TYPE_DEVICE (btic_device_get_type ()) #define BTIC_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_DEVICE, BtIcDevice)) #define BTIC_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_DEVICE, BtIcDeviceClass)) #define BTIC_IS_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_DEVICE)) #define BTIC_IS_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_DEVICE)) #define BTIC_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_DEVICE, BtIcDeviceClass)) typedef struct _BtIcDevice BtIcDevice; typedef struct _BtIcDeviceClass BtIcDeviceClass; typedef struct _BtIcDevicePrivate BtIcDevicePrivate; /** * BtIcDevice: * * buzztards interaction controller device */ struct _BtIcDevice { const GObject parent; /*< private >*/ BtIcDevicePrivate *priv; }; /** * btic_device_virtual_start: * @self: device instance * * Subclasses will override this methods with a function that counts start calls * and runs the device-io for starts>0. * * Returns: %TRUE for success */ typedef gboolean (*btic_device_virtual_start)(gconstpointer self); /** * btic_device_virtual_stop: * @self: device instance * * Subclasses will override this methods with a function that counts stop calls * and stops the device-io for starts==0. * * Returns: %TRUE for success */ typedef gboolean (*btic_device_virtual_stop)(gconstpointer self); /** * BtIcDeviceClass: * @parent: parent class type * @start: virtual method for starting a devie * @stop: virtual method for stopping a device * @learn: virtual method for a learn function * * buzztards interaction controller device class */ struct _BtIcDeviceClass { const GObjectClass parent; /* class methods */ btic_device_virtual_start start; btic_device_virtual_stop stop; }; GType btic_device_get_type(void) G_GNUC_CONST; void btic_device_add_control(const BtIcDevice *self, const BtIcControl *control); BtIcControl *btic_device_get_control_by_id(const BtIcDevice *self,guint id); gboolean btic_device_has_controls(const BtIcDevice *self); gboolean btic_device_start(const BtIcDevice *self); gboolean btic_device_stop(const BtIcDevice *self); #endif // BTIC_DEVICE_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/version.h0000644042355400116100000000237211675570643017046 00000000000000/* $Id: version.h.in 2807 2010-04-07 14:43:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_VERSION_H #define BTIC_VERSION_H /* * buzztard version stamp; determined from configure.ac */ #define BTIC_MAJOR_VERSION 0 #define BTIC_MINOR_VERSION 6 #define BTIC_MICRO_VERSION 0 #ifndef BTIC_CORE_C extern const unsigned int btic_major_version; extern const unsigned int btic_minor_version; extern const unsigned int btic_micro_version; #endif #endif // BTIC_VERSION buzztard-0.6.0/src/lib/ic/libbuzztard-ic/input-device.h0000644042355400116100000000433311625554211017740 00000000000000/* $Id: input-device.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_INPUT_DEVICE_H #define BTIC_INPUT_DEVICE_H #include #include /* type macros */ #define BTIC_TYPE_INPUT_DEVICE (btic_input_device_get_type ()) #define BTIC_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_INPUT_DEVICE, BtIcInputDevice)) #define BTIC_INPUT_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_INPUT_DEVICE, BtIcInputDeviceClass)) #define BTIC_IS_INPUT_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_INPUT_DEVICE)) #define BTIC_IS_INPUT_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_INPUT_DEVICE)) #define BTIC_INPUT_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_INPUT_DEVICE, BtIcInputDeviceClass)) typedef struct _BtIcInputDevice BtIcInputDevice; typedef struct _BtIcInputDeviceClass BtIcInputDeviceClass; typedef struct _BtIcInputDevicePrivate BtIcInputDevicePrivate; /** * BtIcInputDevice: * * buzztards interaction controller registry */ struct _BtIcInputDevice { const BtIcDevice parent; /*< private >*/ BtIcInputDevicePrivate *priv; }; struct _BtIcInputDeviceClass { const BtIcDeviceClass parent; }; GType btic_input_device_get_type(void) G_GNUC_CONST; BtIcInputDevice *btic_input_device_new(const gchar *udi,const gchar *name,const gchar *devnode); #endif // BTIC_INPUT_DEVICE_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/hal-discoverer.h0000644042355400116100000000436211665754572020275 00000000000000/* $Id: hal-discoverer.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_HAL_DISCOVERER_H #define BTIC_HAL_DISCOVERER_H #include #include /* type macros */ #define BTIC_TYPE_HAL_DISCOVERER (btic_hal_discoverer_get_type ()) #define BTIC_HAL_DISCOVERER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_HAL_DISCOVERER, BtIcHalDiscoverer)) #define BTIC_HAL_DISCOVERER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_HAL_DISCOVERER, BtIcRHalDiscovererClass)) #define BTIC_IS_HAL_DISCOVERER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_HAL_DISCOVERER)) #define BTIC_IS_HAL_DISCOVERER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_HAL_DISCOVERER)) #define BTIC_HAL_DISCOVERER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_HAL_DISCOVERER, BtIcHalDiscovererClass)) typedef struct _BtIcHalDiscoverer BtIcHalDiscoverer; typedef struct _BtIcHalDiscovererClass BtIcHalDiscovererClass; typedef struct _BtIcHalDiscovererPrivate BtIcHalDiscovererPrivate; /** * BtIcHalDiscoverer: * * hal based device discovery for buzztards interaction controller */ struct _BtIcHalDiscoverer { const GObject parent; /*< private >*/ BtIcHalDiscovererPrivate *priv; }; struct _BtIcHalDiscovererClass { const GObjectClass parent; }; GType btic_hal_discoverer_get_type(void) G_GNUC_CONST; BtIcHalDiscoverer *btic_hal_discoverer_new(void); #endif // BTIC_HAL_DISCOVERER buzztard-0.6.0/src/lib/ic/libbuzztard-ic/control.h0000644042355400116100000000375411625554211017032 00000000000000/* $Id: control.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_CONTROL_H #define BTIC_CONTROL_H #include #include /* type macros */ #define BTIC_TYPE_CONTROL (btic_control_get_type ()) #define BTIC_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_CONTROL, BtIcControl)) #define BTIC_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_CONTROL, BtIcControlClass)) #define BTIC_IS_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_CONTROL)) #define BTIC_IS_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_CONTROL)) #define BTIC_CONTROL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_CONTROL, BtIcControlClass)) typedef struct _BtIcControl BtIcControl; typedef struct _BtIcControlClass BtIcControlClass; typedef struct _BtIcControlPrivate BtIcControlPrivate; /** * BtIcControl: * * buzztards interaction controller single control */ struct _BtIcControl { const GObject parent; /*< private >*/ BtIcControlPrivate *priv; }; struct _BtIcControlClass { const GObjectClass parent; }; GType btic_control_get_type(void) G_GNUC_CONST; #endif // BTIC_CONTROL_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/learn.h0000644042355400116100000000610011625534644016447 00000000000000/* $Id: learn.h 3603 2011-08-25 21:07:45Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_LEARN_H #define BTIC_LEARN_H #include #include #define BTIC_TYPE_LEARN (btic_learn_get_type()) #define BTIC_LEARN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_LEARN, BtIcLearn)) #define BTIC_IS_LEARN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_LEARN)) #define BTIC_LEARN_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), BTIC_TYPE_LEARN, BtIcLearnInterface)) /* type macros */ typedef struct _BtIcLearn BtIcLearn; /* dummy object */ typedef struct _BtIcLearnInterface BtIcLearnInterface; /** * btic_learn_virtual_start: * @self: device instance * * Subclasses will override this methods with a function which enables the * learning mode on this device. * * Returns: %TRUE for success */ typedef gboolean (*btic_learn_virtual_start)(gconstpointer self); /** * btic_learn_virtual_stop: * @self: device instance * * Subclasses will override this methods with a function which disables the * learning mode on this device. * * Returns: %TRUE for success */ typedef gboolean (*btic_learn_virtual_stop)(gconstpointer self); /** * btic_learn_virtual_register_learned_control: * @self: device instance * @name: the name under which to register the control * * Subclasses will override this methods with a function which registers * the last control which was detected in learn mode. * * Returns: %TRUE for success */ typedef BtIcControl* (*btic_learn_virtual_register_learned_control)(gconstpointer self, const gchar *name); /** * BtIcLearn: * * interface for devices which implement a learn-function */ struct _BtIcLearnInterface { const GTypeInterface parent; btic_learn_virtual_start learn_start; btic_learn_virtual_stop learn_stop; btic_learn_virtual_register_learned_control register_learned_control; }; GType btic_learn_get_type(void) G_GNUC_CONST; gboolean btic_learn_start(const BtIcLearn *self); gboolean btic_learn_stop(const BtIcLearn *self); BtIcControl* btic_learn_register_learned_control(const BtIcLearn *self, const gchar *name); gboolean btic_learn_store_controller_map(const BtIcLearn *self); gboolean btic_learn_load_controller_map(const BtIcLearn *self); #endif // BTIC_LEARN_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/Makefile.am0000644042355400116100000000116411625534644017236 00000000000000## $Id: Makefile.am 3603 2011-08-25 21:07:45Z ensonic $ if USE_LINUX_INPUT LINUX_INPUT_SOURCES=input-device.h else LINUX_INPUT_SOURCES= endif if USE_GUDEV GUDEV_SOURCES=gudev-discoverer.h else GUDEV_SOURCES= endif if USE_HAL HAL_SOURCES=hal-discoverer.h else HAL_SOURCES= endif libbtcoredir = $(includedir)/libbuzztard-ic libbtcore_HEADERS = \ ic.h \ version.h \ registry.h \ $(GUDEV_SOURCES) $(HAL_SOURCES) \ \ device.h \ learn.h \ $(LINUX_INPUT_SOURCES) \ midi-device.h \ \ control.h \ abs-range-control.h \ trigger-control.h # DISTCLEANFILES is for files generated by configure DISTCLEANFILES = version.h buzztard-0.6.0/src/lib/ic/libbuzztard-ic/trigger-control.h0000644042355400116100000000455511625554211020473 00000000000000/* $Id: trigger-control.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_TRIGGER_CONTROL_H #define BTIC_TRIGGER_CONTROL_H #include #include #include "control.h" #include "device.h" /* type macros */ #define BTIC_TYPE_TRIGGER_CONTROL (btic_trigger_control_get_type ()) #define BTIC_TRIGGER_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_TRIGGER_CONTROL, BtIcTriggerControl)) #define BTIC_TRIGGER_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_TRIGGER_CONTROL, BtIcTriggerControlClass)) #define BTIC_IS_TRIGGER_CONTROL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_TRIGGER_CONTROL)) #define BTIC_IS_TRIGGER_CONTROL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_TRIGGER_CONTROL)) #define BTIC_TRIGGER_CONTROL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_TRIGGER_CONTROL, BtIcTriggerControlClass)) typedef struct _BtIcTriggerControl BtIcTriggerControl; typedef struct _BtIcTriggerControlClass BtIcTriggerControlClass; typedef struct _BtIcTriggerControlPrivate BtIcTriggerControlPrivate; /** * BtIcTriggerControl: * * buzztards interaction controller single trigger control */ struct _BtIcTriggerControl { const BtIcControl parent; /*< private >*/ BtIcTriggerControlPrivate *priv; }; struct _BtIcTriggerControlClass { const BtIcControlClass parent; }; GType btic_trigger_control_get_type(void) G_GNUC_CONST; BtIcTriggerControl *btic_trigger_control_new(const BtIcDevice *device,const gchar *name,guint id); #endif // BTIC_TRIGGER_CONTROL_H buzztard-0.6.0/src/lib/ic/libbuzztard-ic/midi-device.h0000644042355400116100000000432011625554211017517 00000000000000/* $Id: midi-device.h 3608 2011-08-25 23:19:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BTIC_MIDI_DEVICE_H #define BTIC_MIDI_DEVICE_H #include #include #include "device.h" /* type macros */ #define BTIC_TYPE_MIDI_DEVICE (btic_midi_device_get_type ()) #define BTIC_MIDI_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BTIC_TYPE_MIDI_DEVICE, BtIcMidiDevice)) #define BTIC_MIDI_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BTIC_TYPE_MIDI_DEVICE, BtIcMidiDeviceClass)) #define BTIC_IS_MIDI_DEVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BTIC_TYPE_MIDI_DEVICE)) #define BTIC_IS_MIDI_DEVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BTIC_TYPE_MIDI_DEVICE)) #define BTIC_MIDI_DEVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BTIC_TYPE_MIDI_DEVICE, BtIcMidiDeviceClass)) typedef struct _BtIcMidiDevice BtIcMidiDevice; typedef struct _BtIcMidiDeviceClass BtIcMidiDeviceClass; typedef struct _BtIcMidiDevicePrivate BtIcMidiDevicePrivate; /** * BtIcMidiDevice: * * buzztards interaction controller registry */ struct _BtIcMidiDevice { const BtIcDevice parent; /*< private >*/ BtIcMidiDevicePrivate *priv; }; struct _BtIcMidiDeviceClass { const BtIcDeviceClass parent; }; GType btic_midi_device_get_type(void) G_GNUC_CONST; BtIcMidiDevice *btic_midi_device_new(const gchar *udi,const gchar *name,const gchar *devnode); #endif // BTIC_MIDI_DEVICE_H buzztard-0.6.0/src/lib/ic/BuzztardIc-0.0.gir0000644042355400116100000000000011675570650015322 00000000000000buzztard-0.6.0/src/lib/Makefile.am0000644042355400116100000000242511576360372013717 00000000000000SUBDIRS = ic core # generate and install .xml mime info file sharedmimedir = $(datadir)/mime sharedmimepackagedir = $(sharedmimedir)/packages sharedmimepackage_in_files = buzztard.xml.in sharedmimepackage_DATA = $(sharedmimepackage_in_files:.xml.in=.xml) @INTLTOOL_XML_RULE@ buzztard.xml: buzztard.xml.in CLEANFILES = $(sharedmimepackage_DATA) EXTRA_DIST = $(sharedmimepackage_in_files) # update mime database install-data-hook: test -z "$(UPDATE_MIME_DATABASE)" || $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(sharedmimedir)"; uninstall-local: uninstall-sharedmimepackageDATA test -z "$(UPDATE_MIME_DATABASE)" || $(UPDATE_MIME_DATABASE) "$(DESTDIR)$(sharedmimedir)"; .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/ui/0000755042355400116100000000000011675570676011621 500000000000000buzztard-0.6.0/src/ui/edit/0000755042355400116100000000000011675570676012546 500000000000000buzztard-0.6.0/src/ui/edit/machine-preferences-dialog.h0000644042355400116100000000504611625722250017762 00000000000000/* $Id: machine-preferences-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_PREFERENCES_DIALOG_H #define BT_MACHINE_PREFERENCES_DIALOG_H #include #include #define BT_TYPE_MACHINE_PREFERENCES_DIALOG (bt_machine_preferences_dialog_get_type ()) #define BT_MACHINE_PREFERENCES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_PREFERENCES_DIALOG, BtMachinePreferencesDialog)) #define BT_MACHINE_PREFERENCES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_PREFERENCES_DIALOG, BtMachinePreferencesDialogClass)) #define BT_IS_MACHINE_PREFERENCES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_PREFERENCES_DIALOG)) #define BT_IS_MACHINE_PREFERENCES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_PREFERENCES_DIALOG)) #define BT_MACHINE_PREFERENCES_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_PREFERENCES_DIALOG, BtMachinePreferencesDialogClass)) /* type macros */ typedef struct _BtMachinePreferencesDialog BtMachinePreferencesDialog; typedef struct _BtMachinePreferencesDialogClass BtMachinePreferencesDialogClass; typedef struct _BtMachinePreferencesDialogPrivate BtMachinePreferencesDialogPrivate; /** * BtMachinePreferencesDialog: * * the root window for the editor application */ struct _BtMachinePreferencesDialog { GtkWindow parent; /*< private >*/ BtMachinePreferencesDialogPrivate *priv; }; struct _BtMachinePreferencesDialogClass { GtkWindowClass parent; }; GType bt_machine_preferences_dialog_get_type(void) G_GNUC_CONST; BtMachinePreferencesDialog *bt_machine_preferences_dialog_new(const BtMachine *machine); #endif // BT_MACHINE_PREFERENCES_DIALOG_H buzztard-0.6.0/src/ui/edit/gtkvumeter.c0000644042355400116100000003756311666753016015034 00000000000000/* $Id: gtkvumeter.c 3741 2011-12-04 20:17:17Z ensonic $ * * GtkVumeter * Copyright (C) 2003 Todd Goyen * 2007-2009 Buzztard team * 2008 Frederic Peters * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* @todo: add properties: * - vertical : gboolean, readonly * - min,max,rms,peak : gint, read/write * - scale_type : enum, read/write * @todo: revisit cairo usage * - http://www.cairographics.org/FAQ/#sharp_lines */ /** * SECTION:gtkvumeter * @short_description: vu meter widget * * Shows a vertical or horizontal gauge with a colorized bar to signal volume * level. */ #include #include "gtkvumeter.h" #if !GTK_CHECK_VERSION(2,20,0) #define gtk_widget_set_realized(widget, flag) \ if (flag) GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); \ else GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED) #define gtk_widget_get_realized(widget) \ ((GTK_WIDGET_FLAGS (widget) & GTK_REALIZED) != 0) #endif #define MIN_HORIZONTAL_VUMETER_WIDTH 150 #define HORIZONTAL_VUMETER_HEIGHT 6 #define VERTICAL_VUMETER_WIDTH 6 #define MIN_VERTICAL_VUMETER_HEIGHT 400 static void gtk_vumeter_finalize (GObject * object); static void gtk_vumeter_realize (GtkWidget *widget); static void gtk_vumeter_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_vumeter_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static gint gtk_vumeter_expose (GtkWidget *widget, GdkEventExpose *event); //-- the class G_DEFINE_TYPE (GtkVUMeter, gtk_vumeter, GTK_TYPE_WIDGET); /** * gtk_vumeter_new: * @vertical: %TRUE for a vertical VUMeter, %FALSE for horizontal VUMeter. * * Creates a new VUMeter widget. * * Returns: the new #GtkWidget */ GtkWidget* gtk_vumeter_new (gboolean vertical) { GtkVUMeter *vumeter; vumeter = GTK_VUMETER( g_object_new (GTK_TYPE_VUMETER,NULL)); vumeter->vertical = vertical; return GTK_WIDGET (vumeter); } static void gtk_vumeter_init (GtkVUMeter *vumeter) { vumeter->rms_level = 0; vumeter->min = 0; vumeter->max = 32767; vumeter->peak_level = 0; vumeter->delay_peak_level = 0; vumeter->scale = GTK_VUMETER_SCALE_LINEAR; } static void gtk_vumeter_class_init (GtkVUMeterClass *klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GtkWidgetClass *widget_class = (GtkWidgetClass*) klass; gobject_class->finalize = gtk_vumeter_finalize; widget_class->realize = gtk_vumeter_realize; widget_class->expose_event = gtk_vumeter_expose; widget_class->size_request = gtk_vumeter_size_request; widget_class->size_allocate = gtk_vumeter_size_allocate; } static void gtk_vumeter_finalize (GObject * object) { GtkVUMeter *vumeter = GTK_VUMETER (object); /* free old gradients */ if (vumeter->gradient_rms) cairo_pattern_destroy (vumeter->gradient_rms); if (vumeter->gradient_peak) cairo_pattern_destroy (vumeter->gradient_peak); if (vumeter->gradient_bg) cairo_pattern_destroy (vumeter->gradient_bg); G_OBJECT_CLASS (gtk_vumeter_parent_class)->finalize (object); } static void gtk_vumeter_allocate_colors (GtkVUMeter *vumeter) { /* free old gradients */ if (vumeter->gradient_rms) cairo_pattern_destroy (vumeter->gradient_rms); if (vumeter->gradient_peak) cairo_pattern_destroy (vumeter->gradient_peak); if (vumeter->gradient_bg) cairo_pattern_destroy (vumeter->gradient_bg); if (vumeter->vertical) { /* veritcal */ gint height = ((GtkWidget *)vumeter)->allocation.height - 1; /* setup gradients */ vumeter->gradient_rms = cairo_pattern_create_linear(1, 1, 1,height); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 0, 0.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 0.7, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 1.0, 1.0, 0.0, 0.0); vumeter->gradient_peak = cairo_pattern_create_linear(1, 1, 1, height); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 0, 0.0, 0.6, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 0.7, 0.6, 0.6, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 1.0, 0.6, 0.0, 0.0); vumeter->gradient_bg = cairo_pattern_create_linear(1, 1, 1, height); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 0, 0.0, 0.3, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 0.7, 0.3, 0.3, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 1.0, 0.3, 0.0, 0.0); } else { /* horizontal */ gint width = ((GtkWidget *)vumeter)->allocation.width - 1; /* setup gradients */ vumeter->gradient_rms = cairo_pattern_create_linear(1, 1, width, 1); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 0, 0.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 0.7, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_rms, 1.0, 1.0, 0.0, 0.0); vumeter->gradient_peak = cairo_pattern_create_linear(1, 1, width, 1); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 0, 0.0, 0.6, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 0.7, 0.6, 0.6, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_peak, 1.0, 0.6, 0.0, 0.0); vumeter->gradient_bg = cairo_pattern_create_linear(1, 1, width, 1); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 0, 0.0, 0.3, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 0.7, 0.3, 0.3, 0.0); cairo_pattern_add_color_stop_rgb(vumeter->gradient_bg, 1.0, 0.3, 0.0, 0.0); } } static void gtk_vumeter_realize (GtkWidget *widget) { GtkVUMeter *vumeter; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_VUMETER (widget)); gtk_widget_set_realized(widget, TRUE); vumeter = GTK_VUMETER (widget); attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); widget->style = gtk_style_attach (widget->style, widget->window); gdk_window_set_user_data (widget->window, widget); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gtk_vumeter_allocate_colors (vumeter); } static void gtk_vumeter_size_request (GtkWidget *widget, GtkRequisition *requisition) { GtkVUMeter *vumeter; g_return_if_fail (GTK_IS_VUMETER (widget)); g_return_if_fail (requisition != NULL); vumeter = GTK_VUMETER (widget); if (vumeter->vertical) { requisition->width = VERTICAL_VUMETER_WIDTH; requisition->height = MIN_VERTICAL_VUMETER_HEIGHT; } else { requisition->width = MIN_HORIZONTAL_VUMETER_WIDTH; requisition->height = HORIZONTAL_VUMETER_HEIGHT; } } static void gtk_vumeter_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkVUMeter *vumeter; GtkAllocation *a; g_return_if_fail (GTK_IS_VUMETER (widget)); g_return_if_fail (allocation != NULL); GTK_WIDGET_CLASS (gtk_vumeter_parent_class)->size_allocate (widget, allocation); vumeter = GTK_VUMETER (widget); a = &widget->allocation; #if 0 a->x = allocation->x; a->y = allocation->y; if (vumeter->vertical) { a->width = MAX(allocation->width, VERTICAL_VUMETER_WIDTH); a->height = MAX(allocation->height, MIN_VERTICAL_VUMETER_HEIGHT); //printf("V geometry: %dx%d - %dx%d\n",a->x,a->y,a->width,a->height); } else { a->width = MAX(allocation->width, MIN_HORIZONTAL_VUMETER_WIDTH); a->height = MAX(allocation->height, HORIZONTAL_VUMETER_HEIGHT); //printf("H geometry: %dx%d - %dx%d\n",a->x,a->y,a->width,a->height); } #else *a = *allocation; #endif if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (widget->window, a->x, a->y, a->width, a->height); } gtk_vumeter_allocate_colors (vumeter); } static gint gtk_vumeter_sound_level_to_draw_level (GtkVUMeter *vumeter, gint sound_level, gdouble length) { gdouble draw_level; gdouble level, min, max; level = (gdouble)sound_level; min = (gdouble)vumeter->min; max = (gdouble)vumeter->max; if (vumeter->scale == GTK_VUMETER_SCALE_LINEAR) { draw_level = (level - min)/(max - min) * length; } else { gdouble log_level, log_max; log_level = log10((level - min + 1)/(max - min + 1)); log_max = log10(1/(max - min + 1)); /* FIXME: could be cached */ draw_level = length - log_level/log_max * length; } return (gint)draw_level; } static gint gtk_vumeter_expose (GtkWidget *widget, GdkEventExpose *event) { GtkVUMeter *vumeter; gint rms_level, peak_level; gint width, height; cairo_t *cr; guint i; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_VUMETER (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->count > 0) return FALSE; vumeter = GTK_VUMETER (widget); cr = gdk_cairo_create (widget->window); /* draw border */ /* detail for part of progressbar would be called "trough" */ gtk_paint_box (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, widget, NULL/*detail*/, 0, 0, widget->allocation.width, widget->allocation.height); if (vumeter->vertical) { width = widget->allocation.width - 3; height = widget->allocation.height - 2; rms_level = gtk_vumeter_sound_level_to_draw_level (vumeter, vumeter->rms_level, height-1); peak_level = gtk_vumeter_sound_level_to_draw_level (vumeter, vumeter->peak_level, height-1); /* draw normal level */ cairo_set_source (cr, vumeter->gradient_rms); cairo_rectangle (cr, 1.5, 1.5, width, rms_level); cairo_fill (cr); /* draw peak */ if (peak_level > rms_level) { cairo_set_source (cr, vumeter->gradient_peak); cairo_rectangle (cr, 1.5, rms_level+0.5, width, peak_level-rms_level); cairo_fill (cr); } /* draw background for the rest */ if (height > peak_level) { cairo_set_source (cr, vumeter->gradient_bg); cairo_rectangle (cr, 1.5, peak_level+0.5, width, height-peak_level); cairo_fill (cr); } /* shade every 4th line */ cairo_set_source_rgba (cr, 0, 0, 0, 0.5); cairo_set_line_width (cr, 1.0); for (i = 1; i < height; i += 5) { cairo_move_to (cr, 1.5, i+0.5); cairo_line_to (cr, width+0.5, i+1.5); } cairo_stroke (cr); } else { /* Horizontal */ width = widget->allocation.width - 2; height = widget->allocation.height - 3; rms_level = gtk_vumeter_sound_level_to_draw_level (vumeter, vumeter->rms_level, width-1); peak_level = gtk_vumeter_sound_level_to_draw_level (vumeter, vumeter->peak_level, width-1); /* draw normal level */ cairo_set_source (cr, vumeter->gradient_rms); cairo_rectangle (cr, 1.5, 1.5, rms_level, height); cairo_fill (cr); /* draw peak */ if (peak_level > rms_level) { cairo_set_source (cr, vumeter->gradient_peak); cairo_rectangle (cr, rms_level+0.5, 1.5, peak_level-rms_level, height); cairo_fill (cr); } /* draw background for the rest */ if (width > peak_level) { cairo_set_source (cr, vumeter->gradient_bg); cairo_rectangle (cr, peak_level+0.5, 1.5, width-peak_level, height); cairo_fill (cr); } /* shade every 4th line */ cairo_set_source_rgba (cr, 0, 0, 0, 0.5); cairo_set_line_width (cr, 1.0); for (i = 1; i < width; i += 5) { cairo_move_to (cr, i+0.5, 1.5); cairo_line_to (cr, i+0.5, height+1.5); } cairo_stroke (cr); } cairo_destroy (cr); return FALSE; } /** * gtk_vumeter_set_min_max: * @vumeter: the vumeter widget to change the level bounds * @min: the new minimum level shown (level that is 0%) * @max: the new maximum level shown (level that is 100%) * * Sets the minimum and maximum of the VU Meters scale. * The positions are irrelevant as the widget will rearrange them. * It will also increment max by one if min == max. * And finally it will clamp the current level into the min,max range. */ void gtk_vumeter_set_min_max (GtkVUMeter *vumeter, gint min, gint max) { gint old_rms_level = vumeter->rms_level; gint old_peak_level = vumeter->peak_level; g_return_if_fail (GTK_IS_VUMETER (vumeter)); vumeter->max = MAX(max, min); vumeter->min = MIN(min, max); if (vumeter->max == vumeter->min) { vumeter->max++; } vumeter->rms_level = CLAMP (vumeter->rms_level, vumeter->min, vumeter->max); vumeter->peak_level = CLAMP (vumeter->peak_level, vumeter->min, vumeter->max); if ((old_rms_level != vumeter->rms_level) || (old_peak_level != vumeter->peak_level)) { gtk_widget_queue_draw (GTK_WIDGET(vumeter)); } } /** * gtk_vumeter_set_levels: * @vumeter: the vumeter widget to change the current level * @rms: the new rms level shown * @peak: the new peak level shown * * Sets new level values for the level display. * They are clamped to the min max range. */ void gtk_vumeter_set_levels (GtkVUMeter *vumeter, gint rms, gint peak) { gint old_rms_level = vumeter->rms_level; gint old_peak_level = vumeter->peak_level; g_return_if_fail (GTK_IS_VUMETER (vumeter)); vumeter->rms_level = CLAMP (rms, vumeter->min, vumeter->max); vumeter->peak_level = CLAMP (peak, vumeter->min, vumeter->max); if ((old_rms_level != vumeter->rms_level) || (old_peak_level != vumeter->peak_level)) { gtk_widget_queue_draw (GTK_WIDGET(vumeter)); } } /** * gtk_vumeter_set_scale: * @vumeter: the vumeter widget to change the scaling type * @scale: the scale type, either GTK_VUMETER_SCALE_LINEAR or GTK_VUMETER_SCALE_LOG * * Sets the scale of the VU Meter. * It is either log or linear and defaults to linear. * No matter which scale you set the input should always be linear, #GtkVUMeter * does the log calculation. 0db is red. -6db is yellow. -18db is green. * Whatever min turns into is dark green. */ void gtk_vumeter_set_scale (GtkVUMeter *vumeter, gint scale) { g_return_if_fail (GTK_IS_VUMETER (vumeter)); if (scale != vumeter->scale) { vumeter->scale = CLAMP(scale, GTK_VUMETER_SCALE_LINEAR, GTK_VUMETER_SCALE_LAST - 1); if (gtk_widget_get_realized (GTK_WIDGET(vumeter))) { gtk_widget_queue_draw (GTK_WIDGET(vumeter)); } } } buzztard-0.6.0/src/ui/edit/main-page-sequence.h0000644042355400116100000000515211625722250016264 00000000000000/* $Id: main-page-sequence.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGE_SEQUENCE_H #define BT_MAIN_PAGE_SEQUENCE_H #include #include #define BT_TYPE_MAIN_PAGE_SEQUENCE (bt_main_page_sequence_get_type ()) #define BT_MAIN_PAGE_SEQUENCE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGE_SEQUENCE, BtMainPageSequence)) #define BT_MAIN_PAGE_SEQUENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGE_SEQUENCE, BtMainPageSequenceClass)) #define BT_IS_MAIN_PAGE_SEQUENCE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGE_SEQUENCE)) #define BT_IS_MAIN_PAGE_SEQUENCE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGE_SEQUENCE)) #define BT_MAIN_PAGE_SEQUENCE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGE_SEQUENCE, BtMainPageSequenceClass)) /* type macros */ typedef struct _BtMainPageSequence BtMainPageSequence; typedef struct _BtMainPageSequenceClass BtMainPageSequenceClass; typedef struct _BtMainPageSequencePrivate BtMainPageSequencePrivate; /** * BtMainPageSequence: * * the sequence page for the editor application */ struct _BtMainPageSequence { GtkVBox parent; /*< private >*/ BtMainPageSequencePrivate *priv; }; struct _BtMainPageSequenceClass { GtkVBoxClass parent; }; GType bt_main_page_sequence_get_type(void) G_GNUC_CONST; #include "main-pages.h" BtMainPageSequence *bt_main_page_sequence_new(const BtMainPages *pages); void bt_main_page_sequence_delete_selection(const BtMainPageSequence *self); void bt_main_page_sequence_cut_selection(const BtMainPageSequence *self); void bt_main_page_sequence_copy_selection(const BtMainPageSequence *self); void bt_main_page_sequence_paste_selection(const BtMainPageSequence *self); #endif // BT_MAIN_PAGE_SEQUENCE_H buzztard-0.6.0/src/ui/edit/bt-edit.c0000644042355400116100000001536111666764274014167 00000000000000/* $Id: bt-edit.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btedit * @short_description: buzztard graphical editor application * @see_also: #BtEditApplication * * Implements the body of the buzztard GUI editor. * * You can try to run the uninstalled program via * * libtool --mode=execute buzztard-edit * * to enable debug output add: * * --gst-debug="*:2,bt-*:3" for not-so-much-logdata or * --gst-debug="*:2,bt-*:4" for a-lot-logdata * * * Example songs can be found in ./test/songs/. */ #define BT_EDIT #define BT_EDIT_C #include "bt-edit.h" static void usage(int argc, char **argv, GOptionContext *ctx) { #if GLIB_CHECK_VERSION(2,14,0) // @idea: show as dialog? gchar *help=g_option_context_get_help(ctx, TRUE, NULL); puts(help); g_free(help); #endif } // see if(arg_version) comment in main() below static gboolean parse_goption_arg (const gchar * opt, const gchar * arg, gpointer data, GError ** err) { if (!strcmp (opt, "--version")) { g_printf("%s from "PACKAGE_STRING"\n", (gchar *)data); exit(0); } return(TRUE); } int main(int argc, char **argv) { gboolean res=FALSE; //gboolean arg_version=FALSE; gchar *command=NULL,*input_file_name=NULL; BtEditApplication *app; GOptionContext *ctx=NULL; GOptionGroup *group; GError *err=NULL; #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #endif /* ENABLE_NLS */ GOptionEntry options[] = { {"version", '\0', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, (gpointer)parse_goption_arg, N_("Print application version"), NULL }, {"command", 'c', 0, G_OPTION_ARG_STRING, &command, N_("Command name"), "{load}" }, {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, &input_file_name, N_("Input file name"), N_("") }, {NULL} }; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif // load our custom gtk-theming #ifndef USE_HILDON gtk_rc_parse(DATADIR""G_DIR_SEPARATOR_S""PACKAGE""G_DIR_SEPARATOR_S"bt-edit.gtkrc"); #else gtk_rc_parse(DATADIR""G_DIR_SEPARATOR_S""PACKAGE""G_DIR_SEPARATOR_S"bt-edit.hildon.gtkrc"); #endif // init libraries ctx=g_option_context_new(NULL); //g_option_context_add_main_entries (ctx, options, GETTEXT_PACKAGE); group=g_option_group_new("main", _("buzztard-edit options"),_("Show buzztard-edit options"), argv[0], NULL); g_option_group_add_entries(group, options); g_option_group_set_translation_domain(group, GETTEXT_PACKAGE); g_option_context_set_main_group(ctx, group); bt_init_add_option_groups(ctx); g_option_context_add_group(ctx, btic_init_get_option_group()); g_option_context_add_group(ctx, gtk_get_option_group(TRUE)); if(!g_option_context_parse(ctx, &argc, &argv, &err)) { g_print("Error initializing: %s\n", safe_string(err->message)); g_option_context_free(ctx); exit(1); } // if we use this, all other libs are initialized and their options are processed // this causes #1777461 (fail if we don't have X) //if(arg_version) { // g_printf("%s from "PACKAGE_STRING"\n",argv[0]); // res=TRUE; // goto DONE; //} GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-edit", 0, "music production environment / editor ui"); add_pixmap_directory(DATADIR""G_DIR_SEPARATOR_S""PACKAGE""G_DIR_SEPARATOR_S"pixmaps"G_DIR_SEPARATOR_S); // give some global context info g_set_application_name("Buzztard"); gtk_window_set_default_icon_name("buzztard"); g_setenv("PULSE_PROP_media.role", "production", TRUE); #if GST_CHECK_VERSION(0,10,16) extern gboolean bt_memory_audio_src_plugin_init (GstPlugin * const plugin); gst_plugin_register_static(GST_VERSION_MAJOR, GST_VERSION_MINOR, "memoryaudiosrc", "Plays audio from memory", bt_memory_audio_src_plugin_init, VERSION, "LGPL", PACKAGE, PACKAGE_NAME, "http://www.buzztard.org"); #endif #if !GTK_CHECK_VERSION(2,14,0) GST_DEBUG("init gnome-vfs"); // move to UI if we have //-- initialize gnome-vfs if (!gnome_vfs_init ()) { GST_WARNING("gnome vfs failed to initialize"); goto Done; } #endif GST_INFO("starting: thread=%p",g_thread_self()); #if 0 /* check if LIBDIR"/gstreamer-0.10" is in $GST_PLUGIN_PATH * gst_default_registry_get_path_list() is useless right now, * see https://bugzilla.gnome.org/show_bug.cgi?id=608841 */ { const gchar plugin_path[]=LIBDIR G_DIR_SEPARATOR_S "gstreamer-0.10"; GList *node,*paths=gst_default_registry_get_path_list(); // irks, that list is NULL, gst, checks GST_PLUGIN_PATH, GST_PLUGIN_STSTEM_PATH // and if !GST_PLUGIN_STSTEM_PATH PLUGINDIR GST_INFO("check that %s is scanned by gst registry",plugin_path); for(node=paths;node;node=g_list_next(node)) { GST_INFO(" checking %s",(gchar *)node->data); } g_list_free(paths); } #endif app=bt_edit_application_new(); if(command) { // depending on the popt options call the correct method if(!strcmp(command,"l") || !strcmp(command,"load")) { if(!input_file_name) { usage(argc, argv, ctx); // if commandline options where wrong, just start res=bt_edit_application_run(app); } else { res=bt_edit_application_load_and_run(app,input_file_name); } } else { usage(argc, argv, ctx); // if commandline options where wrong, just start res=bt_edit_application_run(app); } } else { res=bt_edit_application_run(app); } // free application GST_INFO("app->ref_ct=%d",G_OBJECT_REF_COUNT(app)); g_object_unref(app); #if !GTK_CHECK_VERSION(2,14,0) Done: #endif g_free(command); g_free(input_file_name); g_option_context_free(ctx); return(!res); } buzztard-0.6.0/src/ui/edit/gtkvumeter.h0000644042355400116100000000516211576360376015032 00000000000000/* $Id: gtkvumeter.h 3289 2011-04-03 12:23:37Z ensonic $ * * GtkVumeter * Copyright (C) 2003 Todd Goyen * 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GTKVUMETER_H__ #define __GTKVUMETER_H__ #include G_BEGIN_DECLS #define GTK_TYPE_VUMETER (gtk_vumeter_get_type ()) #define GTK_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_VUMETER, GtkVUMeter)) #define GTK_VUMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_VUMETER GtkVUMeterClass)) #define GTK_IS_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_VUMETER)) #define GTK_IS_VUMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_VUMETER)) #define GTK_VUMETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_VUMETER, GtkVUMeterClass)) typedef struct _GtkVUMeter GtkVUMeter; typedef struct _GtkVUMeterClass GtkVUMeterClass; /** * GtkVUMeter: * * a volume meter widget */ struct _GtkVUMeter { GtkWidget widget; /* < private > */ gboolean vertical; gint rms_level; gint min; gint max; gint delay_peak_level; gint peak_level; gint scale; cairo_pattern_t *gradient_rms, *gradient_peak, *gradient_bg; }; struct _GtkVUMeterClass { GtkWidgetClass parent_class; }; enum { GTK_VUMETER_SCALE_LINEAR, GTK_VUMETER_SCALE_LOG, GTK_VUMETER_SCALE_LAST }; GType gtk_vumeter_get_type (void) G_GNUC_CONST; GtkWidget *gtk_vumeter_new (gboolean vertical); void gtk_vumeter_set_min_max (GtkVUMeter *vumeter, gint min, gint max); void gtk_vumeter_set_levels (GtkVUMeter *vumeter, gint rms, gint peak); void gtk_vumeter_set_peaks_falloff (GtkVUMeter *vumeter, gint peaks_falloff); void gtk_vumeter_set_scale (GtkVUMeter *vumeter, gint scale); G_END_DECLS #endif /* __GTKVUMETER_H__ */ buzztard-0.6.0/src/ui/edit/wave-viewer.c0000644042355400116100000002702711576360376015075 00000000000000/* $Id: wave-viewer.c 2992 2010-09-20 19:40:18Z ensonic $ * * Buzztard * Copyright (C) 2006-2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwaveformviewer * @short_description: the waveform viewer widget * @see_also: #BtWave, #BtMainPageWaves * * Provides an viewer for audio waveforms. */ #define BT_EDIT #define BT_MAIN_PAGE_WAVES_C #include "bt-edit.h" enum { WAVE_VIEWER_WAVE_LENGTH = 1, WAVE_VIEWER_LOOP_BEGIN, WAVE_VIEWER_LOOP_END, WAVE_VIEWER_PLAYBACK_CURSOR }; //-- the class G_DEFINE_TYPE (BtWaveformViewer, bt_waveform_viewer, GTK_TYPE_WIDGET); static gboolean bt_waveform_viewer_expose(GtkWidget *widget, GdkEventExpose *event) { int i, ch; BtWaveformViewer *self = BT_WAVEFORM_VIEWER(widget); int ox = widget->allocation.x + 1, oy = widget->allocation.y + 1; int sx = widget->allocation.width - 2, sy = widget->allocation.height - 2; cairo_t *c = gdk_cairo_create(GDK_DRAWABLE(widget->window)); GdkColor sc = { 0, 0, 0, 0 }; g_assert(BT_IS_WAVEFORM_VIEWER(widget)); gdk_cairo_set_source_color(c, &sc); cairo_rectangle(c, ox, oy, sx, sy); cairo_fill(c); if (self->peaks) { GdkColor sc2 = { 0, 0, 65535, 65535 }; GdkColor sc3 = { 0, 0, 24575/2, 24575/2 }; cairo_set_line_join(c, CAIRO_LINE_JOIN_ROUND); cairo_set_line_width(c, 0.5); for (ch = 0; ch < self->channels; ch++) { int lsy = sy / self->channels; int loy = oy + sy * ch / self->channels; for (i = 0; i < 4 * sx; i++) { int imirror = i < 2 * sx ? i : 4 * sx - 1 - i; int item = imirror * self->peaks_size / (2 * sx); int sign = i < 2 * sx ? +1 : -1; double y = (loy + lsy / 2 - (lsy / 2 - 1) * sign * self->peaks[item * self->channels + ch]); if (y < loy) y = loy; if (y >= loy + lsy) y = loy + lsy - 1; if (i) cairo_line_to(c, ox + imirror * 0.5, y); else cairo_move_to(c, ox, y); } gdk_cairo_set_source_color(c, &sc3); cairo_fill_preserve(c); gdk_cairo_set_source_color(c, &sc2); cairo_stroke(c); } if (self->loop_begin != -1) { int x; cairo_set_source_rgba(c, 1, 0, 0, 0.75); cairo_set_line_width(c, 1.0); // casting to double loses precision, but we're not planning to deal with multiterabyte waveforms here :) x = (int)(ox + self->loop_begin * (double) sx / self->wave_length); cairo_move_to(c, x, oy + sy); cairo_line_to(c, x, oy); cairo_stroke(c); cairo_line_to(c, x + 5, oy); cairo_line_to(c, x + 5, oy + 5); cairo_line_to(c, x, oy + 5); cairo_line_to(c, x, oy); cairo_fill(c); x = (int)(ox + self->loop_end * (double) sx / self->wave_length) - 1; cairo_move_to(c, x, oy + sy); cairo_line_to(c, x, oy); cairo_stroke(c); cairo_line_to(c, x - 5, oy); cairo_line_to(c, x - 5, oy + 5); cairo_line_to(c, x, oy + 5); cairo_line_to(c, x, oy); cairo_fill(c); } if (self->playback_cursor != -1) { int x; cairo_set_source_rgba(c, 1, 1, 0, 0.75); cairo_set_line_width(c, 1.0); x = (int)(ox + self->playback_cursor * (double) sx / self->wave_length) - 1; cairo_move_to(c, x, oy + sy); cairo_line_to(c, x, oy); cairo_stroke(c); cairo_move_to(c, x, oy + sy / 2 - 5); cairo_line_to(c, x , oy + sy / 2 + 5); cairo_line_to(c, x + 5, oy + sy / 2); cairo_line_to(c, x, oy + sy / 2 - 5); cairo_fill(c); } } cairo_destroy(c); gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, widget, NULL, ox - 1, oy - 1, sx + 2, sy + 2); // printf("exposed %p %d+%d\n", widget->window, widget->allocation.x, widget->allocation.y); return TRUE; } static void bt_waveform_viewer_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { g_assert(BT_IS_WAVEFORM_VIEWER(widget)); g_return_if_fail (allocation != NULL); GTK_WIDGET_CLASS(bt_waveform_viewer_parent_class)->size_allocate(widget, allocation); widget->allocation = *allocation; } static void bt_waveform_viewer_finalize(GObject * object) { BtWaveformViewer *self = BT_WAVEFORM_VIEWER(object); g_free(self->peaks); G_OBJECT_CLASS(bt_waveform_viewer_parent_class)->finalize(object); } static void bt_waveform_viewer_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtWaveformViewer *self = BT_WAVEFORM_VIEWER(object); switch (property_id) { case WAVE_VIEWER_WAVE_LENGTH: { g_value_set_int64(value, self->wave_length); } break; case WAVE_VIEWER_LOOP_BEGIN: { g_value_set_int64(value, self->loop_begin); } break; case WAVE_VIEWER_LOOP_END: { g_value_set_int64(value, self->loop_end); } break; case WAVE_VIEWER_PLAYBACK_CURSOR: { g_value_set_int64(value, self->playback_cursor); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_waveform_viewer_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtWaveformViewer *self = BT_WAVEFORM_VIEWER(object); switch (property_id) { case WAVE_VIEWER_LOOP_BEGIN: { self->loop_begin = g_value_get_int64(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { gtk_widget_queue_draw(GTK_WIDGET(self)); } } break; case WAVE_VIEWER_LOOP_END: { self->loop_end = g_value_get_int64(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { gtk_widget_queue_draw(GTK_WIDGET(self)); } } break; case WAVE_VIEWER_PLAYBACK_CURSOR: { self->playback_cursor = g_value_get_int64(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { gtk_widget_queue_draw(GTK_WIDGET(self)); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } /* printf("SetProperty: loop_begin=%d loop_end=%d\n", (int)self->loop_begin, (int)self->loop_end); */ } static void bt_waveform_viewer_class_init(BtWaveformViewerClass *klass) { GObjectClass * gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); widget_class->expose_event = bt_waveform_viewer_expose; widget_class->size_allocate = bt_waveform_viewer_size_allocate; gobject_class->set_property = bt_waveform_viewer_set_property; gobject_class->get_property = bt_waveform_viewer_get_property; gobject_class->finalize = bt_waveform_viewer_finalize; g_object_class_install_property(gobject_class, WAVE_VIEWER_WAVE_LENGTH, g_param_spec_int64("wave-length", "waveform length property", "The current waveform length", 0, G_MAXINT64, 0, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, WAVE_VIEWER_LOOP_BEGIN, g_param_spec_int64("loop-begin", "waveform loop start position", "First sample of the loop or -1 if there is no loop", -1, G_MAXINT64, -1, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, WAVE_VIEWER_LOOP_END, g_param_spec_int64("loop-end", "waveform loop end position", "First sample after the loop or -1 if there is no loop", -1, G_MAXINT64, -1, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, WAVE_VIEWER_PLAYBACK_CURSOR, g_param_spec_int64("playback-cursor", "playback cursor position", "Current playback position within a waveform or -1 if sample is not played", -1, G_MAXINT64, -1, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } static void bt_waveform_viewer_init(BtWaveformViewer *self) { GtkWidget *widget = GTK_WIDGET(self); gtk_widget_set_has_window(widget, FALSE); widget->requisition.width = 40; widget->requisition.height = 40; self->active = 0; self->channels = 2; self->peaks_size = 1000; self->peaks = g_malloc(sizeof(float) * self->channels * self->peaks_size); self->wave_length = 0; self->loop_begin = -1; self->loop_end = -1; } /** * bt_waveform_viewer_set_wave: * @self: the widget * @data: memory block of samples (interleaved for channels>1) * @channels: number channels * @length: number samples per channel * * Set wave data to show in the widget. */ void bt_waveform_viewer_set_wave(BtWaveformViewer *self, int16_t *data, int channels, int length) { int i, c, p, cc = channels; int64_t len = length; self->channels = channels; self->wave_length = length; self->loop_begin = -1; self->loop_end = -1; self->playback_cursor = -1; if (!data || !length) { self->active = 0; memset(self->peaks,0,sizeof(float)*self->peaks_size); gtk_widget_queue_draw(GTK_WIDGET(self)); return; } for (i = 0; i < self->peaks_size; i++) { int p1 = len * i / self->peaks_size; int p2 = len * (i + 1) / self->peaks_size; for (c = 0; c < self->channels; c++) { float vmin = data[p1 * cc + c], vmax = data[p1 * cc + c]; for (p = p1 + 1; p < p2; p++) { float d = data[p * cc + c]; if (d < vmin) vmin = d; if (d > vmax) vmax = d; } self->peaks[i * cc + c] = (vmax - vmin) / 32768.0; } } self->active = 1; g_object_notify((gpointer)self, "wave-length"); g_object_notify((gpointer)self, "loop-begin"); g_object_notify((gpointer)self, "loop-end"); g_object_notify((gpointer)self, "playback-cursor"); gtk_widget_queue_draw(GTK_WIDGET(self)); } /** * bt_waveform_viewer_new: * * Create a new waveform viewer widget. Use bt_waveform_viewer_set_wave() to * pass wave data. * * Returns: the widget */ GtkWidget * bt_waveform_viewer_new() { return GTK_WIDGET( g_object_new (BT_TYPE_WAVEFORM_VIEWER, NULL )); } buzztard-0.6.0/src/ui/edit/playback-controller-socket.h0000644042355400116100000000501211625722250020050 00000000000000/* $Id: playback-controller-socket.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PLAYBACK_CONTROLLER_SOCKET_H #define BT_PLAYBACK_CONTROLLER_SOCKET_H #include #include #define BT_TYPE_PLAYBACK_CONTROLLER_SOCKET (bt_playback_controller_socket_get_type ()) #define BT_PLAYBACK_CONTROLLER_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PLAYBACK_CONTROLLER_SOCKET, BtPlaybackControllerSocket)) #define BT_PLAYBACK_CONTROLLER_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PLAYBACK_CONTROLLER_SOCKET, BtPlaybackControllerSocketClass)) #define BT_IS_PLAYBACK_CONTROLLER_SOCKET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PLAYBACK_CONTROLLER_SOCKET)) #define BT_IS_PLAYBACK_CONTROLLER_SOCKET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PLAYBACK_CONTROLLER_SOCKET)) #define BT_PLAYBACK_CONTROLLER_SOCKET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PLAYBACK_CONTROLLER_SOCKET, BtPlaybackControllerSocketClass)) /* type macros */ typedef struct _BtPlaybackControllerSocket BtPlaybackControllerSocket; typedef struct _BtPlaybackControllerSocketClass BtPlaybackControllerSocketClass; typedef struct _BtPlaybackControllerSocketPrivate BtPlaybackControllerSocketPrivate; /** *BtPlaybackControllerSocket: * * the root window for the editor application */ struct _BtPlaybackControllerSocket { GObject parent; /*< private >*/ BtPlaybackControllerSocketPrivate *priv; }; struct _BtPlaybackControllerSocketClass { GObjectClass parent; }; GType bt_playback_controller_socket_get_type(void) G_GNUC_CONST; BtPlaybackControllerSocket *bt_playback_controller_socket_new(void); #endif // BT_PLAYBACK_CONTROLLER_SOCKET_H buzztard-0.6.0/src/ui/edit/machine-canvas-item.h0000644042355400116100000000516411627253511016435 00000000000000/* $Id: machine-canvas-item.h 3623 2011-08-30 21:33:59Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_CANVAS_ITEM_H #define BT_MACHINE_CANVAS_ITEM_H #include #include #define BT_TYPE_MACHINE_CANVAS_ITEM (bt_machine_canvas_item_get_type ()) #define BT_MACHINE_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_CANVAS_ITEM, BtMachineCanvasItem)) #define BT_MACHINE_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_CANVAS_ITEM, BtMachineCanvasItemClass)) #define BT_IS_MACHINE_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_CANVAS_ITEM)) #define BT_IS_MACHINE_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_CANVAS_ITEM)) #define BT_MACHINE_CANVAS_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_CANVAS_ITEM, BtMachineCanvasItemClass)) /* type macros */ typedef struct _BtMachineCanvasItem BtMachineCanvasItem; typedef struct _BtMachineCanvasItemClass BtMachineCanvasItemClass; typedef struct _BtMachineCanvasItemPrivate BtMachineCanvasItemPrivate; /** * BtMachineCanvasItem: * * the root window for the editor application */ struct _BtMachineCanvasItem { GnomeCanvasGroup parent; /*< private >*/ BtMachineCanvasItemPrivate *priv; }; struct _BtMachineCanvasItemClass { GnomeCanvasGroupClass parent; }; GType bt_machine_canvas_item_get_type(void) G_GNUC_CONST; #include "main-page-machines.h" BtMachineCanvasItem *bt_machine_canvas_item_new(const BtMainPageMachines *main_page_machines,BtMachine *machine,gdouble xpos,gdouble ypos,gdouble zoom); void bt_machine_show_properties_dialog(BtMachine *machine); void bt_machine_show_preferences_dialog(BtMachine *machine); void bt_machine_show_analyzer_dialog(BtMachine *machine); #endif // BT_MACHINE_CANVAS_ITEM_H buzztard-0.6.0/src/ui/edit/signal-analysis-dialog.c0000644042355400116100000011106211670366510017147 00000000000000/* $Id: signal-analysis-dialog.c 3754 2011-12-07 07:44:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsignalanalysisdialog * @short_description: audio analysis window * * The dialog shows a spectrum analyzer and level-meters for left/right * channel. The spectrum analyzer support mono and stereo display. It has a few * settings for logarithmic/linear mapping and precission. * * Right now the analyser-section can be attached to a BtWire. * * The dialog is not modal. */ /* @idea: nice monitoring ideas: * http://www.music-software-reviews.com/adobe_audition_2.html * * @todo: shall we add a volume and panorama control to the dialog as well? * - volume to the right of the spectrum * - panorama below the spectrum * * @idea: use own ruler widget or patch up the existing one * http://live.gnome.org/GTK%2B/GtkRuler * * @idea: it would be nice to use this on the sink-machine as well. * - need to change it to "analysis-dialog" * - the constructor needs variants for machines and wires or we just pass it a * and require that the bin has a "ananlyzers" property * - machines need a pre/post hook (idealy we just need it for the sink) * - we have (pre-gain)-level there already * - we have no tee in machines (except the spreader, which we can't misuse * here) * - we could always plug a tee in sink-bin and add the analyzers there */ /* frequency spacing in a FFT is always linear: * - for 44100 Hz and 256 bands, spacing is 22050/256 = ~86.13 * - log-grid should have lines at 1,2,5, 10,20,50, 100,200,500, .... */ #define BT_EDIT #define BT_SIGNAL_ANALYSIS_DIALOG_C #include "bt-edit.h" #include "ruler.h" //-- property ids enum { SIGNAL_ANALYSIS_DIALOG_ELEMENT=1 }; /* @todo: add more later: * waveform (oszilloscope) * panorama (spacescope) */ typedef enum { // needed to buffer ANALYZER_QUEUE=0, // real analyzers ANALYZER_LEVEL, ANALYZER_SPECTRUM, // this can be 'mis'used for an aoszilloscope by connecting to hand-off ANALYZER_FAKESINK, // how many elements are used ANALYZER_COUNT } BtWireAnalyzer; typedef enum { MAP_LIN=0, MAP_LOG=1 } BtWireAnalyzerMapping; #define LEVEL_HEIGHT 16 #define LOW_VUMETER_VAL -90.0 #define SPECTRUM_FLOOR -70 #define UPDATE_INTERVAL ((GstClockTime)(0.1*GST_SECOND)) struct _BtSignalAnalysisDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the item to attach the analyzer to */ GstBin *element; /* the analyzer-graphs */ GtkWidget *spectrum_drawingarea, *level_drawingarea; GtkWidget *spectrum_ruler; GdkColor *peak_color,*grid_color; cairo_pattern_t *spect_grad; /* the gstreamer elements that is used */ GstElement *analyzers[ANALYZER_COUNT]; GList *analyzers_list; /* the analyzer results (max stereo) */ gdouble rms[2], peak[2]; gfloat *spect[2]; GMutex *lock; guint spect_channels; guint spect_height; guint spect_bands; gfloat height_scale; /* sampling rate from spectrum.sink caps */ gint srate; BtWireAnalyzerMapping frq_map; guint frq_precision; GstClock *clock; /* up to srat=900000 */ gdouble grid_log10[6*10]; gdouble *graph_log10; // DEBUG //gdouble min_rms,max_rms, min_peak,max_peak; // DEBUG }; static GQuark bus_msg_level_quark=0; static GQuark bus_msg_spectrum_quark=0; //-- the class G_DEFINE_TYPE (BtSignalAnalysisDialog, bt_signal_analysis_dialog, GTK_TYPE_WINDOW); //-- event handler helper /* * on_signal_analyser_redraw: * @user_data: conatins the self pointer * * Called as idle function to repaint the analyzers. Data is gathered by * on_signal_analyser_change() */ static gboolean redraw_level(gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); if(!gtk_widget_get_realized(GTK_WIDGET(self))) return(TRUE); //GST_DEBUG("redraw analyzers"); // draw levels if (self->priv->level_drawingarea) { GdkRectangle rect = { 0, 0, self->priv->spect_bands, LEVEL_HEIGHT }; GtkWidget *da=self->priv->level_drawingarea; GdkWindow *window = gtk_widget_get_window(da); gint middle=self->priv->spect_bands>>1; gdouble scl=middle/(-LOW_VUMETER_VAL); gdouble rms0,rms1,peak0,peak1; cairo_t *cr; gdk_window_begin_paint_rect(window, &rect); cr=gdk_cairo_create(window); cairo_set_source_rgb(cr,0.0,0.0,0.0); cairo_rectangle(cr,0,0,self->priv->spect_bands, LEVEL_HEIGHT); cairo_fill(cr); /* DEBUG if((self->priv->rms[0]priv->min_rms) && !isinf(self->priv->rms[0])) { GST_DEBUG("levels: rms=%7.4lf",self->priv->rms[0]); self->priv->min_rms=self->priv->rms[0]; } if((self->priv->rms[0]>self->priv->max_rms) && !isinf(self->priv->rms[0])) { GST_DEBUG("levels: rms=%7.4lf",self->priv->rms[0]); self->priv->max_rms=self->priv->rms[0]; } if((self->priv->peak[0]priv->min_peak) && !isinf(self->priv->peak[0])) { GST_DEBUG("levels: peak=%7.4lf",self->priv->peak[0]); self->priv->min_peak=self->priv->peak[0]; } if((self->priv->peak[0]>self->priv->max_peak) && !isinf(self->priv->peak[0])) { GST_DEBUG("levels: peak=%7.4lf",self->priv->peak[0]); self->priv->max_peak=self->priv->peak[0]; } // DEBUG */ // use RMS or peak or both? rms0=self->priv->rms[0]*scl; rms1=self->priv->rms[1]*scl; peak0=self->priv->peak[0]*scl; peak1=self->priv->peak[1]*scl; cairo_set_source_rgb(cr,1.0,1.0,1.0); cairo_rectangle(cr, middle -rms0, 0, rms0+rms1, LEVEL_HEIGHT); cairo_fill(cr); cairo_set_source_rgb(cr,self->priv->peak_color->red/65535.0,self->priv->peak_color->green/65535.0,self->priv->peak_color->blue/65535.0); cairo_rectangle(cr, middle -peak0, 0, 2, LEVEL_HEIGHT); cairo_fill(cr); cairo_rectangle(cr, (middle-1)+peak1, 0, 2, LEVEL_HEIGHT); cairo_fill(cr); /* @todo: if stereo draw pan-meter (L-R, R-L) */ cairo_destroy(cr); gdk_window_end_paint(window); } return(TRUE); } static gboolean redraw_spectrum(gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); if(!gtk_widget_get_realized(GTK_WIDGET(self))) return(TRUE); // draw spectrum if(self->priv->spectrum_drawingarea) { guint i,c; gdouble x,y,v,f; gdouble inc,end,srat2; guint spect_bands=self->priv->spect_bands; guint spect_height=self->priv->spect_height; GdkRectangle rect = { 0, 0, spect_bands, self->priv->spect_height }; GtkWidget *da=self->priv->spectrum_drawingarea; GdkWindow *window = gtk_widget_get_window(da); gdouble *grid_log10 = self->priv->grid_log10; gdouble grid_dash_pattern[]={1.0}; cairo_t *cr; gdk_window_begin_paint_rect(window,&rect); cr=gdk_cairo_create(window); cairo_set_source_rgb(cr,0.0,0.0,0.0); cairo_rectangle(cr,0,0,spect_bands,spect_height); cairo_fill(cr); /* draw grid lines * the bin center frequencies are f(i)=i*srat/spect_bands */ cairo_set_source_rgb(cr,self->priv->grid_color->red/65535.0,self->priv->grid_color->green/65535.0,self->priv->grid_color->blue/65535.0); cairo_set_line_width(cr, 1.0); cairo_set_dash(cr,grid_dash_pattern,1,0.0); y=0.5+spect_height/2.0; cairo_move_to(cr,0,y);cairo_line_to(cr,spect_bands,y); if(self->priv->frq_map==MAP_LIN) { for(f=0.05;f<1.0;f+=0.05) { x=0.5+spect_bands*f; cairo_move_to(cr,x,0);cairo_line_to(cr,x,spect_height); } } else { srat2=self->priv->srate/2.0; v=spect_bands/log10(srat2); i=0;f=1.0;inc=1.0;end=10.0; while(f=end) { f=inc=end; end*=10.0; } } } cairo_stroke(cr); // draw frequencies g_mutex_lock(self->priv->lock); for(c=0;cpriv->spect_channels;c++) { if(self->priv->spect[c]) { gfloat *spect=self->priv->spect[c]; gdouble *graph_log10=self->priv->graph_log10; gdouble prec=self->priv->frq_precision; // set different color for different channels // maybe we also want a different gradient if(self->priv->spect_channels==1) { cairo_set_source_rgb(cr,1.0,1.0,1.0); } else { if(c==0) { cairo_set_source_rgba(cr,1.0,0.0,0.7,0.7); } else { cairo_set_source_rgba(cr,0.6,0.6,1.0,0.7); } } cairo_set_line_width(cr, 2.0); cairo_set_dash(cr,NULL,0,0.0); cairo_move_to(cr,0,spect_height); if(self->priv->frq_map==MAP_LIN) { for(i=0;i<(spect_bands*prec);i++) { cairo_line_to(cr,(i/prec),spect_height-spect[i]); } } else { srat2=self->priv->srate/2.0; v=spect_bands/log10(srat2); for(i=0;i<(spect_bands*prec);i++) { // db value //y=-20.0*log10(-spect[i]); x=0.5+v*graph_log10[i]; cairo_line_to(cr,x,spect_height-spect[i]); } } cairo_line_to(cr,spect_bands-1,spect_height); cairo_line_to(cr,0,spect_height); cairo_stroke_preserve(cr); // in case the gradient is too slow: //cairo_set_source_rgb(cr,0.7,0.7,0.7); cairo_set_source(cr,self->priv->spect_grad); cairo_fill(cr); } } g_mutex_unlock(self->priv->lock); cairo_destroy(cr); gdk_window_end_paint(window); } return(TRUE); } static void update_spectrum_ruler(const BtSignalAnalysisDialog *self) { BtRuler *ruler=BT_RULER(self->priv->spectrum_ruler); bt_ruler_set_range(ruler,0.0,self->priv->srate/2.0,0.0,30.0); #if 0 // gtk_ruler_set_metric needs an enum value :/ // also for log/lin we need a mapping function instead // we can't register own types and there is no setter for custom metrics either if(self->priv->frq_map==MAP_LIN) { //bt_ruler_set_metric(ruler,&ruler_metrics[0]); } else { static const GtkRulerMetric ruler_metrics[] = { {"Frequency", "Hz", 1.0, { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512 }, { 1, 2, 4, 8, 16 }}, }; //bt_ruler_set_metric(ruler,&ruler_metrics[0]); } #endif } static void update_spectrum_graph_log10(BtSignalAnalysisDialog *self) { guint i, spect_bands=self->priv->spect_bands*self->priv->frq_precision; gdouble *graph_log10=self->priv->graph_log10; gdouble srat2=self->priv->srate/2.0; for(i=0;ipriv->lock); spect_bands=self->priv->spect_bands*self->priv->frq_precision; g_free(self->priv->spect[0]); self->priv->spect[0]=g_new0(gfloat, spect_bands); g_free(self->priv->spect[1]); self->priv->spect[1]=g_new0(gfloat, spect_bands); g_free(self->priv->graph_log10); self->priv->graph_log10=g_new(gdouble, spect_bands); update_spectrum_graph_log10(self); if (self->priv->analyzers[ANALYZER_SPECTRUM]) { g_object_set((GObject*)(self->priv->analyzers[ANALYZER_SPECTRUM]), "bands", spect_bands, NULL); } g_mutex_unlock(self->priv->lock); } //-- event handler static void bt_signal_analysis_dialog_realize(GtkWidget *widget,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); GST_DEBUG("dialog realize"); self->priv->peak_color=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_ANALYZER_PEAK); self->priv->grid_color=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_GRID_LINES); } static gboolean bt_signal_analysis_dialog_level_expose(GtkWidget *widget,GdkEventExpose *event,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); redraw_level((gpointer)self); return(TRUE); } static gboolean bt_signal_analysis_dialog_spectrum_expose(GtkWidget *widget,GdkEventExpose *event,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); redraw_spectrum((gpointer)self); return(TRUE); } static gboolean on_delayed_idle_signal_analyser_change(gpointer user_data) { gconstpointer * const params=(gconstpointer *)user_data; BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(params[0]); GstMessage *message=(GstMessage *)params[1]; const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); if(!self) goto done; g_object_remove_weak_pointer((gpointer)self,(gpointer *)¶ms[0]); if(name_id==bus_msg_level_quark) { const GValue *l_cur,*l_peak; guint i; gdouble val; //GST_INFO("get level data"); //l_cur=(GValue *)gst_structure_get_value(structure, "rms"); l_cur=(GValue *)gst_structure_get_value(structure, "peak"); //l_peak=(GValue *)gst_structure_get_value(structure, "peak"); l_peak=(GValue *)gst_structure_get_value(structure, "decay"); // size of list is number of channels switch(gst_value_list_get_size(l_cur)) { case 1: // mono val=g_value_get_double(gst_value_list_get_value(l_cur,0)); if(isinf(val) || isnan(val)) val=LOW_VUMETER_VAL; self->priv->rms[0]=-(LOW_VUMETER_VAL-val); self->priv->rms[1]=self->priv->rms[0]; val=g_value_get_double(gst_value_list_get_value(l_peak,0)); if(isinf(val) || isnan(val)) val=LOW_VUMETER_VAL; self->priv->peak[0]=-(LOW_VUMETER_VAL-val); self->priv->peak[1]=self->priv->peak[0]; break; case 2: // stereo for(i=0;i<2;i++) { val=g_value_get_double(gst_value_list_get_value(l_cur,i)); if(isinf(val) || isnan(val)) val=LOW_VUMETER_VAL; self->priv->rms[i]=-(LOW_VUMETER_VAL-val); val=g_value_get_double(gst_value_list_get_value(l_peak,i)); if(isinf(val) || isnan(val)) val=LOW_VUMETER_VAL; self->priv->peak[i]=-(LOW_VUMETER_VAL-val); } break; } gtk_widget_queue_draw(self->priv->level_drawingarea); } else if(name_id==bus_msg_spectrum_quark) { const GValue *data; const GValue *value; guint i, size, spect_bands, spect_height=self->priv->spect_height; gfloat height_scale=self->priv->height_scale; gfloat *spect; g_mutex_lock(self->priv->lock); spect_bands=self->priv->spect_bands*self->priv->frq_precision; //GST_INFO("get spectrum data"); if((data = gst_structure_get_value (structure, "magnitude"))) { if(GST_VALUE_HOLDS_LIST(data)) { size=gst_value_list_get_size(data); if(size==spect_bands) { spect=self->priv->spect[0]; for(i=0;ipriv->spectrum_drawingarea); } } else if(GST_VALUE_HOLDS_ARRAY(data)) { const GValue *cdata; guint c=gst_value_array_get_size(data); self->priv->spect_channels=MIN(2,c); for (c=0;cpriv->spect_channels;c++) { cdata=gst_value_array_get_value(data,c); size=gst_value_array_get_size(cdata); if(size!=spect_bands) break; spect=self->priv->spect[c]; for(i=0;ipriv->spect_channels) { gtk_widget_queue_draw(self->priv->spectrum_drawingarea); } } } else if((data = gst_structure_get_value (structure, "spectrum"))) { size=gst_value_list_get_size(data); if(size==spect_bands) { spect=self->priv->spect[0]; for(i=0;ipriv->spectrum_drawingarea); } } g_mutex_unlock(self->priv->lock); } done: gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),params); return(FALSE); } static gboolean on_delayed_signal_analyser_change(GstClock *clock,GstClockTime time,GstClockID id,gpointer user_data) { // the callback is called from a clock thread if(GST_CLOCK_TIME_IS_VALID(time)) g_idle_add(on_delayed_idle_signal_analyser_change,user_data); else { gconstpointer * const params=(gconstpointer *)user_data; GstMessage *message=(GstMessage *)params[1]; gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),user_data); } return(TRUE); } static void on_signal_analyser_change(GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); if((name_id==bus_msg_level_quark) || (name_id==bus_msg_spectrum_quark)) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); GstElement *meter=GST_ELEMENT(GST_MESSAGE_SRC(message)); if((meter==self->priv->analyzers[ANALYZER_LEVEL]) || (meter==self->priv->analyzers[ANALYZER_SPECTRUM])) { GstClockTime timestamp, duration; GstClockTime waittime=GST_CLOCK_TIME_NONE; if(gst_structure_get_clock_time (structure, "running-time", ×tamp) && gst_structure_get_clock_time (structure, "duration", &duration)) { /* wait for middle of buffer */ waittime=timestamp+duration/2; } else if(gst_structure_get_clock_time (structure, "endtime", ×tamp)) { if(name_id==bus_msg_level_quark) { /* level sends endtime as stream_time and not as running_time */ waittime=gst_segment_to_running_time(&GST_BASE_TRANSFORM(meter)->segment, GST_FORMAT_TIME, timestamp); } else { waittime=timestamp; } } if(GST_CLOCK_TIME_IS_VALID(waittime)) { gconstpointer *params=(gconstpointer *)g_slice_alloc(2*sizeof(gconstpointer)); GstClockID clock_id; GstClockTime basetime=gst_element_get_base_time(meter); //GST_WARNING("received %s update for waittime %"GST_TIME_FORMAT, // g_quark_to_string(name_id),GST_TIME_ARGS(waittime)); params[0]=(gpointer)self; params[1]=(gpointer)gst_message_ref(message); g_object_add_weak_pointer((gpointer)self,(gpointer *)¶ms[0]); clock_id=gst_clock_new_single_shot_id(self->priv->clock,waittime+basetime); if(gst_clock_id_wait_async(clock_id,on_delayed_signal_analyser_change,(gpointer)params)!=GST_CLOCK_OK) { gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),params); } gst_clock_id_unref(clock_id); } } } } static void on_size_allocate(GtkWidget *widget,GtkAllocation *allocation,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); guint old_heigth=self->priv->spect_height; guint old_bands=self->priv->spect_bands; /*GST_INFO ("%d x %d", allocation->width, allocation->height); */ self->priv->spect_height = allocation->height; self->priv->height_scale = (gdouble)allocation->height / (gdouble)SPECTRUM_FLOOR; self->priv->spect_bands = allocation->width; if (old_heigth!=self->priv->spect_height || !self->priv->spect_grad) { if(self->priv->spect_grad) cairo_pattern_destroy(self->priv->spect_grad); // this looks nice, but seems to be expensive self->priv->spect_grad=cairo_pattern_create_linear(0.0, self->priv->spect_height, 0.0, 0.0); cairo_pattern_add_color_stop_rgba(self->priv->spect_grad, 0.00, 0.8, 0.8, 0.8, 0.7); cairo_pattern_add_color_stop_rgba(self->priv->spect_grad, 1.00, 0.8, 0.8, 0.8, 0.0); } if (old_bands!=self->priv->spect_bands) { update_spectrum_analyzer(self); } gtk_widget_queue_draw(self->priv->spectrum_drawingarea); } static void on_caps_negotiated(GstPad *pad,GParamSpec *arg,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); GstCaps *caps; if((caps=(GstCaps *)gst_pad_get_negotiated_caps(pad))) { if(GST_CAPS_IS_SIMPLE(caps)) { GstStructure *structure; if((structure=gst_caps_get_structure(caps,0))) { gint old_srate=self->priv->srate; gst_structure_get_int(structure,"rate",&self->priv->srate); if(self->priv->srate!=old_srate) { update_spectrum_ruler(self); update_spectrum_graph_log10(self); } } } gst_caps_unref(caps); } } static void on_spectrum_frequency_mapping_changed(GtkComboBox *combo, gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); self->priv->frq_map=gtk_combo_box_get_active(combo); update_spectrum_ruler(self); gtk_widget_queue_draw(self->priv->spectrum_drawingarea); } static void on_spectrum_frequency_precision_changed(GtkComboBox *combo, gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); self->priv->frq_precision=1+gtk_combo_box_get_active(combo); update_spectrum_analyzer(self); } static gboolean on_spectrum_drawingarea_motion_notify_event(GtkWidget *widget,GdkEventMotion *event,gpointer user_data) { BtSignalAnalysisDialog *self=BT_SIGNAL_ANALYSIS_DIALOG(user_data); gdouble pos; pos=(event->x*(gdouble)self->priv->srate)/((gdouble)self->priv->spect_bands*2.0); g_object_set(self->priv->spectrum_ruler, "position", pos, NULL); return(FALSE); } //-- helper methods /* * bt_signal_analysis_dialog_make_element: * @self: the signal-analysis dialog * @part: which analyzer element to create * @factory_name: the element-factories name (also used to build the elemnt name) * * Create analyzer elements. Store them in the analyzers array and link them into the list. */ static gboolean bt_signal_analysis_dialog_make_element(const BtSignalAnalysisDialog *self,BtWireAnalyzer part, const gchar *factory_name) { gboolean res=FALSE; gchar *name; // add analyzer element name=g_alloca(strlen("analyzer_")+strlen(factory_name)+16);g_sprintf(name,"analyzer_%s_%p",factory_name,self->priv->element); if(!(self->priv->analyzers[part]=gst_element_factory_make(factory_name,name))) { GST_ERROR("failed to create %s",factory_name);goto Error; } self->priv->analyzers_list=g_list_prepend(self->priv->analyzers_list,self->priv->analyzers[part]); res=TRUE; Error: return(res); } static gboolean bt_signal_analysis_dialog_init_ui(const BtSignalAnalysisDialog *self) { BtMainWindow *main_window; BtSong *song; GstBin *bin; GstPad *pad; GstBus *bus; gchar *title=NULL; //GdkPixbuf *window_icon=NULL; GtkWidget *vbox, *hbox, *table; GtkWidget *ruler,*combo; gboolean res=TRUE; gtk_widget_set_name(GTK_WIDGET(self),"wire analysis"); g_object_get(self->priv->app,"main-window",&main_window,"song",&song,NULL); gtk_window_set_transient_for(GTK_WINDOW(self),GTK_WINDOW(main_window)); /* @todo: create and set *proper* window icon (analyzer, scope) if((window_icon=bt_ui_resources_get_pixbuf_by_wire(self->priv->element))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); } */ /* DEBUG self->priv->min_rms=1000.0; self->priv->max_rms=-1000.0; self->priv->min_peak=1000.0; self->priv->max_peak=-1000.0; // DEBUG */ // leave the choice of width to gtk gtk_window_set_default_size(GTK_WINDOW(self),-1,200); // TODO: different names for wire or sink machine if(BT_IS_WIRE(self->priv->element)) { BtMachine *src_machine,*dst_machine; gchar *src_id,*dst_id; g_object_get(self->priv->element,"src",&src_machine,"dst",&dst_machine,NULL); g_object_get(src_machine,"id",&src_id,NULL); g_object_get(dst_machine,"id",&dst_id,NULL); // set dialog title : machine -> machine analysis title=g_strdup_printf(_("%s -> %s analysis"),src_id,dst_id); g_object_unref(src_machine); g_object_unref(dst_machine); g_free(src_id);g_free(dst_id); } else if(BT_IS_SINK_MACHINE(self->priv->element)) { title=g_strdup(_("master analysis")); } else { GST_WARNING("unsupported object for signal analyser: %s,%p", G_OBJECT_TYPE_NAME(self->priv->element), self->priv->element); } if (title) { gtk_window_set_title(GTK_WINDOW(self),title); g_free(title); } vbox=gtk_vbox_new(FALSE, 0); /* add scales for spectrum analyzer drawable */ /* @todo: we need to use a gtk_table() and also add a vruler with levels */ ruler=bt_ruler_new(GTK_ORIENTATION_HORIZONTAL,TRUE); gtk_widget_set_size_request(ruler,-1,30); gtk_box_pack_start(GTK_BOX(vbox), ruler, FALSE, FALSE,0); self->priv->spectrum_ruler=ruler; update_spectrum_ruler(self); /* add spectrum canvas */ self->priv->spectrum_drawingarea=gtk_drawing_area_new(); gtk_widget_set_size_request(self->priv->spectrum_drawingarea, self->priv->spect_bands, self->priv->spect_height); gtk_widget_add_events(GTK_WIDGET(self->priv->spectrum_drawingarea),GDK_POINTER_MOTION_MASK); g_signal_connect(G_OBJECT (self->priv->spectrum_drawingarea), "size-allocate", G_CALLBACK(on_size_allocate), (gpointer) self); g_signal_connect(self->priv->spectrum_drawingarea, "motion-notify-event", G_CALLBACK(on_spectrum_drawingarea_motion_notify_event), (gpointer)self); gtk_box_pack_start(GTK_BOX(vbox), self->priv->spectrum_drawingarea, TRUE, TRUE, 0); /* spacer */ gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new(" "), FALSE, FALSE, 0); /* add scales for level meter */ hbox = gtk_hbox_new(FALSE, 0); ruler=bt_ruler_new(GTK_ORIENTATION_HORIZONTAL,FALSE); bt_ruler_set_range(BT_RULER(ruler),100.0,0.0,-10.0,30.0); //bt_ruler_set_metric(BT_RULER(ruler),&ruler_metrics[0]); gtk_widget_set_size_request(ruler,-1,30); gtk_box_pack_start(GTK_BOX(hbox), ruler, TRUE, TRUE, 0); ruler=bt_ruler_new(GTK_ORIENTATION_HORIZONTAL,FALSE); bt_ruler_set_range(BT_RULER(ruler),0.0,100.5,-10.0,30.0); //bt_ruler_set_metric(BT_RULER(ruler),&ruler_metrics[0]); gtk_widget_set_size_request(ruler,-1,30); gtk_box_pack_start(GTK_BOX(hbox), ruler, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* add level-meter canvas */ self->priv->level_drawingarea=gtk_drawing_area_new(); gtk_widget_set_size_request(self->priv->level_drawingarea, self->priv->spect_bands, LEVEL_HEIGHT); gtk_box_pack_start(GTK_BOX(vbox), self->priv->level_drawingarea, FALSE, FALSE, 0); /* spacer */ gtk_box_pack_start(GTK_BOX(vbox), gtk_label_new(" "), FALSE, FALSE, 0); /* settings */ table=gtk_table_new(2,2,FALSE); /* scale: linear and logarithmic */ combo=gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("lin.")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("log.")); gtk_combo_box_set_active(GTK_COMBO_BOX(combo),0); g_signal_connect(combo, "changed", G_CALLBACK(on_spectrum_frequency_mapping_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),gtk_label_new(_("frequency mapping")), 0,1, 0,1, 0,0, 3,3); gtk_table_attach(GTK_TABLE(table),combo, 1,2, 0,1, GTK_EXPAND|GTK_FILL,0, 3,3); combo=gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("single")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("double")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo),_("triple")); gtk_combo_box_set_active(GTK_COMBO_BOX(combo),0); g_signal_connect(combo, "changed", G_CALLBACK(on_spectrum_frequency_precision_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),gtk_label_new(_("spectrum precision")), 0,1, 1,2, 0,0, 3,3); gtk_table_attach(GTK_TABLE(table),combo, 1,2, 1,2, GTK_EXPAND|GTK_FILL,0, 3,3); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(self), 6); gtk_container_add(GTK_CONTAINER(self), vbox); /* @todo: better error handling * - don't fail if we miss only spectrum or level * - also don't return false, but instead add a label with the error message */ // create fakesink if(!bt_signal_analysis_dialog_make_element(self,ANALYZER_FAKESINK,"fakesink")) { res=FALSE; goto Error; } g_object_set (self->priv->analyzers[ANALYZER_FAKESINK], "sync", FALSE, "qos", FALSE, "silent", TRUE, "async", FALSE, NULL); // create spectrum analyzer if(!bt_signal_analysis_dialog_make_element(self,ANALYZER_SPECTRUM,"spectrum")) { res=FALSE; goto Error; } // added in gst-plugin-good 0.10.29 if(g_object_class_find_property(G_OBJECT_GET_CLASS(self->priv->analyzers[ANALYZER_SPECTRUM]),"multi-channel")) { g_object_set (self->priv->analyzers[ANALYZER_SPECTRUM], "interval",UPDATE_INTERVAL,"message",TRUE, "bands", self->priv->spect_bands*self->priv->frq_precision, "threshold", SPECTRUM_FLOOR, "multi-channel", TRUE, NULL); } else { g_object_set (self->priv->analyzers[ANALYZER_SPECTRUM], "interval",UPDATE_INTERVAL,"message",TRUE, "bands", self->priv->spect_bands*self->priv->frq_precision, "threshold", SPECTRUM_FLOOR, NULL); } if((pad=gst_element_get_static_pad(self->priv->analyzers[ANALYZER_SPECTRUM],"sink"))) { g_signal_connect(pad,"notify::caps",G_CALLBACK(on_caps_negotiated),(gpointer)self); gst_object_unref(pad); } // create level meter if(!bt_signal_analysis_dialog_make_element(self,ANALYZER_LEVEL,"level")) { res=FALSE; goto Error; } g_object_set(self->priv->analyzers[ANALYZER_LEVEL], "interval",UPDATE_INTERVAL,"message",TRUE, "peak-ttl",UPDATE_INTERVAL*3,"peak-falloff", 80.0, NULL); // create queue if(!bt_signal_analysis_dialog_make_element(self,ANALYZER_QUEUE,"queue")) { res=FALSE; goto Error; } // leave "max-size-buffer >> 1, if 1 every buffer gets marked as discont! g_object_set(self->priv->analyzers[ANALYZER_QUEUE], "max-size-buffers",10,"max-size-bytes",0,"max-size-time",G_GUINT64_CONSTANT(0), "leaky",2,NULL); if(BT_IS_WIRE(self->priv->element)) { g_object_set(self->priv->element,"analyzers",self->priv->analyzers_list,NULL); } else if(BT_IS_SINK_MACHINE(self->priv->element)) { GstElement *machine; g_object_get(self->priv->element,"machine",&machine,NULL); g_object_set(machine,"analyzers",self->priv->analyzers_list,NULL); g_object_unref(machine); } g_object_get(song,"bin", &bin, NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::element", G_CALLBACK(on_signal_analyser_change), (gpointer)self); gst_object_unref(bus); self->priv->clock=gst_pipeline_get_clock (GST_PIPELINE(bin)); gst_object_unref(bin); // allocate visual ressources after the window has been realized g_signal_connect((gpointer)self,"realize",G_CALLBACK(bt_signal_analysis_dialog_realize),(gpointer)self); // redraw when needed g_signal_connect(self->priv->level_drawingarea,"expose-event",G_CALLBACK(bt_signal_analysis_dialog_level_expose),(gpointer)self); g_signal_connect(self->priv->spectrum_drawingarea,"expose-event",G_CALLBACK(bt_signal_analysis_dialog_spectrum_expose),(gpointer)self); Error: g_object_unref(song); g_object_unref(main_window); return(res); } //-- constructor methods /** * bt_signal_analysis_dialog_new: * @element: the wire/machine object to create the dialog for * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtSignalAnalysisDialog *bt_signal_analysis_dialog_new(const GstBin *element) { BtSignalAnalysisDialog *self; self=BT_SIGNAL_ANALYSIS_DIALOG(g_object_new(BT_TYPE_SIGNAL_ANALYSIS_DIALOG,"element",element,NULL)); // generate UI if(!bt_signal_analysis_dialog_init_ui(self)) { goto Error; } gtk_widget_show_all(GTK_WIDGET(self)); GST_DEBUG("dialog created and shown"); return(self); Error: gtk_widget_destroy(GTK_WIDGET(self)); return(NULL); } //-- methods //-- wrapper //-- class internals static void bt_signal_analysis_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtSignalAnalysisDialog *self = BT_SIGNAL_ANALYSIS_DIALOG(object); return_if_disposed(); switch (property_id) { case SIGNAL_ANALYSIS_DIALOG_ELEMENT: { g_object_try_unref(self->priv->element); self->priv->element = g_value_dup_object(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_signal_analysis_dialog_dispose(GObject *object) { BtSignalAnalysisDialog *self = BT_SIGNAL_ANALYSIS_DIALOG(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); /* DEBUG GST_DEBUG("levels: rms =%7.4lf .. %7.4lf",self->priv->min_rms ,self->priv->max_rms); GST_DEBUG("levels: peak=%7.4lf .. %7.4lf",self->priv->min_peak,self->priv->max_peak); // DEBUG */ if(self->priv->clock) gst_object_unref(self->priv->clock); if(self->priv->spect_grad) cairo_pattern_destroy(self->priv->spect_grad); GST_DEBUG("!!!! removing signal handler"); g_object_get(self->priv->app,"song",&song,NULL); if(song) { GstBin *bin; GstBus *bus; g_object_get(song,"bin", &bin, NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_signal_analyser_change,self); gst_object_unref(bus); gst_object_unref(bin); g_object_unref(song); } // this destroys the analyzers too GST_DEBUG("!!!! free analyzers"); if(BT_IS_WIRE(self->priv->element)) { g_object_set(self->priv->element,"analyzers",NULL,NULL); } else { GstElement *machine; g_object_get(self->priv->element,"machine",&machine,NULL); g_object_set(machine,"analyzers",NULL,NULL); g_object_unref(machine); } g_object_unref(self->priv->element); g_object_unref(self->priv->app); GST_DEBUG("!!!! done"); G_OBJECT_CLASS(bt_signal_analysis_dialog_parent_class)->dispose(object); } static void bt_signal_analysis_dialog_finalize(GObject *object) { BtSignalAnalysisDialog *self = BT_SIGNAL_ANALYSIS_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->spect[0]); g_free(self->priv->spect[1]); g_free(self->priv->graph_log10); g_list_free(self->priv->analyzers_list); g_mutex_free(self->priv->lock); GST_DEBUG("!!!! done"); G_OBJECT_CLASS(bt_signal_analysis_dialog_parent_class)->finalize(object); } static void bt_signal_analysis_dialog_init(BtSignalAnalysisDialog *self) { gdouble *grid_log10; guint i; gdouble f,inc,end; self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SIGNAL_ANALYSIS_DIALOG, BtSignalAnalysisDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->lock = g_mutex_new(); self->priv->spect_height = 64; self->priv->spect_bands = 256; self->priv->height_scale = 1.0; self->priv->frq_map = MAP_LIN; self->priv->frq_precision = 1; update_spectrum_analyzer(self); self->priv->srate = GST_AUDIO_DEF_RATE; /* precalc some log10 values */ grid_log10 = self->priv->grid_log10; i=0;f=1.0;inc=1.0;end=10.0; while(i<60) { grid_log10[i++]=log10(1.0+f); f+=inc; if(f>=end) { f=inc=end; end*=10.0; } } } static void bt_signal_analysis_dialog_class_init(BtSignalAnalysisDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); bus_msg_level_quark=g_quark_from_static_string("level"); bus_msg_spectrum_quark=g_quark_from_static_string("spectrum"); g_type_class_add_private(klass,sizeof(BtSignalAnalysisDialogPrivate)); gobject_class->set_property = bt_signal_analysis_dialog_set_property; gobject_class->dispose = bt_signal_analysis_dialog_dispose; gobject_class->finalize = bt_signal_analysis_dialog_finalize; g_object_class_install_property(gobject_class,SIGNAL_ANALYSIS_DIALOG_ELEMENT, g_param_spec_object("element", "element construct prop", "Set wire/machine object, the dialog handles", GST_TYPE_BIN, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/settings-page-directories.h0000644042355400116100000000475511625722250017714 00000000000000/* $Id: settings-page-directories.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PAGE_DIRECTORIES_H #define BT_SETTINGS_PAGE_DIRECTORIES_H #include #include #define BT_TYPE_SETTINGS_PAGE_DIRECTORIES (bt_settings_page_directories_get_type ()) #define BT_SETTINGS_PAGE_DIRECTORIES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_PAGE_DIRECTORIES, BtSettingsPageDirectories)) #define BT_SETTINGS_PAGE_DIRECTORIES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_PAGE_DIRECTORIES, BtSettingsPageDirectoriesClass)) #define BT_IS_SETTINGS_PAGE_DIRECTORIES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_PAGE_DIRECTORIES)) #define BT_IS_SETTINGS_PAGE_DIRECTORIES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_PAGE_DIRECTORIES)) #define BT_SETTINGS_PAGE_DIRECTORIES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_PAGE_DIRECTORIES, BtSettingsPageDirectoriesClass)) /* type macros */ typedef struct _BtSettingsPageDirectories BtSettingsPageDirectories; typedef struct _BtSettingsPageDirectoriesClass BtSettingsPageDirectoriesClass; typedef struct _BtSettingsPageDirectoriesPrivate BtSettingsPageDirectoriesPrivate; /** * BtSettingsPageDirectories: * * the root window for the editor application */ struct _BtSettingsPageDirectories { GtkTable parent; /*< private >*/ BtSettingsPageDirectoriesPrivate *priv; }; struct _BtSettingsPageDirectoriesClass { GtkTableClass parent; }; GType bt_settings_page_directories_get_type(void) G_GNUC_CONST; BtSettingsPageDirectories *bt_settings_page_directories_new(void); #endif // BT_SETTINGS_PAGE_DIRECTORIES_H buzztard-0.6.0/src/ui/edit/main-page-machines.c0000644042355400116100000023343511666705670016261 00000000000000/* $Id: main-page-machines.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpagemachines * @short_description: the editor main machines page * @see_also: #BtSetup * * Displays the machine setup and wires on a canvas. */ /* @todo: multiselect * - when clicking on the background * - remove old selection if any * - start new selection (semi-transparent rect) * - have context menu on the selection * - delete * - mute/solo/bypass ? * - move machines when moving the selection * - selected machines have a glowing border (would need another set of images) */ /* @todo: move functions in context menu * - machines * - clone machine (no patterns) * - remove & relink (remove machine and relink wires) * does not work in all scenarios (we might need to create more wires) * A --\ /-- D * +-- C --+ * B --/ \-- E * * - wires * - insert machine (like menu on canvas) * - what to do with wire-patterns? */ /* @todo: easier machine manipulation * linking the machines with "shift" pressed comes from buzz and is hard to * discover. We now have a "connect machines" item in the conect menut, but * what about these: * 1.) on the toolbar I could have a button that toggles between "move" and * "link". In "move" mode one can move machines with the mouse and in "link" * mode one can link. Would need to have a keyboard shortcut for toggling. * 2.) click-zones on the icons. Link the machine when click+drag the title bar. * Make the 'leds' clickable and move the machines outside of title and led. * Eventualy change the mouse-cursor when hovering over the zones. * Option '2' looks nice and would also help on touch-screens. */ /* @todo: click in the background to pan canvas around */ #define BT_EDIT #define BT_MAIN_PAGE_MACHINES_C #include "bt-edit.h" enum { MAIN_PAGE_MACHINES_CANVAS=1 }; struct _BtMainPageMachinesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the toolbar widget */ GtkWidget *toolbar; /* the setup of machines and wires */ BtSetup *setup; /* canvas for machine view */ GnomeCanvas *canvas; GtkAdjustment *hadjustment,*vadjustment; /* canvas background grid */ GnomeCanvasItem *grid; /* the zoomration in pixels/per unit */ gdouble zoom; /* zomm in/out widgets */ GtkWidget *zoom_in,*zoom_out; /* canvas context_menu */ GtkMenu *context_menu; /* grid density menu */ GtkMenu *grid_density_menu; GSList *grid_density_group; /* grid density */ gulong grid_density; /* we probably need a list of canvas items that we have drawn, so that we can * easily clear them later */ GHashTable *machines; // each entry points to BtMachineCanvasItem GHashTable *wires; // each entry points to BtWireCanvasItem /* interaction state */ gboolean connecting,moved; gdouble offx,offy,dragx,dragy; /* cursor for moving */ GdkCursor *drag_cursor; /* used when interactivly adding a new wire*/ GnomeCanvasItem *new_wire; GnomeCanvasPoints *new_wire_points; BtMachineCanvasItem *new_wire_src,*new_wire_dst; /* cached setup properties */ GHashTable *properties; /* mouse coodinates on context menu invokation (used for placing new machines) */ gdouble mouse_x,mouse_y; /* machine coordinates before/after draging (needed for undo) */ gdouble machine_xo,machine_yo; gdouble machine_xn,machine_yn; BtMachineCanvasItem *moving_machine_item; /* volume/panorama popup slider */ BtVolumePopup *vol_popup; BtPanoramaPopup *pan_popup; GtkObject *vol_popup_adj, *pan_popup_adj; GstElement *wire_gain,*wire_pan; /* relative scrollbar position */ gdouble scroll_x,scroll_y; /* editor change log */ BtChangeLog *change_log; }; //-- the class static void bt_main_page_machines_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtMainPageMachines, bt_main_page_machines, GTK_TYPE_VBOX, G_IMPLEMENT_INTERFACE (BT_TYPE_CHANGE_LOGGER, bt_main_page_machines_change_logger_interface_init)); enum { METHOD_ADD_MACHINE=0, METHOD_REM_MACHINE, METHOD_SET_MACHINE_PROPERTY, METHOD_ADD_WIRE, METHOD_REM_WIRE, METHOD_SET_WIRE_PROPERTY, }; static BtChangeLoggerMethods change_logger_methods[] = { BT_CHANGE_LOGGER_METHOD("add_machine",12,"([0-9]),\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("rem_machine",12,"\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("set_machine_property",21,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9]+)\",\"(.+)\"$"), BT_CHANGE_LOGGER_METHOD("add_wire",9,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("rem_wire",9,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("set_wire_property",18,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9]+)\",\"(.+)\"$"), { NULL, } }; //-- data helper static gboolean canvas_item_destroy(gpointer key,gpointer value,gpointer user_data) { gtk_object_destroy(GTK_OBJECT(value)); return(TRUE); } //-- linking signal handler & helper static void start_connect(BtMainPageMachines *self) { // handle drawing a new wire self->priv->new_wire_points=gnome_canvas_points_new(2); self->priv->new_wire_points->coords[0]=self->priv->mouse_x; self->priv->new_wire_points->coords[1]=self->priv->mouse_y; self->priv->new_wire_points->coords[2]=self->priv->mouse_x; self->priv->new_wire_points->coords[3]=self->priv->mouse_y; self->priv->new_wire=gnome_canvas_item_new(gnome_canvas_root(self->priv->canvas), GNOME_TYPE_CANVAS_LINE, "points", self->priv->new_wire_points, "fill-color", "red", "width-pixels", 1, NULL); gnome_canvas_item_lower_to_bottom(self->priv->new_wire); gnome_canvas_item_lower_to_bottom(self->priv->grid); self->priv->connecting=TRUE; self->priv->moved=FALSE; } static void on_machine_item_start_connect(BtMachineCanvasItem *machine_item, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); self->priv->new_wire_src=g_object_ref(machine_item); g_object_get(machine_item,"x",&self->priv->mouse_x,"y",&self->priv->mouse_y,NULL); start_connect(self); } //-- event handler helper static void machine_item_moved(const BtMainPageMachines *self, BtMachineCanvasItem *machine_item) { BtMachine *machine; gchar *undo_str,*redo_str; gchar *mid; gchar str[G_ASCII_DTOSTR_BUF_SIZE]; g_object_get(machine_item,"machine",&machine,NULL); g_object_get(machine,"id",&mid,NULL); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_machine_property \"%s\",\"xpos\",\"%s\"",mid,g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,self->priv->machine_xo)); redo_str = g_strdup_printf("set_machine_property \"%s\",\"xpos\",\"%s\"",mid,g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,self->priv->machine_xn)); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); undo_str = g_strdup_printf("set_machine_property \"%s\",\"ypos\",\"%s\"",mid,g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,self->priv->machine_yo)); redo_str = g_strdup_printf("set_machine_property \"%s\",\"ypos\",\"%s\"",mid,g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,self->priv->machine_yn)); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); bt_change_log_end_group(self->priv->change_log); g_free(mid); g_object_unref(machine); } // @todo: this method probably should go to BtMachine, but on the other hand it is GUI related gboolean machine_view_get_machine_position(GHashTable *properties, gdouble *pos_x,gdouble *pos_y) { gboolean res=FALSE; gchar *prop; *pos_x=*pos_y=0.0; if(properties) { prop=(gchar *)g_hash_table_lookup(properties,"xpos"); if(prop) { *pos_x=MACHINE_VIEW_ZOOM_X*g_ascii_strtod(prop,NULL); // do not g_free(prop); //GST_DEBUG(" xpos: %+5.1f %p=\"%s\"",*pos_x,prop,prop); res=TRUE; } else GST_WARNING("no xpos property found"); prop=(gchar *)g_hash_table_lookup(properties,"ypos"); if(prop) { *pos_y=MACHINE_VIEW_ZOOM_Y*g_ascii_strtod(prop,NULL); // do not g_free(prop); //GST_DEBUG(" ypos: %+5.1f %p=\"%s\"",*pos_y,prop,prop); res&=TRUE; } else GST_WARNING("no ypos property found"); } else GST_WARNING("no properties supplied"); return(res); } /* * update_machine_zoom: * * workaround for gnome_canvas bug, that fails to change font-sizes when zooming */ static void update_machine_zoom(gpointer key,gpointer value,gpointer user_data) { g_object_set(BT_MACHINE_CANVAS_ITEM(value),"zoom",(*(gdouble*)user_data),NULL); } static void update_machines_zoom(const BtMainPageMachines *self) { gchar str[G_ASCII_DTOSTR_BUF_SIZE]; g_hash_table_insert(self->priv->properties,g_strdup("zoom"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,self->priv->zoom))); bt_edit_application_set_song_unsaved(self->priv->app); g_hash_table_foreach(self->priv->machines,update_machine_zoom,&self->priv->zoom); gtk_widget_set_sensitive(self->priv->zoom_out,(self->priv->zoom>0.4)); gtk_widget_set_sensitive(self->priv->zoom_in,(self->priv->zoom<3.0)); } static void machine_item_new(const BtMainPageMachines *self,BtMachine *machine,gdouble xpos,gdouble ypos) { BtMachineCanvasItem *item; item=bt_machine_canvas_item_new(self,machine,xpos,ypos,self->priv->zoom); g_hash_table_insert(self->priv->machines,machine,item); g_signal_connect(item,"start-connect",G_CALLBACK(on_machine_item_start_connect),(gpointer)self); } static void wire_item_new(const BtMainPageMachines *self,BtWire *wire,gdouble pos_xs,gdouble pos_ys,gdouble pos_xe,gdouble pos_ye,BtMachineCanvasItem *src_machine_item,BtMachineCanvasItem *dst_machine_item) { BtWireCanvasItem *item; item=bt_wire_canvas_item_new(self,wire,pos_xs,pos_ys,pos_xe,pos_ye,src_machine_item,dst_machine_item); g_hash_table_insert(self->priv->wires,wire,item); } static void machine_view_clear(const BtMainPageMachines *self) { // clear the canvas GST_DEBUG("before destroying machine canvas items"); g_hash_table_foreach_remove(self->priv->machines,canvas_item_destroy,NULL); GST_DEBUG("before destoying wire canvas items"); g_hash_table_foreach_remove(self->priv->wires,canvas_item_destroy,NULL); GST_DEBUG("done"); } static void machine_view_refresh(const BtMainPageMachines *self) { GHashTable *properties; BtMachineCanvasItem *src_machine_item,*dst_machine_item; BtMachine *machine,*src_machine,*dst_machine; BtWire *wire; gdouble pos_x,pos_y; gdouble pos_xs,pos_ys,pos_xe,pos_ye; GList *node,*list; gchar *prop; machine_view_clear(self); // update view if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"zoom"))) { self->priv->zoom=g_ascii_strtod(prop,NULL); gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); GST_INFO("set zoom to %6.4lf",self->priv->zoom); } if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"xpos"))) { gtk_adjustment_set_value(self->priv->hadjustment,g_ascii_strtod(prop,NULL)); } else { gdouble xs,xe,xp; // center g_object_get(self->priv->hadjustment,"lower",&xs,"upper",&xe,"page-size",&xp,NULL); gtk_adjustment_set_value(self->priv->hadjustment,xs+((xe-xs-xp)*0.5)); } if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"ypos"))) { gtk_adjustment_set_value(self->priv->vadjustment,g_ascii_strtod(prop,NULL)); } else { gdouble ys,ye,yp; // center g_object_get(self->priv->vadjustment,"lower",&ys,"upper",&ye,"page-size",&yp,NULL); gtk_adjustment_set_value(self->priv->vadjustment,ys+((ye-ys-yp)*0.5)); } GST_INFO("creating machine canvas items"); // draw all machines g_object_get(self->priv->setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); // get position g_object_get(machine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&pos_x,&pos_y); // draw machine machine_item_new(self,machine,pos_x,pos_y); } g_list_free(list); // draw all wires g_object_get(self->priv->setup,"wires",&list,NULL); for(node=list;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); // get positions of source and dest g_object_get(wire,"src",&src_machine,"dst",&dst_machine,NULL); g_object_get(src_machine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&pos_xs,&pos_ys); g_object_get(dst_machine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&pos_xe,&pos_ye); src_machine_item=g_hash_table_lookup(self->priv->machines,src_machine); dst_machine_item=g_hash_table_lookup(self->priv->machines,dst_machine); // draw wire wire_item_new(self,wire,pos_xs,pos_ys,pos_xe,pos_ye,src_machine_item,dst_machine_item); g_object_unref(src_machine); g_object_unref(dst_machine); // @todo: get "analyzer-window-state" and if set, // get xpos, ypos and open window } g_list_free(list); gnome_canvas_item_lower_to_bottom(self->priv->grid); GST_DEBUG("drawing done"); } static void bt_main_page_machines_draw_grid(const BtMainPageMachines *self) { GnomeCanvasPoints *points; gdouble s,step; gulong color; GST_INFO("redrawing grid : density=%lu canvas=%p",self->priv->grid_density,self->priv->canvas); // delete old grid-item and generate a new one (pushing it to bottom) if(self->priv->grid) gtk_object_destroy(GTK_OBJECT(self->priv->grid)); self->priv->grid=gnome_canvas_item_new(gnome_canvas_root(self->priv->canvas), GNOME_TYPE_CANVAS_GROUP,"x",0.0,"y",0.0,NULL); gnome_canvas_item_lower_to_bottom(self->priv->grid); if(!self->priv->grid_density) return; points=gnome_canvas_points_new(2); // low=1->2, mid=2->4, high=3->8 step=(MACHINE_VIEW_ZOOM_X+MACHINE_VIEW_ZOOM_X)/(gdouble)(1<priv->grid_density); points->coords[1]=-(MACHINE_VIEW_ZOOM_Y*MACHINE_VIEW_GRID_FC); points->coords[3]= (MACHINE_VIEW_ZOOM_Y*MACHINE_VIEW_GRID_FC); for(s=-(MACHINE_VIEW_ZOOM_X*MACHINE_VIEW_GRID_FC);s<=(MACHINE_VIEW_ZOOM_X*MACHINE_VIEW_GRID_FC);s+=step) { points->coords[0]=points->coords[2]=s; color=(((gdouble)((glong)(s/MACHINE_VIEW_ZOOM_X)))==(s/MACHINE_VIEW_ZOOM_X))?0xAAAAAAFF:0xCCCCCCFF; //GST_INFO("grid : s= %lf - %lf",s,s/MACHINE_VIEW_ZOOM_X); gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->grid), GNOME_TYPE_CANVAS_LINE, "points", points, /*"fill-color", "gray",*/ "fill-color-rgba",color, "width-pixels", 1, NULL); } step=(MACHINE_VIEW_ZOOM_Y+MACHINE_VIEW_ZOOM_Y)/(gdouble)(1<priv->grid_density); points->coords[0]=-(MACHINE_VIEW_ZOOM_X*MACHINE_VIEW_GRID_FC); points->coords[2]= (MACHINE_VIEW_ZOOM_X*MACHINE_VIEW_GRID_FC); for(s=-(MACHINE_VIEW_ZOOM_Y*MACHINE_VIEW_GRID_FC);s<=(MACHINE_VIEW_ZOOM_Y*MACHINE_VIEW_GRID_FC);s+=step) { points->coords[1]=points->coords[3]=s; color=(((gdouble)((glong)(s/MACHINE_VIEW_ZOOM_Y)))==(s/MACHINE_VIEW_ZOOM_Y))?0xAAAAAAFF:0xCCCCCCFF; gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->grid), GNOME_TYPE_CANVAS_LINE, "points", points, /*"fill-color", "gray",*/ "fill-color-rgba",color, "width-pixels", 1, NULL); } gnome_canvas_points_free(points); } static void bt_main_page_machines_add_wire(const BtMainPageMachines *self) { BtSong *song; BtWire *wire; GError *err=NULL; BtMachine *src_machine,*dst_machine; GHashTable *properties; gdouble pos_xs,pos_ys,pos_xe,pos_ye; g_assert(self->priv->new_wire_src); g_assert(self->priv->new_wire_dst); g_object_get(self->priv->app,"song",&song,NULL); g_object_get(self->priv->new_wire_src,"machine",&src_machine,NULL); g_object_get(self->priv->new_wire_dst,"machine",&dst_machine,NULL); // try to establish a new connection wire=bt_wire_new(song,src_machine,dst_machine,&err); if(err==NULL) { gchar *undo_str,*redo_str; gchar *smid,*dmid; g_object_get(src_machine,"properties",&properties,"id",&smid,NULL); machine_view_get_machine_position(properties,&pos_xs,&pos_ys); g_object_get(dst_machine,"properties",&properties,"id",&dmid,NULL); machine_view_get_machine_position(properties,&pos_xe,&pos_ye); // draw wire wire_item_new(self,wire,pos_xs,pos_ys,pos_xe,pos_ye,self->priv->new_wire_src,self->priv->new_wire_dst); gnome_canvas_item_lower_to_bottom(self->priv->grid); undo_str = g_strdup_printf("rem_wire \"%s\",\"%s\"",smid,dmid); redo_str = g_strdup_printf("add_wire \"%s\",\"%s\"",smid,dmid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(smid);g_free(dmid); } else { GST_WARNING("failed to make wire: %s",err->message); g_error_free(err); } g_object_unref(wire); g_object_unref(dst_machine); g_object_unref(src_machine); g_object_unref(song); } static BtMachineCanvasItem *bt_main_page_machines_get_machine_canvas_item_at(const BtMainPageMachines *self,gdouble mouse_x,gdouble mouse_y) { BtMachineCanvasItem *mitem=NULL; GnomeCanvasItem *ci,*pci; //GST_DEBUG("is there a machine at pos?"); if((ci=gnome_canvas_get_item_at(self->priv->canvas,mouse_x,mouse_y))) { g_object_get(ci,"parent",&pci,NULL); if(BT_IS_MACHINE_CANVAS_ITEM(pci)) { mitem=BT_MACHINE_CANVAS_ITEM(pci); //GST_DEBUG(" yes!"); } else g_object_unref(pci); } return(mitem); } static gboolean bt_main_page_machines_check_wire(const BtMainPageMachines *self) { gboolean ret=FALSE; BtMachine *src_machine,*dst_machine; GST_INFO("can we link to it?"); g_assert(self->priv->new_wire_src); g_assert(self->priv->new_wire_dst); g_object_get(self->priv->new_wire_src,"machine",&src_machine,NULL); g_object_get(self->priv->new_wire_dst,"machine",&dst_machine,NULL); // if the citem->machine is a sink/processor-machine if(BT_IS_SINK_MACHINE(dst_machine) || BT_IS_PROCESSOR_MACHINE(dst_machine)) { BtWire *wire; // check if these machines are not yet connected wire=bt_machine_get_wire_by_dst_machine(src_machine,dst_machine); if(!wire) { wire=bt_machine_get_wire_by_dst_machine(dst_machine,src_machine); if(!wire) { ret=TRUE; GST_INFO(" yes!"); } else { g_object_unref(wire); } } else { g_object_unref(wire); } } g_object_unref(dst_machine); g_object_unref(src_machine); return(ret); } //-- event handler static void on_machine_added(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); GHashTable *properties; gdouble pos_x,pos_y; GST_INFO("new machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); g_object_get(machine,"properties",&properties,NULL); if(properties) { if(!machine_view_get_machine_position(properties,&pos_x,&pos_y)) { gchar str[G_ASCII_DTOSTR_BUF_SIZE]; pos_x=self->priv->mouse_x; pos_y=self->priv->mouse_y; g_hash_table_insert(properties,g_strdup("xpos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,(pos_x/MACHINE_VIEW_ZOOM_X)))); g_hash_table_insert(properties,g_strdup("ypos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,(pos_y/MACHINE_VIEW_ZOOM_Y)))); } } else { pos_x=self->priv->mouse_x; pos_y=self->priv->mouse_y; } self->priv->machine_xn=pos_x/MACHINE_VIEW_ZOOM_X; self->priv->machine_yn=pos_y/MACHINE_VIEW_ZOOM_Y; GST_DEBUG_OBJECT(machine,"adding machine at %lf x %lf, mouse is at %lf x %lf", pos_x,pos_y,self->priv->mouse_x,self->priv->mouse_y); // draw machine machine_item_new(self,machine,pos_x,pos_y); GST_INFO("... machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); } static void on_machine_removed(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtMachineCanvasItem *item; if(!machine) return; GST_INFO("machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); if((item=g_hash_table_lookup(self->priv->machines,machine))) { GST_INFO("now removing machine-item : %p",item); g_hash_table_remove(self->priv->machines,machine); gtk_object_destroy(GTK_OBJECT(item)); } GST_INFO("... machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); } static void on_wire_removed(BtSetup *setup,BtWire *wire,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtWireCanvasItem *item; if(!wire) return; GST_INFO("wire %p,ref_ct=%d has been removed",wire,G_OBJECT_REF_COUNT(wire)); // add undo/redo details if(bt_change_log_is_active(self->priv->change_log)) { gchar *undo_str,*redo_str; gchar *prop; BtMachine *src_machine,*dst_machine; GHashTable *properties; gchar *smid,*dmid; g_object_get(wire,"src",&src_machine,"dst",&dst_machine,"properties",&properties,NULL); g_object_get(src_machine,"id",&smid,NULL); g_object_get(dst_machine,"id",&dmid,NULL); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("add_wire \"%s\",\"%s\"",smid,dmid); redo_str = g_strdup_printf("rem_wire \"%s\",\"%s\"",smid,dmid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); prop=(gchar *)g_hash_table_lookup(properties,"analyzer-shown"); if(prop && *prop=='1') { undo_str = g_strdup_printf("set_wire_property \"%s\",\"%s\",\"analyzer-shown\",\"1\"",smid,dmid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } // TODO: volume and panorama g_free(smid);g_free(dmid); bt_change_log_end_group(self->priv->change_log); g_object_unref(dst_machine); g_object_unref(src_machine); } if((item=g_hash_table_lookup(self->priv->wires,wire))) { GST_INFO("now removing wire-item : %p",item); g_hash_table_remove(self->priv->wires,wire); gtk_object_destroy(GTK_OBJECT(item)); } GST_INFO("... wire %p,ref_ct=%d has been removed",wire,G_OBJECT_REF_COUNT(wire)); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtSong *song; GST_INFO("song has changed : app=%p, self=%p",app,self); g_object_try_unref(self->priv->setup); // get song from app g_object_get(self->priv->app,"song",&song,NULL); if(!song) { self->priv->setup=NULL; self->priv->properties=NULL; machine_view_clear(self); GST_INFO("song (null) has changed done"); return; } GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); g_object_get(song,"setup",&self->priv->setup,NULL); g_object_get(self->priv->setup,"properties",&self->priv->properties,NULL); // update page machine_view_refresh(self); g_signal_connect(self->priv->setup,"machine-added",G_CALLBACK(on_machine_added),(gpointer)self); g_signal_connect(self->priv->setup,"machine-removed",G_CALLBACK(on_machine_removed),(gpointer)self); g_signal_connect(self->priv->setup,"wire-removed",G_CALLBACK(on_wire_removed),(gpointer)self); // release the reference g_object_unref(song); GST_INFO("song has changed done"); } static void on_toolbar_zoom_fit_clicked(GtkButton *button, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtMachine *machine; GHashTable *properties; GList *node,*list; gdouble fc_x,fc_y,c_x,c_y,ms; // machine area gdouble ma_xs=MACHINE_VIEW_ZOOM_X,ma_x,ma_xe=-MACHINE_VIEW_ZOOM_X,ma_xd; gdouble ma_ys=MACHINE_VIEW_ZOOM_Y,ma_y,ma_ye=-MACHINE_VIEW_ZOOM_Y,ma_yd; // page area gdouble /*pg_xs,pg_x,pg_xe,pg_xd,*/pg_xl; gdouble /*pg_ys,pg_y,pg_ye,pg_yd,*/pg_yl; gdouble old_zoom=self->priv->zoom; //calculate bounds g_object_get(self->priv->setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); // get position g_object_get(machine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&ma_x,&ma_y); if(ma_xma_xe) ma_xe=ma_x; if(ma_yma_ye) ma_ye=ma_y; GST_DEBUG("machines: x:%+6.4lf y:%+6.4lf -> ranging from x:%+6.4lf...%+6.4lf and y:%+6.4lf...%+6.4lf",ma_x,ma_y,ma_xs,ma_xe,ma_ys,ma_ye); } g_list_free(list); /* need to add machine extends + some space */ GST_INFO("machines ranging from x:%+6.4lf...%+6.4lf and y:%+6.4lf...%+6.4lf",ma_xs,ma_xe,ma_ys,ma_ye); ms=2*MACHINE_VIEW_MACHINE_SIZE_X; ma_xs-=ms;ma_xe+=ms; ma_xd=(ma_xe-ma_xs); ms=2*MACHINE_VIEW_MACHINE_SIZE_Y; ma_ys-=ms;ma_ye+=ms; ma_yd=(ma_ye-ma_ys); g_object_get(self->priv->hadjustment,/*"lower",&pg_xs,"value",&pg_x,"upper",&pg_xe,*/"page-size",&pg_xl,NULL); g_object_get(self->priv->vadjustment,/*"lower",&pg_ys,"value",&pg_y,"upper",&pg_ye,*/"page-size",&pg_yl,NULL); /* pg_xd=(pg_xe-pg_xs)/MACHINE_VIEW_ZOOM_X; pg_yd=(pg_ye-pg_ys)/MACHINE_VIEW_ZOOM_Y; GST_INFO("page: pos x/y:%+6.4lf %+6.4lf size x/y: %+6.4lf %+6.4lf -> ranging from x:%+6.4lf...%+6.4lf and y:%+6.4lf...%+6.4lf", pg_x,pg_y,pg_xl,pg_yl, pg_xs,pg_xe,pg_ys,pg_ye); */ // zoom fc_x=pg_xl/ma_xd; fc_y=pg_yl/ma_yd; GST_INFO("zoom old=%6.4lf, x:%+6.4lf / %+6.4lf = %+6.4lf and y:%+6.4lf / %+6.4lf = %+6.4lf",self->priv->zoom, pg_xl,ma_xd,fc_x, pg_yl,ma_yd,fc_y); self->priv->zoom=MIN(fc_x,fc_y); // center region /* pos can be between: lower ... upper-page_size) */ GST_INFO("x: (%+6.4lf-%+6.4lf)/2=%+6.4lf",pg_xl,(ma_xd*self->priv->zoom),((pg_xl-(ma_xd*self->priv->zoom))/2.0)); GST_INFO("y: (%+6.4lf-%+6.4lf)/2=%+6.4lf",pg_yl,(ma_yd*self->priv->zoom),((pg_yl-(ma_yd*self->priv->zoom))/2.0)); c_x=(MACHINE_VIEW_ZOOM_X+ma_xs)*self->priv->zoom-((pg_xl-(ma_xd*self->priv->zoom))/2.0); c_y=(MACHINE_VIEW_ZOOM_Y+ma_ys)*self->priv->zoom-((pg_yl-(ma_yd*self->priv->zoom))/2.0); gtk_adjustment_set_value(self->priv->hadjustment,c_x); gtk_adjustment_set_value(self->priv->vadjustment,c_y); GST_INFO("toolbar zoom_fit event occurred: zoom = %lf, center x/y = %+6.4lf,%+6.4lf",self->priv->zoom,c_x,c_y); if(self->priv->zoom>old_zoom) { gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); update_machines_zoom(self); } else { update_machines_zoom(self); gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); } gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->canvas)); } static void on_toolbar_zoom_in_clicked(GtkButton *button, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); self->priv->zoom*=1.5; GST_INFO("toolbar zoom_in event occurred : %lf",self->priv->zoom); gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); update_machines_zoom(self); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->canvas)); } static void on_toolbar_zoom_out_clicked(GtkButton *button, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); self->priv->zoom/=1.5; GST_INFO("toolbar zoom_out event occurred : %lf",self->priv->zoom); update_machines_zoom(self); gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->canvas)); } #ifndef GRID_USES_MENU_TOOL_ITEM static void on_toolbar_grid_clicked(GtkButton *button, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gtk_menu_popup(self->priv->grid_density_menu,NULL,NULL,NULL,NULL,1,gtk_get_current_event_time()); } #endif static void on_toolbar_grid_density_off_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtSettings *settings; if(!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; self->priv->grid_density=0; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"grid-density","off",NULL); g_object_unref(settings); bt_main_page_machines_draw_grid(self); } static void on_toolbar_grid_density_low_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtSettings *settings; if(!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; self->priv->grid_density=1; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"grid-density","low",NULL); g_object_unref(settings); bt_main_page_machines_draw_grid(self); } static void on_toolbar_grid_density_mid_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtSettings *settings; if(!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; self->priv->grid_density=2; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"grid-density","medium",NULL); g_object_unref(settings); bt_main_page_machines_draw_grid(self); } static void on_toolbar_grid_density_high_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); BtSettings *settings; if(!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; self->priv->grid_density=3; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"grid-density","high",NULL); g_object_unref(settings); bt_main_page_machines_draw_grid(self); } static void on_toolbar_menu_clicked(GtkButton *button, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,1,gtk_get_current_event_time()); } static void on_context_menu_unmute_all(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); GList *node,*list; BtMachine *machine; g_object_get(self->priv->setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); // @todo: this also un-solos and un-bypasses g_object_set(machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } g_list_free(list); } static void on_vadjustment_changed(GtkAdjustment *adjustment, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gdouble vs,ve,vp,val,v; g_object_get(self->priv->vadjustment,"value",&val,"lower",&vs,"upper",&ve,"page-size",&vp,NULL); v=(ve-vs-vp); if(v) { self->priv->scroll_y=(val-vs)/(ve-vs-vp); } if(self->priv->properties) { gchar str[G_ASCII_DTOSTR_BUF_SIZE]; gchar *prop; gdouble oval=0.0; gboolean have_val=FALSE; //GST_INFO("ypos: %lf",val); if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"ypos"))) { oval=g_ascii_strtod(prop,NULL); have_val=TRUE; } if((!have_val) || (oval!=val)) { g_hash_table_insert(self->priv->properties,g_strdup("ypos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,val))); if(have_val) bt_edit_application_set_song_unsaved(self->priv->app); } } } static void on_hadjustment_changed(GtkAdjustment *adjustment, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gdouble vs,ve,vp,val,v; g_object_get(self->priv->hadjustment,"value",&val,"lower",&vs,"upper",&ve,"page-size",&vp,NULL); v=(ve-vs-vp); if(v) { self->priv->scroll_x=(val-vs)/(ve-vs-vp); } if(self->priv->properties) { gchar str[G_ASCII_DTOSTR_BUF_SIZE]; gchar *prop; gdouble oval=0.0; gboolean have_val=FALSE; //GST_INFO("xpos: %lf",val); if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"xpos"))) { oval=g_ascii_strtod(prop,NULL); have_val=TRUE; } if((!have_val) || (oval!=val)) { g_hash_table_insert(self->priv->properties,g_strdup("xpos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,val))); if(have_val) bt_edit_application_set_song_unsaved(self->priv->app); } } } static void on_page_switched(GtkNotebook *notebook, GParamSpec *arg, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); guint page_num; static gint prev_page_num=-1; g_object_get(notebook,"page",&page_num,NULL); if(page_num==BT_MAIN_PAGES_MACHINES_PAGE) { // only do this if the page really has changed if(prev_page_num != BT_MAIN_PAGES_MACHINES_PAGE) { GST_DEBUG("enter machine page"); } } else { // only do this if the page was BT_MAIN_PAGES_MACHINES_PAGE if(prev_page_num == BT_MAIN_PAGES_MACHINES_PAGE) { BtMainWindow *main_window; GST_DEBUG("leave machine page"); g_object_get(self->priv->app,"main-window",&main_window,NULL); if(main_window) { bt_child_proxy_set(main_window,"statusbar::status",NULL,NULL); g_object_unref(main_window); } } } prev_page_num = page_num; } static gboolean on_canvas_event(GnomeCanvas *canvas, GdkEvent *event, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gboolean res=FALSE; GnomeCanvasItem *ci,*pci; gdouble mouse_x,mouse_y; gchar *color; BtMachine *machine; //if(!gtk_widget_get_realized(GTK_WIDGET(canvas))) return(res); //GST_INFO("canvas event received: type=%d", event->type); switch(event->type) { case GDK_BUTTON_PRESS: /* { GdkEventButton *e=(GdkEventButton*)event; GST_WARNING("type=%4d, window=%p, send_event=%3d, time=%8d",e->type,e->window,e->send_event,e->time); GST_WARNING("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",e->x,e->y,e->axes,e->state); GST_WARNING("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",e->button,e->device,e->x_root,e->y_root); } */ // store mouse coordinates, so that we can later place a newly added machine there gnome_canvas_window_to_world(self->priv->canvas,event->button.x,event->button.y,&self->priv->mouse_x,&self->priv->mouse_y); if(!(ci=gnome_canvas_get_item_at(self->priv->canvas,self->priv->mouse_x,self->priv->mouse_y))) { GST_DEBUG("GDK_BUTTON_PRESS: %d",event->button.button); if(event->button.button==3) { // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } } else { if(event->button.button==1) { g_object_get(ci,"parent",&pci,NULL); if(BT_IS_MACHINE_CANVAS_ITEM(pci)) { if(event->button.state&GDK_SHIFT_MASK) { self->priv->new_wire_src=BT_MACHINE_CANVAS_ITEM(pci); g_object_get(pci,"machine",&machine,NULL); // if the citem->machine is a source/processor-machine if(BT_IS_SOURCE_MACHINE(machine) || BT_IS_PROCESSOR_MACHINE(machine)) { start_connect(self); res=TRUE; } g_object_unref(machine); } else { gdouble px, py; // store pos for later undo g_object_get(pci,"x",&px,"y",&py,NULL); self->priv->machine_xo=px/MACHINE_VIEW_ZOOM_X; self->priv->machine_yo=py/MACHINE_VIEW_ZOOM_Y; self->priv->moving_machine_item=BT_MACHINE_CANVAS_ITEM(pci); } } else g_object_unref(pci); } // gnome_canvas_get_item_at() does not ref() //g_object_unref(ci); } break; case GDK_MOTION_NOTIFY: //GST_DEBUG("GDK_MOTION_NOTIFY: %f,%f",event->button.x,event->button.y); if(self->priv->connecting) { if(!self->priv->moved) { gnome_canvas_item_grab(self->priv->new_wire, GDK_POINTER_MOTION_MASK | /* GDK_ENTER_NOTIFY_MASK | */ /* GDK_LEAVE_NOTIFY_MASK | */ GDK_BUTTON_RELEASE_MASK, self->priv->drag_cursor, event->button.time); } // handle setting the coords of the connection line gnome_canvas_window_to_world(self->priv->canvas,event->button.x,event->button.y,&mouse_x,&mouse_y); self->priv->new_wire_points->coords[2]=mouse_x; self->priv->new_wire_points->coords[3]=mouse_y; // @idea: the green is a bit bright, use ui_resources?, also what about having both colors in self->priv (should save the canvas the color parsing) color="red"; if((self->priv->new_wire_dst=bt_main_page_machines_get_machine_canvas_item_at(self,mouse_x,mouse_y))) { if(bt_main_page_machines_check_wire(self)) { color="green"; } g_object_unref(self->priv->new_wire_dst); } gnome_canvas_item_set(self->priv->new_wire,"points",self->priv->new_wire_points,"fill-color",color,NULL); self->priv->moved=TRUE; res=TRUE; } break; case GDK_BUTTON_RELEASE: GST_DEBUG("GDK_BUTTON_RELEASE: %d",event->button.button); if(self->priv->connecting) { if(self->priv->moved) { gnome_canvas_item_ungrab(self->priv->new_wire,event->button.time); } gnome_canvas_window_to_world(self->priv->canvas,event->button.x,event->button.y,&mouse_x,&mouse_y); if((self->priv->new_wire_dst=bt_main_page_machines_get_machine_canvas_item_at(self,mouse_x,mouse_y))) { if(bt_main_page_machines_check_wire(self)) { bt_main_page_machines_add_wire(self); } g_object_unref(self->priv->new_wire_dst); } g_object_unref(self->priv->new_wire_src); self->priv->new_wire_src=NULL; gtk_object_destroy(GTK_OBJECT(self->priv->new_wire));self->priv->new_wire=NULL; gnome_canvas_points_free(self->priv->new_wire_points);self->priv->new_wire_points=NULL; self->priv->connecting=FALSE; } if(self->priv->moving_machine_item) { gdouble px, py; g_object_get((GnomeCanvasItem *)self->priv->moving_machine_item,"x",&px,"y",&py,NULL); self->priv->machine_xn=px/MACHINE_VIEW_ZOOM_X; self->priv->machine_yn=py/MACHINE_VIEW_ZOOM_Y; machine_item_moved(self,self->priv->moving_machine_item); g_object_unref(self->priv->moving_machine_item); self->priv->moving_machine_item=NULL; } break; case GDK_KEY_RELEASE: // need mouse pos to check if there is a canvas item under pointer { gint pointer_x,pointer_y; gtk_widget_get_pointer(GTK_WIDGET(self->priv->canvas),&pointer_x,&pointer_y); gnome_canvas_window_to_world(self->priv->canvas,(gdouble)pointer_x,(gdouble)pointer_y,&self->priv->mouse_x,&self->priv->mouse_y); //GST_INFO("button: x=%6.3lf, y=%6.3lf",event->button.x,event->button.y); //GST_INFO("motion: x=%6.3lf, y=%6.3lf",event->motion.x,event->motion.y); //GST_INFO("motion: x=%6d, y=%6d",pointer_x,pointer_y); } if(!gnome_canvas_get_item_at(self->priv->canvas,self->priv->mouse_x,self->priv->mouse_y)) { GST_DEBUG("GDK_KEY_RELEASE: %d",event->key.keyval); switch(event->key.keyval) { case GDK_Menu: // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; break; default: break; } } break; default: break; } /* we don't want the click falling through to the parent canvas item, if we have handled it */ return res; } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'",toolbar_style); gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->toolbar),gtk_toolbar_get_style_from_string(toolbar_style)); g_free(toolbar_style); } static void on_volume_popup_changed(GtkAdjustment *adj, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gdouble gain = gtk_adjustment_get_value (adj); g_object_set(self->priv->wire_gain,"volume",gain,NULL); } static void on_panorama_popup_changed(GtkAdjustment *adj, gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gfloat pan = (gfloat)gtk_adjustment_get_value (adj); g_object_set(self->priv->wire_pan,"panorama",pan,NULL); } #if 0 static void on_canvas_size_allocate(GtkWidget *widget,GtkAllocation *allocation,gpointer user_data) { BtMainPageMachines *self=BT_MAIN_PAGE_MACHINES(user_data); gdouble xs,xe,xp; gdouble ys,ye,yp; // center g_object_get(self->priv->hadjustment,"lower",&xs,"upper",&xe,"page-size",&xp,NULL); gtk_adjustment_set_value(self->priv->hadjustment,xs+((xe-xs-xp)*self->priv->scroll_x)); g_object_get(self->priv->vadjustment,"lower",&ys,"upper",&ye,"page-size",&yp,NULL); gtk_adjustment_set_value(self->priv->vadjustment,ys+((ye-ys-yp)*self->priv->scroll_y)); GST_WARNING("canvas: abs. scroll pos %lf x %lf, abs. scroll pos %lf x %lf", xs+((xe-xs-xp)*self->priv->scroll_x), ys+((ye-ys-yp)*self->priv->scroll_y), self->priv->scroll_x,self->priv->scroll_y); GST_WARNING("canvas size %d x %d",allocation->width,allocation->height); } #endif //-- helper methods static void bt_main_page_machines_init_main_context_menu(const BtMainPageMachines *self) { GtkWidget *menu_item,*menu,*image; self->priv->context_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); //menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL); menu_item=gtk_image_menu_item_new_with_label(_("Add machine")); image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); // add machine selection sub-menu menu=GTK_WIDGET(bt_machine_menu_new(self)); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),menu); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_menu_item_new_with_label(_("Unmute all machines")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_unmute_all),(gpointer)self); gtk_widget_show(menu_item); } static void bt_main_page_machines_init_grid_density_menu(const BtMainPageMachines *self) { GtkWidget *menu_item; // create grid-density menu with grid-density={off,low,mid,high} self->priv->grid_density_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); // background grid density menu_item=gtk_radio_menu_item_new_with_label(self->priv->grid_density_group,_("Off")); self->priv->grid_density_group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); if(self->priv->grid_density==0) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->grid_density_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_toolbar_grid_density_off_activated),(gpointer)self); menu_item=gtk_radio_menu_item_new_with_label(self->priv->grid_density_group,_("Low")); self->priv->grid_density_group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); if(self->priv->grid_density==1) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->grid_density_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_toolbar_grid_density_low_activated),(gpointer)self); menu_item=gtk_radio_menu_item_new_with_label(self->priv->grid_density_group,_("Medium")); self->priv->grid_density_group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); if(self->priv->grid_density==2) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->grid_density_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_toolbar_grid_density_mid_activated),(gpointer)self); menu_item=gtk_radio_menu_item_new_with_label(self->priv->grid_density_group,_("High")); self->priv->grid_density_group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menu_item)); if(self->priv->grid_density==3) gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),TRUE); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->grid_density_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_toolbar_grid_density_high_activated),(gpointer)self); } static void bt_main_page_machines_init_ui(const BtMainPageMachines *self,const BtMainPages *pages) { BtSettings *settings; GtkWidget *image,*scrolled_window; GtkWidget *tool_item; gchar *density; GST_DEBUG("!!!! self=%p",self); gtk_widget_set_name(GTK_WIDGET(self),"machine view"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"grid-density",&density,NULL); if(!strcmp(density,"off")) self->priv->grid_density=0; else if(!strcmp(density,"low")) self->priv->grid_density=1; else if(!strcmp(density,"medium")) self->priv->grid_density=2; else if(!strcmp(density,"high")) self->priv->grid_density=3; g_free(density); // create grid-density menu bt_main_page_machines_init_grid_density_menu(self); // create the context menu bt_main_page_machines_init_main_context_menu(self); // add toolbar self->priv->toolbar=gtk_toolbar_new(); gtk_widget_set_name(self->priv->toolbar,"machine view toolbar"); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_FIT)); gtk_widget_set_name(tool_item,"Zoom Fit"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Zoom in/out so that everything is visible")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(G_OBJECT(tool_item),"clicked",G_CALLBACK(on_toolbar_zoom_fit_clicked),(gpointer)self); self->priv->zoom_in=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_IN)); gtk_widget_set_name(self->priv->zoom_in,"Zoom In"); gtk_widget_set_sensitive(self->priv->zoom_in,(self->priv->zoom<3.0)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(self->priv->zoom_in),_("Zoom in for more details")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(self->priv->zoom_in),-1); g_signal_connect(self->priv->zoom_in,"clicked",G_CALLBACK(on_toolbar_zoom_in_clicked),(gpointer)self); self->priv->zoom_out=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_ZOOM_OUT)); gtk_widget_set_name(self->priv->zoom_out,"Zoom Out"); gtk_widget_set_sensitive(self->priv->zoom_out,(self->priv->zoom>0.4)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(self->priv->zoom_out),_("Zoom out for better overview")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(self->priv->zoom_out),-1); g_signal_connect(self->priv->zoom_out,"clicked",G_CALLBACK(on_toolbar_zoom_out_clicked),(gpointer)self); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),gtk_separator_tool_item_new(),-1); // grid density toolbar icon #ifdef GRID_USES_MENU_TOOL_ITEM // this is weird, we and up with a button and a menu, instead of a joint thing // so this is probably mean for e.g. undo, where the button undos and the menu allows to undo to stop step image=gtk_image_new_from_icon_name("buzztard_menu_grid",GTK_ICON_SIZE_MENU); tool_item=GTK_WIDGET(gtk_menu_tool_button_new(image,_("Grid"))); gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(tool_item),GTK_WIDGET(self->priv->grid_density_menu)); gtk_menu_tool_button_set_arrow_tooltip_text(GTK_MENU_TOOL_BUTTON(tool_item),_("Show background grid")); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Show background grid")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(tool_item),-1); //g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_grid_clicked),(gpointer)self); #else image=gtk_image_new_from_icon_name("buzztard_menu_grid",GTK_ICON_SIZE_MENU); tool_item=GTK_WIDGET(gtk_tool_button_new(image,_("Grid"))); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Show background grid")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_grid_clicked),(gpointer)self); #endif #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),gtk_separator_tool_item_new(),-1); #endif // popup menu button image=gtk_image_new_from_filename("popup-menu.png"); tool_item=GTK_WIDGET(gtk_tool_button_new(image,_("Machine view menu"))); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Menu actions for machine view below")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_menu_clicked),(gpointer)self); gtk_box_pack_start(GTK_BOX(self),self->priv->toolbar,FALSE,FALSE,0); // add canvas scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_ETCHED_IN); // generate an antialiased canvas gtk_widget_push_colormap(gdk_screen_get_system_colormap(gdk_screen_get_default())); self->priv->canvas=GNOME_CANVAS(gnome_canvas_new_aa()); /* the non antialisaed (and faster) version self->priv->canvas=GNOME_CANVAS(gnome_canvas_new()); */ gtk_widget_pop_colormap(); gtk_widget_set_can_focus(GTK_WIDGET(self->priv->canvas), TRUE); gnome_canvas_set_center_scroll_region(self->priv->canvas,TRUE); gnome_canvas_set_scroll_region(self->priv->canvas, -MACHINE_VIEW_ZOOM_X,-MACHINE_VIEW_ZOOM_Y, MACHINE_VIEW_ZOOM_X, MACHINE_VIEW_ZOOM_Y); gnome_canvas_set_pixels_per_unit(self->priv->canvas,self->priv->zoom); gtk_widget_set_name(GTK_WIDGET(self->priv->canvas),"machine-and-wire-editor"); /* DEBUG g_signal_connect(self->priv->canvas,"size-allocate",G_CALLBACK(on_canvas_size_allocate),(gpointer)self); DEBUG */ gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->canvas)); gtk_box_pack_start(GTK_BOX(self),scrolled_window,TRUE,TRUE,0); bt_main_page_machines_draw_grid(self); self->priv->vadjustment=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); g_signal_connect(self->priv->vadjustment,"value-changed",G_CALLBACK(on_vadjustment_changed),(gpointer)self); self->priv->hadjustment=gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); g_signal_connect(self->priv->hadjustment,"value-changed",G_CALLBACK(on_hadjustment_changed),(gpointer)self); // create volume popup self->priv->vol_popup_adj=gtk_adjustment_new(1.0, 0.0, 4.0, 0.05, 0.1, 0.0); self->priv->vol_popup=BT_VOLUME_POPUP(bt_volume_popup_new(GTK_ADJUSTMENT(self->priv->vol_popup_adj))); g_signal_connect(self->priv->vol_popup_adj,"value-changed",G_CALLBACK(on_volume_popup_changed),(gpointer)self); // create panorama popup self->priv->pan_popup_adj=gtk_adjustment_new(0.0, -1.0, 1.0, 0.05, 0.1, 0.0); self->priv->pan_popup=BT_PANORAMA_POPUP(bt_panorama_popup_new(GTK_ADJUSTMENT(self->priv->pan_popup_adj))); g_signal_connect(self->priv->pan_popup_adj,"value-changed",G_CALLBACK(on_panorama_popup_changed),(gpointer)self); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); g_signal_connect(self->priv->canvas,"event",G_CALLBACK(on_canvas_event),(gpointer)self); // listen to page changes g_signal_connect((gpointer)pages, "notify::page", G_CALLBACK(on_page_switched), (gpointer)self); // let settings control toolbar style on_toolbar_style_changed(settings,NULL,(gpointer)self); g_signal_connect(settings, "notify::toolbar-style", G_CALLBACK(on_toolbar_style_changed), (gpointer)self); g_object_unref(settings); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_page_machines_new: * @pages: the page collection * * Create a new instance * * Returns: the new instance */ BtMainPageMachines *bt_main_page_machines_new(const BtMainPages *pages) { BtMainPageMachines *self; self=BT_MAIN_PAGE_MACHINES(g_object_new(BT_TYPE_MAIN_PAGE_MACHINES,NULL)); bt_main_page_machines_init_ui(self,pages); return(self); } //-- methods /** * bt_main_page_machines_wire_volume_popup: * @self: the machines page * @wire: the wire to popup the volume control for * @xpos: the x-position for the popup * @ypos: the y-position for the popup * * Activates the volume-popup for the given wire. * * Returns: %TRUE for succes. */ gboolean bt_main_page_machines_wire_volume_popup(const BtMainPageMachines *self, BtWire *wire, gint xpos, gint ypos) { BtMainWindow *main_window; gdouble gain; g_object_get(self->priv->app,"main-window",&main_window,NULL); gtk_window_set_transient_for(GTK_WINDOW(self->priv->vol_popup),GTK_WINDOW(main_window)); g_object_unref(main_window); g_object_try_unref(self->priv->wire_gain); g_object_get(wire,"gain",&self->priv->wire_gain,NULL); /* set initial value */ g_object_get(self->priv->wire_gain,"volume",&gain,NULL); gtk_adjustment_set_value(GTK_ADJUSTMENT(self->priv->vol_popup_adj),gain); /* show directly over mouse-pos */ /* @todo: move it so that the knob is under the mouse */ //gint mid; // works only after t has once been shown, but we know the height //mid=GTK_WIDGET(self->priv->vol_popup)->allocation.height / 2; //gtk_window_move(GTK_WINDOW(self->priv->vol_popup),xpos,ypos-mid); gtk_window_move(GTK_WINDOW(self->priv->vol_popup),xpos,ypos); bt_volume_popup_show(self->priv->vol_popup); return(TRUE); } /** * bt_main_page_machines_wire_panorama_popup: * @self: the machines page * @wire: the wire to popup the panorama control for * @xpos: the x-position for the popup * @ypos: the y-position for the popup * * Activates the panorama-popup for the given wire. * * Returns: %TRUE for succes. */ gboolean bt_main_page_machines_wire_panorama_popup(const BtMainPageMachines *self, BtWire *wire, gint xpos, gint ypos) { BtMainWindow *main_window; gfloat pan; g_object_get(self->priv->app,"main-window",&main_window,NULL); gtk_window_set_transient_for(GTK_WINDOW(self->priv->pan_popup),GTK_WINDOW(main_window)); g_object_unref(main_window); g_object_try_unref(self->priv->wire_pan); g_object_get(wire,"pan",&self->priv->wire_pan,NULL); if(self->priv->wire_pan) { /* set initial value */ g_object_get(self->priv->wire_pan,"panorama",&pan,NULL); gtk_adjustment_set_value(GTK_ADJUSTMENT(self->priv->pan_popup_adj),(gdouble)pan); /* show directly over mouse-pos */ /* @todo: move it so that the knob is under the mouse */ gtk_window_move(GTK_WINDOW(self->priv->pan_popup),xpos,ypos); bt_panorama_popup_show(self->priv->pan_popup); } return(TRUE); } static gboolean bt_main_page_machines_add_machine(const BtMainPageMachines *self, guint type, const gchar *id, const gchar *plugin_name) { BtSong *song; BtMachine *machine=NULL; gchar *uid; GError *err=NULL; g_object_get(self->priv->app,"song",&song,NULL); uid=bt_setup_get_unique_machine_id(self->priv->setup,id); // try with 1 voice, if monophonic, voices will be reset to 0 in // bt_machine_init_voice_params() switch(type) { case 0: machine=BT_MACHINE(bt_source_machine_new(song,uid,plugin_name,/*voices=*/1,&err)); break; case 1: machine=BT_MACHINE(bt_processor_machine_new(song,uid,plugin_name,/*voices=*/1,&err)); break; } if(err==NULL) { BtMachineCanvasItem *mi; gchar *undo_str,*redo_str; GST_INFO_OBJECT(machine,"created machine %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("rem_machine \"%s\"",uid); redo_str = g_strdup_printf("add_machine %u,\"%s\",\"%s\"",type,uid,plugin_name); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); if((mi=g_hash_table_lookup(self->priv->machines,machine))) { machine_item_moved(self,mi); } bt_change_log_end_group(self->priv->change_log); } else { GST_WARNING("Can't create machine %s: %s",plugin_name,err->message); g_error_free(err); } g_object_unref(machine); g_free(uid); g_object_unref(song); return(err==NULL); } /** * bt_main_page_machines_add_source_machine: * @self: the machines page * @id: the id for the new machine * @plugin_name: the plugin-name for the new machine * * Add a new machine to the machine-page. */ gboolean bt_main_page_machines_add_source_machine(const BtMainPageMachines *self, const gchar *id, const gchar *plugin_name) { return(bt_main_page_machines_add_machine(self,0,id,plugin_name)); } /** * bt_main_page_machines_add_processor_machine: * @self: the machines page * @id: the id for the new machine * @plugin_name: the plugin-name for the new machine * * Add a new machine to the machine-page. */ gboolean bt_main_page_machines_add_processor_machine(const BtMainPageMachines *self, const gchar *id, const gchar *plugin_name) { return(bt_main_page_machines_add_machine(self,1,id,plugin_name)); } /** * bt_main_page_machines_delete_machine: * @self: the machines page * @machine: the machine to remove * * Remove a machine from the machine-page. */ void bt_main_page_machines_delete_machine(const BtMainPageMachines *self, BtMachine *machine) { BtMainWindow *main_window; BtMainPageSequence *sequence_page; GHashTable *properties; gchar *undo_str,*redo_str; gchar *mid,*pname,*prop; guint type=0; BtMachineState machine_state; gulong voices; gulong pattern_removed_id; GST_INFO("before removing machine : %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); bt_change_log_start_group(self->priv->change_log); /* by doing undo/redo from setup:machine-removed it happens completely * unconstrained, we need to enfore a certain order. Right now the log will * reverse the actions. Thus we need to write out the object we remove and * then within the things that get removed by that. * Thus when removing X - * 1) we need to log it directly and not in on_x_removed * 2) trigger on_x_removed * Still this won't let us control the order or serialisation of the children * * We can't control signal emission. Lile emitting the signal with details or * simmilar approaches won't fix it nicely either. * Somehow the handlers would need to describe their dependencies and then * defer their execution. Which they can't as they don't know the context they * are called from. A pre-delete signal would not solve it either. * * BtMainPageMachines:bt_main_page_machines_delete_machine -> BtSetup:machine-removed { * BtMainPagePatterns:on_machine_removed -> BtMachine::pattern-removed { * BtMainPageSequence:on_pattern_removed * } * BtMainPageSequence:on_machine_removed * BtWireCanvasItem:on_machine_removed -> BtSetup::wire-removed * } * Here we have the problem that we have two callbacks changing the sequence * data. When removing a machine, we just want handler for machine-removed to * do undo/redo, not e.g. pattern-removed. * * Should we store the signal in change log and check in signal handler if * we should be logging? * * when handling the ui interaction: * signal_id=g_signal_lookup("machine-removed",setup) * bt_change_log_set_hint(change_log,signal_id); * * inside the signal handler: * hint = g_signal_get_invocation_hint(object); * if (bt_change_log_is_hint(change_log,hint->signal_id) { * // do undo/redo serialisation * } * * For now we block conflicting handlers. */ // remove patterns for machine, trigger setup::machine-removed GST_INFO("removing the machine : %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); if(BT_IS_SOURCE_MACHINE(machine)) type=0; else if(BT_IS_PROCESSOR_MACHINE(machine)) type=1; g_object_get(machine,"id",&mid,"plugin-name",&pname,"properties",&properties,"state",&machine_state,"voices",&voices,NULL); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("add_machine %u,\"%s\",\"%s\"",type,mid,pname); redo_str = g_strdup_printf("rem_machine \"%s\"",mid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); undo_str = g_strdup_printf("set_machine_property \"%s\",\"voices\",\"%lu\"",mid,voices); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); prop=(gchar *)g_hash_table_lookup(properties,"properties-shown"); if(prop && *prop=='1') { undo_str = g_strdup_printf("set_machine_property \"%s\",\"properties-shown\",\"1\"",mid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } if(machine_state!=BT_MACHINE_STATE_NORMAL) { GEnumClass *enum_class=g_type_class_peek_static(BT_TYPE_MACHINE_STATE); GEnumValue *enum_value=g_enum_get_value(enum_class,machine_state); undo_str = g_strdup_printf("set_machine_property \"%s\",\"state\",\"%s\"",mid,enum_value->value_nick); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } // TODO: machine parameters g_free(mid);g_free(pname); // block machine:pattern-removed signal emission for sequence page to not clobber the sequence // in theory we we don't need to block it, as we are removing the machine anyway and thus disconnecting // but if we disconnect here, disconnecting them on the sequence page would fail pattern_removed_id=g_signal_lookup("pattern-removed",BT_TYPE_MACHINE); g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_child_proxy_get(main_window,"pages::sequence-page",&sequence_page,NULL); g_signal_handlers_block_matched(machine,G_SIGNAL_MATCH_ID|G_SIGNAL_MATCH_DATA,pattern_removed_id,0,NULL,NULL,(gpointer)sequence_page); g_object_ref(machine); bt_setup_remove_machine(self->priv->setup,machine); g_signal_handlers_unblock_matched(machine,G_SIGNAL_MATCH_ID|G_SIGNAL_MATCH_DATA,pattern_removed_id,0,NULL,NULL,(gpointer)sequence_page); g_object_unref(machine); g_object_unref(sequence_page); g_object_unref(main_window); bt_change_log_end_group(self->priv->change_log); // this segfaults if the machine is finalized //GST_INFO("... machine : %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); bt_change_log_end_group(self->priv->change_log); } /** * bt_main_page_machines_delete_wire: * @self: the machines page * @wire: the wire to remove * * Remove a wire from the machine-page (unlink the machines). */ void bt_main_page_machines_delete_wire(const BtMainPageMachines *self, BtWire *wire) { GST_INFO("now removing wire : %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); bt_change_log_start_group(self->priv->change_log); bt_setup_remove_wire(self->priv->setup,wire); // this segfaults if the wire is finalized //GST_INFO("... wire : %p,ref_ct=%d",wire,G_OBJECT_REF_COUNT(wire)); bt_change_log_end_group(self->priv->change_log); } /** * bt_main_page_machines_rename_machine: * @self: the machines page * @machine: the machine to renam * * Run the machine #BtMachineRenameDialog. */ void bt_main_page_machines_rename_machine(const BtMainPageMachines *self, BtMachine *machine) { GtkWidget *dialog=GTK_WIDGET(bt_machine_rename_dialog_new(machine)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { gchar *new_name; gchar *undo_str,*redo_str; gchar *mid; g_object_get(machine,"id",&mid,NULL); g_object_get(dialog,"name",&new_name,NULL); if(strcmp(mid,new_name)) { bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_machine_property \"%s\",\"name\",\"%s\"",new_name,mid); redo_str = g_strdup_printf("set_machine_property \"%s\",\"name\",\"%s\"",mid,new_name); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); bt_change_log_end_group(self->priv->change_log); } bt_machine_rename_dialog_apply(BT_MACHINE_RENAME_DIALOG(dialog)); g_free(mid);g_free(new_name); } gtk_widget_destroy(dialog); } //-- change logger interface static gboolean bt_main_page_machines_change_logger_change(const BtChangeLogger *owner,const gchar *data) { BtMainPageMachines *self = BT_MAIN_PAGE_MACHINES(owner); BtSong *song; gboolean res=FALSE; BtMachine *machine,*smachine,*dmachine; BtWire *wire; GMatchInfo *match_info; gchar *s; GST_INFO("undo/redo: [%s]",data); // parse data and apply action switch (bt_change_logger_match_method(change_logger_methods, data, &match_info)) { case METHOD_ADD_MACHINE: { gchar *mid,*pname; guint type; s=g_match_info_fetch(match_info,1);type=atoi(s);g_free(s); mid=g_match_info_fetch(match_info,2); pname=g_match_info_fetch(match_info,3); g_match_info_free(match_info); GST_DEBUG("-> [%d|%s|%s]",type,mid,pname); g_object_get(self->priv->app,"song",&song,NULL); switch (type) { case 0: machine=BT_MACHINE(bt_source_machine_new(song,mid,pname,/*voices=*/1,NULL)); break; case 1: machine=BT_MACHINE(bt_processor_machine_new(song,mid,pname,/*voices=*/1,NULL)); break; default: machine=NULL; GST_WARNING("unhandled machine type: %d",type); break; } if(machine) { res=TRUE; g_object_unref(machine); } g_object_unref(song); g_free(mid); g_free(pname); break; } case METHOD_REM_MACHINE: { gchar *mid; mid=g_match_info_fetch(match_info,1); g_match_info_free(match_info); GST_DEBUG("-> [%s]",mid); if((machine=bt_setup_get_machine_by_id(self->priv->setup, mid))) { bt_setup_remove_machine(self->priv->setup,machine); g_object_unref(machine); res=TRUE; } g_free(mid); break; } case METHOD_SET_MACHINE_PROPERTY: { gchar *mid,*key,*val; GHashTable *properties; mid=g_match_info_fetch(match_info,1); key=g_match_info_fetch(match_info,2); val=g_match_info_fetch(match_info,3); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%s]",mid,key,val); if((machine=bt_setup_get_machine_by_id(self->priv->setup,mid))) { BtMachineCanvasItem *item; gdouble pn,po; gboolean is_prop=FALSE; g_object_get(machine,"properties",&properties,NULL); res=TRUE; if(!strcmp(key,"xpos")) { if((item=g_hash_table_lookup(self->priv->machines,machine))) { g_object_get(item,"x",&po,NULL); pn=(gdouble)(MACHINE_VIEW_ZOOM_X*g_ascii_strtod(val,NULL)); gnome_canvas_item_move((GnomeCanvasItem *)item,(pn-po),0.0); // for some reason a plain g_object_set(item,"x",pn,NULL); would not fully redraw g_signal_emit_by_name(item,"position-changed",0); } is_prop=TRUE; } else if(!strcmp(key,"ypos")) { if((item=g_hash_table_lookup(self->priv->machines,machine))) { g_object_get(item,"y",&po,NULL); pn=(gdouble)(MACHINE_VIEW_ZOOM_Y*g_ascii_strtod(val,NULL)); gnome_canvas_item_move((GnomeCanvasItem *)item,0.0,(pn-po)); // for some reason a plain g_object_set(item,"y",pn,NULL); would not fully redraw g_signal_emit_by_name(item,"position-changed",0); } is_prop=TRUE; } else if(!strcmp(key,"properties-shown")) { if(*val=='1') { bt_machine_show_properties_dialog(machine); } is_prop=TRUE; } else if(!strcmp(key,"state")) { GEnumClass *enum_class=g_type_class_peek_static(BT_TYPE_MACHINE_STATE); GEnumValue *enum_value=g_enum_get_value_by_nick(enum_class,val); if(enum_value) { g_object_set(machine,"state",enum_value->value,NULL); } } else if(!strcmp(key,"voices")) { g_object_set(machine,"voices",atol(val),NULL); } else if(!strcmp(key,"name")) { g_object_set(machine,"id",val,NULL); } else { GST_WARNING("unhandled property '%s'",key); res=FALSE; } if(is_prop && properties) { // take ownership of the strings g_hash_table_replace(properties,key,val); key=val=NULL; } g_object_unref(machine); } g_free(mid);g_free(key);g_free(val); break; } case METHOD_ADD_WIRE: { gchar *smid,*dmid; smid=g_match_info_fetch(match_info,1); dmid=g_match_info_fetch(match_info,2); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s]",smid,dmid); g_object_get(self->priv->app,"song",&song,NULL); smachine=bt_setup_get_machine_by_id(self->priv->setup, smid); dmachine=bt_setup_get_machine_by_id(self->priv->setup, dmid); if(smachine && dmachine) { GHashTable *properties; gdouble pos_xs,pos_ys,pos_xe,pos_ye; BtMachineCanvasItem *src_machine_item,*dst_machine_item; wire=bt_wire_new(song,smachine,dmachine,NULL); g_object_unref(wire); g_object_get(smachine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&pos_xs,&pos_ys); g_object_get(dmachine,"properties",&properties,NULL); machine_view_get_machine_position(properties,&pos_xe,&pos_ye); // draw wire src_machine_item=g_hash_table_lookup(self->priv->machines,smachine); dst_machine_item=g_hash_table_lookup(self->priv->machines,dmachine); wire_item_new(self,wire,pos_xs,pos_ys,pos_xe,pos_ye,src_machine_item,dst_machine_item); gnome_canvas_item_lower_to_bottom(self->priv->grid); res=TRUE; } g_object_try_unref(smachine); g_object_try_unref(dmachine); g_object_unref(song); g_free(smid); g_free(dmid); break; } case METHOD_REM_WIRE: { gchar *smid,*dmid; smid=g_match_info_fetch(match_info,1); dmid=g_match_info_fetch(match_info,2); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s]",smid,dmid); smachine=bt_setup_get_machine_by_id(self->priv->setup, smid); dmachine=bt_setup_get_machine_by_id(self->priv->setup, dmid); if(smachine && dmachine) { if((wire=bt_setup_get_wire_by_machines(self->priv->setup,smachine,dmachine))) { bt_setup_remove_wire(self->priv->setup,wire); g_object_unref(wire); res=TRUE; } } g_object_try_unref(smachine); g_object_try_unref(dmachine); g_free(smid); g_free(dmid); break; } case METHOD_SET_WIRE_PROPERTY: { gchar *smid,*dmid,*key,*val; GHashTable *properties; smid=g_match_info_fetch(match_info,1); dmid=g_match_info_fetch(match_info,2); key=g_match_info_fetch(match_info,3); val=g_match_info_fetch(match_info,4); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%s|%s]",smid,dmid,key,val); smachine=bt_setup_get_machine_by_id(self->priv->setup, smid); dmachine=bt_setup_get_machine_by_id(self->priv->setup, dmid); if(smachine && dmachine) { if((wire=bt_setup_get_wire_by_machines(self->priv->setup,smachine,dmachine))) { gboolean is_prop=FALSE; g_object_get(wire,"properties",&properties,NULL); if(!strcmp(key,"analyzer-shown")) { if(*val=='1') { bt_wire_show_analyzer_dialog(wire); } is_prop=TRUE; } else { GST_WARNING("unhandled property '%s'",key); res=FALSE; } if(is_prop && properties) { // take ownership of the strings g_hash_table_replace(properties,key,val); key=val=NULL; } g_object_unref(wire); } } g_object_try_unref(smachine); g_object_try_unref(dmachine); g_free(smid);g_free(dmid);g_free(key);g_free(val); break; } /* TODO: - machine parameters, wire parameters (volume/panorama) - only write them out on realease to not blast to much crap into the log - open/close machine/wire windows - we do it on remove right, but we don't know about intermediate changes as thats stll done on canvas-item classes - the canvas-items now expose their dialogs as a read-only (widget) property, we can listen to the notify */ default: GST_WARNING("unhandled undo/redo method: [%s]",data); } GST_INFO("undo/redo: %s : [%s]",(res?"okay":"failed"),data); return res; } static void bt_main_page_machines_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data) { BtChangeLoggerInterface * const iface = g_iface; iface->change = bt_main_page_machines_change_logger_change; } //-- wrapper //-- class internals static gboolean bt_main_page_machines_focus(GtkWidget *widget, GtkDirectionType direction) { BtMainPageMachines *self = BT_MAIN_PAGE_MACHINES(widget); BtMainWindow *main_window; GST_DEBUG("focusing default widget"); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->canvas)); /* use status bar */ g_object_get(self->priv->app,"main-window",&main_window,NULL); if(main_window) { /* it would be nice if we could just do: * bt_child_proxy_set(self->priv->app,"main-window::statusbar::status",_(".."),NULL); */ bt_child_proxy_set(main_window,"statusbar::status",_("Add new machines from right click context menu. Connect machines with shift+drag from source to target."),NULL); g_object_unref(main_window); } return FALSE; } static void bt_main_page_machines_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMainPageMachines *self = BT_MAIN_PAGE_MACHINES(object); return_if_disposed(); switch (property_id) { case MAIN_PAGE_MACHINES_CANVAS: { g_value_set_object(value, self->priv->canvas); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_main_page_machines_dispose(GObject *object) { BtMainPageMachines *self = BT_MAIN_PAGE_MACHINES(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); GST_DEBUG(" unrefing popups"); g_object_try_unref(self->priv->wire_gain); if(self->priv->vol_popup) { bt_volume_popup_hide(self->priv->vol_popup); gtk_widget_destroy(GTK_WIDGET(self->priv->vol_popup)); } g_object_try_unref(self->priv->wire_pan); if(self->priv->pan_popup) { bt_panorama_popup_hide(self->priv->pan_popup); gtk_widget_destroy(GTK_WIDGET(self->priv->pan_popup)); } //g_hash_table_foreach_remove(self->priv->machines,canvas_item_destroy,NULL); //g_hash_table_foreach_remove(self->priv->wires,canvas_item_destroy,NULL); g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_changed,NULL); g_object_try_unref(self->priv->setup); g_object_unref(self->priv->change_log); g_object_unref(self->priv->app); gtk_widget_destroy(GTK_WIDGET(self->priv->context_menu)); g_object_unref(self->priv->context_menu); gtk_widget_destroy(GTK_WIDGET(self->priv->grid_density_menu)); g_object_unref(self->priv->grid_density_menu); gdk_cursor_unref(self->priv->drag_cursor); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_page_machines_parent_class)->dispose(object); } static void bt_main_page_machines_finalize(GObject *object) { BtMainPageMachines *self = BT_MAIN_PAGE_MACHINES(object); g_hash_table_destroy(self->priv->machines); g_hash_table_destroy(self->priv->wires); G_OBJECT_CLASS(bt_main_page_machines_parent_class)->finalize(object); } static void bt_main_page_machines_init(BtMainPageMachines *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGE_MACHINES, BtMainPageMachinesPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->zoom=MACHINE_VIEW_ZOOM_FC; self->priv->grid_density=1; self->priv->machines=g_hash_table_new(NULL,NULL); self->priv->wires=g_hash_table_new(NULL,NULL); // the cursor for dragging self->priv->drag_cursor=gdk_cursor_new(GDK_FLEUR); self->priv->scroll_x=self->priv->scroll_y=0.5; // the undo/redo changelogger self->priv->change_log=bt_change_log_new(); bt_change_log_register(self->priv->change_log,BT_CHANGE_LOGGER(self)); } static void bt_main_page_machines_class_init(BtMainPageMachinesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainPageMachinesPrivate)); gobject_class->get_property = bt_main_page_machines_get_property; gobject_class->dispose = bt_main_page_machines_dispose; gobject_class->finalize = bt_main_page_machines_finalize; gtkwidget_class->focus = bt_main_page_machines_focus; g_object_class_install_property(gobject_class,MAIN_PAGE_MACHINES_CANVAS, g_param_spec_object("canvas", "canvas prop", "Get the machine canvas", GNOME_TYPE_CANVAS, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/settings-page-interaction-controller.c0000644042355400116100000002246211576360376022102 00000000000000/* $Id: settings-page-interaction-controller.c 3310 2011-04-08 21:25:01Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingspageinteractioncontroller * @short_description: interaction controller configuration settings page * * Lists available interaction controller devices and allows to select * controllers that should be used. */ #define BT_EDIT #define BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_C #include "bt-edit.h" enum { DEVICE_MENU_LABEL=0 }; enum { CONTROLLER_LIST_LABEL=0 }; struct _BtSettingsPageInteractionControllerPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; GtkComboBox *device_menu; GtkTreeView *controller_list; }; //-- the class G_DEFINE_TYPE (BtSettingsPageInteractionController, bt_settings_page_interaction_controller, GTK_TYPE_TABLE); //-- event handler static void on_device_menu_changed(GtkComboBox *combo_box, gpointer user_data) { BtSettingsPageInteractionController *self=BT_SETTINGS_PAGE_INTERACTION_CONTROLLER(user_data); GObject *device=NULL; BtIcControl *control; BtObjectListModel *store; GtkTreeModel *model; GtkTreeIter iter; GList *node,*list; GST_INFO("interaction controller device changed"); model=gtk_combo_box_get_model(self->priv->device_menu); if(gtk_combo_box_get_active_iter(self->priv->device_menu,&iter)) { device=bt_object_list_model_get_object(BT_OBJECT_LIST_MODEL(model),&iter); } // update list of controllers store=bt_object_list_model_new(1,BTIC_TYPE_CONTROL,"name"); if(device) { g_object_get(device,"controls",&list,NULL); for(node=list;node;node=g_list_next(node)) { control=BTIC_CONTROL(node->data); bt_object_list_model_append(store,(GObject *)control); } g_list_free(list); } GST_INFO("control list refreshed"); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->controller_list),(device!=NULL)); gtk_tree_view_set_model(self->priv->controller_list,GTK_TREE_MODEL(store)); g_object_unref(store); // drop with treeview } static void on_ic_registry_devices_changed(BtIcRegistry *ic_registry,GParamSpec *arg,gpointer user_data) { BtSettingsPageInteractionController *self=BT_SETTINGS_PAGE_INTERACTION_CONTROLLER(user_data); BtIcDevice *device=NULL; GList *node,*list; BtObjectListModel *store; GST_INFO("refreshing device menu"); store=bt_object_list_model_new(1,BTIC_TYPE_DEVICE,"name"); g_object_get(ic_registry,"devices",&list,NULL); for(node=list;node;node=g_list_next(node)) { device=BTIC_DEVICE(node->data); bt_object_list_model_append(store,(GObject *)device); } g_list_free(list); GST_INFO("device menu refreshed"); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->device_menu),(device!=NULL)); gtk_combo_box_set_model(self->priv->device_menu,GTK_TREE_MODEL(store)); gtk_combo_box_set_active(self->priv->device_menu,((device!=NULL)?0:-1)); g_object_unref(store); // drop with comboxbox } //-- helper methods static void bt_settings_page_interaction_controller_init_ui(const BtSettingsPageInteractionController *self) { GtkWidget *label,*spacer, *scrolled_window; GtkCellRenderer *renderer; BtIcRegistry *ic_registry; gchar *str; gtk_widget_set_name(GTK_WIDGET(self),"interaction controller settings"); // add setting widgets spacer=gtk_label_new(" "); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Interaction Controller")); gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(self),spacer, 0, 1, 1, 4, GTK_SHRINK,GTK_SHRINK, 2,1); label=gtk_label_new(_("Device")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); self->priv->device_menu=GTK_COMBO_BOX(gtk_combo_box_new()); /* @todo: add icon: midi, joystick (from hal?) * /usr/share/icons/gnome/24x24/stock/media/stock_midi.png * /usr/share/gtk-doc/html/libgimpwidgets/stock-controller-midi-16.png * /usr/share/icons/Tango/22x22/devices/joystick.png */ renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->device_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->device_menu),renderer,"text",DEVICE_MENU_LABEL,NULL); // get list of devices from libbtic and listen to changes g_object_get(self->priv->app,"ic-registry",&ic_registry,NULL); g_signal_connect(ic_registry,"notify::devices",G_CALLBACK(on_ic_registry_devices_changed),(gpointer)self); on_ic_registry_devices_changed(ic_registry,NULL,(gpointer)self); g_object_unref(ic_registry); gtk_combo_box_set_active(self->priv->device_menu,0); gtk_table_attach(GTK_TABLE(self),GTK_WIDGET(self->priv->device_menu), 2, 3, 1, 2, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); g_signal_connect(self->priv->device_menu, "changed", G_CALLBACK(on_device_menu_changed), (gpointer)self); // add list of controllers (updated when selecting a device) scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_ETCHED_IN); self->priv->controller_list=GTK_TREE_VIEW(gtk_tree_view_new()); /* @todo: add icon: trigger=button, range=knob/slider (from glade?) * /usr/share/glade3/pixmaps/hicolor/22x22/actions/ * /usr/share/icons/gnome/22x22/apps/volume-knob.png */ renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_tree_view_insert_column_with_attributes(self->priv->controller_list,-1,_("Controller"),renderer, "text",CONTROLLER_LIST_LABEL, NULL); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(self->priv->controller_list),GTK_SELECTION_BROWSE); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->controller_list)); gtk_table_attach(GTK_TABLE(self),GTK_WIDGET(scrolled_window), 1, 3, 2, 3, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); /* @todo: add "Learn" and "Tune" buttons * Learn: train new controllers (BTIC_IS_LEARN(device)) * Tune: learn real range (useful if real range is less than the one defined by the api */ on_device_menu_changed(self->priv->device_menu,(gpointer)self); } //-- constructor methods /** * bt_settings_page_interaction_controller_new: * * Create a new instance * * Returns: the new instance */ BtSettingsPageInteractionController *bt_settings_page_interaction_controller_new(void) { BtSettingsPageInteractionController *self; self=BT_SETTINGS_PAGE_INTERACTION_CONTROLLER(g_object_new(BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER, "n-rows",3, "n-columns",3, "homogeneous",FALSE, NULL)); bt_settings_page_interaction_controller_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_page_interaction_controller_dispose(GObject *object) { BtSettingsPageInteractionController *self = BT_SETTINGS_PAGE_INTERACTION_CONTROLLER(object); BtIcRegistry *ic_registry; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"ic-registry",&ic_registry,NULL); g_signal_handlers_disconnect_matched(ic_registry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,G_CALLBACK(on_ic_registry_devices_changed),(gpointer)self); g_object_unref(ic_registry); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_page_interaction_controller_parent_class)->dispose(object); } static void bt_settings_page_interaction_controller_init(BtSettingsPageInteractionController *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER, BtSettingsPageInteractionControllerPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_page_interaction_controller_class_init(BtSettingsPageInteractionControllerClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsPageInteractionControllerPrivate)); gobject_class->dispose = bt_settings_page_interaction_controller_dispose; } buzztard-0.6.0/src/ui/edit/bt-edit.hildon.gtkrc0000644042355400116100000000301711576360376016321 00000000000000# custom styles for buzztard-edit (hildon/maemo specific) # the shaded backgrounds may actually be meant as a warning. # I believe the background was coloured when scaling was applied to help show # which bits were a problem # Icon sizes gtk-toolbar-icon-size = GTK_ICON_SIZE_SMALL_TOOLBAR gtk-icon-sizes = "gtk-menu=16,16:gtk-button=24,24:gtk-small-toolbar=24,24:gtk-large-toolbar=32,32:gtk-dnd=24,24:gtk-dialog=32,32:" style "default-style" { # modify the x/ythickness, used for spacing all over the place xthickness = 1 ythickness = 1 # modify base font font_name = "Nokia Sans 12" # one can set so called "style properties" GtkArrow::arrow-scaling = 0.5 GtkButton::inner-border = {0, 0, 0, 0} GtkButton::image-spacing = 1 GtkButton::separator-height = 10 GtkCheckButton::indicator-size = 12 GtkComboBox::arrow-size = 12 GtkDialog::padding = {6, 6, 0, 4} GtkRange::slider-width = 10 #GtkRange::stepper_size = 12 #GtkScale::slider-length = 20 #GtkScale::slider-width = 20 GtkScrolledWindow::scrollbar-spacing = 0 GtkToolbar::max_child_expand = 24 } class "GtkWidget" style "default-style" style "small-font-style" { # modify base font font_name = "Nokia Sans 10" } widget "*.status-bar.*" style "small-font-style" #style "hildon-tap-hold" #{ # GtkWidget::tap-hold = 1 #} #class "BtPatternEditor" style "hildon-tap-hold" #class "GnomeCanvas" style "hildon-tap-hold" style "osso-ButtonFont" { font_name = "Nokia Sans 12" } include "bt-edit.gtkrc" buzztard-0.6.0/src/ui/edit/machine-list-model.c0000644042355400116100000003366511634612124016276 00000000000000/* $Id: machine-list-model.c 3638 2011-09-16 09:18:11Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinelistmodel * @short_description: data model class for widgets showing machines of a song * * A generic model representing the machines of a song, suitable for combo-boxes * and treeview widgets. */ #define BT_EDIT #define BT_MACHINE_LIST_MODEL_C #include "bt-edit.h" //-- defines #define N_COLUMNS __BT_MACHINE_MODEL_N_COLUMNS //-- property ids //-- structs struct _BtMachineListModelPrivate { gint stamp; BtSetup *setup; GType param_types[N_COLUMNS]; GSequence *seq; }; //-- the class static void bt_machine_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtMachineListModel, bt_machine_list_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, bt_machine_list_model_tree_model_init)); //-- helper static void on_machine_id_changed(BtMachine *machine,GParamSpec *arg,gpointer user_data); // we are comparing by type and name static gint model_item_cmp(gconstpointer a,gconstpointer b,gpointer data) { BtMachine *ma=(BtMachine *)a; BtMachine *mb=(BtMachine *)b; gint ra=0,rb=0; if(a==b) return 0; if(BT_IS_SINK_MACHINE(ma)) ra=2; else if(BT_IS_PROCESSOR_MACHINE(ma)) ra=4; else if(BT_IS_SOURCE_MACHINE(ma)) ra=6; if(BT_IS_SINK_MACHINE(mb)) rb=2; else if(BT_IS_PROCESSOR_MACHINE(mb)) rb=4; else if(BT_IS_SOURCE_MACHINE(mb)) rb=6; GST_LOG("comparing %s <-> %s: %d <-> %d",GST_OBJECT_NAME(ma),GST_OBJECT_NAME(mb),ra,rb); if(ra==rb) { gchar *ida,*idb; gint c; g_object_get(ma,"id",&ida,NULL); g_object_get(mb,"id",&idb,NULL); c=strcmp(ida,idb); if(c>0) rb+=1; else if(c<0) ra+=1; GST_LOG("comparing %s <-> %s: %d: %d <-> %d",ida,idb,c,ra,rb); g_free(ida);g_free(idb); } return (rb-ra); } static void bt_machine_list_model_add(BtMachineListModel *model,BtMachine *machine) { GSequence *seq=model->priv->seq; GtkTreePath *path; GtkTreeIter iter; gint position; GST_INFO_OBJECT(machine,"add machine to model"); // insert new entry iter.stamp=model->priv->stamp; iter.user_data=g_sequence_insert_sorted(seq,machine,model_item_cmp,NULL); position=g_sequence_iter_get_position(iter.user_data); g_signal_connect(machine,"notify::id",G_CALLBACK(on_machine_id_changed),(gpointer)model); // signal to the view/app path=gtk_tree_path_new(); gtk_tree_path_append_index(path,position); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } static void bt_machine_list_model_rem(BtMachineListModel *model,BtMachine *machine) { GSequence *seq=model->priv->seq; GtkTreePath *path; GSequenceIter *iter; gint position; GST_INFO_OBJECT(machine,"removing machine from model"); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_id_changed,(gpointer)model); // remove entry #if GLIB_CHECK_VERSION(2,28,0) iter=g_sequence_lookup(seq,machine,model_item_cmp,NULL); #else iter=g_sequence_iter_prev(g_sequence_search(seq,machine,model_item_cmp,NULL)); #endif position=g_sequence_iter_get_position(iter); g_sequence_remove(iter); // signal to the view/app path=gtk_tree_path_new(); gtk_tree_path_append_index(path,position); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model),path); gtk_tree_path_free(path); GST_INFO_OBJECT(machine,"removed machine from model at pos %d ", position); } //-- signal handlers static void on_machine_id_changed(BtMachine *machine,GParamSpec *arg,gpointer user_data) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(user_data); GSequence *seq=model->priv->seq; GtkTreePath *path; GtkTreeIter iter; gint pos1,pos2=-1; // find the item by machine (cannot use model_item_cmp, as id has changed) iter.stamp=model->priv->stamp; for(pos1=0;pos1 %d",pos1,pos2); // signal updates if(pos1!=pos2) { path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos1); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model),path); gtk_tree_path_free(path); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos2); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } else { path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos2); gtk_tree_model_row_changed(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } } static void on_machine_added(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(user_data); bt_machine_list_model_add(model,machine); } static void on_machine_removed(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(user_data); bt_machine_list_model_rem(model,machine); } //-- constructor methods /** * bt_machine_list_model_new: * @setup: the setup * * Creates a list model of machines for the @setup. The model is automatically * updated when machines are added, removed or changed. * * Returns: the machine model. */ BtMachineListModel *bt_machine_list_model_new(BtSetup *setup) { BtMachineListModel *self; BtMachine *machine; GList *node,*list; self=g_object_new(BT_TYPE_MACHINE_LIST_MODEL, NULL); self->priv->setup=setup; g_object_add_weak_pointer((GObject *)setup,(gpointer *)&self->priv->setup); self->priv->param_types[BT_MACHINE_MODEL_ICON]=GDK_TYPE_PIXBUF; self->priv->param_types[BT_MACHINE_MODEL_LABEL]=G_TYPE_STRING; // get machine list from setup g_object_get((gpointer)setup,"machines",&list,NULL); // add machines for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); // we take no extra ref on the machines here bt_machine_list_model_add(self,machine); } g_list_free(list); g_signal_connect(setup,"machine-added",G_CALLBACK(on_machine_added),(gpointer)self); g_signal_connect(setup,"machine-removed",G_CALLBACK(on_machine_removed),(gpointer)self); return(self); } //-- methods /** * bt_machine_list_model_get_object: * @model: the model * @iter: the iter * * The the #BtMachine for the iter. */ BtMachine *bt_machine_list_model_get_object(BtMachineListModel *model,GtkTreeIter *iter) { return(g_sequence_get(iter->user_data)); } //-- tree model interface static GtkTreeModelFlags bt_machine_list_model_tree_model_get_flags(GtkTreeModel *tree_model) { return(GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY); } static gint bt_machine_list_model_tree_model_get_n_columns(GtkTreeModel *tree_model) { return(N_COLUMNS); } static GType bt_machine_list_model_tree_model_get_column_type(GtkTreeModel *tree_model,gint index) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); g_return_val_if_fail(indexpriv->param_types[index]); } static gboolean bt_machine_list_model_tree_model_get_iter(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreePath *path) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); GSequence *seq=model->priv->seq; gint i=gtk_tree_path_get_indices (path)[0]; if(i>=g_sequence_get_length(seq)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_iter_at_pos(seq,i); return(TRUE); } static GtkTreePath *bt_machine_list_model_tree_model_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); GtkTreePath *path; g_return_val_if_fail(iter->stamp==model->priv->stamp,NULL); if(g_sequence_iter_is_end(iter->user_data)) return(NULL); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,g_sequence_iter_get_position(iter->user_data)); return(path); } static void bt_machine_list_model_tree_model_get_value(GtkTreeModel *tree_model,GtkTreeIter *iter,gint column,GValue *value) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); BtMachine *machine; g_return_if_fail(columnpriv->param_types[column]); if((machine=g_sequence_get(iter->user_data))) { switch(column) { case BT_MACHINE_MODEL_ICON: g_value_take_object(value,bt_ui_resources_get_icon_pixbuf_by_machine(machine)); break; case BT_MACHINE_MODEL_LABEL: g_object_get_property((GObject *)machine,"id",value); break; } } } static gboolean bt_machine_list_model_tree_model_iter_next(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); gboolean res; g_return_val_if_fail(model->priv->stamp==iter->stamp,FALSE); iter->user_data=g_sequence_iter_next(iter->user_data); if((res=g_sequence_iter_is_end(iter->user_data))) iter->stamp=0; return !res; } static gboolean bt_machine_list_model_tree_model_iter_children(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); /* this is a list, nodes have no children */ if (!parent) { if (g_sequence_get_length(model->priv->seq)>0) { iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_begin_iter(model->priv->seq); return(TRUE); } } iter->stamp=0; return(FALSE); } static gboolean bt_machine_list_model_tree_model_iter_has_child(GtkTreeModel *tree_model,GtkTreeIter *iter) { return(FALSE); } static gint bt_machine_list_model_tree_model_iter_n_children(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); if (iter == NULL) return g_sequence_get_length(model->priv->seq); g_return_val_if_fail(model->priv->stamp==iter->stamp,-1); return(0); } static gboolean bt_machine_list_model_tree_model_iter_nth_child(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent,gint n) { BtMachineListModel *model=BT_MACHINE_LIST_MODEL(tree_model); GSequenceIter *child; iter->stamp=0; if (parent) return(FALSE); child=g_sequence_get_iter_at_pos(model->priv->seq,n); if(g_sequence_iter_is_end(child)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=child; return(TRUE); } static gboolean bt_machine_list_model_tree_model_iter_parent(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *child) { iter->stamp=0; return(FALSE); } static void bt_machine_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data) { GtkTreeModelIface * const iface = g_iface; iface->get_flags = bt_machine_list_model_tree_model_get_flags; iface->get_n_columns = bt_machine_list_model_tree_model_get_n_columns; iface->get_column_type = bt_machine_list_model_tree_model_get_column_type; iface->get_iter = bt_machine_list_model_tree_model_get_iter; iface->get_path = bt_machine_list_model_tree_model_get_path; iface->get_value = bt_machine_list_model_tree_model_get_value; iface->iter_next = bt_machine_list_model_tree_model_iter_next; iface->iter_children = bt_machine_list_model_tree_model_iter_children; iface->iter_has_child = bt_machine_list_model_tree_model_iter_has_child; iface->iter_n_children = bt_machine_list_model_tree_model_iter_n_children; iface->iter_nth_child = bt_machine_list_model_tree_model_iter_nth_child; iface->iter_parent = bt_machine_list_model_tree_model_iter_parent; } //-- class internals static void bt_machine_list_model_finalize(GObject *object) { BtMachineListModel *self = BT_MACHINE_LIST_MODEL(object); GST_DEBUG("!!!! self=%p",self); if(self->priv->setup) { BtSetup *setup=self->priv->setup; BtMachine *machine; GList *list, *node; g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_added,(gpointer)self); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_removed,(gpointer)self); g_object_get((gpointer)setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_id_changed,(gpointer)self); } g_list_free(list); g_object_remove_weak_pointer((GObject *)setup,(gpointer *)&self->priv->setup); } g_sequence_free(self->priv->seq); G_OBJECT_CLASS(bt_machine_list_model_parent_class)->finalize(object); } static void bt_machine_list_model_init(BtMachineListModel *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self,BT_TYPE_MACHINE_LIST_MODEL,BtMachineListModelPrivate); self->priv->seq=g_sequence_new (NULL); // random int to check whether an iter belongs to our model self->priv->stamp=g_random_int(); } static void bt_machine_list_model_class_init(BtMachineListModelClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMachineListModelPrivate)); gobject_class->finalize = bt_machine_list_model_finalize; } buzztard-0.6.0/src/ui/edit/machine-menu.c0000644042355400116100000003301511620174357015164 00000000000000/* $Id: machine-menu.c 3527 2011-08-09 09:07:57Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinemenu * @short_description: class for the machine selection popup menu * * Builds a hierachical menu with usable machines from the GStreamer registry. */ #define BT_EDIT #define BT_MACHINE_MENU_C #include "bt-edit.h" //-- property ids enum { MACHINE_MENU_MACHINES_PAGE=1 }; struct _BtMachineMenuPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the machine page we belong to */ G_POINTER_ALIAS(BtMainPageMachines *,main_page_machines); }; //-- the class G_DEFINE_TYPE (BtMachineMenu, bt_machine_menu, GTK_TYPE_MENU); //-- event handler static void on_source_machine_add_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMachineMenu *self=BT_MACHINE_MENU(user_data); gchar *name,*id; name=(gchar *)gtk_widget_get_name(GTK_WIDGET(menuitem)); id=(gchar*)gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem)))); GST_DEBUG("adding source machine \"%s\" : \"%s\"",name,id); bt_main_page_machines_add_source_machine(self->priv->main_page_machines, id, name); } static void on_processor_machine_add_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMachineMenu *self=BT_MACHINE_MENU(user_data); gchar *name,*id; name=(gchar *)gtk_widget_get_name(GTK_WIDGET(menuitem)); id=(gchar*)gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem)))); GST_DEBUG("adding processor machine \"%s\"",name); bt_main_page_machines_add_processor_machine(self->priv->main_page_machines, id, name); } //-- helper methods static gint bt_machine_menu_compare(GstPluginFeature *f1, GstPluginFeature *f2) { #if 0 // @todo: this is fragmenting memory :/ gchar *str1c=g_utf8_casefold(gst_plugin_feature_get_name(f1),-1); gchar *str2c=g_utf8_casefold(gst_plugin_feature_get_name(f2),-1); gint res=g_utf8_collate(str1c,str2c); g_free(str1c); g_free(str2c); return(res); #else return(strcasecmp(gst_plugin_feature_get_name(f1),gst_plugin_feature_get_name(f2))); #endif } static gboolean bt_machine_menu_check_pads(const GList *pads) { const GList *node; gint pad_dir_ct[4]={0,}; for(node=pads;node;node=g_list_next(node)) { pad_dir_ct[((GstStaticPadTemplate *)(node->data))->direction]++; } // skip everything with more that one src or sink pad if((pad_dir_ct[GST_PAD_SRC]>1) || (pad_dir_ct[GST_PAD_SINK]>1)) { GST_DEBUG("%d src pads, %d sink pads", pad_dir_ct[GST_PAD_SRC], pad_dir_ct[GST_PAD_SINK]); return FALSE; } return TRUE; } static int blacklist_compare(const void *node1, const void *node2) { //GST_DEBUG("comparing '%s' '%s'",*(gchar**)node1,*(gchar**)node2); return (strcasecmp(*(gchar **)node1,*(gchar**)node2)); } static void bt_machine_menu_init_submenu(const BtMachineMenu *self,GtkWidget *submenu, const gchar *root, GCallback handler) { GtkWidget *menu_item,*parentmenu; GList *node,*element_factories; GstElementFactory *factory; GstPluginFeature *loaded_feature; GHashTable *parent_menu_hash; const gchar *klass_name,*menu_name,*plugin_name,*factory_name; GType type; gboolean have_submenu; /* list known gstreamer element that are not useful unde buzztard, * but we can't detect otherwise */ const gchar *blacklist[] = { "audiorate", "dtmfsrc", "memoryaudiosrc", "rglimiter", "rgvolume", "sfsrc" }; // scan registered sources element_factories=bt_gst_registry_get_element_factories_matching_all_categories(root); parent_menu_hash=g_hash_table_new_full(g_str_hash,g_str_equal,g_free,NULL); // sort list by name // eventually first filter and sort remaining factories into a new list element_factories=g_list_sort(element_factories,(GCompareFunc)bt_machine_menu_compare); for(node=element_factories;node;node=g_list_next(node)) { factory=node->data; factory_name=gst_plugin_feature_get_name((GstPluginFeature *)factory); // @todo: we could also hide elements without controlable parameters, // that derive from basesrc, but not from pushsrc // this could help to hide "dtmfsrc" and "sfsrc" // for this it would be helpful to get a src/sink hint from the previous function // lets simply blacklist for now if(bsearch(&factory_name, blacklist, G_N_ELEMENTS(blacklist), sizeof(gchar *), blacklist_compare)) { GST_INFO("skipping backlisted element : '%s'",factory_name); continue; } // skip elements with too many pads if(!(bt_machine_menu_check_pads(gst_element_factory_get_static_pad_templates(factory)))) { GST_INFO("skipping uncompatible element : '%s'",factory_name); continue; } klass_name=gst_element_factory_get_klass(factory); GST_LOG("adding element : '%s' with classification: '%s'",factory_name,klass_name); // by default we would add the new element here parentmenu=submenu; have_submenu=FALSE; // add sub-menus for BML, LADSPA & Co. // remove prefix, e.g. 'Source/Audio' klass_name=&klass_name[strlen(root)]; if(*klass_name) { GtkWidget *cached_menu; gchar **names; gchar *menu_path; gint i,len=1; GST_LOG(" subclass : '%s'",klass_name); // created nested menues names=g_strsplit(&klass_name[1],"/",0); for(i=0;i we only filter, if plugin_name // is also in klass_name (for now we just check if klass_name is !empty) // @bug: see http://bugzilla.gnome.org/show_bug.cgi?id=571832 if(BT_IS_STRING(klass_name) && (plugin_name=GST_PLUGIN_FEATURE(factory)->plugin_name)) { gint len=strlen(plugin_name); GST_LOG("%s:%s, %c",plugin_name,menu_name,menu_name[len]); // remove prefix "-" if(!strncasecmp(menu_name,plugin_name,len) && menu_name[len]=='-') { menu_name=&menu_name[len+1]; } } menu_item=gtk_menu_item_new_with_label(menu_name); gtk_widget_set_name(menu_item,factory_name); gtk_menu_shell_append(GTK_MENU_SHELL(parentmenu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(handler),(gpointer)self); } g_hash_table_destroy(parent_menu_hash); gst_plugin_feature_list_free(element_factories); } static void bt_machine_menu_init_ui(const BtMachineMenu *self) { GtkWidget *menu_item,*submenu,*image; gtk_widget_set_name(GTK_WIDGET(self),"add machine menu"); // generators menu_item=gtk_image_menu_item_new_with_label(_("Generators")); // red machine icon gtk_menu_shell_append(GTK_MENU_SHELL(self),menu_item); image=bt_ui_resources_get_icon_image_by_machine_type(BT_TYPE_SOURCE_MACHINE); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); // add another submenu submenu=gtk_menu_new(); gtk_widget_set_name(submenu,"generators menu"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),submenu); bt_machine_menu_init_submenu(self,submenu,"Source/Audio",G_CALLBACK(on_source_machine_add_activated)); // effects menu_item=gtk_image_menu_item_new_with_label(_("Effects")); // green machine icon gtk_menu_shell_append(GTK_MENU_SHELL(self),menu_item); image=bt_ui_resources_get_icon_image_by_machine_type(BT_TYPE_PROCESSOR_MACHINE); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); // add another submenu submenu=gtk_menu_new(); gtk_widget_set_name(submenu,"effects menu"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),submenu); bt_machine_menu_init_submenu(self,submenu,"Filter/Effect/Audio",G_CALLBACK(on_processor_machine_add_activated)); } //-- constructor methods /** * bt_machine_menu_new: * @main_page_machines: the machine page for the menu * * Create a new instance * * Returns: the new instance */ BtMachineMenu *bt_machine_menu_new(const BtMainPageMachines *main_page_machines) { BtMachineMenu *self; self=BT_MACHINE_MENU(g_object_new(BT_TYPE_MACHINE_MENU,"machines-page",main_page_machines,NULL)); bt_machine_menu_init_ui(self); return(self); } //-- methods //-- class internals static void bt_machine_menu_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachineMenu *self = BT_MACHINE_MENU(object); return_if_disposed(); switch (property_id) { case MACHINE_MENU_MACHINES_PAGE: { g_object_try_weak_unref(self->priv->main_page_machines); self->priv->main_page_machines = BT_MAIN_PAGE_MACHINES(g_value_get_object(value)); g_object_try_weak_ref(self->priv->main_page_machines); //GST_DEBUG("set the main_page_machines for machine_menu: %p",self->priv->main_page_machines); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_menu_dispose(GObject *object) { BtMachineMenu *self = BT_MACHINE_MENU(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->main_page_machines); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_machine_menu_parent_class)->dispose(object); } static void bt_machine_menu_init(BtMachineMenu *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_MENU, BtMachineMenuPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_machine_menu_class_init(BtMachineMenuClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMachineMenuPrivate)); gobject_class->set_property = bt_machine_menu_set_property; gobject_class->dispose = bt_machine_menu_dispose; g_object_class_install_property(gobject_class,MACHINE_MENU_MACHINES_PAGE, g_param_spec_object("machines-page", "machines-page contruct prop", "Set application object, the window belongs to", BT_TYPE_MAIN_PAGE_MACHINES, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/main-window.h0000644042355400116100000000553611625722250015057 00000000000000/* $Id: main-window.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_WINDOW_H #define BT_MAIN_WINDOW_H #include #include #define BT_TYPE_MAIN_WINDOW (bt_main_window_get_type ()) #define BT_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_WINDOW, BtMainWindow)) #define BT_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_WINDOW, BtMainWindowClass)) #define BT_IS_MAIN_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_WINDOW)) #define BT_IS_MAIN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_WINDOW)) #define BT_MAIN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_WINDOW, BtMainWindowClass)) /* type macros */ typedef struct _BtMainWindow BtMainWindow; typedef struct _BtMainWindowClass BtMainWindowClass; typedef struct _BtMainWindowPrivate BtMainWindowPrivate; /** * BtMainWindow: * * the root window for the editor application */ struct _BtMainWindow { #ifndef USE_HILDON GtkWindow parent; #else HildonWindow parent; #endif /*< private >*/ BtMainWindowPrivate *priv; }; struct _BtMainWindowClass { #ifndef USE_HILDON GtkWindowClass parent; #else HildonWindowClass parent; #endif }; GType bt_main_window_get_type(void) G_GNUC_CONST; BtMainWindow *bt_main_window_new(void); gboolean bt_main_window_check_unsaved_song(const BtMainWindow *self,const gchar *title,const gchar *headline); gboolean bt_main_window_check_quit(const BtMainWindow *self); void bt_main_window_new_song(const BtMainWindow *self); void bt_main_window_open_song(const BtMainWindow *self); void bt_main_window_save_song(const BtMainWindow *self); void bt_main_window_save_song_as(const BtMainWindow *self); /* helper for simple message/question dialogs */ void bt_dialog_message(const BtMainWindow *self,const gchar *title,const gchar *headline,const gchar *message); gboolean bt_dialog_question(const BtMainWindow *self,const gchar *title,const gchar *headline,const gchar *message); #endif // BT_MAIN_WINDOW_H buzztard-0.6.0/src/ui/edit/edit-application.h0000644042355400116100000000657011625722250016053 00000000000000/* $Id: edit-application.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_EDIT_APPLICATION_H #define BT_EDIT_APPLICATION_H #include #include #define BT_TYPE_EDIT_APPLICATION (bt_edit_application_get_type ()) #define BT_EDIT_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_EDIT_APPLICATION, BtEditApplication)) #define BT_EDIT_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_EDIT_APPLICATION, BtEditApplicationClass)) #define BT_IS_EDIT_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_EDIT_APPLICATION)) #define BT_IS_EDIT_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_EDIT_APPLICATION)) #define BT_EDIT_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_EDIT_APPLICATION, BtEditApplicationClass)) /* type macros */ typedef struct _BtEditApplication BtEditApplication; typedef struct _BtEditApplicationClass BtEditApplicationClass; typedef struct _BtEditApplicationPrivate BtEditApplicationPrivate; /** * BtEditApplication: * * #BtApplication subclass for the gtk editor application */ struct _BtEditApplication { BtApplication parent; /*< private >*/ BtEditApplicationPrivate *priv; }; struct _BtEditApplicationClass { BtApplicationClass parent; void (*song_changed)(const BtEditApplication *app, gpointer user_data); }; GType bt_edit_application_get_type(void) G_GNUC_CONST; BtEditApplication *bt_edit_application_new(void); gboolean bt_edit_application_new_song(const BtEditApplication *self); gboolean bt_edit_application_load_song(const BtEditApplication *self,const char *file_name); gboolean bt_edit_application_save_song(const BtEditApplication *self,const char *file_name); gboolean bt_edit_application_run(const BtEditApplication *self); gboolean bt_edit_application_load_and_run(const BtEditApplication *self, const gchar *input_file_name); gboolean bt_edit_application_quit(const BtEditApplication *self); void bt_edit_application_show_about(const BtEditApplication *self); void bt_edit_application_show_tip(const BtEditApplication *self); void bt_edit_application_crash_log_recover(const BtEditApplication *self); void bt_edit_application_attach_child_window(const BtEditApplication *self, GtkWindow *window); void bt_edit_application_ui_lock(const BtEditApplication *self); void bt_edit_application_ui_unlock(const BtEditApplication *self); gboolean bt_edit_application_is_song_unsaved(const BtEditApplication *self); void bt_edit_application_set_song_unsaved(const BtEditApplication *self); #endif // BT_EDIT_APPLICATION_H buzztard-0.6.0/src/ui/edit/marshal.h0000644042355400116100000000117711667370663014267 00000000000000 #ifndef __bt_marshal_MARSHAL_H__ #define __bt_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* VOID:OBJECT,OBJECT (./marshal.list:1) */ extern void bt_marshal_VOID__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 /* __bt_marshal_MARSHAL_H__ */ buzztard-0.6.0/src/ui/edit/machine-properties-dialog.c0000644042355400116100000030743011670212101017637 00000000000000/* $Id: machine-properties-dialog.c 3766 2011-12-08 19:47:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinepropertiesdialog * @short_description: machine realtime parameters * @see_also: #BtMachine * * A dialog to configure dynamic settings of a #BtMachine. The dialog also * allows to editing and manage presets for machines that support them. */ /* @todo: play machines * - we want to assign a note-controller to a machines note-trigger property * and boolean-trigger controller to machines trigger properties * - right now we don't show widgets for these * * @todo: add copy and paste (pattern data) * - context menu for controls, "copy/paste value", "copy/paste group", "copy/paste all" * - context menu for expanders "copy/paste group" */ #define BT_EDIT #define BT_MACHINE_PROPERTIES_DIALOG_C #include "bt-edit.h" #define DEFAULT_LABEL_WIDTH 70 //-- property ids enum { MACHINE_PROPERTIES_DIALOG_MACHINE=1 }; struct _BtMachinePropertiesDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the underlying machine */ BtMachine *machine; gulong voices; const gchar *help_uri; GtkWidget *main_toolbar,*preset_toolbar; GtkWidget *preset_box; GtkWidget *preset_list; GtkWidget *param_group_box; /* need this to remove right expander when wire is removed */ GHashTable *group_to_object; /* num_global={0,1}, num_voices is voices above */ guint num_global, num_wires; /* expander to param group */ GHashTable *param_groups; /* context menus */ GtkMenu *group_menu; GtkMenu *param_menu[2]; // we have two controller types /* first real child for setting a sane focus */ GtkWidget *first_widget; }; static GQuark wdget_peer_quark=0; static GQuark widget_parent_quark=0; static GQuark control_object_quark=0; static GQuark control_property_quark=0; static GQuark widget_param_group_quark=0; /* points to ParamGroup */ static GQuark widget_param_num_quark=0; /* which parameter inside the group */ enum { PRESET_LIST_LABEL=0, PRESET_LIST_COMMENT }; //-- the class G_DEFINE_TYPE (BtMachinePropertiesDialog, bt_machine_properties_dialog, GTK_TYPE_WINDOW); //-- idle update helper typedef struct { const GstElement *machine; GParamSpec *property; gpointer user_data; } BtNotifyIdleData; #define MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data) G_STMT_START { \ data=g_slice_new(BtNotifyIdleData); \ data->machine=machine; \ data->property=property; \ data->user_data=user_data; \ g_object_add_weak_pointer(data->user_data,&data->user_data); \ } G_STMT_END #define FREE_NOTIFY_IDLE_DATA(data) G_STMT_START { \ if(data->user_data) g_object_remove_weak_pointer(data->user_data,&data->user_data); \ g_slice_free(BtNotifyIdleData,data); \ } G_STMT_END //-- wire, global or voice params groups typedef struct { gint num_params; GstObject **parent; GParamSpec **property; } ParamGroup; static ParamGroup *make_param_group(gint num_params) { ParamGroup *pg=g_slice_new(ParamGroup); pg->num_params=num_params; pg->parent=g_slice_alloc0(sizeof(gpointer)*num_params); pg->property=g_slice_alloc0(sizeof(gpointer)*num_params); return(pg); } static void free_param_group(gpointer data) { ParamGroup *pg=(ParamGroup *)data; g_slice_free1(sizeof(gpointer)*pg->num_params,pg->parent); g_slice_free1(sizeof(gpointer)*pg->num_params,pg->property); g_slice_free(ParamGroup,data); } #if 0 // FIXME: parent is per parameter, we want the wire, machine or voice static ParamGroup *find_param_group_by_parent(gpointer key,gpointer value,gpointer user_data) { return (((ParamGroup *)value)->parent==user_data); } #endif //-- event handler helper static gboolean preset_list_edit_preset_meta(const BtMachinePropertiesDialog *self,GstElement *machine,gchar **name,gchar **comment) { gboolean result=FALSE; GtkWidget *dialog; GST_INFO("create preset edit dialog"); dialog=GTK_WIDGET(bt_machine_preset_properties_dialog_new(machine,name,comment)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); GST_INFO("run preset edit dialog"); gtk_widget_show_all(GTK_WIDGET(dialog)); if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { bt_machine_preset_properties_dialog_apply(BT_MACHINE_PRESET_PROPERTIES_DIALOG(dialog)); result=TRUE; } gtk_widget_destroy(dialog); return(result); } static void preset_list_refresh(const BtMachinePropertiesDialog *self) { GstElement *machine; GtkListStore *store; GtkTreeIter tree_iter; gchar **presets,**preset; gchar *comment; GST_INFO("rebuilding preset list"); g_object_get(self->priv->machine,"machine",&machine,NULL); presets=gst_preset_get_preset_names(GST_PRESET(machine)); // we store the string twice, as we use the pointer as the key in the hashmap // and the string gets copied store=gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); if(presets) { for(preset=presets;*preset;preset++) { gst_preset_get_meta(GST_PRESET(machine),*preset,"comment",&comment); GST_INFO(" adding item : '%s', '%s'",*preset,safe_string(comment)); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter,PRESET_LIST_LABEL,*preset,PRESET_LIST_COMMENT,comment,-1); g_free(comment); } } gtk_tree_view_set_model(GTK_TREE_VIEW(self->priv->preset_list),GTK_TREE_MODEL(store)); g_object_unref(store); // drop with treeview gst_object_unref(machine); g_strfreev(presets); GST_INFO("rebuilt preset list"); } // interaction control helper static void on_control_bind(const BtInteractionControllerMenu *menu,GParamSpec *arg,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); BtIcControl *control; GstObject *object; gchar *property_name; g_object_get((gpointer)menu,"selected-control",&control,NULL); //GST_INFO("control selected: %p",control); object=g_object_get_qdata(G_OBJECT(menu),control_object_quark); property_name=g_object_get_qdata(G_OBJECT(menu),control_property_quark); bt_machine_bind_parameter_control(self->priv->machine,object,property_name,control); g_object_unref(control); } static void on_control_unbind(GtkMenuItem *menuitem,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *menu; GstObject *object; gchar *property_name; menu=gtk_widget_get_parent(GTK_WIDGET(menuitem)); object=g_object_get_qdata(G_OBJECT(menu),control_object_quark); property_name=g_object_get_qdata(G_OBJECT(menu),control_property_quark); bt_machine_unbind_parameter_control(self->priv->machine,object,property_name); //g_object_unref(menu); } static void on_control_unbind_all(GtkMenuItem *menuitem,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); bt_machine_unbind_parameter_controls(self->priv->machine); } static void on_parameter_reset(GtkMenuItem *menuitem,gpointer user_data) { //BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *menu; GObject *object; gchar *property_name; GParamSpec *pspec; menu=gtk_widget_get_parent(GTK_WIDGET(menuitem)); object=g_object_get_qdata(G_OBJECT(menu),control_object_quark); property_name=g_object_get_qdata(G_OBJECT(menu),control_property_quark); if((pspec=g_object_class_find_property(G_OBJECT_GET_CLASS(object),property_name))) { GValue gvalue={0,}; g_value_init(&gvalue, pspec->value_type); g_param_value_set_default (pspec, &gvalue); g_object_set_property (object, property_name, &gvalue); g_value_unset(&gvalue); } } static void on_parameter_reset_all(GtkMenuItem *menuitem,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); bt_machine_reset_parameters(self->priv->machine); } //-- cut/copy/paste extern GdkAtom pattern_atom; static void pattern_clipboard_get_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,guint info,gpointer data) { if(gtk_selection_data_get_target(selection_data)==pattern_atom) { gtk_selection_data_set(selection_data,pattern_atom,8,(guchar *)data,strlen(data)); } else { // allow pasting into a test editor for debugging // its only active if we register the formats in _copy_selection() below gtk_selection_data_set_text(selection_data,data,-1); } } static void pattern_clipboard_clear_func(GtkClipboard *clipboard,gpointer data) { GST_INFO("freeing clipboard data, data=%p",data); g_free(data); } static void on_parameters_copy_single(GtkMenuItem *menuitem,gpointer user_data) { //const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *menu; GObject *object; gchar *property_name; GParamSpec *pspec; GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(menuitem),GDK_SELECTION_CLIPBOARD); GtkTargetEntry *targets; gint n_targets; GString *data=g_string_new(NULL); GValue value={0,}; gchar *val_str; menu=gtk_widget_get_parent(GTK_WIDGET(menuitem)); object=g_object_get_qdata(G_OBJECT(menu),control_object_quark); property_name=g_object_get_qdata(G_OBJECT(menu),control_property_quark); pspec=g_object_class_find_property(G_OBJECT_GET_CLASS(object),property_name); targets = gtk_target_table_make(pattern_atom, &n_targets); g_string_append_printf(data,"1\n"); g_string_append(data,g_type_name(pspec->value_type)); g_value_init(&value,pspec->value_type); g_object_get_property(object,property_name,&value); if((val_str=bt_persistence_get_value(&value))) { g_string_append_c(data,','); g_string_append(data,val_str); g_free(val_str); } g_value_unset(&value); g_string_append_c(data,'\n'); GST_INFO("copying : [%s]",data->str); /* put to clipboard */ if(gtk_clipboard_set_with_data (cb, targets, n_targets, pattern_clipboard_get_func, pattern_clipboard_clear_func, g_string_free (data, FALSE)) ) { gtk_clipboard_set_can_store (cb, NULL, 0); } else { GST_INFO("copy failed"); } gtk_target_table_free (targets, n_targets); } static void on_parameters_copy_group(GtkMenuItem *menuitem,gpointer user_data) { GtkWidget *menu; ParamGroup *pg; GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(menuitem),GDK_SELECTION_CLIPBOARD); GtkTargetEntry *targets; gint n_targets; GString *data=g_string_new(NULL); GValue value={0,}; gchar *val_str; gint i; menu=gtk_widget_get_parent(GTK_WIDGET(menuitem)); pg=g_object_get_qdata(G_OBJECT(menu),widget_param_group_quark); targets = gtk_target_table_make(pattern_atom, &n_targets); g_string_append_printf(data,"1\n"); for(i=0;inum_params;i++) { if(pg->parent[i] && pg->property[i]) { g_string_append(data,g_type_name(pg->property[i]->value_type)); g_value_init(&value,pg->property[i]->value_type); g_object_get_property((GObject *)(pg->parent[i]),pg->property[i]->name,&value); if((val_str=bt_persistence_get_value(&value))) { g_string_append_c(data,','); g_string_append(data,val_str); g_free(val_str); } g_value_unset(&value); } g_string_append_c(data,'\n'); } GST_INFO("copying : [%s]",data->str); /* put to clipboard */ if(gtk_clipboard_set_with_data (cb, targets, n_targets, pattern_clipboard_get_func, pattern_clipboard_clear_func, g_string_free (data, FALSE)) ) { gtk_clipboard_set_can_store (cb, NULL, 0); } else { GST_INFO("copy failed"); } gtk_target_table_free (targets, n_targets); } typedef struct { const BtMachinePropertiesDialog *self; ParamGroup *pg; gint pi; } PasteData; static void pattern_clipboard_received_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,gpointer user_data) { PasteData *pd=(PasteData *)user_data; const BtMachinePropertiesDialog *self=pd->self; ParamGroup **groups; ParamGroup *pg=pd->pg; gint p=pd->pi!=-1?pd->pi:0,g=0; gint i; gint number_of_groups=g_hash_table_size(self->priv->param_groups); GValue value={0,}; gchar **lines; gchar **fields; gchar *data; #if 0 GList *node; #endif GST_INFO("receiving clipboard data"); g_slice_free(PasteData,pd); data=(gchar *)gtk_selection_data_get_data(selection_data); GST_INFO("pasting : [%s] @ %p,%d",data,pg,p); if(!data) return; /* FIXME: need to build an array[number_of_groups] * wire-groups (machine->dst_wires), global-group, voices-groups (0...) */ groups=g_slice_alloc0(sizeof(gpointer)*number_of_groups); #if 0 i=0; // wires node=self->priv->machine->dst_wires; for(;node;node=g_list_next(node)) { // search param_groups for entry where entry->parent=node->data groups[i++]=g_hash_table_find(self->priv->param_groups,(GHRFunc)find_param_group_by_parent,node->data); } // global groups[i++]=g_hash_table_find(self->priv->param_groups,(GHRFunc)find_param_group_by_parent,XXXX); // voices #endif lines=g_strsplit_set(data,"\n",0); if(lines[0]) { GType stype; //guint ticks=atol(lines[0]); gboolean res=TRUE; /* we paste from position as long as types match */ i=1; while(lines[i] && *lines[i] && res) { if(*lines[i]!='\n') { fields=g_strsplit_set(lines[i],",",0); stype=g_type_from_name(fields[0]); if(stype==pg->property[p]->value_type) { g_value_init(&value,pg->property[p]->value_type); if(bt_persistence_set_value(&value,fields[1])) { g_object_set_property((GObject *)(pg->parent[p]),pg->property[p]->name,&value); } g_value_unset(&value); } else { GST_INFO("types don't match in %s <-> %s",fields[0],g_type_name(pg->property[p]->value_type)); res=FALSE; } g_strfreev(fields); } else { GST_INFO("skip blank line"); } i++;p++; if(p==pg->num_params) { // switch to next group or stop if(gpriv->param_groups[g]; } else { break; } } } } g_strfreev(lines); g_slice_free1(sizeof(gpointer)*number_of_groups,groups); } static void on_parameters_paste(GtkMenuItem *menuitem,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(menuitem),GDK_SELECTION_CLIPBOARD); GtkWidget *menu; PasteData *pd; menu=gtk_widget_get_parent(GTK_WIDGET(menuitem)); pd=g_slice_new(PasteData); pd->self=self; pd->pg=g_object_get_qdata(G_OBJECT(menu),widget_param_group_quark); pd->pi=GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(menu),widget_param_num_quark)); gtk_clipboard_request_contents(cb,pattern_atom,pattern_clipboard_received_func,(gpointer)pd); } //-- event handler static void on_double_range_property_changed(GtkRange *range,gpointer user_data); static void on_float_range_property_changed(GtkRange *range,gpointer user_data); static void on_int_range_property_changed(GtkRange *range,gpointer user_data); static void on_uint_range_property_changed(GtkRange *range,gpointer user_data); static void on_uint64_range_property_changed(GtkRange *range,gpointer user_data); static void on_uint64_entry_property_changed(GtkEditable *editable,gpointer user_data); static void on_checkbox_property_toggled(GtkToggleButton *togglebutton, gpointer user_data); static void on_combobox_property_changed(GtkComboBox *combobox, gpointer user_data); static gchar* on_int_range_global_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_global_param_index(machine,name,NULL); GValue int_value={0,}; gchar *str=NULL; static gchar _str[20]; g_value_init(&int_value,G_TYPE_INT); g_value_set_int(&int_value,(gint)value); if(!(str=bt_machine_describe_global_param_value(machine,index,&int_value))) { g_sprintf(_str,"%d",(gint)value); str=_str; } else { strncpy(_str,str,20); _str[19]='\0'; g_free(str); str=_str; } return(str); } static gchar* on_int_range_voice_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_voice_param_index(machine,name,NULL); GValue int_value={0,}; gchar *str=NULL; static gchar _str[20]; g_value_init(&int_value,G_TYPE_INT); g_value_set_int(&int_value,(gint)value); if(!(str=bt_machine_describe_voice_param_value(machine,index,&int_value))) { g_sprintf(_str,"%d",(gint)value); str=_str; } else { strncpy(_str,str,20); _str[19]='\0'; g_free(str); str=_str; } return(str); } static gchar* on_uint_range_global_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_global_param_index(machine,name,NULL); GValue uint_value={0,}; gchar *str=NULL; static gchar _str[20]; g_value_init(&uint_value,G_TYPE_UINT); g_value_set_uint(&uint_value,(guint)value); if(!(str=bt_machine_describe_global_param_value(machine,index,&uint_value))) { g_sprintf(_str,"%u",(guint)value); str=_str; } else { strncpy(_str,str,20); _str[19]='\0'; g_free(str); str=_str; } return(str); } static gchar* on_uint_range_voice_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_voice_param_index(machine,name,NULL); GValue uint_value={0,}; gchar *str=NULL; static gchar _str[20]; g_value_init(&uint_value,G_TYPE_UINT); g_value_set_uint(&uint_value,(guint)value); if(!(str=bt_machine_describe_voice_param_value(machine,index,&uint_value))) { g_sprintf(_str,"%u",(guint)value); str=_str; } else { strncpy(_str,str,20); _str[19]='\0'; g_free(str); str=_str; } return(str); } static gchar* on_uint64_range_global_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_global_param_index(machine,name,NULL); GValue uint64_value={0,}; gchar *str=NULL; static gchar _str[30]; g_value_init(&uint64_value,G_TYPE_UINT64); g_value_set_uint64(&uint64_value,(guint64)value); if(!(str=bt_machine_describe_global_param_value(machine,index,&uint64_value))) { g_sprintf(_str,"%"G_GUINT64_FORMAT,(guint64)value); str=_str; } else { strncpy(_str,str,30); _str[29]='\0'; g_free(str); str=_str; } return(str); } static gchar* on_uint64_range_voice_property_format_value(GtkScale *scale, gdouble value, gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(scale)); glong index=bt_machine_get_voice_param_index(machine,name,NULL); GValue uint64_value={0,}; gchar *str=NULL; static gchar _str[30]; g_value_init(&uint64_value,G_TYPE_UINT64); g_value_set_uint64(&uint64_value,(guint64)value); if(!(str=bt_machine_describe_voice_param_value(machine,index,&uint64_value))) { g_sprintf(_str,"%"G_GUINT64_FORMAT,(guint64)value); str=_str; } else { strncpy(_str,str,30); _str[29]='\0'; g_free(str); str=_str; } return(str); } // @todo: should we have this in btmachine.c? static void bt_machine_update_default_param_value(BtMachine *self,GstObject *param_parent, const gchar *property_name) { GstController *ctrl; if((ctrl=gst_object_get_controller(G_OBJECT(param_parent)))) { GstElement *element; glong voice=-1; g_object_get(self,"machine",&element,NULL); // check if we update a voice parameter if((param_parent!=GST_OBJECT(element)) && GST_IS_CHILD_PROXY(element)) { gulong i,voices=gst_child_proxy_get_children_count(GST_CHILD_PROXY(element)); GstObject *voice_elem; for(i=0;ipriv->machine, GST_OBJECT(user_data), gtk_widget_get_name(GTK_WIDGET(widget))); } static gboolean on_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data, BtInteractionControllerMenuType type) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *property_name=gtk_widget_get_name(GTK_WIDGET(widget)); BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(widget),widget_parent_quark)); gboolean res=FALSE; GST_INFO("button_press : button 0x%x, type 0x%d",event->button,event->type); if(event->type == GDK_BUTTON_PRESS) { if(event->button == 3) { GtkMenu *menu; GtkWidget *menu_item,*image; GtkWidget *item_unbind,*item_unbind_all; ParamGroup *pg; gint pi; pg=g_object_get_qdata(G_OBJECT(widget),widget_param_group_quark); pi=GPOINTER_TO_INT(g_object_get_qdata(G_OBJECT(widget),widget_param_num_quark)); // create context menu if(!self->priv->param_menu[type]) { self->priv->param_menu[type]=menu=GTK_MENU(g_object_ref_sink(bt_interaction_controller_menu_new(type))); // add extra items menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Reset parameter")); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameter_reset),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Reset all parameters")); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameter_reset_all),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); // add copy/paste item menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); // @todo: copy parameter/group/all? menu_item=gtk_image_menu_item_new_with_label(_("Copy parameter")); image=gtk_image_new_from_stock(GTK_STOCK_COPY,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameters_copy_single),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Paste")); image=gtk_image_new_from_stock(GTK_STOCK_PASTE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameters_paste),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); } else { menu=self->priv->param_menu[type]; } g_object_get(menu,"item-unbind",&item_unbind,"item-unbind-all",&item_unbind_all,NULL); g_object_set_qdata(G_OBJECT(menu),control_object_quark,(gpointer)param_parent); g_object_set_qdata(G_OBJECT(menu),control_property_quark,(gpointer)property_name); g_object_set_qdata(G_OBJECT(menu),widget_param_group_quark,(gpointer)pg); g_object_set_qdata(G_OBJECT(menu),widget_param_num_quark,GINT_TO_POINTER(pi)); g_signal_connect(menu,"notify::selected-control",G_CALLBACK(on_control_bind),(gpointer)self); g_signal_connect(item_unbind,"activate",G_CALLBACK(on_control_unbind),(gpointer)self); g_signal_connect(item_unbind_all,"activate",G_CALLBACK(on_control_unbind_all),(gpointer)self); gtk_menu_popup(menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } else if(event->button == 1) { GstController *ctrl; if((ctrl=gst_object_get_controller(G_OBJECT(param_parent)))) { gst_controller_set_property_disabled(ctrl,(gchar *)property_name,TRUE); } } } return(res); } static gboolean on_button_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if(event->button == 1 && event->type == GDK_BUTTON_RELEASE) { update_param_after_interaction(widget,user_data); } return(FALSE); } static gboolean on_trigger_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { return(on_button_press_event(widget,event,user_data,BT_INTERACTION_CONTROLLER_TRIGGER_MENU)); } static gboolean on_range_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { return(on_button_press_event(widget,event,user_data,BT_INTERACTION_CONTROLLER_RANGE_MENU)); } static gboolean on_group_button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); gboolean res=FALSE; GST_INFO("button_press : button 0x%x, type 0x%d",event->button,event->type); if(event->type == GDK_BUTTON_PRESS) { if(event->button == 3) { GtkMenu *menu; GtkWidget *menu_item,*image; ParamGroup *pg; pg=g_hash_table_lookup(self->priv->param_groups,widget); // create context menu // @todo: do we leak that menu here? - gtk_widget_destroy() afterwards? if(!self->priv->group_menu) { self->priv->group_menu=menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); // add copy/paste item menu_item=gtk_image_menu_item_new_with_label(_("Copy group")); image=gtk_image_new_from_stock(GTK_STOCK_COPY,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameters_copy_group),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Paste")); image=gtk_image_new_from_stock(GTK_STOCK_PASTE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); g_signal_connect(menu_item,"activate",G_CALLBACK(on_parameters_paste),(gpointer)self); gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item); gtk_widget_show(menu_item); } else { menu=self->priv->group_menu; } g_object_set_qdata(G_OBJECT(menu),widget_param_group_quark,(gpointer)pg); g_object_set_qdata(G_OBJECT(menu),widget_param_num_quark,GINT_TO_POINTER(-1)); gtk_menu_popup(menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } } return(res); } static void update_double_range_label(GtkLabel *label,gdouble value) { gchar str[100]; g_sprintf(str,"%lf",value); gtk_label_set_text(label,str); } static gboolean on_double_range_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(widget),wdget_peer_quark)); gdouble value; GST_INFO("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_double_range_property_changed,(gpointer)machine); gtk_range_set_value(GTK_RANGE(widget),value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_double_range_property_changed,(gpointer)machine); update_double_range_label(label,value); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_double_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; //BtMachinePropertiesDialog *self=g_object_get_qdata(G_OBJECT(user_data),widget_parent_quark); MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_double_range_property_notify_idle,(gpointer)data); } static void on_double_range_property_changed(GtkRange *range,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(range),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); gdouble value=gtk_range_get_value(range); //GST_INFO("property value change received : %lf",value); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_double_range_property_notify,(gpointer)range); g_object_set(param_parent,name,value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_double_range_property_notify,(gpointer)range); update_double_range_label(label,value); bt_edit_application_set_song_unsaved(self->priv->app); } static void update_float_range_label(GtkLabel *label,gfloat value) { gchar str[100]; g_sprintf(str,"%f",value); gtk_label_set_text(label,str); } static gboolean on_float_range_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(widget),wdget_peer_quark)); gfloat value; //GST_INFO("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_float_range_property_changed,(gpointer)machine); gtk_range_set_value(GTK_RANGE(widget),value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_float_range_property_changed,(gpointer)machine); update_float_range_label(label,value); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_float_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_float_range_property_notify_idle,(gpointer)data); } static void on_float_range_property_changed(GtkRange *range,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(range),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); gfloat value=gtk_range_get_value(range); //GST_INFO("property value change received : %f",value); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_float_range_property_notify,(gpointer)range); g_object_set(param_parent,name,value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_float_range_property_notify,(gpointer)range); update_float_range_label(label,value); bt_edit_application_set_song_unsaved(self->priv->app); } static void update_int_range_label(const BtMachinePropertiesDialog *self,GtkRange *range,GstObject *param_parent,GtkLabel *label,gdouble value) { if(GST_IS_ELEMENT(param_parent)) { gtk_label_set_text(label,on_int_range_global_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } else { gtk_label_set_text(label,on_int_range_voice_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } } static gboolean on_int_range_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(widget),wdget_peer_quark)); BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(widget),widget_parent_quark)); gint value; g_object_get((gpointer)machine,property->name,&value,NULL); //GST_INFO("property value notify received : %s => : %d",property->name,value); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_int_range_property_changed,(gpointer)machine); gtk_range_set_value(GTK_RANGE(widget),(gdouble)value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_int_range_property_changed,(gpointer)machine); update_int_range_label(self,GTK_RANGE(widget),GST_OBJECT(machine),label,(gdouble)value); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_int_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_int_range_property_notify_idle,(gpointer)data); } static void on_int_range_property_changed(GtkRange *range,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(range),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); gdouble value=gtk_range_get_value(range); //GST_INFO("property value change received"); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_int_range_property_notify,(gpointer)range); g_object_set(param_parent,name,(gint)value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_int_range_property_notify,(gpointer)range); update_int_range_label(self,range,param_parent,label,value); bt_edit_application_set_song_unsaved(self->priv->app); } static void update_uint_range_label(const BtMachinePropertiesDialog *self,GtkRange *range,GstObject *param_parent,GtkLabel *label,gdouble value) { if(GST_IS_ELEMENT(param_parent)) { gtk_label_set_text(label,on_uint_range_global_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } else { gtk_label_set_text(label,on_uint_range_voice_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } } static gboolean on_uint_range_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(widget),wdget_peer_quark)); BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(widget),widget_parent_quark)); guint value; //GST_INFO("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint_range_property_changed,(gpointer)machine); gtk_range_set_value(GTK_RANGE(widget),(gdouble)value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint_range_property_changed,(gpointer)machine); update_uint_range_label(self,GTK_RANGE(widget),GST_OBJECT(machine),label,(gdouble)value); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_uint_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_uint_range_property_notify_idle,(gpointer)data); } static void on_uint_range_property_changed(GtkRange *range,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); GtkLabel *label=GTK_LABEL(g_object_get_qdata(G_OBJECT(range),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); gdouble value=gtk_range_get_value(range); GST_INFO("property value change received"); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint_range_property_notify,(gpointer)range); g_object_set(param_parent,name,(guint)value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint_range_property_notify,(gpointer)range); update_uint_range_label(self,range,param_parent,label,value); bt_edit_application_set_song_unsaved(self->priv->app); } static void update_uint64_range_entry(const BtMachinePropertiesDialog *self,GtkRange *range,GstObject *param_parent,GtkEntry *entry,gdouble value) { if(GST_IS_ELEMENT(param_parent)) { gtk_entry_set_text(entry,on_uint64_range_global_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } else { gtk_entry_set_text(entry,on_uint64_range_voice_property_format_value(GTK_SCALE(range),value,(gpointer)self->priv->machine)); } } static gboolean on_uint64_range_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); GtkEntry *entry=GTK_ENTRY(g_object_get_qdata(G_OBJECT(widget),wdget_peer_quark)); BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(widget),widget_parent_quark)); guint64 value; //GST_INFO("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_changed,(gpointer)machine); gtk_range_set_value(GTK_RANGE(widget),(gdouble)value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_changed,(gpointer)machine); g_signal_handlers_block_matched(entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_entry_property_changed,(gpointer)machine); update_uint64_range_entry(self,GTK_RANGE(widget),GST_OBJECT(machine),entry,(gdouble)value); g_signal_handlers_unblock_matched(entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_entry_property_changed,(gpointer)machine); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_uint64_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_uint64_range_property_notify_idle,(gpointer)data); } static void on_uint64_range_property_changed(GtkRange *range,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); GtkEntry *entry=GTK_ENTRY(g_object_get_qdata(G_OBJECT(range),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); gdouble value=gtk_range_get_value(range); GST_INFO("property value change received"); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_notify,(gpointer)range); g_object_set(param_parent,name,(guint64)value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_notify,(gpointer)range); g_signal_handlers_block_matched(entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_entry_property_changed,(gpointer)user_data); update_uint64_range_entry(self,range,param_parent,entry,value); g_signal_handlers_unblock_matched(entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_entry_property_changed,(gpointer)user_data); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_uint64_entry_property_changed(GtkEditable *editable,gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(editable)); GtkRange *range=GTK_RANGE(g_object_get_qdata(G_OBJECT(editable),wdget_peer_quark)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(editable),widget_parent_quark)); guint64 clamped_value,value=g_ascii_strtoull(gtk_entry_get_text(GTK_ENTRY(editable)),NULL,10); g_signal_handlers_block_matched(range,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_changed,(gpointer)user_data); gtk_range_set_value(range,(gdouble)value); clamped_value=gtk_range_get_value(range); g_signal_handlers_unblock_matched(range,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_changed,(gpointer)user_data); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_notify,(gpointer)range); g_object_set(param_parent,name,clamped_value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_uint64_range_property_notify,(gpointer)range); bt_edit_application_set_song_unsaved(self->priv->app); } static gboolean on_combobox_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); gint ivalue,nvalue; GtkTreeModel *store; GtkTreeIter iter; GST_DEBUG("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&nvalue,NULL); store=gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); gtk_tree_model_get_iter_first(store,&iter); do { gtk_tree_model_get(store,&iter,0,&ivalue,-1); if(ivalue==nvalue) break; } while(gtk_tree_model_iter_next(store,&iter)); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_combobox_property_changed,(gpointer)machine); if(ivalue==nvalue) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget),&iter); } else { gtk_combo_box_set_active(GTK_COMBO_BOX(widget),-1); GST_WARNING("current value (%d) for machines parameter %s is not part of the enum values",nvalue,property->name); } g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_combobox_property_changed,(gpointer)machine); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_combobox_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_combobox_property_notify_idle,(gpointer)data); } static void on_combobox_property_changed(GtkComboBox *combobox, gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(combobox)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(combobox),widget_parent_quark)); GtkTreeModel *store; GtkTreeIter iter; gint value; //GST_INFO("property value change received"); //value=gtk_combo_box_get_active(combobox); store=gtk_combo_box_get_model(combobox); if(gtk_combo_box_get_active_iter(combobox,&iter)) { gtk_tree_model_get(store,&iter,0,&value,-1); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_combobox_property_notify,(gpointer)combobox); g_object_set(param_parent,name,value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_combobox_property_notify,(gpointer)combobox); //GST_WARNING("property value change received: %d",value); update_param_after_interaction(GTK_WIDGET(combobox),user_data); bt_edit_application_set_song_unsaved(self->priv->app); } } static gboolean on_checkbox_property_notify_idle(gpointer _data) { BtNotifyIdleData *data=(BtNotifyIdleData *)_data; if(data->user_data) { const GstElement *machine=data->machine; GParamSpec *property=data->property; GtkWidget *widget=GTK_WIDGET(data->user_data); gboolean value; //GST_INFO("property value notify received : %s ",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); g_signal_handlers_block_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_checkbox_property_toggled,(gpointer)machine); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),value); g_signal_handlers_unblock_matched(widget,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_checkbox_property_toggled,(gpointer)machine); } FREE_NOTIFY_IDLE_DATA(data); return(FALSE); } static void on_checkbox_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { BtNotifyIdleData *data; MAKE_NOTIFY_IDLE_DATA(data,machine,property,user_data); g_idle_add(on_checkbox_property_notify_idle,(gpointer)data); } static void on_checkbox_property_toggled(GtkToggleButton *togglebutton, gpointer user_data) { GstObject *param_parent=GST_OBJECT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(togglebutton)); const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(g_object_get_qdata(G_OBJECT(togglebutton),widget_parent_quark)); gboolean value; //GST_INFO("property value change received"); value=gtk_toggle_button_get_active(togglebutton); g_signal_handlers_block_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_checkbox_property_notify,(gpointer)togglebutton); g_object_set(param_parent,name,value,NULL); g_signal_handlers_unblock_matched(param_parent,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_checkbox_property_notify,(gpointer)togglebutton); //update_param_after_interaction(GTK_WIDGET(togglebutton),user_data); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_toolbar_help_clicked(GtkButton *button,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); // show help for machine gtk_show_uri_simple(GTK_WIDGET(self),self->priv->help_uri); } static void on_toolbar_about_clicked(GtkButton *button,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); BtMainWindow *main_window; // show info about machine g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_machine_action_about(self->priv->machine,main_window); g_object_unref(main_window); } static void on_toolbar_random_clicked(GtkButton *button,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); bt_machine_randomize_parameters(self->priv->machine); } static void on_toolbar_reset_clicked(GtkButton *button,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); bt_machine_reset_parameters(self->priv->machine); } static void on_toolbar_show_hide_clicked(GtkButton *button,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkAllocation win_alloc, pb_alloc; GHashTable *properties; gtk_widget_get_allocation(GTK_WIDGET(self),&win_alloc); gtk_widget_get_allocation(GTK_WIDGET(self->priv->preset_box),&pb_alloc); GST_DEBUG("win: %d,%d, box: %d,%d", win_alloc.width,win_alloc.height, pb_alloc.width,pb_alloc.height); g_object_get(self->priv->machine,"properties",&properties,NULL); if(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button))) { // expand window gtk_window_resize(GTK_WINDOW(self), win_alloc.width+(pb_alloc.width+12), win_alloc.height); g_hash_table_insert(properties,g_strdup("presets-shown"),g_strdup("1")); gtk_widget_show_all(self->priv->preset_box); } else { gtk_widget_hide(self->priv->preset_box); g_hash_table_insert(properties,g_strdup("presets-shown"),g_strdup("0")); // shrink window gtk_window_resize(GTK_WINDOW(self), win_alloc.width-(pb_alloc.width+12), win_alloc.height); } } static void on_toolbar_preset_add_clicked(GtkButton *button,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GstElement *machine; gchar *name=NULL,*comment=NULL; g_object_get(self->priv->machine,"machine",&machine,NULL); // ask for name & comment if(preset_list_edit_preset_meta(self,machine,&name,&comment)) { GST_INFO("about to add a new preset : '%s'",name); gst_preset_save_preset(GST_PRESET(machine),name); gst_preset_set_meta(GST_PRESET(machine),name,"comment",comment); preset_list_refresh(self); } gst_object_unref(machine); } static void on_toolbar_preset_remove_clicked(GtkButton *button,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; // get current preset from list selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->preset_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { gchar *name; GstElement *machine; gtk_tree_model_get(model,&iter,PRESET_LIST_LABEL,&name,-1); g_object_get(self->priv->machine,"machine",&machine,NULL); GST_INFO("about to delete preset : '%s'",name); gst_preset_delete_preset(GST_PRESET(machine),name); preset_list_refresh(self); gst_object_unref(machine); } } static void on_toolbar_preset_edit_clicked(GtkButton *button,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; // get current preset from list selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->preset_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { gchar *old_name,*new_name,*comment; GstElement *machine; gtk_tree_model_get(model,&iter,PRESET_LIST_LABEL,&old_name,-1); g_object_get(self->priv->machine,"machine",&machine,NULL); GST_INFO("about to edit preset : '%s'",old_name); gst_preset_get_meta(GST_PRESET(machine),old_name,"comment",&comment); new_name=g_strdup(old_name); // change for name & comment if(preset_list_edit_preset_meta(self,machine,&new_name,&comment)) { gst_preset_rename_preset(GST_PRESET(machine),old_name,new_name); gst_preset_set_meta(GST_PRESET(machine),new_name,"comment",comment); preset_list_refresh(self); } g_free(old_name); g_free(comment); gst_object_unref(machine); } } static void on_preset_list_row_activated(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gpointer user_data) { const BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkTreeModel *model; GtkTreeIter iter; // get current preset from list model=gtk_tree_view_get_model(tree_view); if(gtk_tree_model_get_iter(model,&iter,path)) { gchar *name; GstElement *machine; gtk_tree_model_get(model,&iter,PRESET_LIST_LABEL,&name,-1); g_object_get(self->priv->machine,"machine",&machine,NULL); GST_INFO("about to load preset : '%s'",name); if(gst_preset_load_preset(GST_PRESET(machine),name)) { bt_edit_application_set_song_unsaved(self->priv->app); bt_machine_set_param_defaults(self->priv->machine); } gst_object_unref(machine); } } static gboolean on_preset_list_query_tooltip(GtkWidget *widget,gint x,gint y,gboolean keyboard_mode,GtkTooltip *tooltip,gpointer user_data) { GtkTreeView *tree_view=GTK_TREE_VIEW(widget); GtkTreePath *path; GtkTreeViewColumn *column; gboolean res=FALSE; if(gtk_tree_view_get_path_at_pos(tree_view,x,y,&path,&column,NULL,NULL)) { GtkTreeModel *model; GtkTreeIter iter; model=gtk_tree_view_get_model(tree_view); if(gtk_tree_model_get_iter(model,&iter,path)) { gchar *comment; gtk_tree_model_get(model,&iter,PRESET_LIST_COMMENT,&comment,-1); if(comment) { GST_LOG("tip is '%s'",comment); gtk_tooltip_set_text(tooltip,comment); res=TRUE; } } gtk_tree_path_free(path); } return(res); } static void on_preset_list_selection_changed(GtkTreeSelection *treeselection,gpointer user_data) { gtk_widget_set_sensitive(GTK_WIDGET(user_data),(gtk_tree_selection_count_selected_rows(treeselection)!=0)); } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'",toolbar_style); gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->main_toolbar),gtk_toolbar_get_style_from_string(toolbar_style)); if(self->priv->preset_toolbar) { gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->preset_toolbar),gtk_toolbar_get_style_from_string(toolbar_style)); } g_free(toolbar_style); } /* * on_box_size_request: * * we adjust the scrollable-window size to contain the whole area */ static void on_box_size_request(GtkWidget *widget,GtkRequisition *requisition,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *parent=gtk_widget_get_parent(gtk_widget_get_parent(widget)); gint height=requisition->height,width=-1; gint max_height=gdk_screen_get_height(gdk_screen_get_default()); gint available_heigth; GtkAllocation tb_alloc; gtk_widget_get_allocation(GTK_WIDGET(self->priv->main_toolbar),&tb_alloc); GST_DEBUG("#### box size req %d x %d (max-height=%d, toolbar-height=%d)", requisition->width,requisition->height, max_height,tb_alloc.height); // have a minimum width if(requisition->width<300) { width=300; } // constrain the height by screen height minus some space for panels, deco and // our toolbar available_heigth=max_height-SCREEN_BORDER_HEIGHT-tb_alloc.height; if(height>available_heigth) { height=available_heigth; } // @todo: is the '2' some border or padding gtk_widget_set_size_request(parent,width,height + 2); } static void on_window_show(GtkWidget *widget,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); gtk_widget_grab_focus(self->priv->first_widget); } //-- helper methods static GtkWidget *make_int_range_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *label) { GtkWidget *widget; gchar *signal_name; gint value; g_object_get(machine,property->name,&value,NULL); //step=(int_property->maximum-int_property->minimum)/1024.0; widget=gtk_hscale_new_with_range(g_value_get_int(range_min),g_value_get_int(range_max),1.0); gtk_scale_set_draw_value(GTK_SCALE(widget),/*TRUE*/FALSE); gtk_range_set_value(GTK_RANGE(widget),value); // @todo add numerical entry as well ? signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_int_range_property_notify), (gpointer)widget); g_signal_connect(widget, "value-changed", G_CALLBACK(on_int_range_property_changed), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static GtkWidget *make_uint_range_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *label) { GtkWidget *widget; gchar *signal_name; guint value; g_object_get(machine,property->name,&value,NULL); //step=(int_property->maximum-int_property->minimum)/1024.0; widget=gtk_hscale_new_with_range(g_value_get_uint(range_min),g_value_get_uint(range_max),1.0); gtk_scale_set_draw_value(GTK_SCALE(widget),/*TRUE*/FALSE); gtk_range_set_value(GTK_RANGE(widget),value); // @todo add numerical entry as well ? signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine,signal_name,G_CALLBACK(on_uint_range_property_notify), (gpointer)widget); g_signal_connect(widget,"value-changed",G_CALLBACK(on_uint_range_property_changed), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static GtkWidget *make_uint64_range_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *entry) { GtkWidget *widget; gchar *signal_name; guint64 value; g_object_get(machine,property->name,&value,NULL); //step=(int_property->maximum-int_property->minimum)/1024.0; widget=gtk_hscale_new_with_range((gdouble)g_value_get_uint64(range_min),(gdouble)g_value_get_uint64(range_max),1.0); gtk_scale_set_draw_value(GTK_SCALE(widget),/*TRUE*/FALSE); gtk_range_set_value(GTK_RANGE(widget),(gdouble)value); // @todo add numerical entry as well ? signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine,signal_name,G_CALLBACK(on_uint64_range_property_notify), (gpointer)widget); g_signal_connect(widget,"value-changed",G_CALLBACK(on_uint64_range_property_changed), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); g_signal_connect(entry,"changed",G_CALLBACK(on_uint64_entry_property_changed), (gpointer)machine); return(widget); } static GtkWidget *make_float_range_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *label) { GtkWidget *widget; gchar *signal_name; gfloat step,value; gfloat value_min=g_value_get_float(range_min); gfloat value_max=g_value_get_float(range_max); g_object_get(machine,property->name,&value,NULL); step=((gdouble)value_max-(gdouble)value_min)/1024.0; widget=gtk_hscale_new_with_range(value_min,value_max,step); gtk_scale_set_draw_value(GTK_SCALE(widget),/*TRUE*/FALSE); gtk_range_set_value(GTK_RANGE(widget),value); // @todo add numerical entry as well ? signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_float_range_property_notify), (gpointer)widget); g_signal_connect(widget, "value-changed", G_CALLBACK(on_float_range_property_changed), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static GtkWidget *make_double_range_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *label) { GtkWidget *widget; gchar *signal_name; gdouble step,value; gdouble value_min=g_value_get_double(range_min); gdouble value_max=g_value_get_double(range_max); g_object_get(machine,property->name,&value,NULL); step=(value_max-value_min)/1024.0; widget=gtk_hscale_new_with_range(value_min,value_max,step); gtk_scale_set_draw_value(GTK_SCALE(widget),/*TRUE*/FALSE); gtk_range_set_value(GTK_RANGE(widget),value); // @todo add numerical entry as well ? signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_double_range_property_notify), (gpointer)widget); g_signal_connect(widget, "value-changed", G_CALLBACK(on_double_range_property_changed), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static GtkWidget *make_combobox_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property,GValue *range_min,GValue *range_max) { GtkWidget *widget; gchar *signal_name; GParamSpecEnum *enum_property=G_PARAM_SPEC_ENUM(property); GEnumClass *enum_class=enum_property->enum_class; GEnumValue *enum_value; GtkCellRenderer *renderer; GtkListStore *store; GtkTreeIter iter; gint value, ivalue; widget=gtk_combo_box_new(); // need a real model because of sparse enums store=gtk_list_store_new(2,G_TYPE_INT,G_TYPE_STRING); for(value=enum_class->minimum;value<=enum_class->maximum;value++) { if((enum_value=g_enum_get_value(enum_class, value))) { //gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),enum_value->value_nick); if(BT_IS_STRING(enum_value->value_nick)) { gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter, 0,enum_value->value, 1,enum_value->value_nick, -1); } } } renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget),renderer,"text",1,NULL); gtk_combo_box_set_model(GTK_COMBO_BOX(widget),GTK_TREE_MODEL(store)); g_object_get(machine,property->name,&value,NULL); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),&iter); do { gtk_tree_model_get((GTK_TREE_MODEL(store)),&iter,0,&ivalue,-1); if(ivalue==value) break; } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(store),&iter)); if(ivalue==value) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget),&iter); } else { gtk_combo_box_set_active(GTK_COMBO_BOX(widget),-1); GST_WARNING("current value (%d) for machines parameter %s is not part of the enum values",value,property->name); } signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_combobox_property_notify), (gpointer)widget); g_signal_connect(widget, "changed", G_CALLBACK(on_combobox_property_changed), (gpointer)machine); //g_signal_connect(widget,"button-press-event",G_CALLBACK(on_range_button_press_event), (gpointer)machine); //g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static GtkWidget *make_checkbox_widget(const BtMachinePropertiesDialog *self,GstObject *machine,GParamSpec *property) { GtkWidget *widget; gchar *signal_name; gboolean value; g_object_get(machine,property->name,&value,NULL); widget=gtk_check_button_new(); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),value); signal_name=g_alloca(9+strlen(property->name)); g_sprintf(signal_name,"notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_checkbox_property_notify), (gpointer)widget); g_signal_connect(widget, "toggled", G_CALLBACK(on_checkbox_property_toggled), (gpointer)machine); g_signal_connect(widget,"button-press-event",G_CALLBACK(on_trigger_button_press_event), (gpointer)machine); g_signal_connect(widget,"button-release-event",G_CALLBACK(on_button_release_event), (gpointer)machine); return(widget); } static void make_param_control(const BtMachinePropertiesDialog *self,GstObject *object,const gchar *pname,GParamSpec *property,GValue *range_min,GValue *range_max,GtkWidget *table,gulong row,ParamGroup *pg) { GtkWidget *label,*widget1,*widget2; GType base_type; const gchar *tool_tip_text=g_param_spec_get_blurb(property); // set parameter name label=gtk_label_new(pname); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_widget_set_tooltip_text(label,tool_tip_text); gtk_table_attach(GTK_TABLE(table),label, 0, 1, row, row+1, GTK_FILL,GTK_SHRINK, 2,1); base_type=bt_g_type_get_base_type(property->value_type); GST_INFO("... base type is : %s",g_type_name(base_type)); #ifdef USE_DEBUG if(range_min && range_max) { gchar *str_min=g_strdup_value_contents(range_min); gchar *str_max=g_strdup_value_contents(range_max); GST_DEBUG("... has range : %s ... %s",str_min,str_max); g_free(str_min);g_free(str_max); } #endif // implement widget types switch(base_type) { case G_TYPE_STRING: widget1=gtk_label_new("string"); widget2=NULL; break; case G_TYPE_BOOLEAN: widget1=make_checkbox_widget(self,object,property); widget2=NULL; break; case G_TYPE_INT: widget2=gtk_label_new(NULL); widget1=make_int_range_widget(self,object,property,range_min,range_max,widget2); break; case G_TYPE_UINT: widget2=gtk_label_new(NULL); widget1=make_uint_range_widget(self,object,property,range_min,range_max,widget2); break; case G_TYPE_UINT64: widget2=gtk_entry_new(); widget1=make_uint64_range_widget(self,object,property,range_min,range_max,widget2); break; case G_TYPE_FLOAT: widget2=gtk_label_new(NULL); widget1=make_float_range_widget(self,object,property,range_min,range_max,widget2); break; case G_TYPE_DOUBLE: widget2=gtk_label_new(NULL); widget1=make_double_range_widget(self,object,property,range_min,range_max,widget2); break; case G_TYPE_ENUM: if(property->value_type==GSTBT_TYPE_TRIGGER_SWITCH) widget1=make_checkbox_widget(self,object,property); else widget1=make_combobox_widget(self,object,property,range_min,range_max); widget2=NULL; break; default: { gchar *str=g_strdup_printf("unhandled type \"%s\"",G_PARAM_SPEC_TYPE_NAME(property)); widget1=gtk_label_new(str);g_free(str); widget2=NULL; } } if(range_min) { g_free(range_min);range_min=NULL; } if(range_max) { g_free(range_max);range_max=NULL; } gtk_widget_set_name(GTK_WIDGET(widget1),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); if(widget2) { gtk_widget_set_name(GTK_WIDGET(widget2),property->name); g_object_set_qdata(G_OBJECT(widget1),wdget_peer_quark,(gpointer)widget2); g_object_set_qdata(G_OBJECT(widget2),widget_parent_quark,(gpointer)self); g_object_set_qdata(G_OBJECT(widget2),wdget_peer_quark,(gpointer)widget1); } g_object_set_qdata(G_OBJECT(widget1),widget_param_group_quark,(gpointer)pg); g_object_set_qdata(G_OBJECT(widget1),widget_param_num_quark,GINT_TO_POINTER(row)); pg->parent[row]=object; pg->property[row]=property; // update formatted text on labels switch(base_type) { case G_TYPE_INT: { gint value; g_object_get(object,property->name,&value,NULL); update_int_range_label(self,GTK_RANGE(widget1),object,GTK_LABEL(widget2),(gdouble)value); } break; case G_TYPE_UINT: { guint value; g_object_get(object,property->name,&value,NULL); update_uint_range_label(self,GTK_RANGE(widget1),object,GTK_LABEL(widget2),(gdouble)value); } break; case G_TYPE_UINT64: { guint64 value; g_object_get(object,property->name,&value,NULL); update_uint64_range_entry(self,GTK_RANGE(widget1),object,GTK_ENTRY(widget2),(gdouble)value); } break; case G_TYPE_FLOAT: { gfloat value; g_object_get(object,property->name,&value,NULL); update_float_range_label(GTK_LABEL(widget2),(gdouble)value); } break; case G_TYPE_DOUBLE: { gdouble value; g_object_get(object,property->name,&value,NULL); update_double_range_label(GTK_LABEL(widget2),(gdouble)value); } break; } gtk_widget_set_tooltip_text(widget1,tool_tip_text); if(!widget2) { gtk_table_attach(GTK_TABLE(table),widget1, 1, 3, row, row+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); } else { gtk_widget_set_tooltip_text(widget2,tool_tip_text); gtk_table_attach(GTK_TABLE(table),widget1, 1, 2, row, row+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); /* @todo how can we avoid the wobble here? * hack would be to set some 'good' default size * if we use GTK_FILL|GTK_EXPAND than it uses too much space (same as widget1) */ gtk_widget_set_size_request(widget2,DEFAULT_LABEL_WIDTH,-1); if(GTK_IS_LABEL(widget2)) { gtk_label_set_ellipsize(GTK_LABEL(widget2),PANGO_ELLIPSIZE_END); gtk_label_set_single_line_mode(GTK_LABEL(widget2),TRUE); gtk_misc_set_alignment(GTK_MISC(widget2),0.0,0.5); } gtk_table_attach(GTK_TABLE(table),widget2, 2, 3, row, row+1, GTK_FILL,GTK_SHRINK, 2,1); } if(!self->priv->first_widget) { self->priv->first_widget=widget1; } } static GtkWidget *make_global_param_box(const BtMachinePropertiesDialog *self,gulong global_params,gulong voice_params,GstElement *machine) { GtkWidget *expander=NULL; GtkWidget *table; ParamGroup *pg; GParamSpec *property; GValue *range_min,*range_max; gulong i,k,params; // determine params to be skipped params=global_params; for(i=0;ipriv->machine,i)) params--; else { if(voice_params && bt_machine_get_voice_param_index(self->priv->machine,bt_machine_get_global_param_name(self->priv->machine,i),NULL)>-1) params--; } } if(params) { const gchar *pname; expander=gtk_expander_new(_("global properties")); gtk_expander_set_expanded(GTK_EXPANDER(expander),TRUE); pg=make_param_group(global_params); g_hash_table_insert(self->priv->param_groups,expander,pg); g_signal_connect(expander,"button-press-event",G_CALLBACK(on_group_button_press_event), (gpointer)self); // add global machine controls into the table table=gtk_table_new(/*rows=*/params+1,/*columns=*/3,/*homogenous=*/FALSE); self->priv->num_global=1; for(i=0,k=0;ipriv->machine,i)) continue; if(voice_params && bt_machine_get_voice_param_index(self->priv->machine,bt_machine_get_global_param_name(self->priv->machine,i),NULL)>-1) continue; pname=bt_machine_get_global_param_name(self->priv->machine,i); bt_machine_get_global_param_details(self->priv->machine,i,&property,&range_min,&range_max); GST_INFO("global property %p has name '%s','%s'",property,property->name,pname); make_param_control(self,GST_OBJECT(machine),pname,property,range_min,range_max,table,k++,pg); } // eat remaning space //gtk_table_attach(GTK_TABLE(table),gtk_label_new(" "), 0, 3, k, k+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_container_add(GTK_CONTAINER(expander),table); } else { GST_INFO("all global params skipped"); } return(expander); } static GtkWidget *make_voice_param_box(const BtMachinePropertiesDialog *self,gulong voice_params,gulong voice,GstElement *machine) { GtkWidget *expander=NULL; GtkWidget *table; ParamGroup *pg; GParamSpec *property; GValue *range_min,*range_max; GstObject *machine_voice; gchar *name; gulong i,k,params; params=voice_params; for(i=0;ipriv->machine,i)) { GST_INFO("skipping voice param %lu",i); params--; } } if(params) { const gchar *pname; name=g_strdup_printf(_("voice %lu properties"),voice+1); expander=gtk_expander_new(name); gtk_expander_set_expanded(GTK_EXPANDER(expander),TRUE); g_free(name); machine_voice=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(machine),voice); if(!machine_voice) { GST_WARNING("Cannot get voice child for voice %lu",voice); } pg=make_param_group(voice_params); g_hash_table_insert(self->priv->param_groups,expander,pg); g_signal_connect(expander,"button-press-event",G_CALLBACK(on_group_button_press_event), (gpointer)self); // add voice machine controls into the table table=gtk_table_new(/*rows=*/params+1,/*columns=*/2,/*homogenous=*/FALSE); for(i=0,k=0;ipriv->machine,i)) continue; pname=bt_machine_get_voice_param_name(self->priv->machine,i); bt_machine_get_voice_param_details(self->priv->machine,i,&property,&range_min,&range_max); GST_INFO("voice property %p has name '%s','%s'",property,property->name,pname); make_param_control(self,machine_voice,pname,property,range_min,range_max,table,k++,pg); } // eat remaning space //gtk_table_attach(GTK_TABLE(table),gtk_label_new(" "), 0, 3, k, k+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_container_add(GTK_CONTAINER(expander),table); g_object_unref(machine_voice); } return(expander); } static void on_machine_voices_notify(const BtMachine *machine,GParamSpec *arg,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); gulong i,new_voices,voice_params; GtkWidget *expander; GstElement *machine_object; g_object_get((gpointer)machine, "voices",&new_voices, "voice-params",&voice_params, "machine",&machine_object, NULL); GST_INFO("voices changed: %lu -> %lu",self->priv->voices,new_voices); if(new_voices>self->priv->voices) { for(i=self->priv->voices;ipriv->param_group_box),expander,TRUE,TRUE,0); gtk_box_reorder_child(GTK_BOX(self->priv->param_group_box),expander,self->priv->num_global+i); gtk_widget_show_all(expander); } } gst_object_unref(machine_object); } else { GList *children,*node; children=gtk_container_get_children(GTK_CONTAINER(self->priv->param_group_box)); node=g_list_last(children); // skip wire param boxes for(i=0;ipriv->num_wires;i++) node=g_list_previous(node); for(i=self->priv->voices;i>new_voices;i--) { // remove ui for voice gtk_container_remove(GTK_CONTAINER(self->priv->param_group_box),GTK_WIDGET(node->data)); // no need to disconnect signals as the voice_child is already gone node=g_list_previous(node); } g_list_free(children); } self->priv->voices=new_voices; } static void on_wire_machine_id_changed(const BtMachine *machine,GParamSpec *arg,gpointer user_data) { gchar *id,*title; g_object_get((GObject *)machine,"id",&id,NULL); /* set group title */ title=g_strdup_printf(_("%s wire properties"),id); gtk_expander_set_label(GTK_EXPANDER(user_data),title); g_free(id);g_free(title); } static GtkWidget *make_wire_param_box(const BtMachinePropertiesDialog *self,BtWire *wire) { GtkWidget *expander=NULL; GtkWidget *table; GstObject *param_parent; ParamGroup *pg; GParamSpec *property; GValue *range_min,*range_max; gulong i,params; BtMachine *src; g_object_get(wire,"num-params",¶ms,"src",&src,NULL); if(params) { const gchar *pname; expander=gtk_expander_new(NULL); gtk_expander_set_expanded(GTK_EXPANDER(expander),TRUE); on_wire_machine_id_changed(src,NULL,(gpointer)expander); g_signal_connect(src,"notify::id",G_CALLBACK(on_wire_machine_id_changed),(gpointer)expander); pg=make_param_group(params); g_hash_table_insert(self->priv->param_groups,expander,pg); g_hash_table_insert(self->priv->group_to_object,wire,expander); g_signal_connect(expander,"button-press-event",G_CALLBACK(on_group_button_press_event), (gpointer)self); // add wire controls into the table table=gtk_table_new(/*rows=*/params+1,/*columns=*/2,/*homogenous=*/FALSE); self->priv->num_wires++; for(i=0;iname,pname); // bah, hardcoded hack switch(i) { case 0: g_object_get(wire,"gain",¶m_parent,NULL); break; case 1: g_object_get(wire,"pan",¶m_parent,NULL); break; default: GST_WARNING("unimplemented wire param"); break; } make_param_control(self,GST_OBJECT(param_parent),pname,property,range_min,range_max,table,i,pg); gst_object_unref(param_parent); param_parent=NULL; } // eat remaning space //gtk_table_attach(GTK_TABLE(table),gtk_label_new(" "), 0, 3, k, k+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_container_add(GTK_CONTAINER(expander),table); } g_object_unref(src); return(expander); } static void on_wire_added(const BtSetup *setup,BtWire *wire,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *expander; BtMachine *dst; g_object_get(wire,"dst",&dst,NULL); if(dst==self->priv->machine) { if((expander=make_wire_param_box(self,wire))) { gtk_box_pack_start(GTK_BOX(self->priv->param_group_box),expander,TRUE,TRUE,0); gtk_widget_show_all(expander); } } g_object_unref(dst); } static void on_wire_removed(const BtSetup *setup,BtWire *wire,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); GtkWidget *expander; // determine the right expander if((expander=g_hash_table_lookup(self->priv->group_to_object,wire))) { GstObject *src; // disconnect signal handlers g_object_get(wire,"src",&src,NULL); g_signal_handlers_disconnect_matched(src,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_machine_id_changed,expander); g_object_unref(src); gtk_container_remove(GTK_CONTAINER(self->priv->param_group_box),GTK_WIDGET(expander)); g_hash_table_remove(self->priv->group_to_object,wire); g_hash_table_remove(self->priv->param_groups,expander); self->priv->num_wires--; } } static void on_machine_id_changed(const BtMachine *machine,GParamSpec *arg,gpointer user_data) { BtMachinePropertiesDialog *self=BT_MACHINE_PROPERTIES_DIALOG(user_data); gchar *id,*title; g_object_get((GObject *)machine,"id",&id,NULL); title=g_strdup_printf(_("%s properties"),id); gtk_window_set_title(GTK_WINDOW(self),title); g_free(id);g_free(title); } static gboolean bt_machine_properties_dialog_init_preset_box(const BtMachinePropertiesDialog *self) { GtkWidget *scrolled_window; GtkWidget *tool_item,*remove_tool_button,*edit_tool_button; GtkTreeSelection *tree_sel; GtkCellRenderer *renderer; GtkTreeViewColumn *tree_col; self->priv->preset_box=gtk_vbox_new(FALSE,0); // add preset controls toolbar self->priv->preset_toolbar=gtk_toolbar_new(); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_ADD)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Add new preset")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->preset_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_preset_add_clicked),(gpointer)self); remove_tool_button=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_REMOVE)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Remove preset")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->preset_toolbar),GTK_TOOL_ITEM(remove_tool_button),-1); g_signal_connect(remove_tool_button,"clicked",G_CALLBACK(on_toolbar_preset_remove_clicked),(gpointer)self); edit_tool_button=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_EDIT)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Edit preset name and comment")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->preset_toolbar),GTK_TOOL_ITEM(edit_tool_button),-1); g_signal_connect(edit_tool_button,"clicked",G_CALLBACK(on_toolbar_preset_edit_clicked),(gpointer)self); gtk_box_pack_start(GTK_BOX(self->priv->preset_box),self->priv->preset_toolbar,FALSE,FALSE,0); // add preset list scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_IN); self->priv->preset_list=gtk_tree_view_new(); g_object_set(self->priv->preset_list,"enable-search",FALSE,"rules-hint",TRUE,"fixed-height-mode",TRUE,NULL); tree_sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->preset_list)); gtk_tree_selection_set_mode(tree_sel,GTK_SELECTION_SINGLE); g_object_set(self->priv->preset_list,"has-tooltip",TRUE,NULL); g_signal_connect(self->priv->preset_list, "query-tooltip", G_CALLBACK(on_preset_list_query_tooltip), (gpointer)self); // alternative: gtk_tree_view_set_tooltip_row g_signal_connect(self->priv->preset_list, "row-activated", G_CALLBACK(on_preset_list_row_activated), (gpointer)self); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_preset_list_selection_changed), (gpointer)remove_tool_button); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_preset_list_selection_changed), (gpointer)edit_tool_button); // add cell renderers renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"xalign",0.0,NULL); if((tree_col=gtk_tree_view_column_new_with_attributes(_("Preset"),renderer,"text",0,NULL))) { g_object_set(tree_col,"sizing",GTK_TREE_VIEW_COLUMN_FIXED,"fixed-width",135,NULL); gtk_tree_view_insert_column(GTK_TREE_VIEW(self->priv->preset_list),tree_col,-1); } else GST_WARNING("can't create treeview column"); // add list data /* @todo: need a presets-changed signal refresh the list * - then we can also remove the preset_list_refresh() calls in the callback * that change the presets * @todo: need a presets-changed signal on the class level * - if we have two instances running, the other wants to reload the list */ preset_list_refresh(self); gtk_container_add(GTK_CONTAINER(scrolled_window),self->priv->preset_list); gtk_box_pack_start(GTK_BOX(self->priv->preset_box),GTK_WIDGET(scrolled_window),TRUE,TRUE,0); // the list is static, don't free //g_list_free(presets); return(TRUE); } static void bt_machine_properties_dialog_init_ui(const BtMachinePropertiesDialog *self) { BtMainWindow *main_window; BtSong *song; BtSetup *setup; GtkWidget *param_box,*hbox; GtkWidget *expander,*scrolled_window; GtkWidget *tool_item; GdkPixbuf *window_icon=NULL; gulong global_params,voice_params; GstElement *machine; BtSettings *settings; GList *wires; gtk_widget_set_name(GTK_WIDGET(self),_("machine properties")); g_object_get(self->priv->app,"main-window",&main_window,"settings",&settings,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); gtk_window_set_transient_for(GTK_WINDOW(self),GTK_WINDOW(main_window)); // create and set window icon if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } // leave the choice of width to gtk //gtk_window_set_default_size(GTK_WINDOW(self),-1,200); ////gtk_widget_set_size_request(GTK_WIDGET(self),300,200); //gtk_window_set_default_size(GTK_WINDOW(self),300,-1); // get machine data g_object_get(self->priv->machine, "global-params",&global_params, "voice-params",&voice_params, "voices",&self->priv->voices, "machine",&machine, NULL); // set dialog title on_machine_id_changed(self->priv->machine,NULL,(gpointer)self); GST_INFO("machine has %lu global properties, %lu voice properties and %lu voices",global_params,voice_params,self->priv->voices); // add widgets to the dialog content area // should we use a hpaned or hbox for the presets? hbox=gtk_hbox_new(FALSE,12); param_box=gtk_vbox_new(FALSE,0); //gtk_container_set_border_width(GTK_CONTAINER(param_box),6); gtk_box_pack_start(GTK_BOX(hbox),param_box,TRUE,TRUE,0); // create preset pane if(GST_IS_PRESET(machine)) { if(bt_machine_properties_dialog_init_preset_box(self)) { gtk_box_pack_end(GTK_BOX(hbox),self->priv->preset_box,FALSE,FALSE,0); } } // create toolbar self->priv->main_toolbar=gtk_toolbar_new(); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_ABOUT)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Info about this machine")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->main_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_about_clicked),(gpointer)self); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_HELP)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Help for this machine")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->main_toolbar),GTK_TOOL_ITEM(tool_item),-1); if(!self->priv->help_uri) { gtk_widget_set_sensitive(tool_item,FALSE); } else { g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_help_clicked),(gpointer)self); } tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_NEW)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Randomize parameters")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->main_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_random_clicked),(gpointer)self); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_UNDO)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Reset parameters to defaults")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->main_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_reset_clicked),(gpointer)self); // @todo: add copy/paste buttons tool_item=GTK_WIDGET(gtk_toggle_tool_button_new_from_stock(GTK_STOCK_INDEX)); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Show/Hide preset pane")); gtk_tool_button_set_label(GTK_TOOL_BUTTON(tool_item),_("Presets")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->main_toolbar),GTK_TOOL_ITEM(tool_item),-1); if(!GST_IS_PRESET(machine)) { gtk_widget_set_sensitive(tool_item,FALSE); } else { GHashTable *properties; gchar *prop; gboolean hidden=TRUE; /* @todo: add settings for "show presets by default" */ g_object_get(self->priv->machine,"properties",&properties,NULL); if((prop=(gchar *)g_hash_table_lookup(properties,"presets-shown"))) { if(atoi(prop)) { hidden=FALSE; } } gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(tool_item),!hidden); gtk_widget_set_no_show_all(self->priv->preset_box,hidden); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_show_hide_clicked),(gpointer)self); } // let settings control toolbar style on_toolbar_style_changed(settings,NULL,(gpointer)self); g_signal_connect(settings, "notify::toolbar-style", G_CALLBACK(on_toolbar_style_changed), (gpointer)self); gtk_box_pack_start(GTK_BOX(param_box),self->priv->main_toolbar,FALSE,FALSE,0); // machine controls inside a scrolled window scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_NONE); self->priv->param_group_box=gtk_vbox_new(FALSE,0); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),self->priv->param_group_box); gtk_box_pack_start(GTK_BOX(param_box),scrolled_window,TRUE,TRUE,0); g_signal_connect(self->priv->param_group_box,"size-request",G_CALLBACK(on_box_size_request),(gpointer)self); /* show widgets for global parameters */ if(global_params) { if((expander=make_global_param_box(self,global_params,voice_params,machine))) { gtk_box_pack_start(GTK_BOX(self->priv->param_group_box),expander,TRUE,TRUE,0); } } /* show widgets for voice parameters */ if(self->priv->voices*voice_params) { gulong j; for(j=0;jpriv->voices;j++) { if((expander=make_voice_param_box(self,voice_params,j,machine))) { gtk_box_pack_start(GTK_BOX(self->priv->param_group_box),expander,TRUE,TRUE,0); } } } /* show volume/panorama widgets for incomming wires */ if((wires=self->priv->machine->dst_wires)) { BtWire *wire; GList *node; for(node=wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); if((expander=make_wire_param_box(self,wire))) { gtk_box_pack_start(GTK_BOX(self->priv->param_group_box),expander,TRUE,TRUE,0); } } } gtk_container_add(GTK_CONTAINER(self),hbox); // set focus on first parameters g_signal_connect((gpointer)self,"show",G_CALLBACK(on_window_show),(gpointer)self); // dynamically adjust voices g_signal_connect(self->priv->machine,"notify::voices",G_CALLBACK(on_machine_voices_notify),(gpointer)self); // dynamically adjust wire params g_signal_connect(setup,"wire-added",G_CALLBACK(on_wire_added),(gpointer)self); g_signal_connect(setup,"wire-removed",G_CALLBACK(on_wire_removed),(gpointer)self); // track machine name (keep window title up-to-date) g_signal_connect(self->priv->machine,"notify::id",G_CALLBACK(on_machine_id_changed),(gpointer)self); g_object_unref(machine); g_object_unref(setup); g_object_unref(song); g_object_unref(main_window); g_object_unref(settings); } //-- constructor methods /** * bt_machine_properties_dialog_new: * @machine: the machine to create the dialog for * * Create a new instance * * Returns: the new instance */ BtMachinePropertiesDialog *bt_machine_properties_dialog_new(const BtMachine *machine) { BtMachinePropertiesDialog *self; self=BT_MACHINE_PROPERTIES_DIALOG(g_object_new(BT_TYPE_MACHINE_PROPERTIES_DIALOG,"machine",machine,NULL)); bt_machine_properties_dialog_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); if(self->priv->preset_box) { gtk_widget_set_no_show_all(self->priv->preset_box,FALSE); } return(self); } //-- methods //-- wrapper //-- class internals static void bt_machine_properties_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachinePropertiesDialog *self = BT_MACHINE_PROPERTIES_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_PROPERTIES_DIALOG_MACHINE: { g_object_try_unref(self->priv->machine); self->priv->machine = g_value_dup_object(value); if(self->priv->machine) { GstElement *element; g_object_get(self->priv->machine,"machine",&element,NULL); #if GST_CHECK_VERSION(0,10,31) self->priv->help_uri=gst_element_factory_get_documentation_uri(gst_element_get_factory(element)); #else if(GSTBT_IS_HELP(element)) g_object_get(element,"documentation-uri",&self->priv->help_uri,NULL); else self->priv->help_uri=NULL; #endif gst_object_unref(element); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_properties_dialog_dispose(GObject *object) { BtMachinePropertiesDialog *self = BT_MACHINE_PROPERTIES_DIALOG(object); BtSong *song; BtSetup *setup; gulong j; GstElement *machine; GstObject *machine_voice; GList *wires; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { g_object_get(song,"setup",&setup,NULL); } else { setup=NULL; } // disconnect handlers g_signal_handlers_disconnect_matched(self->priv->machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_voices_notify,self); g_signal_handlers_disconnect_matched(self->priv->machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_id_changed,self); // disconnect wire handlers if(setup) { g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_added,self); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_removed,self); } // disconnect all handlers that are connected to params g_object_get(self->priv->machine,"machine",&machine,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_float_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_double_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_int_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_uint_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_uint64_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_checkbox_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_combobox_property_notify,NULL); for(j=0;jpriv->voices;j++) { machine_voice=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(machine),j); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_float_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_double_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_int_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_uint_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_uint64_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_checkbox_property_notify,NULL); g_signal_handlers_disconnect_matched(machine_voice,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_combobox_property_notify,NULL); } // disconnect wire parameters if((wires=self->priv->machine->dst_wires)) { BtWire *wire; GstObject *src,*gain,*pan; GList *node; for(node=wires;node;node=g_list_next(node)) { wire=BT_WIRE(node->data); g_object_get(wire,"src",&src,"gain",&gain,"pan",&pan,NULL); if(gain) { g_signal_handlers_disconnect_matched(gain,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_float_range_property_notify,NULL); g_signal_handlers_disconnect_matched(gain,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_double_range_property_notify,NULL); gst_object_unref(gain); } if(pan) { g_signal_handlers_disconnect_matched(pan,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_float_range_property_notify,NULL); g_signal_handlers_disconnect_matched(pan,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_double_range_property_notify,NULL); gst_object_unref(pan); } g_signal_handlers_disconnect_matched(src,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_machine_id_changed,g_hash_table_lookup(self->priv->group_to_object,wire)); g_object_unref(src); } } g_object_unref(machine); g_object_try_unref(setup); g_object_try_unref(song); // get rid of context menus if(self->priv->group_menu) { gtk_widget_destroy(GTK_WIDGET(self->priv->group_menu)); g_object_unref(self->priv->group_menu); } for(j=0;j<2;j++) { if(self->priv->param_menu[j]) { gtk_widget_destroy(GTK_WIDGET(self->priv->param_menu[j])); g_object_unref(self->priv->param_menu[j]); } } g_object_try_unref(self->priv->machine); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_machine_properties_dialog_parent_class)->dispose(object); } static void bt_machine_properties_dialog_finalize(GObject *object) { BtMachinePropertiesDialog *self = BT_MACHINE_PROPERTIES_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_hash_table_destroy(self->priv->group_to_object); g_hash_table_destroy(self->priv->param_groups); G_OBJECT_CLASS(bt_machine_properties_dialog_parent_class)->finalize(object); } static void bt_machine_properties_dialog_init(BtMachinePropertiesDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_PROPERTIES_DIALOG, BtMachinePropertiesDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->group_to_object=g_hash_table_new(NULL,NULL); self->priv->param_groups=g_hash_table_new_full(NULL,NULL,NULL,free_param_group); } static void bt_machine_properties_dialog_class_init(BtMachinePropertiesDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); wdget_peer_quark=g_quark_from_static_string("BtMachinePropertiesDialog::widget-peer"); widget_parent_quark=g_quark_from_static_string("BtMachinePropertiesDialog::widget-parent"); control_object_quark=g_quark_from_static_string("BtMachinePropertiesDialog::control-object"); control_property_quark=g_quark_from_static_string("BtMachinePropertiesDialog::control-property"); widget_param_group_quark=g_quark_from_static_string("BtMachinePropertiesDialog::widget-param-group"); widget_param_num_quark=g_quark_from_static_string("BtMachinePropertiesDialog::widget-param-num"); g_type_class_add_private(klass,sizeof(BtMachinePropertiesDialogPrivate)); gobject_class->set_property = bt_machine_properties_dialog_set_property; gobject_class->dispose = bt_machine_properties_dialog_dispose; gobject_class->finalize = bt_machine_properties_dialog_finalize; g_object_class_install_property(gobject_class,MACHINE_PROPERTIES_DIALOG_MACHINE, g_param_spec_object("machine", "machine construct prop", "Set machine object, the dialog handles", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/tip-dialog.h0000644042355400116100000000403511625722250014650 00000000000000/* $Id: tip-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_TIP_DIALOG_H #define BT_TIP_DIALOG_H #include #include #define BT_TYPE_TIP_DIALOG (bt_tip_dialog_get_type ()) #define BT_TIP_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_TIP_DIALOG, BtTipDialog)) #define BT_TIP_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_TIP_DIALOG, BtTipDialogClass)) #define BT_IS_TIP_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_TIP_DIALOG)) #define BT_IS_TIP_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_TIP_DIALOG)) #define BT_TIP_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_TIP_DIALOG, BtTipDialogClass)) /* type macros */ typedef struct _BtTipDialog BtTipDialog; typedef struct _BtTipDialogClass BtTipDialogClass; typedef struct _BtTipDialogPrivate BtTipDialogPrivate; /** * BtTipDialog: * * the about dialog for the editor application */ struct _BtTipDialog { GtkDialog parent; /*< private >*/ BtTipDialogPrivate *priv; }; struct _BtTipDialogClass { GtkDialogClass parent; }; GType bt_tip_dialog_get_type(void) G_GNUC_CONST; BtTipDialog *bt_tip_dialog_new(void); #endif // BT_TIP_DIALOG_H buzztard-0.6.0/src/ui/edit/settings-page-playback-controller.c0000644042355400116100000001551411606564733021346 00000000000000/* $Id: settings-page-playback-controller.c 3472 2011-07-11 12:17:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingspageplaybackcontroller * @short_description: playback controller configuration settings page * * Lists available playback controllers and allows to configure them. */ /* @todo: add a list of playback controlers: * - upnp coherence/gupnp * - alsa midi MC * - jack midi MC * - when clicking one, we switch the pane below * - in the lst we show name and a checkbox to enable/disable them */ #define BT_EDIT #define BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_C #include "bt-edit.h" enum { //DEVICE_MENU_ICON=0, DEVICE_MENU_LABEL=0, DEVICE_MENU_DEVICE }; struct _BtSettingsPagePlaybackControllerPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; GtkWidget *port_entry; }; //-- the class G_DEFINE_TYPE (BtSettingsPagePlaybackController, bt_settings_page_playback_controller, GTK_TYPE_TABLE); //-- event handler static void on_activate_toggled(GtkToggleButton *togglebutton, gpointer user_data) { BtSettingsPagePlaybackController *self=BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER(user_data); BtSettings *settings; gboolean active=gtk_toggle_button_get_active(togglebutton); gboolean active_setting; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"coherence-upnp-active",&active_setting,NULL); GST_INFO("upnp active changes from %d -> %d",active_setting,active); if(active!=active_setting) { g_object_set(settings,"coherence-upnp-active",active,NULL); } gtk_widget_set_sensitive(self->priv->port_entry,active); g_object_unref(settings); } static void on_port_changed(GtkSpinButton *spinbutton,gpointer user_data) { BtSettingsPagePlaybackController *self=BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER(user_data); BtSettings *settings; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"coherence-upnp-port",gtk_spin_button_get_value_as_int(spinbutton),NULL); g_object_unref(settings); } //-- helper methods static void bt_settings_page_playback_controller_init_ui(const BtSettingsPagePlaybackController *self) { BtSettings *settings; GtkWidget *label,*spacer,*widget; GtkAdjustment *spin_adjustment; gboolean active; guint port; gchar *str; gtk_widget_set_name(GTK_WIDGET(self),"playback controller settings"); // get settings g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"coherence-upnp-active",&active,"coherence-upnp-port",&port,NULL); // add setting widgets spacer=gtk_label_new(" "); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Playback Controller")); gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(self),spacer, 0, 1, 1, 4, GTK_SHRINK,GTK_SHRINK, 2,1); // don't translate, this is a product label=gtk_label_new("Coherence UPnP"); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_check_button_new(); gtk_table_attach(GTK_TABLE(self),widget, 2, 3, 1, 2, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); // local network port number for socket communication label=gtk_label_new(_("Port number")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new((gdouble)port, 1024.0, 65536.0, 1.0, 5.0, 0.0)); self->priv->port_entry=gtk_spin_button_new(spin_adjustment,1.0,0); gtk_table_attach(GTK_TABLE(self),self->priv->port_entry, 2, 3, 2, 3, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); // add coherence URL label=gtk_label_new("Requires Coherence UPnP framework which can be found at: https://coherence.beebits.net."); gtk_label_set_line_wrap(GTK_LABEL(label),TRUE); gtk_label_set_selectable(GTK_LABEL(label),TRUE); gtk_table_attach(GTK_TABLE(self),label, 1, 3, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); // set current settings g_signal_connect(widget, "toggled", G_CALLBACK(on_activate_toggled), (gpointer)self); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),active); g_signal_connect(self->priv->port_entry, "value-changed", G_CALLBACK(on_port_changed), (gpointer)self); g_object_unref(settings); } //-- constructor methods /** * bt_settings_page_playback_controller_new: * * Create a new instance * * Returns: the new instance */ BtSettingsPagePlaybackController *bt_settings_page_playback_controller_new(void) { BtSettingsPagePlaybackController *self; self=BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER(g_object_new(BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER, "n-rows",4, "n-columns",3, "homogeneous",FALSE, NULL)); bt_settings_page_playback_controller_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_page_playback_controller_dispose(GObject *object) { BtSettingsPagePlaybackController *self = BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_page_playback_controller_parent_class)->dispose(object); } static void bt_settings_page_playback_controller_init(BtSettingsPagePlaybackController *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER, BtSettingsPagePlaybackControllerPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_page_playback_controller_class_init(BtSettingsPagePlaybackControllerClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsPagePlaybackControllerPrivate)); gobject_class->dispose = bt_settings_page_playback_controller_dispose; } buzztard-0.6.0/src/ui/edit/main-statusbar.h0000644042355400116100000000444011625722250015551 00000000000000/* $Id: main-statusbar.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_STATUSBAR_H #define BT_MAIN_STATUSBAR_H #include #include #define BT_TYPE_MAIN_STATUSBAR (bt_main_statusbar_get_type ()) #define BT_MAIN_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_STATUSBAR, BtMainStatusbar)) #define BT_MAIN_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_STATUSBAR, BtMainStatusbarClass)) #define BT_IS_MAIN_STATUSBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_STATUSBAR)) #define BT_IS_MAIN_STATUSBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_STATUSBAR)) #define BT_MAIN_STATUSBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_STATUSBAR, BtMainStatusbarClass)) /* type macros */ typedef struct _BtMainStatusbar BtMainStatusbar; typedef struct _BtMainStatusbarClass BtMainStatusbarClass; typedef struct _BtMainStatusbarPrivate BtMainStatusbarPrivate; /** * BtMainStatusbar: * * the root window for the editor application */ struct _BtMainStatusbar { GtkHBox parent; /*< private >*/ BtMainStatusbarPrivate *priv; }; struct _BtMainStatusbarClass { GtkHBoxClass parent; }; /** * BT_MAIN_STATUSBAR_DEFAULT: * * Default text to display when idle. */ #define BT_MAIN_STATUSBAR_DEFAULT _("Ready to rock!") GType bt_main_statusbar_get_type(void) G_GNUC_CONST; BtMainStatusbar *bt_main_statusbar_new(void); #endif // BT_MAIN_STATUSBAR_H buzztard-0.6.0/src/ui/edit/interaction-controller-learn-dialog.h0000644042355400116100000000544111625722250021655 00000000000000/* $Id: interaction-controller-learn-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_INTERACTION_CONTROLLER_LEARN_DIALOG_H #define BT_INTERACTION_CONTROLLER_LEARN_DIALOG_H #include #include #define BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG (bt_interaction_controller_learn_dialog_get_type ()) #define BT_INTERACTION_CONTROLLER_LEARN_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG, BtInteractionControllerLearnDialog)) #define BT_INTERACTION_CONTROLLER_LEARN_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG, BtInteractionControllerLearnDialogClass)) #define BT_IS_INTERACTION_CONTROLLER_LEARN_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG)) #define BT_IS_INTERACTION_CONTROLLER_LEARN_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG)) #define BT_INTERACTION_CONTROLLER_LEARN_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG, BtInteractionControllerLearnDialogClass)) /* type macros */ typedef struct _BtInteractionControllerLearnDialog BtInteractionControllerLearnDialog; typedef struct _BtInteractionControllerLearnDialogClass BtInteractionControllerLearnDialogClass; typedef struct _BtInteractionControllerLearnDialogPrivate BtInteractionControllerLearnDialogPrivate; /** * BtInteractionControllerLearnDialog: * * dynamic controller learn dialog */ struct _BtInteractionControllerLearnDialog { GtkDialog parent; /*< private >*/ BtInteractionControllerLearnDialogPrivate *priv; }; struct _BtInteractionControllerLearnDialogClass { GtkDialogClass parent; }; GType bt_interaction_controller_learn_dialog_get_type(void) G_GNUC_CONST; BtInteractionControllerLearnDialog *bt_interaction_controller_learn_dialog_new(BtIcDevice *device); #endif // BT_INTERACTION_CONTROLLER_LEARN_DIALOG_H buzztard-0.6.0/src/ui/edit/Makefile.in0000644042355400116100000010740411675570634014533 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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@ bin_PROGRAMS = buzztard-edit$(EXEEXT) subdir = src/ui/edit DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = libbtedit_la_DEPENDENCIES = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am__objects_1 = marshal.lo am_libbtedit_la_OBJECTS = about-dialog.lo change-log.lo \ change-logger.lo crash-recover-dialog.lo edit-application.lo \ interaction-controller-menu.lo \ interaction-controller-learn-dialog.lo machine-canvas-item.lo \ machine-menu.lo machine-actions.lo machine-list-model.lo \ machine-preset-properties-dialog.lo \ machine-properties-dialog.lo machine-preferences-dialog.lo \ machine-rename-dialog.lo main-window.lo main-menu.lo \ main-toolbar.lo main-pages.lo main-page-machines.lo \ main-page-patterns.lo main-page-sequence.lo main-page-waves.lo \ main-page-info.lo main-statusbar.lo \ missing-framework-elements-dialog.lo \ missing-song-elements-dialog.lo object-list-model.lo \ panorama-popup.lo pattern-list-model.lo \ pattern-properties-dialog.lo playback-controller-socket.lo \ render-dialog.lo render-progress.lo sequence-grid-model.lo \ sequence-view.lo settings-dialog.lo \ settings-page-audiodevices.lo settings-page-directories.lo \ settings-page-interaction-controller.lo \ settings-page-playback-controller.lo \ settings-page-shortcuts.lo signal-analysis-dialog.lo \ tip-dialog.lo tools.lo ui-resources.lo volume-popup.lo \ wave-viewer.lo wire-canvas-item.lo pattern-editor.lo \ gtkvumeter.lo ruler.lo btmemoryaudiosrc.lo $(am__objects_1) libbtedit_la_OBJECTS = $(am_libbtedit_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)" \ "$(DESTDIR)$(gtkrcdir)" PROGRAMS = $(bin_PROGRAMS) am_buzztard_edit_OBJECTS = bt-edit.$(OBJEXT) buzztard_edit_OBJECTS = $(am_buzztard_edit_OBJECTS) buzztard_edit_DEPENDENCIES = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la libbtedit.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbtedit_la_SOURCES) $(buzztard_edit_SOURCES) DIST_SOURCES = $(libbtedit_la_SOURCES) $(buzztard_edit_SOURCES) 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' DATA = $(desktop_DATA) $(gtkrc_DATA) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ buzztard_edit_LDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ libbtedit.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) \ -lgstinterfaces-0.10 buzztard_edit_SOURCES = \ bt-edit.c bt-edit.h # these sources (also mentioned above) are generated. BUILT_SOURCES = marshal.h marshal.c noinst_LTLIBRARIES = libbtedit.la noinst_HEADERS = marshal.h libbtedit_la_LIBADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) $(LIBM) \ -lgstinterfaces-0.10 libbtedit_la_SOURCES = \ about-dialog.c about-dialog.h \ change-log.c change-log.h \ change-logger.c change-logger.h \ crash-recover-dialog.c crash-recover-dialog.h \ edit-application.c edit-application.h \ interaction-controller-menu.c interaction-controller-menu.h \ interaction-controller-learn-dialog.c interaction-controller-learn-dialog.h \ machine-canvas-item.c machine-canvas-item.h \ machine-menu.c machine-menu.h \ machine-actions.c machine-actions.h \ machine-list-model.c machine-list-model.h \ machine-preset-properties-dialog.c machine-preset-properties-dialog.h \ machine-properties-dialog.c machine-properties-dialog.h \ machine-preferences-dialog.c machine-preferences-dialog.h \ machine-rename-dialog.c machine-rename-dialog.h \ main-window.c main-window.h \ main-menu.c main-menu.h \ main-toolbar.c main-toolbar.h \ main-pages.c main-pages.h \ main-page-machines.c main-page-machines.h \ main-page-patterns.c main-page-patterns.h \ main-page-sequence.c main-page-sequence.h \ main-page-waves.c main-page-waves.h \ main-page-info.c main-page-info.h \ main-statusbar.c main-statusbar.h \ missing-framework-elements-dialog.c missing-framework-elements-dialog.h \ missing-song-elements-dialog.c missing-song-elements-dialog.h \ object-list-model.c object-list-model.h \ panorama-popup.c panorama-popup.h \ pattern-list-model.c pattern-list-model.h \ pattern-properties-dialog.c pattern-properties-dialog.h \ playback-controller-socket.c playback-controller-socket.h \ render-dialog.c render-dialog.h \ render-progress.c render-progress.h \ sequence-grid-model.c sequence-grid-model.h \ sequence-view.c sequence-view.h \ settings-dialog.c settings-dialog.h \ settings-page-audiodevices.c settings-page-audiodevices.h \ settings-page-directories.c settings-page-directories.h \ settings-page-interaction-controller.c settings-page-interaction-controller.h \ settings-page-playback-controller.c settings-page-playback-controller.h \ settings-page-shortcuts.c settings-page-shortcuts.h \ signal-analysis-dialog.c signal-analysis-dialog.h \ tip-dialog.c tip-dialog.h \ tools.c tools.h \ ui-resources.c ui-resources.h \ volume-popup.c volume-popup.h \ wave-viewer.c wave-viewer.h \ wire-canvas-item.c wire-canvas-item.h \ \ pattern-editor.c pattern-editor.h \ gtkvumeter.c gtkvumeter.h \ ruler.c ruler.h \ \ btmemoryaudiosrc.c btmemoryaudiosrc.h \ \ $(BUILT_SOURCES) AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DPREFIX=\"$(prefix)\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) AM_LDFLAGS = $(BT_LDFLAGS) desktopdir = ${with_desktop_dir}/applications desktop_in_files = buzztard-edit.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) # FIXME: don't install bt-edit.hildon.gtkrc on non hildon gtkrcdir = $(datadir)/$(PACKAGE) gtkrc_DATA = bt-edit.gtkrc bt-edit.hildon.gtkrc # CLEANFILES is for files generated by make CLEANFILES = $(desktop_DATA) $(BUILT_SOURCES) EXTRA_DIST = $(desktop_in_files) $(gtkrc_DATA) marshal.list all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 src/ui/edit/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ui/edit/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbtedit.la: $(libbtedit_la_OBJECTS) $(libbtedit_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbtedit_la_OBJECTS) $(libbtedit_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ 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 installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad buzztard-edit$(EXEEXT): $(buzztard_edit_OBJECTS) $(buzztard_edit_DEPENDENCIES) @rm -f buzztard-edit$(EXEEXT) $(AM_V_CCLD)$(LINK) $(buzztard_edit_OBJECTS) $(buzztard_edit_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/about-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-edit.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/btmemoryaudiosrc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/change-log.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/change-logger.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crash-recover-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/edit-application.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkvumeter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interaction-controller-learn-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interaction-controller-menu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-actions.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-canvas-item.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-list-model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-menu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-preferences-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-preset-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/machine-rename-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-menu.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-page-info.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-page-machines.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-page-patterns.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-page-sequence.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-page-waves.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-pages.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-statusbar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-toolbar.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main-window.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/marshal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/missing-framework-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/missing-song-elements-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/object-list-model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/panorama-popup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pattern-editor.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pattern-list-model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pattern-properties-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playback-controller-socket.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render-progress.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ruler.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sequence-grid-model.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sequence-view.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-page-audiodevices.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-page-directories.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-page-interaction-controller.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-page-playback-controller.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/settings-page-shortcuts.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/signal-analysis-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tip-dialog.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tools.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui-resources.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/volume-popup.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave-viewer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wire-canvas-item.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)" @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ 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)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(desktopdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(desktopdir)" && rm -f $$files install-gtkrcDATA: $(gtkrc_DATA) @$(NORMAL_INSTALL) test -z "$(gtkrcdir)" || $(MKDIR_P) "$(DESTDIR)$(gtkrcdir)" @list='$(gtkrc_DATA)'; test -n "$(gtkrcdir)" || list=; \ 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)$(gtkrcdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(gtkrcdir)" || exit $$?; \ done uninstall-gtkrcDATA: @$(NORMAL_UNINSTALL) @list='$(gtkrc_DATA)'; test -n "$(gtkrcdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(gtkrcdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(gtkrcdir)" && rm -f $$files ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(gtkrcdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: 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." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-desktopDATA install-gtkrcDATA @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS 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: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-desktopDATA \ uninstall-gtkrcDATA uninstall-local .MAKE: all check install install-am install-data-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-data-hook \ install-desktopDATA install-dvi install-dvi-am install-exec \ install-exec-am install-gtkrcDATA 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 installcheck-binPROGRAMS \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-desktopDATA \ uninstall-gtkrcDATA uninstall-local @INTLTOOL_DESKTOP_RULE@ buzztard-edit.desktop: buzztard-edit.desktop.in marshal.h: marshal.list glib-genmarshal --header --prefix=bt_marshal $(srcdir)/marshal.list > marshal.h marshal.c: marshal.list glib-genmarshal --body --prefix=bt_marshal $(srcdir)/marshal.list > marshal.c # update desktop database install-data-hook: test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)"; uninstall-local: test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)"; .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtedit_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/ui/edit/sequence-view.c0000644042355400116100000002455311670227117015403 00000000000000/* $Id: sequence-view.c 3768 2011-12-08 21:38:21Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsequenceview * @short_description: the editor main sequence table view * @see_also: #BtMainPageSequence * * This widget derives from the #GtkTreeView to additionaly draw loop- and * play-position bars. */ #define BT_EDIT #define BT_SEQUENCE_VIEW_C #include "bt-edit.h" enum { SEQUENCE_VIEW_PLAY_POSITION=1, SEQUENCE_VIEW_LOOP_START, SEQUENCE_VIEW_LOOP_END, SEQUENCE_VIEW_VISIBLE_ROWS }; struct _BtSequenceViewPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* position of playing pointer from 0.0 ... 1.0 */ gdouble play_pos; /* position of loop range from 0.0 ... 1.0 */ gdouble loop_start,loop_end; /* number of visible rows, the height of one row */ gulong visible_rows,row_height; /* cache some ressources */ GdkWindow *window; }; //-- the class G_DEFINE_TYPE (BtSequenceView, bt_sequence_view, GTK_TYPE_TREE_VIEW); //-- event handler //-- helper methods static void bt_sequence_view_invalidate(const BtSequenceView *self, gdouble old_pos, gdouble new_pos) { gdouble h=(gdouble)(self->priv->visible_rows*self->priv->row_height); GdkRectangle vr; gdouble y; gtk_tree_view_get_visible_rect(GTK_TREE_VIEW(self),&vr); y=0.5+floor((old_pos*h)-vr.y); gtk_widget_queue_draw_area(GTK_WIDGET(self),0,y-1,GTK_WIDGET(self)->allocation.width,3); y=0.5+floor((new_pos*h)-vr.y); gtk_widget_queue_draw_area(GTK_WIDGET(self),0,y-1,GTK_WIDGET(self)->allocation.width,3); } //-- constructor methods /** * bt_sequence_view_new: * * Create a new instance * * Returns: the new instance */ BtSequenceView *bt_sequence_view_new(void) { BtSequenceView *self; self=BT_SEQUENCE_VIEW(g_object_new(BT_TYPE_SEQUENCE_VIEW,NULL)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_sequence_view_realize(GtkWidget *widget) { BtSequenceView *self = BT_SEQUENCE_VIEW(widget); // first let the parent realize itslf GTK_WIDGET_CLASS(bt_sequence_view_parent_class)->realize(widget); self->priv->window=gtk_tree_view_get_bin_window(GTK_TREE_VIEW(self)); } static gboolean bt_sequence_view_expose_event(GtkWidget *widget,GdkEventExpose *event) { BtSequenceView *self = BT_SEQUENCE_VIEW(widget); //GST_INFO("!!!! self=%p",self); // let the parent handle its expose GTK_WIDGET_CLASS(bt_sequence_view_parent_class)->expose_event(widget,event); /* We need to check to make sure that the expose event is actually occuring on * the window where the table data is being drawn. If we don't do this check, * row zero spanners can be drawn on top of the column headers. */ if(self->priv->window==event->window) { gdouble w,h,y; GdkRectangle vr; cairo_t *c = gdk_cairo_create(self->priv->window); gdouble cr,cg,cb; gdouble loop_pos_dash_list[]= {4.0 }; if(G_UNLIKELY(!self->priv->row_height)) { GtkTreePath *path; GdkRectangle br; // determine row height path=gtk_tree_path_new_from_indices(0,-1); gtk_tree_view_get_background_area(GTK_TREE_VIEW(widget),path,NULL,&br); self->priv->row_height=br.height; gtk_tree_path_free(path); GST_INFO("view=%p, cell background rect: %d x %d, %d x %d",widget,br.x,br.y,br.width,br.height); } gtk_tree_view_get_visible_rect(GTK_TREE_VIEW(widget),&vr); GST_DEBUG("view=%p, visible rect: %d x %d, %d x %d, alloc: %d x %d", widget,vr.x,vr.y,vr.width,vr.height,widget->allocation.width,widget->allocation.height); //h=(gint)(self->priv->play_pos*(double)widget->allocation.height); //w=vr.width; //h=(gint)(self->priv->play_pos*(double)vr.height); w=(gdouble)widget->allocation.width; h=(gdouble)(self->priv->visible_rows*self->priv->row_height); // draw play-pos y=0.5 + floor((self->priv->play_pos*h)-vr.y); if((y>=0) && (y=0) && (ypriv->loop_start*h)-vr.y; if((y>=0) && (ypriv->loop_end*h)-(1+vr.y); if((y>=0) && (ypriv->play_pos; self->priv->play_pos = g_value_get_double(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { bt_sequence_view_invalidate(self,old_pos,self->priv->play_pos); } } break; case SEQUENCE_VIEW_LOOP_START: { gdouble old_pos = self->priv->loop_start; self->priv->loop_start = g_value_get_double(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { bt_sequence_view_invalidate(self,old_pos,self->priv->loop_start); } } break; case SEQUENCE_VIEW_LOOP_END: { gdouble old_pos = self->priv->loop_end; self->priv->loop_end = g_value_get_double(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { bt_sequence_view_invalidate(self,old_pos,self->priv->loop_end); } } break; case SEQUENCE_VIEW_VISIBLE_ROWS: { self->priv->visible_rows = g_value_get_ulong(value); GST_INFO("visible-rows = %lu",self->priv->visible_rows); if(gtk_widget_get_realized(GTK_WIDGET(self))) { gtk_widget_queue_draw(GTK_WIDGET(self)); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_sequence_view_dispose(GObject *object) { BtSequenceView *self = BT_SEQUENCE_VIEW(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_sequence_view_parent_class)->dispose(object); } static void bt_sequence_view_init(BtSequenceView *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SEQUENCE_VIEW, BtSequenceViewPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_sequence_view_class_init(BtSequenceViewClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSequenceViewPrivate)); gobject_class->set_property = bt_sequence_view_set_property; gobject_class->dispose = bt_sequence_view_dispose; gtkwidget_class->realize = bt_sequence_view_realize; gtkwidget_class->expose_event = bt_sequence_view_expose_event; g_object_class_install_property(gobject_class,SEQUENCE_VIEW_PLAY_POSITION, g_param_spec_double("play-position", "play position prop.", "The current playing position as a fraction", 0.0, 1.0, 0.0, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_VIEW_LOOP_START, g_param_spec_double("loop-start", "loop start position prop.", "The start position of the loop range as a fraction", 0.0, 1.0, 0.0, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_VIEW_LOOP_END, g_param_spec_double("loop-end", "loop end position prop.", "The end position of the loop range as a fraction", 0.0, 1.0, 1.0, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_VIEW_VISIBLE_ROWS, g_param_spec_ulong("visible-rows", "visible rows prop.", "The number of currntly visible sequence rows", 0, G_MAXULONG, 0, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/machine-list-model.h0000644042355400116100000000471211625722250016274 00000000000000/* $Id: machine-list-model.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_LIST_MODEL_H #define BT_MACHINE_LIST_MODEL_H #include #include #define BT_TYPE_MACHINE_LIST_MODEL (bt_machine_list_model_get_type()) #define BT_MACHINE_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_LIST_MODEL, BtMachineListModel)) #define BT_MACHINE_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_LIST_MODEL, BtMachineListModelClass)) #define BT_IS_MACHINE_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_LIST_MODEL)) #define BT_IS_MACHINE_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_LIST_MODEL)) #define BT_MACHINE_LIST_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_LIST_MODEL, BtMachineListModelClass)) /* type macros */ typedef struct _BtMachineListModel BtMachineListModel; typedef struct _BtMachineListModelClass BtMachineListModelClass; typedef struct _BtMachineListModelPrivate BtMachineListModelPrivate; /** * BtMachineListModel: * * Data model for #GtkTreeView or #GtkComboBox. */ struct _BtMachineListModel { GObject parent; /*< private >*/ BtMachineListModelPrivate *priv; }; struct _BtMachineListModelClass { GObjectClass parent; }; enum { BT_MACHINE_MODEL_ICON=0, BT_MACHINE_MODEL_LABEL, __BT_MACHINE_MODEL_N_COLUMNS }; GType bt_machine_list_model_get_type(void) G_GNUC_CONST; BtMachineListModel *bt_machine_list_model_new(BtSetup *setup); BtMachine *bt_machine_list_model_get_object(BtMachineListModel *model,GtkTreeIter *iter); #endif // BT_MACHINE_LIST_MODEL_H buzztard-0.6.0/src/ui/edit/object-list-model.h0000644042355400116100000000465111625722250016140 00000000000000/* $Id: object-list-model.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_OBJECT_LIST_MODEL_H #define BT_OBJECT_LIST_MODEL_H #include #include #define BT_TYPE_OBJECT_LIST_MODEL (bt_object_list_model_get_type()) #define BT_OBJECT_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_OBJECT_LIST_MODEL, BtObjectListModel)) #define BT_OBJECT_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_OBJECT_LIST_MODEL, BtObjectListModelClass)) #define BT_IS_OBJECT_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_OBJECT_LIST_MODEL)) #define BT_IS_OBJECT_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_OBJECT_LIST_MODEL)) #define BT_OBJECT_LIST_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_OBJECT_LIST_MODEL, BtObjectListModelClass)) /* type macros */ typedef struct _BtObjectListModel BtObjectListModel; typedef struct _BtObjectListModelClass BtObjectListModelClass; typedef struct _BtObjectListModelPrivate BtObjectListModelPrivate; /** * BtObjectListModel: * * Data model for #GtkTreeView or #GtkComboBox. */ struct _BtObjectListModel { GObject parent; /*< private >*/ BtObjectListModelPrivate *priv; }; struct _BtObjectListModelClass { GObjectClass parent; }; GType bt_object_list_model_get_type(void) G_GNUC_CONST; BtObjectListModel *bt_object_list_model_new(gint n_columns,GType object_type,...); void bt_object_list_model_append(BtObjectListModel *model,GObject *object); GObject *bt_object_list_model_get_object(BtObjectListModel *model,GtkTreeIter *iter); #endif // BT_OBJECT_LIST_MODEL_H buzztard-0.6.0/src/ui/edit/main-toolbar.c0000644042355400116100000011041111670213062015166 00000000000000/* $Id: main-toolbar.c 3767 2011-12-08 19:55:28Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmaintoolbar * @short_description: class for the editor main toolbar * * Contains typical applications buttons for file i/o and playback, plus volume * meters and volume control. */ /* @todo should we separate the toolbars? * - common - load, save, ... * - volume - gain, levels */ #define BT_EDIT #define BT_MAIN_TOOLBAR_C #include "bt-edit.h" #include "gtkvumeter.h" /* lets keep multichannel audio for later :) */ //#define MAX_VUMETER 4 #define MAX_VUMETER 2 #define DEF_VUMETER 2 #define LOW_VUMETER_VAL -90.0 struct _BtMainToolbarPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the level meters */ GtkVUMeter *vumeter[MAX_VUMETER]; G_POINTER_ALIAS(GstElement *,level); GstClock *clock; /* the volume gain */ GtkScale *volume; G_POINTER_ALIAS(GstElement *,gain); G_POINTER_ALIAS(BtMachine *,master); /* action buttons */ GtkWidget *save_button; GtkWidget *play_button; GtkWidget *stop_button; GtkWidget *loop_button; /* signal handler ids */ guint playback_update_id; guint playback_rate_id; /* playback state */ gboolean is_playing; gboolean has_error; gdouble playback_rate; /* lock for multithreaded access */ GMutex *lock; }; static GQuark bus_msg_level_quark=0; static GQuark bus_msg_level_caps_changed_quark=0; static void on_toolbar_play_clicked(GtkButton *button, gpointer user_data); static void reset_playback_rate(BtMainToolbar *self); static void on_song_volume_changed(GstElement *gain,GParamSpec *arg,gpointer user_data); //-- the class G_DEFINE_TYPE (BtMainToolbar, bt_main_toolbar, GTK_TYPE_TOOLBAR); //-- helper static gint gst_caps_get_channels(GstCaps *caps) { GstStructure *structure; gint channels=0; g_assert(caps); if(GST_CAPS_IS_SIMPLE(caps)) { if((structure=gst_caps_get_structure(caps,0))) { gst_structure_get_int(structure,"channels",&channels); GST_DEBUG("--- simple caps with channels=%d",channels); } } else { gint size,i; size=gst_caps_get_size(caps); for(i=0;ipriv->is_playing,NULL); if(!self->priv->is_playing) { gint i; GST_INFO("song stop event occurred: %p",g_thread_self()); // stop update timer and reset trick playback if(self->priv->playback_update_id) { g_source_remove(self->priv->playback_update_id); self->priv->playback_update_id=0; } bt_song_update_playback_position(song); reset_playback_rate(self); // disable stop button gtk_widget_set_sensitive(GTK_WIDGET(self->priv->stop_button),FALSE); // switch off play button gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->play_button),FALSE); // enable play button gtk_widget_set_sensitive(GTK_WIDGET(self->priv->play_button),TRUE); // reset level meters for(i=0;ipriv->vumeter[i], LOW_VUMETER_VAL, LOW_VUMETER_VAL); } self->priv->has_error = FALSE; GST_INFO("song stop event handled"); } else { // update playback position 10 times a second //self->priv->playback_update_id=g_timeout_add(100,on_song_playback_update,(gpointer)song); self->priv->playback_update_id=g_timeout_add_full(G_PRIORITY_HIGH,100,on_song_playback_update,(gpointer)song,NULL); bt_song_update_playback_position(song); // if we started playback remotely activate playbutton if(!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->play_button))) { g_signal_handlers_block_matched(self->priv->play_button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_toolbar_play_clicked,(gpointer)self); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->play_button),TRUE); g_signal_handlers_unblock_matched(self->priv->play_button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_toolbar_play_clicked,(gpointer)self); } // disable play button gtk_widget_set_sensitive(GTK_WIDGET(self->priv->play_button),FALSE); // enable stop button gtk_widget_set_sensitive(GTK_WIDGET(self->priv->stop_button),TRUE); } } static void on_toolbar_new_clicked(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtMainWindow *main_window; GST_INFO("toolbar new event occurred"); g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_main_window_new_song(main_window); g_object_unref(main_window); } static void on_toolbar_open_clicked(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtMainWindow *main_window; GST_INFO("toolbar open event occurred"); g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_main_window_open_song(main_window); g_object_unref(main_window); } static void on_toolbar_save_clicked(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtMainWindow *main_window; GST_INFO("toolbar open event occurred"); g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_main_window_save_song(main_window); g_object_unref(main_window); } static void on_toolbar_play_clicked(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); if(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button))) { BtSong *song; GST_INFO("toolbar play activated"); // get song from app and start playback g_object_get(self->priv->app,"song",&song,NULL); if(!bt_song_play(song)) { // switch off play button gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(button),FALSE); } // release the reference g_object_unref(song); } } static void on_toolbar_stop_clicked(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtSong *song; GST_INFO("toolbar stop event occurred"); // get song from app g_object_get(self->priv->app,"song",&song,NULL); bt_song_stop(song); reset_playback_rate(self); GST_INFO(" song stopped"); // release the reference g_object_unref(song); } static void on_toolbar_loop_toggled(GtkButton *button, gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtSong *song; BtSequence *sequence; gboolean loop; loop=gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button)); GST_INFO("toolbar loop toggle event occurred, new-state=%d",loop); // get song from app g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"sequence",&sequence,NULL); g_object_set(sequence,"loop",loop,NULL); bt_edit_application_set_song_unsaved(self->priv->app); // release the references g_object_unref(sequence); g_object_unref(song); } static void set_new_playback_rate(BtMainToolbar *self,gdouble playback_rate) { BtSong *song; self->priv->playback_rate=playback_rate; g_object_get(self->priv->app,"song",&song,NULL); g_object_set(song,"play-rate",self->priv->playback_rate,NULL); g_object_unref(song); } static void reset_playback_rate(BtMainToolbar *self) { set_new_playback_rate(self,1.0); if(self->priv->playback_rate_id) { g_source_remove(self->priv->playback_rate_id); self->priv->playback_rate_id=0; } } #define SEEK_FACTOR 1.2 #define SEEK_TIMEOUT 2000 #define SEEK_MAX_RATE 4.0 static gboolean on_song_playback_rate_rewind(gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gdouble playback_rate = self->priv->playback_rate * SEEK_FACTOR; GST_DEBUG(" << speedup"); if (playback_rate > -SEEK_MAX_RATE) { set_new_playback_rate(self, playback_rate); return(TRUE); } else { self->priv->playback_rate_id=0; return(FALSE); } } static gboolean on_toolbar_rewind_pressed(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); if(event->button!=1) return(FALSE); GST_DEBUG(" << pressed"); set_new_playback_rate(self,-1.0); self->priv->playback_rate_id=g_timeout_add(SEEK_TIMEOUT,on_song_playback_rate_rewind,(gpointer)self); GST_DEBUG(" << <<"); return(FALSE); } static gboolean on_toolbar_rewind_released(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); if(event->button!=1) return(FALSE); GST_DEBUG(" << released"); reset_playback_rate(self); return(FALSE); } static gboolean on_song_playback_rate_forward(gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gdouble playback_rate = self->priv->playback_rate * SEEK_FACTOR; GST_WARNING(" >> speedup"); if (playback_rate < SEEK_MAX_RATE) { set_new_playback_rate(self,playback_rate); return(TRUE); } else { self->priv->playback_rate_id=0; return(FALSE); } } static gboolean on_toolbar_forward_pressed(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); if(event->button!=1) return(FALSE); GST_DEBUG(" >> pressed"); set_new_playback_rate(self,SEEK_FACTOR); self->priv->playback_rate_id=g_timeout_add(SEEK_TIMEOUT,on_song_playback_rate_forward,(gpointer)self); GST_DEBUG(" >> >>"); return(FALSE); } static gboolean on_toolbar_forward_released(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); if(event->button!=1) return(FALSE); GST_DEBUG(" >> released"); reset_playback_rate(self); return(FALSE); } static void on_song_error(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtMainToolbar * const self=BT_MAIN_TOOLBAR(user_data); GError *err = NULL; gchar *dbg = NULL; GST_INFO("received %s bus message from %s", GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); // @todo: check domain and code gst_message_parse_error(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"ERROR: %s (%s)", err->message, (dbg ? dbg : "no details")); if(!self->priv->has_error) { BtSong *song; BtMainWindow *main_window; // get song from app g_object_get(self->priv->app,"song",&song,"main-window",&main_window,NULL); // debug the state bt_song_write_to_lowlevel_dot_file(song); bt_song_stop(song); bt_dialog_message(main_window,_("Error"),_("An error occurred"),err->message); // release the reference g_object_unref(song); g_object_unref(main_window); } g_error_free(err); g_free(dbg); self->priv->has_error = TRUE; } static void on_song_warning(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtMainToolbar * const self=BT_MAIN_TOOLBAR(user_data); GError *err = NULL; gchar *dbg = NULL; GST_INFO("received %s bus message from %s", GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); // @todo: check domain and code gst_message_parse_warning(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"WARNING: %s (%s)", err->message, (dbg ? dbg : "no details")); if(!self->priv->has_error) { BtSong *song; BtMainWindow *main_window; // get song from app g_object_get(self->priv->app,"song",&song,"main-window",&main_window,NULL); //bt_song_stop(song); bt_dialog_message(main_window,_("Warning"),_("A problem occurred"),err->message); // release the reference g_object_unref(song); g_object_unref(main_window); } g_error_free(err); g_free(dbg); } static gboolean on_delayed_idle_song_level_change(gpointer user_data) { gconstpointer * const params=(gconstpointer *)user_data; BtMainToolbar *self=(BtMainToolbar *)params[0]; GstMessage *message=(GstMessage *)params[1]; if(self) { const GstStructure *structure=gst_message_get_structure(message); const GValue *l_cur,*l_peak; gdouble cur, peak; guint i; g_mutex_lock(self->priv->lock); g_object_remove_weak_pointer((gpointer)self,(gpointer *)¶ms[0]); g_mutex_unlock(self->priv->lock); if(!self->priv->is_playing) goto done; l_cur=(GValue *)gst_structure_get_value(structure, "decay"); l_peak=(GValue *)gst_structure_get_value(structure, "peak"); for(i=0;ipriv->vumeter[i], (gint)cur, (gint)peak); gtk_vumeter_set_levels(self->priv->vumeter[i], (gint)peak, (gint)cur); } } done: gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),params); return(FALSE); } static gboolean on_delayed_song_level_change(GstClock *clock,GstClockTime time,GstClockID id,gpointer user_data) { // the callback is called from a clock thread if(GST_CLOCK_TIME_IS_VALID(time)) g_idle_add(on_delayed_idle_song_level_change,user_data); else { gconstpointer * const params=(gconstpointer *)user_data; GstMessage *message=(GstMessage *)params[1]; gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),user_data); } return(TRUE); } static void on_song_level_change(GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); if(name_id==bus_msg_level_quark) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); GstElement *level=GST_ELEMENT(GST_MESSAGE_SRC(message)); // check if its our element (we can have multiple level meters) if(level==self->priv->level) { GstClockTime timestamp, duration; GstClockTime waittime=GST_CLOCK_TIME_NONE; if(gst_structure_get_clock_time (structure, "running-time", ×tamp) && gst_structure_get_clock_time (structure, "duration", &duration)) { /* wait for middle of buffer */ waittime=timestamp+duration/2; } else if(gst_structure_get_clock_time (structure, "endtime", ×tamp)) { /* level send endtime as stream_time and not as running_time */ waittime=gst_segment_to_running_time(&GST_BASE_TRANSFORM(level)->segment, GST_FORMAT_TIME, timestamp); } if(GST_CLOCK_TIME_IS_VALID(waittime)) { gconstpointer *params=(gconstpointer *)g_slice_alloc(2*sizeof(gconstpointer)); GstClockID clock_id; GstClockTime basetime=gst_element_get_base_time(level); //GST_WARNING("target %"GST_TIME_FORMAT" %"GST_TIME_FORMAT, // GST_TIME_ARGS(endtime),GST_TIME_ARGS(waittime)); params[0]=(gpointer)self; params[1]=(gpointer)gst_message_ref(message); g_mutex_lock(self->priv->lock); g_object_add_weak_pointer((gpointer)self,(gpointer *)¶ms[0]); g_mutex_unlock(self->priv->lock); clock_id=gst_clock_new_single_shot_id(self->priv->clock,waittime+basetime); if(gst_clock_id_wait_async(clock_id,on_delayed_song_level_change,(gpointer)params)!=GST_CLOCK_OK) { gst_message_unref(message); g_slice_free1(2*sizeof(gconstpointer),params); } gst_clock_id_unref(clock_id); } } } } static void on_song_level_negotiated(GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); // receive message from on_channels_negotiated() if(name_id==bus_msg_level_caps_changed_quark) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gint i,channels; gst_structure_get_int(structure,"channels",&channels); GST_INFO("received application bus message: channel=%d",channels); for(i=0;ipriv->vumeter[i])); } for(i=channels;ipriv->vumeter[i])); } } } static gdouble volume_slider2real(gdouble lin) { if (lin <= 0) return 0.0; return pow(10000.0, lin - 1.0); } static gdouble volume_real2slider(gdouble logv) { if (logv <= (1.0 / 10000.0)) return 0.0; return log(logv) / log(10000.0) + 1.0; } static void on_song_volume_slider_change(GtkRange *range,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gdouble nvalue,ovalue; g_assert(self->priv->gain); g_assert(self->priv->volume); // get value from HScale and change volume nvalue=volume_slider2real(gtk_range_get_value(GTK_RANGE(self->priv->volume))); g_object_get(self->priv->gain,"master-volume",&ovalue,NULL); if(fabs(nvalue-ovalue)>0.000001) { GST_DEBUG("volume-slider has changed : %f->%f",ovalue,nvalue); g_signal_handlers_block_matched(self->priv->volume,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_volume_changed,(gpointer)self); g_object_set(self->priv->gain,"master-volume",nvalue,NULL); g_signal_handlers_unblock_matched(self->priv->volume,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_volume_changed,(gpointer)self); bt_edit_application_set_song_unsaved(self->priv->app); } /*else { GST_WARNING("IGN volume-slider has changed : %f->%f",ovalue,nvalue); }*/ } static gboolean on_song_volume_slider_press_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if(event->type == GDK_BUTTON_PRESS) { if(event->button == 1) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); GstElement *machine; GstController *ctrl; g_object_get(self->priv->master,"machine",&machine,NULL); if((ctrl=gst_object_get_controller(G_OBJECT(machine)))) { gst_controller_set_property_disabled(ctrl,"master-volume",TRUE); } g_object_unref(machine); } } return(FALSE); } static gboolean on_song_volume_slider_release_event(GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if(event->button == 1 && event->type == GDK_BUTTON_RELEASE) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); GstElement *machine; GstController *ctrl; g_object_get(self->priv->master,"machine",&machine,NULL); if((ctrl=gst_object_get_controller(G_OBJECT(self->priv->master)))) { // update the default value at ts=0 bt_machine_set_global_param_default(self->priv->master, bt_machine_get_global_param_index(self->priv->master,"master-volume",NULL)); /* * @todo: it should actualy postpone the disable to the next timestamp * (not possible right now). * * @idea: can we have a livecontrolsource that subclasses interpolationcs * - when enabling, if would need to delay the enabled to the next control-point * - it would need to peek at the control-point list :/ */ gst_controller_set_property_disabled(ctrl,"master-volume",FALSE); } g_object_unref(machine); } return(FALSE); } static void on_song_volume_changed(GstElement *gain,GParamSpec *arg,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gdouble nvalue,ovalue; g_assert(self->priv->gain); g_assert(self->priv->volume); // get value from Element and change HScale g_object_get(self->priv->gain,"master-volume",&nvalue,NULL); nvalue=volume_real2slider(nvalue); ovalue=gtk_range_get_value(GTK_RANGE(self->priv->volume)); if(fabs(nvalue-ovalue)>0.000001) { GST_DEBUG("volume-slider notify : %f",nvalue); g_signal_handlers_block_matched(self->priv->gain,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_volume_slider_change,(gpointer)self); gtk_range_set_value(GTK_RANGE(self->priv->volume),nvalue); g_signal_handlers_unblock_matched(self->priv->gain,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_volume_slider_change,(gpointer)self); } /*else { GST_WARNING("IGN volume-slider notify : %f",nvalue); }*/ } static void on_channels_negotiated(GstPad *pad,GParamSpec *arg,gpointer user_data) { GstCaps *caps; if((caps=(GstCaps *)gst_pad_get_negotiated_caps(pad))) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gint channels; GstStructure *structure; GstMessage *message; GstElement *bin; channels=gst_caps_get_channels(caps); gst_caps_unref(caps); GST_INFO("!!! input level src has %d output channels",channels); // post a message to the bus (we can't do gtk+ stuff here) structure = gst_structure_new ("level-caps-changed", "channels", G_TYPE_INT, channels, NULL); message = gst_message_new_application (NULL, structure); g_object_get(self->priv->app,"bin",&bin,NULL); gst_element_post_message(bin,message); gst_object_unref(bin); } } static void on_song_unsaved_changed(const GObject *object,GParamSpec *arg,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gboolean unsaved=bt_edit_application_is_song_unsaved(self->priv->app); gtk_widget_set_sensitive(self->priv->save_button,unsaved); } static void on_sequence_loop_notify(const BtSequence *sequence,GParamSpec *arg,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gboolean loop; g_object_get((gpointer)sequence,"loop",&loop,NULL); g_signal_handlers_block_matched(self->priv->loop_button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_toolbar_loop_toggled,(gpointer)self); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->loop_button),loop); g_signal_handlers_unblock_matched(self->priv->loop_button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_toolbar_loop_toggled,(gpointer)self); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); BtSong *song; BtSequence *sequence; GstBin *bin; //gboolean loop; GST_INFO("song has changed : app=%p, toolbar=%p",app,user_data); g_object_get(self->priv->app,"song",&song,NULL); if(!song) return; // get the audio_sink (song->master is a bt_sink_machine) if there is one already g_object_try_weak_unref(self->priv->master); g_object_get(song,"master",&self->priv->master,"sequence",&sequence,"bin",&bin,NULL); if(self->priv->master) { GstPad *pad; GstBus *bus; GST_INFO("connect to input-level : song=%p, master=%p (ref_ct=%d)",song,self->priv->master,G_OBJECT_REF_COUNT(self->priv->master)); g_object_try_weak_ref(self->priv->master); // get the input_level and input_gain properties from audio_sink g_object_try_weak_unref(self->priv->gain); g_object_try_weak_unref(self->priv->level); g_object_get(self->priv->master,"input-post-level",&self->priv->level,"machine",&self->priv->gain,NULL); g_object_try_weak_ref(self->priv->gain); g_object_try_weak_ref(self->priv->level); // connect bus signals bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::error", G_CALLBACK(on_song_error), (gpointer)self); g_signal_connect(bus, "message::warning", G_CALLBACK(on_song_warning), (gpointer)self); g_signal_connect(bus, "message::element", G_CALLBACK(on_song_level_change), (gpointer)self); g_signal_connect(bus, "message::application", G_CALLBACK(on_song_level_negotiated), (gpointer)self); gst_object_unref(bus); if(self->priv->clock) gst_object_unref(self->priv->clock); self->priv->clock=gst_pipeline_get_clock (GST_PIPELINE(bin)); // get the pad from the input-level and listen there for channel negotiation g_assert(GST_IS_ELEMENT(self->priv->level)); if((pad=gst_element_get_static_pad(self->priv->level,"src"))) { g_signal_connect(pad,"notify::caps",G_CALLBACK(on_channels_negotiated),(gpointer)self); gst_object_unref(pad); } g_assert(GST_IS_ELEMENT(self->priv->gain)); // get the current input_gain and adjust volume widget on_song_volume_changed(self->priv->gain,NULL,(gpointer)self); // connect slider changed and volume changed events g_signal_connect(self->priv->volume,"value_changed",G_CALLBACK(on_song_volume_slider_change),(gpointer)self); g_signal_connect(self->priv->volume,"button-press-event",G_CALLBACK(on_song_volume_slider_press_event),(gpointer)self); g_signal_connect(self->priv->volume,"button-release-event",G_CALLBACK(on_song_volume_slider_release_event),(gpointer)self); //g_signal_connect(self->priv->gain ,"notify::volume",G_CALLBACK(on_song_volume_changed),(gpointer)self); g_signal_connect(self->priv->gain ,"notify::master-volume",G_CALLBACK(on_song_volume_changed),(gpointer)self); gst_object_unref(self->priv->gain); gst_object_unref(self->priv->level); g_object_unref(self->priv->master); } else { GST_WARNING("failed to get the master element of the song"); } g_signal_connect(song,"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),(gpointer)self); on_sequence_loop_notify(sequence,NULL,(gpointer)self); g_signal_connect(sequence,"notify::loop",G_CALLBACK(on_sequence_loop_notify),(gpointer)self); //-- release the references gst_object_unref(bin); g_object_unref(sequence); g_object_unref(song); } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { BtMainToolbar *self=BT_MAIN_TOOLBAR(user_data); gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'", toolbar_style); gtk_toolbar_set_style(GTK_TOOLBAR(self),gtk_toolbar_get_style_from_string(toolbar_style)); g_free(toolbar_style); } //-- helper methods static void bt_main_toolbar_init_ui(const BtMainToolbar *self) { BtSettings *settings; GtkWidget *tool_item; GtkWidget *box, *child; gulong i; BtChangeLog *change_log; gtk_widget_set_name(GTK_WIDGET(self),"main toolbar"); //-- file controls tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_NEW)); gtk_widget_set_name(tool_item,"New"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Prepare a new empty song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_new_clicked),(gpointer)self); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_OPEN)); gtk_widget_set_name(tool_item,"Open"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Load a new song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_open_clicked),(gpointer)self); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_SAVE)); gtk_widget_set_name(tool_item,"Save"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Save this song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_save_clicked),(gpointer)self); self->priv->save_button=tool_item; gtk_toolbar_insert(GTK_TOOLBAR(self),gtk_separator_tool_item_new(),-1); //-- media controls tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_REWIND)); gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(tool_item),_("Rewind playback position of this song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); child=gtk_bin_get_child(GTK_BIN(tool_item)); gtk_widget_add_events(child,GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK); g_signal_connect(child,"button-press-event",G_CALLBACK(on_toolbar_rewind_pressed),(gpointer)self); g_signal_connect(child,"button-release-event",G_CALLBACK(on_toolbar_rewind_released),(gpointer)self); tool_item=GTK_WIDGET(gtk_toggle_tool_button_new_from_stock(GTK_STOCK_MEDIA_PLAY)); gtk_widget_set_name(tool_item,"Play"); gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(tool_item),_("Play this song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_play_clicked),(gpointer)self); self->priv->play_button=tool_item; tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_FORWARD)); gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(tool_item),_("Forward playback position of this song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); child=gtk_bin_get_child(GTK_BIN(tool_item)); gtk_widget_add_events(child,GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK); g_signal_connect(child,"button-press-event",G_CALLBACK(on_toolbar_forward_pressed),(gpointer)self); g_signal_connect(child,"button-release-event",G_CALLBACK(on_toolbar_forward_released),(gpointer)self); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_STOP)); gtk_widget_set_name(tool_item,"Stop"); gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(tool_item),_("Stop playback of this song")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_stop_clicked),(gpointer)self); gtk_widget_set_sensitive(tool_item,FALSE); self->priv->stop_button=tool_item; tool_item=GTK_WIDGET(gtk_toggle_tool_button_new()); gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(tool_item),gtk_image_new_from_filename("stock_repeat.png")); gtk_tool_button_set_label(GTK_TOOL_BUTTON(tool_item),_("Loop")); gtk_widget_set_name(tool_item,"Loop"); gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(tool_item),_("Toggle looping of playback")); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"toggled",G_CALLBACK(on_toolbar_loop_toggled),(gpointer)self); self->priv->loop_button=tool_item; gtk_toolbar_insert(GTK_TOOLBAR(self),gtk_separator_tool_item_new(),-1); //-- volume level and control box=gtk_vbox_new(FALSE,0); gtk_container_set_border_width(GTK_CONTAINER(box),2); #ifndef USE_HILDON gtk_widget_set_size_request(GTK_WIDGET(box),250,-1); #else gtk_widget_set_size_request(GTK_WIDGET(box),200,-1); #endif // add gtk_vumeter widgets and update from level_callback for(i=0;ipriv->vumeter[i]=GTK_VUMETER(gtk_vumeter_new(FALSE)); // @idea have distinct tooltips with channel names gtk_widget_set_tooltip_text(GTK_WIDGET(self->priv->vumeter[i]),_("playback volume")); gtk_vumeter_set_min_max(self->priv->vumeter[i], LOW_VUMETER_VAL, 0); gtk_vumeter_set_levels(self->priv->vumeter[i], LOW_VUMETER_VAL, LOW_VUMETER_VAL); // no falloff in widget, we have falloff in GstLevel //gtk_vumeter_set_peaks_falloff(self->priv->vumeter[i], GTK_VUMETER_PEAKS_FALLOFF_MEDIUM); gtk_vumeter_set_scale(self->priv->vumeter[i], GTK_VUMETER_SCALE_LINEAR); gtk_widget_set_no_show_all(GTK_WIDGET(self->priv->vumeter[i]),TRUE); if(ipriv->vumeter[i])); } else { gtk_widget_hide(GTK_WIDGET(self->priv->vumeter[i])); } gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->vumeter[i]),TRUE,TRUE,0); } // add gain-control self->priv->volume=GTK_SCALE(gtk_hscale_new_with_range(/*min=*/0.0,/*max=*/1.0,/*step=*/0.01)); gtk_widget_set_tooltip_text(GTK_WIDGET(self->priv->volume),_("Change playback volume")); gtk_scale_set_draw_value(self->priv->volume,FALSE); //gtk_range_set_update_policy(GTK_RANGE(self->priv->volume),GTK_UPDATE_DELAYED); #ifndef USE_HILDON gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->volume),TRUE,TRUE,0); #else gtk_widget_set_size_request(GTK_WIDGET(self->priv->volume),200,-1); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"volume-control"); gtk_container_add(GTK_CONTAINER(tool_item),self->priv->volume); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); #endif gtk_widget_show_all(GTK_WIDGET(box)); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"volume"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(self),GTK_TOOL_ITEM(tool_item),-1); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); g_signal_connect(self->priv->app, "notify::unsaved", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); change_log=bt_change_log_new(); g_signal_connect(change_log, "notify::can-undo", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); g_object_unref(change_log); // let settings control toolbar style g_object_get(self->priv->app,"settings",&settings,NULL); on_toolbar_style_changed(settings,NULL,(gpointer)self); g_signal_connect(settings, "notify::toolbar-style", G_CALLBACK(on_toolbar_style_changed), (gpointer)self); g_object_unref(settings); } //-- constructor methods /** * bt_main_toolbar_new: * * Create a new instance * * Returns: the new instance */ BtMainToolbar *bt_main_toolbar_new(void) { BtMainToolbar *self; self=BT_MAIN_TOOLBAR(g_object_new(BT_TYPE_MAIN_TOOLBAR,NULL)); bt_main_toolbar_init_ui(self); return(self); } //-- methods //-- class internals static void bt_main_toolbar_dispose(GObject *object) { BtMainToolbar *self = BT_MAIN_TOOLBAR(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { GstBin *bin; GstBus *bus; GST_DEBUG("disconnect handlers from song=%p",song); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_is_playing_notify,NULL); g_object_get(song,"bin", &bin, NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_error,NULL); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_warning,NULL); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_level_change,NULL); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_level_negotiated,NULL); gst_object_unref(bus); gst_object_unref(bin); g_object_unref(song); } g_object_try_weak_unref(self->priv->master); g_object_try_weak_unref(self->priv->gain); g_object_try_weak_unref(self->priv->level); if(self->priv->clock) gst_object_unref(self->priv->clock); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_main_toolbar_parent_class)->dispose(object); } static void bt_main_toolbar_finalize(GObject *object) { BtMainToolbar *self = BT_MAIN_TOOLBAR(object); GST_DEBUG("!!!! self=%p",self); g_mutex_free(self->priv->lock); G_OBJECT_CLASS(bt_main_toolbar_parent_class)->finalize(object); } static void bt_main_toolbar_init(BtMainToolbar *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_TOOLBAR, BtMainToolbarPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->lock=g_mutex_new(); self->priv->playback_rate=1.0; } static void bt_main_toolbar_class_init(BtMainToolbarClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); bus_msg_level_quark=g_quark_from_static_string("level"); bus_msg_level_caps_changed_quark=g_quark_from_static_string("level-caps-changed"); g_type_class_add_private(klass,sizeof(BtMainToolbarPrivate)); gobject_class->dispose = bt_main_toolbar_dispose; gobject_class->finalize = bt_main_toolbar_finalize; } buzztard-0.6.0/src/ui/edit/main-statusbar.c0000644042355400116100000004000311670211164015534 00000000000000/* $Id: main-statusbar.c 3765 2011-12-08 19:39:30Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainstatusbar * @short_description: class for the editor main statusbar * * The statusbar shows some contextual help, as well as things like playback * status. */ #define BT_EDIT #define BT_MAIN_STATUSBAR_C #include "bt-edit.h" enum { MAIN_STATUSBAR_STATUS=1 }; //#define USE_MAIN_LOOP_IDLE_TRACKER 1 struct _BtMainStatusbarPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* main status bar */ GtkStatusbar *status; /* identifier of the status message group */ gint status_context_id; /* time-elapsed (total) status bar */ GtkStatusbar *elapsed; /* identifier of the elapsed message group */ gint elapsed_context_id; /* time-current (current play pos) status bar */ GtkStatusbar *current; /* identifier of the current message group */ gint current_context_id; /* time-loop status bar */ GtkStatusbar *loop; /* identifier of the loop message group */ gint loop_context_id; /* cpu load */ GtkProgressBar *cpu_load; guint cpu_load_handler_id; #ifdef USE_MAIN_LOOP_IDLE_TRACKER /* main-loop monitor */ guint main_loop_idle_handler_id; GstClockTime ml_tlast,ml_tavg; guint64 ml_ct; #endif /* total playtime */ GstClockTime total_time; gulong last_pos, play_start; }; //-- the class G_DEFINE_TYPE (BtMainStatusbar, bt_main_statusbar, GTK_TYPE_HBOX); //-- helper static void bt_main_statusbar_update_length(const BtMainStatusbar *self, const BtSong *song,const BtSequence *sequence) { gchar str[2+2+3+3]; gulong msec,sec,min; // get new song length msec=(gulong)(bt_sequence_get_loop_time(sequence)/G_USEC_PER_SEC); GST_INFO(" new msec : %lu",msec); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); g_sprintf(str,"%02lu:%02lu.%03lu",min,sec,msec); // update statusbar fields gtk_statusbar_pop(self->priv->loop,self->priv->loop_context_id); gtk_statusbar_push(self->priv->loop,self->priv->loop_context_id,str); } //-- event handler static void on_song_play_pos_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); BtSequence *sequence; // the +4 is not really needed, but I get a stack smashing error on ubuntu without gchar str[2+2+3+3 + 4]; gulong pos,msec,sec,min; GstClockTime bar_time; GST_DEBUG("tick update"); g_object_get((gpointer)song,"sequence",&sequence,"play-pos",&pos,NULL); if(!sequence) return; //GST_INFO("sequence tick received : %d",pos); bar_time=bt_sequence_get_bar_time(sequence); // update current statusbar msec=(gulong)((pos*bar_time)/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); // format g_sprintf(str,"%02lu:%02lu.%03lu",min,sec,msec); // update statusbar fields gtk_statusbar_pop(self->priv->current,self->priv->current_context_id); gtk_statusbar_push(self->priv->current,self->priv->current_context_id,str); // update elapsed statusbar if(pospriv->last_pos) { self->priv->total_time+=bt_sequence_get_loop_time(sequence); GST_INFO("wrapped around total_time=%"G_GUINT64_FORMAT,self->priv->total_time); } pos-=self->priv->play_start; msec=(gulong)(((pos*bar_time)+self->priv->total_time)/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); // format g_sprintf(str,"%02lu:%02lu.%03lu",min,sec,msec); // update statusbar fields gtk_statusbar_pop(self->priv->elapsed,self->priv->elapsed_context_id); gtk_statusbar_push(self->priv->elapsed,self->priv->elapsed_context_id,str); self->priv->last_pos=pos; g_object_unref(sequence); } static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); gboolean is_playing; gulong play_start; g_object_get((gpointer)song,"is-playing",&is_playing,"play-pos",&play_start,NULL); self->priv->total_time=G_GINT64_CONSTANT(0); if(!is_playing) { GST_INFO("play_start=%lu",play_start); // update statusbar fields self->priv->last_pos=play_start; self->priv->play_start=play_start; on_song_play_pos_notify(song,NULL,user_data); } else { self->priv->last_pos=0; self->priv->play_start=0; } } static void on_song_info_rhythm_notify(const BtSongInfo *song_info,GParamSpec *arg,gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); BtSong *song; BtSequence *sequence; // get song from app g_object_get(self->priv->app,"song",&song,NULL); g_return_if_fail(song); g_object_get(song,"sequence",&sequence,NULL); bt_main_statusbar_update_length(self,song,sequence); // release the references g_object_unref(sequence); g_object_unref(song); } static void on_sequence_loop_time_notify(const BtSequence *sequence,GParamSpec *arg,gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); BtSong *song; // get song from app g_object_get(self->priv->app,"song",&song,NULL); g_return_if_fail(song); bt_main_statusbar_update_length(self,song,sequence); // release the references g_object_unref(song); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); BtSong *song; BtSongInfo *song_info; BtSequence *sequence; GST_INFO("song has changed : app=%p, self=%p",app,self); // get song from app g_object_get(self->priv->app,"song",&song,NULL); if(!song) return; g_object_get(song,"sequence",&sequence,"song-info",&song_info,NULL); bt_main_statusbar_update_length(self,song,sequence); // subscribe to property changes in song g_signal_connect(song, "notify::play-pos", G_CALLBACK(on_song_play_pos_notify), (gpointer)self); g_signal_connect(song, "notify::is-playing", G_CALLBACK(on_song_is_playing_notify), (gpointer)self); // subscribe to property changes in song_info g_signal_connect(song_info, "notify::bpm", G_CALLBACK(on_song_info_rhythm_notify), (gpointer)self); g_signal_connect(song_info, "notify::tpb", G_CALLBACK(on_song_info_rhythm_notify), (gpointer)self); // subscribe to property changes in sequence g_signal_connect(sequence, "notify::length", G_CALLBACK(on_sequence_loop_time_notify), (gpointer)self); g_signal_connect(sequence, "notify::loop", G_CALLBACK(on_sequence_loop_time_notify), (gpointer)self); g_signal_connect(sequence, "notify::loop-start", G_CALLBACK(on_sequence_loop_time_notify), (gpointer)self); g_signal_connect(sequence, "notify::loop-end", G_CALLBACK(on_sequence_loop_time_notify), (gpointer)self); // release the references g_object_unref(song_info); g_object_unref(sequence); g_object_unref(song); } static gboolean on_cpu_load_update(gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); guint cpu_load=bt_cpu_load_get_current(); #ifdef USE_MAIN_LOOP_IDLE_TRACKER guint ml_lag=GST_TIME_AS_MSECONDS(self->priv->ml_tavg); gchar str[strlen("CPU: 000 %, ML: 00000 ms") + 3]; #else gchar str[strlen("CPU: 000 %") + 3]; #endif if(cpu_load>100.0) cpu_load=100.0; #ifdef USE_MAIN_LOOP_IDLE_TRACKER g_sprintf(str,"CPU: %d %%, ML: %d ms",cpu_load,ml_lag); #else g_sprintf(str,"CPU: %d %%",cpu_load); #endif gtk_progress_bar_set_fraction(self->priv->cpu_load,(gdouble)cpu_load/100.0); gtk_progress_bar_set_text(self->priv->cpu_load,str); return(TRUE); } #ifdef USE_MAIN_LOOP_IDLE_TRACKER static gboolean on_main_loop_idle(gpointer user_data) { BtMainStatusbar *self=BT_MAIN_STATUSBAR(user_data); GstClockTime tnow,tdiff; tnow=gst_util_get_timestamp(); if(self->priv->ml_ct!=0) { tdiff=self->priv->ml_tlast-tnow; // moving cumulative average self->priv->ml_tavg=self->priv->ml_tavg+((tdiff-self->priv->ml_tavg)/self->priv->ml_ct); self->priv->ml_ct++; } self->priv->ml_tlast=tnow; return TRUE; } #endif //-- helper methods static void bt_main_statusbar_init_ui(const BtMainStatusbar *self) { GtkWidget *ev_box; gchar str[]="00:00.000"; gtk_widget_set_name(GTK_WIDGET(self),"status-bar"); //#ifdef USE_HILDON /* has no effect */ //gtk_box_set_spacing(GTK_BOX(self),0); //gtk_container_set_border_width(GTK_CONTAINER(self),0); //#endif // context sensitive help statusbar self->priv->status=GTK_STATUSBAR(gtk_statusbar_new()); self->priv->status_context_id=gtk_statusbar_get_context_id(GTK_STATUSBAR(self->priv->status),"default"); gtk_statusbar_set_has_resize_grip(self->priv->status,FALSE); gtk_statusbar_push(GTK_STATUSBAR(self->priv->status),self->priv->status_context_id,_("Ready to rock!")); gtk_box_pack_start(GTK_BOX(self),GTK_WIDGET(self->priv->status),TRUE,TRUE,1); // cpu load // @todo: make this dependend on settings (view menu?) // @todo: this pushes the height of the status-bar // (e.g. setting this to 10 instead of -1 saves pixels) self->priv->cpu_load=GTK_PROGRESS_BAR(gtk_progress_bar_new()); // @idea: this could be used to avoid resizing when the label changes //gtk_progress_bar_set_ellipsize(self->priv->cpu_load,PANGO_ELLIPSIZE_END); //gtk_label_set_single_line_mode(self->priv->cpu_load,TRUE); gtk_widget_set_tooltip_text(GTK_WIDGET(self->priv->cpu_load),_("CPU load")); gtk_box_pack_start(GTK_BOX(self),GTK_WIDGET(self->priv->cpu_load),FALSE,FALSE,1); self->priv->cpu_load_handler_id=g_timeout_add(1000, on_cpu_load_update, (gpointer)self); #ifdef USE_MAIN_LOOP_IDLE_TRACKER self->priv->main_loop_idle_handler_id=g_idle_add_full(G_PRIORITY_LOW, on_main_loop_idle, (gpointer)self,NULL); #endif // timer status-bars ev_box=gtk_event_box_new(); g_object_set(ev_box,"visible-window",FALSE,NULL); gtk_widget_set_tooltip_text(ev_box,_("Playback time")); self->priv->elapsed=GTK_STATUSBAR(gtk_statusbar_new()); self->priv->elapsed_context_id=gtk_statusbar_get_context_id(GTK_STATUSBAR(self->priv->elapsed),"default"); gtk_statusbar_set_has_resize_grip(self->priv->elapsed,FALSE); gtk_misc_set_alignment(GTK_MISC(GTK_STATUSBAR(self->priv->elapsed)->label),1.0,0.5); gtk_widget_set_size_request(GTK_WIDGET(self->priv->elapsed),100,-1); gtk_statusbar_push(GTK_STATUSBAR(self->priv->elapsed),self->priv->elapsed_context_id,str); gtk_container_add(GTK_CONTAINER(ev_box),GTK_WIDGET(self->priv->elapsed)); gtk_box_pack_start(GTK_BOX(self),ev_box,FALSE,FALSE,1); ev_box=gtk_event_box_new(); g_object_set(ev_box,"visible-window",FALSE,NULL); gtk_widget_set_tooltip_text(ev_box,_("Playback position")); self->priv->current=GTK_STATUSBAR(gtk_statusbar_new()); self->priv->current_context_id=gtk_statusbar_get_context_id(GTK_STATUSBAR(self->priv->current),"default"); gtk_statusbar_set_has_resize_grip(self->priv->current,FALSE); gtk_misc_set_alignment(GTK_MISC(GTK_STATUSBAR(self->priv->current)->label),1.0,0.5); gtk_widget_set_size_request(GTK_WIDGET(self->priv->current),100,-1); gtk_statusbar_push(GTK_STATUSBAR(self->priv->current),self->priv->current_context_id,str); gtk_container_add(GTK_CONTAINER(ev_box),GTK_WIDGET(self->priv->current)); gtk_box_pack_start(GTK_BOX(self),ev_box,FALSE,FALSE,1); ev_box=gtk_event_box_new(); g_object_set(ev_box,"visible-window",FALSE,NULL); gtk_widget_set_tooltip_text(ev_box,_("Playback length")); self->priv->loop=GTK_STATUSBAR(gtk_statusbar_new()); self->priv->loop_context_id=gtk_statusbar_get_context_id(GTK_STATUSBAR(self->priv->loop),"default"); gtk_widget_set_size_request(GTK_WIDGET(self->priv->loop),100,-1); gtk_misc_set_alignment(GTK_MISC(GTK_STATUSBAR(self->priv->loop)->label),1.0,0.5); gtk_statusbar_push(GTK_STATUSBAR(self->priv->loop),self->priv->loop_context_id,str); gtk_container_add(GTK_CONTAINER(ev_box),GTK_WIDGET(self->priv->loop)); gtk_box_pack_start(GTK_BOX(self),ev_box,FALSE,FALSE,1); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); } //-- constructor methods /** * bt_main_statusbar_new: * * Create a new instance * * Returns: the new instance */ BtMainStatusbar *bt_main_statusbar_new(void) { BtMainStatusbar *self; self=BT_MAIN_STATUSBAR(g_object_new(BT_TYPE_MAIN_STATUSBAR,NULL)); bt_main_statusbar_init_ui(self); return(self); } //-- methods //-- class internals static void bt_main_statusbar_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMainStatusbar *self = BT_MAIN_STATUSBAR(object); return_if_disposed(); switch (property_id) { case MAIN_STATUSBAR_STATUS: { gchar *str=g_value_dup_string(value); gtk_statusbar_pop(GTK_STATUSBAR(self->priv->status),self->priv->status_context_id); if(str) { gtk_statusbar_push(GTK_STATUSBAR(self->priv->status),self->priv->status_context_id,str); g_free(str); } else gtk_statusbar_push(GTK_STATUSBAR(self->priv->status),self->priv->status_context_id,_("Ready to rock!")); while(gtk_events_pending()) gtk_main_iteration(); //GST_DEBUG("set the status-text for main_statusbar"); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_main_statusbar_dispose(GObject *object) { BtMainStatusbar *self = BT_MAIN_STATUSBAR(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { BtSongInfo *song_info; BtSequence *sequence; GST_DEBUG("disconnect handlers from song=%p",song); g_object_get(song,"sequence",&sequence,"song-info",&song_info,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_is_playing_notify,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_play_pos_notify,NULL); g_signal_handlers_disconnect_matched(song_info,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_info_rhythm_notify,NULL); g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_sequence_loop_time_notify,NULL); g_object_unref(song_info); g_object_unref(sequence); g_object_unref(song); } g_source_remove(self->priv->cpu_load_handler_id); #ifdef USE_MAIN_LOOP_IDLE_TRACKER g_source_remove(self->priv->main_loop_idle_handler_id); #endif g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_main_statusbar_parent_class)->dispose(object); } static void bt_main_statusbar_init(BtMainStatusbar *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_STATUSBAR, BtMainStatusbarPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_main_statusbar_class_init(BtMainStatusbarClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainStatusbarPrivate)); gobject_class->set_property = bt_main_statusbar_set_property; gobject_class->dispose = bt_main_statusbar_dispose; g_object_class_install_property(gobject_class,MAIN_STATUSBAR_STATUS, g_param_spec_string("status", "status prop", "main status text", BT_MAIN_STATUSBAR_DEFAULT, /* default value */ G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/marshal.c0000644042355400116100000000757511667370663014272 00000000000000 #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_char (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) #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 #endif /* !G_ENABLE_DEBUG */ /* VOID:OBJECT,OBJECT (./marshal.list:1) */ void bt_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 arg_1, gpointer arg_2, gpointer data2); register GMarshalFunc_VOID__OBJECT_OBJECT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; 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); } buzztard-0.6.0/src/ui/edit/sequence-grid-model.h0000644042355400116100000000616511625717247016470 00000000000000/* $Id: sequence-grid-model.h 3349 2011-05-02 20:35:54Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SEQUENCE_GRID_MODEL_H #define BT_SEQUENCE_GRID_MODEL_H #include #include #define BT_TYPE_SEQUENCE_GRID_MODEL (bt_sequence_grid_model_get_type()) #define BT_SEQUENCE_GRID_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SEQUENCE_GRID_MODEL, BtSequenceGridModel)) #define BT_SEQUENCE_GRID_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SEQUENCE_GRID_MODEL, BtSequenceGridModelClass)) #define BT_IS_SEQUENCE_GRID_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SEQUENCE_GRID_MODEL)) #define BT_IS_SEQUENCE_GRID_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SEQUENCE_GRID_MODEL)) #define BT_SEQUENCE_GRID_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SEQUENCE_GRID_MODEL, BtSequenceGridModelClass)) /* type macros */ typedef struct _BtSequenceGridModel BtSequenceGridModel; typedef struct _BtSequenceGridModelClass BtSequenceGridModelClass; typedef struct _BtSequenceGridModelPrivate BtSequenceGridModelPrivate; /** * BtSequenceGridModel: * * Data model for #GtkTreeView or #GtkComboBox. */ struct _BtSequenceGridModel { GObject parent; /*< private >*/ BtSequenceGridModelPrivate *priv; }; struct _BtSequenceGridModelClass { GObjectClass parent; }; enum { BT_SEQUENCE_GRID_MODEL_SHADE=0, BT_SEQUENCE_GRID_MODEL_POS, BT_SEQUENCE_GRID_MODEL_POSSTR, BT_SEQUENCE_GRID_MODEL_LABEL, __BT_SEQUENCE_GRID_MODEL_N_COLUMNS }; #define BT_TYPE_SEQUENCE_GRID_MODEL_POS_FORMAT (bt_sequence_grid_model_pos_format_get_type()) /** * BtSequenceGridModelPosFormat: * @BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS: show as number of ticks * @BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME: show as "min:sec.msec" * @BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS: show as "beats.ticks" * * Format type for time values in the sequencer. */ typedef enum { BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS=0, BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME, BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS } BtSequenceGridModelPosFormat; GType bt_sequence_grid_model_get_type(void) G_GNUC_CONST; GType bt_sequence_grid_model_pos_format_get_type(void) G_GNUC_CONST; BtSequenceGridModel *bt_sequence_grid_model_new(BtSequence *sequence,gulong bars); #endif // BT_SEQUENCE_GRID_MODEL_H buzztard-0.6.0/src/ui/edit/wave-viewer.h0000644042355400116100000000420711576360376015075 00000000000000/* $Id: wave-viewer.h 2845 2010-05-04 09:17:32Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WAVEFORM_VIEWER_H #define BT_WAVEFORM_VIEWER_H #include G_BEGIN_DECLS #define BT_TYPE_WAVEFORM_VIEWER (bt_waveform_viewer_get_type ()) #define BT_WAVEFORM_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WAVEFORM_VIEWER, BtWaveformViewer)) #define BT_IS_WAVEFORM_VIEWER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WAVEFORM_VIEWER)) #define BT_WAVEFORM_VIEWER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WAVEFORM_VIEWER, BtWaveformViewerClass)) #define BT_IS_WAVEFORM_VIEWER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WAVEFORM_VIEWER)) typedef struct _BtWaveformViewer BtWaveformViewer; typedef struct _BtWaveformViewerClass BtWaveformViewerClass; /** * BtWaveformViewer: * * waveform view widget */ struct _BtWaveformViewer { GtkWindow parent; int active; float *peaks; int peaks_size; int channels; int64_t wave_length; int64_t loop_begin, loop_end; int64_t playback_cursor; }; struct _BtWaveformViewerClass { GtkWindowClass klass; }; GtkWidget *bt_waveform_viewer_new(); void bt_waveform_viewer_set_wave(BtWaveformViewer *self, int16_t *data, int channels, int length); GType bt_waveform_viewer_get_type(void) G_GNUC_CONST; G_END_DECLS #endif // BT_WAVEFORM_VIEWER_H buzztard-0.6.0/src/ui/edit/edit-application.c0000644042355400116100000007414011636173620016047 00000000000000/* $Id: edit-application.c 3648 2011-09-20 20:29:03Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bteditapplication * @short_description: class for a gtk based buzztard editor application * @see_also: #BtMainWindow * * Opens the #BtMainWindow and provide application level function like load, * save, run and exit. * * It also provides functions to invoke some dialogs like about and tips. * * The application instance will have exactly one active * #BtEditApplication:song at a time. I tracks undo/redo-able changes to the * song via #BtChangeLog and simple flagged changes via the * #BtEditApplication:unsaved property. */ /* @todo: unsaved flagging * - various parts in the UI call bt_edit_application_set_song_unsaved() * - this sometimes happens as a side effect from doing something undo/redoable * - can we include flagging unsaved in the changelog group, so hat if we undo * it the flagging gets undone? */ #define BT_EDIT #define BT_EDIT_APPLICATION_C #include "bt-edit.h" //-- signal ids //-- property ids enum { EDIT_APPLICATION_SONG=1, EDIT_APPLICATION_MAIN_WINDOW, EDIT_APPLICATION_IC_REGISTRY, EDIT_APPLICATION_UNSAVED }; // this needs to be here because of gtk-doc and unit-tests GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); struct _BtEditApplicationPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the currently loaded song */ BtSong *song; /* shared ui ressources */ BtUIResources *ui_resources; /* the top-level window of our app */ BtMainWindow *main_window; /* editor change log for undo/redo */ BtChangeLog *change_log; /* flag for smaller changes to make the song-saveable */ gboolean unsaved; gboolean need_dts_reset; /* remote playback controller */ BtPlaybackControllerSocket *pb_controller; /* interaction controller registry */ BtIcRegistry *ic_registry; }; static BtEditApplication *singleton=NULL; //-- the class G_DEFINE_TYPE (BtEditApplication, bt_edit_application, BT_TYPE_APPLICATION); //-- event handler static void on_songio_status_changed(BtSongIO *songio,GParamSpec *arg,gpointer user_data) { BtEditApplication *self=BT_EDIT_APPLICATION(user_data); BtMainStatusbar *statusbar; gchar *str; /* @idea: bind properties */ g_object_get(self->priv->main_window,"statusbar",&statusbar,NULL); g_object_get(songio,"status",&str,NULL); GST_INFO("songio_status has changed : \"%s\"",safe_string(str)); g_object_set(statusbar,"status",str,NULL); g_object_unref(statusbar); g_free(str); } static void on_changelog_can_undo_changed(BtChangeLog *change_log,GParamSpec *arg,gpointer user_data) { BtEditApplication *self=BT_EDIT_APPLICATION(user_data); if(self->priv->need_dts_reset) { BtSongInfo *song_info; self->priv->need_dts_reset=FALSE; g_object_get(self->priv->song,"song-info",&song_info,NULL); // this updates the time-stamp (we need that to show the since when we have // unsaved changes, if some one closes the song) g_object_set(song_info,"change-dts",NULL,NULL); g_object_unref(song_info); } } //-- helper methods /* * bt_edit_application_check_missing: * @self: the edit application * * Run gstreamer element checks. If elements are missing, if shows a dialog with * element-names and brief description what will not work. * * Returns: %TRUE is no critical elements are missing */ static gboolean bt_edit_application_check_missing(const BtEditApplication *self) { GList *missing_core_elements,*missing_edit_elements=NULL,*missing_elements; GList *edit_elements=NULL; gboolean res=TRUE,missing=FALSE; if((missing_core_elements=bt_gst_check_core_elements())) { missing=TRUE;res=FALSE; } // @todo check recording 'formats' -> rendering (core?) edit_elements=g_list_prepend(NULL,"level"); if((missing_elements=bt_gst_check_elements(edit_elements))) { missing_edit_elements=g_list_concat(missing_edit_elements,g_list_copy(missing_elements)); missing_edit_elements=g_list_append(missing_edit_elements,_("-> You will not see any level-meters.")); missing=TRUE; } g_list_free(edit_elements); edit_elements=g_list_prepend(NULL,"spectrum"); if((missing_elements=bt_gst_check_elements(edit_elements))) { missing_edit_elements=g_list_concat(missing_edit_elements,g_list_copy(missing_elements)); missing_edit_elements=g_list_append(missing_edit_elements,_("-> You will not see the frequency spectrum in the analyzer window.")); missing=TRUE; } g_list_free(edit_elements); // DEBUG test if it works #if 0 edit_elements=g_list_prepend(NULL,"ploink"); if((missing_elements=bt_gst_check_elements(edit_elements))) { missing_edit_elements=g_list_concat(missing_edit_elements,g_list_copy(missing_elements)); missing_edit_elements=g_list_append(missing_edit_elements,"-> You will not be able to ploink."); missing=TRUE; } g_list_free(edit_elements); edit_elements=g_list_prepend(NULL,"grummel"); edit_elements=g_list_prepend(edit_elements,"groll"); if((missing_elements=bt_gst_check_elements(edit_elements))) { missing_edit_elements=g_list_concat(missing_edit_elements,g_list_copy(missing_elements)); missing_edit_elements=g_list_append(missing_edit_elements,"-> You will not be able to grummel and groll."); missing=TRUE; } g_list_free(edit_elements); #endif // DEBUG // show missing dialog if(missing) { GtkWidget *dialog; if((dialog=GTK_WIDGET(bt_missing_framework_elements_dialog_new(missing_core_elements, missing_edit_elements)))) { bt_edit_application_attach_child_window(self,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); bt_missing_framework_elements_dialog_apply(BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG(dialog)); gtk_widget_destroy(dialog); } } // don't free. its static //g_list_free(missing_core_elements); g_list_free(missing_edit_elements); return(res); } /* * bt_edit_application_run_ui: * @self: the edit application * * Run the user interface. This checks if the users runs a new version for the * first time. In this case it show the about dialog. It also runs the gstreamer * element checks. * * Returns: %TRUE for success */ static gboolean bt_edit_application_run_ui(const BtEditApplication *self) { BtSettings *settings; guint version; gboolean res,show_tips; g_assert(self); g_assert(self->priv->main_window); GST_INFO("application.run_ui launched"); g_object_get((gpointer)self,"settings",&settings,NULL); g_object_get(settings,"news-seen",&version,"show-tips",&show_tips,NULL); if(PACKAGE_VERSION_NUMBER>version) { // show about bt_edit_application_show_about(self); // store new version version=PACKAGE_VERSION_NUMBER; g_object_set(settings,"news-seen",version,NULL); } else if(show_tips) { // show tip-of-the-day bt_edit_application_show_tip(self); } g_object_unref(settings); // check for missing elements if(!(res=bt_edit_application_check_missing(self))) goto Error; // check for recoverable songs bt_edit_application_crash_log_recover(self); GST_INFO("before running the UI"); gtk_main(); GST_INFO("after running the UI"); res=TRUE; Error: GST_INFO("application.run_ui finished : %d",res); return(res); } //-- constructor methods /** * bt_edit_application_new: * * Create a new instance on first call and return a reference later on. * * Returns: the new signleton instance */ BtEditApplication *bt_edit_application_new(void) { return(BT_EDIT_APPLICATION(g_object_new(BT_TYPE_EDIT_APPLICATION,NULL))); } //-- methods /** * bt_edit_application_new_song: * @self: the application instance to create a new song in * * Creates a new blank song instance. If there is a previous song instance it * will be freed. * * Returns: %TRUE for success */ gboolean bt_edit_application_new_song(const BtEditApplication *self) { gboolean res=FALSE; BtSong *song; BtSetup *setup; BtSequence *sequence; BtSongInfo *song_info; BtMachine *machine; gchar *id; gulong bars; GError *err=NULL; g_return_val_if_fail(BT_IS_EDIT_APPLICATION(self),FALSE); // create new song song=bt_song_new(BT_APPLICATION(self)); g_object_get(song,"setup",&setup,"sequence",&sequence,"song-info",&song_info,NULL); // make initial song length 4 timelines g_object_get(song_info,"bars",&bars,NULL); g_object_set(sequence,"length",bars*4,NULL); // add audiosink id=bt_setup_get_unique_machine_id(setup,"master"); machine=BT_MACHINE(bt_sink_machine_new(song,id,&err)); if(err==NULL) { GHashTable *properties; GST_DEBUG("sink-machine=%p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); g_object_get(machine,"properties",&properties,NULL); if(properties) { gchar str[G_ASCII_DTOSTR_BUF_SIZE]; g_hash_table_insert(properties,g_strdup("xpos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,0.0))); g_hash_table_insert(properties,g_strdup("ypos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,0.0))); } if(bt_machine_enable_input_post_level(machine)) { GST_DEBUG("sink-machine-ref_ct=%d",G_OBJECT_REF_COUNT(machine)); // set new song in application g_object_set((gpointer)self,"song",song,NULL); res=TRUE; } else { GST_WARNING("Can't add input level/gain element in sink machine"); } GST_DEBUG("sink-machine-ref_ct=%d",G_OBJECT_REF_COUNT(machine)); } else { GST_WARNING("Can't create sink machine: %s",err->message); g_error_free(err); } g_object_unref(machine); g_free(id); self->priv->unsaved=FALSE; g_object_notify(G_OBJECT(self),"unsaved"); // release references g_object_unref(song_info); g_object_unref(setup); g_object_unref(sequence); g_object_unref(song); return(res); } /** * bt_edit_application_load_song: * @self: the application instance to load a new song in *@file_name: the song filename to load * * Loads a new song. If there is a previous song instance it will be freed. * * Returns: true for success */ gboolean bt_edit_application_load_song(const BtEditApplication *self,const char *file_name) { gboolean res=FALSE; BtSongIO *loader; BtSong *song; g_return_val_if_fail(BT_IS_EDIT_APPLICATION(self),FALSE); GST_INFO("song name = %s",file_name); if((loader=bt_song_io_from_file(file_name))) { BtSetup *setup; BtWavetable *wavetable; GList *missing_machines,*missing_waves; bt_edit_application_ui_lock(self); g_signal_connect(loader,"notify::status",G_CALLBACK(on_songio_status_changed),(gpointer)self); // create new song and release the previous one song=bt_song_new(BT_APPLICATION(self)); g_object_set((gpointer)self,"song",NULL,NULL); #ifdef USE_DEBUG // do sanity check that bin is empty { GstBin *bin; g_object_get((gpointer)self,"bin",&bin,NULL); if(GST_BIN_NUMCHILDREN(bin)) { GST_WARNING("bin.num_children=%d has left-overs",GST_BIN_NUMCHILDREN(bin)); GList *node=GST_BIN_CHILDREN(bin); while(node) { GST_INFO_OBJECT(node->data,"removing object (ref-ct=%d)",G_OBJECT_REF_COUNT(node->data)); gst_bin_remove(bin,GST_ELEMENT(node->data)); node=GST_BIN_CHILDREN(bin); } } gst_object_unref(bin); } #endif if(bt_song_io_load(loader,song)) { BtMachine *machine; // get sink-machine g_object_get(song,"setup",&setup,NULL); if((machine=bt_setup_get_machine_by_type(setup,BT_TYPE_SINK_MACHINE))) { if(bt_machine_enable_input_post_level(machine)) { // DEBUG //bt_song_write_to_highlevel_dot_file(song); // DEBUG // set new song g_object_set((gpointer)self,"song",song,NULL); res=TRUE; GST_INFO("new song activated"); } else { GST_WARNING("Can't add input level/gain element in sink machine"); } GST_DEBUG("unreffing stuff after loading"); g_object_unref(machine); } else { GST_WARNING("Can't look up sink machine"); } g_object_unref(setup); } else { GST_ERROR("could not load song \"%s\"",file_name); } self->priv->unsaved=FALSE; g_object_notify(G_OBJECT(self),"unsaved"); bt_edit_application_ui_unlock(self); // get missing element info g_object_get(song,"setup",&setup,"wavetable",&wavetable,NULL); g_object_get(setup,"missing-machines",&missing_machines,NULL); g_object_get(wavetable,"missing-waves",&missing_waves,NULL); // tell about missing machines and/or missing waves if(missing_machines || missing_waves) { GtkWidget *dialog; if((dialog=GTK_WIDGET(bt_missing_song_elements_dialog_new(missing_machines,missing_waves)))) { bt_edit_application_attach_child_window(self,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } g_object_unref(setup); g_object_unref(wavetable); g_object_unref(song); g_object_unref(loader); } else { GST_WARNING("Unknown extension \"%s\"",file_name); } return(res); } /** * bt_edit_application_save_song: * @self: the application instance to save a song from *@file_name: the song filename to save * * Saves a song. * * Returns: true for success */ gboolean bt_edit_application_save_song(const BtEditApplication *self,const char *file_name) { gboolean res=FALSE; BtSongIO *saver; g_return_val_if_fail(BT_IS_EDIT_APPLICATION(self),FALSE); GST_INFO("song name = %s",file_name); if((saver=bt_song_io_from_file(file_name))) { BtSongInfo *song_info; gchar *old_file_name=NULL,*bak_file_name=NULL; bt_edit_application_ui_lock(self); g_signal_connect(saver,"notify::status",G_CALLBACK(on_songio_status_changed),(gpointer)self); g_object_get(self->priv->song,"song-info",&song_info,NULL); g_object_get(song_info,"file-name",&old_file_name,NULL); g_object_unref(song_info); /* save file saving (bak files) * save * new file (!old_file_name) * choosen file-name already exist * - move to .bak * - save newfile * - if saving failed, move .bak back * - if saving worked, delete .bak * choosen file-name does not exist * - save newfile * existing file * - move to .bak * - save newfile * - if saving failed, move .bak back * save-as * new file (!old_file_name) * like save of a new-file * existing file * choosen file-name already exist * - like save of an existing file * choosen file-name does not exist * - save newfile * * - check how other apps do it (check if inodes change if various scenarious) * - when loading a file, should we keep the file-handle open, so then when * saving, we can just update it? * - this can help with the wavetable (only updated changed wavetable slots) * - if we can't update it, we can use gsf_input_copy() for external files * (if unchanged) * - if the user deletes the file that is currently open -> user error */ if(g_file_test(file_name,G_FILE_TEST_EXISTS)) { bak_file_name=g_strconcat(file_name,".bak",NULL); g_rename(file_name,bak_file_name); } if(bt_song_io_save(saver,self->priv->song)) { res=TRUE; if(!old_file_name || strcmp(old_file_name,file_name)) { // saving worked, we remove the bak file as // - there was no old_file_name and/or // - user has choosen to overwrite this file g_unlink(bak_file_name); } } else { GST_ERROR("could not save song \"%s\"",file_name); if(bak_file_name) { // saving failed, so move a file we renamed to .bak back g_rename(bak_file_name,file_name); } } GST_INFO("saving done"); self->priv->unsaved=FALSE; g_object_notify(G_OBJECT(self),"unsaved"); self->priv->need_dts_reset=TRUE; bt_edit_application_ui_unlock(self); g_free(old_file_name); g_free(bak_file_name); g_object_unref(saver); } else { GST_WARNING("Unknown extension \"%s\"",file_name); } return(res); } /** * bt_edit_application_run: * @self: the application instance to run * * Start the gtk based editor application * * Returns: %TRUE for success */ gboolean bt_edit_application_run(const BtEditApplication *self) { gboolean res=FALSE; g_return_val_if_fail(BT_IS_EDIT_APPLICATION(self),FALSE); GST_INFO("application.run launched"); if(bt_edit_application_new_song(self)) { res=bt_edit_application_run_ui(self); } GST_INFO("application.run finished"); return(res); } /** * bt_edit_application_load_and_run: * @self: the application instance to run * @input_file_name: the file to load initially * * load the file of the supplied name and start the gtk based editor application * * Returns: true for success */ gboolean bt_edit_application_load_and_run(const BtEditApplication *self, const gchar *input_file_name) { gboolean res=FALSE; g_return_val_if_fail(BT_IS_EDIT_APPLICATION(self),FALSE); GST_INFO("application.load_and_run launched"); if(bt_edit_application_load_song(self,input_file_name)) { res=bt_edit_application_run_ui(self); } else { GST_WARNING("loading song failed"); // start normaly bt_edit_application_run(self); // @todo show error message } GST_INFO("application.load_and_run finished"); return(res); } /** * bt_edit_application_quit: * @self: the application instance to quit * * End the application. Eventualy asks the user for confirmation. * * Returns: %TRUE it ending the application was confirmed */ gboolean bt_edit_application_quit(const BtEditApplication *self) { if(bt_main_window_check_quit(self->priv->main_window)) { BtSettings *settings; gint x, y, w, h; // remember window size g_object_get((gpointer)self,"settings",&settings,NULL); gtk_window_get_position(GTK_WINDOW(self->priv->main_window),&x,&y); gtk_window_get_size(GTK_WINDOW(self->priv->main_window),&w,&h); g_object_set(settings,"window-xpos",x,"window-ypos",y,"window-width",w,"window-height",h,NULL); g_object_unref(settings); return(TRUE); } return(FALSE); } /** * bt_edit_application_show_about: * @self: the application instance * * Shows the applications about window */ void bt_edit_application_show_about(const BtEditApplication *self) { GtkWidget *dialog; if((dialog=GTK_WIDGET(bt_about_dialog_new()))) { bt_edit_application_attach_child_window(self,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } /** * bt_edit_application_show_tip: * @self: the application instance * * Shows the tip of the day window * * Since: 0.6 */ void bt_edit_application_show_tip(const BtEditApplication *self) { GtkWidget *dialog; if((dialog=GTK_WIDGET(bt_tip_dialog_new()))) { bt_edit_application_attach_child_window(self,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } /** * bt_edit_application_crash_log_recover: * @self: the application instance * * Shows the crash-log recover window if we have pending crash logs. * * Since: 0.6 */ void bt_edit_application_crash_log_recover(const BtEditApplication *self) { GList *crash_logs; g_object_get(self->priv->change_log,"crash-logs",&crash_logs, NULL); if(crash_logs) { GtkWidget *dialog; GST_INFO("have found crash logs"); if((dialog=GTK_WIDGET(bt_crash_recover_dialog_new(crash_logs)))) { bt_edit_application_attach_child_window(self,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } } /** * bt_edit_application_attach_child_window: * @self: the application instance * @window: a child window (e.g. dialog) * * The parent and transient relation ship to the applications main-window. * * Since: 0.6 */ void bt_edit_application_attach_child_window(const BtEditApplication *self, GtkWindow *window) { gtk_window_set_transient_for(window, GTK_WINDOW(self->priv->main_window)); gtk_window_set_destroy_with_parent(window, TRUE); } /** * bt_edit_application_ui_lock: * @self: the application instance * * Sets the main window insensitive and show a wait cursor. */ void bt_edit_application_ui_lock(const BtEditApplication *self) { GdkCursor *cursor=gdk_cursor_new(GDK_WATCH); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(self->priv->main_window)),cursor); gdk_cursor_unref(cursor); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->main_window),FALSE); while(gtk_events_pending()) gtk_main_iteration(); } /** * bt_edit_application_ui_unlock: * @self: the application instance * * Sets the main window sensitive again and unset the wait cursor. */ void bt_edit_application_ui_unlock(const BtEditApplication *self) { gtk_widget_set_sensitive(GTK_WIDGET(self->priv->main_window),TRUE); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(self->priv->main_window)),NULL); } /** * bt_edit_application_is_song_unsaved: * @self: the application instance * * Check if the song has unsaved changes. * * Returns: %TRUE if there are pending changes */ gboolean bt_edit_application_is_song_unsaved(const BtEditApplication *self) { gboolean unsaved=self->priv->unsaved; if(!unsaved) g_object_get(self->priv->change_log,"can-undo",&unsaved,NULL); return(unsaved); } /** * bt_edit_application_set_song_unsaved: * @self: the application instance * * Flag unsaved changes in the applications song. */ void bt_edit_application_set_song_unsaved(const BtEditApplication *self) { /* this is not succesfully preventing setting the flag when we create an * undo-able change gboolean can_undo; g_object_get(self->priv->change_log,"can-undo",&can_undo,NULL); if((!self->priv->unsaved) && (!can_undo)) { */ if(!self->priv->unsaved) { self->priv->unsaved=TRUE; g_object_notify(G_OBJECT(self),"unsaved"); } } //-- wrapper //-- default signal handler //-- class internals static void bt_edit_application_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtEditApplication *self = BT_EDIT_APPLICATION(object); return_if_disposed(); switch (property_id) { case EDIT_APPLICATION_SONG: { g_value_set_object(value, self->priv->song); } break; case EDIT_APPLICATION_MAIN_WINDOW: { g_value_set_object(value, self->priv->main_window); } break; case EDIT_APPLICATION_IC_REGISTRY: { g_value_set_object(value, self->priv->ic_registry); } break; case EDIT_APPLICATION_UNSAVED: { g_value_set_boolean(value, self->priv->unsaved); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_edit_application_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtEditApplication *self = BT_EDIT_APPLICATION(object); return_if_disposed(); switch (property_id) { case EDIT_APPLICATION_SONG: { BtSong *song=self->priv->song; #ifdef USE_DEBUG GstElement *bin; g_object_get(self,"bin",&bin,NULL); GST_INFO("bin->num_children=%d",GST_BIN_NUMCHILDREN(bin)); gst_object_unref(bin); if(song) { if(G_OBJECT_REF_COUNT(song)>1) { GST_WARNING("old song->ref_ct=%d!",G_OBJECT_REF_COUNT(song)); } else { GST_INFO("old song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); } g_object_unref(song); } #else g_object_try_unref(song); #endif self->priv->song=BT_SONG(g_value_dup_object(value)); GST_DEBUG("new song: %p, song->ref_ct=%d",self->priv->song,G_OBJECT_REF_COUNT(self->priv->song)); } break; case EDIT_APPLICATION_UNSAVED: { self->priv->unsaved = g_value_get_boolean(value); GST_INFO("set the unsaved flag for the song",self->priv->unsaved); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static GObject* bt_edit_application_constructor(GType type, guint n_construct_params, GObjectConstructParam *construct_params) { GObject *object; if(G_UNLIKELY(!singleton)) { object=G_OBJECT_CLASS(bt_edit_application_parent_class)->constructor(type,n_construct_params,construct_params); singleton=BT_EDIT_APPLICATION(object); g_object_add_weak_pointer(object,(gpointer*)(gpointer)&singleton); //GST_DEBUG("<<<"); GST_INFO("new edit app instantiated"); // create or ref the shared ui ressources singleton->priv->ui_resources=bt_ui_resources_new(); // create the playback controller singleton->priv->pb_controller=bt_playback_controller_socket_new(); // create the interaction controller registry singleton->priv->ic_registry=btic_registry_new(); // create the editor change log singleton->priv->change_log=bt_change_log_new(); g_signal_connect(singleton->priv->change_log,"notify::can-undo",G_CALLBACK(on_changelog_can_undo_changed),(gpointer)singleton); // create main window GST_INFO("new edit app created, app->ref_ct=%d",G_OBJECT_REF_COUNT(singleton)); singleton->priv->main_window=bt_main_window_new(); // warning: dereferencing type-punned pointer will break strict-aliasing rules g_object_add_weak_pointer(G_OBJECT(singleton->priv->main_window),(gpointer*)(gpointer)&singleton->priv->main_window); #ifdef USE_HILDON hildon_program_add_window(HILDON_PROGRAM(hildon_program_get_instance()), HILDON_WINDOW(singleton->priv->main_window)); #endif GST_INFO("new edit app created, app->ref_ct=%d",G_OBJECT_REF_COUNT(singleton)); //GST_DEBUG(">>>"); } else { object=g_object_ref(singleton); } return object; } static void bt_edit_application_dispose(GObject *object) { BtEditApplication *self = BT_EDIT_APPLICATION(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; /* This should destory the window as this is a child of the app. * Problem 1: On the other hand, this *NEVER* gets called as long as the window keeps its * strong reference to the app. * Solution 1: Only use weak refs when reffing upstream objects */ GST_DEBUG("!!!! self=%p, self->ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); if(self->priv->song) { GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->song)); bt_song_stop(self->priv->song); g_object_unref(self->priv->song); self->priv->song=NULL; } if(self->priv->main_window) { GST_INFO("main_window->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->main_window)); //main-menu.c::on_menu_quit_activate gtk_widget_destroy(GTK_WIDGET(self->priv->main_window)); // we get this if we unref // GLib-GObject-WARNING **: instance of invalid non-instantiatable type `' //////g_object_unref(self->priv->main_window); } GST_DEBUG(" more unrefs"); g_object_try_unref(self->priv->ui_resources); g_object_try_unref(self->priv->pb_controller); g_object_try_unref(self->priv->ic_registry); g_object_try_unref(self->priv->change_log); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_edit_application_parent_class)->dispose(object); GST_DEBUG(" done"); } static void bt_edit_application_init(BtEditApplication *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_EDIT_APPLICATION, BtEditApplicationPrivate); } static void bt_edit_application_class_init(BtEditApplicationClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtEditApplicationPrivate)); gobject_class->constructor = bt_edit_application_constructor; gobject_class->set_property = bt_edit_application_set_property; gobject_class->get_property = bt_edit_application_get_property; gobject_class->dispose = bt_edit_application_dispose; klass->song_changed = NULL; g_object_class_install_property(gobject_class,EDIT_APPLICATION_SONG, g_param_spec_object("song", "song prop", "the current song object", BT_TYPE_SONG, /* object type */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,EDIT_APPLICATION_MAIN_WINDOW, g_param_spec_object("main-window", "main window prop", "the main window of this application", BT_TYPE_MAIN_WINDOW, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,EDIT_APPLICATION_IC_REGISTRY, g_param_spec_object("ic-registry", "ic registry prop", "the interaction controller registry of this application", BTIC_TYPE_REGISTRY, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,EDIT_APPLICATION_UNSAVED, g_param_spec_boolean("unsaved", "unsaved prop", "tell whether the current state of the song has been saved", TRUE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/change-log.c0000644042355400116100000010646611634622012014624 00000000000000/* $Id: change-log.c 3641 2011-09-16 10:25:13Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btchangelog * @short_description: class for the editor action journaling * @see_also: #BtCrashRecoverDialog * * Tracks edits actions since last save. Provides undo/redo. Supports grouping * of edits into single undo/redo items (see bt_change_log_start_group()). * * Edit actions are logged to disk for crash recovery. Groups are logged * atomically, when they are closed (to have a recoverable log). * * Logs are reset when saving a song. The log is removed when a song is closed. * * #BtEditApplication checks for left-over logs at startup and uses * #BtCrashRecoverDialog to offer a list of recoverable songs to the user. */ /* @todo: we should also check for pending logs when opening a file! * - need to keep the change-log entries as a hash-table and offer api to check * for it and if wanted replay * - bt_change_log_recover calls bt_edit_application_load_song * - maybe we need to refactor this a bit */ /* @todo: using groups * - start and stop the group in the UI-callback that causes e.g. deleting an * item * - make sure all on_xxx_remove handler are called before closing the group * - in the on_xxx_handlers can we unconditionally add to the log? * - we want to avoid that stuff gets logged: * - when loading a song * - when disposing a song * - when undo/redo-ing actions * - when loading we set the song to the application, when it is done * - when disposing we unset the song from the application and then dispose * - we catch the case of app->song==NULL already here * - ideally we want a cheap way of checking wheter the change-log is active * to avoid builing the undo/redo strings if they are not needed * (in undo/redo already or construction/destructiuon) * -> add gboolean bt_change_log_is_active(BtChangeLog *self) * - log example (remove effect machine with two wires conencted) * bt_main_page_machines_delete_machine: undo/redo: remove machine beg * on_machine_removed: undo/redo: beg * on_machine_removed: undo/redo: end * on_wire_removed: undo/redo: beg * on_wire_removed: undo/redo: end * on_wire_removed: undo/redo: beg * on_wire_removed: undo/redo: end * bt_main_page_machines_delete_machine: undo/redo: remove machine end */ /* scheduling design * - add/remove signals happen at core level * - add after adding * - remove before removing * - there can be chains: * setup::machine-removed(setup:wire-removed,machine:pattern-removed) * - undo/redo happens at UI level * - what we'd like to do is when we trigger something from the ui: * - start the group * - add/remove the top-level element * - handle undo/redo for all subsequenty triggered elements * - close the group * - when adding a top-level caused adding other stuff we don't want to handle * the implicitely added objects (as redo the add would already recreate * them too) * - likewise when deleting a top-level that also deletes other items, we don't * want to handle them, although here we have to backup the old data: * removing a machine, removes the track and patterns, redo will add the * machine, patterns and track, but we have to fill the data then * - the pattern removal here is implicit and thus we don't want to handle * undo/redo for it in the sequence where otherwise it would clear the * cells that where using the pattern * - we probably need to extend the machine:pattern-{added,removed} and * setup:{machine,wire}-{added,removed} signals with a gboolean explicit * parameter, but that won't work as we call this from core too */ /* design: the undo/redo stack * check http://github.com/herzi/gundo more * * empty stack: undo: -1 redo: 0 * - - * * add: undo: 0 redo: 1 * >pattern.set(0,0,0.0) pattern.set(0,0,1.0) * * add: undo: 1 redo: 2 * pattern.set(0,0,0.0) pattern.set(0,0,1.0) * >pattern.set(0,0,1.0) pattern.set(0,0,2.0) * * undo: undo: 0 redo: 1 * >pattern.set(0,0,0.0) pattern.set(0,0,1.0) * pattern.set(0,0,1.0) >pattern.set(0,0,2.0) * * redo: undo: 1 redo: 2 * pattern.set(0,0,0.0) pattern.set(0,0,1.0) * >pattern.set(0,0,1.0) pattern.set(0,0,2.0) * * new: [] u[] r[] next_undo,next_redo,item_ct * ^ ^ -1,0,0 * add: [a] u[ ] r[a] * ^ ^ 0,1,1 * add: [ab] u[ ] r[ab] * ^ 1 ^ 1,2,2 * add: [abc] u[ ] r[abc] * ^ ^ 2,3,3 * undo: [ab] u[ ] r[abc] \ * ^ ^ 1,2,3 * redo: [abc] u[ ] r[abc] / * ^ ^ 2,3,3 * undo: [ab] u[ ] r[abc] \ * ^ ^ 1,2,3 * add: [abd] u[ ] r[abd] / { this looses the 'c' } * ^ ^ 2,3,3 * undo: [ab] u[ ] r[abd] \ * ^ ^ 1,2,3 * undo: [a] u[ ] r[abd] \ * ^ ^ 0,1,3 * add: [ae] u[ ] r[ae] / { this looses the 'bd' } * ^ ^ 1,2,2 * * -- can we get the 'c' back - no * when adding a new action, we will always truncate the undo/redo stack. * Otherwise it becomes a graph and then redo would need to know the direction. * */ /* design: change grouping * - some action are a sequence of undo/redo actions * - when clearing a selection, we can represent this as a group of edits * - undo it the remove of a machine (and its patterns) * - self->priv->changes is a array of BtChangeLogEntry * - we need to have a special entry, that again contains a array of * BtChangeLogEntry * - we could make BtChangeLogEntry a union and add a 'type' field first * - one would call bt_change_log_{start,end}_group to brace grouped changes * - bt_change_log_add would add to the active group (default = top_level) * - groups could be hierarchical, but are applied only as a whole * - bt_change_log_undo/redo would need to check for groups and in that case loop * over the group * - the log-file serialisation can ignore the groups */ #define BT_EDIT #define BT_CHANGE_LOG_C #include "bt-edit.h" #include //-- property ids enum { CHANGE_LOG_CAN_UNDO=1, CHANGE_LOG_CAN_REDO, CHANGE_LOG_CRASH_LOGS }; //-- structs typedef enum { CHANGE_LOG_ENTRY_SINGLE=0, CHANGE_LOG_ENTRY_GROUP } BtChangeLogEntryType; typedef struct { BtChangeLogEntryType type; } BtChangeLogEntry; typedef struct { BtChangeLogEntryType type; BtChangeLogger *owner; gchar *undo_data; gchar *redo_data; } BtChangeLogEntrySingle; typedef struct _BtChangeLogEntryGroup BtChangeLogEntryGroup; struct _BtChangeLogEntryGroup { BtChangeLogEntryType type; GPtrArray *changes; BtChangeLogEntryGroup *old_group; }; struct _BtChangeLogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ G_POINTER_ALIAS(BtEditApplication *,app); /* logging is inactive during song-construction/desctruction and when * replaying and undo/redo action */ gboolean is_active; /* log file */ FILE *log_file; gchar *log_file_name; gchar *cache_dir; /* known ChangeLoggers */ GHashTable *loggers; /* each entry pointing to a BtChangeLogEntry{Single,Group} */ GPtrArray *changes; guint last_saved; gint next_redo; // -1 for none, or just have pointers? gint next_undo; // -1 for none, or just have pointers? gint item_ct; // same as changed->len, but also accesible when changes=NULL BtChangeLogEntryGroup *cur_group; /* crash log entries */ GList *crash_logs; }; static BtChangeLog *singleton=NULL; #define BT_CHANGE_LOG_MAX_HEADER_LINE_LEN 200 // date time stamp format YYYY-MM-DDThh:mm:ssZ #define DTS_LEN 20 //-- the class G_DEFINE_TYPE (BtChangeLog, bt_change_log, G_TYPE_OBJECT); //-- helper static void free_change_log_entry(BtChangeLogEntry *cle) { switch(cle->type) { case CHANGE_LOG_ENTRY_SINGLE: { BtChangeLogEntrySingle *cles=(BtChangeLogEntrySingle*)cle; g_free(cles->undo_data); g_free(cles->redo_data); g_slice_free(BtChangeLogEntrySingle,cles); break; } case CHANGE_LOG_ENTRY_GROUP: { BtChangeLogEntryGroup *cleg=(BtChangeLogEntryGroup*)cle; guint i; // recurse for(i=0;ichanges->len;i++) { free_change_log_entry(g_ptr_array_index(cleg->changes,i)); } g_ptr_array_free(cleg->changes,TRUE); g_slice_free(BtChangeLogEntryGroup,cleg); break; } } } static void log_change_log_entry(BtChangeLog *self,BtChangeLogEntry *cle) { if(!self->priv->log_file) return; switch(cle->type) { case CHANGE_LOG_ENTRY_SINGLE: { BtChangeLogEntrySingle *cles=(BtChangeLogEntrySingle*)cle; GST_DEBUG("logging change %p",cle); // owners are the editor objects where the change was made fprintf(self->priv->log_file,"%s::%s\n",G_OBJECT_TYPE_NAME(cles->owner),cles->redo_data); // @idea: should we fdatasync(fileno(self->priv->log_file)); from time to time break; } case CHANGE_LOG_ENTRY_GROUP: { BtChangeLogEntryGroup *cleg=(BtChangeLogEntryGroup*)cle; gint i; GST_DEBUG("logging group %p",cle); // recurse, apply from end to start of group for(i=cleg->changes->len-1;i>=0;i--) { log_change_log_entry(self,g_ptr_array_index(cleg->changes,i)); } break; } default: g_assert_not_reached(); } } static void add_change_log_entry(BtChangeLog *self,BtChangeLogEntry *cle) { // only on top-level group if(self->priv->cur_group==NULL) { // if we have redo data, we have to cut the trail here otherwise the history // becomes a graph if(self->priv->item_ct && (self->priv->next_redopriv->item_ct)) { gint i; GST_WARNING("trunc %d<%d",self->priv->next_redo,self->priv->item_ct); for(i=self->priv->item_ct-1;i>=self->priv->next_redo;i--) { free_change_log_entry(g_ptr_array_remove_index(self->priv->changes,i)); self->priv->item_ct--; } } /*else { GST_INFO("don't trunc %d>=%d",self->priv->next_redo,self->priv->item_ct); }*/ // append and update undo undo/redo pointers g_ptr_array_add(self->priv->changes,cle); self->priv->item_ct++; // update undo undo/redo pointers self->priv->next_undo++; self->priv->next_redo++; GST_INFO("add %d, %d",self->priv->next_undo,self->priv->next_redo); //GST_INFO("add %d[%s], %d[%s]",self->priv->next_undo,undo_data,self->priv->next_redo,redo_data); if(self->priv->next_undo==0) { g_object_notify((GObject *)self,"can-undo"); } } else { // append and update undo undo/redo pointers g_ptr_array_add(self->priv->cur_group->changes,cle); } } static void undo_change_log_entry(BtChangeLog *self,BtChangeLogEntry *cle) { switch(cle->type) { case CHANGE_LOG_ENTRY_SINGLE: { BtChangeLogEntrySingle *cles=(BtChangeLogEntrySingle*)cle; bt_change_logger_change(cles->owner,cles->undo_data); if(self->priv->log_file) { fprintf(self->priv->log_file,"%s::%s\n",G_OBJECT_TYPE_NAME(cles->owner),cles->undo_data); } break; } case CHANGE_LOG_ENTRY_GROUP: { BtChangeLogEntryGroup *cleg=(BtChangeLogEntryGroup*)cle; gint i; // recurse, apply from start to end of group for(i=0;ichanges->len;i++) { undo_change_log_entry(self,g_ptr_array_index(cleg->changes,i)); } break; } default: g_assert_not_reached(); } } static void redo_change_log_entry(BtChangeLog *self,BtChangeLogEntry *cle) { switch(cle->type) { case CHANGE_LOG_ENTRY_SINGLE: { BtChangeLogEntrySingle *cles=(BtChangeLogEntrySingle*)cle; bt_change_logger_change(cles->owner,cles->redo_data); if(self->priv->log_file) { fprintf(self->priv->log_file,"%s::%s\n",G_OBJECT_TYPE_NAME(cles->owner),cles->redo_data); } break; } case CHANGE_LOG_ENTRY_GROUP: { BtChangeLogEntryGroup *cleg=(BtChangeLogEntryGroup*)cle; gint i; // recurse, apply from end to start of group for(i=cleg->changes->len-1;i>=0;i--) { redo_change_log_entry(self,g_ptr_array_index(cleg->changes,i)); } break; } default: g_assert_not_reached(); } } static void close_and_free_log(BtChangeLog *self) { self->priv->is_active=FALSE; if(self->priv->log_file) { fclose(self->priv->log_file); self->priv->log_file=NULL; } if(self->priv->log_file_name) { g_unlink(self->priv->log_file_name); g_free(self->priv->log_file_name); self->priv->log_file_name=NULL; } if(self->priv->changes) { guint i,l=self->priv->changes->len; for(i=0;ipriv->changes,i)); g_ptr_array_free(self->priv->changes,TRUE); self->priv->changes=NULL; self->priv->next_undo=-1; self->priv->next_redo=0; self->priv->item_ct=0; } } static gchar *make_log_file_name(BtChangeLog *self, BtSongInfo *song_info) { gchar *file_name,*name,*log_file_name; time_t now=time(NULL); gchar dts[DTS_LEN+1]; /* we need unique filenames (see bt_change_log_recover() */ g_object_get(song_info,"name",&name,/*"change-dts",&dts,*/NULL); strftime(dts,DTS_LEN+1,"%FT%TZ",gmtime(&now)); file_name=g_strdup_printf("%s_%s.log",dts,name); g_free(name); //g_free(dts); log_file_name=g_build_filename(self->priv->cache_dir,file_name,NULL); g_free(file_name); return(log_file_name); } static void open_and_init_log(BtChangeLog *self, BtSongInfo *song_info) { if(!(self->priv->log_file=fopen(self->priv->log_file_name,"wt"))) { GST_WARNING("can't open log file '%s' : %d : %s",self->priv->log_file_name,errno,g_strerror(errno)); g_free(self->priv->log_file_name); self->priv->log_file_name=NULL; } else { gchar *file_name; self->priv->changes=g_ptr_array_new(); self->priv->next_undo=-1; self->priv->next_redo=0; self->priv->cur_group=NULL; self->priv->item_ct=0; setvbuf(self->priv->log_file, (char *) NULL, _IOLBF, 0); g_object_get(song_info,"file-name",&file_name,NULL); fputs(PACKAGE" edit journal : "PACKAGE_VERSION"\n",self->priv->log_file); if(file_name) { fputs(file_name,self->priv->log_file); g_free(file_name); } fputs("\n",self->priv->log_file); self->priv->is_active=TRUE; } } static gint sort_by_mtime(gconstpointer a,gconstpointer b) { return(((BtChangeLogFile *)b)->mtime - ((BtChangeLogFile *)a)->mtime); } static void free_crash_log_file(BtChangeLogFile *crash_entry) { g_free(crash_entry->log_name); g_free(crash_entry->song_file_name); g_free(crash_entry->change_ts); g_slice_free(BtChangeLogFile,crash_entry); } /* * bt_change_log_crash_check: * @self: the changelog * * Looks for changelog-journals in the cache dir. Finding those would indicate * that a song has not been saved (e.g the app crashed). This check can be done * at any time, but application startup would make most sense. * Currently open songs (which have a open journal) are filtered. * * Returns: a list with journals, free when done. */ static void bt_change_log_crash_check(BtChangeLog *self) { GDir *dir; GList *crash_logs=NULL; if(!self->priv->cache_dir) return; if((dir=g_dir_open(self->priv->cache_dir,0,NULL))) { const gchar *log_name; gchar log_path[FILENAME_MAX]; FILE *log_file; gboolean valid_log,auto_clean; GST_INFO("looking for crash left-overs in %s",self->priv->cache_dir); while((log_name=g_dir_read_name(dir))) { // skip names starting with a dot if(*log_name=='.') continue; g_sprintf(log_path,"%s"G_DIR_SEPARATOR_S"%s",self->priv->cache_dir,log_name); // skip symlinks if(g_file_test(log_path,G_FILE_TEST_IS_SYMLINK)) continue; // skip files other than logs and our current log if(!g_str_has_suffix(log_name,".log")) continue; GST_INFO(" found file '%s'",log_path); /* run a pre-check over the logs * - auto-clean logs that only consist of the header (2 lines) * - the log would need to point to the actual filename * - only offer recover if the original file is available or * if file-name is empty * - otherwise auto-clean */ valid_log=auto_clean=FALSE; if((log_file=fopen(log_path,"rt"))) { gchar linebuf[BT_CHANGE_LOG_MAX_HEADER_LINE_LEN]; gchar song_file_name[BT_CHANGE_LOG_MAX_HEADER_LINE_LEN]; BtChangeLogFile *crash_log; struct stat fileinfo; if(!(fgets(linebuf, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file))) { GST_INFO(" '%s' is not a change log, eof too early",log_name); goto done; } if(!g_str_has_prefix(linebuf, PACKAGE" edit journal : ")) { GST_INFO(" '%s' is not a change log, wrong header",log_name); goto done; } // from now one, we know its a log, if its useless we can kill it if(!(fgets(song_file_name, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file))) { GST_INFO(" '%s' is not a change log, eof too early",log_name); auto_clean=TRUE; goto done; } g_strchomp(song_file_name); if(*song_file_name && !g_file_test(song_file_name, G_FILE_TEST_IS_REGULAR|G_FILE_TEST_EXISTS)) { GST_INFO(" '%s' a change log for '%s' but that file does not exists",log_name,song_file_name); auto_clean=TRUE; goto done; } if(!(fgets(linebuf, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file))) { GST_INFO(" '%s' is an empty change log",log_name); auto_clean=TRUE; goto done; } valid_log=TRUE; // add to crash_entries list crash_log=g_slice_new(BtChangeLogFile); crash_log->log_name=g_strdup(log_path); crash_log->song_file_name=*song_file_name?g_strdup(song_file_name):g_strdup(_("unsaved song")); stat(log_path,&fileinfo); strftime(linebuf,BT_CHANGE_LOG_MAX_HEADER_LINE_LEN-1,"%c",localtime(&fileinfo.st_mtime)); crash_log->change_ts=g_strdup(linebuf); crash_log->mtime=fileinfo.st_mtime; crash_logs=g_list_prepend(crash_logs,crash_log); done: fclose(log_file); } if(!valid_log) { /* be careful with removing invalid log-files * - if g_get_user_cache_dir() returns non-sense due to some bug, * we eventualy walk some random dir and remove files * - we can remove files that *are* log files, but invalid */ if(auto_clean) { GST_WARNING("auto removing '%s'",log_name); g_remove(log_path); } } } g_dir_close(dir); } // sort list by time self->priv->crash_logs=g_list_sort(crash_logs,sort_by_mtime); } //-- event handler static void on_song_file_name_changed(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtChangeLog *self = BT_CHANGE_LOG(user_data); BtSongInfo *song_info; gchar *log_file_name; // move the log g_object_get((GObject*)song,"song-info",&song_info,NULL); log_file_name=make_log_file_name(self,song_info); g_rename(self->priv->log_file_name,log_file_name); g_free(self->priv->log_file_name); self->priv->log_file_name=log_file_name; g_object_unref(song_info); } static void on_song_file_unsaved_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtChangeLog *self = BT_CHANGE_LOG(user_data); BtSong *song; BtSongInfo *song_info; gboolean unsaved; g_object_get((GObject*)app,"unsaved",&unsaved,"song",&song,NULL); g_object_get(song,"song-info",&song_info,NULL); if(!unsaved) { GST_WARNING("reset log file"); // reset the log close_and_free_log(self); self->priv->log_file_name=make_log_file_name(self,song_info); open_and_init_log(self,song_info); } else { // this updates the time-stamp (we need that to show the since when we have // unsaved changes, if some one closes the song) g_object_set(song_info,"change-dts",NULL,NULL); } g_object_unref(song_info); g_object_unref(song); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtChangeLog *self = BT_CHANGE_LOG(user_data); BtSong *song; BtSongInfo *song_info; if(!self->priv->cache_dir) return; GST_WARNING("song has changed : app=%p, self=%p",app,self); // remove old log file close_and_free_log(self); // get song from app g_object_get(self->priv->app,"song",&song,NULL); if(!song) { GST_INFO("song (null) has changed: done"); return; } // create new log file g_object_get(song,"song-info",&song_info,NULL); self->priv->log_file_name=make_log_file_name(self,song_info); open_and_init_log(self,song_info); // notify on name changes to move the log g_signal_connect(song, "notify::name", G_CALLBACK(on_song_file_name_changed), (gpointer)self); // notify on unsaved changed to truncate the log when unsaved==FALSE g_signal_connect(self->priv->app, "notify::unsaved", G_CALLBACK(on_song_file_unsaved_changed), (gpointer)self); // release the reference g_object_unref(song_info); g_object_unref(song); GST_INFO("song has changed: done"); } //-- constructor methods /** * bt_change_log_new: * * Create a new instance on first call and return a reference later on. * * Returns: the new signleton instance */ BtChangeLog *bt_change_log_new(void) { return (g_object_new(BT_TYPE_CHANGE_LOG,NULL)); } //-- methods /** * bt_change_log_is_active: * @self: the changelog * * Checks if the changelog journalling is active. Should be checked before * adding entries to avoid logging when e.g. loading a song. * * Returns: %TRUE if the log is active */ gboolean bt_change_log_is_active(BtChangeLog *self) { return(self->priv->is_active); } /** * bt_change_log_recover: * @self: the changelog * @log_name: the log file to replay * * Recover the given song. * * Return: %TRUE for successful recovery. */ gboolean bt_change_log_recover(BtChangeLog *self,const gchar *log_name) { FILE *log_file; gboolean res=FALSE; gboolean copy=FALSE; if((log_file=fopen(log_name,"rt"))) { gchar linebuf[10000]; /* @todo: a line can be a full column */ gchar *redo_data; BtChangeLogger *logger; guint lines=0,lines_ok=0; if(!(fgets(linebuf, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file))) { GST_INFO(" '%s' is not a change log, eof too early",log_name); goto done; } if(!(fgets(linebuf, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file))) { GST_INFO(" '%s' is not a change log, eof too early",log_name); goto done; } g_strchomp(linebuf); /* - load the song pointed to by entry or replay the new song - no filename = never saved -> new file */ if(*linebuf) { /* this creates a new song object and thus triggers * on_song_changed() where we setup a new logfile */ if(!bt_edit_application_load_song(self->priv->app,linebuf)) { GST_INFO(" song '%s' failed to load",linebuf); goto done; } } else { /* @todo: we need to either copy the log data to the new log or use the * previous log as the current one, otherwise we loose the changes */ copy=TRUE; } // replay the log while(!feof(log_file)) { if(fgets(linebuf, BT_CHANGE_LOG_MAX_HEADER_LINE_LEN, log_file)) { if(copy) { fputs(linebuf,self->priv->log_file); } g_strchomp(linebuf);lines++; GST_DEBUG("changelog-event: '%s'", linebuf); // log event: BtMainPagePatterns::set_global_event "simsyn","simsyn 00",8,0,c-4 if((redo_data=strstr(linebuf,"::"))) { redo_data[0]='\0'; redo_data=&redo_data[2]; // determine owner (BtMainPagePatterns) if((logger=g_hash_table_lookup(self->priv->loggers,linebuf))) { if(bt_change_logger_change(logger,redo_data)) { lines_ok++; /* we don't add those to the new log, as we have no undo-data. Thus * we cannot restore the change-stack fully. */ } else { GST_WARNING("failed to replay line: '%s::%s'",linebuf,redo_data); } } else { GST_WARNING("no changelogger for '%s'",linebuf); } } else { GST_WARNING("missing :: separator in '%s'",linebuf); } } } GST_INFO("%u of %u lines replayed okay", lines_ok, lines); res=(lines_ok==lines); done: fclose(log_file); if(res) { GList *node; /* @todo: defer removing the old log to saving the song * -> on_song_file_unsaved_changed() * - ev. need to store recovered_log_name in self, so that we can check * it om _unsaved_changed() */ g_unlink(log_name); for(node=self->priv->crash_logs;node;node=g_list_next(node)) { BtChangeLogFile *crash_entry=(BtChangeLogFile *)node->data; if(!strcmp(log_name,crash_entry->log_name)) { self->priv->crash_logs=g_list_delete_link(self->priv->crash_logs,node); free_crash_log_file(crash_entry); break; } } } } return(res); } /** * bt_change_log_register: * @self: the change log * @logger: a change logger * * Register a change-logger for use in change log replay. */ void bt_change_log_register(BtChangeLog *self,BtChangeLogger *logger) { GST_DEBUG("registering: '%s'",G_OBJECT_TYPE_NAME(logger)); g_hash_table_insert(self->priv->loggers,(gpointer)G_OBJECT_TYPE_NAME(logger),(gpointer)logger); } /** * bt_change_log_add: * @self: the change log * @owner: the owner of the change * @undo_data: how to undo the change * @redo_data: how to redo the change * * Add a new change to the change log. Changes are passed as serialized strings. * The change-log takes ownership of @undo_data and @redo_data. */ void bt_change_log_add(BtChangeLog *self,BtChangeLogger *owner,gchar *undo_data,gchar *redo_data) { if(self->priv->changes) { BtChangeLogEntrySingle *cle; // make new BtChangeLogEntry from the parameters cle=g_slice_new(BtChangeLogEntrySingle); cle->type=CHANGE_LOG_ENTRY_SINGLE; cle->owner=owner; cle->undo_data=undo_data; cle->redo_data=redo_data; GST_INFO("add %d[%s], %d[%s]",self->priv->next_undo,undo_data,self->priv->next_redo,redo_data); add_change_log_entry(self,(BtChangeLogEntry*)cle); if(self->priv->cur_group==NULL) { // log ungrouped changes immediately log_change_log_entry(self,(BtChangeLogEntry*)cle); } } } /** * bt_change_log_start_group: * @self: the change log * * Open a new group. All further bt_change_log_add() calls will add to the * active group. The group needs to be closed using bt_change_log_end_group(). * Groups can be nested. * * A top-level group is undone or redone with a single bt_change_log_undo() or * bt_change_log_redo() call. * * One would start and finish such a group in the first signal handler that * triggered the change. */ void bt_change_log_start_group(BtChangeLog *self) { if(self->priv->changes) { BtChangeLogEntryGroup *cle; cle=g_slice_new(BtChangeLogEntryGroup); cle->type=CHANGE_LOG_ENTRY_GROUP; cle->changes=g_ptr_array_new(); cle->old_group=self->priv->cur_group; add_change_log_entry(self,(BtChangeLogEntry*)cle); // make this the current group; self->priv->cur_group=cle; } } /** * bt_change_log_end_group: * @self: the change log * * Closed the last group opened with bt_change_log_start_group(). Usually one * a group would be closed in the same local scope where it was opened. */ void bt_change_log_end_group(BtChangeLog *self) { if(self->priv->changes) { BtChangeLogEntryGroup *cle=self->priv->cur_group; if(cle) { // when we finished a top-level group, log the content to the journal if(cle->old_group==NULL) { GST_DEBUG("closing a top-level group %p, logging changes",cle); log_change_log_entry(self,(BtChangeLogEntry*)cle); } self->priv->cur_group=cle->old_group; } } } /** * bt_change_log_undo: * @self: the change log * * Undo the last action. */ void bt_change_log_undo(BtChangeLog *self) { if(self->priv->next_undo!=-1) { gboolean is_active=self->priv->is_active; self->priv->is_active=FALSE; GST_INFO("before undo %d, %d",self->priv->next_undo,self->priv->next_redo); undo_change_log_entry(self,g_ptr_array_index(self->priv->changes,self->priv->next_undo)); // update undo undo/redo pointers self->priv->next_redo=self->priv->next_undo; self->priv->next_undo--; GST_INFO("after undo %d, %d",self->priv->next_undo,self->priv->next_redo); if(self->priv->next_undo==-1) { g_object_notify((GObject *)self,"can-undo"); } if(self->priv->next_redo==(self->priv->item_ct-1)) { g_object_notify((GObject *)self,"can-redo"); } self->priv->is_active=is_active; } else { GST_INFO("no undo at: %d, %d",self->priv->next_undo,self->priv->next_redo); } } /** * bt_change_log_redo: * @self: the change log * * Redo the last action. */ void bt_change_log_redo(BtChangeLog *self) { if(self->priv->next_redo!=self->priv->item_ct) { gboolean is_active=self->priv->is_active; self->priv->is_active=FALSE; GST_INFO("before redo %d, %d",self->priv->next_undo,self->priv->next_redo); redo_change_log_entry(self,g_ptr_array_index(self->priv->changes,self->priv->next_redo)); // update undo undo/redo pointers self->priv->next_undo=self->priv->next_redo; self->priv->next_redo++; GST_INFO("after redo %d, %d",self->priv->next_undo,self->priv->next_redo); if(self->priv->next_redo==self->priv->item_ct) { g_object_notify((GObject *)self,"can-redo"); } if(self->priv->next_undo==0) { g_object_notify((GObject *)self,"can-undo"); } self->priv->is_active=is_active; } else { GST_INFO("no redo at: %d, %d",self->priv->next_undo,self->priv->next_redo); } } //-- class internals static void bt_change_log_dispose(GObject *object) { BtChangeLog *self = BT_CHANGE_LOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_changed,NULL); close_and_free_log(self); g_object_try_weak_unref(self->priv->app); G_OBJECT_CLASS(bt_change_log_parent_class)->dispose(object); } static void bt_change_log_finalize(GObject *object) { BtChangeLog *self = BT_CHANGE_LOG(object); GList *node; GST_DEBUG("!!!! self=%p",self); g_free(self->priv->cache_dir); g_hash_table_destroy(self->priv->loggers); // free cgrash-logs list and entries for(node=self->priv->crash_logs;node;node=g_list_next(node)) { free_crash_log_file((BtChangeLogFile *)node->data); } g_list_free(self->priv->crash_logs); G_OBJECT_CLASS(bt_change_log_parent_class)->finalize(object); } static GObject *bt_change_log_constructor(GType type,guint n_construct_params,GObjectConstructParam *construct_params) { GObject *object; if(G_UNLIKELY(!singleton)) { object=G_OBJECT_CLASS(bt_change_log_parent_class)->constructor(type,n_construct_params,construct_params); singleton=BT_CHANGE_LOG(object); g_object_add_weak_pointer(object,(gpointer*)(gpointer)&singleton); } else { object=g_object_ref(singleton); } return object; } static void bt_change_log_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtChangeLog *self = BT_CHANGE_LOG(object); return_if_disposed(); switch (property_id) { case CHANGE_LOG_CAN_UNDO: { g_value_set_boolean(value,(self->priv->next_undo!=-1)); } break; case CHANGE_LOG_CAN_REDO: { g_value_set_boolean(value,(self->priv->next_redo!=self->priv->item_ct)); } break; case CHANGE_LOG_CRASH_LOGS: { g_value_set_pointer(value,self->priv->crash_logs); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_change_log_init(BtChangeLog *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self,BT_TYPE_CHANGE_LOG,BtChangeLogPrivate); /* this is created from the app, we need to avoid a ref-cycle */ self->priv->app = bt_edit_application_new(); g_object_try_weak_ref(self->priv->app); g_object_unref(self->priv->app); self->priv->cache_dir=g_build_filename(g_get_user_cache_dir(),PACKAGE,NULL); /* ensure cachedir, set to NULL if we can't make it to deactivate the change logger */ if(g_mkdir_with_parents(self->priv->cache_dir,S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)==-1) { GST_WARNING("Can't create change-log dir: '%s': %s",self->priv->cache_dir, g_strerror(errno)); g_free(self->priv->cache_dir); self->priv->cache_dir=NULL; } else { bt_change_log_crash_check(self); } self->priv->loggers=g_hash_table_new(g_str_hash,g_str_equal); on_song_changed(self->priv->app,NULL,self); g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); } static void bt_change_log_class_init(BtChangeLogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtChangeLogPrivate)); gobject_class->get_property = bt_change_log_get_property; gobject_class->constructor = bt_change_log_constructor; gobject_class->dispose = bt_change_log_dispose; gobject_class->finalize = bt_change_log_finalize; g_object_class_install_property(gobject_class,CHANGE_LOG_CAN_UNDO, g_param_spec_boolean("can-undo", "can-undo prop", "Where there are action to undo", FALSE, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,CHANGE_LOG_CAN_REDO, g_param_spec_boolean("can-redo", "can-redo prop", "Where there are action to redo", FALSE, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,CHANGE_LOG_CRASH_LOGS, g_param_spec_pointer("crash-logs", "crash logs prop", "A list of found crash logs", G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/settings-page-interaction-controller.h0000644042355400116100000000547411625722250022077 00000000000000/* $Id: settings-page-interaction-controller.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_H #define BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_H #include #include #define BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER (bt_settings_page_interaction_controller_get_type ()) #define BT_SETTINGS_PAGE_INTERACTION_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER, BtSettingsPageInteractionController)) #define BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER, BtSettingsPageInteractionControllerClass)) #define BT_IS_SETTINGS_PAGE_INTERACTION_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER)) #define BT_IS_SETTINGS_PAGE_INTERACTION_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER)) #define BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_PAGE_INTERACTION_CONTROLLER, BtSettingsPageInteractionControllerClass)) /* type macros */ typedef struct _BtSettingsPageInteractionController BtSettingsPageInteractionController; typedef struct _BtSettingsPageInteractionControllerClass BtSettingsPageInteractionControllerClass; typedef struct _BtSettingsPageInteractionControllerPrivate BtSettingsPageInteractionControllerPrivate; /** * BtSettingsPageInteractionController: * * the root window for the editor application */ struct _BtSettingsPageInteractionController { GtkTable parent; /*< private >*/ BtSettingsPageInteractionControllerPrivate *priv; }; struct _BtSettingsPageInteractionControllerClass { GtkTableClass parent; }; GType bt_settings_page_interaction_controller_get_type(void) G_GNUC_CONST; BtSettingsPageInteractionController *bt_settings_page_interaction_controller_new(void); #endif // BT_SETTINGS_PAGE_INTERACTION_CONTROLLER_H buzztard-0.6.0/src/ui/edit/sequence-grid-model.c0000644042355400116100000005531511636277312016460 00000000000000/* $Id: sequence-grid-model.c 3349 2011-05-02 20:35:54Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsequencegridmodel * @short_description: data model class for widgets showing the pattern sequence * of a song * * A generic model representing the track x time grid of patterns of a song. * Can be shown by a treeview. * * The visible length can be greater then the real length of the underlying * sequence, by setting the BtSequenceGridModel::length property. */ /* design: * - support reordering tracks without rebuilding the model * - check on_track_move_left_activated() * - maybe we need to emit notify::tracks when reordering too * - when do we refresh+recolorize in the old code * - todo in new code * - move track left/right * - cursor below the end-of song * - already handled in new code * - loop-end changed * - add/remove track * - machine removed (should trigger notify::tracks) * - song changed (will create the model) * * - we have a property for the pos-format, when it changes we refresh all rows * - main-page-sequence should build the combobox from this enum * (should we have a model for enums?) */ #define BT_EDIT #define BT_SEQUENCE_GRID_MODEL_C #include "bt-edit.h" //-- defines #define N_COLUMNS __BT_SEQUENCE_GRID_MODEL_N_COLUMNS //-- property ids enum { SEQUENCE_GRID_MODEL_POS_FORMAT=1, SEQUENCE_GRID_MODEL_BARS, SEQUENCE_GRID_MODEL_LENGTH }; //-- structs struct _BtSequenceGridModelPrivate { gint stamp; BtSequence *sequence; BtSequenceGridModelPosFormat pos_format; gulong bars; gulong ticks_per_beat; GType param_types[N_COLUMNS]; gulong length, tracks; gulong visible_length; }; //-- enums GType bt_sequence_grid_model_pos_format_get_type(void) { static GType type = 0; if(G_UNLIKELY(type == 0)) { static const GEnumValue values[] = { { BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS,"BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS","ticks" }, { BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME, "BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME", "time" }, { BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS, "BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS", "beats" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtSequenceGridModelPosFormat", values); } return type; } //-- the class static void bt_sequence_grid_model_tree_model_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtSequenceGridModel, bt_sequence_grid_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, bt_sequence_grid_model_tree_model_init)); //-- helper static gchar *format_position(const BtSequenceGridModel *model,gulong pos) { static gchar pos_str[20]; switch(model->priv->pos_format) { case BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS: g_snprintf(pos_str,5,"%lu",pos); break; case BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TIME: { gulong msec,sec,min; // this is cached in sequence and properly updated const GstClockTime bar_time=bt_sequence_get_bar_time(model->priv->sequence); msec=(gulong)((pos*bar_time)/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); g_sprintf(pos_str,"%02lu:%02lu.%03lu",min,sec,msec); } break; case BT_SEQUENCE_GRID_MODEL_POS_FORMAT_BEATS: { gulong beat, tick; gint tick_chars; beat=pos/model->priv->ticks_per_beat; tick=pos-(beat*model->priv->ticks_per_beat); if(model->priv->ticks_per_beat>=100) tick_chars=3; else if(model->priv->ticks_per_beat>=10) tick_chars=2; else tick_chars=1; g_sprintf(pos_str,"%lu.%0*lu",beat,tick_chars,tick); } break; default: *pos_str='\0'; GST_WARNING("unimplemented time format %d",model->priv->pos_format); } return(pos_str); } static void bt_sequence_grid_model_rows_changed(BtSequenceGridModel *model,gulong beg, gulong end) { GtkTreePath *path; GtkTreeIter iter; gulong i; // trigger row-changed for all rows iter.stamp=model->priv->stamp; for(i=beg;i<=end;i++) { iter.user_data=GUINT_TO_POINTER(i); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,i); gtk_tree_model_row_changed(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } } static void bt_sequence_grid_model_all_rows_changed(BtSequenceGridModel *model) { bt_sequence_grid_model_rows_changed(model,0,model->priv->visible_length-1); } static void update_length(BtSequenceGridModel *model,gulong old_length,gulong new_length) { GtkTreePath *path; glong i; GST_INFO("resize length : %lu -> %lu",old_length,new_length); if(old_lengthpriv->stamp; for(i=old_length;inew_length) { // trigger row-deleted for(i=old_length-1;i>=new_length;i--) { path=gtk_tree_path_new(); gtk_tree_path_append_index(path,i); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model),path); gtk_tree_path_free(path); } } } //-- signal handlers static void on_pattern_name_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); BtPattern *that_pattern; GtkTreePath *path; GtkTreeIter iter; gulong i,j; gulong length=model->priv->length; gulong tracks=model->priv->tracks; iter.stamp=model->priv->stamp; // find all affected rows and signal updates // FIXME: skip tracks with wrong machine (do a first run and build a list of tracks) for(i=0;ipriv->sequence,i,j))) { if(that_pattern==pattern) { iter.user_data=GUINT_TO_POINTER(i); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,i); gtk_tree_model_row_changed(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); g_object_unref(that_pattern); break; } else { g_object_unref(that_pattern); } } } } } static void on_song_info_tpb_changed(BtSongInfo *song_info,GParamSpec *arg,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); g_object_get(song_info,"tpb",&model->priv->ticks_per_beat,NULL); bt_sequence_grid_model_all_rows_changed(model); } static void on_sequence_length_changed(BtSequence *sequence,GParamSpec *arg,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); gulong old_length=model->priv->length; g_object_get((gpointer)sequence,"length",&model->priv->length,NULL); if(model->priv->length!=old_length) { gulong old_visible_length=model->priv->visible_length; model->priv->visible_length=MAX(old_visible_length,model->priv->length); GST_INFO("sequence length changed: %lu -> %lu",old_length,model->priv->length); update_length(model,old_visible_length,model->priv->visible_length); } } static void on_sequence_tracks_changed(BtSequence *sequence,GParamSpec *arg,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); gulong old_tracks=model->priv->tracks; g_object_get((gpointer)sequence,"tracks",&model->priv->tracks,NULL); if(model->priv->tracks!=old_tracks) { GST_INFO("sequence tracks changed: %lu -> %lu",old_tracks,model->priv->tracks); if(model->priv->visible_length) bt_sequence_grid_model_all_rows_changed(model); } } static void on_sequence_rows_changed(BtSequence *sequence,gulong beg,gulong end,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); bt_sequence_grid_model_rows_changed(model,beg,end); } static void on_sequence_pattern_added(BtSequence *sequence,BtPattern *pattern,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); g_signal_connect(pattern,"notify::name",G_CALLBACK(on_pattern_name_changed),(gpointer)model); } static void on_sequence_pattern_removed(BtSequence *sequence,BtPattern *pattern,gpointer user_data) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(user_data); g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pattern_name_changed,(gpointer)model); } //-- constructor methods /** * bt_sequence_grid_model_new: * @sequence: the sequence * @bars: the intial bar-filtering for the view * * Creates a grid model for the @sequence. The model is automatically updated on * changes in the content. It also expands its length in sync to the sequence. * * To make the row-shading work, the application has to update * #BtSequenceGridModel:bars when it changed on the view. * * When setting #BtSequenceGridModel:length to a value greater than the real * @sequence, the model will append dummy rows. This allows the cursor to go * beyond the end to expand the sequence. * * Returns: the sequence model. */ BtSequenceGridModel *bt_sequence_grid_model_new(BtSequence *sequence,gulong bars) { BtSequenceGridModel *self; BtSong *song; BtSongInfo *song_info; self=g_object_new(BT_TYPE_SEQUENCE_GRID_MODEL, NULL); self->priv->sequence=sequence; g_object_add_weak_pointer((GObject *)sequence,(gpointer *)&self->priv->sequence); self->priv->bars=bars; // static columns self->priv->param_types[BT_SEQUENCE_GRID_MODEL_SHADE ]=G_TYPE_BOOLEAN; self->priv->param_types[BT_SEQUENCE_GRID_MODEL_POS ]=G_TYPE_LONG; self->priv->param_types[BT_SEQUENCE_GRID_MODEL_POSSTR]=G_TYPE_STRING; self->priv->param_types[BT_SEQUENCE_GRID_MODEL_LABEL ]=G_TYPE_STRING; // add enough rows for current length on_sequence_tracks_changed(sequence,NULL,(gpointer)self); on_sequence_length_changed(sequence,NULL,(gpointer)self); g_object_get(sequence,"song",&song,NULL); g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"tpb",&self->priv->ticks_per_beat,NULL); g_signal_connect(song_info,"notify::tpb",G_CALLBACK(on_song_info_tpb_changed),(gpointer)self); g_object_unref(song_info); g_object_unref(song); // follow sequence grid size changes g_signal_connect(sequence,"notify::length",G_CALLBACK(on_sequence_length_changed),(gpointer)self); g_signal_connect(sequence,"notify::tracks",G_CALLBACK(on_sequence_tracks_changed),(gpointer)self); g_signal_connect(sequence,"rows-changed",G_CALLBACK(on_sequence_rows_changed),(gpointer)self); // track pattern first additions, last removal g_signal_connect(sequence,"pattern-added",G_CALLBACK(on_sequence_pattern_added),(gpointer)self); g_signal_connect(sequence,"pattern-removed",G_CALLBACK(on_sequence_pattern_removed),(gpointer)self); return(self); } //-- methods //-- tree model interface static GtkTreeModelFlags bt_sequence_grid_model_tree_model_get_flags(GtkTreeModel *tree_model) { return(GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY); } static gint bt_sequence_grid_model_tree_model_get_n_columns(GtkTreeModel *tree_model) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); return(N_COLUMNS+model->priv->tracks); } static GType bt_sequence_grid_model_tree_model_get_column_type(GtkTreeModel *tree_model,gint index) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); g_return_val_if_fail(indexpriv->tracks,G_TYPE_INVALID); if(indexpriv->param_types[index]); else return(G_TYPE_STRING); } static gboolean bt_sequence_grid_model_tree_model_get_iter(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreePath *path) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); guint tick=gtk_tree_path_get_indices (path)[0]; if(tick>=model->priv->visible_length) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=GUINT_TO_POINTER(tick); return(TRUE); } static GtkTreePath *bt_sequence_grid_model_tree_model_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); GtkTreePath *path; g_return_val_if_fail(iter->stamp==model->priv->stamp,NULL); if(g_sequence_iter_is_end(iter->user_data)) return(NULL); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,GPOINTER_TO_UINT(iter->user_data)); return(path); } static void bt_sequence_grid_model_tree_model_get_value(GtkTreeModel *tree_model,GtkTreeIter *iter,gint column,GValue *value) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); BtPattern *pattern; guint track,tick; //GST_DEBUG("getting value for column=%d / (%d+%d)",column,N_COLUMNS,model->priv->tracks); g_return_if_fail(columnpriv->tracks); if(columnpriv->param_types[column]); else g_value_init(value,G_TYPE_STRING); tick=GPOINTER_TO_UINT(iter->user_data); switch(column) { case BT_SEQUENCE_GRID_MODEL_SHADE: { guint shade=(tick%(model->priv->bars*2)); if(shade==0) { g_value_set_boolean(value,FALSE); } else { // we're only interested in shade==bars, but lets set the others too // even though we should not be called for those g_value_set_boolean(value,TRUE); } } break; case BT_SEQUENCE_GRID_MODEL_POS: g_value_set_long(value,tick); break; case BT_SEQUENCE_GRID_MODEL_POSSTR: g_value_set_string(value,format_position(model,tick)); break; case BT_SEQUENCE_GRID_MODEL_LABEL: if(tickpriv->length) { g_value_take_string(value,bt_sequence_get_label(model->priv->sequence,tick)); } break; default: if(tickpriv->length) { track=column-N_COLUMNS; //GST_LOG("getting pattern name for tick=%u,track=%u",tick,track); if((pattern=bt_sequence_get_pattern(model->priv->sequence,tick,track))) { g_object_get_property((GObject *)pattern,"name",value); g_object_unref(pattern); } } } } static gboolean bt_sequence_grid_model_tree_model_iter_next(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); guint tick; g_return_val_if_fail(model->priv->stamp==iter->stamp,FALSE); tick=GPOINTER_TO_UINT(iter->user_data)+1; if(tickpriv->visible_length) { iter->user_data=GUINT_TO_POINTER(tick); return TRUE; } else { iter->stamp=0; return FALSE; } } static gboolean bt_sequence_grid_model_tree_model_iter_children(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); /* this is a list, nodes have no children */ if (!parent) { if (model->priv->visible_length>0) { iter->stamp=model->priv->stamp; iter->user_data=GUINT_TO_POINTER(0); return(TRUE); } } iter->stamp=0; return(FALSE); } static gboolean bt_sequence_grid_model_tree_model_iter_has_child(GtkTreeModel *tree_model,GtkTreeIter *iter) { return(FALSE); } static gint bt_sequence_grid_model_tree_model_iter_n_children(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); if (iter == NULL) return(model->priv->visible_length); g_return_val_if_fail(model->priv->stamp==iter->stamp,-1); return(0); } static gboolean bt_sequence_grid_model_tree_model_iter_nth_child(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent,gint n) { BtSequenceGridModel *model=BT_SEQUENCE_GRID_MODEL(tree_model); if (parent || n>=model->priv->visible_length) { iter->stamp=0; return(FALSE); } iter->stamp=model->priv->stamp; iter->user_data=GUINT_TO_POINTER(n); return(TRUE); } static gboolean bt_sequence_grid_model_tree_model_iter_parent(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *child) { iter->stamp=0; return(FALSE); } static void bt_sequence_grid_model_tree_model_init(gpointer const g_iface, gpointer const iface_data) { GtkTreeModelIface * const iface = g_iface; iface->get_flags = bt_sequence_grid_model_tree_model_get_flags; iface->get_n_columns = bt_sequence_grid_model_tree_model_get_n_columns; iface->get_column_type = bt_sequence_grid_model_tree_model_get_column_type; iface->get_iter = bt_sequence_grid_model_tree_model_get_iter; iface->get_path = bt_sequence_grid_model_tree_model_get_path; iface->get_value = bt_sequence_grid_model_tree_model_get_value; iface->iter_next = bt_sequence_grid_model_tree_model_iter_next; iface->iter_children = bt_sequence_grid_model_tree_model_iter_children; iface->iter_has_child = bt_sequence_grid_model_tree_model_iter_has_child; iface->iter_n_children = bt_sequence_grid_model_tree_model_iter_n_children; iface->iter_nth_child = bt_sequence_grid_model_tree_model_iter_nth_child; iface->iter_parent = bt_sequence_grid_model_tree_model_iter_parent; } //-- class internals static void bt_sequence_grid_model_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { BtSequenceGridModel *self = BT_SEQUENCE_GRID_MODEL(object); switch (property_id) { case SEQUENCE_GRID_MODEL_POS_FORMAT: { g_value_set_enum(value, self->priv->pos_format); } break; case SEQUENCE_GRID_MODEL_BARS: { g_value_set_ulong(value, self->priv->bars); } break; case SEQUENCE_GRID_MODEL_LENGTH: { g_value_set_ulong(value, self->priv->visible_length); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_sequence_grid_model_set_property(GObject * const object, const guint property_id, const GValue * const value, GParamSpec * const pspec) { BtSequenceGridModel *self = BT_SEQUENCE_GRID_MODEL(object); switch (property_id) { case SEQUENCE_GRID_MODEL_POS_FORMAT: { BtSequenceGridModelPosFormat old_pos_format=self->priv->pos_format; self->priv->pos_format=g_value_get_enum(value); if(self->priv->pos_format!=old_pos_format) bt_sequence_grid_model_all_rows_changed(self); } break; case SEQUENCE_GRID_MODEL_BARS: { gulong old_bars=self->priv->bars; self->priv->bars=g_value_get_ulong(value); if(self->priv->bars!=old_bars) bt_sequence_grid_model_all_rows_changed(self); } break; case SEQUENCE_GRID_MODEL_LENGTH: { gulong old_length=self->priv->visible_length; self->priv->visible_length=g_value_get_ulong(value); self->priv->visible_length=MAX(self->priv->visible_length,self->priv->length); GST_DEBUG("visible length changed: %lu",self->priv->visible_length); update_length(self,old_length,self->priv->visible_length); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_sequence_grid_model_finalize(GObject *object) { BtSequenceGridModel *self = BT_SEQUENCE_GRID_MODEL(object); GST_DEBUG("!!!! self=%p",self); if(self->priv->sequence) { BtSequence *sequence=self->priv->sequence; g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_length_changed,(gpointer)self); g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_tracks_changed,(gpointer)self); g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_rows_changed,(gpointer)self); g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_pattern_added,(gpointer)self); g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_pattern_removed,(gpointer)self); } G_OBJECT_CLASS(bt_sequence_grid_model_parent_class)->finalize(object); } static void bt_sequence_grid_model_init(BtSequenceGridModel *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self,BT_TYPE_SEQUENCE_GRID_MODEL,BtSequenceGridModelPrivate); // random int to check whether an iter belongs to our model self->priv->stamp=g_random_int(); } static void bt_sequence_grid_model_class_init(BtSequenceGridModelClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSequenceGridModelPrivate)); gobject_class->set_property = bt_sequence_grid_model_set_property; gobject_class->get_property = bt_sequence_grid_model_get_property; gobject_class->finalize = bt_sequence_grid_model_finalize; g_object_class_install_property(gobject_class,SEQUENCE_GRID_MODEL_POS_FORMAT, g_param_spec_enum("pos-format", "position format prop", "the display format for position columns", BT_TYPE_SEQUENCE_GRID_MODEL_POS_FORMAT, /* enum type */ BT_SEQUENCE_GRID_MODEL_POS_FORMAT_TICKS, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_GRID_MODEL_BARS, g_param_spec_ulong("bars", "bars prop", "tick stepping for the color shading", 1,G_MAXUINT, 16, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,SEQUENCE_GRID_MODEL_LENGTH, g_param_spec_ulong("length", "length prop", "visible length of the sequence (>= real length)", 0,G_MAXUINT, 0, /* default value */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/render-progress.h0000644042355400116100000000446011625722250015742 00000000000000/* $Id: render-progress.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_RENDER_PROGRESS_H #define BT_RENDER_PROGRESS_H #include #include #define BT_TYPE_RENDER_PROGRESS (bt_render_progress_get_type ()) #define BT_RENDER_PROGRESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_RENDER_PROGRESS, BtRenderProgress)) #define BT_RENDER_PROGRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_RENDER_PROGRESS, BtRenderProgressClass)) #define BT_IS_RENDER_PROGRESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_RENDER_PROGRESS)) #define BT_IS_RENDER_PROGRESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_RENDER_PROGRESS)) #define BT_RENDER_PROGRESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_RENDER_PROGRESS, BtRenderProgressClass)) /* type macros */ typedef struct _BtRenderProgress BtRenderProgress; typedef struct _BtRenderProgressClass BtRenderProgressClass; typedef struct _BtRenderProgressPrivate BtRenderProgressPrivate; /** * BtRenderProgress: * * the song rendering progress for the editor application */ struct _BtRenderProgress { GtkDialog parent; /*< private >*/ BtRenderProgressPrivate *priv; }; struct _BtRenderProgressClass { GtkDialogClass parent; }; GType bt_render_progress_get_type(void) G_GNUC_CONST; #include "render-dialog.h" BtRenderProgress *bt_render_progress_new(BtRenderDialog *settings); void bt_render_progress_run(const BtRenderProgress *self); #endif // BT_RENDER_PROGRESS_H buzztard-0.6.0/src/ui/edit/tools.c0000644042355400116100000001676711634644477014007 00000000000000/* $Id: tools.c 3644 2011-09-16 13:03:57Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #define BT_EDIT #define BT_TOOLS_C #include "bt-edit.h" static GList *pixmaps_directories = NULL; /** * add_pixmap_directory: * @directory: register another directory to search for pixmaps * * Use this function to set the directory containing installed pixmaps. */ void add_pixmap_directory(const gchar *directory) { pixmaps_directories = g_list_prepend(pixmaps_directories, g_strdup(directory)); } /* * find_pixmap_file: * @filename: name of the file to look for * * This is an internally used function to find pixmap files. * Use add_pixmap_directory() to extend the serarch path. * * Returns: the path that has this file. Free returned path after use. */ static gchar *find_pixmap_file(const gchar *filename) { GList *elem; /* We step through each of the pixmaps directory to find it. */ elem = pixmaps_directories; while(elem) { gchar *pathname = g_strconcat((gchar*)elem->data, filename, NULL); if (g_file_test(pathname, G_FILE_TEST_EXISTS)) return pathname; g_free(pathname); elem = elem->next; } return NULL; } /** * gtk_image_new_from_filename: * @filename: the filename of the image file * * Creates a new pixmap image widget for the image file. * * Returns: a new pixmap widget */ GtkWidget *gtk_image_new_from_filename(const gchar *filename) { gchar *pathname = NULL; GtkWidget *pixmap; if(!filename || !filename[0]) return gtk_image_new(); pathname = find_pixmap_file(filename); if(!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return gtk_image_new (); } pixmap = gtk_image_new_from_file(pathname); g_free(pathname); return pixmap; } /** * gdk_pixbuf_new_from_filename: * @filename: the filename of the image file * * Creates a new pixbuf image for the image file. * * Returns: a new pixbuf, g_object_unref() when done. */ GdkPixbuf *gdk_pixbuf_new_from_filename(const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; if(!filename || !filename[0]) return NULL; pathname = find_pixmap_file(filename); if(!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return NULL; } pixbuf = gdk_pixbuf_new_from_file(pathname, &error); if(!pixbuf) { fprintf(stderr, "Failed to load pixbuf file: %s: %s\n",pathname, error->message); g_error_free(error); } g_free(pathname); return pixbuf; } /** * gdk_pixbuf_new_from_theme: * @name: the icon name * @size: the pixel size * * Creates a new pixbuf image from the icon @name and @size. * * Returns: a new pixbuf, g_object_unref() when done. */ GdkPixbuf *gdk_pixbuf_new_from_theme(const gchar *name, gint size) { GdkPixbuf *pixbuf; GError *error = NULL; GtkIconTheme *it=gtk_icon_theme_get_default(); /* @todo: docs recommend to listen to GtkWidget::style-set and update icon or * do gdk_pixbuf_copy() to avoid gtk keeping icon-theme loaded if it changes */ if(!(pixbuf=gtk_icon_theme_load_icon(it,name,size,GTK_ICON_LOOKUP_FORCE_SVG|GTK_ICON_LOOKUP_FORCE_SIZE,&error))) { GST_WARNING("Couldn't load %s %dx%d icon: %s",name,size,size,error->message); g_error_free(error); /* @todo: machine icons are in 'gnome' theme, how can we use this as a * fallback * gtk_icon_theme_set_custom_theme(it,"gnome"); * is a bit brutal */ return gdk_pixbuf_new(GDK_COLORSPACE_RGB,TRUE,8,size,size); //return NULL; } else { GdkPixbuf *result = gdk_pixbuf_copy(pixbuf); g_object_unref(pixbuf); return result; } } // gtk toolbar helper /** * gtk_toolbar_get_style_from_string: * @style_name: the style name returned from gconf settings * * toolbar gconf to style conversion * * Returns: the style id */ GtkToolbarStyle gtk_toolbar_get_style_from_string(const gchar *style_name) { g_return_val_if_fail(style_name,GTK_TOOLBAR_BOTH); if (!strcmp(style_name,"icons")) { return(GTK_TOOLBAR_ICONS); } else if (!strcmp(style_name,"both")) { return(GTK_TOOLBAR_BOTH); } else if (!strcmp(style_name,"both-horiz")) { return(GTK_TOOLBAR_BOTH_HORIZ); } else if (!strcmp(style_name,"text")) { return(GTK_TOOLBAR_TEXT); } return(GTK_TOOLBAR_BOTH); } // save focus grab /** * gtk_widget_grab_focus_savely: * @widget: the widget * * Grab focus only if widget has been realized and is mapped. */ void gtk_widget_grab_focus_savely(GtkWidget *widget) { gboolean realized=gtk_widget_get_realized(widget); gboolean mapped=gtk_widget_get_mapped(widget); if(realized && mapped) { gtk_widget_grab_focus(widget); } else { GST_WARNING("not grabbing widget '%s', realized: %d, mapped %d", gtk_widget_get_name(widget),realized,mapped); } } // gtk clipboard helper /** * gtk_target_table_make: * @format_atom: format atom for the target list * @n_targets: out variable for the size of the table * * Generate the target table for pasting to clipboard. Use * gtk_target_table_free (targets, n_targets); * * Returns: the table and the size in the out variable @n_targets */ GtkTargetEntry *gtk_target_table_make(GdkAtom format_atom,gint *n_targets) { GtkTargetList *list; GtkTargetEntry *targets; list = gtk_target_list_new (NULL, 0); gtk_target_list_add (list, format_atom, 0, 0); #if USE_DEBUG // this allows to paste into a text editor gtk_target_list_add (list, gdk_atom_intern_static_string ("UTF8_STRING"), 0, 1); gtk_target_list_add (list, gdk_atom_intern_static_string ("TEXT"), 0, 2); gtk_target_list_add (list, gdk_atom_intern_static_string ("text/plain"), 0, 3); gtk_target_list_add (list, gdk_atom_intern_static_string ("text/plain;charset=utf-8"), 0, 4); #endif targets = gtk_target_table_new_from_list (list, n_targets); gtk_target_list_unref (list); return(targets); } // gtk help helper /** * gtk_show_uri_simple: * @widget: widget that triggered the action * @uri: the uri * * Show the given @uri. Uses same screen as @widget (default if @widget is NULL). */ void gtk_show_uri_simple(GtkWidget *widget, const gchar *uri) { #if GTK_CHECK_VERSION(2,14,0) GError *error=NULL; GdkScreen *screen=NULL; if(widget) screen=gtk_widget_get_screen(widget); if(!gtk_show_uri(screen,uri,gtk_get_current_event_time(),&error)) { GST_WARNING("Failed to display help: %s\n",error->message); g_error_free(error); } #else gnome_vfs_url_show(uri); #endif } /* * bt_edit_ui_config: * @str: token to check * * Allows to adhoc re-config the UI via BT_EDIT_UI_CFG environment variable. * * Return: %TRUE if the token is found in the env-var. */ #if USE_DEBUG gboolean bt_edit_ui_config(const gchar *str) { const gchar *env=g_getenv("BT_EDIT_UI_CFG"); if (env && strstr(env, str)) { return(TRUE); } return(FALSE); } #endif buzztard-0.6.0/src/ui/edit/settings-page-audiodevices.c0000644042355400116100000004035211666756704020050 00000000000000/* $Id: settings-page-audiodevices.c 3744 2011-12-04 20:53:17Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingspageaudiodevices * @short_description: audio device configuration settings page * * List available GStreamer audio devices. User can pick and configure one. */ /* @todo: add device selection * - we already have the property probing code * - we need to add device selection (combobox) * - needs a way to store at least the current device * - add a setting: BT_SETTINGS_AUDIOSINK_DEVIDE of type string * - set it as "alsa=hw:0.0" * - this goes to BT_GCONF_PATH_BUZZTARD"/audiosink-device/alsa=hw:0.0 * - these keys are not in the schema * - needs changes in sink-bin to use the setting * - we should probably parse the system-audiosink settings more to eventualy * get the device from the setting */ /* @todo: show the latency * - gst_base_sink_get_latency() * - when is that available? * - we have the latency caused by the fragment-size and depth of graph * - thus it is different for each machine * - the latency from changing a parameter until we hear something is what * the user is interested in */ #define BT_EDIT #define BT_SETTINGS_PAGE_AUDIODEVICES_C #include "bt-edit.h" struct _BtSettingsPageAudiodevicesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; GtkComboBox *audiosink_menu; GList *audiosink_names; GtkComboBox *samplerate_menu; GtkComboBox *channels_menu; }; //-- the class G_DEFINE_TYPE (BtSettingsPageAudiodevices, bt_settings_page_audiodevices, GTK_TYPE_TABLE); //-- event handler static void on_audiosink_menu_changed(GtkComboBox *combo_box, gpointer user_data) { BtSettingsPageAudiodevices *self=BT_SETTINGS_PAGE_AUDIODEVICES(user_data); BtSettings *settings; gulong index; index=gtk_combo_box_get_active(self->priv->audiosink_menu); GST_INFO("audiosink changed : index=%lu",index); g_object_get(self->priv->app,"settings",&settings,NULL); if(index) { g_object_set(settings,"audiosink",g_list_nth_data(self->priv->audiosink_names,index-1),NULL); } else { g_object_set(settings,"audiosink","",NULL); } g_object_unref(settings); } static void on_samplerate_menu_changed(GtkComboBox *combo_box, gpointer user_data) { BtSettingsPageAudiodevices *self=BT_SETTINGS_PAGE_AUDIODEVICES(user_data); BtSettings *settings; gulong index,rate; index=gtk_combo_box_get_active(self->priv->samplerate_menu); rate=atoi(gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu))); GST_INFO("sample-rate changed : index=%lu, rate=%lu",index,rate); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"sample-rate",rate,NULL); g_object_unref(settings); } static void on_channels_menu_changed(GtkComboBox *combo_box, gpointer user_data) { BtSettingsPageAudiodevices *self=BT_SETTINGS_PAGE_AUDIODEVICES(user_data); BtSettings *settings; gulong index; index=gtk_combo_box_get_active(self->priv->channels_menu); GST_INFO("channels changed : index=%lu",index); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_set(settings,"channels",index+1,NULL); g_object_unref(settings); } //-- helper methods static void bt_settings_page_audiodevices_init_ui(const BtSettingsPageAudiodevices *self) { BtSettings *settings; GtkWidget *label,*spacer; gchar *audiosink_name,*system_audiosink_name,*str; GList *node,*audiosink_factories; gboolean use_system_audiosink=TRUE; gboolean can_int_caps,can_float_caps; //GstCaps *int_caps=gst_caps_from_string(GST_AUDIO_INT_PAD_TEMPLATE_CAPS); //GstCaps *float_caps=gst_caps_from_string(GST_AUDIO_FLOAT_PAD_TEMPLATE_CAPS); guint sample_rate,channels; gulong audiosink_index=0,sampling_rate_index,ct; gtk_widget_set_name(GTK_WIDGET(self),"audio device settings"); // get settings g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings, "audiosink",&audiosink_name, "system-audiosink",&system_audiosink_name, "sample-rate",&sample_rate, "channels",&channels, NULL); if(BT_IS_STRING(audiosink_name)) use_system_audiosink=FALSE; // add setting widgets spacer=gtk_label_new(" "); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Audio Device")); gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(self),spacer, 0, 1, 1, 6, GTK_SHRINK,GTK_SHRINK, 2,1); label=gtk_label_new(_("Sink")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); self->priv->audiosink_menu=GTK_COMBO_BOX(gtk_combo_box_text_new()); /* @idea: we could use a real combo and use markup in the cells, to have the * description in small font below the sink name */ if(system_audiosink_name) { GstElementFactory * const factory=gst_element_factory_find(system_audiosink_name); str=g_strdup_printf(_("system default: %s (%s)"), system_audiosink_name, (factory?gst_element_factory_get_description(factory):"-")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->audiosink_menu),str); g_free(str); } else { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->audiosink_menu),_("system default: -")); } audiosink_factories=bt_gst_registry_get_element_factories_matching_all_categories("Sink/Audio"); // @todo: sort list alphabetically ? /* @todo: use GST_IS_BIN(gst_element_factory_get_element_type(factory)) to skip bins * add autoaudiosink as the first and make it default * but then again bins seem to be filtered out already, by below * * we could also filter by baseclass, GST_IS_BASE_AUDIO_SINK(...) now that we have instances * * we should factor out the code below to a function and add a rescan button * -> useful if e.g. someone started jack in the meantime */ // add audio sinks gstreamer provides for(node=audiosink_factories,ct=1;node;node=g_list_next(node)) { GstElementFactory * factory=node->data; const gchar *name=gst_plugin_feature_get_name((GstPluginFeature *)factory); // filter some known analyzer sinks if(strncasecmp("ladspa-",name,7)) { GstPluginFeature *loaded_feature; GType type; if(gst_plugin_feature_get_rank(GST_PLUGIN_FEATURE(factory))==GST_RANK_NONE) { GST_INFO(" skipping audio sink: \"%s\" - has RANK_NONE",name); continue; } // filter some known plugins if(!strcmp(GST_PLUGIN_FEATURE(factory)->plugin_name,"lv2")) { GST_INFO(" skipping audio sink: \"%s\" - its a lv2 element",name); continue; } // get element type for filtering, this slows things down :/ if(!(loaded_feature=gst_plugin_feature_load(GST_PLUGIN_FEATURE(factory)))) { GST_INFO(" skipping unloadable element : '%s'",name); continue; } // we're no longer interested in the potentially-unloaded feature factory=(GstElementFactory *)loaded_feature; type=gst_element_factory_get_element_type(factory); // check class hierarchy if (!g_type_is_a (type, GST_TYPE_BASE_AUDIO_SINK)) { GST_INFO(" skipping audio sink: \"%s\" - not inherited from baseaudiosink",name); continue; } // can the sink accept raw audio? can_int_caps=bt_gst_element_factory_can_sink_media_type(factory,"audio/x-raw-int"); can_float_caps=bt_gst_element_factory_can_sink_media_type(factory,"audio/x-raw-float"); if(can_int_caps || can_float_caps) { GstElement *sink; gboolean works=FALSE; // try to open the element and skip those that we can't open if((sink=gst_element_factory_make(name,NULL))) { GstStateChangeReturn ret=gst_element_set_state(sink,GST_STATE_READY); if(ret!=GST_STATE_CHANGE_FAILURE) { works=TRUE; if(GST_IS_PROPERTY_PROBE(sink)) { GstPropertyProbe *probe=GST_PROPERTY_PROBE(sink); const GParamSpec *devspec; GST_INFO("sink \"%s\" support property probe",name); if((devspec=gst_property_probe_get_property(probe,"device"))) { GValueArray *array; if((array=gst_property_probe_probe_and_get_values(probe,devspec))) { guint n; GST_DEBUG("there are %d available devices",array->n_values); for(n=0;nn_values;n++) { GValue *device; /* set this device */ device=g_value_array_get_nth(array,n); GST_DEBUG(" device[%2d] \"%s\"",n,g_value_get_string(device)); } g_value_array_free(array); } } } } else { GST_INFO(" skipping audio sink: \"%s\" as it could not go to READY",name); } gst_element_set_state(sink,GST_STATE_NULL); gst_object_unref(sink); } else { GST_INFO(" skipping audio sink: \"%s\" as it could be instantiated",name); } if(works) { // compare with audiosink_name and set audiosink_index if equal if(!use_system_audiosink) { if(!strcmp(audiosink_name,name)) audiosink_index=ct; } str=g_strdup_printf("%s (%s)",name,gst_element_factory_get_description(factory)); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->audiosink_menu),str); g_free(str); // add this to instance list self->priv->audiosink_names=g_list_append(self->priv->audiosink_names,(gpointer)name); GST_INFO(" adding audio sink: \"%s\"",name); ct++; } } else { GST_INFO(" skipping audio sink: \"%s\" because of incompatible caps (%d,%d)",name,can_int_caps,can_float_caps); } } else { GST_INFO(" skipping audio sink: \"%s\" - its a ladspa element",name); } } GST_INFO("current sink (is_system? %d): %lu",use_system_audiosink,audiosink_index); gtk_combo_box_set_active(self->priv->audiosink_menu,audiosink_index); gtk_table_attach(GTK_TABLE(self),GTK_WIDGET(self->priv->audiosink_menu), 2, 3, 1, 2, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); g_signal_connect(self->priv->audiosink_menu, "changed", G_CALLBACK(on_audiosink_menu_changed), (gpointer)self); label=gtk_label_new(_("Sampling rate")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); self->priv->samplerate_menu=GTK_COMBO_BOX(gtk_combo_box_text_new()); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"8000"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"11025"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"16000"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"22050"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"32000"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"44100"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"48000"); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->samplerate_menu),"96000"); switch(sample_rate) { case 8000: sampling_rate_index=0;break; case 11025: sampling_rate_index=1;break; case 16000: sampling_rate_index=2;break; case 22050: sampling_rate_index=3;break; case 32000: sampling_rate_index=4;break; case 44100: sampling_rate_index=5;break; case 48000: sampling_rate_index=6;break; case 96000: sampling_rate_index=7;break; default: sampling_rate_index=5; // 44100 } gtk_combo_box_set_active(self->priv->samplerate_menu,sampling_rate_index); gtk_table_attach(GTK_TABLE(self),GTK_WIDGET(self->priv->samplerate_menu), 2, 3, 2, 3, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); g_signal_connect(self->priv->samplerate_menu, "changed", G_CALLBACK(on_samplerate_menu_changed), (gpointer)self); label=gtk_label_new(_("Channels")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); self->priv->channels_menu=GTK_COMBO_BOX(gtk_combo_box_text_new()); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->channels_menu),_("mono")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->channels_menu),_("stereo")); gtk_combo_box_set_active(self->priv->channels_menu,(channels-1)); gtk_table_attach(GTK_TABLE(self),GTK_WIDGET(self->priv->channels_menu), 2, 3, 3, 4, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); g_signal_connect(self->priv->channels_menu, "changed", G_CALLBACK(on_channels_menu_changed), (gpointer)self); /* @todo: add audiosink parameters * e.g. device-name * GstBaseSink: preroll-queue-len (buffers), max-lateness (ns) * GstBaseAudioSink: buffer-time (ms), latency-time (ms) * GstAudioSink: (no-properties) * * If we change settings here, we need to store them per sink, which is not so * easy with the current settings system. * We also need to restore them, when selecting the sink, allowing to reset * them to defaults. * Finaly sink-bin needs to apply those. * * buffer-time: is the total size of the ring-buffer * latency-time is the allowed latency */ g_free(audiosink_name); g_free(system_audiosink_name); gst_plugin_feature_list_free(audiosink_factories); //gst_caps_unref(int_caps); //gst_caps_unref(float_caps); g_object_unref(settings); } //-- constructor methods /** * bt_settings_page_audiodevices_new: * * Create a new instance * * Returns: the new instance */ BtSettingsPageAudiodevices *bt_settings_page_audiodevices_new() { BtSettingsPageAudiodevices *self; self=BT_SETTINGS_PAGE_AUDIODEVICES(g_object_new(BT_TYPE_SETTINGS_PAGE_AUDIODEVICES, "n-rows",5, "n-columns",3, "homogeneous",FALSE, NULL)); bt_settings_page_audiodevices_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_page_audiodevices_dispose(GObject *object) { BtSettingsPageAudiodevices *self = BT_SETTINGS_PAGE_AUDIODEVICES(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_page_audiodevices_parent_class)->dispose(object); } static void bt_settings_page_audiodevices_finalize(GObject *object) { BtSettingsPageAudiodevices *self = BT_SETTINGS_PAGE_AUDIODEVICES(object); GST_DEBUG("!!!! self=%p",self); g_list_free(self->priv->audiosink_names); G_OBJECT_CLASS(bt_settings_page_audiodevices_parent_class)->finalize(object); } static void bt_settings_page_audiodevices_init(BtSettingsPageAudiodevices *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_PAGE_AUDIODEVICES, BtSettingsPageAudiodevicesPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_page_audiodevices_class_init(BtSettingsPageAudiodevicesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsPageAudiodevicesPrivate)); gobject_class->dispose = bt_settings_page_audiodevices_dispose; gobject_class->finalize = bt_settings_page_audiodevices_finalize; } buzztard-0.6.0/src/ui/edit/ruler.c0000644042355400116100000006130011670333107013740 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* * Since the code was deprecated and removed from gtk+ in commit * e0fb7a86e59278dccd7c276c754f9e8b7fdab0d5 * on Wed Nov 24 16:44:16 2010 +0100 * the code was revived here. this copy contains fixes for these bugs: * https://bugzilla.gnome.org/show_bug.cgi?id=145491 * https://bugzilla.gnome.org/show_bug.cgi?id=151944 * * plus extra clean-up and features. * * some features/api discussion at http://live.gnome.org/GTK%2B/GtkRuler * * TODO: * - make other instance vars private * - use GtkAdjustment * - add non-linear tick mapping * - consider removing max-size parameter (use size-request instead) */ /** * SECTION:btruler * @Short_description: A ruler widget * * The Ruler widget is utilized around other widgets such as a text widget or a * graph. The ruler is used to show the location of the mouse on the window and * to show the size of the window in specified units. The available units of * measurement are GTK_PIXELS, GTK_INCHES and GTK_CENTIMETERS. * GTK_PIXELS is the default unit of measurement. The ruler widget can be * oriented vertically or horizontally. */ #include "config.h" #include #include #include "ruler.h" #define RULER_WIDTH 14 #define MINIMUM_INCR 5 #define ROUND(x) ((int) ((x) + 0.5)) enum { PROP_0, PROP_ORIENTATION, PROP_LOWER, PROP_UPPER, PROP_POSITION, PROP_MAX_SIZE, PROP_METRIC, PROP_DRAW_POS }; struct _BtRulerPrivate { GtkOrientation orientation; }; static void bt_ruler_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void bt_ruler_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void bt_ruler_realize (GtkWidget * widget); static void bt_ruler_unrealize (GtkWidget * widget); static void bt_ruler_size_request (GtkWidget * widget, GtkRequisition * requisition); static void bt_ruler_size_allocate (GtkWidget * widget, GtkAllocation * allocation); static gboolean bt_ruler_motion_notify (GtkWidget * widget, GdkEventMotion * event); static gboolean bt_ruler_expose (GtkWidget * widget, GdkEventExpose * event); static void bt_ruler_make_pixmap (BtRuler * ruler); static void bt_ruler_real_draw_ticks (BtRuler * ruler); static void bt_ruler_real_draw_pos (BtRuler * ruler); static const BtRulerMetric ruler_metrics[] = { {"Pixel", "Pi", 1.0, {1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000}, {1, 5, 10, 50, 100, 500, 1000, 5000} }, {"Inches", "In", 72.0, {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096}, {1, 2, 4, 8, 16, 32, 64, 128} }, {"Centimeters", "Cm", 28.35, {1, 2, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000}, {1, 5, 10, 50, 100, 500, 1000, 5000} }, }; G_DEFINE_TYPE_WITH_CODE (BtRuler, bt_ruler, GTK_TYPE_WIDGET, G_IMPLEMENT_INTERFACE (GTK_TYPE_ORIENTABLE, NULL)) static void bt_ruler_class_init (BtRulerClass * class) { GObjectClass *gobject_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); gobject_class->set_property = bt_ruler_set_property; gobject_class->get_property = bt_ruler_get_property; widget_class->realize = bt_ruler_realize; widget_class->unrealize = bt_ruler_unrealize; widget_class->size_request = bt_ruler_size_request; widget_class->size_allocate = bt_ruler_size_allocate; widget_class->motion_notify_event = bt_ruler_motion_notify; widget_class->expose_event = bt_ruler_expose; class->draw_ticks = bt_ruler_real_draw_ticks; class->draw_pos = bt_ruler_real_draw_pos; g_type_class_add_private (gobject_class, sizeof (BtRulerPrivate)); g_object_class_override_property (gobject_class, PROP_ORIENTATION, "orientation"); g_object_class_install_property (gobject_class, PROP_LOWER, g_param_spec_double ("lower", "Lower", "Lower limit of ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_UPPER, g_param_spec_double ("upper", "Upper", "Upper limit of ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_POSITION, g_param_spec_double ("position", "Position", "Position of mark on the ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_MAX_SIZE, g_param_spec_double ("max-size", "Max Size", "Maximum size of the ruler", -G_MAXDOUBLE, G_MAXDOUBLE, 0.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_METRIC, g_param_spec_enum ("metric", "Metric", "The metric used for the ruler", GTK_TYPE_METRIC_TYPE, GTK_PIXELS, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_DRAW_POS, g_param_spec_boolean ("draw-pos", "Draw position", "Wheter the position should be marked at the ruler", TRUE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } static void bt_ruler_init (BtRuler * ruler) { GtkWidget *widget = GTK_WIDGET (ruler); ruler->priv = G_TYPE_INSTANCE_GET_PRIVATE (ruler, BT_TYPE_RULER, BtRulerPrivate); ruler->priv->orientation = GTK_ORIENTATION_HORIZONTAL; widget->requisition.width = widget->style->xthickness * 2 + 1; widget->requisition.height = widget->style->ythickness * 2 + RULER_WIDTH; ruler->backing_store = NULL; ruler->xsrc = 0; ruler->ysrc = 0; ruler->slider_size = 0; ruler->lower = 0; ruler->upper = 0; ruler->position = 0; ruler->max_size = 0; ruler->draw_pos = TRUE; bt_ruler_set_metric (ruler, GTK_PIXELS); } static void bt_ruler_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { BtRuler *ruler = BT_RULER (object); switch (prop_id) { case PROP_ORIENTATION: ruler->priv->orientation = g_value_get_enum (value); gtk_widget_queue_resize (GTK_WIDGET (ruler)); break; case PROP_LOWER: bt_ruler_set_range (ruler, g_value_get_double (value), ruler->upper, ruler->position, ruler->max_size); break; case PROP_UPPER: bt_ruler_set_range (ruler, ruler->lower, g_value_get_double (value), ruler->position, ruler->max_size); break; case PROP_POSITION: bt_ruler_set_range (ruler, ruler->lower, ruler->upper, g_value_get_double (value), ruler->max_size); break; case PROP_MAX_SIZE: bt_ruler_set_range (ruler, ruler->lower, ruler->upper, ruler->position, g_value_get_double (value)); break; case PROP_METRIC: bt_ruler_set_metric (ruler, g_value_get_enum (value)); break; case PROP_DRAW_POS: ruler->draw_pos = g_value_get_boolean (value); break; default:G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void bt_ruler_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { BtRuler *ruler = BT_RULER (object); switch (prop_id) { case PROP_ORIENTATION: g_value_set_enum (value, ruler->priv->orientation); break; case PROP_LOWER: g_value_set_double (value, ruler->lower); break; case PROP_UPPER: g_value_set_double (value, ruler->upper); break; case PROP_POSITION: g_value_set_double (value, ruler->position); break; case PROP_MAX_SIZE: g_value_set_double (value, ruler->max_size); break; case PROP_METRIC: g_value_set_enum (value, bt_ruler_get_metric (ruler)); break; case PROP_DRAW_POS: g_value_set_boolean (value, ruler->draw_pos); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } void bt_ruler_set_metric (BtRuler * ruler, GtkMetricType metric) { g_return_if_fail (BT_IS_RULER (ruler)); ruler->metric = (BtRulerMetric *) & ruler_metrics[metric]; if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) gtk_widget_queue_draw (GTK_WIDGET (ruler)); g_object_notify (G_OBJECT (ruler), "metric"); } /** * bt_ruler_get_metric: * @ruler: a #BtRuler * * Gets the units used for a #BtRuler. See bt_ruler_set_metric(). * * Return value: the units currently used for @ruler * */ GtkMetricType bt_ruler_get_metric (BtRuler * ruler) { gint i; g_return_val_if_fail (BT_IS_RULER (ruler), 0); for (i = 0; i < G_N_ELEMENTS (ruler_metrics); i++) if (ruler->metric == &ruler_metrics[i]) return i; g_assert_not_reached (); return 0; } /** * bt_ruler_set_range: * @ruler: the gtkruler * @lower: the lower limit of the ruler * @upper: the upper limit of the ruler * @position: the mark on the ruler * @max_size: the maximum size of the ruler used when calculating the space to * leave for the text * * This sets the range of the ruler. */ void bt_ruler_set_range (BtRuler * ruler, gdouble lower, gdouble upper, gdouble position, gdouble max_size) { g_return_if_fail (BT_IS_RULER (ruler)); g_object_freeze_notify (G_OBJECT (ruler)); if (ruler->lower != lower) { ruler->lower = lower; g_object_notify (G_OBJECT (ruler), "lower"); } if (ruler->upper != upper) { ruler->upper = upper; g_object_notify (G_OBJECT (ruler), "upper"); } if (ruler->position != position) { ruler->position = position; g_object_notify (G_OBJECT (ruler), "position"); } if (ruler->max_size != max_size) { ruler->max_size = max_size; g_object_notify (G_OBJECT (ruler), "max-size"); } g_object_thaw_notify (G_OBJECT (ruler)); if (gtk_widget_is_drawable (GTK_WIDGET (ruler))) gtk_widget_queue_draw (GTK_WIDGET (ruler)); } /** * bt_ruler_get_range: * @ruler: a #BtRuler * @lower: (allow-none): location to store lower limit of the ruler, or %NULL * @upper: (allow-none): location to store upper limit of the ruler, or %NULL * @position: (allow-none): location to store the current position of the mark on the ruler, or %NULL * @max_size: location to store the maximum size of the ruler used when calculating * the space to leave for the text, or %NULL. * * Retrieves values indicating the range and current position of a #BtRuler. * See bt_ruler_set_range(). * */ void bt_ruler_get_range (BtRuler * ruler, gdouble * lower, gdouble * upper, gdouble * position, gdouble * max_size) { g_return_if_fail (BT_IS_RULER (ruler)); if (lower) *lower = ruler->lower; if (upper) *upper = ruler->upper; if (position) *position = ruler->position; if (max_size) *max_size = ruler->max_size; } /** * bt_ruler_new: * @orientation: wheter the ruler is vertcal or horizontal * @draw_pos wheter the uler will show a position marker * * Creates a new ruler * * Returns: a new #BtRuler. */ GtkWidget * bt_ruler_new (GtkOrientation orientation, gboolean draw_pos) { return g_object_new (BT_TYPE_RULER, "orientation", orientation, "draw-pos", draw_pos, NULL); } /* vmethods */ static void bt_ruler_draw_ticks (BtRuler * ruler) { g_return_if_fail (BT_IS_RULER (ruler)); if (BT_RULER_GET_CLASS (ruler)->draw_ticks) BT_RULER_GET_CLASS (ruler)->draw_ticks (ruler); } static void bt_ruler_draw_pos (BtRuler * ruler) { g_return_if_fail (BT_IS_RULER (ruler)); if (ruler->draw_pos && BT_RULER_GET_CLASS (ruler)->draw_pos) BT_RULER_GET_CLASS (ruler)->draw_pos (ruler); } static void bt_ruler_realize (GtkWidget * widget) { BtRuler *ruler; GdkWindowAttr attributes; gint attributes_mask; ruler = BT_RULER (widget); gtk_widget_set_realized (widget, TRUE); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget); attributes.event_mask |= (GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, ruler); widget->style = gtk_style_attach (widget->style, widget->window); gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE); bt_ruler_make_pixmap (ruler); } static void bt_ruler_unrealize (GtkWidget * widget) { BtRuler *ruler = BT_RULER (widget); if (ruler->backing_store) { g_object_unref (ruler->backing_store); ruler->backing_store = NULL; } GTK_WIDGET_CLASS (bt_ruler_parent_class)->unrealize (widget); } static void bt_ruler_size_request (GtkWidget * widget, GtkRequisition * requisition) { BtRuler *ruler = BT_RULER (widget); if (ruler->priv->orientation == GTK_ORIENTATION_HORIZONTAL) { requisition->width = widget->style->xthickness * 2 + 1; requisition->height = widget->style->ythickness * 2 + RULER_WIDTH; } else { requisition->width = widget->style->xthickness * 2 + RULER_WIDTH; requisition->height = widget->style->ythickness * 2 + 1; } } static void bt_ruler_size_allocate (GtkWidget * widget, GtkAllocation * allocation) { BtRuler *ruler = BT_RULER (widget); widget->allocation = *allocation; if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); bt_ruler_make_pixmap (ruler); } } static gboolean bt_ruler_motion_notify (GtkWidget * widget, GdkEventMotion * event) { BtRuler *ruler = BT_RULER (widget); gint x; gint y; gdk_event_request_motions (event); x = event->x; y = event->y; if (ruler->priv->orientation == GTK_ORIENTATION_HORIZONTAL) ruler->position = ruler->lower + ((ruler->upper - ruler->lower) * x) / widget->allocation.width; else ruler->position = ruler->lower + ((ruler->upper - ruler->lower) * y) / widget->allocation.height; g_object_notify (G_OBJECT (ruler), "position"); /* Make sure the ruler has been allocated already */ if (ruler->backing_store != NULL) bt_ruler_draw_pos (ruler); return FALSE; } static gboolean bt_ruler_expose (GtkWidget * widget, GdkEventExpose * event) { if (gtk_widget_is_drawable (widget)) { BtRuler *ruler = BT_RULER (widget); cairo_t *cr; bt_ruler_draw_ticks (ruler); cr = gdk_cairo_create (widget->window); gdk_cairo_set_source_pixmap (cr, ruler->backing_store, 0, 0); gdk_cairo_rectangle (cr, &event->area); cairo_fill (cr); cairo_destroy (cr); bt_ruler_draw_pos (ruler); } return FALSE; } static void bt_ruler_make_pixmap (BtRuler * ruler) { GtkWidget *widget = GTK_WIDGET (ruler); if (ruler->backing_store) { if ((ruler->w == widget->allocation.width) && (ruler->h == widget->allocation.height)) return; /* size has changed */ g_object_unref (ruler->backing_store); } ruler->w = widget->allocation.width; ruler->h = widget->allocation.height; ruler->backing_store = gdk_pixmap_new (widget->window, ruler->w, ruler->h, -1); ruler->xsrc = ruler->ysrc = 0; } // we need to use a differet mechanism to pick ticks that get labels //#define USE_LOG10 #ifdef USE_LOG10 static gdouble map_log10 (gdouble in,gdouble upper,gdouble end) { return (end/log10(upper)) * log10(1.0+(in*upper)/end); } #endif static void bt_ruler_real_draw_ticks (BtRuler * ruler) { GtkWidget *widget = GTK_WIDGET (ruler); cairo_t *cr; gint i, j; gint width, height, ruler_size; gint xthickness, ythickness; gint length, ideal_length; gdouble lower, upper; /* Upper and lower limits, in ruler units */ gdouble increment; /* Number of pixels per unit */ gint scale; /* Number of units per major unit */ gdouble subd_incr; gdouble start, end, cur; gchar unit_str[32]; gint digit_height; gint digit_offset; gint text_width; gint text_height; gint pos; PangoLayout *layout; PangoRectangle logical_rect, ink_rect; GtkOrientation orientation; if (!gtk_widget_is_drawable (widget)) return; xthickness = widget->style->xthickness; ythickness = widget->style->ythickness; orientation = ruler->priv->orientation; layout = gtk_widget_create_pango_layout (widget, "012456789"); pango_layout_get_extents (layout, &ink_rect, &logical_rect); digit_height = PANGO_PIXELS (ink_rect.height) + 2; digit_offset = ink_rect.y; if (orientation == GTK_ORIENTATION_HORIZONTAL) { ruler_size = width = widget->allocation.width; height = widget->allocation.height - ythickness * 2; } else { ruler_size = width = widget->allocation.height; height = widget->allocation.width - ythickness * 2; } gtk_paint_box (widget->style, ruler->backing_store, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, widget, orientation == GTK_ORIENTATION_HORIZONTAL ?"hruler" : "vruler", 0, 0, widget->allocation.width, widget->allocation.height); cr = gdk_cairo_create (ruler->backing_store); gdk_cairo_set_source_color (cr, &widget->style->fg[widget->state]); if (orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_rectangle (cr, xthickness, height + ythickness, widget->allocation.width - 2 * xthickness, 1); } else { cairo_rectangle (cr, height + xthickness, ythickness, 1, widget->allocation.height - 2 * ythickness); } upper = ruler->upper / ruler->metric->pixels_per_unit; lower = ruler->lower / ruler->metric->pixels_per_unit; if ((upper - lower) == 0) goto out; increment = (gdouble) width / (upper - lower); /* determine the scale H * We calculate the text size as for the vruler instead of using * text_width = gdk_string_width(font, unit_str), so that the result * for the scale looks consistent with an accompanying vruler */ /* determine the scale V * use the maximum extents of the ruler to determine the largest * possible number to be displayed. Calculate the height in pixels * of this displayed text. Use this height to find a scale which * leaves sufficient room for drawing the ruler. */ scale = ceil (ruler->max_size / ruler->metric->pixels_per_unit); g_snprintf (unit_str, sizeof (unit_str), "%d", scale); if (orientation == GTK_ORIENTATION_HORIZONTAL) { text_width = strlen (unit_str) * digit_height + 1; for (scale = 0; scale < BT_RULER_MAXIMUM_SCALES; scale++) if (ruler->metric->ruler_scale[scale] * fabs (increment) > 2 * text_width) break; } else { text_height = strlen (unit_str) * digit_height + 1; for (scale = 0; scale < BT_RULER_MAXIMUM_SCALES; scale++) if (ruler->metric->ruler_scale[scale] * fabs (increment) > 2 * text_height) break; } if (scale == BT_RULER_MAXIMUM_SCALES) scale = BT_RULER_MAXIMUM_SCALES - 1; /* drawing starts here */ length = 0; for (i = BT_RULER_MAXIMUM_SUBDIVIDE - 1; i >= 0; i--) { subd_incr = (gdouble) ruler->metric->ruler_scale[scale] / (gdouble) ruler->metric->subdivide[i]; if (subd_incr * fabs (increment) <= MINIMUM_INCR) continue; /* Calculate the length of the tickmarks. Make sure that * this length increases for each set of ticks */ ideal_length = height / (i + 1) - 1; if (ideal_length > ++length) length = ideal_length; if (lower < upper) { start = floor (lower / subd_incr) * subd_incr; end = ceil (upper / subd_incr) * subd_incr; } else { start = floor (upper / subd_incr) * subd_incr; end = ceil (lower / subd_incr) * subd_incr; } for (cur = start; cur <= end; cur += subd_incr) { pos = ROUND ((cur - lower) * increment); #ifdef USE_LOG10 pos = map_log10 (pos, ruler->upper, ruler_size); #endif if (orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_rectangle (cr, pos, height + ythickness - length, 1, length); } else { cairo_rectangle (cr, height + xthickness - length, pos, length, 1); } /* draw label */ if (i == 0) { g_snprintf (unit_str, sizeof (unit_str), "%d", (gint) cur); if (orientation == GTK_ORIENTATION_HORIZONTAL) { pango_layout_set_text (layout, unit_str, -1); pango_layout_get_extents (layout, &logical_rect, NULL); gtk_paint_layout (widget->style, ruler->backing_store, gtk_widget_get_state (widget), FALSE, NULL, widget, "hruler", pos + 2, ythickness + PANGO_PIXELS (logical_rect.y - digit_offset), layout); } else { for (j = 0; j < (gint) strlen (unit_str); j++) { pango_layout_set_text (layout, unit_str + j, 1); pango_layout_get_extents (layout, NULL, &logical_rect); gtk_paint_layout (widget->style, ruler->backing_store, gtk_widget_get_state (widget), FALSE, NULL, widget, "vruler", xthickness + 1, pos + digit_height * j + 2 + PANGO_PIXELS (logical_rect.y - digit_offset), layout); } } } } } cairo_fill (cr); out: cairo_destroy (cr); g_object_unref (layout); } static void bt_ruler_real_draw_pos (BtRuler * ruler) { GtkWidget *widget = GTK_WIDGET (ruler); gint width, height, ruler_size; gint xthickness, ythickness; gint bs_width, bs_height; GtkOrientation orientation; if (!gtk_widget_is_drawable (widget)) return; xthickness = widget->style->xthickness; ythickness = widget->style->ythickness; width = widget->allocation.width; height = widget->allocation.height; orientation = ruler->priv->orientation; if (orientation == GTK_ORIENTATION_HORIZONTAL) { ruler_size = width; height -= ythickness * 2; bs_width = height / 2 + 2; bs_width |= 1; /* make sure it's odd */ bs_height = bs_width / 2 + 1; } else { ruler_size = height; width -= xthickness * 2; bs_height = width / 2 + 2; bs_height |= 1; /* make sure it's odd */ bs_width = bs_height / 2 + 1; } if ((bs_width > 0) && (bs_height > 0)) { cairo_t *cr = gdk_cairo_create (widget->window); gint x, y, pos; gdouble increment; /* If a backing store exists, restore the ruler */ if (ruler->backing_store) { gdk_cairo_set_source_pixmap (cr, ruler->backing_store, 0, 0); cairo_rectangle (cr, ruler->xsrc, ruler->ysrc, bs_width, bs_height); cairo_fill (cr); } pos = ruler->position; #ifdef USE_LOG10 pos = map_log10 (pos, ruler->upper, ruler_size); #endif if (orientation == GTK_ORIENTATION_HORIZONTAL) { increment = (gdouble) width / (ruler->upper - ruler->lower); x = ROUND ((pos - ruler->lower) * increment) + (xthickness - bs_width) / 2 - 1; y = (height + bs_height) / 2 + ythickness; } else { increment = (gdouble) height / (ruler->upper - ruler->lower); x = (width + bs_width) / 2 + xthickness; y = ROUND ((pos - ruler->lower) * increment) + (ythickness - bs_height) / 2 - 1; } gdk_cairo_set_source_color (cr, &widget->style->fg[widget->state]); cairo_move_to (cr, x, y); if (orientation == GTK_ORIENTATION_HORIZONTAL) { cairo_line_to (cr, x + bs_width / 2.0, y + bs_height); cairo_line_to (cr, x + bs_width, y); } else { cairo_line_to (cr, x + bs_width, y + bs_height / 2.0); cairo_line_to (cr, x, y + bs_height); } cairo_fill (cr); cairo_destroy (cr); ruler->xsrc = x; ruler->ysrc = y; } } buzztard-0.6.0/src/ui/edit/missing-song-elements-dialog.c0000644042355400116100000002010511576360376020306 00000000000000/* $Id: missing-song-elements-dialog.c 2992 2010-09-20 19:40:18Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmissingsongelementsdialog * @short_description: missing song machine and wave elements * * A dialog to inform about missing song machine and wave elements. */ /* * @todo: support gst-codec-install (see missing-framework-elements-dialog.c) */ #define BT_EDIT #define BT_MISSING_SONG_ELEMENTS_DIALOG_C #include "bt-edit.h" //-- property ids enum { MISSING_SONG_ELEMENTS_DIALOG_MACHINES=1, MISSING_SONG_ELEMENTS_DIALOG_WAVES }; struct _BtMissingSongElementsDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* list of missing elements */ GList *machines, *waves; GtkWidget *ignore_button; }; //-- the class G_DEFINE_TYPE (BtMissingSongElementsDialog, bt_missing_song_elements_dialog, GTK_TYPE_DIALOG); //-- event handler //-- helper methods static void make_listview(GtkWidget *vbox,GList *missing_elements,const gchar *msg) { GtkWidget *label,*missing_list,*missing_list_view; GList *node; gchar *missing_text,*ptr; gint length=0; label=gtk_label_new(msg); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); for(node=missing_elements;node;node=g_list_next(node)) { length+=2+strlen((gchar *)(node->data)); } ptr=missing_text=g_malloc(length); for(node=missing_elements;node;node=g_list_next(node)) { length=g_sprintf(ptr,"%s\n",(gchar *)(node->data)); ptr=&ptr[length]; } ptr[-1]='\0'; // remove last '\n' missing_list = gtk_text_view_new(); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(missing_list), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(missing_list), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(missing_list), GTK_WRAP_WORD); gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(missing_list)),missing_text,-1); gtk_widget_show(missing_list); g_free(missing_text); missing_list_view = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (missing_list_view), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (missing_list_view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(missing_list_view), missing_list); gtk_widget_show(missing_list_view); gtk_box_pack_start(GTK_BOX(vbox),missing_list_view,TRUE,TRUE,0); } static void bt_missing_song_elements_dialog_init_ui(const BtMissingSongElementsDialog *self) { GtkWidget *label,*icon,*hbox,*vbox; gchar *str; //GdkPixbuf *window_icon=NULL; gtk_widget_set_name(GTK_WIDGET(self),"Missing elements in song"); // create and set window icon /* if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } */ // set dialog title gtk_window_set_title(GTK_WINDOW(self),_("Missing elements in song")); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); hbox=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(hbox),6); icon=gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING,GTK_ICON_SIZE_DIALOG); gtk_container_add(GTK_CONTAINER(hbox),icon); vbox=gtk_vbox_new(FALSE,6); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Missing elements in song")); gtk_label_set_markup(GTK_LABEL(label),str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); g_free(str); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); if(self->priv->machines) { GST_DEBUG("%d missing machines",g_list_length(self->priv->machines)); make_listview(vbox,self->priv->machines,_("The machines listed below are missing or failed to load.")); } if(self->priv->waves) { GST_DEBUG("%d missing core elements",g_list_length(self->priv->waves)); make_listview(vbox,self->priv->waves,_("The waves listed below are missing or failed to load.")); } gtk_container_add(GTK_CONTAINER(hbox),vbox); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),hbox); } //-- constructor methods /** * bt_missing_song_elements_dialog_new: * @machines: list of missing machine elements * @waves: list of missing wave files * * Create a new instance * * Returns: the new instance */ BtMissingSongElementsDialog *bt_missing_song_elements_dialog_new(GList *machines,GList *waves) { BtMissingSongElementsDialog *self; self=BT_MISSING_SONG_ELEMENTS_DIALOG(g_object_new(BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG,"machines",machines,"waves",waves,NULL)); bt_missing_song_elements_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_missing_song_elements_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMissingSongElementsDialog *self = BT_MISSING_SONG_ELEMENTS_DIALOG(object); return_if_disposed(); switch (property_id) { case MISSING_SONG_ELEMENTS_DIALOG_MACHINES: { self->priv->machines = g_value_get_pointer(value); } break; case MISSING_SONG_ELEMENTS_DIALOG_WAVES: { self->priv->waves = g_value_get_pointer(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_missing_song_elements_dialog_dispose(GObject *object) { BtMissingSongElementsDialog *self = BT_MISSING_SONG_ELEMENTS_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_missing_song_elements_dialog_parent_class)->dispose(object); } static void bt_missing_song_elements_dialog_init(BtMissingSongElementsDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG, BtMissingSongElementsDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_missing_song_elements_dialog_class_init(BtMissingSongElementsDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMissingSongElementsDialogPrivate)); gobject_class->set_property = bt_missing_song_elements_dialog_set_property; gobject_class->dispose = bt_missing_song_elements_dialog_dispose; g_object_class_install_property(gobject_class,MISSING_SONG_ELEMENTS_DIALOG_MACHINES, g_param_spec_pointer("machines", "machines construct prop", "Set missing machines list, the dialog handles", G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MISSING_SONG_ELEMENTS_DIALOG_WAVES, g_param_spec_pointer("waves", "waves construct prop", "Set missing waves list, the dialog handles", G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/machine-preset-properties-dialog.h0000644042355400116100000000551211625722250021153 00000000000000/* $Id: machine-preset-properties-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_PRESET_PROPERTIES_DIALOG_H #define BT_MACHINE_PRESET_PROPERTIES_DIALOG_H #include #include #define BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG (bt_machine_preset_properties_dialog_get_type ()) #define BT_MACHINE_PRESET_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG, BtMachinePresetPropertiesDialog)) #define BT_MACHINE_PRESET_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG, BtMachinePresetPropertiesDialogClass)) #define BT_IS_MACHINE_PRESET_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG)) #define BT_IS_MACHINE_PRESET_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG)) #define BT_MACHINE_PRESET_PROPERTIES_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG, BtMachinePresetPropertiesDialogClass)) /* type macros */ typedef struct _BtMachinePresetPropertiesDialog BtMachinePresetPropertiesDialog; typedef struct _BtMachinePresetPropertiesDialogClass BtMachinePresetPropertiesDialogClass; typedef struct _BtMachinePresetPropertiesDialogPrivate BtMachinePresetPropertiesDialogPrivate; /** * BtMachinePresetPropertiesDialog: * * the root window for the editor application */ struct _BtMachinePresetPropertiesDialog { GtkDialog parent; /*< private >*/ BtMachinePresetPropertiesDialogPrivate *priv; }; struct _BtMachinePresetPropertiesDialogClass { GtkDialogClass parent; }; GType bt_machine_preset_properties_dialog_get_type(void) G_GNUC_CONST; BtMachinePresetPropertiesDialog *bt_machine_preset_properties_dialog_new(GstElement *machine,gchar **name,gchar **comment); void bt_machine_preset_properties_dialog_apply(const BtMachinePresetPropertiesDialog *self); #endif // BT_MACHINE_PRESET_PROPERTIES_DIALOG_H buzztard-0.6.0/src/ui/edit/machine-actions.h0000644042355400116100000000207511576360376015677 00000000000000/* $Id: machine-actions.h 2966 2010-09-06 13:07:39Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_ACTIONS_H #define BT_MACHINE_ACTIONS_H #include "main-window.h" void bt_machine_action_about(BtMachine *machine,BtMainWindow *main_window); #endif // BT_MACHINE_ACTIONS_H buzztard-0.6.0/src/ui/edit/render-dialog.h0000644042355400116100000000503011625722250015327 00000000000000/* $Id: render-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_RENDER_DIALOG_H #define BT_RENDER_DIALOG_H #include #include #define BT_TYPE_RENDER_DIALOG (bt_render_dialog_get_type ()) #define BT_RENDER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_RENDER_DIALOG, BtRenderDialog)) #define BT_RENDER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_RENDER_DIALOG, BtRenderDialogClass)) #define BT_IS_RENDER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_RENDER_DIALOG)) #define BT_IS_RENDER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_RENDER_DIALOG)) #define BT_RENDER_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_RENDER_DIALOG, BtRenderDialogClass)) /* type macros */ typedef struct _BtRenderDialog BtRenderDialog; typedef struct _BtRenderDialogClass BtRenderDialogClass; typedef struct _BtRenderDialogPrivate BtRenderDialogPrivate; /** * BtRenderDialog: * * the song rendering dialog for the editor application */ struct _BtRenderDialog { GtkDialog parent; /*< private >*/ BtRenderDialogPrivate *priv; }; struct _BtRenderDialogClass { GtkDialogClass parent; }; #define BT_TYPE_RENDER_MODE (bt_render_mode_get_type()) /** * BtRenderMode: * @BT_RENDER_MODE_MIXDOWN: mix to one track * @BT_RENDER_MODE_SINGLE_TRACKS: record one track for each source * * Different modes of operation for the #BtSong rendering. */ typedef enum { BT_RENDER_MODE_MIXDOWN=0, BT_RENDER_MODE_SINGLE_TRACKS, } BtRenderMode; GType bt_render_dialog_get_type(void) G_GNUC_CONST; GType bt_render_mode_get_type(void) G_GNUC_CONST; BtRenderDialog *bt_render_dialog_new(void); #endif // BT_RENDER_DIALOG_H buzztard-0.6.0/src/ui/edit/change-logger.c0000644042355400116100000000551311626121152015311 00000000000000/* $Id: change-logger.c 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btchangelogger * @short_description: interface for the editor action journaling * * Defines undo/redo interface. */ #define BT_EDIT #define BT_CHANGE_LOGGER_C #include "bt-edit.h" //-- the iface G_DEFINE_INTERFACE (BtChangeLogger, bt_change_logger, 0); //-- common helper /** * bt_change_logger_match_method: * @change_logger_methods: array of change log methods * @data: the string to match agains * @match_info: resulting parameter on a positive match * * Matches commands registered in the @change_logger_methods against @data. If * a match is found the parameters are returned in @match_info. * * Returns: the command id from @change_logger_methods or -1 for no match. Free * the match_info on positive matches. */ gint bt_change_logger_match_method(BtChangeLoggerMethods *change_logger_methods,const gchar *data, GMatchInfo **match_info) { gint i=0,res=-1; BtChangeLoggerMethods *clm=change_logger_methods; while (clm->name) { if(!strncmp(data,clm->name,clm->name_len)) { if(!clm->regex) { clm->regex=g_regex_new(clm->regex_str,0,0,NULL); } if(g_regex_match_full(clm->regex,data,-1,clm->name_len,0,match_info,NULL)) { res=i; } else { GST_WARNING("no match for command %s in regexp \"%s\" for data \"%s\"",clm->name,g_regex_get_pattern(clm->regex),&data[clm->name_len]); } break; } i++;clm++; } return(res); } //-- wrapper /** * bt_change_logger_change: * @self: an object that implements logging changes * @data: serialised data of the action to apply * * Run the editor action pointed to by @data. * * Returns: %TRUE for success. */ gboolean bt_change_logger_change(const BtChangeLogger *self,const gchar *data) { g_return_val_if_fail (BT_IS_CHANGE_LOGGER (self), FALSE); return (BT_CHANGE_LOGGER_GET_INTERFACE (self)->change(self, data)); } //-- interface internals static void bt_change_logger_default_init(BtChangeLoggerInterface *klass) { } buzztard-0.6.0/src/ui/edit/machine-preset-properties-dialog.c0000644042355400116100000002751411615607031021152 00000000000000/* $Id: machine-preset-properties-dialog.c 3510 2011-08-01 20:35:36Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinepresetpropertiesdialog * @short_description: machine preset settings * * A dialog to (re)configure machine presets. */ #define BT_EDIT #define BT_MACHINE_PRESET_PROPERTIES_DIALOG_C #include "bt-edit.h" //-- property ids enum { MACHINE_PRESET_PROPERTIES_DIALOG_MACHINE=1, MACHINE_PRESET_PROPERTIES_DIALOG_NAME, MACHINE_PRESET_PROPERTIES_DIALOG_COMMENT }; struct _BtMachinePresetPropertiesDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the element that has the presets */ GstElement *machine; gchar **presets; /* dialog data */ gchar *name,*comment; gchar **name_ptr,**comment_ptr; /* widgets and their handlers */ GtkWidget *okay_button; }; //-- the class G_DEFINE_TYPE (BtMachinePresetPropertiesDialog, bt_machine_preset_properties_dialog, GTK_TYPE_DIALOG); //-- event handler static gboolean check_name_exists(BtMachinePresetPropertiesDialog *self, const gchar *name) { gchar **preset; if(!self->priv->presets) return(FALSE); for(preset=self->priv->presets;*preset;preset++) { if(!strcmp(name,*preset)) return TRUE; } return(FALSE); } static void on_name_changed(GtkEditable *editable,gpointer user_data) { BtMachinePresetPropertiesDialog *self=BT_MACHINE_PRESET_PROPERTIES_DIALOG(user_data); const gchar *name=gtk_entry_get_text(GTK_ENTRY(editable)); gboolean valid=TRUE; GST_INFO("preset text changed: '%s'",name); // assure validity & uniquness of the entered data if(!(*name)) // empty box valid=FALSE; else if(*self->priv->name_ptr && strcmp(name,*self->priv->name_ptr) && check_name_exists(self,name)) // non empty old name && name has changed && name already exists valid=FALSE; else if(!(*self->priv->name_ptr) && check_name_exists(self,name)) // name already exists valid=FALSE; gtk_widget_set_sensitive(self->priv->okay_button,valid); g_free(self->priv->name); self->priv->name=g_strdup(name); } static void on_comment_changed(GtkEditable *editable,gpointer user_data) { BtMachinePresetPropertiesDialog *self=BT_MACHINE_PRESET_PROPERTIES_DIALOG(user_data); const gchar *comment=gtk_entry_get_text(GTK_ENTRY(editable)); GST_INFO("preset comment changed"); g_free(self->priv->comment); self->priv->comment=g_strdup(comment); } //-- helper methods static void bt_machine_preset_properties_dialog_init_ui(const BtMachinePresetPropertiesDialog *self) { GtkWidget *label,*widget,*box,*table; //GdkPixbuf *window_icon=NULL; #if !GTK_CHECK_VERSION(2,20,0) GList *buttons; #endif gtk_widget_set_name(GTK_WIDGET(self),"preset name and comment"); // create and set window icon /* if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } */ // set dialog title gtk_window_set_title(GTK_WINDOW(self),_("preset name and comment")); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // grab okay button, so that we can block if input is not valid #if GTK_CHECK_VERSION(2,20,0) self->priv->okay_button=gtk_dialog_get_widget_for_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); #else buttons=gtk_container_get_children(GTK_CONTAINER(gtk_dialog_get_action_area(GTK_DIALOG(self)))); self->priv->okay_button=GTK_WIDGET(g_list_nth_data(buttons,1)); g_list_free(buttons); #endif box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); table=gtk_table_new(/*rows=*/2,/*columns=*/2,/*homogenous=*/FALSE); gtk_container_add(GTK_CONTAINER(box),table); // GtkEntry : preset name label=gtk_label_new(_("name")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_entry_new(); if(self->priv->name) gtk_entry_set_text(GTK_ENTRY(widget),self->priv->name); else gtk_widget_set_sensitive(self->priv->okay_button,FALSE); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(widget, "changed", G_CALLBACK(on_name_changed), (gpointer)self); // GtkEntry : preset comment label=gtk_label_new(_("comment")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_entry_new(); if(self->priv->comment) gtk_entry_set_text(GTK_ENTRY(widget),self->priv->comment); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(widget, "changed", G_CALLBACK(on_comment_changed), (gpointer)self); } //-- constructor methods /** * bt_machine_preset_properties_dialog_new: * @machine: the machine for which to create the dialog for * @name: the preset name * @comment: the comment name * * Create a new instance * * Returns: the new instance */ BtMachinePresetPropertiesDialog *bt_machine_preset_properties_dialog_new(GstElement *machine,gchar **name,gchar **comment) { BtMachinePresetPropertiesDialog *self; self=BT_MACHINE_PRESET_PROPERTIES_DIALOG(g_object_new(BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG,"machine",machine,"name",name,"comment",comment,NULL)); bt_machine_preset_properties_dialog_init_ui(self); return(self); } //-- methods /** * bt_machine_preset_properties_dialog_apply: * @self: the dialog which settings to apply * * Makes the dialog settings effective. */ void bt_machine_preset_properties_dialog_apply(const BtMachinePresetPropertiesDialog *self) { GST_INFO("applying preset changes settings"); *self->priv->name_ptr=self->priv->name; self->priv->name=NULL; *self->priv->comment_ptr=self->priv->comment; self->priv->comment=NULL; } //-- wrapper //-- class internals static void bt_machine_preset_properties_dialog_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMachinePresetPropertiesDialog *self = BT_MACHINE_PRESET_PROPERTIES_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_PRESET_PROPERTIES_DIALOG_MACHINE: { g_value_set_object(value, self->priv->machine); } break; case MACHINE_PRESET_PROPERTIES_DIALOG_NAME: { g_value_set_pointer(value, self->priv->name_ptr); } break; case MACHINE_PRESET_PROPERTIES_DIALOG_COMMENT: { g_value_set_pointer(value, self->priv->comment_ptr); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_preset_properties_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachinePresetPropertiesDialog *self = BT_MACHINE_PRESET_PROPERTIES_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_PRESET_PROPERTIES_DIALOG_MACHINE: { g_object_try_unref(self->priv->machine); self->priv->machine = g_value_dup_object(value); GST_DEBUG("set the machine for preset_dialog: %p",self->priv->machine); self->priv->presets=self->priv->machine?gst_preset_get_preset_names(GST_PRESET(self->priv->machine)):NULL; } break; case MACHINE_PRESET_PROPERTIES_DIALOG_NAME: { self->priv->name_ptr = g_value_get_pointer(value); if(self->priv->name_ptr) { self->priv->name=g_strdup(*self->priv->name_ptr); } } break; case MACHINE_PRESET_PROPERTIES_DIALOG_COMMENT: { self->priv->comment_ptr = g_value_get_pointer(value); if(self->priv->comment_ptr) { self->priv->comment=g_strdup(*self->priv->comment_ptr); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_preset_properties_dialog_dispose(GObject *object) { BtMachinePresetPropertiesDialog *self = BT_MACHINE_PRESET_PROPERTIES_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_unref(self->priv->machine); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_machine_preset_properties_dialog_parent_class)->dispose(object); } static void bt_machine_preset_properties_dialog_finalize(GObject *object) { BtMachinePresetPropertiesDialog *self = BT_MACHINE_PRESET_PROPERTIES_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->name); g_free(self->priv->comment); g_strfreev(self->priv->presets); G_OBJECT_CLASS(bt_machine_preset_properties_dialog_parent_class)->finalize(object); } static void bt_machine_preset_properties_dialog_init(BtMachinePresetPropertiesDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_PRESET_PROPERTIES_DIALOG, BtMachinePresetPropertiesDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_machine_preset_properties_dialog_class_init(BtMachinePresetPropertiesDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMachinePresetPropertiesDialogPrivate)); gobject_class->set_property = bt_machine_preset_properties_dialog_set_property; gobject_class->get_property = bt_machine_preset_properties_dialog_get_property; gobject_class->dispose = bt_machine_preset_properties_dialog_dispose; gobject_class->finalize = bt_machine_preset_properties_dialog_finalize; g_object_class_install_property(gobject_class,MACHINE_PRESET_PROPERTIES_DIALOG_MACHINE, g_param_spec_object("machine", "machine construct prop", "Set machine object, the dialog handles", GST_TYPE_ELEMENT, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_PRESET_PROPERTIES_DIALOG_NAME, g_param_spec_pointer("name", "name-pointer prop", "address of preset name", G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_PRESET_PROPERTIES_DIALOG_COMMENT, g_param_spec_pointer("comment", "comment-pointer prop", "address of preset comment", G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/pattern-editor.h0000644042355400116100000001474211576360376015602 00000000000000/* $Id: pattern-editor.h 3357 2011-05-12 07:40:42Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PATTERN_EDITOR_H #define BT_PATTERN_EDITOR_H #include #include G_BEGIN_DECLS #define BT_TYPE_PATTERN_EDITOR (bt_pattern_editor_get_type()) #define BT_PATTERN_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PATTERN_EDITOR, BtPatternEditor)) #define BT_IS_PATTERN_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PATTERN_EDITOR)) #define BT_PATTERN_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PATTERN_EDITOR, BtPatternEditorClass)) #define BT_IS_PATTERN_EDITOR_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PATTERN_EDITOR)) /** * BtPatternEditorColumnType: * @PCT_NOTE: musical notes * @PCT_SWITCH: on/off switches * @PCT_BYTE: 8bit values * @PCT_WORD: 16bit value * @PCT_FLOAT: single precission floating point values * * Column data types. */ enum _BtPatternEditorColumnType { PCT_NOTE=0, PCT_SWITCH, PCT_BYTE, PCT_WORD, PCT_FLOAT }; typedef enum _BtPatternEditorColumnType BtPatternEditorColumnType; /** * BtPatternEditorColumn: * @type: column value type * @def: default value * @min: minimum allowed value * @max: maximum allowed value * @user_data: extra data to attach * * A parameter column. */ struct _BtPatternEditorColumn { BtPatternEditorColumnType type; float def, min, max; gpointer user_data; }; typedef struct _BtPatternEditorColumn BtPatternEditorColumn; /** * BtPatternEditorColumnGroupType: * @PGT_WIRE: wire parameters * @PGT_GLOBAL: global parameters * @PGT_VOICE: voice parameters * * Column group type */ enum _BtPatternEditorColumnGroupType { PGT_WIRE=0, PGT_GLOBAL, PGT_VOICE }; typedef enum _BtPatternEditorColumnGroupType BtPatternEditorColumnGroupType; /** * BtPatternEditorColumnGroup: * @type: group type * @name: group name * @num_columns: number of columns * @columns: array of columns * @user_data: extra data to attach * * A group of #BtPatternEditorColumns, such as a voice or all global parameters. */ struct _BtPatternEditorColumnGroup { // just an id to tell groups apart BtPatternEditorColumnGroupType type; // can be used for the headline above the group gchar *name; guint num_columns; BtPatternEditorColumn *columns; gpointer user_data; /* < private > */ /* in pixels for now, may change to chars some day when needed */ guint width; }; typedef struct _BtPatternEditorColumnGroup BtPatternEditorColumnGroup; /** * BtPatternEditorCallbacks: * @get_data_func: called to fetch data from the model and convert for view * @set_data_func: called to convert from view format for storage in the model * * Data format conversion callbacks. */ struct _BtPatternEditorCallbacks { /* FIXME: what about supplying * - BtPatternEditorColumn instead of BtPatternEditorColumn->user_data * - BtPatternEditorColumnGroup instead of track; */ gfloat (*get_data_func)(gpointer pattern_data, gpointer column_data, guint row, guint group, guint param); void (*set_data_func)(gpointer pattern_data, gpointer column_data, guint row, guint group, guint param, guint digit, gfloat value); }; typedef struct _BtPatternEditorCallbacks BtPatternEditorCallbacks; typedef struct _BtPatternEditor BtPatternEditor; typedef struct _BtPatternEditorClass BtPatternEditorClass; typedef struct _BtPatternEditorPrivate BtPatternEditorPrivate; /** * BtPatternEditorSelectionMode: * @PESM_COLUMN: a single columns * @PESM_GROUP: a whole group * @PESM_ALL: all columns (and groups) * * Seleting single columns, whole groups (e.g. voices) or the whole pattern. */ enum _BtPatternEditorSelectionMode { PESM_COLUMN, PESM_GROUP, PESM_ALL }; typedef enum _BtPatternEditorSelectionMode BtPatternEditorSelectionMode; /** * BtPatternEditor: * * Opaque editor instance data. */ struct _BtPatternEditor { GtkWidget parent; /*< private >*/ /* cursor position */ guint row; guint group; guint parameter; guint digit; /* cursor step */ guint step; /* scroll location */ gint ofs_x, ofs_y; /* pattern data */ guint num_lines, num_groups, num_rows; BtPatternEditorColumnGroup *groups; BtPatternEditorCallbacks *callbacks; gpointer pattern_data; /* selection */ gboolean selection_enabled; BtPatternEditorSelectionMode selection_mode; gint selection_start, selection_end, selection_group, selection_param; /* font metrics */ PangoLayout *pl; guint cw, ch; guint rowhdr_width, colhdr_height; gboolean size_changed; /* current octave number */ guint octave; /* position of playing pointer from 0.0 ... 1.0 */ gdouble play_pos; /* own colors */ gdouble play_pos_color[3], text_color[3], bg_color[3], sel_color[3], cursor_color[3]; gdouble bg_shade_color[2][3]; /* scroll adjustments */ GtkAdjustment *hadj,*vadj; }; struct _BtPatternEditorClass { GtkWidgetClass parent_class; /* signal slots */ void (*set_scroll_adjustments) (BtPatternEditor* self, GtkAdjustment * horizontal, GtkAdjustment * vertical); }; /* note: does not copy the BtPatternEditorColumn * data (in this version) */ void bt_pattern_editor_set_pattern (BtPatternEditor *self, gpointer pattern_data, guint num_rows, guint num_groups, BtPatternEditorColumnGroup *groups, BtPatternEditorCallbacks *cb); gboolean bt_pattern_editor_get_selection (BtPatternEditor *self, gint *start, gint *end, gint *group, gint *param); GtkWidget *bt_pattern_editor_new (void); GType bt_pattern_editor_get_type (void); G_END_DECLS #endif // BT_PATTERN_EDITOR_H buzztard-0.6.0/src/ui/edit/crash-recover-dialog.h0000644042355400116100000000454011625722250016620 00000000000000/* $Id: crash-recover-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CRASH_RECOVER_DIALOG_H #define BT_CRASH_RECOVER_DIALOG_H #include #include #define BT_TYPE_CRASH_RECOVER_DIALOG (bt_crash_recover_dialog_get_type ()) #define BT_CRASH_RECOVER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_CRASH_RECOVER_DIALOG, BtCrashRecoverDialog)) #define BT_CRASH_RECOVER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_CRASH_RECOVER_DIALOG, BtCrashRecoverDialogClass)) #define BT_IS_CRASH_RECOVER_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_CRASH_RECOVER_DIALOG)) #define BT_IS_CRASH_RECOVER_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_CRASH_RECOVER_DIALOG)) #define BT_CRASH_RECOVER_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_CRASH_RECOVER_DIALOG, BtCrashRecoverDialogClass)) /* type macros */ typedef struct _BtCrashRecoverDialog BtCrashRecoverDialog; typedef struct _BtCrashRecoverDialogClass BtCrashRecoverDialogClass; typedef struct _BtCrashRecoverDialogPrivate BtCrashRecoverDialogPrivate; /** * BtCrashRecoverDialog: * * the about dialog for the editor application */ struct _BtCrashRecoverDialog { GtkDialog parent; /*< private >*/ BtCrashRecoverDialogPrivate *priv; }; struct _BtCrashRecoverDialogClass { GtkDialogClass parent; }; GType bt_crash_recover_dialog_get_type(void) G_GNUC_CONST; BtCrashRecoverDialog *bt_crash_recover_dialog_new(GList *crash_entries); #endif // BT_CRASH_RECOVER_DIALOG_H buzztard-0.6.0/src/ui/edit/sequence-view.h0000644042355400116100000000415711625722250015404 00000000000000/* $Id: sequence-view.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SEQUENCE_VIEW_H #define BT_SEQUENCE_VIEW_H #include #include #define BT_TYPE_SEQUENCE_VIEW (bt_sequence_view_get_type ()) #define BT_SEQUENCE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SEQUENCE_VIEW, BtSequenceView)) #define BT_SEQUENCE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SEQUENCE_VIEW, BtSequenceViewClass)) #define BT_IS_SEQUENCE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SEQUENCE_VIEW)) #define BT_IS_SEQUENCE_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SEQUENCE_VIEW)) #define BT_SEQUENCE_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SEQUENCE_VIEW, BtSequenceViewClass)) /* type macros */ typedef struct _BtSequenceView BtSequenceView; typedef struct _BtSequenceViewClass BtSequenceViewClass; typedef struct _BtSequenceViewPrivate BtSequenceViewPrivate; /** * BtSequenceView: * * the sequence widget view */ struct _BtSequenceView { GtkTreeView parent; /*< private >*/ BtSequenceViewPrivate *priv; }; struct _BtSequenceViewClass { GtkTreeViewClass parent; }; GType bt_sequence_view_get_type(void) G_GNUC_CONST; BtSequenceView *bt_sequence_view_new(void); #endif // BT_SEQUENCE_VIEW_H buzztard-0.6.0/src/ui/edit/change-logger.h0000644042355400116100000000506711625722250015327 00000000000000/* $Id: change-logger.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CHANGE_LOGGER_H #define BT_CHANGE_LOGGER_H #include #include #define BT_TYPE_CHANGE_LOGGER (bt_change_logger_get_type()) #define BT_CHANGE_LOGGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_CHANGE_LOGGER, BtChangeLogger)) #define BT_IS_CHANGE_LOGGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_CHANGE_LOGGER)) #define BT_CHANGE_LOGGER_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), BT_TYPE_CHANGE_LOGGER, BtChangeLoggerInterface)) /* type macros */ typedef struct _BtChangeLogger BtChangeLogger; /* dummy object */ typedef struct _BtChangeLoggerInterface BtChangeLoggerInterface; struct _BtChangeLoggerInterface { const GTypeInterface parent; gboolean (*change)(const BtChangeLogger *owner,const gchar *data); }; typedef struct _BtChangeLoggerMethods BtChangeLoggerMethods; struct _BtChangeLoggerMethods { const gchar *name; const gchar *regex_str; GRegex *regex; guint name_len; }; /** * BT_CHANGE_LOGGER_METHOD: * @name: name of method * @name_len: length of the string * @regexp: regular expression for parsing the parameter part * * Structure entry for a change log line parser array (array of * BtChangeLoggerMethods). */ // too bad we can't put strlen(name) below as name is const #define BT_CHANGE_LOGGER_METHOD(name,name_len,regexp) \ { name " ", regexp, NULL, name_len } GType bt_change_logger_get_type(void) G_GNUC_CONST; // common helper gint bt_change_logger_match_method(BtChangeLoggerMethods *change_logger_methods,const gchar *data, GMatchInfo **match_info); // wrapper gboolean bt_change_logger_change(const BtChangeLogger *self,const gchar *data); #endif // BT_CHANGE_LOGGER_H buzztard-0.6.0/src/ui/edit/volume-popup.c0000644042355400116100000001552611667614515015303 00000000000000/* $Id: volume-popup.c 3754 2011-12-07 07:44:11Z ensonic $ * * GNOME Volume Applet * Copyright (C) 2004 Ronald Bultje * 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btvolumepopup * @short_description: volume popup widget * * Shows a popup window containing a vertical slider */ /* @todo: use gtk_scale_add_mark() in gtk-2.16 instead of the ruler. */ #define BT_EDIT #define VOLUME_POPUP_C #include "bt-edit.h" #include "ruler.h" //-- the class G_DEFINE_TYPE (BtVolumePopup, bt_volume_popup, GTK_TYPE_WINDOW); //-- event handler static void cb_scale_changed(GtkRange *range, gpointer user_data) { GtkLabel *label=GTK_LABEL(user_data); gchar str[6]; g_sprintf(str,"%3d %%",(gint)(100.0*gtk_range_get_value(range))); gtk_label_set_text(label,str); } /* * hide popup when clicking outside */ static gboolean cb_dock_press(GtkWidget * widget, GdkEventButton * event, gpointer data) { BtVolumePopup *self = BT_VOLUME_POPUP(data); //if(!gtk_widget_get_realized(GTK_WIDGET(self)) return FALSE; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *e; //GST_INFO("type=%4d, window=%p, send_event=%3d, time=%8d",event->type,event->window,event->send_event,event->time); //GST_INFO("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",event->x,event->y,event->axes,event->state); //GST_INFO("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",event->button,event->device,event->x_root,event->y_root); /* GtkWidget *parent=GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(self))); //GtkWidget *parent=gtk_widget_get_parent(GTK_WIDGET(self)); //gboolean retval; GST_INFO("FORWARD : popup=%p, widget=%p", self, widget); GST_INFO("FORWARD : parent=%p, parent->window=%p", parent, parent->window); */ bt_volume_popup_hide(self); // forward event e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event); //GST_INFO("type=%4d, window=%p, send_event=%3d, time=%8d",e->type,e->window,e->send_event,e->time); //GST_INFO("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",e->x,e->y,e->axes,e->state); //GST_INFO("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",e->button,e->device,e->x_root,e->y_root); //e->window = widget->window; //e->window = parent->window; //e->type = GDK_BUTTON_PRESS; gtk_main_do_event ((GdkEvent *) e); //retval=gtk_widget_event (widget, (GdkEvent *) e); //retval=gtk_widget_event (parent, (GdkEvent *) e); //retval=gtk_widget_event (self->parent_widget, (GdkEvent *) e); //GST_INFO(" result =%d", retval); //g_signal_emit_by_name(self->parent_widget, "event", 0, &retval, e); //g_signal_emit_by_name(parent, "event", 0, &retval, e); //GST_INFO(" result =%d", retval); //e->window = event->window; gdk_event_free ((GdkEvent *) e); return TRUE; } return FALSE; } //-- helper methods //-- constructor methods /** * bt_volume_popup_new: * @adj: the adjustment for the popup * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ GtkWidget * bt_volume_popup_new(GtkAdjustment *adj) { GtkWidget *table, *scale, *frame,*ruler/*,*rbox,*pad*/, *label; BtVolumePopup *self; self = g_object_new(BT_TYPE_VOLUME_POPUP, "type", GTK_WINDOW_POPUP, NULL); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); table = gtk_table_new(2,2, FALSE); label=gtk_label_new(""); gtk_table_attach_defaults(GTK_TABLE(table), label, 0,2, 0,1); scale=gtk_vscale_new(adj); self->scale=GTK_RANGE(scale); gtk_widget_set_size_request(scale, -1, 200); gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE); gtk_range_set_inverted(self->scale, TRUE); g_signal_connect(self->scale, "value-changed", G_CALLBACK(cb_scale_changed), label); cb_scale_changed(self->scale,label); gtk_table_attach_defaults(GTK_TABLE(table), scale, 1,2, 1,2); // add ruler ruler=bt_ruler_new(GTK_ORIENTATION_VERTICAL,FALSE); /* we use -X instead of 0.0 because of: * http://bugzilla.gnome.org/show_bug.cgi?id=465041 * @todo: take slider knob size into account * gtk_widget_style_get(scale,"slider-length",slider_length,NULL); */ bt_ruler_set_range(BT_RULER(ruler),435.0,-35.0,100.0,30.0); gtk_widget_set_size_request(ruler,30,-1); g_object_set(ruler,"draw-pos",FALSE,NULL); gtk_table_attach_defaults(GTK_TABLE(table), ruler, 0,1, 1,2); gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_add(GTK_CONTAINER(self), frame); gtk_widget_show_all(frame); g_signal_connect(self, "button-press-event", G_CALLBACK (cb_dock_press), self); return GTK_WIDGET(self); } //-- methods /** * bt_volume_popup_show: * @self: the popup widget * * Show and activate the widget */ void bt_volume_popup_show(BtVolumePopup *self) { GdkWindow *window; gtk_widget_show_all(GTK_WIDGET(self)); //gtk_widget_realize(GTK_WIDGET(self)); // not needed (yet) window = gtk_widget_get_window(GTK_WIDGET(self)); /* grab focus */ gtk_widget_grab_focus_savely(GTK_WIDGET(self)); gtk_grab_add(GTK_WIDGET(self)); gdk_pointer_grab(window, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); gdk_keyboard_grab(window, TRUE, GDK_CURRENT_TIME); } /** * bt_volume_popup_hide: * @self: the popup widget * * Hide and deactivate the widget */ void bt_volume_popup_hide(BtVolumePopup *self) { /* ungrab focus */ gdk_keyboard_ungrab(GDK_CURRENT_TIME); gdk_pointer_ungrab(GDK_CURRENT_TIME); gtk_grab_remove(GTK_WIDGET(self)); gtk_widget_hide(GTK_WIDGET(self)); } //-- wrapper //-- class internals static void bt_volume_popup_dispose(GObject *object) { BtVolumePopup *popup = BT_VOLUME_POPUP(object); if (popup->timeout) { g_source_remove(popup->timeout); popup->timeout = 0; } G_OBJECT_CLASS(bt_volume_popup_parent_class)->dispose (object); } static void bt_volume_popup_class_init(BtVolumePopupClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->dispose = bt_volume_popup_dispose; } static void bt_volume_popup_init(BtVolumePopup *popup) { popup->timeout = 0; } buzztard-0.6.0/src/ui/edit/marshal.list0000644042355400116100000000002311624160240014755 00000000000000VOID:OBJECT,OBJECT buzztard-0.6.0/src/ui/edit/wire-canvas-item.c0000644042355400116100000010062411634640651015772 00000000000000/* $Id: wire-canvas-item.c 3642 2011-09-16 12:31:35Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btwirecanvasitem * @short_description: class for the editor wire views wire canvas item * @see_also: #BtSignalAnalysisDialog * * Provides volume control on the wires, as well as a menu to disconnect wires * and to launch the analyzer screen. */ /* @todo: mixer strip * - right now a click on the triangle pops up the volume or panorama slider * - it could popup a whole mixer strip (with level meters) * * @todo: add "insert effect" to context menu * - could use the machine menu and work simillar to connect menu on canvas * - would turn existing wire into 2nd wire to preserve wirepatterns * * @todo: dialog manager * - see machine-canvas-item.c */ #define BT_EDIT #define BT_WIRE_CANVAS_ITEM_C #include "bt-edit.h" //-- property ids enum { WIRE_CANVAS_ITEM_MACHINES_PAGE=1, WIRE_CANVAS_ITEM_WIRE, WIRE_CANVAS_ITEM_W, WIRE_CANVAS_ITEM_H, WIRE_CANVAS_ITEM_SRC, WIRE_CANVAS_ITEM_DST, WIRE_CANVAS_ITEM_ANALYSIS_DIALOG }; // @todo what do we set here? canvas dimensions? #define BT_WIRE_MAX_EXTEND 100000.0 struct _BtWireCanvasItemPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the machine page we are on */ G_POINTER_ALIAS(BtMainPageMachines *,main_page_machines); /* the underlying wire */ BtWire *wire; /* and its properties */ GHashTable *properties; /* gain and pan elements for monitoring */ GstElement *wire_gain,*wire_pan; /* end-points of the wire, relative to the group x,y pos */ gdouble w,h; /* source and dst machine canvas item */ BtMachineCanvasItem *src,*dst; /* the graphcal components */ GnomeCanvasItem *line,*triangle; GnomeCanvasItem *vol_item,*pan_item; GnomeCanvasItem *vol_level_item,*pan_pos_item; /* wire context_menu */ GtkMenu *context_menu; /* the analysis dialog */ GtkWidget *analysis_dialog; /* interaction state */ gboolean dragging,moved; gdouble offx,offy,dragx,dragy; }; static GQuark wire_canvas_item_quark=0; //-- the class G_DEFINE_TYPE (BtWireCanvasItem, bt_wire_canvas_item, GNOME_TYPE_CANVAS_GROUP); //-- prototypes static void on_signal_analysis_dialog_destroy(GtkWidget *widget, gpointer user_data); //-- helper static void wire_set_line_points(BtWireCanvasItem *self) { GnomeCanvasPoints *points; points=gnome_canvas_points_new(2); points->coords[0]=0.0; points->coords[1]=0.0; points->coords[2]=self->priv->w; points->coords[3]=self->priv->h; gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->line),"points",points,NULL); gnome_canvas_points_free(points); } /* * add a triangle pointing from src to dest at the middle of the wire */ static void wire_set_triangle_points(BtWireCanvasItem *self) { GnomeCanvasPoints *points; gdouble w=self->priv->w,h=self->priv->h; gdouble mid_x,mid_y; gdouble part_x,part_y; gdouble tip1_x,tip1_y; gdouble base_x,base_y; gdouble base11_x,base11_y; gdouble base12_x,base12_y; gdouble base21_x,base21_y; gdouble base22_x,base22_y; gdouble df,dx,dy,s=MACHINE_VIEW_WIRE_PAD_SIZE,s2=s+s,sa,sb; // middle of wire mid_x=w/2.0; mid_y=h/2.0; // normalized ascent (gradient, slope) of the wire if((fabs(w)>G_MINDOUBLE) && (fabs(h)>G_MINDOUBLE)) { df=sqrt(w*w+h*h);dx=w/df;dy=h/df; } else if(fabs(w)>G_MINDOUBLE) { dx=1.0; dy=0.0; //df=w; } else if(fabs(h)>G_MINDOUBLE) { dx=0.0; dy=1.0; //df=h; } else { dx=dy=0.0; //df=0.0; } // first triangle part_x=mid_x+(s2*dx); part_y=mid_y+(s2*dy); // tip of triangle tip1_x=part_x+(s2*dx); tip1_y=part_y+(s2*dy); // intersection point of triangle base base_x=part_x-(s*dx); base_y=part_y-(s*dy); sa=3.0*s; sb=sa/sqrt(3.0); // point under the line base11_x=base_x-(sb*dy); base11_y=base_y+(sb*dx); // point over the line base12_x=base_x+(sb*dy); base12_y=base_y-(sb*dx); // second triangle part_x=mid_x-(s2*dx); part_y=mid_y-(s2*dy); // intersection point of triangle base base_x=part_x-(s*dx); base_y=part_y-(s*dy); sa=3.0*s; sb=sa/sqrt(3.0); // point under the line base21_x=base_x-(sb*dy); base21_y=base_y+(sb*dx); // point over the line base22_x=base_x+(sb*dy); base22_y=base_y-(sb*dx); /* // debug GST_DEBUG(" delta=%f,%f, s=%f, sa=%f sb=%f",dx,dy,s,sa,sb); GST_DEBUG(" w/h=%f,%f",w,h); GST_DEBUG(" mid=%f,%f",mid_x,mid_y); GST_DEBUG(" tip1=%f,%f",tip1_x,tip_y); GST_DEBUG(" base=%f,%f",base_x,base_y); GST_DEBUG(" base1=%f,%f",base11_x,base11_y); GST_DEBUG(" base2=%f,%f",base12_x,base12_y); */ points=gnome_canvas_points_new(5); points->coords[0]=base11_x; points->coords[1]=base11_y; points->coords[2]=tip1_x; points->coords[3]=tip1_y; points->coords[4]=base12_x; points->coords[5]=base12_y; points->coords[6]=base22_x; points->coords[7]=base22_y; points->coords[8]=base21_x; points->coords[9]=base21_y; gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->triangle),"points",points,NULL); gnome_canvas_points_free(points); gdouble ang=-M_PI_2+atan2(dx,dy); gdouble affine[]={cos(ang),-sin(ang),sin(ang),cos(ang),0.0,0.0}; gnome_canvas_item_affine_absolute(GNOME_CANVAS_ITEM(self->priv->vol_item),affine); gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->vol_item), "x",mid_x, "y",mid_y, NULL); gnome_canvas_item_affine_absolute(GNOME_CANVAS_ITEM(self->priv->pan_item),affine); gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->pan_item), "x",mid_x, "y",mid_y, NULL); } static void show_wire_analyzer_dialog(BtWireCanvasItem *self) { if(!self->priv->analysis_dialog) { self->priv->analysis_dialog=GTK_WIDGET(bt_signal_analysis_dialog_new(GST_BIN(self->priv->wire))); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->analysis_dialog)); GST_INFO("analyzer dialog opened"); // remember open/closed state g_hash_table_insert(self->priv->properties,g_strdup("analyzer-shown"),g_strdup("1")); g_signal_connect(self->priv->analysis_dialog,"destroy",G_CALLBACK(on_signal_analysis_dialog_destroy),(gpointer)self); g_object_notify((GObject *)self,"analysis-dialog"); } gtk_window_present(GTK_WINDOW(self->priv->analysis_dialog)); } //-- event handler static void on_signal_analysis_dialog_destroy(GtkWidget *widget, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); GST_INFO("signal analysis dialog destroy occurred"); self->priv->analysis_dialog=NULL; g_object_notify((GObject *)self,"analysis-dialog"); // remember open/closed state g_hash_table_remove(self->priv->properties,"analyzer-shown"); } static void on_machine_removed(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); BtMachine *src,*dst; g_return_if_fail(BT_IS_MACHINE(machine)); g_object_get(self->priv->src,"machine",&src,NULL); g_object_get(self->priv->dst,"machine",&dst,NULL); GST_INFO("machine %p,machine->ref_ct=%d has been removed, checking wire %p->%p", machine,G_OBJECT_REF_COUNT(machine),src,dst); if((src==machine) || (dst==machine) || (src==NULL) || (dst==NULL)) { GST_INFO("the machine, this wire is connected to, has been removed"); bt_setup_remove_wire(setup,self->priv->wire); GST_INFO("... machine %p,ref_ct=%d has been removed, src %p,ref=%d, dst %p,ref=%d", machine,G_OBJECT_REF_COUNT(machine), src,G_OBJECT_REF_COUNT(src), dst,G_OBJECT_REF_COUNT(dst) ); } g_object_try_unref(src); g_object_try_unref(dst); } static void on_wire_src_position_changed(BtMachineCanvasItem *machine_item, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); gdouble px,py; gdouble wx,wy,ww,wh; gdouble dx,dy; g_object_get(machine_item,"x",&px,"y",&py,NULL); g_object_get(self,"x",&wx,"y",&wy,"w",&ww,"h",&wh,NULL); dx=wx-px; dy=wy-py; g_object_set(self,"x",px,"y",py,"w",ww+dx,"h",wh+dy,NULL); // we need to reset all the coords for our wire items now wire_set_line_points(self); wire_set_triangle_points(self); } static void on_wire_dst_position_changed(BtMachineCanvasItem *machine_item, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); gdouble px,py; gdouble wx,wy; g_object_get(machine_item,"x",&px,"y",&py,NULL); g_object_get(self,"x",&wx,"y",&wy,NULL); g_object_set(self,"x",wx,"y",wy,"w",px-wx,"h",py-wy,NULL); // we need to reset all the coords for our wire items now wire_set_line_points(self); wire_set_triangle_points(self); } static void on_context_menu_disconnect_activate(GtkMenuItem *menuitem,gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); bt_main_page_machines_delete_wire(self->priv->main_page_machines,self->priv->wire); } static void on_context_menu_analysis_activate(GtkMenuItem *menuitem,gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); show_wire_analyzer_dialog(self); } static void on_gain_changed(GstElement *element, GParamSpec *arg, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); gdouble s=MACHINE_VIEW_WIRE_PAD_SIZE,ox=2.5*s,px=-ox+(1.3*s); gdouble gain; g_object_get(self->priv->wire_gain,"volume",&gain,NULL); // do some sensible clamping if(gain>4.0) gain=4.0; gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->vol_level_item),"x2", px+(gain*0.55*s),NULL); } static void on_pan_changed(GstElement *element, GParamSpec *arg, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); gdouble s=MACHINE_VIEW_WIRE_PAD_SIZE,ox=2.5*s,px=-ox+(1.3*s); gfloat pan; g_object_get(self->priv->wire_pan,"panorama",&pan,NULL); if(pan<0.0) { gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->pan_pos_item), "x1", px+((1.0+pan)*1.1*s), "x2", px+(1.1*s), NULL); } else { gnome_canvas_item_set(GNOME_CANVAS_ITEM(self->priv->pan_pos_item), "x1", px+(1.1*s), "x2", px+(1.1*s)+(pan*1.1*s), NULL); } } static void on_wire_pan_changed(GstElement *element, GParamSpec *arg, gpointer user_data) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(user_data); g_object_get(self->priv->wire,"pan",&self->priv->wire_pan,NULL); g_signal_connect(self->priv->wire_pan,"notify::panorama",G_CALLBACK(on_pan_changed),(gpointer)self); // @todo: need to change colors of the pan-icon } //-- helper methods //-- constructor methods /** * bt_wire_canvas_item_new: * @main_page_machines: the machine page the new item belongs to * @wire: the wire for which a canvas item should be created * @pos_xs: the horizontal start location * @pos_ys: the vertical start location * @pos_xe: the horizontal end location * @pos_ye: the vertical end location * @src_machine_item: the machine item at start * @dst_machine_item: the machine item at end * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtWireCanvasItem *bt_wire_canvas_item_new(const BtMainPageMachines *main_page_machines,BtWire *wire,gdouble pos_xs,gdouble pos_ys,gdouble pos_xe,gdouble pos_ye,BtMachineCanvasItem *src_machine_item,BtMachineCanvasItem *dst_machine_item) { BtWireCanvasItem *self; GnomeCanvas *canvas; BtSong *song; BtSetup *setup; gdouble w,h; g_object_get((gpointer)main_page_machines,"canvas",&canvas,NULL); w=(pos_xe-pos_xs); h=(pos_ye-pos_ys); /* @todo: if we clip agains BT_WIRE_MAX_EXTEND here, the wire will look bad */ self=BT_WIRE_CANVAS_ITEM(gnome_canvas_item_new(gnome_canvas_root(canvas), BT_TYPE_WIRE_CANVAS_ITEM, "machines-page",main_page_machines, "wire", wire, "x", pos_xs, "y", pos_ys, "w", w, "h", h, "src", src_machine_item, "dst", dst_machine_item, NULL)); gnome_canvas_item_lower_to_bottom(GNOME_CANVAS_ITEM(self)); g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); g_signal_connect(setup,"machine-removed",G_CALLBACK(on_machine_removed),(gpointer)self); //GST_INFO("wire canvas item added"); g_object_unref(setup); g_object_unref(song); g_object_unref(canvas); return(self); } //-- methods /** * bt_wire_show_analyzer_dialog: * @wire: wire to show the dialog for * * Shows the wire analyzer dialog. * * Since: 0.6 */ void bt_wire_show_analyzer_dialog(BtWire *wire) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(g_object_get_qdata((GObject *)wire,wire_canvas_item_quark)); show_wire_analyzer_dialog(self); } //-- wrapper //-- class internals static void bt_wire_canvas_item_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtWireCanvasItem *self = BT_WIRE_CANVAS_ITEM(object); return_if_disposed(); switch (property_id) { case WIRE_CANVAS_ITEM_MACHINES_PAGE: { g_value_set_object(value, self->priv->main_page_machines); } break; case WIRE_CANVAS_ITEM_WIRE: { g_value_set_object(value, self->priv->wire); } break; case WIRE_CANVAS_ITEM_W: { g_value_set_double(value, self->priv->w); } break; case WIRE_CANVAS_ITEM_H: { g_value_set_double(value, self->priv->h); } break; case WIRE_CANVAS_ITEM_SRC: { g_value_set_object(value, self->priv->src); } break; case WIRE_CANVAS_ITEM_DST: { g_value_set_object(value, self->priv->dst); } break; case WIRE_CANVAS_ITEM_ANALYSIS_DIALOG: { g_value_set_object(value, self->priv->analysis_dialog); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wire_canvas_item_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtWireCanvasItem *self = BT_WIRE_CANVAS_ITEM(object); return_if_disposed(); switch (property_id) { case WIRE_CANVAS_ITEM_MACHINES_PAGE: { g_object_try_weak_unref(self->priv->main_page_machines); self->priv->main_page_machines = BT_MAIN_PAGE_MACHINES(g_value_get_object(value)); g_object_try_weak_ref(self->priv->main_page_machines); //GST_DEBUG("set the main_page_machines for wire_canvas_item: %p",self->priv->main_page_machines); } break; case WIRE_CANVAS_ITEM_WIRE: { g_object_try_unref(self->priv->wire); self->priv->wire=BT_WIRE(g_value_dup_object(value)); if(self->priv->wire) { //GST_DEBUG("set the wire for wire_canvas_item: %p",self->priv->wire); g_object_set_qdata((GObject *)self->priv->wire,wire_canvas_item_quark,(gpointer)self); g_object_get(self->priv->wire,"properties",&(self->priv->properties),NULL); } } break; case WIRE_CANVAS_ITEM_W: { self->priv->w=g_value_get_double(value); } break; case WIRE_CANVAS_ITEM_H: { self->priv->h=g_value_get_double(value); } break; case WIRE_CANVAS_ITEM_SRC: { if(self->priv->src) { g_signal_handlers_disconnect_matched(self->priv->src,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_src_position_changed,(gpointer)self); g_object_unref(self->priv->src); } self->priv->src=BT_MACHINE_CANVAS_ITEM(g_value_dup_object(value)); if(self->priv->src) { g_signal_connect(self->priv->src,"position-changed",G_CALLBACK(on_wire_src_position_changed),(gpointer)self); GST_DEBUG("set the src for wire_canvas_item: %p",self->priv->src); } } break; case WIRE_CANVAS_ITEM_DST: { if(self->priv->dst) { g_signal_handlers_disconnect_matched(self->priv->dst,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_dst_position_changed,(gpointer)self); g_object_unref(self->priv->dst); } self->priv->dst=BT_MACHINE_CANVAS_ITEM(g_value_dup_object(value)); if(self->priv->dst) { g_signal_connect(self->priv->dst,"position-changed",G_CALLBACK(on_wire_dst_position_changed),(gpointer)self); GST_DEBUG("set the dst for wire_canvas_item: %p",self->priv->dst); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_wire_canvas_item_dispose(GObject *object) { BtWireCanvasItem *self = BT_WIRE_CANVAS_ITEM(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); if(self->priv->src) { g_signal_handlers_disconnect_matched(self->priv->src,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_src_position_changed,(gpointer)self); } if(self->priv->dst) { g_signal_handlers_disconnect_matched(self->priv->dst,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_dst_position_changed,(gpointer)self); } g_object_get(self->priv->app,"song",&song,NULL); if(song) { BtSetup *setup; g_object_get(song,"setup",&setup,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_removed,(gpointer)self); g_object_unref(setup); g_object_unref(song); } if(self->priv->wire_gain) { g_signal_handlers_disconnect_matched(self->priv->wire_gain,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_gain_changed,(gpointer)self); g_object_unref(self->priv->wire_gain); } if(self->priv->wire_pan) { g_signal_handlers_disconnect_matched(self->priv->wire_pan,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pan_changed,(gpointer)self); g_object_unref(self->priv->wire_pan); } g_signal_handlers_disconnect_matched(self->priv->wire,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_wire_pan_changed,(gpointer)self); GST_DEBUG(" signal disconected"); g_object_try_unref(self->priv->wire); g_object_try_unref(self->priv->src); g_object_try_unref(self->priv->dst); g_object_try_weak_unref(self->priv->main_page_machines); g_object_unref(self->priv->app); GST_DEBUG(" unrefing done"); if(self->priv->analysis_dialog) { gtk_widget_destroy(self->priv->analysis_dialog); } gtk_widget_destroy(GTK_WIDGET(self->priv->context_menu)); g_object_unref(self->priv->context_menu); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_wire_canvas_item_parent_class)->dispose(object); GST_DEBUG(" done"); } /* * bt_wire_canvas_item_realize: * * draw something that looks a bit like a buzz-wire */ static void bt_wire_canvas_item_realize(GnomeCanvasItem *citem) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(citem); gchar *prop,*color1,*color2; GnomeCanvasPoints *points; gdouble s=MACHINE_VIEW_WIRE_PAD_SIZE,oy=0.25*s,ox=2.5*s,px; GNOME_CANVAS_ITEM_CLASS(bt_wire_canvas_item_parent_class)->realize(citem); GST_DEBUG("realize for wire occurred, wire=%p : w=%f,h=%f",self->priv->wire,self->priv->w,self->priv->h); g_object_get(self->priv->wire,"gain",&self->priv->wire_gain,"pan",&self->priv->wire_pan,NULL); g_signal_connect(self->priv->wire_gain,"notify::volume",G_CALLBACK(on_gain_changed),(gpointer)self); if(self->priv->wire_pan) { g_signal_connect(self->priv->wire_pan,"notify::panorama",G_CALLBACK(on_pan_changed),(gpointer)self); } else { g_signal_connect(self->priv->wire,"notify::pan",G_CALLBACK(on_wire_pan_changed),(gpointer)self); } self->priv->line=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_LINE, "fill-color", "black", "width-pixels", 1, NULL); wire_set_line_points(self); self->priv->triangle=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_POLYGON, "outline-color", "black", "fill-color", "gray", "width-pixels", 1, NULL); // for the colors - grep "gray" /usr/share/X11/rgb.txt self->priv->vol_item=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_GROUP,NULL); points=gnome_canvas_points_new(6); points->coords[ 0]=-ox+0.0; points->coords[ 1]=-oy-0.25*s; points->coords[ 2]=-ox+0.6*s;points->coords[ 3]=-oy-0.25*s; points->coords[ 4]=-ox+1.0*s;points->coords[ 5]=-oy-0.0; points->coords[ 6]=-ox+1.0*s;points->coords[ 7]=-oy-1.0*s; points->coords[ 8]=-ox+0.6*s;points->coords[ 9]=-oy-0.75*s; points->coords[10]=-ox+0.0; points->coords[11]=-oy-0.75*s; gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->vol_item), GNOME_TYPE_CANVAS_POLYGON, "points", points, "outline-color", "gray16", "fill-color", "gray32", "width-pixels", 1, NULL); gnome_canvas_points_free(points); px=-ox+(1.3*s); gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->vol_item), GNOME_TYPE_CANVAS_RECT, "x1", px, "y1", -oy-0.2*s, "x2", px+(2.2*s), "y2", -oy-0.8*s, "fill-color", "gray48", "width-pixels", 0, NULL); self->priv->vol_level_item=gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->vol_item), GNOME_TYPE_CANVAS_RECT, "x1", px, "y1", -oy-0.2*s, "x2", px, "y2", -oy-0.8*s, "fill-color", "gray16", "width-pixels", 0, NULL); on_gain_changed(self->priv->wire_gain,NULL,(gpointer)self); // check if wire has PAN and set color accordingly if(self->priv->wire_pan) { color1="gray16";color2="gray32"; } else { color1="gray48";color2="gray64"; } self->priv->pan_item=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_GROUP,NULL); points=gnome_canvas_points_new(3); points->coords[ 0]=-ox+0.3*s;points->coords[ 1]=oy+0.0; points->coords[ 2]=-ox+0.3*s;points->coords[ 3]=oy+1.0*s; points->coords[ 4]=-ox+0.0 ;points->coords[ 5]=oy+0.5*s; gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->pan_item), GNOME_TYPE_CANVAS_POLYGON, "points", points, "outline-color", color1, "fill-color", color2, "width-pixels", 1, NULL); points->coords[ 0]=-ox+0.7*s;points->coords[ 1]=oy+0.0; points->coords[ 2]=-ox+0.7*s;points->coords[ 3]=oy+1.0*s; points->coords[ 4]=-ox+1.0*s;points->coords[ 5]=oy+0.5*s; gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->pan_item), GNOME_TYPE_CANVAS_POLYGON, "points", points, "outline-color", color1, "fill-color", color2, "width-pixels", 1, NULL); gnome_canvas_points_free(points); px=-ox+(1.3*s); gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->pan_item), GNOME_TYPE_CANVAS_RECT, "x1", px, "y1", oy+0.2*s, "x2", px+(2.2*s), "y2", oy+0.8*s, "fill-color", "gray48", "width-pixels", 0, NULL); if(self->priv->wire_pan) { self->priv->pan_pos_item=gnome_canvas_item_new(GNOME_CANVAS_GROUP(self->priv->pan_item), GNOME_TYPE_CANVAS_RECT, "x1", px+(1.1*s), "y1", oy+0.2*s, "x2", px+(1.1*s), "y2", oy+0.8*s, "fill-color", "gray16", "width-pixels", 0, NULL); on_pan_changed(self->priv->wire_pan,NULL,(gpointer)self); } wire_set_triangle_points(self); prop=(gchar *)g_hash_table_lookup(self->priv->properties,"analyzer-shown"); if(prop && prop[0]=='1' && prop[1]=='\0') { if((self->priv->analysis_dialog=GTK_WIDGET(bt_signal_analysis_dialog_new(GST_BIN(self->priv->wire))))) { bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->analysis_dialog)); g_signal_connect(self->priv->analysis_dialog,"destroy",G_CALLBACK(on_signal_analysis_dialog_destroy),(gpointer)self); } } //item->realized = TRUE; } static gboolean bt_wire_canvas_item_event(GnomeCanvasItem *citem, GdkEvent *event) { BtWireCanvasItem *self=BT_WIRE_CANVAS_ITEM(citem); gboolean res=FALSE; //GST_DEBUG("event for wire occurred"); switch(event->type) { case GDK_BUTTON_PRESS: GST_DEBUG("GDK_BUTTON_PRESS: %d",event->button.button); if(event->button.button==1) { GST_INFO("showing volume-popup at %lf,%lf %lf,%lf", event->button.x,event->button.y, event->button.x_root,event->button.y_root); if(!(event->button.state&GDK_SHIFT_MASK)) { bt_main_page_machines_wire_volume_popup(self->priv->main_page_machines, self->priv->wire, (gint)event->button.x_root, (gint)event->button.y_root); } else { bt_main_page_machines_wire_panorama_popup(self->priv->main_page_machines, self->priv->wire, (gint)event->button.x_root, (gint)event->button.y_root); } res=TRUE; } else if(event->button.button==3) { // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } break; case GDK_MOTION_NOTIFY: //GST_DEBUG("GDK_MOTION_NOTIFY: %f,%f",event->button.x,event->button.y); break; case GDK_BUTTON_RELEASE: GST_DEBUG("GDK_BUTTON_RELEASE: %d",event->button.button); break; case GDK_KEY_RELEASE: GST_DEBUG("GDK_KEY_RELEASE: %d",event->key.keyval); switch(event->key.keyval) { case GDK_Menu: // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; break; default: break; } break; default: break; } /* we don't want the click falling through to the parent canvas item, if we have handled it */ if(!res) { if(GNOME_CANVAS_ITEM_CLASS(bt_wire_canvas_item_parent_class)->event) { res=(GNOME_CANVAS_ITEM_CLASS(bt_wire_canvas_item_parent_class)->event)(citem,event); } } return res; } static void bt_wire_canvas_item_init(BtWireCanvasItem *self) { GtkWidget *menu_item; self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_WIRE_CANVAS_ITEM, BtWireCanvasItemPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); // generate the context menu self->priv->context_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); menu_item=gtk_menu_item_new_with_label(_("Disconnect")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_disconnect_activate),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_menu_item_new_with_label(_("Signal Analysis...")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_analysis_activate),(gpointer)self); } static void bt_wire_canvas_item_class_init(BtWireCanvasItemClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GnomeCanvasItemClass *citem_class=GNOME_CANVAS_ITEM_CLASS(klass); wire_canvas_item_quark=g_quark_from_static_string("wire-canvas-item"); g_type_class_add_private(klass,sizeof(BtWireCanvasItemPrivate)); gobject_class->set_property = bt_wire_canvas_item_set_property; gobject_class->get_property = bt_wire_canvas_item_get_property; gobject_class->dispose = bt_wire_canvas_item_dispose; citem_class->realize = bt_wire_canvas_item_realize; citem_class->event = bt_wire_canvas_item_event; g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_MACHINES_PAGE, g_param_spec_object("machines-page", "machines-page contruct prop", "Set application object, the window belongs to", BT_TYPE_MAIN_PAGE_MACHINES, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_WIRE, g_param_spec_object("wire", "wire contruct prop", "Set wire object, the item belongs to", BT_TYPE_WIRE, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_W, g_param_spec_double("w", "width prop", "width of the wire", -BT_WIRE_MAX_EXTEND, BT_WIRE_MAX_EXTEND, 1.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_H, g_param_spec_double("h", "height prop", "height of the wire", -BT_WIRE_MAX_EXTEND, BT_WIRE_MAX_EXTEND, 1.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_SRC, g_param_spec_object("src", "src contruct prop", "Set wire src machine canvas item", BT_TYPE_MACHINE_CANVAS_ITEM, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_DST, g_param_spec_object("dst", "dst contruct prop", "Set wire dst machine canvas item", BT_TYPE_MACHINE_CANVAS_ITEM, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,WIRE_CANVAS_ITEM_ANALYSIS_DIALOG, g_param_spec_object("analysis-dialog", "analysis dialog prop", "Get the the analysis dialog if shown", BT_TYPE_SIGNAL_ANALYSIS_DIALOG, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/interaction-controller-learn-dialog.c0000644042355400116100000002167311634646053021663 00000000000000/* $Id: interaction-controller-learn-dialog.c 3645 2011-09-16 13:16:25Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btinteractioncontrollerlearndialog * @short_description: learn dialog for interaction devices * * A dialog to prompt the user for an interaction controller assignment. */ /* @todo: having okay & assign would be nice * @todo: having a way to train multiple controllers would be nice * - we could have: okay, okay & assign, okay & learn more, cancel */ #define BT_EDIT #define BT_INTERACTION_CONTROLLER_LEARN_DIALOG_C #include "bt-edit.h" //-- property ids enum { LEARN_DIALOG_DEVICE=1 }; struct _BtInteractionControllerLearnDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; G_POINTER_ALIAS(BtIcDevice *,device); GtkWidget *label_output, *entry_name; /* dialog widgets */ GtkWidget *okay_button; }; //-- the class G_DEFINE_TYPE (BtInteractionControllerLearnDialog, bt_interaction_controller_learn_dialog, GTK_TYPE_DIALOG); //-- event handler static void notify_device_controlchange(const BtIcLearn* learn, GParamSpec *arg, const BtInteractionControllerLearnDialog *user_data) { gchar *control; BtInteractionControllerLearnDialog *self=BT_INTERACTION_CONTROLLER_LEARN_DIALOG(user_data); g_object_get(BTIC_LEARN(learn), "device-controlchange", &control, NULL); gtk_label_set_text(GTK_LABEL(self->priv->label_output), control); gtk_entry_set_text(GTK_ENTRY(self->priv->entry_name), control); gtk_editable_select_region(GTK_EDITABLE(self->priv->entry_name),0,-1); gtk_widget_set_sensitive(self->priv->okay_button,TRUE); g_free(control); } static void on_dialog_response(GtkDialog *dialog, gint signal, const BtInteractionControllerLearnDialog *user_data) { BtInteractionControllerLearnDialog *self=BT_INTERACTION_CONTROLLER_LEARN_DIALOG(user_data); switch(signal) { case GTK_RESPONSE_ACCEPT: //GST_INFO("learn dialog okay"); btic_learn_register_learned_control(BTIC_LEARN(self->priv->device), gtk_entry_get_text(GTK_ENTRY(self->priv->entry_name))); break; case GTK_RESPONSE_REJECT: //GST_INFO("learn dialog cancel"); break; } GST_DEBUG("object: %p ref_ct=%d)",self->priv->device,G_OBJECT_REF_COUNT(self->priv->device)); btic_learn_stop(BTIC_LEARN(self->priv->device)); gtk_widget_destroy(GTK_WIDGET(dialog)); GST_DEBUG("object: %p ref_ct=%d)",self->priv->device,G_OBJECT_REF_COUNT(self->priv->device)); } //-- helper methods static void bt_interaction_controller_learn_dialog_init_ui(const BtInteractionControllerLearnDialog *self) { GtkWidget *label,*box,*table; gchar *name,*title; #if !GTK_CHECK_VERSION(2,20,0) GList *buttons; #endif gtk_widget_set_name(GTK_WIDGET(self),"interaction controller learn"); g_object_get(self->priv->device,"name",&name,NULL); // set dialog title title=g_strdup_printf(_("learn controller for %s"),name); gtk_window_set_title(GTK_WINDOW(self), title); g_free(name);g_free(title); gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // grab okay button, so that we can block if input is not valid #if GTK_CHECK_VERSION(2,20,0) self->priv->okay_button=gtk_dialog_get_widget_for_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); #else buttons=gtk_container_get_children(GTK_CONTAINER(gtk_dialog_get_action_area(GTK_DIALOG(self)))); self->priv->okay_button=GTK_WIDGET(g_list_nth_data(buttons,1)); g_list_free(buttons); #endif gtk_widget_set_sensitive(self->priv->okay_button,FALSE); // add widgets to the dialog content area box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); label=gtk_label_new(_("Move or press a controller to detect it.")); gtk_container_add(GTK_CONTAINER(box),label); table=gtk_table_new(/*rows=*/2,/*columns=*/2,/*homogenous=*/FALSE); gtk_container_add(GTK_CONTAINER(box),table); label=gtk_label_new(_("detected control")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); self->priv->label_output=gtk_label_new(_("none")); gtk_misc_set_alignment(GTK_MISC(self->priv->label_output),0.0,0.5); gtk_table_attach(GTK_TABLE(table),self->priv->label_output, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); label=gtk_label_new(_("register as")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); self->priv->entry_name=gtk_entry_new(); gtk_entry_set_activates_default(GTK_ENTRY(self->priv->entry_name),TRUE); gtk_table_attach(GTK_TABLE(table),self->priv->entry_name, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->device, "notify::device-controlchange", G_CALLBACK(notify_device_controlchange), (gpointer)self); g_signal_connect(GTK_DIALOG(self), "response", G_CALLBACK(on_dialog_response), (gpointer)self); GST_INFO("BtInteractionControllerLearnDialog ui initialized"); btic_learn_start(BTIC_LEARN(self->priv->device)); } //-- constructor methods /** * bt_interaction_controller_learn_dialog_new: * @device: the device of which the learn events are monitored * * Create a new instance. * * Returns: the new instance */ BtInteractionControllerLearnDialog *bt_interaction_controller_learn_dialog_new(BtIcDevice *device) { BtInteractionControllerLearnDialog *self; self=BT_INTERACTION_CONTROLLER_LEARN_DIALOG(g_object_new(BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG,"device",device,NULL)); bt_interaction_controller_learn_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_interaction_controller_learn_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtInteractionControllerLearnDialog *self = BT_INTERACTION_CONTROLLER_LEARN_DIALOG(object); return_if_disposed(); switch (property_id) { case LEARN_DIALOG_DEVICE: { g_object_try_weak_unref(self->priv->device); self->priv->device = BTIC_DEVICE(g_value_get_object(value)); g_object_try_weak_ref(self->priv->device); //GST_DEBUG("set the device for learn_dialog: %p",self->priv->device); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_interaction_controller_learn_dialog_dispose(GObject *object) { BtInteractionControllerLearnDialog *self = BT_INTERACTION_CONTROLLER_LEARN_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->device); g_signal_handlers_disconnect_matched(self->priv->device,G_SIGNAL_MATCH_FUNC,0,0,NULL,notify_device_controlchange,NULL); G_OBJECT_CLASS(bt_interaction_controller_learn_dialog_parent_class)->dispose(object); } static void bt_interaction_controller_learn_dialog_init(BtInteractionControllerLearnDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_INTERACTION_CONTROLLER_LEARN_DIALOG, BtInteractionControllerLearnDialogPrivate); } static void bt_interaction_controller_learn_dialog_class_init(BtInteractionControllerLearnDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtInteractionControllerLearnDialogPrivate)); gobject_class->set_property = bt_interaction_controller_learn_dialog_set_property; gobject_class->dispose = bt_interaction_controller_learn_dialog_dispose; g_object_class_install_property(gobject_class,LEARN_DIALOG_DEVICE, g_param_spec_object("device", "device construct prop", "Set the device we want to snoop for a new controler", BTIC_TYPE_DEVICE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/pattern-properties-dialog.h0000644042355400116100000000510711625722250017724 00000000000000/* $Id: pattern-properties-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PATTERN_PROPERTIES_DIALOG_H #define BT_PATTERN_PROPERTIES_DIALOG_H #include #include #define BT_TYPE_PATTERN_PROPERTIES_DIALOG (bt_pattern_properties_dialog_get_type ()) #define BT_PATTERN_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PATTERN_PROPERTIES_DIALOG, BtPatternPropertiesDialog)) #define BT_PATTERN_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PATTERN_PROPERTIES_DIALOG, BtPatternPropertiesDialogClass)) #define BT_IS_PATTERN_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PATTERN_PROPERTIES_DIALOG)) #define BT_IS_PATTERN_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PATTERN_PROPERTIES_DIALOG)) #define BT_PATTERN_PROPERTIES_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PATTERN_PROPERTIES_DIALOG, BtPatternPropertiesDialogClass)) /* type macros */ typedef struct _BtPatternPropertiesDialog BtPatternPropertiesDialog; typedef struct _BtPatternPropertiesDialogClass BtPatternPropertiesDialogClass; typedef struct _BtPatternPropertiesDialogPrivate BtPatternPropertiesDialogPrivate; /** * BtPatternPropertiesDialog: * * the pattern settings dialog */ struct _BtPatternPropertiesDialog { GtkDialog parent; /*< private >*/ BtPatternPropertiesDialogPrivate *priv; }; struct _BtPatternPropertiesDialogClass { GtkDialogClass parent; }; GType bt_pattern_properties_dialog_get_type(void) G_GNUC_CONST; BtPatternPropertiesDialog *bt_pattern_properties_dialog_new(const BtPattern *pattern); void bt_pattern_properties_dialog_apply(const BtPatternPropertiesDialog *self); #endif // BT_PATTERN_PROPERTIES_DIALOG_H buzztard-0.6.0/src/ui/edit/main-toolbar.h0000644042355400116100000000414011625722250015200 00000000000000/* $Id: main-toolbar.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_TOOLBAR_H #define BT_MAIN_TOOLBAR_H #include #include #define BT_TYPE_MAIN_TOOLBAR (bt_main_toolbar_get_type ()) #define BT_MAIN_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_TOOLBAR, BtMainToolbar)) #define BT_MAIN_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_TOOLBAR, BtMainToolbarClass)) #define BT_IS_MAIN_TOOLBAR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_TOOLBAR)) #define BT_IS_MAIN_TOOLBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_TOOLBAR)) #define BT_MAIN_TOOLBAR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_TOOLBAR, BtMainToolbarClass)) /* type macros */ typedef struct _BtMainToolbar BtMainToolbar; typedef struct _BtMainToolbarClass BtMainToolbarClass; typedef struct _BtMainToolbarPrivate BtMainToolbarPrivate; /** * BtMainToolbar: * * the main toolbar for the editor application */ struct _BtMainToolbar { GtkToolbar parent; /*< private >*/ BtMainToolbarPrivate *priv; }; struct _BtMainToolbarClass { GtkToolbarClass parent; }; GType bt_main_toolbar_get_type(void) G_GNUC_CONST; BtMainToolbar *bt_main_toolbar_new(void); #endif // BT_MAIN_TOOLBAR_H buzztard-0.6.0/src/ui/edit/btmemoryaudiosrc.h0000644042355400116100000000470211623461704016212 00000000000000/* $Id: btmemoryaudiosrc.h 3552 2011-08-19 13:23:12Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __BT_MEMORY_AUDIO_SRC_H__ #define __BT_MEMORY_AUDIO_SRC_H__ #include #include #include G_BEGIN_DECLS #define BT_TYPE_MEMORY_AUDIO_SRC \ (bt_memory_audio_src_get_type()) #define BT_MEMORY_AUDIO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),BT_TYPE_MEMORY_AUDIO_SRC,BtMemoryAudioSrc)) #define BT_MEMORY_AUDIO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),BT_TYPE_MEMORY_AUDIO_SRC,BtMemoryAudioSrcClass)) #define BT_IS_MEMORY_AUDIO_SRC(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),BT_TYPE_MEMORY_AUDIO_SRC)) #define BT_IS_MEMORY_AUDIO_SRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),BT_TYPE_MEMORY_AUDIO_SRC)) typedef struct _BtMemoryAudioSrc BtMemoryAudioSrc; typedef struct _BtMemoryAudioSrcClass BtMemoryAudioSrcClass; /** * BtMemoryAudioSrc: * * audiotestsrc object structure. */ struct _BtMemoryAudioSrc { GstBaseSrc parent; /* parameters */ GstCaps *caps; gint16 *data; gulong length; gint samples_per_buffer; /* block size ? */ /* audio parameters */ gint samplerate; gint channels; gint width; /*< private >*/ GstClockTime running_time; /* total running time */ gint64 n_samples; /* total samples sent */ gint64 n_samples_stop; gboolean check_seek_stop; gboolean eos_reached; gdouble rate; gint generate_samples_per_buffer; /* used to generate a partial buffer */ }; struct _BtMemoryAudioSrcClass { GstBaseSrcClass parent_class; }; GType bt_memory_audio_src_get_type (void); G_END_DECLS #endif /* __BT_MEMORY_AUDIO_SRC_H__ */ buzztard-0.6.0/src/ui/edit/main-page-patterns.h0000644042355400116100000000544211625722250016316 00000000000000/* $Id: main-page-patterns.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGE_PATTERNS_H #define BT_MAIN_PAGE_PATTERNS_H #include #include #define BT_TYPE_MAIN_PAGE_PATTERNS (bt_main_page_patterns_get_type ()) #define BT_MAIN_PAGE_PATTERNS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGE_PATTERNS, BtMainPagePatterns)) #define BT_MAIN_PAGE_PATTERNS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGE_PATTERNS, BtMainPagePatternsClass)) #define BT_IS_MAIN_PAGE_PATTERNS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGE_PATTERNS)) #define BT_IS_MAIN_PAGE_PATTERNS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGE_PATTERNS)) #define BT_MAIN_PAGE_PATTERNS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGE_PATTERNS, BtMainPagePatternsClass)) /* type macros */ typedef struct _BtMainPagePatterns BtMainPagePatterns; typedef struct _BtMainPagePatternsClass BtMainPagePatternsClass; typedef struct _BtMainPagePatternsPrivate BtMainPagePatternsPrivate; /** * BtMainPagePatterns: * * the pattern page for the editor application */ struct _BtMainPagePatterns { GtkVBox parent; /*< private >*/ BtMainPagePatternsPrivate *priv; }; struct _BtMainPagePatternsClass { GtkVBoxClass parent; }; GType bt_main_page_patterns_get_type(void) G_GNUC_CONST; #include "main-pages.h" BtMainPagePatterns *bt_main_page_patterns_new(const BtMainPages *pages); void bt_main_page_patterns_show_pattern(const BtMainPagePatterns *self,BtPattern *pattern); void bt_main_page_patterns_show_machine(const BtMainPagePatterns *self,BtMachine *machine); void bt_main_page_patterns_delete_selection(const BtMainPagePatterns *self); void bt_main_page_patterns_cut_selection(const BtMainPagePatterns *self); void bt_main_page_patterns_copy_selection(const BtMainPagePatterns *self); void bt_main_page_patterns_paste_selection(const BtMainPagePatterns *self); #endif // BT_MAIN_PAGE_PATTERNS_H buzztard-0.6.0/src/ui/edit/about-dialog.h0000644042355400116100000000415011625722250015164 00000000000000/* $Id: about-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_ABOUT_DIALOG_H #define BT_ABOUT_DIALOG_H #include #include #define BT_TYPE_ABOUT_DIALOG (bt_about_dialog_get_type ()) #define BT_ABOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_ABOUT_DIALOG, BtAboutDialog)) #define BT_ABOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_ABOUT_DIALOG, BtAboutDialogClass)) #define BT_IS_ABOUT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_ABOUT_DIALOG)) #define BT_IS_ABOUT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_ABOUT_DIALOG)) #define BT_ABOUT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_ABOUT_DIALOG, BtAboutDialogClass)) /* type macros */ typedef struct _BtAboutDialog BtAboutDialog; typedef struct _BtAboutDialogClass BtAboutDialogClass; typedef struct _BtAboutDialogPrivate BtAboutDialogPrivate; /** * BtAboutDialog: * * the about dialog for the editor application */ struct _BtAboutDialog { GtkAboutDialog parent; /*< private >*/ BtAboutDialogPrivate *priv; }; struct _BtAboutDialogClass { GtkAboutDialogClass parent; }; GType bt_about_dialog_get_type(void) G_GNUC_CONST; BtAboutDialog *bt_about_dialog_new(void); #endif // BT_ABOUT_DIALOG_H buzztard-0.6.0/src/ui/edit/settings-page-playback-controller.h0000644042355400116100000000533411625722250021341 00000000000000/* $Id: settings-page-playback-controller.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_H #define BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_H #include #include #define BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER (bt_settings_page_playback_controller_get_type ()) #define BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER, BtSettingsPagePlaybackController)) #define BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER, BtSettingsPagePlaybackControllerClass)) #define BT_IS_SETTINGS_PAGE_PLAYBACK_CONTROLLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER)) #define BT_IS_SETTINGS_PAGE_PLAYBACK_CONTROLLER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER)) #define BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_PAGE_PLAYBACK_CONTROLLER, BtSettingsPagePlaybackControllerClass)) /* type macros */ typedef struct _BtSettingsPagePlaybackController BtSettingsPagePlaybackController; typedef struct _BtSettingsPagePlaybackControllerClass BtSettingsPagePlaybackControllerClass; typedef struct _BtSettingsPagePlaybackControllerPrivate BtSettingsPagePlaybackControllerPrivate; /** * BtSettingsPagePlaybackController: * * the root window for the editor application */ struct _BtSettingsPagePlaybackController { GtkTable parent; /*< private >*/ BtSettingsPagePlaybackControllerPrivate *priv; }; struct _BtSettingsPagePlaybackControllerClass { GtkTableClass parent; }; GType bt_settings_page_playback_controller_get_type(void) G_GNUC_CONST; BtSettingsPagePlaybackController *bt_settings_page_playback_controller_new(void); #endif // BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER_H buzztard-0.6.0/src/ui/edit/missing-framework-elements-dialog.c0000644042355400116100000003046411576360376021346 00000000000000/* $Id: missing-framework-elements-dialog.c 2992 2010-09-20 19:40:18Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmissingframeworkelementsdialog * @short_description: missing core and application elements * * A dialog to inform about missing core and application elements. */ /* * @todo: support gst-codec-install * Since gst-plugin-base-0.10.15 there is gst_install_plugins_supported(). * If is supported we could do: * * GstInstallPluginsReturn result; * gchar *details[] = { * gst_missing_element_installer_detail_new(factory-name1), * NULL * }; * result = gst_install_plugins_sync (details, NULL); * if (result == GST_INSTALL_PLUGINS_SUCCESS || * result == GST_INSTALL_PLUGINS_PARTIAL_SUCCESS) { * gst_update_registry (); * } */ #define BT_EDIT #define BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_C #include "bt-edit.h" //-- property ids enum { MISSING_FRAMEWORK_ELEMENTS_DIALOG_CORE_ELEMENTS=1, MISSING_FRAMEWORK_ELEMENTS_DIALOG_EDIT_ELEMENTS }; struct _BtMissingFrameworkElementsDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* list of missing elements */ GList *core_elements, *edit_elements; GtkWidget *ignore_button; }; //-- the class G_DEFINE_TYPE (BtMissingFrameworkElementsDialog, bt_missing_framework_elements_dialog, GTK_TYPE_DIALOG); //-- event handler //-- helper methods static void make_listview(GtkWidget *vbox,GList *missing_elements,const gchar *msg) { GtkWidget *label,*missing_list,*missing_list_view; GList *node; gchar *missing_text,*ptr; gint length=0; label=gtk_label_new(msg); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); for(node=missing_elements;node;node=g_list_next(node)) { length+=2+strlen((gchar *)(node->data)); } ptr=missing_text=g_malloc(length); for(node=missing_elements;node;node=g_list_next(node)) { length=g_sprintf(ptr,"%s\n",(gchar *)(node->data)); ptr=&ptr[length]; } ptr[-1]='\0'; // remove last '\n' missing_list = gtk_text_view_new(); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(missing_list), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(missing_list), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(missing_list), GTK_WRAP_WORD); gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(missing_list)),missing_text,-1); gtk_widget_show(missing_list); g_free(missing_text); missing_list_view = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (missing_list_view), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (missing_list_view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(missing_list_view), missing_list); gtk_widget_show(missing_list_view); gtk_box_pack_start(GTK_BOX(vbox),missing_list_view,TRUE,TRUE,0); } static gboolean bt_missing_framework_elements_dialog_init_ui(const BtMissingFrameworkElementsDialog *self) { GtkWidget *label,*icon,*hbox,*vbox; gchar *str; gboolean res=TRUE; //GdkPixbuf *window_icon=NULL; gtk_widget_set_name(GTK_WIDGET(self),"Missing GStreamer elements"); // create and set window icon /* if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } */ // set dialog title gtk_window_set_title(GTK_WINDOW(self),_("Missing GStreamer elements")); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); hbox=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(hbox),6); icon=gtk_image_new_from_stock(self->priv->core_elements?GTK_STOCK_DIALOG_ERROR:GTK_STOCK_DIALOG_WARNING,GTK_ICON_SIZE_DIALOG); gtk_container_add(GTK_CONTAINER(hbox),icon); vbox=gtk_vbox_new(FALSE,6); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Missing GStreamer elements")); gtk_label_set_markup(GTK_LABEL(label),str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); g_free(str); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); if(self->priv->core_elements) { GST_DEBUG("%d missing core elements",g_list_length(self->priv->core_elements)); make_listview(vbox,self->priv->core_elements,_("The elements listed below are missing from your installation, but are required.")); } if(self->priv->edit_elements) { BtSettings *settings; gchar *machine_ignore_list; GList *edit_elements=NULL; GST_DEBUG("%d missing edit elements",g_list_length(self->priv->edit_elements)); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"missing-machines",&machine_ignore_list,NULL); g_object_unref(settings); if(machine_ignore_list) { GList *node; gchar *name; gboolean have_elements=FALSE; for(node=self->priv->edit_elements;node;node=g_list_next(node)) { name=(gchar *)(node->data); // if this is the message ("starts with "->") or is not in the ignored list, append if(name[0]=='-') { // if all elements between two messages are ignored, drop the message too if(have_elements) { edit_elements=g_list_append(edit_elements,node->data); have_elements=FALSE; } } else if(!strstr(machine_ignore_list,name)) { edit_elements=g_list_append(edit_elements,node->data); have_elements=TRUE; } } GST_DEBUG("filtered to %d missing edit elements",g_list_length(edit_elements)); } else { edit_elements=self->priv->edit_elements; } if(edit_elements) { make_listview(vbox,edit_elements,_("The elements listed below are missing from your installation, but are recommended for full functionality.")); self->priv->ignore_button=gtk_check_button_new_with_label(_("don't warn again")); gtk_box_pack_start(GTK_BOX(vbox),self->priv->ignore_button,FALSE,FALSE,0); if(machine_ignore_list) { g_list_free(edit_elements); } } else { // if we have only non-critical elements and ignore them already, don't show the dialog. if(!self->priv->core_elements) { GST_INFO("no new missing elements to show"); res=FALSE; } } } gtk_container_add(GTK_CONTAINER(hbox),vbox); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),hbox); return(res); } //-- constructor methods /** * bt_missing_framework_elements_dialog_new: * @core_elements: list of missing core elements * @edit_elements: list of missing edit elements * * Create a new instance * * Returns: the new instance or %NULL in case there is nothing new to show */ BtMissingFrameworkElementsDialog *bt_missing_framework_elements_dialog_new(GList *core_elements,GList *edit_elements) { BtMissingFrameworkElementsDialog *self; self=BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG(g_object_new(BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG,"core-elements",core_elements,"edit-elements",edit_elements,NULL)); if(!bt_missing_framework_elements_dialog_init_ui(self)) { goto EmptyLists; } return(self); EmptyLists: gtk_widget_destroy(GTK_WIDGET(self)); return(NULL); } //-- methods /** * bt_missing_framework_elements_dialog_apply: * @self: the dialog which settings to apply * * Makes the dialog settings effective. */ void bt_missing_framework_elements_dialog_apply(const BtMissingFrameworkElementsDialog *self) { if(self->priv->ignore_button && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(self->priv->ignore_button))) { BtSettings *settings; gchar *machine_ignore_list; GList *node,*edit_elements=NULL; gchar *ptr,*name; gint length=0,offset=0; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"missing-machines",&machine_ignore_list,NULL); GST_INFO("was ignoring : [%s]",machine_ignore_list); if(machine_ignore_list) { offset=length=strlen(machine_ignore_list); } for(node=self->priv->edit_elements;node;node=g_list_next(node)) { name=(gchar *)(node->data); if(name[0]!='-') { if(!offset || !strstr(machine_ignore_list,name)) { edit_elements=g_list_append(edit_elements,node->data); length+=2+strlen((gchar *)(node->data)); } } } GST_INFO("enlarging to %d bytes",length); machine_ignore_list=g_realloc(machine_ignore_list,length); ptr=&machine_ignore_list[offset]; for(node=edit_elements;node;node=g_list_next(node)) { length=g_sprintf(ptr,"%s,",(gchar *)(node->data)); ptr=&ptr[length]; } g_list_free(edit_elements); GST_INFO("now ignoring : [%s]",machine_ignore_list); g_object_set(settings,"missing-machines",machine_ignore_list,NULL); g_object_unref(settings); } } //-- wrapper //-- class internals static void bt_missing_framework_elements_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMissingFrameworkElementsDialog *self = BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG(object); return_if_disposed(); switch (property_id) { case MISSING_FRAMEWORK_ELEMENTS_DIALOG_CORE_ELEMENTS: { self->priv->core_elements = g_value_get_pointer(value); } break; case MISSING_FRAMEWORK_ELEMENTS_DIALOG_EDIT_ELEMENTS: { self->priv->edit_elements = g_value_get_pointer(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_missing_framework_elements_dialog_dispose(GObject *object) { BtMissingFrameworkElementsDialog *self = BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_missing_framework_elements_dialog_parent_class)->dispose(object); } static void bt_missing_framework_elements_dialog_init(BtMissingFrameworkElementsDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG, BtMissingFrameworkElementsDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_missing_framework_elements_dialog_class_init(BtMissingFrameworkElementsDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMissingFrameworkElementsDialogPrivate)); gobject_class->set_property = bt_missing_framework_elements_dialog_set_property; gobject_class->dispose = bt_missing_framework_elements_dialog_dispose; g_object_class_install_property(gobject_class,MISSING_FRAMEWORK_ELEMENTS_DIALOG_CORE_ELEMENTS, g_param_spec_pointer("core-elements", "core-elements construct prop", "Set missing core-elements list, the dialog handles", G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MISSING_FRAMEWORK_ELEMENTS_DIALOG_EDIT_ELEMENTS, g_param_spec_pointer("edit-elements", "edit-elements construct prop", "Set missing edit-elements list, the dialog handles", G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/machine-preferences-dialog.c0000644042355400116100000005714611666705670020001 00000000000000/* $Id: machine-preferences-dialog.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinepreferencesdialog * @short_description: machine non-realtime parameters * @see_also: #BtMachine * * A dialog to configure static settings of a #BtMachine. */ /* @todo: filter certain properties (tempo iface, ...) * * @todo: we have a few notifies, but not for all types * - do we need them at all? who else could change things? * * @todo: we should only be able to have one preferences for each machien type * * @todo: save the chosen settings somewhere * - gconf would need some sort of schema */ #define BT_EDIT #define BT_MACHINE_PREFERENCES_DIALOG_C #include "bt-edit.h" //-- property ids enum { MACHINE_PREFERENCES_DIALOG_MACHINE=1 }; struct _BtMachinePreferencesDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the underlying machine */ BtMachine *machine; }; static GQuark widget_parent_quark=0; //-- the class G_DEFINE_TYPE (BtMachinePreferencesDialog, bt_machine_preferences_dialog, GTK_TYPE_WINDOW); //-- event handler static void on_range_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { GtkWidget *widget=GTK_WIDGET(user_data); gdouble value; //GST_INFO("preferences value notify received for: '%s'",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); gtk_range_set_value(GTK_RANGE(widget),value); } static void on_double_entry_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { GtkWidget *widget=GTK_WIDGET(user_data); gdouble value; gchar *str_value; //GST_INFO("preferences value notify received for: '%s'",property->name); g_object_get((gpointer)machine,property->name,&value,NULL); str_value=g_strdup_printf("%7.2lf",value); gtk_entry_set_text(GTK_ENTRY(widget),str_value); g_free(str_value); } static void on_combobox_property_notify(const GstElement *machine,GParamSpec *property,gpointer user_data) { GtkWidget *widget=GTK_WIDGET(user_data); gint ivalue,nvalue; GtkTreeModel *store; GtkTreeIter iter; g_object_get((gpointer)machine,property->name,&nvalue,NULL); store=gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); gtk_tree_model_get_iter_first(store,&iter); do { gtk_tree_model_get(store,&iter,0,&ivalue,-1); if(ivalue==nvalue) break; } while(gtk_tree_model_iter_next(store,&iter)); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget),&iter); } static void on_entry_property_changed(GtkEditable *editable,gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(editable)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(editable),widget_parent_quark)); //GST_INFO("preferences value change received for: '%s'",name); g_object_set(machine,name,gtk_entry_get_text(GTK_ENTRY(editable)),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_checkbox_property_toggled(GtkToggleButton *togglebutton, gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(togglebutton)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(togglebutton),widget_parent_quark)); //GST_INFO("preferences value change received for: '%s'",name); g_object_set(machine,name,gtk_toggle_button_get_active(togglebutton),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_range_property_changed(GtkRange *range,gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); const gchar *name=gtk_widget_get_name(GTK_WIDGET(range)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(range),widget_parent_quark)); //GST_INFO("preferences value change received for: '%s'",name); g_object_set(machine,name,gtk_range_get_value(range),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_double_entry_property_changed(GtkEditable *editable,gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); gdouble value; const gchar *name=gtk_widget_get_name(GTK_WIDGET(editable)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(editable),widget_parent_quark)); //GST_INFO("preferences value change received for: '%s'",name); value=g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(editable)),NULL); g_object_set(machine,name,value,NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_spinbutton_property_changed(GtkSpinButton *spinbutton,gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); gint value; const gchar *name=gtk_widget_get_name(GTK_WIDGET(spinbutton)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(spinbutton),widget_parent_quark)); GST_INFO("preferences value change received for: '%s'",name); value=gtk_spin_button_get_value_as_int(spinbutton); g_object_set(machine,name,value,NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_combobox_property_changed(GtkComboBox *combobox, gpointer user_data) { GstElement *machine=GST_ELEMENT(user_data); gint value; const gchar *name=gtk_widget_get_name(GTK_WIDGET(combobox)); BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(g_object_get_qdata(G_OBJECT(combobox),widget_parent_quark)); GtkTreeModel *store; GtkTreeIter iter; GST_INFO("preferences value change received for: '%s'",name); //value=gtk_combo_box_get_active(combobox); store=gtk_combo_box_get_model(combobox); if(gtk_combo_box_get_active_iter(combobox,&iter)) { gtk_tree_model_get(store,&iter,0,&value,-1); g_object_set(machine,name,value,NULL); } bt_edit_application_set_song_unsaved(self->priv->app); } /* * on_table_size_request: * * we adjust the scrollable-window size to contain the whole area */ static void on_table_size_request(GtkWidget *widget,GtkRequisition *requisition,gpointer user_data) { //BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(user_data); GtkWidget *parent=gtk_widget_get_parent(gtk_widget_get_parent(widget)); gint height=requisition->height,width=-1; gint max_height=gdk_screen_get_height(gdk_screen_get_default()); gint available_heigth; GST_DEBUG("#### table size req %d x %d (max-height=%d)", requisition->width,requisition->height,max_height); // have a minimum width if(requisition->width<250) { width=250; } // constrain the height by screen height minus some space for panels and deco available_heigth=max_height-SCREEN_BORDER_HEIGHT; if(height>available_heigth) { height=available_heigth; } // @todo: is the '2' some border or padding gtk_widget_set_size_request(parent,width,height + 2); } static void on_machine_id_changed(const BtMachine *machine,GParamSpec *arg,gpointer user_data) { BtMachinePreferencesDialog *self=BT_MACHINE_PREFERENCES_DIALOG(user_data); gchar *id,*title; g_object_get((GObject *)machine,"id",&id,NULL); title=g_strdup_printf(_("%s preferences"),id); gtk_window_set_title(GTK_WINDOW(self),title); g_free(id);g_free(title); } //-- helper methods static gboolean skip_property(GstElement *element,GParamSpec *pspec) { // skip controlable properties if(pspec->flags&GST_PARAM_CONTROLLABLE) return(TRUE); // skip uneditable gobject propertes properties else if(G_TYPE_IS_CLASSED(pspec->value_type)) return(TRUE); else if(pspec->value_type==G_TYPE_POINTER) return(TRUE); // skip baseclass properties else if(!strncmp(pspec->name,"name\0",5)) return(TRUE); else if(pspec->owner_type==GST_TYPE_BASE_SRC) return(TRUE); else if(pspec->owner_type==GST_TYPE_BASE_TRANSFORM) return(TRUE); else if(pspec->owner_type==GST_TYPE_BASE_SINK) return(TRUE); else if(pspec->owner_type==GST_TYPE_BIN) return(TRUE); // skip know interface properties (tempo, childbin) else if(pspec->owner_type==GSTBT_TYPE_CHILD_BIN) return(TRUE); else if(pspec->owner_type==GSTBT_TYPE_HELP) return(TRUE); else if(pspec->owner_type==GSTBT_TYPE_TEMPO) return(TRUE); GST_INFO("property: %s, owner-type: %s",pspec->name,g_type_name(pspec->owner_type)); return(FALSE); } #define _MAKE_SPIN_BUTTON(t,T,p) \ case G_TYPE_ ## T: { \ GParamSpec ## p *p=G_PARAM_SPEC_ ## T(property); \ g ## t value; \ gdouble step; \ \ g_object_get(machine,property->name,&value,NULL); \ step=(gdouble)(p->maximum-p->minimum)/1024.0; \ spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new( \ (gdouble)value,(gdouble)p->minimum, (gdouble)p->maximum,1.0,step,0.0));\ widget1=gtk_spin_button_new(spin_adjustment,1.0,0); \ gtk_widget_set_name(GTK_WIDGET(widget1),property->name); \ g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); \ gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget1),(gdouble)value); \ widget2=NULL; \ g_signal_connect(widget1,"value-changed",G_CALLBACK(on_spinbutton_property_changed),(gpointer)machine); \ } break; static void bt_machine_preferences_dialog_init_ui(const BtMachinePreferencesDialog *self) { BtMainWindow *main_window; GtkWidget *label,*widget1,*widget2,*table,*scrolled_window; GtkAdjustment *spin_adjustment; GdkPixbuf *window_icon=NULL; GstElement *machine; GParamSpec **properties,*property; guint i,k,props,number_of_properties; gtk_widget_set_name(GTK_WIDGET(self),"machine preferences"); g_object_get(self->priv->app,"main-window",&main_window,NULL); gtk_window_set_transient_for(GTK_WINDOW(self),GTK_WINDOW(main_window)); // create and set window icon if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } // leave the choice of width to gtk //gtk_window_set_default_size(GTK_WINDOW(self),-1,200); ////gtk_widget_set_size_request(GTK_WIDGET(self),300,200); //gtk_window_set_default_size(GTK_WINDOW(self),300,-1); g_object_get(self->priv->machine,"machine",&machine,NULL); // set dialog title on_machine_id_changed(self->priv->machine,NULL,(gpointer)self); // get machine properties if((properties=g_object_class_list_properties(G_OBJECT_CLASS(GST_ELEMENT_GET_CLASS(machine)),&number_of_properties))) { gchar *signal_name; gchar *tool_tip_text; GType param_type,base_type; GST_INFO("machine has %d properties",number_of_properties); props=number_of_properties; for(i=0;iname); tool_tip_text=(gchar *)g_param_spec_get_blurb(property); // get name label=gtk_label_new(property->name); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_widget_set_tooltip_text(label,tool_tip_text); gtk_table_attach(GTK_TABLE(table),label, 0, 1, k, k+1, GTK_FILL,GTK_SHRINK, 2,1); param_type=property->value_type; while((base_type=g_type_parent(param_type))) param_type=base_type; GST_INFO("... base type is : %s",g_type_name(param_type)); switch(param_type) { case G_TYPE_STRING: { gchar *value; g_object_get(machine,property->name,&value,NULL); widget1=gtk_entry_new(); gtk_widget_set_name(GTK_WIDGET(widget1),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); gtk_entry_set_text(GTK_ENTRY(widget1),safe_string(value));g_free(value); widget2=NULL; // connect handlers g_signal_connect(widget1, "changed", G_CALLBACK(on_entry_property_changed), (gpointer)machine); } break; case G_TYPE_BOOLEAN: { gboolean value; g_object_get(machine,property->name,&value,NULL); widget1=gtk_check_button_new(); gtk_widget_set_name(GTK_WIDGET(widget1),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget1),value); widget2=NULL; // connect handlers g_signal_connect(widget1, "toggled", G_CALLBACK(on_checkbox_property_toggled), (gpointer)machine); } break; _MAKE_SPIN_BUTTON(int,INT,Int) _MAKE_SPIN_BUTTON(uint,UINT,UInt) _MAKE_SPIN_BUTTON(int64,INT64,Int64) _MAKE_SPIN_BUTTON(uint64,UINT64,UInt64) _MAKE_SPIN_BUTTON(long,LONG,Long) _MAKE_SPIN_BUTTON(ulong,ULONG,ULong) case G_TYPE_DOUBLE: { GParamSpecDouble *p=G_PARAM_SPEC_DOUBLE(property); gdouble step,value; gchar *str_value; g_object_get(machine,property->name,&value,NULL); // get max(max,-min), count digits -> to determine needed length of field str_value=g_strdup_printf("%7.2lf",value); step=(p->maximum-p->minimum)/1024.0; widget1=gtk_hscale_new_with_range(p->minimum,p->maximum,step); gtk_widget_set_name(GTK_WIDGET(widget1),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); gtk_scale_set_draw_value(GTK_SCALE(widget1),FALSE); gtk_range_set_value(GTK_RANGE(widget1),value); widget2=gtk_entry_new(); gtk_widget_set_name(GTK_WIDGET(widget2),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); gtk_entry_set_text(GTK_ENTRY(widget2),str_value); g_object_set(widget2,"max-length",9,"width-chars",9,NULL); g_free(str_value); signal_name=g_strdup_printf("notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_range_property_notify), (gpointer)widget1); g_signal_connect(machine, signal_name, G_CALLBACK(on_double_entry_property_notify), (gpointer)widget2); g_signal_connect(widget1, "value-changed", G_CALLBACK(on_range_property_changed), (gpointer)machine); g_signal_connect(widget2, "changed", G_CALLBACK(on_double_entry_property_changed), (gpointer)machine); g_free(signal_name); } break; case G_TYPE_ENUM: { GParamSpecEnum *enum_property=G_PARAM_SPEC_ENUM(property); GEnumClass *enum_class=enum_property->enum_class; GEnumValue *enum_value; GtkCellRenderer *renderer; GtkListStore *store; GtkTreeIter iter; gint value, ivalue; widget1=gtk_combo_box_new(); GST_INFO("enum range: %d, %d",enum_class->minimum,enum_class->maximum); // need a real model because of sparse enums store=gtk_list_store_new(2,G_TYPE_ULONG,G_TYPE_STRING); for(value=enum_class->minimum;value<=enum_class->maximum;value++) { if((enum_value=g_enum_get_value(enum_class, value))) { //GST_INFO("enum value: %d, '%s', '%s'",enum_value->value,enum_value->value_name,enum_value->value_nick); //gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget1),enum_value->value_nick); gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter, 0,enum_value->value, 1,enum_value->value_nick, -1); } } renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget1),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget1),renderer,"text",1,NULL); gtk_combo_box_set_model(GTK_COMBO_BOX(widget1),GTK_TREE_MODEL(store)); g_object_get(machine,property->name,&value,NULL); gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),&iter); do { gtk_tree_model_get((GTK_TREE_MODEL(store)),&iter,0,&ivalue,-1); if(ivalue==value) break; } while(gtk_tree_model_iter_next(GTK_TREE_MODEL(store),&iter)); gtk_combo_box_set_active_iter(GTK_COMBO_BOX(widget1),&iter); gtk_widget_set_name(GTK_WIDGET(widget1),property->name); g_object_set_qdata(G_OBJECT(widget1),widget_parent_quark,(gpointer)self); signal_name=g_strdup_printf("notify::%s",property->name); g_signal_connect(machine, signal_name, G_CALLBACK(on_combobox_property_notify), (gpointer)widget1); g_signal_connect(widget1, "changed", G_CALLBACK(on_combobox_property_changed), (gpointer)machine); g_free(signal_name); widget2=NULL; } break; default: { gchar *str=g_strdup_printf("unhandled type \"%s\"",G_PARAM_SPEC_TYPE_NAME(property)); widget1=gtk_label_new(str);g_free(str); widget2=NULL; } } gtk_widget_set_tooltip_text(widget1,tool_tip_text); if(!widget2) { gtk_table_attach(GTK_TABLE(table),widget1, 1, 3, k, k+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); } else { gtk_widget_set_tooltip_text(widget2,tool_tip_text); gtk_table_attach(GTK_TABLE(table),widget1, 1, 2, k, k+1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(table),widget2, 2, 3, k, k+1, GTK_FILL,GTK_SHRINK, 2,1); } k++; } // eat remaning space //gtk_table_attach(GTK_TABLE(table),gtk_label_new(" "), 0, 3, k, k+1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),table); gtk_container_add(GTK_CONTAINER(self),scrolled_window); } else { label=gtk_label_new(_("no settings")); gtk_container_add(GTK_CONTAINER(self),label); gtk_widget_set_size_request(GTK_WIDGET(self),250,-1); } g_free(properties); } else { gtk_container_add(GTK_CONTAINER(self),gtk_label_new(_("machine has no preferences"))); } // track machine name (keep window title up-to-date) g_signal_connect(self->priv->machine,"notify::id",G_CALLBACK(on_machine_id_changed),(gpointer)self); g_object_unref(machine); g_object_unref(main_window); } //-- constructor methods /** * bt_machine_preferences_dialog_new: * @machine: the machine to create the dialog for * * Create a new instance * * Returns: the new instance */ BtMachinePreferencesDialog *bt_machine_preferences_dialog_new(const BtMachine *machine) { BtMachinePreferencesDialog *self; self=BT_MACHINE_PREFERENCES_DIALOG(g_object_new(BT_TYPE_MACHINE_PREFERENCES_DIALOG,"machine",machine,NULL)); bt_machine_preferences_dialog_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_machine_preferences_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachinePreferencesDialog *self = BT_MACHINE_PREFERENCES_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_PREFERENCES_DIALOG_MACHINE: { g_object_try_unref(self->priv->machine); self->priv->machine = g_value_dup_object(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_preferences_dialog_dispose(GObject *object) { BtMachinePreferencesDialog *self = BT_MACHINE_PREFERENCES_DIALOG(object); GstElement *machine; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); // disconnect handlers g_signal_handlers_disconnect_matched(self->priv->machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_machine_id_changed,self); // disconnect handlers connected to machine properties g_object_get(self->priv->machine,"machine",&machine,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_range_property_notify,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_double_entry_property_notify,NULL); g_object_unref(machine); g_object_try_unref(self->priv->machine); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_machine_preferences_dialog_parent_class)->dispose(object); } static void bt_machine_preferences_dialog_init(BtMachinePreferencesDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_PREFERENCES_DIALOG, BtMachinePreferencesDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_machine_preferences_dialog_class_init(BtMachinePreferencesDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); widget_parent_quark=g_quark_from_static_string("BtMachinePreferencesDialog::widget-parent"); g_type_class_add_private(klass,sizeof(BtMachinePreferencesDialogPrivate)); gobject_class->set_property = bt_machine_preferences_dialog_set_property; gobject_class->dispose = bt_machine_preferences_dialog_dispose; g_object_class_install_property(gobject_class,MACHINE_PREFERENCES_DIALOG_MACHINE, g_param_spec_object("machine", "machine construct prop", "Set machine object, the dialog handles", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/main-page-waves.c0000644042355400116100000015647111670346723015616 00000000000000/* $Id: main-page-waves.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. *< * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpagewaves * @short_description: the editor wavetable page * * Manage a list of audio clips files. Provides an embeded file browser to load * files. A waveform viewer can show the selected clip. */ /* @todo: need envelop editor and everything for it * @todo: add shortcuts to play current sample (in browser) * - look at gtk_file_chooser_set_preview_widget() and/or * selection-changed/update-preview signals * @todo: gray wavetable entries for unused waves */ /* @todo: move file-chooser widget to a notebook, to have extra tabs for * - loading from online sample sites * - recording */ /* @todo: undo/redo (search for bt_edit_application_set_song_unsaved * - load/unload a wave * - change wave-table properties */ #define BT_EDIT #define BT_MAIN_PAGE_WAVES_C #include "bt-edit.h" struct _BtMainPageWavesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the wavetable we are showing*/ BtWavetable *wavetable; /* the waveform graph widget */ GtkWidget *waveform_viewer; /* the toolbar widgets */ GtkWidget *list_toolbar,*browser_toolbar,*editor_toolbar; GtkWidget *browser_stop,*wavetable_stop; GtkWidget *browser_play,*wavetable_play,*wavetable_clear; /* the list of wavetable entries */ GtkTreeView *waves_list; /* and their parameters */ GtkHScale *volume; GtkWidget *loop_mode; /* the list of wavelevels */ GtkTreeView *wavelevels_list; /* the sample chooser */ GtkWidget *file_chooser; /* playbin for filechooser preview */ GstElement *playbin; /* seek events */ GstEvent *play_seek_event; GstEvent *loop_seek_event[2]; gint loop_seek_dir; /* elements for wavetable preview */ GstElement *preview, *preview_src, *preview_sink; BtWave *play_wave; BtWavelevel *play_wavelevel; GstBtToneConversion *n2f; /* the query is used in update_playback_position */ GstQuery *position_query; /* update handler id */ guint preview_update_id; /* we need to hold the reference to not kill the notifies */ BtSettings *settings; }; enum { WAVE_TABLE_ID=0, WAVE_TABLE_HEX_ID, WAVE_TABLE_NAME, WAVE_TABLE_CT }; enum { WAVELEVEL_TABLE_ID=0, WAVELEVEL_TABLE_ROOT_NOTE, WAVELEVEL_TABLE_LENGTH, WAVELEVEL_TABLE_RATE, WAVELEVEL_TABLE_LOOP_START, WAVELEVEL_TABLE_LOOP_END, WAVELEVEL_TABLE_CT }; //-- the class G_DEFINE_TYPE (BtMainPageWaves, bt_main_page_waves, GTK_TYPE_VBOX); //-- event handler helper static void on_waves_list_cursor_changed(GtkTreeView *treeview,gpointer user_data); static void on_wavelevels_list_cursor_changed(GtkTreeView *treeview,gpointer user_data); static BtWave *waves_list_get_current(const BtMainPageWaves *self) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; BtWave *wave=NULL; selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->waves_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { gulong id; gtk_tree_model_get(model,&iter,WAVE_TABLE_ID,&id,-1); wave=bt_wavetable_get_wave_by_index(self->priv->wavetable,id); } return(wave); } static BtWavelevel *wavelevels_list_get_current(const BtMainPageWaves *self,BtWave *wave) { GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; BtWavelevel *wavelevel=NULL; selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->wavelevels_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { gulong id; gtk_tree_model_get(model,&iter,WAVELEVEL_TABLE_ID,&id,-1); wavelevel=bt_wave_get_level_by_index(wave,id); } return(wavelevel); } /* * waves_list_refresh: * @self: the waves page * * Build the list of waves from the songs wavetable */ static void waves_list_refresh(const BtMainPageWaves *self) { BtWave *wave; GtkListStore *store; GtkTreeIter tree_iter; GtkTreeSelection *selection; GtkTreePath *path=NULL; GtkTreeModel *old_store; gchar *str,hstr[3]; gint i; gboolean have_selection=FALSE; GST_INFO("refresh waves list: self=%p, wavetable=%p",self,self->priv->wavetable); store=gtk_list_store_new(WAVE_TABLE_CT,G_TYPE_ULONG,G_TYPE_STRING,G_TYPE_STRING); // append waves rows (buzz numbers them from 0x01 to 0xC8=200) for(i=1;i<=200;i++) { gtk_list_store_append(store, &tree_iter); // buzz shows index as hex, because trackers needs it this way sprintf(hstr,"%02x",i); gtk_list_store_set(store,&tree_iter,WAVE_TABLE_ID,i,WAVE_TABLE_HEX_ID,hstr,-1); if((wave=bt_wavetable_get_wave_by_index(self->priv->wavetable,i))) { g_object_get(wave,"name",&str,NULL); GST_INFO(" adding [%3d] \"%s\"",i,str); gtk_list_store_set(store,&tree_iter,WAVE_TABLE_NAME,str,-1); g_free(str); g_object_unref(wave); } else { GST_DEBUG("no wave for index: %d",i); } } // get old selection or get first item selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->waves_list)); if(gtk_tree_selection_get_selected(selection, &old_store, &tree_iter)) { path=gtk_tree_model_get_path(old_store,&tree_iter); } gtk_tree_view_set_model(self->priv->waves_list,GTK_TREE_MODEL(store)); if(path) { have_selection=gtk_tree_model_get_iter(GTK_TREE_MODEL(store),&tree_iter,path); } else { have_selection=gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),&tree_iter); path=gtk_tree_path_new_from_indices(0,-1); } if(have_selection) { gtk_tree_selection_select_iter(selection,&tree_iter); gtk_tree_view_scroll_to_cell(self->priv->waves_list,path,NULL,TRUE,0.5,0.5); } if(path) { gtk_tree_path_free(path); } on_waves_list_cursor_changed(GTK_TREE_VIEW(self->priv->waves_list), (gpointer)self); g_object_unref(store); // drop with treeview } /* * wavelevels_list_refresh: * @self: the waves page * @wave: the wave that * * Build the list of wavelevels for the given @wave */ static void wavelevels_list_refresh(const BtMainPageWaves *self,const BtWave *wave) { GtkListStore *store; GtkTreeSelection *selection; GtkTreeIter tree_iter; GST_INFO("refresh wavelevels list: self=%p, wave=%p",self,wave); store=gtk_list_store_new(WAVELEVEL_TABLE_CT,G_TYPE_ULONG,G_TYPE_STRING,G_TYPE_ULONG,G_TYPE_ULONG,G_TYPE_LONG,G_TYPE_LONG); if(wave) { BtWavelevel *wavelevel; GList *node,*list; guchar root_note; gulong length,rate; glong loop_start,loop_end; gulong i=0; //-- append wavelevels rows g_object_get((gpointer)wave,"wavelevels",&list,NULL); for(node=list;node;node=g_list_next(node),i++) { wavelevel=BT_WAVELEVEL(node->data); g_object_get(wavelevel, "root-note",&root_note, "length",&length, "loop-start",&loop_start, "loop-end",&loop_end, "rate",&rate, NULL); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, WAVELEVEL_TABLE_ID,i, WAVELEVEL_TABLE_ROOT_NOTE,gstbt_tone_conversion_note_number_2_string(root_note), WAVELEVEL_TABLE_LENGTH,length, WAVELEVEL_TABLE_RATE,rate, WAVELEVEL_TABLE_LOOP_START,loop_start, WAVELEVEL_TABLE_LOOP_END,loop_end, -1); } g_list_free(list); } gtk_tree_view_set_model(self->priv->wavelevels_list,GTK_TREE_MODEL(store)); selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->wavelevels_list)); if(!gtk_tree_selection_get_selected(selection, NULL, NULL)) { if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store),&tree_iter)) gtk_tree_selection_select_iter(selection,&tree_iter); } g_object_unref(store); // drop with treeview } static BtWavelevel *wavelevels_get_wavelevel_and_set_iter(BtMainPageWaves *self,GtkTreeIter *iter,GtkTreeModel **store,gchar *path_string) { BtWavelevel *wavelevel=NULL; BtWave *wave; g_assert(iter); g_assert(store); if((wave=waves_list_get_current(self))) { if((*store=gtk_tree_view_get_model(self->priv->wavelevels_list))) { if(gtk_tree_model_get_iter_from_string(*store,iter,path_string)) { gulong id; gtk_tree_model_get(*store,iter,WAVELEVEL_TABLE_ID,&id,-1); wavelevel=bt_wave_get_level_by_index(wave,id); } } g_object_unref(wave); } return(wavelevel); } static void preview_stop(const BtMainPageWaves *self) { if(self->priv->preview_update_id) { g_source_remove(self->priv->preview_update_id); self->priv->preview_update_id=0; g_object_set(self->priv->waveform_viewer,"playback-cursor",G_GINT64_CONSTANT(-1),NULL); } /* if I set state directly to NULL, I don't get inbetween state-change messages */ gst_element_set_state(self->priv->preview,GST_STATE_READY); self->priv->play_wave=NULL; self->priv->play_wavelevel=NULL; } static void preview_update_seeks(const BtMainPageWaves *self) { if(self->priv->play_wave) { GstEvent *old_play_event,*new_play_event; GstEvent *old_loop_event0,*new_loop_event0; GstEvent *old_loop_event1,*new_loop_event1; BtWaveLoopMode loop_mode; glong loop_start,loop_end; gulong length, srate; guchar root_note; gdouble prate; /* get parameters */ g_object_get(self->priv->play_wave, "loop-mode",&loop_mode, NULL); g_object_get(self->priv->play_wavelevel, "root-note",&root_note, "length",&length, "loop-start",&loop_start, "loop-end",&loop_end, "rate",&srate, NULL); /* calculate pitch rate from root-note */ prate=gstbt_tone_conversion_translate_from_number(self->priv->n2f,BT_WAVELEVEL_DEFAULT_ROOT_NOTE)/ gstbt_tone_conversion_translate_from_number(self->priv->n2f,root_note); old_play_event =self->priv->play_seek_event; old_loop_event0=self->priv->loop_seek_event[0]; old_loop_event1=self->priv->loop_seek_event[1]; /* new events */ if (loop_mode!=BT_WAVE_LOOP_MODE_OFF) { GstClockTime play_beg,play_end; if(loop_start==-1) loop_start=0; if(loop_end==-1) loop_end=length+1; play_beg=gst_util_uint64_scale_int(GST_SECOND,loop_start,srate); play_end=gst_util_uint64_scale_int(GST_SECOND,loop_end,srate); new_play_event = gst_event_new_seek(prate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT(0), GST_SEEK_TYPE_SET, play_end); if(loop_mode==BT_WAVE_LOOP_MODE_FORWARD) { GST_DEBUG("prepare for forward loop play: %"GST_TIME_FORMAT" ... %"GST_TIME_FORMAT, GST_TIME_ARGS(play_beg),GST_TIME_ARGS(play_end)); new_loop_event0=gst_event_new_seek(prate, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, play_beg, GST_SEEK_TYPE_SET, play_end); } else { GST_DEBUG("prepare for pingpong loop play: %"GST_TIME_FORMAT" ... %"GST_TIME_FORMAT, GST_TIME_ARGS(play_beg),GST_TIME_ARGS(play_end)); new_loop_event0=gst_event_new_seek(-1.0*prate, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, play_beg, GST_SEEK_TYPE_SET, play_end); } new_loop_event1=gst_event_new_seek(prate, GST_FORMAT_TIME, GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, play_beg, GST_SEEK_TYPE_SET, play_end); } else { GstClockTime play_end=gst_util_uint64_scale_int(GST_SECOND,length,srate); GST_DEBUG("prepare for no loop play: 0 ... %"GST_TIME_FORMAT,GST_TIME_ARGS(play_end)); new_play_event = gst_event_new_seek(prate, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT(0), GST_SEEK_TYPE_SET, play_end); new_loop_event0 = gst_event_new_seek(prate, GST_FORMAT_TIME, GST_SEEK_FLAG_NONE, GST_SEEK_TYPE_SET, G_GUINT64_CONSTANT(0), GST_SEEK_TYPE_SET, play_end); new_loop_event1 = NULL; } /* swap and replace */ if(old_play_event) { // the double cast is a work-around for : dereferencing type-punned pointer will break strict-aliasing rules g_atomic_pointer_compare_and_exchange((gpointer *)((gpointer)&self->priv->play_seek_event),old_play_event,new_play_event); gst_event_unref(old_play_event); } else { self->priv->play_seek_event=new_play_event; } if(old_loop_event0) { g_atomic_pointer_compare_and_exchange((gpointer *)&self->priv->loop_seek_event[0],old_loop_event0,new_loop_event0); gst_event_unref(old_loop_event0); } else { self->priv->loop_seek_event[0]=new_loop_event0; } if(old_loop_event1) { g_atomic_pointer_compare_and_exchange((gpointer *)&self->priv->loop_seek_event[1],old_loop_event1,new_loop_event1); gst_event_unref(old_loop_event1); } else { self->priv->loop_seek_event[1]=new_loop_event1; } } } static void update_audio_sink(const BtMainPageWaves *self) { GstState state; GstElement *sink=NULL; gchar *plugin_name; // check current state if(gst_element_get_state(GST_ELEMENT(self->priv->playbin),&state,NULL,0)==GST_STATE_CHANGE_SUCCESS) { if(state>GST_STATE_READY) { gst_element_set_state(self->priv->playbin,GST_STATE_READY); } } if(self->priv->preview && gst_element_get_state(GST_ELEMENT(self->priv->preview),&state,NULL,0)==GST_STATE_CHANGE_SUCCESS) { if(state>GST_STATE_READY) { preview_stop(self); gtk_widget_set_sensitive(self->priv->wavetable_stop,FALSE); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->wavetable_play),FALSE); } } // determine sink element plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); if(plugin_name) { sink=gst_element_factory_make(plugin_name,NULL); g_object_set(self->priv->playbin,"audio-sink",sink,NULL); if(self->priv->preview) { GstPad *pad,*peer_pad; pad=gst_element_get_static_pad(self->priv->preview_sink, "sink"); peer_pad=gst_pad_get_peer(pad); gst_pad_unlink(peer_pad,pad); gst_object_unref(pad); gst_element_set_state(self->priv->preview,GST_STATE_NULL); gst_bin_remove(GST_BIN(self->priv->preview),self->priv->preview_sink); self->priv->preview_sink=gst_element_factory_make(plugin_name,NULL); gst_bin_add(GST_BIN(self->priv->preview),self->priv->preview_sink); pad=gst_element_get_static_pad(self->priv->preview_sink, "sink"); gst_pad_link(peer_pad,pad); gst_object_unref(pad); } g_free(plugin_name); } } //-- event handler static void on_playbin_state_changed(GstBus * bus, GstMessage * message, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->playbin)) { GstState oldstate,newstate,pending; gst_message_parse_state_changed(message,&oldstate,&newstate,&pending); GST_INFO("state change on the bin: %s -> %s",gst_element_state_get_name(oldstate),gst_element_state_get_name(newstate)); switch(GST_STATE_TRANSITION(oldstate,newstate)) { case GST_STATE_CHANGE_PAUSED_TO_PLAYING: gtk_widget_set_sensitive(self->priv->browser_stop,TRUE); break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gtk_widget_set_sensitive(self->priv->browser_stop,FALSE); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->browser_play),FALSE); gst_element_set_state(self->priv->playbin,GST_STATE_NULL); break; default: break; } } } static void on_preview_state_changed(GstBus * bus, GstMessage * message, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->preview)) { GstState oldstate,newstate,pending; gst_message_parse_state_changed(message,&oldstate,&newstate,&pending); GST_INFO("state change on the bin: %s -> %s",gst_element_state_get_name(oldstate),gst_element_state_get_name(newstate)); switch(GST_STATE_TRANSITION(oldstate,newstate)) { case GST_STATE_CHANGE_NULL_TO_READY: if(!(gst_element_send_event(GST_ELEMENT(self->priv->preview),gst_event_ref(self->priv->play_seek_event)))) { GST_WARNING("bin failed to handle seek event"); } //gst_element_set_state(self->priv->preview,GST_STATE_PLAYING); break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: gtk_widget_set_sensitive(self->priv->wavetable_stop,TRUE); break; case GST_STATE_CHANGE_PLAYING_TO_PAUSED: gtk_widget_set_sensitive(self->priv->wavetable_stop,FALSE); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->wavetable_play),FALSE); gst_element_set_state(self->priv->preview,GST_STATE_NULL); break; default: break; } } } static void on_preview_eos(GstBus * bus, GstMessage * message, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->preview)) { GST_INFO("received eos on the bin"); preview_stop(self); } } static void on_preview_segment_done(GstBus * bus, GstMessage * message, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); if(GST_MESSAGE_SRC(message) == GST_OBJECT(self->priv->preview)) { GST_INFO("received segment_done on the bin, looping %d",self->priv->loop_seek_dir); if(!(gst_element_send_event(GST_ELEMENT(self->priv->preview),gst_event_ref(self->priv->loop_seek_event[self->priv->loop_seek_dir])))) { GST_WARNING("element failed to handle continuing play seek event"); /* if I set state directly to NULL, I don't get inbetween state-change messages */ gst_element_set_state(self->priv->preview,GST_STATE_READY); } self->priv->loop_seek_dir=1-self->priv->loop_seek_dir; } } static void on_preview_error(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GError *err = NULL; gchar *dbg = NULL; gst_message_parse_error(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"ERROR: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); preview_stop(self); } static void on_preview_warning(const GstBus * const bus, GstMessage * message, gconstpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GError *err = NULL; gchar *dbg = NULL; gst_message_parse_warning(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"WARNING: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); preview_stop(self); } static void on_wave_name_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeModel *store; if((store=gtk_tree_view_get_model(self->priv->waves_list))) { GtkTreeIter iter; if(gtk_tree_model_get_iter_from_string(store,&iter,path_string)) { BtWave *wave; gulong id; gtk_tree_model_get(store,&iter,WAVE_TABLE_ID,&id,-1); if((wave=bt_wavetable_get_wave_by_index(self->priv->wavetable,id))) { g_object_set(wave,"name",new_text,NULL); gtk_list_store_set(GTK_LIST_STORE(store),&iter,WAVE_TABLE_NAME,new_text,-1); g_object_unref(wave); bt_edit_application_set_song_unsaved(self->priv->app); } } } } static void on_wavelevel_root_note_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeIter iter; GtkTreeModel *store=NULL; BtWavelevel *wavelevel; if((wavelevel=wavelevels_get_wavelevel_and_set_iter(self,&iter,&store,path_string))) { guchar root_note=gstbt_tone_conversion_note_string_2_number(new_text); if(root_note) { g_object_set(wavelevel,"root-note",root_note,NULL); gtk_list_store_set(GTK_LIST_STORE(store),&iter,WAVELEVEL_TABLE_ROOT_NOTE,gstbt_tone_conversion_note_number_2_string(root_note),-1); preview_update_seeks(self); } g_object_unref(wavelevel); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_wavelevel_rate_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeIter iter; GtkTreeModel *store=NULL; BtWavelevel *wavelevel; if((wavelevel=wavelevels_get_wavelevel_and_set_iter(self,&iter,&store,path_string))) { gulong rate=atol(new_text); if(rate) { g_object_set(wavelevel,"rate",rate,NULL); gtk_list_store_set(GTK_LIST_STORE(store),&iter,WAVELEVEL_TABLE_RATE,rate,-1); preview_update_seeks(self); } g_object_unref(wavelevel); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_wavelevel_loop_start_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeIter iter; GtkTreeModel *store=NULL; BtWavelevel *wavelevel; if((wavelevel=wavelevels_get_wavelevel_and_set_iter(self,&iter,&store,path_string))) { glong loop_start=atol(new_text), loop_end = -1; g_object_set(wavelevel,"loop-start",loop_start,NULL); g_object_get(wavelevel,"loop-start",&loop_start,"loop-end", &loop_end, NULL); if (loop_start == -1 && loop_end != -1) { loop_end = -1; g_object_set(wavelevel,"loop-end",loop_end,NULL); } if (loop_start != -1 && loop_end == -1) { g_object_get(wavelevel,"length", &loop_end,NULL); if (loop_end > 0) loop_end--; g_object_set(wavelevel,"loop-end",loop_end,NULL); } gtk_list_store_set(GTK_LIST_STORE(store),&iter,WAVELEVEL_TABLE_LOOP_START,loop_start,WAVELEVEL_TABLE_LOOP_END,loop_end,-1); if (loop_end != -1) loop_end++; g_object_set(self->priv->waveform_viewer, "loop-begin", (gint64)loop_start, "loop-end", (gint64)loop_end, NULL); preview_update_seeks(self); g_object_unref(wavelevel); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_wavelevel_loop_end_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeIter iter; GtkTreeModel *store=NULL; BtWavelevel *wavelevel; if((wavelevel=wavelevels_get_wavelevel_and_set_iter(self,&iter,&store,path_string))) { glong loop_start = -1, loop_end=atol(new_text); g_object_set(wavelevel,"loop-end",loop_end,NULL); g_object_get(wavelevel,"loop-start",&loop_start,"loop-end", &loop_end, NULL); if (loop_start != -1 && loop_end == -1) { loop_start = -1; g_object_set(wavelevel,"loop-end",loop_end,NULL); } if (loop_start == -1 && loop_end != -1) { loop_start = 0; g_object_set(wavelevel,"loop-start",loop_start,NULL); } gtk_list_store_set(GTK_LIST_STORE(store),&iter,WAVELEVEL_TABLE_LOOP_START,loop_start,WAVELEVEL_TABLE_LOOP_END,loop_end,-1); if (loop_end != -1) loop_end++; g_object_set(self->priv->waveform_viewer, "loop-begin", (gint64)loop_start, "loop-end", (gint64)loop_end, NULL); preview_update_seeks(self); g_object_unref(wavelevel); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_wave_loading_done(BtWave *wave,gboolean success,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); if(success) { waves_list_refresh(self); GST_DEBUG("loading done, refreshing"); } else { // @todo: error message GST_WARNING("loading the wave failed"); } } static void on_volume_changed(GtkRange *range,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtWave *wave; if((wave=waves_list_get_current(self))) { gdouble volume=gtk_range_get_value(range); g_object_set(wave,"volume",volume,NULL); g_object_unref(wave); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_loop_mode_changed(GtkComboBox *menu, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtWave *wave; if((wave=waves_list_get_current(self))) { BtWaveLoopMode loop_mode=gtk_combo_box_get_active(GTK_COMBO_BOX(self->priv->loop_mode)); g_object_set(wave,"loop-mode",loop_mode,NULL); g_object_unref(wave); preview_update_seeks(self); bt_edit_application_set_song_unsaved(self->priv->app); } } static void on_waves_list_cursor_changed(GtkTreeView *treeview,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtWave *wave; GST_DEBUG("waves list cursor changed"); wave=waves_list_get_current(self); wavelevels_list_refresh(self,wave); if(wave) { gdouble volume; BtWaveLoopMode loop_mode; // enable toolbar buttons gtk_widget_set_sensitive(self->priv->wavetable_play,TRUE); gtk_widget_set_sensitive(self->priv->wavetable_clear,TRUE); // enable and update properties gtk_widget_set_sensitive(GTK_WIDGET(self->priv->volume),TRUE); gtk_widget_set_sensitive(self->priv->loop_mode,TRUE); g_object_get(wave,"volume",&volume,"loop-mode",&loop_mode,NULL); g_signal_handlers_block_matched(self->priv->volume,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_volume_changed,(gpointer)self); gtk_range_set_value(GTK_RANGE(self->priv->volume),volume); g_signal_handlers_unblock_matched(self->priv->volume,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_volume_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->loop_mode,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_loop_mode_changed,(gpointer)self); gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->loop_mode),loop_mode); g_signal_handlers_unblock_matched(self->priv->loop_mode,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_loop_mode_changed,(gpointer)self); } else { // disable toolbar buttons gtk_widget_set_sensitive(self->priv->wavetable_play,FALSE); gtk_widget_set_sensitive(self->priv->wavetable_clear,FALSE); // disable properties gtk_widget_set_sensitive(GTK_WIDGET(self->priv->volume),FALSE); gtk_widget_set_sensitive(self->priv->loop_mode,FALSE); } on_wavelevels_list_cursor_changed(self->priv->wavelevels_list, self); } static void on_wavelevels_list_cursor_changed(GtkTreeView *treeview,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtWave *wave; gboolean drawn=FALSE; GST_DEBUG("wavelevels list cursor changed"); if((wave=waves_list_get_current(self))) { BtWavelevel *wavelevel; if((wavelevel=wavelevels_list_get_current(self,wave))) { int16_t *data; guint channels; gulong length; glong loop_start, loop_end; g_object_get(wave,"channels",&channels,NULL); g_object_get(wavelevel,"length",&length,"data",&data,"loop-start", &loop_start,"loop-end",&loop_end,NULL); GST_INFO("select wave: %p, %lu",data,length); bt_waveform_viewer_set_wave(BT_WAVEFORM_VIEWER(self->priv->waveform_viewer),data,channels,length); g_object_set(self->priv->waveform_viewer,"loop-begin",(int64_t)loop_start,"loop-end",(int64_t)loop_end,NULL); g_object_unref(wavelevel); drawn=TRUE; } else { GST_WARNING("no current wavelevel"); } g_object_unref(wave); } else { GST_INFO("no current wave"); } if(!drawn) { bt_waveform_viewer_set_wave(BT_WAVEFORM_VIEWER(self->priv->waveform_viewer), NULL, 0, 0); } } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtSong *song; BtWave *wave; GST_INFO("song has changed : app=%p, self=%p",app,self); // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); if(!song) return; GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); g_object_try_unref(self->priv->wavetable); g_object_get(song,"wavetable",&self->priv->wavetable,NULL); // update page if((wave=waves_list_get_current(self))) { g_signal_connect(wave,"loading-done",G_CALLBACK(on_wave_loading_done),(gpointer)self); g_object_unref(wave); } waves_list_refresh(self); on_wavelevels_list_cursor_changed(self->priv->waves_list,self); // release the references g_object_unref(song); GST_INFO("song has changed done"); } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkToolbarStyle style; gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'",toolbar_style); style=gtk_toolbar_get_style_from_string(toolbar_style); gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->list_toolbar),style); gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->browser_toolbar),style); gtk_toolbar_set_style(GTK_TOOLBAR(self->priv->editor_toolbar),style); g_free(toolbar_style); } static void on_default_sample_folder_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); gchar *sample_folder; g_object_get((gpointer)settings,"sample-folder",&sample_folder,NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (self->priv->file_chooser), sample_folder); g_free(sample_folder); } static void on_browser_toolbar_play_clicked(GtkToolButton *button, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); gchar *uri; if(!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button))) return; // get current entry and play uri=gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(self->priv->file_chooser)); GST_INFO("current uri : %s",uri); if(uri) { // stop previous play gst_element_set_state(self->priv->playbin,GST_STATE_READY); // ... and play g_object_set(self->priv->playbin,"uri",uri,NULL); gst_element_set_state(self->priv->playbin,GST_STATE_PLAYING); g_free(uri); } } static void on_browser_toolbar_stop_clicked(GtkToolButton *button, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); /* if I set state directly to NULL, I don't get inbetween state-change messages */ gst_element_set_state(self->priv->playbin,GST_STATE_READY); } static gboolean on_preview_playback_update(gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); gint64 pos_cur; // query playback position and update playcursor if((gst_element_query(GST_ELEMENT(self->priv->preview_src),self->priv->position_query))) { //if((gst_element_query(GST_ELEMENT(self->priv->preview),self->priv->position_query))) { gst_query_parse_position(self->priv->position_query,NULL,&pos_cur); // update play-cursor in samples g_object_set(self->priv->waveform_viewer,"playback-cursor",pos_cur,NULL); /*GST_WARNING_OBJECT(self->priv->preview, "position query returned: %" G_GINT64_FORMAT,pos_cur);*/ } else { GST_WARNING_OBJECT(self->priv->preview, "position query failed"); } return(TRUE); } static void on_wavetable_toolbar_play_clicked(GtkToolButton *button, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); BtWave *wave; if(!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button))) return; if((wave=waves_list_get_current(self))) { BtWavelevel *wavelevel; // get current wavelevel if((wavelevel=wavelevels_list_get_current(self,wave))) { GstCaps *caps; gulong play_length, play_rate; guint play_channels; gint16 *play_data; gchar *plugin_name; // create playback pipeline on demand if(!self->priv->preview) { GstElement *ares, *aconv; GstBus *bus; self->priv->preview=gst_element_factory_make("pipeline",NULL); self->priv->preview_src=gst_element_factory_make("memoryaudiosrc",NULL); ares=gst_element_factory_make("audioresample",NULL); aconv=gst_element_factory_make("audioconvert",NULL); plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); if(plugin_name) { self->priv->preview_sink=gst_element_factory_make(plugin_name,NULL); g_free(plugin_name); } else { self->priv->preview_sink=gst_element_factory_make("autoaudiosink",NULL); } gst_bin_add_many(GST_BIN(self->priv->preview),self->priv->preview_src,ares,aconv,self->priv->preview_sink,NULL); gst_element_link_many(self->priv->preview_src,ares,aconv,self->priv->preview_sink,NULL); bus=gst_element_get_bus(self->priv->preview); gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_preview_state_changed), (gpointer)self); g_signal_connect(bus, "message::eos", G_CALLBACK(on_preview_eos), (gpointer)self); g_signal_connect(bus, "message::segment-done", G_CALLBACK(on_preview_segment_done), (gpointer)self); g_signal_connect(bus, "message::error", G_CALLBACK(on_preview_error), (gpointer)self); g_signal_connect(bus, "message::warning", G_CALLBACK(on_preview_warning), (gpointer)self); gst_object_unref(bus); self->priv->position_query=gst_query_new_position(GST_FORMAT_DEFAULT); } // get parameters g_object_get(wave, "channels",&play_channels, NULL); g_object_get(wavelevel, "length",&play_length, "rate",&play_rate, "data",&play_data, NULL); // build caps caps=gst_caps_new_simple("audio/x-raw-int", "rate", G_TYPE_INT,play_rate, "channels",G_TYPE_INT,play_channels, "width",G_TYPE_INT,16, "endianness",G_TYPE_INT,G_BYTE_ORDER, "signedness",G_TYPE_INT,TRUE, NULL); g_object_set(self->priv->preview_src, "caps",caps, "data",play_data, "length",play_length, NULL); gst_caps_unref(caps); self->priv->play_wave=wave; self->priv->play_wavelevel=wavelevel; // build seek events for looping preview_update_seeks(self); // update playback position 15 times a second self->priv->preview_update_id=g_timeout_add(1000/15,on_preview_playback_update,(gpointer)self); // set playing gst_element_set_state(self->priv->preview,GST_STATE_PLAYING); g_object_unref(wavelevel); } else { GST_WARNING("no current wavelevel"); } g_object_unref(wave); } else { GST_WARNING("no current wave"); } } static void on_wavetable_toolbar_stop_clicked(GtkToolButton *button, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); preview_stop(self); } static void on_wavetable_toolbar_clear_clicked(GtkToolButton *button, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->waves_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { BtWave *wave; gulong id; gtk_tree_model_get(model,&iter,WAVE_TABLE_ID,&id,-1); GST_INFO("selected entry id %lu",id); wave=bt_wavetable_get_wave_by_index(self->priv->wavetable,id); bt_wavetable_remove_wave(self->priv->wavetable,wave); bt_edit_application_set_song_unsaved(self->priv->app); // update page waves_list_refresh(self); // release the references g_object_unref(wave); } } static void on_file_chooser_load_sample(GtkFileChooser *chooser, gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->waves_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { BtSong *song; BtWave *wave; gchar *uri,*name,*tmp_name,*ext; gulong id; gtk_tree_model_get(model,&iter,WAVE_TABLE_ID,&id,-1); GST_INFO("selected entry id %lu",id); if((wave=waves_list_get_current(self))) { if(wave==self->priv->play_wave) { preview_stop(self); } g_object_unref(wave); wave=NULL; } // get current entry and load uri=gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(self->priv->file_chooser)); g_object_get(self->priv->app,"song",&song,NULL); // trim off protocol, path and extension tmp_name=g_filename_from_uri(uri,NULL,NULL); name=g_path_get_basename(tmp_name); if((ext=strrchr(name,'.'))) *ext='\0'; g_free(tmp_name); wave=bt_wave_new(song,name,uri,id,1.0,BT_WAVE_LOOP_MODE_OFF,0); // @idea: listen to status property on wave for loader updates bt_edit_application_set_song_unsaved(self->priv->app); // listen to wave::loaded signal and refresh the wave list on success g_signal_connect(wave,"loading-done",G_CALLBACK(on_wave_loading_done),(gpointer)self); // release the references g_object_unref(wave); g_object_unref(song); } } static void on_waves_list_row_activated(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); //on_wavetable_toolbar_play_clicked(GTK_TOOL_BUTTON(self->priv->wavetable_play),user_data); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->wavetable_play),TRUE); } static void on_wavelevels_list_row_activated(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gpointer user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); //on_wavetable_toolbar_play_clicked(GTK_TOOL_BUTTON(self->priv->wavetable_play),user_data); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(self->priv->wavetable_play),TRUE); } static void on_audio_sink_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GST_INFO("audio-sink has changed"); gchar * const plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); GST_INFO(" -> '%s'",plugin_name); g_free(plugin_name); update_audio_sink(self); } static void on_system_audio_sink_changed(const BtSettings * const settings, GParamSpec * const arg, gconstpointer const user_data) { BtMainPageWaves *self=BT_MAIN_PAGE_WAVES(user_data); GST_INFO("system audio-sink has changed"); gchar * const plugin_name=bt_settings_determine_audiosink_name(self->priv->settings); gchar *sink_name; // exchange the machine (only if the system-audiosink is in use) g_object_get((gpointer)settings,"system-audiosink-name",&sink_name,NULL); GST_INFO(" -> '%s' (sytem_sink is '%s')",plugin_name,sink_name); if (!strcmp(plugin_name,sink_name)) { update_audio_sink(self); } g_free(sink_name); g_free(plugin_name); } //-- helper methods static void bt_main_page_waves_init_ui(const BtMainPageWaves *self,const BtMainPages *pages) { GtkWidget *vpaned,*hpaned,*box,*box2,*table; GtkWidget *tool_item; GtkWidget *scrolled_window; GtkCellRenderer *renderer; GEnumClass *enum_class; GEnumValue *enum_value; guint i; GST_DEBUG("!!!! self=%p",self); gtk_widget_set_name(GTK_WIDGET(self),"wave table view"); // vpane vpaned=gtk_vpaned_new(); gtk_container_add(GTK_CONTAINER(self),vpaned); // hpane hpaned=gtk_hpaned_new(); gtk_paned_pack1(GTK_PANED(vpaned),GTK_WIDGET(hpaned),TRUE,FALSE); // vbox (loaded sample list) box=gtk_vbox_new(FALSE,0); gtk_paned_pack1(GTK_PANED(hpaned),GTK_WIDGET(box),FALSE,FALSE); // toolbar self->priv->list_toolbar=gtk_toolbar_new(); gtk_widget_set_name(self->priv->list_toolbar,"sample list toolbar"); // add buttons (play,stop,clear) self->priv->wavetable_play=tool_item=GTK_WIDGET(gtk_toggle_tool_button_new_from_stock(GTK_STOCK_MEDIA_PLAY)); gtk_widget_set_name(tool_item,"Play"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Play current wave table entry as C-4")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->list_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_wavetable_toolbar_play_clicked),(gpointer)self); gtk_widget_set_sensitive(tool_item,FALSE); self->priv->wavetable_stop=tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_STOP)); gtk_widget_set_name(tool_item,"Stop"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Stop playback of current wave table entry")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->list_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_wavetable_toolbar_stop_clicked),(gpointer)self); gtk_widget_set_sensitive(tool_item,FALSE); self->priv->wavetable_clear=tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_CLEAR)); gtk_widget_set_name(tool_item,"Clear"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Clear current wave table entry")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->list_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_wavetable_toolbar_clear_clicked),(gpointer)self); gtk_widget_set_sensitive(tool_item,FALSE); gtk_box_pack_start(GTK_BOX(box),self->priv->list_toolbar,FALSE,FALSE,0); // wave listview scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_ETCHED_IN); self->priv->waves_list=GTK_TREE_VIEW(gtk_tree_view_new()); gtk_widget_set_name(GTK_WIDGET(self->priv->waves_list),"wave-list"); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(self->priv->waves_list),GTK_SELECTION_BROWSE); g_object_set(self->priv->waves_list,"enable-search",FALSE,"rules-hint",TRUE,NULL); g_signal_connect(self->priv->waves_list,"cursor-changed",G_CALLBACK(on_waves_list_cursor_changed),(gpointer)self); g_signal_connect(self->priv->waves_list,"row-activated",G_CALLBACK(on_waves_list_row_activated),(gpointer)self); renderer=gtk_cell_renderer_text_new(); // this seems to cause clipping on some theme+font combinations //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"xalign",1.0,"width-chars",2,NULL); /* Ix: index in wavetable */ gtk_tree_view_insert_column_with_attributes(self->priv->waves_list,-1,_("Ix"),renderer,"text",WAVE_TABLE_HEX_ID,NULL); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"mode",GTK_CELL_RENDERER_MODE_EDITABLE,"editable",TRUE,NULL); g_signal_connect(renderer,"edited",G_CALLBACK(on_wave_name_edited),(gpointer)self); gtk_tree_view_insert_column_with_attributes(self->priv->waves_list,-1,_("Wave"),renderer,"text",WAVE_TABLE_NAME,NULL); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->waves_list)); gtk_container_add(GTK_CONTAINER(box),scrolled_window); // loop-mode combo and volume slider table=gtk_table_new(2,2,FALSE); gtk_table_attach(GTK_TABLE(table),gtk_label_new(_("Volume")), 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); self->priv->volume=GTK_HSCALE(gtk_hscale_new_with_range(0.0,1.0,0.01)); gtk_scale_set_value_pos(GTK_SCALE(self->priv->volume),GTK_POS_RIGHT); g_signal_connect(self->priv->volume, "value-changed", G_CALLBACK(on_volume_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->volume), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(table),gtk_label_new(_("Loop")), 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); self->priv->loop_mode=gtk_combo_box_text_new(); // g_type_class_peek_static() returns NULL :/ enum_class=g_type_class_ref(BT_TYPE_WAVE_LOOP_MODE); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->loop_mode),enum_value->value_name); } } g_type_class_unref(enum_class); gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->loop_mode),BT_WAVE_LOOP_MODE_OFF); g_signal_connect(self->priv->loop_mode, "changed", G_CALLBACK(on_loop_mode_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),self->priv->loop_mode, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); gtk_box_pack_start(GTK_BOX(box),table,FALSE,FALSE,0); // vbox (file browser) box=gtk_vbox_new(FALSE,0); gtk_paned_pack2(GTK_PANED(hpaned),GTK_WIDGET(box),TRUE,FALSE); // toolbar self->priv->browser_toolbar=gtk_toolbar_new(); gtk_widget_set_name(self->priv->browser_toolbar,"sample browser toolbar"); // add buttons (play,stop,load) self->priv->browser_play=tool_item=GTK_WIDGET(gtk_toggle_tool_button_new_from_stock(GTK_STOCK_MEDIA_PLAY)); gtk_widget_set_name(tool_item,"Play"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Play current sample")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->browser_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_browser_toolbar_play_clicked),(gpointer)self); self->priv->browser_stop=tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_MEDIA_STOP)); gtk_widget_set_name(tool_item,"Stop"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Stop playback of current sample")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->browser_toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_browser_toolbar_stop_clicked),(gpointer)self); gtk_widget_set_sensitive(tool_item,FALSE); tool_item=GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_OPEN)); gtk_widget_set_name(tool_item,"Open"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Load current sample into selected wave table entry")); gtk_toolbar_insert(GTK_TOOLBAR(self->priv->browser_toolbar),GTK_TOOL_ITEM(tool_item),-1); //g_signal_connect(tool_item,"clicked",G_CALLBACK(on_browser_toolbar_open_clicked),(gpointer)self); gtk_box_pack_start(GTK_BOX(box),self->priv->browser_toolbar,FALSE,FALSE,0); // file-chooser /* this causes warning on gtk 2.x * Gtk-CRITICAL **: gtk_file_system_path_is_local: assertion `path != NULL' failed * Gdk-CRITICAL **: gdk_drawable_get_size: assertion `GDK_IS_DRAWABLE (drawable)' failed */ self->priv->file_chooser=gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_OPEN); g_signal_connect(self->priv->file_chooser,"file-activated",G_CALLBACK(on_file_chooser_load_sample),(gpointer)self); //g_signal_connect(self->priv->file_chooser,"update-preview",G_CALLBACK(on_file_chooser_info_sample),(gpointer)self); gtk_box_pack_start(GTK_BOX(box),self->priv->file_chooser,TRUE,TRUE,BOX_BORDER); // vbox (sample view) box=gtk_vbox_new(FALSE,0); gtk_paned_pack2(GTK_PANED(vpaned),GTK_WIDGET(box),FALSE,FALSE); // toolbar self->priv->editor_toolbar=gtk_toolbar_new(); gtk_widget_set_name(self->priv->editor_toolbar,"sample edit toolbar"); gtk_box_pack_start(GTK_BOX(box),self->priv->editor_toolbar,FALSE,FALSE,0); // hbox box2=gtk_hbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(box),box2); // zone entries (multiple waves per sample (xm?)) -> (per entry: root key, length, rate, loope start, loop end scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_ETCHED_IN); self->priv->wavelevels_list=GTK_TREE_VIEW(gtk_tree_view_new()); gtk_widget_set_name(GTK_WIDGET(self->priv->wavelevels_list),"wave-level-list"); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(self->priv->wavelevels_list),GTK_SELECTION_BROWSE); g_object_set(self->priv->wavelevels_list,"enable-search",FALSE,"rules-hint",TRUE,NULL); g_signal_connect(self->priv->wavelevels_list,"cursor-changed",G_CALLBACK(on_wavelevels_list_cursor_changed),(gpointer)self); g_signal_connect(self->priv->wavelevels_list,"row-activated",G_CALLBACK(on_wavelevels_list_row_activated),(gpointer)self); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"mode",GTK_CELL_RENDERER_MODE_EDITABLE,"editable",TRUE,NULL); gtk_tree_view_insert_column_with_attributes(self->priv->wavelevels_list,-1,_("Root"),renderer,"text",WAVELEVEL_TABLE_ROOT_NOTE,NULL); g_signal_connect(renderer,"edited",G_CALLBACK(on_wavelevel_root_note_edited),(gpointer)self); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_tree_view_insert_column_with_attributes(self->priv->wavelevels_list,-1,_("Length"),renderer,"text",WAVELEVEL_TABLE_LENGTH,NULL); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"mode",GTK_CELL_RENDERER_MODE_EDITABLE,"editable",TRUE,NULL); gtk_tree_view_insert_column_with_attributes(self->priv->wavelevels_list,-1,_("Rate"),renderer,"text",WAVELEVEL_TABLE_RATE,NULL); g_signal_connect(renderer,"edited",G_CALLBACK(on_wavelevel_rate_edited),(gpointer)self); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"mode",GTK_CELL_RENDERER_MODE_EDITABLE,"editable",TRUE,NULL); gtk_tree_view_insert_column_with_attributes(self->priv->wavelevels_list,-1,_("Loop start"),renderer,"text",WAVELEVEL_TABLE_LOOP_START,NULL); g_signal_connect(renderer,"edited",G_CALLBACK(on_wavelevel_loop_start_edited),(gpointer)self); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer,"mode",GTK_CELL_RENDERER_MODE_EDITABLE,"editable",TRUE,NULL); gtk_tree_view_insert_column_with_attributes(self->priv->wavelevels_list,-1,_("Loop end"),renderer,"text",WAVELEVEL_TABLE_LOOP_END,NULL); g_signal_connect(renderer,"edited",G_CALLBACK(on_wavelevel_loop_end_edited),(gpointer)self); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->wavelevels_list)); gtk_box_pack_start(GTK_BOX(box2),scrolled_window,FALSE,FALSE,0); // tabs for waveform/envelope? or envelope overlayed? // sampleview self->priv->waveform_viewer=bt_waveform_viewer_new(); gtk_widget_set_size_request(self->priv->waveform_viewer, -1, 96); gtk_box_pack_start(GTK_BOX(box2),self->priv->waveform_viewer,TRUE,TRUE,0); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); // let settings control toolbar style and listen to other settings changes on_toolbar_style_changed(self->priv->settings,NULL,(gpointer)self); on_default_sample_folder_changed(self->priv->settings,NULL,(gpointer)self); g_signal_connect(self->priv->settings, "notify::toolbar-style", G_CALLBACK(on_toolbar_style_changed), (gpointer)self); g_signal_connect(self->priv->settings, "notify::sample-folder", G_CALLBACK(on_default_sample_folder_changed), (gpointer)self); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_page_waves_new: * @pages: the page collection * * Create a new instance * * Returns: the new instance */ BtMainPageWaves *bt_main_page_waves_new(const BtMainPages *pages) { BtMainPageWaves *self; GstBus *bus; self=BT_MAIN_PAGE_WAVES(g_object_new(BT_TYPE_MAIN_PAGE_WAVES,NULL)); self->priv->settings=bt_settings_make(); bt_main_page_waves_init_ui(self,pages); // create playbin self->priv->playbin=gst_element_factory_make("playbin2",NULL); bus=gst_element_get_bus(self->priv->playbin); gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH); g_signal_connect(bus, "message::state-changed", G_CALLBACK(on_playbin_state_changed), (gpointer)self); gst_object_unref(bus); // watch settings changes g_signal_connect(self->priv->settings, "notify::audiosink", G_CALLBACK(on_audio_sink_changed), (gpointer)self); g_signal_connect(self->priv->settings, "notify::system-audiosink", G_CALLBACK(on_system_audio_sink_changed), (gpointer)self); update_audio_sink(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_main_page_waves_dispose(GObject *object) { BtMainPageWaves *self = BT_MAIN_PAGE_WAVES(object); GstBus *bus; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_signal_handlers_disconnect_matched(self->priv->settings,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); g_object_unref(self->priv->settings); g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_changed,NULL); g_object_unref(self->priv->n2f); g_object_try_unref(self->priv->wavetable); g_object_unref(self->priv->app); // shut down loader-preview playbin gst_element_set_state(self->priv->playbin,GST_STATE_NULL); bus=gst_element_get_bus(GST_ELEMENT(self->priv->playbin)); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); gst_bus_remove_signal_watch(bus); gst_object_unref(bus); gst_object_unref(self->priv->playbin); // shut down wavetable-preview playbin if(self->priv->preview) { preview_stop(self); gst_element_set_state(self->priv->preview,GST_STATE_NULL); bus=gst_element_get_bus(GST_ELEMENT(self->priv->preview)); g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); gst_bus_remove_signal_watch(bus); gst_object_unref(bus); gst_object_unref(self->priv->preview); if(self->priv->play_seek_event) gst_event_unref(self->priv->play_seek_event); if(self->priv->loop_seek_event[0]) gst_event_unref(self->priv->loop_seek_event[0]); if(self->priv->loop_seek_event[1]) gst_event_unref(self->priv->loop_seek_event[1]); gst_query_unref(self->priv->position_query); } GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_page_waves_parent_class)->dispose(object); } static void bt_main_page_waves_init(BtMainPageWaves *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGE_WAVES, BtMainPageWavesPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->n2f = gstbt_tone_conversion_new(GSTBT_TONE_CONVERSION_CROMATIC); } static void bt_main_page_waves_class_init(BtMainPageWavesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainPageWavesPrivate)); gobject_class->dispose = bt_main_page_waves_dispose; } buzztard-0.6.0/src/ui/edit/machine-properties-dialog.h0000644042355400116100000000500611625722250017651 00000000000000/* $Id: machine-properties-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_PROPERTIES_DIALOG_H #define BT_MACHINE_PROPERTIES_DIALOG_H #include #include #define BT_TYPE_MACHINE_PROPERTIES_DIALOG (bt_machine_properties_dialog_get_type ()) #define BT_MACHINE_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_PROPERTIES_DIALOG, BtMachinePropertiesDialog)) #define BT_MACHINE_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_PROPERTIES_DIALOG, BtMachinePropertiesDialogClass)) #define BT_IS_MACHINE_PROPERTIES_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_PROPERTIES_DIALOG)) #define BT_IS_MACHINE_PROPERTIES_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_PROPERTIES_DIALOG)) #define BT_MACHINE_PROPERTIES_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_PROPERTIES_DIALOG, BtMachinePropertiesDialogClass)) /* type macros */ typedef struct _BtMachinePropertiesDialog BtMachinePropertiesDialog; typedef struct _BtMachinePropertiesDialogClass BtMachinePropertiesDialogClass; typedef struct _BtMachinePropertiesDialogPrivate BtMachinePropertiesDialogPrivate; /** * BtMachinePropertiesDialog: * * the root window for the editor application */ struct _BtMachinePropertiesDialog { GtkWindow parent; /*< private >*/ BtMachinePropertiesDialogPrivate *priv; }; struct _BtMachinePropertiesDialogClass { GtkWindowClass parent; }; GType bt_machine_properties_dialog_get_type(void) G_GNUC_CONST; BtMachinePropertiesDialog *bt_machine_properties_dialog_new(const BtMachine *machine); #endif // BT_MACHINE_PROPERTIES_DIALOG_H buzztard-0.6.0/src/ui/edit/playback-controller-socket.c0000644042355400116100000004510611576360376020067 00000000000000/* $Id: playback-controller-socket.c 3364 2011-05-12 14:55:59Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btplaybackcontrollersocket * @short_description: sockets based playback controller * * Allows the coherence upnp backend for buzztard to remote control and query * buzztard-edit. * * Function can be tested doing "netcat -n 127.0.0.1 7654". */ #define BT_EDIT #define BT_PLAYBACK_CONTROLLER_SOCKET_C #include "bt-edit.h" #include #include #include #include struct _BtPlaybackControllerSocketPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ G_POINTER_ALIAS(BtEditApplication *,app); /* positions for each label */ GList *playlist; gulong cur_pos; gboolean seek; /* data for the status */ G_POINTER_ALIAS(BtSequence *,sequence); G_POINTER_ALIAS(GstElement *,gain); gboolean is_playing; gchar *length_str; gchar *cur_label; /* master */ gint master_socket,master_source; GIOChannel *master_channel; /* client */ gint client_socket,client_source; GIOChannel *client_channel; }; #define DEFAULT_LABEL "start" //-- the class G_DEFINE_TYPE (BtPlaybackControllerSocket, bt_playback_controller_socket, G_TYPE_OBJECT); //-- helper methods static void client_connection_close(BtPlaybackControllerSocket *self) { if(self->priv->client_channel) { GError *error=NULL; if(self->priv->client_source>=0) { g_source_remove(self->priv->client_source); // the above already unrefs //g_io_channel_unref(self->priv->client_channel); self->priv->client_source=-1; } g_io_channel_shutdown(self->priv->client_channel,TRUE,&error); if(error) { GST_WARNING("iochannel error while shutting down client: %s",error->message); g_error_free(error); } g_io_channel_unref(self->priv->client_channel); self->priv->client_channel=NULL; } if(self->priv->client_socket>-1) { close(self->priv->client_socket); self->priv->client_socket=-1; } } static gchar *client_cmd_parse_and_process(BtPlaybackControllerSocket *self,gchar *cmd) { gchar *reply=NULL; BtSong *song; g_object_get(self->priv->app,"song",&song,NULL); if(!song) return(NULL); if(!strcasecmp(cmd,"browse")) { BtSequence *sequence; BtSongInfo *song_info; gchar *str,*temp; gulong i,length; gboolean no_labels=TRUE; g_object_get(song,"sequence",&sequence,"song-info",&song_info,NULL); g_object_get(song_info,"name",&str,NULL); g_object_get(sequence,"length",&length,NULL); reply=g_strconcat("playlist|",str,NULL); g_free(str); if(self->priv->playlist) { g_list_free(self->priv->playlist); self->priv->playlist=NULL; } // get sequence labels for(i=0;ipriv->playlist=g_list_append(self->priv->playlist,GINT_TO_POINTER(i)); } } // if there are no labels, return the start if(no_labels) { temp=g_strconcat(reply,"|"DEFAULT_LABEL,NULL); g_free(reply); reply=temp; } g_object_unref(song_info); g_object_unref(sequence); } else if(!strncasecmp(cmd,"play|",5)) { g_free(self->priv->cur_label); // always stop, so that seeking works bt_song_stop(song); // get playlst entry if(cmd[5] && self->priv->playlist) { // get position for ix-th label self->priv->cur_pos=GPOINTER_TO_INT(g_list_nth_data(self->priv->playlist,atoi(&cmd[5]))); self->priv->cur_label=bt_sequence_get_label(self->priv->sequence,self->priv->cur_pos); } else { self->priv->cur_pos=0; self->priv->cur_label=g_strdup(DEFAULT_LABEL); } GST_INFO("starting to play"); if(!bt_song_play(song)) { GST_WARNING("failed to play"); } // seek - we're seeking in on_song_is_playing_notify() //GST_INFO("seeking to pos=%d",self->priv->cur_pos); // this causes stack smashing, but only if we play afterwards // its also avoided by making the string buffer in main-statusbar.c (notify) +4 bytes //g_object_set(song,"play-pos",self->priv->cur_pos,NULL); self->priv->seek=TRUE; } else if(!strcasecmp(cmd,"stop")) { if(!bt_song_stop(song)) { GST_WARNING("failed to stop"); } } else if(!strcasecmp(cmd,"status")) { gchar *state[]={"stopped","playing"}; gchar *mode[]={"on","off"}; gulong pos,msec,sec,min; GstClockTime bar_time; gdouble volume; gboolean loop; g_object_get(song,"play-pos",&pos,NULL); bar_time=bt_sequence_get_bar_time(self->priv->sequence); g_object_get(self->priv->sequence,"loop",&loop,NULL); // calculate playtime msec=(gulong)((pos*bar_time)/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); // get the current input_gain and adjust volume widget g_object_get(self->priv->gain,"volume",&volume,NULL); reply=g_strdup_printf("event|%s|%s|0:%02lu:%02lu.%03lu|%s|%u|off|%s", state[self->priv->is_playing], self->priv->cur_label, min,sec,msec, self->priv->length_str, (guint)(100.0*volume), mode[loop]); //reply=g_strdup("event|stopped|start|0:00:00.000|0:00:00.000|100|off|off"); } else if(!strncasecmp(cmd,"set|",4)) { gchar *subcmd=&cmd[4]; if(!strncasecmp(subcmd,"volume|",7)) { if(subcmd[7] && self->priv->gain) { gdouble volume; volume=((gdouble)atoi(&subcmd[7]))/100.0; g_object_set(self->priv->gain,"volume",volume,NULL); } } else if(!strncasecmp(subcmd,"mute|",5)) { // we ignore this for now } else if(!strncasecmp(subcmd,"repeat|",7)) { if(!strcasecmp(&subcmd[7],"on")) { g_object_set(self->priv->sequence,"loop",TRUE,NULL); } else if(!strcasecmp(&subcmd[7],"off")) { g_object_set(self->priv->sequence,"loop",FALSE,NULL); } } else { GST_WARNING("unknown setting: %s",subcmd); } } else if(!strncasecmp(cmd,"get|",4)) { gchar *subcmd=&cmd[4]; if(!strcasecmp(subcmd,"volume")) { gdouble volume; g_object_get(self->priv->gain,"volume",&volume,NULL); reply=g_strdup_printf("volume|%u", (guint)(100.0*volume)); } else if(!strcasecmp(subcmd,"mute")) { reply=g_strdup("mute|off"); } else if(!strcasecmp(subcmd,"repeat")) { gboolean loop; gchar *mode[]={"on","off"}; g_object_get(self->priv->sequence,"loop",&loop,NULL); reply=g_strdup_printf("repeat|%s",mode[loop]); } else { GST_WARNING("unknown setting: %s",subcmd); } } else { GST_WARNING("unknown command: %s",cmd); } g_object_unref(song); return(reply); } static gchar *client_read(BtPlaybackControllerSocket *self) { gchar *str; gsize len,term; GError *error=NULL; g_io_channel_read_line(self->priv->client_channel,&str,&len,&term,&error); if(!error) { if(str && len>0) str[term]='\0'; GST_INFO("command received : %s",str); } else { GST_WARNING("iochannel error while reading: %s",error->message); g_error_free(error); if(str) { g_free(str); str=NULL; } } return(str); } static gboolean client_write(BtPlaybackControllerSocket *self,gchar *str) { gboolean res=FALSE; GError *error=NULL; gsize len; if(!self->priv->client_channel) return(FALSE); GST_INFO("sending reply : %s",str); g_io_channel_write_chars(self->priv->client_channel,str,-1,&len,&error); if(!error) { g_io_channel_write_chars(self->priv->client_channel,"\r\n",-1,&len,&error); if(!error) { g_io_channel_flush(self->priv->client_channel,&error); if(!error) { res=TRUE; } else { GST_WARNING("iochannel error while flushing: %s",error->message); g_error_free(error); } } else { GST_WARNING("iochannel error while writing: %s",error->message); g_error_free(error); } } else { GST_WARNING("iochannel error while writing: %s",error->message); g_error_free(error); } return(res); } //-- event handler static gboolean client_socket_io_handler(GIOChannel *channel,GIOCondition condition,gpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); gboolean res=TRUE; gchar *cmd,*reply; GST_INFO("client io handler : %d",condition); if(condition & (G_IO_IN | G_IO_PRI)) { if((cmd=client_read(self))) { if((reply=client_cmd_parse_and_process(self,cmd))) { if(!client_write(self,reply)) { res=FALSE; } g_free(reply); } g_free(cmd); } else res=FALSE; } if(condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) { res=FALSE; } if(!res) { GST_INFO("closing client connection"); self->priv->master_source=-1; } return(res); } static gboolean master_socket_io_handler(GIOChannel *channel,GIOCondition condition,gpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); struct sockaddr addr={0,}; socklen_t addrlen=sizeof(struct sockaddr); GST_INFO("master io handler : %d",condition); if(condition & (G_IO_IN | G_IO_PRI)) { if((self->priv->client_socket=accept(self->priv->master_socket, &addr, &addrlen))<0) { GST_WARNING ("accept error: %s", g_strerror (errno)); } else { self->priv->client_channel=g_io_channel_unix_new(self->priv->client_socket); //self->priv->client_source=g_io_add_watch(self->priv->client_channel,G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,client_socket_io_handler,(gpointer)self); self->priv->client_source=g_io_add_watch_full(self->priv->client_channel, G_PRIORITY_LOW, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, client_socket_io_handler, (gpointer)self, NULL); GST_INFO("playback controller client connected"); } } if(condition & (G_IO_HUP | G_IO_ERR | G_IO_NVAL)) { client_connection_close(self); GST_INFO("playback controller client disconnected"); } return(TRUE); } static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); g_object_get((gpointer)song,"is-playing",&self->priv->is_playing,NULL); if(self->priv->is_playing && self->priv->seek) { // do this only if play was invoked via playbackcontroller self->priv->seek=FALSE; GST_INFO("seeking to pos=%lu",self->priv->cur_pos); g_object_set((gpointer)song,"play-pos",self->priv->cur_pos,NULL); } } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); BtSong *song; BtSinkMachine *master; gulong msec,sec,min; GST_INFO("song has changed : app=%p, toolbar=%p",app,user_data); g_object_get(self->priv->app,"song",&song,NULL); if(!song) return; self->priv->cur_pos=0; client_write(self,"flush"); g_signal_connect(song,"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),(gpointer)self); g_object_try_weak_unref(self->priv->sequence); g_object_get(song,"sequence",&self->priv->sequence,"master",&master,NULL); g_object_try_weak_ref(self->priv->sequence); g_object_unref(self->priv->sequence); g_object_try_weak_unref(self->priv->gain); g_object_get(master,"input-gain",&self->priv->gain,NULL); g_object_try_weak_ref(self->priv->gain); g_object_unref(self->priv->gain); // calculate length g_free(self->priv->length_str); msec=(gulong)(bt_sequence_get_loop_time(self->priv->sequence)/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); self->priv->length_str=g_strdup_printf("0:%02lu:%02lu.%03lu",min,sec,msec); g_object_unref(master); g_object_unref(song); } //-- helper static void master_connection_close(BtPlaybackControllerSocket *self) { if(self->priv->master_channel) { GError *error=NULL; if(self->priv->master_source>=0) { g_source_remove(self->priv->master_source); // the above already unrefs //g_io_channel_unref(self->priv->master_channel); self->priv->master_source=-1; } g_io_channel_shutdown(self->priv->master_channel,TRUE,&error); if(error) { GST_WARNING("iochannel error while shutting down master: %s",error->message); g_error_free(error); } g_io_channel_unref(self->priv->master_channel); self->priv->master_channel=NULL; } if(self->priv->master_socket>-1) { close(self->priv->master_socket); self->priv->master_socket=-1; } client_connection_close(self); GST_INFO("playback controller terminated"); } static void master_connection_open(BtPlaybackControllerSocket *self) { BtSettings *settings; gboolean active; guint port; static struct sockaddr_in serv_addr; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"coherence-upnp-active",&active,"coherence-upnp-port",&port,NULL); g_object_unref(settings); if(!active) return; /* new socket: internet address family, stream socket */ if((self->priv->master_socket=socket(AF_INET,SOCK_STREAM,0))<0) { goto socket_error; } memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);// my address serv_addr.sin_port = htons(port); if(bind(self->priv->master_socket,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0) { goto bind_error; } if(listen(self->priv->master_socket,64)<0) { goto listen_error; } self->priv->master_channel=g_io_channel_unix_new(self->priv->master_socket); //self->priv->master_source=g_io_add_watch(self->priv->master_channel,G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,master_socket_io_handler,(gpointer)self); self->priv->master_source=g_io_add_watch_full(self->priv->master_channel, G_PRIORITY_LOW, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL, master_socket_io_handler, (gpointer)self, NULL); GST_INFO("playback controller running"); return; socket_error: GST_WARNING("socket allocation failed: %s",g_strerror(errno)); return; bind_error: GST_WARNING("binding the socket failed: %s",g_strerror(errno)); return; listen_error: GST_WARNING("listen failed: %s",g_strerror(errno)); return; } static void on_port_notify(BtSettings * const settings, GParamSpec * const arg, gconstpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); gboolean active; g_object_get(settings,"coherence-upnp-active",&active,NULL); if(active) { master_connection_close(self); master_connection_open(self); } } static void on_active_notify(BtSettings * const settings, GParamSpec * const arg, gconstpointer user_data) { BtPlaybackControllerSocket *self=BT_PLAYBACK_CONTROLLER_SOCKET(user_data); gboolean active; g_object_get(settings,"coherence-upnp-active",&active,NULL); if(active) { if(!self->priv->master_channel) { master_connection_open(self); } } else { master_connection_close(self); } } static void settings_listen(BtPlaybackControllerSocket *self) { BtSettings *settings; g_object_get(self->priv->app,"settings",&settings,NULL); g_signal_connect(settings, "notify::coherence-upnp-active", G_CALLBACK(on_active_notify), (gpointer)self); g_signal_connect(settings, "notify::coherence-upnp-port", G_CALLBACK(on_port_notify), (gpointer)self); on_active_notify(settings,NULL,(gpointer)self); g_object_unref(settings); } //-- constructor methods /** * bt_playback_controller_socket_new: * * Create a new instance * * Returns: the new instance */ BtPlaybackControllerSocket *bt_playback_controller_socket_new(void) { BtPlaybackControllerSocket *self; self=BT_PLAYBACK_CONTROLLER_SOCKET(g_object_new(BT_TYPE_PLAYBACK_CONTROLLER_SOCKET,NULL)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_playback_controller_socket_dispose(GObject *object) { BtPlaybackControllerSocket *self = BT_PLAYBACK_CONTROLLER_SOCKET(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_weak_unref(self->priv->gain); g_object_try_weak_unref(self->priv->sequence); g_object_try_weak_unref(self->priv->app); master_connection_close(self); G_OBJECT_CLASS(bt_playback_controller_socket_parent_class)->dispose(object); } static void bt_playback_controller_socket_finalize(GObject *object) { BtPlaybackControllerSocket *self = BT_PLAYBACK_CONTROLLER_SOCKET(object); GST_DEBUG("!!!! self=%p",self); if(self->priv->playlist) { g_list_free(self->priv->playlist); self->priv->playlist=NULL; } g_free(self->priv->length_str); g_free(self->priv->cur_label); G_OBJECT_CLASS(bt_playback_controller_socket_parent_class)->finalize(object); } static void bt_playback_controller_socket_init(BtPlaybackControllerSocket *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_PLAYBACK_CONTROLLER_SOCKET, BtPlaybackControllerSocketPrivate); GST_DEBUG("!!!! self=%p",self); /* this is created from the app, we need to avoid a ref-cycle */ self->priv->app = bt_edit_application_new(); g_object_try_weak_ref(self->priv->app); g_object_unref(self->priv->app); // check settings //master_connection_open(self); settings_listen(self); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); } static void bt_playback_controller_socket_class_init(BtPlaybackControllerSocketClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtPlaybackControllerSocketPrivate)); gobject_class->dispose = bt_playback_controller_socket_dispose; gobject_class->finalize = bt_playback_controller_socket_finalize; } buzztard-0.6.0/src/ui/edit/machine-actions.c0000644042355400116100000000475411576360376015700 00000000000000/* $Id: machine-actions.c 2966 2010-09-06 13:07:39Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachineactions * @short_description: shared machine released ui actions * * Shared UI actions for machines that can be invoked from several UI classes. */ #define BT_EDIT #define BT_MACHINE_ACTIONS_C #include "bt-edit.h" /** * bt_machine_action_about: * @machine: the machine * @main_window: the main window to use as parent * * Shows the about dialog for the given @machine. */ void bt_machine_action_about(BtMachine *machine,BtMainWindow *main_window) { GstElementFactory *element_factory; GstElement *element; GST_INFO("context_menu about event occurred"); // show info about machine g_object_get(machine,"machine",&element,NULL); if((element_factory=gst_element_get_factory(element))) { const gchar *element_longname=gst_element_factory_get_longname(element_factory); const gchar *element_author=gst_element_factory_get_author(element_factory); const gchar *element_description=gst_element_factory_get_description(element_factory); gchar *str,*str_author,*str_desc; str_desc=g_markup_escape_text(element_description,strlen(element_description)); str_author=g_markup_escape_text(element_author,strlen(element_author)); // add a '\n' after each ',' to nicely format the message_box str=str_author; while((str=strchr(str,','))) { str++; if(*str==' ') *str='\n'; } // format about message for machines str=g_strdup_printf(_("by %s\n\n%s"), str_author,str_desc ); bt_dialog_message(main_window,_("About..."),element_longname,str); g_free(str);g_free(str_author);g_free(str_desc); } gst_object_unref(element); } buzztard-0.6.0/src/ui/edit/render-progress.c0000644042355400116100000002665611645650345015757 00000000000000/* $Id: render-progress.c 3692 2011-10-13 20:58:12Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btrenderprogress * @short_description: class for the editor render progress * * Song recording status dialog. */ /* @todo: * turn off-level meters (and ev. open wire-analysis windows) to speed up recording */ #define BT_EDIT #define BT_RENDER_PROGRESS_C #include "bt-edit.h" enum { RENDER_PROGRESS_SETTINGS=1 }; struct _BtRenderProgressPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* dialog that has the settings */ G_POINTER_ALIAS(BtRenderDialog *,settings); /* dialog widgets */ GtkProgressBar *track_progress; GtkLabel *info; gboolean has_error; }; //-- the class G_DEFINE_TYPE (BtRenderProgress, bt_render_progress, GTK_TYPE_DIALOG); //-- event handler static void on_song_play_pos_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtRenderProgress *self=BT_RENDER_PROGRESS(user_data); BtSequence *sequence; gulong pos,length; gdouble progress; // the +4 is not really needed, but I get a stack smashing error on ubuntu without gchar str[3+2*(2+2+3+3) + 4]; gulong msec1,sec1,min1,msec2,sec2,min2; GstClockTime bar_time; g_object_get((gpointer)song,"sequence",&sequence,"play-pos",&pos,NULL); g_object_get(sequence,"length",&length,NULL); bar_time=bt_sequence_get_bar_time(sequence); progress=(gdouble)pos/(gdouble)length; if((progress>=1.0) || self->priv->has_error) { progress=1.0; bt_song_stop(song); gtk_dialog_response(GTK_DIALOG(self),GTK_RESPONSE_NONE); } GST_INFO("progress %ld/%ld=%lf",pos,length,progress); msec1=(gulong)((pos*bar_time)/G_USEC_PER_SEC); min1=(gulong)(msec1/60000);msec1-=(min1*60000); sec1=(gulong)(msec1/ 1000);msec1-=(sec1* 1000); msec2=(gulong)((length*bar_time)/G_USEC_PER_SEC); min2=(gulong)(msec2/60000);msec2-=(min2*60000); sec2=(gulong)(msec2/ 1000);msec2-=(sec2* 1000); // format g_sprintf(str,"%02lu:%02lu.%03lu / %02lu:%02lu.%03lu",min1,sec1,msec1 ,min2,sec2,msec2); g_object_set(self->priv->track_progress,"fraction",progress,"text",str,NULL); g_object_unref(sequence); } static void on_song_error(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { BtRenderProgress *self=BT_RENDER_PROGRESS(user_data); GST_WARNING("received %s bus message from %s", GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); self->priv->has_error = TRUE; } //-- helper methods static gboolean bt_render_progress_record(const BtRenderProgress *self, BtSong *song, BtSinkBin *sink_bin, gchar *file_name) { gchar *info; gboolean is_playing, res=FALSE; g_object_set(sink_bin,"record-file-name",file_name,NULL); GST_INFO("recording to '%s'",file_name); info=g_strdup_printf(_("Recording to: %s"),file_name); gtk_label_set_text(self->priv->info,info); g_free(info); bt_song_play(song); bt_song_write_to_lowlevel_dot_file(song); // ugly, but we need to make sure we check the eror before running the dialog while(gtk_events_pending()) gtk_main_iteration(); if(!self->priv->has_error) { gint ret=gtk_dialog_run(GTK_DIALOG(self)); if(ret!=GTK_RESPONSE_REJECT) { g_object_get(song,"is-playing",&is_playing,NULL); if(!is_playing) { res=TRUE; } } } bt_song_stop(song); return(res); } static void bt_render_progress_init_ui(const BtRenderProgress *self) { GtkWidget *box; gtk_widget_set_name(GTK_WIDGET(self),"song render progress"); gtk_window_set_title(GTK_WINDOW(self), _("song render progress")); // add progress commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_REJECT); // add widgets to the progress content area box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); self->priv->info=GTK_LABEL(gtk_label_new("")); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->info),FALSE,FALSE,0); self->priv->track_progress=GTK_PROGRESS_BAR(gtk_progress_bar_new()); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->track_progress),FALSE,FALSE,0); } //-- constructor methods /** * bt_render_progress_new: * @settings: the settings for the rendering * * Create a new instance * * Returns: the new instance */ BtRenderProgress *bt_render_progress_new(BtRenderDialog *settings) { BtRenderProgress *self; self=BT_RENDER_PROGRESS(g_object_new(BT_TYPE_RENDER_PROGRESS,"settings",settings,NULL)); bt_render_progress_init_ui(self); return(self); } //-- methods /** * bt_render_progress_run: * @self: the progress-dialog * * Run the rendering and show the progress. */ void bt_render_progress_run(const BtRenderProgress *self) { BtSong *song; BtSetup *setup; BtSongInfo *song_info; GstBin *bin; BtMachine *machine; gboolean unsaved; g_object_get(self->priv->app,"song",&song,"unsaved",&unsaved,NULL); g_object_get(song,"setup",&setup,"song-info",&song_info,"bin",&bin,NULL); // lookup the audio-sink machine and change mode if((machine=bt_setup_get_machine_by_type(setup,BT_TYPE_SINK_MACHINE))) { gchar *file_name; BtSinkBinRecordFormat format; BtRenderMode mode; BtSinkBin *sink_bin; GstElement *convert; GstBus *bus; g_object_get(machine,"machine",&sink_bin,"adder-convert",&convert,NULL); g_object_get(self->priv->settings,"format",&format,"mode",&mode,"file-name",&file_name,NULL); // connect bus signals bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::error", G_CALLBACK(on_song_error), (gpointer)self); g_signal_connect(song, "notify::play-pos", G_CALLBACK(on_song_play_pos_notify), (gpointer)self); g_object_set(sink_bin, "mode",BT_SINK_BIN_MODE_RECORD, // hrmpf: this hangs :/ //"mode",BT_SINK_BIN_MODE_PLAY_AND_RECORD, "record-format",format, NULL); /* @todo: configure dithering/noise-shaping * - should sink-bin do it so that we get this also when recording from * the commandline (need some extra cmdline options for it :/ * - we could also put it to the options * - sink-machine could also set this (hard-coded) when going to record mode */ g_object_set(convert,"dithering",2,"noise-shaping",3,NULL); if(mode==BT_RENDER_MODE_MIXDOWN) { if(!bt_render_progress_record(self,song,sink_bin,file_name)) { GST_WARNING("recording canceled/failed"); g_unlink(file_name); } } else { BtMachine *machine; GList *list,*node; gchar *track_file_name; gchar *song_name,*track_name,*id; guint track=0; gboolean res; g_object_get(song_info,"name",&song_name,NULL); list=bt_setup_get_machines_by_type(setup,BT_TYPE_SOURCE_MACHINE); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); g_object_set(machine,"state",BT_MACHINE_STATE_SOLO,NULL); g_object_get(machine,"id",&id,NULL); track_name=g_strdup_printf("%s : %s",song_name,id); g_object_set(song_info,"name",track_name,NULL); g_free(track_name); g_free(id); track_file_name=g_strdup_printf(file_name,track); res=bt_render_progress_record(self,song,sink_bin,track_file_name); g_free(track_file_name); g_object_set(machine,"state",BT_MACHINE_STATE_NORMAL,NULL); if(!res) { GST_WARNING("recording canceled/failed"); g_unlink(track_file_name); break; } track++; } g_object_set(song_info,"name",song_name,NULL); g_list_free(list); g_free(song_name); g_object_set(self->priv->app,"unsaved",unsaved,NULL); } g_signal_handlers_disconnect_matched(bus,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_error,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_play_pos_notify,NULL); g_object_set(sink_bin, "mode",BT_SINK_BIN_MODE_PLAY, NULL); /* reset dithering/noise-shaping */ g_object_set(convert,"dithering",0,"noise-shaping",0,NULL); g_free(file_name); gst_object_unref(bus); gst_object_unref(convert); gst_object_unref(sink_bin); g_object_unref(machine); } gst_object_unref(bin); g_object_unref(song_info); g_object_unref(setup); g_object_unref(song); } //-- wrapper //-- class internals static void bt_render_progress_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtRenderProgress *self = BT_RENDER_PROGRESS(object); return_if_disposed(); switch (property_id) { case RENDER_PROGRESS_SETTINGS: { g_object_try_weak_unref(self->priv->settings); self->priv->settings = BT_RENDER_DIALOG(g_value_get_object(value)); g_object_try_weak_ref(self->priv->settings); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_render_progress_dispose(GObject *object) { BtRenderProgress *self = BT_RENDER_PROGRESS(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); g_object_unref(song); } g_object_try_weak_unref(self->priv->settings); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_render_progress_parent_class)->dispose(object); } static void bt_render_progress_init(BtRenderProgress *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_RENDER_PROGRESS, BtRenderProgressPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_render_progress_class_init(BtRenderProgressClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtRenderProgressPrivate)); gobject_class->set_property = bt_render_progress_set_property; gobject_class->dispose = bt_render_progress_dispose; g_object_class_install_property(gobject_class,RENDER_PROGRESS_SETTINGS, g_param_spec_object("settings", "settings construct prop", "Set settings object, the progress dialog handles", BT_TYPE_RENDER_DIALOG, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/ui-resources.h0000644042355400116100000001442611625722250015251 00000000000000/* $Id: ui-resources.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_UI_RESOURCES_H #define BT_UI_RESOURCES_H #include #include #define BT_TYPE_UI_RESOURCES (bt_ui_resources_get_type ()) #define BT_UI_RESOURCES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_UI_RESOURCES, BtUIResources)) #define BT_UI_RESOURCES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_UI_RESOURCES, BtUIResourcesClass)) #define BT_IS_UI_RESOURCES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_UI_RESOURCES)) #define BT_IS_UI_RESOURCES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_UI_RESOURCES)) #define BT_UI_RESOURCES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_UI_RESOURCES, BtUIResourcesClass)) /* type macros */ typedef struct _BtUIResources BtUIResources; typedef struct _BtUIResourcesClass BtUIResourcesClass; typedef struct _BtUIResourcesPrivate BtUIResourcesPrivate; /** * BtUIResources: * * a collection of shared ui ressources */ struct _BtUIResources { GObject parent; /*< private >*/ BtUIResourcesPrivate *priv; }; struct _BtUIResourcesClass { GObjectClass parent; }; /** * BtUIResourcesColors: * @BT_UI_RES_COLOR_CURSOR: cursor color * @BT_UI_RES_COLOR_SELECTION1: selection color * @BT_UI_RES_COLOR_SELECTION2: shaded selection color * @BT_UI_RES_COLOR_PLAYLINE: playback line * @BT_UI_RES_COLOR_LOOPLINE: loop line * @BT_UI_RES_COLOR_ENDLINE: song end line * @BT_UI_RES_COLOR_SOURCE_MACHINE_BASE: source machine base color * @BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1: source machine lighter variant * @BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2: source machine even lighter variant * @BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1: source machine darker variant * @BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2: source machine even darker variant * @BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE: processor machine base color * @BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1: processor machine lighter variant * @BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2: processor machine even lighter variant * @BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1: processor machine darker variant * @BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2: processor machine even darker variant * @BT_UI_RES_COLOR_SINK_MACHINE_BASE: sink machine base color * @BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1: sink machine lighter variant * @BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2: sink machine even lighter variant * @BT_UI_RES_COLOR_SINK_MACHINE_DARK1: sink machine darker variant * @BT_UI_RES_COLOR_SINK_MACHINE_DARK2: sink machine even darker variant * @BT_UI_RES_COLOR_ANALYZER_PEAK: analyzer peak lines * @BT_UI_RES_COLOR_GRID_LINES: grid lines * @BT_UI_RES_COLOR_COUNT: symbolic color count * * Symbolic color names for the UI. */ typedef enum { BT_UI_RES_COLOR_CURSOR=0, BT_UI_RES_COLOR_SELECTION1, BT_UI_RES_COLOR_SELECTION2, BT_UI_RES_COLOR_PLAYLINE, BT_UI_RES_COLOR_LOOPLINE, BT_UI_RES_COLOR_ENDLINE, BT_UI_RES_COLOR_SOURCE_MACHINE_BASE, /* machine view normal */ BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1, /* list view odd */ BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2, /* list view even */ BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1, /* machine title */ BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2, /* --- */ BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE, /* machine view normal */ BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1, /* list view odd */ BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2, /* list view even */ BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1, /* machine title */ BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2, /* --- */ BT_UI_RES_COLOR_SINK_MACHINE_BASE, /* machine view normal */ BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1, /* list view odd */ BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2, /* list view even */ BT_UI_RES_COLOR_SINK_MACHINE_DARK1, /* --- */ BT_UI_RES_COLOR_SINK_MACHINE_DARK2, /* --- */ BT_UI_RES_COLOR_ANALYZER_PEAK, /* analyzer widnow peak marks */ BT_UI_RES_COLOR_GRID_LINES, /* grid lines */ BT_UI_RES_COLOR_COUNT } BtUIResourcesColors; /** * BtUIResourcesMachineColors: * @BT_UI_RES_COLOR_MACHINE_BASE: base color * @BT_UI_RES_COLOR_MACHINE_BRIGHT1: lighter variant * @BT_UI_RES_COLOR_MACHINE_BRIGHT2: even lighter variant * @BT_UI_RES_COLOR_MACHINE_DARK1: darker variant * @BT_UI_RES_COLOR_MACHINE_DARK2: even darker variant * * Symbolic color names for machines. */ typedef enum { BT_UI_RES_COLOR_MACHINE_BASE=0, /* machine view normal */ BT_UI_RES_COLOR_MACHINE_BRIGHT1, /* list view odd */ BT_UI_RES_COLOR_MACHINE_BRIGHT2, /* list view even */ BT_UI_RES_COLOR_MACHINE_DARK1, /* --- */ BT_UI_RES_COLOR_MACHINE_DARK2 /* --- */ } BtUIResourcesMachineColors; GType bt_ui_resources_get_type(void) G_GNUC_CONST; BtUIResources *bt_ui_resources_new(void); GdkPixbuf *bt_ui_resources_get_icon_pixbuf_by_machine(const BtMachine *machine); GdkPixbuf *bt_ui_resources_get_machine_graphics_pixbuf_by_machine(const BtMachine *machine, gdouble zoom); GtkWidget *bt_ui_resources_get_icon_image_by_machine(const BtMachine *machine); GtkWidget *bt_ui_resources_get_icon_image_by_machine_type(GType machine_type); GdkColor *bt_ui_resources_get_gdk_color(BtUIResourcesColors color_type); void bt_ui_resources_get_rgb_color(BtUIResourcesColors color_type, gdouble *r, gdouble *g, gdouble *b); guint32 bt_ui_resources_get_color_by_machine(const BtMachine *machine,BtUIResourcesMachineColors color_type); GtkAccelGroup *bt_ui_resources_get_accel_group(void); #endif // BT_UI_RESOURCES_H buzztard-0.6.0/src/ui/edit/machine-menu.h0000644042355400116100000000422611625722250015167 00000000000000/* $Id: machine-menu.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_MENU_H #define BT_MACHINE_MENU_H #include #include #define BT_TYPE_MACHINE_MENU (bt_machine_menu_get_type ()) #define BT_MACHINE_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_MENU, BtMachineMenu)) #define BT_MACHINE_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_MENU, BtMachineMenuClass)) #define BT_IS_MACHINE_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_MENU)) #define BT_IS_MACHINE_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_MENU)) #define BT_MACHINE_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_MENU, BtMachineMenuClass)) /* type macros */ typedef struct _BtMachineMenu BtMachineMenu; typedef struct _BtMachineMenuClass BtMachineMenuClass; typedef struct _BtMachineMenuPrivate BtMachineMenuPrivate; /** * BtMachineMenu: * * the machine selection sub-menu for the canvas page context menu */ struct _BtMachineMenu { GtkMenu parent; /*< private >*/ BtMachineMenuPrivate *priv; }; struct _BtMachineMenuClass { GtkMenuClass parent; }; GType bt_machine_menu_get_type(void) G_GNUC_CONST; BtMachineMenu *bt_machine_menu_new(const BtMainPageMachines *main_page_machines); #endif // BT_MACHINE_MENU_H buzztard-0.6.0/src/ui/edit/main-page-patterns.c0000644042355400116100000044323311670203273016314 00000000000000/* $Id: main-page-patterns.c 3762 2011-12-08 18:49:29Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpagepatterns * @short_description: the editor main pattern page * @see_also: #BtPattern, #BtPatternEditor * * Provides an editor for #BtPattern instances. */ /* @todo: main-page-patterns tasks * - shortcuts * - on_pattern_table_key_press_event() * - Ctrl-S : Smooth * - low pass median filter over values * - need to figure what to do with empty slots * - Ctrl-Shift-R: Randomize-Range * - randomize between first and last value * - Ctrl-T : Invert (I is Interpolate already) * - value = max - (value-min)) * - Ctrl-Shift-T : Invert-Range * - like invert, but take min, max from the values in the selection * - prev/next for combobox entries * - trigger "move-active" action signal with GTK_SCROLL_STEP_UP/GTK_SCROLL_STEP_DOWN * - what mechanism to use: * - gtk_binding_entry_add_signal (do bindings work when not focused?) * - gtk_widget_add_accelerator (can't specify signal params) * * - also do controller-assignments like in machine-property window * * - use gray text color for disconnected machines in the machine * combobox (or machine without patterns) and unused waves * (like for unused patterns) * - sensitve property of renderer does not work in comboboxes * (unlike in treeviews) * -> we could use italic text in all of them * ("style", PANGO_STYLE_ITALIC and "style-set") * * - play live note entry * - support midi keyboard for entering notes and triggers * - have poly-input mode * - if there is a keydown, enter the note * - if there is another keydown before a keyup, go to next track and * enter the note there. * - on keyup, return 'cursor' to that column * - what keys to use for trigger columns? * - should we use shift+note for secondary note in same track (e.g. slide) * * - add the same context menu entries as the machines have in machine view for * current machine * - e.g. allow to open machine settings/preferences * see machine-canvas-item::show_machine_properties_dialog() * bt_main_page_machines_show_properties_dialog(page,machine); * bt_main_page_machines_show_preferences_dialog(page,machine); * .. rename/about/help */ #define BT_EDIT #define BT_MAIN_PAGE_PATTERNS_C #include "bt-edit.h" #define MAX_WAVETABLE_ITEMS 200 #define DEFAULT_BASE_OCTAVE 4 struct _BtMainPagePatternsPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* machine selection menu */ GtkComboBox *machine_menu; /* pattern selection menu */ GtkComboBox *pattern_menu; /* wavetable selection menu */ GtkComboBox *wavetable_menu; /* base octave selection menu */ GtkWidget *base_octave_menu; /* the pattern table */ BtPatternEditor *pattern_table; /* local commands */ GtkAccelGroup *accel_group; /* pattern context_menu */ GtkMenu *context_menu; GtkWidget *context_menu_track_add,*context_menu_track_remove; GtkWidget *context_menu_pattern_properties,*context_menu_pattern_remove,*context_menu_pattern_copy; /* colors */ GdkColor *cursor_bg; GdkColor *selection_bg1,*selection_bg2; /* cursor */ guint cursor_group, cursor_param; glong cursor_row; /* selection range */ glong selection_start_column; glong selection_start_row; glong selection_end_column; glong selection_end_row; /* selection first cell */ glong selection_column; glong selection_row; /* octave menu */ guint base_octave; /* play live flag */ gboolean play_live; /* the machine that is currently active */ BtMachine *machine; /* the pattern that is currently shown */ BtPattern *pattern; gulong number_of_groups; BtPatternEditorColumnGroup *param_groups; guint *column_keymode; /* editor change log */ BtChangeLog *change_log; /* signal handler ids */ gint pattern_length_changed,pattern_voices_changed; gint pattern_menu_changed; gint wave_to_combopos[MAX_WAVETABLE_ITEMS + 2], combopos_to_wave[MAX_WAVETABLE_ITEMS + 2]; /* cached setup properties */ GHashTable *properties; }; //-- the class static void bt_main_page_patterns_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtMainPagePatterns, bt_main_page_patterns, GTK_TYPE_VBOX, G_IMPLEMENT_INTERFACE (BT_TYPE_CHANGE_LOGGER, bt_main_page_patterns_change_logger_interface_init)); /* we need this in machine-properties-dialog.c too */ GdkAtom pattern_atom; enum { WAVE_MENU_NUMBER=0, WAVE_MENU_LABEL, }; enum { PATTERN_KEYMODE_NOTE=0, PATTERN_KEYMODE_BOOL, PATTERN_KEYMODE_NUMBER }; typedef enum { UPDATE_COLUMN_POP=1, UPDATE_COLUMN_PUSH, UPDATE_COLUMN_UPDATE } BtPatternViewUpdateColumn; #define PATTERN_CELL_WIDTH 70 #define PATTERN_CELL_HEIGHT 28 enum { METHOD_SET_GLOBAL_EVENTS=0, METHOD_SET_VOICE_EVENTS, METHOD_SET_WIRE_EVENTS, METHOD_SET_PROPERTY, METHOD_ADD_PATTERN, METHOD_REM_PATTERN, METHOD_SET_VOICES, }; static BtChangeLoggerMethods change_logger_methods[] = { BT_CHANGE_LOGGER_METHOD("set_global_events",18,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",([0-9]+),([0-9]+),([0-9]+),(.*)$"), BT_CHANGE_LOGGER_METHOD("set_voice_events",17,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",([0-9]+),([0-9]+),([0-9]+),([0-9]+),(.*)$"), BT_CHANGE_LOGGER_METHOD("set_wire_events",16,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",([0-9]+),([0-9]+),([0-9]+),(.*)$"), BT_CHANGE_LOGGER_METHOD("set_pattern_property",21,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("add_pattern",12,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\",([0-9]+)$"), BT_CHANGE_LOGGER_METHOD("rem_pattern",12,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("set_voices",10,"\"([-_a-zA-Z0-9 ]+)\",([0-9]+)$"), { NULL, } }; static void on_context_menu_pattern_new_activate(GtkMenuItem *menuitem,gpointer user_data); static void on_context_menu_pattern_remove_activate(GtkMenuItem *menuitem,gpointer user_data); static void on_pattern_size_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data); static void change_current_pattern(const BtMainPagePatterns *self, BtPattern *new_pattern); //-- tree model helper static void machine_menu_model_get_iter_by_machine(GtkTreeModel *store,GtkTreeIter *iter,BtMachine *that_machine) { BtMachine *this_machine; GST_INFO("look up iter for machine : %p,ref_ct=%d",that_machine,G_OBJECT_REF_COUNT(that_machine)); if(gtk_tree_model_get_iter_first(store,iter)) { do { this_machine=bt_machine_list_model_get_object((BtMachineListModel *)store,iter); if(this_machine==that_machine) { GST_INFO("found iter for machine : %p,ref_ct=%d",that_machine,G_OBJECT_REF_COUNT(that_machine)); break; } } while(gtk_tree_model_iter_next(store,iter)); } } static void pattern_menu_model_get_iter_by_pattern(GtkTreeModel *store,GtkTreeIter *iter,BtPattern *that_pattern) { BtPattern *this_pattern; if(gtk_tree_model_get_iter_first(store,iter)) { do { this_pattern=bt_pattern_list_model_get_object((BtPatternListModel *)store,iter); if(this_pattern==that_pattern) { break; } } while(gtk_tree_model_iter_next(store,iter)); } } //-- status bar helpers static void pattern_view_update_column_description(const BtMainPagePatterns *self, BtPatternViewUpdateColumn mode) { BtMainWindow *main_window; g_object_get(self->priv->app,"main-window",&main_window,NULL); // called too early if(!main_window) return; // our page is not the current if(mode&UPDATE_COLUMN_UPDATE) { gint page_num; bt_child_proxy_get(main_window,"pages::page",&page_num,NULL); if(page_num!=BT_MAIN_PAGES_PATTERNS_PAGE) { g_object_unref(main_window); return; } } // pop previous text by passing str=NULL; if(mode&UPDATE_COLUMN_POP) bt_child_proxy_set(main_window,"statusbar::status",NULL,NULL); if(mode&UPDATE_COLUMN_PUSH) { if(self->priv->pattern && self->priv->number_of_groups) { GParamSpec *property=NULL; BtPatternEditorColumnGroup *group; gchar *str=NULL,*desc=NULL; const gchar *blurb=""; g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, "cursor-param", &self->priv->cursor_param, "cursor-group", &self->priv->cursor_group, NULL); group = &self->priv->param_groups[self->priv->cursor_group]; switch (group->type) { case PGT_WIRE: { property=bt_wire_get_param_spec(group->user_data, self->priv->cursor_param); /* there is no describe here bt_wire_pattern_get_event_data(group->user_data,self->priv->cursor_row,self->priv->cursor_param) */ } break; case PGT_GLOBAL: { BtMachine *machine; GValue *gval; g_object_get(self->priv->pattern,"machine",&machine,NULL); property=bt_machine_get_global_param_spec(machine,self->priv->cursor_param); if((gval=bt_pattern_get_global_event_data(self->priv->pattern,self->priv->cursor_row,self->priv->cursor_param)) && G_IS_VALUE(gval)) { desc=bt_machine_describe_global_param_value(machine,self->priv->cursor_param,gval); } g_object_unref(machine); } break; case PGT_VOICE: { BtMachine *machine; GValue *gval; g_object_get(self->priv->pattern,"machine",&machine,NULL); property=bt_machine_get_voice_param_spec(machine,self->priv->cursor_param); if((gval=bt_pattern_get_voice_event_data(self->priv->pattern,self->priv->cursor_row,GPOINTER_TO_UINT(group->user_data),self->priv->cursor_param)) && G_IS_VALUE(gval)) { desc=bt_machine_describe_voice_param_value(machine,self->priv->cursor_param,gval); } g_object_unref(machine); } break; default: GST_WARNING("invalid column group type"); } // get parameter description if(property) { blurb=g_param_spec_get_blurb(property); if(desc) { str=g_strdup_printf("%s%s%s",blurb,(*desc?": ":""),desc); g_free(desc); } else { str=g_strdup(blurb); } } bt_child_proxy_set(main_window,"statusbar::status",(str?str:BT_MAIN_STATUSBAR_DEFAULT),NULL); g_free(str); } else { GST_DEBUG("no or empty pattern"); bt_child_proxy_set(main_window,"statusbar::status",_("Add new patterns from right click context menu."),NULL); } } g_object_unref(main_window); } //-- undo/redo helpers /* pattern_range_copy: * * Serialize the content of the range into @data. */ static void pattern_range_copy(const BtMainPagePatterns *self,gint beg,gint end,gint group,gint param,GString *data) { BtPatternEditorColumnGroup *pc_group; guint i; GST_INFO("copying : %d %d , %d %d",beg,end,group,param); // process full pattern if(group==-1 && param==-1) { BtWirePattern *wire_pattern; i=0; pc_group=&self->priv->param_groups[0]; while(pc_group->type==PGT_WIRE) { wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_serialize_columns(wire_pattern,beg,end,data); g_object_unref(wire_pattern); } i++; if(i==self->priv->number_of_groups) break; pc_group=&self->priv->param_groups[i]; } bt_pattern_serialize_columns(self->priv->pattern,beg,end,data); } // process whole group if(group!=-1 && param==-1) { pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { for(i=0;inum_columns;i++) { bt_wire_pattern_serialize_column(wire_pattern,beg,end,i,data); } g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: { for(i=0;inum_columns;i++) { bt_pattern_serialize_column(self->priv->pattern,beg,end,i,data); } } break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; guint voice = GPOINTER_TO_UINT(pc_group->user_data); g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(voice*voice_params); for(i=0;inum_columns;i++) { bt_pattern_serialize_column(self->priv->pattern,beg,end,params+i,data); } g_object_unref(machine); } break; } } // process one param in one group if(group!=-1 && param!=-1) { pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_serialize_column(wire_pattern,beg,end,param,data); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: bt_pattern_serialize_column(self->priv->pattern,beg,end,param,data); break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(pc_group->user_data)*voice_params); bt_pattern_serialize_column(self->priv->pattern,beg,end,params+param,data); g_object_unref(machine); } break; } } } /* pattern_range_log_undo_redo: * * Add undo/redo events for the given data to the log. */ static void pattern_range_log_undo_redo(const BtMainPagePatterns *self,gint beg,gint end,gint group,gint param,gchar *old_str,gchar *new_str) { BtPatternEditorColumnGroup *pc_group; BtMachine *machine; gchar *mid,*pid; guint i; gchar *p; g_object_get(self->priv->pattern,"id",&pid,"machine",&machine,NULL); g_object_get(machine,"id",&mid,NULL); GST_INFO("logging : %d %d , %d %d",beg,end,group,param); // process full pattern if(group==-1 && param==-1) { gchar *undo_str,*redo_str; BtWire *wire; BtWirePattern *wire_pattern; gulong wire_groups, global_params, voices; guint g,v; bt_change_log_start_group(self->priv->change_log); g_object_get(machine,"global-params",&global_params,"voices",&voices,NULL); wire_groups=g_list_length(machine->dst_wires); for(g=0;gpriv->param_groups[g]; wire = pc_group->user_data; wire_pattern=bt_wire_get_pattern(wire,self->priv->pattern); if(wire_pattern) { BtMachine *smachine; gchar *smid; g_object_get(wire,"src",&smachine,NULL); g_object_get(smachine,"id",&smid,NULL); for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } g_free(smid); g_object_unref(smachine); g_object_unref(wire_pattern); } } if(global_params) { pc_group=&self->priv->param_groups[g]; for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } g++; } if(voices) { for(v=0;vpriv->param_groups[g]; for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,v,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,v,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } } } bt_change_log_end_group(self->priv->change_log); } // process whole group if(group!=-1 && param==-1) { gchar *undo_str,*redo_str; bt_change_log_start_group(self->priv->change_log); pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { BtWire *wire = pc_group->user_data; BtMachine *smachine; gchar *smid; g_object_get(wire,"src",&smachine,NULL); g_object_get(smachine,"id",&smid,NULL); for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } g_free(smid); g_object_unref(smachine); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: { for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } } break; case PGT_VOICE: { guint voice = GPOINTER_TO_UINT(pc_group->user_data); for(i=0;inum_columns;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,voice,i,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,voice,i,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } } break; } bt_change_log_end_group(self->priv->change_log); } // process one param in one group if(group!=-1 && param!=-1) { gchar *undo_str,*redo_str; pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { BtWire *wire = pc_group->user_data; BtMachine *smachine; gchar *smid; g_object_get(wire,"src",&smachine,NULL); g_object_get(smachine,"id",&smid,NULL); p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,param,old_str); p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,mid,pid,beg,end,param,new_str); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(smid); g_object_unref(smachine); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,param,old_str); p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,beg,end,param,new_str); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); break; case PGT_VOICE: { guint voice = GPOINTER_TO_UINT(pc_group->user_data); p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,voice,param,old_str); p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,beg,end,voice,param,new_str); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } break; } } g_free(mid);g_free(pid); g_object_unref(machine); } //-- selection helpers /* this is used for delete/blend/randomize, * - would be good to generalize to use it also for insert/delete-row. * -> need to ignore row_end * - would be good to use this for cut/copy/paste * -> copy/cut want to return the data from the selection * -> paste needs to receive the data from the selection * ideally we'd like to avoid separate column/columns functions * - _column(BtPattern * self, gulong start_tick, gulong end_tick, gulong param) * - _columns(BtPattern * self, gulong start_tick, gulong end_tick) * - the groups would trigger the update several times as we need to use the column one a few times * better would be: * - _columns(BtPattern * self, gulong start_tick, gulong end_tick, gulong start_param, gulong end_param) */ typedef void (*DoBtPatternEditorColumn)(const BtPattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); typedef void (*DoBtPatternEditorColumns)(const BtPattern * const self, const gulong start_tick, const gulong end_tick); typedef void (*DoWireBtPatternEditorColumn)(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick, const gulong param); typedef void (*DoWireBtPatternEditorColumns)(const BtWirePattern * const self, const gulong start_tick, const gulong end_tick); static gboolean pattern_selection_apply(const BtMainPagePatterns *self,DoBtPatternEditorColumn do_pattern_column,DoBtPatternEditorColumns do_pattern_columns,DoWireBtPatternEditorColumn do_wire_pattern_column,DoWireBtPatternEditorColumns do_wire_pattern_columns) { gboolean res=FALSE; gint beg,end,group,param; if(bt_pattern_editor_get_selection(self->priv->pattern_table,&beg,&end,&group,¶m)) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); BtPatternEditorColumnGroup *pc_group; guint i; pattern_range_copy(self,beg,end,group,param,old_data); GST_INFO("applying : %d %d , %d %d",beg,end,group,param); // process full pattern if(group==-1 && param==-1) { BtWirePattern *wire_pattern; i=0; pc_group=&self->priv->param_groups[0]; while(pc_group->type==PGT_WIRE) { wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { do_wire_pattern_columns(wire_pattern,beg,end); g_object_unref(wire_pattern); } i++; if(i==self->priv->number_of_groups) break; pc_group=&self->priv->param_groups[i]; } do_pattern_columns(self->priv->pattern,beg,end); res=TRUE; } // process whole group if(group!=-1 && param==-1) { pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { do_wire_pattern_columns(wire_pattern,beg,end); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: { for(i=0;inum_columns;i++) { do_pattern_column(self->priv->pattern,beg,end,i); } } break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; guint voice = GPOINTER_TO_UINT(pc_group->user_data); g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(voice*voice_params); for(i=0;inum_columns;i++) { do_pattern_column(self->priv->pattern,beg,end,params+i); } g_object_unref(machine); } break; } res=TRUE; } // process one param in one group if(group!=-1 && param!=-1) { pc_group=&self->priv->param_groups[group]; switch(pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { do_wire_pattern_column(wire_pattern,beg,end,param); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: do_pattern_column(self->priv->pattern,beg,end,param); break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; guint voice = GPOINTER_TO_UINT(pc_group->user_data); g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(voice*voice_params); do_pattern_column(self->priv->pattern,beg,end,params+param); g_object_unref(machine); } break; } res=TRUE; } if(res) { gtk_widget_queue_draw(GTK_WIDGET(self->priv->pattern_table)); pattern_range_copy(self,beg,end,group,param,new_data); pattern_range_log_undo_redo(self,beg,end,group,param,old_data->str,new_data->str); } g_string_free(old_data,TRUE); g_string_free(new_data,TRUE); } return res; } //-- event handlers #if 0 static void on_pattern_added(BtMachine *machine,BtPattern *pattern,gpointer user_data) { /* this would be too early, the pattern properties are not set :/ BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); // add undo/redo details if(bt_change_log_is_active(self->priv->change_log)) { gchar *undo_str,*redo_str; gchar *mid,*pid,*pname; gulong length; g_object_get(machine,"id",&mid,NULL); g_object_get(pattern,"id",&pid,"name",&pname,"length",&length,NULL); undo_str = g_strdup_printf("rem_pattern \"%s\",\"%s\"",mid,pid); redo_str = g_strdup_printf("add_pattern \"%s\",\"%s\",\"%s\",%lu",mid,pid,pname,length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(pid);g_free(pname); } */ } #endif static void on_pattern_removed(BtMachine *machine,BtPattern *pattern,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); // add undo/redo details if(bt_change_log_is_active(self->priv->change_log)) { BtWire *wire; BtWirePattern *wire_pattern; gchar *undo_str,*redo_str; gchar *mid,*pid,*pname; gulong length; gulong wire_params,global_params,voice_params,voices; guint end; GList *node; GString *data=g_string_new(NULL); gchar *str,*p; guint i,v; g_object_get(pattern,"id",&pid,"name",&pname,"length",&length,NULL); g_object_get(machine,"id",&mid,"global-params",&global_params,"voice-params",&voice_params,"voices",&voices,NULL); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("add_pattern \"%s\",\"%s\",\"%s\",%lu",mid,pid,pname,length); redo_str = g_strdup_printf("rem_pattern \"%s\",\"%s\"",mid,pid); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); /* we can't use the usual helpers here * - we don't need redo data * - we don't have the BtPatternEditorColumnGroup */ end=length-1; for(node=machine->dst_wires;node;node=g_list_next(node)) { if((wire_pattern=bt_wire_get_pattern((BtWire *)node->data,pattern))) { bt_wire_pattern_serialize_columns(wire_pattern,0,end,data); g_object_unref(wire_pattern); } } bt_pattern_serialize_columns(pattern,0,end,data); str=data->str; // log events for(node=machine->dst_wires;node;node=g_list_next(node)) { wire=(BtWire *)node->data; wire_pattern=bt_wire_get_pattern(wire,pattern); if(wire_pattern) { BtMachine *smachine; gchar *smid; g_object_get(wire,"src",&smachine,"num-params",&wire_params,NULL); g_object_get(smachine,"id",&smid,NULL); for(i=0;ipriv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } g_free(smid); g_object_unref(smachine); g_object_unref(wire_pattern); } } if(global_params) { for(i=0;ipriv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } } if(voices) { for(v=0;vpriv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } } } g_string_free(data,TRUE); bt_change_log_end_group(self->priv->change_log); g_free(mid);g_free(pid);g_free(pname); } GST_WARNING("removed pattern: %p,pattern->ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); } // use key-press-event, as then we get key repeats static gboolean on_pattern_table_key_press_event(GtkWidget *widget,GdkEventKey *event,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); gboolean res=FALSE; gulong modifier=(gulong)event->state>k_accelerator_get_default_mod_mask(); //gulong modifier=(gulong)event->state&(GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD4_MASK); if(!gtk_widget_get_realized(GTK_WIDGET(self->priv->pattern_table))) return(FALSE); GST_INFO("pattern_table key : state 0x%x, keyval 0x%x, hw-code 0x%x, name %s", event->state,event->keyval,event->hardware_keycode,gdk_keyval_name(event->keyval)); if(event->keyval==GDK_Return) { /* GDK_KP_Enter */ BtMainWindow *main_window; //BtMainPageSequence *sequence_page; g_object_get(self->priv->app,"main-window",&main_window,NULL); //bt_child_proxy_get(main_window,"pages::sequence-page",&sequence_page,NULL); bt_child_proxy_set(main_window,"pages::page",BT_MAIN_PAGES_SEQUENCE_PAGE,NULL); /* if we came from sequesnce page via Enter we could go back * if the machine or pattern has been changed here, we could go to first * track and first pos where the new pattern is used. */ //bt_main_page_sequence_goto_???(sequence_page,pattern); //g_object_unref(sequence_page); g_object_unref(main_window); res=TRUE; } else if(event->keyval==GDK_Menu) { gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } else if (event->keyval == GDK_Insert) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gulong number_of_ticks; gint beg,end,group,param; g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, "cursor-group", &self->priv->cursor_group, "cursor-param", &self->priv->cursor_param, NULL); g_object_get(self->priv->pattern,"length",&number_of_ticks,NULL); beg=self->priv->cursor_row; end=number_of_ticks-1; if((modifier&(GDK_CONTROL_MASK|GDK_SHIFT_MASK))==(GDK_CONTROL_MASK|GDK_SHIFT_MASK)) { group=-1; param=-1; } else if(modifier&GDK_SHIFT_MASK) { group=self->priv->cursor_group; param=-1; } else { group=self->priv->cursor_group; param=self->priv->cursor_param; } pattern_range_copy(self,beg,end,group,param,old_data); if((modifier&(GDK_CONTROL_MASK|GDK_SHIFT_MASK))==(GDK_CONTROL_MASK|GDK_SHIFT_MASK)) { // insert full row BtWirePattern *wire_pattern; guint i=0; GST_INFO("ctrl-shift-insert pressed, row %lu",self->priv->cursor_row); while(ipriv->number_of_groups && self->priv->param_groups[i].type==PGT_WIRE) { if((wire_pattern = bt_wire_get_pattern(self->priv->param_groups[i].user_data,self->priv->pattern))) { bt_wire_pattern_insert_full_row(wire_pattern,self->priv->cursor_row); g_object_unref(wire_pattern); } i++; } bt_pattern_insert_full_row(self->priv->pattern,self->priv->cursor_row); res=TRUE; } else if(modifier&GDK_SHIFT_MASK) { // insert group GST_INFO("shift-insert pressed, row %ld, group %u",self->priv->cursor_row,self->priv->cursor_group); switch(self->priv->param_groups[self->priv->cursor_group].type) { case PGT_WIRE: { BtWirePattern *wire_pattern = bt_wire_get_pattern(self->priv->param_groups[self->priv->cursor_group].user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_insert_full_row(wire_pattern,self->priv->cursor_row); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: { guint i; for(i=0;ipriv->param_groups[self->priv->cursor_group].num_columns;i++) { bt_pattern_insert_row(self->priv->pattern,self->priv->cursor_row, i); } } break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; guint i; g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(self->priv->param_groups[self->priv->cursor_group].user_data)*voice_params); for(i=0;ipriv->param_groups[self->priv->cursor_group].num_columns;i++) { bt_pattern_insert_row(self->priv->pattern,self->priv->cursor_row, params+i); } g_object_unref(machine); } break; } res=TRUE; } else { // insert column GST_INFO("insert pressed, row %ld, group %u, param %u",self->priv->cursor_row,self->priv->cursor_group, self->priv->cursor_param); switch(self->priv->param_groups[self->priv->cursor_group].type) { case PGT_WIRE: { BtWirePattern *wire_pattern = bt_wire_get_pattern(self->priv->param_groups[self->priv->cursor_group].user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_insert_row(wire_pattern,self->priv->cursor_row, self->priv->cursor_param); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: bt_pattern_insert_row(self->priv->pattern,self->priv->cursor_row, self->priv->cursor_param); break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(self->priv->param_groups[self->priv->cursor_group].user_data)*voice_params); bt_pattern_insert_row(self->priv->pattern,self->priv->cursor_row, params+self->priv->cursor_param); g_object_unref(machine); } break; } res=TRUE; } if(res) { gtk_widget_queue_draw(GTK_WIDGET(self->priv->pattern_table)); pattern_range_copy(self,beg,end,group,param,new_data); pattern_range_log_undo_redo(self,beg,end,group,param,old_data->str,new_data->str); } g_string_free(old_data,TRUE); g_string_free(new_data,TRUE); } else if(event->keyval == GDK_Delete) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gulong number_of_ticks; gint beg,end,group,param; g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, "cursor-group", &self->priv->cursor_group, "cursor-param", &self->priv->cursor_param, NULL); g_object_get(self->priv->pattern,"length",&number_of_ticks,NULL); beg=self->priv->cursor_row; end=number_of_ticks-1; if((modifier&(GDK_CONTROL_MASK|GDK_SHIFT_MASK))==(GDK_CONTROL_MASK|GDK_SHIFT_MASK)) { group=-1; param=-1; } else if(modifier&GDK_SHIFT_MASK) { group=self->priv->cursor_group; param=-1; } else { group=self->priv->cursor_group; param=self->priv->cursor_param; } pattern_range_copy(self,beg,end,group,param,old_data); if((modifier&(GDK_CONTROL_MASK|GDK_SHIFT_MASK))==(GDK_CONTROL_MASK|GDK_SHIFT_MASK)) { // delete full row BtWirePattern *wire_pattern; guint i=0; g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, NULL); GST_INFO("ctrl-shift-delete pressed, row %lu",self->priv->cursor_row); while(ipriv->number_of_groups && self->priv->param_groups[i].type==PGT_WIRE) { if((wire_pattern = bt_wire_get_pattern(self->priv->param_groups[i].user_data,self->priv->pattern))) { bt_wire_pattern_delete_full_row(wire_pattern,self->priv->cursor_row); g_object_unref(wire_pattern); } i++; } bt_pattern_delete_full_row(self->priv->pattern,self->priv->cursor_row); res=TRUE; } else if(modifier&GDK_SHIFT_MASK) { // delete group g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, "cursor-group", &self->priv->cursor_group, NULL); GST_INFO("delete pressed, row %ld, group %u",self->priv->cursor_row,self->priv->cursor_group); switch(self->priv->param_groups[self->priv->cursor_group].type) { case PGT_WIRE: { BtWirePattern *wire_pattern = bt_wire_get_pattern(self->priv->param_groups[self->priv->cursor_group].user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_delete_full_row(wire_pattern,self->priv->cursor_row); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: { guint i; for(i=0;ipriv->param_groups[self->priv->cursor_group].num_columns;i++) { bt_pattern_delete_row(self->priv->pattern,self->priv->cursor_row, i); } } break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; guint i; g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(self->priv->param_groups[self->priv->cursor_group].user_data)*voice_params); for(i=0;ipriv->param_groups[self->priv->cursor_group].num_columns;i++) { bt_pattern_delete_row(self->priv->pattern,self->priv->cursor_row, params+i); } g_object_unref(machine); } break; } res=TRUE; } else { // delete column g_object_get(self->priv->pattern_table, "cursor-row", &self->priv->cursor_row, "cursor-group", &self->priv->cursor_group, "cursor-param", &self->priv->cursor_param, NULL); GST_INFO("delete pressed, row %ld, group %u, param %u",self->priv->cursor_row,self->priv->cursor_group, self->priv->cursor_param); switch(self->priv->param_groups[self->priv->cursor_group].type) { case PGT_WIRE: { BtWirePattern *wire_pattern = bt_wire_get_pattern(self->priv->param_groups[self->priv->cursor_group].user_data,self->priv->pattern); if(wire_pattern) { bt_wire_pattern_delete_row(wire_pattern,self->priv->cursor_row, self->priv->cursor_param); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: bt_pattern_delete_row(self->priv->pattern,self->priv->cursor_row, self->priv->cursor_param); break; case PGT_VOICE: { BtMachine *machine; gulong global_params, voice_params, params; g_object_get(self->priv->pattern,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(self->priv->param_groups[self->priv->cursor_group].user_data)*voice_params); bt_pattern_delete_row(self->priv->pattern,self->priv->cursor_row, params+self->priv->cursor_param); g_object_unref(machine); } break; } res=TRUE; } if(res) { gtk_widget_queue_draw(GTK_WIDGET(self->priv->pattern_table)); pattern_range_copy(self,beg,end,group,param,new_data); pattern_range_log_undo_redo(self,beg,end,group,param,old_data->str,new_data->str); } g_string_free(old_data,TRUE); g_string_free(new_data,TRUE); } else if(event->keyval == GDK_f) { if(modifier&GDK_CONTROL_MASK) { res=pattern_selection_apply(self, bt_pattern_flip_column,bt_pattern_flip_columns, bt_wire_pattern_flip_column,bt_wire_pattern_flip_columns); } } else if(event->keyval == GDK_i) { if(modifier&GDK_CONTROL_MASK) { res=pattern_selection_apply(self, bt_pattern_blend_column,bt_pattern_blend_columns, bt_wire_pattern_blend_column,bt_wire_pattern_blend_columns); } } else if(event->keyval == GDK_r) { if(modifier&GDK_CONTROL_MASK) { res=pattern_selection_apply(self, bt_pattern_randomize_column,bt_pattern_randomize_columns, bt_wire_pattern_randomize_column,bt_wire_pattern_randomize_columns); } } else if((event->keyval == GDK_Up) && (modifier==GDK_CONTROL_MASK)) { g_signal_emit_by_name(self->priv->machine_menu,"move-active",GTK_SCROLL_STEP_BACKWARD,NULL); res=TRUE; } else if((event->keyval == GDK_Down) && (modifier==GDK_CONTROL_MASK)) { g_signal_emit_by_name(self->priv->machine_menu,"move-active",GTK_SCROLL_STEP_FORWARD,NULL); res=TRUE; } else if(event->keyval == GDK_KP_Subtract) { g_signal_emit_by_name(self->priv->pattern_menu,"move-active",GTK_SCROLL_STEP_BACKWARD,NULL); res=TRUE; } else if(event->keyval == GDK_KP_Add) { g_signal_emit_by_name(self->priv->pattern_menu,"move-active",GTK_SCROLL_STEP_FORWARD,NULL); res=TRUE; } else if(event->keyval == GDK_KP_Divide) { g_signal_emit_by_name(self->priv->base_octave_menu,"move-active",GTK_SCROLL_STEP_BACKWARD,NULL); res=TRUE; } else if(event->keyval == GDK_KP_Multiply) { g_signal_emit_by_name(self->priv->base_octave_menu,"move-active",GTK_SCROLL_STEP_FORWARD,NULL); res=TRUE; } else if(event->keyval == GDK_less) { g_signal_emit_by_name(self->priv->wavetable_menu,"move-active",GTK_SCROLL_STEP_BACKWARD,NULL); res=TRUE; } else if(event->keyval == GDK_greater) { g_signal_emit_by_name(self->priv->wavetable_menu,"move-active",GTK_SCROLL_STEP_FORWARD,NULL); res=TRUE; } return(res); } static gboolean on_pattern_table_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); gboolean res=FALSE; GST_INFO("pattern_table button_press : button 0x%x, type 0x%d",event->button,event->type); if(event->button==3) { gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } return(res); } static void on_pattern_table_cursor_group_changed(const BtPatternEditor *editor,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); g_object_get((gpointer)editor, "cursor-group", &self->priv->cursor_group, "cursor-param", &self->priv->cursor_param, NULL); pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); } static void on_pattern_table_cursor_param_changed(const BtPatternEditor *editor,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); g_object_get((gpointer)editor, "cursor-param", &self->priv->cursor_param, NULL); pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); } static void on_pattern_table_cursor_row_changed(const BtPatternEditor *editor,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); g_object_get((gpointer)editor, "cursor-row", &self->priv->cursor_row, NULL); pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); } static void on_machine_model_row_inserted(GtkTreeModel *tree_model, GtkTreePath *path,GtkTreeIter *iter,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); //GST_WARNING("-- added index %s", gtk_tree_path_to_string(path)); gtk_combo_box_set_active_iter(self->priv->machine_menu,iter); } static void on_machine_model_row_deleted(GtkTreeModel *tree_model,GtkTreePath *path,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GtkTreeIter iter; //GST_WARNING("-- removed index %s", gtk_tree_path_to_string(path)); // the last machine is master which we actually cannot remove if(!gtk_tree_model_get_iter(tree_model, &iter, path)) { GtkTreePath *p=gtk_tree_path_copy(path); if(!gtk_tree_path_prev(p)) { gtk_tree_path_free(p); return; } if(!gtk_tree_model_get_iter(tree_model, &iter, p)) { gtk_tree_path_free(p); return; } gtk_tree_path_free(p); } //GST_WARNING("-- activate index %s", gtk_tree_path_to_string(path)); gtk_combo_box_set_active_iter(self->priv->machine_menu,&iter); } static void on_pattern_model_row_inserted(GtkTreeModel *tree_model, GtkTreePath *path,GtkTreeIter *iter,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); //GST_WARNING("-- added index %s", gtk_tree_path_to_string(path)); gtk_combo_box_set_active_iter(self->priv->pattern_menu,iter); } static void on_pattern_model_row_deleted(GtkTreeModel *tree_model,GtkTreePath *path,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GtkTreeIter iter; //GST_WARNING("-- removed index %s", gtk_tree_path_to_string(path)); if(!gtk_tree_model_get_iter(tree_model, &iter, path)) { GtkTreePath *p=gtk_tree_path_copy(path); if(!gtk_tree_path_prev(p)) { gtk_tree_path_free(p); return; } if(!gtk_tree_model_get_iter(tree_model, &iter, p)) { gtk_tree_path_free(p); return; } gtk_tree_path_free(p); } //GST_WARNING("-- activate index %s", gtk_tree_path_to_string(path)); gtk_combo_box_set_active_iter(self->priv->pattern_menu,&iter); } //-- event handler helper static void machine_menu_refresh(const BtMainPagePatterns *self,const BtSetup *setup) { BtMachine *machine=NULL; GList *node,*list; BtMachineListModel *store; gint index=-1; gint active=-1; // create machine menu store=bt_machine_list_model_new((BtSetup *)setup); // connect signal handlers for pattern undo/redo g_object_get((gpointer)setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); index++; //g_signal_connect(machine,"pattern-added",G_CALLBACK(on_pattern_added),(gpointer)self); g_signal_connect(machine,"pattern-removed",G_CALLBACK(on_pattern_removed),(gpointer)self); if(machine==self->priv->machine) active=index; } g_list_free(list); g_signal_connect(store,"row-inserted",G_CALLBACK(on_machine_model_row_inserted),(gpointer)self); g_signal_connect(store,"row-deleted",G_CALLBACK(on_machine_model_row_deleted),(gpointer)self); GST_INFO("machine menu refreshed, active item %d",active); if(active==-1) { // use the last one, if there is no active one active=index; } gtk_widget_set_sensitive(GTK_WIDGET(self->priv->machine_menu),(index!=-1)); gtk_combo_box_set_model(self->priv->machine_menu,GTK_TREE_MODEL(store)); gtk_combo_box_set_active(self->priv->machine_menu,active); g_object_unref(store); // drop with comboxbox } static void pattern_menu_refresh(const BtMainPagePatterns *self,BtMachine *machine) { BtPatternListModel *store; BtPattern *pattern=NULL; GtkTreeIter iter; gint index=-1; gint active=-1; BtSong *song; BtSequence *sequence; g_assert(machine); // update pattern menu g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"sequence",&sequence,NULL); store=bt_pattern_list_model_new(machine,sequence,TRUE); if(gtk_tree_model_get_iter_first((GtkTreeModel *)store,&iter)) { do { pattern=bt_pattern_list_model_get_object((BtPatternListModel *)store,&iter); index++; // count pattern index, so that we can activate one in the combobox if(pattern==self->priv->pattern) { active=index; break; } } while(gtk_tree_model_iter_next((GtkTreeModel *)store,&iter)); } g_object_unref(sequence); g_object_unref(song); GST_INFO("pattern menu refreshed, active entry=%d",active); if(active==-1) { // use the last one, if there is no active one active=index; } g_signal_connect(store,"row-inserted",G_CALLBACK(on_pattern_model_row_inserted),(gpointer)self); g_signal_connect(store,"row-deleted",G_CALLBACK(on_pattern_model_row_deleted),(gpointer)self); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->pattern_menu),(index!=-1)); gtk_combo_box_set_model(self->priv->pattern_menu,GTK_TREE_MODEL(store)); gtk_combo_box_set_active(self->priv->pattern_menu,active); g_object_unref(store); // drop with comboxbox // unfortunately we need to do this, gtk+ swallows the first changed signal here // as nothing was selected and we don't select anything if(active==-1) { change_current_pattern(self,NULL); } } static void wavetable_menu_refresh(const BtMainPagePatterns *self,BtWavetable *wavetable) { BtWave *wave; gchar *str,hstr[3]; GtkListStore *store; GtkTreeIter menu_iter; gint i,index=-1, count = 0; // update pattern menu store=gtk_list_store_new(2,G_TYPE_STRING,G_TYPE_STRING); //-- append waves rows (buzz numbers them from 0x01 to 0xC8=200) for(i=1;i<=200;i++) self->priv->wave_to_combopos[i] = self->priv->combopos_to_wave[i] = -1; for(i=1;i<=200;i++) { if((wave=bt_wavetable_get_wave_by_index(wavetable,i))) { self->priv->wave_to_combopos[i] = count; self->priv->combopos_to_wave[count] = i; gtk_list_store_append(store, &menu_iter); g_object_get(wave,"name",&str,NULL); GST_INFO(" adding [%3d] \"%s\"",i,str); // buzz shows index as hex, because trackers needs it this way sprintf(hstr,"%02x",i); gtk_list_store_set(store,&menu_iter, WAVE_MENU_NUMBER,hstr, WAVE_MENU_LABEL,str, -1); g_free(str); g_object_unref(wave); if(index==-1) index=i-1; count++; } } GST_INFO(" index=%d",index); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->wavetable_menu),(index!=-1)); gtk_combo_box_set_model(self->priv->wavetable_menu,GTK_TREE_MODEL(store)); gtk_combo_box_set_active(self->priv->wavetable_menu,index); g_object_unref(store); // drop with comboxbox } /* - we are using GValue directly for reading out the patterns * - @todo: for changes from the pattern editor we still convert the float * values to strings and then to GValues. */ typedef struct { gfloat (*val_to_float)(GValue *in, gpointer user_data); const gchar *(*float_to_str)(gfloat in, gpointer user_data); } BtPatternEditorColumnConvertersCallbacks; typedef struct { BtPatternEditorColumnConvertersCallbacks callbacks; gfloat min,max; } BtPatternEditorColumnConvertersFloatCallbacks; typedef struct { union { BtPatternEditorColumnConvertersCallbacks any_cb; BtPatternEditorColumnConvertersFloatCallbacks float_cb; }; } BtPatternEditorColumnConverters; static gfloat pattern_edit_get_data_at(gpointer pattern_data, gpointer column_data, guint row, guint track, guint param) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(pattern_data); GValue *val = NULL; BtPatternEditorColumnGroup *group = &self->priv->param_groups[track]; switch (group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern = bt_wire_get_pattern(group->user_data,self->priv->pattern); if(wire_pattern) { val=bt_wire_pattern_get_event_data(wire_pattern,row,param); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: val=bt_pattern_get_global_event_data(self->priv->pattern,row,param); break; case PGT_VOICE: val=bt_pattern_get_voice_event_data(self->priv->pattern,row,GPOINTER_TO_UINT(group->user_data),param); break; default: GST_WARNING("invalid column group type"); } if(val && BT_IS_GVALUE(val) && column_data) { return ((BtPatternEditorColumnConvertersCallbacks *)column_data)->val_to_float(val,column_data); } return group->columns[param].def; } static void pattern_edit_set_data_at(gpointer pattern_data, gpointer column_data, guint row, guint track, guint param, guint digit, gfloat value) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(pattern_data); const gchar *str = NULL; BtPatternEditorColumnGroup *group = &self->priv->param_groups[track]; BtMachine *machine; if(column_data) str=((BtPatternEditorColumnConvertersCallbacks *)column_data)->float_to_str(value,column_data); else if(value!=group->columns[param].def) str=bt_persistence_strfmt_double(value); g_object_get(self->priv->pattern,"machine",&machine,NULL); if(group->type==PGT_GLOBAL || group->type==PGT_VOICE) { gboolean is_trigger; if(group->type==PGT_GLOBAL) is_trigger=bt_machine_is_global_param_trigger(machine,param); else is_trigger=bt_machine_is_voice_param_trigger(machine,param); if(is_trigger) { gboolean update_wave=FALSE; BtPatternEditorColumn *col=&group->columns[param]; // play live (notes, triggers) if(BT_IS_STRING(str) && self->priv->play_live) { GstObject *element,*voice; g_object_get(machine,"machine",&element,NULL); /* @todo: buzz machines need set, tick, unset */ if(group->type==PGT_GLOBAL) { GST_INFO("play global trigger: %f,'%s'",value,str); switch(col->type) { case PCT_NOTE: { GEnumClass *enum_class=g_type_class_peek_static(GSTBT_TYPE_NOTE); GEnumValue *enum_value; gint val=0; if((enum_value=g_enum_get_value_by_nick(enum_class,str))) { val=enum_value->value; } g_object_set(element,bt_machine_get_global_param_name(machine,param),val,NULL); //g_object_set(element,bt_machine_get_global_param_name(machine,param),str,NULL); } break; case PCT_SWITCH: case PCT_BYTE: case PCT_WORD: { gint val=atoi(str); if(val==col->def) { g_object_set(element,bt_machine_get_global_param_name(machine,param),val,NULL); } } break; case PCT_FLOAT: { gfloat val=atof(str); if(val==col->def) { g_object_set(element,bt_machine_get_global_param_name(machine,param),val,NULL); } } break; } } else { GST_INFO("play voice %u trigger: %f,'%s'",GPOINTER_TO_UINT(group->user_data),value,str); voice=gst_child_proxy_get_child_by_index(GST_CHILD_PROXY(element),GPOINTER_TO_UINT(group->user_data)); switch(col->type) { case PCT_NOTE: { GEnumClass *enum_class=g_type_class_peek_static(GSTBT_TYPE_NOTE); GEnumValue *enum_value; gint val=0; if((enum_value=g_enum_get_value_by_nick(enum_class,str))) { val=enum_value->value; } g_object_set(voice,bt_machine_get_voice_param_name(machine,param),val,NULL); //g_object_set(voice,bt_machine_get_voice_param_name(machine,param),str,NULL); } break; case PCT_SWITCH: case PCT_BYTE: case PCT_WORD: { gint val=atoi(str); if(val==col->def) { g_object_set(voice,bt_machine_get_voice_param_name(machine,param),val,NULL); } } break; case PCT_FLOAT: { gfloat val=atof(str); if(val==col->def) { g_object_set(voice,bt_machine_get_voice_param_name(machine,param),val,NULL); } } break; } gst_object_unref(voice); } gst_object_unref(element); } if(col->type == PCT_NOTE) { // do not update the wave if it's an octave column or if the new value is 'off' if(digit == 0 && value != 255 && value != 0) { update_wave=TRUE; } } // if machine can play wave, lookup wave column and enter wave index if(update_wave) { const gchar *wave_str = ""; glong wave_param=-1; if(BT_IS_STRING(str)) { gint wave_ix=gtk_combo_box_get_active(self->priv->wavetable_menu); if (wave_ix >= 0) { wave_ix = self->priv->combopos_to_wave[wave_ix]; wave_str=bt_persistence_strfmt_ulong(wave_ix); } GST_DEBUG("wav index: %d, %s",wave_ix,wave_str); } switch (group->type) { case PGT_GLOBAL: // search for param that has flags&GSTBT_PROPERTY_META_WAVE in global machine params wave_param=bt_machine_get_global_wave_param_index(machine); GST_DEBUG("global wav param: %ld",wave_param); if(wave_param>-1) { bt_pattern_set_global_event(self->priv->pattern,row,wave_param,wave_str); } break; case PGT_VOICE: // search for param that has flags&GSTBT_PROPERTY_META_WAVE in voice machine params wave_param=bt_machine_get_voice_wave_param_index(machine); GST_DEBUG("voice wav param: %ld",wave_param); if(wave_param>-1) { bt_pattern_set_voice_event(self->priv->pattern,row,GPOINTER_TO_UINT(group->user_data),wave_param,wave_str); } break; default: break; } if(wave_param>-1) { gtk_widget_queue_draw(GTK_WIDGET(self->priv->pattern_table)); } } } if(group->columns[param].type == PCT_BYTE) { glong wave_param = -1; switch (group->type) { case PGT_GLOBAL: wave_param = bt_machine_get_global_wave_param_index(machine); break; case PGT_VOICE: wave_param=bt_machine_get_voice_wave_param_index(machine); break; default: break; } if (wave_param == param) { int v = (int)value; if (value >= 0 && v < MAX_WAVETABLE_ITEMS + 2 && self->priv->wave_to_combopos[v] != -1) gtk_combo_box_set_active(self->priv->wavetable_menu, self->priv->wave_to_combopos[v]); } } } switch (group->type) { case PGT_WIRE: { BtWire *wire = group->user_data; BtWirePattern *wire_pattern = bt_wire_get_pattern(wire,self->priv->pattern); BtMachine *smachine; GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gchar *undo_str,*redo_str,*s,*p; gchar *smid,*dmid,*pid; if(!wire_pattern) { BtSong *song; g_object_get(self->priv->app,"song",&song,NULL); wire_pattern=bt_wire_pattern_new(song,wire,self->priv->pattern); g_object_unref(song); } g_object_get(wire,"src",&smachine,NULL); g_object_get(smachine,"id",&smid,NULL); g_object_get(machine,"id",&dmid,NULL); g_object_get(self->priv->pattern,"id",&pid,NULL); bt_wire_pattern_serialize_column(wire_pattern,row,row,param,old_data); bt_wire_pattern_set_event(wire_pattern,row,param,str); bt_wire_pattern_serialize_column(wire_pattern,row,row,param,new_data); s=g_string_free(old_data,FALSE);p=strchr(s,'\n');*p='\0'; undo_str=g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,dmid,pid,row,row,param,s); s=g_string_free(new_data,FALSE);p=strchr(s,'\n');*p='\0'; redo_str=g_strdup_printf("set_wire_events \"%s\",\"%s\",\"%s\",%u,%u,%u,%s",smid,dmid,pid,row,row,param,s); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(smid);g_free(dmid);g_free(pid); g_object_unref(smachine); g_object_unref(wire_pattern); } break; case PGT_GLOBAL: { // serialize action GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gchar *undo_str,*redo_str,*s,*p; gchar *mid,*pid; g_object_get(machine,"id",&mid,NULL); g_object_get(self->priv->pattern,"id",&pid,NULL); bt_pattern_serialize_column(self->priv->pattern,row,row,param,old_data); bt_pattern_set_global_event(self->priv->pattern,row,param,str); bt_pattern_serialize_column(self->priv->pattern,row,row,param,new_data); s=g_string_free(old_data,FALSE);p=strchr(s,'\n');*p='\0'; undo_str=g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,row,row,param,s); s=g_string_free(new_data,FALSE);p=strchr(s,'\n');*p='\0'; redo_str=g_strdup_printf("set_global_events \"%s\",\"%s\",%u,%u,%u,%s",mid,pid,row,row,param,s); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(pid); } break; case PGT_VOICE: { // serialize action GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); guint voice = GPOINTER_TO_UINT(group->user_data); gchar *undo_str,*redo_str,*s,*p; gchar *mid,*pid; gulong global_params,voice_params,param_offset; g_object_get(machine,"id",&mid,"global-params",&global_params,"voice-params",&voice_params,NULL); g_object_get(self->priv->pattern,"id",&pid,NULL); param_offset=global_params+(voice*voice_params); bt_pattern_serialize_column(self->priv->pattern,row,row,param_offset+param,old_data); bt_pattern_set_voice_event(self->priv->pattern,row,voice,param,str); bt_pattern_serialize_column(self->priv->pattern,row,row,param_offset+param,new_data); s=g_string_free(old_data,FALSE);p=strchr(s,'\n');*p='\0'; undo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,row,row,voice,param,s); s=g_string_free(new_data,FALSE);p=strchr(s,'\n');*p='\0'; redo_str = g_strdup_printf("set_voice_events \"%s\",\"%s\",%u,%u,%u,%u,%s",mid,pid,row,row,voice,param,s); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(pid); } break; default: GST_WARNING("invalid column group type"); } pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); g_object_unref(machine); } /* val_to_float: read data from attern and convert to float for pattern-editor * used in pattern_edit_get_data_at() */ static gfloat note_number_val_to_float(GValue *v, gpointer user_data) { const gchar *note=g_value_get_string(v); if(note) return (gfloat)gstbt_tone_conversion_note_string_2_number(note); return 0.0; } static gfloat note_enum_val_to_float(GValue *v, gpointer user_data) { const GstBtNote note=g_value_get_enum(v); return (gfloat)note; } static gfloat float_val_to_float(GValue *v, gpointer user_data) { // scale value into 0...65535 range BtPatternEditorColumnConvertersFloatCallbacks *pcc=(BtPatternEditorColumnConvertersFloatCallbacks *)user_data; gdouble val=g_value_get_float(v); gdouble factor=65535.0/(pcc->max-pcc->min); //GST_DEBUG("> val %lf, factor %lf, result %lf",val,factor,(val-pcc->min)*factor); return (val-pcc->min)*factor; } static gfloat double_val_to_float(GValue *v, gpointer user_data) { // scale value into 0...65535 range BtPatternEditorColumnConvertersFloatCallbacks *pcc=(BtPatternEditorColumnConvertersFloatCallbacks *)user_data; gdouble val=g_value_get_double(v); gdouble factor=65535.0/(pcc->max-pcc->min); //GST_DEBUG("> val %lf, factor %lf, result %lf",val,factor,(val-pcc->min)*factor); return (val-pcc->min)*factor; } static gfloat boolean_val_to_float(GValue *v, gpointer user_data) { return (gfloat)g_value_get_boolean(v); } static gfloat enum_val_to_float(GValue *v, gpointer user_data) { return (gfloat)g_value_get_enum(v); } static gfloat int_val_to_float(GValue *v, gpointer user_data) { return (gfloat)g_value_get_int(v); } static gfloat uint_val_to_float(GValue *v, gpointer user_data) { return (gfloat)g_value_get_uint(v); } /* float_to_str: convert the float value to a deserializable string * used in pattern_edit_set_data_at() */ static const gchar * any_float_to_str(gfloat in, gpointer user_data) { return(bt_persistence_strfmt_double(in)); } static const gchar * note_float_to_str(gfloat in, gpointer user_data) { return(gstbt_tone_conversion_note_number_2_string((guint)in)); } static const gchar * float_float_to_str(gfloat in, gpointer user_data) { // scale value from 0...65535 range BtPatternEditorColumnConvertersFloatCallbacks *pcc=(BtPatternEditorColumnConvertersFloatCallbacks *)user_data; gdouble factor=65535.0/(pcc->max-pcc->min); gdouble val=pcc->min+(in/factor); //GST_DEBUG("< val %lf, factor %lf, result %lf(%s)",in,factor,val,bt_persistence_strfmt_double(val)); return bt_persistence_strfmt_double(val); } static void pattern_edit_fill_column_type(BtPatternEditorColumn *col,GParamSpec *property, GValue *min_val, GValue *max_val, GValue *no_val) { GType type=bt_g_type_get_base_type(property->value_type); GST_LOG("filling param type: '%s'::'%s'/'%s' for parameter '%s'", g_type_name(property->owner_type),g_type_name(type), g_type_name(property->value_type),property->name); switch(type) { case G_TYPE_STRING: { BtPatternEditorColumnConvertersCallbacks *pcc; col->type=PCT_NOTE; col->min=GSTBT_NOTE_NONE; col->max=GSTBT_NOTE_LAST; col->def=GSTBT_NOTE_NONE; col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersCallbacks *)col->user_data; pcc->val_to_float=note_number_val_to_float; pcc->float_to_str=note_float_to_str; } break; case G_TYPE_BOOLEAN: { BtPatternEditorColumnConvertersCallbacks *pcc; col->type=PCT_SWITCH; col->min=0; col->max=1; col->def=BT_IS_GVALUE(no_val)?g_value_get_boolean(no_val):col->max+1; col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersCallbacks *)col->user_data; pcc->val_to_float=boolean_val_to_float; pcc->float_to_str=any_float_to_str; } break; case G_TYPE_ENUM: { BtPatternEditorColumnConvertersCallbacks *pcc; col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersCallbacks *)col->user_data; pcc->val_to_float=enum_val_to_float; pcc->float_to_str=any_float_to_str; if(property->value_type==GSTBT_TYPE_TRIGGER_SWITCH) { col->type=PCT_SWITCH; col->min=GSTBT_TRIGGER_SWITCH_OFF; col->max=GSTBT_TRIGGER_SWITCH_ON; col->def=GSTBT_TRIGGER_SWITCH_EMPTY; } else if(property->value_type==GSTBT_TYPE_NOTE) { col->type=PCT_NOTE; col->min=GSTBT_NOTE_NONE; col->max=GSTBT_NOTE_LAST; col->def=GSTBT_NOTE_NONE; // we are using buzz like note values pcc->val_to_float=note_enum_val_to_float; pcc->float_to_str=note_float_to_str; } else { col->type=PCT_BYTE; col->min=g_value_get_enum(min_val); col->max=g_value_get_enum(max_val); col->def=BT_IS_GVALUE(no_val)?g_value_get_enum(no_val):col->max+1; } } break; case G_TYPE_INT: { BtPatternEditorColumnConvertersCallbacks *pcc; col->type=PCT_WORD; col->min=g_value_get_int(min_val); col->max=g_value_get_int(max_val); col->def=BT_IS_GVALUE(no_val)?g_value_get_int(no_val):col->max+1; if(col->min>=0 && col->max<256) { col->type=PCT_BYTE; } col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersCallbacks *)col->user_data; pcc->val_to_float=int_val_to_float; pcc->float_to_str=any_float_to_str; } break; case G_TYPE_UINT: { BtPatternEditorColumnConvertersCallbacks *pcc; col->type=PCT_WORD; col->min=g_value_get_uint(min_val); col->max=g_value_get_uint(max_val); col->def=BT_IS_GVALUE(no_val)?g_value_get_uint(no_val):col->max+1; if(col->min>=0 && col->max<256) { col->type=PCT_BYTE; } col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersCallbacks *)col->user_data; pcc->val_to_float=uint_val_to_float; pcc->float_to_str=any_float_to_str; } break; case G_TYPE_FLOAT: { BtPatternEditorColumnConvertersFloatCallbacks *pcc; col->type=PCT_WORD; col->min=0.0; col->max=65535.0; col->def=col->max+1; col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersFloatCallbacks *)col->user_data; ((BtPatternEditorColumnConvertersCallbacks*)pcc)->val_to_float=float_val_to_float; ((BtPatternEditorColumnConvertersCallbacks*)pcc)->float_to_str=float_float_to_str; pcc->min=g_value_get_float(min_val); pcc->max=g_value_get_float(max_val); /* @todo: need scaling * - in case of * wire.volume: 0.0->0x0000, 1.0->0x4000, 2.0->0x8000, 4.0->0xFFFF+1 * (see case G_TYPE_DOUBLE:) * wire.panorama: -1.0->0x0000, 0.0->0x4000, 1.0->0x4000 * song.master_volume: 0db->0.0->0x0000, -80db->1/100.000.000->0x4000 * scaling_factor is not enough * col->user_data=&pcc[2]; // log-map * - also showing gstreamer long desc for these elements is not so useful * * - we might need to put the scaling factor into the user_data * - how can we detect master-volume (log mapping) */ } break; case G_TYPE_DOUBLE: { BtPatternEditorColumnConvertersFloatCallbacks *pcc; col->type=PCT_WORD; col->min=0.0; col->max=65535.0; col->def=col->max+1; col->user_data=g_new(BtPatternEditorColumnConverters,1); pcc=(BtPatternEditorColumnConvertersFloatCallbacks *)col->user_data; ((BtPatternEditorColumnConvertersCallbacks*)pcc)->val_to_float=double_val_to_float; ((BtPatternEditorColumnConvertersCallbacks*)pcc)->float_to_str=float_float_to_str; // identify wire-elements // this is not the best way to identify a volume element // gst_registry_find_feature() is better but too slow here if(!strcmp(g_type_name(property->owner_type),"GstVolume")) { pcc->min=0.0; pcc->max=4.0; } else { pcc->min=g_value_get_double(min_val); pcc->max=g_value_get_double(max_val); } } break; default: GST_WARNING("unhandled param type: '%s' for parameter '%s'",g_type_name(type),property->name); col->type=0; col->min=col->max=col->def=0; col->user_data=NULL; } GST_INFO("%s parameter '%s' min/max/def : %6.4lf/%6.4lf/%6.4lf",g_type_name(type), property->name, col->min,col->max,col->def); g_value_unset(min_val); g_value_unset(max_val); g_free(min_val); g_free(max_val); } static void pattern_table_clear(const BtMainPagePatterns *self) { gulong i,j; for(i=0;ipriv->number_of_groups;i++) { for(j=0;jpriv->param_groups[i].num_columns;j++) { // voice parameter groups are copies if(!((self->priv->param_groups[i].type==PGT_VOICE) && (self->priv->param_groups[i].user_data!=NULL))) g_free(self->priv->param_groups[i].columns[j].user_data); } g_free(self->priv->param_groups[i].name); g_free(self->priv->param_groups[i].columns); } g_free(self->priv->param_groups); self->priv->param_groups=NULL; //self->priv->number_of_groups=0; } static void pattern_table_refresh(const BtMainPagePatterns *self) { static BtPatternEditorCallbacks callbacks = { pattern_edit_get_data_at, pattern_edit_set_data_at }; if(self->priv->pattern) { gulong i; gulong number_of_ticks,voices,global_params,voice_params; BtMachine *machine; BtPatternEditorColumnGroup *group; GParamSpec *property; GValue *min_val,*max_val,*no_val; g_object_get(self->priv->pattern,"length",&number_of_ticks,"voices",&voices,"machine",&machine,NULL); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); GST_DEBUG(" size is %2lu,%2lu",number_of_ticks,global_params); pattern_table_clear(self); // wire pattern data self->priv->number_of_groups=(global_params>0?1:0)+voices; if(!BT_IS_SOURCE_MACHINE(machine)) { GList *node; BtWire *wire; gulong wire_params; // need to iterate over all inputs node=machine->dst_wires; self->priv->number_of_groups+=g_list_length(node); group=self->priv->param_groups=g_new(BtPatternEditorColumnGroup,self->priv->number_of_groups); GST_INFO("wire parameters"); for(;node;node=g_list_next(node)) { BtMachine *src=NULL; wire=BT_WIRE(node->data); // check wire config g_object_get(wire,"num-params",&wire_params,"src",&src,NULL); group->type=PGT_WIRE; g_object_get(src,"id",&group->name,NULL), group->user_data=wire; group->num_columns=wire_params; group->columns=g_new(BtPatternEditorColumn,wire_params); group->width=0; for(i=0;icolumns[i],property,min_val,max_val,NULL); } g_object_unref(src); group++; } } else { group=self->priv->param_groups=g_new(BtPatternEditorColumnGroup,self->priv->number_of_groups); } if(global_params) { // create mapping for global params group->type=PGT_GLOBAL; /* label for first global parameter column in a pattern */ group->name=g_strdup(_("Globals")); group->user_data=NULL; group->num_columns=global_params; group->columns=g_new(BtPatternEditorColumn,global_params); group->width=0; GST_INFO("global parameters"); for(i=0;icolumns[i],property,min_val,max_val,no_val); //g_value_unset(&no_val); } group++; } if(voices) { BtPatternEditorColumnGroup *stamp=group; // create mapping for voice params group->type=PGT_VOICE; /* label for parameters of first voice column in a pattern */ group->name=g_strdup(_("Voice 1")); group->user_data=GUINT_TO_POINTER(0); group->num_columns=voice_params; group->columns=g_new(BtPatternEditorColumn,voice_params); group->width=0; GST_INFO("voice parameters"); for(i=0;icolumns[i],property,min_val,max_val,no_val); } group++; for(i=1;itype=PGT_VOICE; /* label for parameters of voice columns in a pattern */ group->name=g_strdup_printf(_("Voice %u"),(guint)(i+1)); group->user_data=GUINT_TO_POINTER(i); group->num_columns=voice_params; group->columns=g_memdup(stamp->columns,sizeof(BtPatternEditorColumn)*voice_params); group->width=0; group++; } } bt_pattern_editor_set_pattern(self->priv->pattern_table, (gpointer)self, number_of_ticks, self->priv->number_of_groups, self->priv->param_groups, &callbacks); g_object_unref(machine); } else { bt_pattern_editor_set_pattern(self->priv->pattern_table, (gpointer)self, 0, 0, NULL, &callbacks); } g_object_set(self->priv->pattern_table,"play-position",-1.0,NULL); } /* * context_menu_refresh: * @self: the pattern page * @machine: the currently selected machine * * enable/disable context menu items */ static void context_menu_refresh(const BtMainPagePatterns *self,BtMachine *machine) { if(machine) { gboolean has_patterns=bt_machine_has_patterns(machine); //gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu),TRUE); if(has_patterns) { if(bt_machine_is_polyphonic(machine)) { gulong voices; g_object_get(machine,"voices",&voices,NULL); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_add),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_remove),(voices>0)); } else { gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_add),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_remove),FALSE); } gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_properties),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_remove),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_copy),TRUE); } else { GST_INFO("machine has no patterns"); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_add),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_remove),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_properties),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_remove),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_copy),FALSE); } } else { GST_INFO("no machine"); //gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_add),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_track_remove),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_properties),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_remove),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(self->priv->context_menu_pattern_copy),FALSE); } } static BtPattern *add_new_pattern(const BtMainPagePatterns *self,BtMachine *machine) { BtSong *song; BtSongInfo *song_info; BtPattern *pattern; gchar *mid,*id,*name; gulong bars; g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"bars",&bars,NULL); g_object_get(machine,"id",&mid,NULL); name=bt_machine_get_unique_pattern_name(machine); id=g_strdup_printf("%s %s",mid,name); // new_pattern pattern=bt_pattern_new(song, id, name, bars, machine); // free ressources g_free(mid); g_free(id); g_free(name); g_object_unref(song_info); g_object_unref(song); return(pattern); } static BtPattern *get_current_pattern(const BtMainPagePatterns *self) { BtPattern *pattern; GtkTreeIter iter; GtkTreeModel *store; GST_INFO("get current pattern"); if(self->priv->machine) { if(gtk_combo_box_get_active_iter(self->priv->pattern_menu,&iter)) { store=gtk_combo_box_get_model(self->priv->pattern_menu); if((pattern=bt_pattern_list_model_get_object(BT_PATTERN_LIST_MODEL(store),&iter))) { GST_DEBUG(" got pattern: %p,pattern-ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); return(g_object_ref(pattern)); } } } return(NULL); } static void change_current_pattern(const BtMainPagePatterns *self, BtPattern *new_pattern) { BtPattern *old_pattern=self->priv->pattern; GST_DEBUG("change_pattern: %p -> %p",old_pattern,new_pattern); if(new_pattern==old_pattern) { GST_WARNING("new pattern is the same as previous"); return; } self->priv->pattern=g_object_try_ref(new_pattern); if(old_pattern) { if(self->priv->pattern_length_changed) { g_signal_handler_disconnect(old_pattern,self->priv->pattern_length_changed); self->priv->pattern_length_changed=0; } if(self->priv->pattern_voices_changed) { g_signal_handler_disconnect(old_pattern,self->priv->pattern_voices_changed); self->priv->pattern_voices_changed=0; } GST_INFO("unref old pattern: %p,ref_ct=%d",old_pattern,G_OBJECT_REF_COUNT(old_pattern)); g_object_unref(old_pattern); } // select pattern combo entry if(new_pattern) { GtkTreeModel *store; GtkTreeIter iter; store=gtk_combo_box_get_model(self->priv->pattern_menu); // get the row where row.pattern==pattern pattern_menu_model_get_iter_by_pattern(store,&iter,new_pattern); gtk_combo_box_set_active_iter(self->priv->pattern_menu,&iter); GST_DEBUG("selecting new pattern"); } // refresh pattern view GST_INFO("store new pattern : %p,ref_ct=%d",new_pattern,G_OBJECT_REF_COUNT(new_pattern)); pattern_table_refresh(self); pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->pattern_table)); if(new_pattern) { // watch the pattern self->priv->pattern_length_changed=g_signal_connect(new_pattern,"notify::length",G_CALLBACK(on_pattern_size_changed),(gpointer)self); self->priv->pattern_voices_changed=g_signal_connect(new_pattern,"notify::voices",G_CALLBACK(on_pattern_size_changed),(gpointer)self); } } static BtMachine *get_current_machine(const BtMainPagePatterns *self) { BtMachine *machine; GtkTreeIter iter; GtkTreeModel *store; GST_INFO("get current machine"); if(gtk_combo_box_get_active_iter(self->priv->machine_menu,&iter)) { store=gtk_combo_box_get_model(self->priv->machine_menu); if((machine=bt_machine_list_model_get_object(BT_MACHINE_LIST_MODEL(store),&iter))) { GST_DEBUG(" got machine: %p,machine-ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); return(g_object_ref(machine)); } } return(NULL); } static void change_current_machine(const BtMainPagePatterns *self, BtMachine *new_machine) { BtMachine *old_machine=self->priv->machine; if(new_machine==old_machine) { return; } GST_INFO("store new machine %p,ref_ct=%d",new_machine,G_OBJECT_REF_COUNT(new_machine)); self->priv->machine=g_object_try_ref(new_machine); GST_INFO("unref old machine %p,ref_ct=%d",old_machine,G_OBJECT_REF_COUNT(old_machine)); g_object_try_unref(old_machine); // show new list of pattern in pattern menu pattern_menu_refresh(self,new_machine); GST_INFO("1st done for machine %p,ref_ct=%d",new_machine,G_OBJECT_REF_COUNT(new_machine)); // refresh context menu context_menu_refresh(self,new_machine); GST_INFO("2nd done for machine %p,ref_ct=%d",new_machine,G_OBJECT_REF_COUNT(new_machine)); } static void switch_machine_and_pattern(const BtMainPagePatterns *self,BtMachine *machine, BtPattern *pattern) { GtkTreeIter iter; GtkTreeModel *store; if(machine) { // update machine menu store=gtk_combo_box_get_model(self->priv->machine_menu); machine_menu_model_get_iter_by_machine(store,&iter,machine); gtk_combo_box_set_active_iter(self->priv->machine_menu,&iter); } if(pattern) { // update pattern menu store=gtk_combo_box_get_model(self->priv->pattern_menu); pattern_menu_model_get_iter_by_pattern(store,&iter,pattern); gtk_combo_box_set_active_iter(self->priv->pattern_menu,&iter); } } static void lookup_machine_and_pattern(const BtMainPagePatterns *self,BtMachine **machine, BtPattern **pattern,gchar *mid, gchar *c_mid,gchar *pid, gchar *c_pid) { if(!c_mid || strcmp(mid,c_mid)) { BtSong *song; BtSetup *setup; // change machine and pattern g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); g_object_try_unref(*machine); *machine=bt_setup_get_machine_by_id(setup,mid); if (pid) { g_object_try_unref(*pattern); *pattern=bt_machine_get_pattern_by_id(*machine,pid); switch_machine_and_pattern(self,*machine,*pattern); } g_object_unref(setup); g_object_unref(song); } else if(pid && (!c_pid || strcmp(pid,c_pid))) { // change pattern g_object_try_unref(*pattern); *pattern=bt_machine_get_pattern_by_id(*machine,pid); switch_machine_and_pattern(self,NULL,*pattern); } } //-- event handler static void on_page_switched(GtkNotebook *notebook, GParamSpec *arg, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtMainWindow *main_window; guint page_num; static gint prev_page_num=-1; g_object_get(notebook,"page",&page_num,NULL); if(page_num==BT_MAIN_PAGES_PATTERNS_PAGE) { // only do this if the page really has changed if(prev_page_num != BT_MAIN_PAGES_PATTERNS_PAGE) { BtSong *song; GST_DEBUG("enter pattern page"); if(self->priv->machine) { // refresh to update colors in the menu (as usage might have changed) pattern_menu_refresh(self,self->priv->machine); } // add local commands g_object_get(self->priv->app,"main-window",&main_window,"song",&song,NULL); if(main_window) { gtk_window_add_accel_group(GTK_WINDOW(main_window),self->priv->accel_group); g_object_unref(main_window); } if(song) { g_object_set(song,"is-idle",self->priv->play_live,NULL); g_object_unref(song); } } } else { // only do this if the page was BT_MAIN_PAGES_PATTERNS_PAGE if(prev_page_num == BT_MAIN_PAGES_PATTERNS_PAGE) { BtSong *song; // only reset old GST_DEBUG("leave pattern page"); pattern_view_update_column_description(self,UPDATE_COLUMN_POP); // remove local commands g_object_get(self->priv->app,"main-window",&main_window,"song",&song,NULL); if(main_window) { gtk_window_remove_accel_group(GTK_WINDOW(main_window),self->priv->accel_group); g_object_unref(main_window); } if(song) { g_object_set(song,"is-idle",FALSE,NULL); g_object_unref(song); } } } prev_page_num = page_num; } static void on_pattern_size_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GST_INFO("pattern size changed : %p",self->priv->pattern); pattern_table_refresh(self); pattern_view_update_column_description(self,UPDATE_COLUMN_UPDATE); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->pattern_table)); } static void on_pattern_menu_changed(GtkComboBox *menu, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtPattern *pattern; // refresh pattern view GST_INFO("unref'ed old pattern: %p,ref_ct=%d", self->priv->pattern,G_OBJECT_REF_COUNT(self->priv->pattern)); pattern=get_current_pattern(self); change_current_pattern(self,pattern); if(self->priv->properties) { gchar *prop,*pid=NULL; gboolean have_val=FALSE; if(pattern) g_object_get(pattern,"name",&pid,NULL); if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"selected-pattern"))) { have_val=TRUE; } if(!pid) { g_hash_table_remove(self->priv->properties,"selected-pattern"); if(have_val) // irks, this is also triggered by undo and thus keeping the song dirty bt_edit_application_set_song_unsaved(self->priv->app); } else if((!have_val) || strcmp(prop,pid)) { g_hash_table_insert(self->priv->properties,g_strdup("selected-pattern"),pid); if(have_val) // irks, this is also triggered by undo and thus keeping the song dirty bt_edit_application_set_song_unsaved(self->priv->app); pid=NULL; } g_free(pid); } g_object_try_unref(pattern); GST_INFO("ref'ed new pattern: %p,ref_ct=%d", self->priv->pattern,G_OBJECT_REF_COUNT(self->priv->pattern)); } /* static void on_wavetable_menu_changed(GtkComboBox *menu, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); guint wave_ix; wave_ix=gtk_combo_box_get_active(self->priv->wavetable_menu); } */ static void on_base_octave_menu_changed(GtkComboBox *menu, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GHashTable *properties; self->priv->base_octave=gtk_combo_box_get_active(GTK_COMBO_BOX(self->priv->base_octave_menu)); g_object_set(self->priv->pattern_table,"octave",self->priv->base_octave,NULL); // remember for machine g_object_get(self->priv->machine,"properties",&properties,NULL); g_hash_table_insert(properties,g_strdup("base-octave"),g_strdup_printf("%d",self->priv->base_octave)); } static void on_play_live_toggled(GtkButton *button, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtSong *song; self->priv->play_live=gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(button)); g_object_get(self->priv->app,"song",&song,NULL); g_object_set(song,"is-idle",self->priv->play_live,NULL); g_object_unref(song); } static void on_toolbar_menu_clicked(GtkButton *button, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,1,gtk_get_current_event_time()); } static void on_machine_added(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GST_INFO("new machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); if(bt_change_log_is_active(self->priv->change_log)) { if(BT_IS_SOURCE_MACHINE(machine)) { BtPattern *pattern=add_new_pattern(self, machine); context_menu_refresh(self,machine); g_object_unref(pattern); } } //g_signal_connect(machine,"pattern-added",G_CALLBACK(on_pattern_added),(gpointer)self); g_signal_connect(machine,"pattern-removed",G_CALLBACK(on_pattern_removed),(gpointer)self); GST_INFO("... machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); } static void on_machine_removed(BtSetup *setup,BtMachine *machine,gpointer user_data) { //BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtPattern *pattern=NULL; GList *node,*list; gboolean is_internal; g_return_if_fail(BT_IS_MACHINE(machine)); GST_INFO("machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); // remove all patterns to ensure we emit "pattern-removed" signals g_object_get(machine,"patterns",&list,NULL); for(node=list;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); g_object_get(pattern,"is-internal",&is_internal,NULL); if(!is_internal) { GST_DEBUG("removing pattern: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); bt_machine_remove_pattern(machine,pattern); GST_DEBUG("removed pattern: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); } else { GST_DEBUG("keeping pattern: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); } g_object_unref(pattern); } g_list_free(list); } static void on_wire_added(BtSetup *setup,BtWire *wire,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtMachine *this_machine,*that_machine; if(!self->priv->pattern) return; g_object_get(self->priv->pattern,"machine",&this_machine,NULL); g_object_get(wire,"dst",&that_machine,NULL); if(this_machine==that_machine) { pattern_table_refresh(self); } g_object_unref(this_machine); g_object_unref(that_machine); } static void on_wire_removed(BtSetup *setup,BtWire *wire,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtMachine *this_machine,*that_machine; if(!self->priv->pattern) return; g_object_get(self->priv->pattern,"machine",&this_machine,NULL); g_object_get(wire,"dst",&that_machine,NULL); if(this_machine==that_machine) { pattern_table_refresh(self); } // add undo/redo details if(bt_change_log_is_active(self->priv->change_log)) { GList *list,*node; BtMachine *smachine; BtPattern *pattern; BtWirePattern *wire_pattern; gulong length; gulong wire_params; gchar *smid,*dmid; g_object_get(wire,"src",&smachine,"num-params",&wire_params,NULL); g_object_get(smachine,"id",&smid,NULL); g_object_get(that_machine,"id",&dmid,"patterns",&list,NULL); for(node=list;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); wire_pattern=bt_wire_get_pattern(wire,pattern); if(wire_pattern) { gchar *undo_str; GString *data=g_string_new(NULL); guint end; gchar *str,*p,*pid; guint i; g_object_get(pattern,"id",&pid,"length",&length,NULL); end=length-1; bt_wire_pattern_serialize_columns(wire_pattern,0,end,data); str=data->str; bt_change_log_start_group(self->priv->change_log); for(i=0;ipriv->change_log,BT_CHANGE_LOGGER(self),undo_str,g_strdup(undo_str)); } bt_change_log_end_group(self->priv->change_log); g_string_free(data,TRUE); g_free(pid); g_object_unref(wire_pattern); } g_object_unref(pattern); } g_list_free(list); g_free(smid);g_free(dmid); g_object_unref(smachine); } g_object_unref(this_machine); g_object_unref(that_machine); } static void on_wave_added_or_removed(BtWavetable *wavetable,BtWave *wave,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); wavetable_menu_refresh(self,wavetable); } static void on_machine_menu_changed(GtkComboBox *menu, gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtMachine *machine; GHashTable *properties; gchar *prop; machine=get_current_machine(self); GST_DEBUG("machine_menu changed, new machine is %s",(machine?GST_OBJECT_NAME(machine):"")); change_current_machine(self,machine); if(self->priv->properties) { gchar *prop,*mid; gboolean have_val=FALSE; g_object_get(self->priv->machine,"id",&mid,NULL); if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"selected-machine"))) { have_val=TRUE; } if((!have_val) || (strcmp(prop,mid))) { g_hash_table_insert(self->priv->properties,g_strdup("selected-machine"),mid); if(have_val) bt_edit_application_set_song_unsaved(self->priv->app); mid=NULL; } g_free(mid); } // switch to last used base octave of that machine g_object_get(self->priv->machine,"properties",&properties,NULL); if((prop=(gchar *)g_hash_table_lookup(properties,"base-octave"))) { self->priv->base_octave=atoi(prop); } else { self->priv->base_octave=DEFAULT_BASE_OCTAVE; } gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->base_octave_menu),self->priv->base_octave); g_object_try_unref(machine); } static void on_sequence_tick(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtSequence *sequence; BtMachine *machine,*cur_machine=self->priv->machine; BtPattern *pattern; gulong i,pos,spos; glong j; gulong tracks,length,sequence_length; gdouble play_pos; gboolean found=FALSE; if(!self->priv->pattern) return; g_object_get(self->priv->pattern,"length",&length,NULL); g_object_get((gpointer)song,"sequence",&sequence,"play-pos",&pos,NULL); g_object_get(sequence,"tracks",&tracks,"length",&sequence_length,NULL); if(pos ticks from current pos spos=(pos>length)?(pos-length):0; for(j=pos;((j>spos) && !found);j--) { // get pattern for current machine and current tick from sequence if((pattern=bt_sequence_get_pattern(sequence,j,i))) { // if it is the pattern we currently show, set play-line if(pattern==self->priv->pattern) { play_pos=(gdouble)(pos-j)/(gdouble)length; g_object_set(self->priv->pattern_table,"play-position",play_pos,NULL); found=TRUE; } g_object_unref(pattern); /* if there was a different pattern, don't look further */ break; } } } g_object_unref(machine); } } if(!found) { // unfortunately the 2nd widget may lag behind with redrawing itself :( g_object_set(self->priv->pattern_table,"play-position",-1.0,NULL); } // release the references g_object_unref(sequence); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtSong *song; BtSetup *setup; BtWavetable *wavetable; gchar *prop; GST_INFO("song has changed : app=%p, self=%p",app,self); // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); if(!song) { self->priv->properties=NULL; GST_INFO("song (null) has changed done"); return; } GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); g_object_get(song,"setup",&setup,"wavetable",&wavetable,NULL); g_object_get(setup,"properties",&self->priv->properties,NULL); // get stored settings if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"selected-machine"))) { BtMachine *new_machine; if((new_machine=bt_setup_get_machine_by_id(setup,prop))) { g_object_try_unref(self->priv->machine); self->priv->machine=new_machine; } } if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"selected-pattern"))) { BtPattern *new_pattern; if((new_pattern=bt_machine_get_pattern_by_id(self->priv->machine,prop))) { g_object_try_unref(self->priv->pattern); self->priv->pattern=new_pattern; } } // update page machine_menu_refresh(self,setup); //pattern_menu_refresh(self); // should be triggered by machine_menu_refresh() wavetable_menu_refresh(self,wavetable); g_signal_connect(setup,"machine-added",G_CALLBACK(on_machine_added),(gpointer)self); g_signal_connect(setup,"machine-removed",G_CALLBACK(on_machine_removed),(gpointer)self); g_signal_connect(setup,"wire-added",G_CALLBACK(on_wire_added),(gpointer)self); g_signal_connect(setup,"wire-removed",G_CALLBACK(on_wire_removed),(gpointer)self); g_signal_connect(wavetable,"wave-added",G_CALLBACK(on_wave_added_or_removed),(gpointer)self); g_signal_connect(wavetable,"wave-removed",G_CALLBACK(on_wave_added_or_removed),(gpointer)self); // subscribe to play-pos changes of song->sequence g_signal_connect(song, "notify::play-pos", G_CALLBACK(on_sequence_tick), (gpointer)self); // release the references g_object_unref(wavetable); g_object_unref(setup); g_object_unref(song); GST_INFO("song has changed done"); } static void on_context_menu_track_add_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); gulong voices; gchar *undo_str,*redo_str; gchar *mid; g_object_get(self->priv->machine,"voices",&voices,"id",&mid,NULL); undo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,voices); redo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,voices+1); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid); voices++; g_object_set(self->priv->machine,"voices",voices,NULL); // we adjust sensitivity of add/rem track menu items context_menu_refresh(self,self->priv->machine); } static void on_context_menu_track_remove_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtPattern *saved_pattern; gulong voices; gchar *undo_str,*redo_str; gchar *mid; GList *list,*node; GString *old_data; gulong length; gint group; gboolean is_internal; g_object_get(self->priv->machine,"voices",&voices,"id",&mid,"patterns",&list,NULL); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,voices); redo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,voices-1); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); /* this is hackish, we muck with self->priv->pattern as some local * methods assume the current pattern */ for(group=0;grouppriv->number_of_groups;group++) { BtPatternEditorColumnGroup *g=&self->priv->param_groups[group]; if((g->type==PGT_VOICE) && (g->user_data==GUINT_TO_POINTER(voices-1))) break; } /* save voice-data for *all* patterns of this machine */ saved_pattern=self->priv->pattern; for(node=list;node;node=g_list_next(node)) { self->priv->pattern=BT_PATTERN(node->data); g_object_get(self->priv->pattern,"length",&length,"is-internal",&is_internal,NULL); if(!is_internal) { old_data=g_string_new(NULL); pattern_range_copy(self,0,length-1,group,-1,old_data); pattern_range_log_undo_redo(self,0,length-1,group,-1,old_data->str,g_strdup(old_data->str)); g_string_free(old_data,TRUE); } g_object_unref(node->data); } self->priv->pattern=saved_pattern; g_list_free(list); g_free(mid); bt_change_log_end_group(self->priv->change_log); voices--; g_object_set(self->priv->machine,"voices",voices,NULL); // we adjust sensitivity of add/rem track menu items context_menu_refresh(self,self->priv->machine); } static void on_context_menu_pattern_new_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtPattern *pattern; GtkWidget *dialog; // new_pattern pattern=add_new_pattern(self,self->priv->machine); // pattern_properties dialog=GTK_WIDGET(bt_pattern_properties_dialog_new(pattern)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { gchar *undo_str,*redo_str; gchar *mid,*pid,*pname; gulong length; bt_pattern_properties_dialog_apply(BT_PATTERN_PROPERTIES_DIALOG(dialog)); GST_INFO("new pattern added : %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); g_object_get(self->priv->machine,"id",&mid,NULL); g_object_get(pattern,"id",&pid,"name",&pname,"length",&length,NULL); undo_str = g_strdup_printf("rem_pattern \"%s\",\"%s\"",mid,pid); redo_str = g_strdup_printf("add_pattern \"%s\",\"%s\",\"%s\",%lu",mid,pid,pname,length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(pid);g_free(pname); context_menu_refresh(self,self->priv->machine); } else { bt_machine_remove_pattern(self->priv->machine,pattern); } gtk_widget_destroy(dialog); // free ressources g_object_unref(pattern); GST_DEBUG("new pattern done"); } static void on_context_menu_pattern_properties_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); GtkWidget *dialog; g_return_if_fail(self->priv->pattern); // pattern_properties dialog=GTK_WIDGET(bt_pattern_properties_dialog_new(self->priv->pattern)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { BtMachine *machine; gchar *new_name, *old_name; gulong new_length, old_length, new_voices, old_voices; gchar *undo_str,*redo_str; gchar *mid,*pid; /* we need to check what got changed in the properties to do the undo/redo * before applying the changes, we can check the settings from the dialog */ g_object_get(self->priv->pattern,"id",&pid,"name",&old_name,"length",&old_length,"voices",&old_voices,"machine",&machine,NULL); g_object_get(dialog,"name",&new_name,"length",&new_length,"voices",&new_voices,NULL); g_object_get(machine,"id",&mid,NULL); bt_change_log_start_group(self->priv->change_log); if(strcmp(old_name,new_name)) { undo_str = g_strdup_printf("set_pattern_property \"%s\",\"%s\",\"name\",\"%s\"",mid,pid,old_name); redo_str = g_strdup_printf("set_pattern_property \"%s\",\"%s\",\"name\",\"%s\"",mid,pid,new_name); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } if(old_length!=new_length) { undo_str = g_strdup_printf("set_pattern_property \"%s\",\"%s\",\"length\",\"%lu\"",mid,pid,old_length); redo_str = g_strdup_printf("set_pattern_property \"%s\",\"%s\",\"length\",\"%lu\"",mid,pid,new_length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); if(old_length>new_length) { GString *old_data=g_string_new(NULL); pattern_range_copy(self,new_length,old_length-1,-1,-1,old_data); pattern_range_log_undo_redo(self,new_length,old_length-1,-1,-1,old_data->str,g_strdup(old_data->str)); g_string_free(old_data,TRUE); } } if(old_voices!=new_voices) { undo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,old_voices); redo_str = g_strdup_printf("set_voices \"%s\",%lu",mid,new_voices); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); if(old_voices>new_voices) { BtPattern *saved_pattern; GList *list,*node; GString *old_data; gulong length; gint group,beg_group,end_group; gboolean is_internal; /* this is hackish, we muck with self->priv->pattern as some local * methods assume the current pattern */ for(group=0;grouppriv->number_of_groups;group++) { BtPatternEditorColumnGroup *g=&self->priv->param_groups[group]; if((g->type==PGT_VOICE) && (g->user_data==GUINT_TO_POINTER(new_voices))) break; } beg_group=group;end_group=group+(old_voices-new_voices); /* save voice-data for *all* patterns of this machine */ g_object_get(machine,"patterns",&list,NULL); saved_pattern=self->priv->pattern; for(node=list;node;node=g_list_next(node)) { self->priv->pattern=BT_PATTERN(node->data); g_object_get(self->priv->pattern,"length",&length,"is-internal",&is_internal,NULL); if(!is_internal) { for(group=beg_group;groupstr,g_strdup(old_data->str)); g_string_free(old_data,TRUE); } } g_object_unref(node->data); } self->priv->pattern=saved_pattern; g_list_free(list); } } bt_change_log_end_group(self->priv->change_log); bt_pattern_properties_dialog_apply(BT_PATTERN_PROPERTIES_DIALOG(dialog)); g_free(mid);g_free(pid);g_free(old_name);g_free(new_name); } gtk_widget_destroy(dialog); } static void on_context_menu_pattern_remove_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtPattern *pattern=self->priv->pattern; BtMachine *machine; g_return_if_fail(pattern); g_object_get(pattern,"machine",&machine,NULL); bt_change_log_start_group(self->priv->change_log); bt_machine_remove_pattern(machine,pattern); bt_change_log_end_group(self->priv->change_log); context_menu_refresh(self,machine); g_object_unref(machine); } static void on_context_menu_pattern_copy_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); BtMachine *machine; BtPattern *pattern; GtkWidget *dialog; g_return_if_fail(self->priv->pattern); // copy pattern pattern=bt_pattern_copy(self->priv->pattern); g_return_if_fail(pattern); g_object_get(pattern,"machine",&machine,NULL); // pattern_properties dialog=GTK_WIDGET(bt_pattern_properties_dialog_new(pattern)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); if(gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) { gchar *undo_str,*redo_str; gchar *mid,*pid,*pname; gulong length; bt_pattern_properties_dialog_apply(BT_PATTERN_PROPERTIES_DIALOG(dialog)); GST_INFO("new pattern added : %p",pattern); g_object_get(machine,"id",&mid,NULL); g_object_get(pattern,"id",&pid,"name",&pname,"length",&length,NULL); undo_str = g_strdup_printf("rem_pattern \"%s\",\"%s\"",mid,pid); redo_str = g_strdup_printf("add_pattern \"%s\",\"%s\",\"%s\",%lu",mid,pid,pname,length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(pid);g_free(pname); context_menu_refresh(self,machine); } else { bt_machine_remove_pattern(machine,pattern); } gtk_widget_destroy(dialog); g_object_unref(pattern); g_object_unref(machine); } static void on_context_menu_machine_properties_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); bt_machine_show_properties_dialog(self->priv->machine); } static void on_context_menu_machine_preferences_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPagePatterns *self=BT_MAIN_PAGE_PATTERNS(user_data); bt_machine_show_preferences_dialog(self->priv->machine); } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { GtkToolbar *toolbar=GTK_TOOLBAR(user_data); gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'", toolbar_style); gtk_toolbar_set_style(toolbar,gtk_toolbar_get_style_from_string(toolbar_style)); g_free(toolbar_style); } //-- helper methods static void bt_main_page_patterns_init_ui(const BtMainPagePatterns *self,const BtMainPages *pages) { GtkWidget *toolbar,*tool_item,*box; GtkWidget *scrolled_window; GtkWidget *menu_item,*image; GtkCellRenderer *renderer; BtSettings *settings; gint i; gchar oct_str[2]; GST_DEBUG("!!!! self=%p",self); gtk_widget_set_name(GTK_WIDGET(self),"pattern view"); // add toolbar toolbar=gtk_toolbar_new(); gtk_widget_set_name(toolbar,"pattern view toolbar"); gtk_box_pack_start(GTK_BOX(self),toolbar,FALSE,FALSE,0); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_BOTH); // add toolbar widgets // machine select box=gtk_hbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(box),4); self->priv->machine_menu=GTK_COMBO_BOX(gtk_combo_box_new()); gtk_combo_box_set_focus_on_click(self->priv->machine_menu,FALSE); renderer=gtk_cell_renderer_pixbuf_new (); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->machine_menu),renderer,FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->machine_menu),renderer,"pixbuf",BT_MACHINE_MODEL_ICON,NULL); renderer=gtk_cell_renderer_text_new(); //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->machine_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->machine_menu),renderer,"text",BT_MACHINE_MODEL_LABEL,NULL); g_signal_connect(self->priv->machine_menu, "changed", G_CALLBACK(on_machine_menu_changed), (gpointer)self); /* this won't work, as we can't pass anything to the event handler * gtk_widget_add_accelerator(self->priv->machine_menu, "key-press-event", accel_group, GDK_Cursor_Up, GDK_CONTROL_MASK, 0); * so, we need to subclass the combobox and add two signals: select-next, select-prev */ gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Machine")),FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->machine_menu),TRUE,TRUE,2); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"Machine"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // pattern select box=gtk_hbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(box),4); self->priv->pattern_menu=GTK_COMBO_BOX(gtk_combo_box_new()); gtk_combo_box_set_focus_on_click(self->priv->pattern_menu,FALSE); renderer=gtk_cell_renderer_text_new(); //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer, "foreground","gray", NULL); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->pattern_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->pattern_menu),renderer, "text",BT_PATTERN_MODEL_LABEL, "foreground-set",BT_PATTERN_MODEL_IS_UNUSED, NULL); gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Pattern")),FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->pattern_menu),TRUE,TRUE,2); self->priv->pattern_menu_changed=g_signal_connect(self->priv->pattern_menu, "changed", G_CALLBACK(on_pattern_menu_changed), (gpointer)self); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"Pattern"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // add wavetable entry select box=gtk_hbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(box),4); self->priv->wavetable_menu=GTK_COMBO_BOX(gtk_combo_box_new()); gtk_combo_box_set_focus_on_click(self->priv->wavetable_menu,FALSE); renderer=gtk_cell_renderer_text_new(); //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); g_object_set(renderer, "width", 22, NULL); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->wavetable_menu),renderer,FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->wavetable_menu),renderer,"text",WAVE_MENU_NUMBER,NULL); renderer=gtk_cell_renderer_text_new(); //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->wavetable_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->wavetable_menu),renderer,"text",WAVE_MENU_LABEL,NULL); gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Wave")),FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->wavetable_menu),TRUE,TRUE,2); //g_signal_connect(self->priv->wavetable_menu, "changed", G_CALLBACK(on_wavetable_menu_changed), (gpointer)self); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"Wave"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // add base octave (0-8) box=gtk_hbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(box),4); self->priv->base_octave_menu=gtk_combo_box_text_new(); gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(self->priv->base_octave_menu),FALSE); for(i=0;i<8;i++) { sprintf(oct_str,"%1d",i); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->base_octave_menu),oct_str); } gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->base_octave_menu),self->priv->base_octave); gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Octave")),FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(box),self->priv->base_octave_menu,TRUE,TRUE,2); g_signal_connect(self->priv->base_octave_menu, "changed", G_CALLBACK(on_base_octave_menu_changed), (gpointer)self); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"Octave"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // add play live toggle tool button tool_item=GTK_WIDGET(gtk_toggle_tool_button_new()); gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(tool_item),gtk_image_new_from_filename("stock_volume.png")); gtk_tool_button_set_label(GTK_TOOL_BUTTON(tool_item),_("Play live")); gtk_widget_set_name(tool_item,"Play live"); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Play notes and triggers while editing the pattern")); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"toggled",G_CALLBACK(on_play_live_toggled),(gpointer)self); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // popup menu button image=gtk_image_new_from_filename("popup-menu.png"); tool_item=GTK_WIDGET(gtk_tool_button_new(image,_("Pattern view menu"))); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Menu actions for pattern view below")); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_menu_clicked),(gpointer)self); // get colors self->priv->cursor_bg=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_CURSOR); self->priv->selection_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SELECTION1); self->priv->selection_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SELECTION2); /* @idea what about adding one control for global params and one for each voice, * - then these controls can be folded (hidden) */ // add pattern list-view scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_NONE); self->priv->pattern_table=BT_PATTERN_EDITOR(bt_pattern_editor_new()); g_object_set(self->priv->pattern_table,"octave",self->priv->base_octave,"play-position",-1.0,NULL); //gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),GTK_WIDGET(self->priv->pattern_table)); g_signal_connect(self->priv->pattern_table, "key-press-event", G_CALLBACK(on_pattern_table_key_press_event), (gpointer)self); g_signal_connect(self->priv->pattern_table, "button-press-event", G_CALLBACK(on_pattern_table_button_press_event), (gpointer)self); g_signal_connect(self->priv->pattern_table, "notify::cursor-group", G_CALLBACK(on_pattern_table_cursor_group_changed), (gpointer)self); g_signal_connect(self->priv->pattern_table, "notify::cursor-param", G_CALLBACK(on_pattern_table_cursor_param_changed), (gpointer)self); g_signal_connect(self->priv->pattern_table, "notify::cursor-row", G_CALLBACK(on_pattern_table_cursor_row_changed), (gpointer)self); gtk_container_add(GTK_CONTAINER(self), GTK_WIDGET(scrolled_window)); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->pattern_table)); gtk_widget_set_name(GTK_WIDGET(self->priv->pattern_table),"pattern editor"); // generate the context menu self->priv->accel_group=gtk_accel_group_new(); self->priv->context_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); gtk_menu_set_accel_group(GTK_MENU(self->priv->context_menu), self->priv->accel_group); gtk_menu_set_accel_path(GTK_MENU(self->priv->context_menu),"/PatternView/PatternContext"); self->priv->context_menu_track_add=menu_item=gtk_image_menu_item_new_with_label(_("New track")); image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/AddTrack"); gtk_accel_map_add_entry ("/PatternView/PatternContext/AddTrack", GDK_plus, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_track_add_activate),(gpointer)self); self->priv->context_menu_track_remove=menu_item=gtk_image_menu_item_new_with_label(_("Remove last track")); image=gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/RemoveTrack"); gtk_accel_map_add_entry ("/PatternView/PatternContext/RemoveTrack", GDK_minus, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_track_remove_activate),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("New pattern ...")); image=gtk_image_new_from_stock(GTK_STOCK_NEW,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/NewPattern"); gtk_accel_map_add_entry ("/PatternView/PatternContext/NewPattern", GDK_Return, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_pattern_new_activate),(gpointer)self); self->priv->context_menu_pattern_properties=menu_item=gtk_image_menu_item_new_with_label(_("Pattern properties...")); image=gtk_image_new_from_stock(GTK_STOCK_PROPERTIES,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/PatternProperties"); gtk_accel_map_add_entry ("/PatternView/PatternContext/PatternProperties", GDK_BackSpace, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_pattern_properties_activate),(gpointer)self); self->priv->context_menu_pattern_remove=menu_item=gtk_image_menu_item_new_with_label(_("Remove pattern...")); image=gtk_image_new_from_stock(GTK_STOCK_DELETE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/RemovePattern"); gtk_accel_map_add_entry ("/PatternView/PatternContext/RemovePattern", GDK_Delete, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_pattern_remove_activate),(gpointer)self); self->priv->context_menu_pattern_copy=menu_item=gtk_image_menu_item_new_with_label(_("Copy pattern...")); image=gtk_image_new_from_stock(GTK_STOCK_COPY,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/PatternView/PatternContext/CopyPattern"); gtk_accel_map_add_entry ("/PatternView/PatternContext/CopyPattern", GDK_Return, GDK_CONTROL_MASK|GDK_SHIFT_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_pattern_copy_activate),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Machine properties")); // dynamic part image=gtk_image_new_from_stock(GTK_STOCK_PROPERTIES,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_machine_properties_activate),(gpointer)self); menu_item=gtk_image_menu_item_new_with_label(_("Machine preferences")); // static part image=gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_machine_preferences_activate),(gpointer)self); // -- // @todo solo, mute, bypass // -- // @todo cut, copy, paste // register event handlers g_signal_connect((gpointer)(self->priv->app), "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); // listen to page changes g_signal_connect((gpointer)pages,"notify::page",G_CALLBACK(on_page_switched),(gpointer)self); // let settings control toolbar style g_object_get(self->priv->app,"settings",&settings,NULL); on_toolbar_style_changed(settings,NULL,(gpointer)toolbar); g_signal_connect(settings,"notify::toolbar-style",G_CALLBACK(on_toolbar_style_changed),(gpointer)toolbar); g_object_unref(settings); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_page_patterns_new: * @pages: the page collection * * Create a new instance * * Returns: the new instance */ BtMainPagePatterns *bt_main_page_patterns_new(const BtMainPages *pages) { BtMainPagePatterns *self; self=BT_MAIN_PAGE_PATTERNS(g_object_new(BT_TYPE_MAIN_PAGE_PATTERNS,NULL)); bt_main_page_patterns_init_ui(self,pages); return(self); } //-- methods /** * bt_main_page_patterns_show_pattern: * @self: the pattern subpage * @pattern: the pattern to show * * Show the given @pattern. Will update machine and pattern menu. */ void bt_main_page_patterns_show_pattern(const BtMainPagePatterns *self,BtPattern *pattern) { BtMachine *machine; g_object_get(pattern,"machine",&machine,NULL); switch_machine_and_pattern(self,machine,pattern); // focus pattern editor gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->pattern_table)); // release the references g_object_unref(machine); } /** * bt_main_page_patterns_show_machine: * @self: the pattern subpage * @machine: the machine to show * * Show the given @machine. Will update machine menu. */ void bt_main_page_patterns_show_machine(const BtMainPagePatterns *self,BtMachine *machine) { GtkTreeIter iter; GtkTreeModel *store; // update machine menu store=gtk_combo_box_get_model(self->priv->machine_menu); machine_menu_model_get_iter_by_machine(store,&iter,machine); gtk_combo_box_set_active_iter(self->priv->machine_menu,&iter); // focus pattern editor gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->pattern_table)); } //-- cut/copy/paste static void pattern_clipboard_get_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,guint info,gpointer data) { GST_INFO("get clipboard data, info=%d, data=%p",info,data); GST_INFO("sending : [%s]",data); // @todo: do we need to format differently depending on info? if(gtk_selection_data_get_target(selection_data)==pattern_atom) { gtk_selection_data_set(selection_data,pattern_atom,8,(guchar *)data,strlen(data)); } else { // allow pasting into a test editor for debugging // its only active if we register the formats in _copy_selection() below gtk_selection_data_set_text(selection_data,data,-1); } } static void pattern_clipboard_clear_func(GtkClipboard *clipboard,gpointer data) { GST_INFO("freeing clipboard data, data=%p",data); g_free(data); } /** * bt_main_page_patterns_delete_selection: * @self: the pattern subpage * * Delete (clear) the selected area. */ void bt_main_page_patterns_delete_selection(const BtMainPagePatterns *self) { pattern_selection_apply(self, bt_pattern_delete_column,bt_pattern_delete_columns, bt_wire_pattern_delete_column,bt_wire_pattern_delete_columns); } /** * bt_main_page_patterns_cut_selection: * @self: the pattern subpage * * Cut selected area. */ void bt_main_page_patterns_cut_selection(const BtMainPagePatterns *self) { bt_main_page_patterns_copy_selection(self); bt_main_page_patterns_delete_selection(self); } /** * bt_main_page_patterns_copy_selection: * @self: the sequence subpage * * Copy selected area. */ void bt_main_page_patterns_copy_selection(const BtMainPagePatterns *self) { gint beg,end,group,param; if(bt_pattern_editor_get_selection(self->priv->pattern_table,&beg,&end,&group,¶m)) { //GtkClipboard *cb=gtk_clipboard_get_for_display(gdk_display_get_default(),GDK_SELECTION_CLIPBOARD); //GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->pattern_table),GDK_SELECTION_SECONDARY); GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->pattern_table),GDK_SELECTION_CLIPBOARD); GtkTargetEntry *targets; gint n_targets; GString *data=g_string_new(NULL); targets = gtk_target_table_make(pattern_atom, &n_targets); /* the number of ticks */ g_string_append_printf(data,"%d\n",end-beg); pattern_range_copy(self,beg,end,group,param,data); GST_INFO("copying : [%s]",data->str); /* put to clipboard */ if(gtk_clipboard_set_with_data(cb,targets,n_targets, pattern_clipboard_get_func,pattern_clipboard_clear_func, g_string_free(data,FALSE)) ) { gtk_clipboard_set_can_store (cb, NULL, 0); } else { GST_INFO("copy failed"); } gtk_target_table_free (targets, n_targets); GST_INFO("copy done"); } } static void pattern_clipboard_received_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,gpointer user_data) { BtMainPagePatterns *self = BT_MAIN_PAGE_PATTERNS(user_data); gchar **lines; gchar *data; GST_INFO("receiving clipboard data"); data=(gchar *)gtk_selection_data_get_data(selection_data); GST_INFO("pasting : [%s]",data); if(!data) return; lines=g_strsplit_set(data,"\n",0); if(lines[0]) { guint ticks=atol(lines[0]); gint i=1,g,p; gint beg,end; gulong pattern_length; BtPatternEditorColumnGroup *pc_group; BtMachine *machine; gboolean res=TRUE; g_object_get(self->priv->pattern,"length",&pattern_length,"machine",&machine,NULL); pattern_length--; // paste from self->priv->cursor_row to MIN(self->priv->cursor_row+ticks,pattern_length) beg=self->priv->cursor_row; end=beg+ticks; end=MIN(end,pattern_length); GST_INFO("pasting from row %d to %d",beg,end); g=self->priv->cursor_group; p=self->priv->cursor_param; pc_group=&self->priv->param_groups[g]; // process each line (= pattern column) while(lines[i] && *lines[i] && res) { if(*lines[i]!='\n') { switch (pc_group->type) { case PGT_WIRE: { BtWirePattern *wire_pattern=bt_wire_get_pattern(pc_group->user_data,self->priv->pattern); if(wire_pattern) { res=bt_wire_pattern_deserialize_column(wire_pattern,beg,end,p,lines[i]); g_object_unref(wire_pattern); } } break; case PGT_GLOBAL: res=bt_pattern_deserialize_column(self->priv->pattern,beg,end,p,lines[i]); break; case PGT_VOICE: { gulong global_params, voice_params, params; g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); params=global_params+(GPOINTER_TO_UINT(pc_group->user_data)*voice_params); res=bt_pattern_deserialize_column(self->priv->pattern,beg,end,params+p,lines[i]); } break; } } else { GST_INFO("skip blank line"); } i++;p++; if(p==pc_group->num_columns) { // switch to next group or stop if(gpriv->number_of_groups) { g++;p=0; pc_group=&self->priv->param_groups[g]; } else { break; } } } g_object_unref(machine); gtk_widget_queue_draw(GTK_WIDGET(self->priv->pattern_table)); } g_strfreev(lines); } /** * bt_main_page_patterns_paste_selection: * @self: the pattern subpage * * Paste at the top of the selected area. */ void bt_main_page_patterns_paste_selection(const BtMainPagePatterns *self) { //GtkClipboard *cb=gtk_clipboard_get_for_display(gdk_display_get_default(),GDK_SELECTION_CLIPBOARD); //GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->pattern_table),GDK_SELECTION_SECONDARY); GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->pattern_table),GDK_SELECTION_CLIPBOARD); gtk_clipboard_request_contents(cb,pattern_atom,pattern_clipboard_received_func,(gpointer)self); } //-- change logger interface static gboolean bt_main_page_patterns_change_logger_change(const BtChangeLogger *owner,const gchar *data) { BtMainPagePatterns *self = BT_MAIN_PAGE_PATTERNS(owner); gboolean res=FALSE; BtMachine *machine; BtPattern *pattern=g_object_try_ref(self->priv->pattern); gchar *c_mid,*c_pid; GMatchInfo *match_info; guint s_row=0,e_row=0,group=0,param=0; gchar *s; if(pattern) { g_object_get(pattern,"machine",&machine,"id",&c_pid,NULL); g_object_get(machine,"id",&c_mid,NULL); } else { machine=NULL; c_pid=NULL; c_mid=NULL; } GST_INFO("undo/redo: [%s]",data); // parse data and apply action switch (bt_change_logger_match_method(change_logger_methods, data, &match_info)) { case METHOD_SET_GLOBAL_EVENTS: { gchar *str,*mid,*pid; mid=g_match_info_fetch(match_info,1); pid=g_match_info_fetch(match_info,2); s=g_match_info_fetch(match_info,3);s_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,4);e_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,5);param=atoi(s);g_free(s); str=g_match_info_fetch(match_info,6); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%u|%u|%u|%s]",mid,pid,s_row,e_row,param,str); lookup_machine_and_pattern(self,&machine,&pattern,mid,c_mid,pid,c_pid); res=bt_pattern_deserialize_column(pattern,s_row,e_row,param,str); g_free(str); g_free(mid); g_free(pid); if(res) { // move cursor for(group=0;grouppriv->number_of_groups;group++) { if(self->priv->param_groups[group].type==PGT_GLOBAL) break; } g_object_set(self->priv->pattern_table,"cursor-row",s_row,"cursor-group",group,"cursor-param",param,NULL); pattern_table_refresh(self); } break; } case METHOD_SET_VOICE_EVENTS: { guint voice; gchar *str,*mid,*pid; gulong global_params,voice_params,param_offset; mid=g_match_info_fetch(match_info,1); pid=g_match_info_fetch(match_info,2); s=g_match_info_fetch(match_info,3);s_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,4);e_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,5);voice=atoi(s);g_free(s); s=g_match_info_fetch(match_info,6);param=atoi(s);g_free(s); str=g_match_info_fetch(match_info,7); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%u|%u|%u|%u|%s]",mid,pid,s_row,e_row,voice,param,str); lookup_machine_and_pattern(self,&machine,&pattern,mid,c_mid,pid,c_pid); g_object_get(machine,"global-params",&global_params,"voice-params",&voice_params,NULL); param_offset=global_params+(voice*voice_params); res=bt_pattern_deserialize_column(pattern,s_row,e_row,param_offset+param,str); g_free(str); g_free(mid); g_free(pid); if(res) { // move cursor for(group=0;grouppriv->number_of_groups;group++) { if((self->priv->param_groups[group].type==PGT_VOICE) && (GPOINTER_TO_UINT(self->priv->param_groups[group].user_data)==voice)) break; } g_object_set(self->priv->pattern_table,"cursor-row",s_row,"cursor-group",group,"cursor-param",param,NULL); pattern_table_refresh(self); } break; } case METHOD_SET_WIRE_EVENTS: { gchar *str,*smid,*dmid,*pid; BtSong *song; BtSetup *setup; BtMachine *smachine; BtWire *wire; BtWirePattern *wire_pattern; smid=g_match_info_fetch(match_info,1); dmid=g_match_info_fetch(match_info,2); pid=g_match_info_fetch(match_info,3); s=g_match_info_fetch(match_info,4);s_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,5);e_row=atoi(s);g_free(s); s=g_match_info_fetch(match_info,6);param=atoi(s);g_free(s); str=g_match_info_fetch(match_info,7); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%s|%u|%u|%u|%s]",smid,dmid,pid,s_row,e_row,param,str); lookup_machine_and_pattern(self,&machine,&pattern,dmid,c_mid,pid,c_pid); g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); smachine=bt_setup_get_machine_by_id(setup,smid); wire=bt_setup_get_wire_by_machines(setup,smachine,machine); if(!(wire_pattern=bt_wire_get_pattern(wire,pattern))) { wire_pattern=bt_wire_pattern_new(song,wire,pattern); } res=bt_wire_pattern_deserialize_column(wire_pattern,s_row,e_row,param,str); //res=bt_wire_pattern_set_event(wire_pattern,row,param,str); g_free(str); g_free(smid); g_free(dmid); g_free(pid); g_object_unref(wire_pattern); g_object_unref(wire); g_object_unref(smachine); g_object_unref(setup); g_object_unref(song); if(res) { // move cursor for(group=0;grouppriv->number_of_groups;group++) { if((self->priv->param_groups[group].type==PGT_WIRE) && (self->priv->param_groups[group].user_data==wire_pattern)) break; } g_object_set(self->priv->pattern_table,"cursor-row",s_row,"cursor-group",group,"cursor-param",param,NULL); pattern_table_refresh(self); } break; } case METHOD_SET_PROPERTY: { gchar *mid,*pid,*key,*val; mid=g_match_info_fetch(match_info,1); pid=g_match_info_fetch(match_info,2); key=g_match_info_fetch(match_info,3); val=g_match_info_fetch(match_info,4); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%s|%s]",mid,pid,key,val); lookup_machine_and_pattern(self,&machine,&pattern,mid,c_mid,pid,c_pid); res=TRUE; if(!strcmp(key,"name")) { g_object_set(pattern,"name",val,NULL); } else if(!strcmp(key,"length")) { g_object_set(pattern,"length",atol(val),NULL); } else { GST_WARNING("unhandled property '%s'",key); res=FALSE; } g_free(mid); g_free(pid); g_free(key); g_free(val); break; } case METHOD_ADD_PATTERN: { gchar *mid,*pid,*pname; gulong length; BtSong *song; mid=g_match_info_fetch(match_info,1); pid=g_match_info_fetch(match_info,2); pname=g_match_info_fetch(match_info,3); s=g_match_info_fetch(match_info,4);length=atol(s);g_free(s); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s|%s|%lu]",mid,pid,pname,length); lookup_machine_and_pattern(self,&machine,NULL,mid,c_mid,NULL,NULL); g_object_get(self->priv->app,"song",&song,NULL); pattern=bt_pattern_new(song, pid, pname, length, machine); g_object_unref(song); res=TRUE; g_free(pname); g_free(mid); g_free(pid); context_menu_refresh(self,machine); break; } case METHOD_REM_PATTERN: { gchar *mid,*pid; mid=g_match_info_fetch(match_info,1); pid=g_match_info_fetch(match_info,2); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s]",mid,pid); lookup_machine_and_pattern(self,&machine,&pattern,mid,c_mid,pid,c_pid); bt_machine_remove_pattern(machine,pattern); res=TRUE; context_menu_refresh(self,machine); break; } case METHOD_SET_VOICES: { gchar *mid; gulong voices; mid=g_match_info_fetch(match_info,1); s=g_match_info_fetch(match_info,2);voices=atol(s);g_free(s); g_match_info_free(match_info); GST_DEBUG("-> [%s]",mid); lookup_machine_and_pattern(self,&machine,NULL,mid,c_mid,NULL,NULL); g_object_set(machine,"voices",voices,NULL); context_menu_refresh(self,machine); break; } default: GST_WARNING("unhandled undo/redo method: [%s]",data); } g_object_try_unref(machine); g_object_try_unref(pattern); g_free(c_mid);g_free(c_pid); GST_INFO("undo/redo: %s : [%s]",(res?"okay":"failed"),data); return res; } static void bt_main_page_patterns_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data) { BtChangeLoggerInterface * const iface = g_iface; iface->change = bt_main_page_patterns_change_logger_change; } //-- wrapper //-- class internals static gboolean bt_main_page_patterns_focus(GtkWidget *widget, GtkDirectionType direction) { BtMainPagePatterns *self = BT_MAIN_PAGE_PATTERNS(widget); GST_DEBUG("focusing default widget"); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->pattern_table)); // only set new text pattern_view_update_column_description(self,UPDATE_COLUMN_PUSH); return FALSE; } static void bt_main_page_patterns_dispose(GObject *object) { BtMainPagePatterns *self = BT_MAIN_PAGE_PATTERNS(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { BtSetup *setup; BtWavetable *wavetable; GST_DEBUG("disconnect handlers from song=%p, song->ref_ct=%d",song,G_OBJECT_REF_COUNT(song)); g_object_get(song,"setup",&setup,"wavetable",&wavetable,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_added,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_removed,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_wire_added,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_wire_added,NULL); g_signal_handlers_disconnect_matched(wavetable,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_wave_added_or_removed,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_sequence_tick,NULL); // release the references g_object_unref(wavetable); g_object_unref(setup); g_object_unref(song); } g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_changed,NULL); g_object_unref(self->priv->change_log); g_object_unref(self->priv->app); GST_DEBUG("unref pattern: %p,ref_ct=%d",self->priv->pattern,G_OBJECT_REF_COUNT(self->priv->pattern)); g_object_try_unref(self->priv->pattern); GST_DEBUG("unref machine: %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); g_object_try_unref(self->priv->machine); gtk_widget_destroy(GTK_WIDGET(self->priv->context_menu)); g_object_unref(self->priv->context_menu); g_object_try_unref(self->priv->accel_group); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_page_patterns_parent_class)->dispose(object); } static void bt_main_page_patterns_finalize(GObject *object) { BtMainPagePatterns *self = BT_MAIN_PAGE_PATTERNS(object); g_free(self->priv->column_keymode); pattern_table_clear(self); G_OBJECT_CLASS(bt_main_page_patterns_parent_class)->finalize(object); } static void bt_main_page_patterns_init(BtMainPagePatterns *self) { guint i; self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGE_PATTERNS, BtMainPagePatternsPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); //self->priv->cursor_column=0; //self->priv->cursor_row=0; self->priv->selection_start_column=-1; self->priv->selection_start_row=-1; self->priv->selection_end_column=-1; self->priv->selection_end_row=-1; self->priv->base_octave=DEFAULT_BASE_OCTAVE; for (i = 0; i < MAX_WAVETABLE_ITEMS + 2; i++) self->priv->wave_to_combopos[i] = self->priv->combopos_to_wave[i] = -1; // the undo/redo changelogger self->priv->change_log=bt_change_log_new(); bt_change_log_register(self->priv->change_log,BT_CHANGE_LOGGER(self)); } static void bt_main_page_patterns_class_init(BtMainPagePatternsClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS(klass); pattern_atom=gdk_atom_intern_static_string("application/buzztard::pattern"); g_type_class_add_private(klass,sizeof(BtMainPagePatternsPrivate)); gobject_class->dispose = bt_main_page_patterns_dispose; gobject_class->finalize = bt_main_page_patterns_finalize; gtkwidget_class->focus = bt_main_page_patterns_focus; } buzztard-0.6.0/src/ui/edit/change-log.h0000644042355400116100000000524211625722250014624 00000000000000/* $Id: change-log.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CHANGE_LOG_H #define BT_CHANGE_LOG_H #include #include #define BT_TYPE_CHANGE_LOG (bt_change_log_get_type ()) #define BT_CHANGE_LOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_CHANGE_LOG, BtChangeLog)) #define BT_CHANGE_LOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_CHANGE_LOG, BtChangeLogClass)) #define BT_IS_CHANGE_LOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_CHANGE_LOG)) #define BT_IS_CHANGE_LOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_CHANGE_LOG)) #define BT_CHANGE_LOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_CHANGE_LOG, BtChangeLogClass)) /* type macros */ typedef struct _BtChangeLog BtChangeLog; typedef struct _BtChangeLogClass BtChangeLogClass; typedef struct _BtChangeLogPrivate BtChangeLogPrivate; /** * BtChangeLog: * * Editor action journal. */ struct _BtChangeLog { GObject parent; /*< private >*/ BtChangeLogPrivate *priv; }; struct _BtChangeLogClass { GObjectClass parent; }; typedef struct _BtChangeLogFile BtChangeLogFile; struct _BtChangeLogFile { gchar *log_name; gchar *song_file_name; gchar *change_ts; time_t mtime; }; GType bt_change_log_get_type(void) G_GNUC_CONST; #include "change-logger.h" BtChangeLog *bt_change_log_new(void); gboolean bt_change_log_recover(BtChangeLog *self,const gchar *log_name); void bt_change_log_register(BtChangeLog *self,BtChangeLogger *logger); gboolean bt_change_log_is_active(BtChangeLog *self); void bt_change_log_add(BtChangeLog *self,BtChangeLogger *owner,gchar *undo_data,gchar *redo_data); void bt_change_log_undo(BtChangeLog *self); void bt_change_log_redo(BtChangeLog *self); void bt_change_log_start_group(BtChangeLog *self); void bt_change_log_end_group(BtChangeLog *self); #endif // BT_CHANGE_LOG_H buzztard-0.6.0/src/ui/edit/tools.h0000644042355400116100000000657711666757045014013 00000000000000/* $Id: tools.h 3745 2011-12-04 20:54:53Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_EDIT_TOOLS_H #define BT_EDIT_TOOLS_H #include /* pixmap/buf helpers */ extern void add_pixmap_directory(const gchar *directory); extern GtkWidget *gtk_image_new_from_filename(const gchar *filename); extern GdkPixbuf *gdk_pixbuf_new_from_filename(const gchar *filename); extern GdkPixbuf *gdk_pixbuf_new_from_theme(const gchar *name, gint size); /* gtk toolbar helper */ extern GtkToolbarStyle gtk_toolbar_get_style_from_string(const gchar *style_name); /* save focus grab */ extern void gtk_widget_grab_focus_savely(GtkWidget *widget); /* gtk clipboard helper */ extern GtkTargetEntry *gtk_target_table_make(GdkAtom format_atom,gint *n_targets); /* gtk help helper */ extern void gtk_show_uri_simple(GtkWidget *widget, const gchar *uri); /* gtk+ compatibillity */ #if !GTK_CHECK_VERSION(2,14,0) #define gtk_dialog_get_content_area(dialog) (dialog->vbox) #define gtk_dialog_get_action_area(dialog) (dialog->action_area) #define gtk_widget_get_window(widget) (widget->window) #define gtk_selection_data_get_data(sdata) (sdata->data); #define gtk_selection_data_get_target(sdata) (sdata->taget); #endif #if !GTK_CHECK_VERSION(2,18,0) #define gtk_widget_get_allocation(widget, alloc) memcpy(alloc,&(widget->allocation),sizeof(GtkAllocation)) #define gtk_widget_is_toplevel(widget) GTK_WIDGET_TOPLEVEL(widget) #define gtk_widget_set_has_window(widget, flag) \ if (!flag) GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW); \ else GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_WINDOW) #define gtk_widget_set_can_focus(widget, flag) \ if (flag) GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS); \ else GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS) #endif #if !GTK_CHECK_VERSION(2,20,0) #define gtk_widget_set_realized(widget, flag) \ if (flag) GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); \ else GTK_WIDGET_UNSET_FLAGS (widget, GTK_REALIZED) #define gtk_widget_get_realized(widget) \ ((GTK_WIDGET_FLAGS (widget) & GTK_REALIZED) != 0) #define gtk_widget_get_mapped(widget) \ ((GTK_WIDGET_FLAGS (widget) & GTK_MAPPED) != 0) #endif #if !GTK_CHECK_VERSION(2,24,0) #define GTK_COMBO_BOX_TEXT(w) GTK_COMBO_BOX(w) #define gtk_combo_box_text_new gtk_combo_box_new_text #define gtk_combo_box_text_append_text(w,t) gtk_combo_box_append_text((w),(t)) #define gtk_combo_box_text_get_active_text(w) gtk_combo_box_get_active_text(w) #endif /* debug helper */ #if USE_DEBUG gboolean bt_edit_ui_config(const gchar *str); #define BT_EDIT_UI_CONFIG(str) bt_edit_ui_config(str) #else #define BT_EDIT_UI_CONFIG(str) FALSE #endif #endif // BT_EDIT_TOOLS_H buzztard-0.6.0/src/ui/edit/panorama-popup.c0000644042355400116100000001571211667614515015567 00000000000000/* $Id: panorama-popup.c 3754 2011-12-07 07:44:11Z ensonic $ * * GNOME Volume Applet * Copyright (C) 2004 Ronald Bultje * 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpanoramapopup * @short_description: panorama popup widget * * Shows a popup window containing a horizontal slider */ /* @bug: http://bugzilla.gnome.org/show_bug.cgi?id=511470 * level of range widgets are draw always from left-to-right for some themes. * * @todo: use gtk_scale_add_mark() in gtk-2.16 instead of the ruler. */ #define BT_EDIT #define PANORAMA_POPUP_C #include "bt-edit.h" #include "ruler.h" //-- the class G_DEFINE_TYPE (BtPanoramaPopup, bt_panorama_popup, GTK_TYPE_WINDOW); //-- event handler static void cb_scale_changed(GtkRange *range, gpointer user_data) { GtkLabel *label=GTK_LABEL(user_data); gchar str[6]; g_sprintf(str,"%3d %%",(gint)(100.0*gtk_range_get_value(range))); gtk_label_set_text(label,str); } /* * hide popup when clicking outside */ static gboolean cb_dock_press(GtkWidget * widget, GdkEventButton * event, gpointer data) { BtPanoramaPopup *self = BT_PANORAMA_POPUP(data); //if(!gtk_widget_get_realized(self)) return FALSE; if (event->type == GDK_BUTTON_PRESS) { GdkEventButton *e; //GST_INFO("type=%4d, window=%p, send_event=%3d, time=%8d",event->type,event->window,event->send_event,event->time); //GST_INFO("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",event->x,event->y,event->axes,event->state); //GST_INFO("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",event->button,event->device,event->x_root,event->y_root); /* GtkWidget *parent=GTK_WIDGET(gtk_window_get_transient_for(GTK_WINDOW(self))); //GtkWidget *parent=gtk_widget_get_parent(GTK_WIDGET(self)); //gboolean retval; GST_INFO("FORWARD : popup=%p, widget=%p", self, widget); GST_INFO("FORWARD : parent=%p, parent->window=%p", parent, parent->window); */ bt_panorama_popup_hide(self); // forward event e = (GdkEventButton *) gdk_event_copy ((GdkEvent *) event); //GST_INFO("type=%4d, window=%p, send_event=%3d, time=%8d",e->type,e->window,e->send_event,e->time); //GST_INFO("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",e->x,e->y,e->axes,e->state); //GST_INFO("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",e->button,e->device,e->x_root,e->y_root); //e->window = widget->window; //e->window = parent->window; //e->type = GDK_BUTTON_PRESS; gtk_main_do_event ((GdkEvent *) e); //retval=gtk_widget_event (widget, (GdkEvent *) e); //retval=gtk_widget_event (parent, (GdkEvent *) e); //retval=gtk_widget_event (self->parent_widget, (GdkEvent *) e); //GST_INFO(" result =%d", retval); //g_signal_emit_by_name(self->parent_widget, "event", 0, &retval, e); //g_signal_emit_by_name(parent, "event", 0, &retval, e); //GST_INFO(" result =%d", retval); //e->window = event->window; gdk_event_free ((GdkEvent *) e); return TRUE; } return FALSE; } //-- helper methods //-- constructor methods /** * bt_panorama_popup_new: * @adj: the adjustment for the popup * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ GtkWidget * bt_panorama_popup_new(GtkAdjustment *adj) { GtkWidget *table, *scale, *frame,*ruler, *label; BtPanoramaPopup *self; self = g_object_new(BT_TYPE_PANORAMA_POPUP, "type", GTK_WINDOW_POPUP, NULL); frame = gtk_frame_new(NULL); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); table = gtk_table_new(2,2, FALSE); label=gtk_label_new(""); gtk_widget_set_size_request(label, 40, -1); gtk_table_attach_defaults(GTK_TABLE(table), label, 0,1, 0,2); scale=gtk_hscale_new(adj); self->scale=GTK_RANGE(scale); gtk_widget_set_size_request(scale, 200, -1); gtk_scale_set_draw_value(GTK_SCALE(scale), FALSE); gtk_range_set_inverted(self->scale, FALSE); g_signal_connect(self->scale, "value-changed", G_CALLBACK(cb_scale_changed), label); cb_scale_changed(self->scale,label); gtk_table_attach_defaults(GTK_TABLE(table), scale, 1,2, 1,2); // add ruler ruler=bt_ruler_new(GTK_ORIENTATION_HORIZONTAL,FALSE); /* we use -X instead of 0.0 because of: * http://bugzilla.gnome.org/show_bug.cgi?id=465041 * @todo: take slider knob size into account * gtk_widget_style_get(scale,"slider-length",slider_length,NULL); */ bt_ruler_set_range(BT_RULER(ruler),-120.0,120.0,000.0,30.0); gtk_widget_set_size_request(ruler,-1,30); gtk_table_attach_defaults(GTK_TABLE(table), ruler, 1,2, 0,1); gtk_container_add(GTK_CONTAINER(frame), table); gtk_container_add(GTK_CONTAINER(self), frame); gtk_widget_show_all(frame); g_signal_connect(self, "button-press-event", G_CALLBACK (cb_dock_press), self); return GTK_WIDGET(self); } //-- methods /** * bt_panorama_popup_show: * @self: the popup widget * * Show and activate the widget */ void bt_panorama_popup_show(BtPanoramaPopup *self) { GdkWindow *window; gtk_widget_show_all(GTK_WIDGET(self)); window = gtk_widget_get_window(GTK_WIDGET(self)); /* grab focus */ gtk_widget_grab_focus_savely(GTK_WIDGET(self)); gtk_grab_add(GTK_WIDGET(self)); gdk_pointer_grab(window, TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); gdk_keyboard_grab(window, TRUE, GDK_CURRENT_TIME); } /** * bt_panorama_popup_hide: * @self: the popup widget * * Hide and deactivate the widget */ void bt_panorama_popup_hide(BtPanoramaPopup *self) { /* ungrab focus */ gdk_keyboard_ungrab(GDK_CURRENT_TIME); gdk_pointer_ungrab(GDK_CURRENT_TIME); gtk_grab_remove(GTK_WIDGET(self)); gtk_widget_hide(GTK_WIDGET(self)); } //-- wrapper //-- class internals static void bt_panorama_popup_dispose(GObject *object) { BtPanoramaPopup *popup = BT_PANORAMA_POPUP(object); if (popup->timeout) { g_source_remove(popup->timeout); popup->timeout = 0; } G_OBJECT_CLASS(bt_panorama_popup_parent_class)->dispose (object); } static void bt_panorama_popup_class_init(BtPanoramaPopupClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); gobject_class->dispose = bt_panorama_popup_dispose; } static void bt_panorama_popup_init(BtPanoramaPopup *popup) { popup->timeout = 0; } buzztard-0.6.0/src/ui/edit/signal-analysis-dialog.h0000644042355400116100000000464011625722250017154 00000000000000/* $Id: signal-analysis-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SIGNAL_ANALYSIS_DIALOG_H #define BT_SIGNAL_ANALYSIS_DIALOG_H #include #include #define BT_TYPE_SIGNAL_ANALYSIS_DIALOG (bt_signal_analysis_dialog_get_type ()) #define BT_SIGNAL_ANALYSIS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SIGNAL_ANALYSIS_DIALOG, BtSignalAnalysisDialog)) #define BT_SIGNAL_ANALYSIS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SIGNAL_ANALYSIS_DIALOG, BtSignalAnalysisDialogClass)) #define BT_IS_SIGNAL_ANALYSIS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SIGNAL_ANALYSIS_DIALOG)) #define BT_IS_SIGNAL_ANALYSIS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SIGNAL_ANALYSIS_DIALOG)) #define BT_SIGNAL_ANALYSIS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SIGNAL_ANALYSIS_DIALOG, BtSignalAnalysisDialogClass)) /* type macros */ typedef struct _BtSignalAnalysisDialog BtSignalAnalysisDialog; typedef struct _BtSignalAnalysisDialogClass BtSignalAnalysisDialogClass; typedef struct _BtSignalAnalysisDialogPrivate BtSignalAnalysisDialogPrivate; /** * BtSignalAnalysisDialog: * * the root window for the editor application */ struct _BtSignalAnalysisDialog { GtkWindow parent; /*< private >*/ BtSignalAnalysisDialogPrivate *priv; }; struct _BtSignalAnalysisDialogClass { GtkWindowClass parent; }; GType bt_signal_analysis_dialog_get_type(void) G_GNUC_CONST; BtSignalAnalysisDialog *bt_signal_analysis_dialog_new(const GstBin *element); #endif // BT_SIGNAL_ANALYSIS_DIALOG_H buzztard-0.6.0/src/ui/edit/main-pages.h0000644042355400116100000000430211625722250014635 00000000000000/* $Id: main-pages.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGES_H #define BT_MAIN_PAGES_H #include #include #define BT_TYPE_MAIN_PAGES (bt_main_pages_get_type ()) #define BT_MAIN_PAGES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGES, BtMainPages)) #define BT_MAIN_PAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGES, BtMainPagesClass)) #define BT_IS_MAIN_PAGES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGES)) #define BT_IS_MAIN_PAGES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGES)) #define BT_MAIN_PAGES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGES, BtMainPagesClass)) /* type macros */ typedef struct _BtMainPages BtMainPages; typedef struct _BtMainPagesClass BtMainPagesClass; typedef struct _BtMainPagesPrivate BtMainPagesPrivate; /** * BtMainPages: * * the root window for the editor application */ struct _BtMainPages { GtkNotebook parent; /*< private >*/ BtMainPagesPrivate *priv; }; struct _BtMainPagesClass { GtkNotebookClass parent; }; enum { BT_MAIN_PAGES_MACHINES_PAGE=0, BT_MAIN_PAGES_PATTERNS_PAGE, BT_MAIN_PAGES_SEQUENCE_PAGE, BT_MAIN_PAGES_WAVES_PAGE, BT_MAIN_PAGES_INFO_PAGE }; GType bt_main_pages_get_type(void) G_GNUC_CONST; BtMainPages *bt_main_pages_new(void); #endif // BT_MAIN_PAGES_H buzztard-0.6.0/src/ui/edit/main-page-info.c0000644042355400116100000005311311666705670015416 00000000000000/* $Id: main-page-info.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpageinfo * @short_description: the editor main info page * @see_also: #BtSongInfo * * Provides an editor for the song meta data. */ /* @todo: * - use this tab as the first one? * - add choice for metre (in german -> takt): beats (beats = bars / tpb) * or at least show the resulting metre */ /* @todo: undo/redo * - for text_view we would need to connect to insert_at_corsor and delete_from_cursor * signals to track changes * - for text_enry the signals are inserted_text and deleted_text * - optionally we just store the complete before/after */ /* @todo: changing tpb, beats * - when changing tpb and beats the playback-speed of the current song is * affected, we might want to offer a tool to resample the patterns. * - it would probably be easier to have some buttons for * 1/4x 1/3x 1/2x 2x, 3x, 4x tick resolution * - when lowering the tick resolution, we need to handle loss of notes * when doing 1/4 we would merge 4 rows into one keeping the first note found */ #define BT_EDIT #define BT_MAIN_PAGE_INFO_C #include "bt-edit.h" struct _BtMainPageInfoPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the sequence we are showing */ BtSongInfo *song_info; /* name, genre, author of the song */ GtkEntry *name,*genre,*author; /* ro date stamps of the song */ GtkEntry *date_created,*date_changed; /* bpm,tpb,beats of the song */ GtkSpinButton *bpm,*tpb,*beats; /* freeform info about the song */ GtkTextView *info; }; //-- the class G_DEFINE_TYPE (BtMainPageInfo, bt_main_page_info, GTK_TYPE_VBOX); //-- event handler static void on_page_switched(GtkNotebook *notebook, GParamSpec *arg, gpointer user_data) { //BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); guint page_num; static gint prev_page_num=-1; g_object_get(notebook,"page",&page_num,NULL); if(page_num==BT_MAIN_PAGES_INFO_PAGE) { // only do this if the page really has changed if(prev_page_num != BT_MAIN_PAGES_INFO_PAGE) { GST_DEBUG("enter info page"); } } else { // only do this if the page was BT_MAIN_PAGES_INFO_PAGE if(prev_page_num == BT_MAIN_PAGES_INFO_PAGE) { GST_DEBUG("leave info page"); } } prev_page_num = page_num; } static void on_name_changed(GtkEditable *editable,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); GST_INFO("name changed : self=%p -> \"%s\"",self,gtk_entry_get_text(GTK_ENTRY(editable))); // update info fields g_object_set(self->priv->song_info,"name",g_strdup(gtk_entry_get_text(GTK_ENTRY(editable))),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_genre_changed(GtkEditable *editable,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); GST_INFO("genre changed : self=%p -> \"%s\"",self,gtk_entry_get_text(GTK_ENTRY(editable))); // update info fields g_object_set(self->priv->song_info,"genre",g_strdup(gtk_entry_get_text(GTK_ENTRY(editable))),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_author_changed(GtkEditable *editable,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); GST_INFO("author changed : self=%p -> \"%s\"",self,gtk_entry_get_text(GTK_ENTRY(editable))); // update info fields g_object_set(self->priv->song_info,"author",g_strdup(gtk_entry_get_text(GTK_ENTRY(editable))),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_bpm_changed(GtkSpinButton *spinbutton,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); GST_INFO("bpm changed : self=%p -> %d",self,gtk_spin_button_get_value_as_int(spinbutton)); // update info fields g_object_set(self->priv->song_info,"bpm",gtk_spin_button_get_value_as_int(spinbutton),NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_tpb_changed(GtkSpinButton *spinbutton,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); gulong tpb,beats,bars; GParamSpecULong *pspec; GObjectClass *song_info_class; GST_INFO("tpb changed : self=%p -> %d",self,gtk_spin_button_get_value_as_int(spinbutton)); song_info_class=g_type_class_ref(BT_TYPE_SONG_INFO); pspec=(GParamSpecULong *)g_object_class_find_property(song_info_class,"bars"); // update info fields g_object_get(self->priv->song_info,"bars",&bars,"tpb",&tpb,NULL); beats=bars/tpb; tpb=gtk_spin_button_get_value_as_int(spinbutton); bars=beats*tpb; bars=CLAMP(bars,pspec->minimum,pspec->maximum); tpb=bars/beats; gtk_spin_button_set_value(spinbutton,tpb); g_object_set(self->priv->song_info,"tpb",tpb,"bars",bars,NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_beats_changed(GtkSpinButton *spinbutton,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); gulong tpb,beats,bars; GParamSpecULong *pspec; GObjectClass *song_info_class; song_info_class=g_type_class_ref(BT_TYPE_SONG_INFO); pspec=(GParamSpecULong *)g_object_class_find_property(song_info_class,"bars"); GST_INFO("beats changed : self=%p -> %d",self,gtk_spin_button_get_value_as_int(spinbutton)); // update info fields g_object_get(self->priv->song_info,"tpb",&tpb,NULL); beats=gtk_spin_button_get_value_as_int(spinbutton); bars=beats*tpb; bars=CLAMP(bars,pspec->minimum,pspec->maximum); beats=bars/tpb; gtk_spin_button_set_value(spinbutton,beats); g_object_set(self->priv->song_info,"bars",bars,NULL); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_info_changed(GtkTextBuffer *textbuffer,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); gchar *str; GtkTextIter beg_iter,end_iter; GST_INFO("info changed : self=%p",self); // update info fields // get begin and end textiters :(, then get text gtk_text_buffer_get_iter_at_offset(textbuffer,&beg_iter,0); gtk_text_buffer_get_iter_at_offset(textbuffer,&end_iter,-1); str=gtk_text_buffer_get_text(textbuffer,&beg_iter,&end_iter,FALSE); g_object_set(self->priv->song_info,"info",str,NULL); g_free(str); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_name_notify(const BtSongInfo *song_info,GParamSpec *arg,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); gchar *name; g_object_get((gpointer)song_info,"name",&name,NULL); g_signal_handlers_block_matched(self->priv->name,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_name_changed,(gpointer)self); gtk_entry_set_text(self->priv->name,safe_string(name));g_free(name); g_signal_handlers_unblock_matched(self->priv->name,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_name_changed,(gpointer)self); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(user_data); BtSong *song; GtkTextBuffer *buffer; gchar *name,*genre,*author,*create_dts,*change_dts; gulong bpm,tpb,bars; gchar *info; GST_INFO("song has changed : app=%p, self=%p",app,self); g_object_try_unref(self->priv->song_info); // get song from app g_object_get(self->priv->app,"song",&song,NULL); if(!song) { self->priv->song_info=NULL; return; } GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); g_object_get(song,"song-info",&self->priv->song_info,NULL); // update info fields g_object_get(self->priv->song_info, "name",&name,"genre",&genre,"author",&author,"info",&info, "bpm",&bpm,"tpb",&tpb,"bars",&bars, "create-dts",&create_dts,"change-dts",&change_dts, NULL); g_signal_handlers_block_matched(self->priv->name,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_name_changed,(gpointer)self); gtk_entry_set_text(self->priv->name,safe_string(name));g_free(name); g_signal_handlers_unblock_matched(self->priv->name,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_name_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->genre,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_genre_changed,(gpointer)self); gtk_entry_set_text(self->priv->genre,safe_string(genre));g_free(genre); g_signal_handlers_unblock_matched(self->priv->genre,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_genre_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->author,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_author_changed,(gpointer)self); gtk_entry_set_text(self->priv->author,safe_string(author));g_free(author); g_signal_handlers_unblock_matched(self->priv->author,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_author_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->bpm,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_bpm_changed,(gpointer)self); gtk_spin_button_set_value(self->priv->bpm,(gdouble)bpm); g_signal_handlers_unblock_matched(self->priv->bpm,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_bpm_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->tpb,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_tpb_changed,(gpointer)self); gtk_spin_button_set_value(self->priv->tpb,(gdouble)tpb); g_signal_handlers_unblock_matched(self->priv->tpb,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_tpb_changed,(gpointer)self); g_signal_handlers_block_matched(self->priv->beats,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_beats_changed,(gpointer)self); gtk_spin_button_set_value(self->priv->beats,(gdouble)(bars/tpb)); g_signal_handlers_unblock_matched(self->priv->beats,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_beats_changed,(gpointer)self); /* the iso date is not nice for the user * struct tm tm; * char dts[255]; * * strptime(create_dts, "%FT%TZ", &tm); * strftime(dts, sizeof(buf), "%F %T", &tm); * * but the code below is simpler and works too :) */ create_dts[10]=' ';create_dts[19]='\0'; gtk_entry_set_text(self->priv->date_created,create_dts);g_free(create_dts); change_dts[10]=' ';change_dts[19]='\0'; gtk_entry_set_text(self->priv->date_changed,change_dts);g_free(change_dts); buffer=gtk_text_view_get_buffer(self->priv->info); g_signal_handlers_block_matched(buffer,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_info_changed,(gpointer)self); gtk_text_buffer_set_text(buffer,safe_string(info),-1);g_free(info); g_signal_handlers_unblock_matched(buffer,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_info_changed,(gpointer)self); g_signal_connect(self->priv->song_info, "notify::name", G_CALLBACK(on_name_notify), (gpointer)self); // release the references g_object_unref(song); GST_INFO("song has changed done"); } //-- helper methods static void bt_main_page_info_init_ui(const BtMainPageInfo *self,const BtMainPages *pages) { GtkWidget *label,*frame,*box; GtkWidget *table; GtkWidget *scrolledwindow; GtkAdjustment *spin_adjustment; GParamSpecULong *pspec,*pspec2; GObjectClass *song_info_class; gchar *str; gulong def,min,max; GST_DEBUG("!!!! self=%p",self); gtk_widget_set_name(GTK_WIDGET(self),"song information"); song_info_class=g_type_class_ref(BT_TYPE_SONG_INFO); // first row of vbox frame=gtk_frame_new(NULL); label=gtk_label_new(NULL); #ifndef USE_HILDON str=g_strdup_printf("%s",_("song meta data")); #else str=g_strdup_printf("%s",_("song meta data")); #endif gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_frame_set_label_widget(GTK_FRAME(frame),label); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_NONE); gtk_container_set_border_width(GTK_CONTAINER(frame),BOX_BORDER); gtk_widget_set_name(frame,"song meta data"); gtk_box_pack_start(GTK_BOX(self),frame,FALSE,TRUE,0); box=gtk_hbox_new(FALSE,BOX_BORDER); gtk_container_add(GTK_CONTAINER(frame),box); /* left side padding */ gtk_box_pack_start(GTK_BOX(box),gtk_label_new(" "),FALSE,TRUE,0); // first column table=gtk_table_new(/*rows=*/4,/*columns=*/2,/*homogenous=*/FALSE); gtk_box_pack_start(GTK_BOX(box),table,TRUE,TRUE,0); label=gtk_label_new(_("name")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); self->priv->name=GTK_ENTRY(gtk_entry_new()); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->name), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->name, "changed", G_CALLBACK(on_name_changed), (gpointer)self); label=gtk_label_new(_("genre")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); self->priv->genre=GTK_ENTRY(gtk_entry_new()); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->genre), 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->genre, "changed", G_CALLBACK(on_genre_changed), (gpointer)self); label=gtk_label_new(_("author")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); self->priv->author=GTK_ENTRY(gtk_entry_new()); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->author), 1, 2, 2, 3, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->author, "changed", G_CALLBACK(on_author_changed), (gpointer)self); label=gtk_label_new(_("created")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); self->priv->date_created=GTK_ENTRY(gtk_entry_new()); gtk_editable_set_editable(GTK_EDITABLE(self->priv->date_created),FALSE); gtk_widget_set_can_focus(GTK_WIDGET(self->priv->date_created),FALSE); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->date_created), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); // second column table=gtk_table_new(/*rows=*/4,/*columns=*/2,/*homogenous=*/FALSE); gtk_box_pack_start(GTK_BOX(box),table,TRUE,TRUE,0); label=gtk_label_new(_("beats per minute")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); pspec=(GParamSpecULong *)g_object_class_find_property(song_info_class,"bpm"); spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(pspec->default_value, pspec->minimum, pspec->maximum, 1.0, 5.0, 0.0)); self->priv->bpm=GTK_SPIN_BUTTON(gtk_spin_button_new(spin_adjustment,1.0,0)); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->bpm), 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->bpm, "value-changed", G_CALLBACK(on_bpm_changed), (gpointer)self); label=gtk_label_new(_("beats")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); pspec=(GParamSpecULong *)g_object_class_find_property(song_info_class,"tpb"); pspec2=(GParamSpecULong *)g_object_class_find_property(song_info_class,"bars"); def=pspec2->default_value/pspec->default_value; min=pspec2->minimum/pspec->maximum; max=pspec2->maximum/pspec->minimum; if(min<1) min=1; spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(def,min,max, 1.0, 4.0, 0.0)); self->priv->beats=GTK_SPIN_BUTTON(gtk_spin_button_new(spin_adjustment,1.0,0)); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->beats), 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->beats, "value-changed", G_CALLBACK(on_beats_changed), (gpointer)self); label=gtk_label_new(_("ticks per beat")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(pspec->default_value, pspec->minimum, pspec->maximum, 1.0, 4.0, 0.0)); self->priv->tpb=GTK_SPIN_BUTTON(gtk_spin_button_new(spin_adjustment,1.0,0)); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->tpb), 1, 2, 2, 3, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(self->priv->tpb, "value-changed", G_CALLBACK(on_tpb_changed), (gpointer)self); label=gtk_label_new(_("last saved")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); self->priv->date_changed=GTK_ENTRY(gtk_entry_new()); gtk_editable_set_editable(GTK_EDITABLE(self->priv->date_changed),FALSE); gtk_widget_set_can_focus(GTK_WIDGET(self->priv->date_changed),FALSE); gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(self->priv->date_changed), 1, 2, 3, 4, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); // @idea have another field with subticks (GstController parameter smoothing) // @idea show tick and subtick interval as time (s:ms) // spacer ? //gtk_table_attach(GTK_TABLE(table),gtk_label_new(" "), 0, 2, 4, 5, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); // second row of hbox frame=gtk_frame_new(NULL); label=gtk_label_new(NULL); #ifndef USE_HILDON str=g_strdup_printf("%s",_("free text info")); #else str=g_strdup_printf("%s",_("free text info")); #endif gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_frame_set_label_widget(GTK_FRAME(frame),label); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_NONE); gtk_container_set_border_width(GTK_CONTAINER(frame),BOX_BORDER); gtk_widget_set_name(frame,"free text info"); gtk_box_pack_start(GTK_BOX(self),frame,TRUE,TRUE,0); box=gtk_hbox_new(FALSE,BOX_BORDER); gtk_container_add(GTK_CONTAINER(frame),box); /* left side padding */ gtk_box_pack_start(GTK_BOX(box),gtk_label_new(" "),FALSE,TRUE,0); scrolledwindow=gtk_scrolled_window_new(NULL, NULL); gtk_widget_set_name(scrolledwindow,"scrolledwindow"); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),GTK_SHADOW_IN); gtk_container_add(GTK_CONTAINER(box),scrolledwindow); GST_DEBUG(" scrolled window: %p",scrolledwindow); self->priv->info=GTK_TEXT_VIEW(gtk_text_view_new()); gtk_widget_set_name(GTK_WIDGET(self->priv->info),"free text info"); /* none of these reduce the border we get on hildon gtk_container_set_border_width(GTK_CONTAINER(self->priv->info),0); gtk_text_view_set_border_window_size(self->priv->info,GTK_TEXT_WINDOW_LEFT,1); gtk_text_view_set_border_window_size(self->priv->info,GTK_TEXT_WINDOW_RIGHT,1); gtk_text_view_set_border_window_size(self->priv->info,GTK_TEXT_WINDOW_TOP,1); gtk_text_view_set_border_window_size(self->priv->info,GTK_TEXT_WINDOW_BOTTOM,1); */ GST_DEBUG(" text view: %p",self->priv->info); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(self->priv->info),GTK_WRAP_WORD); gtk_container_add(GTK_CONTAINER(scrolledwindow),GTK_WIDGET(self->priv->info)); g_signal_connect(gtk_text_view_get_buffer(self->priv->info), "changed", G_CALLBACK(on_info_changed), (gpointer)self); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); // listen to page changes g_signal_connect((gpointer)pages, "notify::page", G_CALLBACK(on_page_switched), (gpointer)self); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_page_info_new: * @pages: the page collection * * Create a new instance * * Returns: the new instance */ BtMainPageInfo *bt_main_page_info_new(const BtMainPages *pages) { BtMainPageInfo *self; self=BT_MAIN_PAGE_INFO(g_object_new(BT_TYPE_MAIN_PAGE_INFO,"spacing",6,NULL)); bt_main_page_info_init_ui(self,pages); return(self); } //-- methods //-- wrapper //-- class internals static gboolean bt_main_page_info_focus(GtkWidget *widget, GtkDirectionType direction) { BtMainPageInfo *self=BT_MAIN_PAGE_INFO(widget); GST_DEBUG("focusing default widget"); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->info)); return FALSE; } static void bt_main_page_info_dispose(GObject *object) { BtMainPageInfo *self = BT_MAIN_PAGE_INFO(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_changed,(gpointer)self); g_object_try_unref(self->priv->song_info); g_object_unref(self->priv->app); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_page_info_parent_class)->dispose(object); } static void bt_main_page_info_init(BtMainPageInfo *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGE_INFO, BtMainPageInfoPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_main_page_info_class_init(BtMainPageInfoClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainPageInfoPrivate)); gobject_class->dispose = bt_main_page_info_dispose; gtkwidget_class->focus = bt_main_page_info_focus; } buzztard-0.6.0/src/ui/edit/main-page-waves.h0000644042355400116100000000433411625722250015602 00000000000000/* $Id: main-page-waves.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGE_WAVES_H #define BT_MAIN_PAGE_WAVES_H #include #include #define BT_TYPE_MAIN_PAGE_WAVES (bt_main_page_waves_get_type ()) #define BT_MAIN_PAGE_WAVES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGE_WAVES, BtMainPageWaves)) #define BT_MAIN_PAGE_WAVES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGE_WAVES, BtMainPageWavesClass)) #define BT_IS_MAIN_PAGE_WAVES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGE_WAVES)) #define BT_IS_MAIN_PAGE_WAVES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGE_WAVES)) #define BT_MAIN_PAGE_WAVES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGE_WAVES, BtMainPageWavesClass)) /* type macros */ typedef struct _BtMainPageWaves BtMainPageWaves; typedef struct _BtMainPageWavesClass BtMainPageWavesClass; typedef struct _BtMainPageWavesPrivate BtMainPageWavesPrivate; /** * BtMainPageWaves: * * the pattern page for the editor application */ struct _BtMainPageWaves { GtkVBox parent; /*< private >*/ BtMainPageWavesPrivate *priv; }; struct _BtMainPageWavesClass { GtkVBoxClass parent; }; GType bt_main_page_waves_get_type(void) G_GNUC_CONST; #include "main-pages.h" BtMainPageWaves *bt_main_page_waves_new(const BtMainPages *pages); #endif // BT_MAIN_PAGE_WAVES_H buzztard-0.6.0/src/ui/edit/settings-page-audiodevices.h0000644042355400116100000000501611625722250020033 00000000000000/* $Id: settings-page-audiodevices.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PAGE_AUDIODEVICES_H #define BT_SETTINGS_PAGE_AUDIODEVICES_H #include #include #define BT_TYPE_SETTINGS_PAGE_AUDIODEVICES (bt_settings_page_audiodevices_get_type ()) #define BT_SETTINGS_PAGE_AUDIODEVICES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_PAGE_AUDIODEVICES, BtSettingsPageAudiodevices)) #define BT_SETTINGS_PAGE_AUDIODEVICES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_PAGE_AUDIODEVICES, BtSettingsPageAudiodevicesClass)) #define BT_IS_SETTINGS_PAGE_AUDIODEVICES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_PAGE_AUDIODEVICES)) #define BT_IS_SETTINGS_PAGE_AUDIODEVICES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_PAGE_AUDIODEVICES)) #define BT_SETTINGS_PAGE_AUDIODEVICES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_PAGE_AUDIODEVICES, BtSettingsPageAudiodevicesClass)) /* type macros */ typedef struct _BtSettingsPageAudiodevices BtSettingsPageAudiodevices; typedef struct _BtSettingsPageAudiodevicesClass BtSettingsPageAudiodevicesClass; typedef struct _BtSettingsPageAudiodevicesPrivate BtSettingsPageAudiodevicesPrivate; /** * BtSettingsPageAudiodevices: * * the root window for the editor application */ struct _BtSettingsPageAudiodevices { GtkTable parent; /*< private >*/ BtSettingsPageAudiodevicesPrivate *priv; }; struct _BtSettingsPageAudiodevicesClass { GtkTableClass parent; }; GType bt_settings_page_audiodevices_get_type(void) G_GNUC_CONST; BtSettingsPageAudiodevices *bt_settings_page_audiodevices_new(void); #endif // BT_SETTINGS_PAGE_AUDIODEVICES_H buzztard-0.6.0/src/ui/edit/panorama-popup.h0000644042355400116100000000446411576360376015600 00000000000000/* $Id: panorama-popup.h 3345 2011-04-28 20:12:09Z ensonic $ * * GNOME Volume Applet * Copyright (C) 2004 Ronald Bultje * 2006 Stefan Kost * * gtkvolumepopup.h: floating window containing volume widgets * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PANORAMA_POPUP_H #define BT_PANORAMA_POPUP_H #include #include #include G_BEGIN_DECLS #define BT_TYPE_PANORAMA_POPUP (bt_panorama_popup_get_type ()) #define BT_PANORAMA_POPUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PANORAMA_POPUP, BtPanoramaPopup)) #define BT_IS_PANORAMA_POPUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PANORAMA_POPUP)) #define BT_PANORAMA_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PANORAMA_POPUP, BtPanoramaPopupClass)) #define BT_IS_PANORAMA_POPUP_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PANORAMA_POPUP)) typedef struct _BtPanoramaPopup BtPanoramaPopup; typedef struct _BtPanoramaPopupClass BtPanoramaPopupClass; /** * BtPanoramaPopup: * * a volume popup widget */ struct _BtPanoramaPopup { GtkWindow parent; /* us */ GtkRange *scale; GtkButton *plus, *minus; /* timeout for buttons */ guint timeout; /* for +/- buttons */ gint direction; }; struct _BtPanoramaPopupClass { GtkWindowClass klass; }; GtkWidget *bt_panorama_popup_new(GtkAdjustment *adj); void bt_panorama_popup_show(BtPanoramaPopup *self); void bt_panorama_popup_hide(BtPanoramaPopup *self); GType bt_panorama_popup_get_type(void) G_GNUC_CONST; G_END_DECLS #endif // BT_PANORAMA_POPUP_H buzztard-0.6.0/src/ui/edit/machine-canvas-item.c0000644042355400116100000015646511667174033016450 00000000000000/* $Id: machine-canvas-item.c 3642 2011-09-16 12:31:35Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinecanvasitem * @short_description: class for the editor machine views machine canvas item * * The canvas object emits #BtMachineCanvasItem::position-changed signal after * it has been moved. */ /* @todo more graphics: * - use svg gfx (design/gui/svgcanvas.c ) * - need to have prerenderend images for current zoom level * - idealy have them in ui-resources, in order to have them shared * - currently there is a ::zoom property to update the font-size * its set in update_machines_zoom(), there we would need to regenerate * the pixmaps too * - state graphics * - have some gfx in the middle * mute: x over o * bypass: -/\- around o * solo: * ! over x * one filled o on top of 4 hollow o's * - use transparency for mute/bypass, solo would switch all other sources to * muted, can't differenciate mute from bypass on an fx * * @todo: add insert before/after to context menu (see wire-canvas item) * * @todo: play machines live (midi keyboard for playing notes and triggers) * - for source-machine context menu add * - one item "play with > [list of keyboard]" * - one more item to disconnect * - playing multiple machines with a split keyboard would be nice too * * @todo: "remove and relink" is difficult if there are non empty wire patterns * - those would need to be copied to new target machine(s) and we would need * to add more tracks for playing them. * - we could ask the user if that is what he wants: * - "don't remove" * - "drop wire patterns" * - "copy wire patterns" * * @todo: gray out "properties"/"preferences" items in context menu if resulting * dialog would be empty * - can't do that yet as it is code in the dialog that implements the logic * * @todo; make the properties dialog a readable gobject property * - then we can go over all of them from machine page and show/hide them */ #define BT_EDIT #define BT_MACHINE_CANVAS_ITEM_C #include "bt-edit.h" #define LOW_VUMETER_VAL -60.0 //-- signal ids enum { POSITION_CHANGED, START_CONNECT, LAST_SIGNAL }; //-- property ids enum { MACHINE_CANVAS_ITEM_MACHINES_PAGE=1, MACHINE_CANVAS_ITEM_MACHINE, MACHINE_CANVAS_ITEM_ZOOM, MACHINE_CANVAS_ITEM_PROPERTIES_DIALOG, MACHINE_CANVAS_ITEM_PREFERENCES_DIALOG, MACHINE_CANVAS_ITEM_ANALYSIS_DIALOG }; struct _BtMachineCanvasItemPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the machine page we are on */ G_POINTER_ALIAS(BtMainPageMachines *,main_page_machines); /* the underlying machine */ BtMachine *machine; GHashTable *properties; const gchar *help_uri; /* machine context_menu */ GtkMenu *context_menu; GtkWidget *menu_item_mute,*menu_item_solo,*menu_item_bypass; gulong id_mute,id_solo,id_bypass; /* the properties and preferences dialogs */ GtkWidget *properties_dialog; GtkWidget *preferences_dialog; /* the analysis dialog */ GtkWidget *analysis_dialog; /* the graphical components */ GnomeCanvasItem *label; GnomeCanvasItem *box; GnomeCanvasItem *output_meter, *input_meter; G_POINTER_ALIAS(GstElement *,output_level); G_POINTER_ALIAS(GstElement *,input_level); guint skip_input_level; guint skip_output_level; GstClock *clock; /* cursor for moving */ GdkCursor *drag_cursor; /* the zoomration in pixels/per unit */ gdouble zoom; /* interaction state */ gboolean dragging,moved/*,switching*/; gdouble offx,offy,dragx,dragy; /* playback state */ gboolean is_playing; /* lock for multithreaded access */ GMutex *lock; }; static guint signals[LAST_SIGNAL]={0,}; static GQuark bus_msg_level_quark=0; static GQuark machine_canvas_item_quark=0; //-- the class G_DEFINE_TYPE (BtMachineCanvasItem, bt_machine_canvas_item, GNOME_TYPE_CANVAS_GROUP); //-- prototypes static void on_machine_properties_dialog_destroy(GtkWidget *widget, gpointer user_data); static void on_machine_preferences_dialog_destroy(GtkWidget *widget, gpointer user_data); static void on_signal_analysis_dialog_destroy(GtkWidget *widget, gpointer user_data); //-- helper methods static void desaturate_pixbuf(GdkPixbuf *pixbuf) { guint x,y,w,h,rowstride,gray; guchar *p; g_assert(gdk_pixbuf_get_colorspace(pixbuf)==GDK_COLORSPACE_RGB); g_assert(gdk_pixbuf_get_bits_per_sample(pixbuf)==8); g_assert(gdk_pixbuf_get_has_alpha(pixbuf)); g_assert(gdk_pixbuf_get_n_channels(pixbuf)==4); w=gdk_pixbuf_get_width(pixbuf); h=gdk_pixbuf_get_height(pixbuf); rowstride=gdk_pixbuf_get_rowstride(pixbuf)-(w*4); p=gdk_pixbuf_get_pixels(pixbuf); for(y=0;y>2); p[1]=(guchar)(((guint)p[1]+gray)>>2); p[2]=(guchar)(((guint)p[2]+gray)>>2); p+=4; } p+=rowstride; } } static void alpha_pixbuf(GdkPixbuf *pixbuf) { guint x,y,w,h,rowstride; guchar *p; g_assert(gdk_pixbuf_get_colorspace(pixbuf)==GDK_COLORSPACE_RGB); g_assert(gdk_pixbuf_get_bits_per_sample(pixbuf)==8); g_assert(gdk_pixbuf_get_has_alpha(pixbuf)); g_assert(gdk_pixbuf_get_n_channels(pixbuf)==4); w=gdk_pixbuf_get_width(pixbuf); h=gdk_pixbuf_get_height(pixbuf); rowstride=gdk_pixbuf_get_rowstride(pixbuf)-(w*4); p=gdk_pixbuf_get_pixels(pixbuf); for(y=0;y>=1; p+=4; } p+=rowstride; } } static void update_machine_graphics(BtMachineCanvasItem *self) { GdkPixbuf *pixbuf; gboolean has_parent; pixbuf=bt_ui_resources_get_machine_graphics_pixbuf_by_machine(self->priv->machine,self->priv->zoom); has_parent=(GST_OBJECT_PARENT(self->priv->machine)!=NULL); if(!has_parent || self->priv->dragging) { GdkPixbuf *tmp=gdk_pixbuf_copy(pixbuf); g_object_unref(pixbuf); pixbuf=tmp; } if(!has_parent) { desaturate_pixbuf(pixbuf); } if(self->priv->dragging) { alpha_pixbuf(pixbuf); } gnome_canvas_item_set(self->priv->box, "width",(gdouble)gdk_pixbuf_get_width(pixbuf), "height",(gdouble)gdk_pixbuf_get_height(pixbuf), /* this would make the icons blurred "width-set",TRUE, "height-set",TRUE, */ "pixbuf",pixbuf, NULL); g_object_unref(pixbuf); } static void show_machine_properties_dialog(BtMachineCanvasItem *self) { if(!self->priv->properties_dialog) { self->priv->properties_dialog=GTK_WIDGET(bt_machine_properties_dialog_new(self->priv->machine)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->properties_dialog)); GST_INFO("machine properties dialog opened"); // remember open/closed state g_hash_table_insert(self->priv->properties,g_strdup("properties-shown"),g_strdup("1")); g_signal_connect(self->priv->properties_dialog,"destroy",G_CALLBACK(on_machine_properties_dialog_destroy),(gpointer)self); g_object_notify((GObject *)self,"properties-dialog"); } gtk_window_present(GTK_WINDOW(self->priv->properties_dialog)); } static void show_machine_preferences_dialog(BtMachineCanvasItem *self) { if(!self->priv->preferences_dialog) { self->priv->preferences_dialog=GTK_WIDGET(bt_machine_preferences_dialog_new(self->priv->machine)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->preferences_dialog)); g_signal_connect(self->priv->preferences_dialog,"destroy",G_CALLBACK(on_machine_preferences_dialog_destroy),(gpointer)self); g_object_notify((GObject *)self,"preferences-dialog"); } gtk_window_present(GTK_WINDOW(self->priv->preferences_dialog)); } static void show_machine_analyzer_dialog(BtMachineCanvasItem *self) { if(!self->priv->analysis_dialog) { self->priv->analysis_dialog=GTK_WIDGET(bt_signal_analysis_dialog_new(GST_BIN(self->priv->machine))); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->analysis_dialog)); GST_INFO("analyzer dialog opened"); // remember open/closed state g_hash_table_insert(self->priv->properties,g_strdup("analyzer-shown"),g_strdup("1")); g_signal_connect(self->priv->analysis_dialog,"destroy",G_CALLBACK(on_signal_analysis_dialog_destroy),(gpointer)self); g_object_notify((GObject *)self,"analysis-dialog"); } gtk_window_present(GTK_WINDOW(self->priv->analysis_dialog)); } //-- event handler static void on_signal_analysis_dialog_destroy(GtkWidget *widget, gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("signal analysis dialog destroy occurred"); self->priv->analysis_dialog=NULL; g_object_notify((GObject *)self,"analysis-dialog"); // remember open/closed state g_hash_table_remove(self->priv->properties,"analyzer-shown"); } static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); g_object_get((gpointer)song,"is-playing",&self->priv->is_playing,NULL); if(!self->priv->is_playing) { const gdouble h=MACHINE_VIEW_MACHINE_SIZE_Y; self->priv->skip_output_level=FALSE; gnome_canvas_item_set(self->priv->output_meter, "y1", h*0.6, NULL); self->priv->skip_input_level=FALSE; gnome_canvas_item_set(self->priv->input_meter, "y1", h*0.6, NULL); } } typedef struct { BtMachineCanvasItem *self; GnomeCanvasItem *meter; gdouble peak; } BtUpdateIdleData; #define MAKE_UPDATE_IDLE_DATA(data,self,meter,peak) G_STMT_START { \ data=g_slice_new(BtUpdateIdleData); \ data->self=self; \ data->meter=meter; \ data->peak=peak; \ g_mutex_lock(self->priv->lock); \ g_object_add_weak_pointer((GObject *)self,(gpointer *)(&data->self)); \ g_mutex_unlock(self->priv->lock); \ } G_STMT_END #define FREE_UPDATE_IDLE_DATA(data) G_STMT_START { \ if(data->self) { \ g_mutex_lock(data->self->priv->lock); \ g_object_remove_weak_pointer((gpointer)data->self,(gpointer *)(&data->self)); \ g_mutex_unlock(data->self->priv->lock); \ } \ g_slice_free(BtUpdateIdleData,data); \ } G_STMT_END static gboolean on_delayed_idle_machine_level_change(gpointer user_data) { BtUpdateIdleData *data=(BtUpdateIdleData *)user_data; BtMachineCanvasItem *self=data->self; if(self && self->priv->is_playing) { const gdouble h=MACHINE_VIEW_MACHINE_SIZE_Y; gnome_canvas_item_set(data->meter, "y1", h*0.05+(0.55*h*data->peak), NULL); } FREE_UPDATE_IDLE_DATA(data); return(FALSE); } static gboolean on_delayed_machine_level_change(GstClock *clock,GstClockTime time,GstClockID id,gpointer user_data) { // the callback is called from a clock thread if(GST_CLOCK_TIME_IS_VALID(time)) g_idle_add(on_delayed_idle_machine_level_change,user_data); else { BtUpdateIdleData *data=(BtUpdateIdleData *)user_data; FREE_UPDATE_IDLE_DATA(data); } return(TRUE); } static void on_machine_level_change(GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); if(name_id==bus_msg_level_quark) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GstElement *level=GST_ELEMENT(GST_MESSAGE_SRC(message)); // check if its our level-meter if((level==self->priv->output_level) || (level==self->priv->input_level)) { GstClockTime timestamp, duration; GstClockTime waittime=GST_CLOCK_TIME_NONE; if(gst_structure_get_clock_time (structure, "running-time", ×tamp) && gst_structure_get_clock_time (structure, "duration", &duration)) { /* wait for middle of buffer */ waittime=timestamp+duration/2; } else if(gst_structure_get_clock_time (structure, "endtime", ×tamp)) { /* level send endtime as stream_time and not as running_time */ waittime=gst_segment_to_running_time(&GST_BASE_TRANSFORM(level)->segment, GST_FORMAT_TIME, timestamp); } if(GST_CLOCK_TIME_IS_VALID(waittime)) { GnomeCanvasItem *meter=NULL; const GValue *l_peak; gdouble peak=0.0; guint i,size; gint new_skip=FALSE,old_skip=FALSE; // check the value and calculate the average for the channels l_peak=(GValue *)gst_structure_get_value(structure, "peak"); size=gst_value_list_get_size(l_peak); for(i=0;i0.0) { new_skip=2; // beyond max level peak=0.0; } else peak=peak/LOW_VUMETER_VAL; // check if we a silent if(peak>=1.0) { new_skip=1; // below min level peak=1.0; } // skip *updates* if we are still below LOW_VUMETER_VAL or beyond 0.0 if(level==self->priv->output_level) { meter=self->priv->output_meter; old_skip=self->priv->skip_output_level; self->priv->skip_output_level=new_skip; } else if(level==self->priv->input_level) { meter=self->priv->input_meter; old_skip=self->priv->skip_input_level; self->priv->skip_input_level=new_skip; } if(!old_skip || !new_skip || old_skip!=new_skip) { BtUpdateIdleData *data; GstClockTime basetime=gst_element_get_base_time(level); GstClockID clock_id; MAKE_UPDATE_IDLE_DATA(data,self,meter,peak); clock_id=gst_clock_new_single_shot_id(self->priv->clock,waittime+basetime); if(gst_clock_id_wait_async(clock_id,on_delayed_machine_level_change,(gpointer)data)!=GST_CLOCK_OK) { FREE_UPDATE_IDLE_DATA(data); } gst_clock_id_unref(clock_id); } // just for counting //else GST_WARNING_OBJECT(level,"skipping level update"); } } } } static void on_machine_id_changed(BtMachine *machine, GParamSpec *arg, gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); if(self->priv->label) { gchar *id; g_object_get(self->priv->machine,"id",&id,NULL); gnome_canvas_item_set(self->priv->label,"text",id,NULL); g_free(id); } } static void on_machine_parent_changed(GstObject *object, GstObject *parent, gpointer user_data) { update_machine_graphics(BT_MACHINE_CANVAS_ITEM(user_data)); } static void on_machine_state_changed(BtMachine *machine, GParamSpec *arg, gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); BtMachineState state; g_object_get(machine,"state",&state,NULL); GST_INFO(" new state is %d",state); update_machine_graphics(self); switch(state) { case BT_MACHINE_STATE_NORMAL: if(self->priv->menu_item_mute && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute))) { g_signal_handler_block(self->priv->menu_item_mute,self->priv->id_mute); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute),FALSE); g_signal_handler_unblock(self->priv->menu_item_mute,self->priv->id_mute); } if(self->priv->menu_item_solo && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo))) { g_signal_handler_block(self->priv->menu_item_solo,self->priv->id_solo); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo),FALSE); g_signal_handler_unblock(self->priv->menu_item_solo,self->priv->id_solo); } if(self->priv->menu_item_bypass && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass))) { g_signal_handler_block(self->priv->menu_item_bypass,self->priv->id_bypass); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass),FALSE); g_signal_handler_unblock(self->priv->menu_item_bypass,self->priv->id_bypass); } break; case BT_MACHINE_STATE_MUTE: if(self->priv->menu_item_mute && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute))) { g_signal_handler_block(self->priv->menu_item_mute,self->priv->id_mute); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute),TRUE); g_signal_handler_unblock(self->priv->menu_item_mute,self->priv->id_mute); } if(self->priv->menu_item_solo && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo))) { g_signal_handler_block(self->priv->menu_item_solo,self->priv->id_solo); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo),FALSE); g_signal_handler_unblock(self->priv->menu_item_solo,self->priv->id_solo); } if(self->priv->menu_item_bypass && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass))) { g_signal_handler_block(self->priv->menu_item_bypass,self->priv->id_bypass); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass),FALSE); g_signal_handler_unblock(self->priv->menu_item_bypass,self->priv->id_bypass); } break; case BT_MACHINE_STATE_SOLO: if(self->priv->menu_item_mute && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute))) { g_signal_handler_block(self->priv->menu_item_mute,self->priv->id_mute); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute),FALSE); g_signal_handler_unblock(self->priv->menu_item_mute,self->priv->id_mute); } if(self->priv->menu_item_solo && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo))) { g_signal_handler_block(self->priv->menu_item_solo,self->priv->id_solo); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo),TRUE); g_signal_handler_unblock(self->priv->menu_item_solo,self->priv->id_solo); } if(self->priv->menu_item_bypass && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass))) { g_signal_handler_block(self->priv->menu_item_bypass,self->priv->id_bypass); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass),FALSE); g_signal_handler_unblock(self->priv->menu_item_bypass,self->priv->id_bypass); } break; case BT_MACHINE_STATE_BYPASS: if(self->priv->menu_item_mute && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute))) { g_signal_handler_block(self->priv->menu_item_mute,self->priv->id_mute); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_mute),FALSE); g_signal_handler_unblock(self->priv->menu_item_mute,self->priv->id_mute); } if(self->priv->menu_item_solo && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo))) { g_signal_handler_block(self->priv->menu_item_solo,self->priv->id_solo); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_solo),FALSE); g_signal_handler_unblock(self->priv->menu_item_solo,self->priv->id_solo); } if(self->priv->menu_item_bypass && !gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass))) { g_signal_handler_block(self->priv->menu_item_bypass,self->priv->id_bypass); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(self->priv->menu_item_bypass),TRUE); g_signal_handler_unblock(self->priv->menu_item_bypass,self->priv->id_bypass); } break; default: GST_WARNING("invalid machine state: %d",state); break; } } static void on_machine_properties_dialog_destroy(GtkWidget *widget, gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("machine properties dialog destroy occurred"); self->priv->properties_dialog=NULL; g_object_notify((GObject *)self,"properties-dialog"); // remember open/closed state g_hash_table_remove(self->priv->properties,"properties-shown"); } static void on_machine_preferences_dialog_destroy(GtkWidget *widget, gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("machine preferences dialog destroy occurred"); self->priv->preferences_dialog=NULL; g_object_notify((GObject *)self,"preferences-dialog"); } static void on_context_menu_mute_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("context_menu mute toggled"); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_MUTE,NULL); } else { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } bt_edit_application_set_song_unsaved(self->priv->app); } static void on_context_menu_solo_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("context_menu solo toggled"); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_SOLO,NULL); } else { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } bt_edit_application_set_song_unsaved(self->priv->app); } static void on_context_menu_bypass_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("context_menu bypass toggled"); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_BYPASS,NULL); } else { g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } bt_edit_application_set_song_unsaved(self->priv->app); } static void on_context_menu_properties_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); show_machine_properties_dialog(self); } static void on_context_menu_preferences_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); show_machine_preferences_dialog(self); } static void on_context_menu_rename_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("context_menu rename event occurred"); bt_main_page_machines_rename_machine(self->priv->main_page_machines, self->priv->machine); } static void on_context_menu_delete_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); GST_INFO("context_menu delete event occurred for machine : %p",self->priv->machine); bt_main_page_machines_delete_machine(self->priv->main_page_machines, self->priv->machine); } static void on_context_menu_connect_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); g_signal_emit(self,signals[START_CONNECT],0); } static void on_context_menu_analysis_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); show_machine_analyzer_dialog(self); } static void on_context_menu_help_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); // show help for machine gtk_show_uri_simple(GTK_WIDGET(self->priv->main_page_machines),self->priv->help_uri); } static void on_context_menu_about_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(user_data); BtMainWindow *main_window; // show info about machine g_object_get(self->priv->app,"main-window",&main_window,NULL); bt_machine_action_about(self->priv->machine,main_window); g_object_unref(main_window); } //-- helper methods #if 0 static gboolean bt_machine_canvas_item_is_over_state_switch(const BtMachineCanvasItem *self,GdkEvent *event) { GnomeCanvas *canvas; GnomeCanvasItem *ci,*pci; gboolean res=FALSE; g_object_get(self->priv->main_page_machines,"canvas",&canvas,NULL); if((ci=gnome_canvas_get_item_at(canvas,event->button.x,event->button.y))) { g_object_get(ci,"parent",&pci,NULL); //GST_DEBUG("ci=%p : self=%p, self->box=%p, self->state_switch=%p",ci,self,self->priv->box,self->priv->state_switch); if((ci==self->priv->state_switch) || (ci==self->priv->state_mute) || (pci==self->priv->state_mute) || (ci==self->priv->state_solo) || (ci==self->priv->state_bypass) || (pci==self->priv->state_bypass)) { res=TRUE; } g_object_unref(pci); } g_object_unref(canvas); return(res); } #endif static gboolean bt_machine_canvas_item_init_context_menu(const BtMachineCanvasItem *self) { GtkWidget *menu_item,*label; BtMachine *machine=self->priv->machine; BtMachineState state; g_object_get(machine,"state",&state,NULL); self->priv->menu_item_mute=menu_item=gtk_check_menu_item_new_with_label(_("Mute")); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),(state==BT_MACHINE_STATE_MUTE)); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); self->priv->id_mute=g_signal_connect(menu_item,"toggled",G_CALLBACK(on_context_menu_mute_toggled),(gpointer)self); if(BT_IS_SOURCE_MACHINE(self->priv->machine)) { self->priv->menu_item_solo=menu_item=gtk_check_menu_item_new_with_label(_("Solo")); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),(state==BT_MACHINE_STATE_SOLO)); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); self->priv->id_solo=g_signal_connect(menu_item,"toggled",G_CALLBACK(on_context_menu_solo_toggled),(gpointer)self); } if(BT_IS_PROCESSOR_MACHINE(self->priv->machine)) { self->priv->menu_item_bypass=menu_item=gtk_check_menu_item_new_with_label(_("Bypass")); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_item),(state==BT_MACHINE_STATE_BYPASS)); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); self->priv->id_bypass=g_signal_connect(menu_item,"toggled",G_CALLBACK(on_context_menu_bypass_toggled),(gpointer)self); } menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_PROPERTIES,NULL); // dynamic part gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); // make this menu item bold (default) label=gtk_bin_get_child(GTK_BIN(menu_item)); if(GTK_IS_LABEL(label)) { gchar *str=g_strconcat("",gtk_label_get_label(GTK_LABEL(label)),"",NULL); if(gtk_label_get_use_underline(GTK_LABEL(label))) { gtk_label_set_markup_with_mnemonic(GTK_LABEL(label),str); } else { gtk_label_set_markup(GTK_LABEL(label),str); } g_free(str); } else { GST_WARNING("expecting a GtkLabel as a first child"); } gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_properties_activate),(gpointer)self); menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES,NULL); // static part gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_preferences_activate),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_menu_item_new_with_label(_("Rename...")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_rename_activate),(gpointer)self); if(!BT_IS_SINK_MACHINE(self->priv->machine)) { menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_delete_activate),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_menu_item_new_with_label(_("Connect machines")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_connect_activate),(gpointer)self); } else { menu_item=gtk_menu_item_new_with_label(_("Signal Analysis...")); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_analysis_activate),(gpointer)self); } menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_HELP,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); if(!self->priv->help_uri) { gtk_widget_set_sensitive(menu_item,FALSE); } else { g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_help_activate),(gpointer)self); } gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT,NULL); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_about_activate),(gpointer)self); return(TRUE); } //-- constructor methods /** * bt_machine_canvas_item_new: * @main_page_machines: the machine page the new item belongs to * @machine: the machine for which a canvas item should be created * @xpos: the horizontal location * @ypos: the vertical location * @zoom: the zoom ratio * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtMachineCanvasItem *bt_machine_canvas_item_new(const BtMainPageMachines *main_page_machines,BtMachine *machine,gdouble xpos,gdouble ypos,gdouble zoom) { BtMachineCanvasItem *self; GnomeCanvas *canvas; g_object_get((gpointer)main_page_machines,"canvas",&canvas,NULL); self=BT_MACHINE_CANVAS_ITEM(gnome_canvas_item_new(gnome_canvas_root(canvas), BT_TYPE_MACHINE_CANVAS_ITEM, "machines-page",main_page_machines, "machine", machine, "x", xpos, "y", ypos, "zoom", zoom, NULL)); //GST_INFO("machine canvas item added, ref-ct=%d",G_OBJECT_REF_COUNT(self)); g_object_unref(canvas); return(self); } //-- methods /** * bt_machine_show_properties_dialog: * @machine: machine to show the dialog for * * Shows the machine properties dialog. * * Since: 0.6 */ void bt_machine_show_properties_dialog(BtMachine *machine) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(g_object_get_qdata((GObject *)machine,machine_canvas_item_quark)); show_machine_properties_dialog(self); } /** * bt_machine_show_preferences_dialog: * @machine: machine to show the dialog for * * Shows the machine preferences dialog. * * Since: 0.6 */ void bt_machine_show_preferences_dialog(BtMachine *machine) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(g_object_get_qdata((GObject *)machine,machine_canvas_item_quark)); show_machine_preferences_dialog(self); } /** * bt_machine_show_analyzer_dialog: * @machine: machine to show the dialog for * * Shows the machine signal analysis dialog. * * Since: 0.6 */ void bt_machine_show_analyzer_dialog(BtMachine *machine) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(g_object_get_qdata((GObject *)machine,machine_canvas_item_quark)); show_machine_analyzer_dialog(self); } //-- wrapper //-- class internals static void bt_machine_canvas_item_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMachineCanvasItem *self = BT_MACHINE_CANVAS_ITEM(object); return_if_disposed(); switch (property_id) { case MACHINE_CANVAS_ITEM_MACHINES_PAGE: { g_value_set_object(value, self->priv->main_page_machines); } break; case MACHINE_CANVAS_ITEM_MACHINE: { GST_INFO("getting machine : %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); g_value_set_object(value, self->priv->machine); //GST_INFO("... : %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); } break; case MACHINE_CANVAS_ITEM_ZOOM: { g_value_set_double(value, self->priv->zoom); } break; case MACHINE_CANVAS_ITEM_PROPERTIES_DIALOG: { g_value_set_object(value, self->priv->properties_dialog); } break; case MACHINE_CANVAS_ITEM_PREFERENCES_DIALOG: { g_value_set_object(value, self->priv->preferences_dialog); } break; case MACHINE_CANVAS_ITEM_ANALYSIS_DIALOG: { g_value_set_object(value, self->priv->analysis_dialog); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_canvas_item_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachineCanvasItem *self = BT_MACHINE_CANVAS_ITEM(object); return_if_disposed(); switch (property_id) { case MACHINE_CANVAS_ITEM_MACHINES_PAGE: { g_object_try_weak_unref(self->priv->main_page_machines); self->priv->main_page_machines = BT_MAIN_PAGE_MACHINES(g_value_get_object(value)); g_object_try_weak_ref(self->priv->main_page_machines); //GST_DEBUG("set the main_page_machines for machine_canvas_item: %p",self->priv->main_page_machines); } break; case MACHINE_CANVAS_ITEM_MACHINE: { g_object_try_unref(self->priv->machine); self->priv->machine = BT_MACHINE(g_value_dup_object(value)); if(self->priv->machine) { BtSong *song; GstElement *element; GstBin *bin; GstBus *bus; GST_INFO("set the machine %p,machine->ref_ct=%d for new canvas item",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); g_object_set_qdata((GObject *)self->priv->machine,machine_canvas_item_quark,(gpointer)self); g_object_get(self->priv->machine,"properties",&self->priv->properties,"machine",&element,NULL); #if GST_CHECK_VERSION(0,10,31) self->priv->help_uri=gst_element_factory_get_documentation_uri(gst_element_get_factory(element)); #else if(GSTBT_IS_HELP(element)) g_object_get(element,"documentation-uri",&self->priv->help_uri,NULL); else self->priv->help_uri=NULL; #endif gst_object_unref(element); //GST_DEBUG("set the machine for machine_canvas_item: %p, properties: %p",self->priv->machine,self->priv->properties); bt_machine_canvas_item_init_context_menu(self); g_signal_connect(self->priv->machine, "notify::state", G_CALLBACK(on_machine_state_changed), (gpointer)self); g_signal_connect(self->priv->machine, "notify::id", G_CALLBACK(on_machine_id_changed), (gpointer)self); g_signal_connect(self->priv->machine, "parent-set", G_CALLBACK(on_machine_parent_changed), (gpointer)self); g_signal_connect(self->priv->machine, "parent-unset", G_CALLBACK(on_machine_parent_changed), (gpointer)self); g_object_get(self->priv->app,"song",&song,NULL); g_signal_connect(song,"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),(gpointer)self); g_object_get(song,"bin", &bin,NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::element", G_CALLBACK(on_machine_level_change), (gpointer)self); gst_object_unref(bus); self->priv->clock=gst_pipeline_get_clock (GST_PIPELINE(bin)); gst_object_unref(bin); g_object_unref(song); if(!BT_IS_SINK_MACHINE(self->priv->machine)) { if(bt_machine_enable_output_post_level(self->priv->machine)) { g_object_get(self->priv->machine,"output-post-level",&self->priv->output_level,NULL); g_object_try_weak_ref(self->priv->output_level); gst_object_unref(self->priv->output_level); } else { GST_INFO("enabling output level for machine failed"); } } if(!BT_IS_SOURCE_MACHINE(self->priv->machine)) { if(bt_machine_enable_input_pre_level(self->priv->machine)) { g_object_get(self->priv->machine,"input-pre-level",&self->priv->input_level,NULL); g_object_try_weak_ref(self->priv->input_level); gst_object_unref(self->priv->input_level); } else { GST_INFO("enabling input level for machine failed"); } } } } break; case MACHINE_CANVAS_ITEM_ZOOM: { self->priv->zoom=g_value_get_double(value); GST_DEBUG("set the zoom for machine_canvas_item: %f",self->priv->zoom); if(self->priv->label) { gnome_canvas_item_set(self->priv->label,"size-points",MACHINE_VIEW_FONT_SIZE*self->priv->zoom,NULL); } /* reload the svg icons, we do this to keep them sharp */ if(self->priv->box) { update_machine_graphics(self); } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_canvas_item_dispose(GObject *object) { BtMachineCanvasItem *self = BT_MACHINE_CANVAS_ITEM(object); BtSong *song; GstBin *bin; GstBus *bus; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); GST_DEBUG("machine: %p,ref_ct %d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); g_signal_handlers_disconnect_matched(self->priv->machine,G_SIGNAL_MATCH_DATA,0,0,NULL,NULL,(gpointer)self); g_object_get(self->priv->app,"song",&song,"bin",&bin,NULL); if(song) { g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_is_playing_notify,NULL); g_object_unref(song); } bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_handlers_disconnect_matched(bus, G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_level_change,NULL); gst_object_unref(bus); gst_object_unref(bin); GST_DEBUG(" signal disconected"); g_object_try_weak_unref(self->priv->output_level); g_object_try_weak_unref(self->priv->input_level); g_object_try_unref(self->priv->machine); g_object_try_weak_unref(self->priv->main_page_machines); if(self->priv->clock) gst_object_unref(self->priv->clock); g_object_unref(self->priv->app); GST_DEBUG(" unrefing done"); if(self->priv->properties_dialog) { gtk_widget_destroy(self->priv->properties_dialog); } if(self->priv->preferences_dialog) { gtk_widget_destroy(self->priv->preferences_dialog); } GST_DEBUG(" destroying dialogs done"); gdk_cursor_unref(self->priv->drag_cursor); gtk_widget_destroy(GTK_WIDGET(self->priv->context_menu)); g_object_try_unref(self->priv->context_menu); GST_DEBUG(" destroying done, machine: %p,ref_ct %d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_machine_canvas_item_parent_class)->dispose(object); GST_DEBUG(" done"); } static void bt_machine_canvas_item_finalize(GObject *object) { BtMachineCanvasItem *self = BT_MACHINE_CANVAS_ITEM(object); GST_DEBUG("!!!! self=%p",self); g_mutex_free(self->priv->lock); G_OBJECT_CLASS(bt_machine_canvas_item_parent_class)->finalize(object); GST_DEBUG(" done"); } /* * bt_machine_canvas_item_realize: * * draw something that looks a bit like a buzz-machine */ static void bt_machine_canvas_item_realize(GnomeCanvasItem *citem) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(citem); gdouble w=MACHINE_VIEW_MACHINE_SIZE_X,h=MACHINE_VIEW_MACHINE_SIZE_Y; gdouble fh=MACHINE_VIEW_FONT_SIZE; gchar *id,*prop; GNOME_CANVAS_ITEM_CLASS(bt_machine_canvas_item_parent_class)->realize(citem); //GST_DEBUG("realize for machine occurred, machine=%p",self->priv->machine); g_object_get(self->priv->machine,"id",&id,NULL); // add machine components // the body self->priv->box=gnome_canvas_item_new (GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_PIXBUF, "anchor", GTK_ANCHOR_CENTER, "x",0.0, "y",-(w-h), "width-in-pixels",TRUE, "height-in-pixels",TRUE, NULL); update_machine_graphics(self); // the name label self->priv->label=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_TEXT, /* can we use the x-anchor to position left ? */ /*"x-offset",-(w*0.1),*/ "x", 0.0, "y", -(h*0.65)+fh, "justification", GTK_JUSTIFY_LEFT, /* test if this ensures equal sizes among systems, * maybe we should leave it blank */ "font", "sans", /* "helvetica" */ "size-points", fh*self->priv->zoom, "size-set", TRUE, "text", id, "fill-color", "black", "clip", TRUE, "clip-width",(w+w)*0.70, "clip-height",h+h, NULL); // the input volume level meter guint32 border_color=0x6666667F; //if(!BT_IS_SOURCE_MACHINE(self->priv->machine)) { self->priv->input_meter=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_RECT, "x1", -w*0.65, //"y1", +h*0.05, "y1", +h*0.6, "x2", -w*0.55, "y2", +h*0.6, "fill-color", "gray40", "outline_color-rgba", border_color, "width-pixels", 2, NULL); //} // the output volume level meter //if(!BT_IS_SINK_MACHINE(self->priv->machine)) { self->priv->output_meter=gnome_canvas_item_new(GNOME_CANVAS_GROUP(citem), GNOME_TYPE_CANVAS_RECT, "x1", w*0.6, //"y1", +h*0.05, "y1", +h*0.6, "x2", w*0.7, "y2", +h*0.6, "fill-color", "gray40", "outline_color-rgba", border_color, "width-pixels", 2, NULL); //} g_free(id); prop=(gchar *)g_hash_table_lookup(self->priv->properties,"properties-shown"); if(prop && prop[0]=='1' && prop[1]=='\0') { self->priv->properties_dialog=GTK_WIDGET(bt_machine_properties_dialog_new(self->priv->machine)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->properties_dialog)); g_signal_connect(self->priv->properties_dialog,"destroy",G_CALLBACK(on_machine_properties_dialog_destroy),(gpointer)self); } prop=(gchar *)g_hash_table_lookup(self->priv->properties,"analyzer-shown"); if(prop && prop[0]=='1' && prop[1]=='\0') { if((self->priv->analysis_dialog=GTK_WIDGET(bt_signal_analysis_dialog_new(GST_BIN(self->priv->machine))))) { bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->analysis_dialog)); g_signal_connect(self->priv->analysis_dialog,"destroy",G_CALLBACK(on_signal_analysis_dialog_destroy),(gpointer)self); } } //item->realized = TRUE; } static gboolean bt_machine_canvas_item_event(GnomeCanvasItem *citem, GdkEvent *event) { BtMachineCanvasItem *self=BT_MACHINE_CANVAS_ITEM(citem); gboolean res=FALSE; gdouble dx, dy, px, py; gchar str[G_ASCII_DTOSTR_BUF_SIZE]; //GST_INFO("event for machine occurred"); switch (event->type) { case GDK_2BUTTON_PRESS: GST_DEBUG("GDK_2BUTTON_RELEASE: %d, 0x%x",event->button.button,event->button.state); show_machine_properties_dialog(self); res=TRUE; break; case GDK_BUTTON_PRESS: GST_DEBUG("GDK_BUTTON_PRESS: %d, 0x%x",event->button.button,event->button.state); if((event->button.button==1) && !(event->button.state&GDK_SHIFT_MASK)) { #if 0 if(!bt_machine_canvas_item_is_over_state_switch(self,event)) { #endif // dragx/y coords are world coords of button press self->priv->dragx=event->button.x; self->priv->dragy=event->button.y; // set some flags self->priv->dragging=TRUE; self->priv->moved=FALSE; #if 0 } else { self->priv->switching=TRUE; } #endif res=TRUE; } else if(event->button.button==3) { // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } break; case GDK_MOTION_NOTIFY: //GST_DEBUG("GDK_MOTION_NOTIFY: %f,%f",event->button.x,event->button.y); if(self->priv->dragging) { if(!self->priv->moved) { update_machine_graphics(self); gnome_canvas_item_raise_to_top(citem); gnome_canvas_item_grab(citem, GDK_POINTER_MOTION_MASK | /* GDK_ENTER_NOTIFY_MASK | */ /* GDK_LEAVE_NOTIFY_MASK | */ GDK_BUTTON_RELEASE_MASK, self->priv->drag_cursor, event->button.time); } dx=event->button.x-self->priv->dragx; dy=event->button.y-self->priv->dragy; gnome_canvas_item_move(citem, dx, dy); g_signal_emit(citem,signals[POSITION_CHANGED],0); self->priv->dragx=event->button.x; self->priv->dragy=event->button.y; self->priv->moved=TRUE; res=TRUE; } break; case GDK_BUTTON_RELEASE: GST_DEBUG("GDK_BUTTON_RELEASE: %d",event->button.button); if(self->priv->dragging) { self->priv->dragging=FALSE; if(self->priv->moved) { // change position properties of the machines g_object_get(citem,"x",&px,"y",&py,NULL); px/=MACHINE_VIEW_ZOOM_X; py/=MACHINE_VIEW_ZOOM_Y; g_hash_table_insert(self->priv->properties,g_strdup("xpos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,px))); g_hash_table_insert(self->priv->properties,g_strdup("ypos"),g_strdup(g_ascii_dtostr(str,G_ASCII_DTOSTR_BUF_SIZE,py))); g_signal_emit(citem,signals[POSITION_CHANGED],0); gnome_canvas_item_ungrab(citem,event->button.time); update_machine_graphics(self); } res=TRUE; } else #if 0 if(self->priv->switching) { self->priv->switching=FALSE; // still over mode switch if(bt_machine_canvas_item_is_over_state_switch(self,event)) { guint modifier=(gulong)event->button.state>k_accelerator_get_default_mod_mask(); //gulong modifier=(gulong)event->button.state&(GDK_CONTROL_MASK|GDK_MOD4_MASK); GST_DEBUG(" mode quad state switch, key_modifier is: 0x%x + mask: 0x%x -> 0x%x",event->button.state,(GDK_CONTROL_MASK|GDK_MOD4_MASK),modifier); switch(modifier) { case 0: g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_NORMAL,NULL); break; case GDK_CONTROL_MASK: g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_MUTE,NULL); break; case GDK_MOD4_MASK: g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_SOLO,NULL); break; case GDK_CONTROL_MASK|GDK_MOD4_MASK: g_object_set(self->priv->machine,"state",BT_MACHINE_STATE_BYPASS,NULL); break; } } } #endif break; case GDK_KEY_RELEASE: GST_DEBUG("GDK_KEY_RELEASE: %d",event->key.keyval); switch(event->key.keyval) { case GDK_Menu: // show context menu gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; break; default: break; } break; default: break; } /* we don't want the click falling through to the parent canvas item, if we have handled it */ //if(res) g_signal_stop_emission_by_name(citem->canvas,"event-after"); if(!res) { if(GNOME_CANVAS_ITEM_CLASS(bt_machine_canvas_item_parent_class)->event) { res=GNOME_CANVAS_ITEM_CLASS(bt_machine_canvas_item_parent_class)->event(citem,event); } } //GST_INFO("event for machine occurred : %d",res); return res; } static void bt_machine_canvas_item_init(BtMachineCanvasItem *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_CANVAS_ITEM, BtMachineCanvasItemPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); // generate the context menu self->priv->context_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); // the menu-items are generated in bt_machine_canvas_item_init_context_menu() // the cursor for dragging self->priv->drag_cursor=gdk_cursor_new(GDK_FLEUR); self->priv->zoom=1.0; self->priv->lock=g_mutex_new (); } static void bt_machine_canvas_item_class_init(BtMachineCanvasItemClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GnomeCanvasItemClass *citem_class=GNOME_CANVAS_ITEM_CLASS(klass); bus_msg_level_quark=g_quark_from_static_string("level"); machine_canvas_item_quark=g_quark_from_static_string("machine-canvas-item"); g_type_class_add_private(klass,sizeof(BtMachineCanvasItemPrivate)); gobject_class->set_property = bt_machine_canvas_item_set_property; gobject_class->get_property = bt_machine_canvas_item_get_property; gobject_class->dispose = bt_machine_canvas_item_dispose; gobject_class->finalize = bt_machine_canvas_item_finalize; citem_class->realize = bt_machine_canvas_item_realize; citem_class->event = bt_machine_canvas_item_event; /** * BtMachineCanvasItem::position-changed * @self: the machine-canvas-item object that emitted the signal * * Signals that item has been moved around. The new position can be read from * the canvas item. */ signals[POSITION_CHANGED] = g_signal_new("position-changed", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, // return type 0 // n_params ); /** * BtMachineCanvasItem::start-connect * @self: the machine-canvas-item object that emitted the signal * * Signals that a connect should be made starting from this machine. */ signals[START_CONNECT] = g_signal_new("start-connect", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL, // accumulator NULL, // acc data g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, // return type 0 // n_params ); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_MACHINES_PAGE, g_param_spec_object("machines-page", "machines-page contruct prop", "Set application object, the window belongs to", BT_TYPE_MAIN_PAGE_MACHINES, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_MACHINE, g_param_spec_object("machine", "machine contruct prop", "Set machine object, the item belongs to", BT_TYPE_MACHINE, /* object type */ #ifndef GNOME_CANVAS_BROKEN_PROPERTIES G_PARAM_CONSTRUCT_ONLY | #endif G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_ZOOM, g_param_spec_double("zoom", "zoom prop", "Set zoom ratio for the machine item", 0.0, 100.0, 1.0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_PROPERTIES_DIALOG, g_param_spec_object("properties-dialog", "properties dialog prop", "Get the the properties dialog if shown", BT_TYPE_MACHINE_PROPERTIES_DIALOG, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_PREFERENCES_DIALOG, g_param_spec_object("preferences-dialog", "preferences dialog prop", "Get the the preferences dialog if shown", BT_TYPE_MACHINE_PREFERENCES_DIALOG, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_CANVAS_ITEM_ANALYSIS_DIALOG, g_param_spec_object("analysis-dialog", "analysis dialog prop", "Get the the analysis dialog if shown", BT_TYPE_SIGNAL_ANALYSIS_DIALOG, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/missing-song-elements-dialog.h0000644042355400116100000000512511625722250020304 00000000000000/* $Id: missing-song-elements-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MISSING_SONG_ELEMENTS_DIALOG_H #define BT_MISSING_SONG_ELEMENTS_DIALOG_H #include #include #define BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG (bt_missing_song_elements_dialog_get_type ()) #define BT_MISSING_SONG_ELEMENTS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG, BtMissingSongElementsDialog)) #define BT_MISSING_SONG_ELEMENTS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG, BtMissingSongElementsDialogClass)) #define BT_IS_MISSING_SONG_ELEMENTS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG)) #define BT_IS_MISSING_SONG_ELEMENTS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG)) #define BT_MISSING_SONG_ELEMENTS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MISSING_SONG_ELEMENTS_DIALOG, BtMissingSongElementsDialogClass)) /* type macros */ typedef struct _BtMissingSongElementsDialog BtMissingSongElementsDialog; typedef struct _BtMissingSongElementsDialogClass BtMissingSongElementsDialogClass; typedef struct _BtMissingSongElementsDialogPrivate BtMissingSongElementsDialogPrivate; /** * BtMissingSongElementsDialog: * * the root window for the editor application */ struct _BtMissingSongElementsDialog { GtkDialog parent; /*< private >*/ BtMissingSongElementsDialogPrivate *priv; }; struct _BtMissingSongElementsDialogClass { GtkDialogClass parent; }; GType bt_missing_song_elements_dialog_get_type(void) G_GNUC_CONST; BtMissingSongElementsDialog *bt_missing_song_elements_dialog_new(GList *machines,GList *waves); #endif // BT_MISSING_SONG_ELEMENTS_DIALOG_H buzztard-0.6.0/src/ui/edit/tip-dialog.c0000644042355400116100000002235711666464237014667 00000000000000/* $Id: tip-dialog.c 3734 2011-12-02 23:24:23Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:bttipdialog * @short_description: class for the editor tip-of-the-day dialog * * Show a tip, that has not yet been shown to the user. */ /* Algorithm: - max_tips = G_N_ELEMENTS(tips) - fill gint pending_tips[max_tips] with 0...(max_tips-1) - read presented-tips from settings - parse and set pending_tips[i]=-1; (only if ipriv->n_pending_tips) { // reset shown tips self->priv->n_pending_tips=G_N_ELEMENTS(tips); for(i=0;ipriv->tip_status[i]=i; self->priv->pending_tips[i]=i; } } // get a tip index we haven't shown yet ix=self->priv->pending_tips[g_random_int_range(0,self->priv->n_pending_tips)]; GST_DEBUG("show [%d]",ix); self->priv->tip_status[ix]=-1; for(i=j=0;ipriv->tip_status[i]>-1) self->priv->pending_tips[j++]=i; } self->priv->n_pending_tips=j; gtk_text_buffer_set_text(gtk_text_view_get_buffer(self->priv->tip_view),tips[ix],-1); } static void on_show_tips_toggled(GtkToggleButton *togglebutton, gpointer user_data) { BtTipDialog *self = BT_TIP_DIALOG(user_data); g_object_set(self->priv->settings,"show-tips",gtk_toggle_button_get_active(togglebutton),NULL); } //-- helper methods static void bt_tip_dialog_init_ui(const BtTipDialog *self) { GtkWidget *label,*icon,*hbox,*vbox,*btn,*chk,*tip_view; gboolean show_tips; gchar *str; gint i,j; GST_DEBUG("read settings"); g_object_get(self->priv->app,"settings",&self->priv->settings,NULL); g_object_get(self->priv->settings,"show-tips",&show_tips,"presented-tips",&str,NULL); GST_DEBUG("read [%s]",str); // parse str to update tip status for(i=0;ipriv->tip_status[i]=i; } if(str) { gint ix; gchar *p1,*p2; p1=str; p2=strchr(p1,','); while(p2) { *p2='\0'; ix=atoi(p1); if(ixpriv->tip_status[ix]=-1; p1=&p2[1]; p2=strchr(p1,','); } ix=atoi(p1); if(ixpriv->tip_status[ix]=-1; g_free(str); } for(i=j=0;ipriv->tip_status[i]>-1) self->priv->pending_tips[j++]=i; } self->priv->n_pending_tips=j; GST_DEBUG("prepare tips dialog"); gtk_widget_set_name(GTK_WIDGET(self),"Tip of the day"); gtk_window_set_title(GTK_WINDOW(self),_("Tip of the day")); // add dialog commision widgets (okay) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // content area hbox=gtk_hbox_new(FALSE,12); icon=gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_DIALOG); gtk_box_pack_start(GTK_BOX(hbox),icon,FALSE,FALSE,0); vbox=gtk_vbox_new(FALSE,6); str=g_strdup_printf("%s\n",_("Tip of the day")); label=g_object_new(GTK_TYPE_LABEL,"use-markup",TRUE,"label",str,NULL); g_free(str); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); self->priv->tip_view=GTK_TEXT_VIEW(gtk_text_view_new()); gtk_text_view_set_cursor_visible(self->priv->tip_view, FALSE); gtk_text_view_set_editable(self->priv->tip_view, FALSE); gtk_text_view_set_wrap_mode(self->priv->tip_view, GTK_WRAP_WORD); tip_view = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(tip_view), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(tip_view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(tip_view),GTK_WIDGET(self->priv->tip_view)); gtk_box_pack_start(GTK_BOX(vbox),tip_view,TRUE,TRUE,0); chk=gtk_check_button_new_with_label(_("Show tips on startup")); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(chk),show_tips); g_signal_connect(chk, "toggled", G_CALLBACK (on_show_tips_toggled), (gpointer)self); gtk_box_pack_start(GTK_BOX(vbox),chk,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),vbox,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(self))),hbox,TRUE,TRUE,0); // add "refresh" button to action area btn=gtk_button_new_from_stock(GTK_STOCK_REFRESH); g_signal_connect(btn, "clicked", G_CALLBACK(on_refresh_clicked), (gpointer)self); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(self))),btn,FALSE,FALSE,0); on_refresh_clicked(GTK_BUTTON(btn),(gpointer)self); } //-- constructor methods /** * bt_tip_dialog_new: * * Create a new instance * * Returns: the new instance */ BtTipDialog *bt_tip_dialog_new(void) { BtTipDialog *self; self=BT_TIP_DIALOG(g_object_new(BT_TYPE_TIP_DIALOG,NULL)); bt_tip_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_tip_dialog_dispose(GObject *object) { BtTipDialog *self = BT_TIP_DIALOG(object); gchar *str; gint i,j,shown; return_if_disposed(); self->priv->dispose_has_run = TRUE; // update tip-status in settings shown=G_N_ELEMENTS(tips)-self->priv->n_pending_tips; str=g_malloc(6*shown); for(i=j=0;ipriv->tip_status[i]==-1) { j+=g_sprintf(&str[j],"%d,",i); } } if(j) { str[j-1]='\0'; } GST_DEBUG("write [%s]",str); g_object_set(self->priv->settings,"presented-tips",str,NULL); g_free(str); GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); g_object_unref(self->priv->settings); G_OBJECT_CLASS(bt_tip_dialog_parent_class)->dispose(object); } static void bt_tip_dialog_init(BtTipDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_TIP_DIALOG, BtTipDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_tip_dialog_class_init(BtTipDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtTipDialogPrivate)); gobject_class->dispose = bt_tip_dialog_dispose; } buzztard-0.6.0/src/ui/edit/pattern-editor.c0000644042355400116100000014323511667733512015572 00000000000000/* $Id: pattern-editor.c 3755 2011-12-07 18:58:17Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpatterneditor * @short_description: the pattern editor widget * @see_also: #BtPattern, #BtMainPagePatterns * * Provides an editor widget for #BtPattern instances. */ /* @todo: * - block operations * o copy * o paste * o cut * o clear * o expand * o shrink * - mouse handling (selections) * bt_pattern_editor_button_press/release * - shift + cursor selection does not really work with the buzz keybindings * - if we want separator bars for headers, look at gtkhseparator.c * - drawing * - having some 1 pixel padding left/right of groups would look better * the group gap is one whole character anyway * * @idea: use gtk_widget_error_bell (widget); when hitting borders with cursor */ /* for more performance, we need to render to memory surfaces and blit them when * scolling * rendering to memory surfaces: * blitting: * todo: * - we need to update the memory surfaces when layout or data changes * - do we want to handle the cursor like data changes? */ #define BT_EDIT #include "bt-edit.h" enum { PATTERN_EDITOR_PLAY_POSITION=1, PATTERN_EDITOR_OCTAVE, PATTERN_EDITOR_CURSOR_GROUP, PATTERN_EDITOR_CURSOR_PARAM, PATTERN_EDITOR_CURSOR_ROW }; //-- the class G_DEFINE_TYPE (BtPatternEditor, bt_pattern_editor, GTK_TYPE_WIDGET); struct ParamType { gint chars, columns; gchar *(*to_string_func)(gchar *dest, gfloat value, gint def); guint column_pos[4]; }; //-- helper methods static gchar * to_string_note (gchar *buf, gfloat value, gint def) { static gchar note_names[] = "C-C#D-D#E-F-F#G-G#A-A#B-????????"; gint note = ((gint)value)&255, octave; if (note == def || note == 0) return("..."); if (note == 255) return("off"); note--; octave = note >> 4; buf[0] = note_names[2 * (note & 15)]; buf[1] = note_names[1 + 2 * (note & 15)]; buf[2] = '0' + octave; buf[3] = '\0'; return(buf); } static gchar * to_string_trigger (gchar *buf, gfloat value, gint def) { gint v = (gint)value; if (v == def) return("."); sprintf(buf, "%01X", v != 0 ? 1 : 0); return(buf); } static gchar * to_string_byte (gchar *buf, gfloat value, gint def) { gint v = (gint)(value+0.5); if (v == def) return(".."); sprintf(buf, "%02X", v & 255); return(buf); } static gchar * to_string_word (gchar *buf, gfloat value, gint def) { gint v = (gint)(value+0.5); if (v == def) return("...."); sprintf(buf, "%04X", v & 65535); return(buf); } static gchar * to_string_float (gchar *buf, gfloat value, gint def) { gint v = (gint)value; if (fabs(v - def) < 0.00001) return("........"); sprintf(buf, "%-8f", value); return(buf); } static struct ParamType param_types[] = { { 3, 2, to_string_note, {0, 2}}, { 1, 1, to_string_trigger, {0}}, { 2, 2, to_string_byte, {0, 1}}, { 4, 4, to_string_word, {0, 1, 2, 3}}, { 8, 1, to_string_float, {0}}, }; static gint inline bt_pattern_editor_rownum_width (BtPatternEditor *self) { return self->cw * 5; } static void bt_pattern_editor_draw_rownum (BtPatternEditor *self, cairo_t *cr, gint x, gint y, gint row, gint max_y) { PangoLayout *pl = self->pl; gchar buf[16]; gint ch = self->ch, cw = self->cw; gint colw = bt_pattern_editor_rownum_width(self) - cw; while (y < max_y && row < self->num_rows) { gdouble *bg_shade_color=self->bg_shade_color[row&0x1]; cairo_set_source_rgb(cr,bg_shade_color[0],bg_shade_color[1],bg_shade_color[2]); cairo_rectangle(cr,x,y,colw,ch); cairo_fill(cr); cairo_set_source_rgb(cr,self->text_color[0],self->text_color[1],self->text_color[2]); sprintf(buf, "%04X", row); cairo_move_to(cr,x,y); pango_layout_set_text(pl, buf, 4); pango_cairo_show_layout(cr,pl); y += ch; row++; } } static void bt_pattern_editor_draw_colnames (BtPatternEditor *self, cairo_t *cr, gint x, gint y, gint w) { PangoLayout *pl = self->pl; gint g; gint ch = self->ch, cw = self->cw; cairo_set_source_rgb(cr,self->bg_color[0],self->bg_color[1],self->bg_color[2]); cairo_rectangle(cr,x,0,w-x,ch); cairo_fill(cr); cairo_set_source_rgb(cr,self->text_color[0],self->text_color[1],self->text_color[2]); for (g = 0; g < self->num_groups; g++) { BtPatternEditorColumnGroup *cgrp = &self->groups[g]; gint max_chars=((cgrp->width/cw)-1); max_chars=MIN(strlen(cgrp->name),max_chars); cairo_move_to(cr,x,y); pango_layout_set_text(pl,cgrp->name,max_chars); pango_cairo_show_layout(cr,pl); x+=cgrp->width; } } static void bt_pattern_editor_draw_rowname (BtPatternEditor *self, cairo_t *cr, gint x, gint y) { PangoLayout *pl = self->pl; gint ch = self->ch; gint colw = bt_pattern_editor_rownum_width(self); cairo_set_source_rgb(cr,self->bg_color[0],self->bg_color[1],self->bg_color[2]); cairo_rectangle(cr,0,0,colw,ch); cairo_fill(cr); if (self->num_groups) { cairo_set_source_rgb(cr,self->text_color[0],self->text_color[1],self->text_color[2]); cairo_move_to(cr,x,y); pango_layout_set_text(pl, "Tick", 4); pango_cairo_show_layout(cr,pl); } } static gboolean inline in_selection_column (BtPatternEditor *self, guint group, guint param) { // check columns if (self->selection_mode == PESM_COLUMN) return (group == self->selection_group) && (param == self->selection_param); if (self->selection_mode == PESM_GROUP) return (group == self->selection_group); return TRUE; /* PESM_ALL */ } static gboolean inline in_selection_row (BtPatternEditor *self, guint row) { // check rows if (row < self->selection_start) return FALSE; if (row > self->selection_end) return FALSE; return TRUE; } /* * bt_pattern_editor_draw_column: * @x,@y: the top left corner for the column * @col,@group,@param: column data, group and param to draw * @row: the starting row * @max_y: max-y for clipping */ static void bt_pattern_editor_draw_column (BtPatternEditor *self, cairo_t *cr, gint x, gint y, BtPatternEditorColumn *col, guint group, guint param, guint row, gint max_y) { PangoLayout *pl = self->pl; struct ParamType *pt = ¶m_types[col->type]; gchar buf[16], *str; gint cw = self->cw, ch = self->ch; gint col_w = cw * (pt->chars + 1); gint col_w2 = col_w - (param == self->groups[group].num_columns - 1 ? cw : 0); gfloat (*get_data_func)(gpointer pattern_data, gpointer column_data, guint row, guint group, guint param) = self->callbacks->get_data_func; gboolean is_cursor_column = (param == self->parameter && group == self->group); gboolean is_selection_column = (self->selection_enabled && in_selection_column(self, group, param)); while (y < max_y && row < self->num_rows) { gint col_w3 = col_w2; /* draw background */ gdouble *bg_shade_color=self->bg_shade_color[row&0x1]; cairo_set_source_rgb(cr,bg_shade_color[0],bg_shade_color[1],bg_shade_color[2]); if (is_selection_column && in_selection_row(self, row)) { /* the last space should be selected if it's a within-group "glue" in multiple column selection, row colour otherwise */ if (self->selection_mode == PESM_COLUMN) { /* draw row-coloured "continuation" after column, unless last column in a group */ col_w3 = col_w - cw; if (param != self->groups[group].num_columns - 1) { cairo_rectangle(cr,x+col_w3,y,cw,ch); cairo_fill(cr); } } /* draw selected column+continuation (unless last column, then don't draw continuation) */ cairo_set_source_rgb(cr,self->sel_color[0],self->sel_color[1],self->sel_color[2]); } cairo_rectangle(cr,x,y,col_w3,ch); cairo_fill(cr); // draw cursor if (row == self->row && is_cursor_column) { gint cp = pt->column_pos[self->digit]; cairo_set_source_rgb(cr,self->cursor_color[0],self->cursor_color[1],self->cursor_color[2]); cairo_rectangle(cr,x+cw*cp,y,cw,ch); cairo_fill(cr); } str = pt->to_string_func(buf, get_data_func(self->pattern_data, col->user_data, row, group, param), col->def); cairo_set_source_rgb(cr,self->text_color[0],self->text_color[1],self->text_color[2]); cairo_move_to(cr,x,y); pango_layout_set_text(pl,str,pt->chars); pango_cairo_show_layout(cr,pl); y += ch; row++; } } static gint bt_pattern_editor_get_row_width (BtPatternEditor *self) { gint width = self->rowhdr_width, g; for (g = 0; g < self->num_groups; g++) width += self->groups[g].width; return width; } static gint bt_pattern_editor_get_col_height (BtPatternEditor *self) { return (self->colhdr_height + self->num_rows * self->ch); } static void bt_pattern_editor_refresh_cell (BtPatternEditor *self) { gint y = self->colhdr_height + (self->row * self->ch) - self->ofs_y; gint x = self->rowhdr_width - self->ofs_x; gint g, i, w; BtPatternEditorColumnGroup *cgrp; BtPatternEditorColumn *col; struct ParamType *pt; for (g = 0; g < self->group; g++) { cgrp = &self->groups[g]; x += cgrp->width; } cgrp = &self->groups[self->group]; for (i = 0; i < self->parameter; i++) { col=&cgrp->columns[i]; pt = ¶m_types[col->type]; x += self->cw * (pt->chars + 1); } col=&cgrp->columns[self->parameter]; pt = ¶m_types[col->type]; w = self->cw * (pt->chars + 1); //GST_INFO("Mark Area Dirty: %d,%d -> %d,%d",x, y, w, self->ch); gtk_widget_queue_draw_area (GTK_WIDGET(self), x, y, w , self->ch); } static void bt_pattern_editor_refresh_cursor (BtPatternEditor *self) { gint y = self->colhdr_height + (self->row * self->ch) - self->ofs_y; gint x = self->rowhdr_width - self->ofs_x; gint g, i; BtPatternEditorColumnGroup *cgrp; BtPatternEditorColumn *col; struct ParamType *pt; if (!self->num_groups) return; for (g = 0; g < self->group; g++) { cgrp = &self->groups[g]; x += cgrp->width; } cgrp = &self->groups[self->group]; for (i = 0; i < self->parameter; i++) { col=&cgrp->columns[i]; pt = ¶m_types[col->type]; x += self->cw * (pt->chars + 1); } col=&cgrp->columns[self->parameter]; pt = ¶m_types[col->type]; x += self->cw * pt->column_pos[self->digit]; //GST_INFO("Mark Area Dirty: %d,%d -> %d,%d",x, y, self->cw, self->ch); gtk_widget_queue_draw_area (GTK_WIDGET(self), x, y, self->cw , self->ch); } static void bt_pattern_editor_refresh_cursor_or_scroll (BtPatternEditor *self) { gboolean draw=TRUE; if (self->group < self->num_groups) { gint g, p; gint xpos = 0; BtPatternEditorColumnGroup *grp = NULL; for (g = 0; g < self->group; g++) xpos += self->groups[g].width; grp = &self->groups[g]; for (p = 0; p < self->parameter; p++) xpos += self->cw * (param_types[grp->columns[p].type].chars + 1); if (p < grp->num_columns) { gint cpos = self->ofs_x; gint w = self->cw * param_types[grp->columns[p].type].chars; /* column width */ gint ww = GTK_WIDGET(self)->requisition.width - self->rowhdr_width; /* full width, less rowheader */ gint pw = GTK_WIDGET(self)->allocation.width - self->rowhdr_width; /* visible (scrolled) width, less rowheader */ /* rowheader is subtracted, because it is not taken into account in hscroll range */ GST_INFO("xpos = %d cpos = %d w = %d width = %d / %d", xpos, cpos, w, ww, pw); if (xpos < cpos || xpos + w > cpos + pw) { /* if current parameter doesn't fit, try to center the cursor */ xpos = xpos - pw / 2; if (xpos + pw > ww) xpos = ww - pw; if (xpos < 0) xpos = 0; gtk_adjustment_set_value(self->hadj, xpos); draw=FALSE; } } } { gint ypos = self->row * self->ch; gint cpos = self->ofs_y; gint h = self->ch; gint wh = GTK_WIDGET(self)->requisition.height - self->colhdr_height; /* full heigth, less colheader */ gint ph = GTK_WIDGET(self)->allocation.height - self->colhdr_height; /* visible (scrolled) heigth, less colheader */ /* colheader is subtracted, because it is not taken into account in vscroll range */ GST_INFO("ypos = %d cpos = %d h = %d height = %d / %d", ypos, cpos, h, wh, ph); if (ypos < cpos || ypos + h > cpos + ph) { /* if current parameter doesn't fit, try to center the cursor */ ypos = ypos - ph / 2; if (ypos + ph > wh) ypos = wh - ph; if (ypos < 0) ypos = 0; gtk_adjustment_set_value(self->vadj, ypos); draw=FALSE; } } if(draw) { // setting the adjustments already draws bt_pattern_editor_refresh_cursor(self); } } static void advance (BtPatternEditor *self) { if (self->row < self->num_rows - 1) { // invalidate old pos bt_pattern_editor_refresh_cursor(self); self->row += self->step; if (self->row > self->num_rows - 1) self->row = self->num_rows - 1; bt_pattern_editor_refresh_cursor_or_scroll(self); } } static BtPatternEditorColumn * cur_column (BtPatternEditor *self) { return &self->groups[self->group].columns[self->parameter]; } static gboolean char_to_coords(gint charpos, BtPatternEditorColumn *columns, gint num_cols, gint *parameter, gint *digit) { gint i, j; for (i = 0; i < num_cols; i++) { struct ParamType *type = ¶m_types[columns[i].type]; if (charpos < type->chars) { for (j = 0; j < type->columns; j++) { gint cps = type->column_pos[j], cpe = cps; if (columns[i].type == PCT_NOTE && j == 0) cpe++; if (charpos >= cps && charpos <= cpe) { *parameter = i; *digit = j; return TRUE; } } return FALSE; } charpos -= type->chars + 1; } return FALSE; } //-- constructor methods /** * bt_pattern_editor_new: * * Create a new pattern editor widget. Use bt_pattern_editor_set_pattern() to * pass pattern data. * * Returns: the widget */ GtkWidget * bt_pattern_editor_new (void) { return GTK_WIDGET( g_object_new (BT_TYPE_PATTERN_EDITOR, NULL )); } //-- class internals static void bt_pattern_editor_realize (GtkWidget *widget) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); GdkWindowAttr attributes; gint attributes_mask; PangoContext *pc; PangoFontDescription *pfd; PangoFontMetrics *pfm; GdkColor *c; g_return_if_fail (BT_IS_PATTERN_EDITOR (widget)); gtk_widget_set_realized(widget, TRUE); attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK /*| GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK*/; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new ( gtk_widget_get_parent_window (widget), &attributes, attributes_mask); widget->style = gtk_style_attach (widget->style, widget->window); gdk_window_set_user_data (widget->window, widget); gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gtk_widget_set_can_focus(widget, TRUE); // setup graphic styles bt_ui_resources_get_rgb_color(BT_UI_RES_COLOR_PLAYLINE,&self->play_pos_color[0],&self->play_pos_color[1],&self->play_pos_color[2]); // does not work (?), see bt-edit.gtkrc // gtk_style_lookup_color(widget->style,"alternative-row",&alt_row_color); c=&widget->style->light[GTK_STATE_NORMAL]; self->bg_shade_color[0][0]=((gdouble)c->red*0.9)/65535.0; self->bg_shade_color[0][1]=((gdouble)c->green*0.9)/65535.0; self->bg_shade_color[0][2]=((gdouble)c->blue*0.9)/65535.0; self->bg_shade_color[1][0]=(gdouble)c->red/65535.0; self->bg_shade_color[1][1]=(gdouble)c->green/65535.0; self->bg_shade_color[1][2]=(gdouble)c->blue/65535.0; c=&widget->style->text[GTK_STATE_NORMAL]; self->text_color[0]=(gdouble)c->red/65535.0; self->text_color[1]=(gdouble)c->green/65535.0; self->text_color[2]=(gdouble)c->blue/65535.0; c=&widget->style->bg[GTK_STATE_NORMAL]; self->bg_color[0]=(gdouble)c->red/65535.0; self->bg_color[1]=(gdouble)c->green/65535.0; self->bg_color[2]=(gdouble)c->blue/65535.0; c=&widget->style->base[GTK_STATE_SELECTED]; self->sel_color[0]=(gdouble)c->red/65535.0; self->sel_color[1]=(gdouble)c->green/65535.0; self->sel_color[2]=(gdouble)c->blue/65535.0; c=&widget->style->text_aa[GTK_STATE_ACTIVE]; self->cursor_color[0]=(gdouble)c->red/65535.0; self->cursor_color[1]=(gdouble)c->green/65535.0; self->cursor_color[2]=(gdouble)c->blue/65535.0; /* copy size from default font and use default monospace font */ GST_WARNING(" default font %p, size %d (is_absolute %d?), scl=%lf", widget->style->font_desc, pango_font_description_get_size(widget->style->font_desc), pango_font_description_get_size_is_absolute(widget->style->font_desc), (gdouble)PANGO_SCALE); /* calculate font-metrics */ pc = gtk_widget_get_pango_context(widget); pfd = pango_font_description_new(); //pango_font_description_set_family_static (pfd, "Bitstream Vera Sans Mono,"); //pango_font_description_set_absolute_size (pfd, 12 * PANGO_SCALE); pango_font_description_set_family_static(pfd, "monospace,"); if(pango_font_description_get_size_is_absolute(widget->style->font_desc)) { pango_font_description_set_absolute_size(pfd, pango_font_description_get_size(widget->style->font_desc)); } else { pango_font_description_set_size(pfd, pango_font_description_get_size(widget->style->font_desc)); } pango_context_load_font(pc, pfd); pfm = pango_context_get_metrics(pc, pfd, NULL); self->cw = pango_font_metrics_get_approximate_digit_width(pfm) / PANGO_SCALE; self->ch = (pango_font_metrics_get_ascent(pfm) + pango_font_metrics_get_descent(pfm)) / PANGO_SCALE; pango_font_metrics_unref(pfm); self->pl = pango_layout_new(pc); pango_layout_set_font_description(self->pl, pfd); pango_font_description_free(pfd); GST_WARNING("char size: %d x %d", self->cw, self->ch); } static void bt_pattern_editor_unrealize(GtkWidget *widget) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); g_object_unref (self->pl); self->pl = NULL; if(self->hadj) { g_object_unref (self->hadj); self->hadj=NULL; } if(self->vadj){ g_object_unref (self->vadj); self->vadj=NULL; } GTK_WIDGET_CLASS(bt_pattern_editor_parent_class)->unrealize(widget); } /* @todo: speedup * - refactor layout and redrawing * - calculate layout in bt_pattern_editor_size_allocate() and cache (what exactly) * - only redraw in expose * - do columns in two passes to avoid changing the color for the text */ static gboolean bt_pattern_editor_expose (GtkWidget *widget, GdkEventExpose *event) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); GdkRectangle rect = event->area; gint y, x, i, row, g, max_y; gint grp_x; gint rowhdr_x, ch; cairo_t *cr; g_return_val_if_fail (BT_IS_PATTERN_EDITOR (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->count > 0) return FALSE; /* this is the dirty region */ GST_INFO("Refresh Area: %d,%d -> %d,%d",rect.x, rect.y, rect.width, rect.height); cr = gdk_cairo_create (widget->window); if (self->hadj) { self->ofs_x = (gint)gtk_adjustment_get_value(self->hadj); self->ofs_y = (gint)gtk_adjustment_get_value(self->vadj); } /* calculate the first a last row in the dirty region */ self->colhdr_height = ch = self->ch; x = 0; y = ch + (gint)(ch * floor((rect.y - ch) / ch)); if (y < ch) y = ch; max_y = rect.y + rect.height + ch; // one extra line max_y = ch + (gint)(ch * ceil((max_y - ch) / ch)); row = (y - ch) / ch; /* leave space for headers */ rowhdr_x = x; self->rowhdr_width = bt_pattern_editor_rownum_width(self) + self->cw; x += self->rowhdr_width; GST_INFO("Scroll: %d,%d, row=%d",self->ofs_x, self->ofs_y, row); /* draw group parameter columns */ for (g = 0; g < self->num_groups; g++) { BtPatternEditorColumnGroup *cgrp = &self->groups[g]; grp_x = x; for (i = 0; i < cgrp->num_columns; i++) { BtPatternEditorColumn *col=&cgrp->columns[i]; struct ParamType *pt = ¶m_types[col->type]; gint w = self->cw * (pt->chars + 1); gint xs = x-self->ofs_x, xe = xs+(w-1); // check intersection if((xs>=rect.x && xs<=rect.x+rect.width) || (xe>=rect.x && xe<=rect.x+rect.width) || (xs<=rect.x && xe>=rect.x+rect.width)) { GST_DEBUG("Draw Group/Column: %d,%d : %3d-%3d",g,i,xs,xe); bt_pattern_editor_draw_column(self, cr, x-self->ofs_x, y-self->ofs_y, col, g, i, row, max_y); } else { GST_DEBUG("Skip Group/Column: %d,%d : %3d-%3d",g,i,xs,xe); } x += w; } x += self->cw; cgrp->width = x - grp_x; } /* draw left and top headers */ if(rect.xrowhdr_width) { bt_pattern_editor_draw_rownum(self, cr, rowhdr_x, y-self->ofs_y, row, max_y); } if(rect.ych) { bt_pattern_editor_draw_colnames(self, cr, (rowhdr_x+self->rowhdr_width)-self->ofs_x, 0, widget->allocation.width); bt_pattern_editor_draw_rowname(self, cr, rowhdr_x, 0); } /* draw play-pos */ if(self->play_pos>=0.0) { gdouble h=(gdouble)(bt_pattern_editor_get_col_height(self)-self->colhdr_height); y=self->colhdr_height+(gint)(self->play_pos*h) - self->ofs_y; // @todo: check rect.y, rect.height cairo_set_source_rgb(cr,self->play_pos_color[0],self->play_pos_color[1],self->play_pos_color[2]); cairo_set_line_width(cr, 2.0); cairo_move_to(cr,0,y); cairo_line_to(cr,widget->allocation.width,y); cairo_stroke(cr); //GST_INFO("Draw playline: %d,%d -> %d,%d",0, y); } cairo_destroy(cr); if (G_UNLIKELY(self->size_changed)) { // do this for resize the after the first redraw (see @todo above) self->size_changed=FALSE; gtk_widget_queue_resize_no_redraw (widget); } return FALSE; } static void bt_pattern_editor_update_adjustments (BtPatternEditor *self) { if(!gtk_widget_get_realized(GTK_WIDGET(self))) return; if (self->hadj) { self->hadj->upper = bt_pattern_editor_get_row_width(self); self->hadj->page_increment = GTK_WIDGET (self)->allocation.width; self->hadj->page_size = GTK_WIDGET (self)->allocation.width; self->hadj->step_increment = GTK_WIDGET (self)->allocation.width / 20.0; gtk_adjustment_changed(self->hadj); gtk_adjustment_set_value(self->hadj, MIN(self->hadj->value, self->hadj->upper - self->hadj->page_size)); } if (self->vadj) { self->vadj->upper = bt_pattern_editor_get_col_height(self); self->vadj->page_increment = GTK_WIDGET (self)->allocation.height; self->vadj->page_size = GTK_WIDGET (self)->allocation.height; self->vadj->step_increment = GTK_WIDGET (self)->allocation.height / 20.0; gtk_adjustment_changed(self->vadj); gtk_adjustment_set_value(self->vadj, MIN(self->vadj->value, self->vadj->upper - self->vadj->page_size)); } } static void bt_pattern_editor_size_request (GtkWidget *widget, GtkRequisition *requisition) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); /* calculate from pattern size */ requisition->width = bt_pattern_editor_get_row_width(self); requisition->height = bt_pattern_editor_get_col_height(self); GST_DEBUG("size_request: %d,%d",requisition->width, requisition->height); } static void bt_pattern_editor_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { g_return_if_fail (allocation != NULL); GTK_WIDGET_CLASS(bt_pattern_editor_parent_class)->size_allocate(widget,allocation); widget->allocation = *allocation; GST_INFO("size_allocate: %d,%d %d,%d",allocation->x, allocation->y, allocation->width, allocation->height); bt_pattern_editor_update_adjustments (BT_PATTERN_EDITOR (widget)); } static gboolean bt_pattern_editor_key_press (GtkWidget *widget, GdkEventKey *event) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); if (self->num_groups) { // map keypad numbers to ordinary numbers if (event->keyval >= GDK_KP_0 && event->keyval <= GDK_KP_9) { event->keyval -= ( GDK_KP_0 - '0'); } if (!(event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK|GDK_MOD1_MASK)) && (event->keyval >= 32 && event->keyval < 127) && self->callbacks->set_data_func) { BtPatternEditorColumn *col = &self->groups[self->group].columns[self->parameter]; if (event->keyval == '.') { self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, col->def); bt_pattern_editor_refresh_cell (self); advance(self); } else { static const gchar hexdigits[] = "0123456789abcdef"; //static const char notenames[] = "zsxdcvgbhnjm\t\t\t\tq2w3er5t6y7u\t\t\t\ti9o0p"; static const gchar notenames[] = "\x34\x27\x35\x28\x36\x37\x2a\x38\x2b\x39\x2c\x3a\x3a\x3a\x3a\x3a\x18\x0b\x19\x0c\x1a\x1b\x0e\x1c\x0f\x1d\x10\x1e\x1e\x1e\x1e\x1e\x1f\x12\x20\x13\x21"; gfloat oldvalue = self->callbacks->get_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter); const gchar *p; switch(col->type) { case PCT_FLOAT: // no editing yet break; case PCT_SWITCH: if (event->keyval == '0' || event->keyval == '1') { self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, event->keyval - '0'); advance(self); } break; case PCT_BYTE: case PCT_WORD: p = strchr(hexdigits, (char)event->keyval); if (p) { gint value = (gint)oldvalue; if (oldvalue == col->def) value = 0; gint shift = 4*(((col->type == PCT_BYTE) ? 1 : 3) - self->digit); value = (value &~(15 << shift)) | ((p - hexdigits) << shift); if (value < col->min) value = col->min; if (value > col->max) value = col->max; self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, value); bt_pattern_editor_refresh_cell (self); advance(self); } break; case PCT_NOTE: if (self->digit == 0 && event->keyval == '1') { // note off self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, 255); bt_pattern_editor_refresh_cell (self); advance(self); break; } if (self->digit == 0 && event->hardware_keycode <= 255) { // use event->hardware_keycode because of y<>z p = strchr(notenames, (char)event->hardware_keycode); if (p) { gint value = 1 + (p - notenames) + 16 * self->octave; if (value < col->min) value = col->min; if (value > col->max) value = col->max; if (value >= col->min && value <= col->max && (value & 15) <= 12) { self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, value); bt_pattern_editor_refresh_cell (self); advance(self); } } } if (self->digit == 1) { if (isdigit(event->keyval)) { gint value = (gint)oldvalue; if (oldvalue == col->def) value = 1; value = (value & 15) | ((event->keyval - '0') << 4); // note range = 1..12 and not 0..11 if (value >= col->min && value <= col->max && (value & 15) <= 12) { self->callbacks->set_data_func(self->pattern_data, col->user_data, self->row, self->group, self->parameter, self->digit, value); bt_pattern_editor_refresh_cell (self); advance(self); } } } break; } } } else { gint kup = toupper(event->keyval); gint control = (event->state & GDK_CONTROL_MASK) != 0; gint shift = (event->state & GDK_SHIFT_MASK) != 0; gint modifier = event->state & gtk_accelerator_get_default_mod_mask(); if (control && event->keyval >= '1' && event->keyval <= '9') { self->step = event->keyval - '0'; return TRUE; } else if (control && kup >= 'A' && kup <= 'Z') { gboolean same = FALSE, handled = TRUE; switch(kup) { case 'B': case 'E': if (kup == 'B') { same = self->selection_enabled && (self->selection_start == self->row) && (self->selection_group == self->group) && (self->selection_param == self->parameter); self->selection_enabled = TRUE; self->selection_start = self->row; if (self->selection_end < self->row) self->selection_end = self->row; } else { /* Ctrl+E */ same = self->selection_enabled && (self->selection_end == self->row) && (self->selection_group == self->group) && (self->selection_param == self->parameter); self->selection_enabled = TRUE; self->selection_end = self->row; if (self->selection_start > self->row) self->selection_start = self->row; } /* if Ctrl+B(E) was pressed again, cycle selection mode */ if (same) { if (self->selection_mode < (self->num_groups == 1 ? PESM_GROUP : PESM_ALL)) self->selection_mode++; else self->selection_mode = PESM_COLUMN; } self->selection_group = self->group; self->selection_param = self->parameter; break; case 'U': self->selection_enabled = FALSE; break; case 'L': case 'K': case 'A': self->selection_enabled = TRUE; self->selection_mode = kup == 'K' ? PESM_GROUP : (kup == 'L' ? PESM_COLUMN : PESM_ALL); self->selection_start = 0; self->selection_end = self->num_rows - 1; self->selection_group = self->group; self->selection_param = self->parameter; break; default: handled = FALSE; break; } if (handled) { // selection changed gtk_widget_queue_draw (GTK_WIDGET(self)); return TRUE; } } switch(event->keyval) { case GDK_Up: if (!modifier) { if (self->row > 0) { // invalidate old pos bt_pattern_editor_refresh_cursor(self); self->row -= 1; g_object_notify((gpointer)self,"cursor-row"); bt_pattern_editor_refresh_cursor_or_scroll(self); } return TRUE; } break; case GDK_Down: if (!modifier) { if (self->row < self->num_rows - 1) { // invalidate old pos bt_pattern_editor_refresh_cursor(self); self->row += 1; g_object_notify((gpointer)self,"cursor-row"); bt_pattern_editor_refresh_cursor_or_scroll(self); } return TRUE; } break; case GDK_Page_Up: if (!modifier) { if (self->row > 0) { bt_pattern_editor_refresh_cursor(self); /* @todo: should we tell pattern editor about the meassure * g_object_get(song_info,"bars",&bars,NULL); for 4/4 => 16 */ if (control) self->row = 0; else { gint p=(gint)self->row - 16; self->row = p < 0 ? 0 : p; } g_object_notify((gpointer)self,"cursor-row"); bt_pattern_editor_refresh_cursor_or_scroll(self); } return TRUE; } break; case GDK_Page_Down: if (!modifier) { if (self->row < self->num_rows - 1) { bt_pattern_editor_refresh_cursor(self); /* @todo: see Page_Up */ self->row = control ? self->num_rows - 1 : self->row + 16; if (self->row > self->num_rows - 1) self->row = self->num_rows - 1; g_object_notify((gpointer)self,"cursor-row"); bt_pattern_editor_refresh_cursor_or_scroll(self); } return TRUE; } break; case GDK_Home: bt_pattern_editor_refresh_cursor(self); if (control) { /* shouldn't this go to top left */ self->digit = 0; self->parameter = 0; g_object_notify((gpointer)self,"cursor-param"); } else { /* go to begin of cell, group, pattern, top of pattern */ if (self->digit > 0) { self->digit = 0; } else if (self->parameter > 0) { self->parameter = 0; g_object_notify((gpointer)self,"cursor-param"); } else if (self->group > 0) { self->group = 0; g_object_notify((gpointer)self,"cursor-group"); } else { self->row = 0; g_object_notify((gpointer)self,"cursor-row"); } } bt_pattern_editor_refresh_cursor_or_scroll(self); return TRUE; case GDK_End: bt_pattern_editor_refresh_cursor(self); if (control) { /* shouldn't this go to bottom right */ if (self->groups[self->group].num_columns > 0) self->parameter = self->groups[self->group].num_columns - 1; g_object_notify((gpointer)self,"cursor-param"); } else { /* go to end of cell, group, pattern, bottom of pattern */ BtPatternEditorColumn *pc = cur_column (self); if (self->digit < param_types[pc->type].columns - 1) { self->digit = param_types[pc->type].columns - 1; } else if (self->parameter < self->groups[self->group].num_columns - 1) { self->parameter = self->groups[self->group].num_columns - 1; g_object_notify((gpointer)self,"cursor-param"); } else if (self->group < self->num_groups - 1) { self->group = self->num_groups - 1; g_object_notify((gpointer)self,"cursor-group"); } else { self->row = self->num_rows - 1; g_object_notify((gpointer)self,"cursor-row"); } } bt_pattern_editor_refresh_cursor_or_scroll(self); return TRUE; case GDK_Left: if (!modifier) { bt_pattern_editor_refresh_cursor(self); if (self->digit > 0) self->digit--; else { BtPatternEditorColumn *pc; if (self->parameter > 0) { self->parameter--; g_object_notify((gpointer)self,"cursor-param"); } else if (self->group > 0) { self->group--; self->parameter = self->groups[self->group].num_columns - 1; /* only notify group, param will be read along anyway */ g_object_notify((gpointer)self,"cursor-group"); } else return FALSE; pc = cur_column (self); self->digit = param_types[pc->type].columns - 1; } bt_pattern_editor_refresh_cursor_or_scroll (self); return TRUE; } break; case GDK_Right: if (!modifier) { BtPatternEditorColumn *pc = cur_column (self); bt_pattern_editor_refresh_cursor(self); if (self->digit < param_types[pc->type].columns - 1) { self->digit++; } else if (self->parameter < self->groups[self->group].num_columns - 1) { self->parameter++; self->digit = 0; g_object_notify((gpointer)self,"cursor-param"); } else if (self->group < self->num_groups - 1) { self->group++; self->parameter = 0; self->digit = 0; /* only notify group, param will be read along anyway */ g_object_notify((gpointer)self,"cursor-group"); } bt_pattern_editor_refresh_cursor_or_scroll (self); return TRUE; } break; case GDK_Tab: if (!modifier) { bt_pattern_editor_refresh_cursor(self); if (self->group < self->num_groups - 1) { /* jump to same column when jumping from track to track, otherwise jump to first column of the group */ if (self->groups[self->group].type != self->groups[self->group + 1].type) { self->parameter = 0; self->digit = 0; } self->group++; g_object_notify((gpointer)self,"cursor-group"); } bt_pattern_editor_refresh_cursor_or_scroll (self); return TRUE; } break; case GDK_ISO_Left_Tab: if (shift) { bt_pattern_editor_refresh_cursor(self); if (self->group > 0) { self->group--; if (self->groups[self->group].type != self->groups[self->group + 1].type) { self->parameter = 0; self->digit = 0; } g_object_notify((gpointer)self,"cursor-group"); } else /* at leftmost group, reset cursor to first column */ self->parameter = 0, self->digit = 0; bt_pattern_editor_refresh_cursor_or_scroll (self); return TRUE; } break; } } } return FALSE; } static gboolean bt_pattern_editor_button_press (GtkWidget *widget, GdkEventButton *event) { BtPatternEditor *self = BT_PATTERN_EDITOR(widget); gint x = self->ofs_x + event->x; gint y = self->ofs_y + event->y; gint parameter, digit; gint g; gtk_widget_grab_focus_savely(GTK_WIDGET(self)); if (x < self->rowhdr_width) { bt_pattern_editor_refresh_cursor(self); self->row = (y-self->colhdr_height) / self->ch; bt_pattern_editor_refresh_cursor_or_scroll(self); return TRUE; } x -= self->rowhdr_width; y -= self->colhdr_height; for (g = 0; g < self->num_groups; g++) { BtPatternEditorColumnGroup *grp = &self->groups[g]; if (x < grp->width) { if (char_to_coords(x / self->cw, grp->columns, grp->num_columns, ¶meter, &digit)) { bt_pattern_editor_refresh_cursor(self); self->row = y / self->ch; self->group = g; self->parameter = parameter; self->digit = digit; g_object_notify((gpointer)self,"cursor-row"); g_object_notify((gpointer)self,"cursor-group"); bt_pattern_editor_refresh_cursor_or_scroll(self); return TRUE; } return FALSE; } x -= grp->width; } return FALSE; } static gboolean bt_pattern_editor_button_release (GtkWidget *widget, GdkEventButton *event) { return FALSE; } static void bt_pattern_editor_set_scroll_adjustments (BtPatternEditor* self, GtkAdjustment * horizontal, GtkAdjustment * vertical) { if (!horizontal) { horizontal = GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,0,0,0)); } if (!vertical) { vertical = GTK_ADJUSTMENT (gtk_adjustment_new (0,0,0,0,0,0)); } if (self->hadj) { g_signal_handlers_disconnect_by_func (self->hadj, gtk_widget_queue_draw, self); g_object_unref (self->hadj); } if (self->vadj) { g_signal_handlers_disconnect_by_func (self->vadj, gtk_widget_queue_draw, self); g_object_unref (self->vadj); } self->hadj = g_object_ref_sink (horizontal); g_signal_connect_swapped (self->hadj, "value-changed", G_CALLBACK (gtk_widget_queue_draw), self); self->vadj = g_object_ref_sink (vertical); g_signal_connect_swapped (self->vadj, "value-changed", G_CALLBACK (gtk_widget_queue_draw), self); bt_pattern_editor_update_adjustments (self); } static void bt_pattern_editor_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtPatternEditor *self = BT_PATTERN_EDITOR(object); switch (property_id) { case PATTERN_EDITOR_CURSOR_GROUP: { g_value_set_uint(value, self->group); } break; case PATTERN_EDITOR_CURSOR_PARAM: { g_value_set_uint(value, self->parameter); } break; case PATTERN_EDITOR_CURSOR_ROW: { g_value_set_uint(value, self->row); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_pattern_editor_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtPatternEditor *self = BT_PATTERN_EDITOR(object); switch (property_id) { case PATTERN_EDITOR_PLAY_POSITION: { gdouble old_pos = self->play_pos; self->play_pos = g_value_get_double(value); if(gtk_widget_get_realized(GTK_WIDGET(self))) { gint y; gdouble h=(gdouble)(bt_pattern_editor_get_col_height(self)-self->colhdr_height); GtkAllocation allocation=GTK_WIDGET(self)->allocation; y=self->colhdr_height+(gint)(old_pos*h) - self->ofs_y; gtk_widget_queue_draw_area(GTK_WIDGET(self),0,y-1,allocation.width,2); GST_INFO("Mark Area Dirty: %d,%d -> %d,%d",0, y-1, allocation.width, 2); y=self->colhdr_height+(gint)(self->play_pos*h) - self->ofs_y; gtk_widget_queue_draw_area(GTK_WIDGET(self),0,y-1,allocation.width,2); //GST_INFO("Mark Area Dirty: %d,%d -> %d,%d",0, y-1, allocation.width, 2); } } break; case PATTERN_EDITOR_OCTAVE: { self->octave = g_value_get_uint(value); } break; case PATTERN_EDITOR_CURSOR_GROUP: { guint old = self->group; self->group = g_value_get_uint(value); if (self->group != old) self->parameter=self->digit=0; } break; case PATTERN_EDITOR_CURSOR_PARAM: { guint old = self->parameter; self->parameter = g_value_get_uint(value); if (self->parameter != old) self->digit=0; } break; case PATTERN_EDITOR_CURSOR_ROW: { self->row = g_value_get_uint(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_pattern_editor_dispose(GObject *object) { BtPatternEditor *self = BT_PATTERN_EDITOR(object); if (self->hadj) { g_object_unref(self->hadj); self->hadj = NULL; } if (self->vadj) { g_object_unref(self->vadj); self->vadj = NULL; } G_OBJECT_CLASS(bt_pattern_editor_parent_class)->dispose(object); } static void bt_pattern_editor_class_init(BtPatternEditorClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); gobject_class->set_property = bt_pattern_editor_set_property; gobject_class->get_property = bt_pattern_editor_get_property; gobject_class->dispose = bt_pattern_editor_dispose; widget_class->realize = bt_pattern_editor_realize; widget_class->unrealize = bt_pattern_editor_unrealize; widget_class->expose_event = bt_pattern_editor_expose; widget_class->size_request = bt_pattern_editor_size_request; widget_class->size_allocate = bt_pattern_editor_size_allocate; widget_class->key_press_event = bt_pattern_editor_key_press; widget_class->button_press_event = bt_pattern_editor_button_press; widget_class->button_release_event = bt_pattern_editor_button_release; /** * BtPatternEditor::set-scroll-adjustments: * @hadjustment: horizontal adjustment * @vadjustment: vertical adjust * * Internal signal for scrolling. */ widget_class->set_scroll_adjustments_signal = g_signal_new("set-scroll-adjustments", BT_TYPE_PATTERN_EDITOR, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (BtPatternEditorClass, set_scroll_adjustments), NULL, NULL, bt_marshal_VOID__OBJECT_OBJECT, G_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); klass->set_scroll_adjustments = bt_pattern_editor_set_scroll_adjustments; g_object_class_install_property(gobject_class,PATTERN_EDITOR_PLAY_POSITION, g_param_spec_double("play-position", "play position prop.", "The current playing position as a fraction", -1.0, 1.0, -1.0, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_EDITOR_OCTAVE, g_param_spec_uint("octave", "octave prop.", "The octave for note input", 0, 12, 2, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_EDITOR_CURSOR_GROUP, g_param_spec_uint("cursor-group", "cursor group prop.", "The current group the cursor is in", 0, G_MAXUINT, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_EDITOR_CURSOR_PARAM, g_param_spec_uint("cursor-param", "cursor param prop.", "The current parameter the cursor is at", 0, G_MAXUINT, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_EDITOR_CURSOR_ROW, g_param_spec_uint("cursor-row", "cursor row prop.", "The current cursor row", 0, G_MAXUINT, 0, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } static void bt_pattern_editor_init(BtPatternEditor *self) { self->row = self->parameter = self->digit = 0; self->group = 0; self->ofs_x = 0; self->ofs_y = 0; self->groups = NULL; self->num_groups = 0; self->num_rows = 0; self->octave = 4; self->step = 1; self->size_changed = TRUE; self->selection_mode = PESM_COLUMN; self->selection_start = 0; self->selection_end = 0; self->selection_group = 0; self->selection_param = 0; } /** * bt_pattern_editor_set_pattern: * @self: the widget * @pattern_data: memory block of values (passed to the callbacks) * @num_rows: number of tick rows (y axis) * @num_groups: number of groups (x axis) * @groups: group parameters * @cb: value transformation callbacks * * Set pattern data to show in the widget. */ void bt_pattern_editor_set_pattern(BtPatternEditor *self, gpointer pattern_data, guint num_rows, guint num_groups, BtPatternEditorColumnGroup *groups, BtPatternEditorCallbacks *cb) { GtkWidget *widget = GTK_WIDGET(self); self->num_rows = num_rows; self->num_groups = num_groups; self->groups = groups; self->pattern_data = pattern_data; self->callbacks = cb; if (self->row >= self->num_rows) self->row = 0; if (self->group >= self->num_groups) self->group = 0; if (!self->groups || self->parameter >= self->groups[self->group].num_columns) self->parameter = 0; self->size_changed = TRUE; gtk_widget_queue_draw (widget); } /** * bt_pattern_editor_get_selection: * @self: the widget * @start: location for start tick * @end: location for end tick * @group: location for group * @param: location for parameter in group * * Get selection rectangle. * * Returns: %TRUE if there was a selection. */ gboolean bt_pattern_editor_get_selection(BtPatternEditor *self, gint *start, gint *end, gint *group, gint *param) { if (!self->selection_enabled) return FALSE; *start = self->selection_start; *end = self->selection_end; *group = self->selection_mode == PESM_ALL ? -1 : self->selection_group; *param = self->selection_mode != PESM_COLUMN ? -1 : self->selection_param; return TRUE; } buzztard-0.6.0/src/ui/edit/main-pages.c0000644042355400116100000002535611634644477014662 00000000000000/* $Id: main-pages.c 3644 2011-09-16 13:03:57Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpages * @short_description: class for the editor main pages * * The user interface of the buzztard editor is divided into several pages. * This class implements the notebook widgets to manage the sub-pages: * #BtMainPageMachines, #BtMainPagePatterns, #BtMainPageSequence, * #BtMainPageWaves and #BtMainPageInfo. */ #define BT_EDIT #define BT_MAIN_PAGES_C #include "bt-edit.h" enum { MAIN_PAGES_MACHINES_PAGE=1, MAIN_PAGES_PATTERNS_PAGE, MAIN_PAGES_SEQUENCE_PAGE, MAIN_PAGES_WAVES_PAGE, MAIN_PAGES_INFO_PAGE }; struct _BtMainPagesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the machines tab */ BtMainPageMachines *machines_page; /* the patterns tab */ BtMainPagePatterns *patterns_page; /* the sequence tab */ BtMainPageSequence *sequence_page; /* the waves tab */ BtMainPageWaves *waves_page; /* the information tab */ BtMainPageInfo *info_page; }; //-- the class G_DEFINE_TYPE (BtMainPages, bt_main_pages, GTK_TYPE_NOTEBOOK); //-- event handler static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPages *self=BT_MAIN_PAGES(user_data); BtSong *song; BtSetup *setup; GHashTable *properties; gchar *prop; GST_INFO("song has changed : app=%p, self=%p",app,self); // get song from app g_object_get(self->priv->app,"song",&song,NULL); if(!song) { return; } // restore page g_object_get(song,"setup",&setup,NULL); g_object_get(setup,"properties",&properties,NULL); if((prop=(gchar *)g_hash_table_lookup(properties,"active-page"))) { guint page=atoi(prop); gtk_notebook_set_current_page(GTK_NOTEBOOK(self),page); GST_INFO("reactivate page %d",page); } // release the reference g_object_unref(setup); g_object_unref(song); GST_INFO("song has changed done"); } static void on_page_switched(GtkNotebook *notebook, GParamSpec *arg, gpointer user_data) { BtMainPages *self=BT_MAIN_PAGES(user_data); BtSong *song; BtSetup *setup; GHashTable *properties; gchar *prop; guint page_num; // get objects g_object_get(self->priv->app,"song",&song,NULL); if(!song) { return; } g_object_get(notebook,"page",&page_num,NULL); GST_INFO("page has switched : self=%p, page=%d",self,page_num); // remember page g_object_get(song,"setup",&setup,NULL); g_object_get(setup,"properties",&properties,NULL); prop=g_strdup_printf("%u",page_num); g_hash_table_insert(properties,g_strdup("active-page"),prop); // release the reference g_object_unref(setup); g_object_unref(song); GST_INFO("page-switched done"); } //-- helper methods static void bt_main_pages_add_tab(const BtMainPages *self,GtkWidget *content,gchar *str,gchar *icon,gchar *tip) { GtkWidget *label,*event_box,*box,*image; label=gtk_label_new(str); //gtk_label_set_ellipsize(GTK_LABEL(label),PANGO_ELLIPSIZE_END); gtk_widget_set_name(label,str); gtk_widget_show(label); //image=gtk_image_new_from_filename(icon); image=gtk_image_new_from_icon_name(icon,GTK_ICON_SIZE_MENU); gtk_widget_show(image); box=gtk_hbox_new(FALSE,BOX_BORDER); gtk_widget_show(box); //gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0); //gtk_box_pack_start(GTK_BOX(box),label,TRUE,FALSE,0); gtk_container_add(GTK_CONTAINER(box),image); gtk_container_add(GTK_CONTAINER(box),label); event_box=gtk_event_box_new(); g_object_set(event_box,"visible-window",FALSE,NULL); gtk_container_add(GTK_CONTAINER(event_box),box); gtk_widget_set_tooltip_text(event_box,tip); gtk_notebook_insert_page(GTK_NOTEBOOK(self),content,event_box,-1); } static void bt_main_pages_init_ui(const BtMainPages *self) { gtk_widget_set_name(GTK_WIDGET(self),"song views"); GST_INFO("before creating pages, app->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->app)); // don't emit notify::page for each add g_object_freeze_notify((GObject *)self); if(!BT_EDIT_UI_CONFIG("no-machines-page")) { // add wigets for machine view self->priv->machines_page=bt_main_page_machines_new(self); bt_main_pages_add_tab(self,GTK_WIDGET(self->priv->machines_page),_("machines"),"buzztard_tab_machines",_("machines used in the song and their wires")); } if(!BT_EDIT_UI_CONFIG("no-patterns-page")) { // add wigets for pattern view self->priv->patterns_page=bt_main_page_patterns_new(self); bt_main_pages_add_tab(self,GTK_WIDGET(self->priv->patterns_page),_("patterns"),"buzztard_tab_patterns",_("event pattern editor")); } if(!BT_EDIT_UI_CONFIG("no-sequence-page")) { // add wigets for sequence view self->priv->sequence_page=bt_main_page_sequence_new(self); bt_main_pages_add_tab(self,GTK_WIDGET(self->priv->sequence_page),_("sequence"),"buzztard_tab_sequence",_("song sequence editor")); } if(!BT_EDIT_UI_CONFIG("no-wavetable-page")) { // add wigets for waves view self->priv->waves_page=bt_main_page_waves_new(self); bt_main_pages_add_tab(self,GTK_WIDGET(self->priv->waves_page),_("wave table"),"buzztard_tab_waves",_("sample wave table editor")); } if(!BT_EDIT_UI_CONFIG("no-info-page")) { // add widgets for song info view self->priv->info_page=bt_main_page_info_new(self); bt_main_pages_add_tab(self,GTK_WIDGET(self->priv->info_page),_("information"),"buzztard_tab_info",_("song meta data editor")); } // @idea add widgets for machine help view // GTK_STOCK_HELP icon // embed mozilla/gtk-html/webkit-gtk g_object_thaw_notify((GObject *)self); // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); g_signal_connect((gpointer)self, "notify::page", G_CALLBACK(on_page_switched), (gpointer)self); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_pages_new: * * Create a new instance * * Returns: the new instance */ BtMainPages *bt_main_pages_new(void) { BtMainPages *self; self=BT_MAIN_PAGES(g_object_new(BT_TYPE_MAIN_PAGES,NULL)); bt_main_pages_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_main_pages_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMainPages *self = BT_MAIN_PAGES(object); return_if_disposed(); switch (property_id) { case MAIN_PAGES_MACHINES_PAGE: { g_value_set_object(value, self->priv->machines_page); } break; case MAIN_PAGES_PATTERNS_PAGE: { g_value_set_object(value, self->priv->patterns_page); } break; case MAIN_PAGES_SEQUENCE_PAGE: { g_value_set_object(value, self->priv->sequence_page); } break; case MAIN_PAGES_WAVES_PAGE: { g_value_set_object(value, self->priv->waves_page); } break; case MAIN_PAGES_INFO_PAGE: { g_value_set_object(value, self->priv->info_page); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_main_pages_dispose(GObject *object) { BtMainPages *self = BT_MAIN_PAGES(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_changed,NULL); g_object_unref(self->priv->app); // this disposes the pages for us G_OBJECT_CLASS(bt_main_pages_parent_class)->dispose(object); } static void bt_main_pages_init(BtMainPages *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGES, BtMainPagesPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_main_pages_class_init(BtMainPagesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainPagesPrivate)); gobject_class->get_property = bt_main_pages_get_property; gobject_class->dispose = bt_main_pages_dispose; g_object_class_install_property(gobject_class,MAIN_PAGES_MACHINES_PAGE, g_param_spec_object("machines-page", "machines page prop", "the machines view page", BT_TYPE_MAIN_PAGE_MACHINES, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_PAGES_PATTERNS_PAGE, g_param_spec_object("patterns-page", "patterns page prop", "the patterns view page", BT_TYPE_MAIN_PAGE_PATTERNS, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_PAGES_SEQUENCE_PAGE, g_param_spec_object("sequence-page", "sequence page prop", "the sequence view page", BT_TYPE_MAIN_PAGE_SEQUENCE, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_PAGES_WAVES_PAGE, g_param_spec_object("waves-page", "waves page prop", "the waves view page", BT_TYPE_MAIN_PAGE_WAVES, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_PAGES_INFO_PAGE, g_param_spec_object("info-page", "info page prop", "the info view page", BT_TYPE_MAIN_PAGE_INFO, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/settings-dialog.h0000644042355400116100000000561011625722250015714 00000000000000/* $Id: settings-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_DIALOG_H #define BT_SETTINGS_DIALOG_H #include #include #define BT_TYPE_SETTINGS_DIALOG (bt_settings_dialog_get_type ()) #define BT_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_DIALOG, BtSettingsDialog)) #define BT_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_DIALOG, BtSettingsDialogClass)) #define BT_IS_SETTINGS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_DIALOG)) #define BT_IS_SETTINGS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_DIALOG)) #define BT_SETTINGS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_DIALOG, BtSettingsDialogClass)) /* type macros */ typedef struct _BtSettingsDialog BtSettingsDialog; typedef struct _BtSettingsDialogClass BtSettingsDialogClass; typedef struct _BtSettingsDialogPrivate BtSettingsDialogPrivate; /** * BtSettingsDialog: * * the root window for the editor application */ struct _BtSettingsDialog { GtkDialog parent; /*< private >*/ BtSettingsDialogPrivate *priv; }; struct _BtSettingsDialogClass { GtkDialogClass parent; }; /** * BtSettingsPage: * @BT_SETTINGS_PAGE_AUDIO_DEVICES: audio devices * @BT_SETTINGS_PAGE_INTERACTION_CONTROLLER: interaction controller * @BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER: playback controller * @BT_SETTINGS_PAGE_COLORS: colors * @BT_SETTINGS_PAGE_SHORTCUTS: shortcuts * @BT_SETTINGS_PAGE_DIRECTORIES: directories * * Ids for the setting pages. */ typedef enum { BT_SETTINGS_PAGE_AUDIO_DEVICES=0, BT_SETTINGS_PAGE_INTERACTION_CONTROLLER, BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER, BT_SETTINGS_PAGE_COLORS, BT_SETTINGS_PAGE_SHORTCUTS, BT_SETTINGS_PAGE_DIRECTORIES } BtSettingsPage; #define BT_TYPE_SETTINGS_PAGE (bt_settings_page_get_type()) GType bt_settings_page_get_type(void) G_GNUC_CONST; GType bt_settings_dialog_get_type(void) G_GNUC_CONST; BtSettingsDialog *bt_settings_dialog_new(void); #endif // BT_SETTINGS_DIALOG_H buzztard-0.6.0/src/ui/edit/ui-resources.c0000644042355400116100000004661511634640651015255 00000000000000/* $Id: ui-resources.c 3642 2011-09-16 12:31:35Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btuiresources * @short_description: common shared ui resources like icons and colors * * This class serves as a central storage for colors and icons. * It is implemented as a singleton. */ /* @todo: manage GdkColor entries and guint colors (via gdk_color.pixel) */ #define BT_EDIT #define BT_UI_RESOURCES_C #include "bt-edit.h" struct _BtUIResourcesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* icons */ GdkPixbuf *source_machine_pixbuf; GdkPixbuf *processor_machine_pixbuf; GdkPixbuf *sink_machine_pixbuf; /* colors */ GdkColor colors[BT_UI_RES_COLOR_COUNT]; /* the keyboard shortcut table for the window */ GtkAccelGroup *accel_group; /* machine graphics */ gdouble zoom; GdkPixbuf *source_machine_pixbufs[BT_MACHINE_STATE_COUNT]; GdkPixbuf *processor_machine_pixbufs[BT_MACHINE_STATE_COUNT]; GdkPixbuf *sink_machine_pixbufs[BT_MACHINE_STATE_COUNT]; }; static BtUIResources *singleton=NULL; //-- the class G_DEFINE_TYPE (BtUIResources, bt_ui_resources, G_TYPE_OBJECT); //-- event handler //-- helper methods #define MAKE_COLOR_FROM_FLOATS(ix,r,g,b) \ self->priv->colors[ix].red= (guint16)(r*65535); \ self->priv->colors[ix].green=(guint16)(g*65535); \ self->priv->colors[ix].blue= (guint16)(b*65535) #define MAKE_COLOR_FROM_HEX(ix,r,g,b) \ self->priv->colors[ix].red= (guint16)((r*256)); \ self->priv->colors[ix].green=(guint16)((g*256)); \ self->priv->colors[ix].blue= (guint16)((b*256)) #define MAKE_COLOR_FROM_HEX_MIX(ix,r1,g1,b1,r2,g2,b2) \ self->priv->colors[ix].red= (guint16)((r2+((r1-r2)>>1))*256); \ self->priv->colors[ix].green=(guint16)((g2+((g1-g2)>>1))*256); \ self->priv->colors[ix].blue= (guint16)((b2+((b1-b2)>>1))*256) static void bt_ui_resources_init_colors(BtUIResources *self) { GdkColormap *colormap; GtkSettings *settings; gboolean color_res[BT_UI_RES_COLOR_COUNT]; gint res; gchar *icon_theme_name; gboolean use_tango_colors=FALSE; settings=gtk_settings_get_default(); /* get the theme name - we need different machine colors for tango * http://tango.freedesktop.org/Tango_Icon_Theme_Guidelines * http://tango.freedesktop.org/static/cvs/tango-art-tools/palettes/Tango-Palette.gpl */ g_object_get(settings, "gtk-icon-theme-name", &icon_theme_name, NULL); GST_INFO("Icon Theme: %s",icon_theme_name); /* @todo: can we get some colors from the theme ? * gtk_widget_style_get(widget, * "cursor-color",&self->priv->colors[ix], * "secondary-cursor-color",&self->priv->colors[ix], * NULL); */ if(!strcasecmp(icon_theme_name,"tango") || !strcasecmp(icon_theme_name,"gnome")) use_tango_colors=TRUE; // cursor MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_CURSOR, 0.85,0.85,0.20); // selection background MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SELECTION1, 1.00,1.00,0.60); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SELECTION2, 0.95,0.95,0.55); // tree view lines MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PLAYLINE, 0.00,0.00,1.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_LOOPLINE, 1.00,0.75,0.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_ENDLINE, 1.00,0.30,0.20); // source machine if(use_tango_colors) { /* (#ffd699) #fcaf3e / #f57900 / #ce5c00 * 252 175 62 Orange 1 * 245 121 0 Orange 2 * 206 92 0 Orange 3 */ MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SOURCE_MACHINE_BASE, 0xf5,0x79,0x00); //MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1, 0xfc,0xaf,0x3e); //MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2, 0xfc,0xaf,0x3e,0xf5,0x79,0x00); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1, 0xff,0xd6,0x99); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2, 0xff,0xd6,0x99,0xf5,0x79,0x00); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1, 0xce,0x5c,0x00,0xf5,0x79,0x00); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2, 0xce,0x5c,0x00); } else { MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SOURCE_MACHINE_BASE, 1.00,0.60,0.60); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1, 1.00,0.90,0.90); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2, 1.00,0.80,0.80); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1, 0.60,0.40,0.40); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2, 0.50,0.20,0.20); } // processor machine if(use_tango_colors) { /* (#cbff99) #8ae234 / #73d216 / #4e9a06 * 138 226 52 Chameleon 1 * 115 210 22 Chameleon 2 * 78 154 6 Chameleon 3 */ MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE, 0x73,0xd2,0x16); //MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1, 0x8a,0xe2,0x34); //MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2,0x8a,0xe2,0x34,0x73,0xd2,0x16); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1, 0xcb,0xff,0x99); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2,0xcb,0xff,0x99,0x73,0xd2,0x16); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1, 0x4e,0x9a,0x06,0x73,0xd2,0x16); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2, 0x4e,0x9a,0x06); } else { MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE, 0.60,1.00,0.60); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1, 0.90,1.00,0.90); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2, 0.80,1.00,0.80); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1, 0.40,0.60,0.40); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2, 0.20,0.50,0.20); } // sink machine if(use_tango_colors) { /* (#99caff) #729fcf / #3465a4 / #204a87 * 114 159 207 Sky Blue 1 [62 58 43] * 52 101 164 Sky Blue 2 * 32 74 135 Sky Blue 3 [20 27 29] */ MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SINK_MACHINE_BASE, 0x34,0x65,0xa4); //MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1, 0x72,0x9f,0xcf); //MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2, 0x72,0x9f,0xcf,0x34,0x65,0xa4); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1, 0x99,0xca,0xff); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2, 0x99,0xca,0xff,0x34,0x65,0xa4); MAKE_COLOR_FROM_HEX_MIX(BT_UI_RES_COLOR_SINK_MACHINE_DARK1, 0x20,0x4a,0x87,0x34,0x65,0xa4); MAKE_COLOR_FROM_HEX(BT_UI_RES_COLOR_SINK_MACHINE_DARK2, 0x20,0x4a,0x87); } else { MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SINK_MACHINE_BASE, 0.60,0.60,1.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1, 0.90,0.90,1.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2, 0.80,0.80,1.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SINK_MACHINE_DARK1, 0.40,0.40,0.60); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_SINK_MACHINE_DARK2, 0.20,0.20,0.50); } // analyzer window MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_ANALYZER_PEAK, 1.00,0.75,0.00); MAKE_COLOR_FROM_FLOATS(BT_UI_RES_COLOR_GRID_LINES, 0.5,0.5,0.5); g_free(icon_theme_name); // now allocate colors colormap=gdk_colormap_get_system(); if((res=gdk_colormap_alloc_colors(colormap,self->priv->colors,BT_UI_RES_COLOR_COUNT,FALSE,TRUE,color_res))) { guint i; GST_WARNING("failed to allocate %d colors, %d allocated",BT_UI_RES_COLOR_COUNT,res); for(i=0;ipriv->colors[i].red,self->priv->colors[i].green,self->priv->colors[i].blue); } } } GST_INFO("colors created"); } static void bt_ui_resources_init_icons(BtUIResources *self) { GtkSettings *settings; gchar *icon_theme_name,*fallback_icon_theme_name; gint w,h; settings=gtk_settings_get_default(); g_object_get(settings, "gtk-icon-theme-name", &icon_theme_name, "gtk-fallback-icon-theme", &fallback_icon_theme_name, NULL); GST_INFO("Icon Theme: %s, Fallback Icon Theme: %s",icon_theme_name,fallback_icon_theme_name); if(strcasecmp(icon_theme_name,"gnome")) { if(fallback_icon_theme_name && strcasecmp(fallback_icon_theme_name,"gnome")) { g_object_set(settings,"gtk-fallback-icon-theme","gnome",NULL); } } g_free(icon_theme_name); g_free(fallback_icon_theme_name); gtk_icon_size_lookup(GTK_ICON_SIZE_MENU,&w,&h); /* self->priv->source_machine_pixbuf=gdk_pixbuf_new_from_filename("buzztard_menu_source_machine.png"); self->priv->processor_machine_pixbuf=gdk_pixbuf_new_from_filename("buzztard_menu_processor_machine.png"); self->priv->sink_machine_pixbuf=gdk_pixbuf_new_from_filename("buzztard_menu_sink_machine.png"); */ self->priv->source_machine_pixbuf =gdk_pixbuf_new_from_theme("buzztard_menu_source_machine",w); self->priv->processor_machine_pixbuf=gdk_pixbuf_new_from_theme("buzztard_menu_processor_machine",w); self->priv->sink_machine_pixbuf =gdk_pixbuf_new_from_theme("buzztard_menu_sink_machine",w); GST_INFO("images created"); } /* static GdkPixbuf *bt_ui_resources_load_svg(const gchar *file_name) { GError *error = NULL; GdkPixbuf *pixbuf; pixbuf = rsvg_pixbuf_from_file_at_size (file_name, 96, 96, &error); if(error) { GST_WARNING ("loading svg %s failed : %s", file_name, error->message); g_error_free(error); } return(pixbuf); } */ static void bt_ui_resources_free_graphics(BtUIResources *self) { guint state; for(state=0;statepriv->source_machine_pixbufs[state]); g_object_try_unref(self->priv->processor_machine_pixbufs[state]); g_object_try_unref(self->priv->sink_machine_pixbufs[state]); } } static void bt_ui_resources_init_graphics(BtUIResources *self) { // 12*6=72, 14*6=84 const gint size=(gint)(self->priv->zoom*(gdouble)(GTK_ICON_SIZE_DIALOG*14)); //const gint size=(gint)(self->priv->zoom*(gdouble)(6*14)); GST_INFO("regenerating machine graphics at %d pixels",size); //self->priv->source_machine_pixbufs[BT_MACHINE_STATE_NORMAL] = bt_ui_resources_load_svg ("generator.svg"); self->priv->source_machine_pixbufs [BT_MACHINE_STATE_NORMAL]=gdk_pixbuf_new_from_theme("buzztard_generator",size); self->priv->source_machine_pixbufs [BT_MACHINE_STATE_MUTE ]=gdk_pixbuf_new_from_theme("buzztard_generator_mute",size); self->priv->source_machine_pixbufs [BT_MACHINE_STATE_SOLO ]=gdk_pixbuf_new_from_theme("buzztard_generator_solo",size); self->priv->processor_machine_pixbufs[BT_MACHINE_STATE_NORMAL]=gdk_pixbuf_new_from_theme("buzztard_effect",size); self->priv->processor_machine_pixbufs[BT_MACHINE_STATE_MUTE ]=gdk_pixbuf_new_from_theme("buzztard_effect_mute",size); self->priv->processor_machine_pixbufs[BT_MACHINE_STATE_BYPASS]=gdk_pixbuf_new_from_theme("buzztard_effect_bypass",size); self->priv->sink_machine_pixbufs [BT_MACHINE_STATE_NORMAL]=gdk_pixbuf_new_from_theme("buzztard_master",size); self->priv->sink_machine_pixbufs [BT_MACHINE_STATE_MUTE ]=gdk_pixbuf_new_from_theme("buzztard_master_mute",size); /* DEBUG gint w,h; g_object_get(self->priv->source_machine_pixbufs[BT_MACHINE_STATE_NORMAL],"width",&w,"height",&h,NULL); GST_DEBUG("svg: w,h = %d, %d",w,h); */ } //-- constructor methods /** * bt_ui_resources_new: * * Create a new instance on first call and return a reference later on. * * Returns: the new signleton instance */ BtUIResources *bt_ui_resources_new(void) { return (g_object_new(BT_TYPE_UI_RESOURCES,NULL)); } //-- methods /** * bt_ui_resources_get_icon_pixbuf_by_machine: * @machine: the machine to get the image for * * Gets a #GdkPixbuf image that matches the given machine type for use in menus. * * Returns: a #GdkPixbuf image */ GdkPixbuf *bt_ui_resources_get_icon_pixbuf_by_machine(const BtMachine *machine) { if(BT_IS_SOURCE_MACHINE(machine)) { return(g_object_ref(singleton->priv->source_machine_pixbuf)); } else if(BT_IS_PROCESSOR_MACHINE(machine)) { return(g_object_ref(singleton->priv->processor_machine_pixbuf)); } else if(BT_IS_SINK_MACHINE(machine)) { return(g_object_ref(singleton->priv->sink_machine_pixbuf)); } return(NULL); } /** * bt_ui_resources_get_machine_graphics_pixbuf_by_machine: * @machine: the machine to get the image for * @zoom: scaling factor for the icons * * Gets a #GdkPixbuf image that matches the given machine type for use on the * canvas. * * Returns: a #GdkPixbuf image */ GdkPixbuf *bt_ui_resources_get_machine_graphics_pixbuf_by_machine(const BtMachine *machine, gdouble zoom) { BtMachineState state; if(zoom!=singleton->priv->zoom) { GST_DEBUG("change zoom %f -> %f",singleton->priv->zoom,zoom); bt_ui_resources_free_graphics(singleton); singleton->priv->zoom=zoom; bt_ui_resources_init_graphics(singleton); } g_object_get((gpointer)machine,"state",&state,NULL); if(BT_IS_SOURCE_MACHINE(machine)) { return(g_object_ref(singleton->priv->source_machine_pixbufs[state])); } else if(BT_IS_PROCESSOR_MACHINE(machine)) { return(g_object_ref(singleton->priv->processor_machine_pixbufs[state])); } else if(BT_IS_SINK_MACHINE(machine)) { return(g_object_ref(singleton->priv->sink_machine_pixbufs[state])); } return(NULL); } /** * bt_ui_resources_get_icon_image_by_machine: * @machine: the machine to get the image for * * Gets a #GtkImage that matches the given machine type. * * Returns: a #GtkImage widget */ GtkWidget *bt_ui_resources_get_icon_image_by_machine(const BtMachine *machine) { if(BT_IS_SOURCE_MACHINE(machine)) { return(gtk_image_new_from_pixbuf(singleton->priv->source_machine_pixbuf)); } else if(BT_IS_PROCESSOR_MACHINE(machine)) { return(gtk_image_new_from_pixbuf(singleton->priv->processor_machine_pixbuf)); } else if(BT_IS_SINK_MACHINE(machine)) { return(gtk_image_new_from_pixbuf(singleton->priv->sink_machine_pixbuf)); } return(NULL); } /** * bt_ui_resources_get_icon_image_by_machine_type: * @machine_type: the machine_type to get the image for * * Gets a #GtkImage that matches the given machine type. * * Returns: a #GtkImage widget */ GtkWidget *bt_ui_resources_get_icon_image_by_machine_type(GType machine_type) { if(machine_type==BT_TYPE_SOURCE_MACHINE) { return(gtk_image_new_from_pixbuf(singleton->priv->source_machine_pixbuf)); } else if(machine_type==BT_TYPE_PROCESSOR_MACHINE) { return(gtk_image_new_from_pixbuf(singleton->priv->processor_machine_pixbuf)); } else if(machine_type==BT_TYPE_SINK_MACHINE) { return(gtk_image_new_from_pixbuf(singleton->priv->sink_machine_pixbuf)); } return(NULL); } /** * bt_ui_resources_get_gdk_color: * @color_type: the color id * * Gets a prealocated color by id. * * Returns: the requested #GdkColor. */ GdkColor *bt_ui_resources_get_gdk_color(BtUIResourcesColors color_type) { return(&singleton->priv->colors[color_type]); } /** * bt_ui_resources_get_rgb_color: * @color_type: the color id * @r: target for red color part * @g: target for green color part * @b: target for blue color part * * Gets a prealocated color by id. Sets the given parts to values from 0.0 to * 1.0. */ void bt_ui_resources_get_rgb_color(BtUIResourcesColors color_type, gdouble *r, gdouble *g, gdouble *b) { GdkColor *c=&singleton->priv->colors[color_type]; *r=c->red/65535.0; *g=c->green/65535.0; *b=c->blue/65535.0; } /** * bt_ui_resources_get_color_by_machine: * @machine: the machine to get the color for * @color_type: a color shade * * Gets a colors shade depending on machine type in rgba format. * * Returns: a color depending on machine class and color_type */ guint32 bt_ui_resources_get_color_by_machine(const BtMachine *machine,BtUIResourcesMachineColors color_type) { gulong ix=0; guint32 color=0; GdkColor *c; if(BT_IS_SOURCE_MACHINE(machine)) { ix=BT_UI_RES_COLOR_SOURCE_MACHINE_BASE+color_type; } else if(BT_IS_PROCESSOR_MACHINE(machine)) { ix=BT_UI_RES_COLOR_PROCESSOR_MACHINE_BASE+color_type; } else if(BT_IS_SINK_MACHINE(machine)) { ix=BT_UI_RES_COLOR_SINK_MACHINE_BASE+color_type; } c=&singleton->priv->colors[ix]; color=(((guint32)(c->red&0xFF00))<<16)| (((guint32)(c->green&0xFF00))<<8)| ((guint32)(c->blue&0xFF00))| 0x000000FF; //GST_INFO("color[%2d/%1d] : 0x%08lx : %04x,%04x,%04x",ix,color_type,color, // ui_resources->priv->colors[ix].red,ui_resources->priv->colors[ix].green,ui_resources->priv->colors[ix].blue); return(color); } /** * bt_ui_resources_get_accel_group: * * All windows share one accelerator map. * * Returns: the shared keyboard accelerator map */ GtkAccelGroup *bt_ui_resources_get_accel_group(void) { return(singleton->priv->accel_group); } //-- wrapper //-- class internals static void bt_ui_resources_dispose(GObject *object) { BtUIResources *self = BT_UI_RESOURCES(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); GST_DEBUG(" pb->ref_cts: %d, %d, %d", G_OBJECT_REF_COUNT(self->priv->source_machine_pixbuf), G_OBJECT_REF_COUNT(self->priv->processor_machine_pixbuf), G_OBJECT_REF_COUNT(self->priv->sink_machine_pixbuf)); g_object_try_unref(self->priv->source_machine_pixbuf); g_object_try_unref(self->priv->processor_machine_pixbuf); g_object_try_unref(self->priv->sink_machine_pixbuf); bt_ui_resources_free_graphics(self); g_object_try_unref(self->priv->accel_group); G_OBJECT_CLASS(bt_ui_resources_parent_class)->dispose(object); } static GObject *bt_ui_resources_constructor(GType type,guint n_construct_params,GObjectConstructParam *construct_params) { GObject *object; if(G_UNLIKELY(!singleton)) { object=G_OBJECT_CLASS(bt_ui_resources_parent_class)->constructor(type,n_construct_params,construct_params); singleton=BT_UI_RESOURCES(object); g_object_add_weak_pointer(object,(gpointer*)(gpointer)&singleton); // initialise ressources bt_ui_resources_init_colors(singleton); bt_ui_resources_init_icons(singleton); singleton->priv->accel_group=gtk_accel_group_new(); } else { object=g_object_ref(singleton); } return object; } static void bt_ui_resources_init(BtUIResources *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_UI_RESOURCES, BtUIResourcesPrivate); } static void bt_ui_resources_class_init(BtUIResourcesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtUIResourcesPrivate)); gobject_class->constructor = bt_ui_resources_constructor; gobject_class->dispose = bt_ui_resources_dispose; } buzztard-0.6.0/src/ui/edit/settings-page-shortcuts.h0000644042355400116100000000455711625717516017447 00000000000000/* $Id$ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_SETTINGS_PAGE_SHORTCUTS_H #define BT_SETTINGS_PAGE_SHORTCUTS_H #include #include #define BT_TYPE_SETTINGS_PAGE_SHORTCUTS (bt_settings_page_shortcuts_get_type ()) #define BT_SETTINGS_PAGE_SHORTCUTS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_SETTINGS_PAGE_SHORTCUTS, BtSettingsPageShortcuts)) #define BT_SETTINGS_PAGE_SHORTCUTS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_SETTINGS_PAGE_SHORTCUTS, BtSettingsPageShortcutsClass)) #define BT_IS_SETTINGS_PAGE_SHORTCUTS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_SETTINGS_PAGE_SHORTCUTS)) #define BT_IS_SETTINGS_PAGE_SHORTCUTS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_SETTINGS_PAGE_SHORTCUTS)) #define BT_SETTINGS_PAGE_SHORTCUTS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_SETTINGS_PAGE_SHORTCUTS, BtSettingsPageShortcutsClass)) /* type macros */ typedef struct _BtSettingsPageShortcuts BtSettingsPageShortcuts; typedef struct _BtSettingsPageShortcutsClass BtSettingsPageShortcutsClass; typedef struct _BtSettingsPageShortcutsPrivate BtSettingsPageShortcutsPrivate; /** * BtSettingsPageShortcuts: * * the root window for the editor application */ struct _BtSettingsPageShortcuts { GtkTable parent; /*< private >*/ BtSettingsPageShortcutsPrivate *priv; }; struct _BtSettingsPageShortcutsClass { GtkTableClass parent; }; GType bt_settings_page_shortcuts_get_type(void) G_GNUC_CONST; BtSettingsPageShortcuts *bt_settings_page_shortcuts_new(void); #endif // BT_SETTINGS_PAGE_SHORTCUTS_H buzztard-0.6.0/src/ui/edit/main-window.c0000644042355400116100000012144111666705670015060 00000000000000/* $Id: main-window.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainwindow * @short_description: root buzztard editor window * * The main window class is a container for the #BtMainMenu, the #BtMainToolbar, * the #BtMainStatusbar and the #BtMainPages tabbed notebook. */ #define BT_EDIT #define BT_MAIN_WINDOW_C #include "bt-edit.h" enum { MAIN_WINDOW_TOOLBAR=1, MAIN_WINDOW_STATUSBAR, MAIN_WINDOW_PAGES, MAIN_WINDOW_DIALOG }; struct _BtMainWindowPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the menu of the window */ BtMainMenu *menu; /* the toolbar of the window */ BtMainToolbar *toolbar; /* the content pages of the window */ BtMainPages *pages; /* the statusbar of the window */ BtMainStatusbar *statusbar; /* active dialog */ GtkDialog *dialog; /* file-chooser stuff */ GtkFileChooser *file_chooser; GList *filters; gchar *last_folder; }; enum { TARGET_URI_LIST }; static GtkTargetEntry drop_types[] = { { "text/uri-list", 0, TARGET_URI_LIST } }; static gint n_drop_types = sizeof(drop_types) / sizeof(GtkTargetEntry); //-- the class static void bt_main_window_child_proxy_init(gpointer const g_iface, gconstpointer const iface_data); #ifndef USE_HILDON G_DEFINE_TYPE_WITH_CODE (BtMainWindow, bt_main_window, GTK_TYPE_WINDOW, #else G_DEFINE_TYPE_WITH_CODE (BtMainWindow, bt_main_window, HILDON_TYPE_WINDOW, #endif G_IMPLEMENT_INTERFACE (BT_TYPE_CHILD_PROXY, bt_main_window_child_proxy_init)); //-- helper methods /* update the filename to have an extension, matching the selected format */ static gchar* update_filename_ext(const BtMainWindow *self,gchar *file_name,gint format_ix) { GtkFileFilter *this_filter,*that_filter; gchar *new_file_name=NULL; gchar *ext; const GList *plugins, *pnode, *fnode; BtSongIOModuleInfo *info; guint ix; plugins=bt_song_io_get_module_info_list(); //this_filter=gtk_file_chooser_get_filter(self->priv->file_chooser); this_filter=g_list_nth_data(self->priv->filters,format_ix); GST_WARNING("old song name = '%s', filter %p",file_name, this_filter); ext=strrchr(file_name,'.'); if(ext) { ext++; // cut off known extensions for(pnode=plugins,fnode=self->priv->filters;pnode;pnode=g_list_next(pnode)) { info=(BtSongIOModuleInfo *)pnode->data; ix=0; while(info->formats[ix].name) { that_filter=fnode->data; if((this_filter!=that_filter) && !strcmp(ext,info->formats[ix].extension)) { file_name[strlen(file_name)-(strlen(info->formats[ix].extension)+1)]='\0'; GST_INFO("cut fn to: %s",file_name); pnode=NULL; break; } fnode=g_list_next(fnode);ix++; } } } // append new extension for(pnode=plugins,fnode=self->priv->filters;pnode;pnode=g_list_next(pnode)) { info=(BtSongIOModuleInfo *)pnode->data; ix=0; while(info->formats[ix].name) { that_filter=fnode->data; if((this_filter==that_filter) && (!ext || strcmp(ext,info->formats[ix].extension))) { new_file_name=g_strdup_printf("%s.%s",file_name,info->formats[ix].extension); pnode=NULL; break; } fnode=g_list_next(fnode);ix++; } } if(new_file_name && strcmp(file_name,new_file_name)) { GST_WARNING("new song name = '%s'",new_file_name); return (new_file_name); } g_free (new_file_name); return(NULL); } //-- event handler static void on_format_chooser_changed(GtkComboBox *menu, gpointer user_data) { BtMainWindow *self=BT_MAIN_WINDOW(user_data); gint format_ix; gchar *file_name,*new_file_name=NULL; format_ix=gtk_combo_box_get_active(menu); file_name=gtk_file_chooser_get_filename(self->priv->file_chooser); GST_WARNING("Changing %s to extension for %d's filter",file_name,format_ix); if(!file_name) return; if((new_file_name=update_filename_ext(self,file_name,format_ix))) { gchar *name; name=strrchr(new_file_name,G_DIR_SEPARATOR); //gtk_file_chooser_set_filename(self->priv->file_chooser,new_file_name); gtk_file_chooser_set_current_name(self->priv->file_chooser,name?&name[1]:new_file_name); } g_free(file_name); g_free(new_file_name); } static gboolean on_window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { BtMainWindow *self=BT_MAIN_WINDOW(user_data); GST_INFO("delete event occurred"); // returning TRUE means, we don't want the window to be destroyed return(!bt_edit_application_quit(self->priv->app)); } static void on_window_destroy(GtkWidget *widget, gpointer user_data) { GST_INFO("destroy occurred"); if(gtk_main_level()) { GST_INFO(" leaving main-loop"); gtk_main_quit(); } } static void on_song_unsaved_changed(const GObject *object,GParamSpec *arg,gpointer user_data) { BtMainWindow *self=BT_MAIN_WINDOW(user_data); gboolean unsaved=bt_edit_application_is_song_unsaved(self->priv->app); BtSong *song; BtSongInfo *song_info; gchar *title,*name; // compose title g_object_get(self->priv->app,"song",&song,NULL); if(!song) return; g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"name",&name,NULL); // we don't use PACKAGE_NAME = 'buzztard' for the window title title=g_strdup_printf("%s (%s) - Buzztard",name,(unsaved?_("unsaved"):_("saved")));g_free(name); gtk_window_set_title(GTK_WINDOW(self), title); g_free(title); //-- release the references g_object_unref(song_info); g_object_unref(song); GST_INFO("song.unsaved has changed : song=%p, menu=%p, unsaved=%d",song,user_data,unsaved); } static void on_window_dnd_drop(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint t, gpointer user_data) { BtMainWindow *self=BT_MAIN_WINDOW(user_data); glong i=0; gchar *data=(gchar *)gtk_selection_data_get_data(selection_data); gchar *ptr=data; GST_INFO("something has been dropped on our app: window=%p data='%s'",user_data,data); // find first \0 or \n or \r while((*ptr) && (*ptr!='\n') && (*ptr!='\r')) { ptr++;i++; } if(i) { gchar *file_name=g_strndup(data,i); gboolean res=TRUE; if(!bt_edit_application_load_song(self->priv->app,file_name)) { gchar *msg=g_strdup_printf(_("An error occurred while loading the song from file '%s'"),file_name); bt_dialog_message(self,_("Can't load song"),_("Can't load song"),msg); g_free(msg); res=FALSE; } gtk_drag_finish(dc,res,FALSE,t); g_free(file_name); } } /* just for testing static gboolean on_window_event(GtkWidget *widget, GdkEvent *event, gpointer user_data) { if(event->type==GDK_BUTTON_PRESS) { GdkEventButton *e=(GdkEventButton*)event; GST_INFO("type=%4d, window=%p, send_event=%3d, time=%8d",e->type,e->window,e->send_event,e->time); GST_INFO("x=%6.4lf, y=%6.4lf, axes=%p, state=%4d",e->x,e->y,e->axes,e->state); GST_INFO("button=%4d, device=%p, x_root=%6.4lf, y_root=%6.4lf\n",e->button,e->device,e->x_root,e->y_root); } return(FALSE); } */ static gchar* bt_main_window_make_unsaved_changes_message(const BtSong *song) { BtSongInfo *song_info; gchar *msg,*dts,*file_name,*since; gchar hdts[200]; struct tm tm={0,}; time_t t,tn; gdouble td; gint tds,tdm,tdh; g_object_get((GObject *)song,"song-info",&song_info,NULL); g_object_get(song_info,"change-dts",&dts,"file-name",&file_name,NULL); // figure UTC local tz offset t=time(NULL); tn=mktime(localtime(&t)); td=difftime(tn,mktime(gmtime(&t))); // convert timestamp to human readable format (and local timezone) strptime(dts, "%FT%TZ", &tm); // need to apply td for UTC->localtime t=mktime(&tm)+(int)td; strftime(hdts,199,"%c",localtime(&t)); GST_LOG("timezone delta: '%s', td=%lf",dts,td); // pretty print how much time passed since saved/created and now td=difftime(tn,t); GST_LOG("time passed since saved/created: td=%lf",td); tdh=td/(60*60); td-=tdh*(60*60); tdm=td/60; td-=tdm*60; tds=(gint)td; // unfortunately ngettext does not support multiple plural words in one sentence if(tdh!=0) { since=g_strdup_printf(_("%d %s and %d %s"),tdh,(tdh==1)?_("hour"):_("hours"),tdm,(tdm==1)?_("minute"):_("minutes")); } else if(tdm!=0) { since=g_strdup_printf(_("%d %s and %d %s"),tdm,(tdm==1)?_("minute"):_("minutes"),tds,(tds==1)?_("second"):_("seconds")); } else { since=g_strdup_printf(_("%d %s"),tds,(tds==1)?_("second"):_("seconds")); } // arguments are the time passed as e.g. in " 5 seconds" and the last saved, created time if(file_name) msg=g_strdup_printf(_("All unsaved changes since %s will be lost. This song was last saved on: %s"),since,hdts); else msg=g_strdup_printf(_("All unsaved changes since %s will be lost. This song was created on: %s"),since,hdts); g_free(dts); g_free(file_name); g_free(since); g_object_unref(song_info); return(msg); } //-- helper methods static void bt_main_window_init_ui(const BtMainWindow *self) { GtkWidget *box; GdkPixbuf *window_icon; BtChangeLog *change_log; gtk_widget_set_name(GTK_WIDGET(self),"main window"); gtk_window_set_role(GTK_WINDOW(self),"buzztard-edit::main"); // create and set window icon if((window_icon=gdk_pixbuf_new_from_theme("buzztard",16))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } // create main layout container box=gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(self),box); GST_INFO("before creating content, app->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->app)); // add the menu-bar self->priv->menu=bt_main_menu_new(); #ifndef USE_HILDON gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->menu),FALSE,FALSE,0); #else hildon_window_set_menu(HILDON_WINDOW(self), GTK_MENU(self->priv->menu)); #endif // add the tool-bar self->priv->toolbar=bt_main_toolbar_new(); #ifndef USE_HILDON gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->toolbar),FALSE,FALSE,0); #else hildon_window_add_toolbar(HILDON_WINDOW(self), GTK_TOOLBAR(self->priv->toolbar)); #endif // add the window content pages self->priv->pages=bt_main_pages_new(); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->pages),TRUE,TRUE,0); // add the status bar self->priv->statusbar=bt_main_statusbar_new(); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->statusbar),FALSE,FALSE,0); gtk_window_add_accel_group(GTK_WINDOW(self),bt_ui_resources_get_accel_group()); gtk_drag_dest_set(GTK_WIDGET(self), (GtkDestDefaults) (GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP), drop_types, n_drop_types, GDK_ACTION_COPY); g_signal_connect((gpointer)self, "drag-data-received", G_CALLBACK(on_window_dnd_drop),(gpointer)self); GST_INFO("content created, app->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->app)); g_signal_connect((gpointer)self,"delete-event", G_CALLBACK(on_window_delete_event),(gpointer)self); g_signal_connect((gpointer)self,"destroy", G_CALLBACK(on_window_destroy),(gpointer)self); /* just for testing g_signal_connect((gpointer)self,"event",G_CALLBACK(on_window_event),(gpointer)self); */ g_signal_connect(self->priv->app, "notify::unsaved", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); change_log=bt_change_log_new(); g_signal_connect(change_log, "notify::can-undo", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); g_object_unref(change_log); GST_INFO("signal connected, app->ref_ct=%d",G_OBJECT_REF_COUNT(self->priv->app)); } //-- constructor methods /** * bt_main_window_new: * * Create a new instance * * Returns: the new instance */ BtMainWindow *bt_main_window_new(void) { BtMainWindow *self; BtSettings *settings; gboolean toolbar_hide,statusbar_hide,tabs_hide; gint x, y, w, h; GST_INFO("creating a new window"); self=BT_MAIN_WINDOW(g_object_new(BT_TYPE_MAIN_WINDOW,"type",GTK_WINDOW_TOPLEVEL,NULL)); GST_INFO("new main_window created"); bt_main_window_init_ui(self); GST_INFO("new main_window layouted"); // eventualy hide the toolbar g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings, "toolbar-hide",&toolbar_hide, "statusbar-hide",&statusbar_hide, "tabs-hide",&tabs_hide, "window-xpos",&x,"window-ypos",&y,"window-width",&w,"window-height",&h, NULL); g_object_unref(settings); // this enforces a minimum size //gtk_widget_set_size_request(GTK_WIDGET(self),800,600); // this causes a problem with resizing the sequence-view //gtk_window_set_default_size(GTK_WINDOW(self),800,600); // this is deprecated //gtk_widget_set_usize(GTK_WIDGET(self), 800,600); // use position from settings if(w>=0 && h>=0) { /* ensure that we can see the window - would also need to check against * gdk_screen_get_width/height. Also as it seems the position is ignored if(xpriv->toolbar)); } if(statusbar_hide) { gtk_widget_hide(GTK_WIDGET(self->priv->statusbar)); } if(tabs_hide) { gtk_notebook_set_show_tabs(GTK_NOTEBOOK(self->priv->pages),FALSE); } GST_INFO("new main_window shown"); return(self); } //-- methods /** * bt_main_window_check_unsaved_song: * @self: the main window instance * @title: the title of the message * @headline: the bold headline of the message * * Checks if the current song is modified and asks for confirmation to continue * (and loose the changes). It only considers the undo/redo stack and not minor * changes such as switching tabs or selecting something. * * Returns: %TRUE if the user has confirmed to continue */ gboolean bt_main_window_check_unsaved_song(const BtMainWindow *self,const gchar *title,const gchar *headline) { gboolean res=TRUE; BtSong *song; g_object_get(self->priv->app,"song",&song,NULL); if(song) { BtChangeLog *change_log; gboolean unsaved; change_log=bt_change_log_new(); g_object_get(change_log,"can-undo",&unsaved,NULL); g_object_unref(change_log); if(unsaved) { gchar *msg; msg=bt_main_window_make_unsaved_changes_message(song); res=bt_dialog_question(self,title,headline,msg); g_free(msg); } g_object_unref(song); } return(res); } /** * bt_main_window_check_quit: * @self: the main window instance * * Displays a dialog box, that asks the user to confirm exiting the application. * * Returns: %TRUE if the user has confirmed to exit */ gboolean bt_main_window_check_quit(const BtMainWindow *self) { return(bt_main_window_check_unsaved_song(self,_("Really quit?"),_("Really quit?"))); } /** * bt_main_window_new_song: * @self: the main window instance * * Prepares a new song. Triggers cleaning up the old song and refreshes the ui. */ void bt_main_window_new_song(const BtMainWindow *self) { if(!bt_main_window_check_unsaved_song(self,_("New song?"),_("New song?"))) return; if(!bt_edit_application_new_song(self->priv->app)) { // @todo show error message (from where? and which error?) } } /** * bt_main_window_open_song: * @self: the main window instance * * Opens a dialog box, where the user can choose a song to load. * If the dialog is not canceld, the old song will be freed, the new song will * be loaded and the ui will be refreshed upon success. */ void bt_main_window_open_song(const BtMainWindow *self) { BtSettings *settings; gint result; gchar *folder_name,*file_name=NULL; GtkFileFilter *filter,*filter_all; const GList *plugins, *node; BtSongIOModuleInfo *info; guint ix; if(!bt_main_window_check_unsaved_song(self,_("Load new song?"),_("Load new song?"))) return; self->priv->dialog=GTK_DIALOG(gtk_file_chooser_dialog_new(_("Open a song"), GTK_WINDOW(self), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->dialog)); // store for format-changed signal handler self->priv->file_chooser=GTK_FILE_CHOOSER(self->priv->dialog); // set filters filter_all=gtk_file_filter_new(); gtk_file_filter_set_name(filter_all,"all supported files"); plugins=bt_song_io_get_module_info_list(); for(node=plugins;node;node=g_list_next(node)) { info=(BtSongIOModuleInfo *)node->data; ix=0; while(info->formats[ix].name) { filter=gtk_file_filter_new(); gtk_file_filter_set_name(filter,info->formats[ix].name); gtk_file_filter_add_mime_type(filter,info->formats[ix].mime_type); gtk_file_filter_add_mime_type(filter_all,info->formats[ix].mime_type); #if !GLIB_CHECK_VERSION(2,22,2) /* workaround for http://bugzilla.gnome.org/show_bug.cgi?id=541236 * - see also main-menu.c * - git describe e63262d49d40a36060613fb1d0ed468ca5dddc19 */ if(!strcmp(info->formats[ix].mime_type,"audio/x-bzt-xml")) { gtk_file_filter_add_pattern(filter,"*.xml"); gtk_file_filter_add_pattern(filter_all,"*.xml"); } #endif gtk_file_chooser_add_filter(self->priv->file_chooser,filter); ix++; } } gtk_file_chooser_add_filter(self->priv->file_chooser,filter_all); filter=gtk_file_filter_new(); gtk_file_filter_set_name(filter,"all files"); gtk_file_filter_add_pattern(filter,"*"); gtk_file_chooser_add_filter(self->priv->file_chooser,filter); // set default filter gtk_file_chooser_set_filter(self->priv->file_chooser,filter_all); // set a default songs folder //gtk_file_chooser_set_current_folder(self->priv->file_chooser,DATADIR""G_DIR_SEPARATOR_S""PACKAGE""G_DIR_SEPARATOR_S"songs"G_DIR_SEPARATOR_S); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"song-folder",&folder_name,NULL); // reuse last folder (store in self, if we loaded something gtk_file_chooser_set_current_folder(self->priv->file_chooser,self->priv->last_folder?self->priv->last_folder:folder_name); gtk_file_chooser_add_shortcut_folder(self->priv->file_chooser,folder_name,NULL); // @todo: if folder != default it would be nice to show the default as well, unfortunately we can't name the shortcuts // - maybe we should only install real demo songs g_free(folder_name); g_object_unref(settings); gtk_widget_show_all(GTK_WIDGET(self->priv->dialog)); g_object_notify((gpointer)self, "dialog"); result=gtk_dialog_run(self->priv->dialog); switch(result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: file_name=gtk_file_chooser_get_filename(self->priv->file_chooser); // remember last folder g_free(self->priv->last_folder); self->priv->last_folder=gtk_file_chooser_get_current_folder(self->priv->file_chooser); break; case GTK_RESPONSE_REJECT: case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_CLOSE: break; default: GST_WARNING("unhandled response code = %d",result); } gtk_widget_destroy(GTK_WIDGET(self->priv->dialog)); self->priv->dialog=NULL; g_object_notify((gpointer)self, "dialog"); // load after destoying the dialog, otherwise it stays open all time if(file_name) { if(!bt_edit_application_load_song(self->priv->app,file_name)) { gchar *msg=g_strdup_printf(_("An error occurred while loading the song from file '%s'"),file_name); bt_dialog_message(self,_("Can't load song"),_("Can't load song"),msg); g_free(msg); } else { // store recent file GtkRecentManager *manager=gtk_recent_manager_get_default(); gchar *uri=g_filename_to_uri(file_name,NULL,NULL); if(!gtk_recent_manager_add_item(manager, uri)) { GST_WARNING("Can't store recent file"); } g_free(uri); } g_free(file_name); } } /** * bt_main_window_save_song: * @self: the main window instance * * Save the song to disk. * If it is a new song it will ask for a file_name and location. */ void bt_main_window_save_song(const BtMainWindow *self) { BtSong *song; BtSongInfo *song_info; gchar *file_name=NULL; // get songs file-name g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"file-name",&file_name,NULL); // check the file_name of the song if(file_name) { if(!bt_edit_application_save_song(self->priv->app,file_name)) { gchar *msg=g_strdup_printf(_("An error occurred while saving the song to file '%s'."),file_name); bt_dialog_message(self,_("Can't save song"),_("Can't save song"),msg); g_free(msg); } } else { // it is a new song bt_main_window_save_song_as(self); } g_free(file_name); g_object_unref(song_info); g_object_unref(song); } /** * bt_main_window_save_song_as: * @self: the main window instance * * Opens a dialog box, where the user can choose a file_name and location to save * the song under. */ void bt_main_window_save_song_as(const BtMainWindow *self) { BtSettings *settings; BtSong *song; BtSongInfo *song_info; gchar *name,*folder_name,*file_name=NULL; gchar *old_file_name=NULL; gchar *ext; gint result; GtkWidget *format_chooser,*box; GtkFileFilter *filter,*filter_all; const GList *plugins, *node; BtSongIOModuleInfo *info; BtSongIOClass *songio_class; guint ix; //gchar *glob; self->priv->dialog=GTK_DIALOG(gtk_file_chooser_dialog_new(_("Save a song"), GTK_WINDOW(self), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL)); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(self->priv->dialog)); // store for format-changed signal handler self->priv->file_chooser=GTK_FILE_CHOOSER(self->priv->dialog); // set filters and build format selector format_chooser=gtk_combo_box_text_new(); filter_all=gtk_file_filter_new(); gtk_file_filter_set_name(filter_all,"all supported files"); plugins=bt_song_io_get_module_info_list(); for(node=plugins;node;node=g_list_next(node)) { info=(BtSongIOModuleInfo *)node->data; ix=0; while(info->formats[ix].name) { songio_class=(BtSongIOClass *)g_type_class_ref(info->formats[ix].type); if(!songio_class->save) { GST_DEBUG("songio module %s supports no saving", info->formats[ix].name); ix++; continue; } filter=gtk_file_filter_new(); gtk_file_filter_set_name(filter,info->formats[ix].name); gtk_file_filter_add_mime_type(filter,info->formats[ix].mime_type); //glob=g_strconcat("*.",info->formats[ix].extension,NULL); //gtk_file_filter_add_pattern(filter,g_strconcat(glob,NULL)); //g_free(glob); gtk_file_filter_add_mime_type(filter_all,info->formats[ix].mime_type); #if 1 //#if !GLIB_CHECK_VERSION(2,22,0) /* workaround for http://bugzilla.gnome.org/show_bug.cgi?id=541236 * should be fixed, but is not :/ */ if(!strcmp(info->formats[ix].mime_type,"audio/x-bzt-xml")) { gtk_file_filter_add_pattern(filter,"*.xml"); gtk_file_filter_add_pattern(filter_all,"*.xml"); } #endif gtk_file_chooser_add_filter(self->priv->file_chooser,filter); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(format_chooser),info->formats[ix].name); GST_DEBUG("add filter %p for %s/%s/%s", filter, info->formats[ix].name, info->formats[ix].mime_type, info->formats[ix].extension); ix++; self->priv->filters=g_list_append(self->priv->filters,filter); } } gtk_file_chooser_add_filter(self->priv->file_chooser,filter_all); filter=gtk_file_filter_new(); gtk_file_filter_set_name(filter,"all files"); gtk_file_filter_add_pattern(filter,"*"); gtk_file_chooser_add_filter(self->priv->file_chooser,filter); // set default filter - not here, only in load //gtk_file_chooser_set_filter(self->priv->file_chooser,filter_all); // get songs file-name g_object_get(self->priv->app,"song",&song,"settings",&settings,NULL); g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"name",&name,"file-name",&file_name,NULL); g_object_get(settings,"song-folder",&folder_name,NULL); gtk_file_chooser_add_shortcut_folder(self->priv->file_chooser,folder_name,NULL); if(!file_name) { gchar *new_file_name; // add extension info=(BtSongIOModuleInfo *)plugins->data; new_file_name=g_strdup_printf("%s.%s",name,info->formats[0].extension); GST_DEBUG("use defaults %s/%s",folder_name,new_file_name); /* the user just created a new document */ gtk_file_chooser_set_current_folder(self->priv->file_chooser, folder_name); gtk_file_chooser_set_current_name(self->priv->file_chooser, new_file_name); gtk_combo_box_set_active(GTK_COMBO_BOX(format_chooser),0); g_free(new_file_name); } else { gboolean found=FALSE; GtkFileFilterInfo ffi = { GTK_FILE_FILTER_FILENAME|GTK_FILE_FILTER_DISPLAY_NAME, file_name, NULL, // uri file_name, NULL // mime-type }; /* the user edited an existing document */ gtk_file_chooser_set_filename(self->priv->file_chooser,file_name); GST_DEBUG("use existing %s",file_name); /* select the format of this file */ for(node=self->priv->filters,ix=0;node;node=g_list_next(node),ix++) { filter=node->data; if(gtk_file_filter_filter(filter,&ffi)) { /* @bug: it matches, but this does not update the filter * https://bugzilla.gnome.org/show_bug.cgi?id=590941 * fixed in gtk-2.17.X */ GST_DEBUG("use last path %s, format is '%s', filter %p",file_name,gtk_file_filter_get_name(filter),filter); gtk_file_chooser_set_filter(self->priv->file_chooser,filter); gtk_combo_box_set_active(GTK_COMBO_BOX(format_chooser),ix); found=TRUE; break; } } if(!found) { ext=strrchr(file_name,'.'); if(ext && ext[1]) { const GList *pnode,*fnode=self->priv->filters; /* gtk_file_filter_filter() seems to be buggy :/ * try matching the extension */ ext++; GST_DEBUG("file_filter matching failed, match extension '%s'",ext); for(pnode=plugins;(pnode && !found);pnode=g_list_next(pnode)) { info=(BtSongIOModuleInfo *)pnode->data; ix=0; while(info->formats[ix].name && !found) { // we ref the class above songio_class=(BtSongIOClass *)g_type_class_peek_static(info->formats[ix].type); if(!songio_class->save) { GST_DEBUG("songio module %s supports no saving", info->formats[ix].name); ix++; continue; } if(!strcmp(ext,info->formats[ix].extension)) { filter=fnode->data; /* @bug: it matches, but this does not update the filter * https://bugzilla.gnome.org/show_bug.cgi?id=590941 * fixed in gtk-2.17.X */ GST_DEBUG("format is '%s', filter %p",gtk_file_filter_get_name(filter),filter); gtk_file_chooser_set_filter(self->priv->file_chooser,filter); gtk_combo_box_set_active(GTK_COMBO_BOX(format_chooser),ix); found=TRUE; } else { ix++; fnode=g_list_next(fnode); } } } } } } old_file_name=file_name;file_name=NULL; g_free(folder_name); g_free(name); g_object_unref(settings); g_object_unref(song_info); g_object_unref(song); // add format selection to dialog box=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Format")),FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(box),format_chooser,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(self->priv->dialog)),box,FALSE,FALSE,0); g_signal_connect(format_chooser, "changed", G_CALLBACK(on_format_chooser_changed), (gpointer)self); gtk_widget_show_all(GTK_WIDGET(self->priv->dialog)); g_object_notify((gpointer)self, "dialog"); result=gtk_dialog_run(self->priv->dialog); switch(result) { case GTK_RESPONSE_ACCEPT: case GTK_RESPONSE_OK: { file_name=gtk_file_chooser_get_filename(self->priv->file_chooser); // remember last folder g_free(self->priv->last_folder); self->priv->last_folder=gtk_file_chooser_get_current_folder(self->priv->file_chooser); } break; case GTK_RESPONSE_REJECT: case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_CLOSE: break; default: GST_WARNING("unhandled response code = %d",result); } gtk_widget_destroy(GTK_WIDGET(self->priv->dialog)); self->priv->dialog=NULL; g_object_notify((gpointer)self, "dialog"); g_list_free(self->priv->filters); self->priv->filters=NULL; // save after destoying the dialog, otherwise it stays open all time if(file_name) { FILE *file; gboolean cont=TRUE; GST_WARNING("song name = '%s'",file_name); if((file=fopen(file_name,"rb"))) { GST_INFO("file already exists"); // it already exists, ask the user what to do (do not save, choose new name, overwrite song) cont=bt_dialog_question(self, _("File already exists"), _("File already exists"), _("Choose 'Okay' to overwrite or 'Cancel' to abort saving the song.")); fclose(file); } else { const gchar *reason=(const gchar *)g_strerror(errno); gchar *msg; GST_INFO("file '%s' can not be opened : %d : %s",file_name,errno,reason); switch(errno) { case EACCES: // Permission denied. cont=FALSE; msg=g_strdup_printf(_("An error occurred while writing the file '%s': %s"),file_name,reason); bt_dialog_message(self,_("Can't save song"),_("Can't save song"),msg); g_free(msg); break; default: // ENOENT A component of the path file_name does not exist, or the path is an empty string. // -> just save break; } } if(cont) { if(!bt_edit_application_save_song(self->priv->app,file_name)) { gchar *msg=g_strdup_printf(_("An error occurred saving the song to file '%s'."),file_name); bt_dialog_message(self,_("Can't save song"),_("Can't save song"),msg); g_free(msg); } else { // store recent file GtkRecentManager *manager=gtk_recent_manager_get_default(); gchar *uri; if(old_file_name) { uri=g_filename_to_uri(old_file_name,NULL,NULL); if(!gtk_recent_manager_remove_item(manager, uri, NULL)) { GST_WARNING("Can't store recent file"); } g_free(uri); } uri=g_filename_to_uri(file_name,NULL,NULL); if(!gtk_recent_manager_add_item(manager, uri)) { GST_WARNING("Can't store recent file"); } g_free(uri); } } g_free(file_name); } g_free(old_file_name); } // @todo use GtkMessageDialog for the next two /** * bt_dialog_message: * @self: the applications main window * @title: the title of the message * @headline: the bold headline of the message * @message: the message itself * * Displays a modal message dialog, that needs to be confirmed with "Okay". */ void bt_dialog_message(const BtMainWindow *self,const gchar *title,const gchar *headline,const gchar *message) { GtkWidget *label,*icon,*box; gchar *str; g_return_if_fail(BT_IS_MAIN_WINDOW(self)); g_return_if_fail(BT_IS_STRING(title)); g_return_if_fail(BT_IS_STRING(headline)); g_return_if_fail(BT_IS_STRING(message)); self->priv->dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title, GTK_WINDOW(self), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL)); box=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); // @todo: when to use GTK_STOCK_DIALOG_WARNING ? icon=gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_DIALOG); gtk_container_add(GTK_CONTAINER(box),icon); // @idea if headline is NULL use title ? str=g_strdup_printf("%s\n\n%s",headline,message); label=g_object_new(GTK_TYPE_LABEL, "use-markup",TRUE,"selectable",TRUE,"wrap",TRUE, "label",str, NULL); g_free(str); gtk_container_add(GTK_CONTAINER(box),label); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(self->priv->dialog)),box); gtk_widget_show_all(GTK_WIDGET(self->priv->dialog)); g_object_notify((gpointer)self, "dialog"); gtk_dialog_run(self->priv->dialog); gtk_widget_destroy(GTK_WIDGET(self->priv->dialog)); self->priv->dialog=NULL; g_object_notify((gpointer)self, "dialog"); } /** * bt_dialog_question: * @self: the applications main window * @title: the title of the message * @headline: the bold headline of the message * @message: the message itself * * Displays a modal question dialog, that needs to be confirmed with "Okay" or aborted with "Cancel". * Returns: %TRUE for Okay, %FALSE otherwise */ gboolean bt_dialog_question(const BtMainWindow *self,const gchar *title,const gchar *headline,const gchar *message) { gboolean result=FALSE; gint answer; GtkWidget *label,*icon,*box; gchar *str; g_return_val_if_fail(BT_IS_MAIN_WINDOW(self),FALSE); g_return_val_if_fail(BT_IS_STRING(title),FALSE); g_return_val_if_fail(BT_IS_STRING(headline),FALSE); g_return_val_if_fail(BT_IS_STRING(message),FALSE); self->priv->dialog = GTK_DIALOG(gtk_dialog_new_with_buttons(title, GTK_WINDOW(self), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, NULL)); box=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); icon=gtk_image_new_from_stock(GTK_STOCK_DIALOG_QUESTION,GTK_ICON_SIZE_DIALOG); gtk_container_add(GTK_CONTAINER(box),icon); // @idea if headline is NULL use title ? str=g_strdup_printf("%s\n\n%s",headline,message); label=g_object_new(GTK_TYPE_LABEL, "use-markup",TRUE,"selectable",TRUE,"wrap",TRUE, "label",str, NULL); g_free(str); gtk_container_add(GTK_CONTAINER(box),label); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(self->priv->dialog)),box); gtk_widget_show_all(GTK_WIDGET(self->priv->dialog)); g_object_notify((gpointer)self, "dialog"); answer=gtk_dialog_run(self->priv->dialog); switch(answer) { case GTK_RESPONSE_ACCEPT: result=TRUE; break; case GTK_RESPONSE_REJECT: result=FALSE; break; default: GST_WARNING("unhandled response code = %d",answer); } gtk_widget_destroy(GTK_WIDGET(self->priv->dialog)); self->priv->dialog=NULL; g_object_notify((gpointer)self, "dialog"); GST_INFO("bt_dialog_question(\"%s\") = %d",title,result); return(result); } //-- child proxy interface static GObject *bt_main_window_child_proxy_get_child_by_name(BtChildProxy *child_proxy,const gchar *name) { BtMainWindow *self=BT_MAIN_WINDOW(child_proxy); GObject *res=NULL; if(!strcmp("toolbar",name)) { res=(GObject *)self->priv->toolbar; } else if(!strcmp("pages",name)) { res=(GObject *)self->priv->pages; } else if(!strcmp("statusbar",name)) { res=(GObject *)self->priv->statusbar; } else { GST_WARNING("no child %s in main_window",name); } if(res) g_object_ref(res); return res; } static GObject *bt_main_window_child_proxy_get_child_by_index(BtChildProxy *child_proxy,guint index) { BtMainWindow *self=BT_MAIN_WINDOW(child_proxy); GObject *res=NULL; switch(index) { case 0: res=(GObject *)self->priv->toolbar; break; case 1: res=(GObject *)self->priv->pages; break; case 2: res=(GObject *)self->priv->statusbar; break; default: GST_WARNING("no child %d in main_window",index); break; } if(res) g_object_ref(res); return res; } static guint bt_main_window_child_proxy_get_children_count(BtChildProxy *child_proxy) { return 3; } static void bt_main_window_child_proxy_init(gpointer const g_iface,gconstpointer const iface_data) { BtChildProxyInterface *iface=g_iface; iface->get_child_by_name=bt_main_window_child_proxy_get_child_by_name; iface->get_child_by_index=bt_main_window_child_proxy_get_child_by_index; iface->get_children_count=bt_main_window_child_proxy_get_children_count; } //-- wrapper //-- class internals static void bt_main_window_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMainWindow *self = BT_MAIN_WINDOW(object); return_if_disposed(); switch (property_id) { case MAIN_WINDOW_TOOLBAR: { g_value_set_object(value, self->priv->toolbar); } break; case MAIN_WINDOW_STATUSBAR: { g_value_set_object(value, self->priv->statusbar); } break; case MAIN_WINDOW_PAGES: { g_value_set_object(value, self->priv->pages); } break; case MAIN_WINDOW_DIALOG: { g_value_set_object(value, self->priv->dialog); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_main_window_dispose(GObject *object) { BtMainWindow *self = BT_MAIN_WINDOW(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); //g_signal_handlers_disconnect_matched(self,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_window_delete_event,NULL); //g_signal_handlers_disconnect_matched(self,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_window_destroy,NULL); g_object_unref(self->priv->app); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_window_parent_class)->dispose(object); GST_DEBUG(" done"); } static void bt_main_window_finalize(GObject *object) { BtMainWindow *self = BT_MAIN_WINDOW(object); GST_DEBUG("!!!! self=%p, ref_ct=%d",self,G_OBJECT_REF_COUNT(self)); g_free(self->priv->last_folder); G_OBJECT_CLASS(bt_main_window_parent_class)->finalize(object); GST_DEBUG(" done"); } static void bt_main_window_init(BtMainWindow *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_WINDOW, BtMainWindowPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_main_window_class_init(BtMainWindowClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainWindowPrivate)); gobject_class->get_property = bt_main_window_get_property; gobject_class->dispose = bt_main_window_dispose; gobject_class->finalize = bt_main_window_finalize; g_object_class_install_property(gobject_class,MAIN_WINDOW_TOOLBAR, g_param_spec_object("toolbar", "toolbar prop", "Get the toolbar", BT_TYPE_MAIN_TOOLBAR, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_WINDOW_STATUSBAR, g_param_spec_object("statusbar", "statusbar prop", "Get the status bar", BT_TYPE_MAIN_STATUSBAR, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_WINDOW_PAGES, g_param_spec_object("pages", "pages prop", "Get the pages widget", BT_TYPE_MAIN_PAGES, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MAIN_WINDOW_DIALOG, g_param_spec_object("dialog", "dialog prop", "Get the active dialog", GTK_TYPE_DIALOG, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/about-dialog.c0000644042355400116100000001660211666464237015201 00000000000000/* $Id: about-dialog.c 3735 2011-12-02 23:38:35Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btaboutdialog * @short_description: class for the editor about dialog * * Info about the project, people involved, license and so on. */ #define BT_EDIT #define BT_ABOUT_DIALOG_C #include "bt-edit.h" struct _BtAboutDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; }; //-- the class G_DEFINE_TYPE (BtAboutDialog, bt_about_dialog, GTK_TYPE_ABOUT_DIALOG); //-- event handler #if !GTK_CHECK_VERSION(2,18,0) static void on_about_dialog_url_clicked(GtkAboutDialog *about, const gchar *link, gpointer user_data) { gtk_show_uri_simple(GTK_WIDGET(about),link); } #endif //-- helper methods static void bt_about_dialog_init_ui(const BtAboutDialog *self) { GtkWidget *news,*news_view; const gchar *authors[] = { "Stefan 'ensonic' Sauer ", "Krzysztof Foltman ", "Thomas 'waffel' Wabner ", "Patric Schmitz ", NULL }; const gchar *documenters[] = { "Stefan 'ensonic' Kost ", NULL }; const gchar *artists[] = { "Marc 'marcbroe' Broekhuis ", "Jakub Steiner ", NULL }; /* Note to translators: put here your name and email so it will show up in * the "about" box. Example: Stefan 'ensonic' Sauer */ gchar *translators =_("translator-credits"); gchar *copyright = g_alloca(strlen(_("Copyright \xc2\xa9 2003-%d Buzztard developer team"))+3); sprintf(copyright,_("Copyright \xc2\xa9 2003-%d Buzztard developer team"),2011); /* we can get logo via icon name, so this here is just for educational purpose GdkPixbuf *logo; GError *error = NULL; logo=gtk_icon_theme_load_icon(gtk_icon_theme_get_default(),"buzztard",48,0,&error); //logo = gdk_pixbuf_new_from_file(DATADIR""G_DIR_SEPARATOR_S"icons"G_DIR_SEPARATOR_S"hicolor"G_DIR_SEPARATOR_S"48x48"G_DIR_SEPARATOR_S"apps"G_DIR_SEPARATOR_S""PACKAGE".png",&error); if(!logo) { GST_WARNING("Couldn't load icon: %s", error->message); g_error_free(error); } */ g_object_set((gpointer)self, "artists",artists, "authors",authors, "comments",_("Music production environment"), "copyright",copyright, "documenters", documenters, /* http://www.gnu.org/licenses/lgpl.html, http://www.gnu.de/lgpl-ger.html */ "license", _( "This package is free software; you can redistribute it and/or " "modify it under the terms of the GNU Library General Public " "License as published by the Free Software Foundation; either " "version 2 of the License, or (at your option) any later version." "\n\n" "This package is distributed in the hope that it will be useful, " "but WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU " "Library General Public License for more details." "\n\n" "You should have received a copy of the GNU Library General Public " "License along with this package; if not, write to the " "Free Software Foundation, Inc., 59 Temple Place - Suite 330, " "Boston, MA 02111-1307, USA." ), "logo-icon-name",PACKAGE_NAME, "translator-credits",(!strcmp(translators,"translator-credits"))?translators:NULL, "version", PACKAGE_VERSION, "website","http://www.buzztard.org", "wrap-license",TRUE, NULL); // install hooks for hyper-links #if !GTK_CHECK_VERSION(2,18,0) // since 2.18 it calls gtk_show_uri() by default and // since 2.24 the hook functions are deprecated gtk_about_dialog_set_email_hook(on_about_dialog_url_clicked, (gpointer)self, NULL); gtk_about_dialog_set_url_hook(on_about_dialog_url_clicked, (gpointer)self, NULL); #endif // add the NEWS directly below copyright news = gtk_text_view_new(); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(news), FALSE); gtk_text_view_set_editable(GTK_TEXT_VIEW(news), FALSE); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(news), GTK_WRAP_WORD); gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(news)), //"Development version (do not translate this)" _("Main feature of this release is full undo/redo support. Related to it is the " "journaling of edit action and the crash recovery. This way chances of losing " "changes in the song are quite low. Other UI improvements are: tip of day, " "improved spectrum analyzer, clipboard support, more commands in context menus " "and many more). This release features a gstreamer decoder that enables playback " "of buzztard songs in any gstreamer based media player. " "We also kept the buzztard codebase clean and ported from deprecated APIs to the " "successors (gnomevfs->gio, hal->gudev). The libraries and the applications got " "performance improvements in many areas. " "Also the docs have been improved a lot with tutorials, keyboard shortcut tables, " "better coverage and man-pages. " ),-1); news_view = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW (news_view), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (news_view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(news_view), news); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(self))), news_view, TRUE, TRUE, 0); } //-- constructor methods /** * bt_about_dialog_new: * * Create a new instance * * Returns: the new instance */ BtAboutDialog *bt_about_dialog_new(void) { BtAboutDialog *self; self=BT_ABOUT_DIALOG(g_object_new(BT_TYPE_ABOUT_DIALOG,NULL)); bt_about_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_about_dialog_dispose(GObject *object) { BtAboutDialog *self = BT_ABOUT_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_about_dialog_parent_class)->dispose(object); } static void bt_about_dialog_init(BtAboutDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_ABOUT_DIALOG, BtAboutDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_about_dialog_class_init(BtAboutDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtAboutDialogPrivate)); gobject_class->dispose = bt_about_dialog_dispose; } buzztard-0.6.0/src/ui/edit/missing-framework-elements-dialog.h0000644042355400116100000000554111625722250021335 00000000000000/* $Id: missing-framework-elements-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_H #define BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_H #include #include #define BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG (bt_missing_framework_elements_dialog_get_type ()) #define BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG, BtMissingFrameworkElementsDialog)) #define BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG, BtMissingFrameworkElementsDialogClass)) #define BT_IS_MISSING_FRAMEWORK_ELEMENTS_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG)) #define BT_IS_MISSING_FRAMEWORK_ELEMENTS_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG)) #define BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MISSING_FRAMEWORK_ELEMENTS_DIALOG, BtMissingFrameworkElementsDialogClass)) /* type macros */ typedef struct _BtMissingFrameworkElementsDialog BtMissingFrameworkElementsDialog; typedef struct _BtMissingFrameworkElementsDialogClass BtMissingFrameworkElementsDialogClass; typedef struct _BtMissingFrameworkElementsDialogPrivate BtMissingFrameworkElementsDialogPrivate; /** * BtMissingFrameworkElementsDialog: * * the root window for the editor application */ struct _BtMissingFrameworkElementsDialog { GtkDialog parent; /*< private >*/ BtMissingFrameworkElementsDialogPrivate *priv; }; struct _BtMissingFrameworkElementsDialogClass { GtkDialogClass parent; }; GType bt_missing_framework_elements_dialog_get_type(void) G_GNUC_CONST; BtMissingFrameworkElementsDialog *bt_missing_framework_elements_dialog_new(GList *core_elements,GList *edit_elements); void bt_missing_framework_elements_dialog_apply(const BtMissingFrameworkElementsDialog *self); #endif // BT_MISSING_FRAMEWORK_ELEMENTS_DIALOG_H buzztard-0.6.0/src/ui/edit/interaction-controller-menu.h0000644042355400116100000000622411625722250020263 00000000000000/* $Id: interaction-controller-menu.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_INTERACTION_CONTROLLER_MENU_H #define BT_INTERACTION_CONTROLLER_MENU_H #include #include #define BT_TYPE_INTERACTION_CONTROLLER_MENU (bt_interaction_controller_menu_get_type ()) #define BT_INTERACTION_CONTROLLER_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_INTERACTION_CONTROLLER_MENU, BtInteractionControllerMenu)) #define BT_INTERACTION_CONTROLLER_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_INTERACTION_CONTROLLER_MENU, BtInteractionControllerMenuClass)) #define BT_IS_INTERACTION_CONTROLLER_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_INTERACTION_CONTROLLER_MENU)) #define BT_IS_INTERACTION_CONTROLLER_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_INTERACTION_CONTROLLER_MENU)) #define BT_INTERACTION_CONTROLLER_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_INTERACTION_CONTROLLER_MENU, BtInteractionControllerMenuClass)) /* type macros */ typedef struct _BtInteractionControllerMenu BtInteractionControllerMenu; typedef struct _BtInteractionControllerMenuClass BtInteractionControllerMenuClass; typedef struct _BtInteractionControllerMenuPrivate BtInteractionControllerMenuPrivate; /** * BtInteractionControllerMenu: * * the machine selection sub-menu for the canvas page context menu */ struct _BtInteractionControllerMenu { GtkMenu parent; /*< private >*/ BtInteractionControllerMenuPrivate *priv; }; struct _BtInteractionControllerMenuClass { GtkMenuClass parent; }; /** * BtInteractionControllerMenuType: * @BT_INTERACTION_CONTROLLER_RANGE_MENU: range controllers * @BT_INTERACTION_CONTROLLER_TRIGGER_MENU: trigger controllers * * #BtInteractionControllerMenu can generate a menu showing different controller * types. */ typedef enum { BT_INTERACTION_CONTROLLER_RANGE_MENU=0, BT_INTERACTION_CONTROLLER_TRIGGER_MENU, } BtInteractionControllerMenuType; #define BT_TYPE_INTERACTION_CONTROLLER_MENU_TYPE (bt_interaction_controller_menu_type_get_type()) GType bt_interaction_controller_menu_type_get_type(void) G_GNUC_CONST; GType bt_interaction_controller_menu_get_type(void) G_GNUC_CONST; BtInteractionControllerMenu *bt_interaction_controller_menu_new(BtInteractionControllerMenuType type); #endif // BT_INTERACTION_CONTROLLER_MENU_H buzztard-0.6.0/src/ui/edit/btmemoryaudiosrc.c0000644042355400116100000003346611624771426016224 00000000000000/* $Id: btmemoryaudiosrc.c 3588 2011-08-23 18:36:05Z ensonic $ * * Buzztard * Copyright (C) 2008 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmemoryaudiosrc * @short_description: play samples from memory * * Gstreamer audio source to play samples from memory. Supports interleaved * multi-channels audio. Supports trickmode playback (resampling and ping-pong * loops). */ /* seeking forward backward start = 0 loop_beg = 3 n_samples=3 =15-7= 8 loop_end = 7 n_samples_stop=7 =15-3=12 length = 15 */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include "btmemoryaudiosrc.h" #include "libbuzztard-core/tools.h" GST_DEBUG_CATEGORY_STATIC (memory_audio_src_debug); #define GST_CAT_DEFAULT memory_audio_src_debug enum { PROP_0, PROP_CAPS, PROP_DATA, PROP_LENGTH }; static GstStaticPadTemplate bt_memory_audio_src_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS_ANY); GST_BOILERPLATE (BtMemoryAudioSrc, bt_memory_audio_src, GstBaseSrc, GST_TYPE_BASE_SRC); static void bt_memory_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void bt_memory_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void bt_memory_audio_src_dispose (GObject * object); static GstCaps * bt_memory_audio_src_get_caps (GstBaseSrc * basesrc); static gboolean bt_memory_audio_src_is_seekable (GstBaseSrc * basesrc); static gboolean bt_memory_audio_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment); static gboolean bt_memory_audio_src_query (GstBaseSrc * basesrc, GstQuery * query); static GstFlowReturn bt_memory_audio_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer); static void bt_memory_audio_src_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&bt_memory_audio_src_src_template)); gst_element_class_set_details_simple (element_class, "Memory audio source", "Source/Audio", "Plays audio from memory", "Stefan Kost "); } static void bt_memory_audio_src_class_init (BtMemoryAudioSrcClass * klass) { GObjectClass *gobject_class; GstBaseSrcClass *gstbasesrc_class; gobject_class = (GObjectClass *) klass; gstbasesrc_class = (GstBaseSrcClass *) klass; gobject_class->set_property = bt_memory_audio_src_set_property; gobject_class->get_property = bt_memory_audio_src_get_property; gobject_class->dispose = bt_memory_audio_src_dispose; g_object_class_install_property(gobject_class, PROP_CAPS, g_param_spec_boxed("caps", "Output caps", "Data format of sample.", GST_TYPE_CAPS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, PROP_DATA, g_param_spec_pointer("data", "Sample data", "The sample data (interleaved for multi-channel)", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, PROP_LENGTH, g_param_spec_ulong("length", "Length in samples", "Length of the sample in number of samples", 0, G_MAXLONG, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); gstbasesrc_class->get_caps = GST_DEBUG_FUNCPTR (bt_memory_audio_src_get_caps); gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (bt_memory_audio_src_is_seekable); gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (bt_memory_audio_src_do_seek); gstbasesrc_class->query = GST_DEBUG_FUNCPTR (bt_memory_audio_src_query); gstbasesrc_class->create = GST_DEBUG_FUNCPTR (bt_memory_audio_src_create); } static void bt_memory_audio_src_init (BtMemoryAudioSrc * src, BtMemoryAudioSrcClass * g_class) { /* some defaults */ src->samplerate = GST_AUDIO_DEF_RATE; src->channels = 1; src->width = 16; /* we operate in time */ gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (src), FALSE); src->caps = gst_caps_new_any (); // this gives us max 15 position updates per sec. src->samples_per_buffer = GST_AUDIO_DEF_RATE/15; src->generate_samples_per_buffer = src->samples_per_buffer; } static GstCaps * bt_memory_audio_src_get_caps (GstBaseSrc *basesrc) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (basesrc); return gst_caps_ref (src->caps); } static gboolean bt_memory_audio_src_query (GstBaseSrc * basesrc, GstQuery * query) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (basesrc); gboolean res = FALSE; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_CONVERT: { GstFormat src_fmt, dest_fmt; gint64 src_val, dest_val; gst_query_parse_convert (query, &src_fmt, &src_val, &dest_fmt, &dest_val); if (src_fmt == dest_fmt) { dest_val = src_val; goto done; } switch (src_fmt) { case GST_FORMAT_DEFAULT: switch (dest_fmt) { case GST_FORMAT_TIME: /* samples to time */ dest_val = gst_util_uint64_scale_int (src_val, GST_SECOND, src->samplerate); break; default: goto error; } break; case GST_FORMAT_TIME: switch (dest_fmt) { case GST_FORMAT_DEFAULT: /* time to samples */ dest_val = gst_util_uint64_scale_int (src_val, src->samplerate, GST_SECOND); break; default: goto error; } break; default: goto error; } done: gst_query_set_convert (query, src_fmt, src_val, dest_fmt, dest_val); res = TRUE; break; } default: res = GST_BASE_SRC_CLASS (parent_class)->query (basesrc, query); break; } return res; /* ERROR */ error: { GST_WARNING_OBJECT (src, "query %s failed", gst_query_type_get_name (GST_QUERY_TYPE (query))); return FALSE; } } static gboolean bt_memory_audio_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (basesrc); GstClockTime time; src->rate = segment->rate; GST_LOG_OBJECT(src, "rates : %lf %lf %lf -------------------------------", segment->rate, segment->abs_rate, segment->applied_rate); time = segment->last_stop; /* now move to the time indicated */ src->n_samples = gst_util_uint64_scale_int (time, src->samplerate, GST_SECOND); if(src->rate>0.0) { segment->time = segment->start; src->running_time = gst_util_uint64_scale_int (src->n_samples, GST_SECOND, src->samplerate); g_assert (src->running_time <= time); if (GST_CLOCK_TIME_IS_VALID (segment->stop)) { time = segment->stop; src->n_samples_stop = gst_util_uint64_scale_int (time, src->samplerate, GST_SECOND); } else { src->n_samples_stop = src->length; } } else { segment->time = segment->stop; src->n_samples = src->length - src->n_samples; src->running_time = gst_util_uint64_scale_int (src->n_samples, GST_SECOND, src->samplerate); if (GST_CLOCK_TIME_IS_VALID (segment->start)) { time = segment->start; src->n_samples_stop = src->length - gst_util_uint64_scale_int (time, src->samplerate, GST_SECOND); } else { src->n_samples_stop = src->length; } } src->eos_reached = FALSE; GST_LOG_OBJECT(src, "range : %"G_GUINT64_FORMAT " - %"G_GUINT64_FORMAT, src->n_samples,src->n_samples_stop); return TRUE; } static gboolean bt_memory_audio_src_is_seekable (GstBaseSrc * basesrc) { /* we're seekable... */ return TRUE; } static GstFlowReturn bt_memory_audio_src_create (GstBaseSrc * basesrc, guint64 offset, guint length, GstBuffer ** buffer) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (basesrc); GstBuffer *buf; GstClockTime next_time; gint64 n_samples; if (src->eos_reached) { GST_WARNING ("have eos"); return GST_FLOW_UNEXPECTED; } /* check for eos */ if ((src->n_samples_stop > src->n_samples) && (src->n_samples_stop < src->n_samples + src->samples_per_buffer) ) { /* calculate only partial buffer */ src->generate_samples_per_buffer = (src->n_samples_stop - src->n_samples) * src->channels; n_samples = src->n_samples_stop; src->eos_reached = TRUE; } else { /* calculate full buffer */ src->generate_samples_per_buffer = src->samples_per_buffer * src->channels; n_samples = src->n_samples + src->samples_per_buffer; } next_time = gst_util_uint64_scale (n_samples, GST_SECOND, (guint64) src->samplerate); buf = gst_buffer_new (); if(src->rate>0.0) { GST_BUFFER_DATA(buf) = (gpointer)&src->data[src->n_samples * src->channels]; GST_BUFFER_TIMESTAMP(buf) = src->running_time; GST_BUFFER_OFFSET(buf) = src->n_samples; GST_BUFFER_OFFSET_END(buf) = n_samples; } else { GstClockTime end_time = gst_util_uint64_scale (src->length, GST_SECOND, (guint64) src->samplerate); GST_BUFFER_DATA(buf) = (gpointer)&src->data[(src->length - src->n_samples) * src->channels]; GST_BUFFER_TIMESTAMP(buf) = end_time - src->running_time; GST_BUFFER_OFFSET(buf) = src->length - src->n_samples; GST_BUFFER_OFFSET_END(buf) = src->length - n_samples; } GST_BUFFER_DURATION(buf) = next_time - src->running_time; GST_BUFFER_SIZE(buf) = src->generate_samples_per_buffer * (src->width/8); GST_BUFFER_FLAGS(buf) = GST_BUFFER_FLAG_READONLY; /* GST_BUFFER_DATA(buf) = (gpointer)&src->data[src->n_samples * src->channels]; GST_BUFFER_SIZE (buf) = src->generate_samples_per_buffer * (src->width/8); GST_BUFFER_TIMESTAMP (buf) = src->running_time; GST_BUFFER_OFFSET (buf) = src->n_samples; GST_BUFFER_OFFSET_END (buf) = n_samples; GST_BUFFER_DURATION (buf) = next_time - src->running_time; GST_BUFFER_FLAGS (buf) = GST_BUFFER_FLAG_READONLY; */ GST_LOG_OBJECT(src, "play from ts %"GST_TIME_FORMAT " with duration %"GST_TIME_FORMAT", size %u, and data %p", GST_TIME_ARGS(GST_BUFFER_TIMESTAMP(buf)), GST_TIME_ARGS(GST_BUFFER_DURATION(buf)), GST_BUFFER_SIZE(buf), GST_BUFFER_DATA(buf)); src->running_time = next_time; src->n_samples = n_samples; *buffer = buf; return GST_FLOW_OK; } static void bt_memory_audio_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (object); switch (prop_id) { case PROP_CAPS:{ GstCaps *new_caps,*old_caps = src->caps; const GstCaps *new_caps_val = gst_value_get_caps (value); if (new_caps_val == NULL) { new_caps = gst_caps_new_any (); } else { const GstStructure *structure; new_caps = gst_caps_ref ((GstCaps *) new_caps_val); structure = gst_caps_get_structure (new_caps, 0); gst_structure_get_int (structure, "rate", &src->samplerate); gst_structure_get_int (structure, "channels", &src->channels); gst_structure_get_int (structure, "width", &src->width); /* const gchar *name; name = gst_structure_get_name (structure); if (strcmp (name, "audio/x-raw-int") == 0) { } else { } */ } src->caps = new_caps; gst_caps_unref (old_caps); GST_DEBUG_OBJECT (src, "set new caps %" GST_PTR_FORMAT, new_caps); } break; case PROP_DATA: src->data = g_value_get_pointer(value); break; case PROP_LENGTH: src->length = g_value_get_ulong(value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void bt_memory_audio_src_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (object); switch (prop_id) { case PROP_CAPS: gst_value_set_caps(value, src->caps); break; case PROP_DATA: g_value_set_pointer(value, src->data); break; case PROP_LENGTH: g_value_set_ulong(value, src->length); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void bt_memory_audio_src_dispose (GObject * object) { BtMemoryAudioSrc *src = BT_MEMORY_AUDIO_SRC (object); gst_caps_replace (&src->caps, NULL); G_OBJECT_CLASS (parent_class)->dispose (object); } //-- plugin handling #if !GST_CHECK_VERSION(0,10,16) static #endif gboolean bt_memory_audio_src_plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (memory_audio_src_debug, "memoryaudiosrc", 0, "Memory audio source"); return gst_element_register (plugin, "memoryaudiosrc", GST_RANK_NONE, BT_TYPE_MEMORY_AUDIO_SRC); } #if !GST_CHECK_VERSION(0,10,16) GST_PLUGIN_DEFINE_STATIC ( GST_VERSION_MAJOR, GST_VERSION_MINOR, "memoryaudiosrc", "Plays audio from memory", bt_memory_audio_src_plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://www.buzztard.org" ); #endif buzztard-0.6.0/src/ui/edit/object-list-model.c0000644042355400116100000002323411626121152016124 00000000000000/* $Id: object-list-model.c 3611 2011-08-27 07:53:12Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btobjectlistmodel * @short_description: data model class for some widgets * * Allows to bind gobject properties to model columns. Does not copy the data * and thus keeps the widget always up-to-date. */ /* background: * * http://scentric.net/tutorial/sec-custom-models.html * http://pvanhoof.be/blog/index.php/2009/08/17/treemodel-zero-a-taste-of-life-as-it-should-be */ #define BT_EDIT #define BT_OBJECT_LIST_MODEL_C #include "bt-edit.h" //-- property ids //-- structs struct _BtObjectListModelPrivate { gint n_columns; gint stamp; GType object_type; GParamSpec **params; GSequence *seq; }; //-- the class static void bt_object_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtObjectListModel, bt_object_list_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, bt_object_list_model_tree_model_init)); //-- helper //-- constructor methods /** * bt_object_list_model_new: * @n_columns: number of columns * @object_type: the #GType of the objects in the model * @...: property names for the columns * * Creates a list model mapping object properties to model columns. * * Returns: the model. */ BtObjectListModel *bt_object_list_model_new(gint n_columns,GType object_type,...) { BtObjectListModel *self; GObjectClass *klass; va_list args; GParamSpec **params; gint i; self=g_object_new(BT_TYPE_OBJECT_LIST_MODEL, NULL); self->priv->n_columns=n_columns; self->priv->object_type=object_type; // allocate an array for the properties self->priv->params=g_new(GParamSpec*,n_columns); // look up the param-specs klass=g_type_class_ref(object_type); va_start (args, object_type); params=self->priv->params; for(i=0;ipriv->seq; GtkTreePath *path; GtkTreeIter iter; gint position; g_return_if_fail(G_OBJECT_TYPE(object)!=model->priv->object_type); position=g_sequence_get_length(seq); iter.stamp=model->priv->stamp; iter.user_data=g_sequence_append(seq,object); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,position); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } /** * bt_object_list_model_get_object: * @model: the model * @iter: the iter * * The the #GObject for the iter. */ GObject *bt_object_list_model_get_object(BtObjectListModel *model,GtkTreeIter *iter) { return(g_sequence_get(iter->user_data)); } //-- tree model interface static GtkTreeModelFlags bt_object_list_model_tree_model_get_flags(GtkTreeModel *tree_model) { return(GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY); } static gint bt_object_list_model_tree_model_get_n_columns(GtkTreeModel *tree_model) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); return(model->priv->n_columns); } static GType bt_object_list_model_tree_model_get_column_type(GtkTreeModel *tree_model,gint index) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); g_return_val_if_fail(indexpriv->n_columns,G_TYPE_INVALID); return(model->priv->params[index]->value_type); } static gboolean bt_object_list_model_tree_model_get_iter(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreePath *path) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); GSequence *seq=model->priv->seq; gint i=gtk_tree_path_get_indices (path)[0]; if(i>=g_sequence_get_length(seq)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_iter_at_pos(seq,i); return(TRUE); } static GtkTreePath *bt_object_list_model_tree_model_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); GtkTreePath *path; g_return_val_if_fail(iter->stamp==model->priv->stamp,NULL); if(g_sequence_iter_is_end(iter->user_data)) return(NULL); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,g_sequence_iter_get_position(iter->user_data)); return(path); } static void bt_object_list_model_tree_model_get_value(GtkTreeModel *tree_model,GtkTreeIter *iter,gint column,GValue *value) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); GParamSpec *pspec; GObject *obj; g_return_if_fail(columnpriv->n_columns); pspec=model->priv->params[column]; g_value_init(value,pspec->value_type); if((obj=g_sequence_get(iter->user_data))) { g_object_get_property(obj,pspec->name,value); } else { g_param_value_set_default(pspec,value); } } static gboolean bt_object_list_model_tree_model_iter_next(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); gboolean res; g_return_val_if_fail(model->priv->stamp==iter->stamp,FALSE); iter->user_data=g_sequence_iter_next(iter->user_data); if((res=g_sequence_iter_is_end(iter->user_data))) iter->stamp=0; return !res; } static gboolean bt_object_list_model_tree_model_iter_children(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); /* this is a list, nodes have no children */ if (!parent) { if (g_sequence_get_length(model->priv->seq)>0) { iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_begin_iter(model->priv->seq); return(TRUE); } } iter->stamp=0; return(FALSE); } static gboolean bt_object_list_model_tree_model_iter_has_child(GtkTreeModel *tree_model,GtkTreeIter *iter) { return(FALSE); } static gint bt_object_list_model_tree_model_iter_n_children(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); if (iter == NULL) return g_sequence_get_length(model->priv->seq); g_return_val_if_fail(model->priv->stamp==iter->stamp,-1); return(0); } static gboolean bt_object_list_model_tree_model_iter_nth_child(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent,gint n) { BtObjectListModel *model=BT_OBJECT_LIST_MODEL(tree_model); GSequenceIter *child; iter->stamp=0; if (parent) return(FALSE); child=g_sequence_get_iter_at_pos(model->priv->seq,n); if(g_sequence_iter_is_end(child)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=child; return(TRUE); } static gboolean bt_object_list_model_tree_model_iter_parent(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *child) { iter->stamp=0; return(FALSE); } static void bt_object_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data) { GtkTreeModelIface * const iface = g_iface; iface->get_flags = bt_object_list_model_tree_model_get_flags; iface->get_n_columns = bt_object_list_model_tree_model_get_n_columns; iface->get_column_type = bt_object_list_model_tree_model_get_column_type; iface->get_iter = bt_object_list_model_tree_model_get_iter; iface->get_path = bt_object_list_model_tree_model_get_path; iface->get_value = bt_object_list_model_tree_model_get_value; iface->iter_next = bt_object_list_model_tree_model_iter_next; iface->iter_children = bt_object_list_model_tree_model_iter_children; iface->iter_has_child = bt_object_list_model_tree_model_iter_has_child; iface->iter_n_children = bt_object_list_model_tree_model_iter_n_children; iface->iter_nth_child = bt_object_list_model_tree_model_iter_nth_child; iface->iter_parent = bt_object_list_model_tree_model_iter_parent; } //-- class internals static void bt_object_list_model_finalize(GObject *object) { BtObjectListModel *self = BT_OBJECT_LIST_MODEL(object); GST_DEBUG("!!!! self=%p",self); g_sequence_free(self->priv->seq); g_free(self->priv->params); G_OBJECT_CLASS(bt_object_list_model_parent_class)->finalize(object); } static void bt_object_list_model_init(BtObjectListModel *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self,BT_TYPE_OBJECT_LIST_MODEL,BtObjectListModelPrivate); self->priv->seq=g_sequence_new (NULL); // random int to check whether an iter belongs to our model self->priv->stamp=g_random_int(); } static void bt_object_list_model_class_init(BtObjectListModelClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtObjectListModelPrivate)); gobject_class->finalize = bt_object_list_model_finalize; } buzztard-0.6.0/src/ui/edit/Makefile.am0000644042355400116100000001217211673621756014517 00000000000000## Makefile.am for src/ui/edit bin_PROGRAMS=buzztard-edit buzztard_edit_LDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ libbtedit.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) \ -lgstinterfaces-0.10 buzztard_edit_SOURCES= \ bt-edit.c bt-edit.h # these sources (also mentioned above) are generated. BUILT_SOURCES = marshal.h marshal.c noinst_LTLIBRARIES = libbtedit.la noinst_HEADERS = marshal.h libbtedit_la_LIBADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(GUI_DEPS_LIBS) $(BT_LIBS) $(LIBM) \ -lgstinterfaces-0.10 libbtedit_la_SOURCES = \ about-dialog.c about-dialog.h \ change-log.c change-log.h \ change-logger.c change-logger.h \ crash-recover-dialog.c crash-recover-dialog.h \ edit-application.c edit-application.h \ interaction-controller-menu.c interaction-controller-menu.h \ interaction-controller-learn-dialog.c interaction-controller-learn-dialog.h \ machine-canvas-item.c machine-canvas-item.h \ machine-menu.c machine-menu.h \ machine-actions.c machine-actions.h \ machine-list-model.c machine-list-model.h \ machine-preset-properties-dialog.c machine-preset-properties-dialog.h \ machine-properties-dialog.c machine-properties-dialog.h \ machine-preferences-dialog.c machine-preferences-dialog.h \ machine-rename-dialog.c machine-rename-dialog.h \ main-window.c main-window.h \ main-menu.c main-menu.h \ main-toolbar.c main-toolbar.h \ main-pages.c main-pages.h \ main-page-machines.c main-page-machines.h \ main-page-patterns.c main-page-patterns.h \ main-page-sequence.c main-page-sequence.h \ main-page-waves.c main-page-waves.h \ main-page-info.c main-page-info.h \ main-statusbar.c main-statusbar.h \ missing-framework-elements-dialog.c missing-framework-elements-dialog.h \ missing-song-elements-dialog.c missing-song-elements-dialog.h \ object-list-model.c object-list-model.h \ panorama-popup.c panorama-popup.h \ pattern-list-model.c pattern-list-model.h \ pattern-properties-dialog.c pattern-properties-dialog.h \ playback-controller-socket.c playback-controller-socket.h \ render-dialog.c render-dialog.h \ render-progress.c render-progress.h \ sequence-grid-model.c sequence-grid-model.h \ sequence-view.c sequence-view.h \ settings-dialog.c settings-dialog.h \ settings-page-audiodevices.c settings-page-audiodevices.h \ settings-page-directories.c settings-page-directories.h \ settings-page-interaction-controller.c settings-page-interaction-controller.h \ settings-page-playback-controller.c settings-page-playback-controller.h \ settings-page-shortcuts.c settings-page-shortcuts.h \ signal-analysis-dialog.c signal-analysis-dialog.h \ tip-dialog.c tip-dialog.h \ tools.c tools.h \ ui-resources.c ui-resources.h \ volume-popup.c volume-popup.h \ wave-viewer.c wave-viewer.h \ wire-canvas-item.c wire-canvas-item.h \ \ pattern-editor.c pattern-editor.h \ gtkvumeter.c gtkvumeter.h \ ruler.c ruler.h \ \ btmemoryaudiosrc.c btmemoryaudiosrc.h \ \ $(BUILT_SOURCES) AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DPREFIX=\"$(prefix)\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(GUI_DEPS_CFLAGS) \ $(BT_CFLAGS) AM_LDFLAGS = $(BT_LDFLAGS) desktopdir = ${with_desktop_dir}/applications desktop_in_files = buzztard-edit.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ buzztard-edit.desktop: buzztard-edit.desktop.in # FIXME: don't install bt-edit.hildon.gtkrc on non hildon gtkrcdir = $(datadir)/$(PACKAGE) gtkrc_DATA = bt-edit.gtkrc bt-edit.hildon.gtkrc marshal.h: marshal.list glib-genmarshal --header --prefix=bt_marshal $(srcdir)/marshal.list > marshal.h marshal.c: marshal.list glib-genmarshal --body --prefix=bt_marshal $(srcdir)/marshal.list > marshal.c # CLEANFILES is for files generated by make CLEANFILES = $(desktop_DATA) $(BUILT_SOURCES) EXTRA_DIST = $(desktop_in_files) $(gtkrc_DATA) marshal.list # update desktop database install-data-hook: test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)"; uninstall-local: test -z "$(UPDATE_DESKTOP_DATABASE)" || $(UPDATE_DESKTOP_DATABASE) "$(DESTDIR)$(desktopdir)"; .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtedit_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/ui/edit/machine-rename-dialog.h0000644042355400116100000000467711625722250016741 00000000000000/* $Id: machine-rename-dialog.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MACHINE_RENAME_DIALOG_H #define BT_MACHINE_RENAME_DIALOG_H #include #include #define BT_TYPE_MACHINE_RENAME_DIALOG (bt_machine_rename_dialog_get_type ()) #define BT_MACHINE_RENAME_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MACHINE_RENAME_DIALOG, BtMachineRenameDialog)) #define BT_MACHINE_RENAME_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MACHINE_RENAME_DIALOG, BtMachineRenameDialogClass)) #define BT_IS_MACHINE_RENAME_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MACHINE_RENAME_DIALOG)) #define BT_IS_MACHINE_RENAME_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MACHINE_RENAME_DIALOG)) #define BT_MACHINE_RENAME_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MACHINE_RENAME_DIALOG, BtMachineRenameDialogClass)) /* type macros */ typedef struct _BtMachineRenameDialog BtMachineRenameDialog; typedef struct _BtMachineRenameDialogClass BtMachineRenameDialogClass; typedef struct _BtMachineRenameDialogPrivate BtMachineRenameDialogPrivate; /** * BtMachineRenameDialog: * * the machine settings dialog */ struct _BtMachineRenameDialog { GtkDialog parent; /*< private >*/ BtMachineRenameDialogPrivate *priv; }; struct _BtMachineRenameDialogClass { GtkDialogClass parent; }; GType bt_machine_rename_dialog_get_type(void) G_GNUC_CONST; BtMachineRenameDialog *bt_machine_rename_dialog_new(const BtMachine *machine); void bt_machine_rename_dialog_apply(const BtMachineRenameDialog *self); #endif // BT_MACHINE_RENAME_DIALOG_H buzztard-0.6.0/src/ui/edit/bt-edit.gtkrc0000644042355400116100000000157111576360376015050 00000000000000# custom styles for buzztard-edit # less spacious treeview style "slim-treeview" = "default" { GtkTreeView::horizontal-separator = 1 GtkTreeView::vertical-separator = 0 #GtkTreeView::grid-line-width = 1 GtkWidget::focus-line-width = 0 GtkWidget::focus-padding = 0 } class "BtSequenceView" style "slim-treeview" widget "*.sequence-pattern-list" style "slim-treeview" widget "*.wave-level-list" style "slim-treeview" widget "*.wave-list" style "slim-treeview" # less spacious buttons (for sequence headers) style "slim-button" = "default" { GtkButton::inner-border = {0, 0, 0, 0} GtkWidget::focus-line-width = 0 GtkWidget::focus-padding = 0 } widget "*.mini-button" style "slim-button" # row shading for pattern editor style "patternview" = "default" { # this gives an error: Invalid symbolic color 'fg_color' #color["alternative-row"] = shade (0.9, @fg_color) } buzztard-0.6.0/src/ui/edit/pattern-list-model.h0000644042355400116100000000507011625722250016343 00000000000000/* $Id: pattern-list-model.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_PATTERN_LIST_MODEL_H #define BT_PATTERN_LIST_MODEL_H #include #include #define BT_TYPE_PATTERN_LIST_MODEL (bt_pattern_list_model_get_type()) #define BT_PATTERN_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_PATTERN_LIST_MODEL, BtPatternListModel)) #define BT_PATTERN_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_PATTERN_LIST_MODEL, BtPatternListModelClass)) #define BT_IS_PATTERN_LIST_MODEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_PATTERN_LIST_MODEL)) #define BT_IS_PATTERN_LIST_MODEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_PATTERN_LIST_MODEL)) #define BT_PATTERN_LIST_MODEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_PATTERN_LIST_MODEL, BtPatternListModelClass)) /* type macros */ typedef struct _BtPatternListModel BtPatternListModel; typedef struct _BtPatternListModelClass BtPatternListModelClass; typedef struct _BtPatternListModelPrivate BtPatternListModelPrivate; /** * BtPatternListModel: * * Data model for #GtkTreeView or #GtkComboBox. */ struct _BtPatternListModel { GObject parent; /*< private >*/ BtPatternListModelPrivate *priv; }; struct _BtPatternListModelClass { GObjectClass parent; }; enum { BT_PATTERN_MODEL_LABEL=0, BT_PATTERN_MODEL_IS_USED, BT_PATTERN_MODEL_IS_UNUSED, BT_PATTERN_MODEL_SHORTCUT, __BT_PATTERN_MODEL_N_COLUMNS }; GType bt_pattern_list_model_get_type(void) G_GNUC_CONST; BtPatternListModel *bt_pattern_list_model_new(BtMachine *machine,BtSequence *sequence,gboolean skip_internal); BtPattern *bt_pattern_list_model_get_object(BtPatternListModel *model,GtkTreeIter *iter); #endif // BT_PATTERN_LIST_MODEL_H buzztard-0.6.0/src/ui/edit/machine-rename-dialog.c0000644042355400116100000002145611623564224016731 00000000000000/* $Id: machine-rename-dialog.c 3557 2011-08-19 22:49:52Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmachinerenamedialog * @short_description: machine settings * * A dialog to (re)configure a #BtMachine. */ #define BT_EDIT #define BT_MACHINE_RENAME_DIALOG_C #include "bt-edit.h" //-- property ids enum { MACHINE_RENAME_DIALOG_MACHINE=1, MACHINE_RENAME_DIALOG_NAME }; struct _BtMachineRenameDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the underlying machine */ BtMachine *machine; BtSetup *setup; /* dialog data */ gchar *name; /* widgets and their handlers */ GtkWidget *okay_button; }; //-- the class G_DEFINE_TYPE (BtMachineRenameDialog, bt_machine_rename_dialog, GTK_TYPE_DIALOG); //-- event handler static void on_name_changed(GtkEditable *editable,gpointer user_data) { BtMachineRenameDialog *self=BT_MACHINE_RENAME_DIALOG(user_data); BtMachine *machine; const gchar *name=gtk_entry_get_text(GTK_ENTRY(editable)); gboolean unique=FALSE; GST_DEBUG("change name"); // assure uniqueness of the entered data if(*name) { if((machine=bt_setup_get_machine_by_id(self->priv->setup,name))) { if(machine==self->priv->machine) { unique=TRUE; } g_object_unref(machine); } else { unique=TRUE; } } GST_INFO("%s""unique '%s'",(unique?"not ":""),name); gtk_widget_set_sensitive(self->priv->okay_button,unique); // update field g_free(self->priv->name); self->priv->name=g_strdup(name); } //-- helper methods static void bt_machine_rename_dialog_init_ui(const BtMachineRenameDialog *self) { GtkWidget *box,*label,*widget,*table; gchar *title; //GdkPixbuf *window_icon=NULL; BtSong *song; #if !GTK_CHECK_VERSION(2,20,0) GList *buttons; #endif gtk_widget_set_name(GTK_WIDGET(self),"rename machine"); // create and set window icon /* e.v. tab_machine.png if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } */ // get dialog data g_object_get(self->priv->machine,"id",&self->priv->name,"song",&song,NULL); g_object_get(song,"setup",&self->priv->setup,NULL); g_object_unref(song); // set dialog title title=g_strdup_printf(_("%s name"),self->priv->name); gtk_window_set_title(GTK_WINDOW(self),title); g_free(title); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // grab okay button, so that we can block if input is not valid #if GTK_CHECK_VERSION(2,20,0) self->priv->okay_button=gtk_dialog_get_widget_for_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); #else buttons=gtk_container_get_children(GTK_CONTAINER(gtk_dialog_get_action_area(GTK_DIALOG(self)))); self->priv->okay_button=GTK_WIDGET(g_list_nth_data(buttons,1)); g_list_free(buttons); #endif // add widgets to the dialog content area box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); table=gtk_table_new(/*rows=*/1,/*columns=*/2,/*homogenous=*/FALSE); gtk_container_add(GTK_CONTAINER(box),table); // GtkEntry : machine name label=gtk_label_new(_("name")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(widget),self->priv->name); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(widget, "changed", G_CALLBACK(on_name_changed), (gpointer)self); } //-- constructor methods /** * bt_machine_rename_dialog_new: * @machine: the machine for which to create the dialog for * * Create a new instance * * Returns: the new instance */ BtMachineRenameDialog *bt_machine_rename_dialog_new(const BtMachine *machine) { BtMachineRenameDialog *self; self=BT_MACHINE_RENAME_DIALOG(g_object_new(BT_TYPE_MACHINE_RENAME_DIALOG,"machine",machine,NULL)); bt_machine_rename_dialog_init_ui(self); return(self); } //-- methods /** * bt_machine_rename_dialog_apply: * @self: the dialog which settings to apply * * Makes the dialog settings effective. */ void bt_machine_rename_dialog_apply(const BtMachineRenameDialog *self) { GST_INFO("applying machine settings"); g_object_set(self->priv->machine,"id",self->priv->name,NULL); } //-- wrapper //-- class internals static void bt_machine_rename_dialog_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { BtMachineRenameDialog *self = BT_MACHINE_RENAME_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_RENAME_DIALOG_NAME: { g_value_set_string(value, self->priv->name); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_rename_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtMachineRenameDialog *self = BT_MACHINE_RENAME_DIALOG(object); return_if_disposed(); switch (property_id) { case MACHINE_RENAME_DIALOG_MACHINE: { g_object_try_unref(self->priv->machine); self->priv->machine = g_value_dup_object(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_machine_rename_dialog_dispose(GObject *object) { BtMachineRenameDialog *self = BT_MACHINE_RENAME_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_unref(self->priv->machine); g_object_try_unref(self->priv->setup); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_machine_rename_dialog_parent_class)->dispose(object); } static void bt_machine_rename_dialog_finalize(GObject *object) { BtMachineRenameDialog *self = BT_MACHINE_RENAME_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->name); G_OBJECT_CLASS(bt_machine_rename_dialog_parent_class)->finalize(object); } static void bt_machine_rename_dialog_init(BtMachineRenameDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MACHINE_RENAME_DIALOG, BtMachineRenameDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_machine_rename_dialog_class_init(BtMachineRenameDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMachineRenameDialogPrivate)); gobject_class->get_property = bt_machine_rename_dialog_get_property; gobject_class->set_property = bt_machine_rename_dialog_set_property; gobject_class->dispose = bt_machine_rename_dialog_dispose; gobject_class->finalize = bt_machine_rename_dialog_finalize; g_object_class_install_property(gobject_class,MACHINE_RENAME_DIALOG_MACHINE, g_param_spec_object("machine", "machine construct prop", "Set machine object, the dialog handles", BT_TYPE_MACHINE, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,MACHINE_RENAME_DIALOG_NAME, g_param_spec_string("name", "name prop", "the display-name of the machine", "unamed", /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/ruler.h0000644042355400116100000000765011667606320013763 00000000000000/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* * NOTE this widget is considered too specialized/little-used for * GTK+, and will in the future be moved to some other package. If * your application needs this widget, feel free to use it, as the * widget does work and is useful in some applications; it's just not * of general interest. However, we are not accepting new features for * the widget, and it will eventually move out of the GTK+ * distribution. */ #ifndef __BT_RULER_H__ #define __BT_RULER_H__ #include G_BEGIN_DECLS #define BT_TYPE_RULER (bt_ruler_get_type ()) #define BT_RULER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_RULER, BtRuler)) #define BT_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_RULER, BtRulerClass)) #define BT_IS_RULER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_RULER)) #define BT_IS_RULER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_RULER)) #define BT_RULER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_RULER, BtRulerClass)) typedef struct _BtRuler BtRuler; typedef struct _BtRulerClass BtRulerClass; typedef struct _BtRulerPrivate BtRulerPrivate; typedef struct _BtRulerMetric BtRulerMetric; /* All distances below are in 1/72nd's of an inch. (According to * Adobe that's a point, but points are really 1/72.27 in.) */ struct _BtRuler { GtkWidget widget; GdkPixmap *backing_store; BtRulerMetric *metric; gint xsrc, ysrc; gint w, h; gint slider_size; gboolean draw_pos; /* The upper limit of the ruler (in points) */ gdouble lower; /* The lower limit of the ruler */ gdouble upper; /* The position of the mark on the ruler */ gdouble position; /* The maximum size of the ruler */ gdouble max_size; BtRulerPrivate *priv; }; struct _BtRulerClass { GtkWidgetClass parent_class; void (* draw_ticks) (BtRuler *ruler); void (* draw_pos) (BtRuler *ruler); }; #define BT_RULER_MAXIMUM_SCALES 13 #define BT_RULER_MAXIMUM_SUBDIVIDE 8 struct _BtRulerMetric { gchar *metric_name; gchar *abbrev; /* This should be points_per_unit. This is the size of the unit * in 1/72nd's of an inch and has nothing to do with screen pixels */ gdouble pixels_per_unit; gdouble ruler_scale[BT_RULER_MAXIMUM_SCALES]; gint subdivide[BT_RULER_MAXIMUM_SUBDIVIDE]; /* possible modes of subdivision */ }; GType bt_ruler_get_type (void) G_GNUC_CONST; void bt_ruler_set_metric (BtRuler *ruler, GtkMetricType metric); GtkMetricType bt_ruler_get_metric (BtRuler *ruler); void bt_ruler_set_range (BtRuler *ruler, gdouble lower, gdouble upper, gdouble position, gdouble max_size); void bt_ruler_get_range (BtRuler *ruler, gdouble *lower, gdouble *upper, gdouble *position, gdouble *max_size); GtkWidget *bt_ruler_new (GtkOrientation orientation, gboolean draw_pos); G_END_DECLS #endif /* __BT_RULER_H__ */ buzztard-0.6.0/src/ui/edit/pattern-properties-dialog.c0000644042355400116100000003174411615607031017723 00000000000000/* $Id: pattern-properties-dialog.c 3510 2011-08-01 20:35:36Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpatternpropertiesdialog * @short_description: pattern settings * * A dialog to (re)configure a #BtPattern. */ #define BT_EDIT #define BT_PATTERN_PROPERTIES_DIALOG_C #include "bt-edit.h" //-- property ids enum { PATTERN_PROPERTIES_DIALOG_PATTERN=1, PATTERN_PROPERTIES_DIALOG_NAME, PATTERN_PROPERTIES_DIALOG_LENGTH, PATTERN_PROPERTIES_DIALOG_VOICES }; struct _BtPatternPropertiesDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the underlying pattern */ BtPattern *pattern; /* the machine and its id the pattern belongs to, needed to veryfy unique name */ BtMachine *machine; gchar *machine_id; /* dialog data */ gchar *name; gulong length,voices; /* widgets and their handlers */ GtkWidget *okay_button; }; //-- the class G_DEFINE_TYPE (BtPatternPropertiesDialog, bt_pattern_properties_dialog, GTK_TYPE_DIALOG); //-- event handler static void on_name_changed(GtkEditable *editable,gpointer user_data) { BtPatternPropertiesDialog *self=BT_PATTERN_PROPERTIES_DIALOG(user_data); BtPattern *pattern; const gchar *name=gtk_entry_get_text(GTK_ENTRY(editable)); gboolean unique=FALSE; GST_DEBUG("change name"); // assure uniqueness of the entered data if(*name) { if((pattern=bt_machine_get_pattern_by_name(self->priv->machine,name))) { if(pattern==self->priv->pattern) { unique=TRUE; } g_object_unref(pattern); } else { unique=TRUE; } } GST_INFO("%s""unique '%s'",(unique?"":"not "),name); gtk_widget_set_sensitive(self->priv->okay_button,unique); // update field g_free(self->priv->name); self->priv->name=g_strdup(name); } static void on_length_changed(GtkEditable *editable,gpointer user_data) { BtPatternPropertiesDialog *self=BT_PATTERN_PROPERTIES_DIALOG(user_data); // update field self->priv->length=atol(gtk_entry_get_text(GTK_ENTRY(editable))); } static void on_voices_changed(GtkSpinButton *spinbutton,gpointer user_data) { BtPatternPropertiesDialog *self=BT_PATTERN_PROPERTIES_DIALOG(user_data); // update field self->priv->voices=gtk_spin_button_get_value_as_int(spinbutton); } //-- helper methods static void bt_pattern_properties_dialog_init_ui(const BtPatternPropertiesDialog *self) { GtkWidget *box,*label,*widget,*table; GtkAdjustment *spin_adjustment; gchar *title,*length_str; //GdkPixbuf *window_icon=NULL; #if !GTK_CHECK_VERSION(2,20,0) GList *buttons; #endif gtk_widget_set_name(GTK_WIDGET(self),"pattern properties"); // create and set window icon /* e.v. tab_pattern.png if((window_icon=bt_ui_resources_get_icon_pixbuf_by_machine(self->priv->machine))) { gtk_window_set_icon(GTK_WINDOW(self),window_icon); g_object_unref(window_icon); } */ // get dialog data g_object_get(self->priv->pattern,"name",&self->priv->name,"length",&self->priv->length,"voices",&self->priv->voices,"machine",&self->priv->machine,NULL); g_object_get(self->priv->machine,"id",&self->priv->machine_id,NULL); // set dialog title title=g_strdup_printf(_("%s properties"),self->priv->name); gtk_window_set_title(GTK_WINDOW(self),title); g_free(title); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // grab okay button, so that we can block if input is not valid #if GTK_CHECK_VERSION(2,20,0) self->priv->okay_button=gtk_dialog_get_widget_for_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); #else buttons=gtk_container_get_children(GTK_CONTAINER(gtk_dialog_get_action_area(GTK_DIALOG(self)))); self->priv->okay_button=GTK_WIDGET(g_list_nth_data(buttons,1)); g_list_free(buttons); #endif // add widgets to the dialog content area box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); table=gtk_table_new(/*rows=*/3,/*columns=*/2,/*homogenous=*/FALSE); gtk_container_add(GTK_CONTAINER(box),table); // GtkEntry : pattern name label=gtk_label_new(_("name")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(widget),self->priv->name); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(widget, "changed", G_CALLBACK(on_name_changed), (gpointer)self); // GtkComboBox : pattern length label=gtk_label_new(_("length")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); length_str=g_strdup_printf("%lu",self->priv->length); widget=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(widget),length_str);g_free(length_str); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); g_signal_connect(widget, "changed", G_CALLBACK(on_length_changed), (gpointer)self); // GtkSpinButton : number of voices label=gtk_label_new(_("voices")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); // @todo get min/max number of voices spin_adjustment=GTK_ADJUSTMENT(gtk_adjustment_new(1.0, 1.0, 16.0, 1.0, 4.0, 0.0)); widget=gtk_spin_button_new(spin_adjustment,(gdouble)(self->priv->voices),0); if(bt_machine_is_polyphonic(self->priv->machine)) { gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget),(gdouble)self->priv->voices); gtk_entry_set_activates_default(GTK_ENTRY(widget),TRUE); g_signal_connect(widget, "value-changed", G_CALLBACK(on_voices_changed), (gpointer)self); } else { gtk_widget_set_sensitive(widget,FALSE); } gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 2, 3, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); GST_INFO("dialog done"); } //-- constructor methods /** * bt_pattern_properties_dialog_new: * @pattern: the pattern for which to create the dialog for * * Create a new instance * * Returns: the new instance */ BtPatternPropertiesDialog *bt_pattern_properties_dialog_new(const BtPattern *pattern) { BtPatternPropertiesDialog *self; self=BT_PATTERN_PROPERTIES_DIALOG(g_object_new(BT_TYPE_PATTERN_PROPERTIES_DIALOG,"pattern",pattern,NULL)); bt_pattern_properties_dialog_init_ui(self); return(self); } //-- methods /** * bt_pattern_properties_dialog_apply: * @self: the dialog which settings to apply * * Makes the dialog settings effective. */ void bt_pattern_properties_dialog_apply(const BtPatternPropertiesDialog *self) { gchar *name; gulong length,voices; GST_INFO("applying pattern settings"); g_object_get(self->priv->pattern,"name",&name,"length",&length,"voices",&voices,NULL); // avoid notifies of properties that actualy have not changed g_object_freeze_notify((GObject *)(self->priv->pattern)); if(strcmp(self->priv->name,name)) g_object_set(self->priv->pattern,"name",self->priv->name,NULL); if(self->priv->length!=length) g_object_set(self->priv->pattern,"length",self->priv->length,NULL); if(self->priv->voices!=voices) g_object_set(self->priv->machine,"voices",self->priv->voices,NULL); g_object_thaw_notify((GObject *)(self->priv->pattern)); } //-- wrapper //-- class internals static void bt_pattern_properties_dialog_get_property(GObject * const object, const guint property_id, GValue * const value, GParamSpec * const pspec) { BtPatternPropertiesDialog *self = BT_PATTERN_PROPERTIES_DIALOG(object); return_if_disposed(); switch (property_id) { case PATTERN_PROPERTIES_DIALOG_NAME: { g_value_set_string(value, self->priv->name); } break; case PATTERN_PROPERTIES_DIALOG_LENGTH: { g_value_set_ulong(value, self->priv->length); } break; case PATTERN_PROPERTIES_DIALOG_VOICES: { g_value_set_ulong(value, self->priv->voices); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_pattern_properties_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtPatternPropertiesDialog *self = BT_PATTERN_PROPERTIES_DIALOG(object); return_if_disposed(); switch (property_id) { case PATTERN_PROPERTIES_DIALOG_PATTERN: { g_object_try_unref(self->priv->pattern); self->priv->pattern = g_value_dup_object(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_pattern_properties_dialog_dispose(GObject *object) { BtPatternPropertiesDialog *self = BT_PATTERN_PROPERTIES_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_try_unref(self->priv->pattern); g_object_try_unref(self->priv->machine); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_pattern_properties_dialog_parent_class)->dispose(object); } static void bt_pattern_properties_dialog_finalize(GObject *object) { BtPatternPropertiesDialog *self = BT_PATTERN_PROPERTIES_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->machine_id); g_free(self->priv->name); G_OBJECT_CLASS(bt_pattern_properties_dialog_parent_class)->finalize(object); } static void bt_pattern_properties_dialog_init(BtPatternPropertiesDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_PATTERN_PROPERTIES_DIALOG, BtPatternPropertiesDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_pattern_properties_dialog_class_init(BtPatternPropertiesDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtPatternPropertiesDialogPrivate)); gobject_class->get_property = bt_pattern_properties_dialog_get_property; gobject_class->set_property = bt_pattern_properties_dialog_set_property; gobject_class->dispose = bt_pattern_properties_dialog_dispose; gobject_class->finalize = bt_pattern_properties_dialog_finalize; g_object_class_install_property(gobject_class,PATTERN_PROPERTIES_DIALOG_PATTERN, g_param_spec_object("pattern", "pattern construct prop", "Set pattern object, the dialog handles", BT_TYPE_PATTERN, /* object type */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_PROPERTIES_DIALOG_NAME, g_param_spec_string("name", "name prop", "the display-name of the pattern", "unamed", /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_PROPERTIES_DIALOG_LENGTH, g_param_spec_ulong("length", "length prop", "length of the pattern in ticks", 1, G_MAXULONG, 1, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,PATTERN_PROPERTIES_DIALOG_VOICES, g_param_spec_ulong("voices", "voices prop", "number of voices in the pattern", 0, G_MAXULONG, 0, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/main-page-machines.h0000644042355400116100000000723211625722250016244 00000000000000/* $Id: main-page-machines.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGE_MACHINES_H #define BT_MAIN_PAGE_MACHINES_H #include #include #define BT_TYPE_MAIN_PAGE_MACHINES (bt_main_page_machines_get_type ()) #define BT_MAIN_PAGE_MACHINES(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGE_MACHINES, BtMainPageMachines)) #define BT_MAIN_PAGE_MACHINES_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGE_MACHINES, BtMainPageMachinesClass)) #define BT_IS_MAIN_PAGE_MACHINES(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGE_MACHINES)) #define BT_IS_MAIN_PAGE_MACHINES_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGE_MACHINES)) #define BT_MAIN_PAGE_MACHINES_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGE_MACHINES, BtMainPageMachinesClass)) /* type macros */ typedef struct _BtMainPageMachines BtMainPageMachines; typedef struct _BtMainPageMachinesClass BtMainPageMachinesClass; typedef struct _BtMainPageMachinesPrivate BtMainPageMachinesPrivate; /** * BtMainPageMachines: * * the machines page for the editor application */ struct _BtMainPageMachines { GtkVBox parent; /*< private >*/ BtMainPageMachinesPrivate *priv; }; struct _BtMainPageMachinesClass { GtkVBoxClass parent; }; // machine view area (4:3 aspect ratio) // @todo: should we check screens aspect ratio? #define MACHINE_VIEW_ZOOM_X (400.0*1.2) #define MACHINE_VIEW_ZOOM_Y (300.0*1.2) #define MACHINE_VIEW_ZOOM_FC 1.0 #define MACHINE_VIEW_GRID_FC 4.0 //#define MACHINE_VIEW_MACHINE_SIZE_X 35.0 //#define MACHINE_VIEW_MACHINE_SIZE_Y 23.0 #define MACHINE_VIEW_MACHINE_SIZE_X 42.0 #define MACHINE_VIEW_MACHINE_SIZE_Y 31.5 // 6.0 is too small #define MACHINE_VIEW_FONT_SIZE 6.5 #define MACHINE_VIEW_WIRE_PAD_SIZE 6.0 GType bt_main_page_machines_get_type(void) G_GNUC_CONST; #include "main-pages.h" BtMainPageMachines *bt_main_page_machines_new(const BtMainPages *pages); gboolean machine_view_get_machine_position(GHashTable *properties, gdouble *pos_x,gdouble *pos_y); gboolean bt_main_page_machines_wire_volume_popup(const BtMainPageMachines *self, BtWire *wire, gint xpos, gint ypos); gboolean bt_main_page_machines_wire_panorama_popup(const BtMainPageMachines *self, BtWire *wire, gint xpos, gint ypos); gboolean bt_main_page_machines_add_source_machine(const BtMainPageMachines *self, const gchar *id, const gchar *plugin_name); gboolean bt_main_page_machines_add_processor_machine(const BtMainPageMachines *self, const gchar *id, const gchar *plugin_name); void bt_main_page_machines_delete_machine(const BtMainPageMachines *self, BtMachine *machine); void bt_main_page_machines_delete_wire(const BtMainPageMachines *self, BtWire *wire); void bt_main_page_machines_rename_machine(const BtMainPageMachines *self, BtMachine *machine); #endif // BT_MAIN_PAGE_MACHINES_H buzztard-0.6.0/src/ui/edit/pattern-list-model.c0000644042355400116100000004504511636173377016360 00000000000000/* $Id: pattern-list-model.c 3647 2011-09-20 20:26:38Z ensonic $ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btpatternlistmodel * @short_description: data model class for widgets showing pattern of a song * * A generic model representing the patterns of a machine, suitable for * combo-boxes and treeview widgets. */ #define BT_EDIT #define BT_PATTERN_LIST_MODEL_C #include "bt-edit.h" //-- defines #define N_COLUMNS __BT_PATTERN_MODEL_N_COLUMNS //-- globals // keyboard shortcuts // CLEAR '.' // MUTE '-' // BREAK ',' // SOLO/BYPASS '_' static const gchar sink_pattern_keys[] = "-,0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const gchar source_pattern_keys[] ="-,_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const gchar processor_pattern_keys[]="-,_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //-- property ids //-- structs struct _BtPatternListModelPrivate { gint stamp; BtMachine *machine; BtSequence *sequence; gboolean skip_internal; /* shortcut table */ const char *pattern_keys; GType param_types[N_COLUMNS]; GSequence *seq; }; //-- the class static void bt_pattern_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtPatternListModel, bt_pattern_list_model, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL, bt_pattern_list_model_tree_model_init)); //-- helper static void on_pattern_name_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data); // we are comparing by type and name static gint model_item_cmp(gconstpointer a,gconstpointer b,gpointer data) { BtPattern *pa=(BtPattern *)a; BtPattern *pb=(BtPattern *)b; gchar *ida,*idb; gboolean iia,iib; gint c; if(a==b) return 0; g_object_get(pa,"name",&ida,"is-internal",&iia,NULL); g_object_get(pb,"name",&idb,"is-internal",&iib,NULL); if(iia && iib) { BtPatternCmd ca=bt_pattern_get_cmd(pa,0); BtPatternCmd cb=bt_pattern_get_cmd(pb,0); c=(ca %s: %d",ida,idb,c); g_free(ida);g_free(idb); return (c); } static void bt_pattern_list_model_add(BtPatternListModel *model,BtPattern *pattern) { GSequence *seq=model->priv->seq; GtkTreePath *path; GtkTreeIter iter; gint position; // check if pattern is internal if(model->priv->skip_internal) { gboolean is_internal; g_object_get(pattern,"is-internal",&is_internal,NULL); if(is_internal) { GST_INFO("not adding internal pattern to model"); return; } } GST_INFO("add pattern to model"); // insert new entry iter.stamp=model->priv->stamp; iter.user_data=g_sequence_insert_sorted(seq,pattern,model_item_cmp,NULL); position=g_sequence_iter_get_position(iter.user_data); g_signal_connect(pattern,"notify::name",G_CALLBACK(on_pattern_name_changed),(gpointer)model); // signal to the view/app path=gtk_tree_path_new(); gtk_tree_path_append_index(path,position); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); GST_DEBUG("inserted pattern %p at position %d",pattern, position); } static void bt_pattern_list_model_rem(BtPatternListModel *model,BtPattern *pattern) { GSequence *seq=model->priv->seq; GtkTreePath *path; GSequenceIter *iter; gint position; GST_INFO("removing pattern from model"); g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pattern_name_changed,(gpointer)model); // remove entry #if GLIB_CHECK_VERSION(2,28,0) iter=g_sequence_lookup(seq,pattern,model_item_cmp,NULL); #else iter=g_sequence_iter_prev(g_sequence_search(seq,pattern,model_item_cmp,NULL)); #endif position=g_sequence_iter_get_position(iter); g_sequence_remove(iter); // signal to the view/app path=gtk_tree_path_new(); gtk_tree_path_append_index(path,position); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model),path); gtk_tree_path_free(path); GST_INFO("removed pattern from model at pos %d ", position); } //-- signal handlers static void on_pattern_name_changed(BtPattern *pattern,GParamSpec *arg,gpointer user_data) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(user_data); GSequence *seq=model->priv->seq; GtkTreePath *path; GtkTreeIter iter; gint pos1,pos2=-1; // find the item by pattern (cannot use model_item_cmp, as id has changed) iter.stamp=model->priv->stamp; for(pos1=0;pos1 %d",pos1,pos2); // signal updates if(pos1!=pos2) { path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos1); gtk_tree_model_row_deleted(GTK_TREE_MODEL(model),path); gtk_tree_path_free(path); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos2); gtk_tree_model_row_inserted(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } else { path=gtk_tree_path_new(); gtk_tree_path_append_index(path,pos2); gtk_tree_model_row_changed(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } } static void on_pattern_added(BtMachine *machine,BtPattern *pattern,gpointer user_data) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(user_data); bt_pattern_list_model_add(model,pattern); } static void on_pattern_removed(BtMachine *machine,BtPattern *pattern,gpointer user_data) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(user_data); bt_pattern_list_model_rem(model,pattern); } static void on_sequence_pattern_usage_changed(BtSequence *sequence,BtPattern *pattern,gpointer user_data) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(user_data); BtMachine *machine; g_object_get(pattern,"machine",&machine,NULL); if(machine) { if(machine==model->priv->machine) { GSequence *seq=model->priv->seq; GtkTreeIter iter; GtkTreePath *path; // find the item by pattern iter.stamp=model->priv->stamp; #if GLIB_CHECK_VERSION(2,28,0) iter.user_data=g_sequence_lookup(seq,pattern,model_item_cmp,NULL); #else iter.user_data=g_sequence_iter_prev(g_sequence_search(seq,pattern,model_item_cmp,NULL)); #endif path=gtk_tree_path_new(); gtk_tree_path_append_index(path,g_sequence_iter_get_position(iter.user_data)); gtk_tree_model_row_changed(GTK_TREE_MODEL(model),path,&iter); gtk_tree_path_free(path); } g_object_unref(machine); } } //-- constructor methods /** * bt_pattern_list_model_new: * @machine: the machine * @sequence: the sequence * @skip_internal: wheter to include internal patterns or not * * Creates a list model of patterns for the @machne. The model is automatically * updated when patterns are added, removed or changed. The @sequence is used to * track the use of patterns. * * Returns: the pattern model. */ BtPatternListModel *bt_pattern_list_model_new(BtMachine *machine,BtSequence *sequence,gboolean skip_internal) { BtPatternListModel *self; BtPattern *pattern; GList *node,*list; self=g_object_new(BT_TYPE_PATTERN_LIST_MODEL, NULL); self->priv->sequence=sequence; g_object_add_weak_pointer((GObject *)sequence,(gpointer *)&self->priv->sequence); self->priv->machine=machine; g_object_add_weak_pointer((GObject *)machine,(gpointer *)&self->priv->machine); self->priv->skip_internal=skip_internal; self->priv->param_types[BT_PATTERN_MODEL_LABEL]=G_TYPE_STRING; self->priv->param_types[BT_PATTERN_MODEL_IS_USED]=G_TYPE_BOOLEAN; self->priv->param_types[BT_PATTERN_MODEL_IS_UNUSED]=G_TYPE_BOOLEAN; self->priv->param_types[BT_PATTERN_MODEL_SHORTCUT]=G_TYPE_STRING; // shortcut keys (take skiping into account) self->priv->pattern_keys=skip_internal?&sink_pattern_keys[2]:sink_pattern_keys; if(BT_IS_PROCESSOR_MACHINE(self->priv->machine)) { self->priv->pattern_keys=skip_internal?&processor_pattern_keys[3]:processor_pattern_keys; } else if(BT_IS_SOURCE_MACHINE(self->priv->machine)) { self->priv->pattern_keys=skip_internal?&source_pattern_keys[3]:source_pattern_keys; } // get pattern list from machine g_object_get((gpointer)machine,"patterns",&list,NULL); // add patterns for(node=list;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); // we take no extra ref on the patterns here bt_pattern_list_model_add(self,pattern); g_object_unref(pattern); } g_list_free(list); g_signal_connect(machine,"pattern-added",G_CALLBACK(on_pattern_added),(gpointer)self); g_signal_connect(machine,"pattern-removed",G_CALLBACK(on_pattern_removed),(gpointer)self); g_signal_connect(sequence,"pattern-added",G_CALLBACK(on_sequence_pattern_usage_changed),(gpointer)self); g_signal_connect(sequence,"pattern-removed",G_CALLBACK(on_sequence_pattern_usage_changed),(gpointer)self); return(self); } //-- methods /** * bt_pattern_list_model_get_object: * @model: the model * @iter: the iter * * The the #BtPattern for the iter. */ BtPattern *bt_pattern_list_model_get_object(BtPatternListModel *model,GtkTreeIter *iter) { return(g_sequence_get(iter->user_data)); } /* more efficient than main-page-patterns::pattern_menu_model_get_iter_by_pattern() gboolean bt_pattern_list_model_get_iter(BtPatternListModel *model,GtkTreeIter *iter,BtPattern *pattern) { GSequence *seq=model->priv->seq; iter->stamp=model->priv->stamp; #if GLIB_CHECK_VERSION(2,28,0) iter->user_data=g_sequence_lookup(seq,pattern,model_item_cmp,NULL); #else iter->user_data=g_sequence_iter_prev(g_sequence_search(seq,pattern,model_item_cmp,NULL)); #endif return(g_sequence_get(iter->user_data)==pattern); } */ //-- tree model interface static GtkTreeModelFlags bt_pattern_list_model_tree_model_get_flags(GtkTreeModel *tree_model) { return(GTK_TREE_MODEL_ITERS_PERSIST | GTK_TREE_MODEL_LIST_ONLY); } static gint bt_pattern_list_model_tree_model_get_n_columns(GtkTreeModel *tree_model) { return(N_COLUMNS); } static GType bt_pattern_list_model_tree_model_get_column_type(GtkTreeModel *tree_model,gint index) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); g_return_val_if_fail(indexpriv->param_types[index]); } static gboolean bt_pattern_list_model_tree_model_get_iter(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreePath *path) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); GSequence *seq=model->priv->seq; gint i=gtk_tree_path_get_indices (path)[0]; if(i>=g_sequence_get_length(seq)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_iter_at_pos(seq,i); return(TRUE); } static GtkTreePath *bt_pattern_list_model_tree_model_get_path(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); GtkTreePath *path; g_return_val_if_fail(iter->stamp==model->priv->stamp,NULL); if(g_sequence_iter_is_end(iter->user_data)) return(NULL); path=gtk_tree_path_new(); gtk_tree_path_append_index(path,g_sequence_iter_get_position(iter->user_data)); return(path); } static void bt_pattern_list_model_tree_model_get_value(GtkTreeModel *tree_model,GtkTreeIter *iter,gint column,GValue *value) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); BtPattern *pattern; g_return_if_fail(columnpriv->param_types[column]); if((pattern=g_sequence_get(iter->user_data))) { switch(column) { case BT_PATTERN_MODEL_LABEL: g_object_get_property((GObject *)pattern,"name",value); break; case BT_PATTERN_MODEL_IS_USED: { gboolean is_used=FALSE; if(!model->priv->skip_internal) { /* treat internal patterns as always used */ g_object_get(pattern,"is-internal",&is_used,NULL); } if(!is_used && model->priv->sequence) { is_used=bt_sequence_is_pattern_used(model->priv->sequence,pattern); } g_value_set_boolean(value,is_used); break; } case BT_PATTERN_MODEL_IS_UNUSED: { gboolean is_used=FALSE; if(!model->priv->skip_internal) { /* treat internal patterns as always used */ g_object_get(pattern,"is-internal",&is_used,NULL); } if(!is_used && model->priv->sequence) { is_used=bt_sequence_is_pattern_used(model->priv->sequence,pattern); } g_value_set_boolean(value,!is_used); break; } case BT_PATTERN_MODEL_SHORTCUT: { gchar key[2]={0,}; gint index; index=g_sequence_iter_get_position(iter->user_data); key[0]=(index<64)?model->priv->pattern_keys[index]:' '; g_value_set_string(value,key); break; } } } } static gboolean bt_pattern_list_model_tree_model_iter_next(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); gboolean res; g_return_val_if_fail(model->priv->stamp==iter->stamp,FALSE); iter->user_data=g_sequence_iter_next(iter->user_data); if((res=g_sequence_iter_is_end(iter->user_data))) iter->stamp=0; return !res; } static gboolean bt_pattern_list_model_tree_model_iter_children(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); /* this is a list, nodes have no children */ if (!parent) { if (g_sequence_get_length(model->priv->seq)>0) { iter->stamp=model->priv->stamp; iter->user_data=g_sequence_get_begin_iter(model->priv->seq); return(TRUE); } } iter->stamp=0; return(FALSE); } static gboolean bt_pattern_list_model_tree_model_iter_has_child(GtkTreeModel *tree_model,GtkTreeIter *iter) { return(FALSE); } static gint bt_pattern_list_model_tree_model_iter_n_children(GtkTreeModel *tree_model,GtkTreeIter *iter) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); if (iter == NULL) return g_sequence_get_length(model->priv->seq); g_return_val_if_fail(model->priv->stamp==iter->stamp,-1); return(0); } static gboolean bt_pattern_list_model_tree_model_iter_nth_child(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *parent,gint n) { BtPatternListModel *model=BT_PATTERN_LIST_MODEL(tree_model); GSequenceIter *child; iter->stamp=0; if (parent) return(FALSE); child=g_sequence_get_iter_at_pos(model->priv->seq,n); if(g_sequence_iter_is_end(child)) return(FALSE); iter->stamp=model->priv->stamp; iter->user_data=child; return(TRUE); } static gboolean bt_pattern_list_model_tree_model_iter_parent(GtkTreeModel *tree_model,GtkTreeIter *iter,GtkTreeIter *child) { iter->stamp=0; return(FALSE); } static void bt_pattern_list_model_tree_model_init(gpointer const g_iface, gpointer const iface_data) { GtkTreeModelIface * const iface = g_iface; iface->get_flags = bt_pattern_list_model_tree_model_get_flags; iface->get_n_columns = bt_pattern_list_model_tree_model_get_n_columns; iface->get_column_type = bt_pattern_list_model_tree_model_get_column_type; iface->get_iter = bt_pattern_list_model_tree_model_get_iter; iface->get_path = bt_pattern_list_model_tree_model_get_path; iface->get_value = bt_pattern_list_model_tree_model_get_value; iface->iter_next = bt_pattern_list_model_tree_model_iter_next; iface->iter_children = bt_pattern_list_model_tree_model_iter_children; iface->iter_has_child = bt_pattern_list_model_tree_model_iter_has_child; iface->iter_n_children = bt_pattern_list_model_tree_model_iter_n_children; iface->iter_nth_child = bt_pattern_list_model_tree_model_iter_nth_child; iface->iter_parent = bt_pattern_list_model_tree_model_iter_parent; } //-- class internals static void bt_pattern_list_model_finalize(GObject *object) { BtPatternListModel *self = BT_PATTERN_LIST_MODEL(object); GST_DEBUG("!!!! self=%p",self); if(self->priv->machine) { BtMachine *machine=self->priv->machine; BtPattern *pattern; GList *list, *node; g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pattern_added,(gpointer)self); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pattern_removed,(gpointer)self); g_object_get((gpointer)machine,"patterns",&list,NULL); for(node=list;node;node=g_list_next(node)) { pattern=BT_PATTERN(node->data); g_signal_handlers_disconnect_matched(pattern,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_pattern_name_changed,(gpointer)self); g_object_unref(pattern); } g_list_free(list); g_object_remove_weak_pointer((GObject *)machine,(gpointer *)&self->priv->machine); } if(self->priv->sequence) { g_signal_handlers_disconnect_matched(self->priv->sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_sequence_pattern_usage_changed,(gpointer)self); g_object_remove_weak_pointer((GObject *)self->priv->sequence,(gpointer *)&self->priv->sequence); } g_sequence_free(self->priv->seq); G_OBJECT_CLASS(bt_pattern_list_model_parent_class)->finalize(object); } static void bt_pattern_list_model_init(BtPatternListModel *self) { self->priv=G_TYPE_INSTANCE_GET_PRIVATE(self,BT_TYPE_PATTERN_LIST_MODEL,BtPatternListModelPrivate); self->priv->seq=g_sequence_new (NULL); // random int to check whether an iter belongs to our model self->priv->stamp=g_random_int(); } static void bt_pattern_list_model_class_init(BtPatternListModelClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtPatternListModelPrivate)); gobject_class->finalize = bt_pattern_list_model_finalize; } buzztard-0.6.0/src/ui/edit/crash-recover-dialog.c0000644042355400116100000002736611666464237016643 00000000000000/* $Id: crash-recover-dialog.c 3734 2011-12-02 23:24:23Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btcrashrecoverdialog * @short_description: class for the song recovery dialog * * Show a dialog listing found unsaved songs. Allows to delete or restore them. */ /* what info do we want to show in the list * - songs names (ev. try to shorten $HOME or even songdir) * - last saved data * - number of changes? * * what actions do we wan to offer * - close dialog * - delete log (ask for confirmation) * - recover log * - show message afterwards and ask to check and save? * * - other implementations: * - jokosher: * http://blog.mikeasoft.com/2008/08/10/improved-crash-protection-for-jokosher/ * - list of entries with restore and delete buttons * - menu entry in file-menu * * whats the work flow if there are multiple entries found? right now: * - we close this dialog after one got restored * - one would save or close the file * - one would invoke this dialog from the menu again. * */ #define BT_EDIT #define BT_CRASH_RECOVER_DIALOG_C #include "bt-edit.h" //-- property ids enum { CRASH_RECOVER_DIALOG_ENTRIES=1, }; enum { COL_LOG_NAME=0, COL_SONG_FILE_NAME, COL_CHANGE_TS }; struct _BtCrashRecoverDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; GList *entries; GtkTreeView *entries_list; /* the application */ BtEditApplication *app; }; //-- the class G_DEFINE_TYPE (BtCrashRecoverDialog, bt_crash_recover_dialog, GTK_TYPE_DIALOG); //-- helper static gboolean check_selection(BtCrashRecoverDialog *self,GtkTreeModel **model,GtkTreeIter *iter) { GtkTreeSelection *selection; selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->entries_list)); return gtk_tree_selection_get_selected(selection, model, iter); } static gchar *get_selected(BtCrashRecoverDialog *self) { GtkTreeModel *model; GtkTreeIter iter; gchar *log_name=NULL; if(check_selection(self, &model, &iter)) { gtk_tree_model_get(model,&iter,COL_LOG_NAME,&log_name,-1); } return(log_name); } static void remove_selected(BtCrashRecoverDialog *self) { GtkTreeModel *model; GtkTreeIter iter; if(check_selection(self, &model, &iter)) { GtkTreeIter next_iter=iter; gboolean have_next=(gtk_tree_model_iter_next(model,&next_iter) || gtk_tree_model_get_iter_first(model,&next_iter)); gtk_list_store_remove(GTK_LIST_STORE(model),&iter); if(have_next) { gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->entries_list)),&next_iter); } } } //-- event handler static void on_list_size_request(GtkWidget *widget,GtkRequisition *requisition,gpointer user_data) { gint max_height=gdk_screen_get_height(gdk_screen_get_default())/2; gint height=2+MIN(requisition->height,max_height); /* make sure the dialog resize without scrollbar until it would reach half * screen height */ GST_DEBUG(" height=%d",height); gtk_widget_set_size_request(gtk_widget_get_parent(widget),-1,height); } static void on_recover_clicked(GtkButton *button, gpointer user_data) { BtCrashRecoverDialog *self = BT_CRASH_RECOVER_DIALOG(user_data); gchar *log_name=get_selected(self); gboolean res=FALSE; BtMainWindow *main_window; if(log_name) { BtChangeLog *change_log=bt_change_log_new(); GST_INFO("recovering: %s",log_name); if(bt_change_log_recover(change_log,log_name)) { remove_selected(self); res=TRUE; } g_free(log_name); g_object_try_unref(change_log); } g_object_get(self->priv->app,"main-window",&main_window,NULL); /* close the recovery dialog */ gtk_dialog_response(GTK_DIALOG(self),GTK_RESPONSE_CLOSE); if(res) { /* the song recovery has been finished */ bt_dialog_message(main_window,_("Recovery finished"), _("The selected song has been recovered successful."), _("Please check the song and save it if everything is alright.") ); } else { /* FIXME: the log is still there * - this dialog should be a warning * - ev. we want to suggest to ask for support */ bt_dialog_message(main_window,_("Recovery failed"), _("Sorry, the selected song could not be fully recovered."), _("Please check the song and save it if still looks good.") ); } g_object_unref(main_window); } static void on_delete_clicked(GtkButton *button, gpointer user_data) { BtCrashRecoverDialog *self = BT_CRASH_RECOVER_DIALOG(user_data); gchar *log_name=get_selected(self); if(log_name) { g_remove(log_name); remove_selected(self); g_free(log_name); /* if that was the last entry, close dialog */ if(!check_selection(self, NULL, NULL)) { gtk_dialog_response(GTK_DIALOG(self),GTK_RESPONSE_CLOSE); } } } //-- helper methods static void bt_crash_recover_dialog_init_ui(const BtCrashRecoverDialog *self) { GtkWidget *label,*icon,*hbox,*vbox,*btn,*entries_view; gchar *str; GtkCellRenderer *renderer; GtkListStore *store; GtkTreeIter tree_iter; GList *node; BtChangeLogFile *crash_entry; GST_DEBUG("prepare crash recover dialog"); gtk_widget_set_name(GTK_WIDGET(self),"Unsaved song recovery"); gtk_window_set_title(GTK_WINDOW(self),_("Unsaved song recovery")); // add dialog commision widgets (okay) // FIXME: add Okay, Cancel, Delete // select song + okay -> recover // select song + delete -> remove log gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL); // content area hbox=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(hbox),6); icon=gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_DIALOG); gtk_box_pack_start(GTK_BOX(hbox),icon,FALSE,FALSE,0); vbox=gtk_vbox_new(FALSE,6); str=g_strdup_printf("%s\n%s\n",_("Unsaved songs found"),_("Select them one by one and choose 'recover' or 'delete'.")); label=g_object_new(GTK_TYPE_LABEL,"use-markup",TRUE,"label",str,NULL); g_free(str); gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0); self->priv->entries_list=GTK_TREE_VIEW(gtk_tree_view_new()); g_object_set(self->priv->entries_list, "enable-search",FALSE, "rules-hint",TRUE, /*"fixed-height-mode",TRUE,*/ // causes the first column to be not shown (or getting width=0) NULL); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(self->priv->entries_list),GTK_SELECTION_BROWSE); g_signal_connect(self->priv->entries_list,"size-request",G_CALLBACK(on_list_size_request),(gpointer)self); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); /* column listing song file names to recover */ gtk_tree_view_insert_column_with_attributes(self->priv->entries_list,-1,_("Song file"),renderer, "text",COL_SONG_FILE_NAME, NULL); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); /* column listing song file names to recover */ gtk_tree_view_insert_column_with_attributes(self->priv->entries_list,-1,_("Last changed"),renderer, "text",COL_CHANGE_TS, NULL); // fill model from self->priv->entries store=gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING,G_TYPE_STRING); for(node=self->priv->entries;node;node=g_list_next(node)) { crash_entry=(BtChangeLogFile *)node->data; gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LOG_NAME,crash_entry->log_name, COL_SONG_FILE_NAME,crash_entry->song_file_name, COL_CHANGE_TS,crash_entry->change_ts, -1); } gtk_tree_view_set_model(self->priv->entries_list,GTK_TREE_MODEL(store)); g_object_unref(store); // drop with treeview entries_view = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(entries_view), GTK_SHADOW_IN); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(entries_view), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(entries_view),GTK_WIDGET(self->priv->entries_list)); gtk_box_pack_start(GTK_BOX(vbox),entries_view,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(hbox),vbox,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(self))),hbox,TRUE,TRUE,0); // add "undelete" button to action area // GTK_STOCK_REVERT_TO_SAVED btn=gtk_button_new_with_label(_("Recover")); g_signal_connect(btn, "clicked", G_CALLBACK(on_recover_clicked), (gpointer)self); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(self))),btn,FALSE,FALSE,0); btn=gtk_button_new_from_stock(GTK_STOCK_DELETE); g_signal_connect(btn, "clicked", G_CALLBACK(on_delete_clicked), (gpointer)self); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(self))),btn,FALSE,FALSE,0); } //-- constructor methods /** * bt_crash_recover_dialog_new: * @crash_entries: list of found change-logs * * Create a new instance * * Returns: the new instance */ BtCrashRecoverDialog *bt_crash_recover_dialog_new(GList *crash_entries) { BtCrashRecoverDialog *self; self=BT_CRASH_RECOVER_DIALOG(g_object_new(BT_TYPE_CRASH_RECOVER_DIALOG,"entries",crash_entries,NULL)); bt_crash_recover_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_crash_recover_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtCrashRecoverDialog *self = BT_CRASH_RECOVER_DIALOG(object); return_if_disposed(); switch (property_id) { case CRASH_RECOVER_DIALOG_ENTRIES: { self->priv->entries = g_value_get_pointer(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_crash_recover_dialog_dispose(GObject *object) { BtCrashRecoverDialog *self = BT_CRASH_RECOVER_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_crash_recover_dialog_parent_class)->dispose(object); } static void bt_crash_recover_dialog_init(BtCrashRecoverDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_CRASH_RECOVER_DIALOG, BtCrashRecoverDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_crash_recover_dialog_class_init(BtCrashRecoverDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtCrashRecoverDialogPrivate)); gobject_class->set_property = bt_crash_recover_dialog_set_property; gobject_class->dispose = bt_crash_recover_dialog_dispose; g_object_class_install_property(gobject_class,CRASH_RECOVER_DIALOG_ENTRIES, g_param_spec_pointer("entries", "entries construct prop", "Set crash-entry list, the dialog handles", G_PARAM_CONSTRUCT_ONLY|G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/wire-canvas-item.h0000644042355400116100000000471511627201247015777 00000000000000/* $Id: wire-canvas-item.h 3619 2011-08-30 15:32:54Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_WIRE_CANVAS_ITEM_H #define BT_WIRE_CANVAS_ITEM_H #include #include #define BT_TYPE_WIRE_CANVAS_ITEM (bt_wire_canvas_item_get_type ()) #define BT_WIRE_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_WIRE_CANVAS_ITEM, BtWireCanvasItem)) #define BT_WIRE_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_WIRE_CANVAS_ITEM, BtWireCanvasItemClass)) #define BT_IS_WIRE_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_WIRE_CANVAS_ITEM)) #define BT_IS_WIRE_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_WIRE_CANVAS_ITEM)) #define BT_WIRE_CANVAS_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_WIRE_CANVAS_ITEM, BtWireCanvasItemClass)) /* type macros */ typedef struct _BtWireCanvasItem BtWireCanvasItem; typedef struct _BtWireCanvasItemClass BtWireCanvasItemClass; typedef struct _BtWireCanvasItemPrivate BtWireCanvasItemPrivate; /** * BtWireCanvasItem: * * the root window for the editor application */ struct _BtWireCanvasItem { GnomeCanvasGroup parent; /*< private >*/ BtWireCanvasItemPrivate *priv; }; struct _BtWireCanvasItemClass { GnomeCanvasGroupClass parent; }; GType bt_wire_canvas_item_get_type(void) G_GNUC_CONST; BtWireCanvasItem *bt_wire_canvas_item_new(const BtMainPageMachines *main_page_machines,BtWire *wire,gdouble pos_xs,gdouble pos_ys,gdouble pos_xe,gdouble pos_ye,BtMachineCanvasItem *src_machine_item,BtMachineCanvasItem *dst_machine_item); void bt_wire_show_analyzer_dialog(BtWire *wire); #endif // BT_WIRE_CANVAS_ITEM_H buzztard-0.6.0/src/ui/edit/main-page-info.h0000644042355400116100000000427111625722250015410 00000000000000/* $Id: main-page-info.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_PAGE_INFO_H #define BT_MAIN_PAGE_INFO_H #include #include #define BT_TYPE_MAIN_PAGE_INFO (bt_main_page_info_get_type ()) #define BT_MAIN_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_PAGE_INFO, BtMainPageInfo)) #define BT_MAIN_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_PAGE_INFO, BtMainPageInfoClass)) #define BT_IS_MAIN_PAGE_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_PAGE_INFO)) #define BT_IS_MAIN_PAGE_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_PAGE_INFO)) #define BT_MAIN_PAGE_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_PAGE_INFO, BtMainPageInfoClass)) /* type macros */ typedef struct _BtMainPageInfo BtMainPageInfo; typedef struct _BtMainPageInfoClass BtMainPageInfoClass; typedef struct _BtMainPageInfoPrivate BtMainPageInfoPrivate; /** * BtMainPageInfo: * * the info page for the editor application */ struct _BtMainPageInfo { GtkVBox parent; /*< private >*/ BtMainPageInfoPrivate *priv; }; struct _BtMainPageInfoClass { GtkVBoxClass parent; }; GType bt_main_page_info_get_type(void) G_GNUC_CONST; #include "main-pages.h" BtMainPageInfo *bt_main_page_info_new(const BtMainPages *pages); #endif // BT_MAIN_PAGE_INFO_H buzztard-0.6.0/src/ui/edit/interaction-controller-menu.c0000644042355400116100000003740311620320142020246 00000000000000/* $Id: interaction-controller-menu.c 3533 2011-08-09 21:02:22Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btinteractioncontrollermenu * @short_description: class for the interaction controller assignment popup menu * * Build a menu with available interaction controllers of a type. */ #define BT_EDIT #define BT_INTERACTION_CONTROLLER_MENU_C #include "bt-edit.h" //-- property ids enum { INTERACTION_CONTROLLER_MENU_TYPE=1, INTERACTION_CONTROLLER_MENU_SELECTED_CONTROL, INTERACTION_CONTROLLER_MENU_ITEM_UNBIND, INTERACTION_CONTROLLER_MENU_ITEM_UNBIND_ALL }; struct _BtInteractionControllerMenuPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; BtInteractionControllerMenuType type; /* the selected control */ BtIcControl *selected_control; /* sub menu (needed to update the menu) */ GtkWidget *device_menu; /* actions */ GtkWidget *item_unbind,*item_unbind_all; /* signal handler id */ gulong ic_changed_handler_id; }; static GQuark widget_parent_quark=0; //-- the class G_DEFINE_TYPE (BtInteractionControllerMenu, bt_interaction_controller_menu, GTK_TYPE_MENU); //-- prototypes static void bt_interaction_controller_menu_init_device_menu(const BtInteractionControllerMenu *self); //-- enums GType bt_interaction_controller_menu_type_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_INTERACTION_CONTROLLER_RANGE_MENU, "BT_INTERACTION_CONTROLLER_RANGE_MENU", "range controllers" }, { BT_INTERACTION_CONTROLLER_TRIGGER_MENU, "BT_INTERACTION_CONTROLLER_TRIGGER_MENU", "trigger controllers" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtInteractionControllerMenuType", values); } return type; } //-- event handler void on_devices_changed(BtIcRegistry * const registry, const GParamSpec * const arg, gconstpointer const user_data) { BtInteractionControllerMenu *self=BT_INTERACTION_CONTROLLER_MENU(user_data); GST_INFO("devices changed"); bt_interaction_controller_menu_init_device_menu(self); } void on_controls_changed(BtIcDevice * const device, const GParamSpec * const arg, gconstpointer const user_data) { BtInteractionControllerMenu *self=BT_INTERACTION_CONTROLLER_MENU(user_data); GST_INFO("controls changed"); bt_interaction_controller_menu_init_device_menu(self); } static void on_control_bind_activated(GtkMenuItem *menuitem, gpointer user_data) { BtInteractionControllerMenu *self=BT_INTERACTION_CONTROLLER_MENU(g_object_get_qdata(G_OBJECT(menuitem),widget_parent_quark)); BtIcControl *control=BTIC_CONTROL(user_data); #if 0 GtkWidget *parent; parent=gtk_widget_get_parent(gtk_widget_get_parent(GTK_WIDGET(menuitem))); GST_WARNING("1.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); parent=gtk_widget_get_toplevel(GTK_WIDGET(menuitem)); GST_WARNING("2.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); //parent=gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_toplevel(GTK_WIDGET(menuitem)))); //GST_WARNING("3.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); parent=gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(GTK_WIDGET(menuitem)))); GST_WARNING("3.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); parent=gtk_widget_get_parent(gtk_menu_get_attach_widget(GTK_MENU(gtk_widget_get_parent(GTK_WIDGET(menuitem))))); GST_WARNING("4.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); parent=gtk_widget_get_parent(gtk_menu_get_attach_widget(GTK_MENU( gtk_widget_get_parent(gtk_menu_get_attach_widget(GTK_MENU( gtk_widget_get_parent(GTK_WIDGET(menuitem)))))))); GST_WARNING("5.) %p =? %p (%s)",self,parent,G_OBJECT_TYPE_NAME(parent)); #endif g_object_set(self,"selected-control",control,NULL); } static void on_control_learn_activated(GtkMenuItem *menuitem, gpointer user_data) { BtInteractionControllerMenu *self=BT_INTERACTION_CONTROLLER_MENU(g_object_get_qdata(G_OBJECT(menuitem),widget_parent_quark)); BtIcDevice *device=BTIC_DEVICE(user_data); BtInteractionControllerLearnDialog *dialog; if((dialog=bt_interaction_controller_learn_dialog_new(device))) { bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(GTK_WIDGET(dialog)); } GST_INFO( "learn function activated on device"); } //-- helper methods static GtkWidget *bt_interaction_controller_menu_init_control_menu(const BtInteractionControllerMenu *self,BtIcDevice *device) { BtIcControl *control; GtkWidget *menu_item; GList *node,*list; gchar *str; GtkWidget *submenu=NULL; // add learn function entry for device which implement the BtIcLearn interface if(BTIC_IS_LEARN(device)) { submenu=gtk_menu_new(); menu_item=gtk_image_menu_item_new_with_label(_("Learn...")); gtk_menu_shell_append(GTK_MENU_SHELL(submenu),menu_item); g_object_set_qdata(G_OBJECT(menu_item),widget_parent_quark,(gpointer)self); gtk_widget_show(menu_item); // connect handler g_signal_connect(menu_item,"activate",G_CALLBACK(on_control_learn_activated),device); } // get list of controls per device g_object_get(device,"controls",&list,NULL); for(node=list;node;node=g_list_next(node)) { control=BTIC_CONTROL(node->data); // filter by self->priv->type switch(self->priv->type) { case BT_INTERACTION_CONTROLLER_RANGE_MENU: if(!BTIC_IS_ABS_RANGE_CONTROL(control)) continue; break; case BT_INTERACTION_CONTROLLER_TRIGGER_MENU: if(!BTIC_IS_TRIGGER_CONTROL(control)) continue; break; } g_object_get(control,"name",&str,NULL); GST_INFO(" Add control '%s'",str); if(!submenu) { submenu=gtk_menu_new(); } /* @todo: add icon: trigger=button, range=knob/slider (from glade?) */ menu_item=gtk_image_menu_item_new_with_label(str); gtk_menu_shell_append(GTK_MENU_SHELL(submenu),menu_item); g_object_set_qdata(G_OBJECT(menu_item),widget_parent_quark,(gpointer)self); gtk_widget_show(menu_item); g_free(str); // connect handler g_signal_connect(menu_item,"activate",G_CALLBACK(on_control_bind_activated),(gpointer)control); } g_list_free(list); return(submenu); } static void bt_interaction_controller_menu_init_device_menu(const BtInteractionControllerMenu *self) { BtIcRegistry *ic_registry; GList *list; // get list of interaction devices g_object_get(self->priv->app,"ic-registry",&ic_registry,NULL); g_object_get(ic_registry,"devices",&list,NULL); if(!self->priv->ic_changed_handler_id) { self->priv->ic_changed_handler_id=g_signal_connect(ic_registry,"notify::devices",G_CALLBACK(on_devices_changed),(gpointer)self); } g_object_unref(ic_registry); if(list) { GtkWidget *menu_item,*submenu,*parentmenu; BtIcDevice *device; GList *node; gchar *str; submenu=gtk_menu_new(); gtk_widget_set_name(submenu,"interaction controller submenu"); gtk_menu_item_set_submenu(GTK_MENU_ITEM(self->priv->device_menu),submenu); gtk_widget_set_sensitive(self->priv->device_menu,TRUE); for(node=list;node;node=g_list_next(node)) { device=BTIC_DEVICE(node->data); if(!g_signal_handler_find(device,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_controls_changed,(gpointer)self)) { g_signal_connect(device,"notify::controls",G_CALLBACK(on_controls_changed),(gpointer)self); } // only create items for non-empty submenus if((parentmenu=bt_interaction_controller_menu_init_control_menu(self,device))) { g_object_get(device,"name",&str,NULL); GST_INFO("Build control menu for '%s'",str); menu_item=gtk_image_menu_item_new_with_label(str); gtk_menu_shell_append(GTK_MENU_SHELL(submenu),menu_item); gtk_widget_show(menu_item); g_free(str); gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item),parentmenu); } } g_list_free(list); } else { gtk_widget_set_sensitive(self->priv->device_menu,FALSE); } } static void bt_interaction_controller_menu_init_ui(const BtInteractionControllerMenu *self) { GtkWidget *menu_item,*image; gtk_widget_set_name(GTK_WIDGET(self),"interaction controller menu"); menu_item=gtk_image_menu_item_new_with_label(_("Bind controller")); gtk_menu_shell_append(GTK_MENU_SHELL(self),menu_item); image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); self->priv->device_menu=menu_item; // add the device submenu bt_interaction_controller_menu_init_device_menu(self); self->priv->item_unbind=menu_item=gtk_image_menu_item_new_with_label(_("Unbind controller")); gtk_menu_shell_append(GTK_MENU_SHELL(self),menu_item); image=gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); self->priv->item_unbind_all=menu_item=gtk_image_menu_item_new_with_label(_("Unbind all controllers")); gtk_menu_shell_append(GTK_MENU_SHELL(self),menu_item); image=gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); } //-- constructor methods /** * bt_interaction_controller_menu_new: * @type: for which kind of controllers make a menu * * Create a new instance * * Returns: the new instance */ BtInteractionControllerMenu *bt_interaction_controller_menu_new(BtInteractionControllerMenuType type) { BtInteractionControllerMenu *self; self=BT_INTERACTION_CONTROLLER_MENU(g_object_new(BT_TYPE_INTERACTION_CONTROLLER_MENU,"type",type,NULL)); bt_interaction_controller_menu_init_ui(self); return(self); } //-- methods //-- class internals static void bt_interaction_controller_menu_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtInteractionControllerMenu *self = BT_INTERACTION_CONTROLLER_MENU(object); return_if_disposed(); switch (property_id) { case INTERACTION_CONTROLLER_MENU_TYPE: { g_value_set_enum(value, self->priv->type); } break; case INTERACTION_CONTROLLER_MENU_SELECTED_CONTROL: { g_value_set_object(value, self->priv->selected_control); } break; case INTERACTION_CONTROLLER_MENU_ITEM_UNBIND: { g_value_set_object(value, self->priv->item_unbind); } break; case INTERACTION_CONTROLLER_MENU_ITEM_UNBIND_ALL: { g_value_set_object(value, self->priv->item_unbind_all); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } /* sets the given properties for this object */ static void bt_interaction_controller_menu_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtInteractionControllerMenu *self = BT_INTERACTION_CONTROLLER_MENU(object); return_if_disposed(); switch (property_id) { case INTERACTION_CONTROLLER_MENU_TYPE: { self->priv->type=g_value_get_enum(value); } break; case INTERACTION_CONTROLLER_MENU_SELECTED_CONTROL: { g_object_try_unref(self->priv->selected_control); self->priv->selected_control = BTIC_CONTROL(g_value_dup_object(value)); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_interaction_controller_menu_dispose(GObject *object) { BtInteractionControllerMenu *self = BT_INTERACTION_CONTROLLER_MENU(object); BtIcRegistry *ic_registry; BtIcDevice *device; GList *node,*list; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); // disconnect notify handlers g_object_get(self->priv->app,"ic-registry",&ic_registry,NULL); g_object_get(ic_registry,"devices",&list,NULL); for(node=list;node;node=g_list_next(node)) { device=BTIC_DEVICE(node->data); g_signal_handlers_disconnect_matched(device,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_controls_changed,(gpointer)self); } g_signal_handlers_disconnect_matched(ic_registry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_devices_changed,(gpointer)self); g_object_unref(ic_registry); g_object_try_unref(self->priv->selected_control); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_interaction_controller_menu_parent_class)->dispose(object); } static void bt_interaction_controller_menu_init(BtInteractionControllerMenu *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_INTERACTION_CONTROLLER_MENU, BtInteractionControllerMenuPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_interaction_controller_menu_class_init(BtInteractionControllerMenuClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); widget_parent_quark=g_quark_from_static_string("BtInteractionControllerMenu::widget-parent"); g_type_class_add_private(klass,sizeof(BtInteractionControllerMenuPrivate)); gobject_class->set_property = bt_interaction_controller_menu_set_property; gobject_class->get_property = bt_interaction_controller_menu_get_property; gobject_class->dispose = bt_interaction_controller_menu_dispose; g_object_class_install_property(gobject_class,INTERACTION_CONTROLLER_MENU_TYPE, g_param_spec_enum("type", "menu type construct prop", "control types to list in the menu", BT_TYPE_INTERACTION_CONTROLLER_MENU_TYPE, /* enum type */ BT_INTERACTION_CONTROLLER_RANGE_MENU, /* default value */ G_PARAM_CONSTRUCT_ONLY|G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,INTERACTION_CONTROLLER_MENU_SELECTED_CONTROL, g_param_spec_object("selected-control", "selected control prop", "control after menu selection", BTIC_TYPE_CONTROL, /* object type */ G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,INTERACTION_CONTROLLER_MENU_ITEM_UNBIND, g_param_spec_object("item-unbind", "item unbind prop", "menu item for unbind command", GTK_TYPE_WIDGET, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,INTERACTION_CONTROLLER_MENU_ITEM_UNBIND_ALL, g_param_spec_object("item-unbind-all", "item unbind-all prop", "menu item for unbind-all command", GTK_TYPE_WIDGET, /* object type */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/buzztard-edit.desktop.in0000644042355400116100000000053211576360376017250 00000000000000[Desktop Entry] Version=0.6.0 Type=Application _Name=Buzztard Music Editor _Comment=Edit buzztard song files TryExec=buzztard-edit Exec=buzztard-edit --command=load --input-file=%f Terminal=false Icon=buzztard DocPath=buzztard/buzztard.xml StartupNotify=true Categories=GNOME;GTK;AudioVideo;Audio;Sequencer; MimeType=audio/x-bzt;audio/x-bzt-xml; buzztard-0.6.0/src/ui/edit/render-dialog.c0000644042355400116100000003514011666705670015343 00000000000000/* $Id: render-dialog.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btrenderdialog * @short_description: class for the editor render dialog * * Provides UI to access the song recording */ /* @todo: * - use chooserbutton to choose name too * (arg, the chooser button cannot do save_as) * - use song-name based file-name by default * * @todo: more options * - have dithering and noise shaping options here */ #define BT_EDIT #define BT_RENDER_DIALOG_C #include "bt-edit.h" enum { RENDER_DIALOG_FILENAME=1, RENDER_DIALOG_FORMAT, RENDER_DIALOG_MODE }; struct _BtRenderDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* dialog widgets */ GtkWidget *file_name_entry; GtkWidget *format_menu; /* dialog data */ gchar *folder,*filename; BtSinkBinRecordFormat format; BtRenderMode mode; }; static void on_format_menu_changed(GtkComboBox *menu, gpointer user_data); //-- the class G_DEFINE_TYPE (BtRenderDialog, bt_render_dialog, GTK_TYPE_DIALOG); //-- enums GType bt_render_mode_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_RENDER_MODE_MIXDOWN, "BT_RENDER_MODE_MIXDOWN", "mix to one track" }, { BT_RENDER_MODE_SINGLE_TRACKS, "BT_RENDER_MODE_SINGLE_TRACKS", "record one track for each source" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtRenderMode", values); } return type; } //-- event handler static void on_folder_changed(GtkFileChooser *chooser,gpointer user_data) { BtRenderDialog *self=BT_RENDER_DIALOG(user_data); g_free(self->priv->folder); self->priv->folder=gtk_file_chooser_get_current_folder(chooser); GST_DEBUG("folder changed '%s'",self->priv->folder); } static void on_filename_changed(GtkEditable *editable,gpointer user_data) { BtRenderDialog *self=BT_RENDER_DIALOG(user_data); g_free(self->priv->filename); self->priv->filename=g_strdup(gtk_entry_get_text(GTK_ENTRY(editable))); // update format if(self->priv->filename) { GEnumClass *enum_class; GEnumValue *enum_value; guint i; enum_class=g_type_class_peek_static(BT_TYPE_SINK_BIN_RECORD_FORMAT); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { if(g_str_has_suffix(self->priv->filename,enum_value->value_name)) { g_signal_handlers_block_matched(self->priv->format_menu,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_format_menu_changed,(gpointer)user_data); gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->format_menu),i); g_signal_handlers_unblock_matched(self->priv->format_menu,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_format_menu_changed,(gpointer)user_data); break; } } } } } static void on_format_menu_changed(GtkComboBox *menu, gpointer user_data) { BtRenderDialog *self=BT_RENDER_DIALOG(user_data); self->priv->format=gtk_combo_box_get_active(menu); // update filename if(self->priv->filename) { GEnumClass *enum_class; GEnumValue *enum_value; guint i; gchar *fn=self->priv->filename; enum_class=g_type_class_peek_static(BT_TYPE_SINK_BIN_RECORD_FORMAT); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { if(g_str_has_suffix(fn,enum_value->value_name)) { GST_INFO("found matching ext: %s",enum_value->value_name); // replace this suffix, with the new fn[strlen(fn)-strlen(enum_value->value_name)]='\0'; GST_INFO("cut fn to: %s",fn); break; } } } enum_value=g_enum_get_value(enum_class,self->priv->format); self->priv->filename=g_strdup_printf("%s%s",fn,enum_value->value_name); GST_INFO("set new fn to: %s",self->priv->filename); g_free(fn); g_signal_handlers_block_matched(self->priv->file_name_entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_filename_changed,(gpointer)user_data); gtk_entry_set_text(GTK_ENTRY(self->priv->file_name_entry), self->priv->filename); g_signal_handlers_unblock_matched(self->priv->file_name_entry,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_filename_changed,(gpointer)user_data); } } static void on_mode_menu_changed(GtkComboBox *menu, gpointer user_data) { BtRenderDialog *self=BT_RENDER_DIALOG(user_data); self->priv->mode=gtk_combo_box_get_active(menu); } //-- helper methods static gchar *bt_render_dialog_make_file_name(const BtRenderDialog *self) { gchar *file_name=g_build_filename(self->priv->folder,self->priv->filename,NULL); gchar *track_str=""; GEnumClass *enum_class; GEnumValue *enum_value; if(self->priv->mode==BT_RENDER_MODE_SINGLE_TRACKS) { track_str=".%03u"; } // add file suffix if not yet there enum_class=g_type_class_peek_static(BT_TYPE_SINK_BIN_RECORD_FORMAT); enum_value=g_enum_get_value(enum_class,self->priv->format); if(!g_str_has_suffix(file_name,enum_value->value_name)) { gchar *tmp_file_name; tmp_file_name=g_strdup_printf("%s%s%s", file_name,track_str,enum_value->value_name); g_free(file_name); file_name=tmp_file_name; } else { if(self->priv->mode==BT_RENDER_MODE_SINGLE_TRACKS) { gchar *tmp_file_name; file_name[strlen(file_name)-strlen(enum_value->value_name)]='\0'; tmp_file_name=g_strdup_printf("%s%s%s", file_name,track_str,enum_value->value_name); g_free(file_name); file_name=tmp_file_name; } } GST_INFO("record file template: '%s'",file_name); return(file_name); } static void bt_render_dialog_init_ui(const BtRenderDialog *self) { BtSettings *settings; GtkWidget *box,*label,*widget,*table; GEnumClass *enum_class; GEnumValue *enum_value; guint i; BtSong *song; BtSongInfo *song_info; gchar *full_file_name=NULL; GST_DEBUG("read settings"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"record-folder",&self->priv->folder,NULL); g_object_unref(settings); GST_DEBUG("prepare render dialog"); gtk_widget_set_name(GTK_WIDGET(self),"song rendering"); gtk_window_set_title(GTK_WINDOW(self),_("song rendering")); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // add widgets to the dialog content area box=gtk_vbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); table=gtk_table_new(/*rows=*/5,/*columns=*/2,/*homogenous=*/FALSE); gtk_container_add(GTK_CONTAINER(box),table); label=gtk_label_new(_("Folder")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 0, 1, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_file_chooser_button_new(_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (widget), self->priv->folder); g_signal_connect(widget, "selection-changed", G_CALLBACK(on_folder_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 0, 1, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); label=gtk_label_new(_("Filename")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); // set deault name g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"song-info",&song_info,NULL); g_object_get(song_info,"file-name",&full_file_name,NULL); if(full_file_name) { gchar *file_name,*ext; // cut off extension from file_name if((ext=strrchr(full_file_name,'.'))) *ext='\0'; if((file_name=strrchr(full_file_name,G_DIR_SEPARATOR))) file_name=&file_name[1]; else file_name=full_file_name; self->priv->filename=g_strdup_printf("%s.ogg",file_name); g_free(full_file_name); } else { self->priv->filename=g_strdup_printf(".ogg"); } g_object_unref(song_info); g_object_unref(song); self->priv->file_name_entry=widget=gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY (widget), self->priv->filename); gtk_entry_set_activates_default(GTK_ENTRY(self->priv->file_name_entry),TRUE); g_signal_connect(widget, "changed", G_CALLBACK(on_filename_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 1, 2, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); label=gtk_label_new(_("Format")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); // query supported formats from sinkbin self->priv->format_menu=widget=gtk_combo_box_text_new(); enum_class=g_type_class_peek_static(BT_TYPE_SINK_BIN_RECORD_FORMAT); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),enum_value->value_nick); } } gtk_combo_box_set_active(GTK_COMBO_BOX(widget),BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS); g_signal_connect(widget, "changed", G_CALLBACK(on_format_menu_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 2, 3, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); label=gtk_label_new(_("Mode")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(table),label, 0, 1, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); // query supported formats from sinkbin widget=gtk_combo_box_text_new(); enum_class=g_type_class_peek_static(BT_TYPE_RENDER_MODE); for(i=enum_class->minimum;i<=enum_class->maximum;i++) { if((enum_value=g_enum_get_value(enum_class,i))) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),enum_value->value_nick); } } gtk_combo_box_set_active(GTK_COMBO_BOX(widget),BT_RENDER_MODE_MIXDOWN); g_signal_connect(widget, "changed", G_CALLBACK(on_mode_menu_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(table),widget, 1, 2, 3, 4, GTK_FILL|GTK_EXPAND,GTK_FILL|GTK_EXPAND, 2,1); /* @todo: add more widgets o write project file o none, jokosher, ardour, ... */ GST_DEBUG("done"); } //-- constructor methods /** * bt_render_dialog_new: * * Create a new instance * * Returns: the new instance */ BtRenderDialog *bt_render_dialog_new(void) { BtRenderDialog *self; self=BT_RENDER_DIALOG(g_object_new(BT_TYPE_RENDER_DIALOG,NULL)); bt_render_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_render_dialog_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtRenderDialog *self = BT_RENDER_DIALOG(object); return_if_disposed(); switch (property_id) { case RENDER_DIALOG_FILENAME: { gchar *file_name=bt_render_dialog_make_file_name(self); g_value_set_string(value, file_name); g_free(file_name); } break; case RENDER_DIALOG_FORMAT: { g_value_set_enum(value, self->priv->format); } break; case RENDER_DIALOG_MODE: { g_value_set_enum(value, self->priv->mode); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_render_dialog_dispose(GObject *object) { BtRenderDialog *self = BT_RENDER_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_render_dialog_parent_class)->dispose(object); } static void bt_render_dialog_finalize(GObject *object) { BtRenderDialog *self = BT_RENDER_DIALOG(object); GST_DEBUG("!!!! self=%p",self); g_free(self->priv->folder); g_free(self->priv->filename); G_OBJECT_CLASS(bt_render_dialog_parent_class)->finalize(object); } static void bt_render_dialog_init(BtRenderDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_RENDER_DIALOG, BtRenderDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_render_dialog_class_init(BtRenderDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtRenderDialogPrivate)); gobject_class->get_property = bt_render_dialog_get_property; gobject_class->dispose = bt_render_dialog_dispose; gobject_class->finalize = bt_render_dialog_finalize; g_object_class_install_property(gobject_class,RENDER_DIALOG_FILENAME, g_param_spec_string("file-name", "file-name prop", "Get chosen filename", NULL, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,RENDER_DIALOG_FORMAT, g_param_spec_enum("format", "format prop", "format to use", BT_TYPE_SINK_BIN_RECORD_FORMAT, /* enum type */ BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS, /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class,RENDER_DIALOG_MODE, g_param_spec_enum("mode", "format mode", "render-mode to use", BT_TYPE_RENDER_MODE, /* enum type */ BT_RENDER_MODE_MIXDOWN, /* default value */ G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/bt-edit.h0000644042355400116100000001265511625722250014156 00000000000000/* $Id: bt-edit.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_EDIT_H #define BT_EDIT_H #ifdef HAVE_CONFIG_H # include "config.h" #endif //-- ansi c #include //#define __USE_ISOC99 /* for round() and co. */ #include #include #include #include //#define _XOPEN_SOURCE /* glibc2 needs this */ #define __USE_XOPEN #include #include //-- locale #ifdef HAVE_X11_XLOCALE_H /* defines a more portable setlocale for X11 (_Xsetlocale) */ #include #else #include #endif //-- i18n #ifndef _ #ifdef ENABLE_NLS #include #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define __(String) (String) #define N_(String) (String) #ifdef gettext #undef gettext #endif #define gettext(String) (String) #ifdef dgettext #undef dgettext #endif #define dgettext(Domain,String) (String) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #endif //-- libbtcore & libbtic #include #include //-- gstreamer #include #include //-- gstbuzztard #include #include #include #if !GST_CHECK_VERSION(0,10,20) #include #endif //-- glib #include //-- gtk+ #include #include //-- libgnomecanvas /* glib macro wrapper aliases - they have been deprecated * this is fixed in gnomecanvas 2.26 */ #ifndef GTK_CHECK_CAST #define GTK_CHECK_CAST G_TYPE_CHECK_INSTANCE_CAST #define GTK_CHECK_CLASS_CAST G_TYPE_CHECK_CLASS_CAST #define GTK_CHECK_GET_CLASS G_TYPE_INSTANCE_GET_CLASS #define GTK_CHECK_TYPE G_TYPE_CHECK_INSTANCE_TYPE #define GTK_CHECK_CLASS_TYPE G_TYPE_CHECK_CLASS_TYPE #endif #include //-- librsvg //#include //-- gnome-vfs #ifdef USE_GNOMEVFS #include #endif //-- hildon #ifdef USE_HILDON #include #endif #include "about-dialog.h" #include "change-log.h" #include "change-logger.h" #include "crash-recover-dialog.h" #include "edit-application.h" #include "interaction-controller-menu.h" #include "interaction-controller-learn-dialog.h" #include "machine-canvas-item.h" #include "machine-menu.h" #include "machine-actions.h" #include "machine-list-model.h" #include "machine-preset-properties-dialog.h" #include "machine-properties-dialog.h" #include "machine-preferences-dialog.h" #include "machine-rename-dialog.h" #include "main-menu.h" #include "main-pages.h" #include "main-page-machines.h" #include "main-page-patterns.h" #include "main-page-sequence.h" #include "main-page-waves.h" #include "main-page-info.h" #include "main-statusbar.h" #include "main-toolbar.h" #include "main-window.h" #include "missing-framework-elements-dialog.h" #include "missing-song-elements-dialog.h" #include "object-list-model.h" #include "panorama-popup.h" #include "pattern-list-model.h" #include "pattern-properties-dialog.h" #include "pattern-editor.h" #include "playback-controller-socket.h" #include "render-dialog.h" #include "render-progress.h" #include "sequence-grid-model.h" #include "sequence-view.h" #include "settings-dialog.h" #include "settings-page-audiodevices.h" #include "settings-page-directories.h" #include "settings-page-interaction-controller.h" #include "settings-page-playback-controller.h" #include "settings-page-shortcuts.h" #include "signal-analysis-dialog.h" #include "tip-dialog.h" #include "tools.h" #include "ui-resources.h" #include "volume-popup.h" #include "wave-viewer.h" #include "wire-canvas-item.h" #include "marshal.h" //-- misc #ifndef GST_CAT_DEFAULT #define GST_CAT_DEFAULT bt_edit_debug #endif #if defined(BT_EDIT) && !defined(BT_EDIT_APPLICATION_C) GST_DEBUG_CATEGORY_EXTERN(GST_CAT_DEFAULT); #endif /** * GNOME_CANVAS_BROKEN_PROPERTIES: * * gnome canvas has a broken design, * it does not allow derived classes to have G_PARAM_CONSTRUCT_ONLY properties */ #define GNOME_CANVAS_BROKEN_PROPERTIES 1 /* * lets hope that 64 gives enough space for window-decoration + panels * @todo: look at http://standards.freedesktop.org/wm-spec/1.3/ar01s05.html#id2523368 * search for _NET_WM_STRUT_PARTIAL */ #define SCREEN_BORDER_HEIGHT 80 /* borders used in hbox/vbox or other containers */ #ifndef USE_HILDON #define BOX_BORDER 6 #else #define BOX_BORDER 3 #endif #endif // BT_EDIT_H buzztard-0.6.0/src/ui/edit/settings-dialog.c0000644042355400116100000003511311620571260015706 00000000000000/* $Id: settings-dialog.c 3536 2011-08-10 21:05:50Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingsdialog * @short_description: class for the editor settings dialog * @see_also: #BtSettings * * Provides UI to access the #BtSettings. */ #define BT_EDIT #define BT_SETTINGS_DIALOG_C #include "bt-edit.h" enum { SETTINGS_DIALOG_PAGE=1 }; enum { COL_LABEL=0, COL_ID, COL_ICON_PIXBUF, COL_ICON_STOCK_ID }; struct _BtSettingsDialogPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* current page */ BtSettingsPage page; /* the list of settings pages */ GtkTreeView *settings_list; /* the pages */ GtkNotebook *settings_pages; /* the audiodevices settings */ BtSettingsPageAudiodevices *audiodevices_page; BtSettingsPageInteractionController *interaction_controller_page; BtSettingsPagePlaybackController *playback_controller_page; BtSettingsPageDirectories *directories_page; BtSettingsPageShortcuts *shortcuts_page; }; //-- the class G_DEFINE_TYPE (BtSettingsDialog, bt_settings_dialog, GTK_TYPE_DIALOG); //-- enums GType bt_settings_page_get_type(void) { static GType type = 0; if(G_UNLIKELY(type==0)) { static const GEnumValue values[] = { { BT_SETTINGS_PAGE_AUDIO_DEVICES, "BT_SETTINGS_PAGE_AUDIO_DEVICES", "audio devices" }, { BT_SETTINGS_PAGE_INTERACTION_CONTROLLER, "BT_SETTINGS_PAGE_INTERACTION_CONTROLLER", "interaction controller" }, { BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER, "BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER", "playback controller" }, { BT_SETTINGS_PAGE_COLORS, "BT_SETTINGS_PAGE_COLORS", "colors" }, { BT_SETTINGS_PAGE_SHORTCUTS, "BT_SETTINGS_PAGE_SHORTCUTS", "shortcuts" }, { BT_SETTINGS_PAGE_DIRECTORIES, "BT_SETTINGS_PAGE_DIRECTORIES", "directories" }, { 0, NULL, NULL}, }; type = g_enum_register_static("BtSettingsPage", values); } return type; } //-- event handler void on_settings_list_cursor_changed(GtkTreeView *treeview,gpointer user_data) { BtSettingsDialog *self=BT_SETTINGS_DIALOG(user_data); GtkTreeSelection *selection; GtkTreeModel *model; GtkTreeIter iter; GST_INFO("settings list cursor changed"); selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(self->priv->settings_list)); if(gtk_tree_selection_get_selected(selection, &model, &iter)) { gulong id; gtk_tree_model_get(model,&iter,COL_ID,&id,-1); GST_INFO("selected entry id %lu",id); gtk_notebook_set_current_page(self->priv->settings_pages,id); self->priv->page=id; g_object_notify((gpointer)self,"page"); } } /* * on_box_size_request: * * we adjust the scrollable-window size to contain the whole area */ static void on_settings_list_size_request(GtkWidget *widget,GtkRequisition *requisition,gpointer user_data) { GtkWidget *parent=GTK_WIDGET(user_data); gint height=requisition->height; gint max_height=gdk_screen_get_height(gdk_screen_get_default()); GST_LOG("#### list size req %d x %d (max-height=%d)", requisition->width,requisition->height,max_height); // constrain the height by screen height if(height>max_height) { // lets hope that 32 gives enough space for window-decoration + panels height=max_height-32; } // @todo: is the '2' some border or padding gtk_widget_set_size_request(parent,-1,height + 2); } //-- helper methods static void bt_settings_dialog_init_ui(const BtSettingsDialog *self) { GtkWidget *box,*scrolled_window,*page; GtkCellRenderer *renderer; GtkListStore *store; GtkTreeIter tree_iter; gtk_widget_set_name(GTK_WIDGET(self),"buzztard settings"); //gtk_widget_set_size_request(GTK_WIDGET(self),800,600); gtk_window_set_title(GTK_WINDOW(self), _("buzztard settings")); // add dialog commision widgets (okay, cancel) gtk_dialog_add_buttons(GTK_DIALOG(self), GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL,GTK_RESPONSE_REJECT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(self),GTK_RESPONSE_ACCEPT); // add widgets to the dialog content area box=gtk_hbox_new(FALSE,12); gtk_container_set_border_width(GTK_CONTAINER(box),6); // add a list on the right and a notebook without tabs on the left scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_ETCHED_IN); self->priv->settings_list=GTK_TREE_VIEW(gtk_tree_view_new()); gtk_tree_view_set_headers_visible(self->priv->settings_list,FALSE); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_insert_column_with_attributes(self->priv->settings_list,-1,NULL,renderer,"pixbuf",COL_ICON_PIXBUF,"stock-id",COL_ICON_STOCK_ID,NULL); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_tree_view_insert_column_with_attributes(self->priv->settings_list,-1,NULL,renderer,"text",COL_LABEL,NULL); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(self->priv->settings_list),GTK_SELECTION_BROWSE); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->settings_list)); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(scrolled_window),FALSE,FALSE,0); g_signal_connect(self->priv->settings_list,"size-request",G_CALLBACK(on_settings_list_size_request),(gpointer)scrolled_window); g_signal_connect(self->priv->settings_list,"cursor-changed",G_CALLBACK(on_settings_list_cursor_changed),(gpointer)self); store=gtk_list_store_new(4,G_TYPE_STRING,G_TYPE_LONG,GDK_TYPE_PIXBUF,G_TYPE_STRING); //-- append entries for settings pages gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Audio Devices"), COL_ID,BT_SETTINGS_PAGE_AUDIO_DEVICES, COL_ICON_PIXBUF,gdk_pixbuf_new_from_filename("prefs-audio-card.png"), COL_ICON_STOCK_ID,NULL, -1); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Interaction Controller"), COL_ID,BT_SETTINGS_PAGE_INTERACTION_CONTROLLER, COL_ICON_PIXBUF,gdk_pixbuf_new_from_filename("prefs-input-gaming.png"), COL_ICON_STOCK_ID,NULL, -1); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Playback Controller"), COL_ID,BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER, COL_ICON_PIXBUF,NULL, COL_ICON_STOCK_ID,GTK_STOCK_MEDIA_PLAY, -1); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Colors"), COL_ID,BT_SETTINGS_PAGE_COLORS, COL_ICON_PIXBUF,NULL, COL_ICON_STOCK_ID,GTK_STOCK_SELECT_COLOR, -1); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Shortcuts"), COL_ID,BT_SETTINGS_PAGE_SHORTCUTS, COL_ICON_PIXBUF,gdk_pixbuf_new_from_filename("prefs-input-keyboard.png"), COL_ICON_STOCK_ID,NULL, -1); gtk_list_store_append(store, &tree_iter); gtk_list_store_set(store,&tree_iter, COL_LABEL,_("Directories"), COL_ID,BT_SETTINGS_PAGE_DIRECTORIES, COL_ICON_PIXBUF,NULL ,COL_ICON_STOCK_ID,GTK_STOCK_DIRECTORY, -1); gtk_tree_view_set_model(self->priv->settings_list,GTK_TREE_MODEL(store)); g_object_unref(store); // drop with treeview // add notebook self->priv->settings_pages=GTK_NOTEBOOK(gtk_notebook_new()); gtk_widget_set_name(GTK_WIDGET(self->priv->settings_pages),"settings pages"); gtk_notebook_set_show_tabs(self->priv->settings_pages,FALSE); gtk_notebook_set_show_border(self->priv->settings_pages,FALSE); gtk_container_add(GTK_CONTAINER(box),GTK_WIDGET(self->priv->settings_pages)); // add audio device page self->priv->audiodevices_page=bt_settings_page_audiodevices_new(); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),GTK_WIDGET(self->priv->audiodevices_page)); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_AUDIO_DEVICES), gtk_label_new(_("Audio Devices"))); // add interaction controller page self->priv->interaction_controller_page=bt_settings_page_interaction_controller_new(); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),GTK_WIDGET(self->priv->interaction_controller_page)); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_INTERACTION_CONTROLLER), gtk_label_new(_("Interaction Controller"))); // add playback controller page self->priv->playback_controller_page=bt_settings_page_playback_controller_new(); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),GTK_WIDGET(self->priv->playback_controller_page)); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_PLAYBACK_CONTROLLER), gtk_label_new(_("Playback Controller"))); // add notebook page #4 // @todo: maybe turn that into a theme page (theme-name + colors + icons?) page=gtk_vbox_new(FALSE,0); gtk_widget_set_name(GTK_WIDGET(page),"color settings"); gtk_container_add(GTK_CONTAINER(page),gtk_label_new("no color settings yet")); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),page); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_COLORS), gtk_label_new(_("Colors"))); // add notebook page #5 self->priv->shortcuts_page=bt_settings_page_shortcuts_new(); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),GTK_WIDGET(self->priv->shortcuts_page)); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_SHORTCUTS), gtk_label_new(_("Shortcuts"))); // add notebook page #6 self->priv->directories_page=bt_settings_page_directories_new(); gtk_container_add(GTK_CONTAINER(self->priv->settings_pages),GTK_WIDGET(self->priv->directories_page)); gtk_notebook_set_tab_label(GTK_NOTEBOOK(self->priv->settings_pages), gtk_notebook_get_nth_page(GTK_NOTEBOOK(self->priv->settings_pages),BT_SETTINGS_PAGE_DIRECTORIES), gtk_label_new(_("Directories"))); /* @todo more settings * - fonts * - font + size for machine view canvas * - font sizes for table-headings (as pango markup sizes) * - misc * - initial song bpm (from, to) * - cpu monitor (view menu?) */ gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(self))),box); } //-- constructor methods /** * bt_settings_dialog_new: * * Create a new instance * * Returns: the new instance */ BtSettingsDialog *bt_settings_dialog_new(void) { BtSettingsDialog *self; self=BT_SETTINGS_DIALOG(g_object_new(BT_TYPE_SETTINGS_DIALOG,NULL)); bt_settings_dialog_init_ui(self); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_dialog_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtSettingsDialog *self = BT_SETTINGS_DIALOG(object); return_if_disposed(); switch (property_id) { case SETTINGS_DIALOG_PAGE: { g_value_set_enum(value, self->priv->page); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_settings_dialog_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtSettingsDialog *self = BT_SETTINGS_DIALOG(object); return_if_disposed(); switch (property_id) { case SETTINGS_DIALOG_PAGE: { BtSettingsPage old_page=self->priv->page; self->priv->page=g_value_get_enum(value); if(self->priv->page!=old_page) { GtkTreeSelection *selection; GtkTreePath *path; // switch page selection=gtk_tree_view_get_selection(self->priv->settings_list); if((path=gtk_tree_path_new_from_indices(self->priv->page,-1))) { gtk_tree_selection_select_path(selection,path); gtk_tree_view_set_cursor(self->priv->settings_list,path,NULL,FALSE); gtk_tree_path_free(path); on_settings_list_cursor_changed(self->priv->settings_list,(gpointer)self); } } } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_settings_dialog_dispose(GObject *object) { BtSettingsDialog *self = BT_SETTINGS_DIALOG(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_dialog_parent_class)->dispose(object); } static void bt_settings_dialog_init(BtSettingsDialog *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_DIALOG, BtSettingsDialogPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_dialog_class_init(BtSettingsDialogClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsDialogPrivate)); gobject_class->set_property = bt_settings_dialog_set_property; gobject_class->get_property = bt_settings_dialog_get_property; gobject_class->dispose = bt_settings_dialog_dispose; g_object_class_install_property(gobject_class,SETTINGS_DIALOG_PAGE, g_param_spec_enum("page", "page prop", "Current settings page", BT_TYPE_SETTINGS_PAGE, /* object type */ BT_SETTINGS_PAGE_AUDIO_DEVICES, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/settings-page-shortcuts.c0000644042355400116100000001106111620567404017420 00000000000000/* $Id$ * * Buzztard * Copyright (C) 2011 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingspageshortcuts * @short_description: keyboard shortcut settings page * * Edit and manage keyboard shortcut schemes. */ /* @todo: we need a shortcut scheme management (buzz,fasttracker,..) * - select current scheme * - save edited scheme under new/current name * - check the midi-profiles in lib/ic/learn.c for the gkeyfile handling */ /* @todo: we need a way to edit the current scheme * - we can look at the shortcut editor code from the gnome-control-center * http://git.gnome.org/browse/gnome-control-center/tree/capplets/keybindings?h=gnome-2-32 * - we need to ensure that keys are unique and not otherwise bound */ #define BT_EDIT #define BT_SETTINGS_PAGE_SHORTCUTS_C #include "bt-edit.h" struct _BtSettingsPageShortcutsPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; }; //-- the class G_DEFINE_TYPE (BtSettingsPageShortcuts, bt_settings_page_shortcuts, GTK_TYPE_TABLE); //-- event handler //-- helper methods static void bt_settings_page_shortcuts_init_ui(const BtSettingsPageShortcuts *self) { BtSettings *settings; GtkWidget *label,*spacer; gchar *str; gtk_widget_set_name(GTK_WIDGET(self),"keyboard shortcut settings"); // get settings g_object_get(self->priv->app,"settings",&settings,NULL); //g_object_get(settings,NULL); // add setting widgets spacer=gtk_label_new(" "); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Shortcuts")); gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(self),spacer, 0, 1, 1, 4, GTK_SHRINK,GTK_SHRINK, 2,1); /* FIXME: */ label=gtk_label_new("no keyboard settings yet"); gtk_misc_set_alignment(GTK_MISC(label),0.5,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 3, 1, 4, GTK_FILL,GTK_FILL, 2,1); g_object_unref(settings); } //-- constructor methods /** * bt_settings_page_shortcuts_new: * * Create a new instance * * Returns: the new instance */ BtSettingsPageShortcuts *bt_settings_page_shortcuts_new(void) { BtSettingsPageShortcuts *self; self=BT_SETTINGS_PAGE_SHORTCUTS(g_object_new(BT_TYPE_SETTINGS_PAGE_SHORTCUTS, "n-rows",4, "n-columns",3, "homogeneous",FALSE, NULL)); bt_settings_page_shortcuts_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_page_shortcuts_dispose(GObject *object) { BtSettingsPageShortcuts *self = BT_SETTINGS_PAGE_SHORTCUTS(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_page_shortcuts_parent_class)->dispose(object); } static void bt_settings_page_shortcuts_finalize(GObject *object) { BtSettingsPageShortcuts *self = BT_SETTINGS_PAGE_SHORTCUTS(object); GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_settings_page_shortcuts_parent_class)->finalize(object); } static void bt_settings_page_shortcuts_init(BtSettingsPageShortcuts *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_PAGE_SHORTCUTS, BtSettingsPageShortcutsPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_page_shortcuts_class_init(BtSettingsPageShortcutsClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsPageShortcutsPrivate)); gobject_class->dispose = bt_settings_page_shortcuts_dispose; gobject_class->finalize = bt_settings_page_shortcuts_finalize; } buzztard-0.6.0/src/ui/edit/settings-page-directories.c0000644042355400116100000001523011620565073017700 00000000000000/* $Id: settings-page-directories.c 3534 2011-08-10 20:29:45Z ensonic $ * * Buzztard * Copyright (C) 2007 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btsettingspagedirectories * @short_description: default directory configuration settings page * * Select default directories for songs, samples, recordings, etc. */ #define BT_EDIT #define BT_SETTINGS_PAGE_DIRECTORIES_C #include "bt-edit.h" struct _BtSettingsPageDirectoriesPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; }; //-- the class G_DEFINE_TYPE (BtSettingsPageDirectories, bt_settings_page_directories, GTK_TYPE_TABLE); //-- event handler static void on_folder_changed(GtkFileChooser *chooser,gpointer user_data) { BtSettingsPageDirectories *self=BT_SETTINGS_PAGE_DIRECTORIES(user_data); gchar *new_folder; if((new_folder=gtk_file_chooser_get_current_folder(chooser))) { BtSettings *settings; const gchar *folder_name=gtk_widget_get_name(GTK_WIDGET(chooser)); gchar *old_folder; g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,folder_name,&old_folder,NULL); if(!old_folder || strcmp(old_folder,new_folder)) { // store in settings g_object_set(settings,folder_name,new_folder,NULL); } g_free(new_folder); g_free(old_folder); g_object_unref(settings); } } //-- helper methods static void bt_settings_page_directories_init_ui(const BtSettingsPageDirectories *self) { BtSettings *settings; GtkWidget *label,*spacer,*widget; gchar *str; gchar *song_folder,*record_folder,*sample_folder; gtk_widget_set_name(GTK_WIDGET(self),"default directory settings"); // get settings g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings,"song-folder",&song_folder,"record-folder",&record_folder,"sample-folder",&sample_folder,NULL); // add setting widgets spacer=gtk_label_new(" "); label=gtk_label_new(NULL); str=g_strdup_printf("%s",_("Directories")); gtk_label_set_markup(GTK_LABEL(label),str); g_free(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 0, 3, 0, 1, GTK_FILL|GTK_EXPAND, GTK_SHRINK, 2,1); gtk_table_attach(GTK_TABLE(self),spacer, 0, 1, 1, 4, GTK_SHRINK,GTK_SHRINK, 2,1); label=gtk_label_new(_("Songs")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 1, 2, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_file_chooser_button_new(_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_widget_set_name(widget,"song-folder"); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (widget), song_folder); g_signal_connect(widget, "selection-changed", G_CALLBACK(on_folder_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(self),widget, 2, 3, 1, 2, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); label=gtk_label_new(_("Recordings")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 2, 3, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_file_chooser_button_new(_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_widget_set_name(widget,"record-folder"); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (widget), record_folder); g_signal_connect(widget, "selection-changed", G_CALLBACK(on_folder_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(self),widget, 2, 3, 2, 3, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); label=gtk_label_new(_("Waveforms")); gtk_misc_set_alignment(GTK_MISC(label),1.0,0.5); gtk_table_attach(GTK_TABLE(self),label, 1, 2, 3, 4, GTK_FILL,GTK_SHRINK, 2,1); widget=gtk_file_chooser_button_new(_("Select a folder"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); gtk_widget_set_name(widget,"sample-folder"); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (widget), sample_folder); g_signal_connect(widget, "selection-changed", G_CALLBACK(on_folder_changed), (gpointer)self); gtk_table_attach(GTK_TABLE(self),widget, 2, 3, 3, 4, GTK_FILL|GTK_EXPAND,GTK_SHRINK, 2,1); g_free(song_folder); g_free(record_folder); g_free(sample_folder); g_object_unref(settings); } //-- constructor methods /** * bt_settings_page_directories_new: * * Create a new instance * * Returns: the new instance */ BtSettingsPageDirectories *bt_settings_page_directories_new(void) { BtSettingsPageDirectories *self; self=BT_SETTINGS_PAGE_DIRECTORIES(g_object_new(BT_TYPE_SETTINGS_PAGE_DIRECTORIES, "n-rows",4, "n-columns",3, "homogeneous",FALSE, NULL)); bt_settings_page_directories_init_ui(self); gtk_widget_show_all(GTK_WIDGET(self)); return(self); } //-- methods //-- wrapper //-- class internals static void bt_settings_page_directories_dispose(GObject *object) { BtSettingsPageDirectories *self = BT_SETTINGS_PAGE_DIRECTORIES(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_settings_page_directories_parent_class)->dispose(object); } static void bt_settings_page_directories_finalize(GObject *object) { BtSettingsPageDirectories *self = BT_SETTINGS_PAGE_DIRECTORIES(object); GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_settings_page_directories_parent_class)->finalize(object); } static void bt_settings_page_directories_init(BtSettingsPageDirectories *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_SETTINGS_PAGE_DIRECTORIES, BtSettingsPageDirectoriesPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); } static void bt_settings_page_directories_class_init(BtSettingsPageDirectoriesClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); g_type_class_add_private(klass,sizeof(BtSettingsPageDirectoriesPrivate)); gobject_class->dispose = bt_settings_page_directories_dispose; gobject_class->finalize = bt_settings_page_directories_finalize; } buzztard-0.6.0/src/ui/edit/main-menu.c0000644042355400116100000013013011666705670014510 00000000000000/* $Id: main-menu.c 3738 2011-12-04 14:27:11Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainmenu * @short_description: class for the editor main menu * * Provides the main application menu. */ /* @todo main-menu tasks * - enable/disable edit menu entries based on selection and focus */ #define BT_EDIT #define BT_MAIN_MENU_C #include "bt-edit.h" struct _BtMainMenuPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the main window */ BtMainWindow *main_window; /* MenuItems */ GtkWidget *save_item; /* editor change log */ BtChangeLog *change_log; #ifdef USE_DEBUG /* debug menu */ GstDebugGraphDetails debug_graph_details; gchar *debug_graph_format; #endif }; //-- the class #ifndef USE_HILDON G_DEFINE_TYPE (BtMainMenu, bt_main_menu, GTK_TYPE_MENU_BAR); #else G_DEFINE_TYPE (BtMainMenu, bt_main_menu, GTK_TYPE_MENU); #endif //-- event handler static void on_menu_new_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu new event occurred"); bt_main_window_new_song(self->priv->main_window); } static void on_menu_open_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu open event occurred"); bt_main_window_open_song(self->priv->main_window); } static void on_menu_open_recent_activate(GtkRecentChooser *chooser,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GtkRecentInfo *info=NULL; gchar *file_name=NULL; const gchar *uri; if(!(info=gtk_recent_chooser_get_current_item(chooser))) { GST_WARNING ("Unable to retrieve the current recent-item, aborting..."); return; } if(!bt_main_window_check_unsaved_song(self->priv->main_window,_("Load new song?"),_("Load new song?"))) goto done; uri=gtk_recent_info_get_uri(info); file_name=g_filename_from_uri(uri,NULL,NULL); GST_INFO("menu open recent event occurred : %s",file_name); if(!bt_edit_application_load_song(self->priv->app,file_name)) { gchar *msg=g_strdup_printf(_("An error occurred while loading the song from file '%s'"),file_name); bt_dialog_message(self->priv->main_window,_("Can't load song"),_("Can't load song"),msg); g_free(msg); } g_free(file_name); done: gtk_recent_info_unref(info); } static void on_menu_save_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu save event occurred"); bt_main_window_save_song(self->priv->main_window); } static void on_menu_saveas_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu saveas event occurred"); bt_main_window_save_song_as(self->priv->main_window); } static void on_menu_recover_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu crash-log recoder event occurred"); if(!bt_main_window_check_unsaved_song(self->priv->main_window,_("Recover a song?"),_("Recover a song?"))) return; /* replay expects an empty song */ bt_edit_application_new_song(self->priv->app); bt_edit_application_crash_log_recover(self->priv->app); } static void on_menu_recover_changed(const BtChangeLog *change_log,GParamSpec *arg,gpointer user_data) { GtkWidget *menuitem = GTK_WIDGET(user_data); GList *crash_logs; g_object_get((GObject *)change_log,"crash-logs",&crash_logs,NULL); if(!crash_logs) { gtk_widget_set_sensitive(GTK_WIDGET(menuitem), FALSE); } } static void on_menu_render_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GtkWidget *settings,*progress; GST_INFO("menu render event occurred"); settings=GTK_WIDGET(bt_render_dialog_new()); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(settings)); gtk_widget_show_all(settings); if(gtk_dialog_run(GTK_DIALOG(settings))==GTK_RESPONSE_ACCEPT) { gtk_widget_hide(settings); progress=GTK_WIDGET(bt_render_progress_new(BT_RENDER_DIALOG(settings))); gtk_window_set_transient_for(GTK_WINDOW(progress),GTK_WINDOW(self->priv->main_window)); gtk_widget_show_all(progress); // run song rendering bt_render_progress_run(BT_RENDER_PROGRESS(progress)); gtk_widget_destroy(progress); } gtk_widget_destroy(settings); } static void on_menu_quit_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu quit event occurred"); if(bt_edit_application_quit(self->priv->app)) { gtk_widget_destroy(GTK_WIDGET(self->priv->main_window)); } } static void on_menu_undo_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); bt_change_log_undo(self->priv->change_log); } static void on_menu_can_undo_changed(const BtChangeLog *change_log,GParamSpec *arg,gpointer user_data) { GtkWidget *menuitem = GTK_WIDGET(user_data); gboolean enabled; g_object_get((GObject *)change_log,"can-undo",&enabled,NULL); gtk_widget_set_sensitive(menuitem, enabled); } static void on_menu_redo_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); bt_change_log_redo(self->priv->change_log); } static void on_menu_can_redo_changed(const BtChangeLog *change_log,GParamSpec *arg,gpointer user_data) { GtkWidget *menuitem = GTK_WIDGET(user_data); gboolean enabled; g_object_get((GObject *)change_log,"can-redo",&enabled,NULL); gtk_widget_set_sensitive(menuitem, enabled); } static void on_menu_cut_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); switch(gtk_notebook_get_current_page(GTK_NOTEBOOK(pages))) { case BT_MAIN_PAGES_MACHINES_PAGE: { GST_INFO("menu cut event occurred for machine page"); } break; case BT_MAIN_PAGES_PATTERNS_PAGE: { BtMainPagePatterns *page; GST_INFO("menu cut event occurred for pattern page"); g_object_get(pages,"patterns-page",&page,NULL); bt_main_page_patterns_cut_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_SEQUENCE_PAGE: { BtMainPageSequence *page; GST_INFO("menu cut event occurred for sequence page"); g_object_get(pages,"sequence-page",&page,NULL); bt_main_page_sequence_cut_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_WAVES_PAGE: { GST_INFO("menu cut event occurred for waves page"); } break; case BT_MAIN_PAGES_INFO_PAGE: { GST_INFO("menu cut event occurred for info page"); } break; } g_object_unref(pages); } static void on_menu_copy_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); switch(gtk_notebook_get_current_page(GTK_NOTEBOOK(pages))) { case BT_MAIN_PAGES_MACHINES_PAGE: { GST_INFO("menu copy event occurred for machine page"); } break; case BT_MAIN_PAGES_PATTERNS_PAGE: { BtMainPagePatterns *page; GST_INFO("menu copy event occurred for pattern page"); g_object_get(pages,"patterns-page",&page,NULL); bt_main_page_patterns_copy_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_SEQUENCE_PAGE: { BtMainPageSequence *page; GST_INFO("menu copy event occurred for sequence page"); g_object_get(pages,"sequence-page",&page,NULL); bt_main_page_sequence_copy_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_WAVES_PAGE: { GST_INFO("menu copy event occurred for waves page"); } break; case BT_MAIN_PAGES_INFO_PAGE: { GST_INFO("menu copy event occurred for info page"); } break; } g_object_unref(pages); } static void on_menu_paste_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); switch(gtk_notebook_get_current_page(GTK_NOTEBOOK(pages))) { case BT_MAIN_PAGES_MACHINES_PAGE: { GST_INFO("menu paste event occurred for machine page"); } break; case BT_MAIN_PAGES_PATTERNS_PAGE: { BtMainPagePatterns *page; GST_INFO("menu paste event occurred for pattern page"); g_object_get(pages,"patterns-page",&page,NULL); bt_main_page_patterns_paste_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_SEQUENCE_PAGE: { BtMainPageSequence *page; GST_INFO("menu paste event occurred for sequence page"); g_object_get(pages,"sequence-page",&page,NULL); bt_main_page_sequence_paste_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_WAVES_PAGE: { GST_INFO("menu paste event occurred for waves page"); } break; case BT_MAIN_PAGES_INFO_PAGE: { GST_INFO("menu paste event occurred for info page"); } break; } g_object_unref(pages); } static void on_menu_delete_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); switch(gtk_notebook_get_current_page(GTK_NOTEBOOK(pages))) { case BT_MAIN_PAGES_MACHINES_PAGE: { GST_INFO("menu delete event occurred for machine page"); } break; case BT_MAIN_PAGES_PATTERNS_PAGE: { BtMainPagePatterns *page; GST_INFO("menu delete event occurred for pattern page"); g_object_get(pages,"patterns-page",&page,NULL); bt_main_page_patterns_delete_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_SEQUENCE_PAGE: { BtMainPageSequence *page; GST_INFO("menu delete event occurred for sequence page"); g_object_get(pages,"sequence-page",&page,NULL); bt_main_page_sequence_delete_selection(page); g_object_unref(page); } break; case BT_MAIN_PAGES_WAVES_PAGE: { GST_INFO("menu delete event occurred for waves page"); } break; case BT_MAIN_PAGES_INFO_PAGE: { GST_INFO("menu delete event occurred for info page"); } break; } g_object_unref(pages); } static void on_menu_settings_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); GtkWidget *dialog; GST_INFO("menu settings event occurred"); dialog=GTK_WIDGET(bt_settings_dialog_new()); bt_edit_application_attach_child_window(self->priv->app,GTK_WINDOW(dialog)); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } static void on_menu_view_toolbar_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainToolbar *toolbar; BtSettings *settings; gboolean shown; GST_INFO("menu 'view toolbar' event occurred"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(self->priv->main_window,"toolbar",&toolbar,NULL); shown=gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); g_object_set(toolbar,"visible",shown,NULL); g_object_set(settings,"toolbar-hide",!shown,NULL); g_object_unref(toolbar); g_object_unref(settings); } static void on_menu_view_statusbar_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainStatusbar *statusbar; BtSettings *settings; gboolean shown; GST_INFO("menu 'view toolbar' event occurred"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(self->priv->main_window,"statusbar",&statusbar,NULL); shown=gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); g_object_set(statusbar,"visible",shown,NULL); g_object_set(settings,"statusbar-hide",!shown,NULL); g_object_unref(statusbar); g_object_unref(settings); } static void on_menu_view_tabs_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; BtSettings *settings; gboolean shown; GST_INFO("menu 'view tabs' event occurred"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(self->priv->main_window,"pages",&pages,NULL); shown=gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); g_object_set(pages,"show-tabs",shown,NULL); g_object_set(settings,"tabs-hide",!shown,NULL); g_object_unref(pages); g_object_unref(settings); } static void on_menu_fullscreen_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); gboolean fullscreen; /* @idea: reflow things a bit for full-screen: * - hide menu bar and have a menu-button on toolbar * - we are a menu-bar, for this we would need to be a menu * - have a right justified label on toolbar to show window title * - this both causes problems if toolbar is hidden! * - so we have to check for it */ fullscreen=gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); if(fullscreen) { gtk_window_fullscreen(GTK_WINDOW(self->priv->main_window)); } else { gtk_window_unfullscreen(GTK_WINDOW(self->priv->main_window)); } } static void on_menu_goto_machine_view_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_MACHINES_PAGE); g_object_unref(pages); } static void on_menu_goto_pattern_view_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_PATTERNS_PAGE); g_object_unref(pages); } static void on_menu_goto_sequence_view_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_SEQUENCE_PAGE); g_object_unref(pages); } static void on_menu_goto_waves_view_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_WAVES_PAGE); g_object_unref(pages); } static void on_menu_goto_info_view_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtMainPages *pages; g_object_get(self->priv->main_window,"pages",&pages,NULL); gtk_notebook_set_current_page(GTK_NOTEBOOK(pages),BT_MAIN_PAGES_INFO_PAGE); g_object_unref(pages); } static void on_menu_play_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtSong *song; // get song from app and start playback g_object_get(self->priv->app,"song",&song,NULL); if(!bt_song_play(song)) { GST_WARNING("failed to play"); } // release the reference g_object_unref(song); } static void on_menu_play_from_cursor_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtSong *song; BtMainPages *pages; BtMainPageSequence *sequence_page; glong pos=0; // get song from app and seek to cursor g_object_get(self->priv->app,"song",&song,NULL); g_object_get(self->priv->main_window,"pages",&pages,NULL); g_object_get(pages,"sequence-page",&sequence_page,NULL); g_object_get(sequence_page,"cursor-row",&pos,NULL); g_object_set(song,"play-pos",pos,NULL); g_object_unref(sequence_page); g_object_unref(pages); // play if(!bt_song_play(song)) { GST_WARNING("failed to play"); } // release the reference g_object_unref(song); } static void on_menu_stop_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); BtSong *song; // get song from app and stop playback g_object_get(self->priv->app,"song",&song,NULL); if(!bt_song_stop(song)) { GST_WARNING("failed to stop"); } // release the reference g_object_unref(song); } static void on_menu_help_activate(GtkMenuItem *menuitem,gpointer user_data) { //BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu help event occurred"); // use "ghelp:buzztard-edit?topic" for context specific help gtk_show_uri_simple(GTK_WIDGET(menuitem),"ghelp:buzztard-edit"); } static void on_menu_join_irc(GtkMenuItem *menuitem,gpointer user_data) { //BtMainMenu *self=BT_MAIN_MENU(user_data); gchar *uri; GST_INFO("menu join-irc event occurred"); //gtk_show_uri_simple(GTK_WIDGET(menuitem),"irc://irc.freenode.net/#buzztard"); uri=g_strdup_printf("http://webchat.freenode.net?nick=%s&channels=#buzztard",g_get_user_name()); gtk_show_uri_simple(GTK_WIDGET(menuitem),uri); g_free(uri); } static void on_menu_report_problem(GtkMenuItem *menuitem,gpointer user_data) { //BtMainMenu *self=BT_MAIN_MENU(user_data); GST_INFO("menu submit_bug event occurred"); gtk_show_uri_simple(GTK_WIDGET(menuitem),"http://buzztard.org/bugs/?"); } static void on_menu_help_show_tip(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); bt_edit_application_show_tip(self->priv->app); } static void on_menu_about_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); bt_edit_application_show_about(self->priv->app); } #ifdef USE_DEBUG static void on_menu_debug_show_media_types_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_details|=GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE; else self->priv->debug_graph_details&=~GST_DEBUG_GRAPH_SHOW_MEDIA_TYPE; } static void on_menu_debug_show_caps_details_types_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_details|=GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS; else self->priv->debug_graph_details&=~GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS; } static void on_menu_debug_show_non_default_params_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_details|=GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS; else self->priv->debug_graph_details&=~GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS; } static void on_menu_debug_show_states_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_details|=GST_DEBUG_GRAPH_SHOW_STATES; else self->priv->debug_graph_details&=~GST_DEBUG_GRAPH_SHOW_STATES; } static void on_menu_debug_use_svg_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_format="svg"; } static void on_menu_debug_use_png_toggled(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) self->priv->debug_graph_format="png"; } static void on_menu_debug_dump_pipeline_graph_and_show(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); const gchar *path; if((path=g_getenv("GST_DEBUG_DUMP_DOT_DIR"))) { BtSong *song; GstBin *bin; gchar *cmd; GError *error=NULL; g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"bin",&bin,NULL); GST_INFO_OBJECT(bin, "dump dot graph as %s with 0x%x details",self->priv->debug_graph_format,self->priv->debug_graph_details); GST_DEBUG_BIN_TO_DOT_FILE(bin,self->priv->debug_graph_details,PACKAGE_NAME); // release the reference gst_object_unref(bin); g_object_unref(song); // convert file cmd=g_strdup_printf("dot -T%s -o%s"G_DIR_SEPARATOR_S""PACKAGE_NAME".%s %s"G_DIR_SEPARATOR_S""PACKAGE_NAME".dot", self->priv->debug_graph_format,path,self->priv->debug_graph_format,path); if(!g_spawn_command_line_sync(cmd,NULL,NULL,NULL,&error)) { GST_WARNING("Failed to convert dot-graph: %s\n",error->message); g_error_free(error); } else { gchar *png_uri; png_uri=g_strdup_printf("file://%s"G_DIR_SEPARATOR_S""PACKAGE_NAME".%s",path,self->priv->debug_graph_format); gtk_show_uri_simple(GTK_WIDGET(menuitem),png_uri); g_free(png_uri); } g_free(cmd); } else { // the envvar is only checked at gst_init() GST_WARNING("You need to start the app with GST_DEBUG_DUMP_DOT_DIR env-var set."); } } static void on_menu_debug_update_registry(GtkMenuItem *menuitem,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); bt_edit_application_ui_lock(self->priv->app); /* we cannot reload plugins * I've tried to patch gst/gstregistry.c:gst_registry_scan_path_level * if (plugin->registered && !_priv_plugin_deps_files_changed (plugin)) ... * but reloading a plugin does not work, as we would end up re-registering * existing GTypes types. */ if(!gst_update_registry()) { GST_WARNING("failed to update registry"); } else { // @todo: update machine menu } bt_edit_application_ui_unlock(self->priv->app); } #endif static void on_song_unsaved_changed(const GObject *object,GParamSpec *arg,gpointer user_data) { BtMainMenu *self=BT_MAIN_MENU(user_data); gboolean unsaved=bt_edit_application_is_song_unsaved(self->priv->app); gtk_widget_set_sensitive(self->priv->save_item,unsaved); } //-- helper methods static void bt_main_menu_init_ui(const BtMainMenu *self) { GtkWidget *item,*menu,*submenu,*subitem; BtSettings *settings; gboolean toolbar_hide,statusbar_hide,tabs_hide; GtkAccelGroup *accel_group=bt_ui_resources_get_accel_group(); GtkSettings *gtk_settings; GtkRecentFilter *filter=gtk_recent_filter_new(); const GList *plugins, *node; BtSongIOModuleInfo *info; guint ix; // disable F10 keybinding to activate the menu gtk_settings=gtk_settings_get_for_screen(gdk_screen_get_default()); g_object_set(gtk_settings, "gtk-menu-bar-accel", NULL, NULL); gtk_widget_set_name(GTK_WIDGET(self),"main menu"); g_object_get(self->priv->app,"settings",&settings,NULL); g_object_get(settings, "toolbar-hide",&toolbar_hide, "statusbar-hide",&statusbar_hide, "tabs-hide",&tabs_hide, NULL); g_object_unref(settings); //gtk_menu_set_accel_path(GTK_MENU(self),"/MainMenu"); //-- file menu item=gtk_menu_item_new_with_mnemonic(_("_File")); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_new_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_open_activate),(gpointer)self); subitem = gtk_menu_item_new_with_mnemonic (_("_Recently used")); gtk_container_add(GTK_CONTAINER(menu),subitem); item=gtk_recent_chooser_menu_new_for_manager(gtk_recent_manager_get_default()); gtk_menu_item_set_submenu(GTK_MENU_ITEM(subitem),item); g_signal_connect (item, "item-activated", G_CALLBACK (on_menu_open_recent_activate), (gpointer)self); //gtk_recent_filter_add_application (filter, "buzztard-edit"); // set filters plugins=bt_song_io_get_module_info_list(); for(node=plugins;node;node=g_list_next(node)) { info=(BtSongIOModuleInfo *)node->data; ix=0; while(info->formats[ix].name) { gtk_recent_filter_add_mime_type(filter,info->formats[ix].mime_type); ix++; } } #if !GLIB_CHECK_VERSION(2,22,2) /* FIXME: workaround for http://bugzilla.gnome.org/show_bug.cgi?id=541236 * - see also main-window.c * - git describe e63262d49d40a36060613fb1d0ed468ca5dddc19 * - people need to clear old $HOME/.recently-used.xbel entries */ gtk_recent_filter_add_pattern(filter,"*.xml"); #endif gtk_recent_chooser_add_filter(GTK_RECENT_CHOOSER(item),filter); gtk_recent_chooser_set_filter(GTK_RECENT_CHOOSER(item),filter); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_save_activate),(gpointer)self); self->priv->save_item=subitem; subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_saveas_activate),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); //subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDELETE,accel_group); subitem=gtk_menu_item_new_with_label(_("Recover unsaved songs")); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_recover_activate),(gpointer)self); on_menu_recover_changed(self->priv->change_log, NULL, subitem); g_signal_connect(self->priv->change_log,"notify::crash-logs",G_CALLBACK(on_menu_recover_changed),(gpointer)subitem); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_RECORD,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_render_activate),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_quit_activate),(gpointer)self); // edit menu item=gtk_menu_item_new_with_mnemonic(_("_Edit")); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); gtk_menu_set_accel_group(GTK_MENU(menu), accel_group); gtk_menu_set_accel_path(GTK_MENU(menu),"/MainMenu/Edit"); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_UNDO,accel_group); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/Edit/Undo"); gtk_accel_map_add_entry("/MainMenu/Edit/Undo", GDK_z, GDK_CONTROL_MASK); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_undo_activate),(gpointer)self); on_menu_can_undo_changed(self->priv->change_log, NULL, subitem); g_signal_connect(self->priv->change_log,"notify::can-undo",G_CALLBACK(on_menu_can_undo_changed),(gpointer)subitem); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_REDO,accel_group); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/Edit/Redo"); gtk_accel_map_add_entry("/MainMenu/Edit/Redo", GDK_z, GDK_CONTROL_MASK|GDK_SHIFT_MASK); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_redo_activate),(gpointer)self); on_menu_can_redo_changed(self->priv->change_log, NULL, subitem); g_signal_connect(self->priv->change_log,"notify::can-redo",G_CALLBACK(on_menu_can_redo_changed),(gpointer)subitem); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_CUT,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_cut_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_COPY,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_copy_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_PASTE,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_paste_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_delete_activate),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_settings_activate),(gpointer)self); // view menu item=gtk_menu_item_new_with_mnemonic(_("_View")); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); gtk_menu_set_accel_group(GTK_MENU(menu), accel_group); gtk_menu_set_accel_path(GTK_MENU(menu),"/MainMenu/View"); subitem=gtk_check_menu_item_new_with_mnemonic(_("Toolbar")); // from here we can't hide the toolbar as it is not yet created and shown gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),!toolbar_hide); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_view_toolbar_toggled),(gpointer)self); subitem=gtk_check_menu_item_new_with_mnemonic(_("Statusbar")); // from here we can't hide the statusbar as it is not yet created and shown gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),!statusbar_hide); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_view_statusbar_toggled),(gpointer)self); subitem=gtk_check_menu_item_new_with_mnemonic(_("Tabs")); // from here we can't hide the tabs as they are not yet created and shown gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),!tabs_hide); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_view_tabs_toggled),(gpointer)self); /* @todo 'Machine properties' show/hide toggle */ /* @todo 'Analyzer windows' show/hide toggle */ subitem=gtk_check_menu_item_new_with_mnemonic(_("Fullscreen")); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (subitem), "/MainMenu/View/FullScreen"); gtk_accel_map_add_entry ("/MainMenu/View/FullScreen", GDK_F11, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_fullscreen_toggled),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_with_label(_("Go to machine view")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_icon_name("buzztard_tab_machines",GTK_ICON_SIZE_MENU)); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/View/MachineView"); gtk_accel_map_add_entry("/MainMenu/View/MachineView", GDK_F3, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_goto_machine_view_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Go to pattern view")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_icon_name("buzztard_tab_patterns",GTK_ICON_SIZE_MENU)); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/View/PatternView"); gtk_accel_map_add_entry("/MainMenu/View/PatternView", GDK_F2, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_goto_pattern_view_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Go to sequence view")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_icon_name("buzztard_tab_sequence",GTK_ICON_SIZE_MENU)); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/View/SequenceView"); gtk_accel_map_add_entry("/MainMenu/View/SequenceView", GDK_F4, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_goto_sequence_view_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Go to wave table view")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_icon_name("buzztard_tab_waves",GTK_ICON_SIZE_MENU)); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/View/WaveteableView"); gtk_accel_map_add_entry("/MainMenu/View/WaveteableView", GDK_F9, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_goto_waves_view_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Go to song information")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_icon_name("buzztard_tab_info",GTK_ICON_SIZE_MENU)); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/View/InfoView"); gtk_accel_map_add_entry("/MainMenu/View/InfoView", GDK_F10, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_goto_info_view_activate),(gpointer)self); /* @todo zoom menu items * machine view: zoom-in/zoom-out/zoom-fit * sequence vide: zoom-in/zoom-out * gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_FIT,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_fit_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_IN,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_in_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ZOOM_OUT,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_zoom_out_activate),(gpointer)self); */ // playback menu item=gtk_menu_item_new_with_mnemonic(_("_Playback")); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); gtk_menu_set_accel_group(GTK_MENU(menu), accel_group); gtk_menu_set_accel_path(GTK_MENU(menu),"/MainMenu/Playback"); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_PLAY,accel_group); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/Playback/Play"); gtk_accel_map_add_entry("/MainMenu/Playback/Play", GDK_F5, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_play_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Play from cursor")); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/Playback/PlayFromCursor"); gtk_accel_map_add_entry("/MainMenu/Playback/PlayFromCursor", GDK_F6, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_play_from_cursor_activate),(gpointer)self); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_MEDIA_STOP,accel_group); gtk_menu_item_set_accel_path(GTK_MENU_ITEM (subitem), "/MainMenu/Playback/Stop"); gtk_accel_map_add_entry("/MainMenu/Playback/Stop", GDK_F8, 0); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_stop_activate),(gpointer)self); /* @todo toggle loop item * - we only have: * gtk_image_menu_item_new_from_stock - not a toggle * gtk_check_menu_item_new_with_mnemonic - no image */ /* @todo: tools menu * 'normalize song' * - dummy render with master->input-pre-gain, adjust master volume * 'cleanup' * - remove unsused patterns, unconnected machines with no empty/tracks */ // help menu item=gtk_menu_item_new_with_mnemonic(_("_Help")); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); gtk_menu_set_accel_group(GTK_MENU(menu), accel_group); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_HELP,accel_group); gtk_widget_remove_accelerator(subitem,accel_group,'h',GDK_CONTROL_MASK); gtk_widget_add_accelerator(subitem,"activate",accel_group,GDK_F1,0,GTK_ACCEL_VISIBLE); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_help_activate),(gpointer)self); subitem=gtk_image_menu_item_new_with_label(_("Tip of the day")); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(subitem),gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO,GTK_ICON_SIZE_MENU)); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_help_show_tip),(gpointer)self); /* join web-chat */ subitem=gtk_menu_item_new_with_label(_("Join IRC discussion")); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_join_irc),(gpointer)self); /* @todo 'translate application' -> link to translator project * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-translate.png */ /* 'report a problem' -> link to bug tracker * liblaunchpad-integration1:/usr/share/icons/hicolor/16x16/apps/lpi-bug.png * /usr/share/app-install/icons/bug-buddy.png */ subitem=gtk_menu_item_new_with_label(_("Report a problem")); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_report_problem),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT,accel_group); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_about_activate),(gpointer)self); #ifdef USE_DEBUG // debug menu item=gtk_menu_item_new_with_label("Debug"); gtk_menu_item_set_right_justified(GTK_MENU_ITEM(item),TRUE); gtk_container_add(GTK_CONTAINER(self),item); menu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),menu); /* @todo: add toggle for keep image (no by default) */ item=gtk_menu_item_new_with_mnemonic("Graph details"); gtk_container_add(GTK_CONTAINER(menu),item); submenu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu); subitem=gtk_check_menu_item_new_with_mnemonic("show media types"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),FALSE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_show_media_types_toggled),(gpointer)self); subitem=gtk_check_menu_item_new_with_mnemonic("show caps details"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),TRUE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_show_caps_details_types_toggled),(gpointer)self); subitem=gtk_check_menu_item_new_with_mnemonic("show non default params"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),FALSE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_show_non_default_params_toggled),(gpointer)self); subitem=gtk_check_menu_item_new_with_mnemonic("show states"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),TRUE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_show_states_toggled),(gpointer)self); item=gtk_menu_item_new_with_mnemonic("Graph format"); gtk_container_add(GTK_CONTAINER(menu),item); submenu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu); { GSList *group = NULL; subitem=gtk_radio_menu_item_new_with_mnemonic(group, "use svg"); group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(subitem)); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),TRUE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_use_svg_toggled),(gpointer)self); subitem=gtk_radio_menu_item_new_with_mnemonic(group, "use png"); //group=gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(subitem)); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(subitem),FALSE); gtk_container_add(GTK_CONTAINER(submenu),subitem); g_signal_connect(subitem,"toggled",G_CALLBACK(on_menu_debug_use_png_toggled),(gpointer)self); } subitem=gtk_image_menu_item_new_with_mnemonic("Dump pipeline graph and show"); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_debug_dump_pipeline_graph_and_show),(gpointer)self); gtk_container_add(GTK_CONTAINER(menu),gtk_separator_menu_item_new()); subitem=gtk_image_menu_item_new_with_mnemonic("Update plugin registry"); gtk_container_add(GTK_CONTAINER(menu),subitem); g_signal_connect(subitem,"activate",G_CALLBACK(on_menu_debug_update_registry),(gpointer)self); #endif // register event handlers g_signal_connect(self->priv->app, "notify::unsaved", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); g_signal_connect(self->priv->change_log, "notify::can-undo", G_CALLBACK(on_song_unsaved_changed), (gpointer)self); } //-- constructor methods /** * bt_main_menu_new: * * Create a new instance * * Returns: the new instance */ BtMainMenu *bt_main_menu_new(void) { BtMainMenu *self; self=BT_MAIN_MENU(g_object_new(BT_TYPE_MAIN_MENU,NULL)); bt_main_menu_init_ui(self); return(self); } //-- methods //-- class internals static void bt_main_menu_map(GtkWidget *widget) { BtMainMenu *self = BT_MAIN_MENU(widget); GtkWidget *toplevel; GTK_WIDGET_CLASS(bt_main_menu_parent_class)->map(widget); /* bah, it is still NULL here becasue of the construction sequence */ //g_object_get(self->priv->app,"main-window",&self->priv->main_window,NULL); //GST_DEBUG("main-window = %p",self->priv->main_window); toplevel=gtk_widget_get_toplevel(widget); if(gtk_widget_is_toplevel(toplevel)) { self->priv->main_window=BT_MAIN_WINDOW(toplevel); GST_DEBUG("top-level-window = %p",toplevel); } } static void bt_main_menu_dispose(GObject *object) { BtMainMenu *self = BT_MAIN_MENU(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); self->priv->main_window=NULL; g_object_unref(self->priv->change_log); g_object_unref(self->priv->app); G_OBJECT_CLASS(bt_main_menu_parent_class)->dispose(object); } static void bt_main_menu_init( BtMainMenu *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_MENU, BtMainMenuPrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->change_log=bt_change_log_new(); #ifdef USE_DEBUG self->priv->debug_graph_details=GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS|GST_DEBUG_GRAPH_SHOW_STATES; self->priv->debug_graph_format="svg"; #endif } static void bt_main_menu_class_init(BtMainMenuClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); g_type_class_add_private(klass,sizeof(BtMainMenuPrivate)); gobject_class->dispose = bt_main_menu_dispose; widget_class->map = bt_main_menu_map; } buzztard-0.6.0/src/ui/edit/volume-popup.h0000644042355400116100000000437211576360376015307 00000000000000/* $Id: volume-popup.h 3345 2011-04-28 20:12:09Z ensonic $ * * GNOME Volume Applet * Copyright (C) 2004 Ronald Bultje * 2006 Stefan Kost * * gtkvolumepopup.h: floating window containing volume widgets * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_VOLUME_POPUP_H #define BT_VOLUME_POPUP_H #include #include #include G_BEGIN_DECLS #define BT_TYPE_VOLUME_POPUP (bt_volume_popup_get_type ()) #define BT_VOLUME_POPUP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_VOLUME_POPUP, BtVolumePopup)) #define BT_IS_VOLUME_POPUP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_VOLUME_POPUP)) #define BT_VOLUME_POPUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_VOLUME_POPUP, BtVolumePopupClass)) #define BT_IS_VOLUME_POPUP_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_VOLUME_POPUP)) typedef struct _BtVolumePopup BtVolumePopup; typedef struct _BtVolumePopupClass BtVolumePopupClass; /** * BtVolumePopup: * * a volume popup widget */ struct _BtVolumePopup { GtkWindow parent; /* us */ GtkRange *scale; GtkButton *plus, *minus; /* timeout for buttons */ guint timeout; /* for +/- buttons */ gint direction; }; struct _BtVolumePopupClass { GtkWindowClass klass; }; GtkWidget *bt_volume_popup_new(GtkAdjustment *adj); void bt_volume_popup_show(BtVolumePopup *self); void bt_volume_popup_hide(BtVolumePopup *self); GType bt_volume_popup_get_type(void) G_GNUC_CONST; G_END_DECLS #endif // BT_VOLUME_POPUP_H buzztard-0.6.0/src/ui/edit/main-page-sequence.c0000644042355400116100000045752511667420461016303 00000000000000/* $Id: main-page-sequence.c 3751 2011-12-06 14:05:36Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btmainpagesequence * @short_description: the editor main sequence page * @see_also: #BtSequence, #BtSequenceView * * Provides an editor for #BtSequence instances. */ /* @todo: main-page-sequence tasks * - add third view for eating remaining space * - or block cursor moving there * - shortcuts * - Ctrl- : Stepping * - set increment for cursor-down on edit * - Duplicate pattern: make a copy of pattern under cursor and go to pattern view * - New pattern: open new pattern dialog, insert pattern under cursor and go to pattern view * - sequence view context menu * - open pattern properties * - copy current pattern * - allow to switch meters (off, level, scope, spectrum) * - when we move between tracks, switch the current-machine in pattern-view * - we could expose current-machine as a property * - pattern list * - go to next occurence when double clicking a pattern * - show tick-length in pattern list (needs column in model) */ /* @todo: we should have a track-changed signal ((current-track property) * - allows pattern to sync with selected machine and not passively syncing * (bt_main_page_patterns_show_machine()) * - we already have a cursor-row property and we could add a cursor-column * property too (and get the notify::cursor-column for free) */ /* @todo: handle pattern name changes * - when pattern gets renamed * - we need to update the pattern list (if shown) - done * - we need to update the sequence (if pattern is used) * - we need to catch each pattern addition to listen to notify::name * - right now we only watch for pattern add/remove for current track * - we need to avoid to add the handler multiple times */ /* @idea: add a follow playback checkbox to toolbar to en/disable sequence scrolling * - the scrolling causes quite some repaints and thus slowness * - it would be good if we could deoouple the scolling and the events, so * that we e.g. scroll 10 times a second to the latest position */ /* @idea: bold row,label for cursor row * - makes it easier to follow position in wide sequences * (same needed for pattern view) */ /* @idea: have a split horizontal command * - we would share the hadjustment, but have separate vadjustments * - the label-menu would require that we have a focused view */ /* @bugs * - hovering the mouse over the treeview causes redraws for the whole lines * - cells are asked to do prelight, even if they wouldn't draw anything else * http://www.gtk.org/plan/meetings/20041025.txt */ /* @idea: programmable keybindings * - we should define an enum for the key commands * - we should have a tables that maps keyval+state to one of the enums * - we should have a utility function to do the lookups * - we could have primary and secondary keys (keyval+state) * - each entry has a description (i18n) * - the whole group has a name (i18n) * - we can register the group to a binding manager * - the binding manager provides a ui to: * - edit the bindings * - save/load bindings to/from a named preset */ /* @todo: improve sequence-grid-model use * - get rid of sequence_table_refresh_columns() calls (7) */ #define BT_EDIT #define BT_MAIN_PAGE_SEQUENCE_C #include "bt-edit.h" #include "gtkvumeter.h" enum { MAIN_PAGE_SEQUENCE_CURSOR_ROW=1 }; struct _BtMainPageSequencePrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* the application */ BtEditApplication *app; /* the main window */ BtMainWindow *main_window; /* the sequence we are showing */ BtSequence *sequence; /* machine for current column */ BtMachine *machine; /* bars selection menu */ GtkComboBox *bars_menu; gulong bars; /* label selection menu */ GtkComboBox *label_menu; /* pos unit selection menu */ GtkWidget *pos_menu; BtSequenceGridModelPosFormat pos_format; /* the sequence table */ GtkHBox *sequence_pos_table_header; GtkTreeView *sequence_pos_table; GtkHBox *sequence_table_header; GtkTreeView *sequence_table; /* the pattern list */ GtkTreeView *pattern_list; /* position-table header label widget */ GtkWidget *pos_header; /* local commands */ GtkAccelGroup *accel_group; /* sequence context_menu */ GtkMenu *context_menu; GtkMenuItem *context_menu_add; /* colors */ GdkColor *cursor_bg; GdkColor *selection_bg1,*selection_bg2; GdkColor *source_bg1,*source_bg2; GdkColor *processor_bg1,*processor_bg2; GdkColor *sink_bg1,*sink_bg2; /* some internal states */ glong tick_pos; /* cursor */ glong cursor_column; glong cursor_row; /* selection range */ glong selection_start_column; glong selection_start_row; glong selection_end_column; glong selection_end_row; /* selection first cell */ glong selection_column; glong selection_row; /* vumeter data */ GHashTable *level_to_vumeter; GstClock *clock; /* number of rows contained in the model, this is the length of the sequence * plus extra dummy lines */ gulong sequence_length; /* signal handler id's */ gulong pattern_removed_handler; /* playback state */ gboolean is_playing; /* lock for multithreaded access */ GMutex *lock; /* cached sequence properties */ GHashTable *properties; /* editor change log */ BtChangeLog *change_log; }; static GQuark bus_msg_level_quark=0; static GQuark vu_meter_skip_update=0; static GdkAtom sequence_atom; //-- the class static void bt_main_page_sequence_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data); G_DEFINE_TYPE_WITH_CODE (BtMainPageSequence, bt_main_page_sequence, GTK_TYPE_VBOX, G_IMPLEMENT_INTERFACE (BT_TYPE_CHANGE_LOGGER, bt_main_page_sequence_change_logger_interface_init)); enum { SEQUENCE_VIEW_POS_PLAY=0, SEQUENCE_VIEW_POS_LOOP_START, SEQUENCE_VIEW_POS_LOOP_END }; // this only works for 4/4 meassure //#define IS_SEQUENCE_POS_VISIBLE(pos,bars) ((pos&((bars)-1))==0) #define IS_SEQUENCE_POS_VISIBLE(pos,bars) ((pos%bars)==0) #define SEQUENCE_CELL_WIDTH 100 #define SEQUENCE_CELL_HEIGHT 28 #define SEQUENCE_CELL_XPAD 0 #define SEQUENCE_CELL_YPAD 0 #define POSITION_CELL_WIDTH 65 #define HEADER_SPACING 0 #define LOW_VUMETER_VAL -60.0 // when setting the HEIGHT for one column, then the focus rect is visible for // the other (smaller) columns enum { METHOD_SET_PATTERNS, METHOD_SET_LABELS, METHOD_SET_SEQUENCE_PROPERTY, METHOD_ADD_TRACK, METHOD_REM_TRACK, METHOD_MOVE_TRACK }; static BtChangeLoggerMethods change_logger_methods[] = { BT_CHANGE_LOGGER_METHOD("set_patterns",13,"([0-9]+),([0-9]+),([0-9]+),(.*)$"), BT_CHANGE_LOGGER_METHOD("set_labels",11,"([0-9]+),([0-9]+),(.*)$"), BT_CHANGE_LOGGER_METHOD("set_sequence_property",22,"\"([-_a-zA-Z0-9 ]+)\",\"([-_a-zA-Z0-9 ]+)\"$"), BT_CHANGE_LOGGER_METHOD("add_track",10,"\"([a-zA-Z0-9 ]+)\",([0-9]+)$"), BT_CHANGE_LOGGER_METHOD("rem_track",10,"([0-9]+)$"), BT_CHANGE_LOGGER_METHOD("move_track",11,"([0-9]+),([0-9]+)$"), { NULL, } }; static GQuark column_index_quark=0; static void on_track_add_activated(GtkMenuItem *menuitem, gpointer user_data); static void on_pattern_removed(BtMachine *machine,BtPattern *pattern,gpointer user_data); //-- main-window helper static void grab_main_window(const BtMainPageSequence *self) { GtkWidget *toplevel=gtk_widget_get_toplevel((GtkWidget *)self); if(gtk_widget_is_toplevel(toplevel)) { self->priv->main_window=BT_MAIN_WINDOW(toplevel); GST_DEBUG("top-level-window = %p",toplevel); } } //-- tree filter func static gboolean step_visible_filter(GtkTreeModel *store,GtkTreeIter *iter,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong pos; // determine row number and hide or show accordingly gtk_tree_model_get(store,iter,BT_SEQUENCE_GRID_MODEL_POS,&pos,-1); if((pospriv->sequence_length) && IS_SEQUENCE_POS_VISIBLE(pos,self->priv->bars)) return TRUE; else return FALSE; } static gboolean label_visible_filter(GtkTreeModel *store,GtkTreeIter *iter,gpointer user_data) { //BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gchar *label; // show only columns with labels // @todo: have a boolean flag to avoid string copies gtk_tree_model_get(store,iter,BT_SEQUENCE_GRID_MODEL_LABEL,&label,-1); g_free(label); if(label) return TRUE; else return FALSE; } //-- tree cell data functions static void label_cell_data_function(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong row; GdkColor *bg_col=NULL; gtk_tree_model_get(model,iter, BT_SEQUENCE_GRID_MODEL_POS,&row, -1); if((0==self->priv->cursor_column) && (row==self->priv->cursor_row)) { bg_col=self->priv->cursor_bg; } else if((0>=self->priv->selection_start_column) && (0<=self->priv->selection_end_column) && (row>=self->priv->selection_start_row) && (row<=self->priv->selection_end_row) ) { bg_col=((row/self->priv->bars)&1)?self->priv->selection_bg2:self->priv->selection_bg1; } if(bg_col) { g_object_set(renderer, "background-gdk",bg_col, "background-set",TRUE, NULL); } else { g_object_set(renderer, "background-set",FALSE, NULL); } } static void source_machine_cell_data_function(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong row,column; gboolean shade; GdkColor *bg_col; gchar *str; column=1+GPOINTER_TO_UINT(g_object_get_qdata(G_OBJECT(col),column_index_quark)); gtk_tree_model_get(model,iter, BT_SEQUENCE_GRID_MODEL_POS,&row, BT_SEQUENCE_GRID_MODEL_SHADE,&shade, BT_SEQUENCE_GRID_MODEL_LABEL+column,&str, -1); if((column==self->priv->cursor_column) && (row==self->priv->cursor_row)) { bg_col=self->priv->cursor_bg; } else if((column>=self->priv->selection_start_column) && (column<=self->priv->selection_end_column) && (row>=self->priv->selection_start_row) && (row<=self->priv->selection_end_row)) { bg_col=shade?self->priv->selection_bg1:self->priv->selection_bg2; } else { bg_col=shade?self->priv->source_bg2:self->priv->source_bg1; } g_object_set(renderer, "background-gdk",bg_col, "text",str, NULL); g_free(str); } static void processor_machine_cell_data_function(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong row,column; gboolean shade; GdkColor *bg_col; gchar *str; column=1+GPOINTER_TO_UINT(g_object_get_qdata(G_OBJECT(col),column_index_quark)); gtk_tree_model_get(model,iter, BT_SEQUENCE_GRID_MODEL_POS,&row, BT_SEQUENCE_GRID_MODEL_SHADE,&shade, BT_SEQUENCE_GRID_MODEL_LABEL+column,&str, -1); if((column==self->priv->cursor_column) && (row==self->priv->cursor_row)) { bg_col=self->priv->cursor_bg; } else if((column>=self->priv->selection_start_column) && (column<=self->priv->selection_end_column) && (row>=self->priv->selection_start_row) && (row<=self->priv->selection_end_row)) { bg_col=shade?self->priv->selection_bg1:self->priv->selection_bg2; } else { bg_col=shade?self->priv->processor_bg2:self->priv->processor_bg1; } g_object_set(renderer, "background-gdk",bg_col, "text",str, NULL); g_free(str); } static void sink_machine_cell_data_function(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong row,column; gboolean shade; GdkColor *bg_col; gchar *str; column=1+GPOINTER_TO_UINT(g_object_get_qdata(G_OBJECT(col),column_index_quark)); gtk_tree_model_get(model,iter, BT_SEQUENCE_GRID_MODEL_POS,&row, BT_SEQUENCE_GRID_MODEL_SHADE,&shade, BT_SEQUENCE_GRID_MODEL_LABEL+column,&str, -1); if((column==self->priv->cursor_column) && (row==self->priv->cursor_row)) { bg_col=self->priv->cursor_bg; } else if((column>=self->priv->selection_start_column) && (column<=self->priv->selection_end_column) && (row>=self->priv->selection_start_row) && (row<=self->priv->selection_end_row)) { bg_col=shade?self->priv->selection_bg1:self->priv->selection_bg2; } else { bg_col=shade?self->priv->sink_bg2:self->priv->sink_bg1; } g_object_set(renderer, "background-gdk",bg_col, "text",str, NULL); g_free(str); } //-- tree model helper static gboolean sequence_view_get_cursor_pos(GtkTreeView *tree_view,GtkTreePath *path,GtkTreeViewColumn *column,gulong *col,gulong *row) { gboolean res=FALSE; GtkTreeModel *store; GtkTreeModelFilter *filtered_store; GtkTreeIter iter,filter_iter; g_return_val_if_fail(path,FALSE); if((filtered_store=GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(tree_view))) && (store=gtk_tree_model_filter_get_model(filtered_store)) ) { if(gtk_tree_model_get_iter(GTK_TREE_MODEL(filtered_store),&filter_iter,path)) { if(col) { GList *columns=gtk_tree_view_get_columns(tree_view); *col=g_list_index(columns,(gpointer)column); g_list_free(columns); } if(row) { gtk_tree_model_filter_convert_iter_to_child_iter(filtered_store,&iter,&filter_iter); gtk_tree_model_get(store,&iter,BT_SEQUENCE_GRID_MODEL_POS,row,-1); } res=TRUE; } else { GST_INFO("No iter for path"); } } else { GST_WARNING("Can't get tree-model"); } return(res); } static gboolean sequence_view_set_cursor_pos(const BtMainPageSequence *self) { GtkTreePath *path; gboolean res=FALSE; // @todo: http://bugzilla.gnome.org/show_bug.cgi?id=498010, fixed in 2008 if(!GTK_IS_TREE_VIEW(self->priv->sequence_table) || !gtk_tree_view_get_model(self->priv->sequence_table)) return(FALSE); if((path=gtk_tree_path_new_from_indices((self->priv->cursor_row/self->priv->bars),-1))) { GList *columns; if((columns=gtk_tree_view_get_columns(self->priv->sequence_table))) { GtkTreeViewColumn *column=g_list_nth_data(columns,self->priv->cursor_column); // set cell focus gtk_tree_view_set_cursor(self->priv->sequence_table,path,column,FALSE); res=TRUE; g_list_free(columns); } else { GST_WARNING("Can't get columns for pos %ld:%ld",self->priv->cursor_row,self->priv->cursor_column); } gtk_tree_path_free(path); } else { GST_WARNING("Can't create treepath for pos %ld:%ld",self->priv->cursor_row,self->priv->cursor_column); } gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); return res; } /* * sequence_view_get_current_pos: * @self: the sequence subpage * @time: pointer for time result * @track: pointer for track result * * Get the currently cursor position in the sequence table. * The result will be place in the respective pointers. * If one is NULL, no value is returned for it. * * Returns: %TRUE if the cursor is at a valid track position */ static gboolean sequence_view_get_current_pos(const BtMainPageSequence *self,gulong *time,gulong *track) { gboolean res=FALSE; GtkTreePath *path; GtkTreeViewColumn *column; //GST_INFO("get active sequence cell"); gtk_tree_view_get_cursor(self->priv->sequence_table,&path,&column); if(column && path) { res=sequence_view_get_cursor_pos(self->priv->sequence_table,path,column,track,time); } else { GST_INFO("No cursor pos, column=%p, path=%p",column,path); } if(path) gtk_tree_path_free(path); return(res); } static GtkTreeModel *sequence_model_get_store(const BtMainPageSequence *self) { GtkTreeModel *store=NULL; GtkTreeModelFilter *filtered_store; if((filtered_store=GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(self->priv->sequence_table)))) { store=gtk_tree_model_filter_get_model(filtered_store); } return(store); } /* * sequence_calculate_visible_lines: * @self: the sequence subpage * * Recalculate the visible lines after length or bar-stepping changes. Also * updated the loop marker positions accordingly. */ static void sequence_calculate_visible_lines(const BtMainPageSequence *self) { gulong visible_rows,sequence_length; glong loop_start_pos,loop_end_pos; gdouble loop_start,loop_end; g_object_get(self->priv->sequence,"length",&sequence_length,"loop-start",&loop_start_pos,"loop-end",&loop_end_pos,NULL); if(self->priv->sequence_lengthpriv->sequence_length=sequence_length; } visible_rows=sequence_length/self->priv->bars; loop_start=(loop_start_pos>-1)?(gdouble)loop_start_pos/(gdouble)sequence_length:0.0; loop_end =(loop_end_pos >-1)?(gdouble)loop_end_pos /(gdouble)sequence_length:1.0; GST_INFO("visible_rows=%lu = %lu / %lu",visible_rows,sequence_length,self->priv->bars); g_object_set(self->priv->sequence_table,"visible-rows",visible_rows,"loop-start",loop_start,"loop-end",loop_end,NULL); g_object_set(self->priv->sequence_pos_table,"visible-rows",visible_rows,"loop-start",loop_start,"loop-end",loop_end,NULL); } static void sequence_update_model_length(const BtMainPageSequence *self) { GtkTreeModelFilter *filtered_store; if((filtered_store=GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(self->priv->sequence_table)))) { BtSequenceGridModel *store=BT_SEQUENCE_GRID_MODEL(gtk_tree_model_filter_get_model(filtered_store)); g_object_set(store,"length",self->priv->sequence_length,NULL); // somehow the treemodel filter doe not get the new rows otherwise gtk_tree_model_filter_refilter(filtered_store); } } //-- gtk helpers static void widget_shade_bg_color(GtkWidget *widget,GtkStateType state,gfloat rf,gfloat gf,gfloat bf) { GtkStyle *style=gtk_widget_get_style(widget); GdkColor color=style->bg[state]; gfloat c; c=((gfloat)color.red*rf); color.red=(guint16)MIN(c,65535.0); c=((gfloat)color.green*gf); color.green=(guint16)MIN(c,65535.0); c=((gfloat)color.blue*bf); color.blue=(guint16)MIN(c,65535.0); gtk_widget_modify_bg(widget,state,&color); } static GtkWidget* make_mini_button(const gchar *txt,gfloat rf,gfloat gf,gfloat bf, gboolean toggled) { GtkWidget *button; // the font get smaller, but the buttons don't :/ #define USE_MARKUP 0 #if USE_MARKUP GtkWidget *label; button=gtk_toggle_button_new_with_label(""); label=gtk_bin_get_child(GTK_BIN(button)); if(GTK_IS_LABEL(label)) { gchar *str=g_strconcat("",txt,"",NULL); gtk_label_set_markup (GTK_LABEL (label),str); g_free(str); } else { GST_WARNING("expecting a GtkLabel as a first child"); } #else button=gtk_toggle_button_new_with_label(txt); #endif gtk_widget_set_name(button,"mini-button"); widget_shade_bg_color(button,GTK_STATE_ACTIVE ,rf,gf,bf); widget_shade_bg_color(button,GTK_STATE_PRELIGHT,rf,gf,bf); gtk_container_set_border_width(GTK_CONTAINER(button),0); if(toggled) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),toggled); return(button); } //-- tree model helper static BtPattern *pattern_list_model_get_pattern_by_key(GtkTreeModel *store,gchar that_key) { GtkTreeIter iter; gchar *this_key; BtPattern *pattern=NULL; GST_INFO("look up pattern for key: '%c'",that_key); gtk_tree_model_get_iter_first(store,&iter); do { gtk_tree_model_get(store,&iter,BT_PATTERN_MODEL_SHORTCUT,&this_key,-1); if(this_key[0]==that_key) { pattern=g_object_ref(bt_pattern_list_model_get_object((BtPatternListModel *)store,&iter)); GST_INFO("found pattern for key : %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); g_free(this_key); break; } g_free(this_key); } while(gtk_tree_model_iter_next(store,&iter)); return(pattern); } //-- undo/redo helpers static void sequence_range_copy(const BtMainPageSequence *self,glong track_beg,glong track_end,glong tick_beg,glong tick_end,GString *data) { BtSequence *sequence=self->priv->sequence; BtMachine *machine; BtPattern *pattern; glong i,j,col; gchar *id,*str; gulong sequence_length; g_object_get(sequence,"length",&sequence_length,NULL); /* label-track */ col=track_beg; if(col==0) { g_string_append_c(data,' '); for(j=tick_beg;j<=tick_end;j++) { if((jpriv->change_log); /* label-track */ col=track_beg; if(col==0) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_labels %lu,%lu,%s",tick_beg,tick_end,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_labels %lu,%lu,%s",tick_beg,tick_end,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); col++; } /* machine-tracks */ for(i=col;i<=track_end;i++) { p=strchr(old_str,'\n');*p='\0'; undo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s",i-1,tick_beg,tick_end,old_str); old_str=&p[1]; p=strchr(new_str,'\n');*p='\0'; redo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s",i-1,tick_beg,tick_end,new_str); new_str=&p[1]; bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } bt_change_log_end_group(self->priv->change_log); } //-- event handlers static void on_page_switched(GtkNotebook *notebook, GParamSpec *arg, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); guint page_num; static gint prev_page_num=-1; g_object_get(notebook,"page",&page_num,NULL); if(page_num==BT_MAIN_PAGES_SEQUENCE_PAGE) { // only do this if the page really has changed if(prev_page_num != BT_MAIN_PAGES_SEQUENCE_PAGE) { GST_DEBUG("enter sequence page"); // this is emmitted before we are mapped etc. if(!self->priv->main_window) grab_main_window(self); if(self->priv->main_window) { // add local commands gtk_window_add_accel_group(GTK_WINDOW(self->priv->main_window),self->priv->accel_group); } } } else { // only do this if the page was BT_MAIN_PAGES_SEQUENCE_PAGE if(prev_page_num == BT_MAIN_PAGES_SEQUENCE_PAGE) { GST_DEBUG("leave sequence page"); if(self->priv->main_window) { // remove local commands gtk_window_remove_accel_group(GTK_WINDOW(self->priv->main_window),self->priv->accel_group); bt_child_proxy_set(self->priv->main_window,"statusbar::status",NULL,NULL); } } } prev_page_num = page_num; } static void on_machine_id_changed(BtMachine *machine,GParamSpec *arg,gpointer user_data) { GtkLabel *label=GTK_LABEL(user_data); gchar *str; g_object_get(machine,"id",&str,NULL); GST_INFO("machine id changed to \"%s\"",str); gtk_label_set_text(label,str); g_free(str); } static void on_machine_id_changed_seq(BtMachine *machine,GParamSpec *arg,gpointer user_data) { on_machine_id_changed(machine,arg,user_data); } static void on_machine_id_changed_menu(BtMachine *machine,GParamSpec *arg,gpointer user_data) { on_machine_id_changed(machine,arg,user_data); } /* * on_header_size_allocate: * * Adjusts the height of the header widget of the first treeview (pos) to the * height of the second treeview. */ static void on_header_size_allocate(GtkWidget *widget,GtkAllocation *allocation,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GST_DEBUG("#### header label size %d x %d",allocation->width,allocation->height); gtk_widget_set_size_request(self->priv->pos_header,-1,allocation->height); } /* DEBUG static void on_sequence_header_size_allocate(GtkWidget *widget,GtkAllocation *allocation,gpointer user_data) { GtkRequisition requisition; gtk_widget_size_request(widget,&requisition); GST_WARNING("#### header %s alloc: %d x %d, req: %d x %d", (gchar *)user_data, allocation->width,allocation->height, requisition.width,requisition.height ); } // DEBUG */ static void on_machine_state_toggled(GtkToggleButton *togglebutton,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); bt_edit_application_set_song_unsaved(self->priv->app); } static void on_mute_toggled(GtkToggleButton *togglebutton,gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); if(gtk_toggle_button_get_active(togglebutton)) { g_object_set(machine,"state",BT_MACHINE_STATE_MUTE,NULL); } else { g_object_set(machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } } static void on_solo_toggled(GtkToggleButton *togglebutton,gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); if(gtk_toggle_button_get_active(togglebutton)) { g_object_set(machine,"state",BT_MACHINE_STATE_SOLO,NULL); } else { g_object_set(machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } } static void on_bypass_toggled(GtkToggleButton *togglebutton,gpointer user_data) { BtMachine *machine=BT_MACHINE(user_data); if(gtk_toggle_button_get_active(togglebutton)) { g_object_set(machine,"state",BT_MACHINE_STATE_BYPASS,NULL); } else { g_object_set(machine,"state",BT_MACHINE_STATE_NORMAL,NULL); } } static void on_machine_state_changed_mute(BtMachine *machine,GParamSpec *arg,gpointer user_data) { GtkToggleButton *button=GTK_TOGGLE_BUTTON(user_data); BtMachineState state; g_object_get(machine,"state",&state,NULL); g_signal_handlers_block_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_mute_toggled,(gpointer)machine); gtk_toggle_button_set_active(button,(state==BT_MACHINE_STATE_MUTE)); g_signal_handlers_unblock_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_mute_toggled,(gpointer)machine); } static void on_machine_state_changed_solo(BtMachine *machine,GParamSpec *arg,gpointer user_data) { GtkToggleButton *button=GTK_TOGGLE_BUTTON(user_data); BtMachineState state; g_object_get(machine,"state",&state,NULL); g_signal_handlers_block_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_solo_toggled,(gpointer)machine); gtk_toggle_button_set_active(button,(state==BT_MACHINE_STATE_SOLO)); g_signal_handlers_unblock_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_solo_toggled,(gpointer)machine); } static void on_machine_state_changed_bypass(BtMachine *machine,GParamSpec *arg,gpointer user_data) { GtkToggleButton *button=GTK_TOGGLE_BUTTON(user_data); BtMachineState state; g_object_get(machine,"state",&state,NULL); g_signal_handlers_block_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_bypass_toggled,(gpointer)machine); gtk_toggle_button_set_active(button,(state==BT_MACHINE_STATE_BYPASS)); g_signal_handlers_unblock_matched(button,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_bypass_toggled,(gpointer)machine); } typedef struct { BtMainPageSequence *self; GtkVUMeter *vumeter; gint peak, decay; } BtUpdateIdleData; #define MAKE_UPDATE_IDLE_DATA(data,self,vumeter,peak,decay) G_STMT_START { \ data=g_slice_new(BtUpdateIdleData); \ data->self=self; \ data->vumeter=vumeter; \ data->peak=(gint)(peak+0.5); \ data->decay=(gint)(decay+0.5); \ g_mutex_lock(self->priv->lock); \ g_object_add_weak_pointer((GObject *)self,(gpointer *)(&data->self)); \ g_object_add_weak_pointer((GObject *)vumeter,(gpointer *)(&data->vumeter)); \ g_mutex_unlock(self->priv->lock); \ } G_STMT_END #define FREE_UPDATE_IDLE_DATA(data) G_STMT_START { \ if(data->self) { \ g_mutex_lock(data->self->priv->lock); \ g_object_remove_weak_pointer((gpointer)data->self,(gpointer *)(&data->self)); \ if(data->vumeter) g_object_remove_weak_pointer((gpointer)data->vumeter,(gpointer *)(&data->vumeter)); \ g_mutex_unlock(data->self->priv->lock); \ } \ g_slice_free(BtUpdateIdleData,data); \ } G_STMT_END static gboolean on_delayed_idle_track_level_change(gpointer user_data) { BtUpdateIdleData *data=(BtUpdateIdleData *)user_data; BtMainPageSequence *self=data->self; if(self && self->priv->is_playing && data->vumeter) { gtk_vumeter_set_levels(data->vumeter, data->peak, data->decay); } FREE_UPDATE_IDLE_DATA(data); return(FALSE); } static gboolean on_delayed_track_level_change(GstClock *clock,GstClockTime time,GstClockID id,gpointer user_data) { // the callback is called from a clock thread if(GST_CLOCK_TIME_IS_VALID(time)) g_idle_add(on_delayed_idle_track_level_change,user_data); else { BtUpdateIdleData *data=(BtUpdateIdleData *)user_data; FREE_UPDATE_IDLE_DATA(data); } return(TRUE); } static void on_track_level_change(GstBus * bus, GstMessage * message, gpointer user_data) { const GstStructure *structure=gst_message_get_structure(message); const GQuark name_id=gst_structure_get_name_id(structure); if(name_id==bus_msg_level_quark) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GstElement *level=GST_ELEMENT(GST_MESSAGE_SRC(message)); GtkVUMeter *vumeter; // check if its our element (we can have multiple level meters) if((vumeter=g_hash_table_lookup(self->priv->level_to_vumeter,level))) { GstClockTime timestamp, duration; GstClockTime waittime=GST_CLOCK_TIME_NONE; if(gst_structure_get_clock_time (structure, "running-time", ×tamp) && gst_structure_get_clock_time (structure, "duration", &duration)) { /* wait for middle of buffer */ waittime=timestamp+duration/2; } else if(gst_structure_get_clock_time (structure, "endtime", ×tamp)) { /* level send endtime as stream_time and not as running_time */ waittime=gst_segment_to_running_time(&GST_BASE_TRANSFORM(level)->segment, GST_FORMAT_TIME, timestamp); } if(GST_CLOCK_TIME_IS_VALID(waittime)) { const GValue *l_decay,*l_peak; gdouble decay=0.0, peak=0.0; guint i,size; gint new_skip=FALSE,old_skip=FALSE; l_decay=(GValue *)gst_structure_get_value(structure, "decay"); l_peak=(GValue *)gst_structure_get_value(structure, "peak"); size=gst_value_list_get_size(l_decay); for(i=0;i=0.0 && peak>=0.0) new_skip=2; // beyond max level // skip *updates* if we are still below LOW_VUMETER_VAL or beyond 0.0 old_skip=GPOINTER_TO_INT(g_object_get_qdata((GObject *)vumeter,vu_meter_skip_update)); g_object_set_qdata((GObject *)vumeter,vu_meter_skip_update,GINT_TO_POINTER(new_skip)); if(!old_skip || !new_skip || old_skip!=new_skip) { BtUpdateIdleData *data; GstClockID clock_id; GstClockTime basetime=gst_element_get_base_time(level); MAKE_UPDATE_IDLE_DATA(data,self,vumeter,peak,decay); clock_id=gst_clock_new_single_shot_id(self->priv->clock,waittime+basetime); if(gst_clock_id_wait_async(clock_id,on_delayed_track_level_change,(gpointer)data)!=GST_CLOCK_OK) { FREE_UPDATE_IDLE_DATA(data); } gst_clock_id_unref(clock_id); } // just for counting //else GST_WARNING_OBJECT(level,"skipping level update"); } } } } static void on_sequence_label_edited(GtkCellRendererText *cellrenderertext,gchar *path_string,gchar *new_text,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GtkTreeModelFilter *filtered_store; GtkTreeModel *store; gulong pos; gchar *old_text; GST_INFO("label edited: '%s': '%s'",path_string,new_text); if((filtered_store=GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(self->priv->sequence_table))) && (store=gtk_tree_model_filter_get_model(filtered_store)) ) { GtkTreeIter iter,filter_iter; if(gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(filtered_store),&filter_iter,path_string)) { gboolean changed=FALSE; gtk_tree_model_filter_convert_iter_to_child_iter(filtered_store,&iter,&filter_iter); gtk_tree_model_get(store,&iter,BT_SEQUENCE_GRID_MODEL_POS,&pos,BT_SEQUENCE_GRID_MODEL_LABEL,&old_text,-1); GST_INFO("old_text '%s'",old_text); if(old_text || new_text) { changed=TRUE; if(old_text && !*old_text) old_text=NULL; if(new_text && !*new_text) new_text=NULL; } else if(old_text && new_text && !strcmp(old_text,new_text)) changed=TRUE; if(changed) { gchar *undo_str,*redo_str; gulong old_length,new_length=0; GST_INFO("label changed"); g_object_get(self->priv->sequence,"length",&old_length,NULL); // update the sequence bt_change_log_start_group(self->priv->change_log); if(pos>=old_length) { new_length=pos+self->priv->bars; g_object_set(self->priv->sequence,"length",new_length,NULL); sequence_calculate_visible_lines(self); sequence_update_model_length(self); undo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",old_length); redo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",new_length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } bt_sequence_set_label(self->priv->sequence,pos,new_text); undo_str = g_strdup_printf("set_labels %lu,%lu, ,%s",pos,pos,(old_text?old_text:" ")); redo_str = g_strdup_printf("set_labels %lu,%lu, ,%s",pos,pos,(new_text?new_text:" ")); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); bt_change_log_end_group(self->priv->change_log); } g_free(old_text); } } } static void on_pos_menu_changed(GtkComboBox *combo_box,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); BtSequenceGridModel *store=BT_SEQUENCE_GRID_MODEL(sequence_model_get_store(self)); self->priv->pos_format=gtk_combo_box_get_active(combo_box); g_object_set(store,"pos-format",self->priv->pos_format,NULL); g_hash_table_insert(self->priv->properties,g_strdup("pos-format"),g_strdup(bt_persistence_strfmt_ulong(self->priv->pos_format))); bt_edit_application_set_song_unsaved(self->priv->app); } //-- event handler helper /* * sequence_pos_table_init: * @self: the sequence page * * inserts the 'Pos.' column into the first (left) treeview */ static void sequence_pos_table_init(const BtMainPageSequence *self) { GtkCellRenderer *renderer; GtkWidget *label; GtkTreeViewColumn *tree_col; gint col_index=0; // empty header widget gtk_container_forall(GTK_CONTAINER(self->priv->sequence_pos_table_header),(GtkCallback)gtk_widget_destroy,NULL); // create header widget self->priv->pos_header=gtk_vbox_new(FALSE,HEADER_SPACING); // time line position label=gtk_label_new(_("Pos.")); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.0); gtk_box_pack_start(GTK_BOX(self->priv->pos_header),label,TRUE,FALSE,0); self->priv->pos_menu=gtk_combo_box_text_new(); gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(self->priv->pos_menu),FALSE); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->pos_menu),_("Ticks")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->pos_menu),_("Time")); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(self->priv->pos_menu),_("Beats")); gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->pos_menu),self->priv->pos_format); gtk_box_pack_start(GTK_BOX(self->priv->pos_header),self->priv->pos_menu,TRUE,TRUE,0); //gtk_widget_set_size_request(self->priv->pos_header,POSITION_CELL_WIDTH,-1); g_signal_connect(self->priv->pos_menu,"changed",G_CALLBACK(on_pos_menu_changed), (gpointer)self); gtk_widget_show_all(self->priv->pos_header); gtk_box_pack_start(GTK_BOX(self->priv->sequence_pos_table_header),self->priv->pos_header,TRUE,TRUE,0); gtk_widget_set_size_request(GTK_WIDGET(self->priv->sequence_pos_table_header),POSITION_CELL_WIDTH,-1); // add static column renderer=gtk_cell_renderer_text_new(); g_object_set(renderer, "mode",GTK_CELL_RENDERER_MODE_INERT, "xalign",1.0, "yalign",0.5, NULL); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer),1); if((tree_col=gtk_tree_view_column_new_with_attributes(NULL,renderer, "text",BT_SEQUENCE_GRID_MODEL_POSSTR, NULL)) ) { g_object_set(tree_col, "sizing",GTK_TREE_VIEW_COLUMN_FIXED, "fixed-width",POSITION_CELL_WIDTH, NULL); col_index=gtk_tree_view_append_column(self->priv->sequence_pos_table,tree_col); } else GST_WARNING("can't create treeview column"); GST_DEBUG(" number of columns : %d",col_index); } static void sequence_table_refresh_model(const BtMainPageSequence *self,const BtSong *song) { BtSequenceGridModel *store; GtkTreeModel *filtered_store; GST_INFO("refresh sequence table"); // @todo: in the future only do this when loading a new song store=bt_sequence_grid_model_new(self->priv->sequence,self->priv->bars); g_object_set(store,"length",self->priv->sequence_length,"pos-format",self->priv->pos_format,NULL); // create a filtered model to realize step filtering filtered_store=gtk_tree_model_filter_new(GTK_TREE_MODEL(store),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filtered_store),step_visible_filter,(gpointer)self,NULL); // active models gtk_tree_view_set_model(self->priv->sequence_table,filtered_store); gtk_tree_view_set_model(self->priv->sequence_pos_table,filtered_store); g_object_unref(filtered_store); // drop with widget // create a filtered store for the labels menu filtered_store=gtk_tree_model_filter_new(GTK_TREE_MODEL(store),NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filtered_store),label_visible_filter,(gpointer)self,NULL); // active models gtk_combo_box_set_model(self->priv->label_menu,filtered_store); gtk_combo_box_set_active(self->priv->label_menu,0); g_object_unref(filtered_store); // drop with widget } /* * sequence_table_clear: * @self: the sequence page * * removes old columns */ static void sequence_table_clear(const BtMainPageSequence *self) { GList *columns,*node; gulong number_of_tracks; // remove columns if((columns=gtk_tree_view_get_columns(self->priv->sequence_table))) { for(node=g_list_first(columns);node;node=g_list_next(node)) { gtk_tree_view_remove_column(self->priv->sequence_table,GTK_TREE_VIEW_COLUMN(node->data)); } g_list_free(columns); } // change number of tracks g_object_get(self->priv->sequence,"tracks",&number_of_tracks,NULL); if(number_of_tracks>0) { BtMachine *machine; guint i; // disconnect signal handlers for(i=0;ipriv->sequence,i))) { // even though we can have multiple tracks per machine, we can disconnect them all, as we rebuild the treeview anyway g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_mute,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_solo,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_bypass,NULL); // need to disconnect the label updates for the seq headers, unfortunately we don#t know the label // so we use a weak_ref and on_sequence_header_label_destroy() GST_INFO("machine %p,ref_ct=%d cleaning sequence table",machine,G_OBJECT_REF_COUNT(machine)); g_object_unref(machine); } } } } static void remove_container_widget(GtkWidget *widget,gpointer user_data) { GST_LOG("removing: %d, %s",G_OBJECT_REF_COUNT(widget),gtk_widget_get_name(widget)); gtk_container_remove(GTK_CONTAINER(user_data),widget); } static void reset_level_meter(gpointer key, gpointer value, gpointer user_data) { GtkVUMeter *vumeter=GTK_VUMETER(value); gtk_vumeter_set_levels(vumeter, LOW_VUMETER_VAL, LOW_VUMETER_VAL); g_object_set_qdata((GObject *)vumeter,vu_meter_skip_update,GINT_TO_POINTER((gint)FALSE)); } /* * sequence_table_init: * @self: the sequence page * * inserts the Label columns. */ static void sequence_table_init(const BtMainPageSequence *self) { GtkCellRenderer *renderer; GtkTreeViewColumn *tree_col; GtkWidget *label; GtkWidget *header,*vbox; gint col_index=0; GST_INFO("preparing sequence table"); // do not destroy when flushing the header if((vbox=gtk_widget_get_parent(GTK_WIDGET(self->priv->label_menu)))) { GST_INFO("holding label widget: %d",G_OBJECT_REF_COUNT(self->priv->label_menu)); gtk_container_remove(GTK_CONTAINER(vbox),GTK_WIDGET(g_object_ref(self->priv->label_menu))); //gtk_widget_unparent(GTK_WIDGET(g_object_ref(self->priv->label_menu))); GST_INFO(" : %d",G_OBJECT_REF_COUNT(self->priv->label_menu)); } // empty header widget gtk_container_forall(GTK_CONTAINER(self->priv->sequence_table_header),(GtkCallback)remove_container_widget,GTK_CONTAINER(self->priv->sequence_table_header)); // create header widget header=gtk_hbox_new(FALSE,HEADER_SPACING); vbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(header),vbox,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(header),gtk_vseparator_new(),FALSE,FALSE,0); label=gtk_label_new(_("Labels")); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.0); gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(self->priv->label_menu),TRUE,TRUE,0); /* FIXME: specifying 0, instead of -1, should yield 'as small as possible' * in reality it result in distorted overlapping widgets :( */ gtk_widget_set_size_request(header,SEQUENCE_CELL_WIDTH,-1); gtk_widget_show_all(header); gtk_box_pack_start(GTK_BOX(self->priv->sequence_table_header),header,FALSE,FALSE,0); g_signal_connect(header,"size-allocate",G_CALLBACK(on_header_size_allocate),(gpointer)self); // re-add static columns renderer=gtk_cell_renderer_text_new(); g_object_set(renderer, "mode",GTK_CELL_RENDERER_MODE_EDITABLE, "xalign",1.0, "yalign",0.5, "editable",TRUE, /* "width",SEQUENCE_CELL_WIDTH-4, "height",SEQUENCE_CELL_HEIGHT-4, "xpad",SEQUENCE_CELL_XPAD, "ypad",SEQUENCE_CELL_YPAD, */ NULL); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer),1); g_signal_connect(renderer,"edited",G_CALLBACK(on_sequence_label_edited),(gpointer)self); if((tree_col=gtk_tree_view_column_new_with_attributes(_("Labels"),renderer, "text",BT_SEQUENCE_GRID_MODEL_LABEL, NULL)) ) { g_object_set(tree_col, "sizing",GTK_TREE_VIEW_COLUMN_FIXED, "fixed-width",SEQUENCE_CELL_WIDTH, NULL); col_index=gtk_tree_view_append_column(self->priv->sequence_table,tree_col); gtk_tree_view_column_set_cell_data_func(tree_col, renderer, label_cell_data_function, (gpointer)self, NULL); } else GST_WARNING("can't create treeview column"); if(self->priv->level_to_vumeter) g_hash_table_destroy(self->priv->level_to_vumeter); self->priv->level_to_vumeter=g_hash_table_new_full(NULL,NULL,(GDestroyNotify)gst_object_unref,NULL); GST_DEBUG(" number of columns : %d",col_index); } static void sequence_table_refresh_columns(const BtMainPageSequence *self,const BtSong *song) { gulong j,track_ct; BtMachine *machine; GtkWidget *header; gchar *str; gint col_index; GtkCellRenderer *renderer; GtkTreeViewColumn *tree_col; GHashTable *machine_usage; // build dynamic sequence view GST_INFO("refresh sequence view"); g_object_get(self->priv->sequence,"tracks",&track_ct,NULL); // @todo: we'd like to update tjis instead of re-creating things // reset columns sequence_table_clear(self); // add initial columns sequence_table_init(self); // add column for each machine machine_usage=g_hash_table_new(NULL,NULL); for(j=0;jpriv->sequence,j); GST_INFO("machine %p,ref_ct=%d refresh sequence table track %lu",machine,G_OBJECT_REF_COUNT(machine),j); renderer=gtk_cell_renderer_text_new(); g_object_set(renderer, "mode",GTK_CELL_RENDERER_MODE_ACTIVATABLE, "xalign",0.0, "yalign",0.5, /* "editable",TRUE, "width",SEQUENCE_CELL_WIDTH-4, "height",SEQUENCE_CELL_HEIGHT-4, "xpad",SEQUENCE_CELL_XPAD, "ypad",SEQUENCE_CELL_YPAD, */ NULL); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer),1); // setup column header if(machine) { GtkWidget *label,*button,*vbox,*box; GtkVUMeter *vumeter; GstElement *level; gchar *level_name="output-post-level"; GST_DEBUG(" %3lu build column header",j); // enable level meters if(!BT_IS_SINK_MACHINE(machine)) { if(!bt_machine_enable_output_post_level(machine)) { GST_INFO("enabling output level for machine failed"); } } else { // its the sink, which already has it enabled level_name="input-post-level"; } g_object_get(machine,"id",&str,level_name,&level,NULL); // @todo: add context menu like that in the machine_view to the header // create header widget header=gtk_hbox_new(FALSE,HEADER_SPACING); vbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(header),vbox,TRUE,TRUE,0); gtk_box_pack_start(GTK_BOX(header),gtk_vseparator_new(),FALSE,FALSE,0); label=gtk_label_new(str); gtk_misc_set_alignment(GTK_MISC(label),0.0,0.0); g_free(str); gtk_box_pack_start(GTK_BOX(vbox),label,TRUE,TRUE,0); // disconnecting old handler here would be better, but then we need to differentiate (see below) g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_id_changed_seq,NULL); g_signal_connect(machine,"notify::id",G_CALLBACK(on_machine_id_changed_seq),(gpointer)label); // we need to remove the signal handler when updating the labels //g_object_weak_ref(G_OBJECT(label),on_sequence_header_label_destroy,machine); /* we have the label column already if(j==0) { // connect to the size-allocate signal to adjust the height of the other treeview header g_signal_connect(header,"size-allocate",G_CALLBACK(on_header_size_allocate),(gpointer)self); } */ box=gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(box),TRUE,TRUE,0); /* only do this for first track of a machine * - multiple level-meter views for same machine don't work * - MSB buttons would need to be synced */ if (!g_hash_table_lookup(machine_usage,machine)) { BtMachineState state; g_object_get(machine,"state",&state,NULL); g_hash_table_insert(machine_usage,machine,machine); // add M/S/B butons and connect signal handlers // @todo: use colors from ui-resources button=make_mini_button("M",1.2, 1.0/1.25, 1.0/1.25,(state==BT_MACHINE_STATE_MUTE)); // red gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); g_signal_connect(button,"toggled",G_CALLBACK(on_mute_toggled),(gpointer)machine); g_signal_connect(button,"toggled",G_CALLBACK(on_machine_state_toggled),(gpointer)self); g_signal_connect(machine,"notify::state", G_CALLBACK(on_machine_state_changed_mute), (gpointer)button); if(BT_IS_SOURCE_MACHINE(machine)) { button=make_mini_button("S",1.0/1.2,1.0/1.2,1.1,(state==BT_MACHINE_STATE_SOLO)); // blue gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); g_signal_connect(button,"toggled",G_CALLBACK(on_solo_toggled),(gpointer)machine); g_signal_connect(button,"toggled",G_CALLBACK(on_machine_state_toggled),(gpointer)self); g_signal_connect(machine,"notify::state", G_CALLBACK(on_machine_state_changed_solo), (gpointer)button); } if(BT_IS_PROCESSOR_MACHINE(machine)) { button=make_mini_button("B",1.2,1.0/1.1,1.0/1.4,(state==BT_MACHINE_STATE_BYPASS)); // orange gtk_box_pack_start(GTK_BOX(box),button,FALSE,FALSE,0); g_signal_connect(button,"toggled",G_CALLBACK(on_bypass_toggled),(gpointer)machine); g_signal_connect(button,"toggled",G_CALLBACK(on_machine_state_toggled),(gpointer)self); g_signal_connect(machine,"notify::state", G_CALLBACK(on_machine_state_changed_bypass), (gpointer)button); } vumeter=GTK_VUMETER(gtk_vumeter_new(FALSE)); gtk_vumeter_set_min_max(vumeter, LOW_VUMETER_VAL, 0); // no falloff in widget, we have falloff in GstLevel //gtk_vumeter_set_peaks_falloff(vumeter, GTK_VUMETER_PEAKS_FALLOFF_MEDIUM); gtk_vumeter_set_scale(vumeter, GTK_VUMETER_SCALE_LINEAR); reset_level_meter(level, vumeter, NULL); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(vumeter),TRUE,TRUE,0); // add level meters to hashtable if(level) { g_hash_table_insert(self->priv->level_to_vumeter,level,vumeter); } } } else { // a missing machine header=gtk_label_new("???"); GST_WARNING("can't get machine for column %lu",j); } gtk_widget_set_size_request(header,SEQUENCE_CELL_WIDTH,-1); gtk_widget_show_all(header); gtk_box_pack_start(GTK_BOX(self->priv->sequence_table_header),header,FALSE,FALSE,0); if((tree_col=gtk_tree_view_column_new_with_attributes(NULL,renderer, NULL))) { g_object_set(tree_col, "sizing",GTK_TREE_VIEW_COLUMN_FIXED, "fixed-width",SEQUENCE_CELL_WIDTH, NULL); g_object_set_qdata(G_OBJECT(tree_col),column_index_quark,GUINT_TO_POINTER(j)); gtk_tree_view_append_column(self->priv->sequence_table,tree_col); // color code columns if(BT_IS_SOURCE_MACHINE(machine)) { gtk_tree_view_column_set_cell_data_func(tree_col, renderer, source_machine_cell_data_function, (gpointer)self, NULL); } else if(BT_IS_PROCESSOR_MACHINE(machine)) { gtk_tree_view_column_set_cell_data_func(tree_col, renderer, processor_machine_cell_data_function, (gpointer)self, NULL); } else if(BT_IS_SINK_MACHINE(machine)) { gtk_tree_view_column_set_cell_data_func(tree_col, renderer, sink_machine_cell_data_function, (gpointer)self, NULL); } } else GST_WARNING("can't create treeview column"); g_object_try_unref(machine); } g_hash_table_destroy(machine_usage); GST_INFO("finish sequence table"); // add a final column that eats remaining space renderer=gtk_cell_renderer_text_new(); g_object_set(renderer, "mode",GTK_CELL_RENDERER_MODE_INERT, NULL); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); header=gtk_label_new(" "); // sad, but true, this matters, otherwise we get leftover artifacts when scrolling <-> gtk_label_set_width_chars(GTK_LABEL(header),5); gtk_label_set_single_line_mode(GTK_LABEL(header),TRUE); gtk_label_set_line_wrap(GTK_LABEL(header),FALSE); gtk_widget_show(header); gtk_box_pack_start(GTK_BOX(self->priv->sequence_table_header),header,TRUE,TRUE,0); if((tree_col=gtk_tree_view_column_new_with_attributes(/*title=*/NULL,renderer,NULL))) { g_object_set(tree_col, "sizing",GTK_TREE_VIEW_COLUMN_FIXED, NULL); col_index=gtk_tree_view_append_column(self->priv->sequence_table,tree_col); GST_DEBUG(" number of columns : %d",col_index); } else GST_WARNING("can't create treeview column"); } static void pattern_list_refresh(const BtMainPageSequence *self) { BtPatternListModel *store; // refresh the pattern list if(self->priv->machine) { GST_INFO("refresh pattern list for machine : %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); store=bt_pattern_list_model_new(self->priv->machine,self->priv->sequence,FALSE); // sync machine in pattern page if(self->priv->main_window) { BtMainPagePatterns *patterns_page; bt_child_proxy_get(self->priv->main_window,"pages::patterns-page",&patterns_page,NULL); bt_main_page_patterns_show_machine(patterns_page,self->priv->machine); g_object_unref(patterns_page); } GST_INFO("refreshed pattern list for machine : %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); } else { // FIXME, do we need a dummy store? - yes for the column headers //store=gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_BOOLEAN,G_TYPE_STRING); store=NULL; GST_INFO("no machine for cursor_column: %ld",self->priv->cursor_column); } gtk_tree_view_set_model(self->priv->pattern_list,GTK_TREE_MODEL(store)); g_object_try_unref(store); // drop with treeview } /* * update_after_track_changed: * @self: the sequence page * * When the user moves the cursor in the sequence, update the list of patterns * so that it shows the patterns that belong to the machine in the current * sequence row. * Also update the current selected machine in pattern view. */ static void update_after_track_changed(const BtMainPageSequence *self) { BtMachine *machine; GST_INFO("change active track"); machine=bt_sequence_get_machine(self->priv->sequence,self->priv->cursor_column-1); if(machine==self->priv->machine) { // nothing changed g_object_try_unref(machine); return; } GST_INFO("changing machine %p,ref_ct=%d to %p,ref_ct=%d", self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine), machine,G_OBJECT_REF_COUNT(machine) ); if(self->priv->machine) { GST_INFO("unref old cur-machine %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); g_signal_handler_disconnect(self->priv->machine,self->priv->pattern_removed_handler); // unref the old machine g_object_unref(self->priv->machine); self->priv->machine=NULL; self->priv->pattern_removed_handler=0; } if(machine) { GST_INFO("ref new cur-machine: ref_ct=%d",G_OBJECT_REF_COUNT(machine)); self->priv->pattern_removed_handler=g_signal_connect(machine,"pattern-removed",G_CALLBACK(on_pattern_removed),(gpointer)self); // remember the new machine self->priv->machine=machine; } pattern_list_refresh(self); } /* * machine_menu_refresh: * add all machines from setup to self->priv->context_menu_add */ static void machine_menu_refresh(const BtMainPageSequence *self,const BtSetup *setup) { BtMachine *machine; GList *node,*list,*widgets; GtkWidget *menu_item,*submenu,*image,*label; gchar *str; GST_INFO("refreshing track menu"); // (re)create a new menu submenu=gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(self->priv->context_menu_add),submenu); // fill machine menu g_object_get((gpointer)setup,"machines",&list,NULL); for(node=list;node;node=g_list_next(node)) { machine=BT_MACHINE(node->data); g_object_get(machine,"id",&str,NULL); menu_item=gtk_image_menu_item_new_with_label(str); gtk_menu_shell_append(GTK_MENU_SHELL(submenu),menu_item); image=bt_ui_resources_get_icon_image_by_machine(machine); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_widget_show(menu_item); widgets=gtk_container_get_children(GTK_CONTAINER(menu_item)); label=g_list_nth_data(widgets,0); if(GTK_IS_LABEL(label)) { GST_DEBUG("menu item for machine %p,ref_ct=%d",machine,G_OBJECT_REF_COUNT(machine)); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_id_changed_menu,NULL); g_signal_connect(machine,"notify::id",G_CALLBACK(on_machine_id_changed_menu),(gpointer)label); // we need to remove the signal handler when updating the labels //g_object_weak_ref(G_OBJECT(label),on_sequence_header_label_destroy,machine); } g_signal_connect(menu_item,"activate",G_CALLBACK(on_track_add_activated),(gpointer)self); g_list_free(widgets); g_free(str); } g_list_free(list); } /* * sequence_view_set_pos: * * set play, loop-start/end or length bars */ static void sequence_view_set_pos(const BtMainPageSequence *self,gulong type,glong row) { BtSong *song; gulong sequence_length; gdouble pos; glong play_pos,loop_start,loop_end; glong old_loop_start,old_loop_end; gchar *undo_str,*redo_str; g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"play-pos",&play_pos,NULL); g_object_get(self->priv->sequence,"length",&sequence_length,"loop-start",&loop_start,"loop-end",&loop_end,NULL); if(row==-1) row=sequence_length; // use a keyboard qualifier to set loop_start and end /* @todo should the sequence-view listen to notify::xxx ? */ switch(type) { case SEQUENCE_VIEW_POS_PLAY: if(play_pos!=row) { g_object_set(song,"play-pos",row,NULL); } break; case SEQUENCE_VIEW_POS_LOOP_START: g_object_get(self->priv->sequence,"loop-start",&old_loop_start,NULL); // set and read back, as sequence might clamp the value g_object_set(self->priv->sequence,"loop-start",row,NULL); g_object_get(self->priv->sequence,"loop-start",&loop_start,NULL); if(loop_start!=old_loop_start) { bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_sequence_property \"loop-start\",\"%ld\"",old_loop_start); redo_str = g_strdup_printf("set_sequence_property \"loop-start\",\"%ld\"",loop_start); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); pos=(gdouble)loop_start/(gdouble)sequence_length; g_object_set(self->priv->sequence_table,"loop-start",pos,NULL); g_object_set(self->priv->sequence_pos_table,"loop-start",pos,NULL); GST_INFO("adjusted loop-end = %ld -> %ld",old_loop_start,loop_start); g_object_get(self->priv->sequence,"loop-end",&old_loop_end,NULL); if((old_loop_end!=-1) && (old_loop_end<=old_loop_start)) { loop_end=loop_start+self->priv->bars; g_object_set(self->priv->sequence,"loop-end",loop_end,NULL); undo_str = g_strdup_printf("set_sequence_property \"loop-end\",\"%ld\"",old_loop_end); redo_str = g_strdup_printf("set_sequence_property \"loop-end\",\"%ld\"",loop_end); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); GST_INFO("adjusted loop-end = %ld -> %ld",old_loop_end,loop_end); pos=(gdouble)loop_end/(gdouble)sequence_length; g_object_set(self->priv->sequence_table,"loop-end",pos,NULL); g_object_set(self->priv->sequence_pos_table,"loop-end",pos,NULL); } bt_change_log_end_group(self->priv->change_log); } break; case SEQUENCE_VIEW_POS_LOOP_END: // pos is beyond length or is on loop-end already -> adjust length if((row>sequence_length) || (row==loop_end)) { GST_INFO("adjusted length = %ld -> %ld",sequence_length,row); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",sequence_length); redo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",row); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); // we shorten the song, backup data if(rowpriv->sequence,"tracks",&number_of_tracks,NULL); sequence_range_copy(self,0,number_of_tracks,row,sequence_length-1,old_data); sequence_range_log_undo_redo(self,0,number_of_tracks,row,sequence_length-1,old_data->str,g_strdup(old_data->str)); g_string_free(old_data,TRUE); } bt_change_log_end_group(self->priv->change_log); sequence_length=row; g_object_set(self->priv->sequence,"length",sequence_length,NULL); sequence_calculate_visible_lines(self); } else { old_loop_end=loop_end; // set and read back, as sequence might clamp the value g_object_set(self->priv->sequence,"loop-end",row,NULL); g_object_get(self->priv->sequence,"loop-end",&loop_end,NULL); if(loop_end!=old_loop_end) { bt_change_log_start_group(self->priv->change_log); GST_INFO("adjusted loop-end = %ld -> %ld",old_loop_end,loop_end); undo_str = g_strdup_printf("set_sequence_property \"loop-end\",\"%ld\"",old_loop_end); redo_str = g_strdup_printf("set_sequence_property \"loop-end\",\"%ld\"",loop_end); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_object_get(self->priv->sequence,"loop-start",&old_loop_start,NULL); if((old_loop_start!=-1) && (old_loop_start>=loop_end)) { loop_start=loop_end-self->priv->bars; if(loop_start<0) loop_start=0; g_object_set(self->priv->sequence,"loop-start",loop_start,NULL); undo_str = g_strdup_printf("set_sequence_property \"loop-start\",\"%ld\"",old_loop_start); redo_str = g_strdup_printf("set_sequence_property \"loop-start\",\"%ld\"",loop_start); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); GST_INFO("and adjusted loop-start = %ld",loop_start); } bt_change_log_end_group(self->priv->change_log); } } pos=(loop_end>-1)?(gdouble)loop_end/(gdouble)sequence_length:1.0; g_object_set(self->priv->sequence_table,"loop-end",pos,NULL); g_object_set(self->priv->sequence_pos_table,"loop-end",pos,NULL); pos=(loop_start>-1)?(gdouble)loop_start/(gdouble)sequence_length:0.0; g_object_set(self->priv->sequence_table,"loop-start",pos,NULL); g_object_set(self->priv->sequence_pos_table,"loop-start",pos,NULL); break; } g_object_unref(song); } /* * sequence_add_track: * @pos: the track position (-1 at the end) * * add a new track for the machine at the given position */ static void sequence_add_track(const BtMainPageSequence *self,BtMachine *machine,glong pos) { BtSong *song; GList *columns; // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); bt_sequence_add_track(self->priv->sequence,machine,pos); GST_INFO("machine %p,ref_ct=%d track added",machine,G_OBJECT_REF_COUNT(machine)); // reset selection self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; // reinit the view sequence_table_refresh_columns(self,song); GST_INFO("machine %p,ref_ct=%d sequence table update",machine,G_OBJECT_REF_COUNT(machine)); // update cursor_column and focus cell // (-2 because last column is empty and first is label) columns=gtk_tree_view_get_columns(self->priv->sequence_table); self->priv->cursor_column=g_list_length(columns)-2; GST_INFO("new cursor column: %ld",self->priv->cursor_column); g_list_free(columns); sequence_view_set_cursor_pos(self); GST_INFO("machine %p,ref_ct=%d cursor moved",machine,G_OBJECT_REF_COUNT(machine)); update_after_track_changed(self); GST_INFO("machine %p,ref_ct=%d adding track and updates done",machine,G_OBJECT_REF_COUNT(machine)); g_object_unref(song); } static void sequence_remove_track(const BtMainPageSequence *self,gulong ix) { BtMachine *machine; if((machine=bt_sequence_get_machine(self->priv->sequence,ix))) { // even though we can have multiple tracks per machine, we can disconnect them all, as we rebuild the treeview anyway // FIXME: be careful when using the new sequence model g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_mute,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_solo,NULL); g_signal_handlers_disconnect_matched(machine,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_state_changed_bypass,NULL); GST_INFO("machine %p,ref_ct=%d removing track",machine,G_OBJECT_REF_COUNT(machine)); // remove the track where the cursor is bt_sequence_remove_track_by_ix(self->priv->sequence,ix); g_object_unref(machine); } } static gboolean update_bars_menu(const BtMainPageSequence *self,gulong bars) { GtkListStore *store; GtkTreeIter iter; gchar str[5]; gulong i,j; gint active=2; gint selected=-1; gint added=0; /* the useful stepping depends on the rythm beats=bars/tpb bars=16, beats=4, tpb=4 : 4/4 -> 1,8, 16,32,64 bars=12, beats=3, tpb=4 : 3/4 -> 1,6, 12,24,48 bars=18, beats=3, tpb=6 : 3/6 -> 1,9, 18,36,72 */ store=gtk_list_store_new(1,G_TYPE_STRING); if(bars!=1) { // single steps gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,0,"1",-1); if(self->priv->bars==1) selected=added; added++; } else { active--; } if(bars/2>1) { // half bars sprintf(str,"%lu",bars/2); gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,0,str,-1); if(self->priv->bars==(bars/2)) selected=added; added++; } else { active--; } // add bars and 3 times the double of bars for(j=0,i=bars;j<4;i*=2,j++) { sprintf(str,"%lu",i); gtk_list_store_append(store,&iter); gtk_list_store_set(store,&iter,0,str,-1); if(self->priv->bars==i) selected=added; added++; } if(selected>-1) active=selected; gtk_combo_box_set_model(self->priv->bars_menu,GTK_TREE_MODEL(store)); gtk_combo_box_set_active(self->priv->bars_menu,active); g_object_unref(store); // drop with combobox return(TRUE); } //-- event handler static void on_track_add_activated(GtkMenuItem *menu_item, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GList *widgets; GtkWidget *label; // get the machine by the menuitems name //id=(gchar *)gtk_widget_get_name(GTK_WIDGET(menu_item)); widgets=gtk_container_get_children(GTK_CONTAINER(menu_item)); label=g_list_nth_data(widgets,0); if(GTK_IS_LABEL(label)) { const gchar *id; BtSong *song; BtSetup *setup; BtMachine *machine; // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); id=gtk_label_get_text(GTK_LABEL(label)); GST_INFO("adding track for machine \"%s\"",id); if((machine=bt_setup_get_machine_by_id(setup,id))) { gchar *undo_str,*redo_str; gchar *mid; gulong ix; g_object_get(self->priv->sequence,"tracks",&ix,NULL); sequence_add_track(self,machine,-1); g_object_get(machine,"id",&mid,NULL); /* handle undo/redo */ undo_str = g_strdup_printf("rem_track %lu",ix); redo_str = g_strdup_printf("add_track \"%s\",%lu",mid,ix); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid); g_object_unref(machine); } g_object_unref(setup); g_object_unref(song); } g_list_free(widgets); } static void on_track_remove_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong number_of_tracks; // change number of tracks g_object_get(self->priv->sequence,"tracks",&number_of_tracks,NULL); if(number_of_tracks>0) { BtSong *song; sequence_remove_track(self,self->priv->cursor_column-1); // reset selection self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; // get song from app g_object_get(self->priv->app,"song",&song,NULL); // reinit the view sequence_table_refresh_columns(self,song); if(self->priv->cursor_column>=number_of_tracks) { // update cursor_column and focus cell self->priv->cursor_column--; sequence_view_set_cursor_pos(self); GST_DEBUG("new cursor column: %ld",self->priv->cursor_column); } update_after_track_changed(self); g_object_unref(song); } } static void on_track_move_left_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong track=self->priv->cursor_column-1; GST_INFO("move track %ld to left",self->priv->cursor_column); if(track>0) { if(bt_sequence_move_track_left(self->priv->sequence,track)) { BtSong *song; gchar *undo_str,*redo_str; // get song from app g_object_get(self->priv->app,"song",&song,NULL); self->priv->cursor_column--; // reinit the view sequence_table_refresh_columns(self,song); sequence_view_set_cursor_pos(self); /* handle undo/redo */ undo_str = g_strdup_printf("move_track %lu,%lu",track-1,track); redo_str = g_strdup_printf("move_track %lu,%lu",track,track-1); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_object_unref(song); } } } static void on_track_move_right_activated(GtkMenuItem *menuitem, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong track=self->priv->cursor_column-1,number_of_tracks; GST_INFO("move track %ld to right",self->priv->cursor_column); g_object_get(self->priv->sequence,"tracks",&number_of_tracks,NULL); if(trackpriv->sequence,track)) { BtSong *song; gchar *undo_str,*redo_str; // get song from app g_object_get(self->priv->app,"song",&song,NULL); self->priv->cursor_column++; // reinit the view sequence_table_refresh_columns(self,song); sequence_view_set_cursor_pos(self); /* handle undo/redo */ undo_str = g_strdup_printf("move_track %lu,%lu",track+1,track); redo_str = g_strdup_printf("move_track %lu,%lu",track,track+1); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_object_unref(song); } } } static void on_context_menu_machine_properties_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); bt_machine_show_properties_dialog(self->priv->machine); } static void on_context_menu_machine_preferences_activate(GtkMenuItem *menuitem,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); bt_machine_show_preferences_dialog(self->priv->machine); } static void on_song_play_pos_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gdouble play_pos; gulong sequence_length,pos; GtkTreePath *path; // calculate fractional pos and set into sequence-viewer g_object_get((gpointer)song,"play-pos",&pos,NULL); g_object_get(self->priv->sequence,"length",&sequence_length,NULL); play_pos=(gdouble)pos/(gdouble)sequence_length; if(play_pos<=1.0) { g_object_set(self->priv->sequence_table,"play-position",play_pos,NULL); g_object_set(self->priv->sequence_pos_table,"play-position",play_pos,NULL); } //GST_DEBUG("sequence tick received : %d",pos); // do nothing for invisible rows if(IS_SEQUENCE_POS_VISIBLE(pos,self->priv->bars)) { // scroll to make play pos visible if((path=gtk_tree_path_new_from_indices((pos/self->priv->bars),-1))) { // that would try to keep the cursor in the middle (means it will scroll more) if(gtk_widget_get_realized(GTK_WIDGET(self->priv->sequence_table))) { gtk_tree_view_scroll_to_cell(self->priv->sequence_table,path,NULL,TRUE,0.5,0.5); //gtk_tree_view_scroll_to_cell(self->priv->sequence_table,path,NULL,FALSE,0.0,0.0); } if(gtk_widget_get_realized(GTK_WIDGET(self->priv->sequence_pos_table))) { gtk_tree_view_scroll_to_cell(self->priv->sequence_pos_table,path,NULL,TRUE,0.5,0.5); } gtk_tree_path_free(path); } } } static void on_song_is_playing_notify(const BtSong *song,GParamSpec *arg,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); g_object_get((gpointer)song,"is-playing",&self->priv->is_playing,NULL); // stop all level meters if(!self->priv->is_playing) { g_hash_table_foreach(self->priv->level_to_vumeter,reset_level_meter,NULL); } } static void on_bars_menu_changed(GtkComboBox *combo_box,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GtkTreeModel *store; GtkTreeIter iter; GST_INFO("bars_menu has changed : page=%p",user_data); if((store=gtk_combo_box_get_model(self->priv->bars_menu)) && gtk_combo_box_get_active_iter(self->priv->bars_menu,&iter)) { gchar *str; gulong old_bars=self->priv->bars; gtk_tree_model_get(store,&iter,0,&str,-1); self->priv->bars=atoi(str); g_free(str); if(self->priv->bars!=old_bars) { GtkTreeModelFilter *filtered_store; sequence_calculate_visible_lines(self); //GST_INFO(" bars = %d",self->priv->bars); if((filtered_store=GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(self->priv->sequence_table)))) { BtSequenceGridModel *store=BT_SEQUENCE_GRID_MODEL(gtk_tree_model_filter_get_model(filtered_store)); g_object_set(store,"bars",self->priv->bars,NULL); gtk_tree_model_filter_refilter(filtered_store); } g_hash_table_insert(self->priv->properties,g_strdup("bars"),g_strdup(bt_persistence_strfmt_ulong(self->priv->bars))); bt_edit_application_set_song_unsaved(self->priv->app); } gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); } } static void on_toolbar_menu_clicked(GtkButton *button, gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,1,gtk_get_current_event_time()); } static void on_label_menu_changed(GtkComboBox *combo_box,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GtkTreeModel *store; GtkTreeIter iter; GST_INFO("label_menu has changed : page=%p",user_data); if((store=gtk_combo_box_get_model(self->priv->label_menu)) && gtk_combo_box_get_active_iter(self->priv->label_menu,&iter)) { GtkTreePath *path; glong pos; gtk_tree_model_get(store,&iter,BT_SEQUENCE_GRID_MODEL_POS,&pos,-1); GST_INFO(" move to = %ld",pos); if((path=gtk_tree_path_new_from_indices((pos/self->priv->bars),-1))) { // that would try to keep the cursor in the middle (means it will scroll more) if(gtk_widget_get_realized(GTK_WIDGET(self->priv->sequence_table))) { gtk_tree_view_scroll_to_cell(self->priv->sequence_table,path,NULL,TRUE,0.5,0.5); } gtk_tree_path_free(path); } } } static gboolean on_sequence_table_cursor_changed_idle(gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GtkTreePath *path; GtkTreeViewColumn *column; gulong cursor_column,cursor_row; GList *columns; g_return_val_if_fail(user_data,FALSE); //GST_INFO("sequence_table cursor has changed : self=%p",user_data); gtk_tree_view_get_cursor(self->priv->sequence_table,&path,&column); if(column && path) { if(sequence_view_get_cursor_pos(self->priv->sequence_table,path,column,&cursor_column,&cursor_row)) { gulong last_line,last_bar,last_column; columns=gtk_tree_view_get_columns(self->priv->sequence_table); last_column=g_list_length(columns)-2; g_list_free(columns); GST_INFO("new row = %3lu <-> old row = %3ld",cursor_row,self->priv->cursor_row); self->priv->cursor_row=cursor_row; if(cursor_column>last_column) { cursor_column=last_column; sequence_view_set_cursor_pos(self); } GST_INFO("new col = %3lu <-> old col = %3ld",cursor_column,self->priv->cursor_column); if(cursor_column!=self->priv->cursor_column) { self->priv->cursor_column=cursor_column; update_after_track_changed(self); } GST_INFO("cursor has changed: %3ld,%3ld",self->priv->cursor_column,self->priv->cursor_row); // calculate the last visible row from step-filter and scroll-filter last_line=self->priv->sequence_length-1; last_bar=last_line-(last_line%self->priv->bars); // do we need to extend sequence? if(cursor_row>=last_bar) { self->priv->sequence_length+=self->priv->bars; sequence_update_model_length(self); gtk_tree_view_set_cursor(self->priv->sequence_table,path,column,FALSE); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); } gtk_tree_view_scroll_to_cell(self->priv->sequence_table,path,column,FALSE,1.0,0.0); gtk_widget_queue_draw(GTK_WIDGET(self->priv->sequence_table)); } } else { GST_INFO("No cursor pos, column=%p, path=%p",column,path); } if(path) gtk_tree_path_free(path); return(FALSE); } static void on_sequence_table_cursor_changed(GtkTreeView *treeview, gpointer user_data) { /* delay the action */ g_idle_add_full(G_PRIORITY_HIGH_IDLE,on_sequence_table_cursor_changed_idle,user_data,NULL); } static gboolean change_pattern(BtMainPageSequence *self, BtPattern *new_pattern,gulong row,gulong track) { gboolean res=FALSE; BtMachine *machine; if((machine=bt_sequence_get_machine(self->priv->sequence,track))) { BtPattern *old_pattern=bt_sequence_get_pattern(self->priv->sequence,row,track); gchar *undo_str,*redo_str; gchar *mid,*old_pid=NULL,*new_pid=NULL; g_object_get(machine,"id",&mid,NULL); bt_sequence_set_pattern(self->priv->sequence,row,track,new_pattern); if(old_pattern) { g_object_get(old_pattern,"id",&old_pid,NULL); g_object_unref(old_pattern); } if(new_pattern) { g_object_get(new_pattern,"id",&new_pid,NULL); } undo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s,%s",track,row,row,mid,(old_pid?old_pid:" ")); redo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s,%s",track,row,row,mid,(new_pid?new_pid:" ")); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); g_free(mid);g_free(new_pid);g_free(old_pid); g_object_unref(machine); res=TRUE; } return(res); } // use key-press-event, as then we get key repeats static gboolean on_sequence_table_key_press_event(GtkWidget *widget,GdkEventKey *event,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gboolean res=FALSE; gulong row,track; if(!gtk_widget_get_realized(GTK_WIDGET(self->priv->sequence_table))) return(FALSE); GST_INFO("sequence_table key key : state 0x%x, keyval 0x%x, hw-code 0x%x, name %s", event->state,event->keyval,event->hardware_keycode,gdk_keyval_name(event->keyval)); // determine timeline and timelinetrack from cursor pos if(sequence_view_get_current_pos(self,&row,&track)) { BtSong *song; gulong length,tracks; gboolean change=FALSE; gulong modifier=(gulong)event->state>k_accelerator_get_default_mod_mask(); g_object_get(self->priv->sequence,"length",&length,"tracks",&tracks,NULL); GST_DEBUG("cursor pos : %lu/%lu, %lu/%lu",row,length,track,tracks); if(track>tracks) return(FALSE); g_object_get(self->priv->app,"song",&song,NULL); // look up pattern for key if(event->keyval==GDK_space || event->keyval == GDK_period) { // first column is label if((track>0) && (rowkeyval==GDK_Return) { /* GDK_KP_Enter */ // first column is label if(track>0) { BtMainPagePatterns *patterns_page; BtPattern *pattern; bt_child_proxy_get(self->priv->main_window,"pages::patterns-page",&patterns_page,NULL); bt_child_proxy_set(self->priv->main_window,"pages::page",BT_MAIN_PAGES_PATTERNS_PAGE,NULL); if((rowpriv->sequence,row,track-1))) { GST_INFO("show pattern"); bt_main_page_patterns_show_pattern(patterns_page,pattern); g_object_unref(pattern); } else { GST_INFO("show machine"); bt_main_page_patterns_show_machine(patterns_page,self->priv->machine); } g_object_unref(patterns_page); res=TRUE; } } else if(event->keyval==GDK_Menu) { gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); } else if(event->keyval==GDK_Up || event->keyval==GDK_Down || event->keyval==GDK_Left || event->keyval==GDK_Right) { if(modifier==GDK_SHIFT_MASK) { gboolean select=FALSE; GST_INFO("handling selection"); // handle selection switch(event->keyval) { case GDK_Up: if((self->priv->cursor_row>=0)) { self->priv->cursor_row-=self->priv->bars; sequence_view_set_cursor_pos(self); GST_INFO("up : %3ld,%3ld -> %3ld,%3ld @ %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row,self->priv->cursor_column,self->priv->cursor_row); if(self->priv->selection_start_row==-1) { GST_INFO("up : new selection"); self->priv->selection_start_column=self->priv->cursor_column; self->priv->selection_end_column=self->priv->cursor_column; self->priv->selection_start_row=self->priv->cursor_row; self->priv->selection_end_row=self->priv->cursor_row+self->priv->bars; } else { if(self->priv->selection_start_row==(self->priv->cursor_row+self->priv->bars)) { GST_INFO("up : expand selection"); self->priv->selection_start_row-=self->priv->bars; } else { GST_INFO("up : shrink selection"); self->priv->selection_end_row-=self->priv->bars; } } GST_INFO("up : %3ld,%3ld -> %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row); select=TRUE; } break; case GDK_Down: /* we expand length */ self->priv->cursor_row+=self->priv->bars; sequence_view_set_cursor_pos(self); GST_INFO("down : %3ld,%3ld -> %3ld,%3ld @ %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row,self->priv->cursor_column,self->priv->cursor_row); if(self->priv->selection_end_row==-1) { GST_INFO("down : new selection"); self->priv->selection_start_column=self->priv->cursor_column; self->priv->selection_end_column=self->priv->cursor_column; self->priv->selection_start_row=self->priv->cursor_row-self->priv->bars; self->priv->selection_end_row=self->priv->cursor_row; } else { if(self->priv->selection_end_row==(self->priv->cursor_row-self->priv->bars)) { GST_INFO("down : expand selection"); self->priv->selection_end_row+=self->priv->bars; } else { GST_INFO("down : shrink selection"); self->priv->selection_start_row+=self->priv->bars; } } GST_INFO("down : %3ld,%3ld -> %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row); select=TRUE; break; case GDK_Left: if(self->priv->cursor_column>=0) { // move cursor self->priv->cursor_column--; sequence_view_set_cursor_pos(self); GST_INFO("left : %3ld,%3ld -> %3ld,%3ld @ %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row,self->priv->cursor_column,self->priv->cursor_row); if(self->priv->selection_start_column==-1) { GST_INFO("left : new selection"); self->priv->selection_start_column=self->priv->cursor_column; self->priv->selection_end_column=self->priv->cursor_column+1; self->priv->selection_start_row=self->priv->cursor_row; self->priv->selection_end_row=self->priv->cursor_row; } else { if(self->priv->selection_start_column==(self->priv->cursor_column+1)) { GST_INFO("left : expand selection"); self->priv->selection_start_column--; } else { GST_INFO("left : shrink selection"); self->priv->selection_end_column--; } } GST_INFO("left : %3ld,%3ld -> %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row); select=TRUE; } break; case GDK_Right: if(self->priv->cursor_columnpriv->cursor_column++; sequence_view_set_cursor_pos(self); GST_INFO("right: %3ld,%3ld -> %3ld,%3ld @ %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row,self->priv->cursor_column,self->priv->cursor_row); if(self->priv->selection_end_column==-1) { GST_INFO("right: new selection"); self->priv->selection_start_column=self->priv->cursor_column-1; self->priv->selection_end_column=self->priv->cursor_column; self->priv->selection_start_row=self->priv->cursor_row; self->priv->selection_end_row=self->priv->cursor_row; } else { if(self->priv->selection_end_column==(self->priv->cursor_column-1)) { GST_INFO("right: expand selection"); self->priv->selection_end_column++; } else { GST_INFO("right: shrink selection"); self->priv->selection_start_column++; } } GST_INFO("right: %3ld,%3ld -> %3ld,%3ld",self->priv->selection_start_column,self->priv->selection_start_row,self->priv->selection_end_column,self->priv->selection_end_row); select=TRUE; } break; } if(select) { gtk_widget_queue_draw(GTK_WIDGET(self->priv->sequence_table)); res=TRUE; } } else { // remove selection if(self->priv->selection_start_column!=-1) { self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; gtk_widget_queue_draw(GTK_WIDGET(self->priv->sequence_table)); } } } else if(event->keyval == GDK_b) { if(modifier==GDK_CONTROL_MASK) { GST_INFO("ctrl-b pressed, row %lu",row); sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_START,(glong)row); res=TRUE; } } else if(event->keyval == GDK_e) { if(modifier==GDK_CONTROL_MASK) { GST_INFO("ctrl-e pressed, row %lu",row); sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_END,(glong)row); res=TRUE; } } else if(event->keyval == GDK_Insert) { if(modifier==0) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); glong col=(glong)track-1; gulong sequence_length; GST_INFO("insert pressed, row %lu, track %ld",row,col); g_object_get(self->priv->sequence,"length",&sequence_length,NULL); sequence_range_copy(self,track,track,row,sequence_length-1,old_data); bt_sequence_insert_rows(self->priv->sequence,row,col,self->priv->bars); sequence_range_copy(self,track,track,row,sequence_length-1,new_data); sequence_range_log_undo_redo(self,track,track,row,sequence_length-1,old_data->str,new_data->str); g_string_free(old_data,TRUE);g_string_free(new_data,TRUE); res=TRUE; } else if(modifier==GDK_SHIFT_MASK) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gulong sequence_length,number_of_tracks; gchar *undo_str,*redo_str; GST_INFO("shift-insert pressed, row %lu",row); g_object_get(self->priv->sequence,"length",&sequence_length,"tracks",&number_of_tracks,NULL); sequence_length+=self->priv->bars; sequence_range_copy(self,0,number_of_tracks,row,sequence_length-1,old_data); bt_sequence_insert_full_rows(self->priv->sequence,row,self->priv->bars); sequence_range_copy(self,0,number_of_tracks,row,sequence_length-1,new_data); bt_change_log_start_group(self->priv->change_log); sequence_range_log_undo_redo(self,0,number_of_tracks,row,sequence_length-1,old_data->str,new_data->str); undo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",sequence_length-self->priv->bars); redo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",sequence_length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); bt_change_log_end_group(self->priv->change_log); g_string_free(old_data,TRUE);g_string_free(new_data,TRUE); self->priv->sequence_length+=self->priv->bars; // udpate the view sequence_calculate_visible_lines(self); sequence_update_model_length(self); res=TRUE; } } else if(event->keyval == GDK_Delete) { if(modifier==0) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); glong col=(glong)track-1; gulong sequence_length; GST_INFO("delete pressed, row %lu, track %ld",row,col); g_object_get(self->priv->sequence,"length",&sequence_length,NULL); sequence_range_copy(self,track,track,row,sequence_length-1,old_data); bt_sequence_delete_rows(self->priv->sequence,row,col,self->priv->bars); sequence_range_copy(self,track,track,row,sequence_length-1,new_data); sequence_range_log_undo_redo(self,track,track,row,sequence_length-1,old_data->str,new_data->str); g_string_free(old_data,TRUE);g_string_free(new_data,TRUE); res=TRUE; } else if(modifier==GDK_SHIFT_MASK) { GString *old_data=g_string_new(NULL),*new_data=g_string_new(NULL); gulong sequence_length,number_of_tracks; gchar *undo_str,*redo_str; GST_INFO("shift-delete pressed, row %lu",row); g_object_get(self->priv->sequence,"length",&sequence_length,"tracks",&number_of_tracks,NULL); sequence_range_copy(self,0,number_of_tracks,row,sequence_length-1,old_data); bt_sequence_delete_full_rows(self->priv->sequence,row,self->priv->bars); sequence_range_copy(self,0,number_of_tracks,row,sequence_length-1,new_data); bt_change_log_start_group(self->priv->change_log); undo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",sequence_length); redo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",sequence_length-self->priv->bars); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); sequence_range_log_undo_redo(self,0,number_of_tracks,row,sequence_length-1,old_data->str,new_data->str); bt_change_log_end_group(self->priv->change_log); g_string_free(old_data,TRUE);g_string_free(new_data,TRUE); self->priv->sequence_length-=self->priv->bars; // update the view sequence_calculate_visible_lines(self); sequence_update_model_length(self); res=TRUE; } } if((!res) && (event->keyval<='z') && ((modifier==0) || (modifier==GDK_SHIFT_MASK))) { // first column is label if(track>0) { gchar key=(gchar)(event->keyval&0xff); BtPattern *new_pattern; GtkTreeModel *store; store=gtk_tree_view_get_model(self->priv->pattern_list); if((new_pattern=pattern_list_model_get_pattern_by_key(store,key))) { gulong new_length=0; bt_change_log_start_group(self->priv->change_log); if(row>=length) { gchar *undo_str,*redo_str; new_length=row+self->priv->bars; g_object_set(self->priv->sequence,"length",new_length,NULL); sequence_calculate_visible_lines(self); sequence_update_model_length(self); undo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",length); redo_str = g_strdup_printf("set_sequence_property \"length\",\"%ld\"",new_length); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); } if((res=change_pattern(self,new_pattern,row,track-1))) { change=TRUE; res=TRUE; } bt_change_log_end_group(self->priv->change_log); g_object_unref(new_pattern); } else { GST_WARNING_OBJECT(self->priv->machine,"keyval '%c' not used by machine",key); } } } // update cursor pos in tree-view model if(change) { GtkTreeViewColumn *column; gtk_tree_view_get_cursor(self->priv->sequence_table,NULL,&column); if(column) { GtkTreePath *path; // move cursor down & set cell focus self->priv->cursor_row+=self->priv->bars; if((path=gtk_tree_path_new_from_indices((self->priv->cursor_row/self->priv->bars),-1))) { gtk_tree_view_set_cursor(self->priv->sequence_table,path,column,FALSE); gtk_tree_path_free(path); } } else { GST_WARNING(" can't evaluate cursor pos"); } } //else if(!select) GST_INFO(" nothing assgned to this key"); // release the references g_object_unref(song); } return(res); } static gboolean on_sequence_header_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gboolean res=FALSE; GST_INFO("sequence_header button_press : button 0x%x, type 0x%d",event->button,event->type); if(event->button==3) { gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } return(res); } static gboolean on_sequence_table_button_press_event(GtkWidget *widget,GdkEventButton *event,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gboolean res=FALSE; GST_INFO("sequence_table button_press : button 0x%x, type 0x%d",event->button,event->type); if(event->button==1) { if(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(widget))==(event->window)) { GtkTreePath *path; GtkTreeViewColumn *column; gulong modifier=(gulong)event->state&(GDK_CONTROL_MASK|GDK_MOD4_MASK); // determine sequence position from mouse coordinates if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget),event->x,event->y,&path,&column,NULL,NULL)) { gulong track,row; if(sequence_view_get_cursor_pos(GTK_TREE_VIEW(widget),path,column,&track,&row)) { GST_INFO(" left click to column %lu, row %lu",track,row); if(widget==GTK_WIDGET(self->priv->sequence_pos_table)) { switch(modifier) { case 0: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_PLAY,(glong)row); break; case GDK_CONTROL_MASK: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_START,(glong)row); break; case GDK_MOD4_MASK: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_END,(glong)row); break; } } else { // set cell focus gtk_tree_view_set_cursor(self->priv->sequence_table,path,column,FALSE); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); // reset selection self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; } res=TRUE; } } else { GST_INFO("clicked outside data area - #1"); switch(modifier) { case 0: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_PLAY,-1); break; case GDK_CONTROL_MASK: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_START,-1); break; case GDK_MOD4_MASK: sequence_view_set_pos(self,SEQUENCE_VIEW_POS_LOOP_END,-1); break; } res=TRUE; } if(path) gtk_tree_path_free(path); } } else if(event->button==3) { gtk_menu_popup(self->priv->context_menu,NULL,NULL,NULL,NULL,3,gtk_get_current_event_time()); res=TRUE; } return(res); } static gboolean on_sequence_table_motion_notify_event(GtkWidget *widget,GdkEventMotion *event,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gboolean res=FALSE; // only activate in button_press ? if(event->state&GDK_BUTTON1_MASK) { if(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(widget))==(event->window)) { GtkTreePath *path; GtkTreeViewColumn *column; // determine sequence position from mouse coordinates if(gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget),event->x,event->y,&path,&column,NULL,NULL)) { if(widget==GTK_WIDGET(self->priv->sequence_pos_table)) { gulong track,row; if(sequence_view_get_cursor_pos(GTK_TREE_VIEW(widget),path,column,&track,&row)) { sequence_view_set_pos(self,SEQUENCE_VIEW_POS_PLAY,(glong)row); } } else { // handle selection glong cursor_column=self->priv->cursor_column; glong cursor_row=self->priv->cursor_row; if(self->priv->selection_start_column==-1) { self->priv->selection_column=self->priv->cursor_column; self->priv->selection_row=self->priv->cursor_row; } gtk_tree_view_set_cursor(self->priv->sequence_table,path,column,FALSE); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); // cursor updates are not yet processed on_sequence_table_cursor_changed_idle(self); GST_DEBUG("cursor new/old: %3ld,%3ld -> %3ld,%3ld",cursor_column,cursor_row,self->priv->cursor_column,self->priv->cursor_row); if((cursor_column!=self->priv->cursor_column) || (cursor_row!=self->priv->cursor_row)) { if(self->priv->selection_start_column==-1) { self->priv->selection_start_column=MIN(cursor_column,self->priv->selection_column); self->priv->selection_start_row=MIN(cursor_row,self->priv->selection_row); self->priv->selection_end_column=MAX(cursor_column,self->priv->selection_column); self->priv->selection_end_row=MAX(cursor_row,self->priv->selection_row); } else { if(self->priv->cursor_columnpriv->selection_column) { self->priv->selection_start_column=self->priv->cursor_column; self->priv->selection_end_column=self->priv->selection_column; } else { self->priv->selection_start_column=self->priv->selection_column; self->priv->selection_end_column=self->priv->cursor_column; } if(self->priv->cursor_rowpriv->selection_row) { self->priv->selection_start_row=self->priv->cursor_row; self->priv->selection_end_row=self->priv->selection_row; } else { self->priv->selection_start_row=self->priv->selection_row; self->priv->selection_end_row=self->priv->cursor_row; } } gtk_widget_queue_draw(GTK_WIDGET(self->priv->sequence_table)); } } res=TRUE; } if(path) gtk_tree_path_free(path); } } return(res); } static gboolean on_sequence_table_scroll_event( GtkWidget *widget, GdkEventScroll *event, gpointer user_data ) { //BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); if(event) { static GdkEventKey keyevent={0,}; if( event->direction == GDK_SCROLL_UP ) { keyevent.keyval = GDK_Up; keyevent.hardware_keycode = 98; } else if( event->direction == GDK_SCROLL_DOWN ) { keyevent.keyval = GDK_Down; keyevent.hardware_keycode = 104; } else return FALSE; keyevent.window = event->window; keyevent.state = event->state; keyevent.time = GDK_CURRENT_TIME; keyevent.type = GDK_KEY_PRESS; gtk_main_do_event((GdkEvent *)&keyevent); keyevent.type = GDK_KEY_RELEASE; gtk_main_do_event((GdkEvent *)&keyevent); return TRUE; } return FALSE; } // setup colors for sequence view static void bt_sequence_table_update_colors(const BtMainPageSequence *self) { GtkStyle *s=GTK_WIDGET(self->priv->sequence_table)->style; guint fg,bg; fg=(s->text->red>>8) + (s->text->green>>8) + (s->text->blue>>8); bg=(s->base->red>>8) + (s->base->green>>8) + (s->base->blue>>8); /* GST_DEBUG("text %u : base %u",fg,bg); #define PRINT_COLOR(c) (c->red)>>8,(c->green)>>8,(c->blue)>>8 GST_DEBUG("sequence view colors: fg : #%02x%02x%02x",PRINT_COLOR(s->fg)); GST_DEBUG("sequence view colors: bg : #%02x%02x%02x",PRINT_COLOR(s->bg)); GST_DEBUG("sequence view colors: light : #%02x%02x%02x",PRINT_COLOR(s->light)); GST_DEBUG("sequence view colors: mid : #%02x%02x%02x",PRINT_COLOR(s->mid)); GST_DEBUG("sequence view colors: dark : #%02x%02x%02x",PRINT_COLOR(s->dark)); GST_DEBUG("sequence view colors: base : #%02x%02x%02x",PRINT_COLOR(s->base)); GST_DEBUG("sequence view colors: text : #%02x%02x%02x",PRINT_COLOR(s->text)); GST_DEBUG("sequence view colors: texta : #%02x%02x%02x",PRINT_COLOR(s->text_aa)); */ // get colors self->priv->cursor_bg=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_CURSOR); self->priv->selection_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SELECTION1); self->priv->selection_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SELECTION2); if (bg>fg) { self->priv->source_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT1); self->priv->source_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SOURCE_MACHINE_BRIGHT2); self->priv->processor_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT1); self->priv->processor_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_PROCESSOR_MACHINE_BRIGHT2); self->priv->sink_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT1); self->priv->sink_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SINK_MACHINE_BRIGHT2); } else { self->priv->source_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK1); self->priv->source_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SOURCE_MACHINE_DARK2); self->priv->processor_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK1); self->priv->processor_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_PROCESSOR_MACHINE_DARK2); self->priv->sink_bg1=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SINK_MACHINE_DARK1); self->priv->sink_bg2=bt_ui_resources_get_gdk_color(BT_UI_RES_COLOR_SINK_MACHINE_DARK2); } } static void on_sequence_table_realize(GtkWidget *widget,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); bt_sequence_table_update_colors(self); } static void on_sequence_table_style_set(GtkWidget *widget,GtkStyle *old_style,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); bt_sequence_table_update_colors(self); } static void on_machine_added(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); GST_INFO("machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); machine_menu_refresh(self,setup); GST_INFO("machine %p,ref_ct=%d chk1",machine,G_OBJECT_REF_COUNT(machine)); // don't create the track, if we already do so from an undo if(bt_change_log_is_active(self->priv->change_log)) { if(BT_IS_SOURCE_MACHINE(machine)) { sequence_add_track(self,machine,-1); } } GST_INFO("... machine %p,ref_ct=%d has been added",machine,G_OBJECT_REF_COUNT(machine)); } static void on_machine_removed(BtSetup *setup,BtMachine *machine,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong number_of_tracks; BtSong *song; g_return_if_fail(BT_IS_MACHINE(machine)); GST_INFO("machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); // reinit the menu machine_menu_refresh(self,setup); // remove all tracks bt_sequence_remove_track_by_machine(self->priv->sequence,machine); // reset selection // @todo: only if it intersects with selection self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; // reinit the view g_object_get(self->priv->app,"song",&song,NULL); sequence_table_refresh_columns(self,song); g_object_unref(song); g_object_get(self->priv->sequence,"tracks",&number_of_tracks,NULL); if(self->priv->cursor_column>=number_of_tracks) { GST_DEBUG("old cursor column: %ld",self->priv->cursor_column); // update cursor_column and focus cell self->priv->cursor_column=number_of_tracks-1; sequence_view_set_cursor_pos(self); GST_DEBUG("new cursor column: %ld",self->priv->cursor_column); } update_after_track_changed(self); GST_INFO("... machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); } static void on_track_removed(BtSequence *sequence,BtMachine *machine,gulong track,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong sequence_length; GString *old_data; gchar *undo_str,*redo_str; gchar *mid; GST_INFO("machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); /* handle undo/redo */ g_object_get(machine,"id",&mid,NULL); g_object_get(self->priv->sequence,"length",&sequence_length,NULL); bt_change_log_start_group(self->priv->change_log); old_data=g_string_new(NULL); undo_str = g_strdup_printf("add_track \"%s\",%lu",mid,(gulong)track); redo_str = g_strdup_printf("rem_track %lu",(gulong)track); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); sequence_range_copy(self,track+1,track+1,0,sequence_length-1,old_data); sequence_range_log_undo_redo(self,track+1,track+1,0,sequence_length-1,old_data->str,g_strdup(old_data->str)); g_string_free(old_data,TRUE); bt_change_log_end_group(self->priv->change_log); g_free(mid); /* @todo: can't update the view here as the signal is emitted before making the change * to allow us saving the content, this means number-of-tracks is not changed either */ GST_INFO("machine %p,ref_ct=%d has been removed",machine,G_OBJECT_REF_COUNT(machine)); } static void on_pattern_removed(BtMachine *machine,BtPattern *pattern,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); BtSequence *sequence=self->priv->sequence; GST_INFO("pattern has been removed: %p,ref_ct=%d",pattern,G_OBJECT_REF_COUNT(pattern)); if(bt_sequence_is_pattern_used(sequence,pattern)) { glong tick; glong track=0; gchar *undo_str,*redo_str; gchar *mid,*pid; g_object_get(machine,"id",&mid,NULL); g_object_get(pattern,"id",&pid,NULL); GST_WARNING("pattern %s is used in sequence, doing undo/redo",pid); /* save the cells that use the pattern */ bt_change_log_start_group(self->priv->change_log); while((track=bt_sequence_get_track_by_machine(sequence,machine,track))>-1) { tick=0; while((tick=bt_sequence_get_tick_by_pattern(sequence,track,pattern,tick))>-1) { undo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s,%s",track,tick,tick,mid,pid); redo_str = g_strdup_printf("set_patterns %lu,%lu,%lu,%s,%s",track,tick,tick,mid," "); bt_change_log_add(self->priv->change_log,BT_CHANGE_LOGGER(self),undo_str,redo_str); bt_sequence_set_pattern_quick(sequence,tick,track,NULL); tick++; } track++; } bt_change_log_end_group(self->priv->change_log); bt_sequence_repair_damage(sequence); g_free(mid);g_free(pid); } } static void on_song_info_bars_changed(const BtSongInfo *song_info,GParamSpec *arg,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); gulong bars; g_object_get((gpointer)song_info,"bars",&bars,NULL); // this also recolors the sequence self->priv->bars=0; update_bars_menu(self,bars); } static void on_song_changed(const BtEditApplication *app,GParamSpec *arg,gpointer user_data) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(user_data); BtSong *song; BtSongInfo *song_info; BtSetup *setup; GstBin *bin; GstBus *bus; glong bars; gulong sequence_length; gchar *prop; GST_INFO("song has changed : app=%p, self=%p",app,self); g_object_try_unref(self->priv->sequence); // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); if(!song) { self->priv->sequence=NULL; self->priv->properties=NULL; return; } GST_INFO("song->ref_ct=%d",G_OBJECT_REF_COUNT(song)); g_object_get(song,"song-info",&song_info,"setup",&setup,"sequence",&self->priv->sequence,"bin", &bin,NULL); g_object_get(self->priv->sequence,"length",&sequence_length,"properties",&self->priv->properties,NULL); // make sequence_length and step_filter_pos accord to song length self->priv->sequence_length=sequence_length; // reset vu-meter hash (rebuilt below) if(self->priv->level_to_vumeter) g_hash_table_destroy(self->priv->level_to_vumeter); self->priv->level_to_vumeter=g_hash_table_new_full(NULL,NULL,(GDestroyNotify)gst_object_unref,NULL); // reset cursor pos self->priv->cursor_column=1; self->priv->cursor_row=0; // get stored settings if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"bars"))) { self->priv->bars=atol(prop); } if((prop=(gchar *)g_hash_table_lookup(self->priv->properties,"pos-format"))) { self->priv->pos_format=atol(prop); } // update page // update sequence and pattern list sequence_table_refresh_model(self,song); sequence_table_refresh_columns(self,song); update_after_track_changed(self); machine_menu_refresh(self,setup); g_signal_connect(setup,"machine-added",G_CALLBACK(on_machine_added),(gpointer)self); g_signal_connect(setup,"machine-removed",G_CALLBACK(on_machine_removed),(gpointer)self); g_signal_connect(self->priv->sequence,"track-removed",G_CALLBACK(on_track_removed),(gpointer)self); gtk_combo_box_set_active(GTK_COMBO_BOX(self->priv->pos_menu),self->priv->pos_format); // update toolbar g_object_get(song_info,"bars",&bars,NULL); update_bars_menu(self,bars); // update sequence view sequence_calculate_visible_lines(self); g_object_set(self->priv->sequence_table,"play-position",0.0,NULL); g_object_set(self->priv->sequence_pos_table,"play-position",0.0,NULL); // vumeters bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::element", G_CALLBACK(on_track_level_change), (gpointer)self); gst_object_unref(bus); if(self->priv->clock) gst_object_unref(self->priv->clock); self->priv->clock=gst_pipeline_get_clock (GST_PIPELINE(bin)); // subscribe to play-pos changes of song->sequence g_signal_connect(song, "notify::play-pos", G_CALLBACK(on_song_play_pos_notify), (gpointer)self); g_signal_connect(song,"notify::is-playing",G_CALLBACK(on_song_is_playing_notify),(gpointer)self); // subscribe to changes in the rythm g_signal_connect(song_info, "notify::bars", G_CALLBACK(on_song_info_bars_changed), (gpointer)self); //-- release the references gst_object_unref(bin); g_object_unref(song_info); g_object_unref(setup); g_object_unref(song); GST_INFO("song has changed done"); } static void on_toolbar_style_changed(const BtSettings *settings,GParamSpec *arg,gpointer user_data) { GtkToolbar *toolbar=GTK_TOOLBAR(user_data); gchar *toolbar_style; g_object_get((gpointer)settings,"toolbar-style",&toolbar_style,NULL); if(!BT_IS_STRING(toolbar_style)) return; GST_INFO("!!! toolbar style has changed '%s'", toolbar_style); gtk_toolbar_set_style(toolbar,gtk_toolbar_get_style_from_string(toolbar_style)); g_free(toolbar_style); } //-- helper methods static void bt_main_page_sequence_init_ui(const BtMainPageSequence *self,const BtMainPages *pages) { GtkWidget *toolbar; GtkWidget *split_box,*box,*vbox,*tool_item; GtkWidget *scrolled_window,*scrolled_vsync_window,*scrolled_hsync_window; GtkWidget *hsync_viewport; GtkWidget *menu_item,*image; GtkCellRenderer *renderer; GtkTreeViewColumn *tree_col; GtkTreeSelection *tree_sel; GtkAdjustment *vadjust, *hadjust; BtSettings *settings; GST_DEBUG("!!!! self=%p",self); gtk_widget_set_name(GTK_WIDGET(self),"sequence view"); // add toolbar toolbar=gtk_toolbar_new(); gtk_widget_set_name(toolbar,"sequence view toolbar"); gtk_box_pack_start(GTK_BOX(self),toolbar,FALSE,FALSE,0); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),GTK_TOOLBAR_BOTH); // add toolbar widgets // steps box=gtk_hbox_new(FALSE,2); gtk_container_set_border_width(GTK_CONTAINER(box),4); // build the menu self->priv->bars_menu=GTK_COMBO_BOX(gtk_combo_box_new()); gtk_widget_set_tooltip_text(GTK_WIDGET(self->priv->bars_menu),_("Show every n-th line")); renderer=gtk_cell_renderer_text_new(); //gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->bars_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->bars_menu),renderer,"text", 0,NULL); g_signal_connect(self->priv->bars_menu,"changed",G_CALLBACK(on_bars_menu_changed), (gpointer)self); gtk_box_pack_start(GTK_BOX(box),gtk_label_new(_("Steps")),FALSE,FALSE,2); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(self->priv->bars_menu),TRUE,TRUE,2); tool_item=GTK_WIDGET(gtk_tool_item_new()); gtk_widget_set_name(tool_item,"Steps"); gtk_container_add(GTK_CONTAINER(tool_item),box); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); #ifndef USE_HILDON gtk_toolbar_insert(GTK_TOOLBAR(toolbar),gtk_separator_tool_item_new(),-1); #endif // popup menu button image=gtk_image_new_from_filename("popup-menu.png"); tool_item=GTK_WIDGET(gtk_tool_button_new(image,_("Sequence view menu"))); gtk_tool_item_set_tooltip_text (GTK_TOOL_ITEM(tool_item),_("Menu actions for sequence view below")); gtk_toolbar_insert(GTK_TOOLBAR(toolbar),GTK_TOOL_ITEM(tool_item),-1); g_signal_connect(tool_item,"clicked",G_CALLBACK(on_toolbar_menu_clicked),(gpointer)self); // generate the context menu self->priv->accel_group=gtk_accel_group_new(); self->priv->context_menu=GTK_MENU(g_object_ref_sink(gtk_menu_new())); gtk_menu_set_accel_group(GTK_MENU(self->priv->context_menu), self->priv->accel_group); gtk_menu_set_accel_path(GTK_MENU(self->priv->context_menu),"/SequenceView/SequenceContext"); self->priv->context_menu_add=GTK_MENU_ITEM(gtk_image_menu_item_new_with_label(_("Add track"))); image=gtk_image_new_from_stock(GTK_STOCK_ADD,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(self->priv->context_menu_add),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),GTK_WIDGET(self->priv->context_menu_add)); gtk_widget_show(GTK_WIDGET(self->priv->context_menu_add)); menu_item=gtk_image_menu_item_new_with_label(_("Remove track")); image=gtk_image_new_from_stock(GTK_STOCK_REMOVE,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/SequenceView/SequenceContext/RemoveTrack"); gtk_accel_map_add_entry ("/SequenceView/SequenceContext/RemoveTrack", GDK_Delete, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_track_remove_activated),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Move track left")); image=gtk_image_new_from_stock(GTK_STOCK_GO_BACK,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/SequenceView/SequenceContext/MoveTrackLeft"); gtk_accel_map_add_entry ("/SequenceView/SequenceContext/MoveTrackLeft", GDK_Left, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_track_move_left_activated),(gpointer)self); menu_item=gtk_image_menu_item_new_with_label(_("Move track right")); image=gtk_image_new_from_stock(GTK_STOCK_GO_FORWARD,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_item_set_accel_path (GTK_MENU_ITEM (menu_item), "/SequenceView/SequenceContext/MoveTrackRight"); gtk_accel_map_add_entry ("/SequenceView/SequenceContext/MoveTrackRight", GDK_Right, GDK_CONTROL_MASK); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_track_move_right_activated),(gpointer)self); menu_item=gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); menu_item=gtk_image_menu_item_new_with_label(_("Machine properties")); // dynamic part image=gtk_image_new_from_stock(GTK_STOCK_PROPERTIES,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_machine_properties_activate),(gpointer)self); menu_item=gtk_image_menu_item_new_with_label(_("Machine preferences")); // static part image=gtk_image_new_from_stock(GTK_STOCK_PREFERENCES,GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image); gtk_menu_shell_append(GTK_MENU_SHELL(self->priv->context_menu),menu_item); gtk_widget_show(menu_item); g_signal_connect(menu_item,"activate",G_CALLBACK(on_context_menu_machine_preferences_activate),(gpointer)self); // -- // @todo cut, copy, paste // add a hpaned split_box=gtk_hpaned_new(); gtk_container_add(GTK_CONTAINER(self),split_box); // add hbox for sequence view box=gtk_hbox_new(FALSE,0); gtk_paned_pack1(GTK_PANED(split_box),box,TRUE,TRUE); // add sequence-pos list-view vbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box), vbox, FALSE, FALSE, 0); self->priv->sequence_pos_table_header=GTK_HBOX(gtk_hbox_new(FALSE,0)); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(self->priv->sequence_pos_table_header), FALSE, FALSE, 0); scrolled_vsync_window=gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_vsync_window),GTK_POLICY_NEVER,GTK_POLICY_NEVER); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_vsync_window),GTK_SHADOW_NONE); self->priv->sequence_pos_table=GTK_TREE_VIEW(bt_sequence_view_new()); g_object_set(self->priv->sequence_pos_table, "enable-search",FALSE, "rules-hint",TRUE, "fixed-height-mode",TRUE, "headers-visible", FALSE, NULL); gtk_widget_add_events(GTK_WIDGET(self->priv->sequence_pos_table),GDK_POINTER_MOTION_HINT_MASK); // set a minimum size, otherwise the window can't be shrinked (we need this because of GTK_POLICY_NEVER) gtk_widget_set_size_request(GTK_WIDGET(self->priv->sequence_pos_table),POSITION_CELL_WIDTH,40); tree_sel=gtk_tree_view_get_selection(self->priv->sequence_pos_table); gtk_tree_selection_set_mode(tree_sel,GTK_SELECTION_NONE); sequence_pos_table_init(self); gtk_container_add(GTK_CONTAINER(scrolled_vsync_window),GTK_WIDGET(self->priv->sequence_pos_table)); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scrolled_vsync_window), TRUE, TRUE, 0); g_signal_connect(self->priv->sequence_pos_table, "button-press-event", G_CALLBACK(on_sequence_table_button_press_event), (gpointer)self); g_signal_connect(self->priv->sequence_pos_table, "motion-notify-event", G_CALLBACK(on_sequence_table_motion_notify_event), (gpointer)self); // add vertical separator gtk_box_pack_start(GTK_BOX(box), gtk_vseparator_new(), FALSE, FALSE, 0); // build label menu self->priv->label_menu=GTK_COMBO_BOX(gtk_combo_box_new()); gtk_widget_set_tooltip_text(GTK_WIDGET(self->priv->label_menu),_("Browse to labels in the sequence")); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, -1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->label_menu),renderer,FALSE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->label_menu),renderer,"text",BT_SEQUENCE_GRID_MODEL_POSSTR,NULL); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, -1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(self->priv->label_menu),renderer,TRUE); gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(self->priv->label_menu),renderer,"text",BT_SEQUENCE_GRID_MODEL_LABEL,NULL); g_signal_connect(self->priv->label_menu,"changed",G_CALLBACK(on_label_menu_changed), (gpointer)self); vbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box), vbox, TRUE, TRUE, 0); // add sequence header list-view scrolled_hsync_window=gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_hsync_window),GTK_POLICY_NEVER,GTK_POLICY_NEVER); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_hsync_window),GTK_SHADOW_NONE); self->priv->sequence_table_header=GTK_HBOX(gtk_hbox_new(FALSE,0)); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_hsync_window),GTK_WIDGET(self->priv->sequence_table_header)); hsync_viewport=gtk_bin_get_child(GTK_BIN(scrolled_hsync_window)); gtk_viewport_set_shadow_type(GTK_VIEWPORT(hsync_viewport),GTK_SHADOW_NONE); // set a minimum size, otherwise the window can't be shrinked (we need this because of GTK_POLICY_NEVER) gtk_widget_set_size_request(GTK_WIDGET(hsync_viewport),SEQUENCE_CELL_WIDTH,-1); /* DEBUG g_signal_connect(self->priv->sequence_table_header,"size-allocate",G_CALLBACK(on_sequence_header_size_allocate),(gpointer)"box"); g_signal_connect(self->priv->sequence_table_header,"size-allocate",G_CALLBACK(on_sequence_header_size_allocate),(gpointer)"vport"); // DEBUG */ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scrolled_hsync_window), FALSE, FALSE, 0); g_signal_connect(scrolled_hsync_window, "button-press-event", G_CALLBACK(on_sequence_header_button_press_event), (gpointer)self); // add sequence list-view scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_NONE); self->priv->sequence_table=GTK_TREE_VIEW(bt_sequence_view_new()); g_object_set(self->priv->sequence_table, "enable-search",FALSE, "rules-hint",TRUE, "fixed-height-mode",TRUE, "headers-visible", FALSE, NULL); //GST_DEBUG("sequence-view events = 0x%x",gtk_widget_get_events(GTK_WIDGET(self->priv->sequence_table))); gtk_widget_add_events(GTK_WIDGET(self->priv->sequence_table),GDK_POINTER_MOTION_HINT_MASK); tree_sel=gtk_tree_view_get_selection(self->priv->sequence_table); gtk_tree_selection_set_mode(tree_sel,GTK_SELECTION_NONE); sequence_table_init(self); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->sequence_table)); gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(scrolled_window), TRUE, TRUE, 0); g_signal_connect_after(self->priv->sequence_table, "cursor-changed", G_CALLBACK(on_sequence_table_cursor_changed), (gpointer)self); g_signal_connect(self->priv->sequence_table, "key-press-event", G_CALLBACK(on_sequence_table_key_press_event), (gpointer)self); g_signal_connect(self->priv->sequence_table, "button-press-event", G_CALLBACK(on_sequence_table_button_press_event), (gpointer)self); g_signal_connect(self->priv->sequence_table, "motion-notify-event", G_CALLBACK(on_sequence_table_motion_notify_event), (gpointer)self); g_signal_connect(self->priv->sequence_table, "scroll-event", G_CALLBACK(on_sequence_table_scroll_event), (gpointer)self); g_signal_connect(self->priv->sequence_table, "realize", G_CALLBACK(on_sequence_table_realize), (gpointer)self); g_signal_connect(self->priv->sequence_table, "style-set", G_CALLBACK(on_sequence_table_style_set), (gpointer)self); gtk_widget_set_name(GTK_WIDGET(self->priv->sequence_table),"sequence editor"); // make pos scrolled-window also use the vertical-scrollbar of the sequence scrolled-window vadjust=gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); gtk_scrolled_window_set_vadjustment(GTK_SCROLLED_WINDOW(scrolled_vsync_window),vadjust); // make header scrolled-window also use the horizontal-scrollbar of the sequence scrolled-window hadjust=gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(scrolled_window)); gtk_scrolled_window_set_hadjustment(GTK_SCROLLED_WINDOW(scrolled_hsync_window),hadjust); //GST_DEBUG("pos_view=%p, data_view=%p", self->priv->sequence_pos_table,self->priv->sequence_table); // add vertical separator gtk_box_pack_start(GTK_BOX(box), gtk_vseparator_new(), FALSE, FALSE, 0); // add hbox for pattern list box=gtk_hbox_new(FALSE,0); gtk_paned_pack2(GTK_PANED(split_box),box,FALSE,FALSE); // add vertical separator gtk_box_pack_start(GTK_BOX(box), gtk_vseparator_new(), FALSE, FALSE, 0); // add pattern list-view scrolled_window=gtk_scrolled_window_new(NULL,NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),GTK_POLICY_NEVER,GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window),GTK_SHADOW_NONE); self->priv->pattern_list=GTK_TREE_VIEW(gtk_tree_view_new()); g_object_set(self->priv->pattern_list, "enable-search",FALSE, "rules-hint",TRUE, "fixed-height-mode",TRUE, NULL); gtk_widget_set_name(GTK_WIDGET(self->priv->pattern_list),"sequence-pattern-list"); renderer=gtk_cell_renderer_text_new(); g_object_set(renderer, "xalign",1.0, NULL); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); if((tree_col=gtk_tree_view_column_new_with_attributes(_("Key"),renderer, "text",BT_PATTERN_MODEL_SHORTCUT, "sensitive",BT_PATTERN_MODEL_IS_USED, NULL)) ) { g_object_set(tree_col,"sizing",GTK_TREE_VIEW_COLUMN_FIXED,"fixed-width",30,NULL); gtk_tree_view_insert_column(self->priv->pattern_list,tree_col,-1); } else GST_WARNING("can't create treeview column"); renderer=gtk_cell_renderer_text_new(); gtk_cell_renderer_set_fixed_size(renderer, 1, -1); gtk_cell_renderer_text_set_fixed_height_from_font(GTK_CELL_RENDERER_TEXT(renderer), 1); if((tree_col=gtk_tree_view_column_new_with_attributes(_("Patterns"),renderer, "text",BT_PATTERN_MODEL_LABEL, "sensitive",BT_PATTERN_MODEL_IS_USED, NULL)) ) { g_object_set(tree_col,"sizing",GTK_TREE_VIEW_COLUMN_FIXED,"fixed-width",70,NULL); gtk_tree_view_insert_column(self->priv->pattern_list,tree_col,-1); } else GST_WARNING("can't create treeview column"); gtk_container_add(GTK_CONTAINER(scrolled_window),GTK_WIDGET(self->priv->pattern_list)); gtk_box_pack_start(GTK_BOX(box),GTK_WIDGET(scrolled_window),TRUE,TRUE,0); //gtk_paned_pack2(GTK_PANED(split_box),GTK_WIDGET(scrolled_window),FALSE,FALSE); pattern_list_refresh(self); // this is needed for the initial model creation // register event handlers g_signal_connect(self->priv->app, "notify::song", G_CALLBACK(on_song_changed), (gpointer)self); // listen to page changes g_signal_connect((gpointer)pages, "notify::page", G_CALLBACK(on_page_switched), (gpointer)self); // let settings control toolbar style g_object_get(self->priv->app,"settings",&settings,NULL); on_toolbar_style_changed(settings,NULL,(gpointer)toolbar); g_signal_connect(settings, "notify::toolbar-style", G_CALLBACK(on_toolbar_style_changed), (gpointer)toolbar); g_object_unref(settings); GST_DEBUG(" done"); } //-- constructor methods /** * bt_main_page_sequence_new: * @pages: the page collection * * Create a new instance * * Returns: the new instance */ BtMainPageSequence *bt_main_page_sequence_new(const BtMainPages *pages) { BtMainPageSequence *self; self=BT_MAIN_PAGE_SEQUENCE(g_object_new(BT_TYPE_MAIN_PAGE_SEQUENCE,NULL)); bt_main_page_sequence_init_ui(self,pages); return(self); } //-- methods //-- cut/copy/paste static void sequence_clipboard_get_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,guint info,gpointer data) { GST_INFO("get clipboard data, info=%d, data=%p",info,data); GST_INFO("sending : [%s]",data); // FIXME: do we need to format differently depending on info? if(selection_data->target==sequence_atom) { gtk_selection_data_set(selection_data,sequence_atom,8,(guchar *)data,strlen(data)); } else { // allow pasting into a test editor for debugging // its only active if we register the formats in _copy_selection() below gtk_selection_data_set_text(selection_data,data,-1); } } static void sequence_clipboard_clear_func(GtkClipboard *clipboard,gpointer data) { GST_INFO("freeing clipboard data, data=%p",data); g_free(data); } /** * bt_main_page_sequence_delete_selection: * @self: the sequence subpage * * Delete (clear) the selected area. */ void bt_main_page_sequence_delete_selection(const BtMainPageSequence *self) { GtkTreeModel *store; glong selection_start_column,selection_start_row; glong selection_end_column,selection_end_row; if(self->priv->selection_start_column==-1) { selection_start_column=selection_end_column=self->priv->cursor_column; selection_start_row=selection_end_row=self->priv->cursor_row; } else { selection_start_column=self->priv->selection_start_column; selection_start_row=self->priv->selection_start_row; selection_end_column=self->priv->selection_end_column; selection_end_row=self->priv->selection_end_row; } GST_INFO("delete sequence region: %3ld,%3ld -> %3ld,%3ld",selection_start_column,selection_start_row,selection_end_column,selection_end_row); if((store=sequence_model_get_store(self))) { GtkTreePath *path; if((path=gtk_tree_path_new_from_indices(selection_start_row,-1))) { GtkTreeIter iter; if(gtk_tree_model_get_iter(store,&iter,path)) { gboolean sequence_changed=FALSE; glong i,j; for(i=selection_start_row;i<=selection_end_row;i++) { for(j=selection_start_column-1;jpriv->sequence,i,j,NULL); } if(!gtk_tree_model_iter_next(store,&iter)) { if(jpriv->selection_end_column) { GST_WARNING(" can't get next tree-iter"); } break; } } if(sequence_changed) { // repair damage bt_sequence_repair_damage(self->priv->sequence); } } else { GST_WARNING(" can't get tree-iter for row %ld",selection_start_row); } gtk_tree_path_free(path); } else { GST_WARNING(" can't get tree-path for row %ld",selection_start_row); } } else { GST_WARNING(" can't get tree-model"); } // reset selection self->priv->selection_start_column=self->priv->selection_start_row=self->priv->selection_end_column=self->priv->selection_end_row=-1; } /** * bt_main_page_sequence_cut_selection: * @self: the sequence subpage * * Cut selected area. * not yet working */ void bt_main_page_sequence_cut_selection(const BtMainPageSequence *self) { bt_main_page_sequence_copy_selection(self); bt_main_page_sequence_delete_selection(self); } /** * bt_main_page_sequence_copy_selection: * @self: the sequence subpage * * Copy selected area. * not yet working */ void bt_main_page_sequence_copy_selection(const BtMainPageSequence *self) { if(self->priv->selection_start_row!=-1 && self->priv->selection_start_column!=-1) { //GtkClipboard *cb=gtk_clipboard_get_for_display(gdk_display_get_default(),GDK_SELECTION_CLIPBOARD); //GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->sequence_table),GDK_SELECTION_SECONDARY); GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->sequence_table),GDK_SELECTION_CLIPBOARD); GtkTargetEntry *targets; gint n_targets; GString *data=g_string_new(NULL); GST_INFO("copying : %ld,%ld - %d,%ld", self->priv->selection_start_column, self->priv->selection_start_row, self->priv->selection_end_column, self->priv->selection_end_row); targets = gtk_target_table_make(sequence_atom, &n_targets); /* the number of ticks */ g_string_append_printf(data,"%ld\n",(self->priv->selection_end_row+1)-self->priv->selection_start_row); sequence_range_copy(self, self->priv->selection_start_column,self->priv->selection_end_column, self->priv->selection_start_row,self->priv->selection_end_row, data); GST_INFO("copying : [%s]",data->str); /* put to clipboard */ if(gtk_clipboard_set_with_data (cb, targets, n_targets, sequence_clipboard_get_func, sequence_clipboard_clear_func, g_string_free (data, FALSE)) ) { gtk_clipboard_set_can_store (cb, NULL, 0); } else { GST_INFO("copy failed"); } gtk_target_table_free (targets, n_targets); GST_INFO("copy done"); } } static gboolean sequence_deserialize_pattern_track(BtMainPageSequence *self,GtkTreeModel *store,GtkTreePath *path,gchar **fields,gulong track,gulong row,gboolean *sequence_changed) { gboolean res=TRUE; GtkTreeIter iter; BtMachine *machine; GST_INFO("get machine for col %d",track); machine=bt_sequence_get_machine(self->priv->sequence,track); if(machine) { gchar *id, *str; g_object_get(machine,"id",&id,NULL); if(!strcmp(id,fields[0])) { if(gtk_tree_model_get_iter(store,&iter,path)) { BtSequence *sequence=self->priv->sequence; BtPattern *pattern; gint j=1; gulong sequence_length; g_object_get(sequence,"length",&sequence_length,NULL); while((rowpriv->cursor_row); res=FALSE; } } else { GST_INFO("machines don't match in %s <-> %s",fields[0],id); res=FALSE; } g_free(id); g_object_unref(machine); } else { GST_INFO("no machine for track"); res=FALSE; } return(res); } static gboolean sequence_deserialize_label_track(BtMainPageSequence *self,GtkTreeModel *store,GtkTreePath *path,gchar **fields,gulong row) { gboolean res=TRUE; GtkTreeIter iter; gchar *str; GST_INFO("paste labels"); if(gtk_tree_model_get_iter(store,&iter,path)) { BtSequence *sequence=self->priv->sequence; gint j=1; gulong sequence_length; g_object_get(sequence,"length",&sequence_length,NULL); while((rowpriv->cursor_row); res=FALSE; } return(res); } static void sequence_clipboard_received_func(GtkClipboard *clipboard,GtkSelectionData *selection_data,gpointer user_data) { BtMainPageSequence *self = BT_MAIN_PAGE_SEQUENCE(user_data); gchar **lines; guint ticks; gchar *data; GST_INFO("receiving clipboard data"); data=(gchar *)gtk_selection_data_get_data(selection_data); GST_INFO("pasting : [%s]",data); if(!data) return; lines=g_strsplit_set(data,"\n",0); if(lines[0]) { GtkTreeModel *store; gint i=1; gint beg,end; gulong sequence_length; gchar **fields; gboolean res=TRUE; g_object_get(self->priv->sequence,"length",&sequence_length,NULL); ticks=atol(lines[0]); sequence_length--; // paste from self->priv->cursor_row to MIN(self->priv->cursor_row+ticks,sequence_length) beg=self->priv->cursor_row; end=beg+ticks; end=MIN(end,sequence_length); GST_INFO("pasting from row %d to %d",beg,end); if((store=sequence_model_get_store(self))) { GtkTreePath *path; if((path=gtk_tree_path_new_from_indices(self->priv->cursor_row,-1))) { gboolean sequence_changed=FALSE; // process each line (= pattern column) while(lines[i] && *lines[i] && (self->priv->cursor_row+(i-1)<=end) && res) { fields=g_strsplit_set(lines[i],",",0); if((self->priv->cursor_column+(i-2))>=0) { res=sequence_deserialize_pattern_track(self,store,path,fields,(self->priv->cursor_column+i-2),self->priv->cursor_row,&sequence_changed); } else if(*fields[0]==' ') { res=sequence_deserialize_label_track(self,store,path,fields,self->priv->cursor_row); } g_strfreev(fields); i++; } if(sequence_changed) { // repair damage bt_sequence_repair_damage(self->priv->sequence); } gtk_tree_path_free(path); } else { GST_WARNING(" can't get tree-path"); } } else { GST_WARNING(" can't get tree-model"); } } g_strfreev(lines); } /** * bt_main_page_sequence_paste_selection: * @self: the sequence subpage * * Paste at the top of the selected area. * not yet working */ void bt_main_page_sequence_paste_selection(const BtMainPageSequence *self) { //GtkClipboard *cb=gtk_clipboard_get_for_display(gdk_display_get_default(),GDK_SELECTION_CLIPBOARD); //GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->sequence_table),GDK_SELECTION_SECONDARY); GtkClipboard *cb=gtk_widget_get_clipboard(GTK_WIDGET(self->priv->sequence_table),GDK_SELECTION_CLIPBOARD); gtk_clipboard_request_contents(cb,sequence_atom,sequence_clipboard_received_func,(gpointer)self); } //-- change logger interface static gboolean bt_main_page_sequence_change_logger_change(const BtChangeLogger *owner,const gchar *data) { BtMainPageSequence *self = BT_MAIN_PAGE_SEQUENCE(owner); GMatchInfo *match_info; gboolean res=FALSE; gchar *s; GST_INFO("undo/redo: [%s]",data); // parse data and apply action switch (bt_change_logger_match_method(change_logger_methods, data, &match_info)) { case METHOD_SET_PATTERNS: { GtkTreeModel *store; gchar *str; gulong track,s_row,e_row; // track, beg, end, patterns s=g_match_info_fetch(match_info,1);track=atol(s);g_free(s); s=g_match_info_fetch(match_info,2);s_row=atol(s);g_free(s); s=g_match_info_fetch(match_info,3);e_row=atol(s);g_free(s); str=g_match_info_fetch(match_info,4); g_match_info_free(match_info); GST_DEBUG("-> [%lu|%lu|%lu|%s]",track,s_row,e_row,str); if((store=sequence_model_get_store(self))) { GtkTreePath *path; if((path=gtk_tree_path_new_from_indices(s_row,-1))) { gboolean sequence_changed=FALSE; gchar **fields=g_strsplit_set(str,",",0); res=sequence_deserialize_pattern_track(self,store,path,fields,track,s_row,&sequence_changed); if(sequence_changed) { // repair damage bt_sequence_repair_damage(self->priv->sequence); } g_strfreev(fields); gtk_tree_path_free(path); } } if(res) { // move cursor to s_row (+self->priv->bars?) self->priv->cursor_row=s_row; sequence_view_set_cursor_pos(self); } g_free(str); break; } case METHOD_SET_LABELS: { GtkTreeModel *store; gchar *str; gulong s_row,e_row; // track, beg, end, patterns s=g_match_info_fetch(match_info,1);s_row=atol(s);g_free(s); s=g_match_info_fetch(match_info,2);e_row=atol(s);g_free(s); str=g_match_info_fetch(match_info,3); g_match_info_free(match_info); GST_DEBUG("-> [%lu|%lu|%s]",s_row,e_row,str); if((store=sequence_model_get_store(self))) { GtkTreePath *path; if((path=gtk_tree_path_new_from_indices(s_row,-1))) { gchar **fields=g_strsplit_set(str,",",0); res=sequence_deserialize_label_track(self,store,path,fields,s_row); g_strfreev(fields); gtk_tree_path_free(path); } } if(res) { // move cursor to s_row (+self->priv->bars?) self->priv->cursor_row=s_row; sequence_view_set_cursor_pos(self); } g_free(str); break; } case METHOD_SET_SEQUENCE_PROPERTY: { gchar *key,*val; key=g_match_info_fetch(match_info,1); val=g_match_info_fetch(match_info,2); g_match_info_free(match_info); GST_DEBUG("-> [%s|%s]",key,val); // length // loop-start/end res=TRUE; if(!strcmp(key,"loop-start")) { g_object_set(self->priv->sequence,"loop-start",atol(val),NULL); sequence_calculate_visible_lines(self); } else if(!strcmp(key,"loop-end")) { g_object_set(self->priv->sequence,"loop-end",atol(val),NULL); sequence_calculate_visible_lines(self); } else if(!strcmp(key,"length")) { g_object_set(self->priv->sequence,"length",atol(val),NULL); sequence_calculate_visible_lines(self); } else { GST_WARNING("unhandled property '%s'",key); res=FALSE; } g_free(key); g_free(val); break; } case METHOD_ADD_TRACK: { gchar *mid; gulong ix; BtSong *song; BtSetup *setup; BtMachine *machine; mid=g_match_info_fetch(match_info,1); s=g_match_info_fetch(match_info,2);ix=atol(s);g_free(s); g_match_info_free(match_info); GST_DEBUG("-> [%s|%lu]",mid,ix); // get song from app and then setup from song g_object_get(self->priv->app,"song",&song,NULL); g_object_get(song,"setup",&setup,NULL); if((machine=bt_setup_get_machine_by_id(setup,mid))) { sequence_add_track(self,machine,ix); g_object_unref(machine); update_after_track_changed(self); res=TRUE; } g_object_unref(setup); g_object_unref(song); g_free(mid); break; } case METHOD_REM_TRACK: { gulong ix; s=g_match_info_fetch(match_info,1);ix=atol(s);g_free(s); g_match_info_free(match_info); GST_DEBUG("-> [%lu]",ix); sequence_remove_track(self,ix); update_after_track_changed(self); res=TRUE; break; } case METHOD_MOVE_TRACK: { gulong ix_cur,ix_new; s=g_match_info_fetch(match_info,1);ix_cur=atol(s);g_free(s); s=g_match_info_fetch(match_info,2);ix_new=atol(s);g_free(s); g_match_info_free(match_info); GST_DEBUG("-> [%lu|%lu]",ix_cur,ix_new); // we only move right/left by one right now // @todo: but maybe better change that sequence API, then one function // would be all we need if(ix_cur>ix_new) { if(bt_sequence_move_track_left(self->priv->sequence,ix_cur)) { self->priv->cursor_column--; res=TRUE; } } else { if(bt_sequence_move_track_right(self->priv->sequence,ix_cur)) { self->priv->cursor_column++; res=TRUE; } } if(res) { BtSong *song; g_object_get(self->priv->app,"song",&song,NULL); // reinit the view sequence_table_refresh_columns(self,song); sequence_view_set_cursor_pos(self); g_object_unref(song); } break; } default: GST_WARNING("unhandled undo/redo method: [%s]",data); } return res; } static void bt_main_page_sequence_change_logger_interface_init(gpointer const g_iface, gconstpointer const iface_data) { BtChangeLoggerInterface * const iface = g_iface; iface->change = bt_main_page_sequence_change_logger_change; } //-- wrapper //-- class internals static gboolean bt_main_page_sequence_focus(GtkWidget *widget, GtkDirectionType direction) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(widget); if(!self->priv->main_window) grab_main_window(self); GST_DEBUG("focusing default widget"); gtk_widget_grab_focus_savely(GTK_WIDGET(self->priv->sequence_table)); // do we need to set the cursor here? sequence_view_set_cursor_pos(self); /* use status bar */ bt_child_proxy_set(self->priv->main_window,"statusbar::status",_("Add new tracks from right click context menu."),NULL); return FALSE; } static void bt_main_page_sequence_get_property(GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { BtMainPageSequence *self=BT_MAIN_PAGE_SEQUENCE(object); return_if_disposed(); switch (property_id) { case MAIN_PAGE_SEQUENCE_CURSOR_ROW: { g_value_set_long(value, self->priv->cursor_row); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_main_page_sequence_dispose(GObject *object) { BtMainPageSequence *self = BT_MAIN_PAGE_SEQUENCE(object); BtSong *song; return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); g_object_get(self->priv->app,"song",&song,NULL); if(song) { BtSetup *setup; BtSongInfo *song_info; GstBin *bin; GstBus *bus; GST_DEBUG("disconnect handlers from song=%p, song->ref_ct=%d",song,G_OBJECT_REF_COUNT(song)); g_object_get(song,"setup",&setup,"song-info",&song_info,"bin", &bin,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_play_pos_notify,NULL); g_signal_handlers_disconnect_matched(song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_is_playing_notify,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_added,NULL); g_signal_handlers_disconnect_matched(setup,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_machine_removed,NULL); g_signal_handlers_disconnect_matched(song_info,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_info_bars_changed,NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_handlers_disconnect_matched(bus, G_SIGNAL_MATCH_FUNC,0,0,NULL,on_track_level_change,NULL); gst_object_unref(bus); gst_object_unref(bin); g_object_unref(setup); g_object_unref(song_info); g_object_unref(song); } if(self->priv->sequence) { BtSequence *sequence=self->priv->sequence; g_signal_handlers_disconnect_matched(sequence,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_track_removed,(gpointer)self); g_object_unref(sequence); } g_signal_handlers_disconnect_matched(self->priv->app,G_SIGNAL_MATCH_FUNC|G_SIGNAL_MATCH_DATA,0,0,NULL,on_song_changed,(gpointer)self); self->priv->main_window=NULL; g_object_unref(self->priv->change_log); g_object_unref(self->priv->app); if(self->priv->machine) { GST_INFO("unref old cur-machine: %p,ref_ct=%d",self->priv->machine,G_OBJECT_REF_COUNT(self->priv->machine)); if(self->priv->pattern_removed_handler) g_signal_handler_disconnect(self->priv->machine,self->priv->pattern_removed_handler); g_object_unref(self->priv->machine); } gtk_widget_destroy(GTK_WIDGET(self->priv->context_menu)); g_object_unref(self->priv->context_menu); g_object_try_unref(self->priv->accel_group); if(self->priv->clock) gst_object_unref(self->priv->clock); GST_DEBUG(" chaining up"); G_OBJECT_CLASS(bt_main_page_sequence_parent_class)->dispose(object); } static void bt_main_page_sequence_finalize(GObject *object) { BtMainPageSequence *self = BT_MAIN_PAGE_SEQUENCE(object); GST_DEBUG("!!!! self=%p",self); g_mutex_free(self->priv->lock); g_hash_table_destroy(self->priv->level_to_vumeter); G_OBJECT_CLASS(bt_main_page_sequence_parent_class)->finalize(object); } static void bt_main_page_sequence_init(BtMainPageSequence *self) { self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_MAIN_PAGE_SEQUENCE, BtMainPageSequencePrivate); GST_DEBUG("!!!! self=%p",self); self->priv->app = bt_edit_application_new(); self->priv->bars=16; //self->priv->cursor_column=0; //self->priv->cursor_row=0; self->priv->selection_start_column=-1; self->priv->selection_start_row=-1; self->priv->selection_end_column=-1; self->priv->selection_end_row=-1; self->priv->sequence_length=self->priv->bars; self->priv->lock=g_mutex_new(); // the undo/redo changelogger self->priv->change_log=bt_change_log_new(); bt_change_log_register(self->priv->change_log,BT_CHANGE_LOGGER(self)); } static void bt_main_page_sequence_class_init(BtMainPageSequenceClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GtkWidgetClass *gtkwidget_class = GTK_WIDGET_CLASS(klass); sequence_atom=gdk_atom_intern_static_string("application/buzztard::sequence"); column_index_quark=g_quark_from_static_string("BtMainPageSequence::column-index"); bus_msg_level_quark=g_quark_from_static_string("level"); vu_meter_skip_update=g_quark_from_static_string("BtMainPageSequence::skip-update"); g_type_class_add_private(klass,sizeof(BtMainPageSequencePrivate)); gobject_class->get_property = bt_main_page_sequence_get_property; gobject_class->dispose = bt_main_page_sequence_dispose; gobject_class->finalize = bt_main_page_sequence_finalize; gtkwidget_class->focus = bt_main_page_sequence_focus; g_object_class_install_property(gobject_class,MAIN_PAGE_SEQUENCE_CURSOR_ROW, g_param_spec_long("cursor-row", "cursor-row prop", "position of the cursor in the sequence view in bars", 0, G_MAXLONG, // loop-positions are LONG as well 0, G_PARAM_READABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/edit/main-menu.h0000644042355400116100000000414411625722250014506 00000000000000/* $Id: main-menu.h 3610 2011-08-26 13:50:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_MAIN_MENU_H #define BT_MAIN_MENU_H #include #include #define BT_TYPE_MAIN_MENU (bt_main_menu_get_type ()) #define BT_MAIN_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_MAIN_MENU, BtMainMenu)) #define BT_MAIN_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_MAIN_MENU, BtMainMenuClass)) #define BT_IS_MAIN_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_MAIN_MENU)) #define BT_IS_MAIN_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_MAIN_MENU)) #define BT_MAIN_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_MAIN_MENU, BtMainMenuClass)) /* type macros */ typedef struct _BtMainMenu BtMainMenu; typedef struct _BtMainMenuClass BtMainMenuClass; typedef struct _BtMainMenuPrivate BtMainMenuPrivate; /** * BtMainMenu: * * the main menu inside the #BtMainWindow */ struct _BtMainMenu { #ifndef USE_HILDON GtkMenuBar parent; #else GtkMenu parent; #endif /*< private >*/ BtMainMenuPrivate *priv; }; struct _BtMainMenuClass { #ifndef USE_HILDON GtkMenuBarClass parent; #else GtkMenuClass parent; #endif }; GType bt_main_menu_get_type(void) G_GNUC_CONST; BtMainMenu *bt_main_menu_new(void); #endif // BT_MAIN_MENU_H buzztard-0.6.0/src/ui/cmd/0000755042355400116100000000000011675570676012364 500000000000000buzztard-0.6.0/src/ui/cmd/cmd-application.c0000644042355400116100000005470211576360372015512 00000000000000/* $Id: cmd-application.c 3367 2011-05-13 07:24:26Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btcmdapplication * @short_description: class for a commandline based buzztard tool application * * This class implements the body of the buzztard commandline tool. * It provides application level function like play, convert and encode songs. */ /* @todo: shouldn't we start a mainloop, then launch * bt_cmd_application_play_song() in an idle callback, hookup the state-change * and the eos to quit the mainloop and run a timer for the play position prints * (if not in quite mode) */ #define BT_CMD #define BT_CMD_APPLICATION_C #include "bt-cmd.h" // this needs to be here because of gtk-doc and unit-tests GST_DEBUG_CATEGORY(GST_CAT_DEFAULT); //-- signal ids //-- property ids enum { CMD_APP_QUIET=1 }; struct _BtCmdApplicationPrivate { /* used to validate if dispose has run */ gboolean dispose_has_run; /* no output on stdout */ gboolean quiet; /* error flag from bus handler */ gboolean has_error; /* runtime data */ const BtSong *song; gboolean res; /* main loop */ GMainLoop *loop; }; static gboolean is_playing=FALSE; //-- the class G_DEFINE_TYPE (BtCmdApplication, bt_cmd_application, BT_TYPE_APPLICATION); //-- helper methods /* * on_song_is_playing_notify: * * playback status signal callback function */ static void on_song_is_playing_notify(const BtSong *song, GParamSpec *arg, gpointer user_data) { g_object_get((gpointer)song,"is-playing",&is_playing,NULL); GST_INFO("%s playing - invoked per signal : song=%p, user_data=%p", (is_playing?"started":"stopped"),song,user_data); } static void on_song_error(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { const BtCmdApplication *self=BT_CMD_APPLICATION(user_data); GError *err = NULL; gchar *dbg = NULL; GST_INFO("received %s bus message from %s", GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); // @todo: check domain and code gst_message_parse_error(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"ERROR: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); self->priv->has_error = TRUE; } static void on_song_warning(const GstBus * const bus, GstMessage *message, gconstpointer user_data) { //const BtCmdApplication *self=BT_CMD_APPLICATION(user_data); GError *err = NULL; gchar *dbg = NULL; GST_INFO("received %s bus message from %s", GST_MESSAGE_TYPE_NAME(message), GST_OBJECT_NAME(GST_MESSAGE_SRC(message))); // @todo: check domain and code gst_message_parse_warning(message, &err, &dbg); GST_WARNING_OBJECT(GST_MESSAGE_SRC(message),"WARNING: %s (%s)", err->message, (dbg ? dbg : "no details")); g_error_free(err); g_free(dbg); } /* * bt_cmd_application_song_init: * * Create the song an attach error handlers to the bus. */ static BtSong *bt_cmd_application_song_init(const BtCmdApplication *self) { BtSong *song; GstBin *bin; GstBus *bus; song=bt_song_new(BT_APPLICATION(self)); g_object_get((gpointer)song,"bin",&bin,NULL); bus=gst_element_get_bus(GST_ELEMENT(bin)); g_signal_connect(bus, "message::error", G_CALLBACK(on_song_error), (gpointer)self); g_signal_connect(bus, "message::warning", G_CALLBACK(on_song_warning), (gpointer)self); //g_signal_connect(bus, "message::element", G_CALLBACK(on_song_element_msg), (gpointer)self); gst_object_unref(bus); gst_object_unref(bin); return(song); } /* * bt_cmd_application_play_song: * * start playback, used by play and record */ static void bt_cmd_application_idle_play_song(const BtCmdApplication *self) { gboolean res=FALSE; const BtSong *song=self->priv->song; BtSequence *sequence=NULL; gulong cmsec,csec,cmin,tmsec,tsec,tmin; gulong length,pos=0; GstClockTime bar_time; GstBin *bin; // DEBUG //bt_song_write_to_highlevel_dot_file(song); //bt_song_write_to_lowlevel_dot_file(song); // DEBUG g_object_get((gpointer)song,"sequence",&sequence,"bin",&bin,NULL); if(!GST_BIN_NUMCHILDREN(bin)) { GST_INFO("song is empty"); goto Error; } g_object_get(sequence,"length",&length,NULL); bar_time=bt_sequence_get_bar_time(sequence); tmsec=(gulong)((length*bar_time)/G_USEC_PER_SEC); tmin=(gulong)(tmsec/60000);tmsec-=(tmin*60000); tsec=(gulong)(tmsec/ 1000);tmsec-=(tsec* 1000); // connection play and stop signals g_signal_connect((gpointer)song, "notify::is-playing", G_CALLBACK(on_song_is_playing_notify), (gpointer)self); if(bt_song_play(song)) { GST_INFO("playing is starting, is_playing=%d",is_playing); /* FIXME: this is a bad idea, now that we have a main loop * we should start a g_timeout_add() from on_song_is_playing_notify() * and quit the main-loop there on eos */ while(!is_playing) { while(g_main_context_pending(NULL)) g_main_context_iteration(NULL,FALSE); g_usleep(G_USEC_PER_SEC/10); } GST_INFO("playing has started, is_playing=%d",is_playing); while(is_playing && (pospriv->has_error) { if (!bt_song_update_playback_position(song)) { bt_song_stop(song); } g_object_get((gpointer)song,"play-pos",&pos,NULL); if(!self->priv->quiet) { // get song->play-pos and print progress cmsec=(gulong)((pos*bar_time)/G_USEC_PER_SEC); cmin=(gulong)(cmsec/60000);cmsec-=(cmin*60000); csec=(gulong)(cmsec/ 1000);cmsec-=(csec* 1000); printf("\r%02lu:%02lu.%03lu / %02lu:%02lu.%03lu", cmin,csec,cmsec,tmin,tsec,tmsec); fflush(stdout); } while(g_main_context_pending(NULL)) g_main_context_iteration(NULL,FALSE); g_usleep(G_USEC_PER_SEC/10); } GST_INFO("finished playing: is_playing=%d, pos=%lu < length=%lu",is_playing,pos,length); if(!self->priv->quiet) puts(""); res=TRUE; } else { GST_ERROR("could not play song"); goto Error; } is_playing=FALSE; Error: gst_object_unref(bin); g_object_unref(sequence); self->priv->res=res; g_main_loop_quit(self->priv->loop); } static gboolean bt_cmd_application_play_song(const BtCmdApplication *self,const BtSong *song) { self->priv->song=song; g_idle_add((GSourceFunc)bt_cmd_application_idle_play_song,(gpointer)self); g_main_loop_run(self->priv->loop); return(self->priv->res); } /* * bt_cmd_application_prepare_encoding: * * switch master to record mode */ static gboolean bt_cmd_application_prepare_encoding(const BtCmdApplication *self,const BtSong *song, const gchar *output_file_name) { gboolean ret=FALSE; BtSetup *setup; BtMachine *machine; BtSinkBinRecordFormat format; gchar *lc_file_name,*file_name=NULL; GEnumClass *enum_class; GEnumValue *enum_value; guint i; gboolean matched=FALSE; g_object_get((gpointer)song,"setup",&setup,NULL); lc_file_name=g_ascii_strdown(output_file_name,-1); enum_class=g_type_class_peek_static(BT_TYPE_SINK_BIN_RECORD_FORMAT); for(i=enum_class->minimum;(!matched && i<=enum_class->maximum);i++) { if((enum_value=g_enum_get_value(enum_class,i))) { if(g_str_has_suffix(lc_file_name,enum_value->value_name)) { format=i;matched=TRUE; } } } if(!matched) { GST_WARNING("unknown file-format extension, using ogg vorbis"); format=BT_SINK_BIN_RECORD_FORMAT_OGG_VORBIS; file_name=g_strdup_printf("%s.ogg",output_file_name); } g_free(lc_file_name); // lookup the audio-sink machine and change mode if((machine=bt_setup_get_machine_by_type(setup,BT_TYPE_SINK_MACHINE))) { GstElement *convert; BtSinkBin *sink_bin; g_object_get(machine,"machine",&sink_bin,"adder-convert",&convert,NULL); /* @todo eventually have a method for the sink bin to only update once * after the changes, right now keep the order as it is, as sink-bin only * effectively switches once the file-name is set as well */ g_object_set(sink_bin, "mode",BT_SINK_BIN_MODE_RECORD, "record-format",format, "record-file-name",(file_name?file_name:output_file_name), NULL); /* see comments in edit/render-progress.c */ g_object_set(convert,"dithering",2,"noise-shaping",3,NULL); ret=!self->priv->has_error; g_free(file_name); gst_object_unref(convert); gst_object_unref(sink_bin); g_object_unref(machine); } g_object_unref(setup); return(ret); } //-- constructor methods /** * bt_cmd_application_new: * @quiet: do not output on stdout * * Create a new instance * * Returns: the new instance or %NULL in case of an error */ BtCmdApplication *bt_cmd_application_new(gboolean quiet) { return(BT_CMD_APPLICATION(g_object_new(BT_TYPE_CMD_APPLICATION,"quiet",quiet,NULL))); } //-- methods /** * bt_cmd_application_play: * @self: the application instance to run * @input_file_name: the file to play * * load and play the file of the supplied name * * Returns: %TRUE for success */ gboolean bt_cmd_application_play(const BtCmdApplication *self, const gchar *input_file_name) { gboolean res=FALSE; BtSong *song=NULL; BtSongIO *loader=NULL; g_return_val_if_fail(BT_IS_CMD_APPLICATION(self),FALSE); g_return_val_if_fail(BT_IS_STRING(input_file_name),FALSE); GST_INFO("application.play(%s) launched",input_file_name); // prepare song and song-io song=bt_cmd_application_song_init(self); if(!(loader=bt_song_io_from_file(input_file_name))) { goto Error; } GST_INFO("objects initialized"); if(bt_song_io_load(loader,song)) { BtSetup *setup; BtWavetable *wavetable; GList *node,*missing_machines,*missing_waves; g_object_get((gpointer)song,"setup",&setup,"wavetable",&wavetable,NULL); // get missing element info g_object_get(setup,"missing-machines",&missing_machines,NULL); g_object_get(wavetable,"missing-waves",&missing_waves,NULL); if(missing_machines || missing_waves) { printf("could not load all of song\"%s\"\n",input_file_name); } if(missing_machines) { puts("missing machines"); for(node=missing_machines;node;node=g_list_next(node)) { printf(" %s\n",(gchar *)(node->data)); } } if(missing_waves) { puts("missing waves"); for(node=missing_waves;node;node=g_list_next(node)) { printf(" %s\n",(gchar *)(node->data)); } } g_object_unref(setup); g_object_unref(wavetable); GST_INFO("start playback"); if(bt_cmd_application_play_song(self,song)) { res=TRUE; } else { GST_ERROR("could not play song \"%s\"",input_file_name); goto Error; } } else { GST_ERROR("could not load song \"%s\"",input_file_name); goto Error; } Error: g_object_try_unref(song); g_object_try_unref(loader); return(res); } /** * bt_cmd_application_info: * @self: the application instance to run * @input_file_name: the file to print information about * @output_file_name: the file to put informations from the input_file_name. * If the given file_name is NULL, stdout is used to print the informations. * * load the file of the supplied name and print information about it to stdout. * * Returns: %TRUE for success */ gboolean bt_cmd_application_info(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name) { gboolean res=FALSE; BtSong *song=NULL; BtSongIO *loader=NULL; FILE *output_file=NULL; g_return_val_if_fail(BT_IS_CMD_APPLICATION(self),FALSE); g_return_val_if_fail(BT_IS_STRING(input_file_name),FALSE); GST_INFO("application.info launched"); // choose appropriate output if (!BT_IS_STRING(output_file_name)) { output_file=stdout; } else { if(!(output_file = fopen(output_file_name,"wb"))) { GST_ERROR("cannot open output file \"%s\"",output_file_name); goto Error; } } // prepare song and song-io song=bt_cmd_application_song_init(self); if(!(loader=bt_song_io_from_file(input_file_name))) { goto Error; } GST_INFO("objects initialized"); if(bt_song_io_load(loader,song)) { BtSongInfo *song_info; BtSequence *sequence; BtSetup *setup; BtWavetable *wavetable; BtMachine *machine; gchar *name,*info,*author,*genre,*id,*create_dts,*change_dts; gulong beats_per_minute,ticks_per_beat; gulong length,tracks,n_patterns=0; gboolean loop; glong loop_start,loop_end; GList *machines,*wires,*patterns,*waves,*node; GList *missing_machines,*missing_waves; GstBin *bin; gulong msec,sec,min; //DEBUG //bt_song_write_to_highlevel_dot_file(song); //DEBUG g_object_get((gpointer)song,"song-info",&song_info,"sequence",&sequence,"setup",&setup,"wavetable",&wavetable,NULL); // get missing element info g_object_get(setup,"missing-machines",&missing_machines,NULL); g_object_get(wavetable,"missing-waves",&missing_waves,NULL); // print some info about the song g_object_get(song_info, "name",&name,"author",&author,"genre",&genre,"info",&info, "bpm",&beats_per_minute,"tpb",&ticks_per_beat, "create-dts",&create_dts,"change-dts",&change_dts, NULL); g_fprintf(output_file,"song.song_info.name: \"%s\"\n",name);g_free(name); g_fprintf(output_file,"song.song_info.author: \"%s\"\n",author);g_free(author); g_fprintf(output_file,"song.song_info.genre: \"%s\"\n",genre);g_free(genre); g_fprintf(output_file,"song.song_info.info: \"%s\"\n",info);g_free(info); g_fprintf(output_file,"song.song_info.bpm: %lu\n",beats_per_minute); g_fprintf(output_file,"song.song_info.tpb: %lu\n",ticks_per_beat); g_fprintf(output_file,"song.song_info.created: \"%s\"\n",create_dts);g_free(create_dts); g_fprintf(output_file,"song.song_info.changed: \"%s\"\n",change_dts);g_free(change_dts); // print some info about the sequence g_object_get(sequence,"length",&length,"tracks",&tracks,"loop",&loop,"loop-start",&loop_start,"loop-end",&loop_end,NULL); g_fprintf(output_file,"song.sequence.length: %lu\n",length); g_fprintf(output_file,"song.sequence.tracks: %lu\n",tracks); g_fprintf(output_file,"song.sequence.loop: %s\n",(loop?"yes":"no")); g_fprintf(output_file,"song.sequence.loop-start: %ld\n",loop_start); g_fprintf(output_file,"song.sequence.loop-end: %ld\n",loop_end); // print playing-time msec=(gulong)((length*bt_sequence_get_bar_time(sequence))/G_USEC_PER_SEC); min=(gulong)(msec/60000);msec-=(min*60000); sec=(gulong)(msec/ 1000);msec-=(sec* 1000); g_fprintf(output_file,"song.sequence.playing_time: %02lu:%02lu.%03lu\n",min,sec,msec); // print some statistics about the song (number of machines, wires, patterns) g_object_get(setup,"machines",&machines,"wires",&wires,NULL); g_fprintf(output_file,"song.setup.number_of_machines: %u\n",g_list_length(machines)); g_fprintf(output_file,"song.setup.number_of_wires: %u\n",g_list_length(wires)); for(node=machines;node;node=g_list_next(node)) { g_object_get(node->data,"patterns",&patterns,NULL); // @todo: this include internal ones n_patterns+=g_list_length(patterns); g_list_foreach(patterns,(GFunc)g_object_unref,NULL); g_list_free(patterns); } g_fprintf(output_file,"song.setup.number_of_patterns: %lu\n",n_patterns); g_fprintf(output_file,"song.setup.number_of_missing_machines: %u\n",g_list_length(missing_machines)); for(node=missing_machines;node;node=g_list_next(node)) { g_fprintf(output_file," %s\n",(gchar *)(node->data)); } g_list_free(machines); g_list_free(wires); g_object_get(wavetable,"waves",&waves,NULL); g_fprintf(output_file,"song.wavetable.number_of_waves: %u\n",g_list_length(waves)); g_fprintf(output_file,"song.wavetable.number_of_missing_waves: %u\n",g_list_length(missing_waves)); for(node=missing_waves;node;node=g_list_next(node)) { g_fprintf(output_file," %s\n",(gchar *)(node->data)); } g_list_free(waves); g_object_get((gpointer)self,"bin",&bin,NULL); g_fprintf(output_file,"app.bin.number_of_elements: %u\n",GST_BIN_NUMCHILDREN(bin)); gst_object_unref(bin); // lookup the audio-sink machine and print some info about it if((machine=bt_setup_get_machine_by_type(setup,BT_TYPE_SINK_MACHINE))) { g_object_get(machine,"id",&id,"plugin_name",&name,NULL); g_fprintf(output_file,"machine.id: \"%s\"\n",id);g_free(id); g_fprintf(output_file,"machine.plugin_name: \"%s\"\n",name);g_free(name); g_object_unref(machine); } // release the references g_object_unref(song_info); g_object_unref(sequence); g_object_unref(setup); g_object_unref(wavetable); res=TRUE; GST_INFO("finished successfully"); } else { GST_ERROR("could not load song \"%s\"",input_file_name); goto Error; } Error: g_object_try_unref(song); g_object_try_unref(loader); if (output_file) { fclose(output_file); } return(res); } /** * bt_cmd_application_convert: * @self: the application instance to run * @input_file_name: the file to read in * @output_file_name: the file to generate * * Load the file of the supplied name and convert it into a buzztard song file. * The type of the input file is automatically determined. * * Returns: %TRUE for success */ gboolean bt_cmd_application_convert(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name) { gboolean res=FALSE; BtSong *song=NULL; BtSongIO *loader=NULL,*saver=NULL; g_return_val_if_fail(BT_IS_CMD_APPLICATION(self),FALSE); g_return_val_if_fail(BT_IS_STRING(input_file_name),FALSE); g_return_val_if_fail(BT_IS_STRING(output_file_name),FALSE); // prepare song and song-io song=bt_cmd_application_song_init(self); if(!(loader=bt_song_io_from_file(input_file_name))) { goto Error; } if(!(saver=bt_song_io_from_file(output_file_name))) { goto Error; } GST_INFO("objects initialized"); if(bt_song_io_load(loader,song)) { if(bt_song_io_save(saver,song)) { res=TRUE; } else { GST_ERROR("could not save song \"%s\"",output_file_name); } } else { GST_ERROR("could not load song \"%s\"",input_file_name); } Error: g_object_try_unref(song); g_object_try_unref(loader); g_object_try_unref(saver); return(res); } /** * bt_cmd_application_encode: * @self: the application instance to run * @input_file_name: the file to read in * @output_file_name: the file to generate * * Load the file of the supplied name and encode it as an audio file. * The type of the output file is automatically determined from the filename * extension. * * Returns: %TRUE for success */ gboolean bt_cmd_application_encode(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name) { gboolean res=FALSE; BtSong *song=NULL; BtSongIO *loader=NULL; g_return_val_if_fail(BT_IS_CMD_APPLICATION(self),FALSE); g_return_val_if_fail(BT_IS_STRING(input_file_name),FALSE); g_return_val_if_fail(BT_IS_STRING(output_file_name),FALSE); GST_INFO("application.play launched"); // prepare song and song-io song=bt_cmd_application_song_init(self); if(!(loader=bt_song_io_from_file(input_file_name))) { goto Error; } GST_INFO("objects initialized"); if(bt_song_io_load(loader,song)) { if(bt_cmd_application_prepare_encoding(self,song,output_file_name)) { GST_INFO("start encoding"); if(bt_cmd_application_play_song(self,song)) { res=TRUE; } else { GST_ERROR("could not play song \"%s\"",input_file_name); goto Error; } } else { GST_ERROR("could switch to record mode"); goto Error; } } else { GST_ERROR("could not load song \"%s\"",input_file_name); goto Error; } Error: g_object_try_unref(song); g_object_try_unref(loader); return(res); } //-- wrapper //-- class internals /* sets the given properties for this object */ static void bt_cmd_application_set_property(GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { BtCmdApplication *self = BT_CMD_APPLICATION(object); return_if_disposed(); switch (property_id) { case CMD_APP_QUIET: { self->priv->quiet = g_value_get_boolean(value); } break; default: { G_OBJECT_WARN_INVALID_PROPERTY_ID(object,property_id,pspec); } break; } } static void bt_cmd_application_dispose(GObject *object) { BtCmdApplication *self = BT_CMD_APPLICATION(object); return_if_disposed(); self->priv->dispose_has_run = TRUE; GST_DEBUG("!!!! self=%p",self); G_OBJECT_CLASS(bt_cmd_application_parent_class)->dispose(object); } static void bt_cmd_application_finalize(GObject *object) { BtCmdApplication *self = BT_CMD_APPLICATION(object); GST_DEBUG("!!!! self=%p",self); // this would exit the mainloop from a different thread :/ //g_main_loop_quit(self->priv->loop); g_main_loop_unref(self->priv->loop); G_OBJECT_CLASS(bt_cmd_application_parent_class)->finalize(object); } static void bt_cmd_application_init(BtCmdApplication *self) { GST_DEBUG("!!!! self=%p",self); self->priv = G_TYPE_INSTANCE_GET_PRIVATE(self, BT_TYPE_CMD_APPLICATION, BtCmdApplicationPrivate); self->priv->loop=g_main_loop_new(NULL,FALSE); //self->priv->loop_thread=g_thread_create((GThreadFunc)g_main_loop_run,self->priv->loop,FALSE,NULL); } static void bt_cmd_application_class_init(BtCmdApplicationClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); GST_DEBUG("!!!!"); g_type_class_add_private(klass,sizeof(BtCmdApplicationPrivate)); gobject_class->set_property = bt_cmd_application_set_property; gobject_class->dispose = bt_cmd_application_dispose; gobject_class->finalize = bt_cmd_application_finalize; g_object_class_install_property(gobject_class,CMD_APP_QUIET, g_param_spec_boolean("quiet", "quiet prop", "tell wheter the app should do output or not", FALSE, G_PARAM_WRITABLE|G_PARAM_STATIC_STRINGS)); } buzztard-0.6.0/src/ui/cmd/bt-cmd.c0000644042355400116100000001302111666764274013612 00000000000000/* $Id: bt-cmd.c 3748 2011-12-04 21:40:12Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /** * SECTION:btcmd * @short_description: buzztard commandline tool * @see_also: #BtCmdApplication * * Implements the body of the buzztard commandline tool. * * You can try to run the uninstalled program via * * libtool --mode=execute buzztard-cmd --command=info --input-file=<filename> * * to enable debug output add: * * --gst-debug="*:2,bt-*:3" for not-so-much-logdata or * --gst-debug="*:2,bt-*:4" for a-lot-of-log-data * * * Example songs can be found in ./test/songs/. */ #define BT_CMD #define BT_CMD_C #include "bt-cmd.h" static void usage(int argc, char **argv, GOptionContext *ctx) { #if GLIB_CHECK_VERSION(2,14,0) gchar *help=g_option_context_get_help(ctx, TRUE, NULL); puts(help); g_free(help); #endif } int main(int argc, char **argv) { gboolean res=FALSE; gboolean arg_version=FALSE; gboolean arg_quiet=FALSE; gchar *command=NULL,*input_file_name=NULL,*output_file_name=NULL; BtCmdApplication *app; GOptionContext *ctx; GOptionGroup *group; GError *err=NULL; #ifdef ENABLE_NLS setlocale(LC_ALL, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #endif /* ENABLE_NLS */ static GOptionEntry options[] = { {"version", '\0', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_NONE, NULL, N_("Print application version"), NULL }, {"quiet", 'q', G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_NONE, NULL, N_("Be quiet"), NULL }, {"command", 'c', 0, G_OPTION_ARG_STRING, NULL, N_("Command name"), "{info, play, convert, encode}" }, {"input-file", 'i', 0, G_OPTION_ARG_FILENAME, NULL, N_("Input file name"), N_("") }, {"output-file", 'o', 0, G_OPTION_ARG_FILENAME, NULL, N_("Output file name"), N_("") }, {NULL} }; // setting this separately gets us from 76 to 10 instructions options[0].arg_data=&arg_version; options[1].arg_data=&arg_quiet; options[2].arg_data=&command; options[3].arg_data=&input_file_name; options[4].arg_data=&output_file_name; #if !GLIB_CHECK_VERSION (2, 31, 0) // initialize as soon as possible if(!g_thread_supported()) { g_thread_init(NULL); } #endif // init libraries ctx = g_option_context_new(NULL); //g_option_context_add_main_entries(ctx, options, GETTEXT_PACKAGE); group=g_option_group_new("main", _("buzztard-cmd options"),_("Show buzztard-cmd options"), argv[0], NULL); g_option_group_add_entries(group, options); g_option_group_set_translation_domain(group, GETTEXT_PACKAGE); g_option_context_set_main_group(ctx, group); bt_init_add_option_groups(ctx); g_option_context_add_group(ctx, btic_init_get_option_group()); if(!g_option_context_parse(ctx, &argc, &argv, &err)) { g_print("Error initializing: %s\n", safe_string(err->message)); g_option_context_free(ctx); exit(1); } if(arg_version) { g_printf("%s from "PACKAGE_STRING"\n",argv[0]); res=TRUE; goto Done; } if(!command) { usage(argc, argv, ctx); goto Done; } GST_DEBUG_CATEGORY_INIT(GST_CAT_DEFAULT, "bt-cmd", 0, "music production environment / command ui"); GST_INFO("starting: command=\"%s\" input=\"%s\" output=\"%s\"", command, input_file_name, output_file_name); // give some global context info g_set_application_name("Buzztard"); g_setenv("PULSE_PROP_application.icon_name", "buzztard", TRUE); g_setenv("PULSE_PROP_media.role", "production", TRUE); app=bt_cmd_application_new(arg_quiet); // depending on the popt options call the correct method if(!strcmp(command,"p") || !strcmp(command,"play")) { if(!input_file_name) usage(argc, argv, ctx); res=bt_cmd_application_play(app,input_file_name); } else if(!strcmp(command,"i") || !strcmp(command,"info")) { if(!input_file_name) usage(argc, argv, ctx); res=bt_cmd_application_info(app,input_file_name, output_file_name); } else if(!strcmp(command,"c") || !strcmp(command,"convert")) { if(!input_file_name || !output_file_name) usage(argc, argv, ctx); res=bt_cmd_application_convert(app,input_file_name,output_file_name); } else if(!strcmp(command,"e") ||!strcmp(command,"encode")) { if(!input_file_name || !output_file_name) usage(argc, argv, ctx); res=bt_cmd_application_encode(app,input_file_name,output_file_name); } else usage(argc, argv, ctx); // free application g_object_unref(app); Done: g_free(command); g_free(input_file_name); g_free(output_file_name); g_option_context_free(ctx); return(!res); } buzztard-0.6.0/src/ui/cmd/bt-cmd.h0000644042355400116100000000417311625553627013620 00000000000000/* $Id: bt-cmd.h 3607 2011-08-25 23:15:35Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CMD_H #define BT_CMD_H #ifdef HAVE_CONFIG_H # include "config.h" #endif //-- ansi c //#define __USE_ISOC99 /* for round() and co. */ #include #include #include #include //-- locale #ifdef HAVE_X11_XLOCALE_H /* defines a more portable setlocale for X11 (_Xsetlocale) */ #include #else #include #endif //-- i18n #ifndef _ #ifdef ENABLE_NLS #include #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define __(String) (String) #define N_(String) (String) #ifdef gettext #undef gettext #endif #define gettext(String) (String) #ifdef dgettext #undef dgettext #endif #define dgettext(Domain,String) (String) #define textdomain(Domain) #define bindtextdomain(Package, Directory) #endif #endif //-- libbtcore #include #include "cmd-application.h" //-- misc #ifndef GST_CAT_DEFAULT #define GST_CAT_DEFAULT bt_cmd_debug #endif #if defined(BT_CMD) && !defined(BT_CMD_APPLICATION_C) GST_DEBUG_CATEGORY_EXTERN(GST_CAT_DEFAULT); #endif #endif // BT_CMD_H buzztard-0.6.0/src/ui/cmd/Makefile.in0000644042355400116100000005637711675570634014365 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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@ bin_PROGRAMS = buzztard-cmd$(EXEEXT) subdir = src/ui/cmd DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libbtcmd_la_LIBADD = am_libbtcmd_la_OBJECTS = cmd-application.lo libbtcmd_la_OBJECTS = $(am_libbtcmd_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_buzztard_cmd_OBJECTS = bt-cmd.$(OBJEXT) buzztard_cmd_OBJECTS = $(am_buzztard_cmd_OBJECTS) am__DEPENDENCIES_1 = buzztard_cmd_DEPENDENCIES = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la libbtcmd.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbtcmd_la_SOURCES) $(buzztard_cmd_SOURCES) DIST_SOURCES = $(libbtcmd_la_SOURCES) $(buzztard_cmd_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ buzztard_cmd_LDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ libbtcmd.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) buzztard_cmd_SOURCES = \ bt-cmd.c bt-cmd.h noinst_LTLIBRARIES = libbtcmd.la libbtcmd_la_LIBDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) libbtcmd_la_SOURCES = \ cmd-application.c cmd-application.h AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) AM_LDFLAGS = $(BT_LDFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 src/ui/cmd/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ui/cmd/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbtcmd.la: $(libbtcmd_la_OBJECTS) $(libbtcmd_la_DEPENDENCIES) $(AM_V_CCLD)$(LINK) $(libbtcmd_la_OBJECTS) $(libbtcmd_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ 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 installcheck-binPROGRAMS: $(bin_PROGRAMS) bad=0; pid=$$$$; list="$(bin_PROGRAMS)"; for p in $$list; do \ case ' $(AM_INSTALLCHECK_STD_OPTIONS_EXEMPT) ' in \ *" $$p "* | *" $(srcdir)/$$p "*) continue;; \ esac; \ f=`echo "$$p" | \ sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ for opt in --help --version; do \ if "$(DESTDIR)$(bindir)/$$f" $$opt >c$${pid}_.out \ 2>c$${pid}_.err &2; bad=1; fi; \ done; \ done; rm -f c$${pid}_.???; exit $$bad buzztard-cmd$(EXEEXT): $(buzztard_cmd_OBJECTS) $(buzztard_cmd_DEPENDENCIES) @rm -f buzztard-cmd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(buzztard_cmd_OBJECTS) $(buzztard_cmd_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bt-cmd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd-application.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool \ clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags 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-binPROGRAMS 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: installcheck-binPROGRAMS maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ 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 installcheck-binPROGRAMS \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcmd_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/ui/cmd/cmd-application.h0000644042355400116100000000527211625553433015512 00000000000000/* $Id: cmd-application.h 3606 2011-08-25 23:13:30Z ensonic $ * * Buzztard * Copyright (C) 2006 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_CMD_APPLICATION_H #define BT_CMD_APPLICATION_H #include #include #define BT_TYPE_CMD_APPLICATION (bt_cmd_application_get_type ()) #define BT_CMD_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), BT_TYPE_CMD_APPLICATION, BtCmdApplication)) #define BT_CMD_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BT_TYPE_CMD_APPLICATION, BtCmdApplicationClass)) #define BT_IS_CMD_APPLICATION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BT_TYPE_CMD_APPLICATION)) #define BT_IS_CMD_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BT_TYPE_CMD_APPLICATION)) #define BT_CMD_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BT_TYPE_CMD_APPLICATION, BtCmdApplicationClass)) /* type macros */ typedef struct _BtCmdApplication BtCmdApplication; typedef struct _BtCmdApplicationClass BtCmdApplicationClass; typedef struct _BtCmdApplicationPrivate BtCmdApplicationPrivate; /** * BtCmdApplication: * * #BtApplication subclass for the commandline application */ struct _BtCmdApplication { BtApplication parent; /*< private >*/ BtCmdApplicationPrivate *priv; }; struct _BtCmdApplicationClass { BtApplicationClass parent; }; GType bt_cmd_application_get_type(void) G_GNUC_CONST; BtCmdApplication *bt_cmd_application_new(gboolean quiet); gboolean bt_cmd_application_play(const BtCmdApplication *self, const gchar *input_file_name); gboolean bt_cmd_application_info(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name); gboolean bt_cmd_application_convert(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name); gboolean bt_cmd_application_encode(const BtCmdApplication *self, const gchar *input_file_name, const gchar *output_file_name); #endif // BT_CMD_APPLICATION_H buzztard-0.6.0/src/ui/cmd/Makefile.am0000644042355400116100000000311511673621756014332 00000000000000## Makefile.am for src/ui/cmd bin_PROGRAMS=buzztard-cmd buzztard_cmd_LDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ libbtcmd.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) buzztard_cmd_SOURCES= \ bt-cmd.c bt-cmd.h noinst_LTLIBRARIES = libbtcmd.la libbtcmd_la_LIBDADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(BT_LIBS) $(LIBM) libbtcmd_la_SOURCES = \ cmd-application.c cmd-application.h AM_CPPFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(BASE_DEPS_CFLAGS) \ $(BT_CFLAGS) AM_LDFLAGS = $(BT_LDFLAGS) .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcmd_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/ui/dec/0000755042355400116100000000000011675570676012354 500000000000000buzztard-0.6.0/src/ui/dec/bt-dec.h0000644042355400116100000000374611576360376013607 00000000000000/* $Id: bt-dec.h 2914 2010-08-07 18:41:51Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef BT_DEC_H__ #define BT_DEC_H__ #include #include #include #include G_BEGIN_DECLS #define BT_TYPE_DEC (bt_dec_get_type()) #define BT_DEC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),BT_TYPE_DEC,BtDec)) #define BT_IS_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),BT_TYPE_DEC)) #define BT_DEC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass) ,BT_TYPE_DEC,BtDecClass)) #define BT_IS_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,BT_TYPE_DEC)) #define BT_DEC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj) ,BT_TYPE_DEC,BtDecClass)) typedef struct _BtDec BtDec; typedef struct _BtDecClass BtDecClass; /** * BtDec: * * Class instance data. */ struct _BtDec { GstElement parent; GstPad *sinkpad, *srcpad, *binpad; /* raw song data */ GstAdapter *adapter; guint64 offset; BtApplication *app; BtSong *song; GstBin *bin; GstEvent *newsegment_event; GstSegment segment; }; struct _BtDecClass { GstElementClass parent_class; }; GType bt_dec_get_type(void); G_END_DECLS #endif /*BT_DEC_H__ */buzztard-0.6.0/src/ui/dec/Makefile.in0000644042355400116100000005725211675570634014346 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/ui/dec DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = 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__installdirs = "$(DESTDIR)$(plugindir)" LTLIBRARIES = $(plugin_LTLIBRARIES) am__DEPENDENCIES_1 = libbuzztarddec_la_DEPENDENCIES = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) am_libbuzztarddec_la_OBJECTS = libbuzztarddec_la-bt-dec.lo libbuzztarddec_la_OBJECTS = $(am_libbuzztarddec_la_OBJECTS) AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent libbuzztarddec_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libbuzztarddec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \ $(CCLD) $(libbuzztarddec_la_CFLAGS) $(CFLAGS) \ $(libbuzztarddec_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles 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_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ 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_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; SOURCES = $(libbuzztarddec_la_SOURCES) DIST_SOURCES = $(libbuzztarddec_la_SOURCES) HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ plugin_LTLIBRARIES = libbuzztarddec.la # sources used to compile this plug-in libbuzztarddec_la_SOURCES = bt-dec.c # flags used to compile this plugin libbuzztarddec_la_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(GST_PLUGIN_CFLAGS) \ $(BASE_DEPS_CFLAGS) libbuzztarddec_la_LIBADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(LIBM) libbuzztarddec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libbuzztarddec_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = bt-dec.h all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(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 src/ui/dec/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ui/dec/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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): install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES) @$(NORMAL_INSTALL) test -z "$(plugindir)" || $(MKDIR_P) "$(DESTDIR)$(plugindir)" @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \ } uninstall-pluginLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \ done clean-pluginLTLIBRARIES: -test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES) @list='$(plugin_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libbuzztarddec.la: $(libbuzztarddec_la_OBJECTS) $(libbuzztarddec_la_DEPENDENCIES) $(AM_V_CCLD)$(libbuzztarddec_la_LINK) -rpath $(plugindir) $(libbuzztarddec_la_OBJECTS) $(libbuzztarddec_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libbuzztarddec_la-bt-dec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libbuzztarddec_la-bt-dec.lo: bt-dec.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libbuzztarddec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztarddec_la_CFLAGS) $(CFLAGS) -MT libbuzztarddec_la-bt-dec.lo -MD -MP -MF $(DEPDIR)/libbuzztarddec_la-bt-dec.Tpo -c -o libbuzztarddec_la-bt-dec.lo `test -f 'bt-dec.c' || echo '$(srcdir)/'`bt-dec.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libbuzztarddec_la-bt-dec.Tpo $(DEPDIR)/libbuzztarddec_la-bt-dec.Plo @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='bt-dec.c' object='libbuzztarddec_la-bt-dec.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) $(AM_V_lt) --tag=CC $(libbuzztarddec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libbuzztarddec_la_CFLAGS) $(CFLAGS) -c -o libbuzztarddec_la-bt-dec.lo `test -f 'bt-dec.c' || echo '$(srcdir)/'`bt-dec.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(plugindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-am clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-pluginLTLIBRARIES 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 -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pluginLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-pluginLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags 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-pluginLTLIBRARIES \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-pluginLTLIBRARIES .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcmd_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/ui/dec/bt-dec.c0000644042355400116100000005630011576360376013574 00000000000000/* $Id: bt-dec.c 3370 2011-05-13 13:07:04Z ensonic $ * * Buzztard * Copyright (C) 2010 Buzztard team * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* * GST_DEBUG="*:3,bt*:4" gst-launch-0.10 -v filesrc location=$HOME/buzztard/share/buzztard/songs/303.bzt ! bt-bin ! fakesink * GST_DEBUG="*:3,bt*:4" gst-launch-0.10 -v filesrc location=$HOME/buzztard/share/buzztard/songs/303.bzt ! typefind ! buzztard-dec ! fakesink * GST_DEBUG="*:3,bt*:4" gst-launch-0.10 playbin2 uri=file://$HOME/buzztard/share/buzztard/songs/303.bzt * GST_DEBUG="*:2,play*:3,bt*:4" gst-launch-0.10 playbin2 uri=file://$HOME/buzztard/share/buzztard/songs/303.bzt * ~/projects/gstreamer/gst-plugins-base/tests/examples/seek/.libs/seek 16 file:///home/ensonic/buzztard/share/buzztard/songs/lac2010_01a.bzt * * GST_DEBUG="*:3,bt*:4,*type*:4" gst-launch-0.10 -v -m filesrc location=$HOME/buzztard/share/buzztard/songs/303.bzt ! typefind ! fakesink * GST_DEBUG="*:2,bt*:4,*type*:5,default:5" gst-launch-0.10 filesrc location=$HOME/buzztard/share/buzztard/songs/303.bzt ! typefind ! fakesink * * gst-typefind $HOME/buzztard/share/buzztard/songs/303.bzt */ /* - description: * - we use a fakesink in sink-bin * - we take the buffers from it and push them on our src pad * - this way we can keep the song-as a top-level pipeline. * - todo * - check for stopped and send eos? * - change bt-bin to be a normal GstElement (no need to be a bin) * - issues * - we depend on a running main-loop (for notify::is-playing) */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "bt-dec.h" #include #define GST_CAT_DEFAULT bt_dec_debug GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT); static GstStaticPadTemplate bt_dec_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-buzztard") ); static GstStaticPadTemplate bt_dec_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_SOMETIMES, GST_STATIC_CAPS ( "audio/x-raw-float, " "width = (int) 32, " "rate = (int) [ 1, MAX ], " "channels = (int) [1, 2], " "endianness = (int) BYTE_ORDER" ) ); //-- local application subclass #define BT_TYPE_DEC_APPLICATION (bt_dec_application_get_type ()) typedef struct _BtDecApplication { const BtApplication parent; } BtDecApplication; typedef struct _BtDecApplicationClass { const BtApplicationClass parent; } BtDecApplicationClass; G_DEFINE_TYPE (BtDecApplication, bt_dec_application, BT_TYPE_APPLICATION); static void bt_dec_application_init(BtDecApplication *self) { } static void bt_dec_application_class_init(BtDecApplicationClass *klass) { } //-- the element class GST_BOILERPLATE (BtDec, bt_dec, GstElement, GST_TYPE_ELEMENT); static gboolean bt_dec_src_query (GstPad * pad, GstQuery * query) { gboolean res = TRUE; BtDec *self = BT_DEC (gst_pad_get_parent (pad)); if (!self->song) { gst_object_unref (self); return FALSE; } switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: { gst_query_set_duration (query, self->segment.format, self->segment.duration); break; } default: res = gst_element_query (GST_ELEMENT (self->bin), query); break; } g_object_unref (self); return res; } static gboolean bt_dec_do_seek (BtDec *self, GstEvent * event) { gdouble rate; GstFormat src_format; GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; GstEvent *tevent; guint32 seqnum; if (!self->song) return FALSE; gst_event_parse_seek (event, &rate, &src_format, &flags, &start_type, &start, &stop_type, &stop); if ((start_type == GST_SEEK_TYPE_SET) && (src_format == GST_FORMAT_TIME)) { BtSequence *sequence; gulong row; gboolean flush; GstClockTime bar_time; GstSegment seeksegment; gboolean update; flush = ((flags & GST_SEEK_FLAG_FLUSH) == GST_SEEK_FLAG_FLUSH); seqnum = gst_event_get_seqnum (event); memcpy (&seeksegment, &self->segment, sizeof (GstSegment)); if (flush) { GST_DEBUG_OBJECT (self, "flush start"); tevent = gst_event_new_flush_start (); gst_event_set_seqnum (tevent, seqnum); gst_pad_push_event (self->srcpad, tevent); } /* seek */ g_object_get (self->song, "sequence", &sequence, NULL); bar_time = bt_sequence_get_bar_time (sequence); row = (gulong) (start / bar_time); g_object_set (self->song,"play-pos",row,"play-rate",rate,NULL); g_object_unref (sequence); GST_INFO_OBJECT (self, "seeked to sequence row %lu", row); start = row * bar_time; if (flush) { GST_DEBUG_OBJECT (self, "flush stop"); tevent = gst_event_new_flush_stop (); gst_event_set_seqnum (tevent, seqnum); gst_pad_push_event (self->srcpad, tevent); } /* update our real segment */ GST_OBJECT_LOCK (self); memcpy (&self->segment, &seeksegment, sizeof (GstSegment)); GST_OBJECT_UNLOCK (self); /* prepare newsegment event */ gst_segment_set_seek (&seeksegment, rate, src_format, flags, start_type, start, stop_type, stop, &update); /* for deriving a stop position for the playback segment from the seek * segment, we must take the duration when the stop is not set */ if ((stop = seeksegment.stop) == -1) stop = seeksegment.duration; if (self->newsegment_event) gst_event_unref (self->newsegment_event); if (seeksegment.rate >= 0.0) { self->newsegment_event = gst_event_new_new_segment_full (FALSE, seeksegment.rate, seeksegment.applied_rate, seeksegment.format, seeksegment.last_stop, stop, seeksegment.time); } else { self->newsegment_event = gst_event_new_new_segment_full (FALSE, seeksegment.rate, seeksegment.applied_rate, seeksegment.format, seeksegment.start, seeksegment.last_stop, seeksegment.time); } gst_event_set_seqnum (self->newsegment_event, seqnum); GST_INFO_OBJECT (self, "newsegment event prepared %" GST_PTR_FORMAT, self->newsegment_event); return TRUE; } else { GST_INFO_OBJECT (self, "not seeking seeking, wrong type %d or format %d", start_type, src_format); } return FALSE; } static gboolean bt_dec_src_event (GstPad * pad, GstEvent * event) { gboolean res = FALSE; BtDec *self = BT_DEC (gst_pad_get_parent (pad)); GST_INFO_OBJECT (pad, "event received %" GST_PTR_FORMAT, event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: res = bt_dec_do_seek (self, event); break; default: res = gst_pad_push_event (self->sinkpad, event); break; } g_object_unref (self); return res; } static void on_song_is_playing_notify (const BtSong *song, GParamSpec *arg, gpointer user_data) { BtDec *self = BT_DEC (user_data); gboolean is_playing; g_object_get ((gpointer)song, "is-playing", &is_playing,NULL); GST_INFO_OBJECT (self, "is_playing: %d", is_playing); if(!is_playing) { GST_INFO_OBJECT (self, "sending eos"); gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } } static gboolean bt_dec_move_buffer (GstPad *pad, GstMiniObject *mini_obj, gpointer user_data) { BtDec *self = BT_DEC (user_data); GstBuffer *buf = (GstBuffer *)mini_obj; GstClockTime start, duration; gint64 position; if (G_UNLIKELY (self->newsegment_event)) { gst_pad_push_event (self->srcpad, self->newsegment_event); self->newsegment_event = NULL; } /* update segment */ start = GST_BUFFER_TIMESTAMP (buf); duration = GST_BUFFER_DURATION (buf); if (GST_CLOCK_TIME_IS_VALID (start)) position = start; else position = self->segment.last_stop; if (GST_CLOCK_TIME_IS_VALID (duration)) { if (self->segment.rate >= 0.0) position += duration; else if (position > duration) position -= duration; else position = 0; } if (G_LIKELY (position < self->segment.duration)) { GST_OBJECT_LOCK (self); gst_segment_set_last_stop (&self->segment, self->segment.format, position); GST_OBJECT_UNLOCK (self); gst_pad_push (self->srcpad, gst_buffer_ref (buf)); } else { gst_pad_push_event (self->srcpad, gst_event_new_eos ()); } /* don't push further */ return FALSE; } static gboolean bt_dec_move_event (GstPad *pad, GstMiniObject *mini_obj, gpointer user_data) { BtDec *self = BT_DEC (user_data); GstEvent *event = (GstEvent *)mini_obj; GST_INFO_OBJECT (pad, "forwarding event %" GST_PTR_FORMAT, mini_obj); if (GST_EVENT_IS_DOWNSTREAM (event)) { switch (GST_EVENT_TYPE (event)) { /* case GST_EVENT_FLUSH_START: case GST_EVENT_FLUSH_STOP: // eat flush events to avoid duplicates ? break; */ default: gst_pad_push_event (self->srcpad, gst_event_ref (event)); break; } } return TRUE; } static gboolean bt_dec_load_song (BtDec *self) { gboolean res=FALSE; BtSongIO *loader=NULL; GstCaps *caps; GstStructure *s; const gchar *media_type = "audio/x-buzztard"; guint len; gpointer data; caps = GST_PAD_CAPS (self->sinkpad); GST_INFO_OBJECT (self, "input caps %" GST_PTR_FORMAT, caps); if (caps) { if (!GST_CAPS_IS_SIMPLE (caps)) goto Error; s = gst_caps_get_structure (caps,0); media_type = gst_structure_get_string (s, "format"); } GST_INFO_OBJECT (self, "about to load buzztard song in %s format", media_type); /* create song-loader */ len = gst_adapter_available (self->adapter); data = (gpointer)gst_adapter_take (self->adapter, len); if ((loader = bt_song_io_from_data (data, len, media_type))) { if (bt_song_io_load (loader, self->song)) { BtSetup *setup; BtSequence *sequence; BtMachine *machine; g_object_get (self->song,"setup",&setup,"sequence",&sequence,NULL); /* turn off lopps in any case */ g_object_set (sequence, "loop", FALSE, NULL); GST_OBJECT_LOCK (self); gst_segment_set_duration (&self->segment, GST_FORMAT_TIME, bt_sequence_get_loop_time (sequence)); GST_OBJECT_UNLOCK (self); if((machine = bt_setup_get_machine_by_type (setup, BT_TYPE_SINK_MACHINE))) { BtSinkBin *sink_bin; GstPad *target_pad; GstPad *probe_pad; GstElementClass *klass = GST_ELEMENT_GET_CLASS (self); GstElement *fakesink; g_object_get (machine,"machine",&sink_bin,NULL); g_object_set (sink_bin, "mode", BT_SINK_BIN_MODE_PASS_THRU, NULL); target_pad = gst_element_get_pad (GST_ELEMENT (sink_bin), "src"); /* bahh, dirty ! */ fakesink = gst_element_factory_make ("fakesink", NULL); /* otherwise the song is not starting .. */ g_object_set (fakesink, "async", FALSE, "enable-last-buffer", FALSE, "silent", TRUE, /*"sync", TRUE, */ NULL); gst_bin_add (GST_BIN (machine), fakesink); probe_pad = gst_element_get_pad (fakesink, "sink"); gst_pad_link (target_pad, probe_pad); gst_pad_add_buffer_probe (probe_pad, (GCallback)bt_dec_move_buffer, (gpointer)self); gst_pad_add_event_probe (probe_pad, (GCallback)bt_dec_move_event, (gpointer)self); gst_object_unref (probe_pad); gst_object_unref (target_pad); self->srcpad = gst_pad_new_from_template ( gst_element_class_get_pad_template (klass, "src"), "src"); gst_pad_set_query_function (self->srcpad, bt_dec_src_query); gst_pad_set_event_function (self->srcpad, bt_dec_src_event); gst_pad_set_active (self->srcpad, TRUE); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); gst_element_no_more_pads (GST_ELEMENT (self)); GST_INFO_OBJECT (self, "ghost pad connected"); self->newsegment_event = gst_event_new_new_segment_full (FALSE, self->segment.rate, self->segment.applied_rate, self->segment.format, G_GUINT64_CONSTANT(0), self->segment.duration, G_GUINT64_CONSTANT(0)); GST_INFO_OBJECT (self, "prepared initial new segment"); gst_object_unref (sink_bin); g_object_unref (machine); res = TRUE; } g_object_unref (sequence); g_object_unref (setup); } } g_free (data); Error: if (loader) { g_object_unref (loader); } return res; } static gboolean bt_dec_sink_event (GstPad * pad, GstEvent * event) { gboolean res = FALSE; BtDec *self = BT_DEC (gst_pad_get_parent (pad)); GST_INFO_OBJECT (pad, "event received %" GST_PTR_FORMAT, event); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: GST_DEBUG_OBJECT (self, "song loaded"); /* parse the song */ bt_dec_load_song (self); /* don't forward the event */ gst_event_unref (event); break; default: if(self->srcpad) { res = gst_pad_push_event (self->srcpad, event); } else { gst_event_unref (event); } break; } gst_object_unref (pad); return res; } static GstFlowReturn bt_dec_chain (GstPad * sinkpad, GstBuffer * buffer) { BtDec *self = BT_DEC (GST_PAD_PARENT (sinkpad)); GST_DEBUG_OBJECT (self, "loading song"); /* push stuff in the adapter, we will start doing something in the sink event * handler when we get EOS */ gst_adapter_push (self->adapter, buffer); return GST_FLOW_OK; } static void bt_dec_loop (GstPad * sinkpad) { BtDec *self = BT_DEC (GST_PAD_PARENT (sinkpad)); GstFlowReturn ret; GstBuffer *buffer; GST_DEBUG_OBJECT (self, "loading song ..."); ret = gst_pad_pull_range (self->sinkpad, self->offset, -1, &buffer); if (ret == GST_FLOW_UNEXPECTED) { GST_DEBUG_OBJECT (self, "song loaded"); /* parse the song */ if (bt_dec_load_song (self)) { GST_DEBUG_OBJECT (self, "start to play"); bt_song_play (self->song); } ret = GST_FLOW_OK; goto pause; } else if (ret != GST_FLOW_OK) { GST_ELEMENT_ERROR (self, STREAM, DECODE, (NULL), ("Unable to read song")); goto pause; } else { GST_DEBUG_OBJECT (self, "pushing buffer"); gst_adapter_push (self->adapter, buffer); self->offset += GST_BUFFER_SIZE (buffer); } return; pause: { const gchar *reason = gst_flow_get_name (ret); GstEvent *event; GST_DEBUG_OBJECT (self, "pausing task, reason %s", reason); gst_pad_pause_task (sinkpad); #if 0 /* this is never executed, see above */ if (ret == GST_FLOW_UNEXPECTED) { if (self->segment.flags & GST_SEEK_FLAG_SEGMENT) { gint64 stop; GstMessage *message; /* for segment playback we need to post when (in stream time) * we stopped, this is either stop (when set) or the duration. */ if ((stop = self->segment.stop) == -1) stop = self->segment.duration; GST_LOG_OBJECT (self, "Sending segment done, at end of segment"); message = gst_message_new_segment_done (GST_OBJECT (self), GST_FORMAT_TIME, stop); gst_element_post_message (GST_ELEMENT (self), message); } else { /* perform EOS logic */ GST_LOG_OBJECT (self, "Sending EOS, at end of stream"); event = gst_event_new_eos (); gst_pad_push_event (self->srcpad, event); } } else #endif if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { event = gst_event_new_eos (); /* for fatal errors we post an error message, post the error * first so the app knows about the error first. */ GST_ELEMENT_ERROR (self, STREAM, FAILED, ("Internal data flow error."), ("streaming task paused, reason %s (%d)", reason, ret)); gst_pad_push_event (self->srcpad, event); } } } static gboolean bt_dec_activate (GstPad * sinkpad) { gboolean res; if (gst_pad_check_pull_range (sinkpad)) { res = gst_pad_activate_pull (sinkpad, TRUE); GST_INFO_OBJECT (sinkpad, "activating in pull mode: %d", res); } else { res = gst_pad_activate_push (sinkpad, TRUE); GST_INFO_OBJECT (sinkpad, "activating in push mode: %d", res); } return res; } static gboolean bt_dec_activatepull (GstPad * pad, gboolean active) { if (active) { return gst_pad_start_task (pad, (GstTaskFunction) bt_dec_loop, pad); } else { return gst_pad_stop_task (pad); } } static void bt_dec_reset (BtDec *self) { GST_INFO_OBJECT (self, "reset"); self->offset = 0; //self->discont = FALSE; gst_adapter_clear (self->adapter); gst_event_replace (&self->newsegment_event, NULL); if (self->srcpad) { gst_pad_set_active (self->srcpad, FALSE); gst_element_remove_pad (GST_ELEMENT (self), self->srcpad); self->srcpad = NULL; } } static GstStateChangeReturn bt_dec_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; BtDec *self = BT_DEC (element); GST_INFO_OBJECT (self, "state change on the bin: %s -> %s", gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)), gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition))); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: //bt_song_play (self->song); break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: bt_song_pause (self->song); break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* this causes a deadlock if called in PLAYING_TO_PAUSED */ bt_song_stop (self->song); if((gst_element_set_state (GST_ELEMENT (self->bin),GST_STATE_NULL))==GST_STATE_CHANGE_FAILURE) { GST_WARNING("can't go to null state"); } break; case GST_STATE_CHANGE_READY_TO_NULL: bt_dec_reset (self); break; default: break; } return ret; } static void bt_dec_dispose (GObject * object) { BtDec *self = BT_DEC (object); bt_dec_reset (self); if (self->song) { g_signal_handlers_disconnect_matched (self->song,G_SIGNAL_MATCH_FUNC,0,0,NULL,on_song_is_playing_notify,NULL); g_object_unref (self->song); self->song = NULL; } g_object_unref (self->app); g_object_unref (self->adapter); G_OBJECT_CLASS (parent_class)->dispose (object); } static void bt_dec_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&bt_dec_sink_template)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&bt_dec_src_template)); gst_element_class_set_details_simple (element_class, "BtDec", "Codec/Decoder/Audio", "Buzztard song player", "Stefan Kost "); } static void bt_dec_class_init (BtDecClass * klass) { GObjectClass *gobject_class = (GObjectClass *) klass; GstElementClass *gstelement_class = (GstElementClass *) klass; gobject_class->dispose = bt_dec_dispose; gstelement_class->change_state = bt_dec_change_state; } static void bt_dec_init (BtDec * self, BtDecClass * g_class) { GstElementClass *klass = GST_ELEMENT_GET_CLASS (self); self->adapter = gst_adapter_new (); gst_segment_init (&self->segment, GST_FORMAT_TIME); self->app = g_object_new (BT_TYPE_DEC_APPLICATION,NULL); self->song = bt_song_new (self->app); g_signal_connect (self->song, "notify::is-playing", G_CALLBACK (on_song_is_playing_notify), (gpointer)self); g_object_get (self->app, "bin", &self->bin, NULL); self->sinkpad = gst_pad_new_from_template (gst_element_class_get_pad_template (klass, "sink"), "sink"); gst_pad_set_activatepull_function (self->sinkpad, bt_dec_activatepull); gst_pad_set_activate_function (self->sinkpad, bt_dec_activate); gst_pad_set_event_function (self->sinkpad, bt_dec_sink_event); gst_pad_set_chain_function (self->sinkpad, bt_dec_chain); gst_element_add_pad (GST_ELEMENT (self), self->sinkpad); /* we add the src-pad dynamically */ } static void bt_dec_type_find (GstTypeFind * tf, gpointer ignore) { gsize length = 16384; guint64 tf_length; guint8 *data; gchar *tmp,*mimetype; const GList *plugins, *node; BtSongIOModuleInfo *info; guint ix; gboolean found_match=FALSE; if ((tf_length = gst_type_find_get_length (tf)) > 0) length = MIN (length, tf_length); if ((data = gst_type_find_peek (tf, 0, length)) == NULL) return; // check it tmp = g_content_type_guess (NULL, data, length, NULL); if (tmp == NULL || g_content_type_is_unknown (tmp)) { g_free (tmp); return; } mimetype = g_content_type_get_mime_type (tmp); g_free (tmp); if (mimetype == NULL) return; GST_INFO ("Got mimetype '%s'", mimetype); plugins=bt_song_io_get_module_info_list(); for(node=plugins;(!found_match && node);node=g_list_next(node)) { info=(BtSongIOModuleInfo *)node->data; ix=0; while(!found_match && info->formats[ix].name) { GST_INFO (" checking '%s'", info->formats[ix].name); found_match=!strcmp(mimetype,info->formats[ix].mime_type); ix++; } } if (found_match) { GST_INFO ("Found a match"); // just suggest one static type, we can internally differentiate between the // different formats we do support gst_type_find_suggest_simple (tf, GST_TYPE_FIND_LIKELY, "audio/x-buzztard", "format", G_TYPE_STRING, mimetype, NULL); } else { GST_INFO ("No match!"); } } static gboolean plugin_init (GstPlugin * plugin) { const GList *plugins; BtSongIOModuleInfo *info; gchar **exts = NULL; guint i = 0, j ,l = 20; GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "bt-dec", GST_DEBUG_FG_WHITE | GST_DEBUG_BG_BLACK, "buzztard song renderer"); if (!bt_init_check (NULL,NULL, NULL)) { GST_WARNING ("failed to init buzztard library"); return FALSE; } if (!btic_init_check (NULL,NULL, NULL)) { GST_WARNING ("failed to init buzztard interaction controller library"); return FALSE; } plugins = bt_song_io_get_module_info_list (); exts = (gchar **)g_new (gpointer, l); for(;plugins; plugins = g_list_next (plugins)) { info=(BtSongIOModuleInfo *)plugins->data; j = 0; while(info->formats[j].name) { exts[i++] = (gchar *)info->formats[j].extension; j++; if (i >= l) { l *= 2; exts = (gchar **)g_renew (gpointer, (gpointer)exts, l); } } } exts[i] = NULL; gst_type_find_register (plugin, "audio/x-buzztard", GST_RANK_SECONDARY, bt_dec_type_find, exts, GST_CAPS_ANY, NULL, NULL); g_free (exts); return gst_element_register (plugin, "buzztard-dec", GST_RANK_MARGINAL, BT_TYPE_DEC); } GST_PLUGIN_DEFINE ( GST_VERSION_MAJOR, GST_VERSION_MINOR, "buzztard-dec", "Buzztard song renderer", plugin_init, VERSION, "LGPL", PACKAGE_NAME, "http://www.buzztard.org"); buzztard-0.6.0/src/ui/dec/Makefile.am0000644042355400116100000000306111673621756014322 00000000000000## Makefile.am for src/ui/bin plugin_LTLIBRARIES = libbuzztarddec.la # sources used to compile this plug-in libbuzztarddec_la_SOURCES = bt-dec.c # flags used to compile this plugin libbuzztarddec_la_CFLAGS = \ -I$(top_srcdir)/src/lib/core \ -I$(top_srcdir)/src/lib/ic \ -DLOCALEDIR=\"$(localedir)\" \ -DLIBDIR=\"$(libdir)\" \ -DDATADIR=\"$(datadir)\" \ -DG_LOG_DOMAIN=\"buzztard\" \ $(GST_PLUGIN_CFLAGS) \ $(BASE_DEPS_CFLAGS) libbuzztarddec_la_LIBADD = \ $(top_builddir)/src/lib/core/libbuzztard-core.la \ $(top_builddir)/src/lib/ic/libbuzztard-ic.la \ $(BASE_DEPS_LIBS) $(LIBM) libbuzztarddec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libbuzztarddec_la_LIBTOOLFLAGS = --tag=disable-static # headers we need but don't want installed noinst_HEADERS = bt-dec.h .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: tags @echo "files by size:" @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -rn @echo @echo "files by tags:" @for file in *.c; do size=`grep $${file} tags | wc -l`;echo $${size} $${file}; done | sort -rn splint:: splint +posixlib -weak -I$(top_builddir) $(AM_CPPFLAGS) $(libbtcmd_la_SOURCES) help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks"buzztard-0.6.0/src/ui/Makefile.in0000644042355400116100000005205711675570634013611 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src/ui DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = cmd dec edit all: all-recursive .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 src/ui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/ui/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/ui/Makefile.am0000644042355400116100000000122111576360376013563 00000000000000SUBDIRS = cmd dec edit .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/src/Makefile.in0000644042355400116100000005204011675570634013164 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 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@ 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 = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ $(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/iconv.m4 \ $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/isc-posix.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) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-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 uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) 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" ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ ASPELL = @ASPELL@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPS_CFLAGS = @BASE_DEPS_CFLAGS@ BASE_DEPS_LIBS = @BASE_DEPS_LIBS@ BML_DEPS_CFLAGS = @BML_DEPS_CFLAGS@ BML_DEPS_LIBS = @BML_DEPS_LIBS@ BT_CFLAGS = @BT_CFLAGS@ BT_DISABLE_DEPRECATED = @BT_DISABLE_DEPRECATED@ BT_INCLUDEDIR = @BT_INCLUDEDIR@ BT_LDFLAGS = @BT_LDFLAGS@ BT_LIBDIR = @BT_LIBDIR@ BT_LIBS = @BT_LIBS@ BT_MAJORMINOR = @BT_MAJORMINOR@ BT_MAJOR_VERSION = @BT_MAJOR_VERSION@ BT_MICRO_VERSION = @BT_MICRO_VERSION@ BT_MINOR_VERSION = @BT_MINOR_VERSION@ BT_RELEASE_DATE = @BT_RELEASE_DATE@ BT_RELEASE_YEAR = @BT_RELEASE_YEAR@ BT_VERSION = @BT_VERSION@ BT_VERSION_INFO = @BT_VERSION_INFO@ BT_VERSION_NUMBER = @BT_VERSION_NUMBER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CHECK_CFLAGS = @CHECK_CFLAGS@ CHECK_LIBS = @CHECK_LIBS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GCANVAS_PREFIX = @GCANVAS_PREFIX@ GCONFTOOL = @GCONFTOOL@ GCONF_DEPS_CFLAGS = @GCONF_DEPS_CFLAGS@ GCONF_DEPS_LIBS = @GCONF_DEPS_LIBS@ GCONF_DOC_TYPES = @GCONF_DOC_TYPES@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GIRDIR = @GIRDIR@ GLIB_PREFIX = @GLIB_PREFIX@ GMSGFMT = @GMSGFMT@ GNOMEVFS_DEPS_CFLAGS = @GNOMEVFS_DEPS_CFLAGS@ GNOMEVFS_DEPS_LIBS = @GNOMEVFS_DEPS_LIBS@ GOBJECT_INTROSPECTION_CFLAGS = @GOBJECT_INTROSPECTION_CFLAGS@ GOBJECT_INTROSPECTION_LIBS = @GOBJECT_INTROSPECTION_LIBS@ GREP = @GREP@ GSF_DEPS_CFLAGS = @GSF_DEPS_CFLAGS@ GSF_DEPS_LIBS = @GSF_DEPS_LIBS@ GSTBT_DEPS_CFLAGS = @GSTBT_DEPS_CFLAGS@ GSTBT_DEPS_LIBS = @GSTBT_DEPS_LIBS@ GST_MAJORMINOR = @GST_MAJORMINOR@ GST_PLUGIN_CFLAGS = @GST_PLUGIN_CFLAGS@ GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@ GST_PREFIX = @GST_PREFIX@ GTKDOC_CHECK = @GTKDOC_CHECK@ GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@ GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@ GTKDOC_MKPDF = @GTKDOC_MKPDF@ GTKDOC_REBASE = @GTKDOC_REBASE@ GTK_DEPS_CFLAGS = @GTK_DEPS_CFLAGS@ GTK_DEPS_LIBS = @GTK_DEPS_LIBS@ GTK_PREFIX = @GTK_PREFIX@ GUDEV_DEPS_CFLAGS = @GUDEV_DEPS_CFLAGS@ GUDEV_DEPS_LIBS = @GUDEV_DEPS_LIBS@ GUDEV_DOC_SECTIONS = @GUDEV_DOC_SECTIONS@ GUDEV_DOC_TYPES = @GUDEV_DOC_TYPES@ GUI_DEPS_CFLAGS = @GUI_DEPS_CFLAGS@ GUI_DEPS_LIBS = @GUI_DEPS_LIBS@ G_IR_COMPILER = @G_IR_COMPILER@ G_IR_GENERATE = @G_IR_GENERATE@ G_IR_SCANNER = @G_IR_SCANNER@ HAL_DEPS_CFLAGS = @HAL_DEPS_CFLAGS@ HAL_DEPS_LIBS = @HAL_DEPS_LIBS@ HAL_DOC_SECTIONS = @HAL_DOC_SECTIONS@ HAL_DOC_TYPES = @HAL_DOC_TYPES@ HILDON_DEPS_CFLAGS = @HILDON_DEPS_CFLAGS@ HILDON_DEPS_LIBS = @HILDON_DEPS_LIBS@ 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@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBICONV = @LIBICONV@ LIBINTL = @LIBINTL@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LINUX_INPUT_DOC_SECTIONS = @LINUX_INPUT_DOC_SECTIONS@ LINUX_INPUT_DOC_TYPES = @LINUX_INPUT_DOC_TYPES@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBINTL = @LTLIBINTL@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ 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@ POSUB = @POSUB@ PROG_ACLOCAL = @PROG_ACLOCAL@ RANLIB = @RANLIB@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TYPELIBDIR = @TYPELIBDIR@ U = @U@ UPDATE_DESKTOP_DATABASE = @UPDATE_DESKTOP_DATABASE@ UPDATE_MIME_DATABASE = @UPDATE_MIME_DATABASE@ USE_NLS = @USE_NLS@ VALGRIND = @VALGRIND@ VALGRIND_CFLAGS = @VALGRIND_CFLAGS@ VERSION = @VERSION@ XFONT_PATH = @XFONT_PATH@ XGETTEXT = @XGETTEXT@ XSLTPROC = @XSLTPROC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ acdir = @acdir@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bcov_path = @bcov_path@ 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@ lcov_path = @lcov_path@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ lt_ECHO = @lt_ECHO@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ plugindir = @plugindir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ scrollkeeper_config = @scrollkeeper_config@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ valgrind_path = @valgrind_path@ with_desktop_dir = @with_desktop_dir@ xvfb_path = @xvfb_path@ SUBDIRS = lib ui all: all-recursive .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 src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: 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__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ 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 # 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. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; 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" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) 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; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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 CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ 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" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(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 @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ 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 check-am: all-am check: check-recursive all-am: Makefile 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: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install 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." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic 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 Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic clean-libtool \ ctags ctags-recursive distclean distclean-generic \ distclean-libtool distclean-tags 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 installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" # 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: buzztard-0.6.0/src/Makefile.am0000644042355400116100000000121311576360376013147 00000000000000SUBDIRS = lib ui .PHONY: help todo stats splint todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done help:: @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/missing0000754042355400116100000002623311576377400011727 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally 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 run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] 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 # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: buzztard-0.6.0/COPYING0000644042355400116100000006364011576360407011366 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey 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 library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! buzztard-0.6.0/intltool-update.in0000644042355400116100000000000011675570451013766 00000000000000buzztard-0.6.0/aclocal.m40000644042355400116100000012472611675570632012201 00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 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_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, [m4_warning([this file was generated for autoconf 2.65. 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 AM_GCONF_SOURCE_2 dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas dnl (i.e. pass to gconftool-2 dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where dnl you should install foo.schemas files dnl AC_DEFUN([AM_GCONF_SOURCE_2], [ if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi AC_ARG_WITH([gconf-source], AC_HELP_STRING([--with-gconf-source=sourceaddress], [Config database for installing schema files.]), [GCONF_SCHEMA_CONFIG_SOURCE="$withval"],) AC_SUBST(GCONF_SCHEMA_CONFIG_SOURCE) AC_MSG_RESULT([Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation]) if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' fi AC_ARG_WITH([gconf-schema-file-dir], AC_HELP_STRING([--with-gconf-schema-file-dir=dir], [Directory for installing schema files.]), [GCONF_SCHEMA_FILE_DIR="$withval"],) AC_SUBST(GCONF_SCHEMA_FILE_DIR) AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files]) AC_ARG_ENABLE(schemas-install, AC_HELP_STRING([--disable-schemas-install], [Disable the schemas installation]), [case ${enableval} in yes|no) ;; *) AC_MSG_ERROR([bad value ${enableval} for --enable-schemas-install]) ;; esac]) AM_CONDITIONAL([GCONF_SCHEMAS_INSTALL], [test "$enable_schemas_install" != no]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # 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 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # 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. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl 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 ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure 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_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- 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 ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # 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 _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [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 ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [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 .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 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.11' 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.11.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.11.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, 2003, 2005 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], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # 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. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$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, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # 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. # serial 10 # 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", "GCJ", or "OBJC". # 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 ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # 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. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 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. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _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. FIXME. This creates each `.P' file that we will # 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" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 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. # serial 16 # 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. # 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.62])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], [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], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [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([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. 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)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl 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 ]) 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, 2003, 2005, 2008 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}" != 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, 2005 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. # serial 2 # 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, 2002, 2003, 2005, 2009 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. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # 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. # serial 6 # 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 supports --run. # If it does, 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 --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 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_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 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. # serial 4 # _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) 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2005, 2006 # 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. # serial 5 AC_DEFUN([AM_C_PROTOTYPES], [AC_REQUIRE([AC_C_PROTOTYPES]) if test "$ac_cv_prog_cc_stdc" != no; then U= ANSI2KNR= else U=_ ANSI2KNR=./ansi2knr fi # Ensure some checks needed by ansi2knr itself. AC_REQUIRE([AC_HEADER_STDC]) AC_CHECK_HEADERS([string.h]) AC_SUBST([U])dnl AC_SUBST([ANSI2KNR])dnl _AM_SUBST_NOTMAKE([ANSI2KNR])dnl ]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # 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. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # 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 ( 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 rm -f conftest.file 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 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)]) # Copyright (C) 2009 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. # serial 1 # 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], [ --enable-silent-rules less verbose build output (undo: `make V=1') --disable-silent-rules verbose build output (undo: `make V=0')]) 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 AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001, 2003, 2005 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, 2008 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. # serial 2 # _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, 2005 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. # serial 2 # _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. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. 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/gettext.m4]) m4_include([m4/gtk-doc.m4]) m4_include([m4/iconv.m4]) m4_include([m4/intltool.m4]) m4_include([m4/isc-posix.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]) buzztard-0.6.0/intltool-merge.in0000644042355400116100000000000011675570451013603 00000000000000buzztard-0.6.0/COPYING-DOCS0000644042355400116100000004327511576360407012116 00000000000000 GNU Free Documentation License Version 1.1, March 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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 written 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 that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". 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. (For example, 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. 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 "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and 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 has been designed to thwart or discourage subsequent modification by readers is not Transparent. 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 designed for human modification. Opaque formats include PostScript, PDF, 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 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. 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 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 publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. 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 less than five). 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", and 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. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, 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 as "Endorsements" or to conflict in title with any Invariant Section. 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. 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, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they 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 quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around 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 provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 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. 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.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts. 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. buzztard-0.6.0/configure0000754042355400116100000263401111675570635012245 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65 for buzztard 0.6.0. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 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. 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 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" 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" 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 : # 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. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} 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: buzztard-devel@lists.sourceforge.net about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a 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_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 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=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&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; } # 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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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'" # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\$\\$0,'$0','` ;; esac ECHO=${lt_ECHO-echo} if test "X$1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X$1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "$0" --no-reexec ${1+"$@"} fi if test "X$1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF $* _LT_EOF exit 0 fi # 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 if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL $0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL $0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "$0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" fi test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, 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='buzztard' PACKAGE_TARNAME='buzztard' PACKAGE_VERSION='0.6.0' PACKAGE_STRING='buzztard 0.6.0' PACKAGE_BUGREPORT='buzztard-devel@lists.sourceforge.net' PACKAGE_URL='' ac_unique_file="ChangeLog" # 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" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS BT_LDFLAGS BT_LIBS BT_LIBDIR BT_CFLAGS BT_INCLUDEDIR UPDATE_DESKTOP_DATABASE UPDATE_MIME_DATABASE LIBM ANSI2KNR U USE_LINUX_INPUT_FALSE USE_LINUX_INPUT_TRUE LINUX_INPUT_DOC_SECTIONS LINUX_INPUT_DOC_TYPES WITH_ASPELL_FALSE WITH_ASPELL_TRUE ASPELL SCROLLKEEPER_BUILD_REQUIRED ENABLE_SCROLLKEEPER_FALSE ENABLE_SCROLLKEEPER_TRUE scrollkeeper_config ENABLE_MAN_FALSE ENABLE_MAN_TRUE XSLTPROC 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 GTKDOC_DEPS_LIBS GTKDOC_DEPS_CFLAGS HTML_DIR GTKDOC_MKPDF GTKDOC_REBASE GTKDOC_CHECK GST_PLUGIN_LDFLAGS GST_PLUGIN_CFLAGS plugindir GST_MAJORMINOR BUILD_CHECK_TESTS_FALSE BUILD_CHECK_TESTS_TRUE CHECK_LIBS CHECK_CFLAGS GCANVAS_PREFIX GST_PREFIX GTK_PREFIX GLIB_PREFIX TYPELIBDIR GIRDIR G_IR_GENERATE G_IR_COMPILER G_IR_SCANNER USE_GIR_FALSE USE_GIR_TRUE GOBJECT_INTROSPECTION_LIBS GOBJECT_INTROSPECTION_CFLAGS USE_GSF_FALSE USE_GSF_TRUE GSF_DEPS_LIBS GSF_DEPS_CFLAGS HAL_DOC_SECTIONS HAL_DOC_TYPES USE_HAL_FALSE USE_HAL_TRUE HAL_DEPS_LIBS HAL_DEPS_CFLAGS GUDEV_DOC_SECTIONS GUDEV_DOC_TYPES USE_GUDEV_FALSE USE_GUDEV_TRUE GUDEV_DEPS_LIBS GUDEV_DEPS_CFLAGS HILDON_DEPS_LIBS HILDON_DEPS_CFLAGS BML_DEPS_LIBS BML_DEPS_CFLAGS GSTBT_DEPS_LIBS GSTBT_DEPS_CFLAGS GCONF_DOC_TYPES GCONF_SCHEMA_FILE_DIR GCONF_SCHEMA_CONFIG_SOURCE GCONFTOOL GCONF_SCHEMAS_INSTALL_FALSE GCONF_SCHEMAS_INSTALL_TRUE USE_GCONF_FALSE USE_GCONF_TRUE GCONF_DEPS_LIBS GCONF_DEPS_CFLAGS GNOMEVFS_DEPS_LIBS GNOMEVFS_DEPS_CFLAGS GTK_DEPS_LIBS GTK_DEPS_CFLAGS GUI_DEPS_LIBS GUI_DEPS_CFLAGS BASE_DEPS_LIBS BASE_DEPS_CFLAGS with_desktop_dir VALGRIND_CFLAGS USE_VALGRIND_FALSE USE_VALGRIND_TRUE VALGRIND valgrind_path USE_LCOV_FALSE USE_LCOV_TRUE USE_BCOV_FALSE USE_BCOV_TRUE lcov_path bcov_path BT_DISABLE_DEPRECATED USE_DEBUG_FALSE USE_DEBUG_TRUE GETTEXT_PACKAGE POSUB LTLIBINTL LIBINTL INTLLIBS LTLIBICONV LIBICONV MKINSTALLDIRS XFONT_PATH xvfb_path PKG_CONFIG DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS CXXCPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL lt_ECHO RANLIB AR OBJDUMP NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL SED LN_S CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE ac_ct_CC CFLAGS CC am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CXX CPPFLAGS LDFLAGS CXXFLAGS CXX acdir PROG_ACLOCAL BT_RELEASE_DATE BT_RELEASE_YEAR BT_MAJORMINOR BT_VERSION_NUMBER BT_VERSION_INFO BT_VERSION BT_MICRO_VERSION BT_MINOR_VERSION BT_MAJOR_VERSION AM_BACKSLASH AM_DEFAULT_VERBOSITY 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 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' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld enable_libtool_lock enable_nls enable_rpath with_libiconv_prefix with_libintl_prefix enable_debug enable_deprecated enable_coverage with_valgrind with_desktop_dir with_gconf_source with_gconf_schema_file_dir enable_schemas_install enable_introspection with_html_dir enable_gtk_doc enable_gtk_doc_html enable_gtk_doc_pdf enable_man enable_Bsymbolic ' ac_precious_vars='build_alias host_alias target_alias CXX CXXFLAGS LDFLAGS LIBS CPPFLAGS CCC CC CFLAGS CPP CXXCPP PKG_CONFIG BASE_DEPS_CFLAGS BASE_DEPS_LIBS GUI_DEPS_CFLAGS GUI_DEPS_LIBS GTK_DEPS_CFLAGS GTK_DEPS_LIBS GNOMEVFS_DEPS_CFLAGS GNOMEVFS_DEPS_LIBS GCONF_DEPS_CFLAGS GCONF_DEPS_LIBS GSTBT_DEPS_CFLAGS GSTBT_DEPS_LIBS BML_DEPS_CFLAGS BML_DEPS_LIBS HILDON_DEPS_CFLAGS HILDON_DEPS_LIBS GUDEV_DEPS_CFLAGS GUDEV_DEPS_LIBS HAL_DEPS_CFLAGS HAL_DEPS_LIBS GSF_DEPS_CFLAGS GSF_DEPS_LIBS GOBJECT_INTROSPECTION_CFLAGS GOBJECT_INTROSPECTION_LIBS CHECK_CFLAGS CHECK_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' 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=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 ;; -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 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 $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 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 buzztard 0.6.0 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] --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/buzztard] --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 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 buzztard 0.6.0:";; 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') --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --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) --disable-nls do not use Native Language Support --disable-rpath do not hardcode runtime library paths --enable-debug enable runtime debugging code (default=no) --disable-deprecated disable deprecated glib/gtk+/gst/etc. features --enable-coverage enable coverage analysis (default=no) --disable-schemas-install Disable the schemas installation --enable-introspection enable introspection for this build (default=auto) --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]] --enable-man regenerate man pages from Docbook [default=no] --disable-Bsymbolic avoid linking with -Bsymbolic Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=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-valgrind where Valgrind is installed on your system (default is no) --with-desktop-dir install desktop files to DIR/applications (default=$prefix/share/) --with-gconf-source=sourceaddress Config database for installing schema files. --with-gconf-schema-file-dir=dir Directory for installing schema files. --with-html-dir=PATH path to installed docs Some influential environment variables: CXX C++ compiler command CXXFLAGS 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 CC C compiler command CFLAGS C compiler flags CPP C preprocessor CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility BASE_DEPS_CFLAGS C compiler flags for BASE_DEPS, overriding pkg-config BASE_DEPS_LIBS linker flags for BASE_DEPS, overriding pkg-config GUI_DEPS_CFLAGS C compiler flags for GUI_DEPS, overriding pkg-config GUI_DEPS_LIBS linker flags for GUI_DEPS, overriding pkg-config GTK_DEPS_CFLAGS C compiler flags for GTK_DEPS, overriding pkg-config GTK_DEPS_LIBS linker flags for GTK_DEPS, overriding pkg-config GNOMEVFS_DEPS_CFLAGS C compiler flags for GNOMEVFS_DEPS, overriding pkg-config GNOMEVFS_DEPS_LIBS linker flags for GNOMEVFS_DEPS, overriding pkg-config GCONF_DEPS_CFLAGS C compiler flags for GCONF_DEPS, overriding pkg-config GCONF_DEPS_LIBS linker flags for GCONF_DEPS, overriding pkg-config GSTBT_DEPS_CFLAGS C compiler flags for GSTBT_DEPS, overriding pkg-config GSTBT_DEPS_LIBS linker flags for GSTBT_DEPS, overriding pkg-config BML_DEPS_CFLAGS C compiler flags for BML_DEPS, overriding pkg-config BML_DEPS_LIBS linker flags for BML_DEPS, overriding pkg-config HILDON_DEPS_CFLAGS C compiler flags for HILDON_DEPS, overriding pkg-config HILDON_DEPS_LIBS linker flags for HILDON_DEPS, overriding pkg-config GUDEV_DEPS_CFLAGS C compiler flags for GUDEV_DEPS, overriding pkg-config GUDEV_DEPS_LIBS linker flags for GUDEV_DEPS, overriding pkg-config HAL_DEPS_CFLAGS C compiler flags for HAL_DEPS, overriding pkg-config HAL_DEPS_LIBS linker flags for HAL_DEPS, overriding pkg-config GSF_DEPS_CFLAGS C compiler flags for GSF_DEPS, overriding pkg-config GSF_DEPS_LIBS linker flags for GSF_DEPS, overriding pkg-config GOBJECT_INTROSPECTION_CFLAGS C compiler flags for GOBJECT_INTROSPECTION, overriding pkg-config GOBJECT_INTROSPECTION_LIBS linker flags for GOBJECT_INTROSPECTION, overriding pkg-config CHECK_CFLAGS C compiler flags for CHECK, overriding pkg-config CHECK_LIBS linker flags for CHECK, 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 buzztard configure 0.6.0 generated by GNU Autoconf 2.65 Copyright (C) 2009 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_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; } >/dev/null && { 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # 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 || $as_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; 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; } >/dev/null && { 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; test "x$as_lineno_stack" = x && { as_lineno=; 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 || $as_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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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.$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;} ( cat <<\_ASBOX ## --------------------------------------------------- ## ## Report this to buzztard-devel@lists.sourceforge.net ## ## --------------------------------------------------- ## _ASBOX ) | 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 { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; 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; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel 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 buzztard $as_me 0.6.0, which was generated by GNU Autoconf 2.65. 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 cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX 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 cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX 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 cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX 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 cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX 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 ac_site_file1=$CONFIG_SITE 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" 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 # 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 # we can't do -Werror, because # - we use gnu make extensions # - we override uninstallcheck var am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done 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 test "${ac_cv_path_install+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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; } # Just in case sleep 1 echo timestamp > conftest.file # 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 ( 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 rm -f conftest.file 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 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; } 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 --run true"; then am_missing_run="$MISSING --run " 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}" != 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 test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_path_mkdir+set}" = set; 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 { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$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; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac 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 test "${ac_cv_prog_AWK+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; 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 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='buzztard' VERSION='0.6.0' 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"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_config_headers="$ac_config_headers config.h" # Support silent build rules, requires at least automake-1.11. Disable # by either passing --disable-silent-rules to configure or passing V=1 # to make # 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=0;; esac AM_BACKSLASH='\' BT_MAJOR_VERSION=0 BT_MINOR_VERSION=6 BT_MICRO_VERSION=0 BT_VERSION=$BT_MAJOR_VERSION.$BT_MINOR_VERSION.$BT_MICRO_VERSION BT_VERSION_INFO=`expr $BT_MAJOR_VERSION + $BT_MINOR_VERSION`:$BT_MICRO_VERSION:$BT_MINOR_VERSION BT_VERSION_NUMBER=`expr $BT_MAJOR_VERSION \* 10000 + $BT_MINOR_VERSION \* 100 + $BT_MICRO_VERSION` BT_MAJORMINOR=$BT_MAJOR_VERSION.$BT_MINOR_VERSION BT_RELEASE_YEAR=`date +%Y` BT_RELEASE_DATE=`date +%Y-%m-%d` cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION_NUMBER ${BT_VERSION_NUMBER} _ACEOF VERSION=${BT_VERSION} # Extract the first word of "aclocal", so it can be a program name with args. set dummy aclocal; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PROG_ACLOCAL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $PROG_ACLOCAL in [\\/]* | ?:[\\/]*) ac_cv_path_PROG_ACLOCAL="$PROG_ACLOCAL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PROG_ACLOCAL="$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_PROG_ACLOCAL" && ac_cv_path_PROG_ACLOCAL="no" ;; esac fi PROG_ACLOCAL=$ac_cv_path_PROG_ACLOCAL if test -n "$PROG_ACLOCAL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROG_ACLOCAL" >&5 $as_echo "$PROG_ACLOCAL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install .m4 files to" >&5 $as_echo_n "checking where to install .m4 files to... " >&6; } if test "$PROG_ACLOCAL" = "no" ; then acdir=${datadir}/aclocal else acdir=`$PROG_ACLOCAL --print-ac-dir` if test ! -w "$acdir" ; then acdir=${datadir}/aclocal fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acdir" >&5 $as_echo "$acdir" >&6; } 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 test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 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_set_status 77 as_fn_error "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 test "${ac_cv_objext+set}" = set; 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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cxx_g+set}" = set; 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 DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # 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='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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 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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 #include #include /* 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 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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 test "${ac_cv_prog_CPP+set}" = set; 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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 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 { $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 test "${ac_cv_path_SED+set}" = set; 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" { test -f "$ac_path_SED" && $as_test_x "$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 for strerror in -lcposix" >&5 $as_echo_n "checking for strerror in -lcposix... " >&6; } if test "${ac_cv_lib_cposix_strerror+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcposix $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 strerror (); int main () { return strerror (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_cposix_strerror=yes else ac_cv_lib_cposix_strerror=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_cposix_strerror" >&5 $as_echo "$ac_cv_lib_cposix_strerror" >&6; } if test "x$ac_cv_lib_cposix_strerror" = x""yes; then : LIBS="$LIBS -lcposix" fi 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.2.6b' macro_revision='1.3017' ltmain="$ac_aux_dir/ltmain.sh" # 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 test "${ac_cv_build+set}" = set; 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 test "${ac_cv_host+set}" = set; 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 { $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 test "${ac_cv_path_SED+set}" = set; 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" { test -f "$ac_path_SED" && $as_test_x "$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 grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; 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" { test -f "$ac_path_GREP" && $as_test_x "$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 test "${ac_cv_path_EGREP+set}" = set; 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" { test -f "$ac_path_EGREP" && $as_test_x "$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 fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if test "${ac_cv_path_FGREP+set}" = set; 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" { test -f "$ac_path_FGREP" && $as_test_x "$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 "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no 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 test "${lt_cv_path_LD+set}" = set; 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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 test "${lt_cv_path_NM+set}" = set; 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 case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) 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 "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$ac_tool_prefix"; then for ac_prog in "dumpbin -symbols" "link -dump -symbols" 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 test "${ac_cv_prog_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 -symbols" "link -dump -symbols" 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 test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 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 test "${lt_cv_nm_interface+set}" = set; 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:5659: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:5662: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:5665: 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; } # 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 test "${lt_cv_sys_max_cmd_len+set}" = set; 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; ;; 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; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # 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 ;; 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"; 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"`$SHELL $0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 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"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } 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 for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if test "${lt_cv_ld_reload_flag+set}" = set; 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 darwin*) if test "$GCC" = yes; 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 test "${ac_cv_prog_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${lt_cv_deplibs_check_method+set}" = set; 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 # which 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 lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' 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 ;; gnu*) 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]) 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 Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-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*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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 ;; 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_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}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AR="${ac_tool_prefix}ar" $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 fi if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR # Extract the first word of "ar", so it can be a program name with args. set dummy ar; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_AR="ar" $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 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 else AR="$ac_cv_prog_AR" fi test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru 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 test "${ac_cv_prog_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_STRIP+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi # 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 test "${lt_cv_sys_global_symbol_pipe+set}" = set; 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 "$host_cpu" = ia64; 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 # 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 -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$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 -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/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 # and D for any global 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};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print 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 # 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 if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && 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 #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. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$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_save_LIBS="$LIBS" lt_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_save_LIBS" CFLAGS="$lt_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 "$pipe_works" = yes; 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 # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && 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 which ABI we are using. 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 which ABI we are using. echo '#line 6859 "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 "$lt_cv_prog_gnu_ld" = yes; 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* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. 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*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|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" ;; ppc*-*linux*|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 test "${lt_cv_cc_needs_belf+set}" = set; 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 x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. 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*) LD="${LD-ld} -m elf64_sparc" ;; *) 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" 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 test "${ac_cv_prog_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_LIPO+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${lt_cv_apple_cc_single_mod+set}" = set; 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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; 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 test "${lt_cv_ld_exported_symbols_list+set}" = set; 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; } 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 "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; 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" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $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 test "${ac_cv_header_stdc+set}" = set; 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 " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done 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" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done 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 test "${ac_cv_prog_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CXX+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_cxx_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cxx_g+set}" = set; 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 test "${am_cv_CXX_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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 if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; 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 test "${ac_cv_prog_CXXCPP+set}" = set; 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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.$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.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f 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;} _lt_caught_CXX_error=yes; } 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 # 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; pic_mode="$withval" else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # 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 # 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 test "${lt_cv_objdir+set}" = set; 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 "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # 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. 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' # 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 for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` # 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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 test "${lt_cv_path_MAGIC_CMD+set}" = set; 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 "$GCC" = yes; then lt_prog_compiler_no_builtin_flag=' -fno-builtin' { $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 test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; 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" # 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:8779: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:8783: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; 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= { $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 test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; 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' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; 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 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 "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; 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' ;; 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) 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' ;; # 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' ;; pgcc* | pgf77* | pgf90* | pgf95*) # 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*) # IBM XL C 8.0/Fortran 10.1 on PPC lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Sun\ F*) # 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='' ;; 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*) 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 which 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}: result: $lt_prog_compiler_pic" >&5 $as_echo "$lt_prog_compiler_pic" >&6; } # # 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 test "${lt_cv_prog_compiler_pic_works+set}" = set; 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" # 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:9118: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:9122: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 x"$lt_cv_prog_compiler_pic_works" = xyes; 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 test "${lt_cv_prog_compiler_static_works+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 x"$lt_cv_prog_compiler_static_works" = xyes; 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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:9223: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:9227: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o+set}" = set; 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:9278: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:9282: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; 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 "$hard_links" = no; 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_flag_spec_ld= 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 "$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 ;; linux* | k*bsd*-gnu) link_all_deplibs=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; 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 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 "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH *** so that a non-GNU linker is found, and then restart. _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' 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/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' 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 (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; 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 ;; 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 "$host_os" = linux-dietlibc; 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 "$tmp_diet" = no then tmp_addflag= 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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' ;; xl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; 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; $ECHO \"$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 "x$supports_anon_versioning" = xyes; 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 xlf*) # 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= hardcode_libdir_flag_spec_ld='-rpath $libdir' archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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 $compiler_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 $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' 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 $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 ;; 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 can not *** 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 $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 if test "$ld_shlibs" = no; 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 "$GCC" = yes && 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 "$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 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 AIX nm, but means don't demangle with GNU 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")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | 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 # 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 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,' if test "$GCC" = yes; 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 "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; 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 "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi 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_use_runtimelinking" = yes; 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. 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 } }' 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 "$aix_libpath"; then 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; 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. 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 } }' 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 "$aix_libpath"; then 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 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. 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 `$ECHO "X$deplibs" | $Xsed -e '\''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' fix_srcfile_path='`cygpath -w "$srcfile"`' enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported whole_archive_flag_spec='' link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo 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 ;; freebsd1*) ld_shlibs=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 -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $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 $output_objdir/$soname = $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 "$GCC" = yes -a "$with_gnu_ld" = no; then archive_cmds='$CC -shared -fPIC ${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 "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_flag_spec_ld='+b $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 "$GCC" = yes -a "$with_gnu_ld" = no; 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared -fPIC ${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' ;; *) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi 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_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 "$GCC" = yes; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. 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) {} _ACEOF if ac_fn_c_try_link "$LINENO"; then : archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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 ;; 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*) 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__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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 case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' 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 allow_undefined_flag=unsupported archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared ${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 ${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 "$GCC" = yes; 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 "x$host_vendor" = xsequent; 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 "$GCC" = yes; 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 can NOT 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 "$GCC" = yes; 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 x$host_vendor = xsni; 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 "$ld_shlibs" = no && 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 "$enable_shared" = yes && test "$GCC" = yes; 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; } $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 archive_cmds_need_lc=no else archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc" >&5 $as_echo "$archive_cmds_need_lc" >&6; } ;; 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 "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # 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 -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # 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` 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" else 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; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` 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 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 need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; 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 # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # 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}' else # 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' fi 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $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 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,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) 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="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. 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 ;; 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 ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # 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 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 ;; freebsd1*) dynamic_linker=no ;; 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[123]*) 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} $libname${shared_ext}' 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 ;; 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 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 "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; 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' ;; interix[3-9]*) 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' 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 "$lt_cv_prog_gnu_ld" = yes; then version_type=linux 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 ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-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' 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 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 : 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 # 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 # Append ld.so.conf contents 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;/^$/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 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*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac 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 if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; 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 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 "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux 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 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=freebsd-elf 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 "$with_gnu_ld" = yes; 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 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 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 "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $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 "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # 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 "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; 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 "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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 ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = x""yes; 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 test "${ac_cv_lib_dld_shl_load+set}" = set; 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" = x""yes; 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" = x""yes; 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 test "${ac_cv_lib_dl_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_svld_dlopen+set}" = set; 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" = x""yes; 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 test "${ac_cv_lib_dld_dld_link+set}" = set; 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" = x""yes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && 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 test "${lt_cv_dlopen_self+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; 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 11662 "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 void fnord() { int i=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; /* 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 "x$lt_cv_dlopen_self" = xyes; 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 test "${lt_cv_dlopen_self_static+set}" = set; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; 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 11758 "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 void fnord() { int i=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; /* 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 which 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 "$can_build_shared" = "no" && 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 "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no 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 "$enable_shared" = yes || 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" 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_flag_spec_ld_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 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 "$_lt_caught_CXX_error" != yes; 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_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++"} compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; 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 "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no 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 test "${lt_cv_path_LD+set}" = set; 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 test "${lt_cv_prog_gnu_ld+set}" = set; 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 "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -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 "\-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 "$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 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 # need to do runtime linking. 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 ;; 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,' if test "$GXX" = yes; 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 "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; 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 "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi 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_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. 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 } }' 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 "$aix_libpath"; then 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; 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. 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 } }' 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 "$aix_libpath"; then 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 "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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' # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 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*) # _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' 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 (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; 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 ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported whole_archive_flag_spec_CXX='' link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo 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 "$lt_cv_apple_cc_single_mod" != "yes"; 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 ;; 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 ;; freebsd[12]*) # 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 ;; gnu*) ;; 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 $output_objdir/$soname = $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; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; 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; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) 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; $ECHO "X$list" | $Xsed' 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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # 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 "x$supports_anon_versioning" = xyes; 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; $ECHO \"$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='echo' # 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 ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) 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__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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=echo 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*) # 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='echo' # 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 "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $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 -nostdlib ${wl}-M $wl$lib.exp -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 "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $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 -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 "\-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 can NOT 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' ;; *) 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 "$ld_shlibs_CXX" = no && 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 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 $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p 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 ;; *.$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 "$pre_test_object_deps_done" = no; 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 # 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= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; 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= { $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; } # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; 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 "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; 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' ;; 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= ;; 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 "$host_cpu" = ia64; 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 ;; 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 "$host_cpu" != ia64; 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) 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*) # IBM XL 8.0 on PPC 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*) # 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 which 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}: result: $lt_prog_compiler_pic_CXX" >&5 $as_echo "$lt_prog_compiler_pic_CXX" >&6; } # # 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 test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; 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" # 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:13714: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:13718: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; 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 test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 x"$lt_cv_prog_compiler_static_works_CXX" = xyes; 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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:13813: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13817: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; 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:13865: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:13869: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; 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 "$hard_links" = no; 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' 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 AIX nm, but means don't demangle with GNU 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")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-gnu) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && 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 "$enable_shared" = yes && test "$GCC" = yes; 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; } $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 archive_cmds_need_lc_CXX=no else 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* { $as_echo "$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc_CXX" >&5 $as_echo "$archive_cmds_need_lc_CXX" >&6; } ;; 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 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 need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; 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 # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # 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}' else # 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' fi 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $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 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,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) 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="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. 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 ;; 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 ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # 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 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 ;; freebsd1*) dynamic_linker=no ;; 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[123]*) 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} $libname${shared_ext}' 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 ;; 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 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 "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; 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' ;; interix[3-9]*) 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' 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 "$lt_cv_prog_gnu_ld" = yes; then version_type=linux 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 ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-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' 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 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 : 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 # 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 # Append ld.so.conf contents 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;/^$/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 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*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac 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 if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; 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 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 "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux 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 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=freebsd-elf 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 "$with_gnu_ld" = yes; 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 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 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 "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $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 "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # 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 "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; 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 "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC 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 "$_lt_caught_CXX_error" != yes 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: 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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_prog_ac_ct_CC+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_c_compiler_gnu+set}" = set; 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 test "${ac_cv_prog_cc_g+set}" = set; 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 test "${ac_cv_prog_cc_c89+set}" = set; 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 #include #include /* 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 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 test "${am_cv_CC_dependencies_compiler_type+set}" = set; 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'. 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 8's {/usr,}/bin/sh. touch 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 ;; 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 mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac { $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; } case "$am__api_version" in 1.01234) as_fn_error "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac if test -n ""; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= " >&5 $as_echo_n "checking for intltool >= ... " >&6; } INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error "Your intltool is too old. You need intltool or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_UPDATE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_UPDATE="$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 INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_MERGE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_MERGE="$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 INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_EXTRACT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_EXTRACT="$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 INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # 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 test "${ac_cv_path_XGETTEXT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XGETTEXT="$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 XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$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 # 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 test "${ac_cv_path_MSGMERGE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGMERGE="$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 MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$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 # 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 test "${ac_cv_path_MSGFMT+set}" = set; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGFMT="$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 MSGFMT=$ac_cv_path_MSGFMT if test -n "$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 test "${ac_cv_path_GMSGFMT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_PERL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_PERL="$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 INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext 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 test "${ac_cv_path_PKG_CONFIG+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 # Extract the first word of "Xvfb", so it can be a program name with args. set dummy Xvfb; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_xvfb_path+set}" = set; then : $as_echo_n "(cached) " >&6 else case $xvfb_path in [\\/]* | ?:[\\/]*) ac_cv_path_xvfb_path="$xvfb_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_xvfb_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 test -z "$ac_cv_path_xvfb_path" && ac_cv_path_xvfb_path="no" ;; esac fi xvfb_path=$ac_cv_path_xvfb_path if test -n "$xvfb_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xvfb_path" >&5 $as_echo "$xvfb_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$xvfb_path" != "xno" ; then have_xvfb="yes" cat >>confdefs.h <<_ACEOF #define XVFB_PATH "$xvfb_path" _ACEOF XFONT_PATH=`xset q | grep fonts | sed 's/^\ *//'` if test "x$XFONT_PATH" != "x"; then cat >>confdefs.h <<_ACEOF #define XFONT_PATH "$XFONT_PATH" _ACEOF fi else have_xvfb="no" fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 test "${ac_cv_path_MSGFMT+set}" = set; 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 if $ac_dir/$ac_word --statistics /dev/null >/dev/null 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 test "${ac_cv_path_GMSGFMT+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 test "${ac_cv_path_XGETTEXT+set}" = set; 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 if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 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 # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 test "${ac_cv_path_MSGMERGE+set}" = set; 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 if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 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 if test "$GMSGFMT" != ":"; then if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 $as_echo "found $GMSGFMT program is not GNU msgfmt; ignore it" >&6; } GMSGFMT=":" fi fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --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 : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi rm -f messages.po fi ac_config_commands="$ac_config_commands default-1" 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" # 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 echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 GCC" >&5 $as_echo_n "checking for ld used by GCC... " >&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. [\\/]* | [A-Za-z]:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the path 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 test "${acl_cv_path_LD+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do 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 GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi fi LD="$acl_cv_path_LD" if test -n "$LD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&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 test "${acl_cv_prog_gnu_ld+set}" = set; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&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 test "${acl_cv_rpath+set}" = set; 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" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" 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 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/lib" fi fi fi LIBICONV= LTLIBICONV= INCICONV= 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= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi 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 "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi 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/lib"; 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 "$hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$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 "$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 */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` 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*) 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/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) 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 "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$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=\"$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 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; } LIBINTL= LTLIBINTL= POSUB= if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no { $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 test "${gt_cv_func_gnugettext1_libc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings; int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libc=yes else gt_cv_func_gnugettext1_libc=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: $gt_cv_func_gnugettext1_libc" >&5 $as_echo "$gt_cv_func_gnugettext1_libc" >&6; } if test "$gt_cv_func_gnugettext1_libc" != "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 test "${am_cv_func_iconv+set}" = set; 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 "#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/lib" fi fi fi LIBINTL= LTLIBINTL= INCINTL= 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= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi 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 "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi 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/lib"; 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 "$hardcode_direct" = yes; then LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" else if test -n "$hardcode_libdir_flag_spec" && test "$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 "$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 */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` 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*) 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/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) 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 "$hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$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=\"$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 test "${gt_cv_func_gnugettext1_libintl+set}" = set; 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 extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_gnugettext1_libintl=yes else gt_cv_func_gnugettext1_libintl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias (); int main () { bindtextdomain ("", ""); return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext1_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 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_gnugettext1_libintl" >&5 $as_echo "$gt_cv_func_gnugettext1_libintl" >&6; } fi if test "$gt_cv_func_gnugettext1_libc" = "yes" \ || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ && test "$PACKAGE" != gettext-runtime \ && test "$PACKAGE" != gettext-tools; }; then gt_use_preinstalled_gnugettext=yes else LIBINTL= LTLIBINTL= INCINTL= 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 test "$gt_cv_func_gnugettext1_libintl" = "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 test "$gt_cv_func_gnugettext1_libintl" = "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" localedir='${datadir}/locale' GETTEXT_PACKAGE="buzztard-$BT_MAJORMINOR" cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF DATADIRNAME="share" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable runtime debugging code" >&5 $as_echo_n "checking whether to enable runtime debugging code... " >&6; } # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; else enable_debug=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_debug" >&5 $as_echo "$enable_debug" >&6; } if test "x$enable_debug" = "xyes"; then $as_echo "#define USE_DEBUG 1" >>confdefs.h DEBUG_CFLAGS="-O0 -Wall -Werror -g" DEBUG_LDFLAGS="-Wl,--warn-common" if true; then USE_DEBUG_TRUE= USE_DEBUG_FALSE='#' else USE_DEBUG_TRUE='#' USE_DEBUG_FALSE= fi else $as_echo "#define G_DISABLE_ASSERT 1" >>confdefs.h $as_echo "#define G_DISABLE_CHECKS 1" >>confdefs.h $as_echo "#define G_DISABLE_CAST_CHECKS 1" >>confdefs.h DEBUG_CFLAGS="" DEBUG_LDFLAGS="" if false; then USE_DEBUG_TRUE= USE_DEBUG_FALSE='#' else USE_DEBUG_TRUE='#' USE_DEBUG_FALSE= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to disable deprecated glib/gtk+/gst/etc. features" >&5 $as_echo_n "checking whether to disable deprecated glib/gtk+/gst/etc. features... " >&6; } # Check whether --enable-deprecated was given. if test "${enable_deprecated+set}" = set; then : enableval=$enable_deprecated; else if test -f $ac_top_srcdir/autogen.sh; then is_vcs_version=true enable_deprecated=no else enable_deprecated=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_deprecated" >&5 $as_echo "$enable_deprecated" >&6; } if test "x$enable_deprecated" = "xyes"; then # ATK_DISABLE_DEPRECATED BT_DISABLE_DEPRECATED="-DG_DISABLE_DEPRECATED -DPANGO_DISABLE_DEPRECATED -DGDK_DISABLE_DEPRECATED -DGDK_PIXBUF_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED -DGST_DISABLE_DEPRECATED -DGNOME_DISABLE_DEPRECATED" else BT_DISABLE_DEPRECATED="" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable coverage analysis" >&5 $as_echo_n "checking whether to enable coverage analysis... " >&6; } # Check whether --enable-coverage was given. if test "${enable_coverage+set}" = set; then : enableval=$enable_coverage; else enable_coverage=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_coverage" >&5 $as_echo "$enable_coverage" >&6; } COVERAGE_CFLAGS="" COVERAGE_LIBS="" if test "x$enable_coverage" = "xyes"; then bcov_path="no" lcov_path="no" # Extract the first word of "bcov", so it can be a program name with args. set dummy bcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_bcov_path+set}" = set; then : $as_echo_n "(cached) " >&6 else case $bcov_path in [\\/]* | ?:[\\/]*) ac_cv_path_bcov_path="$bcov_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_bcov_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 test -z "$ac_cv_path_bcov_path" && ac_cv_path_bcov_path="no" ;; esac fi bcov_path=$ac_cv_path_bcov_path if test -n "$bcov_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $bcov_path" >&5 $as_echo "$bcov_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$bcov_path" != "xno" ; then coverage_tool="bcov" else # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_lcov_path+set}" = set; then : $as_echo_n "(cached) " >&6 else case $lcov_path in [\\/]* | ?:[\\/]*) ac_cv_path_lcov_path="$lcov_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_lcov_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 test -z "$ac_cv_path_lcov_path" && ac_cv_path_lcov_path="no" ;; esac fi lcov_path=$ac_cv_path_lcov_path if test -n "$lcov_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lcov_path" >&5 $as_echo "$lcov_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$lcov_path" != "xno" ; then LCOV_VERSION=`lcov --version|head -n 1| $SED 's/^.* version //'` LCOV_MAJOR=`echo $LCOV_VERSION | cut -d. -f1 | $SED s/a-zA-Z\-.*//g` LCOV_MINOR=`echo $LCOV_VERSION | cut -d. -f2 | $SED s/a-zA-Z\-.*//g` if [ "$LCOV_MAJOR" -lt "1" ]; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: lcov >= 1.6 is required, you have $LCOV_VERSION" >&5 $as_echo "$as_me: WARNING: lcov >= 1.6 is required, you have $LCOV_VERSION" >&2;} lcov_path="no" elif [ "$LCOV_MAJOR" -eq "1" ] && \ [ "$LCOV_MINOR" -lt "6" ]; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: lcov >= 1.6 is required, you have $LCOV_VERSION" >&5 $as_echo "$as_me: WARNING: lcov >= 1.6 is required, you have $LCOV_VERSION" >&2;} lcov_path="no" fi if test "x$lcov_path" != "xno" ; then coverage_tool="gcov + lcov" COVERAGE_CFLAGS="-O0 -g -fprofile-arcs -ftest-coverage" COVERAGE_LIBS="-lgcov" fi fi fi fi if test "x$bcov_path" != "xno"; then USE_BCOV_TRUE= USE_BCOV_FALSE='#' else USE_BCOV_TRUE='#' USE_BCOV_FALSE= fi if test "x$lcov_path" != "xno"; then USE_LCOV_TRUE= USE_LCOV_FALSE='#' else USE_LCOV_TRUE='#' USE_LCOV_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where Valgrind is installed on your system" >&5 $as_echo_n "checking where Valgrind is installed on your system... " >&6; } # Check whether --with-valgrind was given. if test "${with_valgrind+set}" = set; then : withval=$with_valgrind; ac_cv_use_valgrind=$withval else ac_cv_use_valgrind=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_use_valgrind" >&5 $as_echo "$ac_cv_use_valgrind" >&6; } if test "x$ac_cv_use_valgrind" == "xyes"; then # Extract the first word of "valgrind", so it can be a program name with args. set dummy valgrind; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_valgrind_path+set}" = set; then : $as_echo_n "(cached) " >&6 else case $valgrind_path in [\\/]* | ?:[\\/]*) ac_cv_path_valgrind_path="$valgrind_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_valgrind_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 test -z "$ac_cv_path_valgrind_path" && ac_cv_path_valgrind_path="no" ;; esac fi valgrind_path=$ac_cv_path_valgrind_path if test -n "$valgrind_path"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $valgrind_path" >&5 $as_echo "$valgrind_path" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$valgrind_path" != "xno"; then valgrind_path=`dirname $valgrind_path` VALGRIND=`dirname $valgrind_path` else VALGRIND="no" fi else VALGRIND=$ac_cv_use_valgrind fi if test "x$VALGRIND" != "xno"; then USE_VALGRIND_TRUE= USE_VALGRIND_FALSE='#' else USE_VALGRIND_TRUE='#' USE_VALGRIND_FALSE= fi VALGRIND_CPPFLAGS= if test "x$ac_cv_use_valgrind" != "xno"; then $as_echo "#define HAVE_VALGRIND 1" >>confdefs.h if test -f $ac_cv_use_valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind elif test -f $ac_cv_use_valgrind/include/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/include elif test -f $ac_cv_use_valgrind/valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/valgrind elif test -f $ac_cv_use_valgrind/include/valgrind/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/include/valgrind elif test -f $ac_cv_use_valgrind/valgrind/include/valgrind.h; then VALGRIND_CFLAGS=-I$ac_cv_use_valgrind/valgrind/include fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking where to install desktop files" >&5 $as_echo_n "checking where to install desktop files... " >&6; } # Check whether --with-desktop_dir was given. if test "${with_desktop_dir+set}" = set; then : withval=$with_desktop_dir; else with_desktop_dir="$prefix/share/" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_desktop_dir" >&5 $as_echo "$with_desktop_dir" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BASE_DEPS" >&5 $as_echo_n "checking for BASE_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$BASE_DEPS_CFLAGS"; then pkg_cv_BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS" else 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 gthread-2.0 >= 2.10.0 \\ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \\ libxml-2.0 >= 2.6.0 \\ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \\ gstreamer-base-0.10 >= 0.10.14 \\ gstreamer-plugins-base-0.10 >= 0.10.14 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BASE_DEPS_CFLAGS=`$PKG_CONFIG --cflags "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$BASE_DEPS_LIBS"; then pkg_cv_BASE_DEPS_LIBS="$BASE_DEPS_LIBS" else 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 gthread-2.0 >= 2.10.0 \\ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \\ libxml-2.0 >= 2.6.0 \\ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \\ gstreamer-base-0.10 >= 0.10.14 \\ gstreamer-plugins-base-0.10 >= 0.10.14 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BASE_DEPS_LIBS=`$PKG_CONFIG --libs "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 BASE_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ "` else BASE_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ "` fi # Put the nasty error message in config.log where it belongs echo "$BASE_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (\ glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0 gthread-2.0 >= 2.10.0 \ gmodule-2.0 >= 2.10.0 gio-2.0 >= 2.10.0 \ libxml-2.0 >= 2.6.0 \ gstreamer-0.10 >= 0.10.14 gstreamer-controller-0.10 >= 0.10.14 \ gstreamer-base-0.10 >= 0.10.14 \ gstreamer-plugins-base-0.10 >= 0.10.14 \ ) were not met: $BASE_DEPS_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 BASE_DEPS_CFLAGS and BASE_DEPS_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}: 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 BASE_DEPS_CFLAGS and BASE_DEPS_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 BASE_DEPS_CFLAGS=$pkg_cv_BASE_DEPS_CFLAGS BASE_DEPS_LIBS=$pkg_cv_BASE_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi # gstreamer-app-0.10 >= 0.10.22 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUI_DEPS" >&5 $as_echo_n "checking for GUI_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GUI_DEPS_CFLAGS"; then pkg_cv_GUI_DEPS_CFLAGS="$GUI_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gtk+-2.0 >= 2.12.0 \\ libgnomecanvas-2.0 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUI_DEPS_CFLAGS=`$PKG_CONFIG --cflags "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GUI_DEPS_LIBS"; then pkg_cv_GUI_DEPS_LIBS="$GUI_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gtk+-2.0 >= 2.12.0 \\ libgnomecanvas-2.0 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUI_DEPS_LIBS=`$PKG_CONFIG --libs "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GUI_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ "` else GUI_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ "` fi # Put the nasty error message in config.log where it belongs echo "$GUI_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (\ gtk+-2.0 >= 2.12.0 \ libgnomecanvas-2.0 \ ) were not met: $GUI_DEPS_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 GUI_DEPS_CFLAGS and GUI_DEPS_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}: 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 GUI_DEPS_CFLAGS and GUI_DEPS_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 GUI_DEPS_CFLAGS=$pkg_cv_GUI_DEPS_CFLAGS GUI_DEPS_LIBS=$pkg_cv_GUI_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi # still the pixbuf loader should have svg support # librsvg-2.0 # gnome-vfs is only needed, if we have gtk+ < 2.14.0 pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK_DEPS" >&5 $as_echo_n "checking for GTK_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GTK_DEPS_CFLAGS"; then pkg_cv_GTK_DEPS_CFLAGS="$GTK_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_DEPS_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0 >= 2.14.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTK_DEPS_LIBS"; then pkg_cv_GTK_DEPS_LIBS="$GTK_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0 >= 2.14.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0 >= 2.14.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_DEPS_LIBS=`$PKG_CONFIG --libs "gtk+-2.0 >= 2.14.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-2.0 >= 2.14.0"` else GTK_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-2.0 >= 2.14.0"` fi # Put the nasty error message in config.log where it belongs echo "$GTK_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOMEVFS_DEPS" >&5 $as_echo_n "checking for GNOMEVFS_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNOMEVFS_DEPS_CFLAGS"; then pkg_cv_GNOMEVFS_DEPS_CFLAGS="$GNOMEVFS_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOMEVFS_DEPS_CFLAGS=`$PKG_CONFIG --cflags "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNOMEVFS_DEPS_LIBS"; then pkg_cv_GNOMEVFS_DEPS_LIBS="$GNOMEVFS_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOMEVFS_DEPS_LIBS=`$PKG_CONFIG --libs "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GNOMEVFS_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ "` else GNOMEVFS_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ "` fi # Put the nasty error message in config.log where it belongs echo "$GNOMEVFS_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ) were not met: $GNOMEVFS_DEPS_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 GNOMEVFS_DEPS_CFLAGS and GNOMEVFS_DEPS_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}: 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 GNOMEVFS_DEPS_CFLAGS and GNOMEVFS_DEPS_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 GNOMEVFS_DEPS_CFLAGS=$pkg_cv_GNOMEVFS_DEPS_CFLAGS GNOMEVFS_DEPS_LIBS=$pkg_cv_GNOMEVFS_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GNOMEVFS_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GNOMEVFS_DEPS_LIBS" $as_echo "#define USE_GNOMEVFS 1" >>confdefs.h elif test $pkg_failed = untried; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNOMEVFS_DEPS" >&5 $as_echo_n "checking for GNOMEVFS_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GNOMEVFS_DEPS_CFLAGS"; then pkg_cv_GNOMEVFS_DEPS_CFLAGS="$GNOMEVFS_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOMEVFS_DEPS_CFLAGS=`$PKG_CONFIG --cflags "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GNOMEVFS_DEPS_LIBS"; then pkg_cv_GNOMEVFS_DEPS_LIBS="$GNOMEVFS_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GNOMEVFS_DEPS_LIBS=`$PKG_CONFIG --libs "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ " 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GNOMEVFS_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ "` else GNOMEVFS_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ "` fi # Put the nasty error message in config.log where it belongs echo "$GNOMEVFS_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (\ gnome-vfs-2.0 >= 2.10 gnome-vfs-module-2.0 >= 2.10 \ ) were not met: $GNOMEVFS_DEPS_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 GNOMEVFS_DEPS_CFLAGS and GNOMEVFS_DEPS_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}: 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 GNOMEVFS_DEPS_CFLAGS and GNOMEVFS_DEPS_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 GNOMEVFS_DEPS_CFLAGS=$pkg_cv_GNOMEVFS_DEPS_CFLAGS GNOMEVFS_DEPS_LIBS=$pkg_cv_GNOMEVFS_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } : fi BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GNOMEVFS_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GNOMEVFS_DEPS_LIBS" $as_echo "#define USE_GNOMEVFS 1" >>confdefs.h else GTK_DEPS_CFLAGS=$pkg_cv_GTK_DEPS_CFLAGS GTK_DEPS_LIBS=$pkg_cv_GTK_DEPS_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 GCONF_DEPS" >&5 $as_echo_n "checking for GCONF_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GCONF_DEPS_CFLAGS"; then pkg_cv_GCONF_DEPS_CFLAGS="$GCONF_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-2.0 >= 2.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-2.0 >= 2.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_DEPS_CFLAGS=`$PKG_CONFIG --cflags "gconf-2.0 >= 2.2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GCONF_DEPS_LIBS"; then pkg_cv_GCONF_DEPS_LIBS="$GCONF_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gconf-2.0 >= 2.2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gconf-2.0 >= 2.2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GCONF_DEPS_LIBS=`$PKG_CONFIG --libs "gconf-2.0 >= 2.2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GCONF_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gconf-2.0 >= 2.2.0"` else GCONF_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gconf-2.0 >= 2.2.0"` fi # Put the nasty error message in config.log where it belongs echo "$GCONF_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if false; then USE_GCONF_TRUE= USE_GCONF_FALSE='#' else USE_GCONF_TRUE='#' USE_GCONF_FALSE= fi if false; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi GCONF_DOC_TYPES="%" elif test $pkg_failed = untried; then if false; then USE_GCONF_TRUE= USE_GCONF_FALSE='#' else USE_GCONF_TRUE='#' USE_GCONF_FALSE= fi if false; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi GCONF_DOC_TYPES="%" else GCONF_DEPS_CFLAGS=$pkg_cv_GCONF_DEPS_CFLAGS GCONF_DEPS_LIBS=$pkg_cv_GCONF_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if true; then USE_GCONF_TRUE= USE_GCONF_FALSE='#' else USE_GCONF_TRUE='#' USE_GCONF_FALSE= fi $as_echo "#define USE_GCONF 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GCONF_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GCONF_DEPS_LIBS" # Extract the first word of "gconftool-2", so it can be a program name with args. set dummy gconftool-2; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GCONFTOOL+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GCONFTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_GCONFTOOL="$GCONFTOOL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GCONFTOOL="$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_GCONFTOOL" && ac_cv_path_GCONFTOOL="#" ;; esac fi GCONFTOOL=$ac_cv_path_GCONFTOOL if test -n "$GCONFTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GCONFTOOL" >&5 $as_echo "$GCONFTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi # Check whether --with-gconf-source was given. if test "${with_gconf_source+set}" = set; then : withval=$with_gconf_source; GCONF_SCHEMA_CONFIG_SOURCE="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&5 $as_echo "Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&6; } if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas' fi # Check whether --with-gconf-schema-file-dir was given. if test "${with_gconf_schema_file_dir+set}" = set; then : withval=$with_gconf_schema_file_dir; GCONF_SCHEMA_FILE_DIR="$withval" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&5 $as_echo "Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&6; } # Check whether --enable-schemas-install was given. if test "${enable_schemas_install+set}" = set; then : enableval=$enable_schemas_install; case ${enableval} in yes|no) ;; *) as_fn_error "bad value ${enableval} for --enable-schemas-install" "$LINENO" 5 ;; esac fi if test "$enable_schemas_install" != no; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi GCONF_DOC_TYPES= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSTBT_DEPS" >&5 $as_echo_n "checking for GSTBT_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GSTBT_DEPS_CFLAGS"; then pkg_cv_GSTBT_DEPS_CFLAGS="$GSTBT_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgstbuzztard >= 0.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgstbuzztard >= 0.6.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTBT_DEPS_CFLAGS=`$PKG_CONFIG --cflags "libgstbuzztard >= 0.6.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GSTBT_DEPS_LIBS"; then pkg_cv_GSTBT_DEPS_LIBS="$GSTBT_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgstbuzztard >= 0.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgstbuzztard >= 0.6.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSTBT_DEPS_LIBS=`$PKG_CONFIG --libs "libgstbuzztard >= 0.6.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GSTBT_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgstbuzztard >= 0.6.0"` else GSTBT_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgstbuzztard >= 0.6.0"` fi # Put the nasty error message in config.log where it belongs echo "$GSTBT_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (libgstbuzztard >= 0.6.0) were not met: $GSTBT_DEPS_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 GSTBT_DEPS_CFLAGS and GSTBT_DEPS_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}: 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 GSTBT_DEPS_CFLAGS and GSTBT_DEPS_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 GSTBT_DEPS_CFLAGS=$pkg_cv_GSTBT_DEPS_CFLAGS GSTBT_DEPS_LIBS=$pkg_cv_GSTBT_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_GSTBT 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GSTBT_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GSTBT_DEPS_LIBS" fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BML_DEPS" >&5 $as_echo_n "checking for BML_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$BML_DEPS_CFLAGS"; then pkg_cv_BML_DEPS_CFLAGS="$BML_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbml >= 0.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbml >= 0.6.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BML_DEPS_CFLAGS=`$PKG_CONFIG --cflags "libbml >= 0.6.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$BML_DEPS_LIBS"; then pkg_cv_BML_DEPS_LIBS="$BML_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbml >= 0.6.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libbml >= 0.6.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BML_DEPS_LIBS=`$PKG_CONFIG --libs "libbml >= 0.6.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 BML_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libbml >= 0.6.0"` else BML_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libbml >= 0.6.0"` fi # Put the nasty error message in config.log where it belongs echo "$BML_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_bml=no elif test $pkg_failed = untried; then use_bml=no else BML_DEPS_CFLAGS=$pkg_cv_BML_DEPS_CFLAGS BML_DEPS_LIBS=$pkg_cv_BML_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_BML 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $BML_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $BML_DEPS_LIBS" use_bml=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HILDON_DEPS" >&5 $as_echo_n "checking for HILDON_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$HILDON_DEPS_CFLAGS"; then pkg_cv_HILDON_DEPS_CFLAGS="$HILDON_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hildon-1 libosso\""; } >&5 ($PKG_CONFIG --exists --print-errors "hildon-1 libosso") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HILDON_DEPS_CFLAGS=`$PKG_CONFIG --cflags "hildon-1 libosso" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$HILDON_DEPS_LIBS"; then pkg_cv_HILDON_DEPS_LIBS="$HILDON_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"hildon-1 libosso\""; } >&5 ($PKG_CONFIG --exists --print-errors "hildon-1 libosso") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HILDON_DEPS_LIBS=`$PKG_CONFIG --libs "hildon-1 libosso" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 HILDON_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "hildon-1 libosso"` else HILDON_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "hildon-1 libosso"` fi # Put the nasty error message in config.log where it belongs echo "$HILDON_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_hildon=no elif test $pkg_failed = untried; then use_hildon=no else HILDON_DEPS_CFLAGS=$pkg_cv_HILDON_DEPS_CFLAGS HILDON_DEPS_LIBS=$pkg_cv_HILDON_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_HILDON 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $HILDON_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $HILDON_DEPS_LIBS" use_hildon=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUDEV_DEPS" >&5 $as_echo_n "checking for GUDEV_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GUDEV_DEPS_CFLAGS"; then pkg_cv_GUDEV_DEPS_CFLAGS="$GUDEV_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gudev-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_DEPS_CFLAGS=`$PKG_CONFIG --cflags "gudev-1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GUDEV_DEPS_LIBS"; then pkg_cv_GUDEV_DEPS_LIBS="$GUDEV_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gudev-1.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_DEPS_LIBS=`$PKG_CONFIG --libs "gudev-1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GUDEV_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gudev-1.0"` else GUDEV_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gudev-1.0"` fi # Put the nasty error message in config.log where it belongs echo "$GUDEV_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if false; then USE_GUDEV_TRUE= USE_GUDEV_FALSE='#' else USE_GUDEV_TRUE='#' USE_GUDEV_FALSE= fi use_gudev=no GUDEV_DOC_TYPES=% GUDEV_DOC_SECTIONS=# elif test $pkg_failed = untried; then if false; then USE_GUDEV_TRUE= USE_GUDEV_FALSE='#' else USE_GUDEV_TRUE='#' USE_GUDEV_FALSE= fi use_gudev=no GUDEV_DOC_TYPES=% GUDEV_DOC_SECTIONS=# else GUDEV_DEPS_CFLAGS=$pkg_cv_GUDEV_DEPS_CFLAGS GUDEV_DEPS_LIBS=$pkg_cv_GUDEV_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_GUDEV 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GUDEV_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GUDEV_DEPS_LIBS" if true; then USE_GUDEV_TRUE= USE_GUDEV_FALSE='#' else USE_GUDEV_TRUE='#' USE_GUDEV_FALSE= fi use_gudev=yes GUDEV_DOC_TYPES= GUDEV_DOC_SECTIONS= fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HAL_DEPS" >&5 $as_echo_n "checking for HAL_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$HAL_DEPS_CFLAGS"; then pkg_cv_HAL_DEPS_CFLAGS="$HAL_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 hal\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-glib-1 hal") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAL_DEPS_CFLAGS=`$PKG_CONFIG --cflags "dbus-glib-1 hal" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$HAL_DEPS_LIBS"; then pkg_cv_HAL_DEPS_LIBS="$HAL_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dbus-glib-1 hal\""; } >&5 ($PKG_CONFIG --exists --print-errors "dbus-glib-1 hal") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_HAL_DEPS_LIBS=`$PKG_CONFIG --libs "dbus-glib-1 hal" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 HAL_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dbus-glib-1 hal"` else HAL_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dbus-glib-1 hal"` fi # Put the nasty error message in config.log where it belongs echo "$HAL_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if false; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi use_hal=no HAL_DOC_TYPES=% HAL_DOC_SECTIONS=# elif test $pkg_failed = untried; then if false; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi use_hal=no HAL_DOC_TYPES=% HAL_DOC_SECTIONS=# else HAL_DEPS_CFLAGS=$pkg_cv_HAL_DEPS_CFLAGS HAL_DEPS_LIBS=$pkg_cv_HAL_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define USE_HAL 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $HAL_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $HAL_DEPS_LIBS" if test x$use_gudev = xno; then if true; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi use_hal=yes HAL_DOC_TYPES= HAL_DOC_SECTIONS= else if false; then USE_HAL_TRUE= USE_HAL_FALSE='#' else USE_HAL_TRUE='#' USE_HAL_FALSE= fi use_hal=no HAL_DOC_TYPES=% HAL_DOC_SECTIONS=# fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GSF_DEPS" >&5 $as_echo_n "checking for GSF_DEPS... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GSF_DEPS_CFLAGS"; then pkg_cv_GSF_DEPS_CFLAGS="$GSF_DEPS_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgsf-1\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgsf-1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSF_DEPS_CFLAGS=`$PKG_CONFIG --cflags "libgsf-1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GSF_DEPS_LIBS"; then pkg_cv_GSF_DEPS_LIBS="$GSF_DEPS_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgsf-1\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgsf-1") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GSF_DEPS_LIBS=`$PKG_CONFIG --libs "libgsf-1" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 GSF_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgsf-1"` else GSF_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgsf-1"` fi # Put the nasty error message in config.log where it belongs echo "$GSF_DEPS_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if false; then USE_GSF_TRUE= USE_GSF_FALSE='#' else USE_GSF_TRUE='#' USE_GSF_FALSE= fi use_gsf=no elif test $pkg_failed = untried; then if false; then USE_GSF_TRUE= USE_GSF_FALSE='#' else USE_GSF_TRUE='#' USE_GSF_FALSE= fi use_gsf=no else GSF_DEPS_CFLAGS=$pkg_cv_GSF_DEPS_CFLAGS GSF_DEPS_LIBS=$pkg_cv_GSF_DEPS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if true; then USE_GSF_TRUE= USE_GSF_FALSE='#' else USE_GSF_TRUE='#' USE_GSF_FALSE= fi $as_echo "#define USE_GSF 1" >>confdefs.h BASE_DEPS_CFLAGS="$BASE_DEPS_CFLAGS $GSF_DEPS_CFLAGS" BASE_DEPS_LIBS="$BASE_DEPS_LIBS $GSF_DEPS_LIBS" use_gsf=yes fi # GObject Introspection # Check whether --enable-introspection was given. if test "${enable_introspection+set}" = set; then : enableval=$enable_introspection; else enable_introspection=auto fi case "x${enable_introspection}" in xyes|xauto) pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GOBJECT_INTROSPECTION" >&5 $as_echo_n "checking for GOBJECT_INTROSPECTION... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GOBJECT_INTROSPECTION_CFLAGS"; then pkg_cv_GOBJECT_INTROSPECTION_CFLAGS="$GOBJECT_INTROSPECTION_CFLAGS" else 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 pkg_cv_GOBJECT_INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags "gobject-introspection-1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GOBJECT_INTROSPECTION_LIBS"; then pkg_cv_GOBJECT_INTROSPECTION_LIBS="$GOBJECT_INTROSPECTION_LIBS" else 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 pkg_cv_GOBJECT_INTROSPECTION_LIBS=`$PKG_CONFIG --libs "gobject-introspection-1.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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_INTROSPECTION_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gobject-introspection-1.0"` else GOBJECT_INTROSPECTION_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gobject-introspection-1.0"` fi # Put the nasty error message in config.log where it belongs echo "$GOBJECT_INTROSPECTION_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if false; then USE_GIR_TRUE= USE_GIR_FALSE='#' else USE_GIR_TRUE='#' USE_GIR_FALSE= fi enable_gir="no" elif test $pkg_failed = untried; then if false; then USE_GIR_TRUE= USE_GIR_FALSE='#' else USE_GIR_TRUE='#' USE_GIR_FALSE= fi enable_gir="no" else GOBJECT_INTROSPECTION_CFLAGS=$pkg_cv_GOBJECT_INTROSPECTION_CFLAGS GOBJECT_INTROSPECTION_LIBS=$pkg_cv_GOBJECT_INTROSPECTION_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } if true; then USE_GIR_TRUE= USE_GIR_FALSE='#' else USE_GIR_TRUE='#' USE_GIR_FALSE= fi G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` TYPELIBDIR=`$PKG_CONFIG --variable=typelibdir gobject-introspection-1.0` enable_gir="yes" fi ;; *) if false; then USE_GIR_TRUE= USE_GIR_FALSE='#' else USE_GIR_TRUE='#' USE_GIR_FALSE= fi enable_gir="no" ;; esac GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`" GTK_PREFIX="`$PKG_CONFIG --variable=prefix gtk+-2.0`" GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-0.10`" GCANVAS_PREFIX="`pkg-config --variable=prefix libgnomecanvas-2.0`" #ac_cflags_save="$CFLAGS" #ac_cppflags_save="$CPPFLAGS" #ac_libs_save="$LIBS" #CFLAGS="$CFLAGS $BASE_DEPS_CFLAGS" #CPPFLAGS="$CPPFLAGS $BASE_DEPS_CFLAGS" #LIBS="$LIBS $BASE_DEPS_LIBS" #AC_CHECK_HEADERS(gst/gstpreset.h) #AC_CHECK_FUNCS(gst_element_factory_can_sink_any_caps) #LIBS="$ac_libs_save" #CFLAGS="$ac_cflags_save" #CPPFLAGS="$ac_cppflags_save" #LIBS="$ac_libs_save" BASE_DEPS_LIBS="$LIBINTL $BASE_DEPS_LIBS" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CHECK" >&5 $as_echo_n "checking for CHECK... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$CHECK_CFLAGS"; then pkg_cv_CHECK_CFLAGS="$CHECK_CFLAGS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"check >= 0.9.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "check >= 0.9.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CHECK_CFLAGS=`$PKG_CONFIG --cflags "check >= 0.9.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$CHECK_LIBS"; then pkg_cv_CHECK_LIBS="$CHECK_LIBS" else if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"check >= 0.9.2\""; } >&5 ($PKG_CONFIG --exists --print-errors "check >= 0.9.2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CHECK_LIBS=`$PKG_CONFIG --libs "check >= 0.9.2" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 CHECK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "check >= 0.9.2"` else CHECK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "check >= 0.9.2"` fi # Put the nasty error message in config.log where it belongs echo "$CHECK_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_check=no if false; then BUILD_CHECK_TESTS_TRUE= BUILD_CHECK_TESTS_FALSE='#' else BUILD_CHECK_TESTS_TRUE='#' BUILD_CHECK_TESTS_FALSE= fi elif test $pkg_failed = untried; then have_check=no if false; then BUILD_CHECK_TESTS_TRUE= BUILD_CHECK_TESTS_FALSE='#' else BUILD_CHECK_TESTS_TRUE='#' BUILD_CHECK_TESTS_FALSE= fi else CHECK_CFLAGS=$pkg_cv_CHECK_CFLAGS CHECK_LIBS=$pkg_cv_CHECK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_check=yes if true; then BUILD_CHECK_TESTS_TRUE= BUILD_CHECK_TESTS_FALSE='#' else BUILD_CHECK_TESTS_TRUE='#' BUILD_CHECK_TESTS_FALSE= fi fi GST_MAJORMINOR=0.10 cat >>confdefs.h <<_ACEOF #define GST_MAJORMINOR "$GST_MAJORMINOR" _ACEOF plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" GST_PLUGIN_CFLAGS="$DEBUG_CFLAGS $COVERAGE_CFLAGS" GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '_*(gst_|bt_|Bt|BT_).*' $COVERAGE_LIBS" # 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 test "${ac_cv_path_GTKDOC_CHECK+set}" = set; then : $as_echo_n "(cached) " >&6 else case $GTKDOC_CHECK in [\\/]* | ?:[\\/]*) ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GTKDOC_CHECK="$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=$ac_cv_path_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 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 test "${ac_cv_path_GTKDOC_REBASE+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 test "${ac_cv_path_GTKDOC_MKPDF+set}" = set; 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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 if test x$enable_gtk_doc = xyes; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.10\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.10") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : else as_fn_error "You need to have gtk-doc >= 1.10 installed to build $PACKAGE_NAME" "$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 "$PKG_CONFIG"; then if test -n "$GTKDOC_DEPS_CFLAGS"; then pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS" else 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` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GTKDOC_DEPS_LIBS"; then pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS" else 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` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then 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 --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0"` else GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0"` fi # Put the nasty error message in config.log where it belongs echo "$GTKDOC_DEPS_PKG_ERRORS" >&5 as_fn_error "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0 >= 2.10.0) were not met: $GTKDOC_DEPS_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 GTKDOC_DEPS_CFLAGS and GTKDOC_DEPS_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}: 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 GTKDOC_DEPS_CFLAGS and GTKDOC_DEPS_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 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 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; } # 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 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 # Check whether --enable-man was given. if test "${enable_man+set}" = set; then : enableval=$enable_man; enable_man=yes else enable_man=no fi # Extract the first word of "xsltproc", so it can be a program name with args. set dummy xsltproc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XSLTPROC+set}" = set; then : $as_echo_n "(cached) " >&6 else case $XSLTPROC in [\\/]* | ?:[\\/]*) ac_cv_path_XSLTPROC="$XSLTPROC" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XSLTPROC="$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 XSLTPROC=$ac_cv_path_XSLTPROC if test -n "$XSLTPROC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XSLTPROC" >&5 $as_echo "$XSLTPROC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$enable_man != xno; then ENABLE_MAN_TRUE= ENABLE_MAN_FALSE='#' else ENABLE_MAN_TRUE='#' ENABLE_MAN_FALSE= fi # Extract the first word of "scrollkeeper-config", so it can be a program name with args. set dummy scrollkeeper-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 test "${ac_cv_path_scrollkeeper_config+set}" = set; then : $as_echo_n "(cached) " >&6 else case $scrollkeeper_config in [\\/]* | ?:[\\/]*) ac_cv_path_scrollkeeper_config="$scrollkeeper_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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_scrollkeeper_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 test -z "$ac_cv_path_scrollkeeper_config" && ac_cv_path_scrollkeeper_config="no" ;; esac fi scrollkeeper_config=$ac_cv_path_scrollkeeper_config if test -n "$scrollkeeper_config"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $scrollkeeper_config" >&5 $as_echo "$scrollkeeper_config" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test x$scrollkeeper_config = xno; then have_scrollkeeper=no { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Couldn't find scrollkeeper-config, please install the scrollkeeper package" >&5 $as_echo "$as_me: WARNING: Couldn't find scrollkeeper-config, please install the scrollkeeper package" >&2;} else have_scrollkeeper=yes fi if test ! x$scrollkeeper_config = xno; then ENABLE_SCROLLKEEPER_TRUE= ENABLE_SCROLLKEEPER_FALSE='#' else ENABLE_SCROLLKEEPER_TRUE='#' ENABLE_SCROLLKEEPER_FALSE= fi SCROLLKEEPER_BUILD_REQUIRED=0.3.5 for ac_prog in aspell 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 test "${ac_cv_prog_ASPELL+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ASPELL"; then ac_cv_prog_ASPELL="$ASPELL" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ASPELL="$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 ASPELL=$ac_cv_prog_ASPELL if test -n "$ASPELL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ASPELL" >&5 $as_echo "$ASPELL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ASPELL" && break done if test "x$ASPELL" != "x"; then WITH_ASPELL_TRUE= WITH_ASPELL_FALSE='#' else WITH_ASPELL_TRUE='#' WITH_ASPELL_FALSE= fi { $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 test "${ac_cv_header_stdc+set}" = set; 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 for ac_header in X11/Xlocale.h do : ac_fn_c_check_header_mongrel "$LINENO" "X11/Xlocale.h" "ac_cv_header_X11_Xlocale_h" "$ac_includes_default" if test "x$ac_cv_header_X11_Xlocale_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_X11_XLOCALE_H 1 _ACEOF fi done for ac_header in linux/input.h do : ac_fn_c_check_header_mongrel "$LINENO" "linux/input.h" "ac_cv_header_linux_input_h" "$ac_includes_default" if test "x$ac_cv_header_linux_input_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LINUX_INPUT_H 1 _ACEOF have_linux_input_h=yes LINUX_INPUT_DOC_TYPES= LINUX_INPUT_DOC_SECTIONS= else have_linux_input_h=no LINUX_INPUT_DOC_TYPES=% LINUX_INPUT_DOC_SECTIONS=# fi done if test x$have_linux_input_h = xyes; then USE_LINUX_INPUT_TRUE= USE_LINUX_INPUT_FALSE='#' else USE_LINUX_INPUT_TRUE='#' USE_LINUX_INPUT_FALSE= fi ARCH_CFLAGS="" ARCH_CPPFLAGS="" case "x${host_cpu}" in xi?86|k?|xx86_64|xamd64) ARCH_CFLAGS="-march=native" ARCH_CPPFLAGS="-D__SSE__ -D__MMX__" for ac_header in xmmintrin.h do : ac_fn_c_check_header_mongrel "$LINENO" "xmmintrin.h" "ac_cv_header_xmmintrin_h" "$ac_includes_default" if test "x$ac_cv_header_xmmintrin_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_XMMINTRIN_H 1 _ACEOF fi done ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for function prototypes" >&5 $as_echo_n "checking for function prototypes... " >&6; } if test "$ac_cv_prog_cc_c89" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } $as_echo "#define PROTOTYPES 1" >>confdefs.h $as_echo "#define __PROTOTYPES 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$ac_cv_prog_cc_stdc" != no; then U= ANSI2KNR= else U=_ ANSI2KNR=./ansi2knr fi # Ensure some checks needed by ansi2knr itself. for ac_header in string.h do : ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" if test "x$ac_cv_header_string_h" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRING_H 1 _ACEOF fi done test "x$U" != "x" && as_fn_error "Compiler not ANSI compliant" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if test "${ac_cv_lib_mw__mwvalidcheckl+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $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 _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=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_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = x""yes; then : LIBM="-lmw" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if test "${ac_cv_lib_m_cos+set}" = set; 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. */ /* 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 cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=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_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = x""yes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if test "${ac_cv_lib_m_cos+set}" = set; 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. */ /* 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 cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=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_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = x""yes; then : LIBM="-lm" fi ;; esac for ac_func in sched_setscheduler do : ac_fn_c_check_func "$LINENO" "sched_setscheduler" "ac_cv_func_sched_setscheduler" if test "x$ac_cv_func_sched_setscheduler" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCHED_SETSCHEDULER 1 _ACEOF fi done for ac_func in mlockall do : ac_fn_c_check_func "$LINENO" "mlockall" "ac_cv_func_mlockall" if test "x$ac_cv_func_mlockall" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MLOCKALL 1 _ACEOF fi done for ac_func in getrusage do : ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage" if test "x$ac_cv_func_getrusage" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETRUSAGE 1 _ACEOF fi done for ac_func in setrlimit do : ac_fn_c_check_func "$LINENO" "setrlimit" "ac_cv_func_setrlimit" if test "x$ac_cv_func_setrlimit" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SETRLIMIT 1 _ACEOF fi done # Check whether --enable-Bsymbolic was given. if test "${enable_Bsymbolic+set}" = set; then : enableval=$enable_Bsymbolic; else SAVED_LDFLAGS="${LDFLAGS}" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5 $as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; } LDFLAGS=-Wl,-Bsymbolic-functions cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { int main (void) { return 0; } ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } enable_Bsymbolic=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } enable_Bsymbolic=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="${SAVED_LDFLAGS}" fi BT_INCLUDEDIR='-I${includedir}' BT_CFLAGS="$ARCH_CFLAGS $ARCH_CPPFLAGS $DEBUG_CFLAGS $COVERAGE_CFLAGS $BT_DISABLE_DEPRECATED" BT_LIBDIR='-L${libdir}' BT_LIBS="$COVERAGE_LIBS" BT_LDFLAGS="$DEBUG_LDFLAGS" if test "x${enable_Bsymbolic}" == "xyes"; then BT_LDFLAGS="$BT_LDFLAGS -Wl,-Bsymbolic-functions" fi # Extract the first word of "update-mime-database", so it can be a program name with args. set dummy update-mime-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_UPDATE_MIME_DATABASE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $UPDATE_MIME_DATABASE in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATE_MIME_DATABASE="$UPDATE_MIME_DATABASE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UPDATE_MIME_DATABASE="$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 UPDATE_MIME_DATABASE=$ac_cv_path_UPDATE_MIME_DATABASE if test -n "$UPDATE_MIME_DATABASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_MIME_DATABASE" >&5 $as_echo "$UPDATE_MIME_DATABASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "update-desktop-database", so it can be a program name with args. set dummy update-desktop-database; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_UPDATE_DESKTOP_DATABASE+set}" = set; then : $as_echo_n "(cached) " >&6 else case $UPDATE_DESKTOP_DATABASE in [\\/]* | ?:[\\/]*) ac_cv_path_UPDATE_DESKTOP_DATABASE="$UPDATE_DESKTOP_DATABASE" # 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 { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_UPDATE_DESKTOP_DATABASE="$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 UPDATE_DESKTOP_DATABASE=$ac_cv_path_UPDATE_DESKTOP_DATABASE if test -n "$UPDATE_DESKTOP_DATABASE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UPDATE_DESKTOP_DATABASE" >&5 $as_echo "$UPDATE_DESKTOP_DATABASE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_config_files="$ac_config_files Makefile docs/Makefile docs/version.entities docs/help/Makefile docs/help/bt-edit/Makefile docs/help/bt-edit/C/Makefile docs/help/bt-edit/C/buzztard-edit-C.omf docs/reference/Makefile docs/reference/bt-cmd/Makefile docs/reference/bt-core/Makefile docs/reference/bt-core/buzztard-core.types docs/reference/bt-edit/Makefile docs/reference/bt-ic/Makefile docs/reference/bt-ic/buzztard-ic.types docs/reference/bt-ic/buzztard-ic-sections.txt pixmaps/Makefile pixmaps/hicolor/Makefile pixmaps/gnome/Makefile po/Makefile.in src/Makefile src/lib/Makefile src/lib/buzztard.xml src/lib/core/Makefile src/lib/core/libbuzztard-core.pc src/lib/core/libbuzztard-core/Makefile src/lib/core/libbuzztard-core/version.h src/lib/ic/Makefile src/lib/ic/libbuzztard-ic.pc src/lib/ic/libbuzztard-ic/Makefile src/lib/ic/libbuzztard-ic/version.h src/ui/Makefile src/ui/cmd/Makefile src/ui/dec/Makefile src/ui/edit/Makefile tests/Makefile tests/bt-cfg.sh tests/lib/Makefile tests/lib/core/Makefile tests/lib/ic/Makefile tests/ui/Makefile tests/ui/cmd/Makefile tests/ui/edit/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 test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file 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= 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 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__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 "${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 "${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 ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${USE_DEBUG_TRUE}" && test -z "${USE_DEBUG_FALSE}"; then as_fn_error "conditional \"USE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_DEBUG_TRUE}" && test -z "${USE_DEBUG_FALSE}"; then as_fn_error "conditional \"USE_DEBUG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_BCOV_TRUE}" && test -z "${USE_BCOV_FALSE}"; then as_fn_error "conditional \"USE_BCOV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LCOV_TRUE}" && test -z "${USE_LCOV_FALSE}"; then as_fn_error "conditional \"USE_LCOV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_VALGRIND_TRUE}" && test -z "${USE_VALGRIND_FALSE}"; then as_fn_error "conditional \"USE_VALGRIND\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then as_fn_error "conditional \"USE_GCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then as_fn_error "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then as_fn_error "conditional \"USE_GCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then as_fn_error "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GCONF_TRUE}" && test -z "${USE_GCONF_FALSE}"; then as_fn_error "conditional \"USE_GCONF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then as_fn_error "conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GUDEV_TRUE}" && test -z "${USE_GUDEV_FALSE}"; then as_fn_error "conditional \"USE_GUDEV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GUDEV_TRUE}" && test -z "${USE_GUDEV_FALSE}"; then as_fn_error "conditional \"USE_GUDEV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GUDEV_TRUE}" && test -z "${USE_GUDEV_FALSE}"; then as_fn_error "conditional \"USE_GUDEV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_HAL_TRUE}" && test -z "${USE_HAL_FALSE}"; then as_fn_error "conditional \"USE_HAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GSF_TRUE}" && test -z "${USE_GSF_FALSE}"; then as_fn_error "conditional \"USE_GSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GSF_TRUE}" && test -z "${USE_GSF_FALSE}"; then as_fn_error "conditional \"USE_GSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GSF_TRUE}" && test -z "${USE_GSF_FALSE}"; then as_fn_error "conditional \"USE_GSF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GIR_TRUE}" && test -z "${USE_GIR_FALSE}"; then as_fn_error "conditional \"USE_GIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GIR_TRUE}" && test -z "${USE_GIR_FALSE}"; then as_fn_error "conditional \"USE_GIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GIR_TRUE}" && test -z "${USE_GIR_FALSE}"; then as_fn_error "conditional \"USE_GIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_GIR_TRUE}" && test -z "${USE_GIR_FALSE}"; then as_fn_error "conditional \"USE_GIR\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_CHECK_TESTS_TRUE}" && test -z "${BUILD_CHECK_TESTS_FALSE}"; then as_fn_error "conditional \"BUILD_CHECK_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_CHECK_TESTS_TRUE}" && test -z "${BUILD_CHECK_TESTS_FALSE}"; then as_fn_error "conditional \"BUILD_CHECK_TESTS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_CHECK_TESTS_TRUE}" && test -z "${BUILD_CHECK_TESTS_FALSE}"; then as_fn_error "conditional \"BUILD_CHECK_TESTS\" 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 "${ENABLE_MAN_TRUE}" && test -z "${ENABLE_MAN_FALSE}"; then as_fn_error "conditional \"ENABLE_MAN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_SCROLLKEEPER_TRUE}" && test -z "${ENABLE_SCROLLKEEPER_FALSE}"; then as_fn_error "conditional \"ENABLE_SCROLLKEEPER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${WITH_ASPELL_TRUE}" && test -z "${WITH_ASPELL_FALSE}"; then as_fn_error "conditional \"WITH_ASPELL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_LINUX_INPUT_TRUE}" && test -z "${USE_LINUX_INPUT_FALSE}"; then as_fn_error "conditional \"USE_LINUX_INPUT\" 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. 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 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=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&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 -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' 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 if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # 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 buzztard $as_me 0.6.0, which was generated by GNU Autoconf 2.65. 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="\\ buzztard config.status 0.6.0 configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 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=$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"` ;; 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" ac_aux_dir="$ac_aux_dir" # 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 "X$macro_version" | $Xsed -e "$delay_single_quote_subst"`' macro_revision='`$ECHO "X$macro_revision" | $Xsed -e "$delay_single_quote_subst"`' enable_shared='`$ECHO "X$enable_shared" | $Xsed -e "$delay_single_quote_subst"`' enable_static='`$ECHO "X$enable_static" | $Xsed -e "$delay_single_quote_subst"`' pic_mode='`$ECHO "X$pic_mode" | $Xsed -e "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "X$enable_fast_install" | $Xsed -e "$delay_single_quote_subst"`' host_alias='`$ECHO "X$host_alias" | $Xsed -e "$delay_single_quote_subst"`' host='`$ECHO "X$host" | $Xsed -e "$delay_single_quote_subst"`' host_os='`$ECHO "X$host_os" | $Xsed -e "$delay_single_quote_subst"`' build_alias='`$ECHO "X$build_alias" | $Xsed -e "$delay_single_quote_subst"`' build='`$ECHO "X$build" | $Xsed -e "$delay_single_quote_subst"`' build_os='`$ECHO "X$build_os" | $Xsed -e "$delay_single_quote_subst"`' SED='`$ECHO "X$SED" | $Xsed -e "$delay_single_quote_subst"`' Xsed='`$ECHO "X$Xsed" | $Xsed -e "$delay_single_quote_subst"`' GREP='`$ECHO "X$GREP" | $Xsed -e "$delay_single_quote_subst"`' EGREP='`$ECHO "X$EGREP" | $Xsed -e "$delay_single_quote_subst"`' FGREP='`$ECHO "X$FGREP" | $Xsed -e "$delay_single_quote_subst"`' LD='`$ECHO "X$LD" | $Xsed -e "$delay_single_quote_subst"`' NM='`$ECHO "X$NM" | $Xsed -e "$delay_single_quote_subst"`' LN_S='`$ECHO "X$LN_S" | $Xsed -e "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "X$max_cmd_len" | $Xsed -e "$delay_single_quote_subst"`' ac_objext='`$ECHO "X$ac_objext" | $Xsed -e "$delay_single_quote_subst"`' exeext='`$ECHO "X$exeext" | $Xsed -e "$delay_single_quote_subst"`' lt_unset='`$ECHO "X$lt_unset" | $Xsed -e "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "X$lt_SP2NL" | $Xsed -e "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "X$lt_NL2SP" | $Xsed -e "$delay_single_quote_subst"`' reload_flag='`$ECHO "X$reload_flag" | $Xsed -e "$delay_single_quote_subst"`' reload_cmds='`$ECHO "X$reload_cmds" | $Xsed -e "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "X$OBJDUMP" | $Xsed -e "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "X$deplibs_check_method" | $Xsed -e "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "X$file_magic_cmd" | $Xsed -e "$delay_single_quote_subst"`' AR='`$ECHO "X$AR" | $Xsed -e "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "X$AR_FLAGS" | $Xsed -e "$delay_single_quote_subst"`' STRIP='`$ECHO "X$STRIP" | $Xsed -e "$delay_single_quote_subst"`' RANLIB='`$ECHO "X$RANLIB" | $Xsed -e "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "X$old_postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "X$old_postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "X$old_archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' CC='`$ECHO "X$CC" | $Xsed -e "$delay_single_quote_subst"`' CFLAGS='`$ECHO "X$CFLAGS" | $Xsed -e "$delay_single_quote_subst"`' compiler='`$ECHO "X$compiler" | $Xsed -e "$delay_single_quote_subst"`' GCC='`$ECHO "X$GCC" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "X$lt_cv_sys_global_symbol_pipe" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "X$lt_cv_sys_global_symbol_to_cdecl" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' objdir='`$ECHO "X$objdir" | $Xsed -e "$delay_single_quote_subst"`' SHELL='`$ECHO "X$SHELL" | $Xsed -e "$delay_single_quote_subst"`' ECHO='`$ECHO "X$ECHO" | $Xsed -e "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "X$MAGIC_CMD" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "X$lt_prog_compiler_no_builtin_flag" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "X$lt_prog_compiler_wl" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "X$lt_prog_compiler_pic" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "X$lt_prog_compiler_static" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "X$lt_cv_prog_compiler_c_o" | $Xsed -e "$delay_single_quote_subst"`' need_locks='`$ECHO "X$need_locks" | $Xsed -e "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "X$DSYMUTIL" | $Xsed -e "$delay_single_quote_subst"`' NMEDIT='`$ECHO "X$NMEDIT" | $Xsed -e "$delay_single_quote_subst"`' LIPO='`$ECHO "X$LIPO" | $Xsed -e "$delay_single_quote_subst"`' OTOOL='`$ECHO "X$OTOOL" | $Xsed -e "$delay_single_quote_subst"`' OTOOL64='`$ECHO "X$OTOOL64" | $Xsed -e "$delay_single_quote_subst"`' libext='`$ECHO "X$libext" | $Xsed -e "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "X$shrext_cmds" | $Xsed -e "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "X$extract_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "X$archive_cmds_need_lc" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "X$enable_shared_with_static_runtimes" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "X$export_dynamic_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "X$whole_archive_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "X$compiler_needs_object" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "X$old_archive_from_new_cmds" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "X$old_archive_from_expsyms_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds='`$ECHO "X$archive_cmds" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "X$archive_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_cmds='`$ECHO "X$module_cmds" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "X$module_expsym_cmds" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "X$with_gnu_ld" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "X$allow_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "X$no_undefined_flag" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "X$hardcode_libdir_flag_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld='`$ECHO "X$hardcode_libdir_flag_spec_ld" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "X$hardcode_libdir_separator" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "X$hardcode_direct" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "X$hardcode_direct_absolute" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "X$hardcode_minus_L" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "X$hardcode_shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "X$hardcode_automatic" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "X$inherit_rpath" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "X$link_all_deplibs" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path='`$ECHO "X$fix_srcfile_path" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "X$always_export_symbols" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "X$export_symbols_cmds" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "X$exclude_expsyms" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms='`$ECHO "X$include_expsyms" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "X$prelink_cmds" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec='`$ECHO "X$file_list_spec" | $Xsed -e "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "X$variables_saved_for_relink" | $Xsed -e "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "X$need_lib_prefix" | $Xsed -e "$delay_single_quote_subst"`' need_version='`$ECHO "X$need_version" | $Xsed -e "$delay_single_quote_subst"`' version_type='`$ECHO "X$version_type" | $Xsed -e "$delay_single_quote_subst"`' runpath_var='`$ECHO "X$runpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "X$shlibpath_var" | $Xsed -e "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "X$shlibpath_overrides_runpath" | $Xsed -e "$delay_single_quote_subst"`' libname_spec='`$ECHO "X$libname_spec" | $Xsed -e "$delay_single_quote_subst"`' library_names_spec='`$ECHO "X$library_names_spec" | $Xsed -e "$delay_single_quote_subst"`' soname_spec='`$ECHO "X$soname_spec" | $Xsed -e "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "X$postinstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "X$postuninstall_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_cmds='`$ECHO "X$finish_cmds" | $Xsed -e "$delay_single_quote_subst"`' finish_eval='`$ECHO "X$finish_eval" | $Xsed -e "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "X$hardcode_into_libs" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "X$sys_lib_search_path_spec" | $Xsed -e "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "X$sys_lib_dlsearch_path_spec" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action='`$ECHO "X$hardcode_action" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "X$enable_dlopen" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`' old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`' striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "X$compiler_lib_search_dirs" | $Xsed -e "$delay_single_quote_subst"`' predep_objects='`$ECHO "X$predep_objects" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects='`$ECHO "X$postdep_objects" | $Xsed -e "$delay_single_quote_subst"`' predeps='`$ECHO "X$predeps" | $Xsed -e "$delay_single_quote_subst"`' postdeps='`$ECHO "X$postdeps" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "X$compiler_lib_search_path" | $Xsed -e "$delay_single_quote_subst"`' LD_CXX='`$ECHO "X$LD_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "X$old_archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "X$compiler_CXX" | $Xsed -e "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "X$GCC_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "X$lt_prog_compiler_no_builtin_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "X$lt_prog_compiler_wl_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "X$lt_prog_compiler_pic_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "X$lt_prog_compiler_static_CXX" | $Xsed -e "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "X$lt_cv_prog_compiler_c_o_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "X$archive_cmds_need_lc_CXX" | $Xsed -e "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "X$enable_shared_with_static_runtimes_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "X$export_dynamic_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "X$whole_archive_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "X$compiler_needs_object_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "X$old_archive_from_new_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "X$old_archive_from_expsyms_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "X$archive_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "X$archive_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "X$module_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "X$module_expsym_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "X$with_gnu_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "X$allow_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "X$no_undefined_flag_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "X$hardcode_libdir_flag_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_ld_CXX='`$ECHO "X$hardcode_libdir_flag_spec_ld_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "X$hardcode_libdir_separator_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "X$hardcode_direct_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "X$hardcode_direct_absolute_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "X$hardcode_minus_L_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "X$hardcode_shlibpath_var_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "X$hardcode_automatic_CXX" | $Xsed -e "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "X$inherit_rpath_CXX" | $Xsed -e "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "X$link_all_deplibs_CXX" | $Xsed -e "$delay_single_quote_subst"`' fix_srcfile_path_CXX='`$ECHO "X$fix_srcfile_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "X$always_export_symbols_CXX" | $Xsed -e "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "X$export_symbols_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "X$exclude_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "X$include_expsyms_CXX" | $Xsed -e "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "X$prelink_cmds_CXX" | $Xsed -e "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "X$file_list_spec_CXX" | $Xsed -e "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "X$hardcode_action_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "X$compiler_lib_search_dirs_CXX" | $Xsed -e "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "X$predep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "X$postdep_objects_CXX" | $Xsed -e "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "X$predeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "X$postdeps_CXX" | $Xsed -e "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "X$compiler_lib_search_path_CXX" | $Xsed -e "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # Quote evaled strings. for var in SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ AR \ AR_FLAGS \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ SHELL \ ECHO \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_wl \ lt_prog_compiler_pic \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ 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_flag_spec_ld \ hardcode_libdir_separator \ fix_srcfile_path \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_pic_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_flag_spec_ld_CXX \ hardcode_libdir_separator_CXX \ fix_srcfile_path_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 "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) 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 \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ 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; do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\$0 --fallback-echo"') lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\$0 --fallback-echo"\$/\$0 --fallback-echo"/'\` ;; esac ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which 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' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' # Capture the value of obsolete ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" _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 "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;; "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;; "docs/help/Makefile") CONFIG_FILES="$CONFIG_FILES docs/help/Makefile" ;; "docs/help/bt-edit/Makefile") CONFIG_FILES="$CONFIG_FILES docs/help/bt-edit/Makefile" ;; "docs/help/bt-edit/C/Makefile") CONFIG_FILES="$CONFIG_FILES docs/help/bt-edit/C/Makefile" ;; "docs/help/bt-edit/C/buzztard-edit-C.omf") CONFIG_FILES="$CONFIG_FILES docs/help/bt-edit/C/buzztard-edit-C.omf" ;; "docs/reference/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/Makefile" ;; "docs/reference/bt-cmd/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-cmd/Makefile" ;; "docs/reference/bt-core/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-core/Makefile" ;; "docs/reference/bt-core/buzztard-core.types") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-core/buzztard-core.types" ;; "docs/reference/bt-edit/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-edit/Makefile" ;; "docs/reference/bt-ic/Makefile") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-ic/Makefile" ;; "docs/reference/bt-ic/buzztard-ic.types") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-ic/buzztard-ic.types" ;; "docs/reference/bt-ic/buzztard-ic-sections.txt") CONFIG_FILES="$CONFIG_FILES docs/reference/bt-ic/buzztard-ic-sections.txt" ;; "pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/Makefile" ;; "pixmaps/hicolor/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/hicolor/Makefile" ;; "pixmaps/gnome/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/gnome/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/lib/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/Makefile" ;; "src/lib/buzztard.xml") CONFIG_FILES="$CONFIG_FILES src/lib/buzztard.xml" ;; "src/lib/core/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/core/Makefile" ;; "src/lib/core/libbuzztard-core.pc") CONFIG_FILES="$CONFIG_FILES src/lib/core/libbuzztard-core.pc" ;; "src/lib/core/libbuzztard-core/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/core/libbuzztard-core/Makefile" ;; "src/lib/core/libbuzztard-core/version.h") CONFIG_FILES="$CONFIG_FILES src/lib/core/libbuzztard-core/version.h" ;; "src/lib/ic/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/ic/Makefile" ;; "src/lib/ic/libbuzztard-ic.pc") CONFIG_FILES="$CONFIG_FILES src/lib/ic/libbuzztard-ic.pc" ;; "src/lib/ic/libbuzztard-ic/Makefile") CONFIG_FILES="$CONFIG_FILES src/lib/ic/libbuzztard-ic/Makefile" ;; "src/lib/ic/libbuzztard-ic/version.h") CONFIG_FILES="$CONFIG_FILES src/lib/ic/libbuzztard-ic/version.h" ;; "src/ui/Makefile") CONFIG_FILES="$CONFIG_FILES src/ui/Makefile" ;; "src/ui/cmd/Makefile") CONFIG_FILES="$CONFIG_FILES src/ui/cmd/Makefile" ;; "src/ui/dec/Makefile") CONFIG_FILES="$CONFIG_FILES src/ui/dec/Makefile" ;; "src/ui/edit/Makefile") CONFIG_FILES="$CONFIG_FILES src/ui/edit/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/bt-cfg.sh") CONFIG_FILES="$CONFIG_FILES tests/bt-cfg.sh" ;; "tests/lib/Makefile") CONFIG_FILES="$CONFIG_FILES tests/lib/Makefile" ;; "tests/lib/core/Makefile") CONFIG_FILES="$CONFIG_FILES tests/lib/core/Makefile" ;; "tests/lib/ic/Makefile") CONFIG_FILES="$CONFIG_FILES tests/lib/ic/Makefile" ;; "tests/ui/Makefile") CONFIG_FILES="$CONFIG_FILES tests/ui/Makefile" ;; "tests/ui/cmd/Makefile") CONFIG_FILES="$CONFIG_FILES tests/ui/cmd/Makefile" ;; "tests/ui/edit/Makefile") CONFIG_FILES="$CONFIG_FILES tests/ui/edit/Makefile" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) 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= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$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 -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # 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 {' >"$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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$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 $(srcdir), # ${srcdir} and @srcdir@ 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[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// 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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; 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="$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 "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 >"$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 "$tmp/subs.awk" >$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' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$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 "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$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 "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$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 "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$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"" || { # Autoconf 2.62 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. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which 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 # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### 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 # 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 # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # 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 # The archiver. AR=$lt_AR AR_FLAGS=$lt_AR_FLAGS # 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 # 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 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 of the directory that contains temporary libtool files. objdir=$objdir # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that does not interpret backslashes. ECHO=$lt_ECHO # 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 # 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 # 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 # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # 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 # 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 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # 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 # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld # 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 # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path # 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 # 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 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 "X${COLLECT_NAMES+set}" != Xset; 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # 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" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname 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). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $* )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } # func_stripname 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). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[^=]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[^.]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$@"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1+=\$2" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$1=\$$1\$2" } _LT_EOF ;; esac sed -n '/^# Generated shell functions inserted here/,$p' "$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 # 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 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_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 # If ld is used when linking, flag to hardcode \$libdir into a binary # during linking. This must work even if \$libdir does not exist. hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_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 # Fix the shell variable \$srcfile for the compiler. fix_srcfile_path=$lt_fix_srcfile_path_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 # 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 ;; "default-1":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 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" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|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 ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; 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 $? 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 if test "x${coverage_tool}" != "x"; then using_coverage_tool="(using ${coverage_tool})" fi echo " Configuration Version : ${VERSION} Source code location : ${srcdir} Prefix : ${prefix} Compiler : ${CC} Documentation (API) : ${enable_gtk_doc} Documentation (Man) : ${enable_man} Documentation (User) : ${have_scrollkeeper} Bindings Metadata (GIR) : ${enable_gir} GUdev for interaction ctrl. : ${use_gudev} HAL for interaction ctrl. : ${use_hal} Linux HID for interaction ctrl. : ${have_linux_input_h} Buzzmachine Host support : ${use_bml} Zipped Song file support (bzt) : ${use_gsf} Hildon Desktop Integration : ${use_hildon} Debug : ${enable_debug} Coverage profiling : ${enable_coverage} ${using_coverage_tool} UI tests on Xvfb : ${have_xvfb} Use of deprecated API : ${enable_deprecated} Check based unit tests : ${have_check} " if test "x${use_bml}" = "xno" -o "x${use_gudev}" = "xno" -o "x${use_gsf}" = "xno" ; then echo " Some features are not built. If you like to have them built, please check that you have the required -devel packages installed and that they can be found in your PKG_CONFIG_PATH ($PKG_CONFIG_PATH). " fi if test ! `echo "$PKG_CONFIG_PATH:/usr" | tr \: \\n | grep $prefix` ; then echo " You are installing buzztard libraries into a location that is not yet known to system. In order for other buzztard modules to find them and the application to work with all features please register the location (see README for details): export LD_LIBRARY_PATH=$prefix/lib:\$LD_LIBRARY_PATH export MANPATH=\$MANPATH:$prefix/share/man export DEVHELP_SEARCH_PATH="\$DEVHELP_SEARCH_PATH:$prefix/share/gtk-doc/html" export PKG_CONFIG_PATH="\$PKG_CONFIG_PATH:$prefix/lib/pkgconfig" export GST_PLUGIN_PATH="\$GST_PLUGIN_PATH:$prefix/lib/gstreamer-0.10" export XDG_DATA_DIRS="\$XDG_DATA_DIRS:$prefix/share" export GI_TYPELIB_PATH="\$GI_TYPELIB_PATH:$prefix/lib/girepository" " fi buzztard-0.6.0/INSTALL0000644042355400116100000003633211576377402011365 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009 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 commands `./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. 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 bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /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. buzztard-0.6.0/Makefile.am0000644042355400116100000000720411576360407012361 00000000000000## $Id: Makefile.am 3320 2011-04-14 14:35:04Z ensonic $ SRCDIRS = src tests SUBDIRS = $(SRCDIRS) pixmaps po docs ACLOCAL_AMFLAGS = -I m4 DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-debug --disable-scrollkeeper schemasdir = $(GCONF_SCHEMA_FILE_DIR) schemas_in_files = buzztard.schemas.in schemas_DATA = $(schemas_in_files:.schemas.in=.schemas) EXTRA_DIST = \ $(schemas_DATA) \ intltool-extract.in \ intltool-merge.in \ intltool-update.in \ COPYING-DOCS \ omf.make \ xmldocs.make \ TODO \ po/$(GETTEXT_PACKAGE).pot @INTLTOOL_SCHEMAS_RULE@ DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-update clean-local: rm -f po/.intltool-merge-cache if GCONF_SCHEMAS_INSTALL install-data-local: @if test -z "$(DESTDIR)" ; then \ for p in $(schemas_DATA) ; do \ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ $(GCONFTOOL) --makefile-install-rule $(top_srcdir)/$$p ; \ done \ fi endif if GCONF_SCHEMAS_INSTALL uninstall-local: @if test -z "$(DESTDIR)" ; then \ for p in $(schemas_DATA) ; do \ GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ $(GCONFTOOL) --makefile-uninstall-rule $(top_srcdir)/$$p ; \ done \ fi endif ## this seems to fail during make distcheck ##uninstall-local: ## rm -r $(datadir)/$(PACKAGE) ## We get warnings for left-over files when doing 'make distuninstallcheck' distuninstallcheck_listfiles = find . -type f -print ## Workaround for scrollkeeper bug distuninstallcheck_listfiles += | grep -v '/var/scrollkeeper' ## Workaround for installing files in own prefix distuninstallcheck_listfiles += | grep -v '/share/mime' ## Workaround for installing icon theme in own prefix distuninstallcheck_listfiles += | grep -v 'icon-theme.cache' .PHONY: help coverage valgrind dict todo stats splint if USE_LCOV coverage:: mkdir -p ./coverage lcov --compat-libtool --directory . --zerocounters -$(MAKE) check lcov --compat-libtool --directory ./src --capture --output-file ./coverage/$(PACKAGE)_tmp.info lcov --compat-libtool --extract ./coverage/$(PACKAGE)_tmp.info "$(PWD)/src*" -o ./coverage/$(PACKAGE).info $(RM) ./coverage/$(PACKAGE)_tmp.info genhtml -o ./coverage --num-spaces 2 ./coverage/$(PACKAGE).info endif if USE_BCOV coverage:: mkdir -p ./coverage $(MAKE) -C tests coverage bcov-report -i $(abs_top_builddir)/src tests/.bcovdump.all ./coverage endif if USE_VALGRIND valgrind:: $(MAKE) -C tests valgrind endif dict:: tags echo "personal_ws" >$(PACKAGE).aspell_dict @find . -name tags -exec grep -v "$\!" {} \; | cut -f1 | sort | uniq >>$(PACKAGE).aspell_dict todo:: @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@todo .*" {} \; | sed "s/@todo/error:/" @find . \( -name "*.c" -o -name "*.h" \) -exec grep -Hno "@idea .*" {} \; | sed "s/@idea/warning:/" stats:: @find . \( -name "*.c" -o -name "*.h" \) -printf "%s %p\n" | sort -n splint:: for dir in $(SRCDIRS); do $(MAKE) -C $$dir splint ; done # -k2 in sort for Tranditional McCabe Cyclomatic Complexity cc10: @pmccabe `find src -name '*.c'` | sort -nr | awk '($$1 > 10)' cc20: @pmccabe `find src -name '*.c'` | sort -nr | awk '($$1 > 20)' help:: @echo "make coverage -- run all checks and generate html coverage report" @echo " only availble when built using --enable-coverage" @echo "make valgrind -- run all checks under valgrind" @echo @echo "make dict -- create an aspell dictionary from tags" @echo @echo "make todo -- generate a list of TODO items in the form of gcc error/warnings" @echo "make stats -- run source code stats" @echo "make splint -- run splint source code checks" buzztard-0.6.0/depcomp0000754042355400116100000004426711576377401011715 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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 outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac 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" # 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 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 -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## 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). ## - 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 -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## 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. tr ' ' ' ' < "$tmpdepfile" | ## 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. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then : else 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 ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; 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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 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 -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else 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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` 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 -eq 0; then : else 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,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#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. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # 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.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. 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" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. 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:: \1 \\:p' >> "$depfile" echo " " >> "$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 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: buzztard-0.6.0/config.guess0000754042355400116100000013105411576377400012646 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 # Free Software Foundation, Inc. timestamp='2009-06-10' # 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 2 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, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # 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 Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 # 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 tupples: *-*-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=`(/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 ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in 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 # 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/[-_].*/\./'` ;; 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}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${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 ;; 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'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; 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: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:*:[456]) 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/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` 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:BSD:*) 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:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd | genuineintel) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-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-gnu`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 '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix 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-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu 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 | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu 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="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu 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-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.*:* | i*86:SYSTEM_V: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 configury 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 ;; 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 ;; 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 case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac 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 ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-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 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp 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` /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-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: buzztard-0.6.0/gtk-doc.make0000644042355400116100000001726711675570451012530 00000000000000# -*- mode: makefile -*- #################################### # 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) \ $(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) if ENABLE_GTK_DOC 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-local: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) else all-local: endif docs: $(HTML_BUILD_STAMP) $(PDF_BUILD_STAMP) $(REPORT_FILES): sgml-build.stamp #### setup #### setup-build.stamp: -@if test "$(abs_srcdir)" != "$(abs_builddir)" ; then \ echo ' DOC Preparing build'; \ files=`echo $(SETUP_FILES) $(expand_content_files) $(DOC_MODULE).types`; \ if test "x$$files" != "x" ; then \ for file in $$files ; do \ test -f $(abs_srcdir)/$$file && \ cp -pu $(abs_srcdir)/$$file $(abs_builddir)/ || true; \ done; \ fi; \ fi @touch setup-build.stamp #### scan #### scan-build.stamp: $(HFILE_GLOB) $(CFILE_GLOB) @echo ' DOC Scanning header files' @_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) @if grep -l '^..*$$' $(DOC_MODULE).types > /dev/null 2>&1 ; then \ echo " DOC Introspecting gobjects"; \ 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 @touch scan-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt: scan-build.stamp @true #### xml #### sgml-build.stamp: setup-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_MODULE)-overrides.txt $(expand_content_files) @echo ' DOC Building 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) @touch sgml-build.stamp sgml.stamp: sgml-build.stamp @true #### html #### html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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 \ if test -f $(abs_srcdir)/$$file ; then \ cp $(abs_srcdir)/$$file $(abs_builddir)/html; \ fi; \ if test -f $(abs_builddir)/$$file ; then \ cp $(abs_builddir)/$$file $(abs_builddir)/html; \ fi; \ done; @echo ' DOC Fixing cross-references' @gtkdoc-fixxref --module=$(DOC_MODULE) --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS) @touch html-build.stamp #### pdf #### pdf-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files) @echo ' DOC Building 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) @touch pdf-build.stamp ############## clean-local: @rm -f *~ *.bak @rm -rf .libs 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) $(expand_content_files) $(DOC_MODULE).types; \ fi maintainer-clean-local: clean @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 ENABLE_GTK_DOC dist-check-gtkdoc: else dist-check-gtkdoc: @echo "*** gtk-doc must be installed and enabled in order to make dist" @false endif dist-hook: dist-check-gtkdoc 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 buzztard-0.6.0/NEWS0000644042355400116100000000635211675567177011044 000000000000000.6.0 black beats blue (25.Dec.2011) ================================================================================ Main feature of this release is full undo/redo support. Related to it is the journaling of edit action and the crash recovery. This way chances of losing changes in the song are quite low. Other UI improvements are: tip of day, improved spectrum analyzer, clipboard support, more commands in context menus and many more). This release features a gstreamer decoder that enables playback of buzztard songs in any gstreamer based media player. We also kept the buzztard codebase clean and ported from deprecated APIs to the successors (gnomevfs->gio, hal->gudev). The libraries and the applications got performance improvements in many areas. Also the docs have been improved a lot with tutorials, keyboard shortcut tables, better coverage and man-pages. 0.5.0 crown of thorns (06.Sep.2009) ================================================================================ Rewrite of internal pipeline management. One can now play partially connected songs, and add/remove plugins while playing. Buzztard can play notes while editing. More robust saving of songs. Lots of bugfixes and UI improvements. Better user-guide including three small tutorials. Initial support for python and javascript via gobject introspection. 0.4.0 the light in your eyes (26.Nov.2008) ================================================================================ As planned, main focus for this release was the wavetable support. Its done - buzztard can load what gstreamer can decode. The wavetable view has a nice waveform widget. Related to that buzztard has a new song-format that bundles the XML together with external files in a zip archive. Also the UI has seen a lot of improvements. The machine view looks nicer - Marc drew spiffy machine icons. In addition they now show real volume meters when playing. All meters are now properly synced. 0.3.1 after the ice (12.Apr.2008) ================================================================================ Lots of bugfixes, mostly memory leak and reference counting fixes. A few improvements on the new pattern editor widget (added native scrolling and column headers). 0.3.0 a tale of ice and darkness (26.Mar.2008) ================================================================================ Improvements in all areas. We now have native buzzmachine support and better compatibility. The buzztard editor got an own pattern editor widget. The ui got lots of keyboard commands. We have settings for default directories used. The ui has dialogs for recording mix-downs and also single tracks. 0.2.0 sunrise release (03.May.2007) ================================================================================ This version has lots of UI usability improvements, bug fixes, more instant apply settings and introduces some interactivity features (interaction controller and upnp playback controller). 0.1.0 genesis release (30.Oct.2006) ================================================================================ This is a technical preview version. The application is not complete or end-user ready yet. The fileformat of the songs can still change. Nonetheless if you find bugs or have comments, please take your time to contact us. buzztard-0.6.0/m4/0000755042355400116100000000000011675570644010730 500000000000000buzztard-0.6.0/m4/libtool.m40000644042355400116100000077464711675570446012607 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 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) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # 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 GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 56 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.58])dnl We use AC_INCLUDES_DEFAULT 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 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_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` ]) # _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 _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_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which 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 _LT_PROG_ECHO_BACKSLASH 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 "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # 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. 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' # 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_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 "X$][$1" | $Xsed -e "$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 "X$" | $Xsed -e "$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' # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) 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 "X\\\\\$\$var"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Fix-up fallback echo if it was mangled by the above quoting rules. case \$lt_ECHO in *'\\\[$]0 --fallback-echo"')dnl " lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\` ;; esac _LT_OUTPUT_LIBTOOL_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]) cat >"$CONFIG_LT" <<_LTEOF #! $SHELL # Generated by $as_me. # Run this file to recreate a libtool stub with the current configuration. lt_cl_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 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) 2008 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. if test "$no_create" != yes; then lt_cl_success=: test "$silent" = yes && 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) fi ])# 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 which 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 # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _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 "X${COLLECT_NAMES+set}" != Xset; 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 '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_XSI_SHELLFNS sed -n '/^# Generated shell functions inserted here/,$p' "$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' TIMESTAMP='$TIMESTAMP' 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)], [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 # _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([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)]) 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], []) # _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 test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; 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" ]) 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 "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; 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" != ":"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES # -------------------------- # 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 _LT_TAGVAR(whole_archive_flag_spec, $1)='' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=echo _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 "$lt_cv_apple_cc_single_mod" != "yes"; 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 # ----------------------- # 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. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl AC_LINK_IFELSE(AC_LANG_PROGRAM,[ lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/ p } }' 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 "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], [AC_DIVERT_PUSH(NOTICE)]) $1 AC_DIVERT_POP ])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Add some code to the start of the generated configure script which # will find an echo command which doesn't interpret backslashes. m4_defun([_LT_PROG_ECHO_BACKSLASH], [_LT_SHELL_INIT([ # Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} case X$lt_ECHO in X*--fallback-echo) # Remove one level of quotation (which was required for Make). ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` ;; esac ECHO=${lt_ECHO-echo} if test "X[$]1" = X--no-reexec; then # Discard the --no-reexec flag, and continue. shift elif test "X[$]1" = X--fallback-echo; then # Avoid inline document here, it may be left over : elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then # Yippee, $ECHO works! : else # Restart under the correct shell. exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} fi if test "X[$]1" = X--fallback-echo; then # used as fallback echo shift cat <<_LT_EOF [$]* _LT_EOF exit 0 fi # 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 if test -z "$lt_ECHO"; then if test "X${echo_test_string+set}" != Xset; then # find a string as large as possible, as long as the shell can cope with it for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... if { echo_test_string=`eval $cmd`; } 2>/dev/null && { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null then break fi done fi if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then : else # The Solaris, AIX, and Digital Unix default echo programs unquote # backslashes. This makes it impossible to quote backslashes using # echo "$something" | sed 's/\\/\\\\/g' # # So, first we look for a working echo in the user's PATH. lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for dir in $PATH /usr/ucb; do IFS="$lt_save_ifs" if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$dir/echo" break fi done IFS="$lt_save_ifs" if test "X$ECHO" = Xecho; then # We didn't find a better echo, so look for alternatives. if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # This shell has a builtin print -r that does the trick. ECHO='print -r' elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } && test "X$CONFIG_SHELL" != X/bin/ksh; then # If we have ksh, try running configure again with it. ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} export ORIGINAL_CONFIG_SHELL CONFIG_SHELL=/bin/ksh export CONFIG_SHELL exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} else # Try using printf. ECHO='printf %s\n' if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' && echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then # Cool, printf works : elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL export CONFIG_SHELL SHELL="$CONFIG_SHELL" export SHELL ECHO="$CONFIG_SHELL [$]0 --fallback-echo" elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && test "X$echo_testing_string" = 'X\t' && echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && test "X$echo_testing_string" = "X$echo_test_string"; then ECHO="$CONFIG_SHELL [$]0 --fallback-echo" else # maybe with a smaller string... prev=: for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null then break fi prev="$cmd" done if test "$prev" != 'sed 50q "[$]0"'; then echo_test_string=`eval $prev` export echo_test_string exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} else # Oops. We lost completely, so just stick with echo. ECHO=echo fi fi fi fi fi fi # Copy echo and quote the copy suitably for passing to libtool from # the Makefile, instead of quoting the original, which is used later. lt_ECHO=$ECHO if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" fi AC_SUBST(lt_ECHO) ]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that does not interpret backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _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 "x$enable_libtool_lock" != xno && 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 which ABI we are using. 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 which ABI we are using. echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; 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* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. 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*) LD="${LD-ld} -m elf_i386" ;; ppc64-*linux*|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" ;; ppc*-*linux*|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 x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; sparc*-*solaris*) # Find out which ABI we are using. 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*) LD="${LD-ld} -m elf64_sparc" ;; *) 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_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [AC_CHECK_TOOL(AR, ar, false) test -z "$AR" && AR=ar test -z "$AR_FLAGS" && AR_FLAGS=cru _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1]) 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 openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" fi _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_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" # 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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 x"[$]$2" = xyes; 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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 x"[$]$2" = xyes; 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; ;; 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; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # 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 ;; 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"; 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"`$SHELL [$]0 --fallback-echo "X$teststring$teststring" 2>/dev/null` \ = "XX$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 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 "$cross_compiling" = yes; 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 __oline__ "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 void fnord() { int i=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; /* 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 "x$enable_dlopen" != xyes; 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 ]) ;; *) 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 "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && 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 "x$lt_cv_dlopen_self" = xyes; 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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; 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 "$hard_links" = no; 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 in which 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 "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # 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 "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; 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 "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; 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_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 AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$lt_search_path_spec" | $GREP ';' >/dev/null ; then # 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 -e 's/;/ /g'` else lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # 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` 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" else 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; } }'` sys_lib_search_path_spec=`$ECHO $lt_search_path_spec` 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 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 need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; 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 # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # 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}' else # 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' fi 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=`$ECHO "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $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 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,$host_os in yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*) 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="/usr/lib /lib/w32api /lib /usr/local/lib" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH printed by # mingw gcc, but we are running on Cygwin. Gcc prints its search # path with ; separators, and with drive letters. We can handle the # drive letters (cygwin fileutils understands them), so leave them, # especially as we might pass files found there to a mingw objdump, # which wouldn't understand a cygwinified path. Ahh. 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 ;; 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 ;; *) library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' ;; esac dynamic_linker='Win32 ld.exe' # 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 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 ;; freebsd1*) dynamic_linker=no ;; 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[[123]]*) 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} $libname${shared_ext}' 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 ;; 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 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 "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; 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' ;; interix[[3-9]]*) 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' 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 "$lt_cv_prog_gnu_ld" = yes; then version_type=linux 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 ;; # This must be Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-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' 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 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], [shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir # 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 # Append ld.so.conf contents 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;/^$/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 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*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac 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 if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; 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 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 "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux 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 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=freebsd-elf 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 "$with_gnu_ld" = yes; 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 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 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 "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _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([], [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], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which 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 which 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 AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl 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(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 /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 lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' 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 ;; gnu*) 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]) 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 Linux ELF. linux* | k*bsd*-gnu | kopensolaris*-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*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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 ;; esac ]) 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_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 case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) 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 "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. AC_CHECK_TOOLS(DUMPBIN, ["dumpbin -symbols" "link -dump -symbols"], :) 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:__oline__: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:__oline__: $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:__oline__: 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_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cygwin* | *-*-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 "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' _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([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 "$host_cpu" = ia64; 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 # 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 -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$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 -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/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 # and D for any global 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};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print 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 # 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 if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && 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 #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. */ const struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$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_save_LIBS="$LIBS" lt_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_save_LIBS" CFLAGS="$lt_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 "$pipe_works" = yes; 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 _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_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_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)= AC_MSG_CHECKING([for $compiler option to produce PIC]) m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; 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 "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; 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']) ;; 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)= ;; 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 "$host_cpu" = ia64; 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 ;; 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 "$host_cpu" != ia64; 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) 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*) # IBM XL 8.0 on PPC _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*) # 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 "$GCC" = yes; 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 "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; 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']) ;; 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' ;; 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 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 "$host_cpu" = ia64; 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 ;; 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']) ;; 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) 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' ;; # 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' ;; pgcc* | pgf77* | pgf90* | pgf95*) # 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*) # IBM XL C 8.0/Fortran 10.1 on PPC _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)='-Wl,' ;; *Sun\ F*) # 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)='' ;; 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*) _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 which 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_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # 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]) # # 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_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' 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 AIX nm, but means don't demangle with GNU 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")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' ;; linux* | k*bsd*-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 _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] ], [ 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_flag_spec_ld, $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 "$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 ;; linux* | k*bsd*-gnu) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; 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 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 "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH *** so that a non-GNU linker is found, and then restart. _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(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/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' 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 (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; 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 ;; 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 "$host_os" = linux-dietlibc; 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 "$tmp_diet" = no then tmp_addflag= 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; $ECHO \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95*) # 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; $ECHO \"$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' ;; xl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; 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; $ECHO \"$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 "x$supports_anon_versioning" = xyes; 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 xlf*) # 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)= _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; 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 $compiler_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 $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' 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 $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 ;; 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 can not *** 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 $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 if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; 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 "$GCC" = yes && 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 "$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 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 AIX nm, but means don't demangle with GNU 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")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | 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 # 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 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,' if test "$GCC" = yes; 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 "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; 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 "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi 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_use_runtimelinking" = yes; 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 _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 "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; 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 _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' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 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. _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 `$ECHO "X$deplibs" | $Xsed -e '\''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(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; 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 ;; freebsd1*) _LT_TAGVAR(ld_shlibs, $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 -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 "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $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 $output_objdir/$soname = $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 "$GCC" = yes -a "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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 "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $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 "$GCC" = yes -a "$with_gnu_ld" = no; 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${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' ;; *) _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 "$with_gnu_ld" = no; 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 "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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. save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE(int foo(void) {}, _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' ) LDFLAGS="$save_LDFLAGS" else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && $ECHO "X-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 ;; 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*) 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__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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 case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _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' ;; esac 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 _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO " SINGLE NONSHARED" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "$GCC" = yes; 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}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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 "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${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 ${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 "$GCC" = yes; 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 "x$host_vendor" = xsequent; 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 "$GCC" = yes; 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 can NOT 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 "$GCC" = yes; 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 x$host_vendor = xsni; 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 "$_LT_TAGVAR(ld_shlibs, $1)" = no && 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 "$enable_shared" = yes && test "$GCC" = yes; 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_MSG_CHECKING([whether -lc should be explicitly linked in]) $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_TAGVAR(archive_cmds_need_lc, $1)=no else _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* AC_MSG_RESULT([$_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_flag_spec_ld], [1], [[If ld is used when linking, 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([], [fix_srcfile_path], [1], [Fix the shell variable $srcfile for the compiler]) _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([], [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 which 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 "$can_build_shared" = "no" && 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 "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no 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 "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_PROG_CXX # ------------ # Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++ # compiler, we have our own version here. m4_defun([_LT_PROG_CXX], [ pushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes]) AC_PROG_CXX if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_CXX dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_CXX], []) # _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], [AC_REQUIRE([_LT_PROG_CXX])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl 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_flag_spec_ld, $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(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 "$_lt_caught_CXX_error" != yes; 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_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++"} 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 "$GXX" = yes; 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 "$GXX" = yes; 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 "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -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 "\-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 "$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 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 # need to do runtime linking. 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 ;; 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,' if test "$GXX" = yes; 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 "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; 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 "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi 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_use_runtimelinking" = yes; 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 _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 "x${allow_undefined_flag}" != "x"; then $ECHO "X${wl}${allow_undefined_flag}" | $Xsed; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" else if test "$host_cpu" = ia64; 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 _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' # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' 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*) # _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(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 (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; 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 ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; 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 ;; freebsd[[12]]*) # 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 ;; gnu*) ;; 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 $output_objdir/$soname = $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; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $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 $with_gnu_ld = no; 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; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; 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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "$GXX" = yes; then if test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` -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) 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; $ECHO "X$list" | $Xsed' _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 | $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 | $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 | $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 | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' ;; *) # Version 6 will 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; $ECHO \"$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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; xl*) # 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 "x$supports_anon_versioning" = xyes; 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; $ECHO \"$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='echo' # 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 ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) 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__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; 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=echo 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" && $ECHO "X${wl}-set_version $verstring" | $Xsed` -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" && $ECHO "X-set_version $verstring" | $Xsed` -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 "X-set_version $verstring" | $Xsed` -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=`$ECHO "X$templist" | $Xsed -e "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; $ECHO "X$list" | $Xsed' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; 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" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "${wl}-set_version ${wl}$verstring" | $Xsed` ${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 "\-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*) # 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='echo' # 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 "$GXX" = yes && test "$with_gnu_ld" = no; 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 -nostdlib $LDFLAGS $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 -nostdlib ${wl}-M $wl$lib.exp -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 "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $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 -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 "\-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 can NOT 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(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 "$_LT_TAGVAR(ld_shlibs, $1)" = no && 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 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 "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _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 # 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 ]) 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 $p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue else prev= fi if test "$pre_test_object_deps_done" = no; then case $p 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 ;; *.$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 "$pre_test_object_deps_done" = no; 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 # 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)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; 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_PROG_F77 # ------------ # Since AC_PROG_F77 is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_F77], [ pushdef([AC_MSG_ERROR], [_lt_disable_F77=yes]) AC_PROG_F77 if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_F77 dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_F77], []) # _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_REQUIRE([_LT_PROG_F77])dnl AC_LANG_PUSH(Fortran 77) _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_flag_spec_ld, $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(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 "$_lt_disable_F77" != yes; 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 CC=${F77-"f77"} 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 "$can_build_shared" = "no" && 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 "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no 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 "$enable_shared" = yes || 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" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_PROG_FC # ----------- # Since AC_PROG_FC is broken, in that it returns the empty string # if there is no fortran compiler, we have our own version here. m4_defun([_LT_PROG_FC], [ pushdef([AC_MSG_ERROR], [_lt_disable_FC=yes]) AC_PROG_FC if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi popdef([AC_MSG_ERROR]) ])# _LT_PROG_FC dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([_LT_PROG_FC], []) # _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_REQUIRE([_LT_PROG_FC])dnl AC_LANG_PUSH(Fortran) _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_flag_spec_ld, $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(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 "$_lt_disable_FC" != yes; 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 CC=${FC-"f95"} 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 "$can_build_shared" = "no" && 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 "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no 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 "$enable_shared" = yes || 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" fi # test "$_lt_disable_FC" != yes 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_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} 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 ## 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" ])# _LT_LANG_GCJ_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_GCC=$GCC GCC= CC=${RC-"windres"} 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" ])# _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 "x${GCJFLAGS+set}" = xset || 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_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_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 $lt_ac_count -gt 10 && 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], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) 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_PROG_XSI_SHELLFNS # --------------------- # Bourne and XSI compatible variants of some useful shell functions. m4_defun([_LT_PROG_XSI_SHELLFNS], [case $xsi_shell in yes) cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac } # func_basename file func_basename () { func_basename_result="${1##*/}" } # 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" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}" } # func_stripname 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). func_stripname () { # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"} } # func_opt_split func_opt_split () { func_opt_split_opt=${1%%=*} func_opt_split_arg=${1#*=} } # func_lo2o object func_lo2o () { case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac } # func_xform libobj-or-source func_xform () { func_xform_result=${1%.*}.lo } # func_arith arithmetic-term... func_arith () { func_arith_result=$(( $[*] )) } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=${#1} } _LT_EOF ;; *) # Bourne compatible functions. cat << \_LT_EOF >> "$cfgfile" # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "X${1}" | $Xsed -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_basename file func_basename () { func_basename_result=`$ECHO "X${1}" | $Xsed -e "$basename"` } dnl func_dirname_and_basename dnl A portable version of this function is already defined in general.m4sh dnl so there is no need for it here. # func_stripname 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). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "X${3}" \ | $Xsed -e "s%^${1}%%" -e "s%${2}\$%%"`;; esac } # sed scripts: my_sed_long_opt='1s/^\(-[[^=]]*\)=.*/\1/;q' my_sed_long_arg='1s/^-[[^=]]*=//' # func_opt_split func_opt_split () { func_opt_split_opt=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_opt"` func_opt_split_arg=`$ECHO "X${1}" | $Xsed -e "$my_sed_long_arg"` } # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "X${1}" | $Xsed -e "$lo2o"` } # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "X${1}" | $Xsed -e 's/\.[[^.]]*$/.lo/'` } # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "$[@]"` } # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "$[1]" : ".*" 2>/dev/null || echo $max_cmd_len` } _LT_EOF esac case $lt_shell_append in yes) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]+=\$[2]" } _LT_EOF ;; *) cat << \_LT_EOF >> "$cfgfile" # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "$[1]=\$$[1]\$[2]" } _LT_EOF ;; esac ]) buzztard-0.6.0/m4/nls.m40000644042355400116100000000350511576377374011716 00000000000000# nls.m4 serial 1 (gettext-0.12) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can 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 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_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) ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate it. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then case "$ac_aux_dir" in /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; esac fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) buzztard-0.6.0/m4/gettext.m40000644042355400116100000004052111576377374012605 00000000000000# gettext.m4 serial 20 (gettext-0.12) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can 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 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. 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([$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], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) 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 test "$gt_cv_func_gnugettext_libc" != "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 Set USE_NLS. AM_NLS ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= 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. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "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_cv_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_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#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 ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_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 test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "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" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi 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 "$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 test "$gt_cv_func_gnugettext_libintl" = "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 test "$gt_cv_func_gnugettext_libintl" = "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. 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 Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next \ __fsetlocking]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then AM_LC_MESSAGES fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) buzztard-0.6.0/m4/lib-prefix.m40000644042355400116100000001250511576377374013163 00000000000000# lib-prefix.m4 serial 2 (gettext-0.12) dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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_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/lib" 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*) 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/lib"; 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/lib"; 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" ]) buzztard-0.6.0/m4/isc-posix.m40000644042355400116100000000213311576377374013034 00000000000000# isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) buzztard-0.6.0/m4/progtest.m40000644042355400116100000000563411576377374012776 00000000000000# progtest.m4 serial 3 (gettext-0.12) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can 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 package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. # 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 echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 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 ]) buzztard-0.6.0/m4/gtk-doc.m40000644042355400116100000000461111675570451012440 00000000000000dnl -*- mode: autoconf -*- # serial 1 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 dnl check for tools we added during development AC_PATH_PROG([GTKDOC_CHECK],[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]) if test x$enable_gtk_doc = xyes; then ifelse([$1],[], [PKG_CHECK_EXISTS([gtk-doc],, AC_MSG_ERROR([gtk-doc not installed and --enable-gtk-doc requested]))], [PKG_CHECK_EXISTS([gtk-doc >= $1],, AC_MSG_ERROR([You need to have gtk-doc >= $1 installed to build $PACKAGE_NAME]))]) 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 fi AC_MSG_CHECKING([whether to build gtk-doc documentation]) AC_MSG_RESULT($enable_gtk_doc) 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 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"]) ]) buzztard-0.6.0/m4/lib-ld.m40000644042355400116100000000676111576377374012274 00000000000000# lib-ld.m4 serial 2 (gettext-0.12) dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl Subroutines of libtool.m4, dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision dnl with libtool.m4. dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. AC_DEFUN([AC_LIB_PROG_LD_GNU], [AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU ld's only accept -v. if $LD -v 2>&1 &5; then acl_cv_prog_gnu_ld=yes else acl_cv_prog_gnu_ld=no fi]) with_gnu_ld=$acl_cv_prog_gnu_ld ]) dnl From libtool-1.4. Sets the variable LD. AC_DEFUN([AC_LIB_PROG_LD], [AC_ARG_WITH(gnu-ld, [ --with-gnu-ld assume the C compiler uses GNU ld [default=no]], test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no) AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh 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 GCC]) 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. [[\\/]* | [A-Za-z]:[\\/]*)] [re_direlt='/[^/][^/]*/\.\./'] # Canonicalize the path 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 IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" for ac_dir in $PATH; do 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 GNU ld's only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. if "$acl_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then test "$with_gnu_ld" != no && break else test "$with_gnu_ld" != yes && break fi fi done IFS="$ac_save_ifs" else acl_cv_path_LD="$LD" # Let the user override the test with a path. fi]) LD="$acl_cv_path_LD" if test -n "$LD"; then AC_MSG_RESULT($LD) else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) buzztard-0.6.0/m4/po.m40000644042355400116100000002152011576377374011535 00000000000000# po.m4 serial 1 (gettext-0.12) dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can 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 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. 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([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AM_NLS])dnl 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 >/dev/null 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 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 >/dev/null 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 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 >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --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 : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ 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 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" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" POMAKEFILEDEPS="POTFILES.in" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES 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" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" else # The set of available languages was given in configure.in. eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" 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|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|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, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) buzztard-0.6.0/m4/lt~obsolete.m40000644042355400116100000001311311675570446013463 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007 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 4 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_RC], [AC_DEFUN([AC_LIBTOOL_RC])]) 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])]) buzztard-0.6.0/m4/lib-link.m40000644042355400116100000005534311576377374012632 00000000000000# lib-link.m4 serial 4 (gettext-0.12) dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. 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. AC_DEFUN([AC_LIB_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[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" ]) LIB[]NAME="$ac_cv_lib[]Name[]_libs" LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" INC[]NAME="$ac_cv_lib[]Name[]_cppflags" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) 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 undefine([Name]) undefine([NAME]) ]) dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) 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. If found, it dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and dnl 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. AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], [ AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) define([Name],[translit([$1],[./-], [___])]) define([NAME],[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" LIBS="$LIBS $LIB[]NAME" AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) 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 $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= fi AC_SUBST([HAVE_LIB]NAME) AC_SUBST([LIB]NAME) AC_SUBST([LTLIB]NAME) undefine([Name]) undefine([NAME]) ]) dnl Determine the platform dependent parameters needed to use rpath: dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, dnl hardcode_direct, hardcode_minus_L. AC_DEFUN([AC_LIB_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" libext="$acl_cv_libext" shlibext="$acl_cv_shlibext" hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" hardcode_direct="$acl_cv_hardcode_direct" 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_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. AC_DEFUN([AC_LIB_LINKFLAGS_BODY], [ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) 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$1-prefix], [ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib --without-lib$1-prefix don't search for lib$1 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/lib" 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= 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= if test $use_additional = yes; then if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then found_dir="$additional_libdir" found_so="$additional_libdir/lib$name.$shlibext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi else if test -f "$additional_libdir/lib$name.$libext"; then found_dir="$additional_libdir" found_a="$additional_libdir/lib$name.$libext" if test -f "$additional_libdir/lib$name.la"; then found_la="$additional_libdir/lib$name.la" fi 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//'` if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then found_dir="$dir" found_so="$dir/lib$name.$shlibext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi else if test -f "$dir/lib$name.$libext"; then found_dir="$dir" found_a="$dir/lib$name.$libext" if test -f "$dir/lib$name.la"; then found_la="$dir/lib$name.la" fi 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/lib"; 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 "$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 "$hardcode_libdir_flag_spec" && test "$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 "$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 $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 */lib | */lib/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` 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*) 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/lib"; then haveit= if test "X$additional_libdir" = "X/usr/local/lib"; then if test -n "$GCC"; then case $host_os in linux*) 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 "$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:+$hardcode_libdir_separator}$found_dir" done dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$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=\"$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 ]) 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 ]) buzztard-0.6.0/m4/iconv.m40000644042355400116100000000665311576377374012247 00000000000000# iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. 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). 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_TRY_LINK will then fail, the second AC_TRY_LINK 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_TRY_LINK([#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_TRY_LINK([#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_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) 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) ]) 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_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || 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([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) buzztard-0.6.0/m4/ltversion.m40000644042355400116100000000127711675570446013146 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 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. # Generated from ltversion.in. # serial 3017 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.2.6b]) m4_define([LT_PACKAGE_REVISION], [1.3017]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.2.6b' macro_revision='1.3017' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) buzztard-0.6.0/m4/ltoptions.m40000644042355400116100000002724211675570446013154 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008 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 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_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], [0], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [0], [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_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], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [pic_mode="$withval"], [pic_mode=default]) test -z "$pic_mode" && 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])]) buzztard-0.6.0/m4/ltsugar.m40000644042355400116100000001042411675570446012574 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 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 ]) buzztard-0.6.0/m4/intltool.m40000644042355400116100000002421511675570451012756 00000000000000## intltool.m4 - Configure intltool for the target system. -*-Shell-script-*- ## Copyright (C) 2001 Eazel, Inc. ## Author: Maciej Stachowiak ## Kenneth Christiansen ## ## 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 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, write to the Free Software ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ## ## 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. dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 40 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` [INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` ] AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be exetuted at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) buzztard-0.6.0/ABOUT-NLS0000644042355400116100000011311311576377374011564 00000000000000Notes 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 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 at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. Quick configuration advice ========================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. 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. If not, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will respectively bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _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.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages have usually 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. 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. 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 country 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'. 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. 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://www.iro.umontreal.ca/contrib/po/HTML/', in the "National 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 `translation@iro.umontreal.ca' 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 skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of May 2003. 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 am az be bg ca cs da de el en en_GB eo es +-------------------------------------------+ a2ps | [] [] [] [] | aegis | () | anubis | | ap-utils | | bash | [] [] [] | batchelor | | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bluez-pin | [] [] | clisp | | clisp | [] [] [] | coreutils | [] [] [] [] | cpio | [] [] [] | darkstat | () [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | [] [] | enscript | [] [] [] [] | error | [] [] [] [] [] | fetchmail | [] () [] [] [] [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] | flex | [] [] [] [] | gas | [] | gawk | [] [] [] [] | gcal | [] | gcc | [] [] | gettext | [] [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] | gimp-print | [] [] [] [] [] | gliv | | glunarclock | [] [] [] | gnucash | () [] | gnucash-glossary | [] () [] | gnupg | [] () [] [] [] [] | gpe-calendar | [] | gpe-conf | [] | gpe-contacts | [] | gpe-edit | | gpe-login | [] | gpe-ownerinfo | [] | gpe-sketchbook | [] | gpe-timesheet | | gpe-today | [] | gpe-todo | [] | gphoto2 | [] [] [] [] | gprof | [] [] | gpsdrive | () () () | grep | [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | jpilot | [] [] [] [] | jwhois | [] | kbd | [] [] [] [] [] | ld | [] [] | libc | [] [] [] [] [] [] | libgpewidget | [] | libiconv | [] [] [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lingoteach_lessons | () () | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] | man-db | [] () [] [] () | mysecretdiary | [] [] [] | nano | [] () [] [] [] | nano_1_0 | [] () [] [] [] | opcodes | [] [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] | sh-utils | [] [] [] | sharutils | [] [] [] [] [] [] | sketch | [] () [] | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] | tin | () () | util-linux | [] [] [] [] [] | vorbis-tools | [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +-------------------------------------------+ am az be bg ca cs da de el en en_GB eo es 0 1 4 2 31 17 54 60 14 1 4 12 56 et fa fi fr ga gl he hr hu id it ja ko +----------------------------------------+ a2ps | [] [] [] () () | aegis | | anubis | [] | ap-utils | [] | bash | [] [] | batchelor | [] | bfd | [] [] | binutils | [] [] | bison | [] [] [] [] | bluez-pin | [] [] [] [] | clisp | | clisp | [] | coreutils | [] [] [] [] | cpio | [] [] [] [] | darkstat | () [] [] [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] [] [] [] | flex | [] [] | gas | [] | gawk | [] [] | gcal | [] | gcc | [] | gettext | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] | gimp-print | [] [] | gliv | () | glunarclock | [] [] [] [] | gnucash | [] | gnucash-glossary | [] | gnupg | [] [] [] [] [] [] [] | gpe-calendar | [] | gpe-conf | | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] | gpe-ownerinfo | [] [] [] | gpe-sketchbook | [] | gpe-timesheet | [] [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] | gprof | [] [] | gpsdrive | () [] () () | grep | [] [] [] [] [] [] [] [] [] [] [] | gretl | [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] [] [] [] [] [] | jpilot | [] () | jwhois | [] [] [] [] | kbd | [] | ld | [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] [] | libiconv | [] [] [] [] [] [] [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] | lingoteach_lessons | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] [] [] [] [] | man-db | [] () () | mysecretdiary | [] [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] [] [] [] | screem | | sed | [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] | sharutils | [] [] [] [] [] | sketch | [] | soundtracker | [] [] [] | sp | [] () | tar | [] [] [] [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] [] | tin | [] () | util-linux | [] [] [] [] () [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] [] | wget | [] [] [] [] [] [] [] [] | xchat | [] [] [] | xpad | | +----------------------------------------+ et fa fi fr ga gl he hr hu id it ja ko 20 1 15 73 14 24 8 10 30 31 19 31 9 lg lt lv ms nb nl nn no pl pt pt_BR ro +----------------------------------------+ a2ps | [] [] () () () [] [] | aegis | () | anubis | [] [] | ap-utils | () | bash | [] | batchelor | | bfd | | binutils | | bison | [] [] [] [] | bluez-pin | [] | clisp | | clisp | [] | coreutils | [] | cpio | [] [] [] | darkstat | [] [] [] [] | diffutils | [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] | fetchmail | () () | fileutils | [] | findutils | [] [] [] [] | flex | [] | gas | | gawk | [] | gcal | | gcc | | gettext | [] | gettext-runtime | [] | gettext-tools | | gimp-print | [] | gliv | [] | glunarclock | [] | gnucash | | gnucash-glossary | [] [] | gnupg | | gpe-calendar | [] [] | gpe-conf | [] [] | gpe-contacts | [] | gpe-edit | [] [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-sketchbook | [] [] | gpe-timesheet | [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | | gprof | [] | gpsdrive | () () () | grep | [] [] [] [] | gretl | | hello | [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] | indent | [] [] [] | jpilot | () () | jwhois | [] [] [] | kbd | | ld | | libc | [] [] [] [] | libgpewidget | [] [] | libiconv | [] [] | lifelines | | lilypond | [] | lingoteach | | lingoteach_lessons | | lynx | [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] | man-db | [] | mysecretdiary | [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] [] [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | | recode | [] [] [] | screem | | sed | [] [] | sh-utils | [] | sharutils | [] | sketch | [] | soundtracker | | sp | | tar | [] [] [] [] [] [] | texinfo | [] | textutils | [] | tin | | util-linux | [] [] | vorbis-tools | [] [] | wastesedge | | wdiff | [] [] [] [] | wget | [] [] [] | xchat | [] [] | xpad | [] | +----------------------------------------+ lg lt lv ms nb nl nn no pl pt pt_BR ro 0 0 2 11 7 26 3 4 18 15 34 34 ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW +-------------------------------------------+ a2ps | [] [] [] [] [] | 16 aegis | () | 0 anubis | [] [] | 5 ap-utils | () | 1 bash | [] | 7 batchelor | | 1 bfd | [] [] [] | 7 binutils | [] [] [] | 7 bison | [] [] | 13 bluez-pin | | 7 clisp | | 0 clisp | | 5 coreutils | [] [] [] [] [] | 14 cpio | [] [] [] | 13 darkstat | [] () () | 9 diffutils | [] [] [] [] | 21 e2fsprogs | [] | 3 enscript | [] [] [] | 11 error | [] [] [] | 14 fetchmail | [] | 7 fileutils | [] [] [] [] [] [] | 15 findutils | [] [] [] [] [] [] | 27 flex | [] [] [] | 10 gas | [] | 3 gawk | [] [] | 9 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] [] | 15 gettext-runtime | [] [] [] [] [] [] | 16 gettext-tools | [] [] | 5 gimp-print | [] [] | 10 gliv | | 1 glunarclock | [] [] [] | 11 gnucash | [] [] | 4 gnucash-glossary | [] [] [] | 8 gnupg | [] [] [] [] | 16 gpe-calendar | [] | 5 gpe-conf | | 3 gpe-contacts | [] | 4 gpe-edit | [] | 5 gpe-login | [] | 5 gpe-ownerinfo | [] | 7 gpe-sketchbook | [] | 5 gpe-timesheet | [] | 6 gpe-today | [] | 6 gpe-todo | [] | 6 gphoto2 | [] [] | 9 gprof | [] [] | 7 gpsdrive | [] [] | 3 grep | [] [] [] [] | 24 gretl | | 2 hello | [] [] [] [] [] | 33 id-utils | [] [] [] | 11 indent | [] [] [] [] | 19 jpilot | [] [] [] [] [] | 10 jwhois | () () [] [] | 10 kbd | [] [] | 8 ld | [] [] | 5 libc | [] [] [] [] | 20 libgpewidget | | 6 libiconv | [] [] [] [] [] [] | 21 lifelines | [] | 2 lilypond | [] | 4 lingoteach | | 2 lingoteach_lessons | () | 0 lynx | [] [] [] [] | 14 m4 | [] [] [] | 15 mailutils | | 2 make | [] [] [] [] | 15 man-db | [] | 6 mysecretdiary | [] [] | 8 nano | [] [] [] | 15 nano_1_0 | [] [] [] | 15 opcodes | [] [] | 9 parted | [] [] | 13 ptx | [] [] [] | 22 python | | 0 radius | | 0 recode | [] [] [] [] | 19 screem | [] | 1 sed | [] [] [] [] [] | 20 sh-utils | [] [] [] | 13 sharutils | [] [] [] [] | 16 sketch | [] | 5 soundtracker | [] | 7 sp | [] | 3 tar | [] [] [] [] [] | 24 texinfo | [] [] [] [] | 13 textutils | [] [] [] [] [] | 15 tin | | 1 util-linux | [] [] | 14 vorbis-tools | [] | 7 wastesedge | | 0 wdiff | [] [] [] [] | 17 wget | [] [] [] [] [] [] [] | 25 xchat | [] [] [] | 11 xpad | | 1 +-------------------------------------------+ 50 teams ru sk sl sr sv ta tr uk vi wa zh_CN zh_TW 97 domains 32 19 16 0 56 0 48 10 1 1 12 23 913 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 May 2003 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://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. 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 Library 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 `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. buzztard-0.6.0/install-sh0000754042355400116100000003253711576377400012340 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # 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. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # 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_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' 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 no_target_directory= 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 *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done 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 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 trap '(exit $?); exit' 1 2 13 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 starting with `-'. 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 # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi 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. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/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-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 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 eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && 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=$dstdir/_inst.$$_ rmtmp=$dstdir/_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` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob 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 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: buzztard-0.6.0/xmldocs.make0000644042355400116100000000623111576360407012634 00000000000000# # No modifications of this Makefile should be necessary. # # To use this template: # 1) Define: figdir, docname, lang, omffile, and entities in # your Makefile.am file for each document directory, # although figdir, omffile, and entities may be empty # 2) Make sure the Makefile in (1) also includes # "include $(top_srcdir)/xmldocs.make" and # "dist-hook: app-dist-hook". # 3) Optionally define 'entities' to hold xml entities which # you would also like installed # 4) Figures must go under $(figdir)/ and be in PNG format # 5) You should only have one document per directory # 6) Note that the figure directory, $(figdir)/, should not have its # own Makefile since this Makefile installs those figures. # # example Makefile.am: # figdir = figures # docname = scrollkeeper-manual # lang = C # omffile=scrollkeeper-manual-C.omf # entities = fdl.xml # include $(top_srcdir)/xmldocs.make # dist-hook: app-dist-hook # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # ************* Begin of section some packagers may need to modify ************** # This variable (docdir) specifies where the documents should be installed. # This default value should work for most packages. # docdir = $(datadir)/@PACKAGE@/doc/$(docname)/$(lang) docdir = $(datadir)/gnome/help/$(docname)/$(lang) # ************** You should not have to edit below this line ******************* xml_files = $(entities) $(docname).xml EXTRA_DIST = $(xml_files) $(omffile) CLEANFILES = omf_timestamp if ENABLE_SCROLLKEEPER # If the following file is in a subdir (like help/) you need to add that to the path include $(top_srcdir)/omf.make all: omf $(docname).xml: $(entities) ## -ourdir=`pwd`; \ ## cd $(srcdir); \ ## cp $(entities) $$ourdir endif app-dist-hook: if test "$(figdir)"; then \ $(mkinstalldirs) $(distdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \ done \ fi if ENABLE_SCROLLKEEPER install-data-local: omf $(mkinstalldirs) $(DESTDIR)$(docdir) for file in $(xml_files); do \ cp $(srcdir)/$$file $(DESTDIR)$(docdir); \ done if test "$(figdir)"; then \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done \ fi install-data-hook: install-data-hook-omf uninstall-local: uninstall-local-doc uninstall-local-omf uninstall-local-doc: -if test "$(figdir)"; then \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ rm -f $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done; \ rmdir $(DESTDIR)$(docdir)/$(figdir); \ fi -for file in $(xml_files); do \ rm -f $(DESTDIR)$(docdir)/$$file; \ done -rmdir $(DESTDIR)$(docdir) endif