qjackctl-0.5.0/PaxHeaders.4714/aclocal.m40000644000000000000000000000013213215206044014621 xustar0030 mtime=1513425956.800767245 30 atime=1513425956.800767245 30 ctime=1513425956.800767245 qjackctl-0.5.0/aclocal.m40000644000175000001440000002524213215206044015460 0ustar00rncbcusers00000000000000# generated automatically by aclocal 1.15.1 -*- Autoconf -*- # Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl have to call PKG_CHECK_EXISTS manually AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl explicit call to PKG_PROG_PKG_CONFIG in your configure.ac AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $2]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR qjackctl-0.5.0/PaxHeaders.4714/AUTHORS0000644000000000000000000000013213215206021014024 xustar0030 mtime=1513425937.520766939 30 atime=1513425937.520766939 30 ctime=1513425937.520766939 qjackctl-0.5.0/AUTHORS0000644000175000001440000000004213215206021014652 0ustar00rncbcusers00000000000000Rui Nuno Capela qjackctl-0.5.0/PaxHeaders.4714/autogen.sh0000644000000000000000000000013213215206021014752 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/autogen.sh0000755000175000001440000000004413215206021015605 0ustar00rncbcusers00000000000000#!/bin/sh # make -f Makefile.git $* qjackctl-0.5.0/PaxHeaders.4714/ChangeLog0000644000000000000000000000013213215206021014526 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.520766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/ChangeLog0000644000175000001440000016020013215206021015357 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- ChangeLog 0.5.0 2017-12-16 End of Autum'17 release. - Current preset is always taken into account if ever changes while the Setup dialog is hidden (eg. via context menu). - Desktop entry specification file is now finally independent from build/configure template chains. - Updated target path for freedesktop.org's AppStream metainfo file (formerly AppData). 0.4.5 2017-04-27 Pre-LAC2017 release frenzy. - On some desktop-shells, the system tray icon blinking on XRUN ocurrences, have been found responsible to excessive CPU usage, an "eye-candy" effect which is now optional as far as Setup/Display/Blink server mode indicator goes. - Added French man page (by Olivier Humbert, thanks). - Make builds reproducible byte for byte, by getting rid of the configure build date and time stamps. 0.4.4 2016-11-14 A Fall'16 release. - Fixed an early crash when the singleton/unique application instance setup option is turned off. - Almost complete overhaul on the configure script command line options, wrt. installation directories specification, eg. --prefix, --bindir, --libdir, --datadir and --mandir. 0.4.3 2016-09-14 End of Summer'16 release. - Fix build error caused by variable length array. - Fix some tooltip spelling (patch by Jaromír Mikeš, thanks). - Translation (not) fix for the default server name "(default)". - Old "Start minimized to system tray" option returns to setup. - Dropped the --enable-qt5 from configure as found redundant given that's the build default anyway (suggestion by Guido Scholz, while for Qtractor, thanks). - Late again French (fr) translation update (by Olivier Humbert aka. trebmuh, thanks). 0.4.2 2016-04-05 Spring'16 release frenzy. - Added a brand new "Enable JACK D-BUS interface" option, split from the old common "Enable D-BUS interface" setup option which now refers to its own self D-BUS interface exclusively. - Dropped old "Start minimized to system tray" option from setup. - Add double-click action (toggle start/stop) to systray (a pull request by Joel Moberg, thanks). - Added application keywords to freedesktop.org's AppData. - System-tray icon context menu has been fixed/hacked to show up again on Plasma 5 (aka. KDE5) notification status area. - Switched column entries in the unified interface device combo- box to make it work for macosx/coreaudio again. - Blind fix to a FTBFS on macosx/coreaudio platforms, a leftover from the unified interface device selection combo-box inception, almost two years ago. - Prevent x11extras module from use on non-X11/Unix plaforms. - Late French (fr) translation update (by Olivier Humbert, thanks). 0.4.1 2015-10-28 A Fall'15 release. - Probing portaudio audio device in a separate thread (by Kjetil Matheussen, thanks). - Messages standard output capture has been improved again, now in both ways a non-blocking pipe may get. - Regression fix for invalid system-tray icon dimensions reported by some desktop environment frameworks. - New hi-res application icon (by Uttrup Renzel, Max Christian Pohle, thanks). - System tray icon red background now blinks when a XRUN occurs. - Desktop environment session shutdown/logout management has been also adapted to Qt5 framework. - Single/unique application instance control adapted to Qt5/X11. - Prefer Qt5 over Qt4 by default with configure script. - Overrideable tooltips with latency info (re. Connections JACK client/ports: patch by Xavier Mendez, thanks). - Complete rewrite of Qt4 vs. Qt5 configure builds. - French (fr) translation update (by Olivier Humbert, thanks). 0.4.0 2015-07-15 Summer'15 release frenzy. - Some windows fixes added (patch by Kjetil Matheussen, thanks). - Most advanced Setup/Settings are moved into new Setup/Advanced settings tab; limit range for the real-time priority setting, now having 6 as absolute minimum valid value (after patches by Robin Gareus, thanks). - A new top-level widget window geometry state save and restore sub-routine is now in effect. - Delayed geometry setup for widget windows upon startup has been deprecated and scrapped altogether. - Setup/settings dialog tab is going into some layout changes; also got rid of old patchbay auto-refresh timer cruft, which was previously hidden/disabled. - New socket names are now automatically inferred from selected client names while on the Patchbay widget, Socket dialog. - Fixed for some strict tests for Qt4 vs. Qt5 configure builds. - German (de) translation update (by Guido Scholz, thanks). 0.3.13 2015-03-25 Pre-LAC2015 release frenzy. - Added application description as freedesktop.org's AppData. - Setup dialog form is now modeless. - Introducing brand new active patchbay reset/disconnect-all user preference option. - Current highlighted client/port connections are now drawn with thicker connector lines. - New user preference option on whether to show the nagging 'program will keep running in the system tray' message, on main window close. - Connections lines now drawn with anti-aliasing; connections splitter handles width is now reduced. - Drop missing or non-existent patchbay definition files from the most recent used list. 0.3.12 2014-10-19 JACK Pretty-names aliasing. - JACK client/port pretty-name (metadata) support is being introduced and seamlessly integrated with old Connections client/port aliases editing (rename) (refactored from an original patch by Paul Davis, thanks). - Application close confirm warning is now raising the main window as visible and active for due top level display, especially applicable when minimized to the system tray. - Messages standard output capture has been slightly improved as for non-blocking i/o, whenever available. - Translations install directory change. - Allow the build system to include an user specified LDFLAGS. - Missing input/output-latency parameter settings now settled for the D-BUS controlled JACK server and firewire back-end driver. 0.3.11 2013-12-31 A fifth of a Jubilee. - More preparations for Qt5 configure build. - Interface device selection is now unified, by moving the old '>' pop-up menu into the customized combo-box drop-down list showing all available card/device names and descriptions (on a patch by Arnout Engelen, thanks). - Added include to shut up gcc 4.7 build failures (patch by Alexis Ballier, thanks). 0.3.10 2013-04-01 The singing swan rehersal. - Session infra-client management finally being added. - Preparations for Qt5 migration. - Transport tempo (BPM) precision display fixed to 4 digits. - Color-candy (dang old ANSI terminal?) escape sequences are now silently stripped from jackdbus messages captured log (onliner from original patch by Brendan Jones, thanks). - List ALSA device card id. string instead of device number, while on setup dialog. - Japanese (ja) translation added (by Takashi Sakamoto). 0.3.9 2012-05-18 The last of the remnants. - Killing D-BUS controlled JACK server is now made optional, cf. Setup/Misc/Stop JACK audio server on application exit. (a patch by Roland Mas, thanks). - Added include to shut up gcc 4.7 build failures. - Make(ing) -jN parallel builds now available for the masses. - A mis-quoting bug at the command line argument string may have been crippling the (unmaintained) Windows port since ever, leaving its main function to start jackd dead in the water, belly down :) now hopefully fixed (following a mail transaction with Stephane Letz and Mathias Nagorni, thanks). - Currently a JACK2-only feature, the JACK version string display at the About dialog box, must now be explicitly enabled on configure time (--enable-jack-version). - A new so called "Server Suffix" parameter option appears to rescue on the situations where QjackCtl falls short on extra, exquisite and/or esoteric command line options eg. (net)jack1/2 differences. - Fixed D-Bus Input/Output device parameter settings, filled when either interface is selected for Capture/Playback only. (probable fix for bug #3441860). - Fixed Makefile.in handling of installation directories to the configure script eg. --datadir, --localedir, --mandir. (after an original patch from h3xx, thanks). - Main window is now brought to front and (re)activated when clicking on the system tray icon instead of just hiding it. - Add current xrun count to the system tray icon tooltip, if not zero (after patch #3314633 by Colin Fletcher, thanks). 0.3.8 2011-07-01 JACK Session versioning. - Debugging stacktrace now applies to all working threads. - Session "Save" button now a drop-down menu, replacing the session save type combo-box/drop-down list selection. Also, an early session directory versioning/numbering scheme is now in place, although optional. - Probable fix to debian bug report #624198 - segfault when pressing the stop button (by Grant Adrian Diffey, after a patch from Adrian Knoth, thanks). - Desktop environment session shutdown (eg. logout) is now tapped for graceful application exit, even though the main window is active (visible) and minimizing to system tray is enabled. Both were causing first shutdown/logout attempt to abort. Not anymore, hopefully ;). - Make sure all activated patchbay definition files are in their complete and absolute directory path forms. - Connections refresh button now does an immediate and true reconstruction of all clients and their respective ports and connections, unconditionally. - Command line server start option (-s, --start) is now made independent from configuration setup option (cf. Setup/Misc /Start JACK audio server on application startup). - Now handling cable socket types properly to let patchbay definitions work correctly, whenever having sockets with the very same literal name (twisted from patch #3183467, by Karsten, thanks;). - Abrupt focus behavior when any of the keyboard modifiers (Shift, Ctrl, Alt, Caps Lock) is hit while on Connections client/port aliases editing (rename) has been fixed. - Russian (ru) translation updated (by Alexandre Prokoudine). - Added include "errno.h" alegedly missing for BSD style systems (applying patch for bug #3126091). 0.3.7 2010-11-30 JACK Session managerism. - Session widget has session save type preserved as well. - Connections and the new Messages/Status widgets now have their last open tab preserved across program run-cycles. - Connections and Patchbay widgets have been finally given up on an old feature request: an Expand All items button. - A significant UI layout has been made: the Messages and Status widgets were merged into one, giving space to the brand new Session wigdet to be easy accessible from the main panel control window. - libX11 is now being added explicitly to the build link phase, as seen necessary on some bleeding-edge distros eg. Fedora 13, Debian 6. (closing bug #3050915). - Input/Output latency options were missing but now finally enabled for the firewire back-end. - General standard dialog buttons layout is now in place. - Avoid pre-loading a stalled patchbay definition filename and its nagging error on startup (fixes bug #3017078). - Client connection retrial logic scrapped. Being a leftover from early ages, when machines were slower and JACK server startup times were longer... now, if it can't connect first time as client, it will tear down the server whether it's starting up still or not at all. (cf. Setup/Settings/Start Delay for the rescue). - Server name is finally part of the server settings presets, thanks to Fons Adriaensen for the heads-up. - As a workaround regarding issues switching jack2's backends, Robin Gareus sends us yet another D-Bus method slot: "preset", (dbus-send --system / org.rncbc.qjackctl.preset string:PRESET). Thanks again. - Another D-Bus interface slot makes it through implementation: "quit" (eg. usage: dbus-send --system / org.rncbc.qjackctl.quit). Besides, there's also these new JACK session management actions which were being overlooked as well: "load", "save", "savequit" and "savetemplate" are also available as D-Bus method slots. - Make sure that Patchbay socket names are unique when adding or copying, fixing previous patch by Dominic Sacre. - JACK version is now being shown on the About box (jack2). - Slight Connections widget behavioral change: (dis)connecting a client (from) to one single port, (dis)connections will be applied in sequence from (to) all client output ports to (from) as many input ports there are in below, one by one (satisfying a 5 year old request from Yann Orlarey, thanks:). - JACK session support is being introduced. - Ignore first XRUN occurrence option dropped from statistics. - Initial widget geometry and visibility persistence logic has been slightly revised as much to avoid crash failures due to wrong main widget hidden state. - Double-quotes are now being added to device names which include blank characters and were rendering invalid all command line invocation of the classic JACK server (eg. specially due for Portaudio device names on Windows). - Transport play (rolling) status is now being guarded to avoid backfiring from extraneous transport state changes. - General source tree layout and build configuration change. - Italian (it) translation added (by Sergio Atzori). - Post-shutdown script invocation logic slightly refactored in attempt to enforce its execution on application quit. 0.3.6 2010-03-09 Full D-Busification! - Make sure socket names are unique on each side of the Patchbay (another patch from Dominic Sacre, thanks). - A bunch of primitive D-Bus interface slots have been added, allowing shortcut access to most of main applications actions like toggling Messages, Status, Connections, Patchbay widget pop-ups, reset stats, transport and so on. New bindings are given eg. via dbus-send --system / org.rncbc.qjackctl.(main, messages, status, connections, patchbay, setup, about, reset, rewind, backward, play, pause, forward). (from an original idea from Sebastian Gutsfeld, thanks). - Patchbay snapshot now tolerates JACK client port strings that have more than one semi-colon in it, honoring just the first one exactly as everywhere else eg. Connections. (a glitch as reported by Geoff Beasley while using a2jmidid). - Most modal message dialog boxes (eg. critical errors) are now replaced by system tray icon bubble messages where available (mitigating feature request #2936455). - Comply with jackd >= 0.118.0 which nowruns in real-time mode by default; use of -R is now deprecated from the jackd command line interface options; use -r to run in non-real-time-scheduling. - A man page has beed added. - Got rid of a pretty old and never really useful "jackd-realtime" server path option--actually, it was only seen available on the now defunct old Mandrake Linux distro. - D-Bus support, as provided by org.jackaudio.service aka jackdbus, is now being introduced and used wherever available and whenever enabled. Configuring, starting, stopping and logging the JACK back-end server through the "infamous" jackdbus service is now being seamlessly exploited. - Global configuration state is now explicitly saved/committed to disk when Setup dialog changes are accepted and applied. - Server name command line option added (-n, --server-name). - Single application instance restriction option added (X11). - Setup for the netjack (slave) "net" driver has now sample-rate and frames per buffer (period size) settings disabled and/or ignored, as those are pretty much auto-detected by default; also, a new "netone" backend driver option has been introduced (as suggested by Torben Hohn). - Czech (cs) translation added (by Pavel Fric). - Fixed some main window keyboard shortcuts. Escape key now closes Connections, Patchbay, Status and Messages widgets as usual (bug #2871548). - Fixed glitch on configure portaudio support, specially when the library is not detected as available. 0.3.5 2009-09-30 Slipped away! - Late support for UTF-8 encoded client/port names. - Allow only one single patchbay connection to or from an exclusive socket (mitigating bug #2859119). - Automatic crash-dump reports, debugger stack-traces (gdb), back- traces, whatever, are being introduced as a brand new configure option (--enable-stacktrace) and default enabled on debug build targets (--enable-debug). - Probable fix on the audio connections with regard to client/port (re)name changes (an ancient bug reported by Fons Adriaensen). - Portaudio device selector is now available (after a patch handed by Torben Hohn and Stephane Letz). - A couple of primitive D-Bus interface slots have been introduced, giving the option to start/stop the jackd server from the system bus eg. via dbus-send --system / org.rncbc.qjackctl.start (.stop), (a nice addition supplied by Robin Gareus, thanks). - New command line option (-a, --active-patchbay=[path]) to specify and activate a given patchbay definition file (a simple patch sent by John Schneiderman, thanks). - Added one significant digit to DSP Load percentage status display. - Tentative support for netjack (slave) by adding the "net" driver to the existing backend driver options on the Setup/Settings section. - Converted obsolete QMessageBox forms to standard buttons. - New patchbay snapshot now raises the dirty flag and allows for the immediate salvage of patchbay definition profile. - Conditional build for JACK port aliases support (JACK >= 0.109.2). - Alternate icon sizes other than default 16x16, are now effective to the Connections widget (Setup/Dislay/Connections Window/Icon size). 0.3.4 2008-12-05 Patchbay snapshot revamp. - Introducing the very first and complete translations in-package: German (de), Spanish (es), French (fr) and Russian (ru); credits in TRANSLATORS. - At last, after years of retarded procrastination, the old infamous patchbay snapshot feature has been the subject of a almost complete rewrite and it does try to give a way better mapping of all actual and current running client/port connections, both JACK (audio, MIDI) and ALSA MIDI, of course ;) - On Setup/Settings/Parameters dialog, all device selection options are now reset to default when disabled interactively. - Grayed/disabled palette color group fix for dark color themes. - Qt Software logo update. - Fait-divers: desktop menu file touched to openSUSE conventions. - ALSA PCM devices now only listed/enumerated iif strictly compliant with the audio mode criteria (Duplex, Capture-only or Playback-only) as kindly suggested by Nedko Ardaunov. - JACK client/port aliases may now be displayed as a global user option (see Setup/Display/Connections/JACK client/port aliases). - Lighten up the connections line and highlight colors, as seen to fit best on some darker background themes. - Patchbay snapshot fixed to differentiate socket clients according to its type (Audio, MIDI or ALSA-Seq), avoiding the mess and gross mistake of hanging disparate type ports under the same client item. - JACK_DEFAULT_SERVER environment variable is now appended to the X11 unique application identifier, allowing for having multiple instances each controlling its own JACK server, besides the default one. - Due to some trouble with newer Qt >= 4.4 applications regarding font size configuration, a new global user option is now available to the rescue: Setup/Misc/Defaults/Base font size (default is no-op). 0.3.3 2008-06-07 Patchbay JACK-MIDI, file logging and X11 uniqueness. - Attempt to load Qt's own translation support and get rid of the ever warning startup message, unless built in debug mode. (transaction by Guido Scholz, while on qsynth-devel, thanks). - Messages file logging makes its first long overdue appearance, with user configurable settings in Setup/Options/Logging. - Only one application instance is now allowed to be up and running, with immediate but graceful termination upon startup iif an already running instance is detected, which will see its main widget shown up and the server started automatically (Qt/X11 platform only). - Finally, full JACK MIDI support sneaks into the patchbay; socket types now differ in Audio, MIDI and ALSA, following the very same nomenclature as found on the Connections widget tabs. - Sun driver support (by Jacob Meuser). - Delay window positioning at startup option is now being disabled, on the Setup/Misc tab, when Minimize to system tray is enabled. - Cosmetic fix: Setup/Settings tab, 'Input Device' text label was using a slightly smaller font than the rest of the application (bug#1872545, reported by Jouni Rinne). 0.3.2 2007-12-20 Patchbay heads-up with season greetings. - Patchbay port matching has been slightly extended, this time allowing for the multiple or as many-to-many connections between socket plugs, provided these are specified in proper regex form (after a patch proposed by Dave Moore, thanks). - A new option to start the program minimized when the system tray icon is enabled, is now available from Setup/Misc/Start minimized to system tray (as kindly suggested by Marc-Olivier Barre). - Regression from QSystemTrayIcon (Qt4 >= 4.2) implementation, at least on X11 environments: while the main application widget was minimized to the system-tray, closing any other top-level widget was causing the immediate and unexpected application shutdown. - Some portaudio backend settings are now being enabled, specially suited for the jackdmp flavouring. - Server mode display blinking, usually shown as the RT indicator, is now an option (Setup/Display/Blink server mode indicator when started). - Tool/child windows position and size preservation fixed. - The connections/patchbay auto-refresh option has been finally removed due to several user requests, although deprecated for quite some time now it has been the probable cause of some periodic xrun occurrences due to graph-locking in jackd (while making Geoff Beasley angry in the process:). - Messages line limit was not being checked, now honored. - Simple as it could ever be, the build executive summary report is now given on configure. - Patchbay snapshot ot its socket and port ordering back. - ALSA Sequencer support is now an optional feature on setup, preventing the annoying "MIDI patchbay will be not available" warning message, ruining window placement on Linux systems where the snd-midi-seq kernel module is not loaded or not favorable (eg. OSS) at startup (by request from Jussi Laako). - Get configure to try and detect the correct qmake location and insert it the search order, so let the qt4 tools take precedence when --with-qt option is given and older qt3 ones coexist and are found located ahead in the PATH. - The connections widget is now being properly refreshed, due to some quirk in the QTreeWidget which was preventing some items, specially the expanded ones, to disappear in the void. Meanwhile, with a hand from Stephane Letz, the client/port lookup method was changed to prevent duplicated, missing entries or worse, crashes due to weird behaved windows applications. - The xrun count stats can now be reset simply by middle clicking on the systray icon or the main window's display area (thanks to patch sent by Dominic Sacre). - An improved version of the "shiny" background image was issued. The original somehow looked like two different images put together, probably most apparent on a bright TFT screen (by Dominic Sacre). - A warning is now being issued, asking whether one wants to remove a corresponding Patchbay connection, when client/ports are being disconnected over the Connections window, thus avoiding automatic reconnection annoyance due to normal active Patchbay behavior. - The infamous "Keep child windows always on top" global option is now supposed to behave a little better when disabled, layering child windows as naturally as far the window manager dictates. - Input/Output Channel setting is now allowed to be greater than 32; the special default text is now displayed, also on Input/Output Latency and Priority settings spin-boxes. - Andreas Persson just sent a patch that makes it possible to compile and run qjackctl with Qt version 4.1. Applied without hesitation, thanks. 0.3.1a 2007-07-19 System-tray tooltip icon crash fix. - An immediate showstopper crash upon client start was irradicated, which was affecting those with the system-tray icon disabled, as is the default (thanks to Ken Ellinwood for first reporting this sloppy one). 0.3.1 2007-07-18 Shallowed bug-fix release. - The current DSP load percentage activity is now also displayed on the system-tray icon tooltip. - An illusive but nasty Connections/Patchbay item tooltip crash bug has been hopefully fixed (Qt >= 4.3). - Now using QSystemTrayIcon class facility if available (Qt4 >= 4.2) making the system-tray option available on most platforms, notably on Windows and Mac OS X. - Usage of QProcess class has been severely refactored, now using QProcess::start() instead of QProcess::startDetached(), giving much tighter control over the started jackd(mp) process. Downside is that QjackCtl lost its ability and option to leave the process detached upon quitting the application. Too bad. - A new eye-candy bit has sneaked in: server mode display, that is the RT indicator, now blinks when server/client is started/active. - Combo-box setup history has been corrected on restore, which was discarding the very initial default (factory) contents. - Now that Qt4 is accessible to open-source Windows appplications, there's some experimental stuff sneaking in for jackdmp support on win32 (http://www.grame.fr/~letz/jackdmp.html). - Connections list items were initially sorted in descending order by default. Fixed. Client items are now naturally sorted, again. 0.3.0 2007-07-10 Qt4 migration was complete. - Qt4 migration was complete. Care must be taken with this new configuration file and location: this release starts a new one from scratch and won't reuse any of the previous existing ones, although cut and paste might help if you know what you're doing :) - On a last-minute addition, the "firewire" audio backend driver option has been also included, supporting the ffado.org project which is evolving where "freebob" is leaving (thanks to Klaus Zimmermann for this one). 0.2.23 2007-07-02 JACK MIDI support debut. - JACK MIDI support is now being introduced. Connections window now has a brand new MIDI tab, the older being renamed to ALSA, as for the ALSA/MIDI sequencer conveniency. The server settings now include the MIDI driver setup option (ALSA backend only). - Application icon is now installed to ${prefix}/share/pixmaps; application desktop entry file is now included in installation; spec file (RPM) is now a bit more openSUSE compliant; initial debianization. - Invalidation of the JACK client handle is now forced right on jack_shutdown notification, preventing a most probable fatal crash due to jack_deactivate and/or jack_client_close being called after the jack_watchdog kicks in. - Default font option names were adjusted to "Sans Serif" and "Monospace", wherever available. - The "keep child windows always on top" option is not set as default anymore, because window focus behavior gets tricky on some desktop environments (eg. Mac OS X, Gnome). - Autoconf (configure) scripting gets an update. 0.2.22 2007-03-31 Long overdue but better late than never. - Fixed default settings for the freebob backend (JACK >= 0.103.0). - CPU Load status label now says correctly DSP Load. - The most recently used patchbay definitions can now be correctly selected in round-robin fashion from its drop-down list widget. - Avoid mixing JACK MIDI ports with regular audio ports on the Connections and Patchbay widgets; strictly list only audio ports. - Added 192k sample rate to setup settings drop down list (as kindly reminded by Klaus Zimmermann, thanks). - Most top-level widgets were missing the normal-widget flag, which were causing some sticky size behavior on some window managers. 0.2.21 2006-10-07 Shrinking on screen real-estate. - GPL address update. - All window captions can now be set smaller as tool-widgets. This option takes effect when child windows are kept always on top. - For the brave of heart, specially the ones brave enough to try with Stephane Letz's jackdmp, a win32 build should be now possible. - The main window button text labels are now optional (after a kind suggestion by Geoff Beasley, thanks). - Increse default maximum number of ports setting from 128 to 256. - Initial freebob backend driver support. Also changed the coreaudio backend driver command line device name/id parameter. - Closing the main window while not as an active JACK client, nor under a server running state, will just quit the whole application, even though the system-tray icon option is in effect. - The most relevant transport commands (Rewind, Play and Pause) are now made available on the main window context popup menu. - The post-shutdown script is now also being called when using the Stop button, whether the jackd server has been started internally or not. The initial hard-coded default is now on and set to `killall jackd` (as a workaround to an old request from Stephane Letz). - The main window buttons display are now optional. One can choose whether the left, right and/or transport buttons are hidden, making it for a total of six different modes for the main window presentation (after a much simpler suggestion from Paul Davis and Stephane Letz). - Added configure support for x86_64 libraries (UNTESTED). 0.2.20 2006-03-05 Featuring patchbay socket forwarding. - Server path setting now accepts custom command line parameters (after a kind suggestion from Jussi Laako). - The internal XRUN callback notification statistics and reporting has been changed to be a bit less intrusive. - Patchbay socket dialog gets some more eye-candy as icons have been added to the client and plug selection (combobox) widgets. - Connections and patchbay lines coloring has changed just slightly :) - New patchbay socket forwarding feature. Any patchbay socket can now be set to have all its connections replicated (i.e. forwarded) to another one, which will behave actively as a clone of the former. Forward connections are shown by vertical directed colored lines, and can be selected either on socket dialog or from context menu (currently experimental, only applicable to input/writable sockets). - Optional specification of alternate JACK and/or ALSA installation paths on configure time (after a patch from Lucas Brasilino, thanks). 0.2.19a 2005-11-28 MIDI aliases are back in town. - ALSA sequencer client/port name aliases are functional again; all actual MIDI sequencer client/port numerical identifier prefixes are also back in business. 0.2.19 2005-11-19 MRU patchbay selection, Mac OS X and other fixes. - Connections widget views are now properly refreshed after renaming client/ports (aliases). - Disabled system tray and ALSA sequencer support on configure time, whenever building for MacOSX as default. - Fixed the major issues with selecting an audio interface on Mac OSX; the button the right of the interface combo is now much better looking than it was before; input/output channel counts are also updated automatically now (thanks to Jesse Chappell for the patch). - Prevent the setting of the coreaudio device id on the jackd command line (-n) whenever the default interface is being selected. - The connections and patchbay windows are now allowed to have a wider connection lines frame panel; splitter width sizes are now persistent across application sessions (thanks to Filipe Tomas for the hint). - Activation toggling feedback on the patchbay widget has been fixed; additionally and as found convenient, the most recently used patchbay definitions can now be loaded immediately by selecting from a drop-down list widget, which replaces the old static patchbay name status text, and adds a lil'icon too :) - All widget captions changed to include proper application title prefix. - Attempt to bring those aging autoconf templates to date; sample SPEC file for RPM build is now being included and generated at configure time. - The current selected device is now shown with a checkmark on the device selection menu(s), while on the settings dialog. - Set to use QApplication::setMainWidget() instead of registering the traditional lastWindowClosed() signal to quit() slot, just to let the -geometry command line argument have some effect on X11. 0.2.18 2005-07-18 The mantra of bugfixes stays on. - A freezing and endless loop condition on the patchbay socket item duplication (copy) has been fixed. - Fixed output disability when messages limit option is turned off (thanks again to Wolfgang Woehl for spotting this one). 0.2.17 2005-06-17 Systemic I/O Latency settings are in. - Systemic I/O Latency settings are now featured for the alsa, oss and coreaudio backends, letting you specify the known latency of external hardware for client aware compensation purposes (thanks to Wolfgang Woehl, for the reminder). - Update on last backstage changes to the coreaudio backend options (due to Stephane Letz. Thanks). 0.2.16 2005-06-13 OSS device name selection and Mac OS X breakthrough. - ALSA sequencer client/port name changes are now properly detected on the MIDI connections widget (as noted by Chris Cannam. Thanks). - Long overdue transport buttons (rewind, backward and forward) finally landed onto the main control window, at last :). - Duplication (copy) of patchbay socket items was added. - Do not ever try to start the JACK server if there's one already found running, on which case the client-only mode of operation is then activated (as kindly suggested by Orm Finnendahl, thanks). - After several Mac OS X user requests, ALSA/MIDI sequencer support is now an option, otherwise detected at configure time and conditionally compiled in if, and only if, ALSA is found available (which has been a primordial assumption on Linux systems:). Ah, and that just makes for the blind inclusion of another backend driver option: coreaudio. - Actual OSS device selection menu now featured on setup dialog; these adds to the device selection button menus for the OSS driver settings. - Delayed geometry setup of windows upon startup was added as an optional workaround to subtle problems due to window decoration information not being available at window creation time on some window managers (as patch proposed by Dirk Jagdmann. Thanks). - Fixed some minor but rather old bug that was quitting the application abruptly, when one switches off the system tray icon while the main application widget is hidden. - Cancel is now an option when creating a new patchbay definition. - Context menus are finally littered with icons. - Minor configure and Makefile install fixes, as Debian and Mac OS X specialties. Also, install does the right thing with target file modes (thanks to Matt Flax and Ebrahim Mayat, for pointing these out). 0.2.15a 2005-02-09 Return of the paranoid. - Regression from 0.2.13, of the not so stupid pseudo-mutex guards on the connections management framework, after fixing some crash reports from Fernando Pablo Lopez-Lezcano and Dave Phillips (thanks!); it pays to be such a paranoid after all :). 0.2.15 2005-02-06 Client/port names aliasing and other minors. - JACK/ALSA client and port name aliasing (renaming) is now an optional feature for the connections window; all client/port aliases are saved on a per preset basis (as proposed for Lionstracs' Mediastation). - Server state now shown (back gain) on the system tray icon tooltip; speaking of which, tooltips are now also featured on connections, status and patchbay windows. - New actual hardware device selection menu featured on setup dialog; these new button menus are only available for the ALSA driver settings. - Server path factory default to jackd instead of jackstart; preset setup button icons are back. - Fixed rare connection port item removal/disconnection dangling pointer bug. 0.2.14 2005-01-23 More progressive optimizations. - Put a limit on XRUN callback messages and statistics report rate, preventing the potential hosing of the GUI due to a XRUN cascade storm. The maximum reasonable report rate has been fixed to be one XRUN callback occurrence per second. - Set to ignore the SIGPIPE ("Broken pipe") signal, where available, as the default handler is usually fatal when a JACK client is zombified abruptly. - All conection view items are now sorted in natural case insensitive order, not just as audio port names as was before. - Got rid of those nonsense paranoid and rather stupid pseudo-mutex guards on the connections management framework and event notifications (nuff said :). - Optional confirmation warning on audio server shutdown, if there's some audio clients still active and connected (as suggested by Sampo Savolainen). - Check for on configure time (as of JACK 0.99.42+ CVS). - "Unlock memory" server setup option was added, allowing the release of memory used by common toolkit libraries (GTK+, Qt, FLTK, Wine) that were being superfluously locked on every GUI JACK client; number of periods has now the minimum allowed value of 2; server start delay widget converted to spinbox; setup dialog layout slighly changed. - Removed stand-alone usx2y driver support. Since JACK 0.99.41+ CVS, the special "rawusb" support on the Tascam US-122/224/428 USB Audio/MIDI interface controllers have been merged and properly integrated into the regular alsa backend driver. Being still experimental, this special mode of operation is now triggered only when "hw:N,2" is specified as the alsa device name (N = soundcard index of snd-usb-usx2y module). - Messages window limit is now enforced only when the line count exceeds in one third the user configured line count maximum; if Qt 3.2.0+ is in use, the QTextView widget is otherwise set to the optimized Qt::LogText format. - XRUN status items are kept double-dashed if none has been detected. 0.2.13 2004-11-21 Retouches and minor optimizations. - Main window is now properly minimized instead of simply hidden when the system tray icon is not available nor opted in (as suggested by Florian Schmidt). - Some informational status items are now updated 10 times less frequently (e.g. CPU Load, Sample Rate, Buffer Size, Realtime Mode, etc.), lowering the CPU burden of most probably redundant status updates. - XRUN detection and statistics are being conditionally included if jack_get_xrun_delayed_usecs() is available (as of JACK 0.99.7+ CVS). - Fixed ancient bug on client shutdown event handling, which was invoking the xrun notification handler by mistake. - Support for maximum scheduling delay status added; this status relies on jack_get_max_delayed_usecs() function availability at configure time, depending on a Lee Revell's non-official JACK patch. - Patchbay Activate button is now a toggle button widget, allowing the deactivation of the current patchbay profile. - Reset-status icon has been changed to a simple red circle instead of previous one which was much like a power-switch symbol. - Preset selection has been added to the context menu. 0.2.12a 2004-10-11 Audio connections now naturally sorted. - Client port list on audio connections are now hopefully fixed for good; the sort comparison function now takes full natural order into account. 0.2.12 2004-10-08 Larger icons and font option on connections/patchbay. - Fixed some old and slow memory-leak due to redundand and repetitive call to jack_port_by_name() (discovered and solved, thanks to Jesse Chappell); some other free() and configure fixes were also applied. - Shiny display effect toggling has immediate feedback on setup dialog. - Added new usx2y driver support. - New scaled connections/patchbay icons were added; meanwhile, all inline XPM icons were removed and brainlessly converted to PNG format. - New setup options as for the connections/patchbay view apprearence: larger icon sizes and font selection are now possible, to better ease manipulation on a touchscreen (feature requested for Lionstracs' Mediastation). - Connection line width follows icon size in discrete proportion. - "Other" setup options moved to a new dialog tab, "Misc"; new extreme item values, 32 and 16 frames, added to the drop-down list of the Frames/Buffer setting (as suggested by Mark Knetch). 0.2.11 2004-09-10 Shiny display now optional and other fixes. - Fixed Input/Output channels settings, being now either enabled when the ALSA driver is selected for Capture/Playback only. - Shiny display effect: after some conservative user complaints this pure cosmetic feature is now made optional ;) 0.2.10 2004-09-04 Shiny display and curved connections. - New pre-shutdown script setup option, allowing to specify a shell-script to be run before the JACK server daemon is shutted-down. This overrides any previous shutdown script setting, which should be now moved onto the existing post-shutdown script option, as to keep old procedural behaviour. - Avoid stopping JACK prematurely with QProcess::kill() (oneliner fix); stopping JACK will now take a little bit longer, but hopefully will take the time to cleanup properly (thanks to Kjetil Matheussen). - ALSA driver Duplex mode accepts alternate Input or Output device name. - Context menu reset option is now always enabled (yet another suggestion from Sampo Savolainen). - Main display background gets shinny effect; adjusted system tray background palette color mode. - Priority and setup control is now a spinbox ranging from 0..89 (as suggested by Florian Schmidt). Same for Periods/Buffer. - Patchbay connection lines are now drawn correctly when items are scrolled out of view. Additionally, the connection lines can now be optionally drawn as bezier spline curves (big thanks to Wilfried Huss). 0.2.9 2004-07-04 Sloppy boy fixes and minor featuritis. - Patchbay socket dialog client and plug list option items are now properly escaped as regular expressions. - JACK callbacks are now internally mapped to QCustomeEvent's instead of using the traditional pipe notifications. - The system tray popup menu is now featured as a context menu on the main application window too. - The reset status option is now included in the system tray popup menu. - Server stop command button now enabled during client startup interval; this makes it possible to stop the server just in case the client can't be activated for any reason. - Top level sub-windows are now always raised and set with active focus when shown to visibility. 0.2.8 2004-04-30 System tray icon and menu option. - New option for system tray icon and menu, which is known to be effective on KDE enabled desktops; support for freedesktop.org's system tray protocol specification has been included so this maybe also effective on Gnome2. - Capture or Playback-only optional alternate device interface name may now be specified for the ALSA audio driver server settings. - Maximum number of ports setting was added to server setup. - The dash (-) is now a legal character for preset names. 0.2.7b 2004-04-05 OSS driver setup fix. - OSS driver halfduplex setup operation is now fixed, thanks to Jussi Laako. 0.2.7a 2004-04-05 Compilation fix for Qt 3.1. - QSplitter::setChildrenCollapsible call is now conditionally compiled, applied only on Qt 3.2+. 0.2.7 2004-04-04 User-interface refinements and OSS driver support. - Connections and patchbay windows horizontal layout are now user configurable via splitter widgets. - Refresh on connections window now take effect on both tabs, Audio (JACK) and MIDI (ALSA). - OSS driver support and no-mlock option added to server settings, setup dialog (as of JACK 0.95.7+). - Temporary server configuration option added, applicable to the auto-start server feature on client applications, whether the server shall exit once all clients are closed. - Server mode (RT) status display added. - Warning messages are now prompted to the user when there are any pending changes not saved nor applied while on the setup dialog. - Translation support for the default preset name "(default)". - Messages window pops up whenever a critical error message is issued. 0.2.6 2004-02-29 More work in progress. - Message window line limit is now a configurable option on setup, as is whether the command-line local configuration file gets saved at all; the first argument of the command-line configuration is stuffed to be the executable server command absolute path, when possible. - Warning message issued if ALSA sequencer is not available on startup; also if server settings are changed while client is currently active. - Server autostart magic is locally disabled by forcing the environment variable JACK_NO_START_SERVER at startup; with any luck this will maintain qjackctl's behaviour whether the JACK server is already started or not. - Makefile.cvs makes its late entrance on the build toolset. 0.2.5 2004-02-16 Server survival option and command-line wrapper feature. - New option on application exit for leaving the JACK server daemon running, surviving the parent process; the confirmation prompt on application close now features a "Terminate", "Leave" and "Cancel" button options. - New command-line wrapper feature for JACK client applications, thus giving a convenient head start for the JACK audio server as needed (as suggested by Fernando Pablo Lopez-Lezcano, of Planet CCRMA fame). - Messages, Status, Connections and Patchbay pop-up windows are not hinted as dialogs anymore and thus are not centered relative to parent main window which has become a strict Qt dialog widget behaviour (as of Qt 3.3+). - Patchbay window content changes are now properly updated, without the need for a later manual refresh to redraw stalled connection lines. - The snapshot option for creating a new patchbay definition from current actual connections now takes client and port names as regular expressions and smart enough when regarding more than two contiguous decimal digits :) - Patchbay socket list view ordering is now properly preserved; socket dialog gets plug list handling ehancements; active patchbay gets reloaded when commited and saved to file; connections redraw on socket removal has been fixed. - Server literal command-line is now saved into local configuration file (~/.jackdrc) for convenience of future auto-start client applications. - New setup option on whether all child windows are kept on top of the main window, or otherwise floating with probable taskbar entries of their own. - Setup changes that are only effective next time the program is run gets an informational message box shown to the user. 0.2.4 2004-02-01 Exclusive patchbay sockets. - Patchbay definitions may now be configured with exclusive sockets; this way, only one defined connection is allowed as soon as it's available, being all others immediatelly disconnected whenever attempted. - On the connections view, current connected client ports are now slightly highlighted (blue) whenever a client or port is selected on the opposite column (as suggested by Lawrie Abbott). - Connections and patchbay drag and drop feature is now bilateral; you can now drag and drop an item from right to left to establish the connection. 0.2.3a 2004-01-19 Time format combo-box tooltip fix. - A qt-designer copy-paste leftover has been fixed; sloppy boy I am ;) 0.2.3 2004-01-19 Tenths, hundredths, milliseconds, whatever. - Custom time format setup for all elapsed times, allowing the display of tenths, hundredths or even milliseconds instead of just hundredths of second for transport time code. 0.2.2 2004-01-16 Hundredths are back. - Transport time is now shown with hundredths of second (hh:mm:ss.dd), as it was once before but not constant zero. - Client start delay now configurable on setup; this may be of help for slow machines or unusual long server driver startups (e.g. portaudio). - Client-only mode restart has been fixed. - Messages color retouching. - Popup menus memory leak fixed. 0.2.1 2003-12-29 The fix of fixes. - Fixed jackstart/jackd command line parameter argument concatenation. - Front panel status display font can now be customized. - Some connection graph changes were being silently missed, now fixed. - Messages window fallback fix; stdout handling has been retouched to be more line buffer oriented. 0.2.0 2003-12-12 ALSA sequencer patchbay entrance. - ALSA sequencer subscription patchbay feature, complementing current audio service with a MIDI application connection graph, gracefuly included on the same front-end. - Current preset name is shown on main window caption title. New button and form icons. Messages window blankness rendering fix. - Immediate server startup option was made persistent and therefore remembered across sessions. - Standard output/error stream capture setup option. 0.1.3 2003-11-26 Server settings profile/preset feature. - Server setup settings can now be profiled, named and saved as presets. Command line preset name option and scripting argument meta-symbols are also featured for convenience (kindly suggested by Sampo Savolainen). - New configure time argument debugging support (--enable-debug). 0.1.2 2003-11-16 More work in progress. - Qmake project file (qjackctl.pro) now generated by configure (autoconf), introducing the explicit binding support to libqt-mt (multi-thread). - Main window is not hinted as a dialog anymore, giving room to the minimize button on some other window managers; application close confirm warning is now an option. - Removed deprecated settings options: temporary directory and ASIO mode; new available settings for the ALSA driver: force 16bit format, maximum input channels and output channels (as of JACK 0.90.x). - Transport time display looses static hundredth seconds decimal digits. 0.1.1a 2003-11-01 Whatever happened to OK button icons. - Restored missing OK button icons. 0.1.1 2003-10-29 Minor feature enhancements and bugfixes. - Main window display items are now made fixed in width, at least those more prone to change frequently and thus caused some display jitter. - Messages, status, connections and patchbay module windows are now reopened automagicaly on startup as they were on previous session. - New patchbay definition snapshot option from current actual connections; current active patchbay filename status indication on title. - New icons patchbay editor window and socket dialogs; own stdout/stdin is now properly captured and shown on messages log window. - Fixed an obvious patchbay connection scan freezing bug; default .xml file extension enforcement on save. 0.1.0 2003-10-22 Major user interface redesign. - Main application window complete redesign, now more like a multimedia/LCD control panel -- old main window dialog tabs are now splitted in separate pop-up windows/dialogs; big time display options. In other words, this sums up to a nice complete application rewrite. - Deprecated options for forcing aRTs and jackd daemons are no longer available; this functionality can be officially superceded by the more generic startup/shutdown script options. - Seamless support for externally started JACK server, providing a client-only mode of operation; if the JACK daemon is already started, qjackctl enters in client detached mode automagically. - Messages window font is configurable and saved across sessions (by Jack O'Quin's humble request). Some colorization has been introduced on some event messages. - Preliminary patchbay persistence feature is under way. A patchbay definition editor is already included, following an alternative socket-plug patchbay model that aliases and is a direct map to the client-port JACK connections model. The patchbay definitions are stored as text/xml files. - New post-startup script option; immediate JACK server startup command line option (as suggested by Kasper Souren). 0.0.9a 2003-10-03 Tiny bugfixes. - Startup/shutdown script options now correctly saved and restored. - Dummy driver wait parameter is now properly set on startup. - Confirmation warning on disconnecting all ports (as suggested by Robert Jonsson). 0.0.9 2003-09-25 Work in progress. - New connection port item pixmaps that distinguishes physical from logical ports. - History of most recently used values gets saved for some settings and options comboboxes widgets. - New startup and shutdown script options, intended to supersede the mess of forcing artsd and jackd itself, in a near future ;) this way, one can also include the operation of the LADCCA daemon (following a suggestion from Kasper Souren). - Connections command buttons are now shortly disabled after clicking, avoiding accidental duplicated connections. 0.0.8 2003-09-19 Preliminary transport and buffer size status control. - Transport status and control introduced (requires JACK 0.80.0+); - Statistics tab renamed to Status, where the transport state info and simple play/pause control buttons are now placed; - Buffer size status is yet another item on the list view. 0.0.7 2003-09-15 Minor bugfixes. - Inverse alphabetic ordering fixed on Connections port listing. - Verbose option added; messages view font size fix; about Qt dialog; logo pixmap retouched. - Configure script now checks for Qt 3.1.1 or greater. 0.0.6 2003-09-12 Drag-n-drop and more feature enhancements and bufixes. - Patchbay connection user interface handling has been fairly rewritten; (features new bugs while fixing old ones ;-) - Reset XRUN statistics button added; reset time recorded on statistics; calculated latency is now shown on settings; ASIO mode disables Periods/Buffer setting (all suggestions by Lawrie Abbott). - Context popup menu introduced for port connection handling; includes new command for disconnecting all currently connected ports. - Closing the application while JACK is running, is now presented with a warning confirmation message (preventing accidental Esc key press? :). - Patchbay port lists ordering are now more numerical-friendly than ever, taking account for sub-numbering port names (following yet another suggestion from Lawrie). - Connection drag-and-drop is now featured after many, many requests. - Corrected the configure script to properly recognize Qt 3.0.1 or greater. 0.0.5 2003-09-05 Minor feature enhancements and bugfixes. - Internationalization support added; future qjackctl_${LANG}.qm translation files are located on ${prefix}/share/locale . - New dummy and portaudio driver support (as of JACK release 0.80.0+). - A couple of silent memory leak bugs have been corrected. 0.0.4 2003-08-29 Minor changes and bugfixes. - The patchbay port lists are now sorted in a more numerical friendly manner (as suggested by Steve Harris); the sort code has been "borrowed" from qjackconnect, yet again. - Patchbay port connection lines are now always visible, even if their respective connected port items aren't. - Multiple simultaneous port connections can now be handled when a client application item is selected for connection/disconnection (again, suggested by Steve Harris), replicating and extending qjackconnect's similar behaviour. - An auto-refresh option for the patchbay connections is now available, for those cases when client code just can't handle properly some callbacks. - Window positioning and sizing is now almost persistent across sessions; as before, position is saved for the minimal view mode; but now, the details dialog view mode gets its position and size independantly saved also. 0.0.3 2003-08-07 Integrated visual patchbay. - A patchbay for jack port connections is now integrated, much like the greatest Mathias Nagorni's qjackconnect (http://www.suse.de/~mana/jack.html). 0.0.2 2003-08-02 Client code features introduced. - JACK library and header files are checked on configure. - Server CPU load, sample rate and time elapsed since last XRUN detected, are now displayed on statistics. 0.0.1 2003-07-26 Initial release. qjackctl-0.5.0/PaxHeaders.4714/configure0000644000000000000000000000013213215206045014666 xustar0030 mtime=1513425957.499767256 30 atime=1513425957.393767255 30 ctime=1513425957.499767256 qjackctl-0.5.0/configure0000755000175000001440000064001513215206045015531 0ustar00rncbcusers00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for QjackCtl 0.5.0. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and rncbc@rncbc.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='QjackCtl' PACKAGE_TARNAME='qjackctl' PACKAGE_VERSION='0.5.0' PACKAGE_STRING='QjackCtl 0.5.0' PACKAGE_BUGREPORT='rncbc@rncbc.org' PACKAGE_URL='' ac_unique_file="src/qjackctl.cpp" ac_default_prefix=/usr/local # 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='LTLIBOBJS LIBOBJS ac_libs ac_incpath ac_ldflags ac_cflags ac_qx11extras QT5X11EXTRAS_LIBS QT5X11EXTRAS_CFLAGS ac_qdbus QT4DBUS_LIBS QT4DBUS_CFLAGS QT5DBUS_LIBS QT5DBUS_CFLAGS EGREP GREP PORTAUDIO_LIBS PORTAUDIO_CFLAGS ALSA_LIBS ALSA_CFLAGS JACK_LIBS JACK_CFLAGS ac_lrelease ac_lupdate ac_uic ac_moc ac_cv_qmake ac_qmake PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG CXXCPP ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_debug ac_mandir ac_datadir ac_libdir ac_bindir ac_prefix ac_version 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_debug enable_qt4 enable_system_tray enable_jack_midi enable_jack_session enable_jack_port_aliases enable_jack_metadata enable_jack_version enable_alsa_seq enable_portaudio enable_dbus enable_xunique enable_stacktrace with_qt4 with_qt5 with_jack with_alsa with_portaudio ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR JACK_CFLAGS JACK_LIBS ALSA_CFLAGS ALSA_LIBS PORTAUDIO_CFLAGS PORTAUDIO_LIBS QT5DBUS_CFLAGS QT5DBUS_LIBS QT4DBUS_CFLAGS QT4DBUS_LIBS QT5X11EXTRAS_CFLAGS QT5X11EXTRAS_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= ;; *) 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 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 QjackCtl 0.5.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/qjackctl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of QjackCtl 0.5.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-debug enable debugging (default=no) --enable-qt4 enable Qt4 build (default=no) --enable-system-tray enable system tray (default=yes) --enable-jack-midi enable JACK MIDI support (default=yes) --enable-jack-session enable JACK session support (default=yes) --enable-jack-port-aliases enable JACK port aliases support (default=yes) --enable-jack-metadata enable JACK metadata support (default=yes) --enable-jack-version enable JACK version support (default=no) --enable-alsa-seq enable ALSA/MIDI sequencer support (default=yes) --enable-portaudio enable PortAudio interface (default=yes) --enable-dbus enable D-Bus interface (default=yes) --enable-xunique enable X11 unique/single instance (default=yes) --enable-stacktrace enable debugger stack-trace (default=no) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-qt4=PATH use alternate Qt4 install path --with-qt5=PATH use alternate Qt5 install path --with-jack=PATH use alternate JACK install path --with-alsa=PATH use alternate ALSA install path --with-portaudio=PATH use alternate PortAudio install path Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path JACK_CFLAGS C compiler flags for JACK, overriding pkg-config JACK_LIBS linker flags for JACK, overriding pkg-config ALSA_CFLAGS C compiler flags for ALSA, overriding pkg-config ALSA_LIBS linker flags for ALSA, overriding pkg-config PORTAUDIO_CFLAGS C compiler flags for PORTAUDIO, overriding pkg-config PORTAUDIO_LIBS linker flags for PORTAUDIO, overriding pkg-config QT5DBUS_CFLAGS C compiler flags for QT5DBUS, overriding pkg-config QT5DBUS_LIBS linker flags for QT5DBUS, overriding pkg-config QT4DBUS_CFLAGS C compiler flags for QT4DBUS, overriding pkg-config QT4DBUS_LIBS linker flags for QT4DBUS, overriding pkg-config QT5X11EXTRAS_CFLAGS C compiler flags for QT5X11EXTRAS, overriding pkg-config QT5X11EXTRAS_LIBS linker flags for QT5X11EXTRAS, 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 QjackCtl configure 0.5.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_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_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_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_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------ ## ## Report this to rncbc@rncbc.org ## ## ------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_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_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func 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 QjackCtl $as_me 0.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # 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 ac_config_headers="$ac_config_headers src/config.h" ac_config_files="$ac_config_files Makefile qjackctl.spec src/src.pri" # Build version string. if ${ac_cv_build_version+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_build_version=$(git describe --tags --dirty --abbrev=6 2>/dev/null) if test -n "$ac_cv_build_version"; then ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/^[^_]*[_v]//i') ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/-g/git./') ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/[_|-]\+/./g') ac_cv_build_version_extra=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if test "x$ac_cv_build_version_extra" != "xmaster"; then ac_cv_build_version="$ac_cv_build_version [$ac_cv_build_version_extra]" fi else ac_cv_build_version=$PACKAGE_VERSION fi fi ac_build_version="$ac_cv_build_version" cat >>confdefs.h <<_ACEOF #define CONFIG_BUILD_VERSION "$ac_build_version" _ACEOF # Sanitized version string. if ${ac_cv_version+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_version=$(echo $PACKAGE_VERSION | sed -r 's/^([0-9|\.]+).*$/\1/') fi ac_version="$ac_cv_version" cat >>confdefs.h <<_ACEOF #define CONFIG_VERSION "$ac_version" _ACEOF # Set default installation prefix. if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi eval ac_prefix=$prefix cat >>confdefs.h <<_ACEOF #define CONFIG_PREFIX "$ac_prefix" _ACEOF # Set default installation directories. eval ac_bindir=$bindir cat >>confdefs.h <<_ACEOF #define CONFIG_BINDIR "$ac_bindir" _ACEOF eval ac_libdir=$libdir cat >>confdefs.h <<_ACEOF #define CONFIG_LIBDIR "$ac_libdir" _ACEOF eval datarootdir=$datarootdir eval ac_datadir=$datadir cat >>confdefs.h <<_ACEOF #define CONFIG_DATADIR "$ac_datadir" _ACEOF eval ac_mandir=$mandir cat >>confdefs.h <<_ACEOF #define CONFIG_MANDIR "$ac_mandir" _ACEOF # Enable debugging argument option. # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; ac_debug="$enableval" fi if test "x$ac_debug" = "xyes"; then $as_echo "#define CONFIG_DEBUG 1" >>confdefs.h ac_stacktrace="yes" ac_debug="debug" else ac_stacktrace="no" ac_debug="release" fi # Enable Qt4/5 availability. # Check whether --enable-qt4 was given. if test "${enable_qt4+set}" = set; then : enableval=$enable_qt4; ac_qt4="$enableval" else ac_qt4="no" fi # Disable system tray argument option. # Check whether --enable-system_tray was given. if test "${enable_system_tray+set}" = set; then : enableval=$enable_system_tray; ac_system_tray="$enableval" else ac_system_tray="yes" fi # Disable JACK MIDI support option. # Check whether --enable-jack_midi was given. if test "${enable_jack_midi+set}" = set; then : enableval=$enable_jack_midi; ac_jack_midi="$enableval" else ac_jack_midi="yes" fi # Enable JACK session support. # Check whether --enable-jack_session was given. if test "${enable_jack_session+set}" = set; then : enableval=$enable_jack_session; ac_jack_session="$enableval" else ac_jack_session="yes" fi # Enable JACK port aliases support. # Check whether --enable-jack_port_aliases was given. if test "${enable_jack_port_aliases+set}" = set; then : enableval=$enable_jack_port_aliases; ac_jack_port_aliases="$enableval" else ac_jack_port_aliases="yes" fi # Enable JACK metadata support. # Check whether --enable-jack_metadata was given. if test "${enable_jack_metadata+set}" = set; then : enableval=$enable_jack_metadata; ac_jack_metadata="$enableval" else ac_jack_metadata="yes" fi # Enable JACK version support. # Check whether --enable-jack_version was given. if test "${enable_jack_version+set}" = set; then : enableval=$enable_jack_version; ac_jack_version="$enableval" else ac_jack_version="no" fi # Disable ALSA sequencer support option. # Check whether --enable-alsa_seq was given. if test "${enable_alsa_seq+set}" = set; then : enableval=$enable_alsa_seq; ac_alsa_seq="$enableval" else ac_alsa_seq="yes" fi # Enable PortAudio argument option. # Check whether --enable-portaudio was given. if test "${enable_portaudio+set}" = set; then : enableval=$enable_portaudio; ac_portaudio="$enableval" else ac_portaudio="yes" fi # Enable D-Bus argument option. # Check whether --enable-dbus was given. if test "${enable_dbus+set}" = set; then : enableval=$enable_dbus; ac_dbus="$enableval" else ac_dbus="yes" fi # Enable X11 unique/single instance. # Check whether --enable-xunique was given. if test "${enable_xunique+set}" = set; then : enableval=$enable_xunique; ac_xunique="$enableval" else ac_xunique="yes" fi # Enable debugger stack-trace option (assumes --enable-debug). # Check whether --enable-stacktrace was given. if test "${enable_stacktrace+set}" = set; then : enableval=$enable_stacktrace; ac_stacktrace="$enableval" fi # Standard installation base dirs. ac_with_paths="" # Set for alternate Qt4/5 installation dir. # Check whether --with-qt4 was given. if test "${with_qt4+set}" = set; then : withval=$with_qt4; ac_qt4_path="$withval" else ac_qt4_path="no" fi # Check whether --with-qt5 was given. if test "${with_qt5+set}" = set; then : withval=$with_qt5; ac_qt5_path="$withval" else ac_qt5_path="no" fi if test "x$ac_qt4_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt4_path" ac_qt4="yes" fi if test "x$ac_qt5_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt5_path" ac_qt4="no" fi # Set for alternate JACK installation dir. # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; ac_with_paths="$ac_with_paths $withval" fi # Set for alternate ALSA installation dir. # Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; ac_with_paths="$ac_with_paths $withval" fi # Set for alternate PortAudio installation dir. # Check whether --with-portaudio was given. if test "${with_portaudio+set}" = set; then : withval=$with_portaudio; ac_with_paths="$ac_with_paths $withval" fi # Honor user specified flags. ac_cflags=$CFLAGS ac_ldflags=$LDFLAGS # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Checks for languages. 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 # Check for pkg-config. if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi # Check whether -std=c++11 support is necessary (4 < g++ version < 6). { $as_echo "$as_me:${as_lineno-$LINENO}: checking for g++ major version" >&5 $as_echo_n "checking for g++ major version... " >&6; } if ${ac_cv_gxx_version_major+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_gxx_version_major=$($CC -dumpversion) if test -n "$ac_cv_gxx_version_major"; then ac_cv_gxx_version_major=$(echo $ac_cv_gxx_version_major | cut -d'.' -f1); fi ac_gxx_version_major=$(($ac_cv_gxx_version_major + 0)) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_gxx_version_major" >&5 $as_echo "$ac_cv_gxx_version_major" >&6; } ac_gxx_version_major=$ac_cv_gxx_version_major if test $ac_gxx_version_major -ge 4 -a $ac_gxx_version_major -lt 6; then CXXFLAGS="-std=c++11 $CXXFLAGS" fi # Check for proper flags. ac_arch=$(uname -m) # Check for install paths and alternatives... ac_libdirs="lib" if test "x$ac_arch" = "xx86_64"; then ac_libdirs="$ac_libdirs lib64" fi CFLAGS="-fPIC $CFLAGS" CPPFLAGS="-fPIC $CPPFLAGS" # Prepend alternate dependencies paths. ac_path=$PATH for X in $ac_with_paths; do if test -d $X/bin; then ac_path="$X/bin:$ac_path" fi if test -d $X/include; then CFLAGS="-I$X/include $CFLAGS " CPPFLAGS="-I$X/include $CPPFLAGS" ac_incpath="$X/include $ac_incpath" fi for Y in $ac_libdirs; do if test -d $X/$Y; then LIBS="-L$X/$Y $LIBS" ac_libs="-L$X/$Y $ac_libs" fi done done # A common error message: ac_errmsg="not found in current PATH. Maybe QT development environment isn't available." if test "x$ac_qt4" = "xyes"; then # Extract the first word of "qmake-qt4", so it can be a program name with args. set dummy qmake-qt4; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_qmake="$ac_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_qmake="$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_ac_qmake" && ac_cv_path_ac_qmake="no" ;; esac fi ac_qmake=$ac_cv_path_ac_qmake if test -n "$ac_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_qmake" >&5 $as_echo "$ac_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_qmake="$ac_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_qmake="$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_ac_qmake" && ac_cv_path_ac_qmake="no" ;; esac fi ac_qmake=$ac_cv_path_ac_qmake if test -n "$ac_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_qmake" >&5 $as_echo "$ac_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$ac_qmake" = "xno"; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_cv_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_cv_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_cv_qmake="$ac_cv_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_cv_qmake="$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_ac_cv_qmake" && ac_cv_path_ac_cv_qmake="no" ;; esac fi ac_cv_qmake=$ac_cv_path_ac_cv_qmake if test -n "$ac_cv_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qmake" >&5 $as_echo "$ac_cv_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_qmake=$ac_cv_qmake fi if test "x$ac_qmake" = "xno"; then as_fn_error $? "qmake $ac_errmsg" "$LINENO" 5 fi # Check for proper Qt major version. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt major version" >&5 $as_echo_n "checking for Qt major version... " >&6; } if ${ac_cv_qt_version_major+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_qt_version_major=$($ac_qmake -query QT_VERSION | cut -d'.' -f1) ac_cv_qt_version_major=$(($ac_cv_qt_version_major + 0)) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qt_version_major" >&5 $as_echo "$ac_cv_qt_version_major" >&6; } ac_qt_version_major=$ac_cv_qt_version_major if test "x$ac_qt4" = "xyes"; then if test $ac_qt_version_major -ne 4; then as_fn_error $? "qmake-qt4 $ac_errmsg (qt4-devel)" "$LINENO" 5 fi else if test $ac_qt_version_major -ne 5; then as_fn_error $? "qmake-qt5 $ac_errmsg (qt5-devel)" "$LINENO" 5 fi fi # Check for proper Qt install path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt install path" >&5 $as_echo_n "checking for Qt install path... " >&6; } if ${ac_cv_qt_install_path+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_qt_install_path=$($ac_qmake -query QT_INSTALL_BINS) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qt_install_path" >&5 $as_echo "$ac_cv_qt_install_path" >&6; } ac_qt_install_path=$ac_cv_qt_install_path if test -d $ac_qt_install_path; then ac_path="$ac_qt_install_path:$ac_path" fi # Check it again, now with updated PATH, just in case... # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_cv_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_cv_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_cv_qmake="$ac_cv_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_cv_qmake="$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_ac_cv_qmake" && ac_cv_path_ac_cv_qmake="no" ;; esac fi ac_cv_qmake=$ac_cv_path_ac_cv_qmake if test -n "$ac_cv_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qmake" >&5 $as_echo "$ac_cv_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_qmake=$ac_cv_qmake if test "x$ac_qmake" = "xno"; then as_fn_error $? "qmake $ac_errmsg" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt install headers" >&5 $as_echo_n "checking for Qt install headers... " >&6; } if ${ac_cv_qt_install_headers+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_qt_install_headers=$($ac_qmake -query QT_INSTALL_HEADERS) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qt_install_headers" >&5 $as_echo "$ac_cv_qt_install_headers" >&6; } ac_qt_install_headers=$ac_cv_qt_install_headers if test -d $ac_qt_install_headers; then CFLAGS="-I$ac_qt_install_headers $CFLAGS " CPPFLAGS="-I$ac_qt_install_headers $CPPFLAGS" ac_incpath="$ac_qt_install_headers $ac_incpath" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt install libraries" >&5 $as_echo_n "checking for Qt install libraries... " >&6; } if ${ac_cv_qt_install_libs+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_qt_install_libs=$($ac_qmake -query QT_INSTALL_LIBS) fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qt_install_libs" >&5 $as_echo "$ac_cv_qt_install_libs" >&6; } ac_qt_install_libs=$ac_cv_qt_install_libs if test -d $ac_qt_install_libs; then LIBS="-L$ac_qt_install_libs $LIBS" ac_libs="-L$ac_qt_install_libs $ac_libs" fi # Finally, check for proper Qt4/5 version. if test "x$ac_qt4" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt library version >= 4.4" >&5 $as_echo_n "checking for Qt library version >= 4.4... " >&6; } if ${ac_cv_qtversion+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "QtCore/qglobal.h" int main () { #if QT_VERSION < 0x040400 || QT_VERSION >= 0x050000 #error Qt library 4.4 or greater required. #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_qtversion="yes" else echo "no; Qt 4.4 or greater is required" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qtversion" >&5 $as_echo "$ac_cv_qtversion" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt library version >= 5.1" >&5 $as_echo_n "checking for Qt library version >= 5.1... " >&6; } if ${ac_cv_qtversion+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "QtCore/qglobal.h" int main () { #if QT_VERSION < 0x050100 || QT_VERSION >= 0x060000 #error Qt library 5.1 or greater required. #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_qtversion="yes" else echo "no; Qt 5.1 or greater is required" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qtversion" >&5 $as_echo "$ac_cv_qtversion" >&6; } fi # Check for Qt moc utility. # Extract the first word of "moc", so it can be a program name with args. set dummy moc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_moc+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_moc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_moc="$ac_moc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_moc="$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_ac_moc" && ac_cv_path_ac_moc="no" ;; esac fi ac_moc=$ac_cv_path_ac_moc if test -n "$ac_moc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_moc" >&5 $as_echo "$ac_moc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_moc" = "xno"; then as_fn_error $? "moc $ac_errmsg" "$LINENO" 5 fi # Check for Qt uic utility. # Extract the first word of "uic", so it can be a program name with args. set dummy uic; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_uic+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_uic in [\\/]* | ?:[\\/]*) ac_cv_path_ac_uic="$ac_uic" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_uic="$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_ac_uic" && ac_cv_path_ac_uic="no" ;; esac fi ac_uic=$ac_cv_path_ac_uic if test -n "$ac_uic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_uic" >&5 $as_echo "$ac_uic" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_uic" = "xno"; then as_fn_error $? "uic $ac_errmsg" "$LINENO" 5 fi # Check for Qt lupdate utility. # Extract the first word of "lupdate", so it can be a program name with args. set dummy lupdate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_lupdate+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_lupdate in [\\/]* | ?:[\\/]*) ac_cv_path_ac_lupdate="$ac_lupdate" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_lupdate="$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_ac_lupdate" && ac_cv_path_ac_lupdate="no" ;; esac fi ac_lupdate=$ac_cv_path_ac_lupdate if test -n "$ac_lupdate"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_lupdate" >&5 $as_echo "$ac_lupdate" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_lupdate" = "xno"; then as_fn_error $? "lupdate $ac_errmsg" "$LINENO" 5 fi # Check for Qt lrelease utility. # Extract the first word of "lrelease", so it can be a program name with args. set dummy lrelease; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_lrelease+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_lrelease in [\\/]* | ?:[\\/]*) ac_cv_path_ac_lrelease="$ac_lrelease" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_lrelease="$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_ac_lrelease" && ac_cv_path_ac_lrelease="no" ;; esac fi ac_lrelease=$ac_cv_path_ac_lrelease if test -n "$ac_lrelease"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_lrelease" >&5 $as_echo "$ac_lrelease" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_release" = "xno"; then as_fn_error $? "lrelease $ac_errmsg" "$LINENO" 5 fi # Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lm" >&5 $as_echo_n "checking for main in -lm... " >&6; } if ${ac_cv_lib_m_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_main=yes else ac_cv_lib_m_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_main" >&5 $as_echo "$ac_cv_lib_m_main" >&6; } if test "x$ac_cv_lib_m_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 $as_echo_n "checking for main in -lX11... " >&6; } if ${ac_cv_lib_X11_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_X11_main=yes else ac_cv_lib_X11_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_main" >&5 $as_echo "$ac_cv_lib_X11_main" >&6; } if test "x$ac_cv_lib_X11_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBX11 1 _ACEOF LIBS="-lX11 $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lXext" >&5 $as_echo_n "checking for main in -lXext... " >&6; } if ${ac_cv_lib_Xext_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_Xext_main=yes else ac_cv_lib_Xext_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_main" >&5 $as_echo "$ac_cv_lib_Xext_main" >&6; } if test "x$ac_cv_lib_Xext_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXEXT 1 _ACEOF LIBS="-lXext $LIBS" fi # Check for round math function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lroundf in -lm" >&5 $as_echo_n "checking for lroundf in -lm... " >&6; } if ${ac_cv_lib_m_lroundf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* 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 lroundf (); int main () { return lroundf (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_lroundf=yes else ac_cv_lib_m_lroundf=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_lroundf" >&5 $as_echo "$ac_cv_lib_m_lroundf" >&6; } if test "x$ac_cv_lib_m_lroundf" = xyes; then : ac_round="yes" else ac_round="no" fi if test "x$ac_round" = "xyes"; then $as_echo "#define CONFIG_ROUND 1" >>confdefs.h fi # Check for JACK libraries. pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack >= 0.100.0" >&5 $as_echo_n "checking for jack >= 0.100.0... " >&6; } if test -n "$JACK_CFLAGS"; then pkg_cv_JACK_CFLAGS="$JACK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.100.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.100.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_CFLAGS=`$PKG_CONFIG --cflags "jack >= 0.100.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$JACK_LIBS"; then pkg_cv_JACK_LIBS="$JACK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jack >= 0.100.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "jack >= 0.100.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_JACK_LIBS=`$PKG_CONFIG --libs "jack >= 0.100.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then JACK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "jack >= 0.100.0" 2>&1` else JACK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "jack >= 0.100.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$JACK_PKG_ERRORS" >&5 ac_jack_lib="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_jack_lib="no" else JACK_CFLAGS=$pkg_cv_JACK_CFLAGS JACK_LIBS=$pkg_cv_JACK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_jack_lib="yes" fi if test "x$ac_jack_lib" = "xyes"; then $as_echo "#define CONFIG_JACK 1" >>confdefs.h ac_cflags="$ac_cflags $JACK_CFLAGS" ac_libs="$ac_libs $JACK_LIBS" CFLAGS="$CFLAGS $JACK_CFLAGS" CPPFLAGS="$CPPFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" else as_fn_error $? "*** JACK library not found." "$LINENO" 5 fi # Check for ALSA libraries and primarily # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alsa" >&5 $as_echo_n "checking for alsa... " >&6; } if test -n "$ALSA_CFLAGS"; then pkg_cv_ALSA_CFLAGS="$ALSA_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_CFLAGS=`$PKG_CONFIG --cflags "alsa" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$ALSA_LIBS"; then pkg_cv_ALSA_LIBS="$ALSA_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"alsa\""; } >&5 ($PKG_CONFIG --exists --print-errors "alsa") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_ALSA_LIBS=`$PKG_CONFIG --libs "alsa" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then ALSA_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "alsa" 2>&1` else ALSA_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "alsa" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$ALSA_PKG_ERRORS" >&5 ac_alsa_seq="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_alsa_seq="no" else ALSA_CFLAGS=$pkg_cv_ALSA_CFLAGS ALSA_LIBS=$pkg_cv_ALSA_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_alsa_seq="yes" fi fi if test "x$ac_alsa_seq" = "xyes"; then $as_echo "#define CONFIG_ALSA_SEQ 1" >>confdefs.h ac_cflags="$ac_cflags $ALSA_CFLAGS" ac_libs="$ac_libs $ALSA_LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ALSA library not found." >&5 $as_echo "$as_me: WARNING: *** ALSA library not found." >&2;} fi if test "x$ac_portaudio" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for portaudio-2.0" >&5 $as_echo_n "checking for portaudio-2.0... " >&6; } if test -n "$PORTAUDIO_CFLAGS"; then pkg_cv_PORTAUDIO_CFLAGS="$PORTAUDIO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_CFLAGS=`$PKG_CONFIG --cflags "portaudio-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PORTAUDIO_LIBS"; then pkg_cv_PORTAUDIO_LIBS="$PORTAUDIO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"portaudio-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "portaudio-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PORTAUDIO_LIBS=`$PKG_CONFIG --libs "portaudio-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "portaudio-2.0" 2>&1` else PORTAUDIO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "portaudio-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PORTAUDIO_PKG_ERRORS" >&5 ac_portaudio="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_portaudio="no" else PORTAUDIO_CFLAGS=$pkg_cv_PORTAUDIO_CFLAGS PORTAUDIO_LIBS=$pkg_cv_PORTAUDIO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_portaudio="yes" fi fi if test "x$ac_portaudio" = "xyes"; then $as_echo "#define CONFIG_PORTAUDIO 1 Define if PORTAUDIO library is available." >>confdefs.h ac_cflags="$ac_cflags $PORTAUDIO_CFLAGS" ac_libs="$ac_libs $PORTAUDIO_LIBS" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** PORTAUDIO library not found." >&5 $as_echo "$as_me: WARNING: *** PORTAUDIO library not found." >&2;} fi # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_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_cxx_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 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 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_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/ioctl.h unistd.h poll.h signal.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check for jack/statistics.h header. ac_fn_cxx_check_header_mongrel "$LINENO" "jack/statistics.h" "ac_cv_header_jack_statistics_h" "$ac_includes_default" if test "x$ac_cv_header_jack_statistics_h" = xyes; then : ac_jack_statistics_h="yes" else ac_jack_statistics_h="no" fi if test "x$ac_jack_statistics_h" = "xyes"; then $as_echo "#define CONFIG_JACK_STATISTICS 1" >>confdefs.h fi # Check for CoreAudio/CoreAudio.h header (MacOSX). ac_fn_cxx_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : ac_coreaudio="yes" else ac_coreaudio="no" fi if test "x$ac_coreaudio" = "xyes"; then $as_echo "#define CONFIG_COREAUDIO 1" >>confdefs.h ac_alsa_seq="no" ac_libs="$ac_libs -framework CoreAudio -framework CoreFoundation" fi # Check for JACK MIDI headers availability. if test "x$ac_jack_midi" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/midiport.h" "ac_cv_header_jack_midiport_h" "$ac_includes_default" if test "x$ac_cv_header_jack_midiport_h" = xyes; then : ac_jack_midi="yes" else ac_jack_midi="no" fi if test "x$ac_jack_midi" = "xyes"; then $as_echo "#define CONFIG_JACK_MIDI 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/midiport.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/midiport.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.103.0 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.103.0 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK MIDI support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK MIDI support will be disabled." >&2;} fi fi # Check for JACK session headers availability. if test "x$ac_jack_session" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/session.h" "ac_cv_header_jack_session_h" "$ac_includes_default" if test "x$ac_cv_header_jack_session_h" = xyes; then : ac_jack_session="yes" else ac_jack_session="no" fi if test "x$ac_jack_session" = "xyes"; then $as_echo "#define CONFIG_JACK_SESSION 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/session.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/session.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.118.3 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.118.3 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK session support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK session support will be disabled." >&2;} fi fi # Check for JACK metadata headers availability. if test "x$ac_jack_metadata" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/metadata.h" "ac_cv_header_jack_metadata_h" "$ac_includes_default" if test "x$ac_cv_header_jack_metadata_h" = xyes; then : ac_jack_metadata="yes" else ac_jack_metadata="no" fi if test "x$ac_jack_metadata" = "xyes"; then $as_echo "#define CONFIG_JACK_METADATA 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/metadata.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/metadata.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.124.1 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.124.1 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK metadata support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK metadata support will be disabled." >&2;} fi fi # Check D-Bus interface support. if test "x$ac_dbus" = "xyes"; then if test "x$ac_qt4" = "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5DBus" >&5 $as_echo_n "checking for Qt5DBus... " >&6; } if test -n "$QT5DBUS_CFLAGS"; then pkg_cv_QT5DBUS_CFLAGS="$QT5DBUS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5DBus") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT5DBUS_CFLAGS=`$PKG_CONFIG --cflags "Qt5DBus" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$QT5DBUS_LIBS"; then pkg_cv_QT5DBUS_LIBS="$QT5DBUS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5DBus\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5DBus") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT5DBUS_LIBS=`$PKG_CONFIG --libs "Qt5DBus" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then QT5DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5DBus" 2>&1` else QT5DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5DBus" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$QT5DBUS_PKG_ERRORS" >&5 ac_dbus="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_dbus="no" else QT5DBUS_CFLAGS=$pkg_cv_QT5DBUS_CFLAGS QT5DBUS_LIBS=$pkg_cv_QT5DBUS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_dbus="yes" fi else pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for QtDBus" >&5 $as_echo_n "checking for QtDBus... " >&6; } if test -n "$QT4DBUS_CFLAGS"; then pkg_cv_QT4DBUS_CFLAGS="$QT4DBUS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDBus\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtDBus") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT4DBUS_CFLAGS=`$PKG_CONFIG --cflags "QtDBus" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$QT4DBUS_LIBS"; then pkg_cv_QT4DBUS_LIBS="$QT4DBUS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"QtDBus\""; } >&5 ($PKG_CONFIG --exists --print-errors "QtDBus") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT4DBUS_LIBS=`$PKG_CONFIG --libs "QtDBus" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then QT4DBUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "QtDBus" 2>&1` else QT4DBUS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "QtDBus" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$QT4DBUS_PKG_ERRORS" >&5 ac_dbus="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_dbus="no" else QT4DBUS_CFLAGS=$pkg_cv_QT4DBUS_CFLAGS QT4DBUS_LIBS=$pkg_cv_QT4DBUS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_dbus="yes" fi fi fi if test "x$ac_dbus" = "xyes"; then $as_echo "#define CONFIG_DBUS 1" >>confdefs.h ac_qdbus="dbus" fi # Check for X11 unique/single instance. if test "x$ac_xunique" = "xyes" -a "x$ac_qt4" = "xno"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt5X11Extras" >&5 $as_echo_n "checking for Qt5X11Extras... " >&6; } if test -n "$QT5X11EXTRAS_CFLAGS"; then pkg_cv_QT5X11EXTRAS_CFLAGS="$QT5X11EXTRAS_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5X11Extras\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5X11Extras") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT5X11EXTRAS_CFLAGS=`$PKG_CONFIG --cflags "Qt5X11Extras" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$QT5X11EXTRAS_LIBS"; then pkg_cv_QT5X11EXTRAS_LIBS="$QT5X11EXTRAS_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5X11Extras\""; } >&5 ($PKG_CONFIG --exists --print-errors "Qt5X11Extras") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_QT5X11EXTRAS_LIBS=`$PKG_CONFIG --libs "Qt5X11Extras" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then QT5X11EXTRAS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "Qt5X11Extras" 2>&1` else QT5X11EXTRAS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "Qt5X11Extras" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$QT5X11EXTRAS_PKG_ERRORS" >&5 ac_xunique="no" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ac_xunique="no" else QT5X11EXTRAS_CFLAGS=$pkg_cv_QT5X11EXTRAS_CFLAGS QT5X11EXTRAS_LIBS=$pkg_cv_QT5X11EXTRAS_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ac_xunique="yes" fi fi if test "x$ac_xunique" = "xyes"; then $as_echo "#define CONFIG_XUNIQUE 1" >>confdefs.h if test "x$ac_qt4" = "xno"; then ac_qx11extras="x11extras" fi # Some recent distros (eg. fedora, debian) require this. if test "x$ac_cv_lib_X11_main" = "xyes"; then ac_libs="$ac_libs -lX11" fi fi # Check for debugging stack-trace. if test "x$ac_stacktrace" = "xyes"; then $as_echo "#define CONFIG_STACKTRACE 1" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST # Checks for library functions. for ac_func in system do : ac_fn_cxx_check_func "$LINENO" "system" "ac_cv_func_system" if test "x$ac_cv_func_system" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSTEM 1 _ACEOF fi done # Check for system-tray icon. if test "x$ac_system_tray" = "xyes"; then $as_echo "#define CONFIG_SYSTEM_TRAY 1" >>confdefs.h fi # Check for jack_transport_query function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_transport_query in -ljack" >&5 $as_echo_n "checking for jack_transport_query in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_transport_query+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_transport_query (); int main () { return jack_transport_query (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_transport_query=yes else ac_cv_lib_jack_jack_transport_query=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_jack_jack_transport_query" >&5 $as_echo "$ac_cv_lib_jack_jack_transport_query" >&6; } if test "x$ac_cv_lib_jack_jack_transport_query" = xyes; then : ac_jack_transport="yes" else ac_jack_transport="no" fi if test "x$ac_jack_transport" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack_transport_query: function not found." >&5 $as_echo "$as_me: WARNING: *** jack_transport_query: function not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.80.0 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.80.0 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Transport features will be disabled." >&5 $as_echo "$as_me: WARNING: *** Transport features will be disabled." >&2;} else $as_echo "#define CONFIG_JACK_TRANSPORT 1" >>confdefs.h fi # Check for jack_is_realtime function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_is_realtime in -ljack" >&5 $as_echo_n "checking for jack_is_realtime in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_is_realtime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_is_realtime (); int main () { return jack_is_realtime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_is_realtime=yes else ac_cv_lib_jack_jack_is_realtime=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_jack_jack_is_realtime" >&5 $as_echo "$ac_cv_lib_jack_jack_is_realtime" >&6; } if test "x$ac_cv_lib_jack_jack_is_realtime" = xyes; then : ac_jack_realtime="yes" else ac_jack_realtime="no" fi if test "x$ac_jack_realtime" = "xyes"; then $as_echo "#define CONFIG_JACK_REALTIME 1" >>confdefs.h fi # Check for jack_get_xrun_delayed_usecs function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_xrun_delayed_usecs in -ljack" >&5 $as_echo_n "checking for jack_get_xrun_delayed_usecs in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_xrun_delayed_usecs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_get_xrun_delayed_usecs (); int main () { return jack_get_xrun_delayed_usecs (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_xrun_delayed_usecs=yes else ac_cv_lib_jack_jack_get_xrun_delayed_usecs=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_jack_jack_get_xrun_delayed_usecs" >&5 $as_echo "$ac_cv_lib_jack_jack_get_xrun_delayed_usecs" >&6; } if test "x$ac_cv_lib_jack_jack_get_xrun_delayed_usecs" = xyes; then : ac_jack_xrun_delay="yes" else ac_jack_xrun_delay="no" fi if test "x$ac_jack_xrun_delay" = "xyes"; then $as_echo "#define CONFIG_JACK_XRUN_DELAY 1" >>confdefs.h fi # Check for jack_get_max_delayed_usecs function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_max_delayed_usecs in -ljack" >&5 $as_echo_n "checking for jack_get_max_delayed_usecs in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_max_delayed_usecs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_get_max_delayed_usecs (); int main () { return jack_get_max_delayed_usecs (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_max_delayed_usecs=yes else ac_cv_lib_jack_jack_get_max_delayed_usecs=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_jack_jack_get_max_delayed_usecs" >&5 $as_echo "$ac_cv_lib_jack_jack_get_max_delayed_usecs" >&6; } if test "x$ac_cv_lib_jack_jack_get_max_delayed_usecs" = xyes; then : ac_jack_max_delay="yes" else ac_jack_max_delay="no" fi if test "x$ac_jack_max_delay" = "xyes"; then $as_echo "#define CONFIG_JACK_MAX_DELAY 1" >>confdefs.h fi # Check for jack_port_get_aliases function. if test "x$ac_jack_port_aliases" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_port_get_aliases in -ljack" >&5 $as_echo_n "checking for jack_port_get_aliases in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_port_get_aliases+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_port_get_aliases (); int main () { return jack_port_get_aliases (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_port_get_aliases=yes else ac_cv_lib_jack_jack_port_get_aliases=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_jack_jack_port_get_aliases" >&5 $as_echo "$ac_cv_lib_jack_jack_port_get_aliases" >&6; } if test "x$ac_cv_lib_jack_jack_port_get_aliases" = xyes; then : ac_jack_port_aliases="yes" else ac_jack_port_aliases="no" fi if test "x$ac_jack_port_aliases" = "xyes"; then $as_echo "#define CONFIG_JACK_PORT_ALIASES 1" >>confdefs.h fi fi # Check for jack_get_version_string function. if test "x$ac_jack_version" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_version_string in -ljack" >&5 $as_echo_n "checking for jack_get_version_string in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_version_string+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_get_version_string (); int main () { return jack_get_version_string (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_version_string=yes else ac_cv_lib_jack_jack_get_version_string=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_jack_jack_get_version_string" >&5 $as_echo "$ac_cv_lib_jack_jack_get_version_string" >&6; } if test "x$ac_cv_lib_jack_jack_get_version_string" = xyes; then : ac_jack_version="yes" else ac_jack_version="no" fi if test "x$ac_jack_version" = "xyes"; then $as_echo "#define CONFIG_JACK_VERSION 1" >>confdefs.h fi fi # Check for jack_free function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_free in -ljack" >&5 $as_echo_n "checking for jack_free in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_free+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $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 jack_free (); int main () { return jack_free (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_free=yes else ac_cv_lib_jack_jack_free=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_jack_jack_free" >&5 $as_echo "$ac_cv_lib_jack_jack_free" >&6; } if test "x$ac_cv_lib_jack_jack_free" = xyes; then : ac_jack_free="yes" else ac_jack_free="no" fi if test "x$ac_jack_free" = "xyes"; then $as_echo "#define CONFIG_JACK_FREE 1" >>confdefs.h fi # Finally produce a configure header file and the main makefile. cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by QjackCtl $as_me 0.5.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _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 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="\\ QjackCtl config.status 0.5.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _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 "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "qjackctl.spec") CONFIG_FILES="$CONFIG_FILES qjackctl.spec" ;; "src/src.pri") CONFIG_FILES="$CONFIG_FILES src/src.pri" ;; *) 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 fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _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 $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # make clean > /dev/null 2>&1 # Output summary message echo echo " $PACKAGE_NAME $ac_build_version" echo echo " Build target . . . . . . . . . . . . . . . . . . .: $ac_debug" echo echo " JACK Audio Connection Kit support . . . . . . . .: $ac_jack_lib" echo " JACK Realtime support . . . . . . . . . . . . . .: $ac_jack_realtime" echo " JACK Transport support . . . . . . . . . . . . . .: $ac_jack_transport" echo " JACK XRUN delay support . . . . . . . . . . . . .: $ac_jack_xrun_delay" echo " JACK Maximum scheduling delay support . . . . . .: $ac_jack_max_delay" echo " JACK Port aliases support . . . . . . . . . . . .: $ac_jack_port_aliases" echo " JACK Metadata support . . . . . . . . . . . . . .: $ac_jack_metadata" echo " JACK MIDI support . . . . . . . . . . . . . . . .: $ac_jack_midi" echo " JACK Session support . . . . . . . . . . . . . . .: $ac_jack_session" echo " JACK Version support (JACK2) . . . . . . . . . . .: $ac_jack_version" echo " ALSA MIDI Sequencer support . . . . . . . . . . .: $ac_alsa_seq" echo " System tray icon support . . . . . . . . . . . . .: $ac_system_tray" echo " D-Bus interface support . . . . . . . . . . . . .: $ac_dbus" echo " PortAudio interface support . . . . . . . . . . .: $ac_portaudio" echo " CoreAudio interface support . . . . . . . . . . .: $ac_coreaudio" echo echo " X11 Unique/Single instance . . . . . . . . . . . .: $ac_xunique" echo " Debugger stack-trace (gdb) . . . . . . . . . . . .: $ac_stacktrace" echo echo " Install prefix . . . . . . . . . . . . . . . . . .: $ac_prefix" echo echo "Now type 'make', followed by 'make install' as root." echo qjackctl-0.5.0/PaxHeaders.4714/configure.ac0000644000000000000000000000013213215206021015242 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/configure.ac0000644000175000001440000005017313215206021016102 0ustar00rncbcusers00000000000000# Process this file with autoconf to produce a configure script. AC_INIT(QjackCtl, 0.5.0, rncbc@rncbc.org, qjackctl) AC_CONFIG_SRCDIR(src/qjackctl.cpp) AC_CONFIG_HEADERS(src/config.h) AC_CONFIG_FILES(Makefile qjackctl.spec src/src.pri) # Build version string. AC_CACHE_VAL([ac_cv_build_version], [ ac_cv_build_version=$(git describe --tags --dirty --abbrev=6 2>/dev/null) if test -n "$ac_cv_build_version"; then ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/^[[^_]]*[[_v]]//i') ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/-g/git./') ac_cv_build_version=$(echo $ac_cv_build_version | sed 's/[[_|-]]\+/./g') ac_cv_build_version_extra=$(git rev-parse --abbrev-ref HEAD 2>/dev/null) if test "x$ac_cv_build_version_extra" != "xmaster"; then ac_cv_build_version="$ac_cv_build_version [[$ac_cv_build_version_extra]]" fi else ac_cv_build_version=$PACKAGE_VERSION fi ]) ac_build_version="$ac_cv_build_version" AC_DEFINE_UNQUOTED(CONFIG_BUILD_VERSION, ["$ac_build_version"], [Build version string.]) # Sanitized version string. AC_CACHE_VAL([ac_cv_version], [ ac_cv_version=$(echo $PACKAGE_VERSION | sed -r 's/^([[0-9|\.]]+).*$/\1/') ]) ac_version="$ac_cv_version" AC_DEFINE_UNQUOTED(CONFIG_VERSION, ["$ac_version"], [Version string.]) AC_SUBST(ac_version) # Set default installation prefix. AC_PREFIX_DEFAULT(/usr/local) if test "x$prefix" = "xNONE"; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = "xNONE"; then exec_prefix=$prefix fi eval ac_prefix=$prefix AC_SUBST(ac_prefix) AC_DEFINE_UNQUOTED(CONFIG_PREFIX, ["$ac_prefix"], [Default installation prefix.]) # Set default installation directories. eval ac_bindir=$bindir AC_SUBST(ac_bindir) AC_DEFINE_UNQUOTED(CONFIG_BINDIR, ["$ac_bindir"], [Default executable binary path.]) eval ac_libdir=$libdir AC_SUBST(ac_libdir) AC_DEFINE_UNQUOTED(CONFIG_LIBDIR, ["$ac_libdir"], [Default object library path.]) eval datarootdir=$datarootdir eval ac_datadir=$datadir AC_SUBST(ac_datadir) AC_DEFINE_UNQUOTED(CONFIG_DATADIR, ["$ac_datadir"], [Default arch-idependent data path.]) eval ac_mandir=$mandir AC_SUBST(ac_mandir) AC_DEFINE_UNQUOTED(CONFIG_MANDIR, ["$ac_mandir"], [Default man page path.]) # Enable debugging argument option. AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [enable debugging (default=no)]), [ac_debug="$enableval"]) if test "x$ac_debug" = "xyes"; then AC_DEFINE(CONFIG_DEBUG, 1, [Define if debugging is enabled.]) ac_stacktrace="yes" ac_debug="debug" else ac_stacktrace="no" ac_debug="release" fi AC_SUBST(ac_debug) # Enable Qt4/5 availability. AC_ARG_ENABLE(qt4, AC_HELP_STRING([--enable-qt4], [enable Qt4 build (default=no)]), [ac_qt4="$enableval"], [ac_qt4="no"]) # Disable system tray argument option. AC_ARG_ENABLE(system_tray, AC_HELP_STRING([--enable-system-tray], [enable system tray (default=yes)]), [ac_system_tray="$enableval"], [ac_system_tray="yes"]) # Disable JACK MIDI support option. AC_ARG_ENABLE(jack_midi, AC_HELP_STRING([--enable-jack-midi], [enable JACK MIDI support (default=yes)]), [ac_jack_midi="$enableval"], [ac_jack_midi="yes"]) # Enable JACK session support. AC_ARG_ENABLE(jack_session, AC_HELP_STRING([--enable-jack-session], [enable JACK session support (default=yes)]), [ac_jack_session="$enableval"], [ac_jack_session="yes"]) # Enable JACK port aliases support. AC_ARG_ENABLE(jack_port_aliases, AC_HELP_STRING([--enable-jack-port-aliases], [enable JACK port aliases support (default=yes)]), [ac_jack_port_aliases="$enableval"], [ac_jack_port_aliases="yes"]) # Enable JACK metadata support. AC_ARG_ENABLE(jack_metadata, AC_HELP_STRING([--enable-jack-metadata], [enable JACK metadata support (default=yes)]), [ac_jack_metadata="$enableval"], [ac_jack_metadata="yes"]) # Enable JACK version support. AC_ARG_ENABLE(jack_version, AC_HELP_STRING([--enable-jack-version], [enable JACK version support (default=no)]), [ac_jack_version="$enableval"], [ac_jack_version="no"]) # Disable ALSA sequencer support option. AC_ARG_ENABLE(alsa_seq, AC_HELP_STRING([--enable-alsa-seq], [enable ALSA/MIDI sequencer support (default=yes)]), [ac_alsa_seq="$enableval"], [ac_alsa_seq="yes"]) # Enable PortAudio argument option. AC_ARG_ENABLE(portaudio, AC_HELP_STRING([--enable-portaudio], [enable PortAudio interface (default=yes)]), [ac_portaudio="$enableval"], [ac_portaudio="yes"]) # Enable D-Bus argument option. AC_ARG_ENABLE(dbus, AC_HELP_STRING([--enable-dbus], [enable D-Bus interface (default=yes)]), [ac_dbus="$enableval"], [ac_dbus="yes"]) # Enable X11 unique/single instance. AC_ARG_ENABLE(xunique, AC_HELP_STRING([--enable-xunique], [enable X11 unique/single instance (default=yes)]), [ac_xunique="$enableval"], [ac_xunique="yes"]) # Enable debugger stack-trace option (assumes --enable-debug). AC_ARG_ENABLE(stacktrace, AC_HELP_STRING([--enable-stacktrace], [enable debugger stack-trace (default=no)]), [ac_stacktrace="$enableval"]) # Standard installation base dirs. ac_with_paths="" # Set for alternate Qt4/5 installation dir. AC_ARG_WITH(qt4, AC_HELP_STRING([--with-qt4=PATH], [use alternate Qt4 install path]), [ac_qt4_path="$withval"], [ac_qt4_path="no"]) AC_ARG_WITH(qt5, AC_HELP_STRING([--with-qt5=PATH], [use alternate Qt5 install path]), [ac_qt5_path="$withval"], [ac_qt5_path="no"]) if test "x$ac_qt4_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt4_path" ac_qt4="yes" fi if test "x$ac_qt5_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt5_path" ac_qt4="no" fi # Set for alternate JACK installation dir. AC_ARG_WITH(jack, AC_HELP_STRING([--with-jack=PATH], [use alternate JACK install path]), [ac_with_paths="$ac_with_paths $withval"]) # Set for alternate ALSA installation dir. AC_ARG_WITH(alsa, AC_HELP_STRING([--with-alsa=PATH], [use alternate ALSA install path]), [ac_with_paths="$ac_with_paths $withval"]) # Set for alternate PortAudio installation dir. AC_ARG_WITH(portaudio, AC_HELP_STRING([--with-portaudio=PATH], [use alternate PortAudio install path]), [ac_with_paths="$ac_with_paths $withval"]) # Honor user specified flags. ac_cflags=$CFLAGS ac_ldflags=$LDFLAGS # Checks for programs. AC_PROG_CPP AC_PROG_CXX AC_PROG_CXXCPP # Checks for languages. AC_LANG_CPLUSPLUS # Check for pkg-config. PKG_PROG_PKG_CONFIG # Check whether -std=c++11 support is necessary (4 < g++ version < 6). AC_CACHE_CHECK([for g++ major version], [ac_cv_gxx_version_major], [ ac_cv_gxx_version_major=$($CC -dumpversion) if test -n "$ac_cv_gxx_version_major"; then ac_cv_gxx_version_major=$(echo $ac_cv_gxx_version_major | cut -d'.' -f1); fi ac_gxx_version_major=$(($ac_cv_gxx_version_major + 0)) ]) ac_gxx_version_major=$ac_cv_gxx_version_major if test $ac_gxx_version_major -ge 4 -a $ac_gxx_version_major -lt 6; then CXXFLAGS="-std=c++11 $CXXFLAGS" fi # Check for proper flags. ac_arch=$(uname -m) # Check for install paths and alternatives... ac_libdirs="lib" if test "x$ac_arch" = "xx86_64"; then ac_libdirs="$ac_libdirs lib64" fi CFLAGS="-fPIC $CFLAGS" CPPFLAGS="-fPIC $CPPFLAGS" # Prepend alternate dependencies paths. ac_path=$PATH for X in $ac_with_paths; do if test -d $X/bin; then ac_path="$X/bin:$ac_path" fi if test -d $X/include; then CFLAGS="-I$X/include $CFLAGS " CPPFLAGS="-I$X/include $CPPFLAGS" ac_incpath="$X/include $ac_incpath" fi for Y in $ac_libdirs; do if test -d $X/$Y; then LIBS="-L$X/$Y $LIBS" ac_libs="-L$X/$Y $ac_libs" fi done done # A common error message: ac_errmsg="not found in current PATH. Maybe QT development environment isn't available." if test "x$ac_qt4" = "xyes"; then AC_PATH_PROG(ac_qmake, qmake-qt4, [no], $ac_path) else AC_PATH_PROG(ac_qmake, qmake-qt5, [no], $ac_path) fi if test "x$ac_qmake" = "xno"; then AC_PATH_PROG(ac_cv_qmake, qmake, [no], $ac_path) ac_qmake=$ac_cv_qmake fi if test "x$ac_qmake" = "xno"; then AC_MSG_ERROR([qmake $ac_errmsg]) fi # Check for proper Qt major version. AC_CACHE_CHECK([for Qt major version], [ac_cv_qt_version_major], [ ac_cv_qt_version_major=$($ac_qmake -query QT_VERSION | cut -d'.' -f1) ac_cv_qt_version_major=$(($ac_cv_qt_version_major + 0)) ]) ac_qt_version_major=$ac_cv_qt_version_major if test "x$ac_qt4" = "xyes"; then if test $ac_qt_version_major -ne 4; then AC_MSG_ERROR([qmake-qt4 $ac_errmsg (qt4-devel)]) fi else if test $ac_qt_version_major -ne 5; then AC_MSG_ERROR([qmake-qt5 $ac_errmsg (qt5-devel)]) fi fi # Check for proper Qt install path. AC_CACHE_CHECK([for Qt install path], [ac_cv_qt_install_path], [ ac_cv_qt_install_path=$($ac_qmake -query QT_INSTALL_BINS) ]) ac_qt_install_path=$ac_cv_qt_install_path if test -d $ac_qt_install_path; then ac_path="$ac_qt_install_path:$ac_path" fi # Check it again, now with updated PATH, just in case... AC_PATH_PROG(ac_cv_qmake, qmake, [no], $ac_path) ac_qmake=$ac_cv_qmake if test "x$ac_qmake" = "xno"; then AC_MSG_ERROR([qmake $ac_errmsg]) fi AC_SUBST(ac_qmake) AC_CACHE_CHECK([for Qt install headers], [ac_cv_qt_install_headers], [ ac_cv_qt_install_headers=$($ac_qmake -query QT_INSTALL_HEADERS) ]) ac_qt_install_headers=$ac_cv_qt_install_headers if test -d $ac_qt_install_headers; then CFLAGS="-I$ac_qt_install_headers $CFLAGS " CPPFLAGS="-I$ac_qt_install_headers $CPPFLAGS" ac_incpath="$ac_qt_install_headers $ac_incpath" fi AC_CACHE_CHECK([for Qt install libraries], [ac_cv_qt_install_libs], [ ac_cv_qt_install_libs=$($ac_qmake -query QT_INSTALL_LIBS) ]) ac_qt_install_libs=$ac_cv_qt_install_libs if test -d $ac_qt_install_libs; then LIBS="-L$ac_qt_install_libs $LIBS" ac_libs="-L$ac_qt_install_libs $ac_libs" fi # Finally, check for proper Qt4/5 version. if test "x$ac_qt4" = "xyes"; then AC_CACHE_CHECK([for Qt library version >= 4.4], ac_cv_qtversion, [ AC_TRY_COMPILE([#include "QtCore/qglobal.h"], [ #if QT_VERSION < 0x040400 || QT_VERSION >= 0x050000 #error Qt library 4.4 or greater required. #endif ], ac_cv_qtversion="yes", [ echo "no; Qt 4.4 or greater is required" exit 1 ]) ]) else AC_CACHE_CHECK([for Qt library version >= 5.1], ac_cv_qtversion, [ AC_TRY_COMPILE([#include "QtCore/qglobal.h"], [ #if QT_VERSION < 0x050100 || QT_VERSION >= 0x060000 #error Qt library 5.1 or greater required. #endif ], ac_cv_qtversion="yes", [ echo "no; Qt 5.1 or greater is required" exit 1 ]) ]) fi # Check for Qt moc utility. AC_PATH_PROG(ac_moc, moc, [no], $ac_path) if test "x$ac_moc" = "xno"; then AC_MSG_ERROR([moc $ac_errmsg]) fi AC_SUBST(ac_moc) # Check for Qt uic utility. AC_PATH_PROG(ac_uic, uic, [no], $ac_path) if test "x$ac_uic" = "xno"; then AC_MSG_ERROR([uic $ac_errmsg]) fi AC_SUBST(ac_uic) # Check for Qt lupdate utility. AC_PATH_PROG(ac_lupdate, lupdate, [no], $ac_path) if test "x$ac_lupdate" = "xno"; then AC_MSG_ERROR([lupdate $ac_errmsg]) fi AC_SUBST(ac_lupdate) # Check for Qt lrelease utility. AC_PATH_PROG(ac_lrelease, lrelease, [no], $ac_path) if test "x$ac_release" = "xno"; then AC_MSG_ERROR([lrelease $ac_errmsg]) fi AC_SUBST(ac_lrelease) # Checks for libraries. AC_CHECK_LIB(m, main) AC_CHECK_LIB(X11, main) AC_CHECK_LIB(Xext, main) # Check for round math function. AC_CHECK_LIB(m, lroundf, [ac_round="yes"], [ac_round="no"]) if test "x$ac_round" = "xyes"; then AC_DEFINE(CONFIG_ROUND, 1, [Define if round is available.]) fi # Check for JACK libraries. PKG_CHECK_MODULES([JACK], [jack >= 0.100.0], [ac_jack_lib="yes"], [ac_jack_lib="no"]) if test "x$ac_jack_lib" = "xyes"; then AC_DEFINE(CONFIG_JACK, 1, [Define if JACK library is available.]) ac_cflags="$ac_cflags $JACK_CFLAGS" ac_libs="$ac_libs $JACK_LIBS" CFLAGS="$CFLAGS $JACK_CFLAGS" CPPFLAGS="$CPPFLAGS $JACK_CFLAGS" LIBS="$LIBS $JACK_LIBS" else AC_MSG_ERROR([*** JACK library not found.]) fi # Check for ALSA libraries and primarily # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then PKG_CHECK_MODULES([ALSA], [alsa], [ac_alsa_seq="yes"], [ac_alsa_seq="no"]) fi if test "x$ac_alsa_seq" = "xyes"; then AC_DEFINE(CONFIG_ALSA_SEQ, 1, [Define if ALSA library is available.]) ac_cflags="$ac_cflags $ALSA_CFLAGS" ac_libs="$ac_libs $ALSA_LIBS" else AC_MSG_WARN([*** ALSA library not found.]) fi if test "x$ac_portaudio" = "xyes"; then PKG_CHECK_MODULES([PORTAUDIO], [portaudio-2.0], [ac_portaudio="yes"], [ac_portaudio="no"]) fi if test "x$ac_portaudio" = "xyes"; then AC_DEFINE(CONFIG_PORTAUDIO 1, [Define if PORTAUDIO library is available.]) ac_cflags="$ac_cflags $PORTAUDIO_CFLAGS" ac_libs="$ac_libs $PORTAUDIO_LIBS" else AC_MSG_WARN([*** PORTAUDIO library not found.]) fi # Checks for header files. AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(fcntl.h sys/ioctl.h unistd.h poll.h signal.h) # Check for jack/statistics.h header. AC_CHECK_HEADER(jack/statistics.h, [ac_jack_statistics_h="yes"], [ac_jack_statistics_h="no"]) if test "x$ac_jack_statistics_h" = "xyes"; then AC_DEFINE(CONFIG_JACK_STATISTICS, 1, [Define if jack/statistics.h is available.]) fi # Check for CoreAudio/CoreAudio.h header (MacOSX). AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ac_coreaudio="yes"], [ac_coreaudio="no"]) if test "x$ac_coreaudio" = "xyes"; then AC_DEFINE(CONFIG_COREAUDIO, 1, [Define if CoreAudio/CoreAudio.h is available (Mac OS X).]) ac_alsa_seq="no" ac_libs="$ac_libs -framework CoreAudio -framework CoreFoundation" fi # Check for JACK MIDI headers availability. if test "x$ac_jack_midi" = "xyes"; then AC_CHECK_HEADER(jack/midiport.h, [ac_jack_midi="yes"], [ac_jack_midi="no"]) if test "x$ac_jack_midi" = "xyes"; then AC_DEFINE(CONFIG_JACK_MIDI, 1, [Define if JACK MIDI support is available.]) else AC_MSG_WARN([*** jack/midiport.h file not found.]) AC_MSG_WARN([*** JACK 0.103.0 or later may be required.]) AC_MSG_WARN([*** JACK MIDI support will be disabled.]) fi fi # Check for JACK session headers availability. if test "x$ac_jack_session" = "xyes"; then AC_CHECK_HEADER(jack/session.h, [ac_jack_session="yes"], [ac_jack_session="no"]) if test "x$ac_jack_session" = "xyes"; then AC_DEFINE(CONFIG_JACK_SESSION, 1, [Define if JACK session support is available.]) else AC_MSG_WARN([*** jack/session.h file not found.]) AC_MSG_WARN([*** JACK 0.118.3 or later may be required.]) AC_MSG_WARN([*** JACK session support will be disabled.]) fi fi # Check for JACK metadata headers availability. if test "x$ac_jack_metadata" = "xyes"; then AC_CHECK_HEADER(jack/metadata.h, [ac_jack_metadata="yes"], [ac_jack_metadata="no"]) if test "x$ac_jack_metadata" = "xyes"; then AC_DEFINE(CONFIG_JACK_METADATA, 1, [Define if JACK metadata support is available.]) else AC_MSG_WARN([*** jack/metadata.h file not found.]) AC_MSG_WARN([*** JACK 0.124.1 or later may be required.]) AC_MSG_WARN([*** JACK metadata support will be disabled.]) fi fi # Check D-Bus interface support. if test "x$ac_dbus" = "xyes"; then if test "x$ac_qt4" = "xno"; then PKG_CHECK_MODULES([QT5DBUS], [Qt5DBus], [ac_dbus="yes"], [ac_dbus="no"]) else PKG_CHECK_MODULES([QT4DBUS], [QtDBus], [ac_dbus="yes"], [ac_dbus="no"]) fi fi if test "x$ac_dbus" = "xyes"; then AC_DEFINE(CONFIG_DBUS, 1, [Define if D-Bus interface is enabled.]) ac_qdbus="dbus" fi AC_SUBST(ac_qdbus) # Check for X11 unique/single instance. if test "x$ac_xunique" = "xyes" -a "x$ac_qt4" = "xno"; then PKG_CHECK_MODULES([QT5X11EXTRAS], [Qt5X11Extras], [ac_xunique="yes"], [ac_xunique="no"]) fi if test "x$ac_xunique" = "xyes"; then AC_DEFINE(CONFIG_XUNIQUE, 1, [Define if X11 unique/single instance is enabled.]) if test "x$ac_qt4" = "xno"; then ac_qx11extras="x11extras" fi # Some recent distros (eg. fedora, debian) require this. if test "x$ac_cv_lib_X11_main" = "xyes"; then ac_libs="$ac_libs -lX11" fi fi AC_SUBST(ac_qx11extras) # Check for debugging stack-trace. if test "x$ac_stacktrace" = "xyes"; then AC_DEFINE(CONFIG_STACKTRACE, 1, [Define if debugger stack-trace is enabled.]) fi AC_SUBST(ac_cflags) AC_SUBST(ac_ldflags) AC_SUBST(ac_incpath) AC_SUBST(ac_libs) # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST # Checks for library functions. AC_CHECK_FUNCS(system) # Check for system-tray icon. if test "x$ac_system_tray" = "xyes"; then AC_DEFINE(CONFIG_SYSTEM_TRAY, 1, [Define if system tray is enabled.]) fi # Check for jack_transport_query function. AC_CHECK_LIB(jack, jack_transport_query, [ac_jack_transport="yes"], [ac_jack_transport="no"]) if test "x$ac_jack_transport" = "xno"; then AC_MSG_WARN([*** jack_transport_query: function not found.]) AC_MSG_WARN([*** JACK 0.80.0 or later may be required.]) AC_MSG_WARN([*** Transport features will be disabled.]) else AC_DEFINE(CONFIG_JACK_TRANSPORT, 1, [Define if jack_tranport_query is available.]) fi # Check for jack_is_realtime function. AC_CHECK_LIB(jack, jack_is_realtime, [ac_jack_realtime="yes"], [ac_jack_realtime="no"]) if test "x$ac_jack_realtime" = "xyes"; then AC_DEFINE(CONFIG_JACK_REALTIME, 1, [Define if jack_is_realtime is available.]) fi # Check for jack_get_xrun_delayed_usecs function. AC_CHECK_LIB(jack, jack_get_xrun_delayed_usecs, [ac_jack_xrun_delay="yes"], [ac_jack_xrun_delay="no"]) if test "x$ac_jack_xrun_delay" = "xyes"; then AC_DEFINE(CONFIG_JACK_XRUN_DELAY, 1, [Define if jack_get_xrun_delayed_usecs is available.]) fi # Check for jack_get_max_delayed_usecs function. AC_CHECK_LIB(jack, jack_get_max_delayed_usecs, [ac_jack_max_delay="yes"], [ac_jack_max_delay="no"]) if test "x$ac_jack_max_delay" = "xyes"; then AC_DEFINE(CONFIG_JACK_MAX_DELAY, 1, [Define if jack_get_max_delayed_usecs is available.]) fi # Check for jack_port_get_aliases function. if test "x$ac_jack_port_aliases" = "xyes"; then AC_CHECK_LIB(jack, jack_port_get_aliases, [ac_jack_port_aliases="yes"], [ac_jack_port_aliases="no"]) if test "x$ac_jack_port_aliases" = "xyes"; then AC_DEFINE(CONFIG_JACK_PORT_ALIASES, 1, [Define if jack_port_get_aliases is available.]) fi fi # Check for jack_get_version_string function. if test "x$ac_jack_version" = "xyes"; then AC_CHECK_LIB(jack, jack_get_version_string, [ac_jack_version="yes"], [ac_jack_version="no"]) if test "x$ac_jack_version" = "xyes"; then AC_DEFINE(CONFIG_JACK_VERSION, 1, [Define if jack_get_version_string is available.]) fi fi # Check for jack_free function. AC_CHECK_LIB(jack, jack_free, [ac_jack_free="yes"], [ac_jack_free="no"]) if test "x$ac_jack_free" = "xyes"; then AC_DEFINE(CONFIG_JACK_FREE, 1, [Define if jack_free is available.]) fi # Finally produce a configure header file and the main makefile. AC_OUTPUT # make clean > /dev/null 2>&1 # Output summary message echo echo " $PACKAGE_NAME $ac_build_version" echo echo " Build target . . . . . . . . . . . . . . . . . . .: $ac_debug" echo echo " JACK Audio Connection Kit support . . . . . . . .: $ac_jack_lib" echo " JACK Realtime support . . . . . . . . . . . . . .: $ac_jack_realtime" echo " JACK Transport support . . . . . . . . . . . . . .: $ac_jack_transport" echo " JACK XRUN delay support . . . . . . . . . . . . .: $ac_jack_xrun_delay" echo " JACK Maximum scheduling delay support . . . . . .: $ac_jack_max_delay" echo " JACK Port aliases support . . . . . . . . . . . .: $ac_jack_port_aliases" echo " JACK Metadata support . . . . . . . . . . . . . .: $ac_jack_metadata" echo " JACK MIDI support . . . . . . . . . . . . . . . .: $ac_jack_midi" echo " JACK Session support . . . . . . . . . . . . . . .: $ac_jack_session" echo " JACK Version support (JACK2) . . . . . . . . . . .: $ac_jack_version" echo " ALSA MIDI Sequencer support . . . . . . . . . . .: $ac_alsa_seq" echo " System tray icon support . . . . . . . . . . . . .: $ac_system_tray" echo " D-Bus interface support . . . . . . . . . . . . .: $ac_dbus" echo " PortAudio interface support . . . . . . . . . . .: $ac_portaudio" echo " CoreAudio interface support . . . . . . . . . . .: $ac_coreaudio" echo echo " X11 Unique/Single instance . . . . . . . . . . . .: $ac_xunique" echo " Debugger stack-trace (gdb) . . . . . . . . . . . .: $ac_stacktrace" echo echo " Install prefix . . . . . . . . . . . . . . . . . .: $ac_prefix" echo echo "Now type 'make', followed by 'make install' as root." echo qjackctl-0.5.0/PaxHeaders.4714/COPYING0000644000000000000000000000013213215206021014007 xustar0030 mtime=1513425937.520766939 30 atime=1513425937.520766939 30 ctime=1513425937.520766939 qjackctl-0.5.0/COPYING0000644000175000001440000004310313215206021014642 0ustar00rncbcusers00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. 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 Program or any portion of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, 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 Program, 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 Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) 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; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, 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 executable. However, as a special exception, the source code 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. If distribution of executable or 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 counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program 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. 5. 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 Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program 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 to this License. 7. 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 Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program 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 Program. 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. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program 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. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies 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 Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, 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 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qjackctl-0.5.0/PaxHeaders.4714/INSTALL0000644000000000000000000000013213215206021014005 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/INSTALL0000644000175000001440000003634013215206021014645 0ustar00rncbcusers00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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. qjackctl-0.5.0/PaxHeaders.4714/Makefile.git0000644000000000000000000000013213215206021015176 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/Makefile.git0000644000175000001440000000062613215206021016034 0ustar00rncbcusers00000000000000all: configure configure: Makefile.in configure.ac @aclocal @autoheader @autoconf @rm -rf *.cache clean: @if [ -f Makefile ]; then make clean; fi @rm -rvf Makefile configure config.* src/.ui src/.obj src/.moc @rm -rvf src/config.* src/*.pri @rm -rvf src/Makefile src/Makefile.* src/*.mak src/*.mak.* @rm -rvf *.cache *.log *.status *.spec *.mak *.m4 .m4 @rm -rvf .qmake.stash src/.qmake.stash qjackctl-0.5.0/PaxHeaders.4714/Makefile.in0000644000000000000000000000013213215206021015021 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/Makefile.in0000644000175000001440000000666613215206021015671 0ustar00rncbcusers00000000000000prefix = @ac_prefix@ name = qjackctl target = src/$(name) headers = \ src/config.h \ src/qjackctlAbout.h \ src/qjackctlAlsaConnect.h \ src/qjackctlConnect.h \ src/qjackctlConnectAlias.h \ src/qjackctlInterfaceComboBox.h \ src/qjackctlJackConnect.h \ src/qjackctlPatchbay.h \ src/qjackctlPatchbayFile.h \ src/qjackctlPatchbayRack.h \ src/qjackctlSession.h \ src/qjackctlSetup.h \ src/qjackctlStatus.h \ src/qjackctlSystemTray.h \ src/qjackctlAboutForm.h \ src/qjackctlConnectionsForm.h \ src/qjackctlMainForm.h \ src/qjackctlMessagesStatusForm.h \ src/qjackctlPatchbayForm.h \ src/qjackctlSessionForm.h \ src/qjackctlSetupForm.h \ src/qjackctlSocketForm.h sources = \ src/qjackctl.cpp \ src/qjackctlAlsaConnect.cpp \ src/qjackctlConnect.cpp \ src/qjackctlConnectAlias.cpp \ src/qjackctlInterfaceComboBox.cpp \ src/qjackctlJackConnect.cpp \ src/qjackctlPatchbay.cpp \ src/qjackctlPatchbayFile.cpp \ src/qjackctlPatchbayRack.cpp \ src/qjackctlSession.cpp \ src/qjackctlSetup.cpp \ src/qjackctlSystemTray.cpp \ src/qjackctlAboutForm.cpp \ src/qjackctlConnectionsForm.cpp \ src/qjackctlMainForm.cpp \ src/qjackctlMessagesStatusForm.cpp \ src/qjackctlPatchbayForm.cpp \ src/qjackctlSessionForm.cpp \ src/qjackctlSetupForm.cpp \ src/qjackctlSocketForm.cpp forms = \ src/qjackctlAboutForm.ui \ src/qjackctlConnectionsForm.ui \ src/qjackctlMainForm.ui \ src/qjackctlMessagesStatusForm.ui \ src/qjackctlPatchbayForm.ui \ src/qjackctlSessionForm.ui \ src/qjackctlSetupForm.ui \ src/qjackctlSocketForm.ui resources = \ src/qjackctl.qrc translations_sources = \ src/translations/qjackctl_cs.ts \ src/translations/qjackctl_de.ts \ src/translations/qjackctl_es.ts \ src/translations/qjackctl_fr.ts \ src/translations/qjackctl_it.ts \ src/translations/qjackctl_ja.ts \ src/translations/qjackctl_nl.ts \ src/translations/qjackctl_ru.ts translations_targets = \ src/translations/qjackctl_cs.qm \ src/translations/qjackctl_de.qm \ src/translations/qjackctl_es.qm \ src/translations/qjackctl_fr.qm \ src/translations/qjackctl_it.qm \ src/translations/qjackctl_ja.qm \ src/translations/qjackctl_nl.qm \ src/translations/qjackctl_ru.qm export datadir = @ac_datadir@ export mandir = @ac_mandir@ translations_dir = $(datadir)/$(name)/translations export QMAKE = @ac_qmake@ export LUPDATE = @ac_lupdate@ export LRELEASE = @ac_lrelease@ all: $(target) $(target): $(name).mak $(resources) ${forms} $(sources) $(headers) @$(MAKE) -f $(name).mak $(name).mak: $(name).pro @$(QMAKE) -o $(name).mak $(name).pro translations_lupdate: $(name).pro @$(LUPDATE) -verbose -no-obsolete $(name).pro translations_lrelease: translations_lupdate $(translations_targets) %.qm: %.ts @$(LRELEASE) -verbose $< -qm $@ install: $(target) translations_lrelease $(name).1 @$(MAKE) INSTALL_ROOT=$(DESTDIR) -f $(name).mak install @install -d -v -m 0755 $(DESTDIR)$(translations_dir) @install -d -v -m 0755 $(DESTDIR)$(mandir)/man1 @install -v -m 0644 $(translations_targets) $(DESTDIR)$(translations_dir) @install -v -m 0644 $(name)*.1 $(DESTDIR)$(mandir)/man1 @gzip -vf $(DESTDIR)$(mandir)/man1/$(name)*.1 uninstall: $(DESTDIR)$(prefix)/bin/$(name) @$(MAKE) INSTALL_ROOT=$(DESTDIR) -f $(name).mak uninstall @rm -rvf $(DESTDIR)$(translations_dir) @rm -vf $(DESTDIR)$(mandir)/man1/$(name)*.1.gz clean: $(name).mak @$(MAKE) -f $(name).mak distclean @rm -f $(target) $(target).mak $(name).mak @rm -rf *.cache *.log *.status $(translations_targets) qjackctl-0.5.0/PaxHeaders.4714/qjackctl.10000644000000000000000000000013213215206021014632 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/qjackctl.10000644000175000001440000000256313215206021015472 0ustar00rncbcusers00000000000000.TH QJACKCTL 1 "June 17, 2014" .SH NAME qjackctl \- User interface for controlling JACK (Jack Audio Connection Kit) .SH SYNOPSIS .B qjackctl [\fIoptions\fR] .SH DESCRIPTION This manual page documents briefly the .B qjackctl command. .PP .PP \fBQjackCtl\fP is used for controlling the Jack Audio Connection Kit (JACK) and as a patchbay for ALSA MIDI and JACK MIDI devices. \fBQjackCtl\fP also has support for the JACK transport control protocol, so you can use it to start and stop the JACK transport. Once you start qjackctl, you get presented with a single GUI window, the buttons are self-explanatory and have tooltips. .SH OPTIONS .HP \fB\-s\fR, \fB\-\-start\fR .IP Start JACK audio server immediately .HP \fB\-p\fR, \fB\-\-preset\fR=[\fIlabel\fR] .IP Set default settings preset name .HP \fB\-a\fR, \fB\-\-active\-patchbay\fR=[\fIpath\fR] .IP Set active patchbay definition file .HP \fB\-n\fR, \fB\-\-server\-name\fR=[\fIlabel\fR] .IP Set default JACK audio server name .HP \fB\-h\fR, \fB\-\-help\fR .IP Show help about command line options .HP \fB\-v\fR, \fB\-\-version\fR .IP Show version information. .SH SEE ALSO .BR jackd (1) .SH FILES Configuration settings are stored in ~/.config/rncbc.org/QjackCtl.conf .SH AUTHOR QjackCtl was written by Rui Nuno Capela. .PP This manual page was written by Guenter Geiger , for the Debian project (but may be used by others). qjackctl-0.5.0/PaxHeaders.4714/qjackctl.fr.10000644000000000000000000000013213215206021015240 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/qjackctl.fr.10000644000175000001440000000347513215206021016103 0ustar00rncbcusers00000000000000.TH QJACKCTL 1 "Juin 17, 2014" .SH NOM qjackctl \- interface utilisateur pour contrôler JACK (Jack Audio Connection Kit) .SH SYNOPSIS .B qjackctl [\fIoptions\fR] .SH DESCRIPTION Ce manuel décrit rapidement la commande .B qjackctl . .PP .PP \fBQjackCtl\fP est utilisé pour contrôler le kit de connexion audio Jack (JACK) ainsi qu'en tant que baie de brassage pour les périphériques ALSA MIDI et JACK MIDI. \fBQjackCtl\fP possède également un support pour le protocole de transport JACK, et vous pouvez donc l'utiliser pour démarrer et arrêter le transport JACK. Lorsque vous démarrez qjackctl, une fenêtre d'interface graphique unique vous est présentée, dont les boutons sont simples à comprendre et possèdent des info-bulles. .SH OPTIONS .HP \fB\-s\fR, \fB\-\-start\fR .IP Démarre le serveur audio JACK immédiatemment .HP \fB\-p\fR, \fB\-\-preset\fR=[\fIétiquette\fR] .IP Paramètre le nom du pré-réglage de paramètres par défaut .HP \fB\-a\fR, \fB\-\-active\-patchbay\fR=[\fIchemin\fR] .IP Paramètre le fichier de définition de la baie de brassage active .HP \fB\-n\fR, \fB\-\-server\-name\fR=[\fIétiquette\fR] .IP Paramètre le nom du serveur audio JACK par défaut .HP \fB\-h\fR, \fB\-\-help\fR .IP Affiche de l'aide à propos des options de ligne de commande .HP \fB\-v\fR, \fB\-\-version\fR .IP Affiche des informations de version. .SH VOIR ÉGALEMENT .BR jackd (1) .SH FICHIER Les paramètres de configuration sont stockés dans ~/.config/rncbc.org/QjackCtl.conf .SH AUTEUR QjackCtl a été écrit pas Rui Nuno Capela. .PP Cette page de manuel a été écrite par Guenter Geiger , pour le projet Debian (mais peut être utilisée par d'autres). .PP La version française a été traduite par Olivier Humbert , pour le projet LibraZiK (mais peut être utilisée par d'autres). qjackctl-0.5.0/PaxHeaders.4714/qjackctl.pro0000644000000000000000000000013213215206021015272 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/qjackctl.pro0000644000175000001440000000006213215206021016122 0ustar00rncbcusers00000000000000# qjackctl.pro # TEMPLATE = subdirs SUBDIRS = src qjackctl-0.5.0/PaxHeaders.4714/qjackctl.spec.in0000644000000000000000000000013213215206021016031 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/qjackctl.spec.in0000644000175000001440000001123413215206021016664 0ustar00rncbcusers00000000000000%define name @PACKAGE_TARNAME@ %define version @PACKAGE_VERSION@ %define release 29 %define _prefix @ac_prefix@ %if %{defined fedora} %define debug_package %{nil} %endif Summary: JACK Audio Connection Kit Qt GUI Interface Name: %{name} Version: %{version} Release: %{release} License: GPL-2.0+ Group: Productivity/Multimedia/Sound/Utilities Source0: %{name}-%{version}.tar.gz URL: http://qjackctl.sourceforge.net/ #Packager: rncbc.org BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot #BuildRequires: libqt4-devel >= 4.4 %if %{defined fedora} BuildRequires: pkgconfig BuildRequires: qt5-qtbase-devel >= 5.1, qt5-linguist BuildRequires: qt5-qtx11extras-devel >= 5.1 BuildRequires: alsa-lib-devel %else BuildRequires: pkg-config BuildRequires: libqt5-qtbase-devel >= 5.1, libqt5-linguist BuildRequires: libqt5-qtx11extras-devel >= 5.1 BuildRequires: alsa-devel %endif BuildRequires: libjack-devel >= 0.100.0 %description JACK Audio Connection Kit - Qt GUI Interface: A simple Qt application to control the JACK server. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features. %prep %setup [ -x ./autogen.sh ] && ./autogen.sh %build %configure %__make %{?_smp_mflags} %install %__make DESTDIR="%{buildroot}" install %clean [ -d "%{buildroot}" -a "%{buildroot}" != "/" ] && %__rm -rf "%{buildroot}" %files %defattr(-,root,root) %doc AUTHORS COPYING ChangeLog README TODO #dir %{_datadir}/applications %dir %{_datadir}/icons/hicolor %dir %{_datadir}/icons/hicolor/32x32 %dir %{_datadir}/icons/hicolor/32x32/apps %dir %{_datadir}/%{name} %dir %{_datadir}/%{name}/translations %dir %{_datadir}/metainfo #dir %{_datadir}/man #dir %{_datadir}/man/man1 %{_bindir}/%{name} %{_datadir}/applications/%{name}.desktop %{_datadir}/icons/hicolor/32x32/apps/%{name}.png %{_datadir}/%{name}/translations/%{name}_*.qm %{_datadir}/metainfo/%{name}.appdata.xml %{_datadir}/man/man1/%{name}*.1.gz %changelog * Sat Dec 16 2017 Rui Nuno Capela 0.5.0 - End of Autumn'17 release. * Thu Apr 27 2017 Rui Nuno Capela 0.4.5 - Pre-LAC2017 release frenzy. * Mon Nov 14 2016 Rui Nuno Capela 0.4.4 - A Fall'16 release. * Wed Sep 14 2016 Rui Nuno Capela 0.4.3 - End of Summer'16 release. * Tue Apr 5 2016 Rui Nuno Capela 0.4.2 - Spring'16 release frenzy. * Wed Oct 28 2015 Rui Nuno Capela 0.4.1 - A Fall'15 release. * Wed Jul 15 2015 Rui Nuno Capela 0.4.0 - Summer'15 release frenzy. * Wed Mar 25 2015 Rui Nuno Capela 0.3.13 - Pre-LAC2015 release frenzy. * Sun Oct 19 2014 Rui Nuno Capela 0.3.12 - JACK Pretty-names aliasing. * Tue Dec 31 2013 Rui Nuno Capela 0.3.11 - A fifth of a Jubilee release. * Tue Apr 2 2013 Rui Nuno Capela 0.3.10 - The singing swan rehersal. * Fri May 18 2012 Rui Nuno Capela 0.3.9 - The last of the remnants. * Fri Jul 1 2011 Rui Nuno Capela 0.3.8 - JACK Session versioning. * Tue Nov 30 2010 Rui Nuno Capela 0.3.7 - JACK Session managerism. * Mon May 17 2010 Rui Nuno Capela - Standard desktop icon fixing. * Mon Jan 11 2010 Rui Nuno Capela 0.3.6 - Full D-Busification! * Mon Jan 11 2010 Rui Nuno Capela - Man page added. * Wed Sep 30 2009 Rui Nuno Capela 0.3.5 - Slipped away! * Fri Dec 05 2008 Rui Nuno Capela 0.3.4 - Patchbay snapshot revamp. * Sat Jun 07 2008 Rui Nuno Capela 0.3.3 - Patchbay JACK-MIDI, file logging and X11 uniqueness. * Thu Dec 20 2007 Rui Nuno Capela 0.3.2 - Patchbay heads-up with season greetings. * Thu Jul 19 2007 Rui Nuno Capela - System-tray tooltip icon crash fix. * Wed Jul 18 2007 Rui Nuno Capela 0.3.1 - Shallowed bug-fix release.. * Tue Jul 10 2007 Rui Nuno Capela 0.3.0 - Qt4 migration was complete. * Mon Jun 25 2007 Rui Nuno Capela - Application icon is now installed to (prefix)/share/pixmaps. - Declared fundamental build and run-time requirements. - Destination install directory prefix is now in spec. - Spec is now a bit more openSUSE compliant. * Wed May 31 2006 Rui Nuno Capela - Changed copyright to license attribute * Wed Aug 24 2005 Rui Nuno Capela - Created initial qjackctl.spec qjackctl-0.5.0/PaxHeaders.4714/README0000644000000000000000000000013213215206021013634 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/README0000644000175000001440000001110613215206021014465 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- QjackCtl is a simple Qt application to control the JACK sound server (http://jackaudio.org), for the Linux Audio infrastructure. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features. Homepage: http://qjackctl.sourceforge.net License: GNU General Public License (GPL) Requirements ------------ The software requirements for build and runtime are listed as follows: Mandatory: - Qt framework, C++ class library and tools for cross-platform application and UI development http://qt.io/ - JACK Audio Connection Kit http://jackaudio.org/ Optional (opted-in at build time): - ALSA, Advanced Linux Sound Architecture http://www.alsa-project.org/ Installation ------------ The installation procedure follows the standard for source distributions: ./configure [--prefix=/usr/local] make and optionally as root: make install This procedure will end installing the following files: ${prefix}/bin/qjackctl ${prefix}/share/pixmaps/qjackctl.png ${prefix}/share/applications/qjackctl.desktop ${prefix}/share/qjackctl/translations/qjackctl_*.qm ${prefix}/share/man/man1/qjackctl.1 Just launch ${prefix}/bin/qjackctl and you're off (hopefully). If you're checking out from Git, you'll have to prepare the configure script just before you proceed with the above instructions: ./autogen.sh Configuration ------------- QjackCtl holds its settings and configuration state per user, in a file located as $HOME/.config/rncbc.org/QjackCtl.conf . Normally, there's no need to edit this file, as it is recreated and rewritten everytime qjackctl is run. Bugs ---- Probably plenty still, QjackCtl maybe considered on beta stage already. It has been locally tested since JACK release 0.98.0, with custom 2.4 kernels with low-latency, preemptible and capabilities enabling patches. As for 2.6 kernels, the emergence of Ingo Molnar's Realtime Preemption kernel patch it's being now recommended for your taking benefit of the realtime and low-latency audio pleasure JACK can give. Support ------- QjackCtl is open source free software. For bug reports, feature requests, discussion forums, mailling lists, or any other matter related to the development of this piece of software, please use the Sourceforge project page (http://sourceforge.net/projects/qjackctl). You can also find timely and closer contact information on my personal web site (http://www.rncbc.org). Acknowledgments --------------- QjackCtl's user interface layout (and the whole idea for that matter) was partially borrowed from origoinal Lawrie Abbott's jacko project, which was taken from wxWindow/Python into the Qt/C++ arena. Since 2003-08-06, qjackctl has been included in the awesome Planet CCRMA (http://ccrma-www.stanford.edu/planetccrma/software/) software collection. Thanks a lot Fernando! Here are some people who helped this project in one way or another, and in fair and strict alphabetic order: Alexandre Prokoudine Kasper Souren Andreas Persson Kjetil Matheussen Arnout Engelen Ken Ellinwood Austin Acton Lawrie Abbott Ben Powers Lee Revell Chris Cannam Lucas Brasilino Dan Nigrin Marc-Olivier Barre Dave Moore Mark Knecht Dave Phillips Matthias Nagorni Dirk Jagdmann Melanie Dominic Sacre Nedko Arnaudov Fernando Pablo Lopez-Lezcano Orm Finnendahl Filipe Tomas Paul Davis Florian Schmidt Robert Jonsson Fons Adriaensen Robin Gareus Geoff Beasley Roland Mas Jack O'Quin Sampo Savolainen Jacob Meuser Stephane Letz Jesse Chappell Steve Harris Joachim Deguara Taybin Rutkin John Schneiderman Wilfried Huss Jussi Laako Wolfgang Woehl Karsten Wiese A special mention should go to the translators of QjackCtl (see TRANSLATORS). Thanks to you all. -- rncbc aka Rui Nuno Capela rncbc@rncbc.org qjackctl-0.5.0/PaxHeaders.4714/src0000644000000000000000000000013213215206045013474 xustar0030 mtime=1513425957.219767252 30 atime=1513425937.522766939 30 ctime=1513425957.219767252 qjackctl-0.5.0/src/0000755000175000001440000000000013215206045014403 5ustar00rncbcusers00000000000000qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnectAlias.cpp0000644000000000000000000000012713215206021020333 xustar0029 mtime=1513425937.53176694 29 atime=1513425937.53176694 29 ctime=1513425937.53176694 qjackctl-0.5.0/src/qjackctlConnectAlias.cpp0000644000175000001440000001565413215206021021174 0ustar00rncbcusers00000000000000// qjackctlConnectAlias.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlConnectAlias.h" #include //---------------------------------------------------------------------- // class qjackctlClientAlias -- Client item alias map. // Constructor. qjackctlClientAlias::qjackctlClientAlias ( const QString& sClientName, const QString& sClientAlias ) { if (sClientAlias.isEmpty()) { m_rxClientName.setPattern(escapeRegExpDigits(sClientName)); m_sClientAlias = sClientName; } else { m_rxClientName.setPattern(sClientName); m_sClientAlias = sClientAlias; } } // Default destructor. qjackctlClientAlias::~qjackctlClientAlias (void) { m_ports.clear(); } // Client name method. QString qjackctlClientAlias::clientName (void) const { return m_rxClientName.pattern(); } // Client name matcher. bool qjackctlClientAlias::matchClientName ( const QString& sClientName ) const { return m_rxClientName.exactMatch(sClientName); } // Client aliasing methods. const QString& qjackctlClientAlias::clientAlias (void) const { return m_sClientAlias; } void qjackctlClientAlias::setClientAlias ( const QString& sClientAlias ) { m_sClientAlias = sClientAlias; } // Port aliasing methods. QString qjackctlClientAlias::portAlias ( const QString& sPortName ) const { QString sPortAlias = m_ports[sPortName]; if (sPortAlias.isEmpty()) sPortAlias = sPortName; return sPortAlias; } void qjackctlClientAlias::setPortAlias ( const QString& sPortName, const QString& sPortAlias ) { m_ports[sPortName] = sPortAlias; } // Save client/port aliases definitions. void qjackctlClientAlias::saveSettings ( QSettings& settings, const QString& sClientKey ) { settings.beginGroup(sClientKey); settings.setValue("/Name", m_rxClientName.pattern()); settings.setValue("/Alias", m_sClientAlias); int iPort = 0; QMap::ConstIterator iter = m_ports.begin(); while (iter != m_ports.end()) { settings.beginGroup("/Port" + QString::number(++iPort)); settings.setValue("/Name", iter.key()); settings.setValue("/Alias", iter.value()); settings.endGroup(); ++iter; } settings.endGroup(); } // Escape and format a string as a regular expresion. QString qjackctlClientAlias::escapeRegExpDigits ( const QString& s, int iThreshold ) { QString sDigits; QString sResult; QString sEscape = QRegExp::escape(s); int iDigits = 0; for (int i = 0; i < sEscape.length(); i++) { const QChar& ch = sEscape.at(i); if (ch.isDigit()) { if (iDigits < iThreshold) sDigits += ch; else sDigits = "[0-9]+"; iDigits++; } else { if (iDigits > 0) { sResult += sDigits; sDigits = QString::null; iDigits = 0; } sResult += ch; } } if (iDigits > 0) sResult += sDigits; return sResult; } // Need for generic sort. bool qjackctlClientAlias::operator< ( const qjackctlClientAlias& other ) { return (m_sClientAlias < other.clientAlias()); } //---------------------------------------------------------------------- // class qjackctlConnectAlias -- Client list alias map. // Constructor. qjackctlConnectAlias::qjackctlConnectAlias (void) { } // Default destructor. qjackctlConnectAlias::~qjackctlConnectAlias (void) { qDeleteAll(*this); clear(); } // Client finders. qjackctlClientAlias *qjackctlConnectAlias::findClientName ( const QString& sClientName ) { QListIterator iter(*this); while (iter.hasNext()) { qjackctlClientAlias *pClient = iter.next(); if (pClient->matchClientName(sClientName)) return pClient; } return NULL; } // Client aliasing methods. void qjackctlConnectAlias::setClientAlias ( const QString& sClientName, const QString& sClientAlias ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) { pClient = new qjackctlClientAlias(sClientName); append(pClient); } pClient->setClientAlias(sClientAlias); } QString qjackctlConnectAlias::clientAlias ( const QString& sClientName ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) return sClientName; return pClient->clientAlias(); } // Client/port aliasing methods. void qjackctlConnectAlias::setPortAlias ( const QString& sClientName, const QString& sPortName, const QString& sPortAlias ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) { pClient = new qjackctlClientAlias(sClientName); append(pClient); } pClient->setPortAlias(sPortName, sPortAlias); } QString qjackctlConnectAlias::portAlias ( const QString& sClientName, const QString& sPortName ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) return sPortName; return pClient->portAlias(sPortName); } // Load/save aliases definitions. void qjackctlConnectAlias::loadSettings ( QSettings& settings, const QString& sAliasesKey ) { clear(); settings.beginGroup(sAliasesKey); QStringListIterator iter(settings.childGroups()); while (iter.hasNext()) { QString sClientKey = iter.next(); QString sClientName = settings.value(sClientKey + "/Name").toString(); QString sClientAlias = settings.value(sClientKey + "/Alias").toString(); if (!sClientName.isEmpty() && !sClientAlias.isEmpty()) { qjackctlClientAlias *pClient = new qjackctlClientAlias(sClientName, sClientAlias); append(pClient); settings.beginGroup(sClientKey); QStringListIterator it(settings.childGroups()); while (it.hasNext()) { QString sPortKey = it.next(); QString sPortName = settings.value(sPortKey + "/Name").toString(); QString sPortAlias = settings.value(sPortKey + "/Alias").toString(); if (!sPortName.isEmpty() && !sPortAlias.isEmpty()) pClient->setPortAlias(sPortName, sPortAlias); } settings.endGroup(); } } settings.endGroup(); } void qjackctlConnectAlias::saveSettings ( QSettings& settings, const QString& sAliasesKey ) { qSort(*this); settings.beginGroup(sAliasesKey); int iClient = 0; QListIterator iter(*this); while (iter.hasNext()) { (iter.next())->saveSettings(settings, "Client" + QString::number(++iClient)); } settings.endGroup(); } // end of qjackctlConnectAlias.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnectionsForm.ui0000644000000000000000000000012713215206021020731 xustar0029 mtime=1513425937.53276694 29 atime=1513425937.53276694 29 ctime=1513425937.53276694 qjackctl-0.5.0/src/qjackctlConnectionsForm.ui0000644000175000001440000004036113215206021021563 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlConnectionsForm 0 0 480 320 1 1 0 0 Connections - JACK Audio Connection Kit :/images/connections1.png 4 4 0 Audio 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png MIDI 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png ALSA 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png qjackctlConnectView QWidget
qjackctlConnect.h
ConnectionsTabWidget AudioConnectView AudioConnectPushButton AudioDisconnectPushButton AudioDisconnectAllPushButton AudioExpandAllPushButton AudioRefreshPushButton MidiConnectView MidiConnectPushButton MidiDisconnectPushButton MidiDisconnectAllPushButton MidiExpandAllPushButton MidiRefreshPushButton AlsaConnectView AlsaConnectPushButton AlsaDisconnectPushButton AlsaDisconnectAllPushButton AlsaExpandAllPushButton AlsaRefreshPushButton
qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSessionForm.ui0000644000000000000000000000012713215206021020072 xustar0029 mtime=1513425937.53976694 29 atime=1513425937.53876694 29 ctime=1513425937.53976694 qjackctl-0.5.0/src/qjackctlSessionForm.ui0000644000175000001440000002016313215206021020722 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSessionForm 0 0 480 320 Session - JACK Audio Connection Kit :/images/session1.png Load session &Load... :/images/open1.png Recent session &Recent Qt::Horizontal 20 20 Save session &Save :/images/save1.png Save session versioning &Versioning Qt::Horizontal 20 20 Update session Re&fresh :/images/refresh1.png Qt::Vertical Session clients / connections false true false true Client / Ports UUID Command Infra-clients / commands false true false true Infra-client Infra-command Add infra-client &Add :/images/add1.png Edit infra-client &Edit :/images/edit1.png Remove infra-client Re&move :/images/remove1.png Qt::Vertical 20 8 LoadSessionPushButton RecentSessionPushButton SaveSessionPushButton SaveSessionVersionCheckBox UpdateSessionPushButton SessionTreeView InfraClientListView AddInfraClientPushButton EditInfraClientPushButton RemoveInfraClientPushButton qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMessagesStatusForm.ui0000644000000000000000000000012713215206021021422 xustar0029 mtime=1513425937.53576694 29 atime=1513425937.53576694 29 ctime=1513425937.53576694 qjackctl-0.5.0/src/qjackctlMessagesStatusForm.ui0000644000175000001440000001444113215206021022254 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMessagesStatusForm 0 0 480 320 0 0 Messages / Status - JACK Audio Connection Kit :/images/messagesstatus1.png 0 :/images/messages1.png &Messages Messages log 320 80 Messages output log false QTextEdit::NoWrap true :/images/status1.png &Status Status information 0 0 240 0 Statistics since last server startup true QAbstractItemView::NoSelection true true false true Description Value Reset XRUN statistic values Re&set :/images/reset1.png Qt::Horizontal QSizePolicy::Expanding 313 16 Refresh XRUN statistic values &Refresh :/images/refresh1.png MessagesTextView StatsListView ResetPushButton RefreshPushButton qjackctl-0.5.0/src/PaxHeaders.4714/images0000644000000000000000000000013013215206021014731 xustar0029 mtime=1513425937.53076694 30 atime=1513425937.522766939 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/images/0000755000175000001440000000000013215206021015642 5ustar00rncbcusers00000000000000qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpni.png0000644000000000000000000000013213215206021017352 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpni.png0000644000175000001440000000025513215206021020206 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH@fvtRNS@fFIDATxcHbe()) T&:AEBjj!ĀdjaP3R`b0{B0G09I o09IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/remove1.png0000644000000000000000000000013213215206021017074 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/remove1.png0000644000175000001440000000030513215206021017724 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8˵S \jhA,`$P! B-LH0azOLD 9\JVx] N ,@dS8]x ijػ[i xY>Rh #IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mcliento_64x64.png0000644000000000000000000000013213215206021020203 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mcliento_64x64.png0000644000175000001440000000632513215206021021043 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE   #  *.2#6- ;@.6H($-"MR-+0+&X6*%S ]b!T&71,h Z& >1,76*l$T.q'x'N9+[5 @>=~,@B5E?9+K>:z/ .EF4PA3-p9JG;1b>+LFB~8044cF8TMGSPNTRESTA\RB@iODWVT`SO]VP@lUI^_Kb\Ua]\i[VoZRT;ebULO+deOgf^efdqb\jedmf`V+okjooXroPrlexjf[5useb>`7hRxsqww`qlztmpb|zlhC~bzt{yubpSoNo{iw|z^zVxumofyǍq|ɕ|ŞΞХʭ֯زú“лǿܸŭɦʠܾȦĽ̜øôͼРѨӯɺիԸԲ٩ڶܲڸۿ߽ @LtRNS@f IDATxWkTSWVDEE@@D^*TZRZ54⠠($4 hBӀLAGP1Қfs֬ͽY+k>瞝iW`폱 y9tizJ 0$u4 *EGSSϥj#E"cl&d\(3T2t;" pj:hǎ;tRJ$ TJ"9*5 ןYX5@9]¾C"2Qa1YPAj||llIO0НQ(xާt-bH i@HoU] xdcy9 I820Gfh6 nkL=B7gG33V`O&zʝB0SIsx0V5ΰ Vua!}d5nO@V`gp^fzT*0U'T4 I*5ý K" //P9L;==}b;74jjjQ0|ni UC.. bPl]\P.~`JHBH@TH4n01{l@Xዥx;@)e^JONܺy+?[t,ǵ;׮e=lX(Σ L*ii쌳|i=B E Ξ 8 ܵk3`77=ܿ_; <+/}?@x zݾqwO,j$nQ:TUW~5HbO,z5;++լ/dpɸ8(暅 >?A[{ta߆sGEIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlto_32x32.png0000644000000000000000000000013213215206021020223 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlto_32x32.png0000644000175000001440000000206713215206021021062 0ustar00rncbcusers00000000000000PNG  IHDR DmPLTE   ## !!!&&"""(('' ((%%%)) (*&))$,,//***!..00%33000'5511188666,;;777??==@@0BB===??3>>>3EE@@@>AAAAABBBGGGHHHQQSSzr@csv6txB;DSzOZKEG~JE\aÿY_ķsf|ureljppr݃߈jtRNS@fxIDATxc` ت7k_ll 5+.[5Wu+V-ۥ:kV./SƮ@nZͩ\2$VS-3Nt͢NOh(&2kc셱Nw̄/knv,93FG u-"CqCs8jwϞ=]^xo^y'oǪB?j>)ޓgA-:0YZ3AdYu3>5Y̚al*/D$+akhG.[8O,E^#?iN2_t5 As:cv(YX!" ӪG2 ]AP( !Yo=IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpti_32x32.png0000644000000000000000000000013213215206021020221 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.523766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/aportpti_32x32.png0000644000175000001440000000257713215206021021066 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE02/ %((' &('(&,-..*.!.-&-.,0013  5267 575524187463=<:7,685<=<<%9;8>=!DB>>'BA AA>@=FFCF#ACAJLGH IG+JJIH1IK(FJѺ\HY'۳O*2?޻v_ןW <-;E_9Iݻ-6?w~o.+`NIq/**rx{A`it \zBrdJ^.|ۯCsn8ynwHdd^g^xO#{K/$pu˗_ЫH9I;a.Л@%A) E]VoisL]2U-Flqضmx%=*??v8ftJ?<"'`>Z8waFRe_cl2ű)`˞0I`nЅe\'k¹-Jbո<>^>\Yzu|Qcx7?(B,IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/displaybg1.png0000644000000000000000000000013213215206021017555 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/displaybg1.png0000644000175000001440000002022413215206021020407 0ustar00rncbcusers00000000000000PNG  IHDRP` _ IDATx]M$Q|gw̐8p9 20!c539TuUfdDdduj$u_UW$RN75 XG ֣\4qs/~gow_%oOp2z/?#&>>|?"=`z~2O@, 9 @Sگ%,dz s4΀=§oQ^ADLR{3[*q݀u[=߸ J:pϾ o~O );;pቜ" :Ǯ_ILSƲpO#y+Ѹ#SH!S2Tp( J5 A"}HcI H*h. Rl[u[d7n=#`zشs;{$tku46r }qwF6=S(\MDhY/uS'o|fzv b+RS-b0Dg<~WoDRAPa%)@5H2+tC*f=N>K!Cd-|)X͛]ISKq'5Ve&(ƕh%/K*>>dd`L5PV- G!V@ I=QȐ3 4Qԡ^%1-mB%"ٺ8He39QSF A?'/T9DQc.$qy u<i^bH=ZРP"jΠ-qA+Cnj{0 z F4ӳ{fCҝr=L`Pa\W ~v'dJ cg)b6c--2Q2ȌY!HtY[g ,@qtus/OQ+"&9g7GE"H&J hO[/t"PBp䅘 :#TrVPj"]82 zF@ߡSV@jcplP S519Nv0sB2f-tX<H%AJqETAU MBk 3DFv *gW Ʃ" @1ϯ|6g'\O3-nI/cNN1"B"r].̸r׬Aayb(S>v\:&%B= <^r `&lH: #KD׻bدwZ*<䉈C9c`wH5ʣD^4CIcB<_>0OlmR(3 d;&b43,bjFQT(PYB @C ioc]a4!9r$^9zB[x}2-x{Z0O |z!\[YuiFvTDТZg ۋlAi"MwPOҁx [m ʩ]:՞#Gc3a~/C >~ooxy]3 Ӝ}9BYr YiH*h(9mڤY)(],AK,ʝ ,@/i*҃:o 5cmceD86xpB9@Jjc5DyC ^^6up˚1XӎTKeSH* jF5IB1 @HU'7 {aADvc,B 2`L!28]*7(xG1L^S+0+f|~r4ӗdfU% ]E%iU Vp JڒZEjPj/X׋*0 st;c ¯=3V\)󄷷7NXwe:ePacސz$UnMIEmݾ&*fWUnwOzIʸх#/3yA1JI!κP2ZqVP6uZ2SgA=vv`~ @F xZoxmPӿ}2O eB;haת3C'TC.PZ?EР*o`;0>Lu^ljL!9 K<)N:,:v&&dH˲!CXSy)RݵN!iBcGw0W@dȬU)TL%gW@dC#:tr;L~&sH!%e¼!,`^J2,ęsnC*bNBquG`)5[q8m;!ÈC_p[Յ,VN KH9fPC-!8ʛ~sh7MyJ&Nӄ̘7ǐln'@37^:(r2` j G t$5 S-]\@j/q|.吣 x]O?lΔV_0M rA-HpuN,5 >f#DASTKo JA#"P {Vh˭15o( N+ ohoU{ӂy&2oL P+sMCSa_BWgr\Z -Tғi@#9oꢠ` Z3C1}*ʥo52i߼`d`5:d`ޤXOS < .PU'V,H'!"j'Woi!gXtf,z>˟N :D{R@8rD 䧺(Zl,kn%%(S"HdI0q b_u7O5!ߣ4L #cBay "2VjUBJIj6̺aepBW b`] yN Fv@ESFCm@}(\l[d$NFQĦY1ټ$RjA4f(Sݴ]&=UOxx;'{ :R;wR)!St6 z,T(s(.;|FTu mkq',3z^)\xW2@TIf%IvY(2\:*$Eԑ"iGf(o\T=qG=WH*Rx般.*XU hf<>2(PUD !0;< nE; u{ JÒ?Be P4W5 vJRgQq3Pc%oV+pTm tM3O2dhjTw=]IrKJʈZ2M4-YΠ:Zdv䐃l0}(Xq%8B2ǿ79SʘiZ,k(jNGPUIRT`Y ez~ <8!MERuٯЖ$לaCC./B,8]rP ձX{<2q<.SfTt J@D6>iM~V3$0f9h0p៚uMBUȃHېԹGbڳR4<K>)8Ke#j{vi=iU8~䐡$D4@jM8l9R2"$PD:4'NU#+dӼc^|8!ӆ MfQLl'8S(@ *lLu: atRzԚ>B#GQPv` C Gf|MC8v$@*JQOڊl{]$K9 n |Y[Zִ(L*F Xђ}B=ESLjbtRX$Rgðoq{rZD4(EVzbs/@mF!ڻP%2xx^;,h= 4R96mnSOIDAT"f 0A3J:IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aclienti_64x64.png0000644000000000000000000000013213215206021020161 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/images/aclienti_64x64.png0000644000175000001440000000605713215206021021023 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE # ) / 5:@DH10&MR Q J W[ X^c @B5h$AC>EF4j [52Q8o#JG;#dDWnt(z&3d%mCb QQD2b@+RUB{ )TVS!|/@hN +Bv^_LVbX -1B}4ebUcdPOnZfeL;?gf^efd /'^sf8EsrXqr^sqgkvkP`)/E,(}k3'N`lxAn}p9]Nez7H7Zo5xt CELm,BfxIV,Su~m Nu_9_Fd|j*.p6 |f}hÆ_HuYqr|Ẃ}˒AvѢқ=/ʪ#_³l>“(دMŭɦʡ\̝V\"޼hqBөǶ4Աsקڶ}پ3ݳ۸^upETkxas'+tRNS@fIDATxW{TDej! QJ Xr8֢ 27ňhV$VHa[1#r6 BL!x! _Hg;gg~s8>{1k ,\V^8B>7cD&u+}N7IZ(TjBN9645 j գ+Sj䝝m *4fkpx8`a4Bq$$RhJ`d۷Kfe=uk޽kX tx3'򛦇VX;H9+ݽŢ3Xt&C+| 1[?ϫWq b0YnSɎ66,>#ֲh|& P4kGP]0tYY~ 0O0T$ m堸~>mJm}oJe fR)I,9% @~s_4(,$$וޘ369?oN[ 5BV_pCYi7k@f_B!C`|Ʉ/f 05*~ֺʻ/k2NLڵK>GȀ%̄_Sk乚瑒eAQmu d&$sc~pZ\SR` yEy7l;vDG:B0h̯})^5TVWyyy9=ו=0>GGmڴΛG2#T(6 K,ll|TZ[[R{΍;=w]8t`ԗ7q矯[WB΁J-~^5A\{? D6۾q{榦FPp{/K~N7{G7lHD3SSf*! p9;//^gϦ7E`Br C*\.`!NvoU71ρȐ,!87S1xhL; l<p(L UzIR2-=#֮ޫ[^9AXOȥ]Q`&Ɔ|$R=eZY~}.0M'a ZZYBȀ@?B XkYk++ ,hɸ9>;'}L`ll4!L%Q0 RG@s2*Xr;aDА<с8fg` 1gg/~'ht 'KBf0o NA_8=h9̜H051 .O͂\tOn7kl)Bd=L@N`H;@7e7B4/:ŭa04>$q* $@G10ޫa|5}{{kk  &ey'Ss c4 QHg LLݭ? *74bA  -`b 0$qʁB!`1a4 ~5G0A7omeg6gGX?Lm@%s``H[ `߳g}SOT& śP uuËA J9($bX$UЄD "R fTHq|@ (29zŮWXllXPPPX@Pq۠!lȸHVj qTqP?66k XXX/<ᲑoJKO?|x[dd߇XzgD% _"9,;@ q_q[Vbb"!+WXn.rcSC8v3gRisSsFXxLN_02A=x a'4C<~9A9:??@ABvJtRNS@fIDATxc`NVf&Fzj`@_y}"KprZ^FdX:<4ISQP3G,`ɤ)ɬ) 0,iI@P=Ϙ' 0H$[ ,땠)đ` w8-)vB`U <;OO. X@T]_SSK, '#%!&**`G d%TYťIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/render.sh0000644000000000000000000000013213215206021016623 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/render.sh0000755000175000001440000000073013215206021017460 0ustar00rncbcusers00000000000000#!/bin/bash # This script is supposed to generate icons from blender files. At the time # of writing blender does not have command line parameters to control size of # the output and limited possibilities setting an output file name. To render # in different resolutions a python script might be an option or file output # nodes in the compositor blender --background qjackctl.blend --render-output //####_qjackctl.png --render-frame 1 mv 0001_qjackctl.png qjackctl.png qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlni_32x32.png0000644000000000000000000000013213215206021020207 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlni_32x32.png0000644000175000001440000000151513215206021021043 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE     "'.&!!!!"""'"###-$ $$$,% .& &&&((()))*****+,,,2, ---9-...///00(000111:8333444666:63999;;;==5BBBDDDFFFIIILLLULsc7UC`DdJ)f#u[? @* +JD4lcgk1`q4 ܱF\9F\&UskhB:nY\!""R.o__:zX UE ޼IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpto_32x32.png0000644000000000000000000000013213215206021020227 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/aportpto_32x32.png0000644000175000001440000000206213215206021021061 0ustar00rncbcusers00000000000000PNG  IHDR DjPLTE\X   && ##(( '' ))//!!!"""*(%%%00(())&***,,$88..!??@@000==11133%55'666777QQ;;,SS3??===>>>@@@BB0AA>AAABBBEE3 ]]ddGGGHHHhh ff*YYiiQQ<%bbPPPkkSSSWW@P__V^^\\\]]\Tbb^^^aaG}}3qq___~~```bbbddVTiiffN6zzakkhhhVsslll9nqT)=7qqqvvWzzz{{{~~l6@_`dB;cbDegEOGSiKkEJyZzz\rsvxtaYz_~gíse˳ru|ljαpԼpշrغÐđˆ߃:|tRNS@fvIDATxc` k97k۞8jwٶk>.KصmQ[7mR۽sf d\6HGy{vLɯK._޺%iaXݠrlr+ O&/QX`;V=, 0D|e3Gg+='y֜U@3g`WK]W>nKV>zgD>?{u2Rt%ß2C@YăG2˷~xɛ/000%juͭl<`AMĸON{]&?Di, X`/,d??;/?rgs@ $T@*d``ULJS  ?^h`MwIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/qjackctl_512x512.png0000644000000000000000000000013213215206021020321 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.527766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/qjackctl_512x512.png0000644000175000001440000043677613215206021021202 0ustar00rncbcusers00000000000000PNG  IHDRx pHYs  ?tEXtFile/home/max/tmp/u-urenzel-qjackctl/src/images/qjackctl.blendǸ`:tEXtDate2015/08/26 01:09:35+tEXtTime00:00:00:01& tEXtFrame001Q" tEXtCameraCamerah tEXtSceneScene!]tEXtRenderTime00:11.38e IDATxw]wu2wn[Ad6Ŕ0^7$$!b;\qdKE55Ѩf4~vc4 E ?3{yw +uVc $hiiQL??яe``+ siض}Bŧ|\.B5N|D$+NߐL&obmۦn޼Y_3x<q]<ϵ,ײ/{afeȿȓuttpW3+W:uhllP(P(EqOi[ /B/۶u];x| 6ܷq'? o6'Odppu}N>͑#G8y$d2a2]Eu0<#`iN&aƍ߹曣~.w&QUUڵkihhxqrk \u]<㴵q7"IT*SNYb|0$t:MXDulFEB,۶T*V"; eɤiE;I" PUUEoo/<;v`xxAؽ{wswطoH+od޽htww efff( Βd0M۶-4_L@@@@@@/",O.9IRl۶8Lgpi"_X~kk6_9}4$پ};W_}^Ƿ-^2̲-۶1 vR4<怀AP__Eq(.9q, YQA`Ϟ=|gppiNne뮻G4yӛįʯ\:orILDUU2\Y!2448gM;GSj|$I[뺕eY$I.b>D^ybY555$I Ü8qY`Y(bY `۶U.qmۏ?, 8GMMMjg4}S6qt]qbXePe0MH$m˔yٵk7pt:?yzzz^Zq~򓟐D"i&=/&n:5M0 bX\. ǹdsjkk?,eMHXu]$I4M"T}GuLDJj*Mss3wu=L&;_}QCXn.첟{sW]uȲL\)8C>'299i |qq,˟b`eUU=XW[|Ar|>,Dъ?'K,t@WWHA: رz{{%JQUUʕ+ysoرcܹ18iRL&LNNR*5ZŎ;;B>_@$zzzx;ۗfk8H$iԿB!AUn۶4OcCi~϶md24W6nN:Euu5xpcǎQ.IRheY8SY_.qKK]o{[yy(˴re߽{7/"SSSƍٰal*J닆e\]o$I("βuPSr@ DQ\N%ioke`pIn9B<'>,*o;?477_װm6zzz'> <l-[o"tG&^, X~=ͯ5\×eΞ=[RT IpX4ö폘,˚s]wO,b8,@kKs) ! mmm_~&fhmma۶m[P]]뺌""pxٖ(CdG*]W*A`nv^ ǥ -⥗^͛7 hnnbݺu8qSNDh-H$@P(i- iۋZ7e˳w8.$Sio.͛7_u]Gaxxcǎ҂a,,,*t2XQLK*iN S__E[P,;AeZZZ1 ~" Uib6ŒA4]>---8pd2IGG|Çջ+޲#Gعs'hX,FKK3==+8qbh4Z_-KUiMy|3K_}Ȫĩr2:f͚έ[?C gdxBDPkioo/g40O>$X b%!I-'I$)y&Y7hEQ~P(e.m=S]SH%hnnat,lN;<~2Xg۶mK%QUMXn-W_}5#g{p88lO#W >mc:,3_fqݵ^+r-ˮ\.o=} M[HR\橧b`(at]8}Yq\d2J%jjjF1bxQdYkGJR-.hX,F.W`tlf::x' ?F5M#J8H:tL__T;N>͛633;ɓ'IR477sՕW2v=$TbUUl*3YQ9qlpIdJ3:3b$I(k. |rw;3a:?7}) |F8~8XIPX, lذ27//s9{1or ǩ PPUP(8cEE;11eٖE4|N'ŊNOP(줩 t:MKK3<#uVODEqGuU?8.iJR\ 31Sp(]סYe!X̝>3i_᷎=*NNN.s_9sb|˴wR[[$I>e˖74ԩSxg{ Yb jklt:뺕΁4qIbE4ՎX:8 eh 33y,ۦ\p8L2Bs68΢8RxC?'??'O@/:6aQWWGSSx˲46mM72WU|/XQD":0$IF/J\.wi6 HT,J ]EQ5‘BPH4 hjc/P.ihhK.aaacQU:.t+gώ*N%MoW^ٻYd?D´bHR$Q||cEg}xeӿKuP<1ï@bA8$\.GOOgYn2#a,`;> ֎,+zj>R]]}A#p)権! =E!!˲P(TX0B(L=b oo7 [at̲0OuU1\u_ NS(,+hhA4\E$jkkٺuk];^ Yԩ!l&ϣi J4}b8t\˲d2ضMTT*R Bk mOK8 _JMӮs@6W )dsydK*8֭G|[rF=xL6G*-h+>u-pXmԧ\oY|1N9H;۲LE"Ss޸ϗnLRXU}+r/wGN:|D"Awwwe?NSWW{ {],cn\BtdYƲ,E^JJ%$I4M 0fRqyyey =8{7Xt4! ˲eܢ0P*xp8Lww/88B!6n@*`/ [/!/288H1?G`㸮Kuue- IDATh'cעhZ긅i(J͖Of}Ѩx<^TCL&'?Yǯ}/g1 \eȲLccc%ñanVxͫG^Er,beN@,2=~MiB!,ˢX,r!0,9@TUjuUnR|ߟ t@@@@UN>9diq\*FP¶mbssJ%ZZQ^|D>O㉿b. gɑݎ[bDs__~=sN#\.!K HQ,47n;|C?~{c~v033G"adY,ˢd2(-͛7s~Gy޲NRR@h}TQw/,퀀 ͎OLN !IB@8BE'$&&8s̢ܴ:~PgPb d39Xem\ze}rN,}'cDH$;蕈,7͖X,lY+N:RFHkk+^{-z׻^c3:~TEF H}}}3( Z .)B!JҲ@Q<[&%\,IfUUd2,3@?v@@@@@?7|MSinnf0HH$–͛Lc\Dm]=erlщijhnn/\*YB'szp8WT*_TUfle;/EѿF}|ϡJ 77Be|&ˆ $Ç`&Q__E٣{qr% $˚؎C[[;MMM4MHzYf3< 裏2;;{nnv.R,,R[liT[[{M.{T*_r2c$,bH<G%PUuG\>VF#!IUUUtuwĹd2`Y65UlܸƆ^z%Ξ"Pg #٬gumyo`ej6Ţ۲'‘b4r|<DzLVQEyJfB$ tX D"lܸ??yq[<gr. HSs3hP(D"hhh2'Nz{{):مY %$5eX%Pp8m/ cm/$t:B3]n@ pq/MɲL,4 \{U([B!X4Й!E ۲dbbj.x355UmR5 f Õ}mmmqS|O3'ȕ\b߇+zam7|A#ɷ^˙3g:i>QJ(KH炊8(  ,vNX8X먪mۈH,0/\.t q,4]3jkk۶:W0mǥ:ACcrJŗlejj3CCss5ulٲH4+{cvz Q``h|A$7iF4ɉ I%$)Bn5Md2Xj٫ &ƙ &jk<~]7PsW/o}[<.1,GDtvvH$HRr-\ve4W_h?\|> DۿvFrM$UU+BCpufb b9KoKVZ }5MucؗJҙ%;2TU,IRu]|GQIu\**M.A\JeFXd_:vC#!-J{G=+V099@?Qt'g?*6oٹ9C4VNilj=_K$5KD#(0Ç $JyGa~~'qlp0A) z% 3z 3~>CEQuqkE:NiqtwwSzyڵkI`Xʊa]F*J e {EQ|8e8k`74c8HM"A4G,gr8~(uRlٲx,ݻ(dƱgOѐjhimPA,}p8Iu2uTUr2lдv.jMXנ{259Rq۹_א33|{cJe=499\sȲ:R4Hk.Ȳi[Q\*<EI aROl "a5M 4n*`[y9beE! sɊnUUvBR*jks4ձ ׯg #LNMz,N%JIss+:'ƘZX(e DCUUDQ\| >[ _Se?LoK"ՉQ 2؎Guu5K*"JqwvgwC?`zz R뮻ΏD"-8nP(z@LLknŢKy{wkMQ;D&`R%#p~f  tJt3Mn 0M󨪪9 A<P(,QG"x$'NVD|'‘(36C2\.311Acc~a ꪓDcqU?㩞qӦMl۶>QJpcے0B+E$D Ip=uP3PJx<.(ryTiC@@@/y`Y7AxaoeRx&B#ֳ֖&t`||D"AmMhj.26lX3gl hvK}}=7n|Rn>vޖL&D޷D5"6#RW[EY7| =a薍@S]̹BEѝZo?'~Ľ4J_4M|&YbEv:::.&''ٱi:<>LMxiڮjxQ}좾۶Hӧ1 ˲*3m\9- U~4MCQ0ۋ ˲J no WӴt(Beǫ 'PEQho hnno~3ȫC`GeEZêUc$ӓ #_H&DM\v2ba"iJ&ضSq;EieltBiJMM o5pXةԩӔJet].Ύ 3>1IHpDM7!I"Yҩ8Le>H$dQikkY Id eݢ6B\&-s {$sYR_S'OϠ*KwqkΝ?> ,"b~OWWw2OA:]u!Oo>Cwtv^H$+W]u%]]׮]Hgg'K<̏w<ž{0L Y ] J/䒿Evڵ|SzC;NMMgx'9yd&]6,7nXvXOO;}e2'`~)}#J`T$5=mO{2e E]Z$ql)l&L |ߧ0,LIikkq]NHel%H 25Ea|$[p(>)z&.r9=ˁ_d~n.v ;Nss3+Wy{_v=,ch4ǎ P,GGG?b a֭岰~z֯_a7xGD"[C/b[d8T.#K>>(-p0sC֖JAx/A@@@@/kpkD6u۶ey󙜜`vvYE-Vfff)HrMiljH4m} $IӼo3#إ ,DL=J+o TبN(0> >-d昞De \ezjv3ִ-O-qM7R3<Fb__k'RE[[ۉO|o~sŊ׭_^Xf}CCC:t T*dcvvu,MPB2m8&>'0M|DAȲ,+_yHr9e 1UUXTEQa,.@dTULfR8fjLOOc.uu]۲9|0^|>Ϸﻏp8̺kX~=OC H'Xz3G!Ua;ee94& ef(fb#xQa,EQ~z`;P.e|FƳ\tE, LMN?@WWx;?߳o߾=~ڵkښh,a+Xz5׽]yJ? /N; Cc +1kjN>]Vp8,B!eṟ~4Bi謍y %u<| 83nx[$pgMXp8|+K9UU[Q]׭ mA=TUEUUj y`q]Sc===޽{p00zYQzVab|W_*pED5IPu݊ߒ88cQtC҈M˳AKM Xc_y'eL$ p|#O=aڸd<ܳ8<ق?{']{>}f쮶K+df˽cC18H%$99BH=$R:llܫ.uvg?3O?ff5~ޜ`Ng?3;<Ϭfu_7dխN|u;aa[&XZ%k!PIW  Jd<a "$@ =3O==_l\>mۋ{ ݻ}Ҏ;_r^#O8~s3<53Ο?%b^׶رM61:MF_4HA@mpAOlЊmLY(i(AKUR&2 e=RBϩMOOAM4Dm-NT)+$t'O2=5A[K mm%r1˳(FLOO#Ifxh2;qL'Hm>׾5"$ӃeU(u`~iD,*< "<YYYZ #W(~5$:;;y;߹v ~3;@jy!'Iݭ:i/wߘbffcǎŘn{vvv޲}Ƒ $]T뮇Jh !lztw8t,Dzt\BP<_k3kĜ h& yx7R*<4I&Z,4$2;;S H u9<?y]ٲec< C= 6e$IBurb%obȓO>֭[y䑇9̓:uIX(J_Ηir{wǏeW+|iWggN&''hmmcm{3^:-p 5%A@ukڂ\tػ<c}; 3=W _[*sE}sP/<_J3h&/wL|O0TJ`Z2ώO_:R|p(H{{;]] S(4"ǹUqsmEQO|br CsEҫevl"bXr29`0pLVKMHD4K 4ԧ%:O9͙3Hu]׵q/l۶M};'rN5\+`{5\s?~KkP :N0GC"]ecn_{7񥯟dl291SSECWo~TvKpŌHVG&hx]׽AӴ5/rL.\ y lǣh4ؙS.Kpn pQۋi9t0Ptv9zS'X~=]{-JÇ|v 6ݲ9VLmd]Wpl W̊{ʸp5Mʺ89N69{ܚh& l*OF"M0MRl _*j?Fu&& Le{={F>|Y!Dkk !Ÿ'w_;mmm}KڿR\(K\(~/HZn7^6PA1[\v{s?c/zO, |D~: Eoj%5&h8۶!ɓF p]YQdkJ:6+Z |\h4rjctt{1b1\M9vEΝ:L.oy>$_4}ϥ3Rt  E}GW\Z2.٢M$>ڱ]DΞyrSz94}}ul}o5W.h.꽆ݭw@:u@n:j0 )4Vr#h[ch2qN!2vEÇ]QC!$%IMyCEY?kHeDM4sX3me16vT#IyL&&hazzhvlvE~d'r@OF/|>Ogg'^{-##XZnN:E֦ !\XDcaeHN,ChtQ`Pup]㜟^vX\vrSpqVBv{v`0c oՆ_mihkY% j}Th˅΁z*T ({" Y|;H8_OГ ̋K*c9EnCxդE_WU~ٶU飶+.M4D?o4M{eY$+[E`U t%8Ñ#Gi:EwO%br| +⬮r qzzzؿo7ByYfQ*l4]w}e~Fw*[B]h]0 %"A۶iJ&KY±-CӪH@@?Ï]$<4]aq9[nkoF.lkŊp.¦F^1u}l_jk\, _ *|c [\q+&x͵|; T{C <_0T$sn*K0ZA  ˃+ޙ+%DM4?:;g&Jbd/*p<9B"`)B0jz2v, SDZA,ox@ $IA  RP']]a*2ƭ,Ke@ *FGq}qkTl'=O6<6^Ͱ8u\>o}-[n8vKKU/f j|Lݭp[eVC/ׂUۿF!`=0g~gܐ x |;|  ʑ/ S[Fϱss;bV\!u1ba_z`!m +kѻK&h+Y˲~Ӳ,G86 8i=BJš0i#03;YDb d]J&/< gM7}>q)> /a$IvȆa/Tv{^F6ղ tF8)E KXTv޸Tjg=B>'dhAwA0p%ڗn6|~z@o.tԃKTNqݏa/ȳvNgK7lLƛΣ /GLn'ϰ.d*ɎVP_B+{OصZ ~0أ4eM4QP y}rJeY%fض>cj` uSU"RUwXS'Or1@]瞯~?Dhkkn`CU)wa||UU/j!|e>U@V2pKdP%\,WT-t6g_Ĭ8lڸCgyyL2$l]H!S s]l^5PPZlDK  4u 9 g(o¶=uyE;s ^NdW/XLp\^w筯'giKUf 5Yb]2bWfeN@/ oG\M4D?G !ɲ,jgb'8sBH  S̤0 X,No_?Yĉ࣑d4X,ƍ(W,|h(_@Vuz1~===oqmLw;ˇ?!/*_ׅY.ӝlŪTiLA' y6l3U UNy'p|ӧO8¿Zz;PxOR̀3py3U Ca=4OoWODBO4ž6En߹78s'FtZ5EHX#PU][YZ1rwXXor=㾤PEp8A1SBP$L' I2>!2'dCefsZY AP:\q1Œ؎G[HȲ |\CQE S{kP=$}}/r0"XBSetMa5[AWbm [609W5npuY;|qt0A:r`SoNL1268HO2LWGtog,MI,?m̧J(5I!IlQa;٢4 j&x9BD"s]r]ףr05)Kf٤=IWWu9q8H'fCuBJe\dGO F9xDQ9R,̑hyY]͠(ʅ*B֎u(2A]byE"Av,,"K#A!C/|ǐBXM,aɹNP5,U*!`%kU<.UEYX,e+V#:q}Z[ 6AC%`(drшκdcgVqpo7e˥n;bqaMe01Tde>uUʖV:Zhn‘8%[F50عs;wX,1vOr8+ *Lli@H! WpmpfZ@Rp\G J -pPXZ5҃2ʜʡ /XR3 16-]%ߊ `r&"R.ce*pr=[; 5V2;Øe IP,9$CټM4A85oG* o=Tya HMqվnJe2&#DK%T- º,"8|EMb˶&h?]YY~qg'1e<ŶlR|4M' ǓX\giyY1 ;wa0J!gMhmmB93eBs茪VnDBP,3Svd$! |]$z>  3 $42a(5; ˫ey YY,.lVLƧs9&f Un*ZH+( Ѹ@T ֪~fM9CNR,9lDJt *J6eT:wtܶbC@)\p)lmk]b; "ơWb]FC0tITPPfRQݗ% ].JߥeDM42 ,*:eKKK)\O昙an9G8v=ЭkͥDM42 9y?W*:]oy93/oGyE:#p|,Yv4*M0ԍm# u4=ӯ~}h (\$XΣڝu`+AW8u>5ױw[}pNzabUԵvIIVQڷT%уDM42 Z۲,4M\ץ5FH|rp]$2bD"H͏ e 6#>lfffR~E կ+wlقnfD1FFFTYB Ji~qb_P%xXA&똄 h,H,kY>BCɴ).jcgNOPPe?\3yFyV˴nHxgV*.7_Oa%Sf4Uɧhlm q(vغɫ ^ﯷ֭i8n6pa@:H5cek_;F,km4Uf?֑V̲Kk"@( $UEBx"I{G5pM43@8)!BD' $]Fmg.e(233EP E|SkmۦdB4]$BwW2@<\w5ܵEȦ瘜fgǯ0 #(J.peP0m1K>Z J(߽|Vru >16cq$9t4_;ɩsgٯg,*9s&,禸~q7<7=O:BAS(cY";\ ORo6|=ۇ zނXF ǫGuHDT׾i#tVuGf: ACad0Ȓ+h,!@Bp;{eDM42 l^}Ӷmm37H $K8lXK  L߇m[>Bjyb>Ï~#ZQ6n& J(Wii! Wy~7?D6elD&ö,d|ҩ̾I&UQ^}ᣪjd+BD#W#͢(RSQ۳?vuMA{x8D"q Y*FUQ("aW*Wzy!jeV`nDdcYŒC,ѓ sվnbWI4q IDATӿy9Z -qcӌƛQ(ټ!\": a |?\hS./J{rp(Xq*2 HtH% ʭdo{CS@~kAQ$oj&xrtRDX<SABj6@CW1A$PU7 DDXdX\ZR8o}ooogϞ=ضY]Mc>g?|zViI7v]ıMe+ccc?$&Q2/Uz(:N_DJA_pn='?In+_y3dX<^'v tw5M;rxT#PZսN_jP' (%HDWGC "7tIN>]m3sWɸ?36EQ>ʮ֋22ENjzHk`h EJWho g&,Vu#Ȳķ~|r=2M=M8qn0]!QѿrUmP궽ug? j|I_.Toӹ8+ kիBBv"*AG?ĮWi>beַajR<J|"Wlh&V*r]גeL&v-h("d $6VVҘ|4N8%Whi렵L&K:-,J`jj=w344HYxFK>z?  =Z!TEˮp\]Zֆ S%Ue#j>Xǝwn:ƭ^ϭZ#o?Uo{'߸GOw"Wm /X"r\Rm׫u6<ߘkzOC%*h7S8 ו<;7A{ v%33b\Bv|C$¯zW\ { = ԛh&^/8%,Çf@6uieT<< 0u]b w:۷m#1;;̥+=7SoSu;S,<  %& rwܶmDCO," 먪Lg[pmpM$(ᐊYeքի*bSj'\ |_`!e'ؿO} gyu\?8=;+g]Wl!xQo2WpE2,JK DH~u1rCP i^$иPZp*2(2^@p*7^K. Ewg 1ؾ  ÐQ R}_n9D&hgAR9#2KKK< y bǵK6籮h,AXbv<dy%S>~?y,aa~\6M6έf2( cXt݁Օ,--J-wm[ZZ|K_w ]0F82A4MAsdR%wENj~-lqg 6&.sGbP՝<{4'Yna|<v&9,hX#.4m{@Dix-uEfڳ_'KHT%j@]hxi`kv!B> dYfgZ)W*Q5 <| bBs,t%;I^]h:8i d[:::ա2'O\[~W򕯾Ҷ-]e&-QU4YMkY_S+ خX:d4Ub}''Ty?m{vqTO|YaFS<,SBٳh ^ E6 '9?G%lhavg``@AQ#CYkf^dJ#I`h.&hL !Z.ٶeUK۷o'ϑeGtwwo^UN?]k#"Z0 BA E e#Tmϯ>.HJPk$;އxYn:Ǿm<"VyÍC DO'-0c6:[A6%sY8 ][6(1g Z BQ:Ռ[@pA l FVF_>;֫JCи`pA?tJ3 $+- p2cYbXO:[!p=AZfz@&{`8U~+zvs7D BqOU*SBx`] ? v3`q_b׿:K ިo C]GՂ<ƖzDt#!+zI% !2?tuuKX`qi4ᮻ oxmmR6M&'DZN,MiMT ^.|$`ˆ~#~:bL 6S&p|l2/\F$,#+[ٶ]\~u?_>'`/o{NhIw[ݽ@ jd\'z `}_ckh]m zbc! -kiT *(yʹ b LB{|Ѧ- CW87;ޭ+. WeYxQ#jC4Dg۶} q^`ppxޛFI坿{߻YgVf^՛-n%s3c<კ1pnj1#A--Ejuuwu׾Ww{oߐ'#"c<ů䕳ǖ(L~Oǒ_v?k/zWnau|\N#3zгk1vy6Pݳ[;}5.Vr]oapZbޤ$B$ $C3C 1L6`(~4Mn-^0L(4 <ϣc!}7P(R*s뺴ZMdmmmz~n%j*[[,T*w0w8N % &Vyc#smV? @ChBa ̗r?჌8|gr5"E,t>7W;4Z>o'qJ_y[џO^>C&ղ7\ބvZBz'A]W?ZKo*ze}|MLώC:>OWɧxUU602]v1 ?(MPq4Jn8[fe+ je?xz?{/_ecw< I6@߃\X*?m(S-uRf?B?+cEf' rn?{ \ޢ0M[݀jɢbZ4ڪ:I+X&S]Uo<6%6yK#}GV.Q98;ܐ2̎G;F:1 Ё4@IYU@d]ӯ^v<d J< w>4Tڳ7=2G`gL MӸA0}ede Jr푒'V[[0 b! VKyOضai`}cفDG8m~RB&3ӌTxW{?̿YR C뉡%!xĶQ,ړV1[ >+=,SZ9XE4^9;OKXSg64^E1}7BPZ6`$0RqizLp͕}zaWn3E_.4sK k[=՛̡Q.>LK>+0U[SA@ ~䓺 p'1Pd#93]t>6K[?x}[K'MΜ;T= żUU!B'N T"I㳲űM,SR=݀sw!ԅG@4tCDZCE*}7S^43v%X瘞(Gy`|{qGBIϏl4g[YU4kw,|8P";:)09sI"rVB`t ǒ>ǃ)"Kms \/LzUTGbJ/iib!d?A@k׮Q(m`Y&־<=bZJJgy; IDATopu>ӌVԼ4 #Ф"摨JDZmrptѪVy^ftJe}7B/¶tt!JXF)wU 1=QTXŒz͡VS++e./N9:l̗rr>ϝZHBɍ6F:>T7%*Z gtҤ""},k}u@^=~o"(`͔/އ~C|ϛyzبZM Nz`i? 1ۆ(kZAJ)83a/PkqliD$HTajvA)%4>aƊ z~a_7>26O6mplLltU!p/7EvֺڎI2 {GOoܳ3LR@&H] uJ:{Sj1;UD\ΠR8^Cv%al$tI- H*-+R>w* OC 106NsҲ,t:Ν;GߧunzXa*sfvJ}BLX@A!#a؟>8~1 8XuP5f¦Qșihhx^DqsMK2=($gH`~edW=*`PF= %~HK50ޙ`7~p:E:7ܵ24]je\M09S?mׇ1 )#p2$wٯ\/% #(s`o@Jt}h$qp:BOл jS(A=t- ?pa6bamj~M}zr哒nG@{( t1dtbXnjli 02i^D 4)3?]"3y^= ;CKUַoiIş[HT$pHZBűIJgYʳ $~:IӜxyg8yzɳ|Dn|psMXYgo ؾwv5߁$3 i p3>v^I73_$e3 䲕MYv, yG;W&b,V- Zm!4r%c>5?94b!a|7dE/4_j6-tVKN!i~]|?X*TU ! "Y ~Fɮ},xʗhVMŋ %n[~q\Oqhf LVֺ$뇃`FC (ɱH1P=FQ?Ⱦ ?:̽G( {=df-3?28ׁY 6$`tz6+~hP Q- @Vοv@$–[Z_sWztw|ɻ:t?y 6';ZT7 Jt}S44>w)d!&F뺿vR)"2eYA^ (BC0@J(xkvU ӵBCh1cLA1ÍZ|u=uf{ƙ.qf[ <`'+FfE$I}VC 1Lu:B|qip]-lo` 8БAz= gZP*{)^"zLI5 0td"#E!/[mڝ`hMD(ptO_}qj\daLdղNӣu /?3pS)I%n#͝>~c:(M9l^ߤ 0 25_}!}u*E h"dFv?;aM I'T2C|An:8Eѯ> V_a}O |t:Mc#y 9d^=WVcb`#XJ>/v[7MоNN˧(Gpl%ʌTm\/ 3Ll N (Y D)JHt R;jbiŁx^?d||`ZWmA$yg7a'rw՜ҹ-T+ A;IO[Y` 4A/$"KH yPW:Psn&y^azc/f @8sH>3?i=<< 1RJ;aq/ !pߥlt3>I3ԧ7i]!,P@1حhؖPI ;) #5(+zj/kHf|:^sCח;;>c#9Pw4HǶ4\/B/!mGHEl@D3@n_Nhy9%Sc>ǏQN.ݎv7;8,m^V Z>T]nHyL"mNi՟v5t/3CO S`zN=GEKhއ^X=y.y %B5;e6̸;eH!g|KYe!&ߢ `#Or9# C\/lL>w{ ]} ".[9HHz潹:0$tɵ[AHF*6L$ ū 0Ziw|.Tiw "hwQp]-{u]@=N*Y-GBc~x=;aqarZ?8MxKej{P&Q@ =ۧIAd@en2݂4اkOvC M&Bݣ0!^\^@'rk?\J9`mO mH% !?L4ލﴢC 1LApYm~HG(aC<4en3>sQiߋB dw/n};FߍgLX0xI,L)-,S&[=q H sJP6u\?feGK-n?LSǶa?'`LCt!031Lw 4M#FS+_R?+ X"w!bXJ,SOv;@ڠ0 )q~w~rh"4C|Ax8J)qE¶mt]^G\b}lmmhY*Rc4M&]6o)9X20M>'^^0yC3ŒjɢX09&9Ǡˆ+7l7\f \rBF&ӛaD(D0Q^߶􁛝cjH!cЅ`$~( -Vcmx=ϓߢ5? *6'Oop5 U&9POߠ^s&U+y  "Tz +?HoOiu] ̪ܾ`ܑީD* /d8TJ>Q3Ru8X=<ǟ ;}& 3 m1XwipRova'`!&d\ ih c&ǎ%WY(M1F0qmDhcNfb11/Y]0MS;lؖ2QjϏql'Og.5(,榊?8J rLdhR@5bqG|Π΁*~ޙ2l7] Gp(3E榊;0=QぷdmcJEpT09e&J8@CԮ~Z}erO,0t nvAt ҄1TƅJNK&c:=W{~e d(Ԛ؉וN25P㋒r,%)hQBSps˫)M6w\o"3̄ϛ\JjfsUrbKh6C*il:PoPh%ʃ[}tAS $`ZNл%#T3MnѶhJ" #t |?l0CA;M>B)8WƶTa}EݐW*6}5%XJ ]ܐnOT/t%B#lrDMm+;:[;.żenAc t{3eGؿ7Yl1` Z sڇ`3|]U >7tL2Ƀ?-%ƙ.6%EDv\~$K\?9m rx|Wl"HD0xE> >|m?7< 17RBE,kZAq a29 ~a:aH]8 GV}7wWI7N*H*>rB'b0rc9UT3[mE3ef& Grԫ6Bבf6lZgDj?mT (FɑN%-KylRQU{8 $ChqrK5^oO:ooSr%?-8-K5;P(S~Lv!؝\t<ӎA6i(&\(c>#E L|73λ:9ɑ#F (8f@cE`LWJN<< 17 붋Ov:'r0 00,'_Z /'D@*%sFm5.21G5Ů1ϋB# ߏ0vET^Chb[OyUZ>żVc9P7T*: F )0]{o!bGP-kFk٣#U13QTq#Jz݄~DQ0 2-v,k?[^pp>j$HQ䂨1K5܁+c7L渱ԙMԐICqGHsEp`a(xq[P:x!B]}cE;MӜ T?{j-keI;\K,wR*N1A8z~ IDATm b)UHv9P-beޣR\F6qkL,P)Z8`seuƋ7(M7Nh"je)p( g}mAFH€MRrV54C )88a]-]1 R.6%a]l0.},(Lqj W[hh =PB/50 cjҋ C 8f}#H䕒;0B)hw}e]x GsL剢FmrP[&cP Va**! P^D1N[m y0?]mo9v`l3e(Q cw *UGYej};sv50q5lpgkb( I CyBʶ7BóWa\\u4McuGh&bOaL&A"Xc5;C 1LIRBC4LdSX cJc"%$0Rr/bmmP?Z;,{/S<;MJB5la:Un_m$._RK=ٕT3Lbo-Aˎ]!h=z3%Kbbj_JN;HmrW-Q()0 - 1t-Ԟ7byb0M ͏ "chݐ0Nl3'Oا\v9yzK5MsS%/T3#3hNfa$q}P Er;L C'v8NtUg-;]h?V8Ĥ.s -G\nskm.A1EĥS,UJp]asoJ$-޳}F%:E&îaPH vuBRB#oR b X-w%%,rhV D!mM&65w+P:x!&CAqh4{խI-a:Pw>g&!U0Q3;Q0ԪFX,]ųԕO(C?cXDY-!  ؂(iuV7aLh1Ncn@<*GpJ 3Cc9t]g"%D&#504j"YwC^D&a3's/qp>s&OY)-MӖ0`JblJWk7\$o`j@IH)z)A%%b<&U4U ƻ3xRxߍ(:Ih1^S)o)M^9ŭ.T4Y+S,0}? L׋ރ 6^,Jd`I"1;Y7_B2x?8x|ۃX=Lxhw.@q<l>8cɁϲ^:괴Ns;G2Y)!M(B(=*9켶ʙ;u8d-Ő+\؁Kpk+P"$=ɨfM48V-/4:Ѱ0C ojp ,UIUZ`It 7w0;:F!!YZ2R%;I+]0' d:2VN7D7gi {[;}/c-U7_Z%l7=PYK,-οxOqP+^efѥ"݁R!(^ =H?.2Ƀ$ BE4VFx;Ps.h Dxqza UHn@! 3ipPƒՒxىC 1L8. COm[G+6N "(F40m (Ly`c*ȤRZB d ئN [9]h;B@ŊKI`we`v'+Ls<2c5'I^ԼRdEQ8YyT4!qͤsj3V[}-"]!"Δy*ZkQz݀} K5w-0]sS(웦6a3j (7A (?۵Sol72S_z2 =QHR!ݑBFjpt٣.>wƏԧΑ f,484=\?WGQOyRn*_6C!;\<#Vl[;M_Տ g=,;yO9d` 2 TM%KjWZ\[[ZodILE`09ǛI=v-.}vy?(@OBUeOB7 A<]]vRtU˰ p ]%WxضZ.Y\&}'Ѳ%q$_ ȁ`E!f+h 0( 6RKG0 Rf7N0Ra'FWbsAOWja}VZwN/soH ipݟCФrn>لK`pw5z{1_dm6w}~wnݨD\7Q->@M_NJhٟ%Ro:!"JjF;{CvG*[}{ͭؗ:/[T[,>вvxKH6ߧt:[?%-UȦ|xaCԛNJ@$B]AUDlǣRYX{GS|crBrj O/m2xvLO"r`Oޮ( q}DF@p"8/ zӑ;lcؤPjQ\Jye ?~Uև868v Jj\qdiSz+K&PdƮ}d9 ok@iʍa^A$@&2I@N 2,z'|xo|v8Dxe$$ʿ>%0(ʳ#}͝NuS-J>XDbQsQ4Tڦ/NX߬{}SЄtTAQe"k_d;ч&$!Na: ҅`hމz>~4(MU% @P5EoYS|.MT1T98%ո:]$72]dyJ,$2^!zE҆Ha(AQРP$o6dS&oS(596/L1Xfd >:88 Gc+ę`"lTxD6^ Bw2nrJv8 *hIЮ}~?ƥU=֮S(썱R|O/mQ'zlMQ3~q1,q\uS EUk@j&eI{jc*oRkYSy>d)}vq}@Eɓ](N/S`z>qKr &EպM_ Iu\'0KJWfܛVw3; d& 5BȟU!Hk-ԓkBu*47]bNB( }1.Omst296 ~}ڟc?c=9Ş(C#-p,( HE@IS0;};xrOH -C񇰾ˍyauw 9皴j Ј- ryNfHS7Z:sc]*-Êx:`w} GULRЩNu꿢glf6 vj9"2WD[FƈF6S"^&躞LU>ͦvF(Ubp]Im.&d\:Bwj-׹x}2͑}Yn9&LHQr9!8^}|~d! .Z=(ɘ`*ɄAEKkU ]0\M|:49~UX楧rWfqj@"߂ReWcw؜C~7߅ n9n ގ4pP"%&r`Cf4X+h/ =9ͽxkU^d7Cdt0HZ&L* 1K;gz>hF(ڭHq\4R֩Nu꿴DƵҌ*GRII }oEe!Dhp|L@N`;^ 0Jy]JdfPo(4.]Z8fI't՚ٟͥ+,!Xq`ؤt0t5@$NrUÐHmǣh4KMLCt2];Jp6s5_<ƜFh تa*jVZ&ݐܻ4֮ӸήƭBn`8  >(qbp>]㮜DxQ}s9{y{NϯR.7F<ΚdM{;rnk"ݓӁ:թNgY~^.zHSzQZ-*s% mpm_ӾiXHQ;Aڞ 4M#`4U5UO S 2եՠ(I$3fP 7(hR(2E=hfkF%D|˰<&i,S#4`z661]Q֯m1z8XQجbSwVzj0b<o`Xw ^lTh:#1S*;8>Ͼwfcp *MRLk_C%#=pg"2AQ\6^]SDT}T:C@:թS#}XY)ۅ1KGQm/aq|npʗ2`W&ph:D Sit]E ~jPe*04)\l05_trɘPD@RW$M>`ZM1eiʔ0=PSP$4:t ޟwQ=1.M|aCIzqϬr?]ݏWi",O$am6ʐfp o+iH`xk@8&5,8B!"M4t28DrL:WbsǙkDb1&2Tp> M?=f }]Q㤓&=(&nHnPm]p53tS @xJJՉS&]1*K Kt,)'XGo١KBA΍Fu:!P y[D*5"ش]Q%E˖2?ZAJ3x=ҷ?jiTk&hnJ 10B_ltMYHu.^ۢ;HW[F?}ǎtbM= f"ob|C] 'K3{xEr24ʹwB[[!\_qPFQrͳ;/oT:Gj]Ӕ/k2u -ۧ\msDľpW!{~U:XD_m="*k`; \5mCAR#P(O i 4P1Klz(\n=EWb/x4.&X\qe@Ҙ[в=t]`?G(44y_]&шF"nH4AWQ5t,roemKos}|2]}~%o>_; І7 MrպM2nPmb&(s95yT:Ux~#½VD\lGvg#14]JG&, ۖRJh}Mcj_'lPąiD- ÐmR92uГb8{Sd&2Xf~LޙUz\-cpfet0A:iR;D{]A- ו@Jզє; P;|tn[yy?{R k$<˵ vEc,E5"qRmZ:4]Į@FuiiP -7yY Jm{ؓDC{$b:wyLCel0ylw B>V!0MZ+enPM\P,v] =dFv܍ 1 _exOϠyQFFxiǫ-b*_{U̓M|WG+ʭGu<]`}ΡYk%Y٨KG([Ģ [Da'/^,T:JԲ@\FJkhPbQ4ym&}fc3 n|*J?!hR$AD2`ȗ}'bH>*+^u6 *UU(LҰ] ZͦK:[&q6Ʉ@>1-cE4M`.{EQaCr®!pHu]LCϲZe7zoEǹ|¾?|8gXMv<"W D MPB2ˍ$prc:nI`}SbǖA,̑'ksS&w4/?3ՇgXy)~}揿)_}hR8uzboJ ny0 zO5oLT:~hꚸ4zm5pR67`BzPq%0xi@krz (@tSejmti{_:ꚂeFӥRs$KLҤ+kZhXnkfX{S%4$ @Դ=D`{:Յ7p l.B(G,Hӥ|&6HM9}ndb$E_croM'9EV941'DN'4 )+87Aه]O;</h~yurIOye1nģHF Eߓ+X]$|&"㕻OɤLI17< ϟ|C)yJͦ2WfP]3AЃfdGCC["!j0 k0r t$D:irX@2apͽsjr=\-*>șů}q<}>{_?j }sn"Ƨ6N]gt0J[t3TTۄ8cɘx\:NuS`WbEQ})v$ ţ4i4; PL {yBӼ5UJC2HL]m<󤹎*DǕxǑC 9Gue⟢ejϞ$餁iFtM0\l31M?k V4 rKYb&(ZNj ϓ&D55f+[|pfێ'.\ w ʻD#oǫDL eR]QB؂x6z;o_xJ@AC2 l+>lq6Cqq ])Cc[:ݏWh4\99+,Pٜ8CT_yxPే>?F~W&p^4M껋<(%G-色֐Q(J“C|Z$ vS AueP勾,K#jr%4>]4NNlBWAR'>UpmG6Wߗx{gB$!AjyhԎ+B!j$&zX"SsE\gu΁4&sX\Z. T!(m.CtmG.(eJ{}¤pxEu"RPspo$rOaE4YԶr0d-}w]/M[Xl@Av@x[ X l`yoEG1M苓>N:@^!f霼}7-*UOs6k5m2nµmju/;·~t;p:80a/O^;xm6L[Nm6CPW\ןʥJgT:@*d9EK 6  zdf8>C482@D TUv!bT|||Z~$1Tt]N( ш 4(J"*qi R|"1ϼ:HDe*]goFmXTX V'*B#(P)FUeJ4"erqz-1#s\-_gҊu} F&y㭀13asv͖xB_O]uE]"VEa]dzc8n&J[o 9A䊤tg#Lϗ5F}zTdb$6^U|-/<}94Н#&jW ԛ='M~xw!H"Q=S@iPuJ&b8@$Qo8u&H' >I6ah,Kz8sn:=t ׶C +{ܬGyOw?9"0SgsYv<co%:;p$EU4*UC!Et8|Swo!4XG65]QҮ#`ĉ{$``Ϳ;/{ Vym&Sģ:u<ϧg,M\l Z5aE4VkD`|,թmunԹ:-GB%{={I帢l$b:- vzMM'}Cf H37 AB \* "aC2նR!4<ە}Pq]O~@UhQq=M# LC%4dbY\*]lҝX^Ŋȴ:P4Ľ L< BA 躊iuzSg88x>}k7с# Mrͳ0d*f.!@.~GI$Df?;J"LUllI%LIexzc:vI`\u=ci66lLɰUhr&w^wxEN&4yi+38MO_Kw¶=lǣ\Q͖p?a*NP:>㿤ʃy;{u}2IEG "ˆ\Maۖx=wȘ7tCCiQK dw;6ap$9IC"3s}zb6UR ׷Y߬SKcrOdLgd0I.!7$08ͷ$Ď* ^  [BQ(h4=QRtBPܓw@c<4}LSlxw}ej΢Ve!tZ{:-&hUqze8tޜk/ћNѨID.m,T"R:yQB&,KciL:g,T %_,S(5P*w6@:arzQ~|aOd&?{˓:Fb[_/esz?t,E!07IBF`>Hp</k^*ЩNuU%PJt*xnDtD`/N`R^#4(]ܧPCMP|jut8A ÅPEлALM(^#|UUAdLrbQ))/5 d̠\s@с!~\;D#oZRہGCVr6nQwIMC>t 7*=(4QcLmC?թKB*\w'{0 &MU7~^ LC =gФ$z `o U($ux|&‹o2h~ʉݤ&MOB R(%@NB@!E~IXmZ@ TB[dR&eKt 3.sX/5JTi8JIh? 5fyÇ˵x4[nvҟɕi$^*P:,<8?|0O.ax !%e>TK5A!l ~[Il]:R1 {2\.pmL .6yaMd9?mz-}ޗ%.Lf`T(6Wk 7[ uNe gr8/M% LMEXYK[c:U|[CڎL="T!fi3պMbX!Μ].}±yNϮrX&2|Ǘ^n;÷~tz8qxt/ͯ[?}Y S|}\)в]&FRm;t\&Bj(d JuB:թ)ƴ3ϗ<]Uwʝz"Ul[1KC^?۰xz懤/ge}It\y_? |b50 }J3#ǕjMA԰P&5j .8: HY' }{}g.lY'6)UlqT*-[9 cEG]mCPe,jaؤ;gZr<Ͻ6_:19 +\[l]R=k.RٌeNk,\bHY$4 %I<,ib1zf$ldf;"bM -!e,VZ8Keju$*p:K S?E6o'9/ǟ|,GDy"f9yS/+˵Ur1t傦)%!!iAhON6 MQ!M{V6핀C0D0((m%F&2< QS'Pǟξ81K'芒Q\.*BE2e9>×j&&kuI|`Фpc*>YcX=I^xs#r;珿o'=y4w/`n>G:a+3oij͒Nukk5nsWdkvCTq=$|&btMu^ :թZ'f@xw+;k@{ҀpȦ"ll7"`E6i{F;,%N"ʅYwhi  p\ח>;;zr@7ܶn]U6䟌l.3LC05_buN&i]lrt2Ǟt$Ix\Pۥ劍G$'k|+P*yrh W LD-*}q`_P[wѕ Ae峗BWϗ3֣=\)puȡYn>l# ֩PNqD<}tl*›ꎑH5h\-ը7]qFŌhD# %RYLbyBdd"K_ݏW9x O&nϧ9qC{||0C]|L$4[?{G㵑4y ۜ`76XݬQ,Z< [&^fg6xYVtMqE^yww|K׷Y'4F=x%,U!x^";b(K` ]1Q]&*KJ'Gܤ+Jye_f^`b$ŝ{yYN(lq`8+UN_e{&# rQJ|Q &m ؎6X۬RЕ]:0PI:!BTgVىxQQ;`dw"ɺe{l jmp-ktkʯ+/럠IJEҟ `\EF PS%10$6p!٬=g~fI"сci|crOT@Q|LCce·gU fCWH&Lj d\0%ГSA"!I&Ua]4UJ>kѓȝ]\^ĄŖgd(\ܕM{b-MFӤ:oZ榃y}с1329d'_BU+J<\*p~x {h !XZq-|0_ =:W %)W[\q%B}~IFԷNP:>C@#W_PV|PRbEګPd*(T6*F4ץRsv 0({:{6{a -ɲ-˖d-}'99Ys·Yiִ359;v\ؖ-YU(HD!l`o[OA}羯wY @;E4 ضJoX!U0 c7~Z7qa*hȉm#pCZ3|{Y=aWT 1UE\vn"aeՆu۴&&TB'adsul61=fv@Mb9OO$y`;35uz;|ܷ/j 6=f|0z/%1֝ ˫.zH kѰY%p2lq8)2 Nnf\9&\wI0֭Mbbr}q/;ݭ 3iڽ*54, 2u_Ыj5YYQx$I$MIjWI ,TUaWT:  .)N6o;-ЦI"3@~0ō^$vkފ/tʖ@PllVzl,X,xFEUd\dž ̯Pd\Ba!1-vi!Xa+I7Dh=(1V&fwxn7mLv/ng}oO.2Cm$&n?at E{ x#)]~:BXwNoq yܘJ)艉N"Gv0P6.dש 9Qd;:b^a'g&¡?:ց/E1A>|pa#沨ċ'᳏v~ro|a.$ym/oOss:H\vSsYn\A۱qZcAM+mI% a|R3DYj6r;UY$IDYmMn٩546D`lb-[cRE>,%D4]iZ v=Յ04hSBx*6U*M&ɻ9ہu8FwGkE vL:fD{Ќl0XaH0ERhˡvwoև˜H/w,[,nCLJ13%V :]Mah篮sdo}{[9{)ATؑ8Pdo}DK0ހ]$m~~Vr@x|UREiWx- AkwrۙY3e`W Rgqf*ۓTNW7(<@'3Y糼dH|A~,-LHZrdo+39:ڼA *W5#$ inB>|ɨ4jVDUl*$"IJJ_TgeL8TtAP֬=bCTQ:荝Нmr^Cf߳ JLDJ%gaM粀EDdJ,m>4`|0Dkeq,ѐ۳[,4LZPp[@x~50M.A9{i!hέŧ9V8yn'c39;|\vlF8@3P\*NUqtP acԭU!'>Z#G{~{dk'xAfLmϏ_~rN?GWfxӃ,_)|-b 5|(! yW#`Ǎ {GŒ (4"!'JUL7Je'Vm~WX5Q G \:D\}zW7x>m\q>ҍ ~<#7R Yt!DjDczwn]!2!dU5Ѱ K%[(hĺG7Lr*^@Ian *E"!q&s9>X.o MDX83`yw6/";~f\?A^=1@h(媆cAM5MuԥnddOf5|⚀W IR@cH¾'{C!!I[y섃N4M܊%= T"5C"bWLkB`,^nXVB1 vy1*@V#*;8:lepnEu]E tE`̽XK+L\~/=dXkC8rͤV7x;) =G3q3{V/aWb+Sg8V93Gʍ4lt/%EcsKzw˲(2dp,ʼnu'(@@w7[ t xLnnu M4jۄJErP6f!j"QcQN_EQ$me9Qd3SчYZs{vO=E._>x/‰+|Ya'߿K03sfE첕趰NCa^~3 >'!BjV$6Fȯf{ Ôd+AP7@<*$QU zTp: ܣGpT!,fW YTBFm0i4 L4CuSj 1)@P{@1PV(5݀tPӆۥRL6XK A1=/&D\T@{m^B(@@e<8fro0Li.\K_g?ߝZo;_Ic:8K7\A4④q Yf| ̞+E.^Og8žgHg*trzrEpn`$AC=N_Lt(gzxThTYRl 8 ɶ>l-RcCa\J :9O/S91N]RҳG{ [[UvM8Ƕ37 6(KNPaȊǩbF2}om5D_]۫I siC-i&՚˩)ώ,IDUSi:Z=\dcB k(,肊p_x j5z K0W$Osm*'AL>ĭn"A'n1v y"mc=~2'9vGDz>:bSֈ<(rR}QnLHw796KtEZCN<8Lrnd(!'Jo3Ar'bj:Gu鉸v b!'{ǸykRm,6q"A'oZv.1˧$W_͹+nxQ)D=|a"魪O*w8zL4$,:x$MNЧLKMh`l>QiI"}Z+zuc)iVe]P#^$IJuEAUw_ " qOM(]vv"v(!,nbSCڠRw6EnWĢnۆnHous&3 9:ۼܸ!3>\tx)T&)J;wlH4[\~y\ƙue0?\?Kέ2q3]-˥RHIkE6_yP  ľ1r,xh\n$yܪď_Ót{?8]>~^~qtƩ k(?}?g +Fb|8\.? y!;[y 6I hH jV 'm S =/Iv($@JK6U!rnGvQ IDAT*c3 QUݾ CVA 2bl[ Q <%+H rȒ:*^&ڭ/f2&KT*AW܇ah H!՚KI= JYW%,Qgfv1O._XxQ7|x1B_C7L&n&~i=#Y.J8o ,lrl/%shO+2onw4BWi63zwYȒTz qjI7 Aouk9I2abSd*M7h4 a.YPjP)։v8we6H4 v XX)vvw_ܙyF92űmwxxƩ )?t<ܷ/f Pgyp;Ss[0uw.k~J Okl3fR jV 'k{K2ɒdōT R(ɗ5vRY\wxl*Q%yж'ִA L%ݼ[*YYVB,[Fp=.zà\sJ"UFE#raS݋"YI򭔕 qFNkŲ&|V vq:See*5?Z[֊|Qeד,WwcSe.Hrz"8po7O-qbO?c:x sY?guĻgVq`gPd>\G{ת' |v DL %5 eIES ghV '!u49I'd&TkTk:2aq:A$d mg/`1\$7An{; hmbX93%A.4-@C3xz EDNuv՚F:[#t2q3ŝ +:۽|v֒%| "!2|PA:[ݥ<w`Se [Sǻ1a)Q$/Vµ$f3'ήps& 0U^^穇@^L0yw p*1kc9!#A}/[駯/-SeBۢ^B֏`s KL+;|r&D㍸)gk Π5 pltz%w0r\޽hus7x.nz.O>MwߝZbl0đ=v?dX|GTou^ {E]c }pa{ ;#_#I&Ȓ5Kԓ jV ':ѐ:$ǿv:X i2Z0Lvx\ džݮPTk>}蛖v5-4aP=mBClREbFja!z an˥r(k:2NjbDaa|0L4#!v*,PʱiVhIssH l$%\NǏYY/rw1OXƘ_s}:Õۛu8y~+7ҳ R'#݌8y~82_ñ1SNnw$p_syBϲg(L`0?9 [%wp-^;7a+WEOa:UhfPΨ 7h :tyB:W78rV7??Fk߼bf7#8~$NGLݯ VK*GPU/C] /ktTH@}7[ԛ!BjV4fȧ^p8soiDo4`Jnh-K86Ţbx V⠘4XMnv$vEDmb 7,˸6LS$^b"KVb e4HW'7]T* fjTerUɂrCeiDG=AL*UAc*/be-ncT:>ZD?b-n<_ apD8wu]~ܘCa\#bx0ˡ@N7A*<4|]%;9mԪպ]Ql2`X_q: !(j;p=Imcxz,Gj[8m!\VC&76~,o3o&_~o&obH?|.O<ŵ) Y$rE0 *jHTH kHȯ/6Cլf lQ7^ *If8i$鉔 EB. k/r5 U!=`Vi VUdGn5&$Xi8B`;.jM$BfiJK+b"19oVHg=2^jM/ `aىl+x\*dɻYme#]A%w|t-I*S!Ƹ6-f$W78})w7_:O=tqf"kt<?g~ v]Yg| LM`f>Kw666yWu>۽\ĨjDBtܘl<663v U-5PF8=6 *٭*-1=A\ߠ53.V)3hmWx%?Fo_l'Оk' 8x~]D _L -ԙG۟b'-WS<~EDWGJe}'z$1C7%|24YQa{"I =}6-WrU\q3 p:* _j`We˳/XtĮ qH.@} +>XQnW> dMm}E4DBZ'(.y )*Ỵʂ8 'NOK4[% Ulp_jMR8*dB,f3#yN5VIgE3pc:FLW??sY׋|u_އmGk< 3:U7\J3q3EU(\b| ,~L?\& 9zLn۪q30bfv #P>#A3bSe^;6Y¦( 5l`"ҙ ξ ソD{x_d7R=?r' t_Lqhw j~vnaSd:O_CG߿_b//"r8;#;(8b2e{M̝GIBB |$UȗBЬf5ODˆ)oK`YUɗJ5dv"c+zVFTd$+DG NŚȖ*흿I le 8l Ϩ.>l!ִR(4t@)Z}c<+1}"Woox B9Ea2C 삵燯L;x8l#vb[xp;ဓv?N}F:[w;Xnvru1$0yo ْ[AYj6ʗBЧg% > ORӡtdr5<.ZUeLSaY2dU1Yhh`7!T!Mj$JUCn+]PI"Tk: `+W- [hPX4MbYL3{Rr=AlDP' :q8:"H 0;]udEMnaz>zV/qf۳[$Re{tN]XLo|axS׸5'ӌ xP;l#{[nVp)2Յ4q6z,}AZ=nX\-=̝- mq/q&7A3]\N Dȉݮ'pZvLhR nOi|#Ӧ1".sbChkw8]Ca~֜ h˨uV |In0(>6tۥ+jq&GrNBAqH'Hf*`#]᏿t|pq?nN^ʭ>PokΡ=;D#QR"g/sg!ۧ3:e-Q̅5GE\uE^;c,bcL{i! pZ]+lեLOC8NW N:cR |ݭvNƞ1{SC!~iF sR]7CݜR$[/<=IC_wo}iDyw#I"1, pl@˝fa>*WB~u.WlNլfɘ}u>(c˽t?jWdFC3x] Oﵣ&p8TjkΒ"TU0 a 4c IQ{$CY V-ǁ%Ū i0-7 $z$I"i uJRPobYPl,1%"| C\pxO+*,qc&0"\L^PHV$\)nnᄍ]ԅ5&nmsg!îp&!;_y0|W73 _lpF#bQ++z۽tInVH%KbNLEBN&gN"ELoPbxNW??4M;XCpL4 j͚RE#UfS&8("A;6ΧiG+%vqV6J8*՚N_{G#ܜfj.Kk]-\buî1\Ųwt +^?O4|nWDCr}166+>r:' ^ո1IoOJ|NkEmMEJ 3\ˁ PLhRiT&7Z|6*5JU0L|huZ$ Yf3S\88%[Q*7Hwp;U6 5juק29$4q3PQO[h_lTʟ}m7+%N_eee$qrOP*7xﮰYᩇ8Ky_Y(lSDv@GC!|^|k:P0k+ystz!A`-YTD*]VQ7 bA&[Zl,ӡP*7p\լX_fȲۡPkn,{5anX6 h dt͙4su $t*2BMM]aQRtHgdrUucQr:|D(fK%Uxnpk;|\IgWnoR,7pl o9#[_)pf"sCA r^x*3gz.K^3+ v;!ps&C_6/Ε[pk*Mw|ͮMwR+5$ 5kYN xlw(JvK =bp{Zͻ}v9M%*sm*͗OR|_?s&+BO>{qE>AlլfrE{S@$o*[>dn]CaGYOpmN?{F" u;ʞ0C!7gj;R3qm6/ s9{tX[ʑڪr 3?"Krcî^?,HJ ; EqDM-R{-n{3n{fb{'቙iGݭE$b!R*%++},$'*ODFLT;| 6 hH_RIbBh#39tNثp0Wqq&FDN~CxX+m/V2_{fqK sd&ͅ4/i6-TWt?{CrCq 6~njLzыw>CxGT{nBtzg`@cCuS GmZ<}p  m,h>lT!)R*aoݕ.RXXg`L"vDeE=Di/:~&CH@ltE(l(W3S"Whi2Oc'Y!_lSEr^U9u$f!. qw9˱>v+mt.\c~1o.lclR-Өo>=zy6[EMy!ֶK\Orx*̙cqo& 21 o0DJn37dp,H)Wgi9T~AM9ef2D b&kmnN13'1(U35q/ۻ%Y" Xi8Q.#j'j,< #3F-p)?8 q̹&QF!oH"׶GY^L1=+x Ix HPXjLum 8!\+SX ы^}Po ~Ugw۶URMe+6PHP'_l<$.ILJAnۖ\`/ضc d[APչ]M]X]˰q l'+x GWhL .3EѠLF,alOe8{"Ný<^љ0; Rխ"/<>DiQ4s$\kϏۜ<s!&F[ɳ$ hhDSd s>c(|zc{9^~fGc&M9u4N&W>s!NRx}~/3!&yfG - ӳaԫ-. 7 U?jsA`~B&Wǣ+.QSVZ҉5(ܹbHs68>V P<H $mVQfO1,{yo(Tj-,g9y8Ɠx}MҚEtS|8@xC AB*N^T'][]Muѹm'mF|.m9.3_S%WQl7-`eXeMhy`Mu,&iq-O-6mTE$W4vUTY$2\ CW l[dM3ucFTkm$d:L5B6Ly{?ǡI{km֝4=祧GK|z#ɽegv nrqL <(p~N+4r3D w 0>+ ESbrGߐF͕$!QjV>/X- ësutMղh mӬT@&k@ܤ/8ɞ{ ).އ>dX5я{}K7HVLirPgOURkFI.Au!_8#}\X{/mK&dvJ-k6߃אMVKWZq0-Ou ;;uY,bmm9mWUl=p}!fH@H{BGQY)l+|rlL J~/ÎmVLeqHGFTPgdi5O*W'_'+-VJsc!0`g#m8{"Ɏ^@>+E-}w,ϑzۆ.pe~_l[K.'sd:L&_$cM6|tuىC^-wRLЪxmA^DnK35':'WaeXH'٫P*5 << *UM.zi` Xk`uH/C@ao$,ʉF߹1G.e8q(/?fs|iWv]Pjh9g>n@Dx3䗮FE/zKI/ݰdAY72rU0MXDBF$6$GNXJ%Ap4hu 8ۭ,;n#;"$kq5 *FWe|؇P8 .qx&eZ"#>F|m6w <=G-V`lcqVs e^ynLvb~!?~數ۆHP㏿5"KK 6w/;l%x= ?xs\"oTiqf4cC~~u~dGqH䣃+->dbn{p 6MD Ȣ,#^qjlFp$@P)x6*!ƞwX @ԭ;=mr;rW/;UתB qqw>pX%(5F}8Ҝ:npx:ٶ |!|AtT۽c/kʖ J&QQ1@eGǶVBSDu<'sTTEնIWG0p(simdO!9*5Xڬ08`mף_zhXCUd ]\nb#0=k(lUDS~, oA?lṃvcA_fCy!vU~}~A?Hg|riOi5-޻ ExmA?twLG 0"4]0`;Jsδ@ qtDGcf|xYġ(?>Ig#h4U t8.`;vU]`J+>PD{ыvJIAZBTŶlW]IZR#M|'y,((S\!g>(*v綝m|V IX"UrND ۠_%6N 5t]"2\  *[ m&#EYdlO_̠Z3Y(R|"l86q$50΃zwK-d&Odq%ޅ^yvl6,;'N pNt~7^_#5gq%ۯNwa"s!<=~ 4}|lw 214z;HA$[  h*\ev,H|2Po3&ԉtv*k@#rf t[]7oPpwZ])iUk7J`ȐgvtX 0ScALx \8~/,gz,ߧ"wg00яpZ<3_r}ԭ;U'*]I_,,49~g,@*;l01.+48<晳ly0 [e/ rp@Q$ϢH"Aliɽ<%s|.̍ #LUh4Qyd?*W?aig ^{~ mQ`dcss!zWG=vu/K*[/L{mo \V±gNT.'81mZwV91eߋe;m2; >DhZ\xDiML TtU֝OxAx[nr j5W5h@Pcx"Qff6KkyN ly#ἶ]"ѩ5Lnʁ.K. /*}DžrD/o'o!@XE![ݶDN)WZ\rm"Pim1GG4ZC`6 bK[5lAdC&Wg $H@AUeiCq[%tM&04TF"Psoˠ)"AeWrĈWj(Sk<R"+9<ϡ:uF Zm$ X|ٳ/?;vIZrh*hKY 5~ݣ/NTTm_eq%[/O29K;lrT?KyGh4M~:'ǘ PFcA] uTIҍ=&BtQ;]4ϻ MꢛM7juw]@]udThuP$Hg?'ghعa^Ξ=>t0 2<ãˤrwJQp>M G_s΁_ x<JD/k'lf}( gۮO&H 6r۲F 3uvLڦtlm~z\,Kģu 6C&HWt@că<ߧ lim~!/ƥ$GA@k{DC:A4U"k/?=Be]b3Q&U9%A86m42I=;,56e?7~ٓ}l 86L,ps!pR5a;Y o\ƒ~iwaDzl.3rx:(:!~tIݏ6  ]Mp+!5ЕŮi[]U&uktq@k<*G zu%ok\O26c|ȏ( *iAdYq:UMujQ ||18+ LLzыRG<,'l[8jҟL- Ae6>zP6&,ʲ M |I2oRDB:\ .*m"!RE%%UFFOER5~_exI83(|rmCS`,qV˶O Q-YS}^3~7CW's? /S#&rpPz_Iwk<#^pn?xe+IϱW)*6'XۯM37HW,ñq8-+ީtBWk>v@u]UD" 4;@3OqC|`'Oٲxq-3Pl"Άe|cE IDAT >o+[ED+X=%\ɤPV^qS ˲"U Dխ"ɴ##ۉ2*k@"UESg9IQe]rl^V M͐ Du&}Q?PKU ʵ6!(5|ˆhXղֈ ~_e3QlOЧpFXĠ? 딪J )"b"Ca~'l'< cC~nKu8i$I]|iVr&| 6ڳc\p>O`j4RwS <9޿\3o2y8e<9"Wo33dF; 3>˱!?^YzOO7 'Q 1w}/r!w%}K`vi ;㇈꼷PDF nrZM_DW>U#!WvgVlE)MCu\8O怳AbŪN^@/]YKeZmvU$j6,k۴4, Tՙ߷MZ,鐮4ZeC YfsTmxݯx fb0SDfxDGr\AЯ50UXHµ=Afuϫrl6$ $UVJ*-f'XHY@^axp2DC:o|u>K I s|k]ӶIVx pWcc@cf< ky!?>,;)vŏOS(7yEif'B\jGcȧ7y!~saSan.94bv"Y1t!Mso%GoacĥIwJ|)F}mvfƃ W#UY; =C:l]\maR$sd:̣KU^ ʳ##ٝq/o4vK7|56vKhD5C"ue8u4H{9lt3|t54?ӓ$5'Y,צp rpDKkysh2D&W睏x0B{GD`,֕;-3hw%v+_8B:ILu 4T'fmBJdY9xwܽcmHr}@dŶ?V bzwRzRղ^}AN:"6 -Nl"504蚄ϣ6m4MjAR$QE6ƇCCa/]elGe2mbHt( >6vK4C&Sz! 5a Mxc~/}~Li3ZHekgj yx~r&'I,UB^䷟`NoR_ O^|r7qe~natǷ_$Wo,Ón.2,$rvDCQyt ~:g6~ǩwߡf }NBAuiv뿻ǻW:έ{aq@-B U`@ErJXp\+`!cPE{dv\E$^I0 OamİzD Ca;YabmeWP񳕨`2]rAN 'WwuA*\"a2zhmF< Ľ<ȓ:Nָ G_[1;/ i3olJ8RO秿Y㭗xmS!nŧF lYF|Y>E0[hɵ={G T>ýrXr7tGF"RÄPI6>?BbWQl SwJu4Ʌ>qpjwP h>tJU2:;*jJ/l8F¶e,[A4tldG~(tW EK ; &ĻۣHe7 ju~^/(9 ۤ0yUFvJhL܃iZ舻 i4L>03`?S'HE~ME~/%4M"S5& Cqm WiZ6$>/tUZRI<*Kko6`[,~7͡_{f/(7gY(lVS $I11{1/rXp8/棫 Wr&?2_I`G0tK7$+ ¹!!l|YJ^W]vWvdky AXr(S  Efjʭ{ҹ*JHXآA2@4$ QeչI "J`f) ?- ыŗ: e6o <("i2͖Xp@#Wl[bz,H4bj;|˶iTIn"VG!Wi6M>]19V7 U$IPj19c{٩,/wȮؠ9gQU~/'1arŵidx H2]Rk h 5 i,f f(|r:~mbŽ+9Nbv6͝ AV.s~޿Wf~1d>汓} yX*ɵ¼Pn?8Nz{as!;XȱؾK`,P=:xW@ٕ]RvWR~t*]otc9.t/͝Y:|˴hђh[AuDQF8 NAmYxBmjtEXW"|K0:΁$n?dLkH&TIe6~, \/j ]Tipd^5`@s6}1ZfbG zdl~İ ~(BWoTbA`P'WJ!ဆףlx e37bt˭{YZm Walȏǐx#mY x7~7Me+dM#<}fTjmV7}C%:ͫύo~g$_{zI+sc!H_uF*6Nq"7{G{S~9čOVyM'2pfF^bܡ3l! ~ɑ>CP#SaR:KkJ?, %Ṃ=-6wJ|,剄tV7 xtsu~a~ާ|aTEbuYNS#]2/6;%Ν`8;\?[F?$kܻX, d]IsC2`G #۩^n@3`G"ZW#$}t zؠv# ؈аX\)qNDBJu.:P "_ѺSX? ^ބ r,ErmF)HH_ԠVkS"6JKƆo_b C4mF|$ULӦ?!_lz(WhXg?]#֩V< q  @|]4 ]F1=2EР\n鄃ѐƕ[)gKA#I" r6#>&}lY\j|i [.H#brlcp yZR$b4(HͭnBֺ.(@s`7  J.|i~p8oq&~rv*~g gA@TlA[?+=^@/~?\GLA+tiǐM&#̣N lzL[PjGٲt 3aJpPcCdt^]5)GTij$P{H4Z&$ 3aƇ(R(5tQ#^>ǐtYBA 05t#hiv$\M%_j,_uO12b~/SrT?|̱8VxkHe9gx-X9\Gcsڴ#x)NѨ9c^̛s(1|YCy\R`4M`&5"|OtV ;zFW{T9\7=͔J*:_? 1A T*@@/zlل%",<;iBnjY<{v 3QM MsZ\At>/""I"; C>7'/6{H_W![JMBOa3Q!OUY^1d6wH+m||*#>nMaZ i5/)ECO˻x=2!F&,6VVד|i&G\$_nT.q/Oo&ya~:O?:gyQMt, r~^x쯘C~R:A1_g0ai-H@C1-.\h<" (Q]MܪdIݕ[]mNw};ösz`*b5ػpgId7cQ+HfreY?_ <)B_*z^~DdZ(2+$~Ay,  {Y([bz<ǐi-v^CF$6+%&}(rh*ĥI^^b*hDd8nP= LU{6-BMXZw` EFOab$ (E bC4D>Cµ=υG Un-e^fcf!}E >G&'oq>\/L9{͟}(㿽#O =iYrnvxkSw/9w[ =|va!cekTD|6VRh@Pv@խ;ݭ;FBFu <"Byaaf3']iS,߇h`۴Mf(:VA<*„T*,{bjY;[@GNU S,l(q{9GaQ84l ]!*"& N@܃ູ͎pm?~Jޢ?jWa cdMB~JEKЯ tMb~1$5ly]ywsF7vB7%Q%z8"{\؞r*[MʓT&Ujg&q3HGbk,[DB7h{ۀ(JBJF>>˿xdǟɧ?>N5$&'s'?_glK2O['=Nph}9$;1eH>8\'Seg~΂WZ:ٛ}e~w"=kwt N~E;0\ξVge$ae^ބH]' C.Y B{9:cPovic4f&|}i99v'brkX!M3nB)o)y aLJ[v1 ;ELy9_ e_Y2P)9R&{W5l>nָvS֧::v~Nd92[8ZRxm?4['^~oʥK"fK$EłR7Iif;ъЅnx{Ksd7ŜKO~oL Iqan]8qxbdVf'?:Յ[]7?uֹvf4ujG<5ݬG7H6oWޙ6k)) )QB 9beü8>8C'Fy#>E3 „Kw`:D?4΅]n4<_?{MF O^R'FRIN7Nv[iB o5M5AB%直:1F}ՀS#Ͽ™7y ^_3+<96={c'G@d\"C\mN;NE]Bc z0LgfFi$Xd: 4g>Ggv*_>W {C ^>O~]9H&"M z`_^NSv5_kE Aer<TCtF304:8D{&竔&E3ĈgIذK;HXVخ\Y#IT̄djTRLi Tlo34ϞYetŵu\`b[n_gYkNn4}wUpm;jp@`Ks\Qg~}.j.ox6#O}t?Wm.lq]Ns/q.sgVQk8BhyLB ,BuZab^_mȲLkZ*˲d4`@Cf#N1!x@EY/@B(FD+GfhEjH`Sضdb-1;ZRQF v'Ʊ V7Z , I!&@.5*C6s ULCb90ӋLФF1g2Zqy8hšي8uG9my&Mr}LJIKvXhs2ʍ*WWY;Nj=dv*Oqf71LWlzKwNzg*dWIJئdsCr&+-V7;<3yrJBC=7X^o#|雴-s%0 80TZ E+GF_z<1] S*Gt<0-02lWa+ ~y_XJB1UwzFdi=;(VP ъ` ndrduw߾΋gyq^xO}o'7^!7_[83Zmdžr LW \"Yp"BDzLNćgaAMF+J?+79:ŜE>gQ̙dk#Rcf2Dž.#e#Zw ZBΠъ0u9!)Rrx (4y|%M^ɡҹu:A}DW0;Qov++h``:iQ)Z$IkaBc"$ I0P4MFϑ1e:NYeLO}l?fģOc_~d|Lљ8VfֱC)i}6?;čk$ )hYy.nFOԩS|t:8hPVIwVw'Hƹ]? 0@fR~za7C[,6 Cۮ[>8fDhsy$|gasxz3bu dԛe˔QJhѦHwz::qŅk l&p9jk`fn֘R<竄aLhS G`d8νw25mi?#̙3|k_cnn-$u](" CvwwίeYAw0oA_lE>'HMcO. mv2ljen4„(ɨ":G`s[߸G3{"׫jENS#}c}yLCŭ9Bqs%vL3ȲFR"R<$櫌PxM'rXĈbf;\ T3ocR}ϋc?{ᄚk;}u޼paaIt .o];$LS4401R[4Z39<1B?4!:aO#N2>T] խAg*3/_ Ld8[mJm0%cND<-y*\kڟutW6INզ!v2 $"b^peȦX31!`f2K[tiHgoQ̛}|d찾޻*mUN211\vؿ/&>k*;ac;$ m[`zM1H{ĠDj|ov7#.˔;OZsycV'݉%V˄Mz;#t&!0L۶IҌ|.3} t]WO /ry&B4E40$c àhI~7$?ٹ8FŜ||8NХTU;/]徻T'3nN wk[<+;m\`kCtl0u lSsLĵtn4r!*2%=GFvϓe{7J)5f'RW*C%#C6-_WO-Pmtr* f`qN\QB'@54 {tO *clJb_l&F8y*%}#gE)m8p.q@ߕ>RIюh6#0 [|UeTP QE-֫"(N0L F7NR, 2*2RjK,/qڵ0 VC:N$IHto ?nZ[z`f;Bgiv* L_jhv zlr!G<0u6>!xE0M *%ъsu(e0RVm)U[=۠Վ՞}Oz`j|LC3E咃eA+緸8Pb1^q ˜!5LI;H-k7=E󯬢iY^k~o(M{#Y}2dR)zV'72_V%@y$iF;a*ةlT#i)w2MlEJC1 2 ?FSOZm1AӴ=1`ZhuޅO϶Zv`~J)X2r(HAWV[?+٭ouhb4 04=k8?̫6q1i8z}O/Bl6 IDATi6j5~{.@9H@πOҔ:ɩ. uN5$&|cTъF)arVBޢZWXw r\^Z"RjhB03[sYLj.NL!gэRLS'&t i#t]}4Jf}CeJN8Ҫ)p Cr`:ϩVUBaD0XötW)&[mLC[92S$tGN),ԘF[LSbUMC/R#HBMnW1qlIƀF7YݵHRICT R$$i&M4!/Msy4S1RǶmtC2M>_W8{,n0u4vAmH)vqgtׯeY? HV1'_&I8P.D'?:܍VD'HЄ2ut]#錍qyBu {˔<*0u4 |u.om)w%sf]W|_ӔّRh(ᥚRf=Azizj8#CU;m{UatA:A@TTŀa8K2#3݌0VQBs,SR,LFf[Aqhos ̖84cj#3/+-$y%eCy ЯujЯ:Уa#|  saHz#&IqNԩST*?C_Ӷm<#cǡh(""A4XZ%oy]0 H |V!2NI#W;2Wm ;;y]j|qV7۔/ξbwt&F<^9a}xj/rl.U[;\]Qș$%vЈ]JZ3Bh41Х{M2nZvcn,50 H ?^AdG(,QoE.`(&;1vt8U^{$#-ͼGPs8AR~ZAp)}Q i222BT_`7Zʞo"+?aѿV n`-Ԛi\Oep0Ic@n7ChJލR<[rp:nH')-|#l*sWv1 LOx"ŜI.g!5c -}i=\!gڤT01 NQk*.85(enr$N@hX)UpM'ctSPmiD lL rHn7%ISvj!M|._s`E90!IQ_Яwf >.˲bt&qi8_84M ny$IBբ鰽 ,[\スe?XZZj `utKy 2&TͰ{ LHҌ KM&llwv9rH!u#eg u<#5A1oaT p,eImj{:Ac) NT!,MV7Zֿ:]giB= 5qХF)| XS;.o,.T v9u)GfqJrh I0Sſ_[o=agY8\vE{1˲}ZV(hZZ-h4T}Rs@J')ieSr`p$U'iJ)[ 4zFAevUN;H2XXqh#3EZ.fCE1gn23õu,TH7p`*Oe04W%"xAe*0XYkR$Svo6\ ')!%"j]V6ZJ .ŜeI(Rkt9qB1o26rס!:٩<9`k75j~~_ 'av~<>?PTcwwZNCd{{(4ǶDQG,o'R>?0`@?8 H|!~5I3m,ool~׎rkr1QqF{v2 9 ۔.phݐئF1oiG\_j01#5`o5(޺)9bV3$AC{{=W%M8m# R$õ( lN92[`mC%ՙ :ҩ7\kjph s;4Z'8KHf@;~ *S A 4a{'Sߊ~|ӟ _cBbwwO|8p|+-i/wkMRu`nnw0$`s >$!4E-n,l0Zq/ҹ ZAL[+u>Q_Ƶu,K2T1trđ8Zq[ CvAs.vv'MI QxTʜ8V;CX:I ="PZK7|j0-Ĝ{b\84SJq"P+R 5VK@D] q>Ƨ>)fggU4;éS~`ζ~)s)mϷBöSV뿫0 .R !Ng}^5޸h3DqJ b7<)nz~Bu |u\[繗W92[ s60%P)-C#;髙~d΅H0!LED0JU q{am;Xdr,N5lQDAJmJ,6YXjhFi:&("4x=44ġC{8{,ϟCwڸ{WJ^ w`~~iiiep 0 R^ЅI&&8Nu2}x_Y%P{ŵ}xVD`qU&F\L]ໆ J2^;ELCr*S[dkCj͈Qz~048u 4Cj*>Uڞ&AWLS&q,H5gOk<7d@&W݅p9[߷bfԯtPm,@(־A/ORJ^K/%}|c{&޶ xePseYdZ%B|DJˢ@qR9#x|Cxx-(!Bs>zn'NA8pi:>ď gAI\@,"we{K07_:W\UV{D kc,8>ͫ\bq7Ѐm{e =*Rt],x`W^y?0\gv1km`? ,f8 s`pHhr_JR ]<8ve(Gw $'=Bɟ/\&\_blP3?ls3>~$N V9̨E7}1ZVRiQ,z\[Z $ut6ֶFvN/`]w2i,ʻ?28 )%\yg<8˲zL~ Y _///C , En4N)A7~6yLv<\EN/RA#LOx k89WGq6L/b LOxPk|'7v&!N&eJQA{mO=/~B@BٵPW{( PB 1.ZPJboUځc7tŴPvE)+ 6G< /mQ kp,-mQckgQ W8Z@H(X@]U~(@^ wm},!$6wcpFps3b0F):j>"'8D]T>589,eYX^^ocǎĉτj!I\v:/@ !J?ab2C (DŽKJX N$8#FW?8Օ!D $8y{9 W{86#-86ũ~*] B$ϾjOu؏$C/zBdL0(zDX_W) H9Efkb}pYlxCLLL`FDtw3Ϲ5:!D%ʂ %X{-RmH)XYYy1j"!O)P Uf`QbUg @+Q$\[ g߼[#lubM Y&1BX-xe-1vF ߢ}w,m}u!PJ幂   HRyABA,8- :@3C>DDZGjzijz^%ҽRJa۶+0 _xs7jsy*UPJ}{``p;+{ |Ce8Ulj 6{b ƕnef#t1:Z; 긺cF!g)}0#@UP ˅ oT\`f7xϿ$Qaqe~|NY o\!C`qlxua A? Fgs4 D$:'.Gh}ZQf 8G dabz҇8`=܂ŹNm[ [Ǡ)^)8\mX4Mw*yt%a`A8.\,4!ymAJ<B)*H@d4C P:H.aPQRwpD _S:- y.tc/|Q_foШYB"RJ!#.C.4Ae`[z$ ){RШ{=UvJ; a0AYh,{;8{#-KT8mYfNr011c ejf@+ה/ BK/e@Q hm<F̓S}Gի 008B',@> Xn\Ň|x Ͽ4ө~Y&qc#W?s ;cNxՑ +ŵBE_Eh OAX$P]QJ*8X RClwcPCV7#} cg~g?Y s@mY}s1w(:,BNNѶmAIQux -X!8kȆˠ1VܕR 89,˪HI5 IDATg ^Cs``p4;Ug?$9  l>u?_f (Co?LO3/SZQqR*p'N hFvVx= ,;`1/şQ'%yfAʛ\!M5!s'q#FkPX8PJA7^uLNMq$In[9 8F  g)EM `Yv5/}^8u]q qy,뺇r&=@ՊH ! a\iAbnǔB/T4x.sxxyaI*!x.V6"(CͷEe-s,,q"0P?=* PPE4/ck?uJ0E+t a)81}V3]9B1[Ȁ3LiKu1O[[XYYNۚ9iW~TUYX$@o5/q# C m4MF#x$Iy]uc}y# *@ȶw%iBȗj᮹ 008$nTOz9AH0Fs\1~,Pr}4_)؈peV!:r a,n )< $BIi#LR7P: !uf'JzIOX^ 1v{cc=W;J|F) xڪXAx饗+ cdYohSB9U'39\ܪEo\z333UG{h`6Z,BVx]q P_-*u۟}gkRU.@%;P$eYh6#˲*}в0,uH)q&!_?[J30]g@%<&HaTTn;ct "ehhΜlbDY.n8Ñ粲 ΅ ݅4/wuQR!0Ja (ڃ D.;H k[#cz`pc,B(C.<(z3A p h4› >AJS7U/4ի y st:?~~*wϿ0$IR%u]AP R_7 U1Ֆڵв\XaS,+:J} SSS}ރ9,,,-:@Pb8V %IpqPJyj6v0sRX?j30uTΞ!h.a .3-{r_7v`YiG?4 溥K)v{ ,33hW_ -\Ǣ:ogB>6iXVTϡ<Bsa_uqM$)|׆Tnq7j!deTv ?sbp 󘛛åK0o*s|+n`0@瘘(^ HbzR ƍo#!Bү\f`ٮ%?/K=@O i&ͺ\b]/G.t&Z BHXC)lq8RpmZm@(;H 8C,L|^O(m1䅽qQT@%$Iꫯ'ĵkE̪ %&؎S¯I>ClˆmYZ&lŋnkS /pXi`U w p]fZ!M f`Q"4) Sq^Bbaqe9f(\>@7HЬ۰88Z\8өR(m@ pFfAs8yQo4 ,A(+Te!Cz__ H1._gyՒOMg^2!m23miZ%=G~3VClt8vlV/mOַ Bz=0y^5(S  ,vǃ xq8.F"n7|Q3B܀r=0 h < AKN(%X|R(b!%,_ev@o`mk8TDž_ÉVg1^<&Z9c O9iwꫯb8V=e1VJUVzO9:q)ַz7,zܲ@ -:}V o;Yn,VH)1 "V CC{`d] E' 008z$ 4SmI@n| aZ#Q 8E1a-n?8ɋ` ͫ³? a0DlM̜|w9CP r)!x., ́.^xy簱)e/w˵_X$ 87;GQp\O\[ˢ@Bp) ,,,T+w)e' +6 (BVfVw T?|J RZp8d6C  m7/7T~Ɂi&eڝ/I%@4{ȅ8ѨYַF] 1NQcY ,PO9 F#8jZϘ6QN20ZE4JKxg]&9(fB"G < q:>U}+Q:RBU8$)4M\vQ(Hil"pi$nWyc44@%|5p`6C  Xm7 x\H吢$ʼn8Gt2eo9\&qD.-;FY%p}/<8{TF8#a ap.<ӕN7%BW\E;<2,/Oz KiVmXe0%z $ƃ=/>(Xq{v["G)?d(B&sqIj>^~j0HӴ-m0c8j.`<cuu;!үApرcC  v+B*NHa#T5g'#q,4pl F ҍ^$@f3mdrĉjO( eH31ZuOُ%_&FЗ)ݝ<ܯg($IE-z+d[%iZ Z6`L(! D²8t]d_-7NDVK^I(#h6,y~yfl6"hSJp8|\m.u*!${B(u=LMw\pN1[;18Ӷ[]:-P(46R*8v/!N/Fl{pN5`YξbPBJ{4 0믿 !lk}e',B8$I׿31Οs8JǶVBPޯ7nWs}yurϲ,iz^JU%*4MO~_De[PJB9Up@LQJS'Ou]jZmWϕna`Y:A (_ `#DdΞ&+>L)!xz]bTq0oawCrT NISkhy -!}1Qz`:8vh'}tmD^Z WkC!^_x׿`0NɜVʨ2ooI 1lۂR zwШtqzZu&>ʜRT|T AlY gΞg ُydY8Qubq*=Tt:Xe١:/ !0|\q% i'GP~y?mj$WRMĩ@Jo2)Q -_0Af#%Q18#3 N?!- sQ"J!NOVؔ<+ybRWٶ]{ >a}O"KsX(8'PRR Xg-OsIٯY@9z @Bۅ뺕aJ.u-\^^>&Bj ^ P HMD*`K!4_FJ).l˪##U0Ƒ)lDO(kCRhCZ,nS:g KS,]v `h n%n< (t:U!s,..t!,k 4M 008"ŠYO/oUtKYAXaz&.R| AQcFpQwqGu]TI^H ,Ă {J,o'ʪs~SxN9(UeGj_v%F"Vg YCG/D ~"QZX(#9p Hׯ/Hhw+",PAey\ÒBHuNYa<c8'B>g۶r]hd:C5k*? .8#s0H3$xBi#IL C H-tZ_P:ݜkO~+W DM)EU8Ȯ ,m8]9zzetIBHqF!bI@YJDP(r86EJSvgwQoqF),ۆzWx1 c0*Ex*v02Eq*[`*nux"\ũS9ӫD;ү0T!rhA P(>O#MS,//z9(gI6c7i$1u]LMM!cf JiGQ$̕g`p$Ч%8'Qv:b P.AJBQobȥB9,G׃:t&NurU(R),--'?)_hw_+wY֕[!\pIؖB)8Q{"%( iG( m0 c!Zmw/z>$+V Qu] nI|vm#   !w(h430 Kn p_qѢ=yWUwxQp↥T @)!IfN@VyV=+FHӴ',e/O(>7  @IaYŃ#i9/l 8t{c 3sʲ b_ 'K@8, pfQի}R0483W!G5}B%&1`gYK#W<|Pf9(-~nwfazjYU{[[x晧c8VضmdYy pNe5Yh48>7 Zeh R }] IDAT3!AТV|MD}{vvvyhMuβ UɮVnU!j`ee堾Ra9uȐC 6k)1JZ8B\w@ӮR{uw0 159ɩ)@)DQgys*z}V3RxX'oE8Ƶ1==N XU@Pt@ E^1Ss=-;<=(C.(p]eiUd [E݆mt:HkkkH B) EQj<C F'`|JUhp+ `߭a8yJ/_*4}~y".GwSv 8>7P@ŰHAkH[q(!HR9H>`\>=^նmloo#2A8FلZ4V FfRJ I3Jضh+# kEJxt+Pw!e'`{g+++x_ai(IVU(_$Ip%Ԕ&nYZ A-̀&@;'&@>(z gΜōulnn𔤩f ye!<Qj~8OF\yLKR_/kqYU}dOeZ__իW1 F3wCk˯FXZZ&''8ZV*-P &"d1@V=܃ͭ-e`C g "u!h2J>."*(jC~,swlqcE={V[e1TUV[}ض, T{!()pυ X][ơ Riv$ <ϫNJWF˲n\R/)(gc/ 008$p&D{Gʜ#G%)%Fբ?FݩDV=U!))^1R+ tDX3V籺z[o#w2<(IPJ1+RCw5h6 "ܬ:SJ?y?FQϡORJ&犺Vv:*?Ν;uޱw$zi4B(efETaAZJi)팵mTBZ Byܸ^wA۶1 hh !* hZjPJ2RJORJ?S30}F8i{xYBIe{[ y zĉ8uTҥKJ`ii ODe膼@IPB<!#he-hBΞ=ׯj;xn%\8NćQ_&Aj`h8vԫ5BhC gcѬ|u=.&D8. $~ffffx<w7SN?8!~'wcc^NB^eY@+YʤA%EPf#:Ν?%loous1xx\ض]y1PJZ8?^u]vq4˾? ]s``>ck8I.iEC@B.e8{lgΜjFVkڝ|uos<_'Es%L :@M)n5P<PJlpia}cPW)&Lq#sAP ݮ2jt*ClLRJFQm>C 0\$w*Ul;i|~~裏g{!z^WoB;y 8q&haC ρ*UZ*ױÌ꓿ a-3bS'q5sqc4U8 m'VÐ(Ms``>cI9JAOx%EIB? Uk'R*-e˿_nmmm}}j^!C gtH\D " ʟ#<^w[+"c%|W_wwab8^jW!_%Xwr7n`snKUXb繎7.Ǿ9`/H c$FLt:8}]wʈeVDclooczz (KWض]-//#IHiQJVus``pT;aV;]B ࿼~ϻn~7߳hZ%|rGg`6c J!ӛ@)JC8TDU%i ՞,Vo`gww/lgKHNxBJx xfY "d$4c{0 WUf`%zN9m_^^ޣǯKB>!QKKKsssp:eK`Y DG-}畔n0 (:&195E$Irr 8f(p8yrEqz=-B qAI{0b4C .H}J{ A{Ȃc+Rʧ[eh4p8\H? CoGʎ._gN+쀵Ɏ9+ZR? H)<cR!B"MPD׮]CFNeF@e.cp q ˲9Gө666 퀗0d2C (0DG_BRWJBԿ'|EIdGGQ$|!^Bqƥ˗.N< xqr/}DWk@ZUd ::X[=%CY4-\(pHUzU<^OJ):fggaYA\JႹ 008ˆHa`0Ao8na67AvT]afR !<ZmZ Hlv>+( >+BDBI `F2 *4Eۅy}`<^W^wqth40xRX !g;%0D)!ԅ~yz_V?%!`Ep2@l.EP瘙BƛoY ajqa8n;Ew4`BM)*|!suƾRBܝ&2,,,`rrS`T@mD@*/D Sh!-;>S.^X8AJ),BՂeYBJ,x7$`vvNqʕ+q: (9_/g;%Q'|2}7|F_W2@Р=~YhӠJ> R8œĉ?{o$U}%M$M5fA`{ =Ap'j@`0N>lBܜADBP(իWh1ϸiYVˈ# [\qf {f{{gΜ,FFFav^: f0E[ih1ЯUlK`rjt _@+0Dɘ`ل\. Fm|(=Bmt:F`0 Ve2牨9f/|*:,@tڏR)֏GQ@d3dl0BJ`bLLv\>}:w6 @^O H>f2[3CCC xeYm˲1# \r$%r̙3lˆ1]f@Y #*A@k R`r.C}p3E˲}o$'8C0"BX(:Ν;T3KJ)4OJd.fC.@j4paS( qm X %6Ld"2RF2*zp&\ٳ&\x}߇eY}IhZpe" nZt#"fafZ6"`8\fg,,\L,ި'`SeYI0^ZZB&IFS6 -HbZ\.Ee9v0 0`0yp]ef^F{/^ FGG6RB8Ŏqj@T2&C@ K cyΝ10B)Vj uQ,avC NnNaYn"t:W=3"`xEDwND&H)-\rSS(J: (^YHY$B{AXA$qafXj !v3ZtcC@DO2ocL*zˆ# BJ)~}7\.ce=:BDA  'AT*\D n<:.]i)`?≂8_בV T m#j[T*! cyy9F/@oeV`(ZMroQN=UJassk8v,Gsa%8ZEL @]G2V "9s@" R" C4jU(r\0.ܪO@ F*BX5< j`0 z<55vH(8qRv aTd 0LNz׀桔… I9_Jj} B2HDq NP.,|eY5Mf !rz荼)bp]kkkT*Bֶ퇚fDmQ&3O0PjZ6}^wf!庰,+:+aA* &=JPD/ "AfH `nv++X__OOU IDATH??j#"Bp# ' c||J)T*僔f>y^4:Nъ`lQ3%N:# CkT3 LիWd@ot؀m`:F)۩觔… 09qcBuҋ􉟣@g@7$T2Z߅ R X\z@w{Zm4n0B"Y% "fSFc(019̂b-B:Vy-d]ox:X,^ի)CLkzyb0 h4hDtL@\eLLR Qp>@7d 3G#a[N/Q( 077(6)74 h6tZd`fdY8T*5{.a6*"LzhX# a"Nal/"@M,..cfs(Κx́aQv@MOPRV*_@ T,9rW\A- " ĴVCl6L8t:={kY?u߃L&z~DD^ropK;G|2( ET=T  h!0::a?Vz\> "0P @!C9۝D fƱcP(dAJPJSk`0 zd22pj5\rG!˂XDuCJY뾀eJ0]Aԫ~e<(tf@btdl6^FmY $up}WG&E:˲*=BW&fAvl$;!TED?OD=RXZZ&;\.xd 8;D aqdd W2v py"8Ve03|Af0::6j%?0gZ# aP"`9>U 2?L& #nT2^$OZ(ECZhm!L`( ڹExwq?'ٶ ۶80eY "qTU]ӹ=RJSk`0 J,fg#p h6ѫw#{_ M@aBha`'Ç aaaRʾ9ONV m'.J);L3oGX*VVVBj H6)^_LE"F`0 V]fg~"rz/^ ǎ:0;7a8HX e0}C2e 85T*$hZVT*8t$P(ߣGbddkkkr jڮƤK#&QJUSk`0 l6{J)u?@DV"`aac~(l[/$R,=F̈́t@ 2i1;;X\\D:Pc`=PJh`mm ̌b&d2pg`wffr>5%}Dx$6OpuH)_p]LD!_(ĥE0 EWvP*r~ A(!xgɐ^#J6 SR%)!perR*Y&T.QVQבF^}x*n'$l?}gfQXh !쨼ŀ:%_@} ^#x{e2|Wk~^NJ (6qe}d0 AN:~JDs^g&&`С(S@~ml6dB*(lES@":܇x3g055p 8)Q TR Tg@t܇^$?xr)~WH(8NhZ&'.NJ_%Z-\rNR1W[N󰱱Nbxя~4;c_O:g?Y{fy!ĜeYZ- !c\~@j` xѣIz|YayyyWp{8xꩧn}:i3gÉ_#3J=y^y^`0ܪSԿ3qf~]"@J# C=v m#qOwkI7]0ho@e?˗/k/mpD˲4p#<7Zٳ{̇u]Km`0 [hL"z=3:Ο?t:Rn\q(-(HmJi1Y ǥSNǿl=fd~q`6r}wu񖷼Z .\8P&ƄKR5 # pKu?J=oa~DS`Y>І@ĔL(0n06Jb$h4뽯rrPױ!ض ffϖe%"`mmߥG0*x*Fn`0n5JR !IDS^'LDɓ'`N{+h] L D _?vt{]]}75\}Hhee%Y#,3#> !pbuuADT*Ff`0nUxtf~7 8w"wA0LN!uAE{wRO?GV^?_+¾})%|G^G^p|a\&x/l]n !!Lzb`0nUԲ#D"0 q0= bB ~ !'[9:N=Or6BfX,^ *P.RT_*`@mx;߉L&^x!kSCtFd`0nz^Iӏ !'[N>aò>Vdpm0'.J= |?`ݾl67^r% .i Z  (D"Fq`0j&`#Nr^>b||3PJF#;5~۱@etg>hxIW]}#%Kq9R N#qt_CYoaqqqRG" ?Nk40 íf7(ua̙3ض4@xp<)OSjd8wX\ L&A* RAXDXCw}7r^zwSdLRqF N\ff#T׵Z-?ѩ}`ٖ^}k+4k`;qP*s~R&JF @6ׯ}kd|NU".NKB# p`jڅl6{?HDN?"^Jᤑ.6Y%= IDAT^''U|HV kS! Gh6}㟏&0 j>,ǁBw܁T*ӧO^}=m6oR,`0 ?`OApOD Ю@l6q˘ET`YM!O} N'9S7 qOȇ?wchh˨VwωnFfe#ö-d^#ٳj}0 z~!R`8jZ\.ND?MD=𰸸׼5rJ!~i|5.%fBѯ|{׿ m R BWAK0 0:a_^^R T t( x^aAp6Q|wFt>;e_@IB*(CE\xPJܹsrFzEn6r9|{C^aCJ(PQ~0 "fSEyf~k?"`}}=~=Mn׾E\ۧ]y|c~;lF-r677jt&FAՁ, baP(""ĉӧjf'I~TJm`0 h4eY_Bf{J)x(P_̑#Gb~nN9F` )G,,,H=N"R_eY " ~=I;wn_y<ϻL̏**F ᠙0J=ǘFbrvw_>&''S &X*a)0Y,G `yye}( 022xР ^|ET*u:{8 ད(`0 y^|'3O(Pױegwvx0== zez`1 ()w|:%#`f,C V zNB0P"Ncxx333/r PדcD3D%Ԧ`8踮D4wgi݁z|ggg_1Gw&T̥RPR¶ma!B>-C6vD %R :j<4rH9`vvvocii)ɀer@FZ7`0 L&03fwEA]AjvwG011zWRaM{$t"yg0.&01##IO@w&@G Gw+ /&*ia?5H0 W!zd20{h<VnApםw~155ٕR|RJDŽP`u eY>,Kv>y@I1V^Ϙt:hr\ӻߎ??Hjz{lP ~hw:I؎ )% c 92T*/&}.AD\.ò,d2X!@//n3 p]b|5?_F ëFQmZ#ށ=]| ]I7}7>al}D@Kێ0 u?qX( A Ccc2DRg[gYt:ض QՐNaYV0~~ 4]D@$NX˲DīY`0 ~"1oݎ6} C JCJ!Y#J J@W`BĀ!D a LMNVR)'>lFp]}j5Xt: qo>x饗(`W] kbYְml6_"`x#|fXGGG1;;n߶,ό0 xU^7 e4H0ecjjjz 7j, T dB|c=ܿj!CnܹP(t|u< ^mA߉5^iu T*pyJØLAP $OR;XNaOh A%xj8Bp9 kbee% R qdO>.; u#g {t~oo] ZG"n"NF ÏћHRN;N>Q lJ%b@/'@pf zKKt|$ڭ&VVWJt۶ "BӁyXYYA:md2f=W|(qr?!߽VJ!]w!iFq_jZ``0艀fL& .t:tL ֝q7'eӮ*:NERhZ"a!}St:X^ZBK?c(}B!YNowsRk{3m#ް74Bmf$# G&GB>GTk8waxdJ J@%5}KL53@E 0@@X mcfz۵<(Т!*2a6R2̾׿K㟰#x89332LOQ&!I۶z5# GG}~(i΍hx177X' u>Ecr~PPQ&@w˨{I]oe خQn#ڝާ0ez[ ®k}Yo ~=ke,,˞8_#xju~K å|>Ͻ(jpe9rG#*20@U9 K0딿 L@|p\FZO !Bja}}=pgWMs>я_?ݢA)'OeG0k,:8΃?A# GԖroAۋzVqeLNNt>(EBA0 |:}awF.CP*pS)yV6J8RJlnn^cll Bu?l5qF5ߧs\Ξ={"Cquxx˝0 C?"B̼,fAV?XBDYYLNq{=3`W@o$ByR\7PV@(q&Rhq+aW='!owl>9!J}{Ο?w[ kE`0 ?xڶByfT*,--H)C3E&@abH%B Sau\=z z z ?, A$>ַлk^B?2._vݯmoo?a`0L \}`RҥK8q$l]Ԟj 1E" @u16vh4^UlmmN{E@wW~W}hߟ~7p̙d:3<>``0xe|ulhqE\8a>BIi11 QC@ހx]0 +t a[ h8=5JzwAkB ns]BK/ԗ!?2'Z>"xG?g7׽umB/v(='m!t  Xޣ2Pu]AON(kͺ;O|=x;`Yo#bH)Zm`0 BxT!Ļ#/N8˲}b$lNGwGP&I} ȶ166JFs&@)jVuޔY??u7V_NnBGJj`Fde!~]YYAy!t&C!aTɈR!POaqXt|]MLT*z 2qHD^SJիt:IG*bGT{`(* Z@`g0v@ CX[[Gټ DRINtS ns 侟(Ptc:kmY8~ ǣttW\ŋވ^f~ۿ 籽(FeYj~K0 |"t6]`#t"2,9xXJj 0 vNR(Z-؎zt)|; ʍf' wy'>яb||RJ|Dž j$xeYbxP(BAE, bQWg )g [߈Nǃ>!ya6'N-R "@ ]#:5<_q̙kN)~'~)qll •+W066W~?BCCCV?3GuRM\. 233S`C)ADkJMaRd ORp]NDaŋ(INaH p((ؖУP`bm-a> Rb}}gpػh~ilۆm<vR |lvg/Eloo'nZ%, a"%DF"z~7"ۓ]W}k>}NԴ)1L(4!O}[$ ޥdY۶9cEdYEۄ 婟s4TKE+CTO?4`oah6`!2lll0 8'O9U.y,..bqqa[897JAĻ0 \# qcaavisY1 9( VYi&d[( o`qqqV&RoH)$ ס:'޶k`AZWpy? Hq,lG4ᣊk׮abbu]y3v/\!s ؟ȋBJ\&o RB4MAӴK)E9G|x lll@84tW o's8 4I@ @8?Rˇ&MS,..bnnZ>! pAJ04dY^62@4I! \"7AcS^?3Mv{(Yamm ahonmmBJ ۶O}e}rclsIAG&²s土;j&똝m)n@AseyX?x¯;U^~aY־_=Qacc4۾N`vv=Μ9S]az]IA y1>٣<6",,,Z&Bԋp4MGĐR,H)`&|,}::7m79(իW9{^8sk$ ,wum?s 6yS$ Hl[9vzK !nܸ9ض 4DBissYguS3':38DCĵxᇏuYZFxK/ dIp[ccc_;4 b7ڶ}1v3t077]RTR H-|pҥ;^e~;En5u,\FEQs^ [򗿌(`2SRG&zwF@A^"891&^͝e0 Ycaa|)\reυ=;c`ih4Gaܴ.Fqc~~?0+ַU3F˲jc"53#px  j:ӌ<6 C㮓'aY6$k??֞'oAVQP mGɓ' 2wg_Ƈ>!LN|Geuùs簽4Mq-, eA483X[,֥_`8t:HdHX0M>(^z?ŽkäO{wAor%̽j~ or>ǎç?i=ȲvIDATS#RJ(*5VȲ hZ(r@-`]>iuAQ0 cǎ>@E<{A+s~EӴ1-@nmm! [N*p4[|IC4)9"G$0 yAH`ll qckkP(Μ9Q?~h׳ޓz-T _} o"d/xLAiO1Ft]1K @׻%8 CNJe z!<#p]  1 4 k""lnn"#gT@aqIXu3Iqq 2lnnvͬzp?R~ )|uff攮%MSzwPF9~0=<#?]c(:̙30MEQ IH@JQIY#^M9gOgU}N*ci(mo)+!18Ɨ=￱)%]1 P NAm+)yK{Н_*<;;q+ӻ@ NơY1$iٳh6r l4z!Pzxnt:# Ct]|_7n܀, 7 2AĿBoLؙy߹W})|@ݮ `# CEj?Ki ,7OsssLbm}*EQzWK4t]s=8wVWWq%ܸq.]§>)((P~M1p#F h^5 yK6 2Rg@QHpƐKVws1>1G$C),ˆyC4? xgp%,//C AGysss^0 $ 677!@Gwb4EQ8v9w?1@ M1ƞ`w\(~~ i¶miZicibbb&FGGa[*N4M)Uixi! #ﺮSN40Li# ,,,bii v3\à)l W{fctl bv8&'x MӺgA}~>N _$ _xZ"1QHճʉOz@V~Jp/Qi"I}ضfsgN߇v{ Y$Ͱ54iyP}wjុp}= iz߾'zJDQ(PE9M[X[[nW| A$RgƘ p\ tz._FM{y>h#eY !ʱ0 7` , gΜ{{7F[-0Αe94zmcbb##Mya85Yµ3gϡ_~_h6|~IPgv@q$ p]nɚ9 e _5i?RcccnF1V5:6 ӼP-)EA]^o(o&^s94#\B oiqjj͑&>4hc!O7Pzp ?W_Ûo'xbs...aֶk׮ .6VVV(rJi:H}6QP#2MO8>A/ohvsc5*ſlGʓ$AQ, mDQX(a055sᮻN,HQ׮a D^n9oY ]z yD$4@id!8Rϔ9`6Lӄa'jT"X}F;kH)ðO xG1+pg Ţ."؂iڮ89q055UY ! `lV~Ӵ`l.W U3a%`[wkױ Qz`>r1ض]UP}5 ++d5ET(W$ w$m_{ءK)ӯaZTvꗁxddgϞ$t݀[ppH MӪ@lAup^84^aLDrqsjD&0:E0D.=՝icaWDŋ \׭}TP ✏@A4Q`Pql-ӀVu;,ʅ;kkKz0,uA4E1}8 RJ}H)166V^@N<ϿJAA0~kH:q0-Gg2 q`aaKKHӴn˲t(P !Njau]GEQ`~~Oi(2 MS4 0| AwBtNa04V?DHAnw ~kk눢i""E >(̂*()}p Y?)^ZoNa4Mq\.1My45)VWWy qi}9AP @QQ !lۆ8HӴ.G(r2%@A+Rf A'"[vWյ5xW}jXzUӝj"si ]>4!F_y߬>22R7 :I<T  @^yömdi'"}zȲ a*jc(3iAU_'PeJiWVy]~}a6,:T AqG ai$΁~k PM{}u]f_e`!sQ>wUWM{4M躮?o)%qE,//#JCfY3`tt$ ;0$ʥ?z^$iT@ URֆ=1;ՖBe[<((Pه7n`eeqˍ 84 333`ONN$ ;M)v]/\~=:  xB&A^mffnpc3™(NV?.u^M (8J4앑x7|@~0An@T}u\ɓ,IS416S 8 `-63Pj@Ԩ:p}P9̓Ó ~%a>7z }N<$I ]]cR a0` @1fa>UW'~]˝q^ U&Py _fYoܸq(/A+fvvVB1J 16` X*躞yXRRw|{aa{IAį)1pΛ@xc$&3YX{ \[XX AH`'Nx[h>IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/quit1.png0000644000000000000000000000013213215206021016561 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/quit1.png0000644000175000001440000000033013215206021017407 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8RA +|?3gM 3U77u-[@<0X}&+^G-ةTEȟAG[v ,29kw';saE浶Dn7b rs>'`65IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/play1.png0000644000000000000000000000013213215206021016544 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/play1.png0000644000175000001440000000040013215206021017370 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME#-IDAT8˭ Dmt ]C:~BJ%ɻpm7-)Y0"BFxQfwwF^c4 \$gci1u6 5ؿDXk#3]L 6^LBIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporti_64x64.png0000644000000000000000000000013213215206021017703 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporti_64x64.png0000644000175000001440000000335413215206021020542 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqnvwvEqsprtqzsuruwtwyvxzwxly{xzy{}z}|]}f~}~rȇщGzՍj^{qitɵĐ¾ÿͱ|tRNS@fIDATxolEov R.bicN,2K&& GaSmiɘh)րSLD@(i^ʝѓ&l{kػ6qvvޛ7o:Y}j  >t@Nơch8Zz "#s KwuI>玦Wo(&b~.QUxlIvcRgw%Kx)ݏ/ :>7X !'GiǠCidU( wf1:(F40L=sTr$&yy"q b}_!`xáX(>2@,Hw(9 &l(61:IcR[1`98r >S,8T̞u=a:0ٗюu#{J * ԁhO w0"6<|",df;q*!-qj"0$X@ ʢpĥb)Kp3O8='bfBwU2!N0h4:LjQu9tF ԑ5p#$k&ճhPJXH_ap)Yk%SC"U*6vSB ֠þtӄpJho i?&Fm}aA(vӛ{}BrOvݾwpB+ϭ"7G( 罸oo>#l 'v^Xʫbˠ=aU/qBE_x뷟 C͹hΞo}{4K]!/J|[?Jb!K.uO͜g^[ ǿ,{-IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/copy1.png0000644000000000000000000000013213215206021016551 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/copy1.png0000644000175000001440000000050513215206021017403 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME9aJjIDAT8˭ 0Dߢh *pHlG-,8_#Y̬ ?BT抪z,j)6ZahfF2"pC!Ϗ4@B0KR*pYtEmۍF~8 DC{ f&3=i㐇0E^2%X8QP_ThtbIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/about1.png0000644000000000000000000000013213215206021016711 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/images/about1.png0000644000175000001440000000140413215206021017542 0ustar00rncbcusers00000000000000PNG  IHDRaIDATxڍKHTQƿsx3EZ9s)hBeMPj6AM AYQqtG^iXWsQg[YfEP}.# 'E]ӵѰTBU@DZT n/ wzёo0x))ABt2gNezIOvNv=,Z]|ԼxU|p$XlK/+Nwcf1\r/TjWKrcܲ>v.HsuC2+^m{ qM5oUHFIPTcja5=<ÚeU@ nݝ9jw㉯-=?`s3NyN&4 L5%wgC5r|M%`Xo,_4E &DUT73 owe?a%27Yf>\bĈgyV$&^>[\$1 T2r\E\q9k&=m B0?ot7vl>#ќ >kQxajuzd ǒQb2X{<Ӑ*Od&DUSl.rYMPiX2JS ϛwzM 2|KS?m`X~]}tjTUzxoX.; IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpno_64x64.png0000644000000000000000000000013213215206021020233 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpno_64x64.png0000644000175000001440000000343513215206021021072 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE       #)/!#!2&( $1!+B$"&/!# %4-D'(,4)8&(&)+(.*)4A+-*1:?D,.,>^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\Vf Xbp[_elGHFJHLTH4fJLJddxg'YuMOLhOQO bwenhjmRTQ5`faS9v|nqs8_lTVSut}~ yuw/j[]Zk\Bd]W-q`b_k`Oo`Fbda`egscC$}|ueE?xw4~hig!jlinlplnknpmoqn-ހoNqsp(X~Cwyvxzw#7z|yztA|~{}|(}f{~}?n 􄆃xȍɏ!ԓ8Χ^}8絷ɵɩ÷ľnʰϵTbtRNS@fIDATx՗mlEva^ZDBYGQ7!警-4`-R5G,[I()150xRShu ), {?ܻwgSw/̂Γ 覽+Nu+*d0ٶDg\Wc"#ژ)fed @YPxdj)(oB'ɿsdTZ#3%Dө[ʳ2KTsJZVZ] 2n;)e,25ˊ/ ~ϧtȐKށB&(Ή}py*U*yx͚5gMkvm 9b$D8/[isO>\Twz-[Y )ڋ _=6Ծ >ky&+ p9 1|huu@lٿv=I!>.'@qBhaaan}l[;oAK#'哪`G^FM,^S$1ymoooy۲ ՓkE}ȟ{oZ#;+HȄ ܀*l2bsϝ)\ DMLK\HHd<m//HH =vo 8M%@0xիW{J6reF#se98GbIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/stop1.png0000644000000000000000000000013213215206021016564 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/stop1.png0000644000175000001440000000032213215206021017413 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME"MdRIDAT8c`T?b0=L#DZt! 5`$0102ؓ`Ad@"2ś'IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlni_64x64.png0000644000000000000000000000013213215206021020221 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlni_64x64.png0000644000175000001440000000332413215206021021055 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[WvZtY%kd[]Znbg`2k\BYl_3d]W\xavd`b_k`Oo`Fjj fbdaf`egscCueEurchhigzvmkmjj/mnlpgytmolw joqnoN~wy;qsp{q0~~}3vxu}xzwSuz|yzt&}|}f{ >}?3nÃraC2ŏ5򾻳A۞I(\mfl|$r_|',! }ˊ!A Qr94>킰 x0XQ˫4=8Wi- :tBtj/w6 t!!@tjQCu  ":09hz̸,2;8Y8A 7`&N-!IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aclienti_32x32.png0000644000000000000000000000013213215206021020147 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/images/aclienti_32x32.png0000644000175000001440000000310613215206021021001 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE03'" ( - 27;?9 BEINP34.75)TM6:,X[<:.^<=;>=6?@.g#ACA e&m"j er&m#JL9v".a"w*6d })t/w+ ~"(r!KZK4m%*VUMTUSWXE/ZYR[\I1({6Yan}u{^'7)wuJAl{{;CGfJUEoP؈E, ؜R8I´Ŵڰșڲɭɳ5ͣɻX_F/uiҢҩKԱXخڶ}ؼqT۫ڷP9ߵuJjs:^(tRNS@fIDATxc` 8#07wț7O ^x(֭[N:rΝ;7eS}| d?uMىAVZJ@ #'!yXo߾=5o.θZ:} b•'=zˁ'%Y.5QW>vLM><|s]3Vu$##q o/zu{߼{nG{}kۡC@F?YܹxڴƊt_ ac&>=뗯xpGE}xx!~q+IBzUJ}Sx_5qb`IPrNr*]YiO<tBނeE3N.Bj =v^E#ILsDX,).>'¼^^qr6nk.^TRCw,漀<%18 *ݨBBV9bu*ZU FN zū6Frཀ F+vr^IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/rewind1.png0000644000000000000000000000013213215206021017067 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/rewind1.png0000644000175000001440000000040713215206021017722 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME%:?rIDAT8˭ E_1Lcnw;S=&jPJ @ZMQmި[wHT{{CEyw@E :usXO@?nTxB P dO65dy`ؽC@`AO#LIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/acliento_64x64.png0000644000000000000000000000013213215206021020167 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/acliento_64x64.png0000644000175000001440000000604413215206021021025 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTEп # *16;?HM((!RK#W]J+b!h U)76*l$r(x']5n1~,@B5+P=.BB>^9&EF4/{7.JG;u@]N403@5fI;nO TRESTAUVR@ ?CDlUIXP^_LOcdPMfeLZq^V_heXegf^efdWoW+wjejsrXqr^b^6tqivtgofCl{{gBn!>}pn3ezqRy pIo5pO3%x{XMugŊmĊ0bǍX,Njpǡ5¦|Ŕ{Ϩ_ӥ(͜nׯXزϟԫJȥ޼Өܻܺ%;vóͲ5“Aڶl LݸtŭUŵɦʠڿ̜ø2`nРө` ӰokS5˽+}Я٩ڶGيپܲڸ֬^rnUHxogtRNS@fIDATxWkTSW!`I Q$j-VJGARE@jG)/Ay&R @- Bǘghɳ?t9k|^XwϹ{Ln30wLccB7#o*Lgi*6P HR @,Յގv~⩸I,"H$%J^WW3rQaLv`} K p'߄rig۫6`}VXppp43#0L&s˹vb]`kw*+eff&'GEݻF}ɉdG"I$';5|1 aF`bRdM( 54T g=HR)THv66VllNL&ʲ3Aݷ L/2dB g 69ghRk``H~.3! .H6VD ~6 $v' hO*@dH$(糹 2TB GNFƍo@]T*%$ H? SconE]6\ ^ c o 3:>OEF]yй2 Zl ^#,<{_OJϏ?ydXX_ϟ|6S@`8=~׷Ջ rOB6mEsfCjPA0`~)yUCݯܹ+CY3111gjO"6 @/}E1k56,@xkZ10ҥ<=ΧXoN@ez-:9P ,i@(^jR=;ͅmū!~a)#ƆzZ/Xel v4/4D_';YӇP70[&D $3GKBҿrףW@CC}q ,TO'|:P=J;mn-,8`@SѨu%L AWK=^uɶ ~u> 40V&R Un^ET֬>,X 3uA.eAJY ,+ѨpXGPltHJЀZ VCs:WJ&Iɔ &CӋ tf5VsLSB-mjV3 |G{0C+C=>3466C$s!a1H|m_!Ǐ+_@e!VEqqd2`[{`BIȔ3Z19EUUiuuU>F̬SmpZ͛5-\Tr"N"@50i1OFL&uwAך&,3 FaHJJrR8ӧO#[Z,ࠃ.]9sTE a=n7?kZ""~YDg"XPmm tDD\ 9shdC55Qee%'wN8AYYY<55ՑH$)Y#MbP(V""P(ۊΝۼ~PT*-,(( XwyyyDD'P"4Cv)+3@j #pvRE jz$t:fO@v{IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporto.png0000644000000000000000000000013213215206021017036 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporto.png0000644000175000001440000000032513215206021017670 0ustar00rncbcusers00000000000000PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}Q :tRNS@fMIDATx}I@@0 g]#U)8D'g Թψ¥`Âmbz[_ ?fc._sNkY\JIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/device1.png0000644000000000000000000000013213215206021017036 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/device1.png0000644000175000001440000000076613215206021017701 0ustar00rncbcusers00000000000000PNG  IHDR szzIDATX;N@DQBC>'ٕ@#Hg9@n%Rxl؉!YAߥW6iDcLoRZpOg}#pů>8ZOD5"҉gι f1XYW`& p Xw+ ܴע"εS(љB192oH~M ǹeiw`],Ƙ;-<֒nU LxQ$S{YREe.`Sb$V|fF(UKRD^f R`(f )PC}>ߡ%mk t1u8ϓҜf߷!LExyXd u\I6ܐ1m9AlHW "!dIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mclienti_32x32.png0000644000000000000000000000013213215206021020163 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mclienti_32x32.png0000644000175000001440000000313213215206021021014 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE+2' " ( -0 ""7:<"-#AEI21'M JQE&/62450V97+6:,1=3Z\ 3>9>;/<=;>=6`?@.^(d 1H69E;g#ACA!W0i/O9n"?KAi,*Z9s'CKG `8JL9>QEu)y%o7HPL8[ADSMBUIt/IUJ++VUMTUS*K\J5NZPWXE2J]QRZVJaNZYR[\I&z;2,PeMY_VLhO_`MUd^WdY2JnS4}Q1M\i^KuVghUWqRAYq]K|YG\BTgpl4OqpWNYIivkD_N`JfmzowxdK]pyu>[}~jbuv5Yzanu{yum|yEoqx}mv|_~voǎwƎŜĥѠРǩ¶ƺ´Ŵڰșӵٱ˿ɰӼŻ̢ɻܼЦҢԪձϼɺִڰؼ۫ݹ۹:tRNS@fIDATxc` _~o >~|(Aٳg=sd?gMTZ**r"+.]y`7g+ {ǎ꬯+o r1ٟyolee(r ؄^~}sg0<im+'x؄_;6ɮHג1iǏ_9kf; GѴu֓3W8u`޵lr".y#uE''(olD[vw6޾qԾkg~bؖN?4`ńΚbqHp9[ΛXhrl@q[+4yY &<nzcsD]??7;+#DQ@ic*a#I;<@S ?_m 6Q3f0 ߿+JIM sw =q8Uo?~|WO=ztٳ^:I+m[jժmmZaӚ5 , e(_ۗPnΌ%wǧ'M*=wl۰j՜Tj߼ɓw\tȲ@^^ fgjIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporto_32x32.png0000644000000000000000000000013213215206021017677 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporto_32x32.png0000644000175000001440000000150713215206021020534 0ustar00rncbcusers00000000000000PNG  IHDR DPLTEiii  '$ )  $" $" """###$$$)&%%%('/)1+,,,6/ ...70;3 222320333>5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhyiJmmmnnnoooqqqrrr{xDuuuvmyyy{{{pt~ÈpȰɱyMtRNS@fIDATxc`0*̈́O^NIbo mJS*ϑX6uvT@}m6y6'`gHjM"i]f{DeWO\`s?6e, Rbkvb;5Y ua,򳦤9˫Hb@ $_#8pX^q.` ẉx\D晉㖷l-S^?eR1Ny<3.Yrdw7#Ϡ"'۔zJ/tßiI2[([IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/xactivating1.png0000644000000000000000000000013213215206021020120 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/xactivating1.png0000644000175000001440000000046413215206021020756 0ustar00rncbcusers00000000000000PNG  IHDRĴl;IDATx퓱j@ pLf;mݴ!<&Apkv)2.N011K:tw `ѢEsAD\zfvR&_^@RDڔR7TJ9BD3vDT;=#xJ#^抈KswswNJ{e§|#tyS@U$4 <2BDcD9o^B8VUB8+}(*gm/ IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/acliento.png0000644000000000000000000000013213215206021017314 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.522766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/acliento.png0000644000175000001440000000025213215206021020145 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH3 tRNS@fCIDATxc`c0c0q C 0 & @ 5(#))- PSSQSKɤ!ەpWJzDIIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlno_64x64.png0000644000000000000000000000013213215206021020227 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlno_64x64.png0000644000175000001440000000343713215206021021070 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[WvZtY%kd[]Znbg`2k\BYl_3d]W\xavd`b_k`Oo`Fjj fbdaf`egscCueEurchhigzvmkmjj/mnlpgytmolw joqnoN~wy;qsp{q0~~}3vxu}xzwSuz|yzt&}|}f{ >}?3nÃr&{5D,9>-ٿ-pwVʹu\f]JdžS_WlZ$iW7(Lʶ2?=Vt6A%{?_~ ]}-X^],Y~rG̼t \U !4:p9((KY\@@)'sFуߩg +#׎]V/gDⳀʷqgQFaݷòڗ4QH׋ E$wkZ__8@hSbsErᤖ_ |P++xíH(BB<čۃJO;ͥf5tͥj`ygr=g[ܩ&,KlMf=+ S`Uj{Db-}f&F |#̝Mͷ~Y}'ʲY-zVyfTB ՞ [+IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/connect1.png0000644000000000000000000000013213215206021017230 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/connect1.png0000644000175000001440000000066413215206021020070 0ustar00rncbcusers00000000000000PNG  IHDRa{IDATxœK(DaJlQl$EYBsY) IbEJp)$& ~1h8̌soL#_}_1+_dZ3wj&.Xݞ`r>>f] &cx~#S@Vlp@;p<"V@@&sb6.XR;9+o apj-SvFLZ`+Zg<'p<]#H/g3>^n-wXQ^ݹ4Mv8lCme/T$HEGm+`Ec-p6d.c]N nXQjutY A)P&h1(@ߧP'iW_s vCBt-V`YIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpni_64x64.png0000644000000000000000000000013213215206021020225 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpni_64x64.png0000644000175000001440000000333513215206021021063 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE         #)/!#!2&( $1!+B$"&/!# %4-D'(,4)8&(&)+(.*)4A+-*1:?D,.,>^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\Vf Xbp[_elGHFJHLTH4fJLJddxg'YuMOLhOQO bwenhjmRTQ5`faS9v|nqs8_lTVSut}~ yuw/j[]Zk\Bd]W-q`b_k`Oo`Fbda`egscC$}|ueE?xw4~hig!jlinlplnknpmoqn-ހoNqsp(X~Cwyvxzw#7z|yztA|~{}|(}f{~}?n 􄆃xȍɏ!ԓ8Χ^}8絷ɵɩ÷ľnʰϵgftRNS@fIDATxݗ{LGqgo؁3W5-F ,AhZZZmЭ 5JQPc<1רسG ۙ_~L\ciX#ys,^F,Sm4B\2qj_=87/2;([ÄVغ01`w8\W GFZg]NLKϏX߮V,%aNl4yEV %P;fq^6ȍ9ѡ~V7U~Zvy09ŗ(JvIL {[RR5ۈKp_c%-$Mᕗ9l(xdϛ>QEslJ7@:sc= tٓGpڱ4#H\F,͚hHoAs i6|5Y5pI !88( =7*&PNIU5s҇%"Qeu;,xTfW}AM@V9?l 3pj2Ge vpnjB|bR֎HvbpԌW!^IT /,A6~,E!CP,69wIlw9?I,éQ nG:D'6.PYXs_,MƘE: `,`cE-2# .U$t Ē`+ g/^zZL8 ĶZΕrIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/xstarted1.png0000644000000000000000000000012713215206021017441 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/images/xstarted1.png0000644000175000001440000000047613215206021020276 0ustar00rncbcusers00000000000000PNG  IHDRĴl;IDATx!o0*#Rã'叴*;Hæ4TٓGkըԡ:?;@AT5.Y:.Z:.DD=Z=,LNHG=IH=LK=ML=ON=QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trI00ws=yu=MA{w=yvI}x:}x={wI}|4z= |=~=}I}I==H =:I==:ZLZK$E==IG==&:=I==U:===Y,:A-1iI:I:j1,:-I}-.|º)|Iľ+Ⱦ:kºhǿI¼jI:h¾I:3I?ÉAIlj:ˈ:ABtRNS@fIDATxc`q~N`iSz&u64i0L<),"'.SޟoWfaɊ W x7p`9&W,V?uL2OgicA2{pXC#1>H,`^l窢# 0fί 25 Xؚp[Xp 4Ue$Dx ZHM6rIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mclienti.png0000644000000000000000000000013213215206021017322 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/mclienti.png0000644000175000001440000000037513215206021020161 0ustar00rncbcusers00000000000000PNG  IHDR(-S?PLTE@@@LLLQQQYYY]]]```kkklllwwwxxx䞳tRNS@flIDATx]  QtV{A`Ÿ!]C#N0!7eej@…d"39(p(l.,Tk8d "^J}k} 5TIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mclienti_64x64.png0000644000000000000000000000013213215206021020175 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mclienti_64x64.png0000644000175000001440000000626413215206021021037 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE  " & !*-0 '37$$91;!,#@0%C,+#EHM*5,&8,RP74)/:1WM,6:,[^T( \!8B>e!8D:b@B5,N5h$BB=Z26KERM~*2b@5`DIUJGWFTRE,STAx8)OWSTVS/@hNS`UV`[^_L-SgY26ebUcdPNmYfeL<]g`gf^efd@\rdHcpefojppisrXqr^dxk,RuselvqkxlE_!Lq~s|zl`qu~y~b||u/Y>`^tw}o}}iwxauMnAf}xumZtczNtzzc|umŌ{ʒěΝ˪ҥ“ͯĸ±׮ŭɼɦʠȦ̜ܺӿͼРөӯԲٵ٩ܲڽڷߵ߼  BT5tRNS@f hIDATxWkTSP5("@G#F`#6>Q;L5XQ" A IBxHL 1Q BZ=_Kǟ]]߽Y+9d޼WQQQ1+1[7*z̷YHEV^ \ |T %냣7W%))1H%pI%XHb!z1+:f]OLfy9ș+c;::ښgv!ca"##""BBBmNNkZY,--q+)kPѶE`HhhAhh{VgNҀlSO)fl0 vA=ٞUֺ4 ruupp15r枖$Uȴ1'Jie:Ar`ix:8<8FIB~ y3eqVya͚^CBi)dDjN֞@Hzuz]gL(!wao ɞ|&,N8yłXYt >BȭQPa׳U A_Bl`wUrT &䴐JKi)I#YEgA 5#>0A7sՐ 4QyEEG@?__Щ4klZ`Y ;tIufNdr3ӯ]UEg 9./8rN#(tS 2) D k]5`bH^tAʹ籫ꁁA/22) d).JiX}}.5i/>|U.LTBԂ@EKJx?KzL@F&Xd~ƹ$@(6&CPiyi2)\c0:'\5 Ri ngP o3.h&C80D"Bt40 bt5Y$%@pzG,` x.p \aj -֖US)`|Hq&ʠY k2E6j) ==텠`®QP!Ok\P`$0&c Q s %BTo #؃F~FQ(zzKt.Ԕ7,K> _!ӲE. 3e a0H %QT3PSPJAFB\)D]53xeJX{o?#~OO{8+K Pdz|hPevμݝ7_Oq+Ke .@F֜1Bt+”P+x1(ȀucmEWH8ԔT?p>)55GT: ) @ٳg|9O4  b㞣a8ގ6NAeqpUbр90=)P \e|Zֽ7/WvÏ&:s(fAS':xā!l >:xɄY0'1Q U}4,KDj~{_N=>`jL.?T2? OPSlcAee.0:~0:z/Ǻ!8Jt"؉11(q[|7n\S!74xxQSs'O_Fs}=zO(έwkpC):{z:{;z.jAԀݼvAO\՛YYYY7Ku4DGn >i -9=m߆)5Ur-IIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporto_64x64.png0000644000000000000000000000013213215206021017711 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporto_64x64.png0000644000175000001440000000337113215206021020547 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqnvwvEqsprtqzsuruwtwyvxzwxly{xzy{}z}|]}f~}~rȇщGzՍj^{qitɵĐ¾ÿͱ|tRNS@fIDATxmEwv8ž^yHؘJNPRoԥ6\+ =DVF϶VSyP/=n) MIL7k7bci`%^ү'K>L]E}uui&wB>h޷a ldy;y 6&ִw<ȼ;ׯ|N4Ù=w|xę,4vóSBKhΞ ~쌣^3G^+̣{b_} J?۬b+ 'W/Z6=?C*P˯~2}ϞC_O~2Q>.?_ͯ61vWp?B*"ڥ8,٧ Xu&\NPg((&Kn=/ݵoU-R?x ! r%7˰q\/t?s5@iDaQd`­6`ی` $61j@ĠPZ2bEéd|6b_㌇WU4,‹񺕁y;ՈW:0 wmFMSՂo6?gZk 9?@?GihQl\şgAoŻ+lh2yר^0ؔ2,|fDc~²uf~ ~_(USj?M@X>eZnt[#_~UyC|K;* br#O8~㑑w^oݾ:U]9~M{#I^ȳOGʄ?CcحK|KJ v)<T?<ʹwSaIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/xactive1.png0000644000000000000000000000013213215206021017242 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/xactive1.png0000644000175000001440000000050613215206021020075 0ustar00rncbcusers00000000000000PNG  IHDRĴl; IDATx1k0_&- 7w=vn[<xLW֮՚H!HE]lHcbtۄ {E];D̥1fB:I֥1ƼcVk]N"zoϔ׫"(NQݿcc3"3J_J)01cfc 1lAa{pswsMJiRs9eqK'ZkH߼ZZ"V]-9x'5SIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/edit1.png0000644000000000000000000000013213215206021016524 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/edit1.png0000644000175000001440000000033513215206021017357 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8 ȥP&E1yKgV⁴sp'(7V@)%Ia8ڶÿv{fFn%03UT|.@SJvHzPs\_/@:xex+< \y*IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/apply1.png0000644000000000000000000000013213215206021016724 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/apply1.png0000644000175000001440000000040713215206021017557 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  d_tIME|$:IDAT8͓ G6 Xee`6  '1n G۲o@KB0Fnfyz&յ\ۧ}Ǣ hq#gB*9[~p[ߍxj>;u+XG6IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlto_64x64.png0000644000000000000000000000013213215206021020235 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlto_64x64.png0000644000175000001440000000372013215206021021071 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE      !""" !&%"$!*,&(%+*., ",-/0,-+34./-13#4455.24241.89*;;574>=:<==59;=;9:8CA6?0<=;FC;?A7BC>@>EEGIBA:5GFEB6AC@:J:GH6MOCGIEGD;MMJIB=ONBMNIKHTUUVEPPTRATHLNKSR$RQ9[ZPROJUV\\FXX^^B\ZZ] E_]WYVec]_;geN`_bd []ZLgYQeXec.Lfcki_a^ffBaD` V| /U2`j!vov otU0aPx?p\\?\9qi\^_7O-#?]'ܖI1A71t"˵@•z1p|+xr!NYG+k-rdfo vr'I$T !~e.uX|RQ^( 8Q&"r`O,9T`ƬA13gkY.Fm2Af `m{(%MR,.@̪g@9gJݲ`99d)$,L.3$)D4$mDC&Yqٞ9ecIf%< $IoeC )F-zY dtP"*#''˩=IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/qjackctl.blend0000644000000000000000000000013213215206021017612 xustar0030 mtime=1513425937.527766939 30 atime=1513425937.525766939 30 ctime=1513425937.527766939 qjackctl-0.5.0/src/images/qjackctl.blend0000644000175000001440000062517613215206021020465 0ustar00rncbcusers00000000000000]`TU2eƲ.kYuF&R $D$T>tz( !@BHEuU%?ͼy UO}quot/mHVp>3Hp2l`Eo zP=zkPn}Z0ۖS4sLZh\֮]K7nSJDիݟMҀ#ɸ0 % ~ky&SȮ /JMM%K(Uoذ9º` 4Fu <7b d~_q)rmw01rQ2(`Ak֬qa/裏hժ\92 OÆ%ɬ1c驺;tmhh.ڵ>Co s?ƾx-[&Z[O;v[p }]oyE ͻ{Ɍ?֭K{졓'O*I#㽡'@Tល[ VciԳ3\W1B}_z%܁u]G_==3J{Ϭ>l#o&^-_߀|+2K5k~,Siܹ{/}?{`jժE7|3m۶]5|Jg=!CR^^Z +hΜ4'#+/q 6LĞ/}l5qȽ{[n|˲9';h {fXD'hilqx28qС 9s(`/͛7'EJ7º&Z|-;v}S:t8x?Eg[h:lDC:{#opEvC ),, _lϕuyhĉʞo~'?㏿SFM r^uC]6i%lbE ť\林4/((`[ܗ;6o?yOa.뮻^z3Mb{K_Z[9rꫯVw_J_~bK_'?I)^gz՞5WU&)7uqe3osO.?\rcjp<]_a\СCOӌ/Vҗ<c~؏Ee[kp?¯cm`uV:x }gr믿G|Y1ɓ1؏g׳& V1JHQl_blٲdӧUߞ]taΑOtŮL-8أ|3 '&c-\7{O_ئO{A߷Ӧ{׳ό}%]@2^o=(xjc_|wcOV9o Om=D=SERbD/q$NY CS2ؘ߻w/~\oTcXTYŞz(?y }@-6(2(%%fϞ/ߦSN_''a?f̼ U8o厗~Тd5#˚GuY"1t⧫+s37`W 8 ȿ;`4h<%k|bh>,w 4j\jߞ`%~Iy˃Msy!~?KI=?~wx>p'e]k3.&n ?b&');vy>Gag?mY+;9=Ta=lޅ}c?2ڵ^p ?8Q5"U9N7?^lG߷`u`r?'c9Fac/6q ?cz\\c_~"?K?>-V09YJv^/Qk~JC# {^':߂}zz.Ѿأ|am4{%YĿs`?r(|ѐy\ϑy\] n?a[=޳M7g[<؏Hr.?c1chlKԻ(0__9j>Gd X-󸂽ǔ>{}=>O[KGUQy7_0D2Аd;*&_D)ViiM4{V4=߬{SKd|l&S{=.K|'5x 6t>cP_VԯW 2K#Τqфq ye4i*6s=͚.IF'?e]u>Gd_MY:P_fͮHrY͵SԳw9d6fxJ0ƍCEɢ%{032 1j*m#EaoMYgm:r/دdg^]Q_pQQbB}oӧCiYF)m`%_̲9&ޘٗ:Y}U+?-ߪuavڶl`Xc/yVroef+:!؟rϸƞKGw1O4_~|}?C~ڧP:oI4q6k#͞-EWhmI2"M0/>1V=u؇<{}Z ʝ/~k^:/Ny wC$)0~?CtN:xlxx y8f;>-X6-]ž>SUTH6u܋]wޤƴhz31;VLv^/>/gƙ3'oNoLCV<5ڜQ6ݻђhА L:`Vf&e-GrЪ$xDpq^r{v(v]دeWDJ>gV< nNk4sNglqK3 rdl{?Ng۞u>G_߶%WIEg' {Ay>M?Owoim()zM=߂V? n4yz.Y }ޗ !ʶǾ[Il]l_s~6m{=@|=vtw ;ҧ{E(WVˊlVF}չJc*->?ft]T/,%{D32Wv]\`ߚ"-BwWf?F?#m|o^ޞy,َlBШh,oWVVayz璭+ fK.b۞e>Gq\~ˊv~Ӆ>;}eOfo`~W(sRsL,iv8BקûЈ/<6d? #c3n>yQlT]Wawr>Oc,Ooƞ{uw7?ߑD S[Y|>w+3%ge]r;ߐC[k>Q_2w_m{fġ % У>̷*\tu\tmo]}Ů|\^g|؞ى>>ڍzVcE^"iy޸- k/fϜԚÛc."b-en>Oi|wՉNoxoY+wO=/riQ;؏%6J]؏}&1~bd_r/}' l4|6' վ"le_1%-ԻgW:_[j] ]F .X)=Nijc.Oa/syz_IIM\Wc_.O24)C_Էk(^#hƐ}wo= M6sy>Mdgm o{=|y}!Ɍ.k/m{_<#s<=ߐy\u5g}דc?cvʮ'د-h় [/o/~{ل.,cטw(M3#u#}wՖ~Qϲoi6R Dw_W^˶=]ׅ=1s;r gO|uO%rߓP{~~=c5 ?[llBmw#D}Vd=ٮ.~z>Gy\q`t[߽C;s+ };bLچ5𚢆s=z^ebם¶cضh`Mk7ߖc_ݳ,WG[~aOyMLr//'n14\l',sloî5fqe_oh-i\ }Mtfk\rv=/<}~ƼGDj{yXq-MKΗc0/k z\m}~[ȽSgٮrd.oQu~5WjOiCTGsE<>'1S}ʼn8$ݒ(r/>ʮ5>Gd|ݘՆ[*7W:+>;YS[|~Y/Sv#r92kioXDju ^qy;kה9sa?_::#bW~:/0GZlMv ؟5ߎwcM}{ׂ_"r>;2w?I=;ۖ7~La:BWSxUWoVߖk~cZK~h>GgGmܽ׭>S/roKsʻ%E绰?ЕNmɽ7]~/{mMyb,؃&opZFFjGl;&s%:|߹d_]軰ǽ`Tۙ2\$7ts(/}gv=ߐy\=oߖ쉯Ga0oy3ָgCN))6w˚<Ɠ=C|wN ^ɣϵr뱶Zt~˱6 u_^1Ry ʘfNxE"}ϓ_ 5͑u؂'KľG_O}t#󷣍=ei`|W n")n v Ф+hcR?c|+?m^o}=%_{`^oeWPK/7kuY˂}寕e^o޳J-GN+<%F$Mkyg|~ԷgDv ^,Pݾzⳃ{أ|Y4 r*Q]FBsfӰyBJ{LswѬE[Na?X{/ 7c0{|ki!j,ݵDz5z_FJyhuklhCԿOTq#ݸo|te~(Oy칲U\e6d^oeqʃA?ǀ) h܄)4oJNQ^1+ R>.a>K;b=MvK^ l!sjX1+~&Ϥ7fubYZ*p鵘 6Kk7hmE7u"Xm~yMqʉxq~CR=Pg⥹4dT9L}}+ھO|I ߧyKh~$c;Оu#h>kV_ {sߎ}e/`/`ٟF<;~2 y?ɔFhe4l茢5=QƼZSH9m(8JWmk*eoEYjF(]s.krWOsq9)#8NOZ4qlZǚ.oѸ3h|"#(۰߿{;znIyS~+odgNc wã~zh3wL`(-WoҤY)i4w>{:=]L7(ߴ>mb'͜8{%Rbi:nܗ+?]e-^&8Y_i`elN̢9hѲ:3h@0Z >Z& 9. mTZMMdvKێNҺڵOsӖJkGbV >g`a/hAwP.[`pbL&3fќx9s8{^;u|Z~FN2:5VPs& mظ֮PmÓn?D[{'MO8`Bڼn6mX5e$hVrM^%yA* p/F37SN ZredӼ9f^}1>Z##fflY潱PyTЂ;.@gnO[u}Xr͚[H 4}ܥ#;3".ӟ5h؈dJJKlg9y?oy+hہ졜1R6Xr&L̢9S 3 :{ 4l/ys =ۼ=?q\߳`4&߼]OilJn95{)K)mVM{3%+vPp|3.:u̟6=ƌM}'ӄ1: ]E2fi^Sͧ7陔4mKw n3^THSwЧZϺ>22/I o /,#8Ѵi|1\4J;n\wn?βsQκEz+HoeOF_iu,oъ{x~p/KN[q&M)][@DAl27}Ri4c2Ja_3Pg zd#~ѺJ'|D3S3i%uIO|CoXypV8i 'fe](f小bz=fxd8*\Bv/ȦIoߍ3ЬY hbr0!Ҏ>*Z$kY&m*-sYޗw׀h{'|e>M߁d;~*a?fm$c,ʧomY+wl#8B󲶫ͽ ܯ.{:$շ_,;-}z#p|;~ƍ[ks]׏lG -7$yxV'O7}^Hu{ hcMPP6۟\rطu A]]kdnyzFy_>R(U]bF5 ]=㢺g";!!Gw?jLTH!p p ʁ J_Wun"+^Im/_j:A{~l#zs7y[>#Tէ5?aǬ~i\v]_vQW uhMỮ1|Oc렏U.?hK`Pvj1$ýUjoD}־?㟖7TdW#u_UmΏ^ӪvF|Jޞh9hAGGj3&ks>4:Qoծ5;7گ :\Ff}[)#o^EϷ^!h:&~{#6t4]b O:S!=7qtg5vkuiՠCW#]Z~#>k֟G|Пg#]=>LtQZ=޾H92, ~V\L:kTZ +-cpulWwLw[thRv^ b Uנ3aϿI>T ur:&lrZ궫l q:}&xp%j'o<.5gUकmI] pu~x~1GLX׏qLBȑjخ٪_)f0B DGcQ֐Sl4ۿQ*T0p^Ђ-@p蠐n3f\|HG_rkoWQ\iӕ/ pzx(yYl[x&}.q_^3tR^q1p얗lWQ|_EAyϐ;o p.(B"_KEa#K}o٤-;۹`FiǨoRgLʷ44O|Cٻrg?h߸QݻNhwDSu5ܱ? zYÜ8 t%{5}YZPЯqnn|.C~ϗϬVw# usnT{a LcB &8d]#οeN^;&o~u<{+ =:͟VpqnPcǪիU=8*oj/沔W>\g/wNʫm }Z=}t1FYg: $;8!㚟HzXݥNx6[P]M[&tT_'<WϷ3dðT^$NzRݻv=ek;kyP2t^Tՙ1/J^s@d!Ƒy_ݹ.bѨQ#DFK0NO(uv23'^Ck 8P$!d`zh- ?\ڪ-7ӔH f~YIJ5V \PB'ָdqK }z܆0Vq|.7j|UTŲmذyҸ-’3*JHp @Ds.'˛|;sTUn<}v<oM}m\NīcaWHv?2.;=;%!컍#=7@WG!=Yˈ.;@7M!=Yˈ:Cz3ۗ!CzaB9tDzn:=[C<еtHMwD5?xsh:t\M@gQ@wZ!=տғ@WS ݊t0MtD4=UN@?.  =t/z}Mt>nMA?M#]NMtom-_Vg5=E #>kd"__G|;4=߬G|jz G|ПHEyiG|Їiz|}#>hzE!>4=}#>hzrG|Oi.."__iָ[8wjz G|ПHw#>k~*mAV#]=d #>sdaw?k~Oq/Ymw^:oü_TU pA^*^ġĻU,a2JXp o}zũЧuspa{QOV9fsaU-?@vJ_X(씳-a 5T IJcZ_U,vKOVI3?8„WF℥=%qapA 'Mf^ۊwU8\v|4ԕޤW{ fs{>*yUK+oKJf2k" .r!o;PQH6VY ͖Huu< 9zڦ6^sX ΛPy]Ӈ܅yO(ևNϰ^Q-C\WdtG#%\T$tI{JbWlF[E>%0Oܫo]g!a{e?#?^!nG񶛼|̄r/y;Ż?uW0px徶Ͷg3i'w،Ko.xtՊ m}lm,~ycc=pJN W="L9|SZu=Qtpև=jO`R p8p7âϤ/j]"m-՞= Xݯ brDo@_ޯZb52SC}>ZqƁ98CÁLׂl˫! nժ+[8p1. W`egN\; :|Ca {H#G-Sp/WUoY%{XT$v\ \QE66%v[$]>>rNv#F^Ű+:=c Ivl=$%~a*N xU{/Ȋp1llo j[Qh fH/3xߏ<(T"% y\N5آB/GqųEZyiՒpd &GE>[>5;K,7Jy8Rw٩=+5=Kw ~ fvq;W+ )`]3vl_;3;UW:bnui|c;̩vMywB5|hf[W~W=zo [wЏo^o{c>*[Uu⦋۱鱺#lUq\PBn,/; \G4fB.rK?sד5H\xX:(,!Y/pd &Gpy1*v 9k U 7|A`DX7]V|Ui;+6N9 :ȯwN<ѳ!\LdZt{q,9]y ?ᗜw8RPѿ5. wpEq6$|Xwޞ`\(iQ!-~سPy*ԞY&f`F}ߔ FKZɭoɗt<ߏD맓jYWt o.qi 8:uF58)E}2ނf(DF[>! sO{deh֍c ǜ4n =N 2>[P7"?mo򯉅[zl;_E}nܼ抪v*pZ5˨GksGEn Ϥ}?R^s6lfs o݇H+,Gs{wLctH| og8oղ~l ::io#WS}XoV_ebk̿8_}zuy8BA=#κOG@Ӄ+c-ʉxkx!h:܏@7M!=бG5[@tHt_Ix;讪Ix =7qr"!i ]m~:~GG;i\\ڎ@?.ED@KEHrcYG|H/z}G(w#>hzG|?A}#>hz?⃾G(G|Ї}א.==⃾G=N:}HG|;4=m5=]m^!>kkz E?H=ީ.zXA~}GHG;{_:߁]˩?=ZS>(@XgcUuaϲOӮ`?J =\iKtmJ0ļ A{W:Ƙ%UyUw+*h+3% y;@_@82q ]G]\&Ub:&.V_ӴIku^CzG/^I^i:& װ4?:ȑ+er^K糼o~C[, 8e/U ?+uMtج$nJ5[{`6yjReb59-܎eSaMƿak>O:`+.ЇЇvm'wI15~Cc9J%h~Y4#>1 uz3 wZB$Wof]sf~-$F*^R$rҞdK\(R].șvl=Uӕo:p.y.˨{+Һu"loe] 2* bTn|b ^3H=׸>9Uں{i UtwyD*:\P_pEߪM@(sv.T]'~=~՟WnB˟@5ǻCf.n%.Z]=u\bt߱OHb:\؟s?{u)`.k3d&kǥ}&vG?ysXW.wCAϥ7.Vw+u0Ƈo!cۗ|w]k2l.՜{74%^Cd=zܗ3lW#G-!<8aW[_dH=,}|.8j5^; Nݎ*887e6[-3C [%DƁƯ hY5R"T/\$%r\&t E=+uYWd}7FZI og'lB Awl\؎Q㢢%KkIApJ++;9ЯM}&4#9>ĞqQklǶ?p~Ua$rot{gj,rn]6Ԓ/z\6l9Kwxo!1Rq_J%.8/UNlM\aw~;}4fݑ{#E)UviЕW0r x)T`\YɸT~%p.'2I,ruH-J6%},؟=QooIr^j Ӆ-zOsP5׆x-`GSYNWLN ܛ1% p p p p p @T7p p p p rp?{1nGS׾zoĴo4rߪeN=c/{+QoN}=;-.ݾUggNUlWJy^NBUGoC<5sQC<yӨ']b O:]Czn:!h::mG9ta.'Cz;|NwyxtHMWB~:CzKIxks-Cu:h],z#>4=K=⃾Ghר0MtOkQ+=⃾GG9۴t 'ʏHG|AH:4|.gCG9G|;5=]!>iz}nmzA_G#]У#>rzC.}A!]Уx/O;XA?$ʾ.=5jdx_6{Id}w~X'X?e}'{wН?\R$85UyOn r=c o}QK$-dZP_Rg9KweTd-[Su.ݡi1ڸZ7켯y&c.xae>KRDT)4.ok_bk ;eZݎO;.$Nk\t*,p;U.b_]rd-&X3CO|m!Im> snÒK~Bp/dK+U8?<_ԂrGTw>_ q{MUiIGk~ޅ˛KJ6636G1pŹxEθ.sT،KgqG ܌K*g ʒʕ;uO˼8` O9Xy+9&\YWޮE!s3~f/կ4!1H[E խcT\P?w5ctb_36MGjpxtnGv";!!~)8 *Jȁ@trO;UUΝ>.j_hEa/=/u3~6XWZe׮~vM.gW{.]?õ$:?Wv@A+v7-=LaL+vQ}-6ʿ'k Je=$jTÖh.t wư}W6(p.xpRK[\pT]՚/5tC_VYSUNn}Mzj!ـ𖾤RDe~XqC3q&߁k7qg ׬f tszZ\>(Tp6[?ۼUxO㧃Jy%S^_g=(mn{\w+'| d :!@߲a [ Ԁ K{-7}r,]ͧXcC:^s7>9&k?'ݮ}#'G8ҝ|*}2Y"=ޞrTZu#|_'Oݭ5pyC9Gnq~zЗ1Oi?+]c13py[Ev1ʝ1~nf~2󩫗rO 6]'ݮzwWSRIUrEN1ړɑnW9{T\ظ:cXsl-ʔg- O'^ÿ@w 䜡nWn TpvCE\=knOx >u |쳴~*C_߻VKwSE%DvL,]ncݬGn'r{z)lO]OSlτ=<-Eͧ?[\= zl}'|riە+)}竑}2Y}ȝ Ott ex'́~N\6FeՓOi>=ŏorM8'|ghەg7 cTRoy)K82ӿj{ |jە+:9oQ||;XɑnWVRvtK|6,w§| OyZ?ve%E=7sRܕ^e\1|6?{o% | ~ʒz'v~fx\V*_ir>!:7Zfk8[C?s| |²~L#v/-U^>>/cO]''?vͧ,?>/sO]Y<ٍɿ_^z(rfOOt.=O%Z?vHZ4RY_>f üR^ze#?/Ue_Kd'| [խKSؘ]K.+^T.v}$q9^F/OeZ?ved>DwȄ.+o*(u~ցO[t|ɹ\''c~| |O}tɞnW;KSofeSNV>K~~登Z$rO}_ |Vjvuw|zk哿Ԟ|!#>/cO]OY&ӟ*|z>/3G'ݮy%~YۓN7ត% |k~J*PZv.3#\$*w[y |jە~(󕕞Z~ qծbI>/#W'ݮ mtɹN'ݮL$5*!MO|'|c-a O dߠnWVRSzݢ˔^zAqx7XKWͧVK{܂O Q'ݮW2//j' r >96iەDݢ~=oudKxPuokʳ| O/SX' 9G5ET{y#wl^34B OW >xǛnЦiKG?iL%~ʡg[{jې5hӟyd'sOV{O drv\|שLט}+r rK uKܘhO I˝nWa5%]ma-1sT1ў?e='|rt65?:FG{I'Xs).'[>Kt |]~BfW񐛨)e?8oWl/Gh>nc K|_'kZ?ve%mUa󆢾;Dq lzTQx2>nWVRW={vN,Em8R6]Em76B>/#F'ݮz򐅥-ƯbG,m_zT)x#XF|_'gWt!6&6.#;RK__ joոG tnW&ugdώӭpyC˖G)OaOaݵ~Jg.};Kt\do3m֒9 |==|_'Gt9ch#\^mP=6?( *'9F/O8t ‫fC5R ҟq)?GSS/ɞnWVRJz1-n=J/oo p|/rnLW |zjەD tûF{sCw%T_!^K'ݮg7YRWsY雗1_s=:g#{ |~J >?sgT^1YrO0OZ?ve%E={WrTq=ӪK7i5ݞK99O O'ݮ<8z`ko7jPEuiS>P'ݮ6|3S5"5 |~Jzv):*߶_^fe\_`s$}/UI|r$iەzo{ qU3)C2TZYO 柕"FykVB./dzO O!Z?ve%E=ygBEN%U^e\;ui!?j K|_Z?ve%E=mGHl|/cO]YI=nL\|.#Ck8|S/;+O nWf)>STxd\Tdi8àP?2V|W7~.'|;~JW=M*~ayGGB't)lO]Hԭag3:z[UkrK ;;hv Jmlvg^j9֙O nWfq%/}O]YI/K@r *k=+t)lO]YItq(<&ޕš~Y>h*>/cO]YIQ向Ry[)WZ |¾3hOB>9'hە]OM*җ+3WnV>S~Jꮧ]qTy :MOV;^'| nWVRS={ gAr]<OIZ?ve%uӥ¹WځKy])z7CB>9'kە]O[KkMOtY+a |S~Jꮧ1`Xȭ|K>w5%bO 6M'ݮY5V4|p{wW|zZYO 䘮nWVRk="~5:T[o7y?_»u{/'|rjە}A:mٴFP`ĸRg\ʴ_s! xP(LAK@5H4$|jZ[xaX (^ah ( FKs5}=߽,,; o֫ix}r]~w//5׫c짡d֧! C;+gO)9Ź>_Ok'Wih7!okx~\?aCŞcgX~~xso~ړmv. 8ߋL>xLd-' p=9/'ia# C{pƏY~b^qa}8M'-{~5|OXlkQuI>`OwE~a?WOX7rjk}7>OOQ="vd?_O'WqhL7={ci֩~xst|ǟT<&`%4>/AWYӞj}b_^š|TPs,15 HS?ō"߃(n>_O'Wqhr.lYcqi )ny?&fOS֫84^NcGgo8x'=E?M{T *2.ېv"?/1~*~zS]~? !~Klwo 3f?_Oaz IF4.!on'nw\Mf~b `z I퐯dF%gNgr̘~a?֫LHV9Xψ{9` "vd?_O寇~bšZ!_ 54~K\|3ik^/1~ ?aC_%Ovbo;4~fuvlkcF~zQM' U\x햜tU60awa77>8^XcTO U< ;xG1;/֫8f=WS>K\~rBOS. UYu2-q~߈.ՍOSa6*I29g4x]#0/@?qx\P1~* ?aʄo3i?A+UkiqÙiu ;/=֫84^[ii?Ϻ%. 3f?_O{'WmaɘeCuIΟz>ڪE~a?qv9 LqJc<}ԋ '彟*Aa }ng0Rz/m\H\e|\._冰\n-o&k-׹[ucX>.wy_~Zllђ/Oyr$m+pʟN?n-"=gA5%~f'S;.˷ aܜ3g} mX]Z\.o fy.߅_81%\>.oq9O.i9űesHc_m.|\n6:wҥdǍG6^p6bܬ1?_+9kh˕wPp|\.ùd_b{/Uז߫]u%O޷s,đ591C8?-؎{.Cmx~`~lGu~ -4XΏ#%g翃<_pߴOYuQo~[V疧˻ӛ٦OzW~oܟS{{fOɈkKǴ_VRG5ik<N>s583/R|0 m_ڝtr$ƥ1)>|&)<1tKymK261ﶏny ߗPN '=fp dy`^ yaB-ɍwU|Zl^JY-c^L˂'ӾŁIEdjȼ0K塐+4=>gqz?H;agFq._N "o{ c:|V y`^8?+7cIby)J}'Y<~Pc5v騏%̋O弦8;m4,x;>!7q?nM<~vyϿh`=gͽpTyv[1  ̧\9[8//; -_>sȲ%ZlG39n@=p /?Shv@igX7gaEOaezM\\>_ptzƳ1.B4?oOƏ߸8bT{q\/|'UlWiܦ=Øˌr1/P q1g'8yL;~bᄁׯO2ݮ,'o~m_k( qτzX!{=׼&M1oV1xMV`|+> m~-s*-o@?Vy4oB?~+=Pl|DZ"~KXf'ZN_u*|wkku9;? a-3g߆60_?n}yZNKƇo|r%F!/WidW$dg^S0!9[kS 2y_~&cA,4ZoX@t߀UXÂ{]QwsFu.bMkAZ e}{Y'z?~~\|ܓWUyO+} }3+|&өV{/b=9[Co$`8gie"/tzt7mp:ݏֲc"ve"?'F<> ?/="foψxbē";}"~A/E8$}#/#~i/O2WE|PG|H 7QC#{SZw,E"Y/e4F*F|{DPߋ&M-6N71boߊc+V[1boߊc+Oߊc+V[1boߊc+V[1bo[1boߊc+V[1boߊc+VhuS#>,#~MGD<-FxzwF񌈻#xf 8| 8_t_W u}\>KK1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/×bR _K1|)/'8^_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE [~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1y~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE |? 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE ~A~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1C/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_JE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_ ~-1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE O&1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE .1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~31"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/x"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/b_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE _~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE |5~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE #1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~'~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE _ҿ _~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/b{~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE ᗟF~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_6E~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 11"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~/bE 1"_~߻/H 1"_~/bE 1"_~/bE 1"_~/bE+?bG1#F~ȏ#?bG1#F~ȏ#?bG1#F~ȏ#?b_ 1/7-Fȷ#b[|o1-Fȷ#b[|o1-Fȷ#b[|o1-Fȷ#b[='#^4bUbߋc/^{1bߋc/^{1bߋc/^{qGΈW{"1q1">>G|B'FOOԈgE|ZħGƈψxvo%Fό/2I?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?c @1b?Xyʚ1b?c @}bO>1'Fh[O>1'Fh}bOO>1'Fh}bOO>1'Fh}bOO>1'Fh}bO=O>1'Fh}bOW>ʡ}Urh_CWо*U9xh/aY^1+F{hbWq}l"%)|?WF1h=2.s*1!\~S'L/G%&FgDרDwg[_tk Yqe/_+7q80toOI2SmI2f̔֞ǒ͛d|Џ c );+? U-0JVL cowɪeܟm~iuO$o÷,ҥqRHW&mmIҾs2uw|FZܽ?n/sGSø`楈<0/W9ωηzIw!/=f^NIˆڲy)`{it>[<0//O#IIxa $r`-O}"C-c}QE<ϭ5ya/B^03yV~(y6(/ll|m+U[2gyMqvhxyY` }߱!y\n  w%58ڜ>bzm>Ys/?kΛ{d hϛ?o܃^/X|aljsd.]wc<{sΟlΡY{CZ_ϮaEYh|Y80MދlCތK --vyOpqgǝqq1?0$/pk58w>=m{z5~sS583/R5Οw'kaܹsz>AjL՟|zw9W'+*9.ּM-i-Nj2yaop\݌\y3o|{z_ټ4.auMW'--v>^m`^d 󕶰IA޼rg6?q$[żLc2G9y9Ibw6m/^ۿ0_¼0 |Gx^^=/"d ϩmM"c}>os'v}⯟<ꪮҚ$W-'ww@廽rMO7Lw~7::?ݐN~cj+MO屻;>5}V_w-89y.bY]C8˦N)'tk{Íq_{ knnm޷uGMZcmXΟ|/y;ev<ݟ߲,cߎ~n9O.O_?=ruO?ܹr/utJog7v>vWiIk&Lˇl~tXίژےaZ.;X%Izfuث]27;̇{щ|z}_qG:GՔvn\}]]ƣ:w⨵L=wͩc:m:YXȏj?^FVj+:^Wtگu7<=>˛͎cM>7o„5m|nwwqܼ_pq\09ݺyKaB9}u}Kj33^dO/ͰX;8]z_}n;CޕSk']rk-ހM|m0ΩjHsÎohq8eפz|Zy9y[xa;cyG^f[ty}C/)˻ۇ]o8g朓O3 /?gy;6Af1-_+OS +g~:{ɢ%42P⻇0zyדx`?_OB?+'p/,K맡ğ~jO^NM/'Wzui~?낹.Yrys=|G?݉V8.S>~>\ų'99.[>Ĝ%,_ztyj(xBōY,W8g Rvǿw~aZ mY}Ay`^>26IﶇzwQW>g|oºڳd-ǿ}et?_ׯO}^gxVmjLJvqIw]!z=a{yky)|mw]!RXwk`^pXO5-U_wR0/R6lN^5p^jCF8˭μ0 g|-w$g^fƟ? kY17:mU>|_g_z~Bǟm 4ǟf4{h@=f4{h@=f4{`X=e;fP=f4{h@=f4{h@=遡]O&=yw dn=2[x40qy5ݱ5Ofc8|Eny`^ yaBLyپۚy)>|64ǿ5syaaRn>ݲǞU|B}Eg?5+ QϷVy7{pF-u %~=Пǿ?^`uߢ}j=;GwNj}kpڭ;^S (gfdM:ya琗R^|_5)}ق5[ö}y`^ ? yaBN&1yZt>/02c2G9W&m/MGXxMGߘya"xʭ`7!n.vxk_kN_~o{۫E<~3 us4'm?c>/Ys_s}׾ vݽI_8bPcқtIkwgy޸GִSYގ)]VG6s]l}l՚kY;?uKxbzZo=ֻ w>/~:IK?|k[3񙣰N:nHveMmaܛA:c<~^q;j![ynw~!?X=.sQMSr U;Ώ qq+Ώ7+c\q8clıj\m㸝>l1XyfKu~SCnh's}WWgyOuv^<3x`8g ij^Ƴq<3~Y/z,z^x,cn򌟆x׋gy/@_l|ѩ?J7Y}2Sw8e_l_jײ`JtutuX_3菙0U3Z.k9^*S 8lai N =/'5f4C~W_rY2_ W|Bǥ@Of~9. n~%!|և)O~?42]yE'WI}aŚ91{'jl? T5h!}<0/+VһMs;oc}ca>ۮyxYTf7^0o?ji+ahVl<0/lr߇lr{~h/O'^czp 7b{8v_i5o/o͗k~.v':s֏wYwD N)ƕګcZcN|gKSjs߽DX;ǹ~?f:'un 0W:WνU2^!ZCU&okB@{^q\71̼0 [|\;/$s8l7Ժq{(tAtqD[UJMR//q-1Qʖ>|ڕ~튱nFGHsע>;Wy!X_8ּ㇖Jk;"C2>$okgfo&; TyoR<~b· q˧GQ וZ{yG2<$sIg]eix^l-ooWmz;k^s!<[C .)ǝ7~%Oޏf>xۼ6g= CKng9yNzi?o8ݪα]ÅѴ=o?M?sz2eOG~ߦӭ(7j4,_dΟ{;.>WSV)b/l0Y}پxdW<$SωqqQ,ǸUc}ոd9=88?3W8ˇxQ8c4ı>ƽ~Kc9-@U3?cܕc}Kkr 1n8c&ı>ٯ5R5?YqS^1n8clı>kc9ƕqc9݊8Ǹ$ s?1n#1n8c=2gLmXq,=caynvyxg[vz Ƴ< aD=oxg4ij^kEs,g#Ƴ򌟍x֋gyƗz?_섅y`^8S+'pӮ?3I&t5K{dyMm z%>Oy\]P?w}8~|tz+.qy\~8żǰwߤl'{-pј//I>/ΘsY>;zλ[2[ }qFfr[|+j'5 y|_!)fkDC>llGTkc~o/<wY)F_أg̜%g.O2!/n=W%򝚞ƗLJ>W}Os}=v/_)j~x9mt|<0/C^N4ߟ葉v~#Pwv9 ?8B-{0&3sJQۏy)Rx^&y慿gdpzԹyY1*Y}~Or/'w Sp|ļ0Kaϐ+4ڼtΧezy r25:ٌ{󒿽nXQ !2/R+ Mm/NԷ0õ ˋJ}oM}[[o5UſK;ڱby`^ Wh%;ՕCY?o޼r%#ǽV_v^i~l4y`^l+p⃍KI_RLJI:v :k|ߏ׾V﵉Z@uoi+mko {C#/[7͆vi굆c8/1uj~eo3lM8 cWoq+/ʉ?;zBTo.m9|uzq>vuVNB-j|[<0//濥lq-73y)|98M<kgy{gn/Br-|^<~>cy`^ y}c!P?c kԿ;uwwƭ^$+Lko7/B_usѯG~%?3Z| rs}{%c>/~+,uс?Ո|6HkY-ֿt|./?$?^#o}<,y~߽K<av|=ז{8ǟ_Wq<~brKw:x!xsWCy Ǚ}@{y75; TyoR ^|%idRgg8N#:ݧ瘥׳o0T}\)oF,Uya+C^ii^ߗz^gR{7=/ܼsHr}oD;X^|P U˫VWKl^P-PKyrSM-y j;<0/CB^<lySm] ~V[ 2˥}*|}~қ^ϲ=c|B1K WǕߏK`kI^~̋svz:˅c Ӷv:L>K.`hfFl1<0/lEKe0N )Kcn>a֛WЎ1^ <˵|//p4H8ߒ]Wl9|^<5* ko/I:HK|lG^8=R^F$C^|Qk~czy`^*8n`B G|qܙ|ث$m.}jty,ԄYClr pWyOKII0g:tmۏ矏uYkC|>ejyy1gol|yZnx1.3x 0ޟ3m[qϜb GݷV~x>##v>8n;2_g:Xc~oH{6_ʻ#R]un2p~W`ߵLh}~$}6O-3[[S̼z^S6:ג(t߀#yߵ<{?sOf:.]O)?b1nXZ;?cı>X/,8n'q+N1XM+h \OYSݮGgyF<|'"lYeij^η^<3Vij^[/,g܎Wi?3~Q^n?3x_x~NYzY!,?3pt?֋gyOCuǟ[>rl[rWW. JG1C!ݕr#6{&%X'_,B-b5e۱؍"ϡE;Qy=/z|=>֎|y) ynח{4}^S[naGB2_a9>/S>^b5?1ag#?nN.i6Y ؝/Kr<0/\^>cj{ͤϞk|O<|>h~q;ףoG^d0.uLNb~~~˦A^O{#c>om_?=Gy+8!y,~me}ZـylI}hO>}rϊ^|u}Z}V 눿t(8or}rCm\zx;֛~,igg?^Ƴ< r͟%Y/͟_A;s\f4{h@=f4{h@=f v=z|X};},x?w_mvK˗;!~q,N}a} ]5~2gO%DGEW1?Xd k!_iQHzBcFlCd^x<&M<㾳9gGqj}dN֓K^{BoAR[iy!Za毻tIz?9M"y^N8?<#dɢe##|3!\/,^ҝ$u~I[aszHzQ3=4ϟUg ozMgyο/v:=;Շ~ㅟϞwGxfz>u7?}Ie>3}YvZ:+};N^=3}k߾>3ywN[>?]AfW*vz4}&)ےF?(~fs~:x=3ڌg83RI2yEƿ|q<7.7Ɉa~lJsgƳ a\ky~Ll} c?lr+"|xHxގDZV 1.~~1nX_5.c;Yq!1.~~1>/b9MCZ=r[8Ǹ$Ye1Jı>Ɲ=/WAc [Nc&ı>ƝVrc9G^9||&n|>ll,?z,2Y/2+Oe<3~#X/[/?qL>Y/ gyzN_x _xY!2.^/ zz,igۦ:_xֻoxgg?3x߄xdz<`z" ?3Y/kuab! c??Z+|-V%9ו㽯%;`s<0/ɞ0~te]kǶiUq{ע/j㸞=ؗ;5~|ɎE{z<R\>h`r^|cXO=[rܺqy&%<־J8ρI_YOkIz6#R^ZkVD0 |#KحǼG>5w"<ɻ(8O2^~~q<5y`v[-?Q;u%ϗg[~5_xkSt y6= EǞ~_qq9v8nG sKzyw^4~cE!/WXg7.=?ԗr~H9=滤6ߎǺHWKl{I<=~鉝ؤp<ߣ2cag׍Z^bvttZ?r5pС0h]hX.آ7x|2q3x]f3K޸Yq}Ukim{Vo(2RBs;e{ٻ()B=PC^J轣IH!4RAᤞAAQQwGX"7owrsIDd`3[޼M۝9RoBݵ*Lw4`  hfpUϩpqəJgEPiu9ΑBCY^H-sM8urQ4}zNs U88/|.-xEq9n]69 s}`WL 7)܌NpqMί:EI:> <5yt4N<3K?1 {jAu=S߂?#^7O2)0OokwSI0N-s;PgINO{W]"9-`lԷGAm/{ߒ?y8 .9h,ˇ9M?Vϓ<Zg<'xw|` y+71KQۧ(&.%ˌE'8OyӒ٥e pSu}hsq廬sM|>2KvcړE,WwȟOkpSGKPʼtWJ< H,+A?,DUHr!ձj$^  Xw y^yl\f2 {xlj84,g-@p"6a|].Jz};9kús=/G:صor?ї:#N9qxl9oX7 \ʁ߯rhal uv̈Q,8?\@~/Z{c\*0_m&gCE8À %u7b2 B7u(y/*6`{v>ȇgpy0AhW1| 1>G,@4Du7LBGg%e&c`0U\Mlrkɹ=^bRו@A;%B:˴RKzEgfDfef&pI)8wkVN B:ԋ_/BR |ύDs*zc~ MfBz\tlFd\zzj:d@{W &FƥMt;aOxSM~9zZޭC(zMLq*Co_" b5=ݽRQ5Θm=&5=6%@B=Pͫ^T_^$n _c^/ toݮcuNxE%'Yt'.!Ojzޔmz9!qva%?X^M-':T̗1YIr85ä]M/ȁz732#ӳz's {+_315*rW(~ *1>*IOP/C"h:WD:)iq)v"u@Pkr%/ˈNNsJ( B=P/^.6:M,{W2ZOR ]r1Y)1UZQwz^9KP_Y饃ZOi zDged&d9>).&3qbAk7QT,Q+w+ԿzEPP_+61>>+##XUS,_e^/56)5#AU@P+%E/ČT;Q^H &&e%{FP -j/ Lvs}:uڋҠ:ֈizai~?>5V1 @p^&nE&dƍMB=P/2&)Ug%Fyz!u;u:^AB}!]qUOLRSqzmE}!]FZRbfdt&)^3$~dNz^J">RI͕LuYHw)N]!0*#B =c\ƐBԦGzL_~Lj|!=Ѯo̺YD}4զGzL?G9 1{LHu(![1=B@^jA!aL Z]\no7e?|' GBЛ^~*I#_Tx]n #B0uZ6~ʘ2eqW-wDЈ72gq8YJꭱs.PQGa_=r|rx7%y\rNhe瞛op b!p/)5򺇜P["^p\`݀r1MAlX1|YM><oĶru*m'QC>J kӖm} VEtA>*/ˋ>`yA姼$"vm3_[^X.uR5G X OH്-?  'zG?C㍰$>^2TGR>$ٱ-!2X_ ^ӛ)9?aCdc9lyߕI΁\}YR\J~7:DQ'=ql+GDAm^o 9gjf\wpxjrZjF"|M756.3=s`L_yC) cpe ? _Ͽ7~+Ơ#d~yT[2odB!sT(,# qtqfɰjzu!{qO ^=(5f|\fxjS`7Mzv)?-69D-fZ;Фhu6!kz|%F;r- _Uum|cӣ`gMCx >sR_R/D'cWz%9M햵{n4k|W iH"a1alz|'5q,v PE>Hݎ |9,>w8G?h-)qvL*v83<&G퇘;e34cc-_iqr5-ciڴ<~Ma;fN;F@|?i}BtF퐫m>O>69A<=?7.|jzć#O/~PMSuuD!lr`0V).'y-NC"bWӣTOPH8qzsi qALP8 J9GgQp2N69 qAԟ_.jqrvu5='Λ 'QㄹS(wGԟZ|(^(S>69A<7?7->Jv=On!c1ݠC'!:6iRA.G>EV9A<W?ԏLh r.v5=J>Vyvj1B)4ScWӣ@OQH8@|P?2}>T TRz)|  G?ԏ\->=RbT(S  V|v7ӏ750,1ǥ61ʼMΛ {LćIqO BzXSH8@|L/S|(n_Ipnۺ>69A<~ ߨj障>G|<4ʱj~RA?Ç,eLOMIvv.4>VyxcSA?M? d/'j7c1~}|'#>Φ4> Mc|ć_E}|}O8  ?Gh.tƹl.$|lrx >?GwtDq:)$|lrx >Wݳ'q77O->a{;3=??V9A<Smč'j) >N4>VymP~dz'j) >N4>Mc|T#F~eP֘8gj7.4> Mc| n&/&>NN*|Ji|LMc|>L|T8B&'/NuG&Y@sU#M{`<"cʢɩmf}Xv#:WEã`]nm]'m /EA>|@?ib\M2:Y|admr=,hr W#>d^ޓ/ %,7(/QA<iqu}Q?Ə/qUj5ڽr;H=k;az[?~N<.OaC ?Ill}4 \16":G?w:[e`@(*҄lrK% SI->\zL(DG5&Oɴ~KӆS]M\cz~aE9V~lG0=ܷ Z۠F~C8 =##wјF(W雕>&t&r\9r:jWG,3am2 $Fp ǶΑ/+iHOb%© d|๑\#ߙ ^!i%-^Α^};ԃ^C,m9N+_x9?#! dB.'?UڻrېsHOEEQj}:;i\C%~ odLQƛ]o@KcB3C3*6UtoKqt.?ti ,>wQ`f7J~$C'(䟽sJvhOϡ% :ef[]Vmc-O纅5KpoI6f ujei!?,":ssC!*3Ce!br`ocI`4?={±ۘ4WZ pL?|bypR%!U;Gm&Bt67_RI3cˏ!Ki~gwL}BZ\I@յLnO/jt&͗ENYKʯ:!A--*T5hnL,c+y἟ L>5K }eNB9UUde˲ck®nZ{ K0p'|P>j",+y@xu;_>A¥7}zj#STΟgv*V.)Ήg…[R0k~•>gfyтxy4^ >|].<`lI$d TcEVӄov9TI#\yVmbڥ,&gZ_eL}>o3QƤ=C8o9{S&͊ ax 2;+$v>X(ϵl9Th=Xy1W Sˈ2J1oN(ai1)&ݻm',?S&';4_q{-B`oWj!amsk1i,2ȆL ) *1i~_X]v0u _7funH]!LڻU,O;̴sь5,^A,|OL/Y#O}ýU_bX%ĊCBf7dҜ/{T3|ԎI0cUnRtb\DH/zgO/wgsgBOv|Ml`' q7six_?'tZSQ<Ӽ^ׄoF !V 1ˑB7 |IrKQ]ptbb|Nc\'rb3&Mĥk2ifa4NjIs;vQfV.MZ:̤mz <]}L;O=PXRi7'NT23%3LioNvIKtKLQ>brq%XX|+niLq5W Ȥաآ^e[&M,^ϏWW/g-?ʂs¯K3e_lTX.1.)6}-x;[L/ "{ß}6WĕkL,?}o'9f@y KkY6H<8+LxsBS&ͱ}i{jǤY(Hm[0iXn ⯶9z'SYͳ_= gULc T_˵0vUK/egѢ6b̧+?ȴŪeo;ībw3U&fz]eҔ)?H|UPսm4uz}w%} b7Tܚ,\C&&3!+LɤpBJ6#ﷅgGz8p\mveb l)2fj,q>ӆŊ{[Mxz#^Pq&Tq[bKK'b${n1i>d~XH=/X0al/,6GN`aϹ!W:1iV!.Şv(>Y’] ,d}s'~˴ėCKML.EM/~'vFqŝi3i }^zy>YY.n|b6D%>:]ը9S/&Y3ěҎ=6 `frBM|ܛ)%Ąޝ%~+WbuZ]^y8Ӷ'vI6XI\+c[٘5b?q G-^Gi#4;*^Gϓ⦷ C?fv:%˗:mEs1U}*A$T L9QؽX &^l*^2%j'>9#&Gk߬*V=VY|(sYht=i`Qm f}b ${ċ1c]& `D#֜7W*;X)3NZXbTGKf}},C6bҌ񡸩`ØxmHu}#vm6$;@mK&ۦ},!+9ʤ8wp%{le:pJ,'aVK>+Yw4eO7.M<Ή$Wl>{oD_3o[֧l3b-nwP˩'MjuYt10i5JeS0zqۥظ)~V0`nrEwΊ~aٗ,/];'-wbLŝǘgNWsRqL>G^&% |Ϲ(z&,L$\";_+_c/gNWFF%*^kcĶ31j}[ug~gy34B|_!oı2_%..z+uGly4eWǍHbllwO'%ä xxOyu>3[6gE=,MS.2lq_Fa4zW>bj^_-{Ol%n3}GXxIsOw=:c3f?jߙgj~_\P:ќq/'ǿ/: ^t=Iqώ¨;l>wN?U%īS<3 [ڒm׿ s/ĈSvyaŴ$qfKL&mw5Nzn+ ~[טeoE .7ijë}2߾'lЗY;)n DűLE~{Ƥ2i~j^U~ut+^°#62ˆLY)K k|} }KvJq૱L% jXlb߰8Kf6 z_kCKJ.ld( J &ʹR!)?%3i(e8mn,k+gUc|a$q_cSyÎCě}~bҴ^B25PdmS%C Zgm\ ֛%lٚ!ɈE'0i4O*֮ajP˴LY[U5|Pu30sn5DIL ?`ْ=W IjƽJ^,oz`faQi C M,MZYX40曽3i~oYФavt Ef w25/|@kR _- 8 av9TOg2:W0Z09:İhR]CRzKQ9L=smc׶~X vL0;q7̎p~EOu`ACC7X<}ifegzmeK-IneU ;57&:6I{2Gj!$Q9l<(OZ׷eU⋖yW֐Vy峭ѭ/ӿjƴӿ|F/Gx6Oumu8]t]ym/G<ԫ*uӿ+;_j_/ 6i`~t^+C<گϚyWwI K{(6ciuzywqbX/^A,5#蠴qWi3d%e&*t LIM -oZFЄq1c2XP_~3XT P_ jX {x |}GNK28xiGBǹۿ~9"^T:v-l΂=Ŋ18"qja!!…zt ֤KF(?+3\>=#ч7_ɑU88jcQOLSnlT^&aGskM5&r|TԨn1bQqc3b³fsKb|^LIH;yb9'3.hi2~,7nFfԤ.8.uB1iO?yBF)eMh9wjϵ8)k nsU'M~zڴA۳>3}rnܴg=?8%ӧ-#y{un/X:G3E۬_a/R,`ִ3-nʥZ"hY ZpΖˋ/-YJ 巽weZlޥ%ܪWVXz}g/n|}C-os'r{D4Ӈ;?Οvg6wdw~ּߡë}G9xБGrsze˓/Jg_Zė8sgN] ~1ҕ׮|wW9{w8ۭ7ܻ}tn?YxW8g9g^u_\>w*GMO%T|NM6Xy|R .Ukw)W\hje5N }L2߸y]]9aחtMJ_)Z&i.ViYA7}׍[جr˽~g̗Izn=}քg n/ƼIohgV[?7qV{Zn7s0F2cfw_e>Lzkr+[-p@- >jJ} (6nYGR{,jolfŶ튞^~;'~d #giFΡAQZǡ>{ımgm9Dҡo72FDOT){\]}_޺9dp*;k_Mz_~i﹯,V淣>fnԧrл]o%# %Ojsz_ ;>[ޙ=qՒ3ַ{!n#vno]ݜ5-VZV)ww73' R⫇m1u|!,~GGm{rTxBg缾h룇ݼ> 1gK|FͪSrgs -{W^[SS0w}I-|zʾ6Xyt AOyt: 㮭?=`zxvV@~*_o͖tL<득;ڬuW}uǭ[dTkx^b#koFT/:nP;,v~lNk{KFSUy;;bKPRڱfwp>{8{ * {ow(k_}kQ%~~bS}[zt坰&}8z93:Gf3̙\T}d%93Sfz ĭmsf ~|-l,MVPׅ6Y83zΙY9*2h993ZNYsfX7h@+Ιa}sfR9۞Nl$ݠ/xZĈ ky8U2{Z2_+Y9(5$?I.#Eg<нG-} L:$\ydgi%Gesyfu5hI@`RW_aN3ateTd}Уظqu^l[ +>^{4&yH)H+datʯ=MuWg[g\oxr{_*<0sV'oiAaoހe#3}݄0aV \U>GK^]dGB<}:I>|MrLN ]пU6| cn -x;e_Ieڷ>6e!L^eᨋ-?^s=89BZCb*™\>]ܺ+wބk9$Uk赁SBlO[WUQ "nҋr +429ˏ5 d}6S9r>Ht3H, e67m!?ۘgS9 kY"xȾ`Bm`-0-[Y/-,zb=+я+CI&LOU9I[}a@oAi|Bb[_'#^D43C:^KK~+dQVqpkZN]+m?#UכX'u?Z&DG`/;:9ޓSIh-7䥬;!-}0w!ZYU(/dkQ(VIr < ZJ(}beUZnbjlꢏ9gD?9rZ,VqTnݙ͔1F-Q/|H/wSnsE/Yzs^dX kQSb"3g%%|-*1 "7vs)c"I} (mgݷH 9stAWpעhҾm#4Sȹ} <(!afz3s^yR Ѫe80~?T9OǶE*8gDaDrcX2Ӳ2 }%pTai$ VOxa4H?9H 9r EE;dQ\׃cRQ Aڋ}ZoA12OG`9*{Ags6'VR5FuMNHLMAΥ.Ol>_yq[mUb6qOHyO{<п_&j'FI鬇jzM _gVx慢aͥMQb@|P 1D()c3𺠱m|r閔wWmDrVscD 3:}CKW7Wӣ^>I>8SUx:L`6' ^!N؟°~@.LO)8o{n7,5=)/rL-80=G+UpF63 '<{##ہߙ}:gbGbY2ݴTgHn"n ^ Q/C2911#qLbRb31z^( O\Z*)(^/5<866 =>XX9܁1_Ş@YN:_+1mi1(W|xC]58SʤCA[ޅ xNV1_?uTb̏1e( 5s+y]L/ݽWW\Mv|rرϑ:1vXkIYOqG|Hw˽DcvGzcX!k=WWm;l-66=5+@iRvDK'4DN^ VbS6qO킹7-0D B~DeZ|\q5=M7Op($|lr#c`Y <z|Z|\\Mz9c 扰_'q#NoP  8ZMfa/|ERkRB skV~a.˗`):?aJ/}.yOa sϾd` Sj*'o\t_sus:Mn,-o+*۵l3ˈʉsnz/"̼|8m~IO6\Hxе#Gcr@DH^FDgJyA/+'|p%[RPkP%ivIZ4MOڭy[I*\q'03*_ܱup➫ed;ąA:{<3$ǛaR#tqCm ~f:0)xZ{)ik{0YG+ȹ,;<^< ̳ ־DS8kBkҾ`gOڗ$FȜ}[QX&cGgh+w/&%uTP6l "i)?rm8mmmچ3Ɗ؆;: 4ul-#2{:nYmxKki<Yu%뾚ШϐFE9Evr̢c$&,:}FzT6\o|^/9f \#mÕnñԷIEw9^Nhm8ҡ^zz[[Ym8zP_^ij1. ^m6j:kMhk'mi[iԡ_XAWSqw{m@jeny1Emo!헽35;xŃğwy :>6K Rگ8d~㒖Zގjx6W쵺yKsZ< vO%sʼ.m sOy^Uf'Qі49xsw'!yJz(e gj$;[~Hp d$"T<|RUmU緃fewZpGِ袛w?Cz{txϵ汇yt{ǞA޹ol&^| xF6ZW|cQ֣OcvϝMzc *la}zpcT'ϭcTZĢMm%Q~aS\y5}7x+RflvpwUYʎmMvZ&J {s:\y}w8 "hQ+-VEl.>(5ɗQDuCO`"=v2Bn=ҞvU6ۦIzN8i8ANޤ䞀hlP*@McY('lynʴt09T^Umcl%Jvh$2Q m'-m_EnF,N/ QB"GA|bF)q~X79\=ϥ~|^HzXB=P/ z%eM"Mh#ci.npQ/dV蔌he3Hp/p~8P籂yf*g;{7JA0pK4_ooVz58[wvK0>++@_~^WHSb̏q퇣-G D8ׇS{wAkS_~6\pi[TIGcG8dviyDݢ \)>oj6i:C|P|`JRGczjoN4 Sn#>(> {QA?g`j&*,误(ᯫm0JD@|P@ɳx >&.#n>Z|'/.ono? Boi$8.OzWӣ~^!EXʼne=o{'$-N؟2M89F^y{Lo] QƀSqL=~t#? Xa/۱T3 1Չ ~%o8ґUۯG0?:nI3#p9$q_KpW0F'ɺ\>eQ@ɳ^6^-g~bZwPnyw[;@> >ny K!}QXy KrmNEdb0Oʲ{- '|J>Qb4yݧtrzxޠAgϞRΝ֭[KM4:tʕ+K5k֔7o.EGGKd6,_\j֬|ԭ[WW|ݮ];),,L4h4eߗ(d<*ɆNGub]PWӣ~ٯƝYUYP܎l?C|Pp᳎Yh;t1[%Wӣeޜwg%@ <㧲tGi&A<tȂ"$q*v5Mho}vlӦtxŧ]٤;{ȓ)VJCƱњDzr=;' |4๜Lz>Uv-e]RɈ/x:G׏òԜw\*oG)_* sOqOoW8?ˡGaLIwAn9xx&9yք<tqݺAdm1ݹ}Xmg oOlgQvH+>^JyEȾ6)1Ȣu5=eC"/^FL@~$q88D@|xW(n@zı 6+6yʺHb|S#\xpA|oet<GL>/#.a9R*LwP|#6|V)!Tq7'P\Si.ƈ>qR$=s~~]BEz#ci? eOg~y31>CϜ!g/y\Ѿ)J%i{]Z79hȚLd+v<ʁ>PZY3m O4B3&所r@Jqw,x >?QZ|\'6y*oTZ&g?6*x >&.[hW<0g(W8MP98!՟>AG<a~eqB90oJʼnY=N}\Mz{!og(GQP%:>sU7^LJz2f X?9qgKjZJ>;~C?˿hZs}eR^ QʁZ\~Ìc0SFG-x'Y^pXL~ 'ML!tHU>{E}׋8w/WWb8|w_|pf8c)xn7cMv0{w~0kk7]M8{$-Hy!LnHm N|EZnjqrujz'pK8'a- qAL?S!C](`qB9 -IOĉB j~cƑsp>Gɞ#a&'φ~ʁ'q2U~)<:OhǮGiUf'P'?8!.OS?NӰһޓ8dtXiℸ Nh4^$R93Q?OӉO|r)Nܧ nw+<λ:E:/y}~U0=ˡ"/Gzw8;C9q'y:o5rxJݧ $1hQ(*>*zv=cD39p^{*Aq\&ג?9 Ird.5:!WϻGr$bg򬗍` `!]1i^:8P`!yOk#C~[=~RHA:+Ζ i9{8@' FEb9؛[5tjM(о }}8WK*C%!^o9.Gʖy/9*! Žs_r?8o(orzYJ x5[\STf1)NqIROԩe]RRPRRHR%yf$mۦ!JIPEܪ̫]'Qж}kIiIMWJvYj_&5Pڶ,TRW\Gz>4K5OhIh[N%VuTQ>~#{ה! ^]A!U=WxRfI&}tdb#92$BtTÑ7zHK;%}wtdKOy4K YQ}jI̖14nd}9}_lWNJQ_ک?挲HӒt-^S_KO$F$$XI#<ϔ.,}!.bs>p%A:rҬ A䄦KSS(υhcr˵4+I'H_Dg:Hm4t~$}7VCO9#ٯE:9@za+3;HI(D-Ut;Ek#zHgge\rPW$]d>KH&J. %|t`Sɼ,{rQF1 -,3[P>yg]7$_p'%dߒ2rb[0}:Z._OZk$-^|Ime_XU٧^ ?#kj >e' EHS(Vt\cY1ܵf$6./ VMjZOTGXG">.K4kIn7)NhI}QA-^.P/ԗ^j˾]T,衎P?Oo `rI! P^N@A}Oԡf8tQ%O@nPC|P^X߃N bi%i4η r(:t>z! pr'o\&c5_Vw ]o2vz64yٜ0CBi g䁁`=]ngFf X}X>tkX; )\?E,p=PgWY}f!T$:i<:g}7۾ҕ',[:ֽoeӒU/2<=stFB~7Ӻ{귛/uk>Hz:zwcƘs 9<c_fE;j?I%?2֦^ꅂP_^/3f_Oϔ81e1rg}i;@uˬKViA#ĘcX# ǿt_fj|/忺/s^è e(R!&Z|We-`w3CO^oBlw`;ߗvD~#.ojl\XFl|ԌcLrT94G"iȐ4SHM3%!rҡLp f !M. duZ9g+ww}ֳ ]~߳ߡWX?B}sud.sϫi35(#6f8aUMfh?WausJ]}}qۛ]%Uğ u갾C;uSyaM qI=}}qo=x+>}ϞX? v;],n\[ǘ}A|7/SvZVs<'O]?} cFVo}mv*er=MϦu% ߺ&i_hoUY|x{FM*;ݢr;nk7|ҥKa;6G͏_{ȗ*U --`+ *W\P|y#6Xߌ]l[WD_>F?}WX HԪUN:za}q2;~*TpletPAÆ N?c9AիWwk9a3}ak*U Vogg:эxy]v-޽{ 'Pb7} 0.1P8?f]v_pgSN)_ˇ2e8}mvF*qGC}cSvT7I&E;o/"qO5@ 跾Ri1GǷ3LGmG}b1ΖyjE~8|꘣,!&cb_,m{/[VlwUx`>p`?7"Zߡ\%y| (G*G_tVszǯs׎l߿&'_8D,?z`j~/[VXާer|m u[ʺ~;3r,*]]qQ^Cwu;e2;.[vfe#1{xc篴?￷_<.ێ8_~up:Osi[Hva\vCڛǃ}'[ۥ(z}W|^Tvע~z=h.'+=4!Zw"fv]N`O>Nx.g ;ogS뼃{=ҞwïZRM*p{Ѵ燋ηi=i~>oB,sp HCkz]W!wiq[~! uuXšώz|M﮸5d?zIj4iOwg0eDaxX|lZԧ Zۻr })gOwa>UN=N{ӫ?1u=b%og/3o+ u _=_?9&hWRǞ6ϯoqͧ g?Ɲz|o]ٵg\:m]Uj\;?41TQJ]{|PSouWѼ?a6FvJߵ.Nqۛ],{oTg(zAq9KewCpDDTmSk{7V?oaI e[Z)Qa&i_=m;~*@Wγ*k:sؐ^zcwvznh)̃{{^xX|B>o=~ \t*=Pa<ۏS|?kd y(i߫o>x~`q{y_qܺn]ޟݦG}ExX|::h|.n{op /kۺ}۞}/s~)pN9?5NmcJv8TM;o2*CkFQNGžW/-ķWá4}p}kWmk`>kor>'k8<2U7}1.S*/K]~whKXn~&"[ya&+K[qS/OlşʒvR;o7՞yQQۮ3cN> tW >w &h_j9{'Ǿߎ.M}c~?5vS2l<yS>+ZY) e>+f&GH<)]ϘJYZ_WL=KT._=_m=c3"WxV] oJ^7:3xRk\7q = ɂ&& m3olYpeM s&:`G<4%gQ])^ss}5S='Ir8lq< c mjokp/+3x篜S'í3̂z֘{u-x֨_3gY/u%F펫cW,o/-جo] >ƞĂ\5tʳxؓw3,xS V?`ţ9ݿa x&jV?<#o`s_F=ntο{׃z&=X`=SgsYpǶp,6s9qh%]ӝnX =[y~N-XgAs~~v^cy63lyxJƦwm_SmO.~uw >9H-{pjaG_ԫ*%{yV3jTNÔWG}qS9>p=J?=:by.z$cU8fNXE^q}*A=Ψ rLxGqmEmfmKWH:w兟\>l=KdړmWmͮyFhG6/wdWa_h=—l-+l`6*3;4$->}6zjS{5o4if]ZS;qq;ڶOnۛ ݎýE_gmwLw.ʱʱ2lɶҽcmbY{[` #w/^=;?~O'5r=δ*{l5:JWMߕ+tbvٕ"_wU}bv]6]{ɖbfb׿w{cuߡYXb+E?whr?kڒ~əzeC.o3נַL1}98ޠͿ~> s]Mg#mJQwK +n{^:~?~ߓweșZ/jP%w;vymr pi0_}p㎍8[77?ߡI{9ܿj8V88yaYhoj}UEEoV9Kwn)Z{7wß_x_[Qo[ťw:~ v|xX|BZZ4>{|}[{7ncא5PxX|Lv{7voB|pߜxv\Eo |jiwSqͮw,<~;ںdo;u>!@/?ϭNn=|ŸM;ͯLsf`Fs74d%Ӷ#Y)|ų6}Q=4m̅{Jr{MYyw}^Su(}k[d&d)ɨ6?2giˮq 5beCqgf씞<)km!IzBC?e1|~~1{>e#m-8BC+mzC-;l_qD?6O|X,&\y-YJsoXuBmseKfMm|N2#|;/˖͏u0c-ף8ߵbsmϹy[vtr/xAhO(8=ԞWZ[(j.nN~Y-]m];VnxUzUGVY׫R\$^'?yOoVxƧƲ$gvCKwGA=vtq_}n[|ɶ.=l[eE%˗e1^Se_˫W[Hkbr~ݣ{zTu,ܨi`mѶ/J FyktFyϧw7p(ʏk,s6.}^OFV/U63'NoԴcٖ߭c}ѽ&ɶ7]8yd^Kf6.EJٶ$.&r는>[xmkwFyr%oMMM]_Ʊ"%mSR$ٶ^; SOt+!Ԋ,]hW~y̙"^qWy^FfwbXO,+_sfΆ]sٞw Okl뿵_msq^_o:\:cOFɎ'˺ ϛ,WXlk){\MmHg,6^سFw˷MjpiĴ >ju {U>xM[} }c3$qC<@v.W'%ė@%mH]b_uI>奪ce-m>s*O-wfPk飦7Ogos@ٷmZ/9|nIV3jw?K9l꼄uqEǣ-5/?k>y 01a_z]!23O_[_xxߊ9%s㺃6;ow<MXvW/E /_Yx[bsŶm:F7g_-M"}mz]Փ}þ+e+xj6w{yxþ ռN ȑ/;wo@}߉/ٜ_꥗?/ʊ'3kF$n{V<'3#wXꆶuےW[US|Rk+?-vu٬1u6qGKOX'so ը-ڢ_xk#OASm+裦COX6k\f߯ |3m_QoNUd4֪:WF/~WO-/Ce_=kx <5#}q)kۯZ6(B^n7gNY&/{Br&gvȈmzP>yK,k= }W:hfW珛TKM]Axrm͌G_ɒ2$.2w-잒xߦ')kMxg=nY\++[NGryWi>xþSU+:9a N a:lx~/=%^W߷(ȡ/cz/8?o ?)k;w%n-Ʒx#qC.M<7QX\$)kWUkkorQmC7b+$X}c+u-lfnS:E"}6*_s}M,u2C[/_9 L,%%>.=e5x_&+/<\Xl7IJ4P>IJElgG*.L,2*NeNy;({S>j/xk[?m/c݋#(& [r661336䨭>#VbYV 9#K<;[brb8:j XhKӆO96Krq,!^n-Ƿݰ`E{OӖ;{}vk;%jx\_=_㡏\c3\Zg翺L>;5\Rs*}v3A]Kx;5/99zGvKqW~Sykزx7GvKmMMo2\%{([#)?;5/sg;5޾5%/oؠ/6@b/nI-9~AzQP"xkodtbo}t%ɥU'r+ǜ$=7Z1D 8ln/OnXrNm2'r^X}G;A]6FyF6Mh8xӵ \3rYfInQG^^Mt෫dqmƶXɇKS2r%v/׫CCr"bw݄>Z~>bK'v)gm>z)WfXL> NJrȾ>F.>;L;7igz*0VWRi#ݨWSȵ2c>@_G|]e~ÁvY_| &}߁1_]ý%6],7Xݗc'ߖy?9[.}Asx=(+^~o*QoTۭeZUrKV0Freu$zFU }=H[/ܰė{<~kz }OL?YrS˕;]fCInASx}zif\#r?rg/!5%7ъec2_.AOe(b_Y}o|}z}~;^CP/z^u| ģ^N$c^#/mH|;(*FH/Dc&_*hahGkK%/+/ya!>$ rGU_ISͤЯ-}-]}t_J} WFeȇ&QMxurm5MXEa_#4Wߢ~v5\EŇ?t2 uyAob~Anj_SC l.>$_(#uܶy񊫆լ4dqy}]Y)7A7JW|f5'v\Ϲ=󖮸IrozT,v1Ӷͽ7O Rn{Ij[}K} u9l}D`{b +Vo#3Z+k:wT4/~)_yΩ=Gߗ:Fqfg聝2;mk e!9]7ƏG&.։ҧ'smck>lb?]@ϼW$/ 0ޮ~ֲOү'm-[>m>v?ޯ54J?u~Dc}Sc~v~ǗtmT|ӶW [{U_ŧT)goU^ߩHf5s]"v6+Y{NXlm/?5:})oW=cT+6=jWl)̯rq-q:жn-woAoWV'm?<<Ԯo\յ;v\͚~ub޻Rqͩi]ljf\gѷR-wSlا/zv>mw=|ŨzCZc75|&j{ˍ寒u kArJN1ٵVNGj/9IUɮƌ跟{O^WZ-tXgjr'R@ce̕rX vXw1 nw+m*rզh_n`7_}*rNmsVcVW9Vqsl:̱}M9m: |וrYy_UW>goڟ9ts9̉\M;e< I}+ot>z tNr_m;!nǃxya;u=&ł[&(nC^c}4% {4Voej{ѽMxg|x?\iY_U:zw'h%ތ8ˏm|׿j{4_a|nūr.y /RۉOwZ*v嚻5`OʗkZKa_ect~ZbGO=rQ'W[]Uޣ>ӷm|wwauWUɱ'o6>fw5c+)g;D,)gv 63N|,0~PLZ,|sK۪ɴcd_mŸK%]}ݝuV=罭y~{e;D_{!}O@ +6Trfcl9\&u_ȫ''VgnGOłm3 PkT+mх﫮Izg/N"ua9֦{ųMNmpb[g^_*9[Sk^P5>/wu?& 9[~^k"wcu?amk<JrT{Q{GWg_w N,~/㥙/t7|c{Q)>Ws0iz3x_gpy\A|W;gpe 430jz3 >P|w>kz3`| >T|38P=&Z+ڢ:+=VW\O~ Dc:-+=iGp3ѣ֩l耏m-&_}B?4 腏nэ^0 dtקbo {?#0~G`  (KZMmEODvU"zjpG3$zfEU[g9|]@?F7zF/ ;g ~` >'|O8|.c bn4k>.'CN1;CZxS6.lwdq>.-ՂŚ8Zg;9n~&>F^,7U6zo01NS?ԑژynE0t iwU0 #fD0/f ސ ޠ ހ]0K o w. ޅ0~N l'ӟq8=vh}&8~Ui|nmO=9c[nY#?_)qO 7+uzן|xWo.~M|rG|{OWo./f!|griV ۂJw98'&]q? |vnrPtP~xz4\SGFjmaোw]>yyj/+㥮v8#FN g~@/=^Neq8#vG_ӗ!Í!]`b.01G<'|2\rIYsgA[u#g-o5rNiC_´-ϧ  |i&giwڀg}Pxi&g-*L,m6`rAa'g- |r|0m}f_ >!g- >9k0O >9k0&, ,/Ur2=[b;~6L}!4_ >D_} =u-JD L!R؏1=6AxE㿣$U_B0j3M-1`]2+:o:a~FǗ :,.8c6GtX|b<:,%G#k,5 YOd?->~ >#k{wFvMȮ ٷF}3`dm~@vu#FȮ U#<`dW첀}=`dͫ.|d`t`tz'w w \R (piQqp(4`ִYOfqVuf><<`36 yqp^:BfGkQh->NsL0Vϱ|N~[Q9q8!O q,1rB$>iXY9? |f1 L{0mO´Ol- >q8]6CGa'g>`yI6 ڀ ,L m]Di&wh*JpCQڀX6`STt߀E#Ef.Q+.ѢsF(狢 Ln ]`] DO΢ >9.09.>$g(,l3`r€sQ+`r}&OLn |K`ɻK&L~ 0y48`rgHЀɑaL/8؎x^010q2`b5*`sUꀉD0L~iQ~IQI |Y8&ayGGGG>:h0_Qt>:,xn#k1Ev#kqGGrGx#k9!!5YUd |d-Z#{@#kulGjʁYAd>VȖ |dޑ;>1,p(y%?&jL5[4&|Jg\$5!ʹ s:5[MD9ǃXx^_ڜX8;C ^0tLL !`|0t\ލCL )`j怡& 099`蔀C-Co 0w 3`7 zw0tz?#`,}Cgxs5M0?n"CCy$`輀ɽG>090sC 9ـܘ04?`_q>.O}>]|;>o㮆|]Zyw96rm۸qq>o.}]yw96rm۸qq>o.}]yw96rm۸qq>o.}]yw96rm۸qq>o.}]yws۸|]yw6rm۸}q>o.}]yw6rm۸}q~Ng.w\ ~g΅7Nwtq"%/>ڲ}ȼ$鎚<هRW >d^}tGMCfAjg2EW8ɳ}Ȭ]d&~!Z 5y7E 2Pg?y[5y5k >d։p&~!Ajg2w8Qg?P 5yEp&~!Ajg2D7:EMCff=ɳ}|&Z>d~᰾5y/Er8Qg?Z 5yoEs8Qg?*}<هp8Qg?QAjg2Dr8Qg?Y_Ajg28ɳ}0 <k (n);sj3G/;sBSz}N wj|ީI@S{zCN-/;5wjdJ0>dxݾCMChـ&~!SNt&~!S^BPg?(Z)`ɳ}T?`ɳ}T0>d0>d0>d0>dj0>d=4`ɳ}ECMC&]4#`ɳ}&Z+`ɳ}0>d0>djg2 D 5yF<هLѦCMC#<هL3ѣ<هLsѣ<ه1-<ه̱-<هq 5yhfPg?a>1x% qw[W2(z:9z̺a05j̺10)j ̺>6 [[ո[wuϽ[Gϥ[ύ;㿏u}Lxc!;:tzC#G0{>d:0u]E"e2' zPoo |(aSu>P/cN 2P#xrCm\~@щ;jc7!f?vw|%z鎚rjcoINw7.f?v^R5 |ُ:~P;Oq GO 2P|jC~^df?8;f?r G2P|UC~32@ yg8:"@ 9vtGxj6 ptH 5R׺Zt鎚 >l~h 5 |@__k~Ѿ;j6P>/v|w^pf^5諧g8zQ j6WwpG j6繎Aj6 |@g9~>;f}vq GP>;9~ lP>Ot GnP>?Aj6[>l8Eg NjE_u8f$Cm fChQ)l(8ا7JCŀ76IT5l\z'BxBeNJmǴ){~w?u8W ߭ *z|xLN˱ğUE-o%OwE|NOK| 7]j3ߒܲEmW{=eEeş.3ߤ ko@ JkV wcbֱ_M|0-in(`g _CEkr,?Tx>3"G0tNп EE:7`CC!ч>0t^PT. E }<`CCIѧ>0!sC EŢ ["0倡!T }-`(r/}=`+"JUCW }#`(rȿ)Vз09׈ .`CC?d ?xڸzm7`}qAj :30|B=RoS[$y-H!CmQ`ꎺSC~ 505A-LS3`Ɣ _  2z72E}dwF5E z0w|_2NWn؇iq3zO>PJ  F7 |)Q7 |4K^h&AzjpyQꍾ#?QA/'J!O5 |Ve=d`d]AM"C- 6 xQYEnf |kVbg-F"Ch=#Jgmf5K%a?t2'nqCD? |见l|+nE? |EtKC~7uC SD |w#5~Y?>E|/-YB5(q-~O|(kPO |(kPC/P֠/\CY¿Be h+>5(kůP֠?^e f |(kPįP֠HCY'}'bG{ >'.|$\~\Jyp0r_w W+oD0ypppupup~cL8'\{$\x_%.޷ 󄋛E՜9_k gi兏uρ# _>g.|.%\>Kn|-$\=I:pk*ךV c_ W߾f}-'|- _ 79!?W$|琄ܒps.g\p9稄k\pscnnsx~nO kFkw _]sЎw!nڇ.?;w:{^ԫa^Cⶀ]ze٥F.+ړ[+l__=S36@bo9R%,xJrGp-ǽNMH&My-r|dfmk:M?.Կ-h[i~Vٝ"πomяNӟVK~ѶG9YL跶Gg7-LaN5l}! &䑅|0X_6{ʧ+aH0~d c=`towo=f#2} fc}a&B{ {7qAp/җ2Bb-Ɛ~5{z'/7L_Kȓc&Oyˁh_؃ &6vl}!6+¼Y=f%Ock A&8a'QlyL?r(-?bk|r(GqՐGE>ׄD>-Ql}om!?bӓj (&v{D>-Qi[ۨNQlmŖK6UQlmťQlm:"Q|Y8?;E+m}|[_Q#D~x(Ql>'b QFX QlE> | #oB0KGlF%f'՘[f%n?J;Jǟݖ^NwlsDŽdy>d373Y?vf#y3f&G#34}ݼ=+n7lfHNfdy|N|vrco/ocxׄ1{VKo<;O;nПGmk.Jo8"֔ ˏ؎>=P~sBGv+vfeFEGTz9qv06; >><&pXbvr->ǥN.χr-f'(=:qf2kf&/xƎON]6ag%'z.bVo>֦,6GlNCL~8[>3_=]6!ocAtѹ(W5Ģ|QwԐ:>2Wh-[j辶&JEos.d6':]^*'<02/\a~v̇ECl_0&E;?s9ZFOяo|~?2߂9y;cSk&o5|Gƻ>01"oBNl_qm@9䉅!Pd>y32`ɛ[68U2oL{ 92os|{90'vZ5Wڲ"g.E!llok D/4;d)zsQXHͱ~c6C>fc#bs| >Dxgi'nAg[_`鷺C>X*ku&<~B:>M< ၭGg[ޑ8u3*X1כ/tmO:oϜ2*TmrtmOONGVxc5t_9V3:;Zy$8؋c2&|]}t6i?Gⱎc 8&5ml%9~S~|VYy9hLvs^es<&kyXΗ66{uִ}8#vmsEn?g쏫r>t},M9<'#1YjgdcXנdYfgێΪ߿xx/CxXOsy>)7cνCSMgM׏β&y>_3:;<1g}Z? 1w4yӯy}R_}l||1:oOMͳ˲UX}:faIcN-o5&@?a`ـ[¹@{7X{WYy[S3W,ڶ= |n٧WE[[w _ 兊_ڤZ{'=Dn O,CB&e^OȎ6sM}5{LS)uycn1gymC i9l{ j}JIG׶̖?W,;!Sn1E|KϺ/ !hO)? ?0kqU[L qbrcb1<628o_B͏f2fb[;x,W{r9OBKf=<΅8Gbn1g HOܱr[煹9'\Α+]~ןS=x9yd>&܉s6cJ*罯TYi7=D s*͝žs? +XYMIkemSiF^5v,𹿷:w^(XXyiM-Y]v^!҉hs9qO{<6UďaTC4ǭO{<)}K};nKWo\ôʅ <~U*pk"}M<&8c#F]hz?zkI}51tk8uy?r֞x{k] vO!:#]Ty8oIb|Ԝo{<]v{B &e~]hk͹Toc&5O|O<A퉛}>Z^]J6+ qx4)ۼZc:S[Sb }lEd} <-qͱ>,߭c}"O5t _ú~_u<*0k9hx®ܪgl~YC[Sb VuTo>njxN>ZƵb]er֞}v/8/OVշ]dBy߭xr ZsYZsM<=8rɜV*ݭFnnim1S_b&/킥?ԗǸ/\^֞U:nX/yKܕ+kV?yYv/xn,s;Sk<%19.9|h#O}}t9XuKw'\H}}xYqI᜵=ٍg )ps;yKc<7sVhqbc_b_Ox)V{Ɵk~}bS_bJ_rsK%y JsSV|Wۊ9kj]W Ķba K+(c"y1Uv-1wSc٬}fw^pJƘgզwPpV7ƼléهNVs6ε8z~?egU!V!f0v*ǶbzV3ǁĶbqvP+mzd7דV!^Gۊ9w7sUW7W\c[1xV!qMm7;;_o6Us_\uhYq2kĬy- <^$>axi<}?=xkrʖV15IDOjk]rӞwU*|Q~)~c)cKYqDhu}~.ܾ.oZoc#xw-'}s >g=.OyjO|}N,d~8~c)8w=87#c#xбҀl 8Tb;}Sn7ccKqyx^?V>J{ikOܚyDZLmXl7^Tjk]ļ/Ϳıغs'Σ'xUoTĔc;.yUJc7*Cs-&{]py}V_c29w@č ?{-}Fח*}8^,[nSiJ,ލ<ݣ9yqew2-K~F-jTY}ۿ~u̿?k"OI<=d /v?Ǿǚ2}}5yآЗѵus9>}Ŝ/N6}6~-|,ӽ's97lSgb.CzW䟡bn1gyߪO1}^ɺt>'+#s$s9}qi婇?SQ۬O-,O?[ffRnsn\1sKc-ƥo[QUBn1gy's9/n\[Wտ؈9[bb·ةScߡ^<~-~x-|ϣOg}yي?bx-A5(b{}Ŝ#9s3vg-,Ok>b k/|~\Mi+s;x-aܳkÙgeܐ1<Rcn1ʓ*=|}}F-sߛx-࢙yss-,O'[6-uJ?;?[:s:':o##s_<'_thSS7??ƾǚI<=dOe5Mƾ=?"?Ǿǚ-I<=ds6,[ΫY:$=D~/O&ٰt/D5Kޒ_cľǚ]I<=d}d>ͯF_^~k"O'X9 ίxJk"OsJccM8uocfLJ딶%=D~/O& YR ꇓ>$kbw28=$^kXOkf}5׺8=Du5p{I֍܂/W^ W(@y+P^ nijĿPxZգ+rްtt6}q{yc-o)~5w|}a{fT}<6xgLȣO|&[|KI#!/٤r~z>>?)k˲yzTֹjޗXȣO|[jrz&ӫv6ЗU-fyψ<ԤQRgE>'!)kkRo4wT{yGLXɮŚ\\$ _0=yًZ^IE3ha^xqy}b">wVbMUCy^;c">|VɟŚnly}n:D}3IY&|7&[R%_Ɏz>OC'>/j5TI&#s꾓˲>{:D}3%ϊ9?blyyy1ȣO|`9Wy-ó[Yx1_bGؗse70L}kZ3sbs~y [5ٞG1>/%rQOesblլ1ȣO|b|9w+i ٔ ;{l7g'>1>ϐ1vbFfUy?Ǻ}9GLƘ)&97[36/o+y`{| AYO82%}s#c_bOqmԳyewUKOZ|mFe yG9|wlmYV9eYzq[ {,;0,kK^YVwT;V3;>>7y|/O|Fe?{~!w=^\Ï=#}"zN}{lk'];>_=1&x{o5k+s6s߹Tlyj86k7W>l16;ܧcx(%X['}kL6鑜jk^Xjg ˊ5Bm-6Wcg//<60/)<60XXXv>s?.Cctoy,*XxnkH\+ۚ׶8MڍɆ> +\֖ĵ)1ch[}XQnskQ\s5*Eq͉ks:Fŵ(9qkkщŵ(9qrzFT\׮ww8^ PSADwpwRwUwCwF}nqvϙw략cg듞z3vE7aί-O볅S|xg듞tV7~nj/I,MϨ7fOϏ}}?V6En|oOY}^PVTeEnn>4O5 n a}k|Ճ v'~ |?A>QWU1g}*rsR|9Gjjs|XO5>>5Gl[V7vZ[Sb ϧMjj, <*о|?9*0S<#O>ili?*0ƶӘZkcFjj 4yUaOƌ<$nn>;'ݶRI6{&^[SI:cS_RSim1S_?qs)xJ}I}LǷEyK죹OԗǔH_xKcH/柸wj$gt<7b. <%1ş/O|wFY/)(/OܺK/)zk}<[yKca/OܦW/)~u %A }OߡoD>]?<_ћc]?Pз>]?ݯ7j>DO; cpcz_EOwpW맿C-ѭ._+W>83%ۢ}5qgܣ?kǾ83nc`e'xƽ /p;t"qgcѿotϸM_W>83n?tljqqg܎KMb83n证U78~_'Mw~诃kbw7f荱/FOk&X}#O맿9.?EO-p}Zا맿=zS쟣맿zϡ맿uG_E Rtwwb]?,ty ]?ݯ輜|`V{cy'wuO<~ bvަ觿݁\ E/ǶKC_G ݑkga4{+ro1qoA.GHp6x-usxƽ Cqg܁ȕȝKc<ވ\ @Πqg `4{=r*r؏cB\p.5#vϸc|\nwoxt9W߱83ncy|r^}vϸ @h=l b܀>N Ux=~m}{!r.x5nK]+џ 6Ǿbc^#SFq'';b?iy.aOgہձ @|\6@nE+-`ⶍkgak@R~'&9܎>Nw@_ }.Ka)O_o>z[& G@a;7EZ w/8 lcNgׁͰ+#g`//M# Idbpsn9}c`ⶅn_m`ݾYáa?^w}|dy|q73Ǜcӱoc^=a?t8_ױac^[hWGsrw "8< <6ǡqi'`5[smǃs:FC7{[bw }vlnsqq|6ǹqo G&0StnC-w~]\\8r<9c3m۠|Pam"}!Oa t;nú> *n۳#Ac _ ^nTܶx!;w긵vQvz?Y-gMyx16h;gl9O+.xZ'em

8/\G\]#'=۸v׳Wϣcnsw=w]o ,nsw=w]4ms<9:8x<<. Y n8{=냮cgknem^c>8GB"G"]RuxuD.D\y5ú4B\.B:!v1G۱=۵ok}1'" ucm}Rb/b5x[;kq:X#eH\x6<ľYck 61rر"50in>z<5_x쭡c*ıem1=^;^=1v5ز%۬m\c`"c`c^`=Pyl߭r)X(1C!cOk=ː~e d{Ķ=:Fz ckN|-}Sd'G "-wۀ*ؕ+c-ðT>A x1vC î؆n[<׼B{{$_+a{{,x4aWg=3u*pk9y7Į؆Jp+1g3cϸ炗-+0q{}ocϸcϸ +0qx?Ǯxƽ <\n]1{;x Xb n+ b w]18w;cϸeVa< p>8/~_VR~ OdvjvBNE_.e{Gp"r s lNfh/Si?r鏌B!eBT|ar{g ^܈| @"!#za }A@EnAD",밟smsp4;o+Vd"r&2iIBNCw y 9 Celб6ۍڞ~ B&!=o`6Cc۳]dld(.r:o~)u}۳Tګ? CC؎Jz=XEȣHOe?ǁa![c{c"O"8p< ۳?L71V<wFFY؎ \XSZR|c&DF #jr!b!!m`lNj؞zt.\XH/}ǁa2n;gyH>:12{vlv+;\ -8 SF؞VEG.AlvE #)m9b;gr)⾟ /!5q$xwj $p y9m.ED|ͻ&dm2V:^7!"sэbkm*q8^7}ϐi] )б}bl] 1ilyyFOr(^EAȷyy= Z+kyͶ8t<:.|5b:趫ıcmiu y Ukx=o4_v^GNEY\o.\7O5o9_ @{Րƈ~mx\E@`?8^^||\9Ƽ>~**w 7÷~ oH@vC<ƞGNFB?,uwlHa\c\k9Iȟ3`c5SCPYDw@aזqn u=O#' 퇾k [!/#"wWȓ_;_M"qx_OAC~Fw~m3]OJ݆쇴F%r #~Uo!룿^9G#+aq]J}ȑد yw o<67gMΈb~U Ksk};?k}97-#| >9 q_c"%諑}ض!9qhc^UztǮʋtx,|̫kw+%cac^uӵ1+"D۟;l|ڻ6!kzc Kkthc^kб>HKtc|@1?wq9i<}3AmA0AwBzv-ϐ)MyyfxfN >1ᘾ41_Y.m ރ'myyס^UBf"ףؗ wBwa>#{vѝCk<ǼV:3r }6wG\C8u:C6엁yW56|;h? qq=q]:f!/g0_@w8. Y<ǼynMDx Aϓ/=oz_wKK;N/}ˎשK_Fwcu}6J$9켮^xS,92`%9"R)C*#'c?Cx>283\dCd,Rϸ #㐍خbM#:^Gs]꧿l<8a~[kk7觿lLD"~O{y ~6cH=s~ !#"mخGOyzS?S2ix2|32qzO[4ADϮ~_#"O!M~7n:xZ4Cfqgg=l7yivϸ?""! 83~t+ۍc<<4aqgH ٙ1qGJHvϸ""SFqgܿqgC`+x5X@FNA~=XTC '#`lD*! ]z;c{r5`cvlvE:#[_ڎ*DdK؞tBwmlw%r`3vlv@G6G۳Hk2zw9h;g"/mlwvlvBC6AlKXO1q?GAj_z}kw lx9|χ1q#G![1q?DD6D?<4iD qg#~fw6ds@46r>٠x]E~83HYߝxƝTE?x}9Y4{1q! Nqgܗq3vǙq78"]ێly|\9؞Dnu?}(_Eׁw{o~?Ո nݬ?;g{<^ðxv>F=>썾dkG^C.D~Aן [ :[a]ώ>#\aw=u]z5Kk;zZ{# !zZ?A5=zZWǗ+9[Gi]~e؍rzK/Nޔ{y5ze q> 쏾cEZt_CJ9uLC#@m]\1F75c1 DDo8x9~'>AǑcw9K'#Ǔ!._ ǥqxq^ ~|&xqܸq7 nu9a xzsxqxr\y :W]Ait8^&qw8^7M[Gi]BGO}O\(h=k5q > nuYx]2 Лw=oaÿA.=N/[3Rp8GHkH' Z璟;!{qlkb7!5z[=K@?_ZgmȉH;\+"{qxx\.Ou=qxx\6[gmݛA ׍>pl}k8x<<.ß퍬@<pl>Bn-'!K> Z3pdO Ѡq7_׃c~N:fnADE#7×7~|+Vp"ye\mE?|{x;{׼/o;g߂Imv(o;gɠMrg߃wS~ێmNbצ؞,o;g[+Avn{#xtO۱= Ev۳ݟAϹ۳UYCsg+o;gb%gA9۳@ 'mv]g۳?Lp vǎv۳?ଢc{,gcwi= ꧿؞ _bwk=Tslx*ߵUش۞z`8},؞hy˰k=~t3^eW].k=~#ko;g}mv_(:~ێϿu{ |uv۳]=_o>ݿ.@wz'<|[螷.k7_~t7O5n*nov5o= i=uC/v5o> iM{|π맿yxς{w\K?BO4_oѽn<|[Oн?|3O<|[>ϗ; /bj7_~s~r'iv5oCO4_o=6A N7kS> >n> ꧮ9 <MLP?u~uˠ~[/ۀkk| l ꧮ}X||O];[`#]P?u N"P?u;;k_ 6?k O]`Sp ;%nנ~ڗoAԵ ~ ~ꧮ9\ ꧮGpp3U` 'WP?u_wP?u-Rp t^ ꧮy|o6=8}~յ7;G Ppp"ko >܏&`k6w+!9|}{}AMQ1;k/#a6 `~n  oꏺ6`[~>  oꏺvMd?y^ 7G]1 ౠ?s3;k?1ox"x4u'G]@a~\ ^v7G]{7?Ucާk?<v/{WgQ~x9enOscWQ~ 495`OZR>گa>{=xxx6x#h{)uMy voom/壮6 v{?xx2 h{)uC.Cy;R>G'ey;1|Եǁa>;<vm/壮8p"hcmAKk|lw2 Nm/壮I@)ap8> \A[3 >\`p s9&'A94s_π>wYp+9Lσ>p[psY`p6="86_w;s+.k͙6_wwwM@k6'l \`s|~܌E` ~ϝ׺duN~_z@iu5h?:~ Ocڀz| :NOu9~r\\DZq{8w[7kl~ ZG?t;ǁu|̫#h9/|n?t8_@A-q"m9t'ϛ;~lqWω~s^/@?sV) ߛ*"' H$Pmm.H[DÐ}@NA!s$9 qߣE11E۱+:숸xO'6UΈmh榯9c.Ƽyc a)86_#Ga Sz|^;쟣G7G ~.->3/s?a_ ,?_'7cߎ?|=} ހ}8 pBO ~[p 8}wgȢݎ|ڒ-=h?~?_ @7_c`W觿?fJt?k3V?'~g- k{]g~8{=دqG?j@|ژ}sp5h?~;_ 7t?kC.M觿t;K7ݟ3o >k{/~ߏF|^ G?+T3o#"|K1o홏yUb_v0w@n{c^_koVay~Gn{3?WVcy~kWG=/D\>O >__ &홏yh@k棟7B=1ՈYW}ެy~ǦOX Ǽ~Aoٚ=|_ln{c^?#ڟ r|nL'7E=1/#9}y~߉9홏y@?o5OSϛ>S7wE|!=xy˞=맿7^ﲹ$#O?nP}e-q^=3mSfwo+ߌux5_y+P^ W(@y+P^ W(@y+P^ W(@y+P^ W(@y+P^ W(@y+P^ W߯7P!7PR<+WfmH4 ~ oxӆ"𖁷 u oӿM}}n7w {=x7~_+Uo |PG>:O |RSg>'y|A _e_W[kgد=֕x͵R}?4^/7 qMox[2Vmox;%nwG=x/kyV,<7[Ϡ>$𡁏|t>- |N(Ł/ <𕁯 ^5Lu5 ^ox,恷eox>w Kx{;> _o |PG>:O |RSg>'y|A _e_W[k8ooo9L0Ɓ7 Yox[:𶁷 }x=\+ݛRṼ >b-T?(+ Y+UG赼b:)ZJ8-ا>g-Xxvl??/XS|Q/K˵bᙫ)rOsQS߂}Mw8*,rW`t-XZ^B_? 8E-\G5 fkysIr-Xx>^kys-1N`ﰖW,<3St nkys,1N`﹖W,8!h>>O S}ZO |^ }a/ |qK,ؗW[_>\|-rQ}>k> ,_^?7MY7 Uomox!;%n{gགྷ`~k>"с|b>39 |~ _$/_W*_ J$t6}K>{%qx87 y-ox[6vCx#O}W'}@ [}P! >#}t`3-ا>3 y> }a`_gY/|eY&TUE~`n ~i썃i7 "[{`om])ػ{`=g>7~~k >$؇`}bO >-ا`}~/(`2ؗ`_쫂`__^3{oc.BeHPZd%ZC!&*$SfKJBf*dXJ1+3 2RwYǻoDZ>?u}]y }֓yzAO/<}􅞾WxJO__{fO<}c~Oy9O=_'OVOO< zzO/%8!2赘~9f܈Dr+mjCm'"'I{^v#W׶.:scy34?G뙚=}Z5ca^jS*_u"+[.Ԩ̕4iϽ4P+mj φ㽣פ-6%&FZ9K=^8oer<qoVAǭܖIcILߌbz.z&5fS^DhЎ٣w|=vz- vscR/[tJ?4~&c?뿎*7/\ou#2^m([HfS1.ȃ -U{Kyː{[y58yݘZWMqIM*M97$7$o ,&__8Cy`ۢ |m鷶^(tj׼~%sq-Xr-4@;s/,>zͥ6d/R,|B3]KS7ϜP[Fw8?9 8PY7Jm`Hy㻛T<6_k23Fv\VWsAĤ*Զht3"Ų6Oaiaj&>_~@ʲۢ+NqCDLҏ2eZ2G*uc9tbvc~g~s膽;#GN{u΅uD1XiOaE_[I??G][dQڂ؟w~xjnN4<# #ek^o>{6f.Z:=c c?o;Z4ڣ}ڽb7}P+a4ܠ+5[{[wҼ}~h2Fke~)V/_߭߼Y[6ڿ{BtJIm? Xz7E3]3=w-fS;k뮱Dbufov,gWh~Wz?uD̑٣}|) yzl:䂼}-C4'˹O$}-1-O4a%qfh” p'ZS9%=vS;~THY;i. ێH+#֎_JgOפQ<+jpQ9xVVc]xL_5B6>X~#nL\ѳ㣔n|//[_C|yr,Kq~\}O_ |yy>#n2[ # Qy DZ0I|u櫩GG~PǷe~XUCWFB|j{J%Wm:wUGiWsF3Լ;RnGw/+{Vͻ/jmd}Uͻ4դpyg`afͻ4f*X0ʼ۸Ƃ˷O]w*y!oO`t(kŌ"aoxfA ɬ)4B2.{Κw4Bư~T{}zLBδN(hG?wio֎}~-hǹg~91hǤ֎ 1`xpGGA_{3W*Nu cscb=tb,5ȫKȫBm ǤmSnł*ǯuG4Ƈ[?b%ez0>4KO-6-bS[ګy;w\Ks-y㉌s֏|b/UדWԡ*v$6fb s|x0_|֏xR0_|1{B|A0_M|N7gn̻U{;?Z? Oswkn>2{G̻2>:r5"w?ȼ{RUޮ(oMu=ae=8ZNOXqQko5U=P!#zcxBKm41JhOR{ѵ:8? (v|Ҏ)j:xq( Ȯv< d$Uz+|`[Cz~j}sGzGx|ps%W}l_Yyu]{ຉe>}*U`_rK&* %'ھdM/:h<s5>.IgmuGԵMܫcG˫_1>!^ʔf>[쯶Lg8]<'\}pGg>j7}-Oq>%'NXfċC&ĬK'2_]*Y}4_՞jw/ c=wA,1^~ 9oD_?wGj`2CNv\#2hȶ<"'Jt3V:'W43N73#ofJdfp';UCu F*Cv %H4ҨLrEJ6;5iַ,=xMKkFϚf>ChVū{-S%:DwR$'ψ,"~+ oTOZ/h=S}Ñs-ܮ^jП.yjMg8%WtﲞͽĎZt/m̤, ߊ^nOlgJv58#zkh7w~lBm|<^G\G3 *SƇ-1$вq,W곝j{`aWg<+~#+'Q} _o'Nǒ ~svwaʷvv@hر_*3A/~Rڰ"\}Y^=?Z4p}V<WC*rTI$j aE迼ZS_+/9H|ҽf wFQ=**m{^=-#~Z7A(Wc7̿(ڿ(789܋>kd| kȣ1t(coj|dI(TSE fC=;4~e>gh[QL2~ԳNUlS_Ӟ/K4i> eW^ˁJC/^^Vf/}W 6_r% `{SK9 _|'ʜX^!t 2ץuU3sn:$ʜQ]7|>F>濣g_15,8O׷4we3u} ֹ17Ζ664mczGlt?R7oeėS>elx YW_ku Ư}c_>}NMZ;N('Y1wdY^[4~7[4wkx7wj>?^|A0 Ϯ/1t}%˧#_jyx,_/e~aU:pѲ<75k}n:i'zgQwG;jG,*>4%S3d<]_v0?O8Cvj#LK]X?PT|U+qi(/꿡 P|O[o߮`};r{;XMc}{I=n 7Wx`<`ߍN:{\`6w!`um/Nd*O 7>W&P{z~Q'wdgVS³^F:z// =غY&*oz۱7-5U}C~ 5*nr/+(>2*tgQY UBI"BqҎ^kj_eKP1xKݩ?8Duxti+YF<ٻtMUUVUoG:q}ѽȎK%8M,,Z:yp}ܠg\Hн4Y<کޫ;t}Vov *˃jAe2=_ȫJczV^grs=3!aWhO7em{x!z9U+}zRPf9#iP\WK7ϔ_ٕ۔'ԨFW\/U)jԎxSEi9uA_U,&ѳLPA{ [x;g*nÃz+z(9{]_oA;ng(|+ݫ.ko'U_RvZtP=ha^> 9es+ßţ5-,n }wڡST>ny{W/,_z+IyuWGߩv[%־]Bo-8'u”IS*Rc#m=P{vmH6jTƚPHsb쪺N{u;$r̠/}(Pȝ=k׺tSS̅},[7WgU8yqCZ-}rURp@O;{̠+ԸWωp}j/EjG6FhNJP>pRM9_ިjsMRMs O>#(kUT,5+GkPﵝV{m&^ &Xn8psT=y.e e|뗜m~kVˡr>[v5=b݃57˃n/ yիj^>6+&$?i[8i^LlF6剱HPoVbCkfcÃv;QwoBay#Ggҁ~2eiwZ}-Ck_ FX<މAޝhqķUwڑA)a{/Y=sz $rXm{:JƵC@+{qJ5ZȳVsОxrjBjux ~+?{?{ COgv}pq_-t&mYMӟnV7V/5_fP͉ԲEYѶgʥ9:𹻒kXCܞ"ߤPnCLmECz/{?zUNr.7ũ\*vExTڱZ=V+t>^soUL^s-~Ij\Ky0!B}*xń\ Vӫ25=KOmtFwv\]fXm_3A{ϷDA<:r3Tbt{9GZ?ϑ{x̟o(zqv WX| ٲ>eV^%NkO4ي_u{Bm KI~ wfK}:^pnS7ޒ7k(=AߡR[bQퟥPż6@ WG߉9vϑ cCP^M<+V,j/ii/ BmLJ7[kꭩ_.ߢ uj&ynE_KWzvi8aWw'v 9fu$C[{ɖ^7藇Z\!ˡ^}߱ [<{ƅZf{{QNȹݽ"4ٲ!Բۘ6Yk(,/r㳡ƽ{5Z׺C9o < V9{I媡Kx_)y#ro4ZQwbUݓ1}uot/@;34/q}vnGyz+>:}`A|v]3"6ܪ%\G"WvZ?,{K,VQO>byЧ)*6s,7 q*rwCGޯ=aW}zjieFݝx@msGG鞪SeD68SGN9zl%j?2rVwZ "f};6S{'D3ֿ5߈Y?/z+hM>ҳN#{/J9ceԿI\=Ɗ7SPQ8zvdKj9ك6@}uQ\PK^1A=ގWd-{&1xSXIA[K vO^ 1kп[;b_^m9ϮʸVO~ Y Z<ΩAFcqX7#oj :<eq˗#'eF.VS|t\[ȒѡOٴlB?<;V+j{%CyqF&6ʿCʿY5Fƨ{Fsȿwܭ]-aT=}N)O8z_UܨRP&*\'CqtNy@;6q8wgP{}uH:(7wAWu:Z{j>m*5}k*nVbW1ϮoA>vۂ^h%+ުﷶv_nx}_u嬟ɿj\h8zq;#] =Y|WyJ˃j _}krB5:޳ i.sVIkbgzvkG6SFvyP}@;}z t][P[5ٶB-@5C߅._WZWp6F)*j_C:52~-M?%eE 5}]qM=iU;.*hGxSEiu}Ok}AݗZ'G_wl5V1Og+%IwHq;ԛr] v}*X1X'ho((j'W,lJUro xRbqߘڡS<ۂ|=A\Zrhk ;wPl=BTsgalʩvs^O]jT֞8fhG~WZ,'{6Aϔcz b5{dP#wVSvG|H3/ݣ,=iSG+^Pvrݝݭ~u|i)r+U?.LQq}s-}Jy iuZ_em6%Ag}`XZ_Y^gRA,hlU }jrU<藐ptkj;}>=c􆇞J^դf_ߠ?\dkhwdyWAʚOiF ׷\룩\=Ϧr}2MNr}E5p}_}r:|;ɋm"߭eB/qݽgj+s|!eT*͊V-az6/GgB*6t!~kS\ʿ+Gȿg Nh&7YGkZh|4J|_#NﺌChOe^},o9߶ZLJ_evn(`~z诹-}ZO;_]9Ҩgo旑kD_mģku]^~;y[R(swC $W"%ֺ{7r< Ć!뿙) Xֺ^٠&w5 ;k1#bn>z|aZ|*8&vw/WY| 8/yi,_e L˿?VN嗖t/^)Gl|X`||fq6>v%G6>>/56~|1V?]X`y\{y_ޱ/%_z`~i26ogѿ`~94>o痱6~_.4޺L/X >g_`8֏efq][?^Q}'Jo?ŷa}ַW8[V+%- [ߊ*n ߍSmMS}VE؄L[P] /ԭ5>FY mAcC?b{4>G`*cˣlr|0~_hF-Im_&KOߔ8_%UI_ݨ`4^mι9Wώ֡3᜹o4V-nߩ_='NU|wr*{g=><s3ڛZb[ kϓ(4-ޯ^L^j'#&GWH\{<#gպ ];FY7XzOlk>Єߏ_Qi+v9s7M4w{Jm\x{=2B{'Ys==s#sڽe-ƦE窑\{O|j?Ĺ_ [qԞmdx@^i+5B^U*"U|[xnQY#MsO9Z61J>Wk0מzwkE2f Ͻ\sojmZm4ΫÂo0V*œꯡeL`Nֲ[qq;Szzܛ^:wIg8&k7qwwRءGZ{9^hz1A?yCbA?O[flGyiŷخ I -}򬉕 kޣ(WGc ϲ*D `ye[\OnsWc|]峽]6vCc0&Mqti88o7sYwG4Kv >kp^|,lhGܼE.Il8z/Fơ6o j`Wy1_]|+{o~yr`>y 6O%Ɗ`~NZhsKWWY6?{(䕭 /(kl]X´e.*䳭G|zt[ƆV[Ƒ4`383XdiGw}o@K߮ =ߗN9XxeC~MR48Rk8Z18kz86lYqQǩQS6zmS6S|qQIS6lzlgYqQS6zS6lqQǩǩ9S6zs}^iћ9TzM=N=MX8sz8FAll=N=sK=pS60S6S6(}8hR(3ԃ>ԃǩ}>G;Z1ʌ8`8`qF V/p28Z1,8`/8`/8`qQ&qFO8`qF/O IOw%;/)8Pۅ泌xFWL? xT#lfw0/o)x[a.; s;U›#x?͎#Pa~p|ǙK :X/8cV+'8Nu\ u+W;R8d k= Y:1&}~8h@=Fk}>8q2[=?l68h18ѷ{{qcqa8s(sFqaaA?Q~FA9q2{i?(sF?cgyqc9qa8/'A?Q~FE?8F=?l6oqcqa_86U>r4e8ѯy7dz3 x7 3;|psx<ltSlLv=񇍞[?Upcqa'z' 79q2Spa8ow4eφFqar4en8 z :q2yEUp}Sww|08NXqz?8s5q3mg}x vX0p:k38ێ3 qy=Nj8r㌧gLs8y7qKljbǫW!!6a!6^S %Ć?"Ćb uDŽzBlBlBlBlSBlBlx}!6P o$Ć7bßbÛ/MfBl8 BWbx2kW8lv8s.lj>lj!lj1ljuQ- 刃흂8zC&ljCVljC!!ġġġġnljCYljCEljCġ-^</ ᭄Blx!6N o/Ćwb; ᝄBlBlx!6M .Ćb{ ὄBlBlkBlx!6u!6Ncs}>P $ĆbÇCaBlp!6]!6=!6}!6|>R %Ć ĆbcqBlx!6|>Q $ĆOb?b?b?bol8}1c' }EqWfVWf}+3IXؕY(nFL62E\▟p+󡰨+3_򙘯se>|)nOue>BNqeژ"V;} ml1Om&nsTiBl'Blt!6|>S %Ć ᳅Oτ9BlBl\!6 !6|>_ _ Ć/b ዅ%BlR!6|\ J _!Ć 1!6<.ĆYEۀk.xKxw9a8\O!6~"Ć !6<*ĆprҮk!OCDK8}I^¹^Np%vp&NߓpG^‰y gY!9JbE)rNߐpbH5rN@lmN m/;(O̙/&s3/Sxua5b?,Ćbk ᵄGBlx!6Q!6^O \ B R J Z /Ć7bßbßbßb ፄBlBlx!6!6L -o)FQ o%ĆbmvBlx{!6Q $Ć$Ćwb_bû]WnBlxw!6S %Ćb_b_b }77pN[?ǖ<fo-!5T\}cI mO}fyKlm|}iLmѯ }lyN.x- ?9b㴅xuO rg23es_#aů;>Rmǧ [1NDӅ9}W9}ӛ zʟr8LwǗ_u|omrKL8N22TWg5+Pe.;cU?@׿Sف[ܹ?ʇ~qe>Z~$n}e8$!OR>^H9 !ㄔR>F1h!9%|cBr cwr >L1P!Cr Nr N|8'~8үwr'xMLal8y g`g ᳄4!6|>G \ +Ć!Ćbÿb Bl"!6|D _*Ć/b× _ +t!6<&ĆDžpRBl5BlZ!6|^ Ć-Ć#Ćob7 ᛅ-BlV!6|] !Ćbÿbw ễ=Bl^!6|_ ? Ćb ᇅ#BlQ!6Ɔ xOYLAXxN;}cI mq--5ZЗjMm ǖ䂍GrI[#6N,1qA%>6F# 9ew{!6!6~B ?)Ć(ĆbO gBl9!6'!6~A (Ć_bbb/ W߄BlBlBlBl5!6/!6o!6ַĭ kuCp.c'FiwVljO67'8N8q/9elj-ӯ'|<=o%/*kO='%_y(h+08qYy1?o.!vɮZk/}c@YЗo'}oLLŅZő[|;9b@X_?hFZү-9ocNj[ I6kRaoWf5\fW9UWfҶ22S6׍n}t[_Ǖ&ptҷ:Y^w?ڸ-b7BvW5+?]h-|ʳ^;J(;]y֮7]BGJ<@,qGH-}+&n,Hy=iocqe>]iue>ua42sm&vⶎ f8h1L8qcqa88h1ʼqa8?t4eFy#I8qcqa8?~8h1|qaO8ы '>y)Vj_"ne(3t7pe[]vet+SN|'*JB{>~ޛ;N{S|T7W{S|gB{o)5^GhMݤ )󌬟ә;h/\rw8GgLryXEg\v:o茭#NY!c}pi'GtcIr4efz?~8h~8cqF+qp(3㜇pw1 /}m{=_~j'y_ޒ~sS=랅| tmcG)xks O['R6w7NwJہ?HSM/{Կ|>+ |!{;$NWSCSNkag0g {>^G]|O:Z w#S``NJ9:hq heC;lM5m68xe` >haC6pȁV2tjpc{YS:_أ[1@"E2P7x+OV"?1|hȋ445ط@"E (2Pd@"E (2Pd@"E (2Pd@"EV=sW=W"E (2Pd@"E (2Pd@"  ^>E<s(@19Ṕb:gb|FC^aNbOOÜĞ'yc>}#_ct?f!/0'OFCOS}I>2-x|9)rŔbs(@19Ṕbs(9P> coؘ_hȋ4I)꼱5ߘs1̔gqĹZ/rR䤘(@19Ṕbs(@19Ṕbs(@19Ṕbs(@19Ṕbshl3S_d@"E (2Pd@"E (2𿐁@"E (2Pd@Uʾ_g=KgJ5 78msKv٠TڡYt;NCo)OtO$񴯢>ŘM=Џ]ѻ;;Gn <N}4ϸϲYz{pwִπ#ؾ h=c{7~.裟װ}c+п食 ?@p$M^'>食yx6MҎ@OD~<~-h_C߀^~> ^IG?}aV#ѷ͹>)A`Po}w&cyy}~ z󺻙֟3f G{B;G?vF6]*@aO_ڍ7?iGDXڭ#џA@=l{m*/s6<*qP~^Ov5M?}7= @=lk6=~mZW]{σưϸα-Ac،gin eڃc_a3q=ǽOưϸv^4xBuz|mưϸ;ga3q}z6w?Z-7S6}m_6Ev(MZp>;#6=v)06}1יכמ6}u浧M?}O=Cs=4'[к8ϳ目P׺@oG3%8"9 ` MZ jhDx>sv!90 s-yn΅`'&9x~AOߗi^A}ӷ#:G?}O/@;gOhˠ^@}w[x=`48ǻW M~[I@9W96ہ :(| x9|Hxl ^z>t[88ǻ'6uk(qw8ǻz`kp"5q:8ǻT"R4Mk4qw K8ǻ2Z+ڵhS8ǻ E{8!sCkI v`=h\Puuy<~MkAz<:ޔֆYj[$T{}&T۟Xizyϱmhݞf߶ ;m1wK n3q;p8rNp9KBxӮ ;״cB;nLQx{= -1qy,!1qDGu4#{>j'+[$T{<9Mxg&NOǑ ~3mYBǓ㕚e7xr7ٝPϸkoGmuoFxE]P=㭏^/1q?Tp^'T{<9'w?Px~/=;z9$T{<9w?PxG߅{ZQϸ/G~tj'k NAjeS?BL6~O'~=*xo49Y OsOZ8?x{! ^ 'E(xRЗ$TO?}ǁ/?D.g~~0x_'TO?}~@?Pm$'swF~B3&TO?}.6=K3N9m^B|Z'TO?}K֡-' ~/ץPm<}6%GiЌ^OYB/~Pm<]HF q/^O6^E O7i-h}qo២-N6^{ IoZ~OېfGghH6^3Ӵ?%TO?}ߡ-mL+8]hI6^;%TO?}6yڿh~73xٯZZPm<4Mu@duћN6^AoHBϑڀ[~C~B-O6~s`Kp+0NkɄjeOFoPm@pop < <4o2uX[5=~-}9q8Ÿ 3/kѧ/\[i<-ڛ{黝 7h/% 7lxƵoh1^)~WS闏 Υ-f3}7~O<7O˼} p1m$߀Od3}7Җо͓2oS~z=oO~v=g\n o̗ys{i#_>WlxƵ Ky2_OH:19ElxƵ|57÷?|G?棧Ki+ߣzϸM-|o̗yL>c_h藟|4qs#KJ8;IXKў쯏~z-;} ^v 9ޕO_5sg؏~@;觯‡+ι]8ǻxsxs-x 2x F{ v9>7e{ ~TK܉=6{~s>3w=#OVM:}Gw=eG룟bM|z߾h2v4:}Yཌ%ݻ$cݻ.z_tnw#  )8}*ppop 2?~~룟?~g?>x!|>p}wx008'K\=4'gG?}7/__kp}LPoL}w*g G?}g? >%fp6_> |9};> ΧpϸۂۂSձmqcJp 8 =1q;;ws ne}_pϸׂx ~npϸ ?~^p}ӷ+ x{O7fk3M[Г^u Їc<z=z]76~^^oOf k{}] ? Ch>Oc_O_GОOpׁc@}wch_A}ӷ|=~.~>o ꣟{<Iୠ+@ϸwOvc<~~ x;|>y|p^4N=~9h5|:=t?@ϸonϸ5''1q?>z|83nK_o׵ >wG?}^:Q>!~N^GÏO_ד߃ZuzrLm{>{ |./]o/h=ZеP= AZO~ +x~ZON O@wA}pzFw>?h=y7kWzzzݞ꣟^^^g p/A9{'$< ~{Aϸ7\p] x:[~:ߜ??Bm>|s>ܐ>|s>kG?}Oς~Pu9~~>;t> 觯0\`p#O_9p}OAO_j؂IgG?}o/~߿~A}LKG?}O߿ 62v~5>|AwG?}D;_?-Zzp|~D;_GG?}-_G?}B;_?| ~z=8?;Z}|{>|zSp! u0|$3qgGOFxzp>Bo6| mithϸ^Ϡ7@xzpo'83׃~cqg\gm_c zNF.lG?}sIg> k IWخ~DlG?}ۂsҿ+OҿO߭@.c ΅A vϸ@[ovϸہcƂ{ѿۻwü&CMnl7;tLxp)؍nO:|=n е6;83n'kh7mnMEBخ~: 룟SG{x?s#x FKxm1 {uu5O A޻]g\o߄ y9|}G'1qcoF? oxX_^;οp~(ڵ}h@ϸC_VXqg\qg\_o x]~ڵc ꣟o­F{ ꣟ރA[|G?}7AZz_փD G?}Cu~:WC?G?} mx4~zz>>^^^+ǁ^^^觯kAq`WX|q=r=8<< <<tr=r=~ CGǃ@ϸG;'G1q]\/#AϸG`783QDx h$hbx<7hdp$x~^ OO_#׋a`oPu=rO_#׋觯p0G?}]\/NOO_#׋~>zs*8 <G?}]\wNOO_#3>>ki=8 ꣟֛փggG觯`P޴< < ~ZoZ觯ӳ`y|GG1qG1qG.c8/<_Ϗ{ gk;?#yt~9Ϝ'Ϸ3<}'U<AOo8?~3x#;o Zk᷀7|룟}}%?룟S-pW$_룟fW\ׁGp}vO;~Neѵφ룟a7//Y>{ۯwF_Os}׀;?8ǻ4O;e~wjpGe8ǻ]l%D_;w7ۯw@_JsMgxw_ ngs+qw~9-z,ss`8= w~_ns=K_wA_nsdXj;/D_Hs= -ߠ9zo5>;灛?~>vSW۟O:zcA}~Z{ɴf\չ~fp6zZGWw렽F{ͭ p]1q@? ~d83` {1q(83hϸ?G6K1q磧-О_c<~81_hϸ@ ~\#83O7@;c; {_ ;~G?}A?^W>"kG?}~l^.Z} = <{_@V ~ZZ:z;Zh}Yts {7 vKk'،su?ѿG+>o x-? Nqgܳ;gKϸgMqg3(p}MO`T}4cb꣟BN>;*ہ)`K'W\}w `o꣟_? ߥˠ>;x;Oa`+77b}w(!x(ۀӿ ~?>{_O#G?}. 7>}h^/A{?~fW>l1}p*}_Ʒ+=}mhOurq]W觯 w~_h>txqn~~G?}_>}wkN{=tݾ G߯꣟֏/w>}wm:8~kO~G?}/_E}}o{}{+? 5/O_ϟ}.a>-6xzܧKm}p&&食ہߜ{= tN= &~觯ߟ >}p8~Lq=3@I\ĸ@}O>}oc=;=N>M|.G?}hOx#kblG@}O_}n`ۀON$T?Y3kVAdym?H6^zk O`;sq?I6^)z;j`{pe8g/%T/j/q/_K6^%zg O_E.}&jeߢ}&j[<lm8h>xh.I6~=w@dB/M6^{ׄj.eq?PmzA76F^+xo]uRw#zq询?Pm1A O O~DnPm j駯<6FLBЇ?Pm je'wK6~v{']Ad{&T/Pm<~4N} {B_ O߃`O8`&T/> +x{(8 'A>,xk3G$TO?}#Adc碏J6^>/x{8<<'= xo| OZp0x!84N;}1jeaC_ǀKS@d#NC_>5x;  ^ '}FB+Уs@dWkƠ x{8 ']&jeע/M6~^NǁׁW~B_Pm  ൠq77I6^}#zbB[$z 8 4N:jeћs6~n ZoNF?])-/o x3kVpx;' z*̈́j~o '][ 9 '3.sNA%Z?ǻ@}gP=^_OAt)Z?ǻgx?|t?~NB~w?p&X[EP3|8'z6zj~c'' A}OnP3| }') 9=9`kp. O 9=çMmA}-Л'Tx"pKGV>y%Txno~mB~w`p#OSs{σ;/>y._N+gn>yWНsu_vBgB~wWnBp_P<;u> 9_ D/BPAA}^7=s< '?[ 9}#A}ߣPhwQ~>y|1 9G= Z?ǻ ;>yI迠'Tx;\ CM7+uHPy9[y=Wx;t=֢YavCk]B73s~lRѯC;F~->zc\6>1+T3gecmgѦ3A:_{1Ե*2Pd@"E (2Pd@"E (2Pd@"E (2Pd@"E (2Pd@"E (2Pd@"E (2Pd@"E (2PdN፶_ɡjV3 Emx*ox.wcϟ+%nwG=x/ |HG^>.O|b>-|f>//_ |a_[/ |i,p}e.xM-ox7 umox!w s]x{3ށ o><𑁏 |tു |l'>)ɁO |jg>+ف |n_ (Łn/^#ks==Hr[*ox.wc[x{' |@G>*с>&𱁏 ||'>%O |z3g>' |~ )W_VK_/ {v5e(ց mox;)΁w [x{' |@G>*с>&𱁏 ||'>%O |z3g>' |~ )W_VK_/ _"𖁷 |[&𶁷 }x;%nwG=x/ |HG^>.O|b>-|f>//_ |a_[/ |i,p\MTjVj^9eެsXr Otut7ܩ߭߼ӲO3ެOJϟ>BTxϿ>#+>$fu}U}R'>)ɁO |jg>+ެ1Ϋu*Y o^yп›}C+d4p?_!/  E-oU> 7+I+mox;)΁w [x{' |@G>*с>&𱁏 ||'>%O |z3g>' |~ )W_VK_/ d:oW & U:6 ]ٛSm~gm'p+6 fk澧jj澧j澯ii流 |l'>)ɁO |jg>+ف |n_ (Łn/Tځ"𖁷 |[&𶁷 }x;%nwG=x/ |HG^>.O|b>-|f>//_ |a_[/ |i,G& U:6 ]x;9.w {=x7~|PCG>:>6q|B>5iO|F3>7y|A/j _ |IK7e ?[2VooNs]x{3ށ o><𑁏 |tു |l'>)ɁO |jg&3Y|NsR0E/4w_xi\uxM-ox7 umox!wf΁w [x{' |@G>*с>&𱁏 ||'>%O |z3Y oV]Ks[J_K yV o^Z YMK*yiiVxҲK-›Z޲›ZQ7+M2vެ>޼Ա›:޹›TxRWxR oVx o^SJ}WK*YiPC*yix7+ |T7/fTx oV o^PJTK+YiJS+yiZ7+M|F7/Lg>//_ |a_[/ |i,BxM-ox7 umox!w s]x{3ށ o><𑁏 |tു |l'>)ɁO |jg>+ف |n_ (Łn/}w Sx#O}>$၏ |T |Lc'>1IO|JSg>3Y|NsR0E/4w_XxM-ox7 umox!w sgp񳷚}..u?uO=ev=:pvi5WGW:VpTs[^ư3L:k+_yZ)}\?"?-D=z(p·\]o=Vv~jn^eu_S|=}eu xJy5Ut\57#k:Nzp~"/.t^ouvI} }_8*_ܺuXn^w/ϝICystYDV+n{#Zv5^Yqey|sܲ9Sy>9՟y^+̫ Zɶϭdh?'|kR^F5/꾷~YX֍~^{P:X_{u׬ g&nnVνn?tMʣ~v^?136vq{9Κ__?=ӥij,d"\v"E _~9]؅_Q*@;xv޼⽨nV@UoEԭ7"r5lPrڽ8F5E-1z0UnX1ax;?nv`U|_㹊9o(0G1gyS|(2Pd3x>L\gto\y=^Q=x>XsêmF_\5VTUfKub5r61x)Mz>8Ң2D<븽<<4_ϼaR^Wd@r`zUFɧ֊SxE`1y!>X݋zJ:$׃9o]R~2ՃNF.3aC&Ճǭzߋ]kO|vqV%ߓĬ@3җdw\k,GGnjdIzz0Њ=׃^<i\~$yPsWũԃS=7#OYI`k̯羨ϊz~F ]dvus烵pyXWq;\ׯ}&P}~5w? ?z0knQSW_E2`[c {soߓRnT'V#Y^8iRoZUݤzpE=X^[_oJe,~^T>_UŸ"E3!=IM\V},ߓ~=XA=׃X`9w9צ\5VTULubʌzpDqث|=*?M\>|Nr@UWG0cdl8ra~?+n_Ud@@,] Q}Zj1šzpuxE`u]뒯׃ ~ÉkV!X=OJ=T:̺g!{|z ~KIQ"s'ˊDEw"E*𧹵kQhz0M!後M{W;j)BzzZz!l3`QSW_u(<,׃9o]RvK`r=}CI`5k`׸|-P|4x>|W_u (2XJV|J烮o}f{j?/όsWT[ԃoE:$׃9o]RT'V##G^ÆM. Tνss<<:WsQQ Wާ@"5_~zj=5UT`_`j׃ԃ}R=j2k?ϫ;z0_.t.kE@"+@3Wޗkꐦփ`c^y=^S`Fר\漭v=J=xlSX\f]{7xGuǃ&=~}QVkA_z&E]|j/-bS|(2Pd3V~{>"M.ԏ6fQi=^Sآ +IWz0mTU!Lub5ruգG4 5TԃZ$:/2YyT7_]ʋ (2X`fJM}>X/Z:1׃y=^Sܢ '%G:$׃9o]RT'V#oZUݤzp E=XԃNՕyhNb\" WߧllVq/Xz0+n[jv߲rUKsWSWkS=j2TII؛;R_|Ep{|0a~gS{W*2Pd 3 T^ϋa5fLQ׬ȫCr=86孱zp0zT:̨* ݤz`mzzЃp^dϳyh؟yե@"|p?rrkW~`9U)_u)cuHsW`*T:̨O2r!g߲ʺI`ͭE=Xzm5y[O$Usƶ.(2?^ϋ&ZxMՃ5?)~^\t[#r=`*Lub5ruuЩN=)E=XW<ܗNR6ۊzZy5VgUPQVsQQ Wާ@"5_VXva|nFkeͺ`\ץCr=`*ཀྵLub5ruuq#}ρO:僔M|E=Xԃ:wsye^+^E Xy|=(&փi=^Sܢll`j׃ԃR=j2>WC|<~=UsG^_ԃ<4cE+ (2~h=65SFA§5)r=Xוϋzz%{~=zPOTYeyX5VRO`QaF@?).5\`X?E=0CZKRO.񟭧sMd"\(2Pd`Ll?ϙm{Qigz .T&}qsVM1yO!֯=آ,?sXUz0筱zp$zgLub5rQ6݇ ;քM]ԃ9X}uWGj.39a(2Pd2PV'WgcUjՄ/kZYzpnQVl:0S!y[z0zpQSX\fԃÎ:PӪ&Ճ5zpUoզW}A8'2Y9Tԃ<4_ϼaR^Wd@ʪzZ0BV~5˹*buDsWũԃoz0ՉeF=x#G?nd-Tνw׃ |?/nS8g"E ?Pz{QK(!Wz0mTUwS=j2ګQŸ4X`;ʋ]>E=XILRԃ RRt(2?O~^a~^9w煫,Wb|`9uZ$\Myk\L_\k68yIub5rQ:c?y4`|=X5VuQ6P) (2`?XAFZj}꫺'Nx?ՃGusEuՃsz0\\漭v=\H5N:#OՃ53zZzVgUQ\ry)/2PdeZ2V^z/zW|`^T=Xꩭ.e]Z8TLYxV} &n5l8yƐUS,4~{Ϧv].vx/ǖ76 r{ͳs_|ċʺS#'2x  ֪W=Ew!9m3-Y}=\2l ǜ2rİ>2_獡)Z~[aJ5>9[zޠTzQ#K[1_#fn!TҙQ'Q3d[6xȁ#J'viؾTySa!O( #wxT P 269ld!84xJR|ܰǰac=:κٵ%/QI7HZXk)ZYvℛvFwセehnz衇zz衇z{f=Wk5̙3g3O9Ϊ8u^uZaNȝIytH@lt;\}E֏k{9vNw2֕2lfSj6*I2"a_ՙΌH@ꇵZ>OnS/"`PGø|J,=,DavYz`Z>Zs3ir#W–aN?n?87۳As,*Mj؞fN :DVI4AcH.tam`.f|*0d_mY(i6Xr!rb{8]Ebl6aD_=V%h!dj:{`Ҝ4{ PFogp4+0?]&Zy )w1Gډ橀q X.Y; ̓GFDž' BBK'sA-sZ2t-U@D6?RKN0"/l 5;a0LF7,&2g2+A9g!Ҏj:y.(v:k•@bYq&`/ˏߖl駕`DqlK1  !_, < 7Ux'Ʋ?oa?mY|nTR@o/wN >)^'6jICjbL҈uc~ .1M L6/fx:C1F)B~e5~Iq XfQ^k֚紆 ~D:G!% [أ)cƵO6ZFL5Ҥx' @@_  %n3X._'y_2GZwo >w \^"U=~eSTVBK9h|6MM|3uo4_ Q*cEQhX/P,FDQ@TNxrD`,W(p? 1:yG H }‘Fg3׾cm];䌘]p0=#4 _}=]W1S/D?; ᘊP z"[i Kh Tzl4:I=vbe&nGj<6=i$jЁ93)R@eFPm\hf-h0,.(TY\v Ou7'O,tZqi/mq)TeYU#)SCVw98bP ~=o%j*" Lv`ڈlż#%f= )g5_z<^YJX2((4؂N/ɶCoJkߎYGt@SF\0N ڬƞN ~?ZN͝^ʮs9iKQiɆR.(Zh41BUY E픂dg4pA?D͸ qD0 w@/;ϕ.Ro9Xb}FkĮo:. T3+\Uq{s 8`NmE(;|A <:<*ôXaZUH4jR{j"n!k!hݕ[kBZy%KiX9=ԂWMԻn^<\4au(`8Bqv#^QbN+ؽբ  (J]a~GJ]XB .j *9F xiDqiEJUbτIZq.1]LT"ef_dWdB}.3_I7g]3țpM}:x C k|KԵ™,I>hEzF#eT4-9ju`{}i,eTĄI6I, 4 8lp>vC% Z 3@e;6'Yce{)%z|o>x.F$vI4Z3VX#&!%yOAg>"."u)#k]hs}Jh@ae yE=p`Z\Z,ɐcNw 7ݳYҗ[s%Snτa #Av-xb6gcB'g a/ufM4#+Sj`weրdL!^Zm9k4$7'-8DK_'\D=:'7HG*G3.#:i 0^*† ^2lO$tmki:٘$:(ID ?߁^;HW+*%6l 7yUJ$%g[fI|*$VqcX%aX4H\w{G=lĠvEgυJ >g8[N0Pѳlzh9ƽXXRaM]Ly^IȬ0K .9Cbr*k!i0bÍ x]Al2*"X ta8=B ƑT@v^m I5\x& Gd!T`Ϧͧ$2 QF>2,+GְsPfFd6|ϐ.6ߌyXjE;y7N_kxq w<>LEDћqZdѮ~b;n]zμò3 nb%ePXIAˏq*FuȄ}eRGQ%oDB>x͎7s %HI,0dzj]Q08*)|N<=9" º(ѯE#07E!>MijyyI.8/; PnLeDE3x XڭyGW6.8q.]ٸD6Jbc¹Kn-1_>q*]Y@8#~briҕgȠj^cT8RH 3 Dk'JXNr (GV$Or0Q޹|x j @_ &ז1X~kͯS4`ش 6s7gW?dޅvퟬm8qx'矮 %I ӊ =2>L;E*pc?^TI^3tBVSŵ?keή%xbsU?kG4ic֐!j FfS{[vLZ) ޖ̺Gleol4;:CcsKY?%#&O) E֬APka90 ho.[Y%]Jįb \v\b'AR#G1x-- &n?_*xkFYG 2{ `X Q۪{Q m,T4"GH4] t/( ۰B Q Rms`SM8(bilq)A=\B]:/~:rz&\ V .0qE1;C,OKΘclaCD:yVXd?\<^oa[pF[.L"C*"(J9 6YfF-Lqtb"GP+ ꊖtӅ&#.{s}Κ8wh7"Cԍ8k~[UHFn39"dQ.odWKImPPlLN.vWJ [3ҥ>H8FlOTȋ)9HC#v+[n{-r= l{OI Bwa|ϭΊ\(!|6߶*6;JPVU,‡'J99_ڲ4yPm{ O" k 5 `¤Y& XAh n*:RFCQ1,RvXTyM ` ." 8Y-4^Rc,UiA2R!L]ֆX Cs^~#a\4*Z}&}i;Q`7L;n]*1_OBVt$X~psUsUZsC:4cpvRI*F)38v' 熮< gb0^FyEb\vj|WGi6!e,at䉉0w>]Ԓ}"mج%ib%<'rzǬexYu$HF\BFV$=(1VPh_S+Q4Wɶ ȻaU-0 2y^ڟW&,"dWnΣ욥:&QNw}h>+34!!ѹ+<' H?v Vtr%;(FVZJ׸h M 1ʴqeد Ҧxi*S~Њ/ldgL;Zaܗ=Ja"!;O'~N9g?r5h7mS#fSđ0vw(oV[ \΄^klҴÊ+{Ny$m\&ʬ90 > ^gJ6H m' vCRf3_ +k^'+j~+bFqV~iQIJ%9h_+qWm"k w X16H8rg aB';vѶXXܻ2ڳAZ :!Y+XAEǔ4kn̆0hZ٫%4ZHDrtboI^FOG ]|o 8j{ϨUC]ěD<2p6#/I6ffvFp fGOB}5.#Nh-vkmـ:zc5,dW LQ-[t%dg)%ag8P[l:ͩȨg2-]{Cxue)I7esV e43[SJLIbʄ^N-c]rYa!a<%%eAHSK83qԏUac5!2!M(nBRv%\W".SO(PMli˒ sxḂt(GM(Sf,v)ɯve`Ł ?6ެJDkv^)(( pFF=pO 댻 6-Cɪᡝ1^ߙf I$8O1r,INbQ23`1(D?Y|a,@mY 6~L0 n+D"ꖕ~X/Dzf:_ܖ8^w@2tQ9 a6,@ `ΘaAȢ lǮ~Xh rVbE6Elj=9 a& 'fupΌXa ߑ Ja21K%x;NBk*'R;ծf coz4į/10@l5l4 cu֙^{ k#e;D-Q_}TVd\pyhiFߤX]1x=ZVaR嬠s7TaM6~l!װ0 Q0H Baґ ( )zy#A9GD!GckT*b]qEXMZkg8#)faC{āJQ/\a-NZ"x])\[K<ԀU(j/Ȏa_TP32Z.>mkCQnEm?nʈUqtW*Ǽi/.!ADRҁT(W@Wm9Ik✐EWl>FDr>Eb9*iAJj{+͖N8&rW%/nF5^u\kW6')>9лX;s7*z8ŢY1 9֒lSP7Jf%uE9;E3F ycNX졞g%[4fTȩݒ]P\SZ9␕a¨ CDǬu9)9v@B(Um7JkU5uy$;ʓ{]Tbz-yO0%O׍9+Y-犐*+qÝ|SR8WZr7Bۑ_Z48W*96/fqVzF&jEE a1F A(k7$vdoLQӑJ x#'DzzQF7(7 ;3 n?:cCJHAՈGiݞ IPO5pr N⧐E-=^PT9R@J(^gE)MY ')4U79VXjZ,k ErzTUf rz>l\hx$ [2x%'7k>;ȨcŻt[&B'ŠSV::J:2M\x426F^D4)+"lٖ  |t C戏qI*Beb:KVWb{"LUF3Md9 ߀/D@^)Oj.A1 5՗v a\!mh!}Q'37= s̑/WbH6aCZDb¹AN5-Tzy1ϴqH';JhR+T]Θntot(j1պIiF\-ݣ0ja( ̤"V23Ps;8"`CW5 u Toŝ6zR-F:|v JmP=TM]Aܐ'[D9+$@iLE-6j pvf0 "[f`v4Yxw43k!֧%8d-AaOaF #?V5Ō l]q4L5%-n p#L*">h6e]¼jE>xQr'\h*5貃F*ꖹW7|H5]F܁X+gxL,UrFHEySNů"@nXw呈Y_pG g }( -xEN:;l 0|D+WAz>0a{YZ%P,4(CM:5љխ=G>Ӫ(s$kTz.ٙG~®#tk|uVw*L佇{'iC.g)؁bN: D\sGSR߮C1bImd !L+zSk4 |&t0tM$n/w|$=o߱F\F\ QU2 qhF:)gokъK__-98U^HDkn*+KuKΧJwt\%$ $@yR$֒"U} `;8A.<+Z5O6vCeUǓ^c!\"7\B)1U-A*GZN2VIje| ^N|WwzL''"C[E-Rqx8}&H|o $ZsqE9U|ދ ce ҤShǃ]}#SX_;#r]fJ$1 D\Tbw=PSՕ`zE c~fLѦDԌkoM?p/E")RFk ոHg ;('T#7ncA#|*)Ajg11)>Φ>@lbGP̉8f%yyazQtqA TKSnp#a m51(UAq""T ̛tn%ͼSz#kk`Hf\MN>Cm`YMyK TFYlHk`!{LWɠE+LmF=N丿P4XdL}B}׮e0Fa|) 0+fڥSĝ Ӄe뉣kqe/9W °(+WT¬1'䆷b#bwe t aTQ=`Y 'r`$IEM&yF#Ŧ5^LA#J!"-y+"'i)j `c0l `F0rp{{mHdxI-3ϼ,{ψܿj~]2ǘC;?l+u^ZKi:[gk`;_Ngtgmi'4\ЇT?/H/%L/8'}V&o(SW!Z[1;j%⓮yE<;V䕲%RzʳT+ 4xUN~~!M UKv|a2{f1zE]F_+ȾT~y2g".; \$\= c#7V#"|}cL,"WL(~D_ 1fR" oHtFL 9}Oil a(}ftd2n|/7:= JaB<>M5?3 ^Uj[Af h*ݥ@iGf%z4_.eax-ӄ axW?uш]M%9(WSXaS Q>pqUN "VYbRfƒ<̬@Ũ.?kȞ8h{F5j !`iw"Fd ΡS=4DžG)V0t%?"`f"#e)>Ȉ;at P ^YBJTδ# g5s9;j n} l -vo d%fwHfEfvfDxš־Q<蜎'1nbUwA-ک85)SԔb'xQ>+d<![!΅(>GڗH@%`eOc\L*&{zCR+},#JUgѬ$:T'ÈLbEpj:[-iS,JK+vl_X X(}SQZL |t"uނ*6 νgw.".8&P'ވ`C59 >&,bPK-^yJ;3e=cpe$tH8^fc/4JQ2ʷ|l8g;2DkB- EZFJiq!փF,dytq}"bQIj+;Ew@7 *Ӄ2J{ݥ6:qeɑI}3m b,fυ@3Hk7)Vh=4ء {'&f![2<qyOka"A a,*x'K"cQl6- 7U TA8fW,lh2or;d> SX Y8FՎ8HEp>T AJYHO:δY^ŏȐ*5RDI*ϖ|6RUMK%:FRxu:_*iiPpހ"#Lp<_! >b FwXKOtv Lv\7!r0-Cߑvngn`j/伂&BϢNN<(y2h,&3sr8HrQ;EvHL(|hO#q֕;BBitc=\)D<8$9_OiD(.&-r#BN#,vQ4(cܲ/؃@LEC52@f̺I%=l(c6 VN褮 ƾ-aTS0jHqm垎i\)cdQR:=/5nTu0x->VNoPYYŻjq )Ml͆_iV-"p{\%P 7 ꍦ"$VW<Z)whF<(;0,M<Dt%_AhY;1IxČs>k#blĝ0|>ZT}c.h]WQl}E4l]w!zY-v%z0/KzUzA<RzI:J),*rӁ!?=" Ra N$jsRz@/" ǾŇ8FYgnH:"9% rT rßxr,J3AE.0j;X>^ 5,(0 HKqw6b 6E΃`N0 b1}šJPIB( "Ł&w}0ު}e*[1þ$ `Ռ8lp @/DI%B6osߏFЌdV'L ߭5|#oCchf~E0;lΨ9pcQG&F „mf G9Û|e{Q;L'vu4a/OH/tQ$G 3#xwRơ׉:PU~S вGCŢ?5ٕ$+U6IpGT&7m3HxțA{ɵhiֲ}cu:fa>rnEӻlfͱDPܑvNꖒif ]WBG$̏{(bz \mBnvRqF 6WʸaEI&>zib?LR3w)мDLg0Ny-W"Wvz:%7T :|@M(ۦws jN\ e:DґGgxA#R&xY<2<#(Iѱ\!+l͡q#'lp5*o@2d;kZFR!VM''7EŮ! 89D`-vBqO/( 云6D?T,4 x{%+#Zl 6wyigFQ 82 a.mTKLR?yn!1ayTD%˧Pd.l=1xtl^JRV5D V#Kry("=S넒s1@tT0; $v C,`~(*L1`V]*TGV>NkBoAx}f J4Q2mÌ%RUnȼfhg\h'DI4L13į,<;ZDZL_-u^ _RƦ|,TU=č*CF}b2'Oͧċ)AɴU\cmkY;EXGޘЉDӘL\P%Ϫ2il* I[Xť S} ? ̀<VהF̱ʚ 1,u9WɾEݓݧl.UE3cPYQcRRe߅,?P1`ᇒ]>h`czY%kFGR{㊰s&O%D|^oY~ͻjOJ/%,+3)tsġu4l3xƬG"O|U,~r,D!>]:fƼ.tZj#Aj]\_ (Tl`4n c/ UmcpL:7Zf6l涐. @cQ"Xg;x(P´`}N*\U8QgE*-KW)VU|SbPN7I.g|ٻPMQ;any{ Z(W+Q*N"g_GG0X_\HPt=D#76 }er6cVR` yD#XtԣM(ٌ'2)11'2Ʃ>熆@e3%tZTK0ؗM*f%7++ y /=!,Š\dn3 1[|<,K w I) -D09 A1G;uBmj:Ab'rafR 5UsYy2I>Q-.+,\r#ٵKv,F\#*B ⠭~fjuf`|kja$ȑ췇s_[PIy 0) N- FNNEAv)Z ?˺ZyI"mʒ9abP(=,yHpT`QBVVDp:^E'1p3)|+sBfJDT㨤|G7}ljFvT{@|-jbep`"S"ZqE er+5P4sLTO{T|W"N ѹ<*uS 36I:d6娖=8۶qBZ pkU%#i@Prd˝,V6f{x CR/m'gfoA gA,B(ZHF+S 3B`F/AuY/ g X4zŚJ t>ʿ$Zngg5zR)Jx|7vczbC +,W,dz=Z^1lb{vj $W~}x}3r~>4Xue.Qk9zȹT+fSmUγRYXɨ*WŢi ZfqG=#ڄa;̡*@<㿄p쬥* &!kYrt K|>v@'hh*QjA=\7N;{_I*tҐFUU oPXG}l#րZXx:[چ)x^ʇ`_<8DQ`\TXJs*2˽RI$n&j,_Q%m4S *Wl!&γ?e& UUzK!˃{YmGr|9*QeγKTGD?t~D7 b J \uTJtչG{\{'r61/BY׊]z酓YN"8k;,rS|1t3z<2}] >jS"r8?kqC;.[9U}ߣR֖~6ٵ (3~f5pl=|0(.yVW:}K:;YΛ$2N;t{Up'=8.!Rt yQetQkOm ɍcST7 5ɍuzG22tj7"w7O4Ynq+vDvNNt⸻':j;󸭅2y,geY 6b~/sP9R.7+:'N?x_54V%xxwexqZtj{9]Dž{Rqxt/}VQTOgXggu=a/`jH\.Ǖ~Sҗ_%~/qZ? ,ND'7NxECvR_\?-eZbCbVu<ᆔnIVA<ǣ9.;lW\lӨ=M)V6rfg>]; y'KPFm[8&BzOQ]R7D/r 9^^|] bs~ *2s+z!w Ţ$ʝXȸq,k! &:vTt딓χU9c&| 6 C<;#u̱Y8,43/brS"$Hj.N0o.W {pd;B r:Bkᯖ[<- eOoB^Y ۹af5v B9f"w^lrXZVbsX̄[1>'9?&~wJ*|h\ˍ C_Cz@=7N4I5D[^ݹ!YXl፰ V✝kjrFO:SGnp 7!V-^N931+'˃ʣz9SvBrJ{;SlLkV91qyF|YtWVϘZkrַ;^N6vDe]%ȍ8R\yK{\[ ԏLz}) :ݞb~dns'7S^mr$#2 Yz"v'5RQa4<"n[jsf=#qٰ6i+"(WoXNKt}gn^DER\$| .ORuZpΧaVG&u Z 0be 4@.2G 384q)Ɂw! Z1.u,VMW N#IdYv,Xy'B Dj3/RFjs7CeUKW֚yy2p430OAd{NykL;<;Xj6N'sPh! 9*fg>Ωj:L#kΦ]Eodst=&:u39`:#ܨc'(X7JK}i'Ժꁤk  6Ýfi_٘啩uQ_V\asr}pז`BGW(ڢKzz/V3P^y; 3o8VL]"$Xz>Dt ~:Y/_ϼ CD=%^xMAz#듭v X2)E{pi3enPP;0AңBw4)yRhe6Kwc4|>9Сgo='AKu;z0"ʻ$.)=z>@zSmQh05@ <+Th$Rx "Jmg &XU9`a1@)4S0t[SVk%Y{"B]hw*=\Ie! J/DBoR]/"6;q:ǒ V*~[dI;1(9YczP31.V3eSL'ƅ3V UrP#Dk)XMڶL"5=kBU35ky[#'@Gt `YRߛJ?N2HTL{;'g}okLu4: ]? ାuICy/k8^NC6()bӘE حy=(@ۏԉxpߑo=x,hǦl! ^ FSz%I{yl1qyK+.ݳѰZno99֙^Bk])!ENcX4!T8/ 7S2NZqK]<~߹8X>sD":N \ȋqC3pP[ eog F\Wj7I1YY.p$QoRGbl {u.wJ~rDTcapԢlx;  LA ]Y譮c|m#Ȯˮ8l8H $Ki)-w(ݒmv!Oz[#:p"?y(=3IMoHoMpz3NѧN n?􆛉-EK]=rӣӫ^tBz#nY~oO5C-=3z;E{{(=5IOu yy/s}"?(=Now'Igߠ/^z=JKMK#H(~H5Fj?yۡ7(ns;fD z/eoYz3}F,[;i>׷,Jʧ%{=taZv{oHwLZz-'緑F[Q6 0uN[#]xjMwLezMk\75߶t' K6VNүKgn٦ُ(?^ ۙQ|R'Ao4;itFK;O޻=#0O]-Ը͟R;F{SmFJjV,ᐠZu=_05=[w?!]#sjS%=z[oJ-7MoQBi^ߝ<pLZ#ZPr7CϤuwS&Q]I00w;fӛۗ \x}*wۗ/@V[4w3v32oN,rg3vҥo!x-PKw W050q4K*jƥ'N/k-t]Jn"$Rz@'_N#<-L]_7{2emw"3 )LL=w;ޅح'qii_}kЈ>rO'L-Dvrޝ{(g͔y/|oʽ}&OOOx&< |>9`wMěVyQZ}ṵ#|݄L՘J/$!%|pZmHyJ:Fy8a<ɽy{s:]9C8X1Ԓҋ)w$3:˽@XcV^/r% ˌ 92^FAye? JBgZ\ۄm) :mgS*B{;3{CˆaL|VRf{v lVr}Ч$?mxD_?'S CX« Gx'>IO&|gOOtVH3 El#>}B^?xw8pb!4 KkGyր`%Қ/:+ Wu'|uF7=of } }VN<'|Nwݔ/=l~M? O!ԥc=gNx77S ﱤO3/ދp&} $Ox ӳ><@@}H"> wpo9%~}}.u< HhxM5`ëu|S!|(Nx8Ap$4 ,ń{{iyK KG˔ᥴe)r+ 9޸9}SW.O%kͭCRkIRq,K]fxųۄ_^ѱ$ W0a 듞97CT([_1y”0#UG> hyAsRcW>'>ST§>Ϥg>s\>/$|^Cb—e/'|+ %| _CZ:7~A)7Q BV·zw]<݄!|/{ ?@ӌP! .R?JX#4y1qODIO~(g?K9~_"˄_!*Ӷ ~ۄ!.hV?" BޟF _WO#w佝 #eτ!+N߼/!-seϽC\7qdjOf[{'ygO$ V򃎽0=i+<S4)nۗ'e=8r!'3E:{އgޏgSل\?>; Gg]˷._xsR<-ÑKZǸ7=g%2p,>#|8Ese._prYxl:1㍧ A4}gDRϋ оswpnq^BH \"GL ^JeE7IGr}w}Hjdb ^ZO+ kp}%Ihڄt 'E6_bU_N[S/R|||Y\igRm_SstkQg1aBzl7͖5hwy }G(?1>~,Ws@h'?3HO"|2S>iO'|3yV|gql#S,_NK=l~> _H5b—0v_J2깏}9ׯ$U)F0V/M_[~yWoX4M˯LߴL߼J߲NߺIF}߾M_LANw={~ 'i~y535?G o$+8m%=!?=Oq_>Jo?%L˷r?_$d/TLMgd$7R;q8Ļobo~IPu:@~g7M-?멷} Qp\hmHZoZq].XНWq=~{ Ϧ;r޴[8~>o]s3凌CRr?A'Iy*ivpU ? b3Oex_U@UJP@Us]U P?5ymMᯎykEgS|ib ;>smcNyo6<yI$~ ~bJPglQ3YUQ_#7}= !CAօ"s8"/#nOYˬPFyX}9 Fk8B;'Wb"`2Gn Hp_ Z.j^!7f 7̂ ?1\Aڐ}`1, Y+Cq^ɵ:;!jZ+FP74:.IQ :Y`#~6fs[ކvQ:vb ݰ뽰ulppOiq?Ǚyۤ7wK0E$D ʉ䭔3{qa3YN^)t3F;8}! ?3yG;q?G<ݗts_1m]'/np}mLg/!+nh;^1׺+#u'Qst].DE;x#|Bp7؋w#堖Kx!o,uTʖGnOr@1~:Lo>d@j&0YT~Le`;8iI\xCoٯܖh:Hc`|-l@ʏpfcp9\}-l-`KkxV1c" bC@/+Q -GT"Q"kGTqrB%TrH)!bp/côG60Ӄ3`fg”y̘Y +d=Ӂl.t&y0C!/P B!U _

 ¸,wV·Fc}xp/aPJ@I#}YRܗ2PAy@TyV¬ U*TԀP jC >4 4fZAk@[ht."pݡ^ >z\oF$2/s27~MJMn՟ICO?ޢgWj n`0 0  @h۴;v5cw>EM~"L043`&̂eż0VEmEX`1,2 s#+0W*X ɮ{ٵAGcw:Š h+iJ~jo1Vۡa!W!+\<7I^Y\K?<< LjqOI= ;=~)'S#udՋ]Neehſ~J?`Cw2?i%NF<"?#`$93iy3-OP/7RRFW_m$izIY뙀^YuЉ\O]ڮ\Oz*43`&׳0gs`.̃-j(ː[ X `5v:XVOI&'ڌ 0;`'ݸ~/`?4}P?ø\$D)8 g,p.";~.p:܀p n >Ǧ~3Pj`d$Y0\̓ҿ x-Xj W?u2k0p H<7u3p;9kyfu.XSiIpɚZ5vE57i)iGE]- 쬍g&kTwI{^؇7><@x:̀0 f `>,X `9 Vo:X`#lͰ6;`'ݰ> p18'$D)8 g,p.p p57&܂p=!<3x/%;x#|?3| `REP&0`;8 .pC4A 1 &ĂB< B"H I )$RB*H i -2B& Y +d ,\KM}×&qU(_XXD 7P ?P C( (aWGU%^.\\3jZ"8_DA+:;?Yge> %}$ ^p,6BH蚍NfW[ Ssᦙõ *ǂL5Ĺ&qo`kq/ V?^ l rV/mHQN}Ąq*z6:HRdhyJԶZZdi-0;Z.`vvq9]_dga'ameRzqgNu7Mح<{ kX_3/eh$Ws`e^d|i0t!& ].4DGZ:XoXw90(mq#& OnLW[lyvr䃬unΈ7;a=kF3'$2)0t:eO%]]6/vNNI''yѹ7%z:lhni1w>yo3 wx.=k|g3*nggxIS*k!RXaUg mz?S^+nC6ӱ/XF: 6f[alvyÐ47AwO9v wqӁKK r Z~ q(}Eoi2gwȋed~eOip{@_:&6yhCHv~R{`?eϷ$fq<9ۉ5:&kR Kρ!\)sC# ;z;\ȏS, zӾz8Io,oR⑑FZH!#xT$B{Phǿ CIܘMLMyVM?py; fg6%vCH 9: =2DRR7S5Bd̕?r^f:LI}As Y@汳bf059!< D~B q @A^ C( (a7`Ź.%!~}[+ e,]zA+T5*WjPj@MO$Ϫ.>49 ! M4V5mdOc;C3tݠ; zC 8 00).59Cp9"9 R$FhZ#g XR)4q4N$L5s3i׎&krD=t2LL)fq=\ s0:V 1bXLgZ}wgrUN9)i5aY&9IW_Zv|q/gal-;maNwn{apI=?)P1p 8 p Nu߭e4AY8r՜\u2~%=YeLzgЊҾK$y/3m[fڶL7q+ ̂,dAƥxؙQvncu6wY>p#q|s*qaGNzF.30ѵ73%rޣGggN ߸N~+)):?MZ53P]a 4\@˄l\ہrxqqv2Es6Ew1BMŀ.{{1bsdF^S(~}ݖ\@BHA1cz85+?-S~tGW^S2W^SrWvvC)I zϴ.JIˉ|No|;s oRK-hޫxd3eOWj-KtqM B.n9J{aQ6ݘ[* nvƚq9]|qJ*?ڢ[(Wy yc#xoy!w!Rd>8`UF,-9c z_.*]Xcs<ƺN8~d3oWU -ȊRz~pSnAc pBK$z^[F_YeW}nP.27'wQT99o22*"[iV0ʹw.:*ʓGroytaNӥ**VΥ*dް2Ͻ (yUĿ!rF٨MOO_?79Tp3&xLUPUq"\YU=`Qq]?L*铹|G+k7GTCGUԘ|iuShMߚU|] {̟W'L\F?5ڠ-yoI5c/_Ym\W-=Vw9+Ul tYC1ɕL?DӾv!:H\8+銀nWaDzcn?=hSb.q{/MoLYGpԣdۗ~@a a08p R#]u(W q3ujx0 & `:q9farsam䝺E\/-~),y/'VJW!#g55Y#]F_}nan1`na]5o%rG~/~@άz}#̝<,f=}c\'Jq,pZj(󖾰|a2N4ׅA_$<y c_ ts K;j@YU< ~;.< Xi^ mHO~?HS/dg'YW+_kptÕ_݄[Mw.n9<]M;b؝Z3]=DȘ1O) ܿ ^”q[{'&LP 폴q%'CA3z`p/iq(Cfm,.w7 N7w#&&?Ad[5EgWKS/{,'0lvp\hG0>&7uba8XVFq&̄cqܚ2%F$-) mH_o ߒ+[R"kī.ݎOZRz#Mi!=ϴ=r,Q|<<.sR2 ޟ O2!yjinfʂϸ2e%]-LٰώlnkJ``hʩ'%L99\vKCrwmqI=%y!P҆ }. ?ݝGEb [^J@IRP@Y(TJP1ΪPͽQUwKR5SMro| 8F篿!msB=Ϋ@C5CcLMpo ͠;9kw5hgKh OY퇴! mڻ׭c'Ī#2N{gwgAي "x~F z"ʘMdnuCNVUx"#gH'_ǎ{wY 奧; =fgݣoSWCY_anR6v!,ⶫII<p<1kG9q$( c`,0~*!%c;DM7w5 s2L0 `6́0X`1, a7x7k`-Pzֹ{|{~eI0v 8f# 07VJCo W_7*(Kik6=ίvн<#%@={擨KO>|k+m-}"Yr_z7&I{A)̚mwm ~;_BLrLo@j}4W] #Y?PސxL`}/+^ FȒ i%% )7'SVfk5o'r!$_c-=' p2y50 T H_ =}D `1oMAIu@E}9bWnxD^vmB5tOEo6ƖAJw'+1.I1%bT܀Pvp (F p 6ZE<IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporti.png0000644000000000000000000000013213215206021017030 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporti.png0000644000175000001440000000032413215206021017661 0ustar00rncbcusers00000000000000PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}Q :tRNS@fLIDATxmA bU*VTrܙd"f0Y2zPdYv^`'~gZKJłgUw$/Y$<IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/add1.png0000644000000000000000000000013213215206021016327 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/add1.png0000644000175000001440000000027513215206021017165 0ustar00rncbcusers00000000000000PNG  IHDRasRGBwIDAT8c`hS 8,C:vLx?I7D0@3`& p!¤b/`86'q¤,,@@#FG# THaB+ 0UIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/socket1.png0000644000000000000000000000013213215206021017067 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/socket1.png0000644000175000001440000000363213215206021017725 0ustar00rncbcusers00000000000000PNG  IHDR szzbKGD pHYs  tIME   ='IDATxŗo\W73'kI4K>7@hɂ.`AgtQbA!d B:M v<Ǟ7o{IDq{t߻{ι&\7ϐ{wh3.] <t.DH B|aX1g {`ا`qt6DBX#p>k,:5hc`FҠTH =׮fl].<:Ø# ( !Ǝ6Z#PFɂ8,0.DI`XO 99L@eb"`p4_x1 x5:Xg^G]°Kχ>%x鄧 kp)A&V_@ Zzs#360ඈwy{]z2hO" _Hcc )d4y,uhп$XeMN\e8Ф]N`73ϩML&C(&, v= G AL$t=}f&$Ƌ; yQ:VNI?d}FA6D$Rci@"DNTI&%hd4&`1* s=N+8$R8W΁7%Ƥ^F1Ov:ѹtve?6Ur"7NQYÚ )zNP=PK sG 9 .B fZ=h(TQl VC:k]1 x_ uIx7v#)ˌhر@S4i;yTh8h&0HYV[i NM ϡe@JC$Ki̳quͭiw d(.W $-ffZhw !*8'p[hI=w=^X!MxV-A(&F[LV,xS={h84-O]~U1¸N}j < <0ʡǙ>Bwrg|!${D^\ S~:&"biW^ªZ;Wи_RA^^͋6,~xrӆW1jw~ X>-}}/#[amÍ_p^8Beӧk?}`oN^~sJo~vyR޾ׯ?g֤#09vQOCلU~J3/3L7311}_FoV  __Oߚ@|Yy7lݳ6wџ[.={ ~jb3/m/}~Pih16%bʶmvRr,..Xeқr2Y`EqlqE_ 7i}piKqllq m,A:tږK[WĆ8cM5\hɄMsmG {f]ڲCQB{抛kWW+L ƕvοr_ǛX9Ε+IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlti_64x64.png0000644000000000000000000000013213215206021020227 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlti_64x64.png0000644000175000001440000000516513215206021021070 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE &% $" *, '($#././ -*"$"3302*)))77 46100079+-+==A@(2375231BBGF?@#==EENL685DE5:< LK:;9USKLPO+FH$JK?@> PP9GG)OQce/PL2NO\Z%UUCHJ-SUgiHIG![Zkl*ZZ2XZLNKcamogjPQOITU0__>ZZvv8^`$igqrTVS;ac5dd/hg(lj;jj^\`\^[(tv[`bb^]2us@ooPhi`b_:rq^ceafh7zxEtt?wvfheTpq#C|zJyyokmlmk?2Sz{HO~~*[z|qrpLfyxSHvwt\3QL ez|yx}[j:}|X~}Rr`Oh7]Bsy`V?iRr`EVo|[sTdMai|\faYkgĪcɋmuȔqͯoԕxҸtٽʽ۞Ϥy~͊ɄݴϊӸضعݘg*tRNS@f,IDATx՗aTWA kmJ*B;@YZmq-$6-P %EH bTrָ8.e7DC|urN)m;I|x]'G0  |Aӡo?1JLT'ۀXUUQ꠮l$2;E8/O}fFq7rY]>ʈdEsrrD8I9/^o''&nqu̅6SH8+E ңKNԟ s\ ,#fPoE۶F`-W>qjj9x)]M0<<ım[W 42mr3;?~~.Hl"t[e#NB[,6i<.p'R M|@zb<1fv8i M0#J[ (AѭE'G. ):Rccc"OiJ8Oj[\jkk> |qG4o8rQ}SO9Г\Ъr-_>My! ;Pj~r%TfϞ 06&\^拤*A~穹SN% m:]TPޑ.U#x>DxS׭FR~6;'Uȕ_P?̈*+O"7o zsq+oTnPJ|c-tx"c:chlPH;|ZbzZ[cn1N"2ZkG"2N "#.+ag?~p@J eY{_s"3WƘ?gc gMaf89\ls!\rĹ:0!j4jXq%U@DOI@Dck-Dy]]m?>Qw˕Cȍג/Ȟ*IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlto.png0000644000000000000000000000013213215206021017362 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlto.png0000644000175000001440000000043013215206021020211 0ustar00rncbcusers00000000000000PNG  IHDR(-STPLTE@@000542@@@0PPPPPUTRhh```jhdЬ ȶtRNS@frIDATx] D M ?,Vt+ <=0uZ|0Az? AH{Bh;@TozH#|no}(,IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/reset1.png0000644000000000000000000000013213215206021016721 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/reset1.png0000644000175000001440000000107013215206021017551 0ustar00rncbcusers00000000000000PNG  IHDRaIDATxڭ=hSa/Mbn+ VSեAD須֡C)]Rl&(Dj38 E61&71EгqD3UlkTywϲW9+t~@T-p+X- /  $7OOncg@iȐ%d0zmUj# hO | G)?02:`:īUziXy/`0r]6  X4({{8':@h""U5y,sI>_[l6u@TE`r)[J5+BI"*ǛTXz.x<Y :ۺ\˭D\|_IXt%729flC~&B*рѥRs|*5xٷʕwn`Jج‚N>z렿TCVc"dc/t$TIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/backward1.png0000644000000000000000000000013213215206021017355 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/backward1.png0000644000175000001440000000041013215206021020202 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME(%JLIDAT8˵ DZ&Ԥ9dd E"Vkf yzo&fyI1' xi>%?B HJw3!rQb,jsHYeLTM$O7(ռX%oNwIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/messagesstatus1.png0000644000000000000000000000013213215206021020652 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/messagesstatus1.png0000644000175000001440000000135013215206021021503 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8˝RKHTa=gitD 󕨃`XIa%.DQТUˌZ(բTBT mRU:9ܙ{Ν 5%Y~w9*&:N=y]@ *ʁz#F`wӀsP=ڪɒC9z͉HBK+핷8( _ vLH18da b'N낮`^D`oiv+3Il$g/tĢBjvn+5˃'9{/!Ja6WbLo$dw[(k#OjmdNP*TS>򠹧jÎѽE0p3}ߊUߦꋪFž#HC_g6'~ ? gM7CWaU$UWX2?xC?[R~&OT˭H+}Dv)["t_"kiIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/expandall1.png0000644000000000000000000000013213215206021017547 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/expandall1.png0000644000175000001440000000107213215206021020401 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8ŒMHQ{|6CQPIah27ѶDu Z"֢Ҙ!Ir&'s>gi1&myy)* Ѐ'B#+u4c% 9ՋgbhQt0f:^o-Zb<; i(J@W䔦YYDpF0v3cǠ|Jǀy ШLpvB_>"@zrZ,yu9yTOsA4A,_HҪ^>SJ89D!PX\f͵Db5>|8m^yn!ɳg~S$:`1On*Kfx͓tЪ@?6]P^XV62ܟ98~( (}_'fHDpȒW]>ٴz(҆L"ë] ~H|Spϳ(Cq!Gb9ԫ@ |nPa?a/uIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/qtlogo1.png0000644000000000000000000000013213215206021017104 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/qtlogo1.png0000644000175000001440000000260613215206021017742 0ustar00rncbcusers00000000000000PNG  IHDR szzMIDATXŗklU3nnK}l-EB) jՀAFc!M(DĚDc45~BEBPZP VZnCa {{8`틎j{fni3ѪiͶ=W Ԋ&  K+[<1CP4bW@j#]h痓m+;xdbg tajː=>:<;`/=Mlβ9~'ZwЬI[rbRPpP$r]? H8:rzu *o$f14':j7zfY-@-Cb51Ֆ^e]U7ma<MC=²Pd_#{~18< _}'v"IU;&6Q9 KqYN0{^EFml5BKJ;s0t<q;o+EɱNo~;;7pecr0 ͘Pf/ _C eɏPTky!Pe #poepsSmZ}eX` sEi&ɱ*W-KH@"lf0 Q g0U z ^J~t3PBFSaSMBb)M *E1[9>p(H TYCSTŃc_&6dVIҼ.""P6)S@V$bz(Al},TDHzeIFLF]ˆO-f}'Y]X YNrucS l1qߟe f2 QLk&6-#٢pWx-1R||κ]Y{FSYL J_Rv?wT3t!~;5/\wB nڽ |W=\8@"!pP?^v݊t O SEGgIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aclienti.png0000644000000000000000000000013213215206021017306 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/images/aclienti.png0000644000175000001440000000025213215206021020137 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH~tRNS@fCIDATxc`%PcPq C 0 & @ 3(#99-03313Kɤ!ەpW [|IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlni.png0000644000000000000000000000013213215206021017346 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlni.png0000644000175000001440000000025513215206021020202 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH6tRNS@fFIDATxcHbe()) T&:AEBjj!ĀdjaP3R`b0{B0G09I o09IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlno_32x32.png0000644000000000000000000000013213215206021020215 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlno_32x32.png0000644000175000001440000000151613215206021021052 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE     "'.&!!!!"""'"###-$ $$$,% .& &&&((()))*****+,,,2, ---9-...///00(000111:8333444666:63999;;;==5BBBDDDFFFIIILLLULbHJL9;04|=<8VOI9F D]RHVUMTUSH){OEY[GhUG[ZRI^_LGtYHq^J}\GZCghUU _IdPqpWbK\` Z.eLht&f'wxdh~q`y/}^k3hlFq0xtr=w%|o}u45u~q~`x ƒ],uƉByş ˗7Ƒs˜1Ϩ8$ׯө8ПxԧRӥqϢٶҤ޻'ֲܿtԽBܻ?ײ578سAڵM+´ۻŴșHX?ɭɳ(ͣɻgeƷҢҩJB]԰*ֲ}׉ٯ۫پٶKovݹޗ@ٴ޼fߟ~srotRNS@fIDATxc` 8YKppp;ׯA%<~(;vy;} ? #ݭĕ%EDx\O)0W,Zgo``"+sX/~@@SCQVVQ /=kS'Ƨzhjq> 2W}x~ ~g4 pr=O~vؐ}+4T$Ņ8Ϝbe/8lӹʰ vI > Vbԩ/Nعis7UUdk r1)s}h5T#uf;ؑ?ݽiŒYK>^_Sɺ(ǬϯXxִ5֤ekps1vc;g|yRWJ4/7';`7Rsv4g5;#~L8mUFӹiFzf9 y6f}`GZ}%nlj@6Vfa7k6PQ:YXq/ oIkX v6ffP t vsqsqq0غw8U:<ܼy橓'u N<}3 ,,//,CI/۵vrCn.ao]Á!k׮k/_8}zwc\|@p3GO( D` tĘ[cIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/forward1.png0000644000000000000000000000013213215206021017243 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/forward1.png0000644000175000001440000000041013215206021020070 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME!4~8qIDAT8˭ 0C_o%$34t| mUԟmYaUj@v҈- 8`q ^ :q Hwo~HwӀ2<1+;y<1~&R7~*1sV[IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpti_64x64.png0000644000000000000000000000013213215206021020233 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/aportpti_64x64.png0000644000175000001440000000476413215206021021100 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE\]Z  #! &%$%$%!'')*(+,),../,,-,&+-*12-/4434 66343323"23155.564=<;<?=;<;: 897><0?@EC>ADCCC=?cecmm%ihLkm/or lk;fhepn8qp?twkljokmrpTwv-npmuuJvx:xvEvx@|~vxRsur{xYvwuxye|}E~Az{g~M<y{xDUK4_}|"cOJmw&G]XaVQ@-y^tM9X3pTlW:EyaUrTAZb]F|ah_LZcn[hVpgq_f¿oʛsˡ{pԤـv֬{۱ݭ~RV}tRNS@fIDATx՗iTWYQQjUGJźUT\,JlV$xDsKM- ZQH-*Pq̔h!;&cM֛|w}vvu -tYi&IRuZ3 Emғ*RTΗ[+uYk.$ONZ#.,,R$9^sÁ56V#gpxhϑҚG%O:iZR6Yp7(xLv`Қuɶ %'2H .VeV,@Wg@0|_m}N]-.0ǘ1)E2=px~^a_$]7zu?J*%l]/ yz};u(*}ݥ^- W÷T$+r⍴BU(,Fݡ`i4ڙo0ZbbBG2tg}Q3?@m^ZIl8OsцN2W6+N@09L{C{\xgHwit~-tz`'/M Vp*"3.R]wQZ\oFe8abڟ?= f#_W0vjuw~6JXðx̀8'ʧi`ڀZN17!bPZa Lj4m|bsWa ,71Mb鍦3}OQPYWYV|.U {0+M$0G*Ο>}*;;L|?e쭞y=_u=OMMMK39 w #G Vڏ76,uVgU0;01&QJ ?bP(^!mCZںYj? zLoc}\qU0NÏĺ4ʊ^/;^:zzXЎ)\q1 P)""ϫC-kR@:v.!\~uU/[$8atq e=@0M/L.Xyl$YC1 0qBZV᪈yut1( v&t$ a/..+8,!BS'%0Yz&~{8i&*ffyLd-,ygeAq 8. Ș%=|}gK-+` L&GSӂXahPP< xlߧOTYœ K (v˳ Ծ,3L@ןb #K~'\axA)[sm*˸7f Հ Szaeɚl.O~78\} ^.Z#zԩM[`a?1>':60W\ѾӃgX=eAާ"Op7`FcX,GF}'LaJ"Sjw9X9keu #A+0d+c-SH_|>Se۸>,514?߶$Lx#\y|`&Y*2|ss6YdcJs&k}x M!d}_}v%ѮʁA|_߾lw c,IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/open1.png0000644000000000000000000000013213215206021016540 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/open1.png0000644000175000001440000000035413215206021017374 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8˽A ?gLK-J(UH+e/+k rFٚm//N)xP̳XTSKU=2J)*u!N6 y V C6 ťt@+1*}v/-SO)AIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/msocketo.png0000644000000000000000000000013213215206021017342 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/msocketo.png0000644000175000001440000000114613215206021020176 0ustar00rncbcusers00000000000000PNG  IHDR(-SMPLTE  #%;*+;.0;T5.Y:.Z:.DD=HG=IH=LK=ML=ON=QP=WT1UT=VU=ZW3ZX=^[=b_:a_=b_=eb=fc=hf=jg=li=fffnk=pm=so=tq=00ws=yu=MA{w=}x:}x={wIm8}|4|=~=}I==H=:==ZLZK====:===U===:iII:j:I-IȾ:kºhǿI¼jI:hLI:9I1I9:B7>A:::??@AB7tRNS@fIDATxc`nN`@_Uyc"KprZnzdX.<4I[QP;G,`ͤ-ͬ) Lii@.P=Ϙ+ 0H$K ,畠-đ`-O8-B`5 ݘ\KKN;:X@L@[C], '#%!&**`G e%0phIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/up1.png0000644000000000000000000000013213215206021016223 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/up1.png0000644000175000001440000000030713215206021017055 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8ݒ E kcؙLx"T⿐6-%g"k\ԃЈYШ'Ĕ$3S% s7 B3U 1ћ ϏlakGoIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpto.png0000644000000000000000000000013213215206021017366 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/aportpto.png0000644000175000001440000000046413215206021020224 0ustar00rncbcusers00000000000000PNG  IHDR(-SiPLTE_@@000542@@@``0PPPPPUTR@`````5trjhd@@@@А` ,OgtRNS@fyIDATx] Db"A[RZ#hvd7om!aƀ?f=>6p̗ _Vp]}+H!ᕯyҋ >(=%qS 7^%IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpni_32x32.png0000644000000000000000000000013213215206021020213 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpni_32x32.png0000644000175000001440000000152113215206021021044 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^fmIIIa#WrLLLUL<gfkgt$^wQQQ ryts,fYYYYZZ[[[i\@bbb7t}tfMhhh3yiJ"nlh=mB".'(u񋋋H%’+Ӭ ĴƶŻ޹^ӺYtRNS@f%IDATxc` //צWYi^CL --scťQoWӄު9*gOJPeD<*sS12+ bN5.a`3ı`w/ ْďGM*X'uDRcRZ_.CEcߌh5no$#D=rlh@P]|*V'Y׿"D fi=:T8kQ,?!&SefȢP2Tļp2X;IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/refresh1.png0000644000000000000000000000013213215206021017235 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/refresh1.png0000644000175000001440000000112713215206021020070 0ustar00rncbcusers00000000000000PNG  IHDRaIDATxڭ]HSm(ZB7Ѣ~"N!AJ Ih٢Ңd˥qqc3s8μxޏﵰ*"MՃ jh1g%ڼ jxiG o4>ʴ 4X;'xK( ÀzmO$иjfH Qg+a&_H`a i jsBZ@A H ΐ^GhJ@aGr"~ͣs[fPXփYUHB~b&@T=T Rxȥ#8|ǩ M@[2UW$XU{k~*j+`i7ꃨ18rS g!.Cr_5~ \6;wѹ0ͤ> pS S^wPUŬb v&Dc9݁"b+ d|= U,d4;s-oJfIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/disconnectall1.png0000644000000000000000000000013213215206021020421 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/disconnectall1.png0000644000175000001440000000114613215206021021255 0ustar00rncbcusers00000000000000PNG  IHDRa-IDATxœ[Hq?VNVNX5ӨXoz)#.!CQ!‚̔DL# /+/ͭ~=8=_ۤ@\ KsQID\ 4>A ]|;ZG@28uIr"7V((7aPyД%w."z krLrdj5 K: 8ca,ĸYeaK>G?Q$5<#tn0gN/a]! _b^4 Cv1nSIߵg-S (H\bu(,(_L ufR>C%C 4X%jժGXjkss.KDJ"fֆ>g XjRJ)!b[jwǺvPHng0tS-liFi.aSuǗ...ݹ'fRJ73{\Jyy "qUDp&e=@DSD4_W"Z3;"3!C1fnRȭt)%٣En33\k=kP"!"?78~[?V=lrjGLZiIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/down1.png0000644000000000000000000000013213215206021016546 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/down1.png0000644000175000001440000000030613215206021017377 0ustar00rncbcusers00000000000000PNG  IHDRasRGBIDAT8 DƎׄeeHMNMx^ r:O\kMc"K0zvPESwA0zUID`>4Mf=gnjHw?x.:cIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/disconnect1.png0000644000000000000000000000013213215206021017730 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/disconnect1.png0000644000175000001440000000105413215206021020562 0ustar00rncbcusers00000000000000PNG  IHDRaIDATxœ_HSq?ݮ,u!V, HzjBT/oHPEOP/VpFK\ls6{Tl7|Η;T|qa|97@+q%̹l C7܌-p2A;R#3y 9YJɱa]U`g۸J׽(ܞ0D]$5+d?]YB|kdB1!]!$*kj"gPҜ&:qQ1/tAb N˫e4EƺA(ʱiNͼh"=|>l*7À+4N QZN,}Z$;@(ݧAW4*.!0ghAA|ŗ^Ęrm%Q{c݈V'pTnaѬ2i`Z7q}|B]Ƽ }[h`dE9 7x]IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpno_32x32.png0000644000000000000000000000013213215206021020221 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpno_32x32.png0000644000175000001440000000151413215206021021054 0ustar00rncbcusers00000000000000PNG  IHDR DPLTEUL<        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^fmIIIa#WrLLL gfkgt$^wQQQ ryt,ftYYYYZZ[[[i\@bbb7t}tfMhhh3yiJ"nlh=mB".'(u񋋋H%’+ӬĴƶŻ޹]c6tRNS@fIDATxc`Ʉj^lG^7bN\(ny/0:3LqUjꢄW~9uA|1 f9axRKfuᖗm?b|^Քz'N; ImS+B D°O]gmb̏C~d[f^dO!,`yGV6t{,byN"l3+ʳg9i">yy-,{frv!?&6IE3GR.Mg7oyH}F`^G<<9h^4<*%LIgw YU`3 IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/mporti_32x32.png0000644000000000000000000000013213215206021017671 xustar0030 mtime=1513425937.525766939 30 atime=1513425937.525766939 30 ctime=1513425937.525766939 qjackctl-0.5.0/src/images/mporti_32x32.png0000644000175000001440000000151713215206021020527 0ustar00rncbcusers00000000000000PNG  IHDR DPLTE  '$ )  $" $" """###$$$)&%%%('/)1+,,,6/ ...70;3 222320333>5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhiiiyiJmmmnnnoooqqqrrr{xDuuuvmyyy{{{pt~ÈpȰɱyctRNS@f IDATxc` .$ѵ;*<)O ǣBƼcRK%ƝZ"2EI0-%*&eR$jV>ePN3TTqR( QΉCDv @*gVZT!\\ՔŁS]^O[~M.&AqݽU68|"fP4aj7)/7y E.bTQ*]UQ.+vIB,R 8➋?U$הgKѩĄ; Ι/'Dej3 [?OIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/setup1.png0000644000000000000000000000013213215206021016737 xustar0030 mtime=1513425937.529766939 30 atime=1513425937.529766939 30 ctime=1513425937.529766939 qjackctl-0.5.0/src/images/setup1.png0000644000175000001440000000133613215206021017574 0ustar00rncbcusers00000000000000PNG  IHDRaIDATxuKHTqޙqF 15AlB4EQCL\cWh!EmkQF)ȤLQ(qq|ܹo=sIRH T̔As:.,i"7t&ğ-f6Ռ@шyqWeC t+$y0;?X۷y9&FOd<q@.qe ֓7SƗ"nbdZQ|i x*b^ BH^ Zq"qg%O2H8kQYR'4]`5 i^R hBdTa )3)flՀd :?;@ADD=IG$JH$LNHG=IH=LK=ML=ON=]N#QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trIws=yu={w=yvI}x:}x={wIA$}|4B$z= |=~=}I}I==H =:I==:$E==IG==&:=IT==:===Y,:A-1iI:hAhAI:j1,:-I}-.|º)|Ľ*IȾ:kºhǿI¼jI:h¾I:3I?ÉAIlj:ˈ:ABntRNS@fIDATxc`iI~N`S{'55Wj2N2),$'.]1!G-=N,ߡЧn2kGmb4JtH"MjU8sxT@)7[tzdo!TzˇΐsӰ0DIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/error1.png0000644000000000000000000000013213215206021016730 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/error1.png0000644000175000001440000000052513215206021017564 0ustar00rncbcusers00000000000000PNG  IHDRasRGBbKGD pHYs  tIME !ّ/IDAT8푡npIHE !U;֍Gx,ef 4C  <x'x6_8ߵ!vΩ@[P6|4RC)I4/P/1|V+,%I6 6wmi*}ZЭ$}(L˥i6ALl؟2AN@>p~,Z5BIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpno.png0000644000000000000000000000013213215206021017360 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpno.png0000644000175000001440000000026113215206021020211 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH@fvtRNS@fJIDATxc`5(͖e&C@r*DFM- "pTS&AJRD  5SRD@YjZ} kIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/xsocket1.png0000644000000000000000000000012713215206021017263 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/images/xsocket1.png0000644000175000001440000000021313215206021020105 0ustar00rncbcusers00000000000000PNG  IHDRRPLTE_^%a`%lj&X\\af[Y&cBqtRNS@fIDATxc``.0: & ؕF?MvTIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportlno.png0000644000000000000000000000013213215206021017354 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportlno.png0000644000175000001440000000026113215206021020205 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH6tRNS@fJIDATxc`5(͖e&C@r*DFM- "pTS&AJRD  5SRD@YjZ} kIENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpti.png0000644000000000000000000000013213215206021017360 xustar0030 mtime=1513425937.523766939 30 atime=1513425937.523766939 30 ctime=1513425937.523766939 qjackctl-0.5.0/src/images/aportpti.png0000644000175000001440000000031313215206021020207 0ustar00rncbcusers00000000000000PNG  IHDRRPLTEpH6tRNS@fdIDATxc````K`$f a(*0(\CH5uM U0 IN3L]RUB Rl ] cD Č&Bf>$]9IENDB`qjackctl-0.5.0/src/images/PaxHeaders.4714/aportpto_64x64.png0000644000000000000000000000013213215206021020241 xustar0030 mtime=1513425937.524766939 30 atime=1513425937.524766939 30 ctime=1513425937.524766939 qjackctl-0.5.0/src/images/aportpto_64x64.png0000644000175000001440000000373313215206021021101 0ustar00rncbcusers00000000000000PNG  IHDR@@PLTE         #"+,"  !11"$!+)56 34&(%.,!+,*??==-/,CBDD<=14'231";9IHEE574NM981:;)6?0:<9USWZ@?8QP7BC>@==9u&Z8u(gw6n7q7΍u'H='8˽1Da ı3nA6kAb1q[A =e $ (9*8,^]Vpqː[ 3׭kW8dr>^E{1y[F}bgyEס)Ux[xP~]Rç pw#[哳EG<{)bW-wU?m;?uƊEDc.._? d "l82(n/IߤxO;BMJ֪ xJ]W#x_c-Pn0ۼ~ͤ_aeu}PQ?&.:i\n9HVG- DRkRbz"m"Qȅ%T ɷBNH3~(M`ƢSKD$+2ڢ᩶5:6znS6N7H%E!3)#eU( K{fx {;9=(ol ]/ ~CC/#wA:@ qsYr[mn 9;*AZs,%{4 eqUN "V":'8 header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the `Xext' library (-lXext). */ #undef HAVE_LIBXEXT /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* 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 `system' function. */ #undef HAVE_SYSTEM /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_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 that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* 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 /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlJackConnect.h0000644000000000000000000000012713215206021017617 xustar0029 mtime=1513425937.53376694 29 atime=1513425937.53376694 29 ctime=1513425937.53376694 qjackctl-0.5.0/src/qjackctlJackConnect.h0000644000175000001440000001167213215206021020454 0ustar00rncbcusers00000000000000// qjackctlJackConnect.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlJackConnect_h #define __qjackctlJackConnect_h #include "qjackctlAbout.h" #include "qjackctlConnect.h" #include // Forward declarations. class qjackctlJackPort; class qjackctlJackClient; class qjackctlJackClientList; class qjackctlJackConnect; // Connection port type. #define QJACKCTL_JACK_AUDIO 0 #define QJACKCTL_JACK_MIDI 1 // Pixmap-set array indexes/types. #define QJACKCTL_JACK_CLIENTI 0 // Input client item pixmap. #define QJACKCTL_JACK_CLIENTO 1 // Output client item pixmap. #define QJACKCTL_JACK_PORTPTI 2 // Physcal Terminal Input port pixmap. #define QJACKCTL_JACK_PORTPTO 3 // Physical Terminal Output port pixmap. #define QJACKCTL_JACK_PORTPNI 4 // Physical Non-terminal Input port pixmap. #define QJACKCTL_JACK_PORTPNO 5 // Physical Non-terminal Output port pixmap. #define QJACKCTL_JACK_PORTLTI 6 // Logical Terminal Input port pixmap. #define QJACKCTL_JACK_PORTLTO 7 // Logical Terminal Output port pixmap. #define QJACKCTL_JACK_PORTLNI 8 // Logical Non-terminal Input port pixmap. #define QJACKCTL_JACK_PORTLNO 9 // Logical Non-terminal Output port pixmap. #define QJACKCTL_JACK_PIXMAPS 10 // Number of pixmaps in array. // Jack port list item. class qjackctlJackPort : public qjackctlPortItem { public: // Constructor. qjackctlJackPort(qjackctlJackClient *pClient, jack_port_t *pJackPort); // Default destructor. ~qjackctlJackPort(); // Jack handles accessors. jack_port_t *jackPort() const; // Pretty/display name method (virtual override). void updatePortName(bool bRename = false); // Tooltip text builder (virtual override). QString tooltip() const; private: // Instance variables. jack_port_t *m_pJackPort; }; // Jack client list item. class qjackctlJackClient : public qjackctlClientItem { public: // Constructor. qjackctlJackClient(qjackctlJackClientList *pClientList); // Default destructor. ~qjackctlJackClient(); // Jack port lookup. qjackctlJackPort *findJackPort(jack_port_t *pJackPort); // Pretty/display name method (virtual override). void updateClientName(bool bRename = false); }; // Jack client list. class qjackctlJackClientList : public qjackctlClientList { public: // Constructor. qjackctlJackClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlJackClientList(); // Jack port lookup. qjackctlJackPort *findJackClientPort(jack_port_t *pJackPort); // Client:port refreshner (return newest item count). int updateClientPorts(); // Jack client port aliases mode. static void setJackClientPortAlias(int iJackClientPortAlias); static int jackClientPortAlias(); // Jack client port pretty-name (metadata) mode. static void setJackClientPortMetadata(bool bJackClientPortMetadata); static bool isJackClientPortMetadata(); private: // Jack client port aliases mode. static int g_iJackClientPortAlias; // Jack client port pretty-name (metadata) mode. static bool g_bJackClientPortMetadata; }; //---------------------------------------------------------------------------- // qjackctlJackConnect -- Connections model integrated object. class qjackctlJackConnect : public qjackctlConnect { public: // Constructor. qjackctlJackConnect(qjackctlConnectView *pConnectView, int iJackType); // Default destructor. ~qjackctlJackConnect(); // Connection type accessors. int jackType() const; // Common pixmap accessor. const QPixmap& pixmap (int iPixmap) const; protected: // Virtual Connect/Disconnection primitives. bool connectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Update port connection references. void updateConnections(); // Update icon size implementation. void updateIconPixmaps(); private: // Local pixmap-set janitor methods. void createIconPixmaps(); void deleteIconPixmaps(); // Local variables. int m_iJackType; // Local pixmap-set array. QPixmap *m_apPixmaps[QJACKCTL_JACK_PIXMAPS]; }; #endif // __qjackctlJackConnect_h // end of qjackctlJackConnect.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayFile.cpp0000644000000000000000000000012713215206021020323 xustar0029 mtime=1513425937.53676694 29 atime=1513425937.53676694 29 ctime=1513425937.53676694 qjackctl-0.5.0/src/qjackctlPatchbayFile.cpp0000644000175000001440000002233513215206021021156 0ustar00rncbcusers00000000000000// qjackctlPatchbayFile.cpp // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlPatchbayFile.h" #include #include #include //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void load_socketlist ( QList& socketlist, QDomElement& eSockets ) { for (QDomNode nSocket = eSockets.firstChild(); !nSocket.isNull(); nSocket = nSocket.nextSibling()) { // Convert slot node to element... QDomElement eSocket = nSocket.toElement(); if (eSocket.isNull()) continue; if (eSocket.tagName() == "socket") { QString sSocketName = eSocket.attribute("name"); QString sClientName = eSocket.attribute("client"); QString sSocketType = eSocket.attribute("type"); QString sExclusive = eSocket.attribute("exclusive"); QString sSocketForward = eSocket.attribute("forward"); int iSocketType = qjackctlPatchbaySocket::typeFromText(sSocketType); bool bExclusive = (sExclusive == "on" || sExclusive == "yes" || sExclusive == "1"); qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(sSocketName, sClientName, iSocketType); if (pSocket) { pSocket->setExclusive(bExclusive); pSocket->setForward(sSocketForward); // Now's time to handle pluglist... for (QDomNode nPlug = eSocket.firstChild(); !nPlug.isNull(); nPlug = nPlug.nextSibling()) { // Convert plug node to element... QDomElement ePlug = nPlug.toElement(); if (ePlug.isNull()) continue; if (ePlug.tagName() == "plug") pSocket->addPlug(ePlug.text()); } socketlist.append(pSocket); } } } } //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void save_socketlist ( QList& socketlist, QDomElement& eSockets, QDomDocument& doc ) { QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); QDomElement eSocket = doc.createElement("socket"); eSocket.setAttribute("name", pSocket->name()); eSocket.setAttribute("client", pSocket->clientName()); eSocket.setAttribute("type", qjackctlPatchbaySocket::textFromType(pSocket->type())); eSocket.setAttribute("exclusive", (pSocket->isExclusive() ? "on" : "off")); if (!pSocket->forward().isEmpty()) eSocket.setAttribute("forward", pSocket->forward()); QDomElement ePlug; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlug = iter.next(); QDomElement ePlug = doc.createElement("plug"); QDomText text = doc.createTextNode(sPlug); ePlug.appendChild(text); eSocket.appendChild(ePlug); } eSockets.appendChild(eSocket); } } //---------------------------------------------------------------------- // class qjackctlPatchbayFile -- Patchbay file helper implementation. // // Specific patchbay load (read) method. bool qjackctlPatchbayFile::load ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("patchbay"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now e're better reset any old patchbay settings. pPatchbay->clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Now parse for slots, sockets and cables... for (QDomNode nRoot = eDoc.firstChild(); !nRoot.isNull(); nRoot = nRoot.nextSibling()) { // Convert node to element, if any. QDomElement eRoot = nRoot.toElement(); if (eRoot.isNull()) continue; // Check for output-socket spec lists... if (eRoot.tagName() == "output-sockets") load_socketlist(pPatchbay->osocketlist(), eRoot); else // Check for input-socket spec lists... if (eRoot.tagName() == "input-sockets") load_socketlist(pPatchbay->isocketlist(), eRoot); else // Check for slots spec list... if (eRoot.tagName() == "slots") { for (QDomNode nSlot = eRoot.firstChild(); !nSlot.isNull(); nSlot = nSlot.nextSibling()) { // Convert slot node to element... QDomElement eSlot = nSlot.toElement(); if (eSlot.isNull()) continue; if (eSlot.tagName() == "slot") { QString sSlotName = eSlot.attribute("name"); QString sSlotMode = eSlot.attribute("mode"); int iSlotMode = QJACKCTL_SLOTMODE_OPEN; if (sSlotMode == "half") iSlotMode = QJACKCTL_SLOTMODE_HALF; else if (sSlotMode == "full") iSlotMode = QJACKCTL_SLOTMODE_FULL; qjackctlPatchbaySlot *pSlot = new qjackctlPatchbaySlot(sSlotName, iSlotMode); pSlot->setOutputSocket( pPatchbay->findSocket(pPatchbay->osocketlist(), eSlot.attribute("output"))); pSlot->setInputSocket( pPatchbay->findSocket(pPatchbay->isocketlist(), eSlot.attribute("input"))); pPatchbay->addSlot(pSlot); } } } else // Check for cable spec list... if (eRoot.tagName() == "cables") { for (QDomNode nCable = eRoot.firstChild(); !nCable.isNull(); nCable = nCable.nextSibling()) { // Convert cable node to element... QDomElement eCable = nCable.toElement(); if (eCable.isNull()) continue; if (eCable.tagName() == "cable") { int iSocketType = qjackctlPatchbaySocket::typeFromText( eCable.attribute("type")); qjackctlPatchbaySocket *pOutputSocket = pPatchbay->findSocket(pPatchbay->osocketlist(), eCable.attribute("output"), iSocketType); qjackctlPatchbaySocket *pIntputSocket = pPatchbay->findSocket(pPatchbay->isocketlist(), eCable.attribute("input"), iSocketType); if (pOutputSocket && pIntputSocket) { pPatchbay->addCable( new qjackctlPatchbayCable( pOutputSocket, pIntputSocket)); } } } } } return true; } // Specific patchbay save (write) method. bool qjackctlPatchbayFile::save ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("patchbay"); QDomElement eRoot = doc.createElement("patchbay"); eRoot.setAttribute("name", fi.baseName()); eRoot.setAttribute("version", CONFIG_BUILD_VERSION); doc.appendChild(eRoot); // Save output-sockets spec... QDomElement eOutputSockets = doc.createElement("output-sockets"); save_socketlist(pPatchbay->osocketlist(), eOutputSockets, doc); eRoot.appendChild(eOutputSockets); // Save input-sockets spec... QDomElement eInputSockets = doc.createElement("input-sockets"); save_socketlist(pPatchbay->isocketlist(), eInputSockets, doc); eRoot.appendChild(eInputSockets); // Save slots spec... QDomElement eSlots = doc.createElement("slots"); QListIterator slotit(pPatchbay->slotlist()); while (slotit.hasNext()) { qjackctlPatchbaySlot *pSlot = slotit.next(); QDomElement eSlot = doc.createElement("slot"); eSlot.setAttribute("name", pSlot->name()); QString sSlotMode = "open"; switch (pSlot->mode()) { case QJACKCTL_SLOTMODE_HALF: sSlotMode = "half"; break; case QJACKCTL_SLOTMODE_FULL: sSlotMode = "full"; break; } eSlot.setAttribute("mode", sSlotMode); if (pSlot->outputSocket()) eSlot.setAttribute("output", pSlot->outputSocket()->name()); if (pSlot->inputSocket()) eSlot.setAttribute("input", pSlot->inputSocket()->name()); // Add this slot... eSlots.appendChild(eSlot); } eRoot.appendChild(eSlots); // Save cables spec... QDomElement eCables = doc.createElement("cables"); QListIterator cablit(pPatchbay->cablelist()); while (cablit.hasNext()) { qjackctlPatchbayCable *pCable = cablit.next(); if (pCable->outputSocket() && pCable->inputSocket()) { QDomElement eCable = doc.createElement("cable"); eCable.setAttribute("type", qjackctlPatchbaySocket::textFromType( pCable->outputSocket()->type())); eCable.setAttribute("output", pCable->outputSocket()->name()); eCable.setAttribute("input", pCable->inputSocket()->name()); eCables.appendChild(eCable); } } eRoot.appendChild(eCables); // Finally, we're ready to save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // qjackctlPatchbayFile.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAboutForm.ui0000644000000000000000000000012713215206021017521 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctlAboutForm.ui0000644000175000001440000001072513215206021020354 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlAboutForm 0 0 520 280 About QjackCtl :/images/about1.png true 4 4 4 4 4 Qt::Horizontal 8 8 &Close Qt::TabFocus About Qt :/images/qtlogo1.png Qt::Vertical 8 8 1 false true true 32 32 QFrame::NoFrame :/images/qjackctl.png true Qt::AlignCenter false 2 AboutTextView AboutQtButton ClosePushButton qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayRack.cpp0000644000000000000000000000012713215206021020324 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlPatchbayRack.cpp0000644000175000001440000013260213215206021021156 0ustar00rncbcusers00000000000000// qjackctlPatchbayRack.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbayRack.h" // Aliases accessors. #include "qjackctlConnectAlias.h" #include //---------------------------------------------------------------------- // class qjackctlPatchbaySnapshot -- Patchbay snapshot infrastructure. // #include class qjackctlPatchbaySnapshot { public: // Constructor. qjackctlPatchbaySnapshot() {}; // Cleanup. void clear() { m_hash.clear(); } // Prepare/add snapshot connection item. void append ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName ) { Ports& ports = m_hash[sOClientName + ':' + sIClientName]; ports.outs.append(sOPortName); ports.ins.append(sIPortName); } // Commit snapshot into patchbay rack. void commit ( qjackctlPatchbayRack *pRack, int iSocketType ) { QHash::Iterator iter = m_hash.begin(); for ( ; iter != m_hash.end(); ++iter) { const QString& sKey = iter.key(); const QString& sOClient = sKey.section(':', 0, 0); const QString& sIClient = sKey.section(':', 1); Ports& ports = iter.value(); qjackctlPatchbaySocket *pOSocket = get_socket( pRack->osocketlist(), sOClient, ports.outs, iSocketType); qjackctlPatchbaySocket *pISocket = get_socket( pRack->isocketlist(), sIClient, ports.ins, iSocketType); pRack->addCable(new qjackctlPatchbayCable(pOSocket, pISocket)); } m_hash.clear(); } // Find first existing socket. static qjackctlPatchbaySocket *find_socket ( QList& socketlist, const QString& sClientName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); if (QRegExp(pSocket->clientName()).exactMatch(sClientName) && pSocket->type() == iSocketType) { return pSocket; } } return NULL; } // Add socket plug. static void add_socket ( QList& socketlist, const QString& sClientName, const QString& sPortName, int iSocketType ) { qjackctlPatchbaySocket *pSocket = find_socket(socketlist, sClientName, iSocketType); if (pSocket == NULL) { pSocket = new qjackctlPatchbaySocket(sClientName, qjackctlClientAlias::escapeRegExpDigits(sClientName), iSocketType); socketlist.append(pSocket); } pSocket->addPlug( qjackctlClientAlias::escapeRegExpDigits(sPortName)); } // Get client socket into rack (socket list). static qjackctlPatchbaySocket *get_socket ( QList& socketlist, const QString& sClientName, const QStringList& ports, int iSocketType ) { int iSocket = 0; qjackctlPatchbaySocket *pSocket = NULL; QListIterator iter(socketlist); while (iter.hasNext()) { pSocket = iter.next(); if (QRegExp(pSocket->clientName()).exactMatch(sClientName) && pSocket->type() == iSocketType) { QStringListIterator plug_iter(pSocket->pluglist()); QStringListIterator port_iter(ports); bool bMatch = true; while (bMatch && plug_iter.hasNext() && port_iter.hasNext()) { const QString& sPlug = plug_iter.next(); const QString& sPort = port_iter.next(); bMatch = (QRegExp(sPlug).exactMatch(sPort)); } if (bMatch) return pSocket; iSocket++; } } QString sSocketName = sClientName; if (iSocket > 0) sSocketName += ' ' + QString::number(iSocket + 1); pSocket = new qjackctlPatchbaySocket(sSocketName, qjackctlClientAlias::escapeRegExpDigits(sClientName), iSocketType); QStringListIterator port_iter(ports); while (port_iter.hasNext()) { pSocket->addPlug( qjackctlClientAlias::escapeRegExpDigits(port_iter.next())); } socketlist.append(pSocket); return pSocket; } private: // Snapshot instance variables. struct Ports { QStringList outs; QStringList ins; }; QHash m_hash; }; //---------------------------------------------------------------------- // class qjackctlPatchbaySocket -- Patchbay socket implementation. // // Constructor. qjackctlPatchbaySocket::qjackctlPatchbaySocket ( const QString& sSocketName, const QString& sClientName, int iSocketType ) { m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); } // Default destructor. qjackctlPatchbaySocket::~qjackctlPatchbaySocket (void) { m_pluglist.clear(); } // Socket property accessors. const QString& qjackctlPatchbaySocket::name (void) const { return m_sSocketName; } const QString& qjackctlPatchbaySocket::clientName (void) const { return m_sClientName; } int qjackctlPatchbaySocket::type (void) const { return m_iSocketType; } bool qjackctlPatchbaySocket::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlPatchbaySocket::forward (void) const { return m_sSocketForward; } // Slot property methods. void qjackctlPatchbaySocket::setName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlPatchbaySocket::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlPatchbaySocket::setType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlPatchbaySocket::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlPatchbaySocket::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Plug list primitive methods. void qjackctlPatchbaySocket::addPlug ( const QString& sPlugName ) { m_pluglist.append(sPlugName); } void qjackctlPatchbaySocket::removePlug ( const QString& sPlugName ) { int iPlug = m_pluglist.indexOf(sPlugName); if (iPlug >= 0) m_pluglist.removeAt(iPlug); } // Plug list accessor. QStringList& qjackctlPatchbaySocket::pluglist (void) { return m_pluglist; } // Simple socket type methods. int qjackctlPatchbaySocket::typeFromText ( const QString& sSocketType ) { int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT; if (sSocketType == "jack-audio" || sSocketType == "audio") iSocketType = QJACKCTL_SOCKETTYPE_JACK_AUDIO; else if (sSocketType == "jack-midi") iSocketType = QJACKCTL_SOCKETTYPE_JACK_MIDI; else if (sSocketType == "alsa-midi" || sSocketType == "midi") iSocketType = QJACKCTL_SOCKETTYPE_ALSA_MIDI; return iSocketType; } QString qjackctlPatchbaySocket::textFromType ( int iSocketType ) { QString sSocketType; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: sSocketType = "jack-audio"; break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: sSocketType = "jack-midi"; break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: sSocketType = "alsa-midi"; break; default: break; } return sSocketType; } //---------------------------------------------------------------------- // class qjackctlPatchbaySlot -- Patchbay socket slot implementation. // // Constructor. qjackctlPatchbaySlot::qjackctlPatchbaySlot ( const QString& sSlotName, int iSlotMode ) { m_pOutputSocket = NULL; m_pInputSocket = NULL; m_sSlotName = sSlotName; m_iSlotMode = iSlotMode; } // Default destructor. qjackctlPatchbaySlot::~qjackctlPatchbaySlot (void) { setOutputSocket(NULL); setInputSocket(NULL); } // Slot property accessors. const QString& qjackctlPatchbaySlot::name (void) const { return m_sSlotName; } int qjackctlPatchbaySlot::mode (void) const { return m_iSlotMode; } // Slot property methods. void qjackctlPatchbaySlot::setName ( const QString& sSlotName ) { m_sSlotName = sSlotName; } void qjackctlPatchbaySlot::setMode ( int iSlotMode ) { m_iSlotMode = iSlotMode; } // Socket methods. void qjackctlPatchbaySlot::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbaySlot::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbaySlot::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbaySlot::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayCable -- Patchbay cable connection implementation. // // Constructor. qjackctlPatchbayCable::qjackctlPatchbayCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { m_pOutputSocket = pOutputSocket; m_pInputSocket = pInputSocket; } // Default destructor. qjackctlPatchbayCable::~qjackctlPatchbayCable (void) { setOutputSocket(NULL); setInputSocket(NULL); } // Socket methods. void qjackctlPatchbayCable::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbayCable::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbayCable::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbayCable::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayRack -- Patchbay rack profile implementation. // // Constructor. qjackctlPatchbayRack::qjackctlPatchbayRack (void) { m_pJackClient = NULL; m_ppszOAudioPorts = NULL; m_ppszIAudioPorts = NULL; m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; // MIDI connection persistence cache variables. m_pAlsaSeq = NULL; } // Default destructor. qjackctlPatchbayRack::~qjackctlPatchbayRack (void) { clear(); } // Common socket list primitive methods. void qjackctlPatchbayRack::addSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { qjackctlPatchbaySocket *pSocketPtr = findSocket(socketlist, pSocket->name()); if (pSocketPtr) removeSocket(socketlist, pSocketPtr); socketlist.append(pSocket); } void qjackctlPatchbayRack::removeSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { int iSocket = socketlist.indexOf(pSocket); if (iSocket >= 0) { socketlist.removeAt(iSocket); delete pSocket; } } // Slot list primitive methods. void qjackctlPatchbayRack::addSlot ( qjackctlPatchbaySlot *pSlot ) { qjackctlPatchbaySlot *pSlotPtr = findSlot(pSlot->name()); if (pSlotPtr) removeSlot(pSlotPtr); m_slotlist.append(pSlot); } void qjackctlPatchbayRack::removeSlot ( qjackctlPatchbaySlot *pSlot ) { int iSlot = m_slotlist.indexOf(pSlot); if (iSlot >= 0) { m_slotlist.removeAt(iSlot); delete pSlot; } } // Cable list primitive methods. void qjackctlPatchbayRack::addCable ( qjackctlPatchbayCable *pCable ) { qjackctlPatchbayCable *pCablePtr = findCable(pCable); if (pCablePtr) removeCable(pCablePtr); m_cablelist.append(pCable); } void qjackctlPatchbayRack::removeCable ( qjackctlPatchbayCable *pCable ) { int iCable = m_cablelist.indexOf(pCable); if (iCable >= 0) { m_cablelist.removeAt(iCable); delete pCable; } } // Common socket finders. qjackctlPatchbaySocket *qjackctlPatchbayRack::findSocket ( QList& socketlist, const QString& sSocketName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); if (sSocketName == pSocket->name() && (iSocketType == QJACKCTL_SOCKETTYPE_DEFAULT || iSocketType == pSocket->type())) return pSocket; } return NULL; } // Patchbay socket slot finders. qjackctlPatchbaySlot *qjackctlPatchbayRack::findSlot ( const QString& sSlotName ) { QListIterator iter(m_slotlist); while (iter.hasNext()) { qjackctlPatchbaySlot *pSlot = iter.next(); if (sSlotName == pSlot->name()) return pSlot; } return NULL; } // Cable finders. qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOutputSocket, const QString& sInputSocket ) { qjackctlPatchbaySocket *pSocket; QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); pSocket = pCable->outputSocket(); if (pSocket && sOutputSocket == pSocket->name()) { pSocket = pCable->inputSocket(); if (pSocket && sInputSocket == pSocket->name()) return pCable; } } return NULL; } qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( qjackctlPatchbayCable *pCablePtr ) { QString sOutputSocket; if (pCablePtr->outputSocket()) sOutputSocket = pCablePtr->outputSocket()->name(); QString sInputSocket; if (pCablePtr->inputSocket()) sInputSocket = pCablePtr->inputSocket()->name(); return findCable(sOutputSocket, sInputSocket); } // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType ) { // This is a regex prefix needed for ALSA MDII // as client and port names include id-number+colon... QString sPrefix; if (iSocketType == QJACKCTL_SOCKETTYPE_ALSA_MIDI) sPrefix = "[0-9]+:"; // Scan from output-socket list... QListIterator osocket(m_osocketlist); while (osocket.hasNext()) { qjackctlPatchbaySocket *pOSocket = osocket.next(); if (pOSocket->type() != iSocketType) continue; // Output socket client name match? if (!QRegExp(sPrefix + pOSocket->clientName()) .exactMatch(sOClientName)) continue; // Output plug port names match? QStringListIterator oplug(pOSocket->pluglist()); while (oplug.hasNext()) { if (!QRegExp(sPrefix + oplug.next()) .exactMatch(sOPortName)) continue; // Scan for output-socket cable... QListIterator cable(m_cablelist); while (cable.hasNext()) { qjackctlPatchbayCable *pCable = cable.next(); if (pCable->outputSocket() != pOSocket) continue; qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); // Input socket client name match? if (!QRegExp(sPrefix + pISocket->clientName()) .exactMatch(sIClientName)) continue; // Input plug port names match? QStringListIterator iplug(pISocket->pluglist()); while (iplug.hasNext()) { // Found it? if (QRegExp(sPrefix + iplug.next()) .exactMatch(sIPortName)) return pCable; } } } } // No matching cable was found. return NULL; } // Patckbay cleaners. void qjackctlPatchbayRack::clear (void) { qDeleteAll(m_cablelist); m_cablelist.clear(); qDeleteAll(m_slotlist); m_slotlist.clear(); qDeleteAll(m_isocketlist); m_isocketlist.clear(); qDeleteAll(m_osocketlist); m_osocketlist.clear(); } // Patchbay rack output sockets list accessor. QList& qjackctlPatchbayRack::osocketlist (void) { return m_osocketlist; } // Patchbay rack input sockets list accessor. QList& qjackctlPatchbayRack::isocketlist (void) { return m_isocketlist; } // Patchbay rack slots list accessor. QList& qjackctlPatchbayRack::slotlist (void) { return m_slotlist; } // Patchbay cable connections list accessor. QList& qjackctlPatchbayRack::cablelist (void) { return m_cablelist; } // Lookup for the n-th JACK client port // that matches the given regular expression... const char *qjackctlPatchbayRack::findJackPort ( const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n ) { QRegExp rxClientName(sClientName); QRegExp rxPortName(sPortName); int i = 0; int iClientPort = 0; while (ppszJackPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszJackPorts[iClientPort]); int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { if (rxClientName.exactMatch(sClientPort.left(iColon)) && rxPortName.exactMatch(sClientPort.right( sClientPort.length() - iColon - 1))) { if (++i > n) return ppszJackPorts[iClientPort]; } } iClientPort++; } return NULL; } // JACK port-pair connection executive IS DEPRECATED! void qjackctlPatchbayRack::connectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_connect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair disconnection executive. void qjackctlPatchbayRack::disconnectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair connection notifier. void qjackctlPatchbayRack::checkJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } // Check and enforce if an audio output client:port is connected to one input. void qjackctlPatchbayRack::connectJackSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort ) { bool bConnected = false; // Check for inputs from output... const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts) { for (int i = 0 ; ppszInputPorts[i]; i++) { if (strcmp(ppszInputPorts[i], pszInputPort) == 0) bConnected = true; else if (pOutputSocket->isExclusive()) disconnectJackPorts(pszOutputPort, ppszInputPorts[i]); } ::free(ppszInputPorts); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszInputPort)); if (ppszOutputPorts) { for (int i = 0 ; ppszOutputPorts[i]; i++) { if (strcmp(ppszOutputPorts[i], pszOutputPort) == 0) bConnected = true; else disconnectJackPorts(ppszOutputPorts[i], pszInputPort); } ::free(ppszOutputPorts); } } // Finally do the connection?... if (!bConnected) { connectJackPorts(pszOutputPort, pszInputPort); } else { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } } // Check and maint whether an JACK socket pair is fully connected. void qjackctlPatchbayRack::connectJackCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == NULL || pInputSocket == NULL) return; if (pOutputSocket->type() != pInputSocket->type()) return; const char **ppszOutputPorts = NULL; const char **ppszInputPorts = NULL; if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == NULL || ppszInputPorts == NULL) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check audio port connection sequentially... int iOPort = 0; const char *pszOutputPort; while ((pszOutputPort = findJackPort(ppszOutputPorts, pOutputSocket->clientName(), sOutputPlug, iOPort)) != NULL) { int iIPort = 0; const char *pszInputPort; while ((pszInputPort = findJackPort(ppszInputPorts, pInputSocket->clientName(), sInputPlug, iIPort)) != NULL) { connectJackSocketPorts( pOutputSocket, pszOutputPort, pInputSocket, pszInputPort); iIPort++; } iOPort++; } } } // Main JACK cable connect persistance scan cycle. void qjackctlPatchbayRack::connectJackScan ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache client descriptor. m_pJackClient = pJackClient; // Cache all current audio client-ports... m_ppszOAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput); m_ppszIAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput); #ifdef CONFIG_JACK_MIDI // Cache all current MIDI client-ports... m_ppszOMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput); m_ppszIMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput); #else m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; #endif // Start looking for connections... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectJackCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_MIDI); #endif // Free client-ports caches... if (m_ppszOAudioPorts) ::free(m_ppszOAudioPorts); if (m_ppszIAudioPorts) ::free(m_ppszIAudioPorts); #ifdef CONFIG_JACK_MIDI if (m_ppszOMidiPorts) ::free(m_ppszOMidiPorts); if (m_ppszIMidiPorts) ::free(m_ppszIMidiPorts); #endif // Reset cached pointers. m_ppszOAudioPorts = NULL; m_ppszIAudioPorts = NULL; m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; m_pJackClient = NULL; } // Load all midi available midi ports of a given type. void qjackctlPatchbayRack::loadAlsaPorts ( QList& midiports, bool bReadable ) { if (m_pAlsaSeq == NULL) return; qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(m_pAlsaSeq, pClientInfo) >= 0) { int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { QString sClientName = snd_seq_client_info_get_name(pClientInfo); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(m_pAlsaSeq, pPortInfo) >= 0) { unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { qjackctlAlsaMidiPort *pMidiPort = new qjackctlAlsaMidiPort; pMidiPort->sClientName = sClientName; pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); pMidiPort->iAlsaPort = snd_seq_port_info_get_port(pPortInfo); midiports.append(pMidiPort); } } } } #endif // CONFIG_ALSA_SEQ } // Get current connections from given MIDI port. void qjackctlPatchbayRack::loadAlsaConnections ( QList& midiports, qjackctlAlsaMidiPort *pMidiPort, bool bReadable ) { qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ snd_seq_query_subs_type_t snd_subs_type; if (bReadable) snd_subs_type = SND_SEQ_QUERY_SUBS_READ; else snd_subs_type = SND_SEQ_QUERY_SUBS_WRITE; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); snd_seq_query_subscribe_set_type(pAlsaSubs, snd_subs_type); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pMidiPort->iAlsaClient; seq_addr.port = pMidiPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlAlsaMidiPort *pPort = new qjackctlAlsaMidiPort; setAlsaPort(pPort, seq_addr.client, seq_addr.port); midiports.append(pPort); snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } #endif // CONFIG_ALSA_SEQ } // Lookup for the n-th MIDI client port that matches the given regular expression... qjackctlAlsaMidiPort *qjackctlPatchbayRack::findAlsaPort ( QList& midiports, const QString& sClientName, const QString& sPortName, int n ) { QRegExp rxClientName(sClientName); QRegExp rxPortName(sPortName); int i = 0; // For each port... QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (rxClientName.exactMatch(pMidiPort->sClientName) && rxPortName.exactMatch(pMidiPort->sPortName)) { if (++i > n) return pMidiPort; } } return NULL; } // MIDI port-pair name string. QString qjackctlPatchbayRack::getAlsaPortName ( qjackctlAlsaMidiPort *pMidiPort ) { return QString::number(pMidiPort->iAlsaClient) + ':' + QString::number(pMidiPort->iAlsaPort) + ' ' + pMidiPort->sClientName; } // MIDI port-pair name string. void qjackctlPatchbayRack::setAlsaPort ( qjackctlAlsaMidiPort *pMidiPort, int iAlsaClient, int iAlsaPort ) { #ifdef CONFIG_ALSA_SEQ snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->iAlsaPort = iAlsaPort; if (snd_seq_get_any_client_info(m_pAlsaSeq, iAlsaClient, pClientInfo) == 0) pMidiPort->sClientName = snd_seq_client_info_get_name(pClientInfo); if (snd_seq_get_any_port_info(m_pAlsaSeq, iAlsaClient, iAlsaPort, pPortInfo) == 0) pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair connection executive. void qjackctlPatchbayRack::connectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection executive. void qjackctlPatchbayRack::disconnectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection notifier. void qjackctlPatchbayRack::checkAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } // Check and enforce if a midi output client:port is connected to one input. void qjackctlPatchbayRack::connectAlsaSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ bool bConnected = false; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pInputPort->iAlsaClient && seq_addr.port == pInputPort->iAlsaPort) bConnected = true; else if (pOutputSocket->isExclusive()) { qjackctlAlsaMidiPort iport; setAlsaPort(&iport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(pOutputPort, &iport); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pOutputPort->iAlsaClient && seq_addr.port == pOutputPort->iAlsaPort) bConnected = true; else if (pInputSocket->isExclusive()) { qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(&oport, pInputPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } // Finally do the connection?... if (!bConnected) { connectAlsaPorts(pOutputPort, pInputPort); } else { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } #endif // CONFIG_ALSA_SEQ } // Check and maint whether a MIDI socket pair is fully connected. void qjackctlPatchbayRack::connectAlsaCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == NULL || pInputSocket == NULL) return; if (pOutputSocket->type() != pInputSocket->type() || pOutputSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check MIDI port connection sequentially... int iOPort = 0; qjackctlAlsaMidiPort *pOutputPort; while ((pOutputPort = findAlsaPort(m_omidiports, pOutputSocket->clientName(), sOutputPlug, iOPort)) != NULL) { int iIPort = 0; qjackctlAlsaMidiPort *pInputPort; while ((pInputPort = findAlsaPort(m_imidiports, pInputSocket->clientName(), sInputPlug, iIPort)) != NULL) { connectAlsaSocketPorts( pOutputSocket, pOutputPort, pInputSocket, pInputPort); iIPort++; } iOPort++; } } } // Overloaded MIDI cable connect persistance scan cycle. void qjackctlPatchbayRack::connectAlsaScan ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; // Cache all current output client-ports... loadAlsaPorts(m_omidiports, true); loadAlsaPorts(m_imidiports, false); // Run the MIDI cable scan... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectAlsaCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward MIDI sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_ALSA_MIDI); // Free client-ports caches... qDeleteAll(m_omidiports); m_omidiports.clear(); qDeleteAll(m_imidiports); m_imidiports.clear(); m_pAlsaSeq = NULL; } // JACK socket/ports forwarding scan... void qjackctlPatchbayRack::connectJackForwardPorts ( const char *pszPort, const char *pszPortForward ) { // Check for outputs from forwarded input... const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPortForward)); if (ppszOutputPorts) { // Grab current connections of target port... const char **ppszPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPort)); for (int i = 0 ; ppszOutputPorts[i]; i++) { // Need to lookup if already connected... bool bConnected = false; for (int j = 0; ppszPorts && ppszPorts[j]; j++) { if (strcmp(ppszOutputPorts[i], ppszPorts[j]) == 0) { bConnected = true; break; } } // Make or just report the connection... if (bConnected) { checkJackPorts(ppszOutputPorts[i], pszPort); } else { connectJackPorts(ppszOutputPorts[i], pszPort); } } // Free provided arrays... if (ppszPorts) ::free(ppszPorts); ::free(ppszOutputPorts); } } void qjackctlPatchbayRack::connectJackForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == NULL || pSocketForward == NULL) return; if (pSocket->type() != pSocketForward->type()) return; const char **ppszOutputPorts = NULL; const char **ppszInputPorts = NULL; if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == NULL || ppszInputPorts == NULL) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check audio port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); const char *pszPortForward = findJackPort(ppszInputPorts, pSocketForward->clientName(), sPlugForward, 0); if (pszPortForward) { const char *pszPort = findJackPort(ppszInputPorts, pSocket->clientName(), sPlug, 0); if (pszPort) connectJackForwardPorts(pszPort, pszPortForward); } } } // ALSA socket/ports forwarding scan... void qjackctlPatchbayRack::connectAlsaForwardPorts ( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward ) { #ifdef CONFIG_ALSA_SEQ // Grab current connections of target port... QList midiports; loadAlsaConnections(midiports, pPort, false); snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pPortForward->iAlsaClient; seq_addr.port = pPortForward->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); // Need to lookup if already connected... bool bConnected = false; QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (pMidiPort->iAlsaClient == seq_addr.client && pMidiPort->iAlsaPort == seq_addr.port) { bConnected = true; break; } } // Make and/or just report the connection... qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); if (bConnected) { checkAlsaPorts(&oport, pPort); } else { connectAlsaPorts(&oport, pPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } qDeleteAll(midiports); midiports.clear(); #endif // CONFIG_ALSA_SEQ } void qjackctlPatchbayRack::connectAlsaForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == NULL || pSocketForward == NULL) return; if (pSocket->type() != pSocketForward->type() || pSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check MIDI port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); qjackctlAlsaMidiPort *pPortForward = findAlsaPort(m_imidiports, pSocketForward->clientName(), sPlugForward, 0); if (pPortForward) { qjackctlAlsaMidiPort *pPort = findAlsaPort(m_imidiports, pSocket->clientName(), sPlug, 0); if (pPort) connectAlsaForwardPorts(pPort, pPortForward); } } } // Common socket forwrading scan... void qjackctlPatchbayRack::connectForwardScan ( int iSocketType ) { // First, make a copy of a seriously forwarded socket list... QList socketlist; QListIterator isocket(m_isocketlist); while (isocket.hasNext()) { qjackctlPatchbaySocket *pSocket = isocket.next(); if (pSocket->type() != iSocketType) continue; if (pSocket->forward().isEmpty()) continue; socketlist.append(pSocket); } // Second, scan for input forwarded sockets... QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); qjackctlPatchbaySocket *pSocketForward = findSocket(m_isocketlist, pSocket->forward()); if (pSocketForward == NULL) continue; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: case QJACKCTL_SOCKETTYPE_JACK_MIDI: connectJackForward(pSocket, pSocketForward); break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: connectAlsaForward(pSocket, pSocketForward); break; } } } //---------------------------------------------------------------------- // JACK snapshot. void qjackctlPatchbayRack::connectJackSnapshotEx ( int iSocketType ) { if (m_pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszInputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsInput); if (ppszInputPorts) { for (int i = 0; ppszInputPorts[i]; ++i) { const char *pszInputPort = ppszInputPorts[i]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( isocketlist(), sIClient, sIPort, iSocketType); } ::free(ppszInputPorts); } const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts == NULL) return; qjackctlPatchbaySnapshot snapshot; for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const QString sOutputPort = QString::fromUtf8(pszOutputPort); const QString& sOClient = sOutputPort.section(':', 0, 0); const QString& sOPort = sOutputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( osocketlist(), sOClient, sOPort, iSocketType); // Check for inputs from output... ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == NULL) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); snapshot.append(sOClient, sOPort, sIClient, sIPort); } ::free(ppszInputPorts); } ::free(ppszOutputPorts); snapshot.commit(this, iSocketType); } void qjackctlPatchbayRack::connectJackSnapshot ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = NULL; } //---------------------------------------------------------------------- // ALSA snapshot. void qjackctlPatchbayRack::connectAlsaSnapshot ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList imidiports; loadAlsaPorts(imidiports, false); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); qjackctlPatchbaySnapshot::add_socket( isocketlist(), pIPort->sClientName, pIPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } qDeleteAll(imidiports); imidiports.clear(); qjackctlPatchbaySnapshot snapshot; QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); qjackctlPatchbaySnapshot::add_socket( osocketlist(), pOPort->sClientName, pOPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snapshot.append( pOPort->sClientName, pOPort->sPortName, pIPort->sClientName, pIPort->sPortName); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); snapshot.commit(this, QJACKCTL_SOCKETTYPE_ALSA_MIDI); #endif // Done. m_pAlsaSeq = NULL; } //---------------------------------------------------------------------- // JACK reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllJackPortsEx ( int iSocketType ) { if (m_pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts) { for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == NULL) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort); } ::free(ppszInputPorts); } ::free(ppszOutputPorts); } } void qjackctlPatchbayRack::disconnectAllJackPorts ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = NULL; } //---------------------------------------------------------------------- // ALSA reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllAlsaPorts ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); QList imidiports; loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOPort->iAlsaClient; seq_addr.port = pOPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIPort->iAlsaClient; seq_addr.port = pIPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); #endif // Done. m_pAlsaSeq = NULL; } // qjackctlPatchbayRack.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnectionsForm.cpp0000644000000000000000000000012713215206021021076 xustar0029 mtime=1513425937.53276694 29 atime=1513425937.53176694 29 ctime=1513425937.53276694 qjackctl-0.5.0/src/qjackctlConnectionsForm.cpp0000644000175000001440000005165613215206021021741 0ustar00rncbcusers00000000000000// qjackctlConnectionsForm.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlConnectionsForm.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include #include #include //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. // Constructor. qjackctlConnectionsForm::qjackctlConnectionsForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pAudioConnect = new qjackctlJackConnect( m_ui.AudioConnectView, QJACKCTL_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI m_pMidiConnect = new qjackctlJackConnect( m_ui.MidiConnectView, QJACKCTL_JACK_MIDI); #else m_pMidiConnect = NULL; #endif #ifdef CONFIG_ALSA_SEQ m_pAlsaConnect = new qjackctlAlsaConnect(m_ui.AlsaConnectView); #else m_pAlsaConnect = NULL; #endif m_pSetup = NULL; // UI connections... QObject::connect(m_ui.AudioConnectPushButton, SIGNAL(clicked()), SLOT(audioConnectSelected())); QObject::connect(m_ui.AudioDisconnectPushButton, SIGNAL(clicked()), SLOT(audioDisconnectSelected())); QObject::connect(m_ui.AudioDisconnectAllPushButton, SIGNAL(clicked()), SLOT(audioDisconnectAll())); QObject::connect(m_ui.AudioExpandAllPushButton, SIGNAL(clicked()), SLOT(audioExpandAll())); QObject::connect(m_ui.AudioRefreshPushButton, SIGNAL(clicked()), SLOT(audioRefreshClear())); QObject::connect(m_ui.MidiConnectPushButton, SIGNAL(clicked()), SLOT(midiConnectSelected())); QObject::connect(m_ui.MidiDisconnectPushButton, SIGNAL(clicked()), SLOT(midiDisconnectSelected())); QObject::connect(m_ui.MidiDisconnectAllPushButton, SIGNAL(clicked()), SLOT(midiDisconnectAll())); QObject::connect(m_ui.MidiExpandAllPushButton, SIGNAL(clicked()), SLOT(midiExpandAll())); QObject::connect(m_ui.MidiRefreshPushButton, SIGNAL(clicked()), SLOT(midiRefreshClear())); QObject::connect(m_ui.AlsaConnectPushButton, SIGNAL(clicked()), SLOT(alsaConnectSelected())); QObject::connect(m_ui.AlsaDisconnectPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectSelected())); QObject::connect(m_ui.AlsaDisconnectAllPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectAll())); QObject::connect(m_ui.AlsaExpandAllPushButton, SIGNAL(clicked()), SLOT(alsaExpandAll())); QObject::connect(m_ui.AlsaRefreshPushButton, SIGNAL(clicked()), SLOT(alsaRefreshClear())); // Connect it to some UI feedback slots. QObject::connect(m_ui.AudioConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.AudioConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.MidiConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.MidiConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.AlsaConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); QObject::connect(m_ui.AlsaConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); // Dirty dispatcher (refresh deferral). QObject::connect(m_ui.AudioConnectView, SIGNAL(contentsChanged()), SLOT(audioRefresh())); QObject::connect(m_ui.MidiConnectView, SIGNAL(contentsChanged()), SLOT(midiRefresh())); QObject::connect(m_ui.AlsaConnectView, SIGNAL(contentsChanged()), SLOT(alsaRefresh())); // Actual connections... QObject::connect(m_pAudioConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifndef CONFIG_JACK_MIDI m_ui.ConnectionsTabWidget->setTabEnabled(1, false); #endif #ifndef CONFIG_ALSA_SEQ // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); #endif // Start disabled. stabilizeAudio(false); stabilizeMidi(false); stabilizeAlsa(false); } // Destructor. qjackctlConnectionsForm::~qjackctlConnectionsForm (void) { // Destroy our connections view... if (m_pAudioConnect) delete m_pAudioConnect; #ifdef CONFIG_JACK_MIDI if (m_pMidiConnect) delete m_pMidiConnect; #endif #ifdef CONFIG_ALSA_SEQ if (m_pAlsaConnect) delete m_pAlsaConnect; #endif } // Notify our parent that we're emerging. void qjackctlConnectionsForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); audioRefresh(); midiRefresh(); alsaRefresh(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlConnectionsForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlConnectionsForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views and those // client/port aliasing feature. void qjackctlConnectionsForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { QObject::connect(m_pAudioConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(connectChanged()), pMainForm, SLOT(alsaConnectChanged())); #endif } // Load some splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.AudioConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.MidiConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.AlsaConnectView, sizes); #ifdef CONFIG_ALSA_SEQ if (!m_pSetup->bAlsaSeqEnabled) { // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); } #endif } // Update initial client/port aliases... updateAliases(); } // Connector view accessors. qjackctlConnectView *qjackctlConnectionsForm::audioConnectView (void) const { return m_ui.AudioConnectView; } qjackctlConnectView *qjackctlConnectionsForm::midiConnectView (void) const { return m_ui.MidiConnectView; } qjackctlConnectView *qjackctlConnectionsForm::alsaConnectView (void) const { return m_ui.AlsaConnectView; } // Window close event handlers. bool qjackctlConnectionsForm::queryClose (void) { bool bQueryClose = true; if (m_pSetup && (m_ui.AudioConnectView->isDirty() || m_ui.MidiConnectView->isDirty() || m_ui.AlsaConnectView->isDirty())) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("The preset aliases have been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPreset), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: saveAliases(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; } } // Save some splitter sizes... if (m_pSetup && bQueryClose) { m_pSetup->saveSplitterSizes(m_ui.AudioConnectView); m_pSetup->saveSplitterSizes(m_ui.MidiConnectView); m_pSetup->saveSplitterSizes(m_ui.AlsaConnectView); } return bQueryClose; } // Load aliases from current preset. bool qjackctlConnectionsForm::loadAliases (void) { bool bResult = false; if (m_pSetup && queryClose()) { m_sPreset = m_pSetup->sDefPreset; bResult = m_pSetup->loadAliases(m_sPreset); if (bResult) { m_ui.AudioConnectView->setDirty(false); m_ui.MidiConnectView->setDirty(false); m_ui.AlsaConnectView->setDirty(false); } } return bResult; } // Save aliases to current preset. bool qjackctlConnectionsForm::saveAliases (void) { bool bResult = false; if (m_pSetup) { bResult = m_pSetup->saveAliases(m_sPreset); if (bResult) { m_ui.AudioConnectView->setDirty(false); m_ui.MidiConnectView->setDirty(false); m_ui.AlsaConnectView->setDirty(false); } } return bResult; } // Tab page accessors. void qjackctlConnectionsForm::setTabPage ( int iTabPage ) { m_ui.ConnectionsTabWidget->setCurrentIndex(iTabPage); } int qjackctlConnectionsForm::tabPage (void) const { return m_ui.ConnectionsTabWidget->currentIndex(); } // Connections view font accessors. QFont qjackctlConnectionsForm::connectionsFont (void) const { // Elect one list view to retrieve current font. return m_ui.AudioConnectView->OListView()->font(); } void qjackctlConnectionsForm::setConnectionsFont ( const QFont & font ) { // Set fonts of all listviews... m_ui.AudioConnectView->OListView()->setFont(font); m_ui.AudioConnectView->IListView()->setFont(font); m_ui.MidiConnectView->OListView()->setFont(font); m_ui.MidiConnectView->IListView()->setFont(font); m_ui.AlsaConnectView->OListView()->setFont(font); m_ui.AlsaConnectView->IListView()->setFont(font); } // Connections view icon size accessor. void qjackctlConnectionsForm::setConnectionsIconSize ( int iIconSize ) { // Set icon sizes of all views... m_ui.AudioConnectView->setIconSize(iIconSize); m_ui.MidiConnectView->setIconSize(iIconSize); m_ui.AlsaConnectView->setIconSize(iIconSize); } // Check if there's JACK audio connections. bool qjackctlConnectionsForm::isAudioConnected (void) const { bool bIsAudioConnected = false; if (m_pAudioConnect) bIsAudioConnected = m_pAudioConnect->canDisconnectAll(); return bIsAudioConnected; } // Connect current selected JACK audio ports. void qjackctlConnectionsForm::audioConnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->connectSelected()) refreshAudio(false); } } // Disconnect current selected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectSelected()) refreshAudio(false); } } // Disconnect all connected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectAll (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectAll()) refreshAudio(false); } } // Expand all JACK audio client ports. void qjackctlConnectionsForm::audioExpandAll (void) { if (m_pAudioConnect) { m_pAudioConnect->expandAll(); stabilizeAudio(true); } } // JACK audio ports disconnecting. void qjackctlConnectionsForm::audioDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_AUDIO); } // Refresh JACK audio form by notifying the parent form. void qjackctlConnectionsForm::audioRefreshClear (void) { refreshAudio(true, true); } void qjackctlConnectionsForm::audioRefresh (void) { refreshAudio(false); } // A JACK audio helper stabilization slot. void qjackctlConnectionsForm::audioStabilize (void) { stabilizeAudio(true); } // Connect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiConnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->connectSelected()) refreshMidi(false); } } // Check if there's JACK MIDI connections. bool qjackctlConnectionsForm::isMidiConnected (void) const { bool bIsMidiConnected = false; if (m_pMidiConnect) bIsMidiConnected = m_pMidiConnect->canDisconnectAll(); return bIsMidiConnected; } // Disconnect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectSelected()) refreshMidi(false); } } // Disconnect all connected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectAll (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectAll()) refreshMidi(false); } } // Expand all JACK MIDI client ports. void qjackctlConnectionsForm::midiExpandAll (void) { if (m_pMidiConnect) { m_pMidiConnect->expandAll(); stabilizeMidi(true); } } // JACK MIDI ports disconnecting. void qjackctlConnectionsForm::midiDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_MIDI); } // Refresh JACK MIDI form by notifying the parent form. void qjackctlConnectionsForm::midiRefreshClear (void) { refreshMidi(true, true); } void qjackctlConnectionsForm::midiRefresh (void) { refreshMidi(false); } // A JACK MIDI helper stabilization slot. void qjackctlConnectionsForm::midiStabilize (void) { stabilizeMidi(true); } // Check if there's ALSA MIDI connections. bool qjackctlConnectionsForm::isAlsaConnected (void) const { bool bIsAlsaConnected = false; if (m_pAlsaConnect) bIsAlsaConnected = m_pAlsaConnect->canDisconnectAll(); return bIsAlsaConnected; } // Connect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaConnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->connectSelected()) refreshAlsa(false); } } // Disconnect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectSelected()) refreshAlsa(false); } } // Disconnect all connected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectAll (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectAll()) refreshAlsa(false); } } // Expand all ALSA MIDI client ports. void qjackctlConnectionsForm::alsaExpandAll (void) { if (m_pAlsaConnect) { m_pAlsaConnect->expandAll(); stabilizeAlsa(true); } } // ALSA MIDI ports disconnecting. void qjackctlConnectionsForm::alsaDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } // Refresh complete form by notifying the parent form. void qjackctlConnectionsForm::alsaRefreshClear (void) { refreshAlsa(true, true); } void qjackctlConnectionsForm::alsaRefresh (void) { refreshAlsa(false); } // A helper stabilization slot. void qjackctlConnectionsForm::alsaStabilize (void) { stabilizeAlsa(true); } // Either rebuild all connections now // or notify main form for doing that later. void qjackctlConnectionsForm::refreshAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect == NULL) return; if (bEnabled) { // m_pAudioConnect->refresh(); stabilizeAudio(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect == NULL) return; if (bEnabled) { // m_pMidiConnect->refresh(); stabilizeMidi(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect == NULL) return; if (bEnabled) { // m_pAlsaConnect->refresh(); stabilizeAlsa(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshAlsaConnections(); } } // Proper enablement of connections command controls. void qjackctlConnectionsForm::stabilizeAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect) m_pAudioConnect->updateContents(!bEnabled || bClear); if (m_pAudioConnect && bEnabled) { m_ui.AudioConnectPushButton->setEnabled( m_pAudioConnect->canConnectSelected()); m_ui.AudioDisconnectPushButton->setEnabled( m_pAudioConnect->canDisconnectSelected()); m_ui.AudioDisconnectAllPushButton->setEnabled( m_pAudioConnect->canDisconnectAll()); m_ui.AudioExpandAllPushButton->setEnabled(true); m_ui.AudioRefreshPushButton->setEnabled(true); } else { m_ui.AudioConnectPushButton->setEnabled(false); m_ui.AudioDisconnectPushButton->setEnabled(false); m_ui.AudioDisconnectAllPushButton->setEnabled(false); m_ui.AudioExpandAllPushButton->setEnabled(false); m_ui.AudioRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect) m_pMidiConnect->updateContents(!bEnabled || bClear); if (m_pMidiConnect && bEnabled) { m_ui.MidiConnectPushButton->setEnabled( m_pMidiConnect->canConnectSelected()); m_ui.MidiDisconnectPushButton->setEnabled( m_pMidiConnect->canDisconnectSelected()); m_ui.MidiDisconnectAllPushButton->setEnabled( m_pMidiConnect->canDisconnectAll()); m_ui.MidiExpandAllPushButton->setEnabled(true); m_ui.MidiRefreshPushButton->setEnabled(true); } else { m_ui.MidiConnectPushButton->setEnabled(false); m_ui.MidiDisconnectPushButton->setEnabled(false); m_ui.MidiDisconnectAllPushButton->setEnabled(false); m_ui.MidiExpandAllPushButton->setEnabled(false); m_ui.MidiRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect) m_pAlsaConnect->updateContents(!bEnabled || bClear); if (m_pAlsaConnect && bEnabled) { m_ui.AlsaConnectPushButton->setEnabled( m_pAlsaConnect->canConnectSelected()); m_ui.AlsaDisconnectPushButton->setEnabled( m_pAlsaConnect->canDisconnectSelected()); m_ui.AlsaDisconnectAllPushButton->setEnabled( m_pAlsaConnect->canDisconnectAll()); m_ui.AlsaExpandAllPushButton->setEnabled(true); m_ui.AlsaRefreshPushButton->setEnabled(true); } else { m_ui.AlsaConnectPushButton->setEnabled(false); m_ui.AlsaDisconnectPushButton->setEnabled(false); m_ui.AlsaDisconnectAllPushButton->setEnabled(false); m_ui.AlsaExpandAllPushButton->setEnabled(false); m_ui.AlsaRefreshPushButton->setEnabled(false); } } // Client/port aliasing feature update. void qjackctlConnectionsForm::updateAliases (void) { // Set alias maps for all listviews... if (m_pSetup && m_pSetup->bAliasesEnabled) { const bool bRenameEnabled = m_pSetup->bAliasesEditing; m_ui.AudioConnectView->OListView()->setAliases( &(m_pSetup->aliasAudioOutputs), bRenameEnabled); m_ui.AudioConnectView->IListView()->setAliases( &(m_pSetup->aliasAudioInputs), bRenameEnabled); m_ui.MidiConnectView->OListView()->setAliases( &(m_pSetup->aliasMidiOutputs), bRenameEnabled); m_ui.MidiConnectView->IListView()->setAliases( &(m_pSetup->aliasMidiInputs), bRenameEnabled); m_ui.AlsaConnectView->OListView()->setAliases( &(m_pSetup->aliasAlsaOutputs), bRenameEnabled); m_ui.AlsaConnectView->IListView()->setAliases( &(m_pSetup->aliasAlsaInputs), bRenameEnabled); } else { m_ui.AudioConnectView->OListView()->setAliases(NULL, false); m_ui.AudioConnectView->IListView()->setAliases(NULL, false); m_ui.MidiConnectView->OListView()->setAliases(NULL, false); m_ui.MidiConnectView->IListView()->setAliases(NULL, false); m_ui.AlsaConnectView->OListView()->setAliases(NULL, false); m_ui.AlsaConnectView->IListView()->setAliases(NULL, false); } } // Keyboard event handler. void qjackctlConnectionsForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlConnectionsForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlConnectionsForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSession.h0000644000000000000000000000012713215206021017060 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlSession.h0000644000175000001440000000622113215206021017707 0ustar00rncbcusers00000000000000// qjackctlSession.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSession_h #define __qjackctlSession_h #include #include #include // Forward decls. class QSettings; //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. class qjackctlSession { public: // Constructor. qjackctlSession(); // Destructor. ~qjackctlSession(); // Container structs. struct ConnectItem { ConnectItem() : connected(false) {} QString client_name; QString port_name; bool connected; }; typedef QList ConnectList; struct PortItem { PortItem() : connected(0) {} ~PortItem() { qDeleteAll(connects); } QString port_name; int port_type; int connected; ConnectList connects; }; typedef QList PortList; struct ClientItem { ClientItem() : connected(0) {} ~ClientItem() { qDeleteAll(ports); } QString client_name; QString client_uuid; QString client_command; int connected; PortList ports; }; typedef QHash ClientList; // Client list accessor (read-only) const ClientList& clients() const; // House-keeper. void clear(); // Critical methods. bool save(const QString& sSessionDir, int iSessionType = 0); bool load(const QString& sSessionDir); // Update (re)connections utility method. bool update(); // Infra-client table. struct InfraClientItem { QString client_name; QString client_command; }; typedef QHash InfraClientList; // Infra-client list accessor (read-write) InfraClientList& infra_clients(); // Load/save all infra-clients from/to configuration file. void loadInfraClients(QSettings& settings); void saveInfraClients(QSettings& settings); // Clear infra-client table. void clearInfraClients(); // Check whether a given JACK client name exists... bool isJackClient(const QString& sClientName) const; protected: // File methods. bool loadFile(const QString& sFilename); bool saveFile(const QString& sFilename); private: // Instance variables. ClientList m_clients; // Infra-clients table. InfraClientList m_infra_clients; }; #endif // __qjackctlSession_h // end of qjackctlSession.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSetupForm.h0000644000000000000000000000012713215206021017361 xustar0029 mtime=1513425937.54076694 29 atime=1513425937.54076694 29 ctime=1513425937.54076694 qjackctl-0.5.0/src/qjackctlSetupForm.h0000644000175000001440000000621713215206021020215 0ustar00rncbcusers00000000000000// qjackctlSetupForm.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetupForm_h #define __qjackctlSetupForm_h #include "ui_qjackctlSetupForm.h" // Forward declarations. class qjackctlSetup; class QButtonGroup; //---------------------------------------------------------------------------- // qjackctlSetupForm -- UI wrapper form. class qjackctlSetupForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSetupForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSetupForm(); void setup(qjackctlSetup *pSetup); void updateCurrentPreset(); bool queryClose(); protected slots: void changeCurrentPreset(const QString&); void saveCurrentPreset(); void deleteCurrentPreset(); void changeAudio(int); void changeDriver(int); void symbolStartupScript(); void symbolPostStartupScript(); void symbolShutdownScript(); void symbolPostShutdownScript(); void browseStartupScript(); void browsePostStartupScript(); void browseShutdownScript(); void browsePostShutdownScript(); void browseActivePatchbayPath(); void browseMessagesLogPath(); void chooseDisplayFont1(); void chooseDisplayFont2(); void toggleDisplayEffect(bool); void chooseMessagesFont(); void chooseConnectionsFont(); void settingsChanged(); void optionsChanged(); void accept(); void reject(); protected: // A combo-box text item setter helper. void setComboBoxCurrentText ( QComboBox *pComboBox, const QString& sText ) const; void changePreset(const QString& sPreset); bool savePreset(const QString& sPreset); bool deletePreset(const QString& sPreset); void resetPresets(); void computeLatency(); void changeDriverAudio( const QString& sDriver, int iAudio ); void changeDriverUpdate( const QString& sDriver, bool bUpdate ); void symbolMenu(QLineEdit * pLineEdit, QToolButton * pToolButton ); void stabilizeForm(); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); private: // The Qt-designer UI struct... Ui::qjackctlSetupForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QButtonGroup *m_pTimeDisplayButtonGroup; int m_iDirtySetup; int m_iDirtySettings; int m_iDirtyOptions; QString m_sPreset; }; #endif // __qjackctlSetupForm_h // end of qjackctlSetupForm.h qjackctl-0.5.0/src/PaxHeaders.4714/src.pri.in0000644000000000000000000000012713215206021015457 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/src.pri.in0000644000175000001440000000074013215206021016306 0ustar00rncbcusers00000000000000# qjackctl.pri # PREFIX = @ac_prefix@ BINDIR = @ac_bindir@ LIBDIR = @ac_libdir@ DATADIR = @ac_datadir@ MANDIR = @ac_mandir@ VERSION = @ac_version@ CONFIG += @ac_debug@ INCLUDEPATH += @ac_incpath@ LIBS += @ac_libs@ # Extra optimization flags QMAKE_CXXFLAGS += @ac_cflags@ QMAKE_LFLAGS += @ac_ldflags@ # D-BUS support QDBUS = @ac_qdbus@ !isEmpty(QDBUS) { QT += dbus } # X11 support unix:!macx { QX11EXTRAS = @ac_qx11extras@ !isEmpty(QX11EXTRAS) { QT += x11extras } } qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayRack.h0000644000000000000000000000012713215206021017771 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlPatchbayRack.h0000644000175000001440000002367313215206021020632 0ustar00rncbcusers00000000000000// qjackctlPatchbayRack.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayRack_h #define __qjackctlPatchbayRack_h #include "qjackctlAbout.h" #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Patchbay socket types. #define QJACKCTL_SOCKETTYPE_DEFAULT -1 #define QJACKCTL_SOCKETTYPE_JACK_AUDIO 0 #define QJACKCTL_SOCKETTYPE_JACK_MIDI 1 #define QJACKCTL_SOCKETTYPE_ALSA_MIDI 2 // Patchbay slot normalization modes. #define QJACKCTL_SLOTMODE_OPEN 0 #define QJACKCTL_SLOTMODE_HALF 1 #define QJACKCTL_SLOTMODE_FULL 2 // Patchbay change signal flags. #define QJACKCTL_CABLE_FAILED 0 #define QJACKCTL_CABLE_CHECKED 1 #define QJACKCTL_CABLE_CONNECTED 2 #define QJACKCTL_CABLE_DISCONNECTED 3 // Struct name says it all. struct qjackctlAlsaMidiPort { QString sClientName; QString sPortName; int iAlsaClient; int iAlsaPort; }; // Patchbay socket definition. class qjackctlPatchbaySocket { public: // Constructor. qjackctlPatchbaySocket(const QString& sSocketName, const QString& sClientName, int iSocketType); // Default destructor. ~qjackctlPatchbaySocket(); // Socket property accessors. const QString& name() const; const QString& clientName() const; int type() const; bool isExclusive() const; const QString& forward() const; // Socket property methods. void setName(const QString& sSocketName); void setClientName(const QString& sClientName); void setType(int iSocketType); void setExclusive(bool bExclusive); void setForward(const QString& sSocketForward); // Plug list primitive methods. void addPlug(const QString& sPlugName); void removePlug(const QString& sPlugName); // Plug list accessor. QStringList& pluglist(); // Simple socket type methods. static int typeFromText(const QString& sSocketType); static QString textFromType(int iSocketType); private: // Properties. QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Patchbay socket plug list. QStringList m_pluglist; }; // Patchbay socket slot definition. class qjackctlPatchbaySlot { public: // Constructor. qjackctlPatchbaySlot(const QString& sSlotName, int iSlotMode = QJACKCTL_SLOTMODE_OPEN); // Default destructor. ~qjackctlPatchbaySlot(); // Slot property accessors. const QString& name() const; int mode() const; // Slot property methods. void setName(const QString& sSlotName); void setMode(int iSlotMode); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Slot properties. QString m_sSlotName; int m_iSlotMode; // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay cable connection definition. class qjackctlPatchbayCable { public: // Constructor. qjackctlPatchbayCable(qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // Default destructor. ~qjackctlPatchbayCable(); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay rack profile definition. class qjackctlPatchbayRack : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbayRack(); // Default destructor. ~qjackctlPatchbayRack(); // Common socket list primitive methods. void addSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); void removeSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); // Slot list primitive methods. void addSlot(qjackctlPatchbaySlot *pSlot); void removeSlot(qjackctlPatchbaySlot *pSlot); // Cable list primitive methods. void addCable(qjackctlPatchbayCable *pCable); void removeCable(qjackctlPatchbayCable *pCable); // Common socket finder. qjackctlPatchbaySocket *findSocket( QList& socketlist, const QString& sSocketName, int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT); // Slot finders. qjackctlPatchbaySlot *findSlot(const QString& sSlotName); // Cable finder. qjackctlPatchbayCable *findCable( const QString& sOutputSocket, const QString& sInputSocket); qjackctlPatchbayCable *findCable(qjackctlPatchbayCable *pCablePtr); // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType); // Patchbay cleaner. void clear(); // Patchbay rack socket list accessors. QList& osocketlist(); QList& isocketlist(); // Patchbay rack slots list accessor. QList& slotlist(); // Patchbay cable connections list accessor. QList& cablelist(); // Overloaded cable connection persistence scan cycle methods. void connectJackScan(jack_client_t *pJackClient); void connectAlsaScan(snd_seq_t *pAlsaSeq); // Patchbay snapshot methods. void connectJackSnapshot(jack_client_t *pJackClient); void connectAlsaSnapshot(snd_seq_t *pAlsaSeq); // Patchbay reset/disconnect-all methods. void disconnectAllJackPorts(jack_client_t *pJackClient); void disconnectAllAlsaPorts(snd_seq_t *pAlsaSeq); signals: // Cable connection change signal. void cableConnected(const QString& sOutputPort, const QString& sInputPort, unsigned int uiCableFlags); private: // Audio connection scan related private methods. const char *findJackPort(const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n = 0); void connectJackPorts( const char *pszOutputPort, const char *pszInputPort); void disconnectJackPorts( const char *pszOutputPort, const char *pszInputPort); void checkJackPorts( const char *pszOutputPort, const char *pszInputPort); void connectJackSocketPorts( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort); void connectJackCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // MIDI connection scan related private methods. void loadAlsaPorts(QList& midiports, bool bReadable); qjackctlAlsaMidiPort *findAlsaPort(QList& midiports, const QString& sClientName, const QString& sPortName, int n); QString getAlsaPortName(qjackctlAlsaMidiPort *pAlsaPort); void setAlsaPort(qjackctlAlsaMidiPort *pAlsaPort, int iAlsaClient, int iAlsaPort); void connectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void disconnectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void checkAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void connectAlsaSocketPorts( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort); void connectAlsaCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); void loadAlsaConnections(QList& midiports, qjackctlAlsaMidiPort *pAlsaPort, bool bReadable); // Audio socket/ports forwarding executive methods. void connectJackForwardPorts( const char *pszPort, const char *pszPortForward); void connectJackForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // MIDI socket/ports forwarding executive methods. void connectAlsaForwardPorts( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward); void connectAlsaForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // Common socket forwarding scan method. void connectForwardScan(int iSocketType); // JACK snapshot executive. void connectJackSnapshotEx(int iSocketType); // JACK reset/disconnect-all executive. void disconnectAllJackPortsEx(int iSocketType); // Patchbay sockets lists. QList m_osocketlist; QList m_isocketlist; // Patchbay rack slots list. QList m_slotlist; // Patchbay cable connections list. QList m_cablelist; // Audio connection persistence cache variables. jack_client_t *m_pJackClient; const char **m_ppszOAudioPorts; const char **m_ppszIAudioPorts; const char **m_ppszOMidiPorts; const char **m_ppszIMidiPorts; // MIDI connection persistence cache variables. snd_seq_t *m_pAlsaSeq; QList m_omidiports; QList m_imidiports; }; #endif // __qjackctlPatchbayRack_h // qjackctlPatchbayRack.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayForm.ui0000644000000000000000000000012713215206021020202 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlPatchbayForm.ui0000644000175000001440000004153313215206021021036 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlPatchbayForm 0 0 520 320 1 1 0 0 Patchbay - JACK Audio Connection Kit :/images/patchbay1.png 4 4 Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 7 7 0 0 Qt::TabFocus Move currently selected output socket down one position Down :/images/down1.png Create a new output socket Add... :/images/add1.png Qt::Vertical QSizePolicy::Expanding 8 42 Edit currently selected input socket properties Edit... :/images/edit1.png Qt::Vertical QSizePolicy::Expanding 8 42 Move currently selected output socket up one position Up :/images/up1.png Remove currently selected output socket Remove :/images/remove1.png Duplicate (copy) currently selected output socket Copy... :/images/copy1.png Move currently selected output socket down one position Down :/images/down1.png Remove currently selected input socket Remove :/images/remove1.png Duplicate (copy) currently selected input socket Copy... :/images/copy1.png Create a new input socket Add... :/images/add1.png Edit currently selected output socket properties Edit... :/images/edit1.png Move currently selected output socket up one position Up :/images/up1.png Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 Connect currently selected sockets &Connect :/images/connect1.png Disconnect currently selected sockets &Disconnect :/images/disconnect1.png Disconnect all currently connected sockets Disconnect &All :/images/disconnect1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all items E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current patchbay view &Refresh :/images/refresh1.png true 4 4 Create a new patchbay profile &New :/images/new1.png false Load patchbay profile &Load... :/images/open1.png false Save current patchbay profile &Save... :/images/save1.png false 7 5 0 0 75 true Current (recent) patchbay profile(s) Toggle activation of current patchbay profile Acti&vate :/images/apply1.png true false qjackctlPatchbayView QWidget

qjackctlPatchbay.h
NewPatchbayPushButton LoadPatchbayPushButton SavePatchbayPushButton PatchbayComboBox ActivatePatchbayPushButton OSocketAddPushButton OSocketEditPushButton OSocketCopyPushButton OSocketRemovePushButton OSocketMoveUpPushButton OSocketMoveDownPushButton PatchbayView ISocketAddPushButton ISocketEditPushButton ISocketCopyPushButton ISocketRemovePushButton ISocketMoveUpPushButton ISocketMoveDownPushButton ConnectPushButton DisconnectPushButton DisconnectAllPushButton ExpandAllPushButton RefreshPushButton qjackctl-0.5.0/src/PaxHeaders.4714/appdata0000644000000000000000000000013213215206021015100 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/appdata/0000755000175000001440000000000013215206021016007 5ustar00rncbcusers00000000000000qjackctl-0.5.0/src/appdata/PaxHeaders.4714/qjackctl.appdata.xml0000644000000000000000000000013213215206021021104 xustar0030 mtime=1513425937.522766939 30 atime=1513425937.522766939 30 ctime=1513425937.522766939 qjackctl-0.5.0/src/appdata/qjackctl.appdata.xml0000644000175000001440000000451613215206021021744 0ustar00rncbcusers00000000000000 qjackctl.desktop GPL-2.0+ GPL-2.0+ QjackCtl JACK Audio Connection Kit Qt GUI Interface Interface graphique Qt pour ke kit de connexion audio JACK

JACK Audio Connection Kit - Qt GUI Interface: A simple Qt application to control the JACK server. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features.

Interface graphique Qt pour le kit de connexion audio Jack : une application Qt simple pour contrôler le server Jack. Écrite en c++ autour du kit de développement Qt pour X11, presque exclusivement en utilisant Qt Designer. Fourni une interface graphique simple de dialogue pour plusieurs paramètres du serveur JACK qui sont sauvegardés proprement entre les sessions, et un moyen de contrôle du status du serveur audio. Avec le temps, cette interface primordiale est devenue plus riche en incluant une baie de brassage améliorée et des fonctionnalités de contrôle de connexion.

http://qjackctl.sourceforge.net/qjackctlMainForm1.png The main window showing the application in action La fenêtre principale montrant l'application en action Audio MIDI ALSA JACK Qt http://qjackctl.sourceforge.net rncbc@rncbc.org rncbc.org HiDpiIcon ModernToolkit
qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSystemTray.h0000644000000000000000000000012713215206021017561 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlSystemTray.h0000644000175000001440000000447513215206021020421 0ustar00rncbcusers00000000000000// qjackctlSystemTray.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSystemTray_h #define __qjackctlSystemTray_h #include #include #include //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. class qjackctlSystemTray : public QSystemTrayIcon { Q_OBJECT public: // Constructor. qjackctlSystemTray(QWidget *pParent = 0); // Default destructor. ~qjackctlSystemTray(); // Background mask methods. void setBackground(const QColor& background); const QColor& background() const; // Set system tray icon overlay. void setPixmapOverlay(const QPixmap& pmOverlay); const QPixmap& pixmapOverlay() const; // System tray icon/pixmaps update method. void updatePixmap(); // Redirect to hide. void close(); signals: // Clicked signal. void clicked(); // Toggle Start/Stop server. void doubleClicked(); // Xrun reset signal. void middleClicked(); // Context menu signal. void contextMenuRequested(const QPoint& pos); protected slots: // Handle systeam tray activity. void activated(QSystemTrayIcon::ActivationReason); // Context menu slot. void contextMenuRequested(); private: // Instance pixmap and background color. QIcon m_icon; QMenu m_menu; QPixmap m_pixmap; QPixmap m_pixmapOverlay; QColor m_background; }; #endif // __qjackctlSystemTray_h // end of qjackctlSystemTray.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnect.cpp0000644000000000000000000000012713215206021017361 xustar0029 mtime=1513425937.53176694 29 atime=1513425937.53176694 29 ctime=1513425937.53176694 qjackctl-0.5.0/src/qjackctlConnect.cpp0000644000175000001440000014273713215206021020225 0ustar00rncbcusers00000000000000// qjackctlConnect.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlConnect.h" #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #include #endif //---------------------------------------------------------------------- // class qjackctlPortItem -- Port list item. // // Constructor. qjackctlPortItem::qjackctlPortItem ( qjackctlClientItem *pClient ) : QTreeWidgetItem(pClient, QJACKCTL_PORTITEM) { m_pClient = pClient; // m_sPortName = sPortName; m_iPortMark = 0; m_bHilite = false; m_pClient->ports().append(this); } // Default destructor. qjackctlPortItem::~qjackctlPortItem (void) { const int iPort = m_pClient->ports().indexOf(this); if (iPort >= 0) m_pClient->ports().removeAt(iPort); QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); } // Instance accessors. void qjackctlPortItem::setPortName ( const QString& sPortName ) { m_sPortName = sPortName; updatePortName(); } const QString& qjackctlPortItem::clientName (void) const { return m_pClient->clientName(); } const QString& qjackctlPortItem::portName (void) const { return m_sPortName; } // Port name alias accessors. void qjackctlPortItem::setPortNameAlias ( const QString& sPortNameAlias ) { // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { const QString& sClientName = m_pClient->clientName(); pAliases->setPortAlias(sClientName, m_sPortName, sPortNameAlias); pClientListView->setDirty(true); } } QString qjackctlPortItem::portNameAlias ( bool *pbRenameEnabled ) const { QString sPortNameAlias = m_sPortName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { const QString& sClientName = m_pClient->clientName(); sPortNameAlias = pAliases->portAlias(sClientName, m_sPortName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sPortNameAlias; } // Proto-pretty/alias display name method. void qjackctlPortItem::updatePortName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sPortNameEx = portNameAlias(&bRenameEnabled); setPortText(sPortNameEx, bRenameEnabled); } // Tooltip text builder. QString qjackctlPortItem::tooltip (void) const { return portName(); } // Port display name accessors. void qjackctlPortItem::setPortText ( const QString& sPortText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sPortText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlPortItem::portText (void) const { return QTreeWidgetItem::text(0); } // Complete client:port name helper. QString qjackctlPortItem::clientPortName (void) const { return m_pClient->clientName() + ':' + m_sPortName; } // Connect client item accessor. qjackctlClientItem *qjackctlPortItem::client (void) const { return m_pClient; } // Client:port set housekeeping marker. void qjackctlPortItem::markPort ( int iMark ) { setHilite(false); m_iPortMark = iMark; if (iMark > 0) m_connects.clear(); } void qjackctlPortItem::markClientPort ( int iMark ) { markPort(iMark); m_pClient->markClient(iMark); } int qjackctlPortItem::portMark (void) const { return m_iPortMark; } // Connected port list primitives. void qjackctlPortItem::addConnect ( qjackctlPortItem *pPort ) { m_connects.append(pPort); } void qjackctlPortItem::removeConnect ( qjackctlPortItem *pPort ) { pPort->setHilite(false); const int iPort = m_connects.indexOf(pPort); if (iPort >= 0) m_connects.removeAt(iPort); } // Connected port finder. qjackctlPortItem *qjackctlPortItem::findConnect ( const QString& sClientPortName ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sClientPortName == pPort->clientPortName()) return pPort; } return NULL; } qjackctlPortItem *qjackctlPortItem::findConnectPtr ( qjackctlPortItem *pPortPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPortPtr == pPort) return pPort; } return NULL; } // Connection cache list accessor. const QList& qjackctlPortItem::connects (void) const { return m_connects; } // Connectiopn highlight methods. bool qjackctlPortItem::isHilite (void) const { return m_bHilite; } void qjackctlPortItem::setHilite ( bool bHilite ) { // Update the port highlightning if changed... if ((m_bHilite && !bHilite) || (!m_bHilite && bHilite)) { m_bHilite = bHilite; // Propagate this to the parent... m_pClient->setHilite(bHilite); } // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == NULL) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setTextColor(0, m_bHilite ? (pal.base().color().value() < 0x7f ? Qt::cyan : Qt::blue) : pal.text().color()); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlPortItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // class qjackctlClientItem -- Jack client list item. // // Constructor. qjackctlClientItem::qjackctlClientItem ( qjackctlClientList *pClientList ) : QTreeWidgetItem(pClientList->listView(), QJACKCTL_CLIENTITEM) { m_pClientList = pClientList; // m_sClientName = sClientName; m_iClientMark = 0; m_iHilite = 0; m_pClientList->clients().append(this); } // Default destructor. qjackctlClientItem::~qjackctlClientItem (void) { qDeleteAll(m_ports); m_ports.clear(); const int iClient = m_pClientList->clients().indexOf(this); if (iClient >= 0) m_pClientList->clients().removeAt(iClient); } // Port finder. qjackctlPortItem *qjackctlClientItem::findPort (const QString& sPortName) { QListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sPortName == pPort->portName()) return pPort; } return NULL; } // Client list accessor. qjackctlClientList *qjackctlClientItem::clientList (void) const { return m_pClientList; } // Port list accessor. QList& qjackctlClientItem::ports (void) { return m_ports; } // Instance accessors. void qjackctlClientItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; updateClientName(); } const QString& qjackctlClientItem::clientName (void) const { return m_sClientName; } // Client name alias accessors. void qjackctlClientItem::setClientNameAlias ( const QString& sClientNameAlias ) { qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { pAliases->setClientAlias(m_sClientName, sClientNameAlias); pClientListView->setDirty(true); } } QString qjackctlClientItem::clientNameAlias ( bool *pbRenameEnabled ) const { QString sClientNameAlias = m_sClientName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { sClientNameAlias = pAliases->clientAlias(m_sClientName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sClientNameAlias; } // Proto-pretty/alias display name method. void qjackctlClientItem::updateClientName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sClientNameEx = clientNameAlias(&bRenameEnabled); setClientText(sClientNameEx, bRenameEnabled); } // Client display name accessors. void qjackctlClientItem::setClientText ( const QString& sClientText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sClientText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlClientItem::clientText (void) const { return QTreeWidgetItem::text(0); } // Readable flag client accessor. bool qjackctlClientItem::isReadable (void) const { return m_pClientList->isReadable(); } // Client:port set housekeeping marker. void qjackctlClientItem::markClient ( int iMark ) { setHilite(false); m_iClientMark = iMark; } void qjackctlClientItem::markClientPorts ( int iMark ) { markClient(iMark); QListIterator iter(m_ports); while (iter.hasNext()) (iter.next())->markPort(iMark); } int qjackctlClientItem::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPort->portMark() == iMark) { iter.remove(); delete pPort; iDirtyCount++; } } return iDirtyCount; } int qjackctlClientItem::clientMark (void) const { return m_iClientMark; } // Connectiopn highlight methods. bool qjackctlClientItem::isHilite (void) const { return (m_iHilite > 0); } void qjackctlClientItem::setHilite ( bool bHilite ) { if (bHilite) m_iHilite++; else if (m_iHilite > 0) m_iHilite--; // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == NULL) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setTextColor(0, m_iHilite > 0 ? (pal.base().color().value() < 0x7f ? Qt::darkCyan : Qt::darkBlue) : pal.text().color()); } // Socket item openness status. void qjackctlClientItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlClientItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlClientItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // qjackctlClientList -- Client list. // // Constructor. qjackctlClientList::qjackctlClientList ( qjackctlClientListView *pListView, bool bReadable ) { m_pListView = pListView; m_bReadable = bReadable; m_pHiliteItem = 0; } // Default destructor. qjackctlClientList::~qjackctlClientList (void) { clear(); } // Do proper contents cleanup. void qjackctlClientList::clear (void) { qDeleteAll(m_clients); m_clients.clear(); if (m_pListView) m_pListView->clear(); } // Client finder. qjackctlClientItem *qjackctlClientList::findClient ( const QString& sClientName ) { QListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (sClientName == pClient->clientName()) return pClient; } return NULL; } // Client:port finder. qjackctlPortItem *qjackctlClientList::findClientPort ( const QString& sClientPort ) { qjackctlPortItem *pPort = 0; int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { qjackctlClientItem *pClient = findClient(sClientPort.left(iColon)); if (pClient) { pPort = pClient->findPort( sClientPort.right(sClientPort.length() - iColon - 1)); } } return pPort; } // Client list accessor. QList& qjackctlClientList::clients (void) { return m_clients; } // List view accessor. qjackctlClientListView *qjackctlClientList::listView (void) const { return m_pListView; } // Readable flag client accessor. bool qjackctlClientList::isReadable (void) const { return m_bReadable; } // Client:port set housekeeping marker. void qjackctlClientList::markClientPorts ( int iMark ) { m_pHiliteItem = 0; QListIterator iter(m_clients); while (iter.hasNext()) (iter.next())->markClientPorts(iMark); } int qjackctlClientList::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (pClient->clientMark() == iMark) { iter.remove(); delete pClient; iDirtyCount++; } else { iDirtyCount += pClient->cleanClientPorts(iMark); } } return iDirtyCount; } // Client:port hilite update stabilization. void qjackctlClientList::hiliteClientPorts (void) { qjackctlClientItem *pClient; qjackctlPortItem *pPort; QTreeWidgetItem *pItem = m_pListView->currentItem(); // Dehilite the previous selected items. if (m_pHiliteItem && pItem != m_pHiliteItem) { if (m_pHiliteItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (m_pHiliteItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } else { pPort = static_cast (m_pHiliteItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } // Hilite the now current selected items. if (pItem) { if (pItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (pItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } else { pPort = static_cast (pItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } // Do remember this one, ever. m_pHiliteItem = pItem; } // Natural decimal sorting comparator. bool qjackctlClientList::lessThan ( const QTreeWidgetItem& i1, const QTreeWidgetItem& i2 ) { const QString& s1 = i1.text(0); const QString& s2 = i2.text(0); const int cch1 = s1.length(); const int cch2 = s2.length(); int ich1, ich2; for (ich1 = ich2 = 0; ich1 < cch1 && ich2 < cch2; ich1++, ich2++) { // Skip (white)spaces... while (s1.at(ich1).isSpace()) ich1++; while (s2.at(ich2).isSpace()) ich2++; // Normalize (to uppercase) the next characters... QChar ch1 = s1.at(ich1).toUpper(); QChar ch2 = s2.at(ich2).toUpper(); if (ch1.isDigit() && ch2.isDigit()) { // Find the whole length numbers... const int iDigits1 = ich1++; while (ich1 < cch1 && s1.at(ich1).isDigit()) ich1++; const int iDigits2 = ich2++; while (ich2 < cch2 && s2.at(ich2).isDigit()) ich2++; // Compare as natural decimal-numbers... const int n1 = s1.mid(iDigits1, ich1 - iDigits1).toInt(); const int n2 = s2.mid(iDigits2, ich2 - iDigits2).toInt(); if (n1 != n2) return (n1 < n2); // Never go out of bounds... if (ich1 >= cch1 || ich1 >= cch2) break; // Go on with this next char... ch1 = s1.at(ich1).toUpper(); ch2 = s2.at(ich2).toUpper(); } // Compare this char... if (ch1 != ch2) return (ch1 < ch2); } // Probable exact match. return false; } // Do proper contents refresh/update. void qjackctlClientList::refresh (void) { QHeaderView *pHeader = m_pListView->header(); m_pListView->sortItems( pHeader->sortIndicatorSection(), pHeader->sortIndicatorOrder()); } //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. // Constructor. qjackctlClientListView::qjackctlClientListView ( qjackctlConnectView *pConnectView, bool bReadable ) : QTreeWidget(pConnectView) { m_pConnectView = pConnectView; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = NULL; m_pDragItem = NULL; m_pAliases = NULL; m_bRenameEnabled = false; QHeaderView *pHeader = QTreeWidget::header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(true); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); QString sText; if (bReadable) sText = tr("Readable Clients / Output Ports"); else sText = tr("Writable Clients / Input Ports"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::sortItems(0, Qt::AscendingOrder); QTreeWidget::setToolTip(sText); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QObject::connect(QTreeWidget::itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(renamedSlot())); setAutoOpenTimeout(800); } // Default destructor. qjackctlClientListView::~qjackctlClientListView (void) { setAutoOpenTimeout(0); } // Binding indirect accessor. qjackctlConnect *qjackctlClientListView::binding() const { return m_pConnectView->binding(); } // Auto-open timeout method. void qjackctlClientListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = NULL; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlClientListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Aliasing support methods. void qjackctlClientListView::setAliases ( qjackctlConnectAlias *pAliases, bool bRenameEnabled ) { m_pAliases = pAliases; m_bRenameEnabled = bRenameEnabled; // For each client item, if any. const int iItemCount = QTreeWidget::topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = QTreeWidget::topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem == NULL) continue; pClientItem->updateClientName(); // For each port item... const int iChildCount = pClientItem->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChildItem = pClientItem->child(iChild); if (pChildItem->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pPortItem = static_cast (pChildItem); if (pPortItem == NULL) continue; pPortItem->updatePortName(); } } } qjackctlConnectAlias *qjackctlClientListView::aliases (void) const { return m_pAliases; } bool qjackctlClientListView::isRenameEnabled (void) const { return m_bRenameEnabled; } // In-place aliasing slot. void qjackctlClientListView::startRenameSlot (void) { QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem) QTreeWidget::editItem(pItem, 0); } // In-place aliasing slot. void qjackctlClientListView::renamedSlot (void) { if (m_pAliases == NULL) return; QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem == NULL) return; const QString& sText = pItem->text(0); if (pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); pClientItem->setClientNameAlias(sText); pClientItem->updateClientName(true); } else { qjackctlPortItem *pPortItem = static_cast (pItem); pPortItem->setPortNameAlias(sText); pPortItem->updatePortName(true); } // m_pConnectView->setDirty(true); } // Auto-open timer slot. void qjackctlClientListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (m_pDropItem); if (pClientItem && !pClientItem->isOpen()) pClientItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlClientListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem) { QToolTip::showText(pHelpEvent->globalPos(), pClientItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pPortItem = static_cast (pItem); if (pPortItem) { QToolTip::showText(pHelpEvent->globalPos(), pPortItem->tooltip(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlClientListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlConnect *pConnect = m_pConnectView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pConnect == NULL || !pConnect->canConnectSelected()) pItem = NULL; } } else { m_pDropItem = NULL; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlClientListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && dragDropItem(pDragEnterEvent->pos())) { pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlClientListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && dragDropItem(pDragMoveEvent->pos())) { pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlClientListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlClientListView::dropEvent( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && dragDropItem(pDropEvent->pos())) { const QString sText = pDropEvent->mimeData()->text(); qjackctlConnect *pConnect = m_pConnectView->binding(); if (!sText.isEmpty() && pConnect) pConnect->connectSelected(); } dragLeaveEvent(0); } // Handle mouse events for drag-and-drop stuff. void qjackctlClientListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlClientListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->start(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = NULL; } } // Context menu request event handler. void qjackctlClientListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pConnect->canDisconnectAll()); if (m_bRenameEnabled) { menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Re&name"), this, SLOT(startRenameSlot()), tr("Alt+N", "Rename")); QTreeWidgetItem *pItem = QTreeWidget::currentItem(); pAction->setEnabled(pItem && (pItem->flags() & Qt::ItemIsEditable)); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pContextMenuEvent->globalPos()); } // Dirty flag methods. void qjackctlClientListView::setDirty ( bool bDirty ) { m_pConnectView->setDirty(bDirty); } bool qjackctlClientListView::isDirty (void) const { return m_pConnectView->isDirty(); } //---------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. // // Constructor. qjackctlConnectorView::qjackctlConnectorView ( qjackctlConnectView *pConnectView ) : QWidget(pConnectView) { m_pConnectView = pConnectView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlConnectorView::~qjackctlConnectorView (void) { } // Legal client/port item position helper. int qjackctlConnectorView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlClientItem *pClientItem = NULL; if (pParent && pParent->type() == QJACKCTL_CLIENTITEM) pClientItem = static_cast (pParent); if (pClientItem && !pClientItem->isOpen()) { rect = pList->visualItemRect(pClientItem); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible port connection relation lines void qjackctlConnectorView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen ) { // Set apropriate pen... pPainter->setPen(pen); // Account for list view headers. y1 += h1; y2 += h2; // Invisible output ports don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // How do we'll draw it? if (m_pConnectView->isBezierLines()) { // Setup control points QPolygon spline(4); const int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pen); } else pPainter->drawLine(x1 + 4, y1, x2 - 4, y2); // Invisible input ports don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw visible port connection relation arrows. void qjackctlConnectorView::paintEvent ( QPaintEvent * ) { if (m_pConnectView == NULL) return; if (m_pConnectView->OListView() == NULL || m_pConnectView->IListView() == NULL) return; qjackctlClientListView *pOListView = m_pConnectView->OListView(); qjackctlClientListView *pIListView = m_pConnectView->IListView(); const int yc = QWidget::pos().y(); const int yo = pOListView->pos().y(); const int yi = pIListView->pos().y(); QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int i, rgb[3] = { 0x33, 0x66, 0x99 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (i = 0; i < 3; ++i) rgb[i] += 0x33; // Initialize color changer. i = 0; // Almost constants. x1 = 0; x2 = QWidget::width(); h1 = (pOListView->header())->sizeHint().height(); h2 = (pIListView->header())->sizeHint().height(); // For each output client item... const int iItemCount = pOListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pOListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pOClient = static_cast (pItem); if (pOClient == NULL) continue; // Set new connector color. ++i; QPen pen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // For each port item const int iChildCount = pOClient->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChild = pOClient->child(iChild); if (pChild->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pOPort = static_cast (pChild); if (pOPort) { // Set proposed line width... const int w1 = (pOPort->isHilite() ? 2 : 1); // Get starting connector arrow coordinates. y1 = itemY(pOPort) + (yo - yc); // Get port connections... QListIterator iter(pOPort->connects()); while (iter.hasNext()) { qjackctlPortItem *pIPort = iter.next(); // Obviously, should be a connection // from pOPort to pIPort items: y2 = itemY(pIPort) + (yi - yc); pen.setWidth(pIPort->isHilite() ? 2 : w1); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2, pen); } } } } } // Context menu request event handler. void qjackctlConnectorView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pConnect->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pContextMenuEvent->globalPos()); } // Widget event slots... void qjackctlConnectorView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlConnectView -- Integrated connections view widget. // Constructor. qjackctlConnectView::qjackctlConnectView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlClientListView(this, true); m_pConnectorView = new qjackctlConnectorView(this); m_pIListView = new qjackctlClientListView(this, false); m_pConnect = NULL; m_bBezierLines = false; m_iIconSize = 0; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlConnectView::~qjackctlConnectView (void) { } // Connect binding methods. void qjackctlConnectView::setBinding ( qjackctlConnect *pConnect ) { m_pConnect = pConnect; } qjackctlConnect *qjackctlConnectView::binding (void) const { return m_pConnect; } // Connect client list accessors. qjackctlClientList *qjackctlConnectView::OClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return NULL; } qjackctlClientList *qjackctlConnectView::IClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return NULL; } // Connector line style accessors. void qjackctlConnectView::setBezierLines ( bool bBezierLines ) { m_bBezierLines = bBezierLines; } bool qjackctlConnectView::isBezierLines (void) const { return m_bBezierLines; } // Common icon size methods. void qjackctlConnectView::setIconSize ( int iIconSize ) { // Update only if changed. if (iIconSize == m_iIconSize) return; // Go for it... m_iIconSize = iIconSize; // Update item sizes properly... const int px = (16 << m_iIconSize); const QSize iconSize(px, px); m_pOListView->setIconSize(iconSize); m_pIListView->setIconSize(iconSize); // Call binding descendant implementation, // and do a complete content reset... if (m_pConnect) m_pConnect->updateContents(true); } int qjackctlConnectView::iconSize (void) const { return m_iIconSize; } // Dirty flag methods. void qjackctlConnectView::setDirty ( bool bDirty ) { m_bDirty = bDirty; if (bDirty) emit contentsChanged(); } bool qjackctlConnectView::isDirty (void) const { return m_bDirty; } //---------------------------------------------------------------------- // qjackctlConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlConnect::qjackctlConnect ( qjackctlConnectView *pConnectView ) { m_pConnectView = pConnectView; m_pOClientList = NULL; m_pIClientList = NULL; m_iMutex = 0; m_pConnectView->setBinding(this); } // Default destructor. qjackctlConnect::~qjackctlConnect (void) { // Force end of works here. m_iMutex++; m_pConnectView->setBinding(NULL); if (m_pOClientList) delete m_pOClientList; if (m_pIClientList) delete m_pIClientList; m_pOClientList = NULL; m_pIClientList = NULL; m_pConnectView->connectorView()->update(); } // These must be accessed by the descendant constructor. qjackctlConnectView *qjackctlConnect::connectView (void) const { return m_pConnectView; } void qjackctlConnect::setOClientList ( qjackctlClientList *pOClientList ) { m_pOClientList = pOClientList; } void qjackctlConnect::setIClientList ( qjackctlClientList *pIClientList ) { m_pIClientList = pIClientList; } // Connection primitive. bool qjackctlConnect::connectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) != NULL) return false; emit connecting(pOPort, pIPort); if (!connectPorts(pOPort, pIPort)) return false; pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); return true; } // Disconnection primitive. bool qjackctlConnect::disconnectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) == NULL) return false; emit disconnecting(pOPort, pIPort); if (!disconnectPorts(pOPort, pIPort)) return false; pOPort->removeConnect(pIPort); pIPort->removeConnect(pOPort); return true; } // Test if selected ports are connectable. bool qjackctlConnect::canConnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canConnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canConnectSelectedEx (void) { // Take this opportunity to highlight any current selections. m_pOClientList->hiliteClientPorts(); m_pIClientList->hiliteClientPorts(); m_pConnectView->connectorView()->update(); // Now with our predicate work... QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == NULL) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) == NULL) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == NULL) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) == NULL); } } return false; } // Connect current selected ports. bool qjackctlConnect::connectSelected (void) { bool bResult = false; if (startMutex()) { bResult = connectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::connectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); } } return true; } // Test if selected ports are disconnectable. bool qjackctlConnect::canDisconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (!pOItem) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (!pIItem) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != NULL) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) != NULL) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != NULL) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) != NULL); } } return false; } // Disconnect current selected ports. bool qjackctlConnect::disconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = disconnectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); } } return true; } // Test if any port is disconnectable. bool qjackctlConnect::canDisconnectAll (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectAllEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); if (pOPort->connects().count() > 0) return true; } } return false; } // Disconnect all ports. bool qjackctlConnect::disconnectAll (void) { if (QMessageBox::warning(m_pConnectView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This will suspend sound processing\n" "from all client applications.\n\nAre you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } bool bResult = false; if (startMutex()) { bResult = disconnectAllEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); QListIterator iport(pOPort->connects()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } } return true; } // Expand all client ports. void qjackctlConnect::expandAll (void) { (m_pOClientList->listView())->expandAll(); (m_pIClientList->listView())->expandAll(); (m_pConnectView->connectorView())->update(); } // Complete/incremental contents rebuilder; check dirty status if incremental. void qjackctlConnect::updateContents ( bool bClear ) { int iDirtyCount = 0; if (startMutex()) { // Do we do a complete rebuild? if (bClear) { m_pOClientList->clear(); m_pIClientList->clear(); updateIconPixmaps(); } // Add (newer) client:ports and respective connections... if (m_pOClientList->updateClientPorts() > 0) { m_pOClientList->refresh(); iDirtyCount++; } if (m_pIClientList->updateClientPorts() > 0) { m_pIClientList->refresh(); iDirtyCount++; } updateConnections(); endMutex(); } (m_pConnectView->connectorView())->update(); if (!bClear && iDirtyCount > 0) emit connectChanged(); } // Incremental contents rebuilder; check dirty status. void qjackctlConnect::refresh (void) { updateContents(false); } // Dunno. But this may avoid some conflicts. bool qjackctlConnect::startMutex (void) { const bool bMutex = (m_iMutex == 0); if (bMutex) m_iMutex++; return bMutex; } void qjackctlConnect::endMutex (void) { if (m_iMutex > 0) m_iMutex--; } // Connect client list accessors. qjackctlClientList *qjackctlConnect::OClientList (void) const { return m_pOClientList; } qjackctlClientList *qjackctlConnect::IClientList (void) const { return m_pIClientList; } // Common pixmap factory-method. QPixmap *qjackctlConnect::createIconPixmap ( const QString& sIconName ) { QString sName = sIconName; const int iSize = m_pConnectView->iconSize() * 32; if (iSize > 0) sName += QString("_%1x%2").arg(iSize).arg(iSize); return new QPixmap(":/images/" + sName + ".png"); } // end of qjackctlConnect.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSessionFile.txt0000644000000000000000000000012713215206021020250 xustar0029 mtime=1513425937.53876694 29 atime=1513425937.53776694 29 ctime=1513425937.53876694 qjackctl-0.5.0/src/qjackctlSessionFile.txt0000644000175000001440000000123013215206021021072 0ustar00rncbcusers00000000000000qjackctlSession format specification ------------------------------------ client-command . . . . . . . . . session-name := string-literal client-name := string-literal client-uuid := string-literal client-command := string-literal port-name := string-literal port-type := "in" | "out" qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSetup.cpp0000644000000000000000000000012713215206021017070 xustar0029 mtime=1513425937.53976694 29 atime=1513425937.53976694 29 ctime=1513425937.53976694 qjackctl-0.5.0/src/qjackctlSetup.cpp0000644000175000001440000007036013215206021017724 0ustar00rncbcusers00000000000000// qjackctlSetup.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #ifdef CONFIG_JACK_VERSION #include #endif #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) #define DEFAULT_DRIVER "portaudio" #else #define DEFAULT_DRIVER "alsa" #endif // Constructor. qjackctlSetup::qjackctlSetup (void) : m_settings(QJACKCTL_DOMAIN, QJACKCTL_TITLE) { bStartJackCmd = false; sDefPresetName = QObject::tr("(default)"); loadSetup(); } // Destructor; qjackctlSetup::~qjackctlSetup (void) { // saveSetup(); } // Settings accessor. QSettings& qjackctlSetup::settings (void) { return m_settings; } // Explicit load method. void qjackctlSetup::loadSetup (void) { m_settings.beginGroup("/Presets"); sDefPreset = m_settings.value("/DefPreset", sDefPresetName).toString(); QString sPrefix = "/Preset%1"; int i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; presets.append(sItem); } m_settings.endGroup(); m_settings.beginGroup("/Options"); bSingleton = m_settings.value("/Singleton", true).toBool(); // sServerName = m_settings.value("/ServerName").toString(); bStartJack = m_settings.value("/StartJack", false).toBool(); // bStartJackCmd = m_settings.value("/StartJackCmd", false).toBool(); bStopJack = m_settings.value("/StopJack", true).toBool(); bStartupScript = m_settings.value("/StartupScript", false).toBool(); sStartupScriptShell = m_settings.value("/StartupScriptShell").toString(); bPostStartupScript = m_settings.value("/PostStartupScript", false).toBool(); sPostStartupScriptShell = m_settings.value("/PostStartupScriptShell").toString(); bShutdownScript = m_settings.value("/ShutdownScript", false).toBool(); sShutdownScriptShell = m_settings.value("/ShutdownScriptShell").toString(); bPostShutdownScript = m_settings.value("/PostShutdownScript", false).toBool(); sPostShutdownScriptShell = m_settings.value("/PostShutdownScriptShell").toString(); bStdoutCapture = m_settings.value("/StdoutCapture", true).toBool(); sXrunRegex = m_settings.value("/XrunRegex", "xrun of at least ([0-9|\\.]+) msecs").toString(); bActivePatchbay = m_settings.value("/ActivePatchbay", false).toBool(); sActivePatchbayPath = m_settings.value("/ActivePatchbayPath").toString(); bActivePatchbayReset = m_settings.value("/ActivePatchbayReset", false).toBool(); bQueryDisconnect = m_settings.value("/QueryDisconnect", true).toBool(); bMessagesLog = m_settings.value("/MessagesLog", false).toBool(); sMessagesLogPath = m_settings.value("/MessagesLogPath", "qjackctl.log").toString(); bBezierLines = m_settings.value("/BezierLines", false).toBool(); iTimeDisplay = m_settings.value("/TimeDisplay", 0).toInt(); iTimeFormat = m_settings.value("/TimeFormat", 0).toInt(); sMessagesFont = m_settings.value("/MessagesFont").toString(); bMessagesLimit = m_settings.value("/MessagesLimit", true).toBool(); iMessagesLimitLines = m_settings.value("/MessagesLimitLines", 1000).toInt(); sDisplayFont1 = m_settings.value("/DisplayFont1").toString(); sDisplayFont2 = m_settings.value("/DisplayFont2").toString(); bDisplayEffect = m_settings.value("/DisplayEffect", true).toBool(); bDisplayBlink = m_settings.value("/DisplayBlink", true).toBool(); iJackClientPortAlias = m_settings.value("/JackClientPortAlias", 0).toInt(); bJackClientPortMetadata = m_settings.value("/JackClientPortMetadata", false).toBool(); iConnectionsIconSize = m_settings.value("/ConnectionsIconSize", QJACKCTL_ICON_16X16).toInt(); sConnectionsFont = m_settings.value("/ConnectionsFont").toString(); bQueryClose = m_settings.value("/QueryClose", true).toBool(); bQueryShutdown = m_settings.value("/QueryShutdown", true).toBool(); bKeepOnTop = m_settings.value("/KeepOnTop", false).toBool(); bSystemTray = m_settings.value("/SystemTray", false).toBool(); bSystemTrayQueryClose = m_settings.value("/SystemTrayQueryClose", true).toBool(); bStartMinimized = m_settings.value("/StartMinimized", false).toBool(); bServerConfig = m_settings.value("/ServerConfig", true).toBool(); sServerConfigName = m_settings.value("/ServerConfigName", ".jackdrc").toString(); bServerConfigTemp = m_settings.value("/ServerConfigTemp", false).toBool(); bAlsaSeqEnabled = m_settings.value("/AlsaSeqEnabled", true).toBool(); bDBusEnabled = m_settings.value("/DBusEnabled", false).toBool(); bJackDBusEnabled = m_settings.value("/JackDBusEnabled", false).toBool(); bAliasesEnabled = m_settings.value("/AliasesEnabled", false).toBool(); bAliasesEditing = m_settings.value("/AliasesEditing", false).toBool(); bLeftButtons = m_settings.value("/LeftButtons", true).toBool(); bRightButtons = m_settings.value("/RightButtons", true).toBool(); bTransportButtons = m_settings.value("/TransportButtons", true).toBool(); bTextLabels = m_settings.value("/TextLabels", true).toBool(); iBaseFontSize = m_settings.value("/BaseFontSize", 0).toInt(); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); sPatchbayPath = m_settings.value("/PatchbayPath").toString(); iMessagesStatusTabPage = m_settings.value("/MessagesStatusTabPage", 0).toInt(); iConnectionsTabPage = m_settings.value("/ConnectionsTabPage", 0).toInt(); bSessionSaveVersion = m_settings.value("/SessionSaveVersion", true).toBool(); m_settings.endGroup(); // Load recent patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).exists()) patchbays.append(sItem); } m_settings.endGroup(); // Load recent session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).isDir()) sessionDirs.append(sItem); } m_settings.endGroup(); } // Explicit save method. void qjackctlSetup::saveSetup (void) { // Save all settings and options... m_settings.beginGroup("/Program"); m_settings.setValue("/Version", CONFIG_BUILD_VERSION); m_settings.endGroup(); m_settings.beginGroup("/Presets"); m_settings.setValue("/DefPreset", sDefPreset); // Save last preset list. QString sPrefix = "/Preset%1"; int i = 0; QStringListIterator iter(presets); while (iter.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); m_settings.beginGroup("/Options"); m_settings.setValue("/Singleton", bSingleton); // m_settings.setValue("/ServerName", sServerName); m_settings.setValue("/StartJack", bStartJack); // m_settings.setValue("/StartJackCmd", bStartJackCmd); m_settings.setValue("/StopJack", bStopJack); m_settings.setValue("/StartupScript", bStartupScript); m_settings.setValue("/StartupScriptShell", sStartupScriptShell); m_settings.setValue("/PostStartupScript", bPostStartupScript); m_settings.setValue("/PostStartupScriptShell", sPostStartupScriptShell); m_settings.setValue("/ShutdownScript", bShutdownScript); m_settings.setValue("/ShutdownScriptShell", sShutdownScriptShell); m_settings.setValue("/PostShutdownScript", bPostShutdownScript); m_settings.setValue("/PostShutdownScriptShell", sPostShutdownScriptShell); m_settings.setValue("/StdoutCapture", bStdoutCapture); m_settings.setValue("/XrunRegex", sXrunRegex); m_settings.setValue("/ActivePatchbay", bActivePatchbay); m_settings.setValue("/ActivePatchbayPath", sActivePatchbayPath); m_settings.setValue("/ActivePatchbayReset", bActivePatchbayReset); m_settings.setValue("/QueryDisconnect", bQueryDisconnect); m_settings.setValue("/MessagesLog", bMessagesLog); m_settings.setValue("/MessagesLogPath", sMessagesLogPath); m_settings.setValue("/BezierLines", bBezierLines); m_settings.setValue("/TimeDisplay", iTimeDisplay); m_settings.setValue("/TimeFormat", iTimeFormat); m_settings.setValue("/MessagesFont", sMessagesFont); m_settings.setValue("/MessagesLimit", bMessagesLimit); m_settings.setValue("/MessagesLimitLines", iMessagesLimitLines); m_settings.setValue("/DisplayFont1", sDisplayFont1); m_settings.setValue("/DisplayFont2", sDisplayFont2); m_settings.setValue("/DisplayEffect", bDisplayEffect); m_settings.setValue("/DisplayBlink", bDisplayBlink); m_settings.setValue("/JackClientPortAlias", iJackClientPortAlias); m_settings.setValue("/JackClientPortMetadata", bJackClientPortMetadata); m_settings.setValue("/ConnectionsIconSize", iConnectionsIconSize); m_settings.setValue("/ConnectionsFont", sConnectionsFont); m_settings.setValue("/QueryClose", bQueryClose); m_settings.setValue("/QueryShutdown", bQueryShutdown); m_settings.setValue("/KeepOnTop", bKeepOnTop); m_settings.setValue("/SystemTray", bSystemTray); m_settings.setValue("/SystemTrayQueryClose", bSystemTrayQueryClose); m_settings.setValue("/StartMinimized", bStartMinimized); m_settings.setValue("/ServerConfig", bServerConfig); m_settings.setValue("/ServerConfigName", sServerConfigName); m_settings.setValue("/ServerConfigTemp", bServerConfigTemp); m_settings.setValue("/AlsaSeqEnabled", bAlsaSeqEnabled); m_settings.setValue("/DBusEnabled", bDBusEnabled); m_settings.setValue("/JackDBusEnabled", bJackDBusEnabled); m_settings.setValue("/AliasesEnabled", bAliasesEnabled); m_settings.setValue("/AliasesEditing", bAliasesEditing); m_settings.setValue("/LeftButtons", bLeftButtons); m_settings.setValue("/RightButtons", bRightButtons); m_settings.setValue("/TransportButtons", bTransportButtons); m_settings.setValue("/TextLabels", bTextLabels); m_settings.setValue("/BaseFontSize", iBaseFontSize); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); m_settings.setValue("/PatchbayPath", sPatchbayPath); m_settings.setValue("/MessagesStatusTabPage", iMessagesStatusTabPage); m_settings.setValue("/ConnectionsTabPage", iConnectionsTabPage); m_settings.setValue("/SessionSaveVersion", bSessionSaveVersion); m_settings.endGroup(); // Save patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; QStringListIterator iter2(patchbays); while (iter2.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter2.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Save session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; QStringListIterator iter3(sessionDirs); while (iter3.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter3.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Commit all changes to disk. m_settings.sync(); } //--------------------------------------------------------------------------- // Aliases preset management methods. bool qjackctlSetup::loadAliases ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } // Load preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliasAudioOutputs.loadSettings(m_settings, "/Outputs"); aliasAudioInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliasMidiOutputs.loadSettings(m_settings, "/Outputs"); aliasMidiInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliasAlsaOutputs.loadSettings(m_settings, "/Outputs"); aliasAlsaInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); return true; } bool qjackctlSetup::saveAliases ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = "/" + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } // Save preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; m_settings.remove(sAliasesKey); m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliasAudioOutputs.saveSettings(m_settings, "/Outputs"); aliasAudioInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliasMidiOutputs.saveSettings(m_settings, "/Outputs"); aliasMidiInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliasAlsaOutputs.saveSettings(m_settings, "/Outputs"); aliasAlsaInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); return true; } //--------------------------------------------------------------------------- // Preset management methods. bool qjackctlSetup::loadPreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } m_settings.beginGroup("/Settings" + sSuffix); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) preset.sServerPrefix = m_settings.value("/Server", "jackd -S").toString(); #else preset.sServerPrefix = m_settings.value("/Server", "jackd").toString(); #endif preset.sServerName = m_settings.value("/ServerName").toString(); preset.bRealtime = m_settings.value("/Realtime", true).toBool(); preset.bSoftMode = m_settings.value("/SoftMode", false).toBool(); preset.bMonitor = m_settings.value("/Monitor", false).toBool(); preset.bShorts = m_settings.value("/Shorts", false).toBool(); preset.bNoMemLock = m_settings.value("/NoMemLock", false).toBool(); preset.bUnlockMem = m_settings.value("/UnlockMem", false).toBool(); preset.bHWMon = m_settings.value("/HWMon", false).toBool(); preset.bHWMeter = m_settings.value("/HWMeter", false).toBool(); preset.bIgnoreHW = m_settings.value("/IgnoreHW", false).toBool(); preset.iPriority = m_settings.value("/Priority", 0).toInt(); preset.iFrames = m_settings.value("/Frames", 1024).toInt(); preset.iSampleRate = m_settings.value("/SampleRate", 48000).toInt(); preset.iPeriods = m_settings.value("/Periods", 2).toInt(); preset.iWordLength = m_settings.value("/WordLength", 16).toInt(); preset.iWait = m_settings.value("/Wait", 21333).toInt(); preset.iChan = m_settings.value("/Chan", 0).toInt(); preset.sDriver = m_settings.value("/Driver", DEFAULT_DRIVER).toString(); preset.sInterface = m_settings.value("/Interface").toString(); preset.iAudio = m_settings.value("/Audio", 0).toInt(); preset.iDither = m_settings.value("/Dither", 0).toInt(); preset.iTimeout = m_settings.value("/Timeout", 500).toInt(); preset.sInDevice = m_settings.value("/InDevice").toString(); preset.sOutDevice = m_settings.value("/OutDevice").toString(); preset.iInChannels = m_settings.value("/InChannels", 0).toInt(); preset.iOutChannels = m_settings.value("/OutChannels", 0).toInt(); preset.iInLatency = m_settings.value("/InLatency", 0).toInt(); preset.iOutLatency = m_settings.value("/OutLatency", 0).toInt(); preset.iStartDelay = m_settings.value("/StartDelay", 2).toInt(); preset.bVerbose = m_settings.value("/Verbose", false).toBool(); preset.iPortMax = m_settings.value("/PortMax", 256).toInt(); preset.sMidiDriver = m_settings.value("/MidiDriver").toString(); preset.sServerSuffix = m_settings.value("/ServerSuffix").toString(); m_settings.endGroup(); #ifdef CONFIG_JACK_MIDI if (!preset.sMidiDriver.isEmpty() && preset.sMidiDriver != "raw" && preset.sMidiDriver != "seq") preset.sMidiDriver.clear(); #endif return true; } bool qjackctlSetup::savePreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } m_settings.beginGroup("/Settings" + sSuffix); m_settings.setValue("/Server", preset.sServerPrefix); m_settings.setValue("/ServerName", preset.sServerName); m_settings.setValue("/Realtime", preset.bRealtime); m_settings.setValue("/SoftMode", preset.bSoftMode); m_settings.setValue("/Monitor", preset.bMonitor); m_settings.setValue("/Shorts", preset.bShorts); m_settings.setValue("/NoMemLock", preset.bNoMemLock); m_settings.setValue("/UnlockMem", preset.bUnlockMem); m_settings.setValue("/HWMon", preset.bHWMon); m_settings.setValue("/HWMeter", preset.bHWMeter); m_settings.setValue("/IgnoreHW", preset.bIgnoreHW); m_settings.setValue("/Priority", preset.iPriority); m_settings.setValue("/Frames", preset.iFrames); m_settings.setValue("/SampleRate", preset.iSampleRate); m_settings.setValue("/Periods", preset.iPeriods); m_settings.setValue("/WordLength", preset.iWordLength); m_settings.setValue("/Wait", preset.iWait); m_settings.setValue("/Chan", preset.iChan); m_settings.setValue("/Driver", preset.sDriver); m_settings.setValue("/Interface", preset.sInterface); m_settings.setValue("/Audio", preset.iAudio); m_settings.setValue("/Dither", preset.iDither); m_settings.setValue("/Timeout", preset.iTimeout); m_settings.setValue("/InDevice", preset.sInDevice); m_settings.setValue("/OutDevice", preset.sOutDevice); m_settings.setValue("/InChannels", preset.iInChannels); m_settings.setValue("/OutChannels", preset.iOutChannels); m_settings.setValue("/InLatency", preset.iInLatency); m_settings.setValue("/OutLatency", preset.iOutLatency); m_settings.setValue("/StartDelay", preset.iStartDelay); m_settings.setValue("/Verbose", preset.bVerbose); m_settings.setValue("/PortMax", preset.iPortMax); m_settings.setValue("/MidiDriver", preset.sMidiDriver); m_settings.setValue("/ServerSuffix", preset.sServerSuffix); m_settings.endGroup(); return true; } bool qjackctlSetup::deletePreset ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; int iPreset = presets.indexOf(sPreset); if (iPreset < 0) return false; presets.removeAt(iPreset); m_settings.remove("/Settings" + sSuffix); m_settings.remove("/Aliases" + sSuffix); } return true; } //------------------------------------------------------------------------- // Command-line argument stuff. // // Help about command line options. void qjackctlSetup::print_usage ( const QString& arg0 ) { QTextStream out(stderr); const QString sEot = "\n\t"; const QString sEol = "\n\n"; out << QObject::tr("Usage: %1" " [options] [command-and-args]").arg(arg0) + sEol; out << QJACKCTL_TITLE " - " + QObject::tr(QJACKCTL_SUBTITLE) + sEol; out << QObject::tr("Options:") + sEol; out << " -s, --start" + sEot + QObject::tr("Start JACK audio server immediately") + sEol; out << " -p, --preset=[label]" + sEot + QObject::tr("Set default settings preset name") + sEol; out << " -a, --active-patchbay=[path]" + sEot + QObject::tr("Set active patchbay definition file") + sEol; out << " -n, --server-name=[label]" + sEot + QObject::tr("Set default JACK audio server name") + sEol; out << " -h, --help" + sEot + QObject::tr("Show help about command line options") + sEol; out << " -v, --version" + sEot + QObject::tr("Show version information") + sEol; } // Parse command line arguments into m_settings. bool qjackctlSetup::parse_args ( const QStringList& args ) { QTextStream out(stderr); const QString sEol = "\n\n"; int iCmdArgs = 0; int argc = args.count(); for (int i = 1; i < argc; i++) { if (iCmdArgs > 0) { sCmdLine += ' '; sCmdLine += args.at(i); iCmdArgs++; continue; } QString sArg = args.at(i); QString sVal = QString::null; int iEqual = sArg.indexOf('='); if (iEqual >= 0) { sVal = sArg.right(sArg.length() - iEqual - 1); sArg = sArg.left(iEqual); } else if (i < argc - 1) sVal = args.at(i + 1); if (sArg == "-s" || sArg == "--start") { bStartJackCmd = true; } else if (sArg == "-p" || sArg == "--preset") { if (sVal.isNull()) { out << QObject::tr("Option -p requires an argument (preset).") + sEol; return false; } sDefPreset = sVal; if (iEqual < 0) i++; } else if (sArg == "-a" || sArg == "--active-patchbay") { if (sVal.isNull()) { out << QObject::tr("Option -a requires an argument (path).") + sEol; return false; } bActivePatchbay = true; sActivePatchbayPath = sVal; if (iEqual < 0) i++; } else if (sArg == "-n" || sArg == "--server-name") { if (sVal.isNull()) { out << QObject::tr("Option -n requires an argument (name).") + sEol; return false; } sServerName = sVal; if (iEqual < 0) i++; } else if (sArg == "-h" || sArg == "--help") { print_usage(args.at(0)); return false; } else if (sArg == "-v" || sArg == "--version") { out << QString("Qt: %1\n") .arg(qVersion()); out << QString("%1: %2\n") .arg(QJACKCTL_TITLE) .arg(CONFIG_BUILD_VERSION); #ifdef CONFIG_JACK_VERSION out << QString("JACK: %1\n") .arg(jack_get_version_string()); #endif return false; } // FIXME: Avoid auto-start jackd stuffed args! else if (sArg != "-T" && sArg != "-ndefault") { // Here starts the optional command line... sCmdLine += sArg; iCmdArgs++; } } // HACK: If there's a command line, it must be spawned on background... if (iCmdArgs > 0) sCmdLine += " &"; // Alright with argument parsing. return true; } //--------------------------------------------------------------------------- // Combo box history persistence helper implementation. void qjackctlSetup::loadComboBoxHistory ( QComboBox *pComboBox, int iLimit ) { const bool bBlockSignals = pComboBox->blockSignals(true); // Load combobox list from configuration settings file... m_settings.beginGroup("/History/" + pComboBox->objectName()); if (m_settings.childKeys().count() > 0) { pComboBox->setUpdatesEnabled(false); pComboBox->setDuplicatesEnabled(false); pComboBox->clear(); for (int i = 0; i < iLimit; ++i) { const QString& sText = m_settings.value( "/Item" + QString::number(i + 1)).toString(); if (sText.isEmpty()) break; pComboBox->addItem(sText); } pComboBox->setUpdatesEnabled(true); } m_settings.endGroup(); pComboBox->blockSignals(bBlockSignals); } void qjackctlSetup::saveComboBoxHistory ( QComboBox *pComboBox, int iLimit ) { const bool bBlockSignals = pComboBox->blockSignals(true); // Add current text as latest item... const QString sCurrentText = pComboBox->currentText(); int iCount = pComboBox->count(); for (int i = 0; i < iCount; i++) { const QString& sText = pComboBox->itemText(i); if (sText == sCurrentText) { pComboBox->removeItem(i); --iCount; break; } } while (iCount >= iLimit) pComboBox->removeItem(--iCount); pComboBox->insertItem(0, sCurrentText); pComboBox->setCurrentIndex(0); ++iCount; // Save combobox list to configuration settings file... m_settings.beginGroup("/History/" + pComboBox->objectName()); for (int i = 0; i < iCount; ++i) { const QString& sText = pComboBox->itemText(i); if (sText.isEmpty()) break; m_settings.setValue("/Item" + QString::number(i + 1), sText); } m_settings.endGroup(); pComboBox->blockSignals(bBlockSignals); } //--------------------------------------------------------------------------- // Splitter widget sizes persistence helper methods. void qjackctlSetup::loadSplitterSizes ( QSplitter *pSplitter, QList& sizes ) { // Try to restore old splitter sizes... if (pSplitter) { m_settings.beginGroup("/Splitter/" + pSplitter->objectName()); QStringList list = m_settings.value("/sizes").toStringList(); if (!list.isEmpty()) { sizes.clear(); QStringListIterator iter(list); while (iter.hasNext()) sizes.append(iter.next().toInt()); } pSplitter->setSizes(sizes); m_settings.endGroup(); } } void qjackctlSetup::saveSplitterSizes ( QSplitter *pSplitter ) { // Try to save current splitter sizes... if (pSplitter) { m_settings.beginGroup("/Splitter/" + pSplitter->objectName()); QStringList list; QList sizes = pSplitter->sizes(); QListIterator iter(sizes); while (iter.hasNext()) list.append(QString::number(iter.next())); if (!list.isEmpty()) m_settings.setValue("/sizes", list); m_settings.endGroup(); } } //--------------------------------------------------------------------------- // Widget geometry persistence helper methods. void qjackctlSetup::loadWidgetGeometry ( QWidget *pWidget, bool bVisible ) { // Try to restore old form window positioning. if (pWidget) { // if (bVisible) pWidget->show(); -- force initial exposure? m_settings.beginGroup("/Geometry/" + pWidget->objectName()); #if QT_VERSION >= 0x050000 const QByteArray& geometry = m_settings.value("/geometry").toByteArray(); if (!geometry.isEmpty()) pWidget->restoreGeometry(geometry); #else//--LOAD_OLD_GEOMETRY QPoint wpos; QSize wsize; wpos.setX(m_settings.value("/x", -1).toInt()); wpos.setY(m_settings.value("/y", -1).toInt()); wsize.setWidth(m_settings.value("/width", -1).toInt()); wsize.setHeight(m_settings.value("/height", -1).toInt()); if (wpos.x() > 0 && wpos.y() > 0) pWidget->move(wpos); if (wsize.width() > 0 && wsize.height() > 0) pWidget->resize(wsize); #endif // else // pWidget->adjustSize(); if (!bVisible) bVisible = m_settings.value("/visible", false).toBool(); if (bVisible && !bStartMinimized) pWidget->show(); else pWidget->hide(); m_settings.endGroup(); } } void qjackctlSetup::saveWidgetGeometry ( QWidget *pWidget, bool bVisible ) { // Try to save form window position... // (due to X11 window managers ideossincrasies, we better // only save the form geometry while its up and visible) if (pWidget) { m_settings.beginGroup("/Geometry/" + pWidget->objectName()); #if QT_VERSION >= 0x050000 m_settings.setValue("/geometry", pWidget->saveGeometry()); #else//--SAVE_OLD_GEOMETRY const QPoint& wpos = pWidget->pos(); const QSize& wsize = pWidget->size(); m_settings.setValue("/x", wpos.x()); m_settings.setValue("/y", wpos.y()); m_settings.setValue("/width", wsize.width()); m_settings.setValue("/height", wsize.height()); #endif if (!bVisible) bVisible = pWidget->isVisible(); m_settings.setValue("/visible", bVisible && !bStartMinimized); m_settings.endGroup(); } } // end of qjackctlSetup.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayFile.txt0000644000000000000000000000012713215206021020360 xustar0029 mtime=1513425937.53676694 29 atime=1513425937.53676694 29 ctime=1513425937.53676694 qjackctl-0.5.0/src/qjackctlPatchbayFile.txt0000644000175000001440000000263413215206021021213 0ustar00rncbcusers00000000000000qjackctlPatchbayFile format specification ----------------------------------------- plug-name . . . . . . plug-name . . . . . . # # # . # . # . # . . . patchbay-name := string-literal patchbay-version := string-literal socket-name := string-literal socket-type := "audio" | "midi" | "jack-audio" | "jack-midi" | "alsa-midi" # slot-name := string-literal # slot-mode := "open" | "half" | "full" client-name := string-regexp (JACK/ALSA client name) plug-name := string-regexp (JACK/ALSA port name) exclusive-flag := "on" | "off" | "yes" | "no" | "1" | "0" qjackctl-0.5.0/src/PaxHeaders.4714/src.pro0000644000000000000000000000012713215206021015060 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/src.pro0000644000175000001440000000456513215206021015720 0ustar00rncbcusers00000000000000# qjackctl.pro # TARGET = qjackctl TEMPLATE = app INCLUDEPATH += . include(src.pri) #DEFINES += DEBUG HEADERS += config.h \ qjackctlAbout.h \ qjackctlAlsaConnect.h \ qjackctlConnect.h \ qjackctlConnectAlias.h \ qjackctlInterfaceComboBox.h \ qjackctlJackConnect.h \ qjackctlPatchbay.h \ qjackctlPatchbayFile.h \ qjackctlPatchbayRack.h \ qjackctlSession.h \ qjackctlSetup.h \ qjackctlStatus.h \ qjackctlSystemTray.h \ qjackctlAboutForm.h \ qjackctlConnectionsForm.h \ qjackctlMainForm.h \ qjackctlMessagesStatusForm.h \ qjackctlPatchbayForm.h \ qjackctlSessionForm.h \ qjackctlSetupForm.h \ qjackctlSocketForm.h SOURCES += \ qjackctl.cpp \ qjackctlAlsaConnect.cpp \ qjackctlConnect.cpp \ qjackctlConnectAlias.cpp \ qjackctlInterfaceComboBox.cpp \ qjackctlJackConnect.cpp \ qjackctlPatchbay.cpp \ qjackctlPatchbayFile.cpp \ qjackctlPatchbayRack.cpp \ qjackctlSession.cpp \ qjackctlSetup.cpp \ qjackctlSystemTray.cpp \ qjackctlAboutForm.cpp \ qjackctlConnectionsForm.cpp \ qjackctlMainForm.cpp \ qjackctlMessagesStatusForm.cpp \ qjackctlPatchbayForm.cpp \ qjackctlSessionForm.cpp \ qjackctlSetupForm.cpp \ qjackctlSocketForm.cpp FORMS += \ qjackctlAboutForm.ui \ qjackctlConnectionsForm.ui \ qjackctlMainForm.ui \ qjackctlMessagesStatusForm.ui \ qjackctlPatchbayForm.ui \ qjackctlSessionForm.ui \ qjackctlSetupForm.ui \ qjackctlSocketForm.ui RESOURCES += \ qjackctl.qrc TRANSLATIONS += \ translations/qjackctl_cs.ts \ translations/qjackctl_de.ts \ translations/qjackctl_es.ts \ translations/qjackctl_fr.ts \ translations/qjackctl_it.ts \ translations/qjackctl_ja.ts \ translations/qjackctl_nl.ts \ translations/qjackctl_ru.ts unix { # variables OBJECTS_DIR = .obj MOC_DIR = .moc UI_DIR = .ui isEmpty(PREFIX) { PREFIX = /usr/local } isEmpty(BINDIR) { BINDIR = $${PREFIX}/bin } isEmpty(DATADIR) { DATADIR = $${PREFIX}/share } #DEFINES += DATADIR=\"$${DATADIR}\" # make install INSTALLS += target desktop icon appdata target.path = $${BINDIR} desktop.path = $${DATADIR}/applications desktop.files += $${TARGET}.desktop icon.path = $${DATADIR}/icons/hicolor/32x32/apps icon.files += images/$${TARGET}.png appdata.path = $${DATADIR}/metainfo appdata.files += appdata/$${TARGET}.appdata.xml } # XML/DOM support QT += xml # QT5 support !lessThan(QT_MAJOR_VERSION, 5) { QT += widgets } win32 { CONFIG += static } qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAlsaConnect.h0000644000000000000000000000012713215206021017627 xustar0029 mtime=1513425937.53176694 29 atime=1513425937.53176694 29 ctime=1513425937.53176694 qjackctl-0.5.0/src/qjackctlAlsaConnect.h0000644000175000001440000000746713215206021020473 0ustar00rncbcusers00000000000000// qjackctlAlsaConnect.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAlsaConnect_h #define __qjackctlAlsaConnect_h #include "qjackctlAbout.h" #include "qjackctlConnect.h" #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlAlsaPort; class qjackctlAlsaClient; class qjackctlAlsaClientList; class qjackctlAlsaConnect; // Pixmap-set array indexes. #define QJACKCTL_ALSA_CLIENTO 0 // Output client item pixmap. #define QJACKCTL_ALSA_CLIENTI 1 // Input client item pixmap. #define QJACKCTL_ALSA_PORTO 2 // Output port pixmap. #define QJACKCTL_ALSA_PORTI 3 // Input port pixmap. #define QJACKCTL_ALSA_PIXMAPS 4 // Number of pixmaps in local array. // Jack port list item. class qjackctlAlsaPort : public qjackctlPortItem { public: // Constructor. qjackctlAlsaPort(qjackctlAlsaClient *pClient, int iAlsaPort); // Default destructor. ~qjackctlAlsaPort(); // Jack handles accessors. int alsaClient() const; int alsaPort() const; private: // Instance variables. int m_iAlsaPort; }; // Jack client list item. class qjackctlAlsaClient : public qjackctlClientItem { public: // Constructor. qjackctlAlsaClient(qjackctlAlsaClientList *pClientList, int iAlsaClient); // Default destructor. ~qjackctlAlsaClient(); // Jack client accessors. int alsaClient() const; // Port finder by id. qjackctlAlsaPort *findPort(int iAlsaPort); private: // Instance variables. int m_iAlsaClient; }; // Jack client list. class qjackctlAlsaClientList : public qjackctlClientList { public: // Constructor. qjackctlAlsaClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlAlsaClientList(); // Client finder by id. qjackctlAlsaClient *findClient(int iAlsaClient); // Client port finder by id. qjackctlAlsaPort *findClientPort(int iAlsaClient, int iAlsaPort); // Client:port refreshner (return newest item count). int updateClientPorts(); }; //---------------------------------------------------------------------------- // qjackctlAlsaConnect -- Connections model integrated object. class qjackctlAlsaConnect : public qjackctlConnect { public: // Constructor. qjackctlAlsaConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlAlsaConnect(); // Common pixmap accessor. const QPixmap& pixmap(int iPixmap) const; protected: // Virtual Connect/Disconnection primitives. bool connectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Update port connection references. void updateConnections(); // Update icon size implementation. void updateIconPixmaps(); private: // Local pixmap-set janitor methods. void createIconPixmaps(); void deleteIconPixmaps(); // Local pixmap-set array. QPixmap *m_apPixmaps[QJACKCTL_ALSA_PIXMAPS]; }; #endif // __qjackctlAlsaConnect_h // end of qjackctlAlsaConnect.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMessagesStatusForm.h0000644000000000000000000000012713215206021021234 xustar0029 mtime=1513425937.53576694 29 atime=1513425937.53576694 29 ctime=1513425937.53576694 qjackctl-0.5.0/src/qjackctlMessagesStatusForm.h0000644000175000001440000000524413215206021022067 0ustar00rncbcusers00000000000000// qjackctlMessagesStatusForm.h // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMessagesStatusForm_h #define __qjackctlMessagesStatusForm_h #include "ui_qjackctlMessagesStatusForm.h" // Forward declarations. class QTreeWidgetItem; class QFile; //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. class qjackctlMessagesStatusForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMessagesStatusForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlMessagesStatusForm(); enum TabPage { MessagesTab = 0, StatusTab = 1 }; void setTabPage(int iTabPage); int tabPage() const; QFont messagesFont() const; void setMessagesFont(const QFont& font); int messagesLimit() const; void setMessagesLimit(int iLimit); bool isLogging() const; void setLogging(bool bEnabled, const QString& sFilename = QString()); void appendMessages(const QString& s); void appendMessagesColor(const QString& s, const QString& c); void appendMessagesText(const QString& s); void updateStatusItem(int iStatusItem, const QString& sText); public slots: void resetXrunStats(); void refreshXrunStats(); protected: void appendMessagesLine(const QString& s); void appendMessagesLog(const QString& s); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlMessagesStatusForm m_ui; // Instance variables. int m_iMessagesLines; int m_iMessagesLimit; int m_iMessagesHigh; // Logging stuff. QFile *m_pMessagesLog; // Status stuff. QTreeWidgetItem *m_apStatus[19]; }; #endif // __qjackctlMessagesStatusForm_h // end of qjackctlMessagesStatusForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAlsaConnect.cpp0000644000000000000000000000012713215206021020162 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctlAlsaConnect.cpp0000644000175000001440000002740013215206021021013 0ustar00rncbcusers00000000000000// qjackctlAlsaConnect.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAlsaConnect.h" #include "qjackctlMainForm.h" #include //---------------------------------------------------------------------- // class qjackctlAlsaPort -- Alsa port list item. // // Constructor. qjackctlAlsaPort::qjackctlAlsaPort ( qjackctlAlsaClient *pClient, int iAlsaPort ) : qjackctlPortItem(pClient) { m_iAlsaPort = iAlsaPort; qjackctlAlsaConnect *pAlsaConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pAlsaConnect) { if (pClient->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTI))); } } } // Default destructor. qjackctlAlsaPort::~qjackctlAlsaPort (void) { } // Alsa handles accessors. int qjackctlAlsaPort::alsaClient (void) const { return (static_cast (client()))->alsaClient(); } int qjackctlAlsaPort::alsaPort (void) const { return m_iAlsaPort; } //---------------------------------------------------------------------- // class qjackctlAlsaClient -- Alsa client list item. // // Constructor. qjackctlAlsaClient::qjackctlAlsaClient ( qjackctlAlsaClientList *pClientList, int iAlsaClient ) : qjackctlClientItem(pClientList) { m_iAlsaClient = iAlsaClient; qjackctlAlsaConnect *pAlsaConnect = static_cast ( (pClientList->listView())->binding()); if (pAlsaConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTI))); } } } // Default destructor. qjackctlAlsaClient::~qjackctlAlsaClient (void) { } // Jack client accessor. int qjackctlAlsaClient::alsaClient (void) const { return m_iAlsaClient; } // Derived port finder. qjackctlAlsaPort *qjackctlAlsaClient::findPort ( int iAlsaPort ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlAlsaPort *pPort = static_cast (iter.next()); if (iAlsaPort == pPort->alsaPort()) return pPort; } return NULL; } //---------------------------------------------------------------------- // qjackctlAlsaClientList -- Jack client list. // // Constructor. qjackctlAlsaClientList::qjackctlAlsaClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlAlsaClientList::~qjackctlAlsaClientList (void) { } // Client finder by id. qjackctlAlsaClient *qjackctlAlsaClientList::findClient ( int iAlsaClient ) { QListIterator iter(clients()); while (iter.hasNext()) { qjackctlAlsaClient *pClient = static_cast (iter.next()); if (iAlsaClient == pClient->alsaClient()) return pClient; } return NULL; } // Client port finder by id. qjackctlAlsaPort *qjackctlAlsaClientList::findClientPort ( int iAlsaClient, int iAlsaPort ) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); if (pClient == NULL) return NULL; return pClient->findPort(iAlsaPort); } // Client:port refreshner. int qjackctlAlsaClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return 0; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return 0; int iDirtyCount = 0; markClientPorts(0); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (isReadable()) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { QString sClientName = QString::number(iAlsaClient) + ':'; sClientName += QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); qjackctlAlsaPort *pPort = 0; const int iAlsaPort = snd_seq_port_info_get_port(pPortInfo); if (pClient == 0) { pClient = new qjackctlAlsaClient(this, iAlsaClient); pClient->setClientName(sClientName); iDirtyCount++; } else { pPort = pClient->findPort(iAlsaPort); if (sClientName != pClient->clientName()) { pClient->setClientName(sClientName); iDirtyCount++; } } if (pClient) { QString sPortName = QString::number(iAlsaPort) + ':'; sPortName += QString::fromUtf8( snd_seq_port_info_get_name(pPortInfo)); if (pPort == 0) { pPort = new qjackctlAlsaPort(pClient, iAlsaPort); pPort->setPortName(sPortName); iDirtyCount++; } else if (sPortName != pPort->portName()) { pPort->setPortName(sPortName); iDirtyCount++; } } if (pPort) pPort->markClientPort(1); } } } } #endif // CONFIG_ALSA_SEQ iDirtyCount += cleanClientPorts(0); return iDirtyCount; } //---------------------------------------------------------------------- // qjackctlAlsaConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlAlsaConnect::qjackctlAlsaConnect ( qjackctlConnectView *pConnectView ) : qjackctlConnect(pConnectView) { createIconPixmaps(); setOClientList(new qjackctlAlsaClientList( connectView()->OListView(), true)); setIClientList(new qjackctlAlsaClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlAlsaConnect::~qjackctlAlsaConnect (void) { deleteIconPixmaps(); } // Common pixmap accessor (static). const QPixmap& qjackctlAlsaConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Local pixmap-set janitor methods. void qjackctlAlsaConnect::createIconPixmaps (void) { m_apPixmaps[QJACKCTL_ALSA_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_ALSA_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_ALSA_PORTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_ALSA_PORTO] = createIconPixmap("mporto"); } void qjackctlAlsaConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_ALSA_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = NULL; } } // Connection primitive. bool qjackctlAlsaConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_subscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Disconnection primitive. bool qjackctlAlsaConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_unsubscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Update port connection references. void qjackctlAlsaConnect::updateConnections (void) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Proper type casts. qjackctlAlsaClientList *pOClientList = static_cast (OClientList()); qjackctlAlsaClientList *pIClientList = static_cast (IClientList()); // For each output client item... QListIterator oclient(pOClientList->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlAlsaPort *pOAlsa = static_cast (pOPort); // Get port connections... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlPortItem *pIPort = pIClientList->findClientPort( seq_addr.client, seq_addr.port); if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } } #endif // CONFIG_ALSA_SEQ } // Update icon size implementation. void qjackctlAlsaConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlAlsaConnect.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSocketForm.ui0000644000000000000000000000012713215206021017677 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlSocketForm.ui0000644000175000001440000002760313215206021020535 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSocketForm 0 0 400 300 Socket - JACK Audio Connection Kit :/images/patchbay1.png 9 6 QTabWidget::Rounded &Socket 8 4 &Name (alias): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketNameLineEdit Socket name (an alias for client name) Client name (regular expression) true Add plug to socket plug list Add P&lug :/images/add1.png &Plug: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PlugNameComboBox Port name (regular expression) true Qt::CustomContextMenu Socket plug list false true false true Socket Plugs / Ports Edit currently selected plug &Edit :/images/edit1.png Remove currently selected plug from socket plug list &Remove :/images/remove1.png &Client: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ClientNameComboBox Move down currently selected plug in socket plug list &Down :/images/down1.png Move up current selected plug in socket plug list &Up :/images/up1.png Qt::Vertical QSizePolicy::Expanding 8 8 Enforce only one exclusive cable connection E&xclusive &Forward: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketForwardComboBox Forward (clone) all connections from this socket false Type 8 4 Audio socket type (JACK) &Audio MIDI socket type (JACK) &MIDI MIDI socket type (ALSA) AL&SA Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok SocketTabWidget SocketNameLineEdit AudioRadioButton MidiRadioButton AlsaRadioButton ClientNameComboBox PlugNameComboBox PlugAddPushButton PlugListView PlugEditPushButton PlugRemovePushButton PlugUpPushButton PlugDownPushButton ExclusiveCheckBox SocketForwardComboBox DialogButtonBox qjackctl-0.5.0/src/PaxHeaders.4714/qjackctl.desktop0000644000000000000000000000012713215206021016736 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctl.desktop0000644000175000001440000000150113215206021017561 0ustar00rncbcusers00000000000000[Desktop Entry] Name=QjackCtl Version=1.0 GenericName=JACK Control GenericName[de]=JACK-Steuerung GenericName[fr]=Contrôle JACK GenericName[it]=Interfaccia di controllo per JACK GenericName[ru]=Управление JACK Comment=QjackCtl is a JACK Audio Connection Kit Qt GUI Interface Comment[de]=Grafisches Werkzeug zur Steuerung des JACK-Audio-Systems Comment[fr]=QjackCtl est une interface graphique Qt pour le kit de connexion audio JACK Comment[it]=QjackCtl è un'interfaccia di controllo per JACK basata su Qt Comment[ru]=Программа для управления звуковым сервером JACK Exec=qjackctl Icon=qjackctl Categories=Audio;AudioVideo;Midi;X-Alsa;X-Jack;Qt; Keywords=Audio;MIDI;ALSA;JACK;LV2;Qt; Terminal=false Type=Application StartupWMClass=qjackctl X-Window-Icon=qjackctl X-SuSE-translate=true qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSocketForm.cpp0000644000000000000000000000012713215206021020044 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54076694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlSocketForm.cpp0000644000175000001440000006431713215206021020705 0ustar00rncbcusers00000000000000// qjackctlSocketForm.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSocketForm.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include "qjackctlConnectAlias.h" #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. // Constructor. qjackctlSocketForm::qjackctlSocketForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSocketList = NULL; m_bSocketNew = false; m_iSocketNameChanged = 0; m_ppPixmaps = NULL; m_iDirtyCount = 0; // Setup time-display radio-button group. m_pSocketTypeButtonGroup = new QButtonGroup(this); m_pSocketTypeButtonGroup->addButton(m_ui.AudioRadioButton, 0); m_pSocketTypeButtonGroup->addButton(m_ui.MidiRadioButton, 1); m_pSocketTypeButtonGroup->addButton(m_ui.AlsaRadioButton, 2); m_pSocketTypeButtonGroup->setExclusive(true); // Plug list is not sortable. //m_ui.PlugListView->setSorting(-1); // Plug list view... QHeaderView *pHeader = m_ui.PlugListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(300); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif // UI connections... QObject::connect(m_ui.PlugAddPushButton, SIGNAL(clicked()), SLOT(addPlug())); QObject::connect(m_ui.PlugRemovePushButton, SIGNAL(clicked()), SLOT(removePlug())); QObject::connect(m_ui.PlugEditPushButton, SIGNAL(clicked()), SLOT(editPlug())); QObject::connect(m_ui.PlugUpPushButton, SIGNAL(clicked()), SLOT(moveUpPlug())); QObject::connect(m_ui.PlugDownPushButton, SIGNAL(clicked()), SLOT(moveDownPlug())); QObject::connect(m_ui.PlugListView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(selectedPlug())); QObject::connect(m_ui.SocketNameLineEdit, SIGNAL(textChanged(const QString&)), SLOT(socketNameChanged())); QObject::connect(m_ui.AudioRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.MidiRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.AlsaRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ExclusiveCheckBox, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ClientNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(clientNameChanged())); QObject::connect(m_ui.PlugNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changed())); QObject::connect(m_ui.PlugListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(customContextMenu(const QPoint&))); QObject::connect(m_ui.PlugListView->itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(changed())); QObject::connect(m_ui.SocketForwardComboBox, SIGNAL(activated(int)), SLOT(changed())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); } // Destructor. qjackctlSocketForm::~qjackctlSocketForm (void) { delete m_pSocketTypeButtonGroup; } // Socket caption utility method. void qjackctlSocketForm::setSocketCaption ( const QString& sSocketCaption ) { m_ui.SocketTabWidget->setTabText(0, sSocketCaption); (m_ui.PlugListView->headerItem())->setText(0, sSocketCaption + ' ' + tr("Plugs / Ports")); } // Socket list enablement. void qjackctlSocketForm::setSocketList ( qjackctlSocketList *pSocketList ) { m_pSocketList = pSocketList; } // Socket new flag. void qjackctlSocketForm::setSocketNew ( bool bSocketNew ) { m_bSocketNew = bSocketNew; } // Pixmap utility methods. void qjackctlSocketForm::setPixmaps ( QPixmap **ppPixmaps ) { m_ppPixmaps = ppPixmaps; } // Socket type and exclusiveness editing enablement. void qjackctlSocketForm::setConnectCount ( int iConnectCount ) { // m_ui.SocketTypeGroupBox->setEnabled(iConnectCount < 1); if (iConnectCount) { switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO m_ui.MidiRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.MidiRadioButton->setEnabled(false); break; } } m_ui.ExclusiveCheckBox->setEnabled(iConnectCount < 2); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif } // Load dialog controls from socket properties. void qjackctlSocketForm::load ( qjackctlPatchbaySocket *pSocket ) { m_ui.SocketNameLineEdit->setText(pSocket->name()); QRadioButton *pRadioButton = static_cast ( m_pSocketTypeButtonGroup->button(pSocket->type())); if (pRadioButton) pRadioButton->setChecked(true); m_ui.ClientNameComboBox->setEditText(pSocket->clientName()); m_ui.ExclusiveCheckBox->setChecked(pSocket->isExclusive()); m_ui.PlugListView->clear(); QTreeWidgetItem *pPlugItem = NULL; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlugName = iter.next(); pPlugItem = new QTreeWidgetItem(m_ui.PlugListView, pPlugItem); if (pPlugItem) { pPlugItem->setText(0, sPlugName); pPlugItem->setFlags(pPlugItem->flags() | Qt::ItemIsEditable); } } socketTypeChanged(); int iItemIndex = 0; if (!pSocket->forward().isEmpty()) { const int iItem = m_ui.SocketForwardComboBox->findText(pSocket->forward()); if (iItem >= 0) iItemIndex = iItem; } m_ui.SocketForwardComboBox->setCurrentIndex(iItemIndex); if (m_bSocketNew) m_iSocketNameChanged = 0; m_iDirtyCount = 0; stabilizeForm(); } // Save dialog controls into socket properties. void qjackctlSocketForm::save ( qjackctlPatchbaySocket *pSocket ) { pSocket->setName(m_ui.SocketNameLineEdit->text()); pSocket->setType(m_pSocketTypeButtonGroup->checkedId()); pSocket->setClientName(m_ui.ClientNameComboBox->currentText()); pSocket->setExclusive(m_ui.ExclusiveCheckBox->isChecked()); pSocket->pluglist().clear(); const int iPlugCount = m_ui.PlugListView->topLevelItemCount(); for (int iPlug = 0; iPlug < iPlugCount; ++iPlug) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iPlug); pSocket->addPlug(pItem->text(0)); } if (m_ui.SocketForwardComboBox->currentIndex() > 0) pSocket->setForward(m_ui.SocketForwardComboBox->currentText()); else pSocket->setForward(QString::null); m_iDirtyCount = 0; } // Stabilize current state form. void qjackctlSocketForm::stabilizeForm (void) { m_ui.DialogButtonBox->button( QDialogButtonBox::Ok)->setEnabled(validateForm()); QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { const int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); const int iItemCount = m_ui.PlugListView->topLevelItemCount(); m_ui.PlugEditPushButton->setEnabled(true); m_ui.PlugRemovePushButton->setEnabled(true); m_ui.PlugUpPushButton->setEnabled(iItem > 0); m_ui.PlugDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.PlugEditPushButton->setEnabled(false); m_ui.PlugRemovePushButton->setEnabled(false); m_ui.PlugUpPushButton->setEnabled(false); m_ui.PlugDownPushButton->setEnabled(false); } bool bEnabled = !m_ui.PlugNameComboBox->currentText().isEmpty(); if (bEnabled) { bEnabled = (m_ui.PlugListView->findItems( m_ui.PlugNameComboBox->currentText(), Qt::MatchExactly).isEmpty()); } m_ui.PlugAddPushButton->setEnabled(bEnabled); } // Validate form fields. bool qjackctlSocketForm::validateForm (void) { bool bValid = (m_iDirtyCount > 0); bValid = bValid && !m_ui.SocketNameLineEdit->text().isEmpty(); bValid = bValid && !m_ui.ClientNameComboBox->currentText().isEmpty(); bValid = bValid && (m_ui.PlugListView->topLevelItemCount() > 0); return bValid; } // Validate form fields and accept it valid. void qjackctlSocketForm::accept (void) { if (m_pSocketList == NULL) return; if (!validateForm()) return; // Check if a socket with the same name already exists... if (m_bSocketNew) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { const QString& sSocketName = iter.next()->socketName(); if (m_ui.SocketNameLineEdit->text() == sSocketName) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("A socket named \"%1\" already exists.") .arg(sSocketName), QMessageBox::Cancel); // Reject. return; } } } QDialog::accept(); } void qjackctlSocketForm::reject (void) { bool bReject = true; // Check if there's any pending changes... if (m_iDirtyCount > 0) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), QMessageBox::Apply | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Apply: accept(); return; case QMessageBox::Discard: break; default: // Cancel. bReject = false; } } if (bReject) QDialog::reject(); } // Dirty up the current form. void qjackctlSocketForm::changed (void) { ++m_iDirtyCount; stabilizeForm(); } // Add new Plug to socket list. void qjackctlSocketForm::addPlug (void) { if (m_ppPixmaps == NULL) return; QString sPlugName = m_ui.PlugNameComboBox->currentText(); if (!sPlugName.isEmpty()) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) pItem->setSelected(false); pItem = new QTreeWidgetItem(m_ui.PlugListView, pItem); if (pItem) { pItem->setText(0, sPlugName); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); QPixmap *pXpmPlug = NULL; switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; break; } if (pXpmPlug) pItem->setIcon(0, QIcon(*pXpmPlug)); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } m_ui.PlugNameComboBox->setEditText(QString::null); } clientNameChanged(); } // Rename current selected Plug. void qjackctlSocketForm::editPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugListView->editItem(pItem, 0); clientNameChanged(); } // Remove current selected Plug. void qjackctlSocketForm::removePlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) delete pItem; clientNameChanged(); } // Move current selected Plug one position up. void qjackctlSocketForm::moveUpPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); if (iItem > 0) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem - 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Move current selected Plug one position down void qjackctlSocketForm::moveDownPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); int iItemCount = m_ui.PlugListView->topLevelItemCount(); if (iItem < iItemCount - 1) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem + 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Update selected plug one position down void qjackctlSocketForm::selectedPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugNameComboBox->setEditText(pItem->text(0)); stabilizeForm(); } // Add new Plug from context menu. void qjackctlSocketForm::activateAddPlugMenu ( QAction *pAction ) { const int iIndex = pAction->data().toInt(); if (iIndex >= 0 && iIndex < m_ui.PlugNameComboBox->count()) { m_ui.PlugNameComboBox->setCurrentIndex(iIndex); addPlug(); } } // Plug list context menu handler. void qjackctlSocketForm::customContextMenu ( const QPoint& pos ) { int iItem = 0; int iItemCount = 0; QTreeWidgetItem *pItem = m_ui.PlugListView->itemAt(pos); if (pItem == NULL) pItem = m_ui.PlugListView->currentItem(); if (pItem) { iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); iItemCount = m_ui.PlugListView->topLevelItemCount(); } QMenu menu(this); QAction *pAction; // Build the add plug sub-menu... QMenu *pAddPlugMenu = menu.addMenu( QIcon(":/images/add1.png"), tr("Add Plug")); int iIndex = 0; for (iIndex = 0; iIndex < m_ui.PlugNameComboBox->count(); iIndex++) { pAction = pAddPlugMenu->addAction( m_ui.PlugNameComboBox->itemText(iIndex)); pAction->setData(iIndex); } QObject::connect(pAddPlugMenu, SIGNAL(triggered(QAction*)), SLOT(activateAddPlugMenu(QAction*))); pAddPlugMenu->setEnabled(iIndex > 0); // Build the plug context menu... const bool bEnabled = (pItem != NULL); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit"), this, SLOT(editPlug())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), this, SLOT(removePlug())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), this, SLOT(moveUpPlug())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), this, SLOT(moveDownPlug())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.exec((m_ui.PlugListView->viewport())->mapToGlobal(pos)); } void qjackctlSocketForm::updateJackClients ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_CLIENT; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_CLIENT; } #endif const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); // Grab all client ports. const char **ppszClientPorts = jack_get_ports( pJackClient, NULL, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { QString sClientName = qjackctlClientAlias::escapeRegExpDigits( sClientPort.left(iColon)); bool bExists = false; for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClientName == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClientName); } } iClientPort++; } ::free(ppszClientPorts); } } // ALSA client names refreshner. void qjackctlSocketForm::updateAlsaClients ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_CLIENT]); // Readd all subscribers... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); QString sClient = qjackctlClientAlias::escapeRegExpDigits( QString::fromUtf8(snd_seq_client_info_get_name(pClientInfo))); if (iAlsaClient > 0) { bool bExists = false; snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (!bExists && snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClient == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClient); bExists = true; } } } } } #endif // CONFIG_ALSA_SEQ } // Socket type change slot. void qjackctlSocketForm::socketTypeChanged (void) { if (m_ppPixmaps == NULL) return; if (m_pSocketList == NULL) return; const bool bBlockSignals = m_ui.ClientNameComboBox->blockSignals(true); const QString sOldClientName = m_ui.ClientNameComboBox->currentText(); m_ui.ClientNameComboBox->clear(); QPixmap *pXpmSocket = NULL; QPixmap *pXpmPlug = NULL; const bool bReadable = m_pSocketList->isReadable(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateAlsaClients(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } const int iOldSocketNameChanged = m_iSocketNameChanged++; m_ui.ClientNameComboBox->setEditText(sOldClientName); clientNameChanged(); m_iSocketNameChanged = iOldSocketNameChanged; if (pXpmPlug) { const int iItemCount = m_ui.PlugListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iItem); pItem->setIcon(0, QIcon(*pXpmPlug)); } } // Now the socket forward list... m_ui.SocketForwardComboBox->clear(); m_ui.SocketForwardComboBox->addItem(tr("(None)")); if (!bReadable) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { qjackctlSocketItem *pSocketItem = iter.next(); if (pSocketItem->socketType() == iSocketType && pSocketItem->socketName() != m_ui.SocketNameLineEdit->text()) { switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; break; } m_ui.SocketForwardComboBox->addItem( QIcon(*pXpmSocket), pSocketItem->socketName()); } } } const bool bEnabled = (m_ui.SocketForwardComboBox->count() > 1); m_ui.SocketForwardTextLabel->setEnabled(bEnabled); m_ui.SocketForwardComboBox->setEnabled(bEnabled); m_ui.ClientNameComboBox->blockSignals(bBlockSignals); } // Socket name change slot. void qjackctlSocketForm::socketNameChanged (void) { ++m_iSocketNameChanged; changed(); } // JACK client plugs refreshner. void qjackctlSocketForm::updateJackPlugs ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_PLUG; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_PLUG; } #endif const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegExp rxClientName(sClientName); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); const char **ppszClientPorts = jack_get_ports( pJackClient, NULL, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); const int iColon = sClientPort.indexOf(':'); if (iColon >= 0 && rxClientName.exactMatch(sClientPort.left(iColon))) { QString sPort = qjackctlClientAlias::escapeRegExpDigits( sClientPort.right(sClientPort.length() - iColon - 1)); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } iClientPort++; } ::free(ppszClientPorts); } } // ALSA client plugs refreshner. void qjackctlSocketForm::updateAlsaPlugs ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegExp rxClientName(sClientName); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]); // Fill sequencer plugs... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); QString sClient = QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); if (iAlsaClient > 0 && rxClientName.exactMatch(sClient)) { snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { QString sPort = qjackctlClientAlias::escapeRegExpDigits( QString::fromUtf8(snd_seq_port_info_get_name(pPortInfo))); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } } } } #endif // CONFIG_ALSA_SEQ } // Update client list if available. void qjackctlSocketForm::clientNameChanged (void) { if (m_ppPixmaps == NULL) return; if (m_pSocketList == NULL) return; m_ui.PlugNameComboBox->clear(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: updateAlsaPlugs(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } if (m_iSocketNameChanged < 1) { // Find a new distinguishable socket name, please. QString sSocketName = m_ui.ClientNameComboBox->currentText(); if (!sSocketName.isEmpty()) { int iSocketNo = 0; QString sSocketMask = sSocketName; sSocketMask.remove(QRegExp("[ |0-9]+$")).append(" %1"); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (m_pSocketList->findSocket(sSocketName, iSocketType)); m_ui.SocketNameLineEdit->setText(sSocketName); m_iSocketNameChanged = 0; } } changed(); } // end of qjackctlSocketForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnectAlias.h0000644000000000000000000000012713215206021020000 xustar0029 mtime=1513425937.53176694 29 atime=1513425937.53176694 29 ctime=1513425937.53176694 qjackctl-0.5.0/src/qjackctlConnectAlias.h0000644000175000001440000000611613215206021020632 0ustar00rncbcusers00000000000000// qjackctlConnectAlias.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnectAlias_h #define __qjackctlConnectAlias_h #include #include #include // Client item alias map. class qjackctlClientAlias { public: // Constructor. qjackctlClientAlias (const QString& sClientName, const QString& sClientAlias = QString::null); // Default destructor. ~qjackctlClientAlias(); // Client name accessor. QString clientName() const; // Client name matcher. bool matchClientName(const QString& sClientName) const; // Client aliasing methods. const QString& clientAlias() const; void setClientAlias(const QString& sClientAlias); // Port aliasing methods. QString portAlias (const QString& sPortName) const; void setPortAlias (const QString& sPortName, const QString& sPortAlias); // Save client/port aliases definitions. void saveSettings(QSettings& settings, const QString& sClientKey); // Need for generid sort. bool operator< (const qjackctlClientAlias& other); // Escape and format a string as a regular expresion. static QString escapeRegExpDigits(const QString& s, int iThreshold = 3); private: // Client name regexp. QRegExp m_rxClientName; // Client alias. QString m_sClientAlias; // Port aliases map. QMap m_ports; }; // Client list alias map. class qjackctlConnectAlias : public QList { public: // Constructor. qjackctlConnectAlias (); // Default destructor. ~qjackctlConnectAlias (); // Client aliasing methods. QString clientAlias (const QString& sClientName); void setClientAlias (const QString& sClientName, const QString& sClientAlias); // Port aliasing methods. QString portAlias (const QString& sClientName, const QString& sPortName); void setPortAlias (const QString& sClientName, const QString& sPortName, const QString& sPortAlias); // Load/save aliases definitions. void loadSettings(QSettings& settings, const QString& sAliasesKey); void saveSettings(QSettings& settings, const QString& sAliasesKey); private: // Client item finder. qjackctlClientAlias *findClientName (const QString& sClientName); }; #endif // __qjackctlConnectAlias_h // end of qjackctlConnectAlias.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbay.h0000644000000000000000000000012713215206021017170 xustar0029 mtime=1513425937.53676694 29 atime=1513425937.53676694 29 ctime=1513425937.53676694 qjackctl-0.5.0/src/qjackctlPatchbay.h0000644000175000001440000002657313215206021020033 0ustar00rncbcusers00000000000000// qjackctlPatchbay.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbay_h #define __qjackctlPatchbay_h #include #include // Our external patchbay models. #include "qjackctlPatchbayRack.h" // QListViewItem::rtti return values. #define QJACKCTL_SOCKETITEM 2001 #define QJACKCTL_PLUGITEM 2002 // Forward declarations. class qjackctlPlugItem; class qjackctlSocketItem; class qjackctlSocketList; class qjackctlSocketListView; class qjackctlPatchworkView; class qjackctlPatchbayView; class qjackctlPatchbay; // Pixmap-set indexes. #define QJACKCTL_XPM_AUDIO_SOCKET 0 #define QJACKCTL_XPM_AUDIO_SOCKET_X 1 #define QJACKCTL_XPM_AUDIO_CLIENT 2 #define QJACKCTL_XPM_AUDIO_PLUG 3 #define QJACKCTL_XPM_MIDI_SOCKET 4 #define QJACKCTL_XPM_MIDI_SOCKET_X 5 #define QJACKCTL_XPM_MIDI_CLIENT 6 #define QJACKCTL_XPM_MIDI_PLUG 7 #define QJACKCTL_XPM_PIXMAPS 8 // Patchbay plug (port) list item. class qjackctlPlugItem : public QTreeWidgetItem { public: // Constructor. qjackctlPlugItem(qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter); // Default destructor. ~qjackctlPlugItem(); // Instance accessors. const QString& socketName() const; const QString& plugName() const; // Patchbay socket item accessor. qjackctlSocketItem *socket() const; private: // Instance variables. qjackctlSocketItem *m_pSocket; QString m_sPlugName; }; // Patchbay socket (client) list item. class qjackctlSocketItem : public QTreeWidgetItem { public: // Constructor. qjackctlSocketItem(qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType,qjackctlSocketItem *pSocketAfter); // Default destructor. ~qjackctlSocketItem(); // Instance accessors. const QString& socketName() const; const QString& clientName() const; int socketType() const; bool isExclusive() const; const QString& forward() const; void setSocketName (const QString& sSocketName); void setClientName (const QString& sClientName); void setSocketType (int iSocketType); void setExclusive (bool bExclusive); void setForward (const QString& sSocketForward); // Socket flags accessor. bool isReadable() const; // Connected plug list primitives. void addConnect(qjackctlSocketItem *pSocket); void removeConnect(qjackctlSocketItem *pSocket); // Connected plug finders. qjackctlSocketItem *findConnectPtr(qjackctlSocketItem *pSocketPtr); // Connection list accessor. const QList& connects() const; // Plug list primitive methods. void addPlug(qjackctlPlugItem *pPlug); void removePlug(qjackctlPlugItem *pPlug); // Plug finder. qjackctlPlugItem *findPlug(const QString& sPlugName); // Plug list accessor. QList& plugs(); // Plug list cleaner. void clear(); // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; // Update pixmap to its proper context. void updatePixmap(); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; private: // Instance variables. qjackctlSocketList *m_pSocketList; QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Plug (port) list. QList m_plugs; // Connection cache list. QList m_connects; }; // Patchbay socket (client) list. class qjackctlSocketList : public QObject { Q_OBJECT public: // Constructor. qjackctlSocketList(qjackctlSocketListView *pListView, bool bReadable); // Default destructor. ~qjackctlSocketList(); // Socket list primitive methods. void addSocket(qjackctlSocketItem *pSocket); void removeSocket(qjackctlSocketItem *pSocket); // Socket finder. qjackctlSocketItem *findSocket(const QString& sSocketName, int iSocketType); // List view accessor. qjackctlSocketListView *listView() const; // Socket flags accessor. bool isReadable() const; // Socket aesthetics accessors. const QString& socketCaption() const; // Socket list cleaner. void clear(); // Socket list accessor. QList& sockets(); // Find the current selected socket item in list. qjackctlSocketItem *selectedSocketItem() const; // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; public slots: // Socket item interactivity methods. bool addSocketItem(); bool removeSocketItem(); bool editSocketItem(); bool copySocketItem(); bool exclusiveSocketItem(); bool moveUpSocketItem(); bool moveDownSocketItem(); private: // Merge two pixmaps with union of respective masks. QPixmap *createPixmapMerge(const QPixmap& xpmDst, const QPixmap& xpmSrc); // Instance variables. qjackctlSocketListView *m_pListView; bool m_bReadable; QString m_sSocketCaption; QPixmap *m_apPixmaps[QJACKCTL_XPM_PIXMAPS]; QList m_sockets; }; //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. class qjackctlSocketListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlSocketListView(qjackctlPatchbayView *pPatchbayView, bool bReadable); // Default destructor. ~qjackctlSocketListView(); // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; protected slots: // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlPatchbayView *m_pPatchbayView; bool m_bReadable; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; }; //---------------------------------------------------------------------------- // qjackctlPatchworkView -- Socket plugging connector widget. class qjackctlPatchworkView : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchworkView(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchworkView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Legal socket item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawForwardLine(QPainter *pPainter, int x, int dx, int y1, int y2, int h); void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2); // Local instance variables. qjackctlPatchbayView *m_pPatchbayView; }; //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Patchbay integrated widget. class qjackctlPatchbayView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlPatchbayView(QWidget *pParent = 0); // Default destructor. ~qjackctlPatchbayView(); // Widget accesors. qjackctlSocketListView *OListView() { return m_pOListView; } qjackctlSocketListView *IListView() { return m_pIListView; } qjackctlPatchworkView *PatchworkView() { return m_pPatchworkView; } // Patchbay object binding methods. void setBinding(qjackctlPatchbay *pPatchbay); qjackctlPatchbay *binding() const; // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // Patchwork line style accessors. void setBezierLines(bool bBezierLines); bool isBezierLines() const; // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; signals: // Contents change signal. void contentsChanged(); public slots: // Common context menu slots. void contextMenu(const QPoint& pos, qjackctlSocketList *pSocketList); void activateForwardMenu(QAction *); private: // Child controls. qjackctlSocketListView *m_pOListView; qjackctlSocketListView *m_pIListView; qjackctlPatchworkView *m_pPatchworkView; // The main binding object. qjackctlPatchbay *m_pPatchbay; // How we'll draw patchwork lines. bool m_bBezierLines; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlPatchbay -- Patchbay integrated object. class qjackctlPatchbay : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbay(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchbay(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // External rack transfer methods. void loadRack(qjackctlPatchbayRack *pPatchbayRack); void saveRack(qjackctlPatchbayRack *pPatchbayRack); public slots: // Complete contents refreshner. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all socket items. void expandAll(); // Complete patchbay clearer. void clear(); // Do actual and complete connections snapshot. void connectionsSnapshot(); private: // Internal rack transfer methods. void loadRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); void saveRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); // Connect/Disconnection primitives. void connectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); void disconnectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); // Instance variables. qjackctlPatchbayView *m_pPatchbayView; qjackctlSocketList *m_pOSocketList; qjackctlSocketList *m_pISocketList; }; #endif // __qjackctlPatchbay_h // end of qjackctlPatchbay.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAboutForm.h0000644000000000000000000000012713215206021017333 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctlAboutForm.h0000644000175000001440000000302513215206021020161 0ustar00rncbcusers00000000000000// qjackctlAboutForm.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAboutForm_h #define __qjackctlAboutForm_h #include "ui_qjackctlAboutForm.h" //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. class qjackctlAboutForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlAboutForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlAboutForm(); public slots: void aboutQt(); private: // The Qt-designer UI struct... Ui::qjackctlAboutForm m_ui; }; #endif // __qjackctlAboutForm_h // end of qjackctlAboutForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMainForm.h0000644000000000000000000000012713215206021017145 xustar0029 mtime=1513425937.53476694 29 atime=1513425937.53476694 29 ctime=1513425937.53476694 qjackctl-0.5.0/src/qjackctlMainForm.h0000644000175000001440000002031013215206021017767 0ustar00rncbcusers00000000000000// qjackctlMainForm.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMainForm_h #define __qjackctlMainForm_h #include "ui_qjackctlMainForm.h" #include "qjackctlSetup.h" #include #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlSetup; class qjackctlSetupForm; class qjackctlMessagesStatusForm; class qjackctlSessionForm; class qjackctlConnectionsForm; class qjackctlPatchbayForm; class qjackctlPatchbayRack; class qjackctlPortItem; #ifdef CONFIG_SYSTEM_TRAY class qjackctlSystemTray; #endif class QSocketNotifier; class QSessionManager; #ifdef CONFIG_DBUS class QDBusInterface; class qjackctlDBusLogWatcher; #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. class qjackctlMainForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMainForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlMainForm(); static qjackctlMainForm *getInstance(); bool setup(qjackctlSetup * pSetup); jack_client_t *jackClient() const; snd_seq_t *alsaSeq() const; void appendMessages(const QString& s); bool isActivePatchbay(const QString& sPatchbayPath) const; void updateActivePatchbay(); void setActivePatchbay(const QString& sPatchbayPath); void setRecentPatchbays(const QStringList& patchbays); void stabilizeForm(); void stabilize(int msecs); void refreshXrunStats(); void refreshJackConnections(); void refreshAlsaConnections(); void refreshPatchbay(); void queryDisconnect( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType); void updateMessagesFont(); void updateMessagesLimit(); void updateMessagesLogging(); void updateConnectionsFont(); void updateConnectionsIconSize(); void updateJackClientPortAlias(); void updateJackClientPortMetadata(); void updateBezierLines(); void updateDisplayEffect(); void updateTimeDisplayFonts(); void updateTimeDisplayToolTips(); void updateTimeFormat(); void updateAliases(); void updateButtons(); #ifdef CONFIG_SYSTEM_TRAY void updateSystemTray(); #endif void showDirtySettingsWarning(); void showDirtySetupWarning(); public slots: void startJack(); void stopJack(); void toggleJack(); void resetXrunStats(); void commitData(QSessionManager& sm); protected slots: void readStdout(); void jackStarted(); void jackError(QProcess::ProcessError); void jackFinished(); void jackCleanup(); void jackStabilize(); void stdoutNotifySlot(int); void alsaNotifySlot(int); void timerSlot(); void jackConnectChanged(); void alsaConnectChanged(); void cableConnectSlot(const QString&, const QString&, unsigned int); void toggleMainForm(); void toggleMessagesStatusForm(); void toggleMessagesForm(); void toggleStatusForm(); void toggleSessionForm(); void toggleConnectionsForm(); void togglePatchbayForm(); void showSetupForm(); void showAboutForm(); void transportRewind(); void transportBackward(); void transportPlay(bool); void transportStart(); void transportStop(); void transportForward(); void contextMenu(const QPoint&); void activatePresetsMenu(QAction *); void activatePreset(const QString&); void activatePreset(int); void quitMainForm(); protected: bool queryClose(); void closeEvent(QCloseEvent * pCloseEvent); void customEvent(QEvent *pEvent); void appendStdoutBuffer(const QString&); void flushStdoutBuffer(); bool stdoutBlock(int fd, bool bBlock) const; QString formatExitStatus(int iExitStatus) const; void shellExecute(const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage); void stopJackServer(); QString& detectXrun(QString& s); void updateXrunStats(float fXrunLast); void appendMessagesColor(const QString& s, const QString& c); void appendMessagesText(const QString& s); void appendMessagesError(const QString& s); void updateXrunCount(); QString formatTime(float secs) const; QString formatElapsedTime(int iStatusItem, const QTime& t, bool bElapsed) const; void updateElapsedTimes(); void portNotifyEvent(); void xrunNotifyEvent(); void buffNotifyEvent(); void shutNotifyEvent(); void exitNotifyEvent(); #ifdef CONFIG_JACK_METADATA void propNotifyEvent(); #endif void startJackClientDelay(); bool startJackClient(bool bDetach); void stopJackClient(); void refreshConnections(); void refreshStatus(); void updateStatusItem(int iStatusItem, const QString& sText); void updateTitleStatus(); void updateServerState(int iState); void contextMenuEvent(QContextMenuEvent *); void mousePressEvent(QMouseEvent *pMouseEvent); #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values // from current selected preset options. void setDBusParameters(); // D-BUS: Set parameter values (with reset option). bool setDBusEngineParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusDriverParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusParameter( const QStringList& path, const QVariant& value, bool bSet = true); // D-BUS: Reset parameter (to default) values. bool resetDBusEngineParameter(const QString& param); bool resetDBusDriverParameter(const QString& param); bool resetDBusParameter(const QStringList& path); // D-BUS: Set parameter values. QVariant getDBusEngineParameter(const QString& param); QVariant getDBusDriverParameter(const QString& param); QVariant getDBusParameter(const QStringList& path); #endif // Quotes string with embedded whitespace. QString formatQuoted(const QString& s) const; // Guarded transport play/pause toggle. void transportPlayStatus(bool bOn); private: // The Qt-designer UI struct... Ui::qjackctlMainForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QProcess *m_pJack; int m_iServerState; jack_client_t *m_pJackClient; bool m_bJackDetach; bool m_bJackShutdown; bool m_bJackStopped; snd_seq_t *m_pAlsaSeq; #ifdef CONFIG_DBUS QDBusInterface *m_pDBusControl; QDBusInterface *m_pDBusConfig; qjackctlDBusLogWatcher *m_pDBusLogWatcher; bool m_bDBusStarted; #endif int m_iStartDelay; int m_iTimerDelay; int m_iTimerRefresh; int m_iJackRefresh; int m_iAlsaRefresh; int m_iJackDirty; int m_iAlsaDirty; int m_iStatusBlink; int m_iStatusRefresh; int m_iPatchbayRefresh; #ifdef CONFIG_JACK_METADATA int m_iJackPropertyChange; #endif QSocketNotifier *m_pStdoutNotifier; QSocketNotifier *m_pAlsaNotifier; int m_iXrunCallbacks; int m_iXrunSkips; int m_iXrunStats; int m_iXrunCount; float m_fXrunTotal; float m_fXrunMax; float m_fXrunMin; float m_fXrunLast; QTime m_tXrunLast; QTime m_tResetLast; qjackctlMessagesStatusForm *m_pMessagesStatusForm; qjackctlSessionForm *m_pSessionForm; qjackctlConnectionsForm *m_pConnectionsForm; qjackctlPatchbayForm *m_pPatchbayForm; qjackctlSetupForm *m_pSetupForm; qjackctlPatchbayRack *m_pPatchbayRack; qjackctlPreset m_preset; QString m_sStdoutBuffer; QString m_sTimeDashes; QString m_sJackCmdLine; #ifdef CONFIG_SYSTEM_TRAY qjackctlSystemTray *m_pSystemTray; bool m_bQuitClose; #endif bool m_bQuitForce; float m_fSkipAccel; int m_iTransportPlay; // Kind-of singleton reference. static qjackctlMainForm *g_pMainForm; }; #endif // __qjackctlMainForm_h // end of qjackctlMainForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctl.qrc0000644000000000000000000000012713215206021016052 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctl.qrc0000644000175000001440000000667013215206021016711 0ustar00rncbcusers00000000000000 images/qjackctl.png images/about1.png images/accept1.png images/aclienti.png images/aclienti_32x32.png images/aclienti_64x64.png images/acliento.png images/acliento_32x32.png images/acliento_64x64.png images/add1.png images/aportlni.png images/aportlni_32x32.png images/aportlni_64x64.png images/aportlno.png images/aportlno_32x32.png images/aportlno_64x64.png images/aportlti.png images/aportlti_32x32.png images/aportlti_64x64.png images/aportlto.png images/aportlto_32x32.png images/aportlto_64x64.png images/aportpni.png images/aportpni_32x32.png images/aportpni_64x64.png images/aportpno.png images/aportpno_32x32.png images/aportpno_64x64.png images/aportpti.png images/aportpti_32x32.png images/aportpti_64x64.png images/aportpto.png images/aportpto_32x32.png images/aportpto_64x64.png images/apply1.png images/asocketi.png images/asocketo.png images/backward1.png images/client1.png images/connect1.png images/connections1.png images/copy1.png images/device1.png images/disconnect1.png images/disconnectall1.png images/displaybg1.png images/down1.png images/edit1.png images/expandall1.png images/forward1.png images/error1.png images/mclienti.png images/mclienti_32x32.png images/mclienti_64x64.png images/mcliento.png images/mcliento_32x32.png images/mcliento_64x64.png images/messages1.png images/messagesstatus1.png images/mporti.png images/mporti_32x32.png images/mporti_64x64.png images/mporto.png images/mporto_32x32.png images/mporto_64x64.png images/msocketi.png images/msocketo.png images/new1.png images/open1.png images/patchbay1.png images/pause1.png images/play1.png images/port1.png images/quit1.png images/refresh1.png images/remove1.png images/reset1.png images/rewind1.png images/save1.png images/session1.png images/setup1.png images/socket1.png images/start1.png images/status1.png images/stop1.png images/up1.png images/xactivating1.png images/xactive1.png images/xinactive1.png images/xsocket1.png images/xstarted1.png images/xstarting1.png images/xstopped1.png images/xstopping1.png images/qtlogo1.png qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbay.cpp0000644000000000000000000000012713215206021017523 xustar0029 mtime=1513425937.53676694 29 atime=1513425937.53576694 29 ctime=1513425937.53676694 qjackctl-0.5.0/src/qjackctlPatchbay.cpp0000644000175000001440000014657713215206021020375 0ustar00rncbcusers00000000000000// qjackctlPatchbay.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbay.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #include #endif // Interactivity socket form. #include "qjackctlSocketForm.h" // External patchbay loader. #include "qjackctlPatchbayFile.h" //---------------------------------------------------------------------- // class qjackctlPlugItem -- Socket plug list item. // // Constructor. qjackctlPlugItem::qjackctlPlugItem ( qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter ) : QTreeWidgetItem(pSocket, pPlugAfter, QJACKCTL_PLUGITEM) { QTreeWidgetItem::setText(0, sPlugName); m_pSocket = pSocket; m_sPlugName = sPlugName; m_pSocket->plugs().append(this); int iPixmap; if (pSocket->socketType() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) iPixmap = QJACKCTL_XPM_AUDIO_PLUG; else iPixmap = QJACKCTL_XPM_MIDI_PLUG; QTreeWidgetItem::setIcon(0, QIcon(pSocket->pixmap(iPixmap))); QTreeWidgetItem::setFlags(QTreeWidgetItem::flags() & ~Qt::ItemIsSelectable); } // Default destructor. qjackctlPlugItem::~qjackctlPlugItem (void) { int iPlug = m_pSocket->plugs().indexOf(this); if (iPlug >= 0) m_pSocket->plugs().removeAt(iPlug); } // Instance accessors. const QString& qjackctlPlugItem::socketName (void) const { return m_pSocket->socketName(); } const QString& qjackctlPlugItem::plugName (void) const { return m_sPlugName; } // Patchbay socket item accessor. qjackctlSocketItem *qjackctlPlugItem::socket (void) const { return m_pSocket; } //---------------------------------------------------------------------- // class qjackctlSocketItem -- Jack client list item. // // Constructor. qjackctlSocketItem::qjackctlSocketItem ( qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType, qjackctlSocketItem *pSocketAfter ) : QTreeWidgetItem(pSocketList->listView(), pSocketAfter, QJACKCTL_SOCKETITEM) { QTreeWidgetItem::setText(0, sSocketName); m_pSocketList = pSocketList; m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); m_pSocketList->sockets().append(this); updatePixmap(); } // Default destructor. qjackctlSocketItem::~qjackctlSocketItem (void) { QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); m_plugs.clear(); int iSocket = m_pSocketList->sockets().indexOf(this); if (iSocket >= 0) m_pSocketList->sockets().removeAt(iSocket); } // Instance accessors. const QString& qjackctlSocketItem::socketName (void) const { return m_sSocketName; } const QString& qjackctlSocketItem::clientName (void) const { return m_sClientName; } int qjackctlSocketItem::socketType (void) const { return m_iSocketType; } bool qjackctlSocketItem::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlSocketItem::forward (void) const { return m_sSocketForward; } void qjackctlSocketItem::setSocketName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlSocketItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlSocketItem::setSocketType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlSocketItem::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlSocketItem::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Socket flags accessor. bool qjackctlSocketItem::isReadable (void) const { return m_pSocketList->isReadable(); } // Plug finder. qjackctlPlugItem *qjackctlSocketItem::findPlug ( const QString& sPlugName ) { QListIterator iter(m_plugs); while (iter.hasNext()) { qjackctlPlugItem *pPlug = iter.next(); if (sPlugName == pPlug->plugName()) return pPlug; } return NULL; } // Plug list accessor. QList& qjackctlSocketItem::plugs (void) { return m_plugs; } // Connected socket list primitives. void qjackctlSocketItem::addConnect( qjackctlSocketItem *pSocket ) { m_connects.append(pSocket); } void qjackctlSocketItem::removeConnect( qjackctlSocketItem *pSocket ) { int iSocket = m_connects.indexOf(pSocket); if (iSocket >= 0) m_connects.removeAt(iSocket); } // Connected socket finder. qjackctlSocketItem *qjackctlSocketItem::findConnectPtr ( qjackctlSocketItem *pSocketPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (pSocketPtr == pSocket) return pSocket; } return NULL; } // Connection cache list accessor. const QList& qjackctlSocketItem::connects (void) const { return m_connects; } // Plug list cleaner. void qjackctlSocketItem::clear (void) { qDeleteAll(m_plugs); m_plugs.clear(); } // Socket item pixmap peeker. const QPixmap& qjackctlSocketItem::pixmap ( int iPixmap ) const { return m_pSocketList->pixmap(iPixmap); } // Update pixmap to its proper context. void qjackctlSocketItem::updatePixmap (void) { int iPixmap; if (m_iSocketType == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { iPixmap = (m_bExclusive ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); } else { iPixmap = (m_bExclusive ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); } QTreeWidgetItem::setIcon(0, QIcon(pixmap(iPixmap))); } // Socket item openness status. void qjackctlSocketItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlSocketItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } //---------------------------------------------------------------------- // qjackctlSocketList -- Jack client list. // // Constructor. qjackctlSocketList::qjackctlSocketList ( qjackctlSocketListView *pListView, bool bReadable ) { QPixmap pmXSocket1(":/images/xsocket1.png"); m_pListView = pListView; m_bReadable = bReadable; if (bReadable) { m_sSocketCaption = tr("Output"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketo.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/acliento.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlno.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketo.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mcliento.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporto.png"); } else { m_sSocketCaption = tr("Input"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketi.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/aclienti.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlni.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketi.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mclienti.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporti.png"); } if (!m_sSocketCaption.isEmpty()) m_sSocketCaption += ' '; m_sSocketCaption += tr("Socket"); } // Default destructor. qjackctlSocketList::~qjackctlSocketList (void) { clear(); for (int iPixmap = 0; iPixmap < QJACKCTL_XPM_PIXMAPS; iPixmap++) delete m_apPixmaps[iPixmap]; } // Client finder. qjackctlSocketItem *qjackctlSocketList::findSocket ( const QString& sSocketName, int iSocketType ) { QListIterator iter(m_sockets); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (sSocketName == pSocket->socketName() && iSocketType == pSocket->socketType()) return pSocket; } return NULL; } // Socket list accessor. QList& qjackctlSocketList::sockets (void) { return m_sockets; } // List view accessor. qjackctlSocketListView *qjackctlSocketList::listView (void) const { return m_pListView; } // Socket flags accessor. bool qjackctlSocketList::isReadable (void) const { return m_bReadable; } // Socket caption titler. const QString& qjackctlSocketList::socketCaption (void) const { return m_sSocketCaption; } // Socket list cleaner. void qjackctlSocketList::clear (void) { qDeleteAll(m_sockets); m_sockets.clear(); } // Socket list pixmap peeker. const QPixmap& qjackctlSocketList::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Merge two pixmaps with union of respective masks. QPixmap *qjackctlSocketList::createPixmapMerge ( const QPixmap& xpmDst, const QPixmap& xpmSrc ) { QPixmap *pXpmMerge = new QPixmap(xpmDst); if (pXpmMerge) { QBitmap bmMask = xpmDst.mask(); QPainter(&bmMask).drawPixmap(0, 0, xpmSrc.mask()); pXpmMerge->setMask(bmMask); QPainter(pXpmMerge).drawPixmap(0, 0, xpmSrc); } return pXpmMerge; } // Return currently selected socket item. qjackctlSocketItem *qjackctlSocketList::selectedSocketItem (void) const { qjackctlSocketItem *pSocketItem = NULL; QTreeWidgetItem *pItem = m_pListView->currentItem(); if (pItem) { if (pItem->type() == QJACKCTL_PLUGITEM) { pSocketItem = static_cast (pItem->parent()); } else { pSocketItem = static_cast (pItem); } } return pSocketItem; } // Add a new socket item, using interactive form. bool qjackctlSocketList::addSocketItem (void) { bool bResult = false; qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(tr(" - %1").arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(m_sSocketCaption + ' ' + QString::number(m_sockets.count() + 1), QString::null, QJACKCTL_SOCKETTYPE_JACK_AUDIO); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); qjackctlSocketItem *pSocketItem = selectedSocketItem(); // m_pListView->setUpdatesEnabled(false); if (pSocketItem) pSocketItem->setSelected(false); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); } return bResult; } // Remove (delete) currently selected socket item. bool qjackctlSocketList::removeSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { if (QMessageBox::warning(m_pListView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("%1 about to be removed:\n\n" "\"%2\"\n\nAre you sure?") .arg(m_sSocketCaption) .arg(pSocketItem->socketName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { delete pSocketItem; bResult = true; m_pListView->setDirty(true); } } return bResult; } // View or change the properties of currently selected socket item. bool qjackctlSocketList::editSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(pSocketItem->socketName() + " - " + m_sSocketCaption); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(false); qjackctlPatchbaySocket socket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); socket.setExclusive(pSocketItem->isExclusive()); socket.setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); socketForm.setConnectCount(pSocketItem->connects().count()); if (socketForm.exec()) { socketForm.save(&socket); // m_pListView->setUpdatesEnabled(false); pSocketItem->clear(); pSocketItem->setText(0, socket.name()); pSocketItem->setSocketName(socket.name()); pSocketItem->setClientName(socket.clientName()); pSocketItem->setSocketType(socket.type()); pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); bResult = true; } } return bResult; } // Duplicate and change the properties of currently selected socket item. bool qjackctlSocketList::copySocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); // Find a new distinguishable socket name, please. int iSocketNo = 1; QString sSocketName = pSocketItem->socketName();; QString sSocketMask = sSocketName; sSocketMask.remove(QRegExp("[ |0-9]+$")).append(" %1"); const int iSocketType = pSocketItem->socketType(); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (findSocket(sSocketName, iSocketType)); // Show up as a new socket... socketForm.setWindowTitle(tr("%1 - %2") .arg(pSocketItem->socketName()).arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(sSocketName, pSocketItem->clientName(), iSocketType); if (pSocketItem->isExclusive()) socket.setExclusive(true); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); } } return bResult; } // Toggle exclusive currently selected socket item. bool qjackctlSocketList::exclusiveSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { pSocketItem->setExclusive(!pSocketItem->isExclusive()); pSocketItem->updatePixmap(); bResult = true; m_pListView->setDirty(true); } return bResult; } // Move current selected socket item up one position. bool qjackctlSocketList::moveUpSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); if (iItem > 0) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem - 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } // Move current selected socket item down one position. bool qjackctlSocketList::moveDownSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); int iItemCount = m_pListView->topLevelItemCount(); if (iItem < iItemCount - 1) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem + 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. // Constructor. qjackctlSocketListView::qjackctlSocketListView ( qjackctlPatchbayView *pPatchbayView, bool bReadable ) : QTreeWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; m_bReadable = bReadable; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = NULL; m_pDropItem = NULL; QHeaderView *pHeader = QTreeWidget::header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif // pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(false); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QString sText; if (m_bReadable) sText = tr("Output Sockets / Plugs"); else sText = tr("Input Sockets / Plugs"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::setToolTip(sText); setAutoOpenTimeout(800); } // Default destructor. qjackctlSocketListView::~qjackctlSocketListView (void) { setAutoOpenTimeout(0); } // Patchbay view dirty flag accessors. void qjackctlSocketListView::setDirty ( bool bDirty ) { m_pPatchbayView->setDirty(bDirty); } bool qjackctlSocketListView::dirty (void) const { return m_pPatchbayView->dirty(); } // Auto-open timeout method. void qjackctlSocketListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = NULL; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlSocketListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Auto-open timer slot. void qjackctlSocketListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (m_pDropItem); if (pSocketItem && !pSocketItem->isOpen()) pSocketItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlSocketListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem) { QToolTip::showText(pHelpEvent->globalPos(), pSocketItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PLUGITEM) { qjackctlPlugItem *pPlugItem = static_cast (pItem); if (pPlugItem) { QToolTip::showText(pHelpEvent->globalPos(), pPlugItem->plugName(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlSocketListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pPatchbay == NULL || !pPatchbay->canConnectSelected()) pItem = NULL; } } else { m_pDropItem = NULL; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlSocketListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && dragDropItem(pDragEnterEvent->pos())) { pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlSocketListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && dragDropItem(pDragMoveEvent->pos())) { pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlSocketListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlSocketListView::dropEvent ( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && dragDropItem(pDropEvent->pos())) { const QString sText = pDropEvent->mimeData()->text(); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if (!sText.isEmpty() && pPatchbay) pPatchbay->connectSelected(); } dragLeaveEvent(NULL); } // Handle mouse events for drag-and-drop stuff. void qjackctlSocketListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlSocketListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->start(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = NULL; } } // Context menu request event handler. void qjackctlSocketListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu( pContextMenuEvent->globalPos(), (m_bReadable ? m_pPatchbayView->OSocketList() : m_pPatchbayView->ISocketList()) ); } //---------------------------------------------------------------------- // qjackctlPatchworkView -- Socket connector widget. // // Constructor. qjackctlPatchworkView::qjackctlPatchworkView ( qjackctlPatchbayView *pPatchbayView ) : QWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlPatchworkView::~qjackctlPatchworkView (void) { } // Legal socket item position helper. int qjackctlPatchworkView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlSocketItem *pSocketItem = NULL; if (pParent && pParent->type() == QJACKCTL_SOCKETITEM) pSocketItem = static_cast (pParent); if (pSocketItem && !pSocketItem->isOpen()) { rect = pList->visualItemRect(pParent); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible socket connection relation lines void qjackctlPatchworkView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2 ) { // Account for list view headers. y1 += h1; y2 += h2; // Invisible output plugs don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // How do we'll draw it? if (m_pPatchbayView->isBezierLines()) { // Setup control points QPolygon spline(4); int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pPainter->pen()); } // Old style... else pPainter->drawLine(x1 + 4, y1, x2 - 4, y2); // Invisible input plugs don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw socket forwrading line (for input sockets / right pane only) void qjackctlPatchworkView::drawForwardLine ( QPainter *pPainter, int x, int dx, int y1, int y2, int h ) { // Account for list view headers. y1 += h; y2 += h; dx += 4; // Draw it... if (y1 < y2) { pPainter->drawLine(x - dx, y1 + 4, x, y1); pPainter->drawLine(x - dx, y1 + 4, x - dx, y2 - 4); pPainter->drawLine(x - dx, y2 - 4, x, y2); // Down arrow... pPainter->drawLine(x - dx, y2 - 8, x - dx - 2, y2 - 12); pPainter->drawLine(x - dx, y2 - 8, x - dx + 2, y2 - 12); } else { pPainter->drawLine(x - dx, y1 - 4, x, y1); pPainter->drawLine(x - dx, y1 - 4, x - dx, y2 + 4); pPainter->drawLine(x - dx, y2 + 4, x, y2); // Up arrow... pPainter->drawLine(x - dx, y2 + 8, x - dx - 2, y2 + 12); pPainter->drawLine(x - dx, y2 + 8, x - dx + 2, y2 + 12); } } // Draw visible socket connection relation arrows. void qjackctlPatchworkView::paintEvent ( QPaintEvent * ) { if (m_pPatchbayView->OSocketList() == NULL || m_pPatchbayView->ISocketList() == NULL) return; QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int i, rgb[3] = { 0x99, 0x66, 0x33 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (i = 0; i < 3; ++i) rgb[i] += 0x33; // Initialize color changer. i = 0; // Almost constants. x1 = 0; x2 = width(); h1 = ((m_pPatchbayView->OListView())->header())->sizeHint().height(); h2 = ((m_pPatchbayView->IListView())->header())->sizeHint().height(); // For each client item... qjackctlSocketItem *pOSocket, *pISocket; QListIterator osocket( (m_pPatchbayView->OSocketList())->sockets()); while (osocket.hasNext()) { pOSocket = osocket.next(); // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pOSocket); // Get input socket connections... QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) { pISocket = isocket.next(); // Obviously, there is a connection from pOPlug to pIPlug items: y2 = itemY(pISocket); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2); } } // Look for forwarded inputs... QList iforwards; // Make a local copy of just the forwarding socket list, if any... QListIterator isocket( (m_pPatchbayView->ISocketList())->sockets()); while (isocket.hasNext()) { pISocket = isocket.next(); // Check if its forwarded... if (pISocket->forward().isEmpty()) continue; iforwards.append(pISocket); } // (Re)initialize color changer. i = 0; // Now traverse those for proper connection drawing... int dx = 0; QListIterator iter(iforwards); while (iter.hasNext()) { pISocket = iter.next(); qjackctlSocketItem *pISocketForward = m_pPatchbayView->ISocketList()->findSocket( pISocket->forward(), pISocket->socketType()); if (pISocketForward == NULL) continue; // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pISocketForward); y2 = itemY(pISocket); drawForwardLine(&painter, x2, dx, y1, y2, h2); dx += 2; } } // Context menu request event handler. void qjackctlPatchworkView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu(pContextMenuEvent->globalPos(), NULL); } // Widget event slots... void qjackctlPatchworkView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Integrated patchbay widget. // Constructor. qjackctlPatchbayView::qjackctlPatchbayView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlSocketListView(this, true); m_pPatchworkView = new qjackctlPatchworkView(this); m_pIListView = new qjackctlSocketListView(this, false); m_pPatchbay = NULL; m_bBezierLines = false; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlPatchbayView::~qjackctlPatchbayView (void) { } // Common context menu slot. void qjackctlPatchbayView::contextMenu ( const QPoint& pos, qjackctlSocketList *pSocketList ) { qjackctlPatchbay *pPatchbay = binding(); if (pPatchbay == NULL) return; QMenu menu(this); QAction *pAction; if (pSocketList) { qjackctlSocketItem *pSocketItem = pSocketList->selectedSocketItem(); bool bEnabled = (pSocketItem != NULL); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("Add..."), pSocketList, SLOT(addSocketItem())); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit..."), pSocketList, SLOT(editSocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/copy1.png"), tr("Copy..."), pSocketList, SLOT(copySocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), pSocketList, SLOT(removeSocketItem())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction( tr("Exclusive"), pSocketList, SLOT(exclusiveSocketItem())); pAction->setCheckable(true); pAction->setChecked(bEnabled && pSocketItem->isExclusive()); pAction->setEnabled(bEnabled && (pSocketItem->connects().count() < 2)); // Construct the forwarding menu, // overriding the last one, if any... QMenu *pForwardMenu = menu.addMenu(tr("Forward")); // Assume sockets iteration follows item index order (0,1,2...) // and remember that we only do this for input sockets... int iIndex = 0; if (pSocketItem && pSocketList == ISocketList()) { QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... int iSocketType = pISocket->socketType(); if (iSocketType != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; int iPixmap = 0; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: case QJACKCTL_SOCKETTYPE_ALSA_MIDI: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); break; } pAction = pForwardMenu->addAction( QIcon(ISocketList()->pixmap(iPixmap)), sSocketName); pAction->setChecked(pSocketItem->forward() == sSocketName); pAction->setData(iIndex); iIndex++; } // Null forward always present, // and has invalid index parameter (-1)... if (iIndex > 0) pForwardMenu->addSeparator(); pAction = pForwardMenu->addAction(tr("(None)")); pAction->setCheckable(true); pAction->setChecked(pSocketItem->forward().isEmpty()); pAction->setData(-1); // We have something here... QObject::connect(pForwardMenu, SIGNAL(triggered(QAction*)), SLOT(activateForwardMenu(QAction*))); } pForwardMenu->setEnabled(iIndex > 0); menu.addSeparator(); int iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); int iItemCount = (pSocketList->listView())->topLevelItemCount(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), pSocketList, SLOT(moveUpSocketItem())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), pSocketList, SLOT(moveDownSocketItem())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.addSeparator(); } pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pPatchbay, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pPatchbay->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pPatchbay, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pPatchbay->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pPatchbay, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pPatchbay->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pPatchbay, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pos); } // Select the forwarding socket name from context menu. void qjackctlPatchbayView::activateForwardMenu ( QAction *pAction ) { int iIndex = pAction->data().toInt(); // Get currently input socket (assume its nicely selected) qjackctlSocketItem *pSocketItem = ISocketList()->selectedSocketItem(); if (pSocketItem) { // Check first for forward from nil... if (iIndex < 0) { pSocketItem->setForward(QString::null); setDirty(true); return; } // Hopefully, its a real socket about to be forwraded... QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... if (pISocket->socketType() != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; if (iIndex == 0) { pSocketItem->setForward(sSocketName); setDirty(true); break; } --iIndex; } } } // Patchbay binding methods. void qjackctlPatchbayView::setBinding ( qjackctlPatchbay *pPatchbay ) { m_pPatchbay = pPatchbay; } qjackctlPatchbay *qjackctlPatchbayView::binding (void) const { return m_pPatchbay; } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbayView::OSocketList (void) const { if (m_pPatchbay) return m_pPatchbay->OSocketList(); else return NULL; } qjackctlSocketList *qjackctlPatchbayView::ISocketList (void) const { if (m_pPatchbay) return m_pPatchbay->ISocketList(); else return NULL; } // Patchwork line style accessors. void qjackctlPatchbayView::setBezierLines ( bool bBezierLines ) { m_bBezierLines = bBezierLines; } bool qjackctlPatchbayView::isBezierLines (void) const { return m_bBezierLines; } // Dirty flag methods. void qjackctlPatchbayView::setDirty ( bool bDirty ) { m_bDirty = bDirty; if (bDirty) emit contentsChanged(); } bool qjackctlPatchbayView::dirty (void) const { return m_bDirty; } //---------------------------------------------------------------------- // qjackctlPatchbay -- Output-to-Input client/plugs connection object. // // Constructor. qjackctlPatchbay::qjackctlPatchbay ( qjackctlPatchbayView *pPatchbayView ) { m_pPatchbayView = pPatchbayView; m_pOSocketList = new qjackctlSocketList(m_pPatchbayView->OListView(), true); m_pISocketList = new qjackctlSocketList(m_pPatchbayView->IListView(), false); m_pPatchbayView->setBinding(this); } // Default destructor. qjackctlPatchbay::~qjackctlPatchbay (void) { m_pPatchbayView->setBinding(NULL); delete m_pOSocketList; m_pOSocketList = NULL; delete m_pISocketList; m_pISocketList = NULL; (m_pPatchbayView->PatchworkView())->update(); } // Connection primitive. void qjackctlPatchbay::connectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) == NULL) { pOSocket->addConnect(pISocket); pISocket->addConnect(pOSocket); } } // Disconnection primitive. void qjackctlPatchbay::disconnectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) != NULL) { pOSocket->removeConnect(pISocket); pISocket->removeConnect(pOSocket); } } // Test if selected plugs are connectable. bool qjackctlPatchbay::canConnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... return (pOSocket->findConnectPtr(pISocket) == NULL); } // Connect current selected plugs. bool qjackctlPatchbay::connectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... connectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if selected plugs are disconnectable. bool qjackctlPatchbay::canDisconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; return (pOSocket->findConnectPtr(pISocket) != 0); } // Disconnect current selected plugs. bool qjackctlPatchbay::disconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (!pOItem) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (!pIItem) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // One-to-one disconnection... disconnectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if any plug is disconnectable. bool qjackctlPatchbay::canDisconnectAll (void) { QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); if (pOSocket->connects().count() > 0) return true; } return false; } // Disconnect all plugs. bool qjackctlPatchbay::disconnectAll (void) { if (QMessageBox::warning(m_pPatchbayView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This will disconnect all sockets.\n\n" "Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) disconnectSockets(pOSocket, isocket.next()); } // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Expand all socket items. void qjackctlPatchbay::expandAll (void) { (m_pOSocketList->listView())->expandAll(); (m_pISocketList->listView())->expandAll(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents rebuilder. void qjackctlPatchbay::refresh (void) { (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents clearer. void qjackctlPatchbay::clear (void) { // Clear socket lists. m_pOSocketList->clear(); m_pISocketList->clear(); // Reset dirty flag. m_pPatchbayView->setDirty(false); // May refresh everything. refresh(); } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbay::OSocketList (void) const { return m_pOSocketList; } qjackctlSocketList *qjackctlPatchbay::ISocketList (void) const { return m_pISocketList; } // External rack transfer method: copy patchbay structure from master rack model. void qjackctlPatchbay::loadRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { pSocketList->clear(); qjackctlSocketItem *pSocketItem = NULL; QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); pSocketItem = new qjackctlSocketItem(pSocketList, pSocket->name(), pSocket->clientName(), pSocket->type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(pSocket->isExclusive()); pSocketItem->setForward(pSocket->forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } } } } void qjackctlPatchbay::loadRack ( qjackctlPatchbayRack *pPatchbayRack ) { (m_pOSocketList->listView())->setUpdatesEnabled(false); (m_pISocketList->listView())->setUpdatesEnabled(false); // Load ouput sockets. loadRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Load input sockets. loadRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to load from cable model. QListIterator iter(pPatchbayRack->cablelist()); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); // Get proper sockets... qjackctlPatchbaySocket *pOSocket = pCable->outputSocket(); qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); if (pOSocket && pISocket) { qjackctlSocketItem *pOSocketItem = m_pOSocketList->findSocket(pOSocket->name(), pOSocket->type()); qjackctlSocketItem *pISocketItem = m_pISocketList->findSocket(pISocket->name(), pISocket->type()); if (pOSocketItem && pISocketItem) connectSockets(pOSocketItem, pISocketItem); } } (m_pOSocketList->listView())->setUpdatesEnabled(true); (m_pISocketList->listView())->setUpdatesEnabled(true); (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); // Reset dirty flag. m_pPatchbayView->setDirty(false); } // External rack transfer method: copy patchbay structure into master rack model. void qjackctlPatchbay::saveRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { // Have QTreeWidget item order into account: qjackctlSocketListView *pListView = pSocketList->listView(); if (pListView == NULL) return; socketlist.clear(); const int iItemCount = pListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_SOCKETITEM) continue; qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem == NULL) continue; qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); if (pSocket) { pSocket->setExclusive(pSocketItem->isExclusive()); pSocket->setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) pSocket->pluglist().append((iter.next())->plugName()); socketlist.append(pSocket); } } } void qjackctlPatchbay::saveRack ( qjackctlPatchbayRack *pPatchbayRack ) { // Save ouput sockets. saveRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Save input sockets. saveRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to save into cable model. pPatchbayRack->cablelist().clear(); // Start from output sockets... QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocketItem = osocket.next(); // Then to input sockets... QListIterator isocket(pOSocketItem->connects()); while (isocket.hasNext()) { qjackctlSocketItem *pISocketItem = isocket.next(); // Now find proper racked sockets... qjackctlPatchbaySocket *pOSocket = pPatchbayRack->findSocket( pPatchbayRack->osocketlist(), pOSocketItem->socketName()); qjackctlPatchbaySocket *pISocket = pPatchbayRack->findSocket( pPatchbayRack->isocketlist(), pISocketItem->socketName()); if (pOSocket && pISocket) { pPatchbayRack->addCable( new qjackctlPatchbayCable(pOSocket, pISocket)); } } } // Reset dirty flag. m_pPatchbayView->setDirty(false); } // Connections snapshot. void qjackctlPatchbay::connectionsSnapshot (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; qjackctlPatchbayRack rack; rack.connectJackSnapshot(pMainForm->jackClient()); rack.connectAlsaSnapshot(pMainForm->alsaSeq()); loadRack(&rack); // Set dirty flag. m_pPatchbayView->setDirty(true); } // end of qjackctlPatchbay.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnect.h0000644000000000000000000000012713215206021017026 xustar0029 mtime=1513425937.53176694 29 atime=1513425937.53176694 29 ctime=1513425937.53176694 qjackctl-0.5.0/src/qjackctlConnect.h0000644000175000001440000003220013215206021017651 0ustar00rncbcusers00000000000000// qjackctlConnect.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnect_h #define __qjackctlConnect_h #include "qjackctlConnectAlias.h" #include #include // QListViewItem::rtti return values. #define QJACKCTL_CLIENTITEM 1001 #define QJACKCTL_PORTITEM 1002 // Forward declarations. class qjackctlPortItem; class qjackctlClientItem; class qjackctlClientList; class qjackctlClientListView; class qjackctlConnectorView; class qjackctlConnectView; class qjackctlConnect; // Port list item. class qjackctlPortItem : public QTreeWidgetItem { public: // Constructor. qjackctlPortItem(qjackctlClientItem *pClient); // Default destructor. virtual ~qjackctlPortItem(); // Instance accessors. void setPortName(const QString& sPortName); const QString& clientName() const; const QString& portName() const; // Port name alias accessors. void setPortNameAlias(const QString& sPortNameAlias); QString portNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name accessors. virtual void updatePortName(bool bRename = false); // Tooltip text building. virtual QString tooltip() const; // Complete client:port name helper. QString clientPortName() const; // Connections client item method. qjackctlClientItem *client() const; // Client port cleanup marker. void markPort(int iMark); void markClientPort(int iMark); int portMark() const; // Connected port list primitives. void addConnect(qjackctlPortItem *pPort); void removeConnect(qjackctlPortItem *pPort); // Connected port finders. qjackctlPortItem *findConnect(const QString& sClientPortName); qjackctlPortItem *findConnectPtr(qjackctlPortItem *pPortPtr); // Connection list accessor. const QList& connects() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Port name display name accessors. void setPortText(const QString& sPortText, bool bRenameEnabled); QString portText() const; private: // Instance variables. qjackctlClientItem *m_pClient; QString m_sPortName; int m_iPortMark; bool m_bHilite; // Connection cache list. QList m_connects; }; // Client list item. class qjackctlClientItem : public QTreeWidgetItem { public: // Constructor. qjackctlClientItem(qjackctlClientList *pClientList); // Default destructor. virtual ~qjackctlClientItem(); // Port list primitive methods. void addPort(qjackctlPortItem *pPort); void removePort(qjackctlPortItem *pPort); // Port finder. qjackctlPortItem *findPort(const QString& sPortName); // Instance accessors. void setClientName(const QString& sClientName); const QString& clientName() const; // Client name alias accessors. void setClientNameAlias(const QString& sClientNameAlias); QString clientNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name method. virtual void updateClientName(bool bRename = false); // Readable flag accessor. bool isReadable() const; // Client list accessor. qjackctlClientList *clientList() const; // Port list accessor. QList& ports(); // Client port cleanup marker. void markClient(int iMark); void markClientPorts(int iMark); int cleanClientPorts(int iMark); int clientMark() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Client name display name accessors. void setClientText(const QString& sClientText, bool bRenameEnabled); QString clientText() const; private: // Instance variables. qjackctlClientList *m_pClientList; QString m_sClientName; int m_iClientMark; int m_iHilite; QList m_ports; }; // Jack client list. class qjackctlClientList : public QObject { public: // Constructor. qjackctlClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlClientList(); // Do proper contents cleanup. void clear(); // Client list primitive methods. void addClient(qjackctlClientItem *pClient); void removeClient(qjackctlClientItem *pClient); // Client finder. qjackctlClientItem *findClient(const QString& sClientName); // Client:port finder. qjackctlPortItem *findClientPort(const QString& sClientPort); // List view accessor. qjackctlClientListView *listView() const; // Readable flag accessor. bool isReadable() const; // Client list accessor. QList& clients(); // Client ports cleanup marker. void markClientPorts(int iMark); int cleanClientPorts(int iMark); // Client:port refreshner (return newest item count). virtual int updateClientPorts() = 0; // Client:port hilite update stabilization. void hiliteClientPorts (void); // Do proper contents refresh/update. void refresh(); // Natural decimal sorting comparator. static bool lessThan(const QTreeWidgetItem& i1, const QTreeWidgetItem& i2); private: // Instance variables. qjackctlClientListView *m_pListView; bool m_bReadable; QList m_clients; QTreeWidgetItem *m_pHiliteItem; }; //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. class qjackctlClientListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlClientListView(qjackctlConnectView *pConnectView, bool bReadable); // Default destructor. ~qjackctlClientListView(); // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; // Aliasing support methods. void setAliases(qjackctlConnectAlias *pAliases, bool bRenameEnabled); qjackctlConnectAlias *aliases() const; bool isRenameEnabled() const; // Binding indirect accessor. qjackctlConnect *binding() const; // Dirty flag accessors. void setDirty (bool bDirty); bool isDirty() const; protected slots: // In-place aliasing slots. void startRenameSlot(); void renamedSlot(); // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlConnectView *m_pConnectView; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; // Aliasing support. qjackctlConnectAlias *m_pAliases; bool m_bRenameEnabled; }; //---------------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. class qjackctlConnectorView : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectorView(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnectorView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. virtual void contextMenuEvent(QContextMenuEvent *); private: // Legal client/port item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen); // Local instance variables. qjackctlConnectView *m_pConnectView; }; //---------------------------------------------------------------------------- // qjackctlConnectView -- Connections view integrated widget. class qjackctlConnectView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlConnectView(QWidget *pParent = 0); // Default destructor. ~qjackctlConnectView(); // Widget accesors. qjackctlClientListView *OListView() const { return m_pOListView; } qjackctlClientListView *IListView() const { return m_pIListView; } qjackctlConnectorView *connectorView() const { return m_pConnectorView; } // Connections object binding methods. void setBinding(qjackctlConnect *pConnect); qjackctlConnect *binding() const; // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; // Connector line style accessors. void setBezierLines(bool bBezierLines); bool isBezierLines() const; // Common icon size pixmap accessors. void setIconSize (int iIconSize); int iconSize (void) const; // Dirty flag accessors. void setDirty (bool bDirty); bool isDirty() const; signals: // Contents change signal. void contentsChanged(); private: // Child controls. qjackctlClientListView *m_pOListView; qjackctlClientListView *m_pIListView; qjackctlConnectorView *m_pConnectorView; // The main binding object. qjackctlConnect *m_pConnect; // How we'll draw connector lines. bool m_bBezierLines; // How large will be those icons. // 0 = 16x16 (default), 1 = 32x32, 2 = 64x64. int m_iIconSize; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlConnect -- Connections model integrated object. class qjackctlConnect : public QObject { Q_OBJECT public: // Constructor. qjackctlConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnect(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; public slots: // Incremental contents refreshner; check dirty status. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all client ports. void expandAll(); // Complete/incremental contents rebuilder; check dirty status if incremental. void updateContents(bool bClear); signals: // Connection change signal. void connectChanged(); // Pre-notification of (dis)connection. void connecting(qjackctlPortItem *, qjackctlPortItem *); void disconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: // Connect/Disconnection primitives. virtual bool connectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; virtual bool disconnectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; // Update port connection references. virtual void updateConnections() = 0; // These must be accessed by the descendant constructor. qjackctlConnectView *connectView() const; void setOClientList(qjackctlClientList *pOClientList); void setIClientList(qjackctlClientList *pIClientList); // Common pixmap factory helper-method. QPixmap *createIconPixmap (const QString& sIconName); // Update icon size implementation. virtual void updateIconPixmaps() = 0; private: // Dunno. But this may avoid some conflicts. bool startMutex(); void endMutex(); // Connection methods (unguarded). bool canConnectSelectedEx(); bool canDisconnectSelectedEx(); bool canDisconnectAllEx(); bool connectSelectedEx(); bool disconnectSelectedEx(); bool disconnectAllEx(); // Connect/Disconnection local primitives. bool connectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Instance variables. qjackctlConnectView *m_pConnectView; // These must be created on the descendant constructor. qjackctlClientList *m_pOClientList; qjackctlClientList *m_pIClientList; int m_iMutex; }; #endif // __qjackctlConnect_h // end of qjackctlConnect.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayForm.cpp0000644000000000000000000000012713215206021020347 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53676694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlPatchbayForm.cpp0000644000175000001440000004510113215206021021176 0ustar00rncbcusers00000000000000// qjackctlPatchbayForm.cpp // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlPatchbayForm.h" #include "qjackctlPatchbayFile.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. // Constructor. qjackctlPatchbayForm::qjackctlPatchbayForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = NULL; // Create the patchbay view object. m_pPatchbay = new qjackctlPatchbay(m_ui.PatchbayView); m_iUntitled = 0; m_bActivePatchbay = false; m_iUpdate = 0; // UI connections... QObject::connect(m_ui.NewPatchbayPushButton, SIGNAL(clicked()), SLOT(newPatchbay())); QObject::connect(m_ui.LoadPatchbayPushButton, SIGNAL(clicked()), SLOT(loadPatchbay())); QObject::connect(m_ui.SavePatchbayPushButton, SIGNAL(clicked()), SLOT(savePatchbay())); QObject::connect(m_ui.PatchbayComboBox, SIGNAL(activated(int)), SLOT(selectPatchbay(int))); QObject::connect(m_ui.ActivatePatchbayPushButton, SIGNAL(clicked()), SLOT(toggleActivePatchbay())); QObject::connect(m_ui.OSocketAddPushButton, SIGNAL(clicked()), SLOT(addOSocket())); QObject::connect(m_ui.OSocketEditPushButton, SIGNAL(clicked()), SLOT(editOSocket())); QObject::connect(m_ui.OSocketCopyPushButton, SIGNAL(clicked()), SLOT(copyOSocket())); QObject::connect(m_ui.OSocketRemovePushButton, SIGNAL(clicked()), SLOT(removeOSocket())); QObject::connect(m_ui.OSocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpOSocket())); QObject::connect(m_ui.OSocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownOSocket())); QObject::connect(m_ui.ISocketAddPushButton, SIGNAL(clicked()), SLOT(addISocket())); QObject::connect(m_ui.ISocketEditPushButton, SIGNAL(clicked()), SLOT(editISocket())); QObject::connect(m_ui.ISocketCopyPushButton, SIGNAL(clicked()), SLOT(copyISocket())); QObject::connect(m_ui.ISocketRemovePushButton, SIGNAL(clicked()), SLOT(removeISocket())); QObject::connect(m_ui.ISocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpISocket())); QObject::connect(m_ui.ISocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownISocket())); QObject::connect(m_ui.ConnectPushButton, SIGNAL(clicked()), SLOT(connectSelected())); QObject::connect(m_ui.DisconnectPushButton, SIGNAL(clicked()), SLOT(disconnectSelected())); QObject::connect(m_ui.DisconnectAllPushButton, SIGNAL(clicked()), SLOT(disconnectAll())); QObject::connect(m_ui.ExpandAllPushButton, SIGNAL(clicked()), SLOT(expandAll())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshForm())); // Connect it to some UI feedback slot. QObject::connect(m_ui.PatchbayView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); QObject::connect(m_ui.PatchbayView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); // Dirty patchbay dispatcher (stabilization deferral). QObject::connect(m_ui.PatchbayView, SIGNAL(contentsChanged()), SLOT(contentsChanged())); newPatchbayFile(false); stabilizeForm(); } // Destructor. qjackctlPatchbayForm::~qjackctlPatchbayForm (void) { // May delete the patchbay view object. delete m_pPatchbay; } // Notify our parent that we're emerging. void qjackctlPatchbayForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlPatchbayForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlPatchbayForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views... void qjackctlPatchbayForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; // Load main splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.PatchbayView, sizes); } } // Patchbay view accessor. qjackctlPatchbayView *qjackctlPatchbayForm::patchbayView (void) const { return m_ui.PatchbayView; } // Window close event handlers. bool qjackctlPatchbayForm::queryClose (void) { bool bQueryClose = true; if (m_ui.PatchbayView->dirty()) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("The patchbay definition has been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPatchbayName), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: savePatchbay(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; } } // Save main splitter sizes... if (m_pSetup && bQueryClose) m_pSetup->saveSplitterSizes(m_ui.PatchbayView); return bQueryClose; } // Contents change deferrer slot... void qjackctlPatchbayForm::contentsChanged (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshPatchbay(); } // Refresh complete form. void qjackctlPatchbayForm::refreshForm (void) { m_pPatchbay->refresh(); stabilizeForm(); } // A helper stabilization slot. void qjackctlPatchbayForm::stabilizeForm ( void ) { m_ui.SavePatchbayPushButton->setEnabled(m_ui.PatchbayView->dirty()); m_ui.ActivatePatchbayPushButton->setEnabled( QFileInfo(m_sPatchbayPath).exists()); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); m_ui.ActivatePatchbayPushButton->setChecked(m_bActivePatchbay); if (m_ui.PatchbayView->dirty()) { m_ui.PatchbayComboBox->setItemText( m_ui.PatchbayComboBox->currentIndex(), tr("%1 [modified]").arg(m_sPatchbayName)); } // Take care that IT might be destroyed already... if (m_ui.PatchbayView->binding() == NULL) return; bool bExpandAll = false; qjackctlSocketList *pSocketList; qjackctlSocketItem *pSocketItem; int iItemCount, iItem; pSocketList = m_pPatchbay->OSocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.OSocketEditPushButton->setEnabled(true); m_ui.OSocketCopyPushButton->setEnabled(true); m_ui.OSocketRemovePushButton->setEnabled(true); m_ui.OSocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.OSocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.OSocketEditPushButton->setEnabled(false); m_ui.OSocketCopyPushButton->setEnabled(false); m_ui.OSocketRemovePushButton->setEnabled(false); m_ui.OSocketMoveUpPushButton->setEnabled(false); m_ui.OSocketMoveDownPushButton->setEnabled(false); } pSocketList = m_pPatchbay->ISocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.ISocketEditPushButton->setEnabled(true); m_ui.ISocketCopyPushButton->setEnabled(true); m_ui.ISocketRemovePushButton->setEnabled(true); m_ui.ISocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.ISocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.ISocketEditPushButton->setEnabled(false); m_ui.ISocketCopyPushButton->setEnabled(false); m_ui.ISocketRemovePushButton->setEnabled(false); m_ui.ISocketMoveUpPushButton->setEnabled(false); m_ui.ISocketMoveDownPushButton->setEnabled(false); } m_ui.ConnectPushButton->setEnabled( m_pPatchbay->canConnectSelected()); m_ui.DisconnectPushButton->setEnabled( m_pPatchbay->canDisconnectSelected()); m_ui.DisconnectAllPushButton->setEnabled( m_pPatchbay->canDisconnectAll()); m_ui.ExpandAllPushButton->setEnabled(bExpandAll); } // Patchbay path accessor. const QString& qjackctlPatchbayForm::patchbayPath (void) const { return m_sPatchbayPath; } // Reset patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbayFile ( bool bSnapshot ) { m_pPatchbay->clear(); m_sPatchbayPath.clear(); m_sPatchbayName = tr("Untitled%1").arg(m_iUntitled++); if (bSnapshot) m_pPatchbay->connectionsSnapshot(); // updateRecentPatchbays(); } // Load patchbay definitions from specific file path. bool qjackctlPatchbayForm::loadPatchbayFile ( const QString& sFileName ) { // Check if we're going to discard safely the current one... if (!queryClose()) return false; // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: load from file... if (!qjackctlPatchbayFile::load(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("Could not load patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); // Reset/disable further trials. m_sPatchbayPath.clear(); return false; } // Step 2: load from rack... m_pPatchbay->loadRack(&rack); // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); return true; } // Save current patchbay definition to specific file path. bool qjackctlPatchbayForm::savePatchbayFile ( const QString& sFileName ) { // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: save to rack... m_pPatchbay->saveRack(&rack); // Step 2: save to file... if (!qjackctlPatchbayFile::save(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("Could not save patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); return false; } // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); // Step 4: notify main form if applicable ... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); if (m_bActivePatchbay) pMainForm->updateActivePatchbay(); return true; } // Dirty-(re)load patchbay definitions from know rack. void qjackctlPatchbayForm::loadPatchbayRack ( qjackctlPatchbayRack *pRack ) { // Step 1: load from rack... m_pPatchbay->loadRack(pRack); // Override dirty flag. m_ui.PatchbayView->setDirty(true); // Done. stabilizeForm(); } // Create a new patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbay (void) { // Assume a snapshot from scratch... bool bSnapshot = false; // Ask user what he/she wants to do... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm && (pMainForm->jackClient() || pMainForm->alsaSeq())) { switch (QMessageBox::information(this, tr("New Patchbay definition") + " - " QJACKCTL_SUBTITLE1, tr("Create patchbay definition as a snapshot\n" "of all actual client connections?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel)) { case QMessageBox::Yes: bSnapshot = true; break; case QMessageBox::No: bSnapshot = false; break; default: // Cancel. return; } } // Check if we can discard safely the current one... if (!queryClose()) return; // Reset patchbay editor. newPatchbayFile(bSnapshot); updateRecentPatchbays(); stabilizeForm(); } // Load patchbay definitions from file. void qjackctlPatchbayForm::loadPatchbay (void) { QString sFileName = QFileDialog::getOpenFileName( this, tr("Load Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Load it right away. if (loadPatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // Save current patchbay definition to file. void qjackctlPatchbayForm::savePatchbay (void) { QString sFileName = QFileDialog::getSaveFileName( this, tr("Save Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Enforce .xml extension... if (QFileInfo(sFileName).suffix().isEmpty()) sFileName += ".xml"; // Save it right away. if (savePatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // A new patchbay has been selected void qjackctlPatchbayForm::selectPatchbay ( int iPatchbay ) { // Remember and avoid reloading the previous (first) selected one. if (iPatchbay > 0) { // Take care whether the first is untitled, and // thus not present in the recenet ptachbays list if (m_sPatchbayPath.isEmpty()) iPatchbay--; if (iPatchbay >= 0 && iPatchbay < m_recentPatchbays.count()) { // If we cannot load the new one, backout... loadPatchbayFile(m_recentPatchbays[iPatchbay]); updateRecentPatchbays(); } } stabilizeForm(); } // Set current active patchbay definition file. void qjackctlPatchbayForm::toggleActivePatchbay (void) { // Check if we're going to discard safely the current one... if (!queryClose()) return; // Activate it... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { pMainForm->setActivePatchbay( m_bActivePatchbay ? QString::null : m_sPatchbayPath); } // Need to force/refresh the patchbay list... updateRecentPatchbays(); stabilizeForm(); } // Set/initialize the MRU patchbay list. void qjackctlPatchbayForm::setRecentPatchbays ( const QStringList& patchbays ) { m_recentPatchbays = patchbays; } // Update patchbay MRU variables and widgets. void qjackctlPatchbayForm::updateRecentPatchbays (void) { // TRye not to be reeentrant. if (m_iUpdate > 0) return; m_iUpdate++; // Update the visible combobox... const QIcon icon(":/images/patchbay1.png"); m_ui.PatchbayComboBox->clear(); if (m_sPatchbayPath.isEmpty()) { // Display a probable untitled patchbay... m_ui.PatchbayComboBox->addItem(icon, m_sPatchbayName); } else { // Remove from list if already there (avoid duplicates)... int iIndex = m_recentPatchbays.indexOf(m_sPatchbayPath); if (iIndex >= 0) m_recentPatchbays.removeAt(iIndex); // Put it to front... m_recentPatchbays.push_front(m_sPatchbayPath); } // Time to keep the list under limits. while (m_recentPatchbays.count() > 8) m_recentPatchbays.pop_back(); // Update the main setup list... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->setRecentPatchbays(m_recentPatchbays); QStringListIterator iter(m_recentPatchbays); while (iter.hasNext()) { const QString& sPatchbayPath = iter.next(); QString sText = QFileInfo(sPatchbayPath).completeBaseName(); if (pMainForm && pMainForm->isActivePatchbay(sPatchbayPath)) sText += " [" + tr("active") + "]"; m_ui.PatchbayComboBox->addItem(icon, sText); } // Sure this one must be currently selected. m_ui.PatchbayComboBox->setCurrentIndex(0); // stabilizeForm(); m_iUpdate--; } // Output socket list push button handlers gallore... void qjackctlPatchbayForm::addOSocket (void) { (m_pPatchbay->OSocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeOSocket (void) { (m_pPatchbay->OSocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editOSocket (void) { (m_pPatchbay->OSocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyOSocket (void) { (m_pPatchbay->OSocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpOSocket (void) { (m_pPatchbay->OSocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownOSocket (void) { (m_pPatchbay->OSocketList())->moveDownSocketItem(); } // Input socket list push button handlers gallore... void qjackctlPatchbayForm::addISocket (void) { (m_pPatchbay->ISocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeISocket (void) { (m_pPatchbay->ISocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editISocket (void) { (m_pPatchbay->ISocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyISocket (void) { (m_pPatchbay->ISocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpISocket (void) { (m_pPatchbay->ISocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownISocket (void) { (m_pPatchbay->ISocketList())->moveDownSocketItem(); } // Connect current selected ports. void qjackctlPatchbayForm::connectSelected (void) { m_pPatchbay->connectSelected(); } // Disconnect current selected ports. void qjackctlPatchbayForm::disconnectSelected (void) { m_pPatchbay->disconnectSelected(); } // Disconnect all connected ports. void qjackctlPatchbayForm::disconnectAll (void) { m_pPatchbay->disconnectAll(); } // Expand all socket items. void qjackctlPatchbayForm::expandAll (void) { m_pPatchbay->expandAll(); } // Keyboard event handler. void qjackctlPatchbayForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlPatchbayForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlPatchbayForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/translations0000644000000000000000000000012713215206021016213 xustar0029 mtime=1513425937.54976694 29 atime=1513425937.54176694 29 ctime=1513425937.54976694 qjackctl-0.5.0/src/translations/0000755000175000001440000000000013215206021017116 5ustar00rncbcusers00000000000000qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_cs.ts0000644000000000000000000000012713215206021021121 xustar0029 mtime=1513425937.54476694 29 atime=1513425937.54176694 29 ctime=1513425937.54476694 qjackctl-0.5.0/src/translations/qjackctl_cs.ts0000644000175000001440000050535713215206021021766 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Zjišťuje se... Please wait, PortAudio is probing audio hardware. Počkejte, prosím, PortAudio zjišťuje zvukový hardware. Warning Varování Audio hardware probing timed out. Došlo k překročení času při zjišťování zvukového hardware. QObject (default) Usage: %1 [options] [command-and-args] Použití: %1 [volby] [příkazy a argumenty] Options: Volby: Start JACK audio server immediately JACK audioserver spustit okamžitě Show help about command line options Ukázat nápovědu k volbám (argumentům) příkazového řádku Show version information Ukázat informace o verzi Option -p requires an argument (preset). Volba -p vyžaduje argument (preset, přednastavení). Set default settings preset name Určit název přednastavení výchozího nastavení Set active patchbay definition file Nastavit soubor s vymezením činné zapojovací desky Option -a requires an argument (path). Volba -a vyžaduje argument (cesta). Set default JACK audio server name Nastavit výchozí název pro zvukový server JACK Option -n requires an argument (name). Volba -n vyžaduje argument (název). %1 (%2 frames) %1 (%2 snímků) qjackctlAboutForm About QjackCtl O QjackCtl &Close &Zavřít About Qt O Qt Version Verze Using: JACK %1 Používá se: JACK %1 Debugging option enabled. Povolena volba pro ladění. System tray disabled. Zakázána oznamovací oblast. Transport status control disabled. Zakázáno ovládání stavu předání. Realtime status disabled. Zakázán stav provádění ve skutečném čase. XRUN delay status disabled. Zakázán stav zpoždění XRUN. Maximum delay status disabled. Zakázán stav největšího zpoždění. JACK MIDI support disabled. JACK MIDI není podporován. JACK Session support disabled. Podpora pro sezení JACK byla zakázána. ALSA/MIDI sequencer support disabled. ALSA/MIDI řadič (sequencer) není podporován. Website Stránky This program is free software; you can redistribute it and/or modify it Tento program je svobodným programem. Můžete jej šířit a/nebo upravit under the terms of the GNU General Public License version 2 or later. za podmínek GNU General Public License ve verzi 2 nebo pozdější. JACK Port aliases support disabled. Podpora pro přezdívky přípojek JACK zakázána. D-Bus interface support disabled. Podpora pro rozhraní D-Bus zakázána. qjackctlClientListView Readable Clients / Output Ports Čitelné přípojky pro klienty/výstupy Writable Clients / Input Ports Zapisovatelné přípojky pro klienty/výstupy &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vše Alt+A Disconect All Alt+A Re&name &Přejmenovat Alt+N Rename Alt+N &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlConnect Warning Varování This will suspend sound processing from all client applications. Are you sure? Tímto se pozastaví zpracování zvuku u všech klientských aplikací. Jste si jistý? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Spojení - JACK Audio Connection Kit Audio Zvuk Connect currently selected ports Spojit nyní vybrané přípojky &Connect &Spojit Disconnect currently selected ports Rozpojit nyní vybrané přípojky &Disconnect &Rozpojit Disconnect all currently connected ports Rozpojit všechny nyní spojené přípojky Disconnect &All &Rozpojit vše Expand all client ports Rozbalit všechny klientské přípojky E&xpand All Rozbalit &vše Refresh current connections view Obnovit pohled na nynější spojení &Refresh &Obnovit MIDI JACK-MIDI ALSA ALSA-MIDI Warning Varování The preset aliases have been changed: "%1" Do you want to save the changes? Přezdívky pro přednastavení byly změněny: "%1" Chcete uložit změny? qjackctlConnectorView &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All Rozpojit &vše Alt+A Disconect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlMainForm QjackCtl QjackCtl Quit processing and exit Ukončit zpracování signálu a ukončit program &Quit &Ukončit Start the JACK server Spustit server JACK &Start &Spustit Stop the JACK server Zastavit server JACK S&top &Zastavit St&atus &Stav Show information about this application Ukázat informace o této aplikaci Ab&out... &O... Set&up... &Nastavení... Show settings and options dialog Ukázat dialogové okno pro nastavení a volby &Messages &Hlášení Show/hide the patchbay editor window Ukázat/Skrýt okno editoru se zapojovací deskou &Patchbay &Zapojovací deska Show/hide the actual connections patchbay window Ukázat/Skrýt okno se zapojovací deskou se stávajícími spojeními &Connect &Spojit JACK server state Stav serveru JACK JACK server mode Režim serveru JACK DSP Load Zatížení DSP Sample rate Vzorkovací kmitočet XRUN Count (notifications) Počet XRUN (oznámení) Time display Údaj o čase Transport state Stav předání Transport BPM Předání BPM Transport time Čas předání Show/hide the session management window Ukázat/Skrýt okno se správou sezení Show/hide the messages log/status window Ukázat/Skrýt okno se zápisy/stavem hlášení Backward transport Předání zpět &Backward &Zpět Forward transport Předání dopředu &Forward &Dopředu Rewind transport Předání přetočit zpět &Rewind &Přetočit zpět Stop transport rolling Zastavit chod předání Pa&use &Pozastavit Start transport rolling Spustit chod předání &Play &Přehrát Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Nepodařilo se otevřít řadič (sekvencer) ALSA jako klienta. Zapojovací deska ALSA MIDI nebude dostupná. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Služba je dostupná (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Služba není dostupná (%1 aka jackdbus). Information Informace Warning Varování JACK is currently running. Do you want to terminate the JACK audio server? Server JACK nyní běží. Chcete ukončit zvukový server JACK? successfully úspěšně with exit status=%1 s vrácenou hodnotou = %1 Could not start JACK. Maybe JACK audio server is already started. JACK se nepodařilo spustit. Možná je server JACK už spuštěn. Could not load preset "%1". Retrying with default. Nastavení "%1" se nepodařilo nahrát. Zkouší se znovu s výchozím přednastavením. Could not load default preset. Sorry. Nepodařilo se nahrát výchozí přednastavení. Promiňte. Startup script... Skript pro spuštění... Startup script terminated Skript pro spuštění ukončen D-BUS: JACK server is starting... D-BUS: Spouští se server JACK... D-BUS: JACK server could not be started. Sorry D-BUS: Server JACK se nepodařilo spustit. Promiňte JACK is starting... JACK se spouští... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Některé z klientských zvukových aplikací jsou stále činné a spojené. Chcete zastavit zvukový server JACK? JACK is stopping... JACK se zastavuje... Shutdown script... Skript pro zastavení chodu... Don't ask this again Neptat se znovu Shutdown script terminated Skript pro zastavení chodu ukončen D-BUS: JACK server is stopping... D-BUS: Zastavuje se server JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: Server JACK se nepodařilo zastavit. Promiňte Post-shutdown script... Skript pro po-zastavení chodu... Post-shutdown script terminated Skript pro po-zastavení chodu ukončen JACK was started with PID=%1. JACK byl puštěn s PID = %1. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Server JACK byl spuštěn (%1 aka jackdbus). JACK is being forced... JACK je nucen... JACK was stopped JACK byl zastaven D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: Server JACK byl zastaven (%1 aka jackdbus). Error Chyba Transport time code Předání časového kódu Elapsed time since last reset Čas uplynulý od posledního znovunastavení Elapsed time since last XRUN Čas uplynulý od posledního XRUN Patchbay activated. Zapojovací deska uvedena do chodu. Patchbay deactivated. Zapojovací deska vyřazena z provozu. Statistics reset. Nastavit znovu statistiku. msec ms JACK connection graph change. Nákres spojení JACK změněn. XRUN callback (%1). Zavolání nazpátek XRUN (%1). Buffer size change (%1). Velikost vyrovnávací paměti změněna (%1). Shutdown notification. Oznámení o zastavení. Could not start JACK. Sorry. Nepodařilo se spustit JACK. Promiňte. JACK has crashed. JACK spadl. JACK timed out. Překročení času u JACK. JACK write error. Chyba při psaní u JACK. JACK read error. Chyba při čtení u JACK. Unknown JACK error (%d). Neznámá chyba u JACK (%d). ALSA connection graph change. Nákres spojení ALSA změněn. JACK active patchbay scan Prohlédnutí činné zapojovací desky JACK ALSA active patchbay scan Prohlédnutí činné zapojovací desky ALSA JACK connection change. Spojení JACK změněno. ALSA connection change. Spojení ALSA změněno. checked přezkoušeno connected spojeno disconnected rozpojeno failed nepodařilo se A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Vymezení zapojovací desky je nyní aktivní, což pravděpodobně znamená předělat toto spojení: %1 -> %2 Chcete odstranit spojení zapojovací desky? The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Program poběží dále v oznamovací části panelu. Pro ukončení programu vyberte, prosím, "Ukončit" v související nabídce vyskakující z ikony v oznamovací části panelu. Don't show this message again Toto hlášení neukazovat znovu Transport BBT (bar.beat.ticks) Předání BBT (takt:doba.tiknutí - bar:beat.ticks) Patchbay reset. Uvedení zapojovací desky do výchozího stavu. Could not load active patchbay definition. "%1" Disabled. Nepodařilo se nahrát vymezení aktivní zapojovací desky. "%1" Zakázáno. JACK property change. Vlastnost JACK změněna. Overall operation failed. Celková operace se nezdařila. Invalid or unsupported option. Neplatná nebo nepodporovaná volba. Client name not unique. Název klienta není jedinečný. Server is started. Server je spuštěn. Unable to connect to server. Nelze se připojit k serveru. Server communication error. Chyba spojení se serverem. Client does not exist. Klient neexistuje. Unable to load internal client. Nepodařilo se nahrát vnitřního klienta. Unable to initialize client. Nepodařilo se inicializovat vnitřního klienta. Unable to access shared memory. Nepodařilo se přistoupit ke sdílené paměti. Client protocol version mismatch. Nevhodná verze klientského protokolu. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Nepodařilo se připojit k serveru JACK jako klient. - %1 Další informace hledejte, prosím, v okně s hlášením. Server configuration saved to "%1". Nastavení serveru uloženo do "%1". Client activated. Klient uveden do chodu. Post-startup script... Skript pro po-spuštění... Post-startup script terminated Skript pro po-spuštění ukončen Command line argument... Argument pro příkazový řádek... Command line argument started Argument pro příkazový řádek spuštěn Client deactivated. Klient vyřazen z provozu. Transport rewind. Předání přetočit zpět. Transport backward. Předání zpět. Starting Spouští se Transport start. Spustit předání. Stopping Zastavuje se Transport stop. Zastavit předání. Transport forward. Předání dopředu. Stopped Zastaveno %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 snímků Yes Ano No Ne RT RT Rolling Jede Looping Zapíná se do jednoduchého obvodu %1 msec %1 ms XRUN callback (%1 skipped). Zavolání nazpátek XRUN (%1 přeskočeno). Started Běží Active Činný Activating Uvádí se do chodu Inactive Nečinný &Hide &Skrýt Mi&nimize &Zmenšit S&how &Ukázat Rest&ore &Nahrát znovu &Stop &Zastavit &Reset &Nastavit znovu &Presets &Přednastavení &Versioning &Verzování Re&fresh Ob&novit S&ession &Sezení &Load... &Nahrát... &Save... &Uložit... Save and &Quit... Uložit a &ukončit... Save &Template... Uložit jako &předlohu... &Connections &Spojení Patch&bay &Zapojovací deska &Transport &Předání Server settings will be only effective after restarting the JACK audio server. Nastavení serveru se projeví až po novém spuštění serveru JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: Nastavit hodnotu parametru SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: Nastavit znovu hodnotu parametru ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: Získat hodnotu parametru GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Některá nastavení se projeví až tehdy, když příště spustíte tento program. qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Hlášení/Stav - JACK Audio Connection Kit &Messages &Hlášení Messages log Zápis hlášení Messages output log Zápis hlášení o výstupu &Status &Stav Status information Informace o stavu Statistics since last server startup Statistika od posledního spuštění serveru Description Popis Value Hodnota Reset XRUN statistic values Nastavit znovu údaje ve statistice XRUN Re&set &Nastavit znovu Refresh XRUN statistic values Obnovit údaje ve statistice XRUN &Refresh &Obnovit Server name Název serveru Server state Stav serveru DSP Load Zatížení DSP Sample Rate Vzorkovací kmitočet Buffer Size Velikost vyrovnávací paměti Realtime Mode Režim skutečného času Transport state Stav předání Transport Timecode Předání časového kódu Transport BBT Předání BBT Transport BPM Předání BPM XRUN count since last server startup Počet XRUN od posledního spuštění serveru XRUN last time detected Čas posledního zjištění XRUN XRUN last Poslední XRUN XRUN maximum Největší počet XRUN XRUN minimum Nejmenší počet XRUN XRUN average Průměrný počet XRUN XRUN total Celkový počet XRUN Maximum scheduling delay Největší zpoždění času Time of last reset Čas posledního znovunastavení Logging stopped --- %1 --- Zápis zastaven --- %1 --- Logging started --- %1 --- Zápis spuštěn --- %1 --- qjackctlPatchbay Warning Varování This will disconnect all sockets. Are you sure? Tento krok odpojí všechny zásuvky. Jste si jistýr? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Zapojovací deska - JACK Audio Connection Kit Move currently selected output socket down one position Posunout nyní vybrané výstupní zásuvky dolů o jedno místo Down Dolů Create a new output socket Vytvořit novou výstupní zásuvku Add... Přidat... Edit currently selected input socket properties Upravit vlastnosti nyní vybrané vstupní zásuvky Edit... Upravit... Move currently selected output socket up one position Posunout nyní vybrané výstupní zásuvky nahoru o jedno místo Up Nahoru Remove currently selected output socket Odstranit nyní vybranou výstupní zásuvku Remove Odstranit Duplicate (copy) currently selected output socket Zdvojit (kopírovat) nyní vybranou výstupní zásuvku Copy... Kopírovat... Remove currently selected input socket Odstranit nyní vybranou vstupní zásuvku Duplicate (copy) currently selected input socket Zdvojit (kopírovat) nyní vybranou vstupní zásuvku Create a new input socket Vytvořit novou vstupní zásuvku Edit currently selected output socket properties Upravit vlastnosti nyní vybrané výstupní zásuvky Connect currently selected sockets Spojit nyní vybrané zásuvky &Connect &Spojit Disconnect currently selected sockets Odpojit nyní vybrané zásuvky &Disconnect &Odpojit Disconnect all currently connected sockets Odpojit všechny nyní spojené zásuvky Disconnect &All &Odpojit vše Expand all items Rozbalit všechny položky E&xpand All Rozbalit &vše Refresh current patchbay view Obnovit nynější pohled na zapojovací desku &Refresh &Obnovit Create a new patchbay profile Vytvořit nový profil zapojovací desky &New &Nový Load patchbay profile Nahrát profil zapojovací desky &Load... &Nahrát... Save current patchbay profile Uložit nynější profil zapojovací desky &Save... &Uložit... Current (recent) patchbay profile(s) Nynější (naposledy použité) profil(y) zapojovací desky Toggle activation of current patchbay profile Přepnout spuštění nynějšího profilu zapojovací desky Acti&vate &Spustit Warning Varování The patchbay definition has been changed: "%1" Do you want to save the changes? Vymezení zapojovací desky bylo změněno: "%1" Chcete uložit změny? %1 [modified] %1 [změněn] Untitled%1 Bez názvu%1 Error Chyba Could not load patchbay definition file: "%1" Nepodařilo se nahrát soubor s vymezením zapojovací desky: "%1" Could not save patchbay definition file: "%1" Nepodařilo se uložit soubor s vymezením zapojovací desky: "%1" New Patchbay definition Nové vymezení zapojovací desky Create patchbay definition as a snapshot of all actual client connections? Vytvořit vymezení zapojovací desky jako snímek všech skutečných klientských spojení? Load Patchbay Definition Nahrát vymezení zapojovací desky Patchbay Definition files Soubory s vymezením zapojovací desky Save Patchbay Definition Uložit vymezení zapojovací desky active činný qjackctlPatchbayView Add... Přidat... Edit... Upravit... Copy... Kopírovat... Remove Odstranit Exclusive Výhradní Forward Dopředu (None) (Žádný) Move Up Přesunout nahoru Move Down Přesunout dolů &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vše Alt+A Disconect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit Sezení - JACK Audio Connection Kit Load session Nahrát sezení &Load... &Nahrát... Recent session Naposledy otevřené sezení &Recent &Naposledy otevřené Save session Uložit sezení Save session versioning Uložit verzování sezení &Versioning &Verzování Re&fresh Ob&novit Session clients / connections Klienti sezení/spojení Infra-clients / commands Infra-klienti/Příkazy Infra-client Infra-klient Infra-command Infra-příkaz Add infra-client Přidat infra-klient &Add Přid&at Edit infra-client Upravit infra-klient &Edit &Upravit Remove infra-client Odstranit infra-klient Re&move &Odstranit &Save... &Uložit... Update session Obnovit sezení Client / Ports Klient/Přípojky UUID UUID Command Příkaz &Save &Uložit Load Session Nahrát sezení Session directory Adresář se sezením Save Session Uložit sezení and Quit a ukončit Template Předloha &Clear &Smazat Warning Varování A session could not be found in this folder: "%1" Sezení se v této složce nepodařilo nalézt: "%1" %1: loading session... %1: nahrává se sezení... %1: load session %2. %1: nahrát sezení %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? V této složce již existuje sezení: "%1" Jste si jistý, že chcete přepsat stávající sezení? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Tato složka již existuje a není prázdná: "%1" Jste si jistý, že chcete přepsat stávající složku? %1: saving session... %1: ukládá se sezení... %1: save session %2. %1: uložit sezení %2. New Client Nový klient Save and &Quit... Uložit a &ukončit... Save &Template... Uložit jako &předlohu... qjackctlSessionInfraClientItemEditor Infra-command Infra-příkaz qjackctlSetupForm Setup - JACK Audio Connection Kit Nastavení - JACK Audio Connection Kit Settings Nastavení Preset &Name: &Název přednastavení: Settings preset name Název pro přednastavení nastavení (default) Save settings as current preset name Uložit nastavení s nynějším názvem přednastavení &Save &Uložit Delete current settings preset Smazat přednastavení nynějšího nastavení &Delete &Smazat jackd jackd jackdmp jackdmp jackstart jackstart Driv&er: &Ovladač: The audio backend driver interface to use Rozhraní ovladače k zadní části zvuku, které se bude používat dummy dummy sun sun oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob firewire firewire Parameters Parametry MIDI Driv&er: Ovla&dač MIDI: The ALSA MIDI backend driver to use Ovladač k zadní části ALSA MIDI, který se bude používat none žádný raw raw seq seq Time in seconds that client is delayed after server startup Čas v sekundách, o který je klient opožděn po spuštění serveru Latency: Prodleva: Output latency in milliseconds, calculated based on the period, rate and buffer settings Výstupní prodleva v milisekundách, jejíž výpočet je založen na nastavení údobí (period), rychlosti (snímání) a vyrovnávací paměti Use realtime scheduling Použít zpracování ve skutečném čase &Realtime &Skutečný čas Do not attempt to lock memory, even if in realtime mode Nepokoušejte se uzamknout paměť, dokonce ani v režimu skutečného času No Memory Loc&k &Neuzamknout paměť Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Odemknout paměť běžných knihoven s nástroji (GTK+, QT, FLTK, Wine) &Unlock Memory &Odemknout paměť Ignore xruns reported by the backend driver Přehlížet xruns hlášené ovladačem zadní části So&ft Mode &Snadný režim Provide output monitor ports Poskytnout přípojky pro sledování výstupu &Monitor &Sledování Force 16bit mode instead of failing over 32bit (default) Vynutit 16bitový režim namísto selhání ve 32bitovém (výchozí) Force &16bit Vynutit &16bitový režim Enable hardware monitoring of capture ports Povolit přístrojové sledování zachytávacích přípojek H/W M&onitor H/W &sledování Enable hardware metering on cards that support it Povolit přístrojové měření u karet, které to podporují H/&W Meter H/&W měřidlo Ignore hardware period/buffer size Přehlížet údobí (periodu)/velikost vyrovnávací paměti přístroje &Ignore H/W &Přehlížet H/W Whether to give verbose output on messages Dát hlášením podrobný výstup &Verbose messages &Podrobná hlášení &Output Device: &Výstupní zařízení: &Interface: &Rozhraní: Maximum input audio hardware channels to allocate Největší množství přidělitelných vstupních zvukových přístrojových kanálů &Audio: &Zvuk: Dit&her: &Vložení šumu do signálu (dithering): External output latency (frames) Vnější výstupní prodleva (snímky) &Input Device: Vstup&ní zařízení: Provide either audio capture, playback or both Poskytnout buď zachytávání zvuku, přehrávání nebo obojí Duplex Zdvojený Capture Only Pouze zachytávání Playback Only Pouze přehrávání The PCM device name to use Název používaného zařízení PCM hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Střídat vstupní zařízení pro zachytávání Maximum output audio hardware channels to allocate Největší množství přidělitelných výstupních zvukových přístrojových kanálů Alternate output device for playback Střídat výstupní zařízení pro přehrávání External input latency (frames) Vnější vstupní prodleva (snímky) Set dither mode Nastavit režim vložení šumu do signálu (dithering) None Žádný Rectangular Obdélníkový Shaped Obalová křivka Triangular Trojúhelníkový Number of periods in the hardware buffer Počet údobí (period) ve vyrovnávací paměti přístroje Priorit&y: &Přednost: &Frames/Period: &Snímky/Údobí (perioda): Frames per period between process() calls Snímků za údobí (periodu) mezi voláním process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: &Největší počet přípojek: &Channels: &Kanály: 21333 21333 Sample rate in frames per second Vzorkovací kmitočet (rychlost snímkování) ve snímcích za sekundu 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Přednost rozvrhu při běhu ve skutečném čase &Word Length: &Délka slova: Periods/&Buffer: Ú&dobí/Vyrovnávací paměť: Word length Délka slova Maximum number of ports the JACK server can manage Největší počet přípojek, které server JACK může spravovat &Wait (usec): &Čekat (µs): Sample &Rate: Vzorkovací &kmitočet: Maximum number of audio channels to allocate Největší množství přidělitelných zvukových kanálů &Timeout (msec): &Překročení času (ms): Set client timeout limit in milliseconds Nastavit mez pro překročení času u klienta; údaj v milisekundách 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 &Channels I/O: &Kanály vstup/výstup: &Latency I/O: &Prodleva vstup/výstup: Server Suffi&x: Příp&ona serveru: Start De&lay: &Zpoždění spuštění: secs s 0 msecs 0 ms Advanced Pokročilé Options Volby Scripting Skriptování Whether to execute a custom shell script before starting up the JACK audio server. Provést vlastní shellový skript před spuštěním zvukového serveru JACK. Execute script on Start&up: Provést skript při &spuštění: Whether to execute a custom shell script after starting up the JACK audio server. Provést vlastní shellový skript po spuštění zvukového serveru JACK. Execute script after &Startup: Provést skript &po spuštění: Whether to execute a custom shell script before shuting down the JACK audio server. Provést vlastní shellový skript před zastavením zvukového serveru JACK. Execute script on Shut&down: Provést skript při zasta&vení: Command line to be executed before starting up the JACK audio server Příkazový řádek k provedení před spuštěním zvukového serveru JACK Scripting argument meta-symbols Meta symboly pro argument při skriptování Browse for script to be executed before starting up the JACK audio server Vybrat skript, který se provede před spuštěním zvukového serveru JACK ... ... Command line to be executed after starting up the JACK audio server Příkazový řádek k provedení po spuštění zvukového serveru JACK Browse for script to be executed after starting up the JACK audio server Vybrat skript, který se provede po spuštění zvukového serveru JACK Browse for script to be executed before shutting down the JACK audio server Vybrat skript, který se provede před zastavením zvukového serveru JACK Command line to be executed before shutting down the JACK audio server Příkazový řádek k provedení před zastavením zvukového serveru JACK Whether to execute a custom shell script after shuting down the JACK audio server. Provést vlastní shellový skript po zastavení zvukového serveru JACK. Execute script after Shu&tdown: Provést skript po zas&tavení: Browse for script to be executed after shutting down the JACK audio server Vybrat skript, který se provede po zastavení zvukového serveru JACK Command line to be executed after shutting down the JACK audio server Příkazový řádek k provedení po zastavení zvukového serveru JACK Statistics Statistika Whether to capture standard output (stdout/stderr) into messages window Vést obvyklý výstup (stdout/stderr) do okna s hlášeními &Capture standard output &Vést obvyklý výstup &XRUN detection regex: Pravidelný výraz pro zjištění &XRUN: Regular expression used to detect XRUNs on server output messages Pravidelný výraz užitý pro poznání XRUN v hlášeních posílaných serverem xrun of at least ([0-9|\.]+) msecs xrun alespoň ([0-9|\.]+) ms Connections Spojení Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 10 Patchbay definition file to be activated as connection persistence profile Spustit soubor s vymezením zapojovací desky jako stálý profil spojení Browse for a patchbay definition file to be activated Vybrat soubor s vymezením zapojovací desky pro spuštění Whether to activate a patchbay definition for connection persistence profile. Spustit stálý profil s vymezením zapojovací desky spojení. Activate &Patchbay persistence: Spustit stálý profil se &zapojovací deskou: Logging Provádění zápisu Messages log file Soubor se zápisem hlášení Browse for the messages log file location Vybrat místo pro umístění souboru se zápisem hlášení Whether to activate a messages logging to file. Spustit provádění zápisu hlášení do souboru. Please do not touch these settings unless you know what you are doing. Nedotýkejte se, prosím, těchto nastavení, pokud nevíte, co děláte. Server &Prefix: Pře&dpona serveru: Extra driver options (command line suffix) Další volby pro ovladač (přípona příkazového řádku) Whether to reset all connections when a patchbay definition is activated. Nastavit všechna spojení na výchozí hodnoty, když je zapnuto vymezení zapojovací desky. &Reset all connections on patchbay activation &Nastavit všechna spojení při zapnutí zapojovací desky na výchozí hodnoty Whether to issue a warning on active patchbay port disconnections. Vydat varování při odpojení činných přípojek zapojovací desky. &Warn on active patchbay disconnections &Varovat při odpojení činných přípojek zapojovací desky &Messages log file: &Soubor se zápisem hlášení: Display Zobrazit Time Display Údaj o čase Time F&ormat: &Formát času: The general time format on display Obecný formát času pro zobrazení hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd Transport &Time Code Předání &časového kódu Transport &BBT (bar:beat.ticks) Předání &BBT (takt:doba.tiknutí - bar:beat.ticks) Elapsed time since last &Reset Čas uplynulý od posledního &znovunastavení Elapsed time since last &XRUN Čas uplynulý od posledního &XRUN Sample front panel normal display font Předvést písmo pro obvyklé zobrazení na přední straně panelu Sample big time display font Předvést písmo pro velké zobrazení údaje o čase Big Time display: Velké zobrazení údaje o čase: Select font for front panel normal display Vybrat písmo pro zobrazení písma na přední straně panelu &Font... &Písmo... Select font for big time display Vybrat písmo pro velké zobrazení údaje o čase Normal display: Obvyklé zobrazení: Whether to enable a shiny glass light effect on the main display Povolit zobrazení údajů s lesklým sklenným světelným efektem &Display shiny glass light effect &Zobrazit údaje s lesklým sklenným světelným efektem Whether to enable blinking (flashing) of the server mode (RT) indicator Povolit mrkání indikátoru serverového režimu (realtime -RT) Blin&k server mode indicator Zobrazovat mr&kání indikátoru režimu serveru Messages Window Okno s hlášením Sample messages text font display Předvést zobrazení textu v okně s hlášením Select font for the messages text display Vybrat písmo pro zobrazení textu hlášení Whether to keep a maximum number of lines in the messages window Určit největší počet řádků zobrazovaných v okně s hlášením &Messages limit: &Největší počet hlášení: The maximum number of message lines to keep in view Největší počet řádků zobrazovaných v okně s hlášením 100 100 250 250 2500 2500 Connections Window Přehled spojení Sample connections view font Předvést zobrazení písma v přehledu spojení Select font for the connections view Vybrat písmo pro přehled spojení &Icon size: &Velikost ikon: The icon size for each item of the connections view Velikost jednotlivých symbolů v přehledu spojení 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Povolit úpravu vedlejšího názvu (přezdívka) klienta/přípojky (přejmenování) Ena&ble client/port aliases editing (rename) Po&volit úpravu vedlejšího názvu (přezdívka) klienta/přípojky (přejmenování) Whether to enable client/port name aliases on the connections window Povolit vedlejší názvy (přezdívky) klienta/přípojky v přehledu spojení E&nable client/port aliases &Povolit vedlejší názvy (přezdívky) klienta/přípojky Whether to draw connection lines as cubic Bezier curves Určit, zda se mají čáry spojení kreslit jako Bézierovy křivky Server path (command line prefix) Cesta k serveru (předpona příkazového řádku) Draw connection and patchbay lines as Be&zier curves Čáry pro spojení a čáry zapojovací desky kreslit jako &Bézierovy křivky Misc Různé Other Další Whether to start JACK audio server immediately on application startup Spustit zvukový server JACK okamžitě při spuštění aplikace &Start JACK audio server on application startup &Spustit zvukový server JACK okamžitě při spuštění aplikace Whether to ask for confirmation on application exit Žádat o potvrzení při ukončení aplikace JACK client/port pretty-name (metadata) display mode Režim zobrazení pěkných názvů (popisná data) pro klienty/přípojky JACK Enable JA&CK client/port pretty-names (metadata) Povolit pěkné názvy (popisná data) pro klienty/přípojky JA&CK &Confirm application close &Potvrdit ukončení aplikace Whether to keep all child windows on top of the main window Všechna další okna udržovat nad hlavním oknem &Keep child windows always on top &Všechna další okna udržovat vždy nahoře Whether to enable the system tray icon Ukázat ikonu v systémové části panelu &Enable system tray icon Po&volit ikonu v systémové části panelu Whether to start minimized to system tray Spustit program zmenšený do systémové části panelu Start minimi&zed to system tray Spustit program &zmenšený do systémové části panelu Whether to save the JACK server command-line configuration into a local file (auto-start) Nastavení příkazového řádku ke spuštění serveru JACK-uložit do místního souboru (auto-start) S&ave JACK audio server configuration to: Nastavení ke spuštění serveru JACK &uložit jako: The server configuration local file name (auto-start) Název místního souboru s nastavením serveru (auto-start) .jackdrc .jackdrc Whether to exit once all clients have closed (auto-start) Ukončit program, když jsou rozpojena všechna klientská spojení (auto-start) C&onfigure as temporary server Nastavit jako &dočasný server Whether to ask for confirmation on JACK audio server shutdown Žádat o potvrzení při zastavení serveru JACK Confirm server sh&utdown Potvrdit &zastavení serveru Whether to enable ALSA Sequencer (MIDI) support on startup Povolit podporu (MIDI) pro řadič (sekvencer) ALSA při spuštění E&nable ALSA Sequencer support P&ovolit podporu (MIDI) pro řadič (sekvencer) ALSA Buttons Tlačítka Whether to hide the left button group on the main window Skrýt skupinu s tlačítky nalevo v hlavním okně Hide main window &Left buttons Skrýt &levá tlačítka v hlavním okně Whether to hide the right button group on the main window Skrýt skupinu s tlačítky napravo v hlavním okně Hide main window &Right buttons Skrýt &pravá tlačítka v hlavním okně Whether to hide the transport button group on the main window Skrýt skupinu s tlačítky pro předání v hlavním okně Hide main window &Transport buttons Skrýt &předávací tlačítka v hlavním okně Whether to hide the text labels on the main window buttons Skrýt textové popisky tlačítek v hlavním okně Hide main window &button text labels Skrýt textové popisky &tlačítek v hlavním okně Warning Varování Some settings have been changed: "%1" Do you want to save the changes? Některá nastavení byla změněna: "%1" Chcete uložit změny? Delete preset: "%1" Are you sure? Smazat přednastavení "%1" Jste si jistý? msec ms n/a n/a &Preset Name &Název přednastavení &Server Name &Název serveru &Server Path &Cesta k serveru &Driver &Ovladač &Interface &Rozhraní Sample &Rate Vzorkovací &kmitočet &Frames/Period &Snímky/Údobí (perioda) Periods/&Buffer Ú&dobí/Vyrovnávací paměť Startup Script Skript pro spuštění Post-Startup Script Skript pro po-spuštění Shutdown Script Skript pro zastavení chodu Post-Shutdown Script Skript pro po-zastavení chodu Active Patchbay Definition Činné vymezení zapojovací desky Patchbay Definition files Soubory s vymezením zapojovací desky Messages Log Zápis s hlášením Log files Soubory se zápisy Some settings have been changed. Do you want to apply the changes? Některá nastavení byla změněna. Chcete použít změny? &JACK client/port aliases: Vedlejší názvy (přezdívky) pro klienty/přípojky &JACK: JACK client/port aliases display mode Režim zobrazení vedlejších názvů (přezdívek) pro klienty/přípojky JACK Default Výchozí First První Second Druhý Whether to show system tray message on main window close Ukázat zprávu v oznamovací oblasti panelu při zavření hlavního okna Sho&w system tray message on close &Ukázat zprávu v oznamovací oblasti panelu při zavření Whether to stop JACK audio server on application exit Zastavit zvukový server JACK při ukončení aplikace S&top JACK audio server on application exit &Zastavit zvukový server JACK při ukončení aplikace Defaults Výchozí &Base font size: &Základní velikost písma: Base application font size (pt.) Základní velikost písma v aplikaci (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net síť &Name: &Název: The JACK Audio Connection Kit sound server name Název zvukového serveru JACK Audio Connection Kit netone síť_1 Number of microseconds to wait between engine processes (dummy) Počet mikrosekund, po které se čeká mezi strojovými procesy (dummy) Whether to enable D-Bus interface Zda povolit rozhraní D-Bus &Enable D-Bus interface &Povolit rozhraní D-Bus Whether to restrict to one single application instance (X11) Zda omezit na úroveň jednoho programu (X11) Single application &instance Ú&roveň jednoho programu qjackctlSocketForm Socket - JACK Audio Connection Kit Zásuvka - JACK Audio Connection Kit &Socket &Zásuvka &Name (alias): &Název (Přezdívka): Socket name (an alias for client name) Název zásuvky (přezdívka pro název klienta) Client name (regular expression) Název pro klienta (pravidelný výraz) Add plug to socket plug list Přidat zástrčku do seznamu se zástrčkami do zásuvky Add P&lug &Přidat zástrčku &Plug: &Zástrčka: Port name (regular expression) Název přípojky (pravidelný výraz) Socket plug list Seznam se zástrčkami do zásuvky Socket Plugs / Ports Zástrčky do zásuvky/Přípojky Edit currently selected plug Upravit nyní vybranou zástrčku &Edit &Upravit Remove currently selected plug from socket plug list Odstranit nyní vybranou zástrčku ze seznamu se zástrčkami do zásuvky &Remove &Odstranit &Client: &Klient: Move down currently selected plug in socket plug list Posunout nyní vybranou zástrčku v seznamu se zástrčkami do zásuvky dolů &Down &Dolů Move up current selected plug in socket plug list Posunout nyní vybranou zástrčku v seznamu se zástrčkami do zásuvky nahoru &Up &Nahoru Enforce only one exclusive cable connection Vynutit jedno výlučné kabelové spojení E&xclusive Vý&lučné &Forward: &Dopředu: Forward (clone) all connections from this socket Předat všechna spojení z této zásuvky (klonovat) Type Typ Audio socket type (JACK) Zvukový typ zásuvky (napojení) JACK &Audio &Zvuk MIDI socket type (JACK) MIDI typ zásuvky (napojení) (JACK) &MIDI &JACK-MIDI MIDI socket type (ALSA) MIDI typ zásuvky (napojení) (ALSA) AL&SA AL&SA-MIDI Plugs / Ports Zástrčky/Přípojky Error Chyba A socket named "%1" already exists. Zásuvka s názvem "%1" již existuje. Warning Varování Some settings have been changed. Do you want to apply the changes? Některá nastavení byla změněna. Chcete použít změny? Add Plug Přidat zástrčku Edit Upravit Remove Odstranit Move Up Přesunout nahoru Move Down Přesunout dolů (None) (Žádný) qjackctlSocketList Output Výstup Input Vstup Socket Zásuvka <New> - %1 <Nový> %1 Warning Varování %1 about to be removed: "%2" Are you sure? %1 má být odstraněno: "%2" Jste si jistý? %1 <Copy> - %2 %1 <Kopírovat> - %2 qjackctlSocketListView Output Sockets / Plugs Výstupní zásuvky/zástrčky Input Sockets / Plugs Vstupní zásuvky/zástrčky qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_ja.ts0000644000000000000000000000012713215206021021106 xustar0029 mtime=1513425937.54876694 29 atime=1513425937.54776694 29 ctime=1513425937.54876694 qjackctl-0.5.0/src/translations/qjackctl_ja.ts0000644000175000001440000052760013215206021021746 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning 警告 Audio hardware probing timed out. QObject (default) Usage: %1 [options] [command-and-args] 使用法: %1 [オプション] [コマンドと引数] Options: オプション: Start JACK audio server immediately JACKオーディオサーバーを開始します Set default settings preset name 既定のプリセット名を設定します Set active patchbay definition file アクティブなパッチベイ定義ファイルをセットします Set default JACK audio server name 既定のJACKオーディオサーバー名をセットします Show help about command line options コマンドラインオプションについてのヘルプを表示します Show version information バージョン情報を表示します Option -p requires an argument (preset). pオプションは引数としてプリセット名を必要とします。 Option -a requires an argument (path). aオプションは引数としてパスを必要とします。 Option -n requires an argument (name). nオプションは引数として名前を必要とします。 %1 (%2 frames) qjackctlAboutForm About QjackCtl QjackCtlについて &Close 閉じる(&C) About Qt Qtについて Version Using: JACK %1 Debugging option enabled. System tray disabled. Transport status control disabled. Realtime status disabled. XRUN delay status disabled. Maximum delay status disabled. JACK Port aliases support disabled. JACK MIDI support disabled. JACK Session support disabled. ALSA/MIDI sequencer support disabled. D-Bus interface support disabled. Website This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 or later. qjackctlClientListView Readable Clients / Output Ports 読み込み可能なクライアント / 出力ポート Writable Clients / Input Ports 書き込み可能なクライアント / 入力ポート &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All すべて切断(&A) Alt+A Disconect All Re&name リネーム(&n) Alt+N Rename &Refresh 更新(&R) Alt+R Refresh qjackctlConnect Warning 警告 This will suspend sound processing from all client applications. Are you sure? すべてのクライアントアプリケーションの サウンド処理をサスペンドします よろしいですか? qjackctlConnectionsForm Connections - JACK Audio Connection Kit 接続 - JACK Audio Connection Kit Audio オーディオ Connect currently selected ports 選択しているポートを接続します &Connect 接続(&C) Disconnect currently selected ports 選択しているポートを切断します &Disconnect 切断(&D) Disconnect all currently connected ports 接続しているすべてのポートを切断します Disconnect &All すべて切断(&A) Expand all client ports すべてのクライアントポートを展開します E&xpand All すべて展開(&x) Refresh current connections view 接続の表示を更新します &Refresh 更新(&R) MIDI ALSA Warning 警告 The preset aliases have been changed: "%1" Do you want to save the changes? プリセットのエイリアス名が変更されています: "%1" 変更を保存しますか? qjackctlConnectorView &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All すべて切断(&A) Alt+A Disconect All &Refresh 更新(&R) Alt+R Refresh qjackctlMainForm QjackCtl Start the JACK server JACKサーバーを開始 &Start 開始(&S) Stop the JACK server JACKサーバを停止 S&top 停止(&T) JACK server state JACKサーバーの状態 JACK server mode JACKサーバーモード DSP Load DSPの負荷 Sample rate サンプルレート XRUN Count (notifications) XRUNのカウント(notifications) Time display 時間の表示 Transport state トランスポートの状態 Transport BPM トランスポートのBPM Transport time トランスポートの時間 Quit processing and exit 処理を終わらせ終了します &Quit 終了(&Q) Show/hide the session management window セッション管理ウィンドウを表示/隠す S&ession セッション(&E) Show/hide the messages log/status window メッセージログ/状態ウィンドウを表示/隠す &Messages メッセージ(&M) Show settings and options dialog 設定とオプションダイアログを表示 Set&up... 設定(&U)... Show/hide the actual connections patchbay window 現在接続しているパッチベイウィンドウを表示/隠す &Connect 接続(&C) Show/hide the patchbay editor window パッチベイ編集ウィンドウを表示/隠す &Patchbay パッチベイ(&P) Rewind transport トランスポートを先頭に戻す &Rewind 先頭に戻す(&R) Backward transport トランスポートの逆再生 &Backward 逆再生(&B) Start transport rolling トランスポートのローリングをスタートする &Play 再生(&P) Stop transport rolling トランスポートのローリングをストップする Pa&use 一時停止(&U) Forward transport トランスポートを早送りする &Forward 早送り(&F) Show information about this application このアプリケーションについての情報を表示します Ab&out... 情報(&O)... Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. クライアントとしてALSAシーケンサーを開くことができませんでした ALSA MIDIパッチベイは利用できません。 D-BUS: Service is available (%1 aka jackdbus). D-BUS: サービスを利用できます (%1 すなわちjackdbus)。 D-BUS: Service not available (%1 aka jackdbus). D-BUS: サービスを利用できません (%1 すなわちjackdbus)。 Information 情報 The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. このプログラムはシステムトレイに表示されます。 プログラムを終了する時は、システムトレイアイコンの コンテキストメニューで"Quit"を選択して下さい。 Don't show this message again Warning 警告 JACK is currently running. Do you want to terminate the JACK audio server? JACKは動作中です。 JACKオーディオサーバーを終了しますか? successfully 成功 with exit status=%1 終了ステータス = %1 Could not start JACK. Maybe JACK audio server is already started. JACKを開始できませんでした。 おそらくもうJACKサウンドサーバーが開始されています。 Could not load preset "%1". Retrying with default. プリセット "%1" をロードできません。 既定の設定でリトライします。 Could not load default preset. Sorry. 既定のプリセットをロードできません。 ごめんなさい。 Startup script... スタートアップスクリプト... Startup script terminated スタートアップスクリプトは終了しました D-BUS: JACK server is starting... D-BUS: JACKサーバーを開始しています... D-BUS: JACK server could not be started. Sorry D-BUS: JACKサーバーを開始することができません。 ごめんなさい JACK is starting... JACKを開始しています... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? いくつかのクライアントのオーディオアプリケーションは まだアクティブな接続を持っています。 それでもJACKオーディオサーバーを終了しますか? Shutdown script... シャットダウンスクリプト... Shutdown script terminated シャットダウンスクリプトは終了しました JACK is stopping... JACKを終了しています... D-BUS: JACK server is stopping... D-BUS: JACKサーバーを終了しています... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACKサーバーを終了することができませんでした。 ごめんなさい JACK was started with PID=%1. JACKはプロセスID=%1で開始しました。 D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACKサーバーはスタートしました (%1 すなわちjackdbus)。 JACK is being forced... JACKは強制終了します... JACK was stopped JACKは終了しました D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACKサーバーは終了しました (%1 すなわちjackdbus)。 Post-shutdown script... ポストシャットダウンスクリプト... Post-shutdown script terminated ポストシャットダウンスクリプトは終了しました Error エラー Don't ask this again Transport BBT (bar.beat.ticks) Transport time code トランスポートのタイムコード Elapsed time since last reset 最後のリセットからの経過時間 Elapsed time since last XRUN 最後のXRUNからの経過時間 Patchbay reset. Could not load active patchbay definition. "%1" Disabled. アクティブなパッチベイ定義をロードできません。 "%1" 無効にしました。 Patchbay activated. パッチベイを有効にしました。 Patchbay deactivated. パッチベイを無効にしました。 Statistics reset. 統計のリセット。 msec ミリ秒 JACK connection graph change. JACK接続グラフは変更されました。 XRUN callback (%1). XRUNコールバック (%1)。 Buffer size change (%1). バッファサイズを変更しました (%1)。 Shutdown notification. シャットダウンの通知。 Could not start JACK. Sorry. JACKを開始できませんでした。 ごめんなさい。 JACK has crashed. JACKはクラッシュしました。 JACK timed out. JACKはタイムアウトしました。 JACK write error. JACK writeエラー。 JACK read error. JACK readエラー。 Unknown JACK error (%d). 不明なJACKエラー (%d)。 JACK property change. ALSA connection graph change. ALSA接続グラフは変更されました。 JACK active patchbay scan JACKのアクティブなパッチベイのスキャン ALSA active patchbay scan ALSAのアクティブなパッチベイのスキャン JACK connection change. JACKの接続は変更されました。 ALSA connection change. ALSAのコネクションは変更されました。 checked 確認済み connected 接続中 disconnected 接続なし failed 失敗 A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? パッチベイ定義は現在アクティブであり 接続を再度やり直します。 %1 -> %2 パッチベイ接続を取り除きますか? Overall operation failed. 操作全体が失敗しました。 Invalid or unsupported option. 不正なオプションか、サポートされていないオプションです。 Client name not unique. 固有のクライアント名ではありません。 Server is started. サーバーを開始しました。 Unable to connect to server. サーバーに接続することができません。 Server communication error. サーバーとのコミュニケーションエラーです。 Client does not exist. クライアントが存在しません。 Unable to load internal client. 内部クライアントをロードすることができません。 Unable to initialize client. クライアントを初期化することができません。 Unable to access shared memory. 共有メモリーへアクセスすることができません。 Client protocol version mismatch. クライアントのプロトコルバージョンが一致しません。 Could not connect to JACK server as client. - %1 Please check the messages window for more info. JACKサーバーとクライアントとして接続することができませんでした。 - %1 メッセージウィンドウで詳細な情報を確認して下さい。 Server configuration saved to "%1". サーバー設定を "%1" に保存しました。 Client activated. クライアントは有効となりました。 Post-startup script... ポストスタートアップスクリプト... Post-startup script terminated ポストスタートアップスクリプトの終了 Command line argument... コマンドライン引数... Command line argument started コマンドライン引数の開始 Client deactivated. クライアントは無効となりました。 Transport rewind. トランスポートを開始まで戻します。 Transport backward. トランスポートを逆再生します。 Starting 開始 Transport start. トランスポートの開始。 Stopping 停止 Transport stop. トランスポートを停止しました。 Transport forward. トランスポートを早送りします。 Stopped 停止 %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 Hz %1 frames Yes はい No いいえ RT Rolling ローリング Looping ループ %1 msec XRUN callback (%1 skipped). XRUNコールバック (%1 をスキップ)。 Started 開始 Active 有効 Activating 有効化 Inactive 無効 &Hide 非表示(&H) Mi&nimize 最小化(&n) S&how 表示(&h) Rest&ore 元に戻す(&o) &Stop 停止(&S) &Reset リセット(&R) &Presets プリセット(&P) &Load... 読み込み(&L)... &Save... 保存(&S)... Save and &Quit... 保存して終了(&Q)... Save &Template... テンプレートを保存(&T)... &Versioning バージョン(&V) Re&fresh 更新(&F) St&atus 状態(&A) &Connections 接続(&C) Patch&bay パッチベイ(&B) &Transport トランスポート(&T) Server settings will be only effective after restarting the JACK audio server. サーバー設定はJACKオーディオサーバーを再起動後にのみ 有効となります。 Some settings will be only effective the next time you start this program. いくつかの設定は次回にこのプログラムを起動した際にのみ 有効となります。 D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit メッセージ / 状態 - -JACK Audio Connection Kit &Messages メッセージ(&M) Messages log メッセージのログ Messages output log メッセージ出力ログ &Status 状態(&S) Status information 状態の情報 Statistics since last server startup 最後にサーバーが開始してからの統計 Description 項目 Value Reset XRUN statistic values XRUN統計値のリセット Re&set リセット(&S) Refresh XRUN statistic values XRUN統計値の更新 &Refresh 更新(&R) Server name サーバー名 Server state サーバーの状態 DSP Load DSP負荷 Sample Rate サンプルレート Buffer Size バッファサイズ Realtime Mode リアルタイムモード Transport state トランスポートの状態 Transport Timecode トランスポート タイムコード Transport BBT トランスポート BBT Transport BPM トランスポート BPM XRUN count since last server startup 最後にサーバーが開始してからのXRUNの数 XRUN last time detected 検出されたXRUNの継続時間 XRUN last XRUNの継続 XRUN maximum XRUNの最大値 XRUN minimum XRUNの最小値 XRUN average XRUNの平均値 XRUN total XRUNの合計 Maximum scheduling delay スケジュールされたディレイの最大値 Time of last reset 最後のリセットの時間 Logging stopped --- %1 --- ログの終了 --- %1 --- Logging started --- %1 --- ログの開始 --- %1 --- qjackctlPatchbay Warning 警告 This will disconnect all sockets. Are you sure? すべてのソケットを切断します よろしいですか? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit パッチベイ - JACK Audio Connection Kit Move currently selected output socket down one position 選択している出力ソケットを下へ移動します Down 下へ Create a new output socket 新しい出力ソケットを作成します Add... 追加... Edit currently selected input socket properties 選択している入力ソケットのプロパティを編集します Edit... 編集... Move currently selected output socket up one position 選択している出力ソケットを上に移動します Up 上へ Remove currently selected output socket 選択している出力ソケットを削除します Remove 削除 Duplicate (copy) currently selected output socket 選択している出力ソケットを複製(コピー)します Copy... コピー... Remove currently selected input socket 選択している入力ソケットを削除します Duplicate (copy) currently selected input socket 選択している入力ソケットを複製(コピー)します Create a new input socket 新しい入力ソケットを作成します Edit currently selected output socket properties 選択している出力ソケットのプロパティを編集します Connect currently selected sockets 選択しているソケットを接続します &Connect 接続(&C) Disconnect currently selected sockets 選択しているソケットを切断します &Disconnect 切断(&D) Disconnect all currently connected sockets 接続されているすべてのソケットを切断します Disconnect &All すべて切断(&A) Expand all items すべてのアイテムを展開します E&xpand All すべて展開(&X) Refresh current patchbay view パッチベイの表示を更新します &Refresh 更新(&R) Create a new patchbay profile 新しいパッチベイプロファイルを作成します &New 新規(&N) Load patchbay profile パッチベイプロファイルをロードします &Load... 読み込み(&L)... Save current patchbay profile パッチベイプロファイルを保存します &Save... 保存(&S)... Current (recent) patchbay profile(s) 現在の(最近使った)パッチベイプロファイル Toggle activation of current patchbay profile 現在のパッチベイプロファイルの有効化/無効化 Acti&vate 有効化(&V) Warning 警告 The patchbay definition has been changed: "%1" Do you want to save the changes? パッチベイの定義が変更されています: "%1" 変更を保存しますか? %1 [modified] %1 [変更] Untitled%1 無題%1 Error エラー Could not load patchbay definition file: "%1" パッチベイ定義ファイルをロードできません: "%1" Could not save patchbay definition file: "%1" パッチベイ定義ファイルを保存できません: "%1" New Patchbay definition 新規パッチベイの定義 Create patchbay definition as a snapshot of all actual client connections? 現在有効なすべてののクライアント接続を元に パッチベイ定義を作成しますか? Load Patchbay Definition パッチベイの定義をロードします Patchbay Definition files パッチベイ定義ファイル Save Patchbay Definition パッチベイの定義を保存します active アクティブ qjackctlPatchbayView Add... 追加... Edit... 編集... Copy... コピー... Remove 削除 Exclusive 排他的 Forward 早送り (None) (なし) Move Up 上へ移動 Move Down 下へ移動 &Connect 接続(&C) Alt+C Connect &Disconnect 切断(&D) Alt+D Disconnect Disconnect &All すべて切断(&A) Alt+A Disconect All &Refresh 更新(&R) Alt+R Refresh qjackctlSessionForm Session - JACK Audio Connection Kit セッション - JACK Audio Connection Kit Load session セッションをロードします &Load... 読み込み(&L)... Recent session 最近のセッション &Recent 最近のセッション(&R) Save session セッションを保存します &Save 保存(&S) Save session versioning セッションのバージョンを保存します &Versioning バージョン(&V) Update session セッションの更新 Re&fresh 更新(&F) Session clients / connections Client / Ports クライアント / ポート UUID Command コマンド Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit 編集(&E) Remove infra-client Re&move &Save... 保存(&S)... Save and &Quit... 保存して終了(&Q)... Save &Template... テンプレートを保存(&T)... Load Session セッションをロード Session directory セッションのディレクトリ Save Session セッションの保存 and Quit そして終了 Template テンプレート &Clear クリア(&C) Warning 警告 A session could not be found in this folder: "%1" このフォルダーにセッションを見つけることができません: "%1" %1: loading session... %1: セッションをロードしています... %1: load session %2. %1: セッションのロード %2。 A session already exists in this folder: "%1" Are you sure to overwrite the existing session? セッションはすでにこのフォルダーにあります: "%1" 存在するセッションを上書きしますか? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? このフォルダーはすでに存在していて、空です: "%1" 存在するフォルダーを上書きしますか? %1: saving session... %1: セッションを保存しています... %1: save session %2. %1: セッションの保存 %2。 New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit 設定 - JACK Audio Connection Kit Settings 設定 Preset &Name: プリセット名(&N): Settings preset name プリセット設定名 (default) defaultは内部的にはシンボル名となっているようで、「既定」としてしまうとそういう新規プリセットとして扱われるようです。 Save settings as current preset name 設定を現在のプリセット名として保存 &Save 保存(&S) Delete current settings preset 現在のプリセットを削除します &Delete 削除(&D) jackd jackdmp jackstart &Name: 名前(&N): The JACK Audio Connection Kit sound server name JACK Audio Connection Kitサウンドサーバー名 Driv&er: ドライバー(&E): The audio backend driver interface to use 使用するオーディオバックエンドドライバーインターフェイス dummy sun oss alsa portaudio coreaudio freebob firewire net netone Parameters パラメーター MIDI Driv&er: MIDIドライバー(&E): The ALSA MIDI backend driver to use 使用するALSA MIDIバックエンドドライバー none なし raw seq Time in seconds that client is delayed after server startup サーバーを開始してからのクライアントが遅延する時間(秒) Latency: レイテンシー: Output latency in milliseconds, calculated based on the period, rate and buffer settings ピリオド、サンプルレートそしてバッファーサイズから計算した、出力のレイテンシ (ミリ秒) Use realtime scheduling リアルタイムスケジューリングを使用します &Realtime リアルタイム(&R) Do not attempt to lock memory, even if in realtime mode リアルタイムモードでなくても、メモリーをロックしないようにします No Memory Loc&k Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) 一般的なツールキットライブラリーのメモリーをアンロックする (GTK+, QT, FLTK, Wine) &Unlock Memory Ignore xruns reported by the backend driver バックエンドドライバーが報告するXRUNを無視します So&ft Mode ソフトモード(&f) Provide output monitor ports 出力モニター用にポートを提供します &Monitor モニター(&M) Force 16bit mode instead of failing over 32bit (default) 32ビットモード(既定)で失敗する場合に16ビットモードを強制できます Force &16bit 強制的に16bitを使用(&1) Enable hardware monitoring of capture ports 録音ポートのハードウェアモニタリングを有効にする H/W M&onitor H/Wモニターを有効(&O) Enable hardware metering on cards that support it ハードウェアメーターをサポートしているカードではそれを有効にします H/&W Meter H/Wメーターを有効(&W) Ignore hardware period/buffer size ハードウェアのピリオド/バッファーサイズを無視します &Ignore H/W H/Wを無視(&I) Whether to give verbose output on messages メッセージに詳細な出力を行うかどうか &Verbose messages 詳細なメッセージ(&V) &Output Device: 出力デバイス(&O): &Interface: インターフェース(&I): Maximum input audio hardware channels to allocate 割り当てる入力オーディオハードウェアチャンネルの最大値 &Audio: オーディオ(&A): Dit&her: ディザリング(&h): External output latency (frames) 外部出力レイテンシー(フレーム) &Input Device: 入力デバイス(&I): Provide either audio capture, playback or both 音声の入力か出力、あるいは入出力から選択します Duplex 入出力 Capture Only 入力のみ Playback Only 出力のみ The PCM device name to use 使用するPCMデバイス名 hw:0 plughw:0 /dev/audio /dev/dsp > Alternate input device for capture 録音のための入力デバイスを選択 Maximum output audio hardware channels to allocate 割り当てるオーディオ出力ハードウェアチャンネルの最大値 Alternate output device for playback 再生のための出力デバイス External input latency (frames) 外部入力のレイテンシー(フレーム) Set dither mode ディザリングモードをセットします None なし Rectangular Shaped Triangular Number of periods in the hardware buffer ハードウェアバッファーのピリオド数 Priorit&y: 優先度(&y): &Frames/Period: フレーム/ピリオド(&F): Frames per period between process() calls process()コール間のピリオド毎のフレーム数 16 32 64 128 256 512 1024 2048 4096 Port Ma&ximum: 最大ポート数(&x): &Channels: チャンネル(&C): Number of microseconds to wait between engine processes (dummy) エンジンプロセス間の待ち時間をマイクロ秒で指定します(dummy) 21333 Sample rate in frames per second サンプリングレートを1秒あたりのフレーム数で指定します 22050 32000 44100 48000 88200 96000 192000 Scheduler priority when running realtime リアルタイムモードで稼動している場合のスケジューラーにおける優先度を設定します &Word Length: ワード長(&W): Periods/&Buffer: ピリオド/バッファー(&B): Word length ワード長 Maximum number of ports the JACK server can manage JACKサーバーが管理するポートの最大数 &Wait (usec): 待ち時間(マイクロ秒)(&W): Sample &Rate: サンプルレート(&R): Maximum number of audio channels to allocate 割り当てるオーディオチャンネルの最大値 &Timeout (msec): タイムアウト(ミリ秒)(&T): Set client timeout limit in milliseconds クライアントのタイムリミットをミリ秒で指定します Please do not touch these settings unless you know what you are doing. 200 500 1000 2000 5000 10000 Options オプション Scripting スクリプト Whether to execute a custom shell script before starting up the JACK audio server. JACKオーディオサーバーを開始する前に任意のシェルスクリプトを実行するかどうか。 Execute script on Start&up: スタートアップ時にスクリプトを実行(&U): Whether to execute a custom shell script after starting up the JACK audio server. JACKオーディオサーバーを開始した直後に任意のシェルスクリプトを実行するかどうか。 Execute script after &Startup: スタートアップ後にスクリプトを実行(&S): Whether to execute a custom shell script before shuting down the JACK audio server. JACKオーディオサーバーを終了する直前に任意のシェルスクリプトを実行するかどうか。 Execute script on Shut&down: シャットダウン時にスクリプトを実行(&D): Command line to be executed before starting up the JACK audio server JACKオーディオサーバーを開始する前に実行されるコマンドライン Scripting argument meta-symbols メタシンボルとして使えるスクリプト引数 Browse for script to be executed before starting up the JACK audio server JACKオーディオサーバーを開始する前に実行するスクリプトを参照します ... Command line to be executed after starting up the JACK audio server JACKオーディオサーバーを開始した後に実行されるコマンドライン Browse for script to be executed after starting up the JACK audio server JACKオーディオサーバーを開始した後に実行するスクリプトを参照します Browse for script to be executed before shutting down the JACK audio server JACKオーディオサーバーを終了する直前に実行するスクリプトを参照します Command line to be executed before shutting down the JACK audio server JACKオーディオサーバーを終了する直前に実行されるコマンドライン Whether to execute a custom shell script after shuting down the JACK audio server. JACKオーディオサーバーを終了した直後に任意のシェルスクリプトを実行するかどうか。 Execute script after Shu&tdown: シャットダウン後にスクリプトを実行(&D): Browse for script to be executed after shutting down the JACK audio server JACKオーディオサーバーを終了した直後に実行するスクリプトを参照します Command line to be executed after shutting down the JACK audio server JACKオーディオサーバーを終了した直後に実行されるコマンドライン Statistics 統計 Whether to capture standard output (stdout/stderr) into messages window メッセージウィンドウ中に標準出力(stdout/stderr)を記録するかどうか &Capture standard output 標準出力の記録(&C) &XRUN detection regex: XRUN検出の正規表現(&X): Regular expression used to detect XRUNs on server output messages サーバー出力メッセージ内においてXRUNを検出した際に使用される正規表現 xrun of at least ([0-9|\.]+) msecs Connections 接続 Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 Patchbay definition file to be activated as connection persistence profile 接続において持続して有効にするパッチベイ定義ファイルを指定します Browse for a patchbay definition file to be activated 有効にするパッチベイ定義の参照 Whether to activate a patchbay definition for connection persistence profile. 接続において継続して有効にするパッチベイ定義を有効にするかどうか。 Activate &Patchbay persistence: 持続的パッチベイ有効(&P): Logging ログの記録 Messages log file メッセージログファイル Browse for the messages log file location メッセージログファイルの場所を参照します Whether to activate a messages logging to file. メッセージをファイルに記録するかどうか。 Server &Prefix: サーバー接頭辞(&P): Server path (command line prefix) サーバーパス (コマンドライン接頭辞) &Channels I/O: チャンネルI/O(&C): &Latency I/O: レイテンシーI/O(&L): Server Suffi&x: サーバー接尾辞(&X): Extra driver options (command line suffix) 任意のドライバーオプション (コマンドライン接尾辞) Start De&lay: 開始ディレイ(&L): secs 0 msecs 0ミリ秒 &Messages log file: メッセージログファイル(&M): Display 表示 Time Display 時間表示 Time F&ormat: 時間フォーマット(&O): The general time format on display 共通して使われる時間表記フォーマット hh:mm:ss hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.ddd Transport &Time Code トランスポートのタイムコード(&T) Transport &BBT (bar:beat.ticks) トランスポートのBBT (bar: beat, ticks)(&B) Elapsed time since last &Reset 最後のリセットからの経過時間(&R) Elapsed time since last &XRUN 最後のXRUNからの経過時間(&X) Sample front panel normal display font フロントパネルの通常表示のフォントサンプル Sample big time display font ビッグタイム表示のサンプルフォント Big Time display: ビッグタイム表示: Select font for front panel normal display フロントパネル表示に使用するフォントを選択します &Font... フォント(&F)... Select font for big time display ビッグタイム表示に使用するフォントを選択します Normal display: 通常の表示: Whether to enable a shiny glass light effect on the main display メイン表示の効果に光沢のあるガラスライトを適用するかどうか &Display shiny glass light effect 光沢のあるガラスライト効果(&D) Whether to enable blinking (flashing) of the server mode (RT) indicator サーバーモード(RT)インジケーターを点滅するかどうか Blin&k server mode indicator サーバーモードインジケーターの点滅(&K) Messages Window メッセージウィンドウ Sample messages text font display メッセージテキスト表示に使用するフォントのサンプル Select font for the messages text display メッセージテキスト表示に使用するフォントを選択します Whether to keep a maximum number of lines in the messages window メッセージウィンドウに1度に表示できる行数の最大値 &Messages limit: メッセージリミット(&M): The maximum number of message lines to keep in view メッセージビューに1度に表示できる行数の最大値 100 250 2500 Connections Window 接続ウィンドウ Sample connections view font 接続ビューに使用するフォントのサンプル Select font for the connections view 接続ビューに使用するフォントを選択します &Icon size: アイコンサイズ(&I): The icon size for each item of the connections view コネクションビューに表示されるそれぞれのアイコンのサイズ 16 x 16 32 x 32 64 x 64 Whether to draw connection lines as cubic Bezier curves 接続線をキュービックベジェ曲線で描くかどうか Draw connection and patchbay lines as Be&zier curves 接続とパッチベイの線をベジェ曲線で描画(&z) Whether to enable client/port name aliases on the connections window 接続ウィンドウにクライアント/ポートのエイリアス名を有効とするかどうか E&nable client/port aliases クライアント/ポートのエイリアス名の有効化(&n) Whether to enable in-place client/port name editing (rename) クライアント/ポート名の編集(リネーム) Ena&ble client/port aliases editing (rename) クライアント/ポートのエイリアス名編集(リネーム)を有効(&b) &JACK client/port aliases: JACKクライアント/ポート エイリアス(&J): Advanced JACK client/port aliases display mode JACKのクライアント/ポートエイリアス表示モード Default 既定 First 1番目 Second 2番目 JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Misc その他 Other その他 Whether to start JACK audio server immediately on application startup アプリケーション開始時にJACKオーディオサーバーを開始するかどうか &Start JACK audio server on application startup JACKオーディオサーバーの自動起動(&S) Whether to ask for confirmation on application exit アプリケーションが終了する際に確認する &Confirm application close アプリケーションの終了の確認(&C) Whether to keep all child windows on top of the main window 子ウィンドウを常に前面に表示します &Keep child windows always on top 子ウィンドウを常に前面表示(&K) Whether to enable the system tray icon システムトレイアイコンを有効にするかどうか &Enable system tray icon システムトレイアイコンを有効(&E) Whether to show system tray message on main window close Sho&w system tray message on close Whether to start minimized to system tray 開始時にシステムトレイアイコンのみ表示するかどうか Start minimi&zed to system tray 開始時にシステムトレイに最小化する(&Z) Whether to restrict to one single application instance (X11) アプリケーションのインスタンスをひとつに制限するかどうか (X11) Single application &instance シングルアプリケーションインスタンス(&I) Whether to save the JACK server command-line configuration into a local file (auto-start) JACKサーバーのコマンドライン設定をローカルファイルに保存するかどうか (自動で保存されます) S&ave JACK audio server configuration to: JACKオーディオサーバー設定の保存先(&A): The server configuration local file name (auto-start) サーバー設定ローカルファイル名(自動起動) .jackdrc Whether to exit once all clients have closed (auto-start) すべてのクライアントが終了したらアプリケーションも終了するかどうか (自動起動) C&onfigure as temporary server 一時サーバーとして設定(&C) Whether to ask for confirmation on JACK audio server shutdown サーバーのシャットダウンを確認するかどうか Confirm server sh&utdown サーバーのシャットダウンを確認する(&U) Whether to enable ALSA Sequencer (MIDI) support on startup 開始時にALSAシーケンサー (MIDI) サポートを有効にするかどうか E&nable ALSA Sequencer support ALSAシーケンサーサポートを有効(&N) Whether to enable D-Bus interface D-Busインターフェイスを有効にするかどうか &Enable D-Bus interface D-Busインターフェースの有効化(&E) Whether to stop JACK audio server on application exit アプリケーションが終了する時にJACKオーディオサーバーを停止するかどうか S&top JACK audio server on application exit JACKオーディオサーバーの自動終了(&S) Buttons ボタン Whether to hide the left button group on the main window メインウィンドウ左のボタングループを隠すかどうか Hide main window &Left buttons メインウィンドウ左側のボタンを隠す(&L) Whether to hide the right button group on the main window メインウィンドウ右のボタングループを隠すかどうか Hide main window &Right buttons メインウィンドウ右側のボタンを隠す(&R) Whether to hide the transport button group on the main window メインウィンドウのトランスポートボタングループを隠すかどうか Hide main window &Transport buttons メインウィンドウのトランスポートボタンを隠す(&T) Whether to hide the text labels on the main window buttons メインウィンドウボタンのテキストラベルを隠すかどうか Hide main window &button text labels メインウィンドウボタンのテキストラベルを隠す(&B) Defaults 既定 &Base font size: 基本フォントサイズ(&B): Base application font size (pt.) アプリケーションの基本フォントサイズ(pt) 6 7 8 9 11 12 Warning 警告 Some settings have been changed: "%1" Do you want to save the changes? 設定の一部が変更されています: "%1" 変更を保存しますか? Delete preset: "%1" Are you sure? プリセットを削除します: "%1" よろしいですか? msec ミリ秒 n/a &Preset Name プリセット名(&P) &Server Name サーバー名(&S) &Server Path サーバーパス(&S) &Driver ドライバー(&D) &Interface インターフェース(&I) Sample &Rate サンプルレート(&R) &Frames/Period フレーム/ピリオド(&F) Periods/&Buffer ピリオド/バッファー(&B) Startup Script スタートアップスクリプト Post-Startup Script ポストスタートアップスクリプト Shutdown Script シャットダウンスクリプト Post-Shutdown Script ポストシャットダウンスクリプト Active Patchbay Definition 有効なパッチベイ定義 Patchbay Definition files パッチベイ定義ファイル Messages Log メッセージログ Log files ログファイル Some settings have been changed. Do you want to apply the changes? いくつかの設定が変更されました。 変更を適用しますか? qjackctlSocketForm Socket - JACK Audio Connection Kit ソケット - -JACK Audio Connection Kit &Socket ソケット(&S) &Name (alias): 名前(エイリアス)(&N): Socket name (an alias for client name) ソケット名(クライアント名のエイリアス) Client name (regular expression) クライアント名 (正規表現) Add plug to socket plug list プラグをソケットプラグリストに追加します Add P&lug プラグ追加(&L) &Plug: プラグ(&P): Port name (regular expression) ポート名 (正規表現) Socket plug list ソケットプラグのリスト Socket Plugs / Ports ソケットプラグ/ポート Edit currently selected plug 選択しているプラグを編集します &Edit 編集(&E) Remove currently selected plug from socket plug list ソケットプラグリストから選択しているプラグを外します &Remove 削除(&R) &Client: クライアント(&C): Move down currently selected plug in socket plug list ソケットプラグリストで選択しているプラグをひとつ下に移動します &Down 下へ(&D) Move up current selected plug in socket plug list ソケットプラグリストで選択しているプラグをひとつ上に移動します &Up 上へ(&U) Enforce only one exclusive cable connection 排他的なケーブル接続を強制します E&xclusive 排他的(&X) &Forward: 転送(&F): Forward (clone) all connections from this socket このソケットからすべての接続を転送(クローン)します Type タイプ Audio socket type (JACK) オーディオソケットタイプ(JACK) &Audio オーディオ(&A) MIDI socket type (JACK) MIDIソケットタイプ(JACK) &MIDI MIDI socket type (ALSA) MIDIソケットタイプ(ALSA) AL&SA Plugs / Ports プラグ/ポート Error エラー A socket named "%1" already exists. ソケット名 "%1" はすでに存在します。 Warning 警告 Some settings have been changed. Do you want to apply the changes? いくつかの設定が変更されました。 変更を適用しますか? Add Plug プラグを追加 Edit 編集 Remove 削除 Move Up 上へ移動 Move Down 下へ移動 (None) (なし) qjackctlSocketList Output 出力 Input 入力 Socket ソケット <New> - %1 <新規> - %1 Warning 警告 %1 about to be removed: "%2" Are you sure? %1を削除しようとしています: "%2" よろしいですか? %1 <Copy> - %2 %1 <コピー> - %2 qjackctlSocketListView Output Sockets / Plugs 出力ソケット / プラグ Input Sockets / Plugs 入力ソケット / プラグ qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_es.ts0000644000000000000000000000012713215206021021123 xustar0029 mtime=1513425937.54676694 29 atime=1513425937.54576694 29 ctime=1513425937.54676694 qjackctl-0.5.0/src/translations/qjackctl_es.ts0000644000175000001440000050111513215206021021754 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Advertencia Audio hardware probing timed out. QObject (default) Start JACK audio server immediately Iniciar servidor de audio JACK ahora Set active patchbay definition file Establecer el fichero del patchbay activo Show help about command line options Mostrar ayuda sobre las opciones de línea de comando Show version information Mostrar información sobre esta versión Option -p requires an argument (preset). La opción -p nececita un argumento (nombre de un preset). Usage: %1 [options] [command-and-args] Uso: %1 [opciones] [comandos-y-argumentos] Options: Opciones: Set default settings preset name Establece el preset predeterminado Option -a requires an argument (path). La opción -a requiere un argumento (ruta). Set default JACK audio server name Establecer el nombre predetermindado del servidor de audio JACK Option -n requires an argument (name). La opción -n necesita un argumento (nombre). %1 (%2 frames) qjackctlAboutForm About Qt Acerca de QT &Close &Cerrar Version Versión Debugging option enabled. Depuración habilitada. System tray disabled. Bandeja del sistema deshabilitada. Transport status control disabled. Reporte del estado de transporte deshabilitado. Realtime status disabled. Estado de Realtime deshabilitado. XRUN delay status disabled. Reporte del retardo de XRUN deshabilitado. Maximum delay status disabled. Reporte del retardo máximo deshabilitado. ALSA/MIDI sequencer support disabled. Soporte para secuenciador ALSA/MIDI deshabilitado. Website Website This program is free software; you can redistribute it and/or modify it Este programa es software libre; Usted puede redistribuirlo y/o modificarlo under the terms of the GNU General Public License version 2 or later. bajo los términos de la Licencia Pública General GNU versión 2 o posterior. JACK MIDI support disabled. Soporte MIDI en JACK deshabilitado. About QjackCtl Acerca de QjackCtl JACK Port aliases support disabled. Soporte para alias de los puertos de JACK deshabilitado. D-Bus interface support disabled. Soporte para la interfaz D-Bus deshabilitado. JACK Session support disabled. Soporte para sesiones de JACK deshabilitado. Using: JACK %1 Usando: JACK %1 qjackctlClientListView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T Re&name Cambiar &Nombre Alt+N Rename Alt+N &Refresh &Refrescar Alt+R Refresh Alt+R Readable Clients / Output Ports Puertos de Salida / Clientes Leíbles Writable Clients / Input Ports Puertos de Entrada / Clientes Escribibles qjackctlConnect Warning Advertencia This will suspend sound processing from all client applications. Are you sure? Esto suspenderá el procesamiento de sonido de todas las aplicaciones. Está seguro? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Conexiones - JACK Audio Connection Kit Audio Audio &Connect &Conectar Connect currently selected ports Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected ports Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected ports Desconectar todos los puertos seleccionados &Refresh &Refrescar Refresh current connections view Refrescar la vista actual de conexiones MIDI MIDI Warning Advertencia The preset aliases have been changed: "%1" Do you want to save the changes? Los alias de presets han cambiado: "%1" Desea guardar los cambios? ALSA ALSA Expand all client ports Expandir todos los puertos de los clientes E&xpand All E&xpandir Todos qjackctlConnectorView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R qjackctlMainForm &Quit &Salir Quit processing and exit Terminar procesamiento y salir &Start &Iniciar Start the JACK server Iniciar el servidor JACK S&top &Detener Stop the JACK server Detener el servidor JACK St&atus &Estado Ab&out... Ace&rca... Show information about this application Mostrar información sobre esta aplicación Show settings and options dialog Mostrar el diálogo de opciones y preferencias &Messages &Mensajes Patch&bay Patch&bay Show/hide the patchbay editor window Mostrar / ocultar el editor de patchbay &Connect &Conexiones Show/hide the actual connections patchbay window Mostrar / ocultar el patchbay con las conexiones actuales JACK server state Estado del servidor JACK JACK server mode Modo del servidor JACK Sample rate Frecuencia de muestreo Time display Visor de tiempo Transport state Estado del transporte Transport BPM BPM del transporte Transport time Tiempo del transporte Backward transport Retroceder transporte Forward transport Avanzar transporte (Alt+L) Rewind transport Rebobinar transporte (Alt+K) Stop transport rolling Detener el transporte (Shift+Espacio) Start transport rolling Iniciar el transporte (Espacio) Warning Advertencia successfully satisfactoriamente with exit status=%1 con estado %1 Could not load preset "%1". Retrying with default. No se pudo cargar el preset "%1". Probando con el predeterminado. Could not load default preset. Sorry. Lo siento. No se pudo cargar el preset predeterminado. Startup script... Script de inicio... Startup script terminated El script de inicio finalizó JACK is starting... JACK está iniciándose... Could not start JACK. Sorry. Lo siento. No se pudo iniciar JACK. JACK is stopping... JACK está deteniéndose... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. El programa seguirá corriendo en la bandeja del sistema. Para terminarlo, por favor eljia "Salir" en el menú contextual del ícono en la bandeja del sistema. Shutdown script... Script de apagado... Shutdown script terminated El script de apagado finalizó JACK was stopped JACK ha sido detenido Post-shutdown script... Script de post - apagado... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Disponible (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: No disponible (%1 aka jackdbus). Don't show this message again Don't ask this again D-BUS: JACK server is starting... D-BUS: Iniciando servidor JACK... D-BUS: JACK server could not be started. Sorry D-BUS: El servidor JACK no puede iniciarse. Disculpa D-BUS: JACK server is stopping... D-BUS: Deteniendo el servidor JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: El servidor JACK no puede detenerse. Disculpa Post-shutdown script terminated El script de post - apagado finalizó D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: El servidor JACK se ha iniciado (%1 aka jackdbus). D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: El servidor JACK se ha detenido (%1 aka jackdbus). Error Error Transport time code Código de tiempo del transporte Elapsed time since last reset Tiempo transcurrido desde el último reset Elapsed time since last XRUN Tiempo transcurrido desde el último XRUN Patchbay activated. Patchbay activada. Patchbay deactivated. Patchbay desactivada. Statistics reset. Reiniciar estadísticas. msec mseg XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio en el tamaño de buffer (%1). Shutdown notification. Notificación de apagado. JACK property change. checked verificado connected conectado disconnected desconectado failed falló Server configuration saved to "%1". Configuración del servidor salvada en "%1". Client activated. Cliente activado. Post-startup script... Script de post - inicio... Post-startup script terminated El script de post - inicio finalizó Command line argument... Argumento de la línea de comando... Command line argument started Argumento de la línea de comando iniciado Client deactivated. Cliente desactivado. Transport rewind. Rebobinar transporte. Transport backward. Retroceder transporte. Starting Iniciando Transport start. Iniciar transporte. Stopping Deteniendo Transport stop. Detener transporte. Transport forward. Avanzar transporte. Stopped Detenido Yes Si No No RT RT Rolling Rolling Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Iniciado Active Activo Activating Activando Inactive Inactivo &Hide &Ocultar Mi&nimize Mi&nimizar S&how &Mostrar Rest&ore &Restablecer &Stop &Detener &Reset &Reset &Connections &Conexiones Server settings will be only effective after restarting the JACK audio server. La configuración sólo se hará efectiva reiniciando el servidor JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Información Some settings will be only effective the next time you start this program. Algunas configuraciones sólo se aplicarán la próxima vez que inicie este programa. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. No se puede abrir el secuenciador ALSA como cliente El patchbay MIDI de ALSA no estará disponible. JACK is currently running. Do you want to terminate the JACK audio server? JACK se está ejecutando actualmente. Desea terminar el servidor de audio JACK? Could not start JACK. Maybe JACK audio server is already started. No puede iniciarse JACK. Quizás el servidor de audio JACK ya haya sido iniciado. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Algunas aplicaciones de audio están activas y conectadas. Desea detener el servidor de audio JACK? JACK was started with PID=%1. JACK se inició con PID=%1. JACK is being forced... JACK está siendo forzado... Patchbay reset. JACK connection graph change. Cambió el gráfico de conexiones de JACK. JACK has crashed. JACK ha petado. JACK timed out. Tiempo de espera para JACK agotado. JACK write error. Error de escritura JACK. JACK read error. Error de lectura JACK. Unknown JACK error (%d). Error JACK desconocido (%d). ALSA connection graph change. Cambió el gráfico de conexiones ALSA. JACK active patchbay scan Escaneo del patchbay JACK activo ALSA active patchbay scan Escaneo del patchbay ALSA activo JACK connection change. Cambios en las conexiones JACK. ALSA connection change. Cambios en las conexiones ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una definición de patchbay está activa actualmente, y es probable rehacer esta conexion: %1 -> %2 Desea remover la conexion? Overall operation failed. La operación global falló. Invalid or unsupported option. Opción inválida o no soportada. Client name not unique. El nombre de cliente no es único. Server is started. El servidor está iniciado. Unable to connect to server. No puede conectarse al servidor. Server communication error. Error de comunicación con el servidor. Client does not exist. El cliente no existe. Unable to load internal client. No puede cargarse el cliente interno. Unable to initialize client. No puede inicializarse el cliente. Unable to access shared memory. No puede accederse a la memoria compartida. Client protocol version mismatch. La versión del protocolo cliente no concuerda. Could not connect to JACK server as client. - %1 Please check the messages window for more info. No puede conectarse al servidor JACK como cliente. - %1 Por favor revise la ventana de mensajes para mas información. %1 (%2%) %1 % %1 Hz %1 frames %1 cuadros %1 msec &Presets &Presets &Transport &Transporte &Rewind Re&bobinar &Play &Reproducir Pa&use Pa&usa QjackCtl QjackCtl &Patchbay &Patchbay DSP Load Uso de CPU del DSP XRUN Count (notifications) Cuenta de XRUN (notificaciones) &Backward &Retroceder &Forward &Avanzar Set&up... Set&up... S&ession S&esion &Load... &Abrir... &Save... &Guardar... Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... Show/hide the session management window Mostrar/ocultar la ventana para administrar sesiones Show/hide the messages log/status window Mostrar/ocultar la ventana de estado/log Could not load active patchbay definition. "%1" Disabled. No se puede cargar el patchbay. "%1" Ha sido deshabilitado. &Versioning &Versiones Re&fresh Re&frescar %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Mensajes / Estado - JACK Audio Connection Kit &Messages &Mensajes Messages log Registro de mensajes Messages output log Registro de mensajes &Status &Estado Status information Información de estado Statistics since last server startup Estadísticas desde el último inicio de JACK Description Descripción Value Valor Reset XRUN statistic values Reiniciar estadísticas de XRUN Re&set re&Iniciar Refresh XRUN statistic values Refrescar estadísticas de XRUN &Refresh &Refrescar Server name Nombre del servidor Server state Estado del Servidor DSP Load Uso de CPU del DSP Sample Rate Frecuencia de muestreo Buffer Size Tamaño de Buffer Realtime Mode Modo Realtime Transport state Estado del transporte Transport Timecode Código de tiempo del transporte Transport BBT BBT del Transporte Transport BPM BPM del transporte XRUN count since last server startup XRUNs desde el último inicio XRUN last time detected Fecha de la última XRUN detectada XRUN last Última XRUN XRUN maximum Máximo de XRUN XRUN minimum Mínimo de XRUN XRUN average Promedio de XRUN XRUN total Total de XRUN Maximum scheduling delay Máximo retardo de programación(scheduling) Time of last reset Tiempo desde el último reset Logging stopped --- %1 --- Registro detenido --- %1 --- Logging started --- %1 --- Registro iniciado --- %1 --- qjackctlPatchbay Warning Advertencia This will disconnect all sockets. Are you sure? Esto desconectará todos los sockets. Está seguro? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connection Kit &New &Nueva Create a new patchbay profile &Load... &Abrir... Load patchbay profile Cargar perfil de patchbay &Save... &Salvar... Save current patchbay profile Salvar el perfil actual del patchbay Acti&vate Acti&var Toggle activation of current patchbay profile Conmutar la activación del esquema actual &Connect &Conectar Connect currently selected sockets Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected sockets Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected sockets Desconectar los socket seleccionados &Refresh &Refrescar Refresh current patchbay view Refrescar la vista actual Down Bajar Move currently selected output socket down one position Mover el socket de salida seleccionado una posición hacia abajo Add... Añadir... Create a new output socket Crear un nuevo socket de salida Edit... Editar... Edit currently selected input socket properties Editar las propiedades del socket de entrada seleccionado Up Subir Move currently selected output socket up one position Mover el socket de salida seleccionado una posición hacia arriba Remove Remover Remove currently selected output socket Remover el socket de salida seleccionado Copy... Copiar... Duplicate (copy) currently selected output socket Duplicar (copiar) el socket de salida seleccionado Remove currently selected input socket Remover el socket de entrada seleccionado Duplicate (copy) currently selected input socket Duplicar (copiar) el socket de entrada seleccionado Create a new input socket Crear un nuevo socket de entrada Edit currently selected output socket properties Editar las propiedades del socket de salida seleccionado Warning Advertencia active activa New Patchbay definition Nuevo esquema de patchbay Patchbay Definition files Archivos de esquemas de patchbay Load Patchbay Definition Cargar esquema de patchbay Save Patchbay Definition Salvar esquema de patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? La definición del patchbay ha cambiado: "%1" Desea guardar los cambios? %1 [modified] %1 [modificado] Untitled%1 SinNombre%1 Error Error Could not load patchbay definition file: "%1" No se puede cargar el archivo con el esquema del patchbay: "%1" Could not save patchbay definition file: "%1" No se puede guardar el archivo con el esquema del patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Crear un esquema del patchbay en base a una instantánea de las conexiones actuales? Current (recent) patchbay profile(s) Perfil actual (reciente) de patchbay Expand all items Expandir todos los elementos E&xpand All E&xpandir Todos qjackctlPatchbayView Add... Añadir... Edit... Editar... Copy... Copiar... Remove Remover Exclusive Exclusivo Move Up Subir Move Down Bajar &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R Forward Avanzar (None) (Ninguno) qjackctlSessionForm Session - JACK Audio Connection Kit Sesión - JACK Audio Connection Kit Load session Cargar sesión &Load... &Abrir... Recent session Sesión reciente &Recent &Reciente Save session Guardar sesión &Save... &Guardar... Client / Ports Cliente / Puertos UUID Command Comando Load Session Cargar Sesión Session directory Directorio de la sesión Save Session Guardar Sesión and Quit y Salir Template Plantilla &Clear &Limpiar Warning Advertencia A session could not be found in this folder: "%1" No se encontró una sesión en esta carpeta: "%1" %1: loading session... %1: cargando sesión... %1: load session %2. %1: cargar sesión %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una sesión ya existe en esta carpeta: "%1" Está seguro de querer sobreescribirla? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Esta carpeta existe y no está vacía: "%1" Está seguro de sobreescribir esta carpeta? %1: saving session... %1: guardando sesión... %1: save session %2. %: guardar sesión %2. Update session Actualizar sesión Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... &Save &Salvar Save session versioning Guardar las versiones de la sesión &Versioning &Versiones Re&fresh Re&frescar Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit &Editar Remove infra-client Re&move New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Configuración - JACK Audio Connection Kit Settings Configuraciones Preset &Name: &Nombre del Preset: (default) Settings preset name Preset con las configuraciones &Save &Salvar Save settings as current preset name Salvar configuraciones en el preset actual &Delete &Eliminar Delete current settings preset Eliminar el preset con la configuración actual jackstart jackstart jackd jackd Driv&er: Dri&ver: dummy dummy oss oss alsa alsa portaudio portaudio coreaudio coreaudio Parameters Parámetros Number of periods in the hardware buffer Número de períodos en el buffer de hardware Priorit&y: &Prioridad: &Frames/Period: &Cuadros / Período: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Cuadros por período entre llamadas a process() Port Ma&ximum: Má&ximos Puertos: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frecuencia de muestreo en cuadros por segundo Scheduler priority when running realtime Prioridad del scheduler cuando se ejecuta en tiempo real &Word Length: &Largo de palabra: Periods/&Buffer: Períodos / &Buffer: Word length Tamaño de palabra Maximum number of ports the JACK server can manage Máximo número de puertos que podrá manejar el servidor JACK &Wait (usec): &Retardo (microseg): Sample &Rate: &Frecuencia de muestreo: &Timeout (msec): Límite de &Tiempo (mseg): 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in milliseconds Establece el límite de tiempo de los clientes en milisegundos &Realtime Tiempo &Real Use realtime scheduling Usar prioridad(scheduling) de tiempo real No Memory Loc&k No b&loquear memoria Do not attempt to lock memory, even if in realtime mode No intentar bloquear memoria, incluso en modo de tiempo real &Unlock Memory &Desbloquear Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) No bloquear memoria de las librerías comunes (GTK+, QT, FLTK, Wine) So&ft Mode Modo &Tolerante Ignore xruns reported by the backend driver Ignorar las xruns reportadas por el driver de sonido. JACK tendrá menos tendencia a desconectar los puertos que no respondan. Útil cuando no se corre en tiempo real &Monitor &Monitorear Provide output monitor ports Proveer puertos para monitoreo de la salida Force &16bit Forzar &16bit Force 16bit mode instead of failing over 32bit (default) Forzar modo 16 bit en lugar de 32 bit (predeterminado) H/W M&onitor M&onitoreo por Hardware Enable hardware monitoring of capture ports Habilitar monitoreo por hardware de los puertos de captura H/&W Meter Monitoreo por H/&W Enable hardware metering on cards that support it Habilita monitoreo por hardware en las placas que lo soporten &Ignore H/W &Ignorar H/W Ignore hardware period/buffer size Ignorar el tamaño de bufer / período del hardware &Output Device: Dispositiv&o de salida: &Interface: &Interfaz: Maximum input audio hardware channels to allocate Máximo número de canales de entrada por hardware a establecer &Audio: &Audio: Dit&her: &Suavizado: External output latency (frames) Latencia de la salida externa (cuadros) &Input Device: D&ispositivo de entrada: Duplex Duplex Capture Only Sólo Captura Playback Only Sólo Reproducción Provide either audio capture, playback or both Proveer de puertos de audio para captura, reproducción o ambos hw:0 The PCM device name to use Nombre del dispositivo PCM a usar > > /dev/dsp Alternate input device for capture Dispositivo de entrada alternativo para captura Maximum output audio hardware channels to allocate Máximo número de canales de salida por hardware a establecer Alternate output device for playback Dispositivo de salida alternativo para reproducción External input latency (frames) Latencia de la entrada externa (cuadros) None Ninguno Rectangular Rectangular Shaped Triangular Triangular Set dither mode Establecer método de suavizado Whether to give verbose output on messages Mostrar información mas detallada en los mensajes Time in seconds that client is delayed after server startup Tiempo en segundos que el cliente es demorado luego de iniciar el servidor Latency: Latencia: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latencia del sistema en milisegundos, calculada en base a la configuración de período, buffer y frecuencia de muestreo Options Opciones Scripting Scripting Execute script on Start&up: Script a ejecutar al iniciar el servi&dor: Whether to execute a custom shell script before starting up the JACK audio server. Ejecutar un script personalizado antes de iniciar el servidor JACK. Execute script after &Startup: &Script a ejecutar luego de iniciar: Whether to execute a custom shell script after starting up the JACK audio server. Ejecutar un script personalizado después de iniciar el servidor JACK. Execute script on Shut&down: Script a ejecutar antes de d&etener: Whether to execute a custom shell script before shuting down the JACK audio server. Ejecutar un script personalizado antes de detener el servidor JACK. Command line to be executed before starting up the JACK audio server Comando a ejecutar antes de iniciar el servidor JACK Scripting argument meta-symbols Variables especiales para pasar al script ... ... Browse for script to be executed before starting up the JACK audio server Buscar el script a ejecutar antes de iniciar el servidor de audio JACK Command line to be executed after starting up the JACK audio server Comando a ejecutar luego de iniciar el servidor JACK Browse for script to be executed after starting up the JACK audio server Buscar el script a ejecutar luego de iniciar el servidor de audio JACK Browse for script to be executed before shutting down the JACK audio server Buscar el script a ejecutar antes de terminar el servidor de audio JACK Command line to be executed before shutting down the JACK audio server Comando a ejecutar antes de detener el servidor JACK Execute script after Shu&tdown: Script a ejecutar luego de &Terminar: Whether to execute a custom shell script after shuting down the JACK audio server. Ejecutar un script personalizado después de terminar el servidor JACK. Browse for script to be executed after shutting down the JACK audio server Buscar el script a ejecutar luego de terminar el servidor de audio JACK Command line to be executed after shutting down the JACK audio server Comando a ejecutar luego de detener el servidor JACK Statistics Estadísticas &Capture standard output &Capturar salida estándar Whether to capture standard output (stdout/stderr) into messages window Capturar la salida estándar de JACK en la ventana de mensajes &XRUN detection regex: Expresión regular para detectar &XRUN: xrun of at least ([0-9|\.]+) msecs xrun of at least ([0-9|\.]+) msecs Regular expression used to detect XRUNs on server output messages Expresión regular usada para detectar XRUNs en los mensajes del servidor Connections Conexiones 10 10 Patchbay definition file to be activated as connection persistence profile Esquemas de patchbay a activar como un perfil persistente de las conexiones Browse for a patchbay definition file to be activated Buscar el esquema de patchbay para activar Activate &Patchbay persistence: Activar &Persistencia del patchbay: Whether to activate a patchbay definition for connection persistence profile. Utilizar un perfil para conservar el esquema del patchbay entre sesiones. Display Display Time Display Display de tiempo Time F&ormat: F&ormato de tiempo: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display El formato general para mostrar el tiempo Transport &Time Code Código de Tiempo del &Transporte Transport &BBT (bar:beat.ticks) &BBT del Transporte (bar:beat:ticks) Elapsed time since last &Reset Tiempo transcurrido desde el último &Reset Elapsed time since last &XRUN Tiempo transcurrido desde la última &XRUN Sample front panel normal display font Muestra de la fuente para el panel frontal Sample big time display font Muestra de la fuente para el display de tiempo grande Big Time display: Display de tiempo grande: &Font... Fuen&te... Select font for front panel normal display Seleccionar fuente para el panel normal Select font for big time display Seleccionar fuente para el display de tiempo grande Normal display: Display normal: &Display shiny glass light effect Usar &efecto de Resplandor Vítreo Whether to enable a shiny glass light effect on the main display Dibujar la ventana principal con un efecto símil cristal Messages Window Ventana de Mensajes Sample messages text font display Muestra de la fuente para la ventana de mensajes Select font for the messages text display Seleccionar fuente para el display de mensajes &Messages limit: Límite de &Mensajes: Whether to keep a maximum number of lines in the messages window Almacenar un número limitado de líneas en la ventana de mensajes 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Máximo número de líneas para mantener en la ventana de mensajes Please do not touch these settings unless you know what you are doing. Connections Window Ventana de conexiones Sample connections view font Muestra de la fuente para la ventana de conexiones Select font for the connections view Seleccionar fuente para la ventana de conexiones &Icon size: Tamaño de &Icono: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Tamaño de ícono para cada ítem en la vista de conexiones Ena&ble client/port aliases editing (rename) Ha&bilitar la edición de alias para los puertos / clientes (renombrarlos) Whether to enable in-place client/port name editing (rename) Permitir la edición in-situ de los nobres asignados a puertos o clientes E&nable client/port aliases Habilitar alias para los nombres de &puertos / clientes Whether to enable client/port name aliases on the connections window Permitir alias para los puertos / clientes en la ventana de conexiones Draw connection and patchbay lines as Be&zier curves Dibujar líneas en el Patchbay y ventana de conexiones como curvas Bé&zier Whether to draw connection lines as cubic Bezier curves Utilizar curvas cúbicas Bézier en lugar de rectas (más estilizado) Misc Otras Other Otro &Start JACK audio server on application startup Iniciar el &servidor JACK al cargar qjackctl Whether to start JACK audio server immediately on application startup Iniciar en forma automática JACK cuando se lanza qjackctl &Confirm application close Pedir &Confirmación al salir Whether to ask for confirmation on application exit Preguntar antes de salir de qjackctl &Keep child windows always on top &Las ventanas hijas siempre arriba Whether to keep all child windows on top of the main window Todas las ventanas creadas por qjackctl estarán sobre la ventana principal &Enable system tray icon Habilitar ícono en band&eja del sistema Whether to enable the system tray icon Permitir íconos en la bandeja del sistema S&ave JACK audio server configuration to: S&alvar la configuración del servidor JACK en: Whether to save the JACK server command-line configuration into a local file (auto-start) Guardar la línea de comando de JACK a un archivo (auto - inicio) .jackdrc .jackdrc The server configuration local file name (auto-start) El archivo con la configuración de JACK (auto - inicio) C&onfigure as temporary server C&onfigurar como servidor temporal Whether to exit once all clients have closed (auto-start) Salir una vez que todos los clientes hayan finalizado (auto - inicio) Whether to ask for confirmation on JACK audio server shutdown Preguntar antes de detener JACK Warning Advertencia msec mseg n/a n/d &Preset Name Nombre del &Preset &Server Path Ruta hacia el &Servidor &Driver &Driver &Interface &Interfaz Sample &Rate &Frecuencia de muestreo &Frames/Period &Cuadros / Período Periods/&Buffer Períodos / &Buffer Patchbay Definition files Archivos de esquema de patchbay Some settings have been changed: "%1" Do you want to save the changes? Algunas configuraciones han cambiado: "%1" Desea guardarlas? Delete preset: "%1" Are you sure? Borrar preset: "%1" Está seguro? Startup Script Script de Inicio Post-Startup Script Script de Post-Inicio Shutdown Script Script de Apagado Post-Shutdown Script Script de Post-Acabado Active Patchbay Definition Definición Activa de Patchbay Messages Log Registro de Mensajes Log files Archivos de registros Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado.Desea aplicar los cambios? jackdmp jackdmp The audio backend driver interface to use El driver de audio a utilizar sun freebob firewire MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use El driver MIDI de ALSA a utilizar none ninguno raw seq &Verbose messages Mensajes &Verbosos plughw:0 /dev/audio &Channels: &Canales: 192000 192000 Maximum number of audio channels to allocate El máximo número de canales de audio a utilizar Logging Registro Messages log file Archivo de registro de mensajes Browse for the messages log file location Ir hasta la ubicación del archivo con el registro de mensajes Whether to activate a messages logging to file. Si guardar los mensajes a un archivo. Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections &Messages log file: Archivo con los &Mensajes: Whether to enable blinking (flashing) of the server mode (RT) indicator Si hablilitar el parpadeo del indicador de modo del servidor (RT) Blin&k server mode indicator &Parpadeo del indicador de modo del servidor &JACK client/port aliases: Alias de cliente/puerto para &JACK: JACK client/port aliases display mode Modo de visualización de los alias cliente/puerto de JACK Default Predeterminado First Primero Second Segundo JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Whether to start minimized to system tray Si iniciar minimizado en la bandeja del sistema Start minimi&zed to system tray Iniciar minimi&zado en la bandeja del sistema Confirm server sh&utdown Confirmar apa&gado del servidor Whether to enable ALSA Sequencer (MIDI) support on startup Si habilitar soporte para el Secuenciador ALSA (MIDI) al iniciar E&nable ALSA Sequencer support Habilitar Secue&nciador ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Botones Whether to hide the left button group on the main window Si esconder el grupo de botones a la izquierda de la ventana principal Hide main window &Left buttons Esconder botones de &la izquierda Whether to hide the right button group on the main window Si esconder el grupo de botones a la derecha de la ventana principal Hide main window &Right buttons Esconder botones de la de&recha Whether to hide the transport button group on the main window Si esconder el grupo de botones del transporte en la ventana principal Hide main window &Transport buttons Esconder los botones del &Transporte Whether to hide the text labels on the main window buttons Si esconder las etiquetas en los botones de la ventana principal Hide main window &button text labels Esconder etiquetas en los &botones Defaults Predeterminados &Base font size: Tamaño &básico de tipografías: Base application font size (pt.) Tamaño básico de tipografías para la aplicación (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net Whether to enable D-Bus interface Habilitar la interfaz por D-Bus &Enable D-Bus interface &Habilitar la interfaz via D-Bus Number of microseconds to wait between engine processes (dummy) Número de microsegundos a esperar entre procesamientos (dummy) netone Whether to restrict to one single application instance (X11) Restringir una sola instancia de la aplicación (X11) Single application &instance Una sola &instancia &Name: &Nombre: The JACK Audio Connection Kit sound server name El nombre del servidor JACK Audio Connection Kit &Server Name Nombre del &Servidor Server path (command line prefix) Ruta del servidor (prefijo de la línea de comando) &Channels I/O: &Canales de E/S: &Latency I/O: &Latencia E/S: Start De&lay: Demora antes de&l inicio: secs segs 0 msecs 0 msegs Server Suffi&x: Sufijo del &Servidor: Server &Prefix: &Prefijo del servidor: Extra driver options (command line suffix) Opciones extra para el driver (sufijo de la línea de comandos) Whether to stop JACK audio server on application exit S&top JACK audio server on application exit qjackctlSocketForm &Socket &Socket &Name (alias): &Nombre (alias): Socket name (an alias for client name) Nombre del socket (un alias para el nombre de cliente) Client name (regular expression) Nombre del cliente (expresión regular) Add P&lug Añadir p&Lug Add plug to socket plug list Añadir plug a la lista de sockets &Plug: &Plug: Port name (regular expression) Nombre del puerto (expresión regular) Socket Plugs / Ports Socket Plug / Puerto Socket plug list Lista de socket tipo plug &Edit &Editar &Remove &Remover Remove currently selected plug from socket plug list Remover el plug seleccionado de la lista &Client: &Cliente: &Down &Bajar &Up &Subir E&xclusive E&xclusivo Enforce only one exclusive cable connection Permitir una conexión únicamente Type Tipo &Audio A&udio Audio socket type (JACK) Socket tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket tipo MIDI (ALSA) Plugs / Ports Plugs / Puertos Error Error A socket named "%1" already exists. Un socket llamado "%1" ya existe. Add Plug Añadir Plug Remove Remover Edit Editar Move Up Subir Move Down Bajar Warning Advertencia Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado. Desea aplicar los cambios? (None) (Ninguno) Socket - JACK Audio Connection Kit Sockets - JACK Audio Connection Kit Edit currently selected plug Editar el plug seleccionado Move down currently selected plug in socket plug list Mover hacia abajo en la lista el plug seleccionado Move up current selected plug in socket plug list Mover hacia arriba en la lista el plug seleccionado &Forward: &Avanzar: Forward (clone) all connections from this socket Reenviar (clonar) todas las conexiones desde este socket MIDI socket type (JACK) Tipo de socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Salida Input Entrada Socket Socket Warning Advertencia <New> - %1 <Nuevo> - %1 %1 about to be removed: "%2" Are you sure? A punto de remover %1: "%2" Está seguro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets de Salida / Plugs Input Sockets / Plugs Sockets de Entrada / Plugs qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_nl.ts0000644000000000000000000000012713215206021021125 xustar0029 mtime=1513425937.54976694 29 atime=1513425937.54876694 29 ctime=1513425937.54976694 qjackctl-0.5.0/src/translations/qjackctl_nl.ts0000644000175000001440000047754013215206021021774 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Opgelet Audio hardware probing timed out. QObject (default) Start JACK audio server immediately De JACK audio server onmiddlijk starten Show help about command line options Toon hulp over command line opties Show version information Toon versie informatie Option -p requires an argument (preset). Optie -p vereist een argument (preset). Usage: %1 [options] [command-and-args] Gebruik: %1 [opties] [commandos-en-args] Options: Opties: Set active patchbay definition file Kies het actieve patchbay definition bestand Set default JACK audio server name Kies de standaard JACK audio server naam Option -a requires an argument (path). Optie -a vereist een argument (pad). Option -n requires an argument (name). Optie -n vereist een argument (naam). Set default settings preset name Kies standaard instellingen preset naam %1 (%2 frames) qjackctlAboutForm About QjackCtl Over QjackCtl About Qt Over Qt &Close &Sluiten Version Versie Using: JACK %1 Gebruikt : JACK %1 Debugging option enabled. Debug optie geactiveerd. System tray disabled. Systeem pictogram uitgeschakeld. Transport status control disabled. Transport status controle uitgeschakeld. Realtime status disabled. Realtime status uitgeschakeld. XRUN delay status disabled. XRUN delay status uitgeschakeld. Maximum delay status disabled. Maximum delay status uitgeschakeld. JACK Session support disabled. Jack Sessie ondersteuning uitgeschakeld. ALSA/MIDI sequencer support disabled. ALSA/MIDI sequencer ondersteuning uitgeschakeld. Website Webstek This program is free software; you can redistribute it and/or modify it Dit programma is vrije software; je mag het doorgeven en/of aanpassen under the terms of the GNU General Public License version 2 or later. volgens de bepalingen in de GNU-General Public Licentie versie 2 of later. JACK MIDI support disabled. JACK MIDI ondersteuning uitgeschakeld. JACK Port aliases support disabled. JACK Poort alias ondersteuning uitgeschakeld. D-Bus interface support disabled. D-Bus interface ondersteuning uitgeschakeld. qjackctlClientListView &Connect &Verbinden Alt+C Connect Koppelen Alt+K &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconect All Alles afkoppelen Alt+A Re&name Her&noemen Alt+N Rename Hernoemen Alt+N &Refresh Ve&rversen Alt+R Refresh Verversen Alt+R Readable Clients / Output Ports Leesbare clients / Uitgangspoorten Writable Clients / Input Ports Beschrijfbare clients / ingangspoorten qjackctlConnect Warning Opgelet This will suspend sound processing from all client applications. Are you sure? Dit zal het verwerken van geluid onderbreken voor alle client toepassingen. Bent u zeker? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Verbindingen - JACK Audio Connectie Kit Audio Audio &Connect &Verbinden Connect currently selected ports Verbind geselecteerde poorten &Disconnect Af&Koppelen Disconnect currently selected ports Geselecteerde poorten loskoppelen Disconnect &All &Alles afkoppelen Disconnect all currently connected ports Alle verbonden poorten afkoppelen Expand all client ports Toon alle client poorten E&xpand All &Toon alles &Refresh Ve&rversen Refresh current connections view Ververs huidig verbindingen venster MIDI MIDI Warning Opgelet ALSA ALSA The preset aliases have been changed: "%1" Do you want to save the changes? De preset aliases zijn aangepast: « %1 » Wil u deze aanpassingen opslaan? qjackctlConnectorView &Connect &Verbinden Alt+C Connect Verbinden Alt+V &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen - Knippen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconect All Alles afkoppelen Alt+A &Refresh &Verversen Alt+R Refresh Verversen Alt+V qjackctlMainForm QjackCtl QjackCtl &Quit &Sluiten Quit processing and exit Stop proces en sluit af &Start Sta&rt Start the JACK server Start de JACK server S&top S&top Stop the JACK server Stop de JACK server St&atus St&atus Ab&out... &over… Show information about this application Toon informatie over deze toepassing Show settings and options dialog Toon instellingen en opties venster &Messages &Berichten &Patchbay I don't know a translation to dutch for the word patchbay &Patchbay Show/hide the patchbay editor window Toon/verberg de patchbay editor &Connect &Verbindingen Set&up... &Instellingen… Show/hide the actual connections patchbay window Toon/verberg de huidige verbindingen patchbay JACK server state JACK server status JACK server mode JACK server mode Sample rate No translation known to Dutch Sample rate Time display Tijd weergave Transport state Transport status Transport BPM Transport BPM Transport time Transport tijd Show/hide the session management window Toon/verberg het sessie management venster Show/hide the messages log/status window Toon/verberg het berichten log/status venster &Backward &Terug Backward transport Terugwaarts afspelen &Forward &Voorwaarts Forward transport Voorwaarts afspelen &Rewind Te&rugspoelen Rewind transport Terugspoelen Pa&use Pa&use Stop transport rolling Stop het afspelen &Play &Spelen Start transport rolling Start het afspelen Warning Opgelet successfully met succes with exit status=%1 met exit status=%1 Could not load preset "%1". Retrying with default. Kon de preset « %1 » niet laden. Opnieuw aan het proberen met standaard. Could not load default preset. Sorry. Kon de standaard preset niet inladen. Sorry. Startup script... Opstart script... Startup script terminated Opstart script beëindigd JACK is starting... JACK start op... Could not start JACK. Sorry. JACK kon niet opstarten. Sorry. JACK is stopping... JACK stopt... Shutdown script... Afsluit script... Don't ask this again Shutdown script terminated Afsluit script beëindigd Post-shutdown script... Na-afsluit script... Post-shutdown script terminated Na-afsluit script beëindigd JACK was stopped JACK is gestopt Error Fout Transport time code Transport tijdscode Elapsed time since last reset Verlopen tijd sinds laatste reset Elapsed time since last XRUN Verlopen tijd sinds laatste XRUN Patchbay activated. Patchbay ingeschakeld. Patchbay deactivated. Patchbay uitgeschakeld. Statistics reset. Initialisatie van statistieken. msec ms XRUN callback (%1). Buffer size change (%1). Buffergrootte aanpassing (%1). Shutdown notification. Afluit melding. checked this is correct if checked means "controlled to see if everything is OK", but if it means checked like in a check box, then the translation should be: "aangevinkt" nagekeken connected verbonden disconnected afgesloten failed mislukt Server configuration saved to "%1". Server configuratie opgeslagen in « %1 ». Client activated. Client geactiveerd. Post-startup script... Na-startup script... Post-startup script terminated Na-startup script beëindigd Command line argument... Command line argument started Client deactivated. Client gedeactiveerd. Transport rewind. Transport terugspoelen. Transport backward. Transport achterwaarts. Starting Startend Transport start. Stopping Stoppend Transport stop. Transport forward. Transport voorwaarts. Stopped Gestopt Yes Ja No Nee RT RT Rolling Looping XRUN callback (%1 skipped). XRUN callback (%1 overgeslagen). Started Gestart Active Actief Activating Activering Inactive Inactief &Hide Ver&hullen Mi&nimize Verklei&nen S&how &Tonen Rest&ore &Herstellen &Stop &Stop &Reset &Herstel &Presets &Presets &Versioning Re&fresh &Connections &Verbindingen Patch&bay &Transport Server settings will be only effective after restarting the JACK audio server. Server instellingen worden toegepast na het herstarten van de JACK audio server. Information Informatie Some settings will be only effective the next time you start this program. Sommige instellingen worden pas toegepast nadat u dit programma opnieuw opstart. DSP Load DSP-Verbruik XRUN Count (notifications) XRUN Telling (meldingen) JACK connection graph change. JACK verbindingen tekening aangepast. ALSA connection graph change. ALSA verbindingen aangepast. JACK connection change. JACK verbindingen aangepast. ALSA connection change. ALSA verbindingen aangepast. JACK is currently running. Do you want to terminate the JACK audio server? JACK wordt momenteel gebruikt. Wil u de JACK audio server stoppen? D-BUS: Service is available (%1 aka jackdbus). DBUS : Service is beschikbaar (%1 ook gekend als jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : Service is niet beschikbaar (%1 ook gekend als jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Het programma zal in de systeem balk blijven lopen. Om het programma te stoppen, gelieve « Sluiten » te kiezen in het menu van het systeem balk icoon. Don't show this message again Could not start JACK. Maybe JACK audio server is already started. Kon JACK niet starten. Misschien is de JACK audio server al gestart. D-BUS: JACK server is starting... D-BUS : JACK server start op… D-BUS: JACK server could not be started. Sorry DBUS : JACK server kon niet worden gestart. Sorry Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Sommige client audio toepassingen zijn nog steeds actief en verbonden. Wil u de JACK audio server stoppen? D-BUS: JACK server is stopping... DBUS : JACK server is stoppende… D-BUS: JACK server could not be stopped. Sorry D-BUS : JACK server kon niet worden gestopt. Sorry JACK was started with PID=%1. JACK is gestart met PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : JACK server is gestart (%1 ook gekend als jackdbus). JACK is being forced... JACK wordt geforceerd… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : JACK server werd gestopt (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Patchbay reset. Could not load active patchbay definition. "%1" Disabled. JACK has crashed. JACK is ingestort. JACK timed out. JACK was te laat. JACK write error. JACK schrijffout. JACK read error. JACK leesfout. Unknown JACK error (%d). Onbekende JACK fout (%d). JACK property change. Overall operation failed. Gehele toepassing gefaald. Invalid or unsupported option. Ongeldige of niet-ondersteunde optie. Client name not unique. Client naam niet uniek. Server is started. Server is gestart. Unable to connect to server. Kan niet met de server verbinden. Server communication error. Server communicatie fout. Client does not exist. Client bestaat niet. Unable to load internal client. Kan interne client niet laden. Unable to initialize client. Kan client niet initializeren. Unable to access shared memory. Geen toegang tot gedeeld geheugen. Client protocol version mismatch. Client protocol versie ongeldig. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Kon niet verbinden als client met de JACK server. - %1 Gelieve het berichten venster te lezen voor meer info. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 frames %1 msec %1 ms S&ession S&essie &Load... &Laden... &Save... &Bewaren… Save and &Quit... Bewaren en af&sluiten… Save &Template... &Template bewaren… D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Kon de ALSA sequencer niet als client openen. De ALSA MIDI patchbay zal niet beschikbaar zijn. JACK active patchbay scan JACK actieve patchbay scan ALSA active patchbay scan ALSA actieve patchbay scan A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Er is een patchbay definitie actief, die deze verbinding waarschijnlijk zal herstellen: %1 -> %2 Wil u de patchbay verbinding verwijderen? qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Meldingen / Status - JACK Audio Connectie Kit &Messages &Meldingen Messages log Meldingen logboek Messages output log Meldingen uitgang logboek &Status &Status Status information Status informatie Statistics since last server startup Statistiek sinds laatste server opstart Description Beschrijving Value Waarde Reset XRUN statistic values Initialiseer XRUN statistiek waarden Re&set Refresh XRUN statistic values Ververs XRUN statistiek waarden &Refresh &Ververs Server name Server naam Server state Server status DSP Load DSP lading Sample Rate Buffer Size Buffergrootte Realtime Mode Realtime Modus Transport state Transport status Transport Timecode Transport Tijdscode Transport BBT Transport BPM XRUN count since last server startup Aantal XRUNS sinds laatste server opstart XRUN last time detected Laatst opgemerkte XRUN XRUN last Laatste XRUN XRUN maximum XRUN minimum XRUN average XRUN gemiddelde XRUN total XRUN totaal Maximum scheduling delay Time of last reset Tijd sinds laatste reset Logging stopped --- %1 --- Loggen gestopt --- %1 --- Logging started --- %1 --- Loggen gestart --- %1 --- qjackctlPatchbay Warning Opgelet This will disconnect all sockets. Are you sure? Dit zal alle sockets ontkoppelen. Bent u zeker? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connectie Kit &New &Nieuw Create a new patchbay profile Creëer een nieuw patchbay profiel &Load... &Laden… Load patchbay profile Laad patchbay profiel &Save... &Bewaren... Save current patchbay profile Bewaar huidig patchbay profiel Expand all items Toon alle items E&xpand All &Toon alle Current (recent) patchbay profile(s) Huidig (recent) patchbay profiel(en) Acti&vate Acti&veer Toggle activation of current patchbay profile Schakel activatie van huidig patchbay profiel in/uit &Connect &Verbind Connect currently selected sockets Verbind huidige geselecteerde sockets &Disconnect &Ontkoppel Disconnect currently selected sockets Ontkoppel huidig geselecteerde sockets Disconnect &All Ontkoppel &alle Disconnect all currently connected sockets Ontkoppel alle huidige verbonden sockets &Refresh Ve&rvers Refresh current patchbay view Ververs huidig patchbay venster Down Omlaag Move currently selected output socket down one position Verplaats de geselecteerde uitgang socket één positie omlaag Add... Voeg toe… Create a new output socket Creëer een nieuwe uitgang socket Edit... Bewerk... Edit currently selected input socket properties Bewerk eigenschappen van geselecteerde ingang socket Up Omhoog Move currently selected output socket up one position Verplaats de geselecteerde uitgang socket één positie omhoog Remove Verwijder Remove currently selected output socket Verwijder de geselecteerde uitgang socket Copy... Kopieer… Duplicate (copy) currently selected output socket Dupliceer de geselecteerde uitgang socket Remove currently selected input socket Verwijder de geselecteerde uitgang socket Duplicate (copy) currently selected input socket Dupliceer de geselecteerde ingang socket Create a new input socket Creëer een nieuwe ingang socket Edit currently selected output socket properties Bewerk eigenschappen van geselecteerde uitgang socket Warning Opgelet Error Fout New Patchbay definition Nieuwe patchbay definitie Patchbay Definition files Patchbay definitie bestanden Load Patchbay Definition Laad Patchbay Definitie Save Patchbay Definition Bewaar Patchbay Definitie active actief The patchbay definition has been changed: "%1" Do you want to save the changes? De patchbay definitie is aangepast : « %1 » Wil u de veranderingen bewaren? %1 [modified] %1 [aangepast] Untitled%1 Ongetieteld%1 Could not load patchbay definition file: "%1" Kon patchbay definite bestand niet laden : « %1 » Could not save patchbay definition file: "%1" Kon patchbay definitie bestand niet bewaren : « %1 » Create patchbay definition as a snapshot of all actual client connections? Creëer patchbay definitie als een momentopname van alle huidige client verbindingen? qjackctlPatchbayView Add... Voeg toe… Edit... Bewerk… Copy... Kopieer… Remove Verwijder Exclusive Exclusief (None) (Geen) Forward Vooruit Move Up Omhoog Move Down Omlaag &Connect &Verbind Alt+C Connect Verbind Alt+V &Disconnect &Loskoppelen Alt+D Disconnect Loskoppelen Alt+L Disconnect &All &Alle loskoppelen Alt+A Disconect All Alle loskoppelen Alt+A &Refresh Ve&rvers Alt+R Refresh Ververs Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit Sessie - JACK Audio Connectie Kit Load session Laad sessie &Load... &Laden… Recent session Vorige sessie &Recent Vo&rige Save session Bewaar sessie Save session versioning &Versioning Re&fresh Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit B&ewerken Remove infra-client Re&move &Save... &Bewaar… Update session Sessie updaten Client / Ports Client / Poorten UUID UUID Command Opdracht &Save &Bewaren Load Session Laad sessie Session directory Sessie map Save Session Bewaar Sessie and Quit en Sluit Template Sjabloon &Clear &Wissen Warning Opgelet A session could not be found in this folder: "%1" Een sessie werd niet gevonden in deze map: « %1 » %1: loading session... %1 : sessie laden… %1: load session %2. %1: sessie laden %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Een sessie bestaat al in deze map: « %1 » Bent u zeker dat u deze bestaande sessie wil overschrijven ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Deze map bestaat al en is niet leeg : « %1 » Bent u zeker dat u de bestaande map wil vervangen ? %1: saving session... %1 : sessie wordt bewaard… %1: save session %2. %1 : sessie wordt bewaard %2. New Client Save and &Quit... &Bewaren en afsluiten… Save &Template... Bewaar S&jabloon… qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Instellingen - JACK Audio Connectie Kit Settings Instellingen Preset &Name: Preset &Naam: (default) Settings preset name Naam instellingen preset &Save &Bewaren Save settings as current preset name Bewaar instellingen als huidige preset naam &Delete &Wissen Delete current settings preset Huidige instellingen preset wissen jackstart jackstart jackd jackd Driv&er: Driv&er: dummy dummie oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob Parameters Parameters Number of periods in the hardware buffer Aantal periodes in hardware buffer Priorit&y: Pri&oriteit : &Frames/Period: &Frames/Periode: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Frames per periode tussen process() calls Port Ma&ximum: Poorten ma&ximum : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second Sample rate in frames per seconde Scheduler priority when running realtime Scheduler prioriteit wanneer in realtime modus &Word Length: &Resolutie (bit) : Periods/&Buffer: Periodes/&Buffer : Word length Resolutie Maximum number of ports the JACK server can manage Maximum aantal poorten dat de JACK server aankan &Wait (usec): &Wacht (µsec): Sample &Rate: Sample &Rate (Hz): &Timeout (msec): &Timeout (in ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in milliseconds Zet client timeout limiet in milisecondes &Realtime &Realtime Use realtime scheduling Gebruik realtime scheduling No Memory Loc&k Geen Memory Loc&k Do not attempt to lock memory, even if in realtime mode Probeer niet om geheugen te "locken", zelfs niet in realtime modus &Unlock Memory &Unlock Memory Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Deblokkeer geheugen van gemeenschappelijke toolkit libraries (GTK+, QT, FLTK, Wine) So&ft Mode So&ft Mode Ignore xruns reported by the backend driver Negeer xruns meldingen van de backend driver &Monitor &Monitor Provide output monitor ports Voorzie monitor uitgang poorten Force &16bit Forceer &16bit Force 16bit mode instead of failing over 32bit (default) Forceer 16bit in plaats van te falen bij 32bit (standaard) H/W M&onitor H/W M&onitor Enable hardware monitoring of capture ports Schakel hardware monitor van opnamepoorten in H/&W Meter H/&W Meter Enable hardware metering on cards that support it Schakel hardware meten in op kaarten die het ondersteunen &Ignore H/W &Negeer H/W Ignore hardware period/buffer size Negeer hardware period/buffer grootte &Output Device: &Output Apparaat: &Interface: &Interface : Maximum input audio hardware channels to allocate Maximum bruikbare input audio hardware kanalen &Audio: &Audio: Dit&her: Dit&her: External output latency (frames) Externe output vertraging (in frames) &Input Device: &Input Apparaat : Duplex Duplex Capture Only Enkel opnemen Playback Only Enkel afspelen Provide either audio capture, playback or both Voorzie audio opname, afspelen of beide hw:0 hw:0 The PCM device name to use De PCM apparaats naam te gebruiken > > &Name: &Naam: The JACK Audio Connection Kit sound server name De JACK Audio Connectie Kit geluid server naam /dev/dsp /dev/dsp Alternate input device for capture Alternatief input apparaat voor opname Maximum output audio hardware channels to allocate Maximum bruikbare output audio hardware kanalen Alternate output device for playback Alternatief output apparaat voor afspelen External input latency (frames) Externe input vertraging (in frames) None Geen Rectangular Blok Shaped Sinus Triangular Driehoek Set dither mode Kies dither modus Whether to give verbose output on messages Geef veel info bij berichten Time in seconds that client is delayed after server startup Tijd in secondes waarmee de client wordt vertraagd na opstarten van de server Latency: Vertraging: Output latency in milliseconds, calculated based on the period, rate and buffer settings Output vertraging in milliseconden, berekend vanuit periodes, rate en buffer instellingen Options Opties Scripting Scripts Execute script on Start&up: Script &uitvoeren voor opstarten: Whether to execute a custom shell script before starting up the JACK audio server. Custom shell script uitvoeren vóór het opstarten van de JACK audio server. Execute script after &Startup: &Script uitvoeren na opstarten: Whether to execute a custom shell script after starting up the JACK audio server. Custom shell script uitvoeren na het opstarten van de JACK audio server. Execute script on Shut&down: Script uitvoeren &bij afsluiten: Whether to execute a custom shell script before shuting down the JACK audio server. Custom shell script uitvoeren vóór het afsluiten van de JACK audio server. Command line to be executed before starting up the JACK audio server Commando om uit te voeren vóór het opstarten van de JACK audio server Scripting argument meta-symbols Script argument meta symbolen ... Browse for script to be executed before starting up the JACK audio server Bladeren naar een script om uit te voeren vóór het starten van de JACK audio server Command line to be executed after starting up the JACK audio server Commando om uit te voeren na het opstarten van de JACK audio server Browse for script to be executed after starting up the JACK audio server Bladeren naar een script om uit te voeren na het starten van de JACK audio server Browse for script to be executed before shutting down the JACK audio server Bladeren naar een script om uit te voeren vóór het stoppen van de JACK audio server Command line to be executed before shutting down the JACK audio server Commando om uit te voeren vóór het stoppen van de JACK audio server Execute script after Shu&tdown: Script uitvoeren &na afsluiten: Whether to execute a custom shell script after shuting down the JACK audio server. Custom shell script uitvoeren na het afsluiten van de JACK audio server. Browse for script to be executed after shutting down the JACK audio server Bladeren naar een script om uit te voeren na het stoppen van de JACK audio server Command line to be executed after shutting down the JACK audio server Commando om uit te voeren na het stoppen van de JACK audio server Statistics Statistieken &Capture standard output Standaard &output weergeven Whether to capture standard output (stdout/stderr) into messages window Standaard output (stdout/stderr) weergeven in berichten venster &XRUN detection regex: regex voor &XRUN detectie: xrun of at least ([0-9|\.]+) msecs xrun van ten minste ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression régulière utilisée pour détecter les désynchronisations (XRUN) dans les messages de sortie du serveur Connections Verbindingen 10 10 Patchbay definition file to be activated as connection persistence profile Patchbay definitie bestand om verbindingen profiel te bewaren Browse for a patchbay definition file to be activated Bladeren naar een patchbay definitie bestand om te activeren Activate &Patchbay persistence: Activeer &Patchbay bewaring: Whether to activate a patchbay definition for connection persistence profile. Patchbay definitie bestand activeren om verbindingen profiel te bewaren. Display Weergave Time Display Tijdsweergave Time F&ormat: Tijdsf&ormaat: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Algemeen formaat voor tijdsweergave Server Suffi&x: Transport &Time Code Transport &Time Code Transport &BBT (bar:beat.ticks) Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Verlopen tijd sinds laatste &Reset Elapsed time since last &XRUN Verlopen tijd sinds laatste &XRUN Sample front panel normal display font Voorbeeld hoofdvenster normale weergave lettertype Sample big time display font Voorbeeld grote klok weergave lettertype Big Time display: Grote klok weergave: &Font... &Lettertype… Select font for front panel normal display Kies lettertype voor hoofdvenster normale weergave Select font for big time display Kies lettertype voor grote klok weergave Normal display: Normale weergave: &Display shiny glass light effect &Weergave glanzend glas licht effect Whether to enable a shiny glass light effect on the main display Een glanzend glass licht effect gebruiken in het hoofdvenster Messages Window Berichten venster Sample messages text font display Voorbeeld lettertype voor berichten Select font for the messages text display Kies lettertype voor tekst in berichtenvenster &Messages limit: &Berichten limiet: Whether to keep a maximum number of lines in the messages window Een maximum aantal lijnen behouden in het berichten venster 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Het maximum aantal berichten om in beeld te houden Connections Window Verbindingen venster Sample connections view font Voorbeeld lettertype verbindingen venster Select font for the connections view Kies lettertype voor het verbindingen venster &Icon size: &Icoon grootte: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view De grootte van het icoon voor elk element uit het verbindingen venster Ena&ble client/port aliases editing (rename) Client/poort &hernoemen mogelijk maken (aliases) Whether to enable in-place client/port name editing (rename) Bewerken van de naam van een client/poort toestaan E&nable client/port aliases Activeer client/p&ort aliasen Whether to enable client/port name aliases on the connections window Alternatieve naam (alias) van client/poort tonen in verbindingen venster Draw connection and patchbay lines as Be&zier curves Teken verbindingen en patchbay lijnen als Be&zier curves Whether to draw connection lines as cubic Bezier curves Verbindingen en patchbay lijnen als cubische Bezier curves tekenen Misc Meer Other Andere &Start JACK audio server on application startup &Start JACK audio server bij opstarten van QjackCtl Whether to start JACK audio server immediately on application startup JACK audio server onmiddelijk starten bij opstarten van de toepassing &Confirm application close &Bevestig sluiten van QjackCtl Whether to ask for confirmation on application exit Vragen om bevestiging wanneer de toepassing wordt beëindigd &Keep child windows always on top &Kind vensters steeds bovenaan houden Whether to keep all child windows on top of the main window Kind vensters al dan niet over het hoofdvenster laten verschijnen &Enable system tray icon Activ&eer systeem balk icoon Whether to enable the system tray icon Minimaliseren naar systeem balk icoon of niet S&ave JACK audio server configuration to: Bew&aar JACK audio server configuratie als: Whether to save the JACK server command-line configuration into a local file (auto-start) De JACK server commando configuratie in een lokaal bestand opslaan (auto start) .jackdrc .jackdrc The server configuration local file name (auto-start) Naam van het lokale server configuratie bestand (auto start) C&onfigure as temporary server C&onfigureer als tijdelijke server Whether to exit once all clients have closed (auto-start) Afsluiten eens alle clienten afgesloten werden (auto start) Confirm server sh&utdown Bevestig s&toppen van de server Whether to ask for confirmation on JACK audio server shutdown Bevestiging vragen bij het stoppen van de JACK audio server Buttons Knoppen Hide main window &Left buttons Verberg knoppen aan &linkerkant van hoofdvenster Whether to hide the left button group on the main window De knoppen groep aan de linkerkant van het hoofdvenster verbergen Hide main window &Right buttons Verberg knoppen aan &rechterkant van hoofdvenster Whether to hide the right button group on the main window De knoppen groep aan de rechterkant van het hoofdvenster verbergen Hide main window &Transport buttons Verberg hoofdvenster &Transport knoppen Whether to hide the transport button group on the main window De transport knoppengroep in het hoofdvenster al dan niet verbergen Hide main window &button text labels Verberg tekst bij &knoppen in hoofdvenster Whether to hide the text labels on the main window buttons Verberg de tekst labels onder knoppen in het hoofdvenster Warning Opgelet msec ms n/a n/a &Preset Name &Preset Naam &Server Name &Server Naam &Server Path &Server Pad &Driver &Driver &Interface &Interface Sample &Rate Sample &Rate &Frames/Period &Frames/Periode Periods/&Buffer Periodes/&Buffer Startup Script Opstart Script Post-Startup Script Na-opstart Script Shutdown Script Afsluit Script Post-Shutdown Script Na-afsluit Script Patchbay Definition files Patchbay Definitie bestanden Active Patchbay Definition Actieve Patchbay Definitie The audio backend driver interface to use De te gebruiken audio backend driver interface &Verbose messages Uit&voerige berichten MIDI Driv&er: MIDI Driv&er: none geen raw raw seq seq The ALSA MIDI backend driver to use De te gebruiken ALSA MIDI backend driver jackdmp jackdmp firewire firewire plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Sommige instellingen zijn veranderd: « %1 » Wil u deze aanpassingen opslaan? Delete preset: "%1" Are you sure? Verwijder preset : « %1 » Bent u zeker? Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? Messages Log Berichten Log Log files Log bestanden sun sun netone netone /dev/audio /dev/audio &Channels: &Sporen: Server path (command line prefix) Maximum number of audio channels to allocate Maximum aantal te gebruiken audio sporen &Channels I/O: &Latency I/O: Logging Loggen Messages log file Berichten log bestand Browse for the messages log file location Blader naar de berichten log bestand locatie Whether to activate a messages logging to file. Berichten opslaan in een bestand activeren. Server &Prefix: Extra driver options (command line suffix) Start De&lay: secs 0 msecs Please do not touch these settings unless you know what you are doing. &Messages log file: &Berichten log bestand: Whether to enable blinking (flashing) of the server mode (RT) indicator Activeer het knipperen van de server modus (RT) indicator Blin&k server mode indicator &Knipperende server modus indicator &JACK client/port aliases: &JACK client/poort aliassen: JACK client/port aliases display mode JACK client/poort aliassen weergave modus Default Standaard First Eerste Second Tweede Whether to start minimized to system tray Start met geminimaliseerd systeem balk icoon JACK client/port pretty-name (metadata) display mode Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Start minimi&zed to system tray Whether to restrict to one single application instance (X11) Beperken tot één enkele toepassings instantie (X11) Single application &instance Slechts één QjackCtl laten draa&ien Whether to enable ALSA Sequencer (MIDI) support on startup Activeer ALSA Sequencer (MIDI) ondersteuning bij opstarten E&nable ALSA Sequencer support Activeer &ALSA Sequencer ondersteuning Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Whether to stop JACK audio server on application exit S&top JACK audio server on application exit Defaults Standaard &Base font size: &Basis lettertype grootte: Base application font size (pt.) Basis lettertype grootte voor toepassing (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface D-Bus activeren &Enable D-Bus interface &D-Bus interface activeren Number of microseconds to wait between engine processes (dummy) Aantal microseconden wachten tussen engine processen (dummie) qjackctlSocketForm Socket - JACK Audio Connection Kit Socket - JACK Audio Connectie Kit &Socket &Socket &Name (alias): &Naam (alias): Socket name (an alias for client name) Socket naam (een alias voor client naam) Client name (regular expression) Client naam (reguliere expressie) Add P&lug Plug &toevoegen Add plug to socket plug list Plug toevoegen aan socket plug lijst &Plug: &Plug: Port name (regular expression) Poort naam (reguliere expressie) Socket Plugs / Ports Socket Plugs / Poorten Socket plug list Socket plug lijst &Edit B&ewerken &Remove &Verwijderen Remove currently selected plug from socket plug list Verwijder geselecteerde plug uit socket plug lijst &Client: &Client: &Down Om&laag &Up Om&hoog E&xclusive E&xclusief Enforce only one exclusive cable connection Sta slechts één enkele aansluiting toe &Forward: &Stuur door: Forward (clone) all connections from this socket Stuur alle verbindingen van deze socket door (clonen) Type Type &Audio &Audio Audio socket type (JACK) Audio socket type (JACK) &MIDI &MIDI MIDI socket type (ALSA) MIDI socket type (ALSA) Plugs / Ports Plugs / Poorten Add Plug Plug toevoegen Remove Verwijder Edit Bewerken Error Fout A socket named "%1" already exists. Een socket genaamd « %1 » bestaat al. Move Up Omhoog Move Down Omlaag (None) (Geen) Edit currently selected plug Bewerk de geselecteerde plug Move down currently selected plug in socket plug list Verplaats geselecteerde plug omlaag in socket plug lijst Move up current selected plug in socket plug list Verplaats geselecteerde plug omhoog in socket plug lijst Warning Opgelet Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? MIDI socket type (JACK) MIDI socket type (JACK) AL&SA AL&SA qjackctlSocketList Output Uitgang Input Ingang Socket Socket Warning Opgelet <New> - %1 <Nieuw> - %1 %1 about to be removed: "%2" Are you sure? %1 zal verwijderd worden: « %2 » Bent u zeker? %1 <Copy> - %2 %1 <Kopiëer> - %2 qjackctlSocketListView Output Sockets / Plugs Uitgang Sockets / Plugs Input Sockets / Plugs Ingang Sockets / Plugs qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_ru.ts0000644000000000000000000000012713215206021021142 xustar0029 mtime=1513425937.54976694 29 atime=1513425937.54976694 29 ctime=1513425937.54976694 qjackctl-0.5.0/src/translations/qjackctl_ru.ts0000644000175000001440000052621213215206021022000 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Предупреждение Audio hardware probing timed out. QObject Show help about command line options Показать справку по использованию параметров командной строки Start JACK audio server immediately Немедленно запустить сервер JACK Show version information Показать информацию о версии Option -p requires an argument (preset). Ключ -p требует аргумента (пресет). (default) Usage: %1 [options] [command-and-args] Использование: %1 [ключи] [команды-и-аргументы] Options: Ключи: Set default settings preset name Указать название профиля с параметрами по умолчанию Set active patchbay definition file Указать файл описания активного коммутатора Option -a requires an argument (path). Ключу -a необходим аргумент (расположение) Set default JACK audio server name Установить используемое по умолчанию название сервера JACK Option -n requires an argument (name). Ключу -n необходим аргумент (название). %1 (%2 frames) qjackctlAboutForm About Qt О Qt &Close &Закрыть Version Версия Using: JACK %1 Используется JACK %1 Transport status control disabled. Статус управления транспортом отключён. Realtime status disabled. Статус режима реального времени отключён. JACK Session support disabled. Поддержка JACK Session отключена. Website Домашняя страница This program is free software; you can redistribute it and/or modify it Это программа является свободной; вы можете распространять и/или изменять её без ограничений under the terms of the GNU General Public License version 2 or later. на условиях лицензии GNU General Public License версии 2 или более новой. Debugging option enabled. Параметр отладки включен. System tray disabled. Область уведомления отключена. XRUN delay status disabled. Статус задержки XRUN отключен. Maximum delay status disabled. Статус максимальной задержки отключен. JACK MIDI support disabled. Поддержка JACK MIDI отключена. ALSA/MIDI sequencer support disabled. Поддержка секвенсера ALSA/MIDI отключена. About QjackCtl о QJackCtl JACK Port aliases support disabled. Поддержка алиасов портов JACK отключена. D-Bus interface support disabled. Поддержка интерфейса D-Bus отключена. qjackctlClientListView Readable Clients / Output Ports Порты выхода Writable Clients / Input Ports Порты входа &Connect &Соединить Alt+C Connect Alt+с &Disconnect &Рассоединить Alt+D Disconnect Alt+р Disconnect &All Рассоединить &все Alt+A Disconect All Alt+в Re&name Пере&именовать Alt+N Rename Alt+и &Refresh &Обновить Alt+R Refresh Alt+о qjackctlConnect Warning Предупреждение This will suspend sound processing from all client applications. Are you sure? Обработка звука от клиентских приложений будет прекращена. Вы уверены? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Соединения &Connect &Соединить Connect currently selected ports Соединить выбранные сейчас порты &Disconnect &Рассоединить Disconnect currently selected ports Рассоединить выбранные сейчас порты Disconnect &All Рассоединить &все Disconnect all currently connected ports Рассоединить все соединённые сейчас порты Expand all client ports Раскрыть все порты клиентов E&xpand All &Раскрыть все &Refresh &Обновить Refresh current connections view Обновить отображение текущих соединений Audio Звук MIDI MIDI Warning Предупреждение The preset aliases have been changed: "%1" Do you want to save the changes? Алиасы профилей изменились: "%1" Вы хотите сохранить изменения? ALSA ALSA qjackctlConnectorView &Connect &Соединить Alt+C Connect Alt+с &Disconnect &Рассоединить Alt+D Disconnect Alt+р Disconnect &All Рассоединить &все Alt+A Disconect All Alt+в &Refresh &Обновить Alt+R Refresh Alt+о qjackctlMainForm &Start &Запустить Start the JACK server Запустить сервер JACK S&top С&топ Stop the JACK server Остановить сервер JACK &Quit В&ыход Quit processing and exit Остановить сервер и выйти из программы JACK is starting... JACK запускается ... JACK is stopping... JACK останавливается ... msec мс Error Ошибка JACK server state Состояние сервера JACK Sample rate Частота сэмплирования Time display Время Transport state Состояние транспорта Transport BPM BPM транспорта Transport time Время транспорта &Play &Воспроизвести Start transport rolling Запустить воспроизведение через транспорт Pa&use Пау&за Stop transport rolling Остановить воспроизведение с транспорта St&atus С&татус Ab&out... О про&грамме... Show information about this application Показать информацию о приложении Show settings and options dialog Показать диалог настройки программы &Messages С&ообщения Patch&bay &Коммутатор Show/hide the patchbay editor window Показать/скрыть окно коммутатора &Connections Сое&динения Show/hide the actual connections patchbay window Показать/спрятать окно коммутатора с актуальными соединениями successfully успешно Activating Активируется Starting Запуск The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Программа продолжит работать в области уведомления. Для завершения выберите в контекстном меню области уведомления пункт «Выход». Startup script... Сценарий, выполняемый при запуске... Startup script terminated Выполнение стартового сценария прекращено Started Запущен Stopping Остановка JACK was stopped Cервер JACK остановлен Shutdown script... Послеостановочный сценарий... Shutdown script terminated Выполнение послеостановочного сценария прекращено Inactive Не активен Active Активен Stopped Стоп Could not load active patchbay definition. "%1" Disabled. Не удалось загрузиь описание активного коммутатора. "%1" Отключено. Statistics reset. Перезапуск статистики Shutdown notification. Уведомление об остановке checked проверено connected соединено failed не удалось Client activated. Клиент активирован Post-startup script... Послестартовый сценарий... Post-startup script terminated Выполнение послестартового сценария прекращено Client deactivated. Клиент деактивирован Transport start. Транспорт запущен Transport stop. Транспорт остановлен Yes Да No Нет Rolling Играет Looping Петля Transport time code Тайм-код транспорта Elapsed time since last reset Времени с последней перезагрузки Elapsed time since last XRUN Времени с последнего XRUN disconnected рассоединено Command line argument... Аргумент для командной строки... Command line argument started Information Информация Some settings will be only effective the next time you start this program. Некоторые изменения вступят в силу только при следующем запуске программы. JACK server mode Режим сервера JACK Server settings will be only effective after restarting the JACK audio server. Параметры работы сервера JACK вступят в силу только при следующем запуске сервера. RT RT &Hide С&крыть S&how &Показать &Stop &Стоп Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Не удалось открыть секвенсер ALSA как клиентское приложение. Коммутатор ALSA MIDI будет недоступен. D-BUS: Service is available (%1 aka jackdbus). D-BUS: служба доступна (%1, известный как jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: служба недоступна (%1, известный как jackdbus). Warning Предупреждение JACK is currently running. Do you want to terminate the JACK audio server? Сервер JACK работает. Вы хотите остановить его? Don't ask this again with exit status=%1 со статусом выхода %1 Could not start JACK. Maybe JACK audio server is already started. Не удалось запустить JACK. Возможно, звуковой сервер уже запущен. Could not load preset "%1". Retrying with default. Не удалось загрузить профиль "%1". Попытка загрузить используемый по умолчанию профиль. Could not load default preset. Sorry. Не удалось запустить профиль по умолчанию. Извините. D-BUS: JACK server is starting... D-BUS: запускается сервер JACK... D-BUS: JACK server could not be started. Sorry D-BUS: не удалось запустить сервер JACK. Извините. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Некоторые клиентские звуковые приложения всё ещё активны и подсоединены. Вы хотите остановить звуковой сервер JACK? D-BUS: JACK server is stopping... D-BUS: сервер JACK останавливается... D-BUS: JACK server could not be stopped. Sorry D-BUS: не удалось остановить сервер JACK. Извините. Post-shutdown script... Post-shutdown script terminated JACK was started with PID=%1. JACK был запущен с PID=%1. Don't show this message again D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: сервер JACK был запущен (%1, известный как jackdbus). JACK is being forced... D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: сервер JACK был остановлен (%1, известный как jackdbus). Transport BBT (bar.beat.ticks) Patchbay reset. Patchbay activated. Коммутатор активирован. Patchbay deactivated. Коммутатор деактивирован. JACK connection graph change. Смена графа соединений JACK. XRUN callback (%1). Buffer size change (%1). Смена размера буфера (%1). Could not start JACK. Sorry. Не удалось запустить JACK. Извините. JACK has crashed. JACK timed out. JACK write error. Ошибка записи JACK. JACK read error. Ошибка чтения JACK. Unknown JACK error (%d). Неизвестная ошибка JACK (%d). JACK property change. ALSA connection graph change. Смена графа соединений ALSA. JACK active patchbay scan Сканирование активного коммутатора JACK. ALSA active patchbay scan Сканирование активного коммутатора ALSA. JACK connection change. Смена соединений JACK. ALSA connection change. Смена соединений ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? %1 (%2%, %3 xruns) &Versioning &Версии Re&fresh О&бновить D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Overall operation failed. Выполнение операции в целом неудачно. Invalid or unsupported option. Некорректный или неподдерживаемый параметр Client name not unique. Имя клиента не уникально. Server is started. Сервер запущен. Unable to connect to server. Не удалось соединиться с сервером. Server communication error. Ошибка коммуникации с сервером. Client does not exist. Клиент не существует. Unable to load internal client. Не удалось загрузить внутренний клиент. Unable to initialize client. Не удалось инициализировать клиент. Unable to access shared memory. Не удалось получить доступ к разделяемой памяти. Client protocol version mismatch. Несовпадение версии клиентского протокола Could not connect to JACK server as client. - %1 Please check the messages window for more info. Не удалось соединиться с сервером JACK. - %1 Просмотрите вывод в окне сообщений. Server configuration saved to "%1". Конфигурация сервера сохранена в "%1". Transport rewind. Перемотка к началу Transport backward. Перемотка назад Transport forward. Перемотка вперёд %1 (%2%) %1 (%2%) %1 % %1% %1 Hz %1Гц %1 frames %1 выборок %1 msec %1 мс XRUN callback (%1 skipped). Mi&nimize &Свернуть Rest&ore &Восстановить &Reset С&бросить &Presets &Профили S&ession С&еансы &Load... &Загрузить... &Save... &Сохранить Save and &Quit... Сохранить и вы&йти Save &Template... Сохранить &шаблон &Transport &Транспорт &Rewind К &началу QjackCtl QjackCtl Set&up... &Параметры &Patchbay &Коммутатор &Connect &Соединения DSP Load Загрузка DSP XRUN Count (notifications) Число XRUN (уведомлений) Show/hide the session management window Show/hide the messages log/status window Backward transport Перемотать назад &Backward Н&азад Forward transport Перемотать вперёд &Forward &Вперёд Rewind transport Перемотать к началу qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Сообщения и статус &Messages С&ообщения Messages log Журнал сообщений Messages output log Журнал выведенных сообщений &Status С&татус Status information Информация о статусе Statistics since last server startup Статистика с последнего запуска сервера Description Описание Value Значение Reset XRUN statistic values Обнулить статистику по рассинхронизации Re&set С&бросить Refresh XRUN statistic values Обновить статистику по рассинхронизации &Refresh &Обновить Server name Имя сервера Server state Статус сервера DSP Load Загрузка DSP Sample Rate Частота сэмплирования Buffer Size Размер буфера Realtime Mode Режим реального времени Transport state Состояние транспорта Transport Timecode Тайм-код транспорта Transport BBT BBT транспорта Transport BPM BPM транспорта XRUN count since last server startup Рассинхронизаций с последнего запуска сервера XRUN last time detected Последняя обнаруженная рассинхронизация XRUN last Последняя рассинхронизация XRUN maximum Максимальная рассинхронизация XRUN minimum Минимальная рассинхронизация XRUN average Средняя длительность рассинхронизаций XRUN total Всего рассинхронизаций Maximum scheduling delay Максимальная задержка расписания Time of last reset Время последнего сброса Logging stopped --- %1 --- Журналирование остановлено --- %1 --- Logging started --- %1 --- Журналирование запущено --- %1 --- qjackctlPatchbay Warning Предупреждение This will disconnect all sockets. Are you sure? Все сокеты будут рассоединены. Продолжить? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Коммутатор &New &Создать Create a new patchbay profile Создать новый профиль коммутатора &Load... &Загрузить... Load patchbay profile Загрузить профиль коммутатора &Save... &Сохранить... Save current patchbay profile Сохранить текущий профиль коммутатора Acti&vate &Активировать &Connect &Соединить Connect currently selected sockets Соединить выбранные сейчас сокеты &Disconnect &Рассоединить Disconnect currently selected sockets Рассоединить выбранные сейчас сокеты Disconnect &All Рассоединить &все Disconnect all currently connected sockets Рассоединить все соединённые сейчас сокеты &Refresh &Обновить Refresh current patchbay view Обновить текущий вид коммутатора Down Вниз Move currently selected output socket down one position Переместить выбранный сейчас сокет вниз на одну позицию Add... Добавить... Create a new output socket Создать новый сокет выхода Edit... Изменить... Edit currently selected input socket properties Изменить свойства выбранного сейчас сокета входа Up Вверх Move currently selected output socket up one position Переместить выбранный сейчас сокет вверх на одну позицию Remove Удалить Remove currently selected output socket Удалить выбранный сейчас сокет выхода Remove currently selected input socket Удалить выбранный сейчас сокет входа Create a new input socket Создать новый сокет входа Edit currently selected output socket properties Изменить свойства выбранного сейчас сокета выхода Warning Предупреждение active активно New Patchbay definition Новое описание коммутатора Patchbay Definition files Файл описания коммутатора Load Patchbay Definition Загрузить описание коммутатора Save Patchbay Definition Сохранить описание коммутатора The patchbay definition has been changed: "%1" Do you want to save the changes? Описание коммутатора изменилось: "%1" Вы хотите сохранить изменения? %1 [modified] Untitled%1 Без имени %1 Error Ошибка Could not load patchbay definition file: "%1" Не удалось загрузить файл описания коммутатора: "%1" Could not save patchbay definition file: "%1" Не удалось сохранить файл описания коммутатора: "%1" Create patchbay definition as a snapshot of all actual client connections? Создать описание коммутатора как снимок активных соединений клиентов? Duplicate (copy) currently selected output socket Copy... Скопировать... Duplicate (copy) currently selected input socket Expand all items Раскрыть все элементы E&xpand All &Раскрыть все Current (recent) patchbay profile(s) Toggle activation of current patchbay profile Переключить активность текущего профиля коммутатора qjackctlPatchbayView Add... Добавить... Edit... Изменить... Remove Удалить Move Up Выше Move Down Ниже &Connect &Соединить Alt+C Connect Alt+C &Disconnect &Рассоединить Alt+D Disconnect Alt+D Disconnect &All Рассоединить &все Alt+A Disconect All Alt+A &Refresh &Обновить Alt+R Refresh Alt+R Exclusive Copy... Скопировать... Forward (None) (Нет) qjackctlSessionForm Session - JACK Audio Connection Kit Сеансы Load session Загрузить сеанс &Load... &Загрузить Recent session Недавние сеансы &Recent &Недавние Save session Сохранить сеанс Save session versioning Сохранять версии сеансов &Versioning &Версии Re&fresh О&бновить Session clients / connections Клиенты и соединения сеанса Infra-clients / commands Инфра-клиенты и команды Infra-client Инфра-клиент Infra-command Инфра-команда Add infra-client Добавить инфра-клиент &Add &Добавить Edit infra-client Изменить инфра-клиент &Edit &Изменить Remove infra-client Удалить инфра-клиент Re&move &Удалить &Save... &Сохранить Update session Обновить сеанс Client / Ports Клиенты / Порты UUID UUID Command Команда &Save &Сохранить Load Session Загрузить сеанс Session directory Каталог с сеансами Save Session Сохранить сеанс and Quit и выйти Template Шаблон &Clear О&чистить Warning Предупреждение A session could not be found in this folder: "%1" Не удалось найти сеанс в каталоге «%1» %1: loading session... %1: загружается сеанс... %1: load session %2. %1: загрузить сеанс %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? В этой папке уже есть сеанс: "%1" Вы уверены, что хотите перезаписать его? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Эта папка уже существует и не пуста: "%1" Вы уверены, что хотите перезаписать существующую папку? %1: saving session... %1: сохраняется сеанс... %1: save session %2. %1: сохранить сеанс %2. New Client Новый клиент Save and &Quit... Сохранить и вы&йти Save &Template... Сохранить &шаблон qjackctlSessionInfraClientItemEditor Infra-command инфра-команда qjackctlSetupForm Setup - JACK Audio Connection Kit Параметры Settings Общие jackstart jackstart jackd jackd dummy dummy alsa alsa portaudio portaudio Parameters Основные 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Частота дискретизации выборок в секунду) 6 6 7 7 8 8 9 9 10 10 Scheduler priority when running realtime Приоритет планировщика в режиме реального времени 21333 21333 16 16 32 32 Priorit&y: П&риоритет: &Wait (usec): О&жидание (мс): &Frames/Period: &Выборок в буфере: 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Выборок в период между вызовами process() Sample &Rate: &Частота дискр.: H/&W Meter Аппаратный &счётчик None Нет Rectangular Прямоугольное Shaped По очертаниям Triangular Треугольное Duplex Дуплекс Provide either audio capture, playback or both Разрешить захват звука, его воспроизведение или всё сразу hw:0 hw:0 &Timeout (msec): &Тайм-аут (мс): Dit&her: Подмешивание &шума: 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in milliseconds Установить тайм-аут для клиента в миллисекундах &Interface: &Интерфейс: So&ft Mode &Программный режим &Monitor &Контроль Provide output monitor ports Задействовать порты контроля выхода &Realtime Режим &реал. времени Use realtime scheduling Использовать планирование в реал. времени (default) Whether to give verbose output on messages Подробно ли выводить сообщения Latency: Задержка: Output latency in milliseconds, calculated based on the period, rate and buffer settings Задержка выхода в мс, расчитанных на основе настроек периода, частоты и буфера Options Сценарии и журнал Scripting Сценарии Execute script on Start&up: Выполнять сценарий при &запуске: Whether to execute a custom shell script before starting up the JACK audio server. Выполнять ли собственный сценарий перед запуском сервера JACK. Execute script after &Startup: Выполнять сценарий после з&апуска: Whether to execute a custom shell script after starting up the JACK audio server. Выполнять ли собственный сценарий после запуска сервера JACK. Whether to execute a custom shell script after shuting down the JACK audio server. Выполнять ли собственный сценарий после остановки сервера JACK. Command line to be executed before starting up the JACK audio server Команда, выполняемая перед запуском сервера JACK ... ... Browse for script to be executed before starting up the JACK audio server Указать сценарий, выполняемый перед запуском сервера JACK Command line to be executed after starting up the JACK audio server Команда, выполняемая после запуска сервера JACK Browse for script to be executed after starting up the JACK audio server Указать сценарий, выполняемый после запуска сервера JACK Browse for script to be executed after shutting down the JACK audio server Указать сценарий, выполняемый после остановки сервера JACK Command line to be executed after shutting down the JACK audio server Команда, выполняемая после остановки сервера JACK Statistics Статистика &XRUN detection regex: &Регулярное выражение для определения XRUN: xrun of at least ([0-9|\.]+) msecs xrun of at least ([0-9|\.]+) msecs Regular expression used to detect XRUNs on server output messages Регулярное выражение для определения рассинхронизаций среди сообщений от сервера Connections Соединения Patchbay definition file to be activated as connection persistence profile Файл описания коммутатора, активируемый как профиль постоянного соединения Browse for a patchbay definition file to be activated Указать активируемый файл описания коммутатора Activate &Patchbay persistence: Активировать &постоянный коммутатор: Whether to activate a patchbay definition for connection persistence profile. Активировать ли описание коммутатора для профиля постоянного соединения. Display Интерфейс Transport &BBT (bar:beat.ticks) &BBT транспорта (такт:доля.тики) Elapsed time since last &Reset Время, прошедшее с последнего &сброса Elapsed time since last &XRUN Время, пошедшее с последней &рассинхронизации Messages Window Окно сообщений Sample messages text font display Каким будет шрифт для вывода сообщений сервера &Font... &Шрифт... Select font for the messages text display Выберите шрифт для отображения сообщений сервера msec мс n/a н/д Patchbay Definition files Файлы описания коммутатора Driv&er: &Драйвер: Preset &Name: Имя &профиля: Settings preset name Имя профиля параметров &Save &Сохранить Save settings as current preset name Сохранить параметры в текущий профиль &Delete &Удалить Delete current settings preset Удалить текущий профиль &Audio: &Звук: H/W M&onitor Аппаратный &контроль Force &16bit Принудительно &16 бит Force 16bit mode instead of failing over 32bit (default) Принудительно использовать 16бит-режим вместо 32бит (по умолчанию) Periods/&Buffer: Периодов на &буфер: Time in seconds that client is delayed after server startup Сколько секунд клиент ждёт после запуска сервера > > Scripting argument meta-symbols Метасимволы аргументов в сценариях &Capture standard output &Захватывать стандартный вывод Whether to capture standard output (stdout/stderr) into messages window Захватывать ли стандартный вывод (stdout/stderr) hh:mm:ss чч:мм:сс Other Другое &Confirm application close За&прашивать подтверждение на выход Whether to ask for confirmation on application exit Спрашивать ли подтверждение на выход из программы &Preset Name Имя &профиля &Server Path За&пуск сервера &Driver &Драйвер &Interface &Интерфейс Sample &Rate &Частота дискр. &Frames/Period &Фреймов/период Periods/&Buffer Периодов/&буфер oss oss Port Ma&ximum: &Макс. портов: Maximum number of ports the JACK server can manage Максимальное кол-во портов, обрабатываемых сервером JACK &Input Device: Устройство &входа: &Output Device: Устройство в&ыхода: /dev/dsp /dev/dsp No Memory Loc&k Б&ез блокировки памяти Do not attempt to lock memory, even if in realtime mode Не пытайтесь заблокировать память, даже в режиме реального времени &Ignore H/W &Игнорировать апп. буфер и период &Word Length: Ра&зрядность слова: Time Display Отображение времени Transport &Time Code &Тайм-код транспорта Sample front panel normal display font Пример текста в малом счётчике Sample big time display font Пример текста в большом счётчике Normal display: Малый счётчик: Big Time display: Большой счётчик: Time F&ormat: &Формат времени: hh:mm:ss.d чч:мм:сс.д hh:mm:ss.dd чч:мм:сс.дд hh:mm:ss.ddd чч:мм:сс.ддд The general time format on display Общий формат вывода времени на дисплей &Messages limit: Предел кол-ва &сообщений: Whether to keep a maximum number of lines in the messages window Ограничивать ли количество строк в окне сообщений 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Максимальное количество строк сообщений, доступное при просмотре &Start JACK audio server on application startup &Запускать звуковой сервер JACK при старте программы Whether to start JACK audio server immediately on application startup Запускать ли сервер JACK при старте QJackCtl &Keep child windows always on top О&кна программы всегда наверху Whether to keep all child windows on top of the main window &Enable system tray icon &Включить область уведомления Whether to enable the system tray icon Включать ли область уведомления (системный лоток, system tray) S&ave JACK audio server configuration to: Со&хранять конфигурацию JACK в файл: Whether to save the JACK server command-line configuration into a local file (auto-start) .jackdrc .jackdrc The server configuration local file name (auto-start) C&onfigure as temporary server &Настроить как временный сервер Whether to exit once all clients have closed (auto-start) Завершать ли работу при отсоединении все клиентов Warning Предупреждение Some settings have been changed: "%1" Do you want to save the changes? Некоторые параметры изменились: "%1" Вы хотите сохранить изменения? Delete preset: "%1" Are you sure? Удалить профиль: "%1" Вы уверены? &Server Name &Имя сервера Startup Script Сценарий, выполняемый при запуске Post-Startup Script Сценарий, выполняемый после запуска Shutdown Script Сценарий, выполняемый при выключении Post-Shutdown Script Сценарий, выполняемый после выключения Active Patchbay Definition Активное описание коммутатора Messages Log Журнал сообщений Log files Файлы журналов Some settings have been changed. Do you want to apply the changes? Некоторые параметры были изменены. Применить эти изменения? jackdmp jackdmp &Name: &Название: The JACK Audio Connection Kit sound server name The audio backend driver interface to use Используемый звуковой драйвер sun sun coreaudio coreaudio freebob freebob firewire firewire MIDI Driv&er: &Драйвер MIDI: The ALSA MIDI backend driver to use Используемый драйвер ALSA MIDI none нет raw raw seq seq Please do not touch these settings unless you know what you are doing. Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Разблокировать память основных библиотек интерфейсов (GTK+, QT, FLTK, Wine) &Unlock Memory &Разблокировать память Ignore xruns reported by the backend driver Enable hardware monitoring of capture ports Включить аппаратный контроль портов захвата Enable hardware metering on cards that support it Включить аппаратное измерение для поддерживающих эту функцию карт Ignore hardware period/buffer size &Verbose messages &Подробный вывод Maximum input audio hardware channels to allocate Максимальное число резервируемых каналов входа External output latency (frames) Capture Only Только захват Playback Only Только воспроизведение The PCM device name to use Имя используемого устройства PCM plughw:0 plughw:0 /dev/audio /dev/audio Alternate input device for capture Выберите устройство входа для захвата Maximum output audio hardware channels to allocate Максимальное резервируемое число звуковых каналов устройства Alternate output device for playback Альтернативное устройство воспроизведения External input latency (frames) Set dither mode Выберите способ подмешивания шума Server path (command line prefix) Number of periods in the hardware buffer Количество периодов в аппаратном буфере &Channels: &Каналов: 192000 192000 Word length Длина слова в байтах Maximum number of audio channels to allocate Максимальное число резервируемых звуковых каналов &Channels I/O: I/O &каналов: &Latency I/O: &Задержка I/O: Server Suffi&x: Су&ффикс сервера: Whether to execute a custom shell script before shuting down the JACK audio server. Execute script on Shut&down: В&ыполнять сценарий при выходе: Browse for script to be executed before shutting down the JACK audio server Command line to be executed before shutting down the JACK audio server Execute script after Shu&tdown: Выполнять сценарий после &выключения: Whether to reset all connections when a patchbay definition is activated. Сбрасывать ли все соединения при активации описания коммутатора &Reset all connections on patchbay activation С&брасывать все соединения при активации коммутатора Whether to issue a warning on active patchbay port disconnections. Показывать ли предупреждение о рассоединениии портов активного коммутатора &Warn on active patchbay disconnections Предупре&ждать о рассоединения в активном коммутаторе Logging Журналирование Messages log file Файл журнала сообщений Browse for the messages log file location Указать расположение файла журнала Whether to activate a messages logging to file. Сохранять ли протокол в файл журнала Advanced Дополнительные &Messages log file: Файл &журнала: Select font for front panel normal display Выбрать шрифт для малого счётчика Select font for big time display Выбрать шрифт для большого счётчика Whether to enable a shiny glass light effect on the main display Изображать ли блик на основном дисплее &Display shiny glass light effect Включить эффект &блика на дисплее Whether to enable blinking (flashing) of the server mode (RT) indicator Blin&k server mode indicator &Мерцать индикатором режима сервера Connections Window Окно соединений Sample connections view font Шрифт для диалога управления соединениями Select font for the connections view Выберите шрифт для просмотра соединений &Icon size: &Размер значков: The icon size for each item of the connections view Размер значка каждого элемента в окне соединений 16 x 16 16 × 16 32 x 32 32 × 32 64 x 64 64 × 64 Whether to enable in-place client/port name editing (rename) Ena&ble client/port aliases editing (rename) Ра&зрешить переименование алиасов клиентов/портов Whether to enable client/port name aliases on the connections window E&nable client/port aliases &Разрешить алиасы клиентов/портов Whether to draw connection lines as cubic Bezier curves Рисовать ли соединительные линии в диалогах «Соединения» и «Коммутатор» как кубические кривые Безье Server &Prefix: Пре&фикс сервера: Extra driver options (command line suffix) Дополнительные ключи дравера (суффикс в командной строке) Start De&lay: Задер&жка запуска: secs с 0 msecs 0 мс Draw connection and patchbay lines as Be&zier curves Рисовать линии соединения как кривые &Безье Misc Разное Whether to stop JACK audio server on application exit Останавливать ли звуково сервера JACK при выходе из приложения S&top JACK audio server on application exit Оста&навливать JACK при выходе из приложения Whether to start minimized to system tray Запускать ли приложение в области уведомления, скрывая основное окно JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Показывать ли сообщения программы в области уведомления, когда основное окно скрыто Sho&w system tray message on close Показывать сооб&щения в области уведомления Whether to ask for confirmation on JACK audio server shutdown Confirm server sh&utdown &Запраживать подтверждение на остановку сервера Start minimi&zed to system tray Whether to enable ALSA Sequencer (MIDI) support on startup Включать ли при запуске поддержку MIDI-секвенсера ALSA E&nable ALSA Sequencer support &Включить поддержку секвенсера ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Кнопки Whether to hide the left button group on the main window Скрывать ли группу кнопок в левой части основного окна Hide main window &Left buttons Скрывать &левые кнопки основного окна Whether to hide the right button group on the main window Скрывать ли группу кнопок в правой части основного окна Hide main window &Right buttons Скрывать прав&ые кнопки основного окна Whether to hide the transport button group on the main window Скрывать ли группу кнопок управления транспортом в основном окне Hide main window &Transport buttons Скрывать кнопки &транспорта Whether to hide the text labels on the main window buttons Скрывать ли надписи на кнопках в основном окне Hide main window &button text labels Скрывать по&дписи кнопок основного окна &JACK client/port aliases: &Алиасы клиентов/портов JACK: JACK client/port aliases display mode Default По умолчанию First Первый Second Второй Defaults Используемые по умолчанию параметры &Base font size: &Кегль шрифта в интерфейсе: Base application font size (pt.) 11 11 12 12 net net Whether to enable D-Bus interface Влючать ли интерфейс D-Bus &Enable D-Bus interface Вклю&чить интерфейс D-Bus Number of microseconds to wait between engine processes (dummy) netone netone Whether to restrict to one single application instance (X11) Single application &instance Зап&ускать только одну копию программы qjackctlSocketForm &Socket &Сокет &Client: &Клиент: Socket name (an alias for client name) Имя сокета (псевдоним имени клиента) &Name (alias): &Имя (псевдоним): Socket Plugs / Ports Сокетовые штепсели / Порты Socket plug list Список штепселей сокета &Down В&низ &Up В&верх Add plug to socket plug list Добавить штепсель в список штепселей сокета &Plug: &Штепсель: &Edit И&зменить &Remove &Удалить Remove currently selected plug from socket plug list Удалить выбранный штепсель из списка штепселей сокета Plugs / Ports Штепсели / Порты Error Ошибка A socket named "%1" already exists. Сокет с именем «%1» уже существует. Add Plug Добавить штепсель Remove Удалить Edit Изменить Move Up Переместить выше Move Down Переместить ниже Client name (regular expression) Имя клиента (регулярное выражение) Add P&lug Добавить &штепсель Port name (regular expression) Имя порта (регулярное выражение) Type Тип &Audio &Звук Audio socket type (JACK) Тип звукового сокета (JACK) &MIDI &MIDI MIDI socket type (ALSA) Тип MIDI-сокета (ALSA) E&xclusive Enforce only one exclusive cable connection Принудительно только одно кабельное соединение Warning Предупреждение Some settings have been changed. Do you want to apply the changes? Некоторые параметры были изменены. Применить эти изменения? (None) (Нет) Socket - JACK Audio Connection Kit Сокет Edit currently selected plug Изменить выбранный штепсель Move down currently selected plug in socket plug list Move up current selected plug in socket plug list &Forward: Forward (clone) all connections from this socket MIDI socket type (JACK) Тип MIDI-сокета (JACK) AL&SA AL&SA qjackctlSocketList Output Выход Input Вход Socket Сокет Warning Предупреждение <New> - %1 <Новый> - %1 %1 about to be removed: "%2" Are you sure? %1 будет удален: "%2" Вы уверены? %1 <Copy> - %2 %1 <Копия> - %2 qjackctlSocketListView Output Sockets / Plugs Гнезда наружу Input Sockets / Plugs Гнезда внутрь qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_it.ts0000644000000000000000000000012713215206021021130 xustar0029 mtime=1513425937.54776694 29 atime=1513425937.54776694 29 ctime=1513425937.54776694 qjackctl-0.5.0/src/translations/qjackctl_it.ts0000644000175000001440000050172313215206021021766 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Attenzione Audio hardware probing timed out. QObject (default) Start JACK audio server immediately Avvia subito il server Jack Set active patchbay definition file Imposta il file Patchbay predefinito Show help about command line options Mostra la guida sulle opzioni della riga di comando Show version information Mostra info sulla versione Option -p requires an argument (preset). L'opzione -p richiede un argomento (preset). Usage: %1 [options] [command-and-args] Uso: %1 [opzioni] [comandi-e-argomenti] Options: Opzioni: Set default settings preset name Imposta il nome per le impostazioni predefinite Option -a requires an argument (path). L'opzione -a richiede un argomento (indirizzo). Set default JACK audio server name Salva il nome predefinito del server JACK Option -n requires an argument (name). L'opzione -n richiede un argomento (nome). %1 (%2 frames) qjackctlAboutForm About Qt Info su QT &Close &Chiudi Version Versione Debugging option enabled. Opzione di debbugging abilitata. System tray disabled. Vassoio di sistema (system tray) non abilitata. Transport status control disabled. Controllo dello stato del transport disabilitato. Realtime status disabled. Stato Realtime disabilitato. XRUN delay status disabled. Stato del ritardo degli XRUN disabilitato. Maximum delay status disabled. Stato del massimo ritardo disabilitato. ALSA/MIDI sequencer support disabled. Supporto del sequencer ALSA/MIDI disabilitato. Website Sito Web This program is free software; you can redistribute it and/or modify it Questo programma è free software; è possibile ridistribuirlo e/o modificarlo under the terms of the GNU General Public License version 2 or later. nei termini dell GNU General Public License version 2 o superiore. JACK MIDI support disabled. Supporto del MIDI di Jack disabilitato. About QjackCtl Info su QjackCtl JACK Port aliases support disabled. Supporto per gli alias delle porte di Jack disabilitato. D-Bus interface support disabled. Supporto per l'interfaccia D-Bus disabilitato. JACK Session support disabled. supporto per le Sessioni di JACK disabilitato. Using: JACK %1 In uso: JACK %1 qjackctlClientListView &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Disconnetti &Tutto Re&name Ri&omina &Refresh &Aggiorna Readable Clients / Output Ports Clients leggibili / Porte d'uscita Writable Clients / Input Ports Clients Scrivibili / Porte d'entrata Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A Alt+N Rename Rinomina Alt+N Alt+R Refresh Aggiorna Alt+R qjackctlConnect Warning Attenzione This will suspend sound processing from all client applications. Are you sure? Quest'azione sospenderà il processamento sonoro da tutte le applicazioni clients. Sei sicuro? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Connessioni - JACK Audio Connection Kit Audio Audio &Connect &Connetti Connect currently selected ports Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected ports Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected ports Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current connections view Aggiorna la situazione delle connessioni MIDI MIDI Warning Attenzione The preset aliases have been changed: "%1" Do you want to save the changes? Gli alias delle porte sono cambiati: "%1" Salvare i cambiamenti? ALSA ALSA Expand all client ports Espandi tutte le porte dei clients E&xpand All E&spandi tutto qjackctlConnectorView &Connect &Connetti Disconnect &All Disconnetti &Tutto &Refresh &Aggiorna Alt+C Connect Connetti Alt+C &Disconnect &Disconnetti Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A Alt+R Refresh Aggiorna Alt+R qjackctlMainForm &Quit &Esci Quit processing and exit Termina il processo sonoro ed esci &Start &Avvia Start the JACK server Avvia il server JACK S&top &Ferma Stop the JACK server Ferma il server JACK St&atus &Stato Ab&out... Inf&o su... Show information about this application Mostra le info riguardo questo software Show settings and options dialog Mostra la finestra delle impostazioni/opzioni &Messages &Messaggi Patch&bay Patch&bay Show/hide the patchbay editor window Mostra/nascondi la finestra del patchbay &Connect &Connetti Show/hide the actual connections patchbay window Mostra/nascondi la finestra delle connessioni del Patchbay JACK server state Stato del server JACK JACK server mode Modalità del server JACK Sample rate Frequenza di Campionamento Time display Visuale del Tempo Transport state Stato del transport Transport BPM BPM del transport Transport time Tempo del transport Backward transport Retrocedi transport Forward transport Avanza transport Rewind transport Riavvolgi transport Stop transport rolling Ferma il transport Start transport rolling Fai partire il transport Warning Attenzione successfully con successo with exit status=%1 con stato di uscita %1 Could not load preset "%1". Retrying with default. Non sono riuscito a caricare il preset "%1". Provo con il predefinito. Could not load default preset. Sorry. Non riesco a caricare il preset predefinito. Mi dispiace. Startup script... Script di inizio... Startup script terminated Script di inizio terminato JACK is starting... JACK sta partendo... Could not start JACK. Sorry. Non riesco ad avviare JACK. Mi dispiace. JACK is stopping... JACK si sta arrestando... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Il programma continuerà a lavorare nel vassoio di sistema (system tray). Per terminarlo, clicca su "Esci" nel menù del tasto destro sull icona nel vassoio. Shutdown script... Script d'arresto... Shutdown script terminated Script d'arresto terminato JACK was stopped JACK è stato fermato Post-shutdown script... Script di post - arresto... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Servizio disponibile (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Servizio non disponibile (%1 aka jackdbus). Don't show this message again Don't ask this again D-BUS: JACK server is starting... D-BUS: JACK si sta avviando... D-BUS: JACK server could not be started. Sorry D-BUS: il server JACK non può essere avviato. Mi dispiace D-BUS: JACK server is stopping... D-BUS: JACK si sta arrestando... D-BUS: JACK server could not be stopped. Sorry D-BUS: il server JACK non può essere arrestato. Mi dispiace Post-shutdown script terminated Script di post - arresto terminato D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK è stato avviato (%1 aka jackdbus). D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK è stato fermato (%1 aka jackdbus). Error Errore Transport time code Codice temporale del transport Elapsed time since last reset Tempo trascorso dall'ultimo reset Elapsed time since last XRUN Tempo trascorso dall'ultimo XRUN Patchbay activated. Patchbay attivato. Patchbay deactivated. Patchbay disattivato. Statistics reset. Resetta le statistiche. msec msec XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio della dimensione del buffer (%1). Shutdown notification. Notifica dell'arresto. JACK property change. checked verificato connected connesso disconnected disconnesso failed fallito Server configuration saved to "%1". Configurazione del server salvata in "%1". Client activated. Client attivato. Post-startup script... Script post - avvio... Post-startup script terminated Script di post - avvio terminato Command line argument... Argomento della linea di comando... Command line argument started Argomento della linea di comando eseguita Client deactivated. Client disattivato. Transport rewind. Riavvorgere il transport. Transport backward. Retrocedere il transport. Starting Avvio Transport start. Transport partito. Stopping Arresto Transport stop. Transport arrestato. Transport forward. Avanzare il transport. Stopped Arrestato Yes Si No No RT RT Rolling Riproduzione Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Avviato Active Attivo Activating Attivazione Inactive Inattivo &Hide &Nascondi Mi&nimize Mi&nimizza S&how &Mostra Rest&ore &Ristabilisci &Stop &Ferma &Reset &Reset &Connections &Connessioni Server settings will be only effective after restarting the JACK audio server. I cambiamenti diventeranno effettivi solo al riavvio di JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Informazioni Some settings will be only effective the next time you start this program. Alcune modifiche saranno effettive solo al prossimo avvio dell'applicazione. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Non riesco ad aprire il sequencer ALSA come client. Il Patchbay MIDI non sarà disponibile. JACK is currently running. Do you want to terminate the JACK audio server? JACK è attualmente attivato. Vuoi arrestare il server JACK? Could not start JACK. Maybe JACK audio server is already started. Non riesco ad avviare JACK. Forse il server JACK è già avviato. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Alcune applicazioni audio sono ancora attive e connesse. Vuoi arrestare il server JACK? JACK was started with PID=%1. JACK è stato avviato con PID=%1. JACK is being forced... JACK viene forzato... Patchbay reset. JACK connection graph change. Grafico delle connessioni di JACK modificato. JACK has crashed. JACK ha crashato. JACK timed out. Tempo d'attesa per JACK terminato. JACK write error. Errore di scrittura di JACK. JACK read error. Errore di lettura di JACK. Unknown JACK error (%d). Errore di JACK sconosciuto (%d). ALSA connection graph change. Cambiamento nel grafico delle connessioni di ALSA. JACK active patchbay scan Scansione del patchbay per JACK activo ALSA active patchbay scan Scansione del patchbay per ALSA attivo JACK connection change. Connessioni di JACK cambiate. ALSA connection change. Connessioni di ALSA cambiate. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una connessione è definita nel Patchbay, che probabilmente ripeterà la connessione: %1 -> %2 Vuoi rimuovere questa connessione dal Patchbay? Overall operation failed. Operazione fallita. Invalid or unsupported option. Opzione non valida o non supportata. Client name not unique. Il nome del client non è unico. Server is started. Il server JACK è stato avviato. Unable to connect to server. Impossibile connettersi al server JACK. Server communication error. Errore di comunicazione col server JACK. Client does not exist. Il client non esiste. Unable to load internal client. Impossibile caricare il client interno. Unable to initialize client. Impossibile inizializzare il client. Unable to access shared memory. Impossibile accedere alla memoria condivisa. Client protocol version mismatch. La versione del protocollo del client è incongruente. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Non sono riuscito ad avviare JACK come client. - %1 Controlla la finestra dei messaggi per maggiori informazioni. %1 (%2%) %1 (%2%) %1 % %1 % %1 Hz %1 Hz %1 frames %1 fotogrammi %1 msec %1 msec &Presets &Presets &Transport &Transport &Rewind &Riavvolgi &Play Ri&produci Pa&use Pa&usa QjackCtl QjackCtl &Patchbay &Patchbay DSP Load Carico DSP XRUN Count (notifications) Conteggio XRUN (notifiche) &Backward R&etrocedi &Forward &Avanza Set&up... Imp&ostazioni... S&ession S&essioni &Load... &Apri... &Save... &Salva... Save and &Quit... Salva ed E&sci... Save &Template... Salva &Modello... Show/hide the session management window Mostra/Nascondi la finestra di gestione delle sessioni Show/hide the messages log/status window Mostra/Nascondi la finestra di stato/log Could not load active patchbay definition. "%1" Disabled. Non riesco a caricare il file del patchbay attivo. "%1" Disabilitato. &Versioning &Versione Re&fresh Agg&iorna %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Messaggi / Stato - JACK Audio Connection Kit &Messages &Messaggi Messages log Log dei messaggi Messages output log Log dei messaggi di output &Status &Stato Status information Informazioni sullo Stato Statistics since last server startup Statistiche dall'ultimo avvio del server Description Descrizione Value Valore Reset XRUN statistic values Reimposta le statistiche degli XRUN Re&set Reimpo&sta Refresh XRUN statistic values Aggiorna le statistiche degli XRUN &Refresh &Refresh Server name Nome del server Server state Stato del server DSP Load Carico DSP Sample Rate Frequenza di campionamento Buffer Size Dimensione del buffer Realtime Mode Modo Realtime Transport state Stato del transport Transport Timecode Codice temporale del transport Transport BBT BBT del transport Transport BPM BPM del transport XRUN count since last server startup Conteggio degli XRUN dall'ultimo avvio del server XRUN last time detected Momento dell'ultimo XRUN XRUN last Ultimo XRUN XRUN maximum XRUN massimi XRUN minimum XRUN minimi XRUN average XRUN medi XRUN total XRUN totali Maximum scheduling delay Massimo ritardo nello scheduling Time of last reset Tempo dell'ultimo reset Logging stopped --- %1 --- Logging fermato --- %1 --- Logging started --- %1 --- Logging avviato --- %1 --- qjackctlPatchbay Warning Attenzione This will disconnect all sockets. Are you sure? Questo disconnetterà tutte le porte. Sei sicuro? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connection Kit &New &Nuovo Create a new patchbay profile Crea un nuovo profilo Patchbay &Load... &Apri... Load patchbay profile Carica il profilo del Patchbay &Save... &Salva... Save current patchbay profile Salva il profilo corrente del Patchbay Acti&vate Atti&va Toggle activation of current patchbay profile Modifica lo stato di attivazione del Patchbay corrente &Connect &Connetti Connect currently selected sockets Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected sockets Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected sockets Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current patchbay view Aggiorna la vista del Patchbay Down Giù Move currently selected output socket down one position Muovi la porta selezionata in basso Add... Aggiungi... Create a new output socket Crea una nuova porta d'uscita Edit... Modifica... Edit currently selected input socket properties Modifica la porta d'entrata selezionata Up Su Move currently selected output socket up one position Muovi la porta selezionata in alto Remove Rimuovi Remove currently selected output socket Rimuovi la porta d'uscita selezionata Copy... Copia... Duplicate (copy) currently selected output socket Duplica (copia) la porta d'uscita selezionata Remove currently selected input socket Rimuovi la porta d'entrata selezionata Duplicate (copy) currently selected input socket Duplica (copia) la porta d'entrata selezionata Create a new input socket Crea una nuova porta d'entrata Edit currently selected output socket properties Modifica la porta d'uscita selezionata Warning Attenzione active attivo New Patchbay definition Nuova definizione del Patchbay Patchbay Definition files Files di definizione del Patchbay Load Patchbay Definition Carica definizione del Patchbay Save Patchbay Definition Salva definizione del Patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? Le definizioni del Patchbay sono cambiate: "%1" Vuoi salvare le modifiche? %1 [modified] %1 [modificato] Untitled%1 Senza titolo%1 Error Errore Could not load patchbay definition file: "%1" Non riesco a caricare il file di definizioni del Patchbay: "%1" Could not save patchbay definition file: "%1" Non riesco a salvare il file di definizioni del Patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Creo un Patchbay partendo dalle connessioni attuali? Current (recent) patchbay profile(s) Profilo (recente) del Patchbay Expand all items Espandi tutti gli elementi E&xpand All E&spandi tutto qjackctlPatchbayView Add... Aggiungi... Edit... Modifica... Copy... Copia... Remove Rimuovi Exclusive Esclusiva Move Up Porta su Move Down Porta giù &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Desconnetti &Tutto &Refresh &Aggiorna Alt+R Refresh Alt+A Forward Avanza (None) (Nessuno) Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A qjackctlSessionForm Session - JACK Audio Connection Kit Sessione - JACK Audio Connection Kit Load session Carica Sessione &Load... &Apri... Recent session Sessione recente &Recent &Recente Save session Salva sessione &Save... &Salva... Client / Ports Client / Porte UUID UUID Command Comando Load Session Carica Sessione Session directory Cartella della Sessione Save Session Salva Sessione and Quit ed Esci Template Modello &Clear Pulis&ci Warning Attenzione A session could not be found in this folder: "%1" non riesco a trovare una Sessione in questa cartella: "%1" %1: loading session... %1: carico la sessione... %1: load session %2. %1: carico la sessione %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una Sessione esiste già in questa cartella: "%1" Sovrascivo la Sessione? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Questa cartella esiste già e non è vuota: "%1" Sovrascrivo la cartella? %1: saving session... %1: salvo la sessione... %1: save session %2. %1: salvo la sessione %2. Update session Aggiorna sessione Save and &Quit... Salva ed Es&ci... Save &Template... Salva &Modello... &Save &Salva Save session versioning Salva la versione della sessione &Versioning &Versione Re&fresh Agg&iorna Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit &Modifica Remove infra-client Re&move New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Configurazione - JACK Audio Connection Kit Settings Impostazioni Preset &Name: &Nome del Preset: (default) Settings preset name Nome del preset &Save &Salva Save settings as current preset name Salva le impostazioni sul preset corrente &Delete &Elimina Delete current settings preset Elimina il preset con le impostazioni correnti jackstart jackstart jackd jackd Driv&er: Dri&ver: dummy dummy oss oss alsa alsa portaudio portaudio coreaudio coreaudio Parameters Parametri Number of periods in the hardware buffer Numero di periodi nel buffer hardware Priorit&y: &Priorità: &Frames/Period: &Fotogrammi/Periodo: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Fotogrammi per periodo tra chiamate a process() Port Ma&ximum: Numero mas&simo di porte: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frequenza di campionamento in fotogrammi al secondo Scheduler priority when running realtime Priorità dello scheduler quando eseguito in realtime &Word Length: &Lunghezza delle parole: Periods/&Buffer: Periodi/&Buffer: Word length Lunghezza delle parole Maximum number of ports the JACK server can manage Numero massimo di porte che JACK può gestire &Wait (usec): &Attesa massima (microsec): Sample &Rate: &Campionamento: &Timeout (msec): &Attesa massima (msec): 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in milliseconds Imposta il limite di tempo di attesa per il client, in msec &Realtime Tempo &Reale Use realtime scheduling Usa priorità dello scheduling in tempo reale No Memory Loc&k Non b&loccare memoria Do not attempt to lock memory, even if in realtime mode Non bloccare la memoria, anche in tempo reale &Unlock Memory &Sblocca Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Sblocca la memoria per i toolkit classici (GTK+, QT, FLTK, Wine) So&ft Mode Modo So&ft Ignore xruns reported by the backend driver Ignora gli XRUN provenienti dal driver &Monitor &Monitor Provide output monitor ports Attiva porte d'uscita per il monitor Force &16bit Forza &16bit Force 16bit mode instead of failing over 32bit (default) Forza il modo 16bit invece del predefinito 32bit H/W M&onitor M&onitor Hardware Enable hardware monitoring of capture ports Abilita l'hardware monitor delle porte d'ingresso H/&W Meter Meter Hard&ware Enable hardware metering on cards that support it Abilita il metering per le schede che lo supportano &Ignore H/W &Ignora HardWare Ignore hardware period/buffer size Ignora la dimensione periodo/buffer dell'hardware &Output Device: Dispositiv&o d'uscita: &Interface: &Interfaccia: Maximum input audio hardware channels to allocate Numero massimo di canali hardware d'entrata &Audio: A&udio: Dit&her: Dit&her: External output latency (frames) Latenza esterna d'uscita (fotogrammi) &Input Device: D&ispositivo d'entrata: Duplex Duplex Capture Only Solo Cattura Playback Only Solo Riproduzione Provide either audio capture, playback or both Scegli se abilitare l'audio in cattura, in registrazione o entrambi hw:0 hw:0 The PCM device name to use Nome del dispositivo PCM da usare > > /dev/dsp Alternate input device for capture Seleziona il dispositivo alternativo d'entrata per la registrazione Maximum output audio hardware channels to allocate Numero massimo di canali hardware d'uscita Alternate output device for playback Seleziona il dispositivo alternativo d'uscita per la riproduzione External input latency (frames) Latenza esterna d'entrata (fotogrammi) None Nessuno Rectangular Rettangolare Shaped Modellato Triangular Triangolare Set dither mode Scegli il modo del dither Whether to give verbose output on messages Verbosità nei messaggi d'uscita Time in seconds that client is delayed after server startup Tempo di ritardo nell'avvio del server JACK (in secondi) Latency: Latenza: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latenza d'uscita in millisecondi, calcolata in base al rapporto fra periodo, fotogrammi e buffer Options Opzioni Scripting Scripting Execute script on Start&up: Esegui script prima dell'Avvi&o: Whether to execute a custom shell script before starting up the JACK audio server. Eseguire uno script prima dell'avvio del server JACK. Execute script after &Startup: Esegui script dopo l'Avv&io: Whether to execute a custom shell script after starting up the JACK audio server. Eseguire uno script dopo l'avvio del server JACK. Execute script on Shut&down: Esegui script prima dell'Ar&resto: Whether to execute a custom shell script before shuting down the JACK audio server. Eseguire uno script prima dell'arresto del server JACK. Command line to be executed before starting up the JACK audio server Comando da eseguire prima dell'avvio di JACK Scripting argument meta-symbols Meta simboli utilizzabili negli script ... ... Browse for script to be executed before starting up the JACK audio server Cerca uno script da eseguire prima dell'avvio del server JACK Command line to be executed after starting up the JACK audio server Comando da eseguire dopo l'avvio di JACK Browse for script to be executed after starting up the JACK audio server Cerca uno script da eseguire dopo l'avvio del server JACK Browse for script to be executed before shutting down the JACK audio server Cerca uno script da eseguire prima dell'arresto del server JACK Command line to be executed before shutting down the JACK audio server Comando da eseguire prima dell'arresto di JACK Execute script after Shu&tdown: Esegui script dopo l'Ar&resto: Whether to execute a custom shell script after shuting down the JACK audio server. Eseguire uno script dopo l'arresto di JACK. Browse for script to be executed after shutting down the JACK audio server Cerca uno script da eseguire dopo l'arresto del server JACK Command line to be executed after shutting down the JACK audio server Comando da eseguire dopo l'arresto di JACK Statistics Statistiche &Capture standard output &Cattura l'output standard dei comandi Whether to capture standard output (stdout/stderr) into messages window Catturare l'output standard nella finestra dei messaggi &XRUN detection regex: Espressione regolare per individuare gli &XRUN: xrun of at least ([0-9|\.]+) msecs XRUN di ([0-9|\.]+) msecs al massimo Regular expression used to detect XRUNs on server output messages Espressione regolare usata per il riconoscimento degli XRUN Connections Connessioni 10 10 Patchbay definition file to be activated as connection persistence profile Attiva il Patchbay in maniera persistente Browse for a patchbay definition file to be activated Sfoglia i file per caricare un Patchbay salvato Activate &Patchbay persistence: Attiva un &Patchbay persistente: Whether to activate a patchbay definition for connection persistence profile. Attiva un Patchbay predefinito per effettuare connessioni persistenti. Display Display Time Display Display del tempo Time F&ormat: F&ormato del tempo: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Il formato temporale generico da mostrare Transport &Time Code Codice temporale del &Transport Transport &BBT (bar:beat.ticks) &BBT del Transport (battuta:pulsazione:frazioni) Elapsed time since last &Reset Tempo trascorso dall'ultimo &Reset Elapsed time since last &XRUN Tempo trascorso dall'ultimo &XRUN Sample front panel normal display font Carattere normale da mostrare nel display frontale Sample big time display font Carattere grande da mostrare nel display frontale Big Time display: Display grande del tempo: &Font... Cara&ttere... Select font for front panel normal display Tipo di carattere normale da mostrare nel display frontale Select font for big time display Tipo di carattere grande da mostrare nel display frontale Normal display: Display normale: &Display shiny glass light effect Usare effetto &di riflesso di vetro Whether to enable a shiny glass light effect on the main display Abilita l'effetto di riflesso di vetro sul display principale Messages Window Finestra dei messaggi Sample messages text font display Tipo di carattere per la finestra dei messaggi Select font for the messages text display Seleziona il tipo di carattere per la finestra dei messaggi &Messages limit: Limite dei &Messaggi: Whether to keep a maximum number of lines in the messages window Se limitare ad un numero massimo di righe nella finestra dei messaggi 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Il numero massimo di messaggi da mostrare a vista Please do not touch these settings unless you know what you are doing. Connections Window Finestra delle Connessioni Sample connections view font Tipo di carattere per la finestra delle connessioni Select font for the connections view Seleziona il tipo di carattere per la finestra delle connessioni &Icon size: Dimensione delle &Icone: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Dimensione delle icone per gli elementi nella finestra delle connessioni Ena&ble client/port aliases editing (rename) A&bilita la modifica degli alias di clients/porte (rinomina) Whether to enable in-place client/port name editing (rename) Permetti la modifica veloce dei nomi dei clients/porte E&nable client/port aliases Abilita gli alias per &porte/clients Whether to enable client/port name aliases on the connections window Permetti gli alias per i nomi dei clients/porte Draw connection and patchbay lines as Be&zier curves Disegna le connessioni in forma di curve Be&zier Whether to draw connection lines as cubic Bezier curves Permetti il disegno delle connessioni in forma di curve cubiche Bezier Misc Varie Other Altro &Start JACK audio server on application startup Avvia il &server JACK all'avvio dell'applicazione Whether to start JACK audio server immediately on application startup Avvia immediatamente il server JACK all'avvio dell'applicazione &Confirm application close &Chiedi conferma alla chiusura Whether to ask for confirmation on application exit Chiedi conferma prima di chiudere l'applicazione &Keep child windows always on top Mantieni le finestre fi&glie sempre sopra le altre Whether to keep all child windows on top of the main window Scegli se mantenere le finestre figlie sempre sopra le altre &Enable system tray icon Abilita l'icona nel vassoio di sist&ema Whether to enable the system tray icon Scegli se visualizzare un'icona sul vassoio di sistema (system tray) S&ave JACK audio server configuration to: S&alva la configurazione di JACK in: Whether to save the JACK server command-line configuration into a local file (auto-start) Scegli se salvare la configurazione del server JACK in un file locale (all'avvio) .jackdrc .jackdrc The server configuration local file name (auto-start) Configurazione locale del server (all'avvio) C&onfigure as temporary server C&onfigura come server temporaneo Whether to exit once all clients have closed (auto-start) Scegli se uscire dopo che tutti i clients sono disconnessi (all'avvio) Whether to ask for confirmation on JACK audio server shutdown Scegli di chiedere conferma alla chiusura del server JACK Warning Attenzione msec msec n/a n/d &Preset Name Nome del &Preset &Server Path Indirizzo del &Server &Driver &Driver &Interface &Interfaccia Sample &Rate &Frequenza di campionamento &Frames/Period &Fotogrammi/Periodo Periods/&Buffer Periodi/&Buffer Patchbay Definition files Files di definizione del Patchbay Some settings have been changed: "%1" Do you want to save the changes? Alcune impostazioni sono cambiate: "%1" Vuoi salvarle? Delete preset: "%1" Are you sure? Cancello Preset: "%1" Sei sicuro? Startup Script Script all'avvio Post-Startup Script Script dopo l'avvio Shutdown Script Script all'arresto Post-Shutdown Script Script dopo l'arresto Active Patchbay Definition Definizione attiva del Patchbay Messages Log Log dei messaggi Log files Files di log Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono cambiate. Vuoi applicare i cambiamenti? jackdmp jackdmp The audio backend driver interface to use Driver dell'interfaccia audio da usare sun sun freebob freebob firewire firewire MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use Driver MIDI di ALSA da usare none nessuno raw raw seq seq &Verbose messages &Verbosità nei messaggi plughw:0 plughw:0 /dev/audio /dev/audio &Channels: &Canali: 192000 192000 Maximum number of audio channels to allocate Massimo numero di canali audio allocabili Logging Logging Messages log file File di log dei messaggi Browse for the messages log file location Scegli il file in cui loggare i messaggi Whether to activate a messages logging to file. Scegli se attivare il logging dei messaggi su file. Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections &Messages log file: File log dei &messaggi: Whether to enable blinking (flashing) of the server mode (RT) indicator Scegli se abilitare l'indicazione intermittente della modalità del server (RT) Blin&k server mode indicator Intermittenza nell'indicatore modo ser&ver &JACK client/port aliases: Alias clients/porte di &JACK: JACK client/port aliases display mode Modalità di visualizzazione degli alias di clients/porte Default Predefinito First Primo Second Secondo JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Whether to start minimized to system tray Avvia l'applicazione minimizzata come icona nel vassoio di sistema (system tray) Start minimi&zed to system tray Avvia minimi&zzato nel vassoio di sistema Confirm server sh&utdown Co&nferma l'arresto del server Whether to enable ALSA Sequencer (MIDI) support on startup Scegli se abilitare il sequencer ALSA (MIDI) all'avvio E&nable ALSA Sequencer support Abilita se&quencer ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Pulsanti Whether to hide the left button group on the main window Scegli se nascondere i pulsanti a sinistra nella finestra principale Hide main window &Left buttons Nascondi i pu&lsanti di sinistra nella finestra principale Whether to hide the right button group on the main window Scegli se nascondere i pulsanti a destra nella finestra principale Hide main window &Right buttons Nascondi i pulsanti di dest&ra nella finestra principale Whether to hide the transport button group on the main window Scegli se nascondere i pulsanti del transport nella finestra principale Hide main window &Transport buttons Nascondi i pulsanti del &Transport nella finestra principale Whether to hide the text labels on the main window buttons Scegli se nascondere il testo dei pulsanti nella finestra principale Hide main window &button text labels Nascondi il testo dei p&ulsanti nella finestra principale Defaults Predefinite &Base font size: Dimensione &base dei caratteri: Base application font size (pt.) Dimesione predefinita dei caratteri nell'applicazione (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface Scegli se abilitare l'interfaccia D-Bus &Enable D-Bus interface &Abilita l'interfaccia D-Bus Number of microseconds to wait between engine processes (dummy) Microsecondi d'attesa fra i processi del motore (dummy) netone netone Whether to restrict to one single application instance (X11) Scegli se registrare un'unica istanza dell'applicazione (X11) Single application &instance Permetti una sola &istanza &Name: &Nome: The JACK Audio Connection Kit sound server name Il nome del server audio Jack &Server Name Nome del &Server Server path (command line prefix) Indirizzo del server (prefisso nella riga di comando) &Channels I/O: &Canali I/O: &Latency I/O: &Latenza I/O: Start De&lay: Ritardo a&ll'avvio: secs secondi 0 msecs 0 millisecondi Server Suffi&x: Suffisso per il Ser&ver: Server &Prefix: Prefis&so per il Server: Extra driver options (command line suffix) Opzioni extra per il driver (suffisso nella riga di comando) Whether to stop JACK audio server on application exit S&top JACK audio server on application exit qjackctlSocketForm &Socket &Socket &Name (alias): &Nome (alias): Socket name (an alias for client name) Nome del socket (un alias per il nome del client) Client name (regular expression) Nome del client (espressione regolare) Add P&lug Aggiungi p&resa Add plug to socket plug list Aggiungi una presa alla lista delle prese &Plug: &Presa: Port name (regular expression) Nome della porta (espressione regolare) Socket Plugs / Ports Prese / Porte del Socket Socket plug list Lista dei socket tipo presa &Edit &Modifica &Remove &Rimuovi Remove currently selected plug from socket plug list Rimuovi la presa selezionata dalla lista del socket &Client: &Client: &Down &Giù &Up S&u E&xclusive Esclusi&vo Enforce only one exclusive cable connection Permetti una connessione da un solo cavo Type Tipo &Audio &Audio Audio socket type (JACK) Socket di tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket di tipo MIDI (ALSA) Plugs / Ports Prese / Porte Error Errore A socket named "%1" already exists. Un socket chiamato "%1" esiste già. Add Plug Aggiungi presa Remove Rimuovi Edit Modifica Move Up Sposta Su Move Down Sposta Giù Warning Attenzione Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono state modificate. Applicare le modifiche ora? (None) (Nessuno) Socket - JACK Audio Connection Kit Sockets - JACK Audio Connection Kit Edit currently selected plug Modifica la presa selezionata Move down currently selected plug in socket plug list Sposta giù la presa selezionata nella lista socket Move up current selected plug in socket plug list Sposta su la presa selezionata nella lista socket &Forward: C&lona: Forward (clone) all connections from this socket Clona tutte le connessioni di questo socket MIDI socket type (JACK) Tipo di socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Uscita Input Entrata Socket Socket Warning Attenzione <New> - %1 <Nuovo> - %1 %1 about to be removed: "%2" Are you sure? Sto per rimuovere %1: "%2" Sei sicuro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets / Prese d'uscita Input Sockets / Plugs Sockets / Prese d'entrata qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_de.ts0000644000000000000000000000012713215206021021104 xustar0029 mtime=1513425937.54576694 29 atime=1513425937.54476694 29 ctime=1513425937.54576694 qjackctl-0.5.0/src/translations/qjackctl_de.ts0000644000175000001440000050047413215206021021744 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Warnung Audio hardware probing timed out. QObject (default) Usage: %1 [options] [command-and-args] Benutzung: %1 [Optionen] [Kommandos und Argumente] Options: Optionen: Start JACK audio server immediately JACK Audioserver sofort starten Set active patchbay definition file Steckfeldkonfigurationsdatei festlegen Show help about command line options Zeige Hilfe zu Kommandozeilenargumenten an Show version information Zeige Versionsinformation an Option -p requires an argument (preset). Option -p benötigt ein Argument (Preset). Option -a requires an argument (path). Option -a benötigt ein Argument (Pfad). Set default settings preset name Name für die Voreinstellungen festlegen Set default JACK audio server name Voreingestellten JACK-Audioservernamen einstellen Option -n requires an argument (name). Option -n benötigt ein Argument (Name). %1 (%2 frames) qjackctlAboutForm About QjackCtl Über QjackCtl &Close &Schließen About Qt Über Qt Version Version Using: JACK %1 Nutze: JACK %1 Debugging option enabled. Debugging-Option aktiviert. System tray disabled. Benachrichtigungsfeld deaktiviert. Transport status control disabled. Transportstatuskontrolle abgeschaltet. Realtime status disabled. Echtzeitstatus deaktiviert. XRUN delay status disabled. XRUN Verzögerungsstatus abgeschaltet. Maximum delay status disabled. Status für maximale Verzögerung abgeschaltet. JACK MIDI support disabled. JACK MIDI wird nicht unterstütz. JACK Session support disabled. JACK Session nicht unterstützt. ALSA/MIDI sequencer support disabled. ALSA/MIDI Sequencer wird nicht unterstützt. Website Webseite This program is free software; you can redistribute it and/or modify it Dieses Programm ist freie Software; Sie können es gemäß der under the terms of the GNU General Public License version 2 or later. GNU General Public License weiterverteilen und/oder modifizieren. JACK Port aliases support disabled. Alternativnamen für JACK-Anschlüsse abgeschaltet. D-Bus interface support disabled. Unterstützung der D-Bus-Schnittstelle abgeschaltet. qjackctlClientListView Readable Clients / Output Ports Lesbare Clients/Ausgänge Writable Clients / Input Ports Beschreibbare Clients/Eingänge &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconect All Alt+A Re&name &Umbenennen Alt+N Rename Alt+U &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlConnect Warning Warnung This will suspend sound processing from all client applications. Are you sure? Hiermit wird die Klangverarbeitung aller Client-Anwendungen unterbrochen. Sind Sie sicher? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Verbindungen - JACK Audio Connection Kit Audio Audio Connect currently selected ports Ausgewählte Anschlüsse verbinden &Connect &Verbinden Disconnect currently selected ports Ausgewählte Anschlüsse trennen &Disconnect &Trennen Disconnect all currently connected ports Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all client ports Alle Client-Anschlüsse aufklappen E&xpand All Alle auf&klappen Refresh current connections view Ansicht der bestehenden Verbindungen erneuern &Refresh &Auffrischen MIDI JACK-MIDI ALSA ALSA-MIDI Warning Warnung The preset aliases have been changed: "%1" Do you want to save the changes? Die Alternativbezeichnungen für Voreinstellungen wurden verändert: "%1" Änderungen speichern? qjackctlConnectorView &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Trennen Disconnect &All &Alle trennen Alt+A Disconect All Alt+A &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlMainForm QjackCtl QjackCtl Quit processing and exit Signalverarbeitung und Programm beenden &Quit &Beenden Start the JACK server JACK-Server starten &Start &Start Stop the JACK server JACK-Server beenden S&top S&topp St&atus St&atus... Show information about this application Informationen über diese Anwendung anzeigen Ab&out... &Über... Set&up... &Einstellungen... Show settings and options dialog Dialogfenster für Einstellungen und Optionen anzeigen &Messages &Meldungen... Show/hide the patchbay editor window Steckfeldfenster anzeigen/verbergen &Patchbay Ste&ckfeld... Show/hide the actual connections patchbay window Zeige/Verberge das Steckfeldfenster mit den vorhandenen Verbindungen &Connect &Verbinden... JACK server state Status des JACK-Servers JACK server mode Modus des JACK-Servers DSP Load DSP-Last Sample rate Abtastrate XRUN Count (notifications) XRUN Anzahl (Benachrichtigungen) Time display Zeitanzeige Transport state Transportstatus Transport BPM Transport BPM Transport time Transport Zeit Show/hide the session management window Fenster für Sitzungsmanagement anzeigen/verbergen Show/hide the messages log/status window Meldungsfenster anzeigen/verbergen Backward transport Transport rückwärts &Backward &Rückwärts Forward transport Transport vorwärts &Forward &Vorwärts Rewind transport Transport zurückspulen &Rewind &Zurückspulen Stop transport rolling Transportvorgang anhalten Pa&use Pa&usieren Start transport rolling Transportvorgang starten &Play Abs&pielen Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ALSA Sequencer konnte nicht als Client geöffnet werden. Das ALSA-MIDI-Steckfeld wird nicht verfügbar sein. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Dienst ist verfügbar (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-Bus: Dienst ist nicht verfügbar (%1 aka jackdbus). Information Information Don't show this message again Diese Meldung nicht mehr anzeigen Warning Warnung JACK is currently running. Do you want to terminate the JACK audio server? Der JACK-Server läuft noch. Wollen Sie diesen beenden? successfully erfolgreich with exit status=%1 mit Rückgabewert = %1 Could not start JACK. Maybe JACK audio server is already started. Konnte JACK nicht starten. Möglicherweise läuft der JACK-Server schon. Could not load preset "%1". Retrying with default. Konnte Einstellung "%1" nicht laden. Versuche erneut mit Voreinstellung. Could not load default preset. Sorry. Konnte leider die Voreinstellung nicht laden. Startup script... Start-Skript... Startup script terminated Start-Skript beendet D-BUS: JACK server is starting... D-BUS: JACK-Server startet... D-BUS: JACK server could not be started. Sorry D-BUS: JACK-Server konnte nicht gestartet werden. Tut mir Leid JACK is starting... JACK startet... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Einige Client-Audio-Anwendungen sind noch aktiv und verbunden. Wollen Sie den JACK-Server anhalten? JACK is stopping... JACK fährt herunter... Shutdown script... Herunterfahr-Skript... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Programm läuft weiter sichtbar als Symbol im Benachrichtigungsfeld. Zum Beenden des Programms, wählen Sie bitte "Beenden" im Kontextmenü des Benachrichtigungsfeldsymbols. Don't ask this again Nicht nochmal nachfragen Shutdown script terminated Herunterfahr-Skript beendet D-BUS: JACK server is stopping... D-BUS: JACK-Server fährt herunter... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACK-Server konnte nicht angehalten werden. Tut mir Leid Post-shutdown script... Nach-Herunterfahr-Skript... Post-shutdown script terminated Nach-Herunterfahr-Skript beendet JACK was started with PID=%1. JACK wurde mit PID = %1 gestartet. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK-Server wurde gestartet (%1 aka jackdbus). JACK is being forced... JACK wird gezwungen... JACK was stopped JACK wurde angehalten D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK-Server wurde angehalten (%1 aka jackdbus). Error Fehler Transport BBT (bar.beat.ticks) Transport BBT (bar.beat.ticks) Transport time code Transport Timecode Elapsed time since last reset Seit dem letzten Zurücksetzen vergangene Zeit Elapsed time since last XRUN Seit dem letzten XRUN vergangene Zeit Patchbay reset. Steckfeld zurückgesetzt. Could not load active patchbay definition. "%1" Disabled. Konnte aktive Steckfelddefinition nicht laden. Patchbay activated. Steckfeld aktiviert. Patchbay deactivated. Steckfeld deaktiviert. Statistics reset. Statistik zurückgesetzt. msec ms JACK connection graph change. Schaubild der JACK-Verbindungen geändert. XRUN callback (%1). Buffer size change (%1). Puffergröße geändert (%1). Shutdown notification. Benachrichtigung zum Herunterfahren. Could not start JACK. Sorry. Konnte JACK nicht starten. JACK has crashed. JACK ist abgestürzt. JACK timed out. JACK Zeitüberschreitung. JACK write error. JACK Schreibfehler. JACK read error. JACK Lesefehler. Unknown JACK error (%d). Unbekannter JACK-Fehler (%d). JACK property change. JACK-Eigenschaft geändert. ALSA connection graph change. Schaubild der ALSA-Verbindungen geändert. JACK active patchbay scan JACK aktive Steckfeldsuche ALSA active patchbay scan ALSA aktive Steckfeldsuche JACK connection change. JACK-Verbindung geändert. ALSA connection change. ALSA-Verbindung geändert. checked überprüft connected verbunden disconnected getrennt failed fehlgeschlagen A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Zur Zeit ist eine Steckfeldkonfiguration aktiv, die wahrscheinlich diese Verbindung rückgängig macht: %1 -> %2 Wollen Sie diese Steckfeldverbindung entfernen? Overall operation failed. Gesamtbetrieb schlug fehl. Invalid or unsupported option. Ungültige oder nicht unterstützte Option. Client name not unique. Name des Clients nicht einzigartig. Server is started. Server ist gestartet. Unable to connect to server. Verbindungsaufnahme zum Server gescheitert. Server communication error. Server-Kommunikationsfehler. Client does not exist. Client existiert nicht. Unable to load internal client. Interner Client konnte nicht geladen werden. Unable to initialize client. Client konnte nicht initialisiert werden. Unable to access shared memory. Kein Zugriff auf Shared Memory möglich. Client protocol version mismatch. Unpassende Client-Protokollversion Could not connect to JACK server as client. - %1 Please check the messages window for more info. Keine Verbindungsaufnahme als Client zum JACK-Server möglich. - %1 Bitte sehen Sie im Meldungsfenster nach weiteren Informationen. Server configuration saved to "%1". Serverkonfiguration nach "%1" gespeichert. Client activated. Client aktiviert Post-startup script... Nach-Start-Skript... Post-startup script terminated Nach-Start-Skript beendet Command line argument... Kommandozeilenargument... Command line argument started Kommandozeilenargument gestartet Client deactivated. Client deaktiviert. Transport rewind. Transport zurückspulen. Transport backward. Transport zurück. Starting Startet Transport start. Transport starten. Stopping Stoppe Transport stop. Transport anhalten. Transport forward. Transport vorwärts. Stopped Steht %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 Frames Yes Ja No Nein RT RT Rolling Rollt Looping Schleifen ausführend %1 msec %1 ms XRUN callback (%1 skipped). XRUN callback (%1 übersprungen). Started Läuft Active Aktiv Activating Aktivierend Inactive Inaktiv &Hide &Verbergen Mi&nimize Mi&nimieren S&how An&zeigen Rest&ore Neu&laden &Stop &Stopp &Reset &Zurücksetzen &Presets &Voreinstellungen &Versioning &Versionierung Re&fresh Au&ffrischen S&ession S&itzung... &Load... &Laden... &Save... &Speichern... Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... &Connections &Verbindungen Patch&bay Steck&feld &Transport &Transport Server settings will be only effective after restarting the JACK audio server. Die Server-Einstellungen werden erst nach einem Neustart des JACK-Servers wirksam. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Einige Einstellungen werden erst nach einem Neustart des Programms wirksam. qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Meldungen/Status - JACK Audio Connection Kit &Messages &Meldungen Messages log Meldungsprotokoll Messages output log Meldungsausgabeprotokoll &Status &Status Status information Statusinformationen Statistics since last server startup Statistik seit dem letzten Serverstart Description Beschreibung Value Wert Reset XRUN statistic values Daten der XRUN-Statistik zurücksetzen Re&set &Zurücksetzen Refresh XRUN statistic values Daten der XRUN-Statistik erneuern &Refresh &Auffrischen Server name Servername Server state Serverstatus DSP Load DSP-Last Sample Rate Abtastrate Buffer Size Puffergröße Realtime Mode Echtzeit-Modus Transport state Transportstatus Transport Timecode Transport Timecode Transport BBT Transport BBT Transport BPM Transport BPM XRUN count since last server startup Anzahl XRUNs seit dem letzten Serverstart XRUN last time detected Zeitpunkt der letzten XRUN-Beobachtung XRUN last Letzter XRUN XRUN maximum XRUN Maximum XRUN minimum XRUN Minimum XRUN average XRUN Durchschnitt XRUN total XRUN Summe Maximum scheduling delay Maximale Zeitverzögerung Time of last reset Zeitpunkt der letzten Zurücksetzung Logging stopped --- %1 --- Protokollierung angehalten --- %1 --- Logging started --- %1 --- Protokollierung gestartet --- %1 --- qjackctlPatchbay Warning Warnung This will disconnect all sockets. Are you sure? Diese Aktion wird alle Anschlüsse trennen. Sind Sie sicher? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Steckfeld - JACK Audio Connection Kit Move currently selected output socket down one position Ausgewählten Ausgangsanschlus eine Position nach unten verschieben Down Ab Create a new output socket Einen neuen Ausgangsanschlus anlegen Add... Hinzufügen... Edit currently selected input socket properties Eigenschaften des gewählten Eingangsanschlusses bearbeiten Edit... Bearbeiten... Move currently selected output socket up one position Ausgewählten Ausgangsanschluss eine Position nach oben verschieben Up Auf Remove currently selected output socket Ausgewählten Ausgangsanschluss entfernen Remove Entfernen Duplicate (copy) currently selected output socket Dupliziere den gewählten Ausgangsanschluss Copy... Kopieren... Remove currently selected input socket Ausgewählten Eingangsanschluss entfernen Duplicate (copy) currently selected input socket Dupliziere den gewählten Eingangsanschluss Create a new input socket Einen neuen Eingangsanschluss anlegen Edit currently selected output socket properties Eigenschaften des gewählten Ausgangsanschlusses bearbeiten Connect currently selected sockets Gewählte Anschlüsse miteinander verbinden &Connect &Verbinden Disconnect currently selected sockets Verbindung zwischen den gewählten Anschlüssen trennen &Disconnect &Trennen Disconnect all currently connected sockets Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all items Alle Einträge aufklappen E&xpand All Alle auf&klappen Refresh current patchbay view Steckfeldansicht auffrischen &Refresh Auf&frischen Create a new patchbay profile Neues Steckfeldprofil anlegen &New &Neu Load patchbay profile Steckfeldprofil laden &Load... &Laden... Save current patchbay profile Aktuelles Steckfeldprofil speichern &Save... &Speichern... Current (recent) patchbay profile(s) Aktuelle (zuletzt verwendete) Steckfeldprofile Toggle activation of current patchbay profile Aktivierung des aktuellen Steckfeldprofils umschalten Acti&vate A&ktivieren Warning Warnung The patchbay definition has been changed: "%1" Do you want to save the changes? Die Steckfelddefinition wurde verändert: "%1" Wollen Sie die Änderungen speichern? %1 [modified] %1 [verändert] Untitled%1 Unbenannt%1 Error Fehler Could not load patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht laden: "%1" Could not save patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht speichern: "%1" New Patchbay definition Neue Steckfelddefinition Create patchbay definition as a snapshot of all actual client connections? Steckfelddefinitionsdatei als Schnappschuss der aktuell vorhandenen Verbindungen erstellen? Load Patchbay Definition Steckfelddefinition laden Patchbay Definition files Steckfelddefinitionsdateien Save Patchbay Definition Speichere Steckfelddefinition active aktiv qjackctlPatchbayView Add... Hinzufügen... Edit... Bearbeiten... Copy... Kopieren... Remove Entfernen Exclusive Exklusiv Forward Weiterleiten (None) (Keine) Move Up Nach oben Move Down Nach unten &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconect All Alt+A &Refresh Auf&frischen Alt+R Refresh Alt+F qjackctlSessionForm Session - JACK Audio Connection Kit Sitzung - JACK Audio Connection Kit Load session Sitzung laden &Load... &Laden... Recent session Letzte Sitzung &Recent &Zuletzt Save session Sitzung speichern Save session versioning Sitzungsversionierung speichern &Versioning &Versionierung Re&fresh Au&ffrischen Infra-clients / commands Infra-client Infra-command Add infra-client &Add &Hinzufügen Edit infra-client &Edit &Bearbeiten Remove infra-client Re&move En&tfernen &Save... &Speichern... Update session Sitzung aktualisieren Session clients / connections Client / Ports Client/Eingänge UUID UUID Command Kommando &Save &Speichern Load Session Sitzung laden Session directory Sitzungsverzeichnis Save Session Sitzung speichern and Quit und beenden Template Vorlage &Clear &Löschen Warning Warnung A session could not be found in this folder: "%1" Eine Sitzung konnte in diesem Verzeichnis nicht gefunden werden: "%1" %1: loading session... %1: lade Sitzung... %1: load session %2. %1: lade Sitzung %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Es existiert bereits eine Sitzung in diesem Verzeichnis: "%1" Soll diese Sitzung überschrieben werden? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Dieses Verzeichnis existiert bereits und ist nicht leer: "%1" Soll das existierende Verzeichnis überschrieben werden? %1: saving session... %1: speichere Sitzung... %1: save session %2. %1: speichere Sitzung %2. New Client Neuer Client Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Einstellungen - JACK Audio Connection Kit Settings Einstellungen Preset &Name: &Benennung: Settings preset name Benennung der Einstellung (default) Save settings as current preset name Einstellungen mit aktueller Benennung speichern &Save &Speichern Delete current settings preset Aktuelle Einstellung löschen &Delete &Löschen jackd jackd jackdmp jackdmp jackstart jackstart Driv&er: Trei&ber: The audio backend driver interface to use Zu nutzender Audio-Schnittstellentreiber dummy dummy sun sun oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob firewire firewire Parameters Parameter MIDI Driv&er: MIDI-&Treiber: The ALSA MIDI backend driver to use Zu nutzender ALSA-MIDI-Treiber none keiner raw raw seq seq Time in seconds that client is delayed after server startup Zeitverzögerung für den Client nach Start des Servers Latency: Latenz: Output latency in milliseconds, calculated based on the period, rate and buffer settings Ausgangslatenz in Millisekunden. Berechnung basiert auf Perioden-, Abtastraten- und Puffereinstellungen Use realtime scheduling Echtzeitverarbeitung nutzen &Realtime Echt&zeit Do not attempt to lock memory, even if in realtime mode Keinen Arbeitsspeicher sperren, auch nicht im Echtzeitmodus No Memory Loc&k Spei&cher nicht sperren Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Arbeitsspeicher von gängigen Bibliotheken (GTK+, Qt, FLTK, Wine) entsperren &Unlock Memory S&peicher entsperren Ignore xruns reported by the backend driver Xruns des Schnittstellentreibers ignorieren So&ft Mode So&ft-Modus Provide output monitor ports Anschlüsse zur Ausgangsüberwachung anbieten &Monitor &Überwachung Force 16bit mode instead of failing over 32bit (default) 16-Bit-Modus erzwingen statt versuchsweiser Aktivierung des 32-Bit-Modus (voreingestellt) Force &16bit &16 Bit erzwingen Enable hardware monitoring of capture ports Hardware-Überwachung der Capture-Anschlüsse aktivieren H/W M&onitor H/W Über&wachung Enable hardware metering on cards that support it Hardware-Messung bei Karten aktivieren, die diese unterstützen H/&W Meter H/W &Messung Ignore hardware period/buffer size Ignoriere Periode/Puffergröße der Hardware &Ignore H/W &Ignoriere H/W Whether to give verbose output on messages Ausführliche Meldungen anzeigen &Verbose messages Aus&führliche Meldungen &Output Device: A&usgabegerät: &Interface: S&chnittstelle: Maximum input audio hardware channels to allocate Maximum belegbarer Audio-Hardware-Eingänge &Audio: &Audio: Dit&her: External output latency (frames) Externe Ausgangslatenz (Frames) &Input Device: Eingangsger&ät: Provide either audio capture, playback or both Entweder Audio-Aufnahme, -Wiedergabe oder beides anbieten Duplex Duplex Capture Only Nur Aufnahme Playback Only Nur Wiedergabe The PCM device name to use Name des genutzten PCM-Gerätes hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Alternativer Geräteeingang für Aufnahme Maximum output audio hardware channels to allocate Maximum der belegbaren Audio-Hardware-Ausgänge Alternate output device for playback Alternatives Ausgabegerät für Wiedergabe External input latency (frames) Externe Eingangslatenz (Frames) Set dither mode Dither-Modus festlegen None Keiner Rectangular Rechteck Shaped Hüllkurve Triangular Dreieck Number of periods in the hardware buffer Anzahl der Perioden im Hardware-Puffer Server &Prefix: Server &Präfix: Server path (command line prefix) Serverpfad (Kommandozeilen Präfix) Priorit&y: Priorit&ät: &Frames/Period: &Frames/Periode: Frames per period between process() calls Frames pro Periode zwischen process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: Ma&ximaler Port: &Channels: &Kanäle: 21333 21333 Sample rate in frames per second Abtastrate in Frames pro Sekunde 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Priorität für die Echtzeitsteuerung &Word Length: Wortl&änge: Periods/&Buffer: Per&ioden/Puffer: Word length Wortlänge Maximum number of ports the JACK server can manage Maximum an Anschlüssen, die der JACK-Server verarbeiten kann &Wait (usec): &Warten (µs) Sample &Rate: Abtast&rate: Maximum number of audio channels to allocate Maximale Anzahl der belegbaren Audiokanäle festlegen &Timeout (msec): &Timeout (ms): Set client timeout limit in milliseconds Timeout-Limitierung für Clients festlegen; Angabe in Millisekunden 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 &Channels I/O: &Kanäle I/O: &Latency I/O: &Latenz I/O: Server Suffi&x: Server Suffi&x: Start De&lay: Startver&zögerung: secs s 0 msecs 0 ms Advanced Options Optionen Scripting Skript-Steuerung Whether to execute a custom shell script before starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Start des JACK-Servers ausgeführt werden soll Execute script on Start&up: Skript &beim Start ausführen: Whether to execute a custom shell script after starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Start des JACK-Servers ausgeführt werden soll. Execute script after &Startup: Skript &nach Start ausführen: Whether to execute a custom shell script before shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Herunterfahren des JACK-Servers ausgeführt werden soll Execute script on Shut&down: Skript beim &Herunterfahren ausführen: Command line to be executed before starting up the JACK audio server Vor dem Starten des JACK-Servers ausgeführte Kommandozeile Scripting argument meta-symbols Meta-Symbole der Skriptargumente Browse for script to be executed before starting up the JACK audio server Skript auswählen, das vor dem Starten des JACK-Servers ausgeführt wird ... ... Command line to be executed after starting up the JACK audio server Nach dem Starten des JACK-Servers ausgeführte Kommandozeile Browse for script to be executed after starting up the JACK audio server Skript auswählen, das nach dem Starten des JACK-Servers ausgeführt wird Browse for script to be executed before shutting down the JACK audio server Skript auswählen, das vor dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed before shutting down the JACK audio server Vor dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Whether to execute a custom shell script after shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Herunterfahren des JACK-Servers ausgeführt werden soll. Execute script after Shu&tdown: Skript nach dem Herunter&fahren ausführen: Browse for script to be executed after shutting down the JACK audio server Skript auswählen, das nach dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed after shutting down the JACK audio server Nach dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Statistics Statistik Whether to capture standard output (stdout/stderr) into messages window Standardausgabe (stdout/stderr) in Meldungsfenster umleiten &Capture standard output Standardausgabe &umleiten &XRUN detection regex: Regular expression used to detect XRUNs on server output messages Regulärer Ausdruck zur Erkennung von XRUNs in vom Server gesendeten Meldungen xrun of at least ([0-9|\.]+) msecs xrun mit mindestens ([0-9|\.]+) ms Connections Verbindungen Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 10 Patchbay definition file to be activated as connection persistence profile Steckfelddefinitionsdatei als beständiges Verbindungsprofil aktivieren Browse for a patchbay definition file to be activated Eine Steckfelddefinitionsdatei zum aktivieren wählen Whether to activate a patchbay definition for connection persistence profile. Ein beständiges Verbindungsprofil für das Steckfeld aktivieren. Activate &Patchbay persistence: Steck&feldkonfiguration hat Bestand: Logging Protokollierung Messages log file Protokolldatei für Meldungen Browse for the messages log file location Speicherort für Protokolldatei wählen Whether to activate a messages logging to file. Protokollierung der Meldungen in eine Datei festlegen. Please do not touch these settings unless you know what you are doing. Extra driver options (command line suffix) Sonderoptionen für Treiber (Kommandozeilen Präfix) Whether to reset all connections when a patchbay definition is activated. Alle Verbindungen zurücksetzen, wenn eine Steckfeldkonfiguration aktiviert wird &Reset all connections on patchbay activation Alle &Verbindungen bei Steckfaktivierung zurücksetzen Whether to issue a warning on active patchbay port disconnections. Warnung anzeigen, wenn eine aktive Verbindung getrennt wird &Warn on active patchbay disconnections Beim &Trennen aktiver Verbindungen warnen &Messages log file: &Protokolldatei: Display Anzeige Time Display Zeitanzeige Time F&ormat: Zeit&format: The general time format on display Allgemeines Zeitformat der Anzeige hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd Transport &Time Code Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Seit dem letzten &Zurücksetzen verstrichene Zeit Elapsed time since last &XRUN Seit dem letzten &XRUN verstrichene Zeit Sample front panel normal display font Beispielhafte Darstellung der normalen Anzeige Sample big time display font Beispielhafte Darstellung der großen Anzeige Big Time display: Große Zeitanzeige: Select font for front panel normal display Schriftart für normale Anzeige wählen &Font... &Schriftart... Select font for big time display Schriftart für große Zeitanzeige wählen Normal display: Normale Anzeige: Whether to enable a shiny glass light effect on the main display Anzeige mit Schimmereffekt darstellen &Display shiny glass light effect Schi&mmereffekt darstellen Whether to enable blinking (flashing) of the server mode (RT) indicator Realtime-Indikator (RT) für Servermodus blinkend darstellen Blin&k server mode indicator Ser&vermodus blinkend darstellen Messages Window Meldungsfenster Sample messages text font display Beispielhafte Darstellung des Textes im Meldungsfenster Select font for the messages text display Schriftart für Text im Meldungsfenster wählen Whether to keep a maximum number of lines in the messages window Maximale Anzahl der im Meldungsfenster angezeigten Zeilen festlegen &Messages limit: &Meldungsmaximum: The maximum number of message lines to keep in view Maximale Anzahl der Nachrichten im Meldungsfenster 100 100 250 250 2500 2500 Connections Window Verbindungsübersicht Sample connections view font Beispielhafte Darstellung der Schrift in der Verbindungsübersicht Select font for the connections view Schriftart für Verbindungsübersicht wählen &Icon size: &Symbolgröße: The icon size for each item of the connections view Größe der einzelnen Symbole in der Verbindungsübersicht 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Direktes Bearbeiten der Client/Anschluss-Alternativbezeichnung (Alias) erlauben Ena&ble client/port aliases editing (rename) Bearbeiten von &Deckbezeichnungen für Client/Anschlüsse Whether to enable client/port name aliases on the connections window Verwendung von Deckbezeichnungen (Alias) für Anschlüsse in der Verbindungsübersicht erlauben E&nable client/port aliases Dec&kbezeichnungen (Alias) für Client/Anschlüsse Whether to draw connection lines as cubic Bezier curves Festlegen, ob Verbindungslinien als Bezier-Kurven gezeichnet werden sollen Draw connection and patchbay lines as Be&zier curves Verbindungslinien als Be&zier-Kurven zeichen Misc Verschiedenes Other Weiteres Whether to start JACK audio server immediately on application startup JACK-Server unmittelbar bei Anwendungsstart starten &Start JACK audio server on application startup JACK-&Server bei Anwendungsstart starten Whether to ask for confirmation on application exit Vor dem Beenden des JACK-Servers nachfragen JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) &Confirm application close Beenden der An&wendung bestätigen Whether to keep all child windows on top of the main window Alle Kindfenster oberhalb des Hauptfensters halten &Keep child windows always on top &Kindfenster immer oben belassen Whether to enable the system tray icon Anwendungssymbol im Benachrichtigungsfeld anzeigen &Enable system tray icon S&ymbol im Benachrichtigungsfeld anzeigen Whether to start minimized to system tray Anwendung minimiert als Symbol im Benachrichtigungsfeld starten Start minimi&zed to system tray Minimiert im &Benachrichtigungsfeld starten Whether to save the JACK server command-line configuration into a local file (auto-start) Kommandozeilenkonfiguration zum Starten des JACK-Servers in einer lokalen Datei speichern (auto-start) S&ave JACK audio server configuration to: Konfi&guration für JACK-Server speichern unter: The server configuration local file name (auto-start) Name der lokal gespeicherten Serverkonfigurationsdatei (auto-start) .jackdrc .jackdrc Whether to exit once all clients have closed (auto-start) Programm beenden, wenn alle Client-Verbindungen getrennt sind (auto-start) C&onfigure as temporary server Als temporären Ser&ver konfigurieren Whether to ask for confirmation on JACK audio server shutdown Das Herunterfahren des JACK-Servers per Nachfrage bestätigen Confirm server sh&utdown Herunter&fahren des Servers bestätigen Whether to enable ALSA Sequencer (MIDI) support on startup Unterstützung für den ALSA Sequencer (MIDI) beim Programmstart aktivieren E&nable ALSA Sequencer support Unterstützung für ALSA-Se&quencer bereitstellen Buttons Schaltflächen Whether to hide the left button group on the main window Linke Schaltflächengruppe im Hauptfenster verbergen Hide main window &Left buttons &Linke Schaltflächen des Hauptfensters verbergen Whether to hide the right button group on the main window Rechte Schaltflächengruppe im Hauptfenster verbergen Hide main window &Right buttons &Rechte Schaltflächen des Hauptfensters verbergen Whether to hide the transport button group on the main window Schaltflächen der Transportsteuerung im Hauptfenster verbergen Hide main window &Transport buttons Schaltflächen für &Transportsteuerung verbergen Whether to hide the text labels on the main window buttons Beschriftung der Schaltflächen im Hauptfenster verbergen Hide main window &button text labels Besch&riftung der Schaltflächen verbergen Warning Warnung Some settings have been changed: "%1" Do you want to save the changes? Einige Einstellungen wurden verändert: "%1" Wollen Sie diese speichern? Delete preset: "%1" Are you sure? Voreinstellung löschen: "%1" Sind Sie sicher? msec ms n/a n/a &Preset Name Benennung der &Voreinstellung &Server Name &Servername &Server Path &Serverpfad &Driver Trei&ber &Interface Sc&hnittstelle Sample &Rate Abtast&rate &Frames/Period &Frames/Periode Periods/&Buffer Perioden/&Puffer Startup Script Start-Skript Post-Startup Script Nach-Start-Skript Shutdown Script Herunterfahr-Skript Post-Shutdown Script Nach-Herunterfahr-Skript Active Patchbay Definition Aktive Steckfelddefinition Patchbay Definition files Steckfelddefinitionsdateien Messages Log Meldungsprotokoll Log files Protokolldateien Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verändert. Wollen Sie diese übernehmen? &JACK client/port aliases: Deckbezeichnungen bei &JACK-Anschlüssen: JACK client/port aliases display mode Anzeigemodus für die JACK-Client/Anschlussbenennung Default Voreinstellung First Erster Second Zweiter Whether to show system tray message on main window close Nachrichten des Benachrichtigungsfelds beim Schließen des Hauptfensters anzeigen Sho&w system tray message on close &Nachrichten des Benachrichtigungsfelds beim Beenden anzeigen Whether to stop JACK audio server on application exit JACK Audio-Server bei Programmbeendung anhalten S&top JACK audio server on application exit JACK Audio-&Server bei Programmbeendung anhalten Defaults Voreinstellungen &Base font size: &Basisschriftgröße: Base application font size (pt.) Generelle Schriftgröße (pt.) für die Anwendung festlegen 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface D-Bus-Schnittstelle aktivieren &Enable D-Bus interface D-Bus-S&chnittstelle aktivieren Number of microseconds to wait between engine processes (dummy) Wartezeit in Mikrosekunden zwischen Verarbeitungsprozessen (dummy) &Name: &Name: The JACK Audio Connection Kit sound server name Name des JACK Audio Connection Kit Soundservers netone Whether to restrict to one single application instance (X11) Festlegen, ob nur eine Anwendungsinstanz (X11) gestartet werden darf Single application &instance Nur eine Anwendungsinstan&z zulassen qjackctlSocketForm Socket - JACK Audio Connection Kit Anschluss - JACK Audio Connection Kit &Socket &Anschluss &Name (alias): &Name (Alias): Socket name (an alias for client name) Anschlussbenennung (Alias für Name des Clients) Client name (regular expression) Name des Clients (Regulärer Ausdruck) Add plug to socket plug list Füge Anschluss zur Liste hinzu Add P&lug &Anschluss hinzufügen &Plug: A&nschluss: Port name (regular expression) Anschlussbezeichnung (Regulärer Ausdruck) Socket plug list Anschlussliste Socket Plugs / Ports Socket-Anschlüsse Edit currently selected plug Ausgewählten Anschluss bearbeiten &Edit &Bearbeiten Remove currently selected plug from socket plug list Ausgewählten Anschluss von der Liste entfernen &Remove En&tfernen &Client: &Client: Move down currently selected plug in socket plug list Ausgewählten Anschluss in Liste nach unten schieben &Down A&b Move up current selected plug in socket plug list Ausgewählten Anschluss in Liste nach oben schieben &Up Au&f Enforce only one exclusive cable connection Erzwinge eine singuläre Kabelverbindung E&xclusive E&xklusiv &Forward: &Weiterleiten: Forward (clone) all connections from this socket Alle Verbindungen dieses Anschlusses weiterleiten (klonen) Type Typ Audio socket type (JACK) JACK-Audio-Anbindung &Audio JACK-&Audio MIDI socket type (JACK) JACK-MIDI-Anbindung &MIDI JACK-&MIDI MIDI socket type (ALSA) ALSA-MIDI-Anbindung AL&SA AL&SA-MIDI Plugs / Ports Anschlüsse Error Fehler A socket named "%1" already exists. Socket mit dem Namen "%1" existiert bereits. Warning Warnung Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verändert. Wollen Sie diese übernehmen? Add Plug Anschluss hinzufügen Edit Bearbeiten Remove Entfernen Move Up Auf Move Down Ab (None) (Keiner) qjackctlSocketList Output Ausgang Input Eingang Socket Anbindung <New> - %1 <Neu> - %1 Warning Warnung %1 about to be removed: "%2" Are you sure? %1 soll entfernt werden: "%2" Sind Sie sicher? %1 <Copy> - %2 %1 <Kopieren> - %2 qjackctlSocketListView Output Sockets / Plugs Ausgangsanschlüsse Input Sockets / Plugs Eingangsanschlüsse qjackctl-0.5.0/src/translations/PaxHeaders.4714/qjackctl_fr.ts0000644000000000000000000000012713215206021021123 xustar0029 mtime=1513425937.54776694 29 atime=1513425937.54676694 29 ctime=1513425937.54776694 qjackctl-0.5.0/src/translations/qjackctl_fr.ts0000644000175000001440000051045213215206021021760 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Détection… Please wait, PortAudio is probing audio hardware. Merci de patienter, PortAudio détecte le matériel audio. Warning Attention Audio hardware probing timed out. La détection du matériel audio a échoué. QObject (default) Start JACK audio server immediately Démarrer immédiatement le serveur audio JACK Show help about command line options Montrer l'aide à propos des options en ligne de commande Show version information Montrer les informations de version Option -p requires an argument (preset). L'option -p nécessite un argument (préréglage). Usage: %1 [options] [command-and-args] Utilisation : %1 [options] [commandes-et-args] Options: Options : Set active patchbay definition file Choisir le fichier de définition de baie de brassage actif Set default JACK audio server name Choisir le nom du serveur audio JACK par défaut Option -a requires an argument (path). L'option -a nécessite un argument (chemin). Option -n requires an argument (name). L'option -n nécessite un argument (nom). Set default settings preset name Régler le nom du préréglage des paramètres par défaut %1 (%2 frames) %1 (%2 échantillons) qjackctlAboutForm About QjackCtl À propos de QjackCtl About Qt À propos de Qt &Close &Fermer Version Version Using: JACK %1 Utilisation de : JACK %1 Debugging option enabled. Option de débogage activée. System tray disabled. Zone de notification système désactivée. Transport status control disabled. Contrôle du statut du déplacement désactivé. Realtime status disabled. Statut temps réel désactivé. XRUN delay status disabled. Statut du délai de désynchronisation (XRUN) désactivé. Maximum delay status disabled. Statut du délai maximal désactivé. JACK Session support disabled. Prise en charge de session JACK désactivée. ALSA/MIDI sequencer support disabled. Prise en charge du séquenceur ALSA/MIDI désactivée. Website Site web This program is free software; you can redistribute it and/or modify it Ce programme est libre; vous pouvez le redistribuer et/ou le modifier under the terms of the GNU General Public License version 2 or later. selon les termes de la Licence Publique Générale GNU version 2 ou ultérieure. JACK MIDI support disabled. Prise en charge de JACK MIDI désactivée. JACK Port aliases support disabled. Prise en charge des alias de port JACK désactivée. D-Bus interface support disabled. Prise en charge de l'interface D-Bus désactivée. qjackctlClientListView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconect All Alt+T Re&name Re&nommer Alt+N Rename Alt+N &Refresh &Rafraîchir Alt+R Refresh Alt+R Readable Clients / Output Ports Clients en lecture / Ports de sortie Writable Clients / Input Ports Clients en écriture / Ports d'entrée qjackctlConnect Warning Attention This will suspend sound processing from all client applications. Are you sure? Cela va suspendre le traitement du son de toutes les applications clientes. Êtes-vous certain ? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Connexions - Kit de Connexion Audio JACK Audio Audio &Connect &Connecter Connect currently selected ports Connecter les ports actuellement sélectionnés &Disconnect &Déconnecter Disconnect currently selected ports Déconnecter les ports actuellement sélectionnés Disconnect &All &Tout déconnecter Disconnect all currently connected ports Déconnecter tous les ports actuellement connectés Expand all client ports Afficher tous les ports clients E&xpand All &Afficher tout &Refresh &Rafraîchir Refresh current connections view Rafraîchir la vue actuelle des connexions MIDI MIDI Warning Attention ALSA ALSA The preset aliases have been changed: "%1" Do you want to save the changes? Les alias de préréglage ont été changés : « %1 » Voulez-vous enregistrer les changements ? qjackctlConnectorView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconect All Alt+T &Refresh &Rafraîchir Alt+R Refresh Alt+R qjackctlMainForm QjackCtl QjackCtl &Quit &Quitter Quit processing and exit Quitter le traitement et sortir &Start &Démarrer Start the JACK server Démarrer le serveur JACK S&top &Arrêter Stop the JACK server Arrêter le serveur JACK St&atus S&tatut Ab&out... À pr&opos… Show information about this application Montrer des informations à propos de cette application Show settings and options dialog Montrer la fenêtre d'options et de paramètres &Messages &Messages &Patchbay &Baie de brassage Show/hide the patchbay editor window Montrer/cacher la fenêtre de l'éditeur de baie de brassage &Connect &Connecter Set&up... R&églages… Show/hide the actual connections patchbay window Montrer/cacher la fenêtre des connexions actuelles de la baie de brassage JACK server state État du serveur JACK JACK server mode Mode du serveur JACK Sample rate Fréquence d'échantillonnage Time display Horloge Transport state État du déplacement Transport BPM BPM du déplacement Transport time Horaire du déplacement Show/hide the session management window Montrer/cacher la fenêtre de gestion de session Show/hide the messages log/status window Montrer/cacher la fenêtre de journal/statut &Backward A&rrière Backward transport Déplacer en arrière &Forward A&vant Forward transport Déplacer en avant &Rewind Remb&obiner Rewind transport Rembobiner Pa&use Pa&use Stop transport rolling Arrêter le déplacement &Play &Lecture Start transport rolling Démarrer le déplacement Warning Attention successfully avec succès with exit status=%1 avec statut de sortie=%1 Could not load preset "%1". Retrying with default. Impossible de charger le préréglage « %1 ». Nouvel essai avec celui par défaut. Could not load default preset. Sorry. Impossible de charger le préréglage par défaut. Désolé. Startup script... Script de démarrage... Startup script terminated Script de démarrage terminé JACK is starting... JACK démarre... Could not start JACK. Sorry. Impossible de démarrer JACK. Désolé. JACK is stopping... JACK s'arrête... Shutdown script... Script d'extinction... Don't ask this again Ne pas redemander Shutdown script terminated Script d'extinction terminé Post-shutdown script... Script post-extinction... Post-shutdown script terminated Script post-extinction terminé JACK was stopped JACK a été arrêté Error Erreur Transport time code Code temporel (Timecode) du déplacement Elapsed time since last reset Temps écoulé depuis la dernière réinitialisation Elapsed time since last XRUN Temps écoulé depuis la dernière désynchronisation (XRUN) Patchbay activated. Baie de brassage activée. Patchbay deactivated. Baie de brassage désactivée. Statistics reset. Réinitialisation des statistiques. msec ms XRUN callback (%1). Récupération désynchronisation (XRUN) (%1). Buffer size change (%1). Changement de la taille du tampon (%1). Shutdown notification. Notification d'extinction. checked vérifié connected connecté disconnected déconnecté failed échoué Server configuration saved to "%1". Configuration du serveur enregistrée dans « %1 ». Client activated. Client activé. Post-startup script... Script post-démarrage... Post-startup script terminated Script post-démarrage terminé Command line argument... Argument de ligne de commande... Command line argument started Argument de ligne de commande démarré Client deactivated. Client désactivé. Transport rewind. Déplacement en rembobinage. Transport backward. Déplacement en marche arrière. Starting Démarre Transport start. Déplacement démarré. Stopping S'arrête Transport stop. Déplacement arrêté. Transport forward. Déplacement en marche avant. Stopped Arrêté Yes Oui No Non RT TR Rolling Défile Looping Boucle XRUN callback (%1 skipped). Récupération de désynchronisation (XRUN) (%1 sauté). Started Démarré Active Actif Activating Activation Inactive Inactif &Hide Cac&her Mi&nimize Mi&nimiser S&how M&ontrer Rest&ore R&estaurer &Stop &Arrêter &Reset Ré&initialiser &Presets &Préréglages &Versioning Gestion de ré&visions Re&fresh Ra&fraîchir &Connections &Connexions Patch&bay &Baie de brassage &Transport Déplacemen&t Server settings will be only effective after restarting the JACK audio server. Les paramètres du serveur ne seront effectifs qu'après avoir redémarré le serveur audio JACK. Information Information Some settings will be only effective the next time you start this program. Certains paramètres ne seront effectifs qu'au prochain démarrage de ce programme. DSP Load Charge DSP XRUN Count (notifications) Décompte des désynchronisations (notifications XRUN) JACK connection graph change. Changement du graphique des connexions JACK. ALSA connection graph change. Changement du graphique des connexions ALSA. JACK connection change. Changement des connexions JACK. ALSA connection change. Changement des connexions ALSA. JACK is currently running. Do you want to terminate the JACK audio server? JACK fonctionne actuellement. Voulez-vous arrêter le serveur audio JACK ? D-BUS: Service is available (%1 aka jackdbus). DBUS : le service est disponible (%1 soit jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : le service n'est pas disponible (%1 soit jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Le programme continuera de s'exécuter dans la zone de notification système. Pour terminer le programme, merci de choisir « Quitter » dans le menu contextuel de l'icône de la zone de notification système. Don't show this message again Ne pas montrer ce message à nouveau Could not start JACK. Maybe JACK audio server is already started. Impossible de démarrer JACK. Peut-être que le serveur audio JACK est déjà démarré. D-BUS: JACK server is starting... DBUS : le serveur JACK démarre… D-BUS: JACK server could not be started. Sorry DBUS : impossible de démarrer le serveur JACK. Désolé Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Certaines applications audio clientes sont encore actives et connectées. Voulez-vous arrêter le serveur audio JACK ? D-BUS: JACK server is stopping... DBUS : le serveur JACK s'arrête… D-BUS: JACK server could not be stopped. Sorry DBUS : impossible d'arrêter le serveur JACK. Désolé JACK was started with PID=%1. JACK a été démarré avec le PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : le serveur JACK a été démarré (%1 soit jackdbus). JACK is being forced... JACK est forcé… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : le serveur JACK a été arrêté (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Transport MTB (mesure temps battement) Patchbay reset. Réinitialisation de la baie de brassage. Could not load active patchbay definition. "%1" Disabled. Impossible de charger la définition de baie de brassage active. "%1" Désactivé. JACK has crashed. JACK a planté. JACK timed out. JACK n'a pas répondu à temps. JACK write error. Erreur d'écriture JACK. JACK read error. Erreur de lecture JACK. Unknown JACK error (%d). Erreur JACK inconnue (%d). JACK property change. Changement d'une propriété de JACK. Overall operation failed. L'opération a échoué. Invalid or unsupported option. Option invalide ou non prise en charge. Client name not unique. Nom de client non unique. Server is started. Le serveur est démarré. Unable to connect to server. Incapable de se connecter au serveur. Server communication error. Erreur de communication serveur. Client does not exist. Le client n'existe pas. Unable to load internal client. Incapable de charger le client interne. Unable to initialize client. Incapable d'initialiser le client. Unable to access shared memory. Incapable d'accéder à la mémoire partagée. Client protocol version mismatch. Mauvaise version du protocole client. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Impossible de connecter le serveur JACK comme client. - %1 Veuillez consulter la fenêtre des messages pour plus d'informations. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 échantillons %1 msec %1 ms S&ession S&ession &Load... &Charger… &Save... &Enregistrer… Save and &Quit... Enregistrer et &Quitter… Save &Template... Enregistrer &modèle… D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Impossible d'ouvrir le sequenceur ALSA comme client. La baie de brassage ALSA MIDI ne sera pas disponible. JACK active patchbay scan Balayage de la baie de brassage JACK active ALSA active patchbay scan Balayage de la baie de brassage ALSA active A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Une définition de baie de brassage est actuellement active, il est probable que cela refasse cette connexion : %1 -> %2 Voulez-vous enlever la connexion de la baie de brassage ? qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Messages / Statut - Kit de Connexion Audio JACK &Messages &Messages Messages log Journal des messages Messages output log Journal des messages de sortie &Status &Statut Status information Information de statut Statistics since last server startup Statistiques depuis le dernier démarrage du serveur Description Description Value Valeur Reset XRUN statistic values Réinitialiser les valeurs statistiques des désynchronisations (XRUN) Re&set Réinitiali&ser Refresh XRUN statistic values Rafraîchir les valeurs statistiques des désynchronisations (XRUN) &Refresh &Rafraîchir Server name Nom du serveur Server state État du serveur DSP Load Charge DSP Sample Rate Fréquence d'échantillonnage Buffer Size Taille du tampon Realtime Mode Mode temps réel Transport state État du déplacement Transport Timecode Code temporel (Timecode) du déplacement Transport BBT MTB du déplacement Transport BPM BPM du déplacement XRUN count since last server startup Décompte des désynchronisations (XRUN) depuis le dernier démarrage du serveur XRUN last time detected Horaire de la dernière désynchronisation (XRUN) détectée XRUN last Dernière désynchronisation (XRUN) XRUN maximum Nombre maximal de désynchronisation (XRUN) XRUN minimum Nombre minimal de désynchronisation (XRUN) XRUN average Moyenne de désynchronisation (XRUN) XRUN total Nombre total de désynchronisation (XRUN) Maximum scheduling delay Délai d'ordonnancement maximal Time of last reset Temps depuis la dernière réinitialisation Logging stopped --- %1 --- Journalisation arrêtée --- %1 --- Logging started --- %1 --- Journalisation démarrée --- %1 --- qjackctlPatchbay Warning Attention This will disconnect all sockets. Are you sure? Cela va déconnecter toutes les prises. Êtes-vous certain ? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Baie de brassage - Kit de Connexion Audio JACK &New &Nouveau Create a new patchbay profile Créer un nouveau profil de baie de brassage &Load... &Charger… Load patchbay profile Charger un profil de baie de brassage &Save... &Enregistrer… Save current patchbay profile Enregistrer le profil actuel de la baie de brassage Expand all items Afficher tous les éléments E&xpand All &Afficher tout Current (recent) patchbay profile(s) Profil(s) actuel(s) (récent(s)) de la baie de brassage Acti&vate Acti&ver Toggle activation of current patchbay profile Basculer l'activation du profil actuel de baie de brassage &Connect &Connecter Connect currently selected sockets Connecter les prises actuellement sélectionnées &Disconnect &Déconnecter Disconnect currently selected sockets Déconnecter les prises actuellement sélectionnées Disconnect &All &Tout déconnecter Disconnect all currently connected sockets Déconnecter les prises actuellement connectées &Refresh &Rafraîchir Refresh current patchbay view Rafraîchir la vue actuelle de la baie de brassage Down Vers le bas Move currently selected output socket down one position Déplacer d'une position vers le bas la prise de sortie actuellement sélectionnée Add... Ajouter… Create a new output socket Créer une nouvelle prise de sortie Edit... Éditer… Edit currently selected input socket properties Éditer les propriétés de la prise d'entrée actuellement sélectionnée Up Vers le haut Move currently selected output socket up one position Déplacer d'une position vers le haut la prise de sortie actuellement sélectionnée Remove Enlever Remove currently selected output socket Enlever la prise de sortie actuellement sélectionnée Copy... Copier… Duplicate (copy) currently selected output socket Dupliquer (copier) la prise de sortie actuellement sélectionnée Remove currently selected input socket Enlever la prise d'entrée actuellement sélectionnée Duplicate (copy) currently selected input socket Dupliquer (copier) la prise d'entrée actuellement sélectionnée Create a new input socket Créer une nouvelle prise d'entrée Edit currently selected output socket properties Éditer les propriétés de la prise de sortie actuellement sélectionnée Warning Attention Error Erreur New Patchbay definition Nouvelle définition de baie de brassage Patchbay Definition files Fichiers de définition de baie de brassage Load Patchbay Definition Charger une définition de baie de brassage Save Patchbay Definition Enregistrer la définition de baie de brassage active actif The patchbay definition has been changed: "%1" Do you want to save the changes? La définition de baie de brassage a été changée : « %1 » Voulez-vous enregistrer les changements ? %1 [modified] %1 [modifié] Untitled%1 SansTitre%1 Could not load patchbay definition file: "%1" Impossible de charger le fichier de définition de baie de brassage : « %1 » Could not save patchbay definition file: "%1" Impossible d'enregistrer le fichier de définition de baie de brassage : « %1 » Create patchbay definition as a snapshot of all actual client connections? Prendre un cliché de toutes les connexions clientes actuelles pour créer une définition de baie de brassage ? qjackctlPatchbayView Add... Ajouter… Edit... Éditer… Copy... Copier… Remove Enlever Exclusive Exclusif (None) (Aucun) Forward Renvoi Move Up Vers le haut Move Down Vers le bas &Connect &Connecter Alt+C Connect Alt+C &Disconnect &Déconnecter Alt+D Disconnect Alt+D Disconnect &All &Tout déconnecter Alt+A Disconect All Alt+T &Refresh &Rafraîchir Alt+R Refresh Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit Session - Kit de Connexion Audio JACK Load session Charger session &Load... &Charger… Recent session Session récente &Recent &Récente Save session Enregistrer session Save session versioning Enregistrer la session avec gestion de révisions &Versioning Gestion de ré&visions Re&fresh Ra&fraîchir Session clients / connections Clients / connexions de la session Infra-clients / commands Commandes / clients-infra Infra-client Client-infra Infra-command Commande-infra Add infra-client Ajouter un client-infra &Add &Ajouter Edit infra-client Modifier un client-infra &Edit Modifi&er Remove infra-client Supprimer un client-infra Re&move Suppri&mer &Save... &Enregistrer… Update session Mettre à jour la session Client / Ports Clients / Ports UUID UUID Command Commande &Save &Enregistrer Load Session Charger session Session directory Répertoire de session Save Session Enregistrer session and Quit et quitter Template Modèle &Clear &Effacer Warning Attention A session could not be found in this folder: "%1" Impossible de trouver une session dans ce dossier : « %1 » %1: loading session... %1 : chargement de la session… %1: load session %2. %1 : charger session %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Il existe déjà une session dans ce dossier : « %1 » Êtes-vous certain de vouloir remlplacer la session existante ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Ce dossier existe déjà et n'est pas vide : « %1 » Êtes-vous certain de vouloir remplacer le dossier existant ? %1: saving session... %1 : enregistrement de la session… %1: save session %2. %1 : enregistrer session %2. New Client Nouveau client Save and &Quit... Enregistrer et &Quitter… Save &Template... Enregistrer &modèle… qjackctlSessionInfraClientItemEditor Infra-command Commande-infra qjackctlSetupForm Setup - JACK Audio Connection Kit Réglages - Kit de Connexion Audio JACK Settings Paramètres Preset &Name: &Nom du préréglage : (default) Settings preset name Nom du préréglage des paramètres &Save &Enregistrer Save settings as current preset name Enregistrer les paramètres sous le nom du préréglage actuel &Delete E&ffacer Delete current settings preset Effacer le préréglage des paramètres actuel jackstart jackstart jackd jackd Driv&er: Pilot&e : dummy factice oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob Parameters Paramètres Number of periods in the hardware buffer Nombre de périodes dans le tampon matériel Priorit&y: Pri&orité : &Frames/Period: &Échantillons/Période : 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Échantillons par période entre appels de process() Port Ma&ximum: Nombre de port ma&ximal : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second Fréquence d'échantillonage en échantillons par seconde Scheduler priority when running realtime Priorité de l'ordonnanceur quand fonctionne en temps réel &Word Length: &Résolution (bit) : Periods/&Buffer: Périodes/&Tampon : Word length Résolution Maximum number of ports the JACK server can manage Nombre maximal de ports que peut gérer le serveur JACK &Wait (usec): &Attente (en µs) : Sample &Rate: &Fréquence d'échantillonnage (Hz) : &Timeout (msec): &Décompte (en ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in milliseconds Régler le limite du décompte client en millisecondes &Realtime Temps &réel Use realtime scheduling Utiliser ordonnancement temps réel No Memory Loc&k P&as de verrouillage mémoire Do not attempt to lock memory, even if in realtime mode Ne pas essayer de verrouiller la mémoire même en mode temps-réel &Unlock Memory &Déverrouiller la mémoire Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Déverrouiller la mémoire des bibliothèques d'interface communes (GTK+, QT, FLTK, Wine) So&ft Mode Mode &logiciel Ignore xruns reported by the backend driver Ignorer les désynchronisations (XRUN) rapportées par le pilote principal &Monitor &Écoute de contrôle Provide output monitor ports Fournir des ports de sortie d'écoute de contrôle Force &16bit Forcer &16bit Force 16bit mode instead of failing over 32bit (default) Forcer mode 16bit au lieu d'échouer sur 32bit (par défaut) H/W M&onitor Éc&oute de contrôle matérielle Enable hardware monitoring of capture ports Activer l'écoute de contrôle matérielle des ports de capture H/&W Meter Mes&ure matérielle Enable hardware metering on cards that support it Activer la mesure matérielle sur les cartes qui la prennent en charge &Ignore H/W &Ignorer matériel Ignore hardware period/buffer size Ignore la taille des période/tampon matériels &Output Device: Périphérique de s&ortie : &Interface: &Interface : Maximum input audio hardware channels to allocate Nombre maximal de canaux d'entrée audio matériels à allouer &Audio: &Audio : Dit&her: Bruit de dispertion (dit&her) : External output latency (frames) Latence de sortie externe (en échantillons) &Input Device: Pér&iphérique d'entrée : Duplex Duplex Capture Only Capture seulement Playback Only Reproduction seulement Provide either audio capture, playback or both Fournir la capture audio, la reproduction audio ou les deux hw:0 hw:0 The PCM device name to use Nom du périphérique PCM à utiliser > > &Name: &Nom : The JACK Audio Connection Kit sound server name Le nom du serveur de son du Kit de Connexion Audio JACK /dev/dsp /dev/dsp Alternate input device for capture Périphérique d'entrée alternatif pour la capture Maximum output audio hardware channels to allocate Nombre maximal de canaux de sortie audio matériels à allouer Alternate output device for playback Périphérique de sortie alternatif pour la reproduction External input latency (frames) Latence d'entrée externe (en échantillons) None Aucun Rectangular Rectangulaire Shaped Sinusoïdal Triangular Triangulaire Set dither mode Régler le mode du bruit de dispersion (dither) Whether to give verbose output on messages Donner une sortie bavarde sur les messages Time in seconds that client is delayed after server startup Temps en secondes dont le client est retardé après le démarrage du serveur Latency: Latence : Output latency in milliseconds, calculated based on the period, rate and buffer settings Latence de sortie en millisecondes calculée à partir des réglages de la période, de la fréquence d'échantillonnage et du tampon Options Options Scripting Scripts Execute script on Start&up: Exéc&uter un script au démarrage : Whether to execute a custom shell script before starting up the JACK audio server. Exécuter un script de commande personnalisé avant de démarrer le serveur audio JACK. Execute script after &Startup: Exécuter un &script après le démarrage : Whether to execute a custom shell script after starting up the JACK audio server. Exécuter un script de commande personnalisé après avoir démarré le serveur audio JACK. Execute script on Shut&down: Exécuter un script à l'extinctio&n : Whether to execute a custom shell script before shuting down the JACK audio server. Exécuter un script de commande personnalisé avant d'éteindre le serveur audio JACK. Command line to be executed before starting up the JACK audio server Ligne de commande à exécuter avant de démarrer le serveur audio JACK Scripting argument meta-symbols Méta-symboles des arguments de script ... Browse for script to be executed before starting up the JACK audio server Pointer sur le script à exécuter avant de démarrer le serveur audio JACK Command line to be executed after starting up the JACK audio server Ligne de commande à exécuter après avoir démarré le serveur audio JACK Browse for script to be executed after starting up the JACK audio server Pointer sur le script à exécuter après avoir démarré le serveur audio JACK Browse for script to be executed before shutting down the JACK audio server Pointer sur le script à exécuter avant d'éteindre le serveur audio JACK Command line to be executed before shutting down the JACK audio server Ligne de commande à exécuter avant d'éteindre le serveur audio JACK Execute script after Shu&tdown: Exécuter un script après l'ex&tinction : Whether to execute a custom shell script after shuting down the JACK audio server. Exécuter un script de commande personnalisé après avoir éteint le serveur audio JACK. Browse for script to be executed after shutting down the JACK audio server Pointer sur le script à exécuter après avoir éteint le serveur audio JACK Command line to be executed after shutting down the JACK audio server Ligne de commande à exécuter après avoir éteint le serveur audio JACK Statistics Statistiques &Capture standard output &Capturer la sortie standard Whether to capture standard output (stdout/stderr) into messages window Capturer la sortie standard (stdout/stderr) dans la fenêtre de messages &XRUN detection regex: Regex de détection des désynchronisations (&XRUN) : xrun of at least ([0-9|\.]+) msecs désynchronisation (XRUN) d'au moins ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression régulière utilisée pour détecter les désynchronisations (XRUN) dans les messages de sortie du serveur Connections Connexions 10 10 Patchbay definition file to be activated as connection persistence profile Fichier de définition de baie de brassage à activer comme profil de persistance de connexion Browse for a patchbay definition file to be activated Pointer sur un fichier de définition de baie de brassage à activer Activate &Patchbay persistence: Activer la &persistance de baie de brassage : Whether to activate a patchbay definition for connection persistence profile. Activer une définition de baie de brassage pour le profil de persistance de connexion. Display Affichage Time Display Horloge Time F&ormat: F&ormat du temps : hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Format général du temps affiché Server Suffi&x: Suffi&xe Serveur : Transport &Time Code Code &temporel (Timecode) du déplacement Transport &BBT (bar:beat.ticks) MT&B (mesure:temps.battement) du déplacement Elapsed time since last &Reset Temps écoulé depuis la dernière &réinitialisation Elapsed time since last &XRUN Temps écoulé depuis la dernière désynchronisation (&XRUN) Sample front panel normal display font Aperçu de l'affichage normal Sample big time display font Aperçu de la grande horloge Big Time display: Grande horloge : &Font... &Police… Select font for front panel normal display Sélectionner la police pour l'affichage normal Select font for big time display Sélectionner la police pour la grande horloge Normal display: Affichage normal : &Display shiny glass light effect &Afficher un effet de vitre éclairée brillante Whether to enable a shiny glass light effect on the main display Activer un effet de vitre éclairée brillante sur l'affichage principal Messages Window Fenêtre de messages Sample messages text font display Aperçu de la police du texte des messages Select font for the messages text display Sélectionner la police pour le texte des messages &Messages limit: Limite des &messages : Whether to keep a maximum number of lines in the messages window Garder un nombre maximal de lignes dans la fenêtre de messages 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Nombre maximal de ligne de messages à garder visibles Connections Window Fenêtre de connexions Sample connections view font Aperçu de la police de la vue des connexions Select font for the connections view Sélectionner la police pour la vue des connexions &Icon size: Taille des &icônes : 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Taille de l'icône pour chaque élément de la vue des connexions Ena&ble client/port aliases editing (rename) Activer l'é&dition (renommage) des aliases de client/port Whether to enable in-place client/port name editing (rename) Activer l'édition (renommage) en place des aliases de client/port E&nable client/port aliases Activer les aliases de client/p&ort Whether to enable client/port name aliases on the connections window Activer les aliases de client/port dans la fenêtre de connexions Draw connection and patchbay lines as Be&zier curves Dessiner les lignes de connexion et de baie de brassage en courbes de Be&zier Whether to draw connection lines as cubic Bezier curves Dessiner les lignes de connexion et de baie de brassage en courbes de Bezier cubiques Misc Divers Other Autres &Start JACK audio server on application startup &Démarrer le serveur audio JACK au démarrage de l'application Whether to start JACK audio server immediately on application startup Démarrer le serveur audio JACK immédiatement au démarrage de l'application &Confirm application close &Confirmer la fermeture de l'application Whether to ask for confirmation on application exit Demander une confirmation lors de la sortie de l'application &Keep child windows always on top &Garder les fenêtres filles au premier plan Whether to keep all child windows on top of the main window Garder les fenêtres filles au dessus de la fenêtre principale &Enable system tray icon Activ&er l'icône de notification système Whether to enable the system tray icon Activer l'icône de notification système S&ave JACK audio server configuration to: &Enregistrer la configuration du serveur audio JACK dans : Whether to save the JACK server command-line configuration into a local file (auto-start) Enregistrer la configuration en ligne de commande du serveur JACK dans un fichier local (démarrage automatique) .jackdrc .jackdrc The server configuration local file name (auto-start) Nom du fichier local de configuration du serveur (démarrage automatique) C&onfigure as temporary server C&onfigurer comme serveur temporaire Whether to exit once all clients have closed (auto-start) Sortir dès que tous les clients ont fermé (démarrage automatique) Confirm server sh&utdown Confirmer l'e&xtinction du serveur Whether to ask for confirmation on JACK audio server shutdown Demander une confirmation à l'extinction du serveur audio JACK Buttons Boutons Hide main window &Left buttons Cacher les boutons de &gauche de la fenêtre principale Whether to hide the left button group on the main window Cacher le groupe de bouton de gauche sur la fenêtre principale Hide main window &Right buttons Cacher les boutons de &droite de la fenêtre principale Whether to hide the right button group on the main window Cacher le groupe de bouton de droite sur la fenêtre principale Hide main window &Transport buttons Cacher les boutons de &déplacement de la fenêtre principale Whether to hide the transport button group on the main window Cacher le groupe de bouton de déplacement sur la fenêtre principale Hide main window &button text labels Cacher le texte des &boutons de la fenêtre principale Whether to hide the text labels on the main window buttons Cacher le texte des boutons sur la fenêtre principale Warning Attention msec ms n/a n/a &Preset Name &Nom du préréglage &Server Name Nom du &serveur &Server Path &Chemin du serveur &Driver Pilot&e &Interface &Interface Sample &Rate &Fréquence d'échantillonnage &Frames/Period &Échantillons/Période Periods/&Buffer Périodes/&Tampon Startup Script Script de démarrage Post-Startup Script Script post-démarrage Shutdown Script Script d'extinction Post-Shutdown Script Script post-extinction Patchbay Definition files Fichiers de définition de baie de brassage Active Patchbay Definition Définition de baie de brassage à activer The audio backend driver interface to use Le pilote d'interface audio à utiliser &Verbose messages Messages ba&vards MIDI Driv&er: Pilot&e MIDI : none aucun raw brut seq seq The ALSA MIDI backend driver to use Le pilote ALSA MIDI à utiliser jackdmp jackdmp firewire firewire plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Des paramètres ont été modifiés : « %1 » Voulez-vous enregistrer les changements ? Delete preset: "%1" Are you sure? Effacer le préréglage : « %1 » Êtes-vous certain ? Some settings have been changed. Do you want to apply the changes? Des paramètres ont été modifiés. Voulez-vous appliquer les changements ? Messages Log Journal des messages Log files Fichiers du journal sun sun netone netone /dev/audio /dev/audio &Channels: &Canaux : Server path (command line prefix) Chemin serveur (préfixe de ligne de commande) Maximum number of audio channels to allocate Nombre maximal de canaux audio à allouer &Channels I/O: &Canaux E/S : &Latency I/O: &Latence E/S : Logging Journalisation Messages log file Fichier de journal des messages Browse for the messages log file location Pointer sur l'emplacement du fichier de journal des messages Whether to activate a messages logging to file. Activer la journalisation des messages dans un fichier. Server &Prefix: &Préfixe Serveur : Extra driver options (command line suffix) Options supplémentaires du pilote (Suffixe de ligne de commande) Start De&lay: &Retard du démarrage : secs s 0 msecs 0 ms Please do not touch these settings unless you know what you are doing. Veuillez ne pas toucher ces réglages si vous ne savez pas ce que vous faites. &Messages log file: Fichier de journal des &messages : Whether to enable blinking (flashing) of the server mode (RT) indicator Activer le clignotement de l'indicateur de mode serveur (TR) Blin&k server mode indicator &Clignotement de l'indicateur de mode serveur &JACK client/port aliases: Alias de client/port &JACK : JACK client/port aliases display mode Mode d'affichage des alias de client/port JACK Default Par défaut First Premier Second Deuxième Whether to start minimized to system tray Démarrer minimisé dans la zone de notification système JACK client/port pretty-name (metadata) display mode Activer le mode d'affichage « joli-nom » (métadonnées) de client/port JACK Advanced Avancé Whether to reset all connections when a patchbay definition is activated. Réinitialiser ou non toutes les connexions quand une définition de baie de brassage est activée. &Reset all connections on patchbay activation &Réinitialiser toutes les connections à l'activation d'une baie de brassage Whether to issue a warning on active patchbay port disconnections. Afficher ou non une alerte lors des déconnexions de port faisant partie d'une baie de brassage active. &Warn on active patchbay disconnections A&lerter lors des déconnexions sur la baie de brassage active Enable JA&CK client/port pretty-names (metadata) Activer les « jolis-noms » (métadonnées) de client/port JA&CK Whether to show system tray message on main window close Afficher on non les messages de la zone de notification système lors de la fermeture de la fenêtre principale Sho&w system tray message on close A&fficher les messages de la zone de notification lors de la fermeture de la fenêtre Start minimi&zed to system tray Démarrer minimisé dans la zone de notifications (&z) Whether to restrict to one single application instance (X11) Restreindre à une seule instance de l'application (X11) Single application &instance &Instance d'application unique Whether to enable ALSA Sequencer (MIDI) support on startup Activer la prise en charge du séquenceur ALSA (MIDI) au démarrage E&nable ALSA Sequencer support Activer la prise e&n charge du séquenceur ALSA Whether to enable JACK D-Bus interface Activation ou non de l'interface JACK D-Bus &Enable JACK D-Bus interface Activ&er l'interface JACK D-Bus Whether to stop JACK audio server on application exit Arrêter le serveur audio JACK lors de la sortie de l'application S&top JACK audio server on application exit Arrêter le &serveur audio JACK lors de la sortie de l'application Defaults Par défaut &Base font size: Taille de police de &base : Base application font size (pt.) Taille de base de police de l'application (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface Activer l'interface D-Bus &Enable D-Bus interface Activ&er l'interface D-Bus Number of microseconds to wait between engine processes (dummy) Nombre de microsecondes à attendre entre les traitements du moteur (factice) qjackctlSocketForm Socket - JACK Audio Connection Kit Prise - Kit de Connexion Audio JACK &Socket &Prise &Name (alias): &Nom (alias) : Socket name (an alias for client name) Nom de la prise (un alias pour le nom du client) Client name (regular expression) Nom du client (expression régulière) Add P&lug Ajouter une &fiche Add plug to socket plug list Ajouter la fiche à la liste des prises &Plug: &Fiche : Port name (regular expression) Nom du port (expression régulière) Socket Plugs / Ports Prises / Ports Socket plug list Liste des prises &Edit &Éditer &Remove Enleve&r Remove currently selected plug from socket plug list Enlever la fiche actuellement sélectionnée de la liste des prises &Client: &Client : &Down Vers le &bas &Up Vers le &haut E&xclusive E&xclusif Enforce only one exclusive cable connection S'assurer de l'utilisation d'une seule connexion cablée exclusive &Forward: Renvo&i : Forward (clone) all connections from this socket Renvoyer (cloner) toutes les connexions depuis cette prise Type Type &Audio &Audio Audio socket type (JACK) Type de prise audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Type de prise MIDI (ALSA) Plugs / Ports Fiches / Ports Add Plug Ajouter une Fiche Remove Enlever Edit Éditer Error Erreur A socket named "%1" already exists. Une prise nommée « %1 » existe déjà. Move Up Vers le haut Move Down Vers le bas (None) (Aucun) Edit currently selected plug Éditer la fiche actuellement sélectionnée Move down currently selected plug in socket plug list Déplacer vers le bas la fiche actuellement sélectionnée dans la liste des prises Move up current selected plug in socket plug list Déplacer vers le haut la fiche actuellement sélectionnée dans la liste des prises Warning Attention Some settings have been changed. Do you want to apply the changes? Des paramètres ont été modifiés. Voulez-vous appliquer les changements ? MIDI socket type (JACK) Type de prise MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Sortie Input Entrée Socket Prise Warning Attention <New> - %1 <Nouvelle> - %1 %1 about to be removed: "%2" Are you sure? %1 est sur le point d'être enlevée : « %2 » Êtes-vous certain ? %1 <Copy> - %2 %1 <Copie> - %2 qjackctlSocketListView Output Sockets / Plugs Prises/Fiches de Sortie Input Sockets / Plugs Prises/Fiches d'Entrée qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlInterfaceComboBox.h0000644000000000000000000000012713215206021020766 xustar0029 mtime=1513425937.53276694 29 atime=1513425937.53276694 29 ctime=1513425937.53276694 qjackctl-0.5.0/src/qjackctlInterfaceComboBox.h0000644000175000001440000000364013215206021021617 0ustar00rncbcusers00000000000000// qjackctlInterfaceComboBox.h // /**************************************************************************** Copyright (C) 2013, Arnout Engelen. All rights reserved. Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlInterfaceComboBox_h #define __qjackctlInterfaceComboBox_h #include // Forward decls. class qjackctlSetup; class QStandardItemModel; //---------------------------------------------------------------------------- // Combobox for device interfaces class qjackctlInterfaceComboBox : public QComboBox { public: // Constructor. qjackctlInterfaceComboBox(QWidget *pPrent = 0); void setup(QComboBox *pDriverComboBox, int iAudio, const QString& sDefName); protected: void clearCards(); void addCard(const QString& sName, const QString& sDescription); void populateModel(); void showPopup(); QStandardItemModel *model() const; private: QComboBox *m_pDriverComboBox; int m_iAudio; QString m_sDefName; }; #endif // __qjackctlInterfaceComboBox_h // end of qjackctlInterfaceComboBox.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAbout.h0000644000000000000000000000012713215206021016507 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctlAbout.h0000644000175000001440000000305013215206021017333 0ustar00rncbcusers00000000000000// qjackctlAbout.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAbout_h #define __qjackctlAbout_h #include "config.h" #define QJACKCTL_TITLE PACKAGE_NAME #define QJACKCTL_SUBTITLE0 "JACK" #define QJACKCTL_SUBTITLE1 QJACKCTL_SUBTITLE0 " Audio Connection Kit" #define QJACKCTL_SUBTITLE2 "Qt GUI Interface" #define QJACKCTL_SUBTITLE QJACKCTL_SUBTITLE1 " - " QJACKCTL_SUBTITLE2 #define QJACKCTL_WEBSITE "http://qjackctl.sourceforge.net" #define QJACKCTL_COPYRIGHT "Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved." #define QJACKCTL_DOMAIN "rncbc.org" #endif // __qjackctlAbout_h // end of qjackctlAbout.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSetupForm.ui0000644000000000000000000000012713215206021017547 xustar0029 mtime=1513425937.54076694 29 atime=1513425937.54076694 29 ctime=1513425937.54076694 qjackctl-0.5.0/src/qjackctlSetupForm.ui0000644000175000001440000042402013215206021020377 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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. S1ee the GNU General Public License for more details. with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSetupForm 0 0 640 520 Setup - JACK Audio Connection Kit :/images/setup1.png true false 0 Settings 4 4 Preset &Name: false PresetComboBox 0 0 Settings preset name true (default) Save settings as current preset name &Save :/images/save1.png false Delete current settings preset &Delete :/images/remove1.png false 0 Parameters 50 false Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DriverComboBox 50 false The audio backend driver interface to use false dummy sun oss alsa portaudio coreaudio freebob firewire net netone Qt::Horizontal 8 20 50 false &Interface: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InterfaceComboBox 140 0 50 false The PCM device name to use true (default) hw:0 plughw:0 /dev/audio /dev/dsp Qt::Horizontal 8 20 50 false MIDI Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false MidiDriverComboBox 80 0 50 false The ALSA MIDI backend driver to use false none raw seq 50 false Use realtime scheduling &Realtime 50 false QFrame::NoFrame QFrame::Plain Sample &Rate: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SampleRateComboBox 50 false Sample rate in frames per second true 22050 32000 44100 48000 88200 96000 192000 Qt::Horizontal 8 20 50 false &Frames/Period: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false FramesComboBox 50 false Frames per period between process() calls true 16 32 64 128 256 512 1024 2048 4096 50 false Periods/&Buffer: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PeriodsSpinBox 50 false Number of periods in the hardware buffer 2 999 Qt::Vertical 20 8 50 false Whether to give verbose output on messages &Verbose messages Qt::Horizontal 8 20 50 false QFrame::NoFrame QFrame::Plain Latency: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 72 0 50 false Output latency in milliseconds, calculated based on the period, rate and buffer settings QFrame::StyledPanel QFrame::Sunken 0 msecs Qt::AlignCenter false Advanced Please do not touch these settings unless you know what you are doing. 8 50 false Server &Prefix: false ServerPrefixComboBox 0 0 50 false Server path (command line prefix) true jackd jackdmp jackstart 50 false &Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ServerNameComboBox 120 0 50 false The JACK Audio Connection Kit sound server name true (default) Qt::Vertical 20 8 50 false Do not attempt to lock memory, even if in realtime mode No Memory Loc&k 50 false Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) &Unlock Memory 50 false Enable hardware metering on cards that support it H/&W Meter 50 false Provide output monitor ports &Monitor 50 false Ignore xruns reported by the backend driver So&ft Mode 50 false Enable hardware monitoring of capture ports H/W M&onitor 50 false Force 16bit mode instead of failing over 32bit (default) Force &16bit 50 false Ignore hardware period/buffer size &Ignore H/W Qt::Horizontal 8 20 50 false Maximum number of audio channels to allocate (default) 999 Sans Serif 50 false false Number of microseconds to wait between engine processes (dummy) true 21333 50 false QFrame::NoFrame QFrame::Plain Priorit&y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PrioritySpinBox 50 false Set client timeout limit in milliseconds true 1 200 500 1000 2000 5000 10000 50 false Port Ma&ximum: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PortMaxComboBox 50 false &Channels: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 ChanSpinBox 50 false false Word length true 16 32 64 50 false &Wait (usec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WaitComboBox 50 false false QFrame::NoFrame QFrame::Plain &Timeout (msec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false TimeoutComboBox 60 0 50 false Maximum number of ports the JACK server can manage true 1 128 256 512 1024 50 false &Word Length: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WordLengthComboBox 50 false Scheduler priority when running realtime (default) 1 5 99 Qt::Horizontal 8 20 50 false &Audio: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false AudioComboBox 0 0 50 false Provide either audio capture, playback or both Duplex Capture Only Playback Only 50 false QFrame::NoFrame QFrame::Plain Dit&her: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DitherComboBox 0 0 50 false Set dither mode None Rectangular Shaped Triangular 50 false &Output Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false OutDeviceComboBox 50 false Alternate output device for playback true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Input Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InDeviceComboBox 50 false Alternate input device for capture true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Channels I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InChannelsSpinBox 0 0 80 0 50 false Maximum input audio hardware channels to allocate (default) 999 0 0 80 0 50 false Maximum output audio hardware channels to allocate (default) 999 50 false &Latency I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InLatencySpinBox 0 0 80 0 50 false External input latency (frames) (default) 9999999 0 0 80 0 50 false External output latency (frames) (default) 9999999 Qt::Vertical 20 8 Qt::Vertical 20 8 50 false Server Suffi&x: false ServerSuffixComboBox 0 0 50 false Extra driver options (command line suffix) true 50 false Start De&lay: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false StartDelaySpinBox 50 false Time in seconds that client is delayed after server startup secs 0 999 Options 75 true Scripting true 8 4 50 false Whether to execute a custom shell script before starting up the JACK audio server. Execute script on Start&up: 50 false Whether to execute a custom shell script after starting up the JACK audio server. Execute script after &Startup: 50 false Whether to execute a custom shell script before shuting down the JACK audio server. Execute script on Shut&down: 0 0 50 false Command line to be executed before starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before starting up the JACK audio server ... 0 0 50 false Command line to be executed after starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after starting up the JACK audio server ... 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before shutting down the JACK audio server ... 0 0 50 false Command line to be executed before shutting down the JACK audio server true 50 false Whether to execute a custom shell script after shuting down the JACK audio server. Execute script after Shu&tdown: 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after shutting down the JACK audio server ... 0 0 50 false Command line to be executed after shutting down the JACK audio server true 75 true Statistics true 8 4 50 false Whether to capture standard output (stdout/stderr) into messages window &Capture standard output 50 false &XRUN detection regex: false XrunRegexComboBox 0 0 50 false Regular expression used to detect XRUNs on server output messages true xrun of at least ([0-9|\.]+) msecs 75 true Connections true 50 false Whether to activate a patchbay definition for connection persistence profile. Activate &Patchbay persistence: 0 0 50 false Patchbay definition file to be activated as connection persistence profile true 22 22 24 24 50 false Qt::TabFocus Browse for a patchbay definition file to be activated ... 50 false Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation 50 false Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Qt::Vertical 20 8 75 true Logging true 50 false Whether to activate a messages logging to file. &Messages log file: 0 0 50 false Messages log file true 22 22 24 24 50 false Qt::TabFocus Browse for the messages log file location ... Display 75 true Time Display true 4 4 50 false Transport &Time Code 50 false Transport &BBT (bar:beat.ticks) 50 false Elapsed time since last &Reset 50 false Elapsed time since last &XRUN Qt::Horizontal 8 20 4 4 180 0 260 32767 50 false Sample front panel normal display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 180 0 260 32767 50 false Sample big time display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Big Time display: false 50 false Select font for front panel normal display &Font... false 50 false Select font for big time display &Font... false 50 false Normal display: false 50 false Whether to enable a shiny glass light effect on the main display &Display shiny glass light effect 50 false Whether to enable blinking (flashing) of the server mode (RT) indicator Blin&k server mode indicator 4 4 50 false Time F&ormat: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false TimeFormatComboBox 50 false The general time format on display false hh:mm:ss hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.ddd 75 true Messages Window true 4 8 180 0 260 16777215 50 false Sample messages text font display true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the messages text display &Font... false Qt::Horizontal 8 20 50 false Whether to keep a maximum number of lines in the messages window &Messages limit: 50 false The maximum number of message lines to keep in view true 3 100 250 500 1000 2500 5000 Qt::Vertical 20 8 75 true Connections Window true 180 0 260 16777215 50 false Sample connections view font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the connections view &Font... false Qt::Horizontal 8 20 50 false &Icon size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ConnectionsIconSizeComboBox 50 false The icon size for each item of the connections view false 0 16 x 16 32 x 32 64 x 64 Qt::Vertical 20 8 50 false Whether to draw connection lines as cubic Bezier curves Draw connection and patchbay lines as Be&zier curves 50 false Whether to enable client/port name aliases on the connections window E&nable client/port aliases 50 false &JACK client/port aliases: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false JackClientPortAliasComboBox 50 false JACK client/port aliases display mode false 0 Default First Second 50 false Whether to enable in-place client/port name editing (rename) Ena&ble client/port aliases editing (rename) 50 false JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Misc 4 4 75 true Other true 4 4 4 0 50 false Whether to start JACK audio server immediately on application startup &Start JACK audio server on application startup 50 false Whether to ask for confirmation on application exit &Confirm application close 50 false Whether to ask for confirmation on JACK audio server shutdown Confirm server sh&utdown 50 false false Whether to keep all child windows on top of the main window &Keep child windows always on top 50 false Whether to enable the system tray icon &Enable system tray icon 50 false Whether to show system tray message on main window close Sho&w system tray message on close 50 false Whether to start minimized to system tray Start minimi&zed to system tray 50 false Whether to restrict to one single application instance (X11) Single application &instance 4 0 50 false Whether to save the JACK server command-line configuration into a local file (auto-start) S&ave JACK audio server configuration to: 50 false The server configuration local file name (auto-start) true .jackdrc 50 false Whether to exit once all clients have closed (auto-start) C&onfigure as temporary server 50 false Whether to enable ALSA Sequencer (MIDI) support on startup E&nable ALSA Sequencer support 50 false Whether to enable D-Bus interface &Enable D-Bus interface 50 false Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 50 false Whether to stop JACK audio server on application exit S&top JACK audio server on application exit Qt::Vertical 20 8 Qt::Vertical 20 8 75 true Buttons true 4 0 50 false Whether to hide the left button group on the main window Hide main window &Left buttons 50 false Whether to hide the right button group on the main window Hide main window &Right buttons 50 false Whether to hide the transport button group on the main window Hide main window &Transport buttons 50 false Whether to hide the text labels on the main window buttons Hide main window &button text labels Qt::Vertical 20 8 75 true Defaults true 4 4 Qt::Vertical 20 8 50 false &Base font size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter BaseFontSizeComboBox 50 false Base application font size (pt.) true (default) 6 7 8 9 10 11 12 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qjackctlInterfaceComboBox QComboBox
qjackctlInterfaceComboBox.h
SetupTabWidget PresetComboBox PresetSavePushButton PresetDeletePushButton SettingsTabWidget DriverComboBox RealtimeCheckBox InterfaceComboBox SampleRateComboBox FramesComboBox PeriodsSpinBox MidiDriverComboBox VerboseCheckBox ServerPrefixComboBox ServerNameComboBox NoMemLockCheckBox UnlockMemCheckBox HWMeterCheckBox MonitorCheckBox SoftModeCheckBox HWMonCheckBox ShortsCheckBox IgnoreHWCheckBox PrioritySpinBox WordLengthComboBox WaitComboBox ChanSpinBox PortMaxComboBox TimeoutComboBox AudioComboBox DitherComboBox OutDeviceComboBox InDeviceComboBox InChannelsSpinBox OutChannelsSpinBox InLatencySpinBox OutLatencySpinBox ServerSuffixComboBox StartDelaySpinBox StartupScriptCheckBox StartupScriptShellComboBox StartupScriptSymbolToolButton StartupScriptBrowseToolButton PostStartupScriptCheckBox PostStartupScriptShellComboBox PostStartupScriptSymbolToolButton PostStartupScriptBrowseToolButton ShutdownScriptCheckBox ShutdownScriptShellComboBox ShutdownScriptSymbolToolButton ShutdownScriptBrowseToolButton PostShutdownScriptCheckBox PostShutdownScriptShellComboBox PostShutdownScriptSymbolToolButton PostShutdownScriptBrowseToolButton StdoutCaptureCheckBox XrunRegexComboBox ActivePatchbayCheckBox ActivePatchbayPathComboBox ActivePatchbayPathToolButton ActivePatchbayResetCheckBox QueryDisconnectCheckBox MessagesLogCheckBox MessagesLogPathComboBox MessagesLogPathToolButton TransportTimeRadioButton TransportBBTRadioButton ElapsedResetRadioButton ElapsedXrunRadioButton TimeFormatComboBox DisplayFont1PushButton DisplayFont2PushButton DisplayEffectCheckBox DisplayBlinkCheckBox MessagesFontPushButton MessagesLimitCheckBox MessagesLimitLinesComboBox ConnectionsFontPushButton ConnectionsIconSizeComboBox BezierLinesCheckBox AliasesEnabledCheckBox AliasesEditingCheckBox JackClientPortAliasComboBox JackClientPortMetadataCheckBox StartJackCheckBox QueryCloseCheckBox QueryShutdownCheckBox KeepOnTopCheckBox SystemTrayCheckBox SystemTrayQueryCloseCheckBox StartMinimizedCheckBox SingletonCheckBox ServerConfigCheckBox ServerConfigNameComboBox ServerConfigTempCheckBox AlsaSeqEnabledCheckBox DBusEnabledCheckBox JackDBusEnabledCheckBox StopJackCheckBox LeftButtonsCheckBox RightButtonsCheckBox TransportButtonsCheckBox TextLabelsCheckBox BaseFontSizeComboBox DialogButtonBox
qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSessionForm.h0000644000000000000000000000012713215206021017704 xustar0029 mtime=1513425937.53876694 29 atime=1513425937.53876694 29 ctime=1513425937.53876694 qjackctl-0.5.0/src/qjackctlSessionForm.h0000644000175000001440000001144613215206021020540 0ustar00rncbcusers00000000000000// qjackctlSessionForm.h // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSessionForm_h #define __qjackctlSessionForm_h #include "ui_qjackctlSessionForm.h" #include #include // Forward declarations. class qjackctlSession; class qjackctlSetup; class QMenu; class QIcon; class QLineEdit; class QToolButton; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor class qjackctlSessionInfraClientItemEditor : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemEditor( QWidget *pParent, const QModelIndex& index); // Shortcut text accessors. void setText(const QString& sText); QString text() const; // Default (initial) shortcut text accessors. void setDefaultText(const QString& sDefaultText) { m_sDefaultText = sDefaultText; } const QString& defaultText() const { return m_sDefaultText; } signals: void finishSignal(); protected slots: void browseSlot(); void resetSlot(); void finishSlot(); private: // Instance variables. QModelIndex m_index; QLineEdit *m_pItemEdit; QToolButton *m_pBrowseButton; QToolButton *m_pResetButton; QString m_sDefaultText; }; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate class qjackctlSessionInfraClientItemDelegate : public QItemDelegate { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemDelegate(QObject *pParent = NULL); protected: QWidget *createEditor(QWidget *pParent, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setEditorData(QWidget *pEditor, const QModelIndex &index) const; void setModelData(QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index) const; protected slots: void commitEditor(); }; //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. class qjackctlSessionForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSessionForm(); // Global setup method. void setup(qjackctlSetup *pSetup); // Maybe ask whether we can close. bool queryClose(); // Recent session directories and save type accessors. const QStringList& sessionDirs() const; bool isSaveSessionVersion() const; // Recent menu accessor. QMenu *recentMenu() const; // Save menu accessor. QMenu *saveMenu() const; void stabilizeForm(bool bEnabled); public slots: void loadSession(); void saveSessionSave(); void saveSessionSaveAndQuit(); void saveSessionSaveTemplate(); void saveSessionVersion(bool); void updateSession(); protected slots: void recentSession(); void updateRecentMenu(); void clearRecentMenu(); void sessionViewContextMenu(const QPoint& pos); void addInfraClient(); void editInfraClient(); void editInfraClientCommit(); void removeInfraClient(); void selectInfraClient(); void updateInfraClients(); void infraClientContextMenu(const QPoint& pos); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); void saveSessionEx(int iSessionType = 0); void loadSessionDir(const QString& sSessionDir); void saveSessionDir(const QString& sSessionDir, int iSessionType = 0); void updateRecent(const QString& sSessionDir); void updateSessionView(); static QIcon iconStatus(const QIcon& icon, bool bStatus); private: // The Qt-designer UI struct... Ui::qjackctlSessionForm m_ui; // Common (sigleton) session object. qjackctlSession *m_pSession; // Recent session menu. QMenu *m_pRecentMenu; // Save session menu. QMenu *m_pSaveMenu; // Setup options. qjackctlSetup *m_pSetup; // Session directory history. QStringList m_sessionDirs; }; #endif // __qjackctlSessionForm_h // end of qjackctlSessionForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMainForm.cpp0000644000000000000000000000012713215206021017500 xustar0029 mtime=1513425937.53476694 29 atime=1513425937.53376694 29 ctime=1513425937.53476694 qjackctl-0.5.0/src/qjackctlMainForm.cpp0000644000175000001440000034643413215206021020344 0ustar00rncbcusers00000000000000// qjackctlMainForm.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlMainForm.h" #include "qjackctlStatus.h" #include "qjackctlPatchbay.h" #include "qjackctlPatchbayFile.h" #include "qjackctlMessagesStatusForm.h" #include "qjackctlSessionForm.h" #include "qjackctlConnectionsForm.h" #include "qjackctlPatchbayForm.h" #include "qjackctlSetupForm.h" #include "qjackctlAboutForm.h" #ifdef CONFIG_SYSTEM_TRAY #include "qjackctlSystemTray.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) #include #endif #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif #ifdef CONFIG_DBUS #include #include #endif #ifdef CONFIG_JACK_STATISTICS #include #endif #ifdef CONFIG_JACK_METADATA #include #endif // Timer constant stuff. #define QJACKCTL_TIMER_MSECS 200 // Status refresh cycle (~2 secs) #define QJACKCTL_STATUS_CYCLE 10 // Server display enumerated states. #define QJACKCTL_INACTIVE 0 #define QJACKCTL_ACTIVATING 1 #define QJACKCTL_ACTIVE 2 #define QJACKCTL_STARTING 3 #define QJACKCTL_STARTED 4 #define QJACKCTL_STOPPING 5 #define QJACKCTL_STOPPED 6 #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) #include #undef HAVE_POLL_H #undef HAVE_SIGNAL_H #else #include #include // Notification pipes descriptors #define QJACKCTL_FDNIL -1 #define QJACKCTL_FDREAD 0 #define QJACKCTL_FDWRITE 1 static int g_fdStdout[2] = { QJACKCTL_FDNIL, QJACKCTL_FDNIL }; #endif #ifdef HAVE_POLL_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif // Custom event types. #define QJACKCTL_PORT_EVENT QEvent::Type(QEvent::User + 1) #define QJACKCTL_XRUN_EVENT QEvent::Type(QEvent::User + 2) #define QJACKCTL_BUFF_EVENT QEvent::Type(QEvent::User + 3) #define QJACKCTL_SHUT_EVENT QEvent::Type(QEvent::User + 4) #define QJACKCTL_EXIT_EVENT QEvent::Type(QEvent::User + 5) #ifdef CONFIG_DBUS #define QJACKCTL_LINE_EVENT QEvent::Type(QEvent::User + 6) #endif #ifdef CONFIG_JACK_METADATA #define QJACKCTL_PROP_EVENT QEvent::Type(QEvent::User + 7) #endif //---------------------------------------------------------------------------- // qjackctl -- Static callback posters. // To have clue about current buffer size (in frames). static jack_nframes_t g_nframes = 0; static QProcess::ProcessError g_error = QProcess::UnknownError; // Jack port registration callback funtion, called // whenever a jack port is registered or unregistered. static void qjackctl_port_registration_callback ( jack_port_id_t, int, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } // Jack graph order callback function, called // whenever the processing graph is reordered. static int qjackctl_graph_order_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); return 0; } // Jack XRUN callback function, called // whenever there is a xrun. static int qjackctl_xrun_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_XRUN_EVENT)); return 0; } // Jack buffer size function, called // whenever the server changes buffer size. static int qjackctl_buffer_size_callback ( jack_nframes_t nframes, void * ) { // Update our global static variable. g_nframes = nframes; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_BUFF_EVENT)); return 0; } // Jack shutdown function, called // whenever the server terminates this client. static void qjackctl_on_shutdown ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_SHUT_EVENT)); } // Jack process exit function, called // whenever the server terminates abnormally. static void qjackctl_on_error ( QProcess::ProcessError error ) { g_error = error; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_EXIT_EVENT)); } #ifdef CONFIG_DBUS //---------------------------------------------------------------------- // class qjackctlDBusLogWatcher -- Simple D-BUS log watcher thread. // class qjackctlDBusLogWatcher : public QThread { public: // Constructor. qjackctlDBusLogWatcher(const QString& sFilename) : QThread(), m_sFilename(sFilename), m_bRunState(false) {} // Destructor. ~qjackctlDBusLogWatcher() { if (isRunning()) do { m_bRunState = false; } while (!wait(1000)); } // Custom log event. class LineEvent : public QEvent { public: // Constructor. LineEvent(QEvent::Type eType, const QString& sLine) : QEvent(eType), m_sLine(sLine) { m_sLine.remove(QRegExp("\x1B\[[0-9|;]+m")); } // Accessor. const QString& line() const { return m_sLine; } private: // Custom event data. QString m_sLine; }; protected: // The main thread executive. void run() { QFile file(m_sFilename); m_bRunState = true; while (m_bRunState) { if (file.isOpen()) { char achBuffer[1024]; while (file.readLine(achBuffer, sizeof(achBuffer)) > 0) { QApplication::postEvent( qjackctlMainForm::getInstance(), new LineEvent(QJACKCTL_LINE_EVENT, achBuffer)); } if (file.size() == file.pos() && file.error() == QFile::NoError) { msleep(1000); } else { file.close(); } } else if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { file.seek(file.size()); } else msleep(1000); } } private: // The log filename to watch. QString m_sFilename; // Whether the thread is logically running. volatile bool m_bRunState; }; #endif // CONFIG_DBUS #ifdef CONFIG_JACK_METADATA // Jack property change function, called // whenever metadata is changed static void qjackctl_property_change_callback ( jack_uuid_t, const char *key, jack_property_change_t, void * ) { // PRETTY_NAME is the only metadata we are currently interested in... if (qjackctlJackClientList::isJackClientPortMetadata() && key && (strcmp(key, JACK_METADATA_PRETTY_NAME) == 0)) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PROP_EVENT)); } } #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::g_pMainForm = NULL; // Constructor. qjackctlMainForm::qjackctlMainForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) QApplication::setStyle(new QPlastiqueStyle()); #endif // Setup UI struct... m_ui.setupUi(this); // Pseudo-singleton reference setup. g_pMainForm = this; m_pSetup = NULL; m_iServerState = QJACKCTL_INACTIVE; m_pJack = NULL; m_pJackClient = NULL; m_bJackDetach = false; m_bJackShutdown = false; m_bJackStopped = false; m_pAlsaSeq = NULL; #ifdef CONFIG_DBUS m_pDBusControl = NULL; m_pDBusConfig = NULL; m_pDBusLogWatcher = NULL; m_bDBusStarted = false; #endif m_iStartDelay = 0; m_iTimerDelay = 0; m_iTimerRefresh = 0; m_iJackRefresh = 0; m_iAlsaRefresh = 0; m_iJackDirty = 0; m_iAlsaDirty = 0; m_iStatusRefresh = 0; m_iStatusBlink = 0; m_iPatchbayRefresh = 0; #ifdef CONFIG_JACK_METADATA m_iJackPropertyChange = 0; #endif m_pStdoutNotifier = NULL; m_pAlsaNotifier = NULL; // All forms are to be created later on setup. m_pMessagesStatusForm = NULL; m_pSessionForm = NULL; m_pConnectionsForm = NULL; m_pPatchbayForm = NULL; m_pSetupForm = NULL; // Patchbay rack can be readily created. m_pPatchbayRack = new qjackctlPatchbayRack(); #ifdef CONFIG_SYSTEM_TRAY // The eventual system tray widget. m_pSystemTray = NULL; m_bQuitClose = false; #endif // We're not quitting so early :) m_bQuitForce = false; // Transport skip accelerate factor. m_fSkipAccel = 1.0; // Avoid extra transport toggles (play/stop) m_iTransportPlay = 0; // Whether we've Qt::Tool flag (from bKeepOnTop), // this is actually the main last application window... QWidget::setAttribute(Qt::WA_QuitOnClose); #ifdef HAVE_SIGNAL_H // Set to ignore any fatal "Broken pipe" signals. signal(SIGPIPE, SIG_IGN); #endif #if 0 // FIXME: Iterate for every child text label... m_ui.StatusDisplayFrame->setAutoFillBackground(true); QList labels = m_ui.StatusDisplayFrame->findChildren (); QListIterator iter(labels); while (iter.hasNext()) iter.next()->setAutoFillBackground(false); #endif // UI connections... QObject::connect(m_ui.StartToolButton, SIGNAL(clicked()), SLOT(startJack())); QObject::connect(m_ui.StopToolButton, SIGNAL(clicked()), SLOT(stopJack())); QObject::connect(m_ui.MessagesStatusToolButton, SIGNAL(clicked()), SLOT(toggleMessagesStatusForm())); QObject::connect(m_ui.SessionToolButton, SIGNAL(clicked()), SLOT(toggleSessionForm())); QObject::connect(m_ui.ConnectionsToolButton, SIGNAL(clicked()), SLOT(toggleConnectionsForm())); QObject::connect(m_ui.PatchbayToolButton, SIGNAL(clicked()), SLOT(togglePatchbayForm())); QObject::connect(m_ui.QuitToolButton, SIGNAL(clicked()), SLOT(quitMainForm())); QObject::connect(m_ui.SetupToolButton, SIGNAL(clicked()), SLOT(showSetupForm())); QObject::connect(m_ui.AboutToolButton, SIGNAL(clicked()), SLOT(showAboutForm())); QObject::connect(m_ui.RewindToolButton, SIGNAL(clicked()), SLOT(transportRewind())); QObject::connect(m_ui.BackwardToolButton, SIGNAL(clicked()), SLOT(transportBackward())); QObject::connect(m_ui.PlayToolButton, SIGNAL(toggled(bool)), SLOT(transportPlay(bool))); QObject::connect(m_ui.PauseToolButton, SIGNAL(clicked()), SLOT(transportStop())); QObject::connect(m_ui.ForwardToolButton, SIGNAL(clicked()), SLOT(transportForward())); } // Destructor. qjackctlMainForm::~qjackctlMainForm (void) { // Stop server, if not already... #ifdef CONFIG_DBUS if (m_pSetup->bStopJack || !m_pSetup->bJackDBusEnabled) stopJackServer(); if (m_pDBusLogWatcher) delete m_pDBusLogWatcher; if (m_pDBusConfig) delete m_pDBusConfig; if (m_pDBusControl) delete m_pDBusControl; m_pDBusControl = NULL; m_pDBusConfig = NULL; m_pDBusLogWatcher = NULL; m_bDBusStarted = false; #else stopJackServer(); #endif // Terminate local ALSA sequencer interface. if (m_pAlsaNotifier) delete m_pAlsaNotifier; #ifdef CONFIG_ALSA_SEQ if (m_pAlsaSeq) snd_seq_close(m_pAlsaSeq); #endif m_pAlsaNotifier = NULL; m_pAlsaSeq = NULL; // Finally drop any popup widgets around... if (m_pMessagesStatusForm) delete m_pMessagesStatusForm; if (m_pSessionForm) delete m_pSessionForm; if (m_pConnectionsForm) delete m_pConnectionsForm; if (m_pPatchbayForm) delete m_pPatchbayForm; if (m_pSetupForm) delete m_pSetupForm; #ifdef CONFIG_SYSTEM_TRAY // Quit off system tray widget. if (m_pSystemTray) delete m_pSystemTray; #endif // Patchbay rack is also dead. if (m_pPatchbayRack) delete m_pPatchbayRack; // Pseudo-singleton reference shut-down. g_pMainForm = NULL; } // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::getInstance (void) { return g_pMainForm; } // Make and set a proper setup step. bool qjackctlMainForm::setup ( qjackctlSetup *pSetup ) { // Finally, fix settings descriptor // and stabilize the form. m_pSetup = pSetup; // To avoid any background flickering, // we'll hide the main display. m_ui.StatusDisplayFrame->hide(); updateButtons(); // What style do we create these forms? QWidget *pParent = NULL; Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (m_pSetup->bKeepOnTop) { pParent = this; wflags |= Qt::Tool; } // All forms are to be created right now. m_pMessagesStatusForm = new qjackctlMessagesStatusForm (pParent, wflags); m_pSessionForm = new qjackctlSessionForm (pParent, wflags); m_pConnectionsForm = new qjackctlConnectionsForm (pParent, wflags); m_pPatchbayForm = new qjackctlPatchbayForm (pParent, wflags); // Setup form is kind of special (modeless dialog). m_pSetupForm = new qjackctlSetupForm(this); // Setup appropriately... m_pMessagesStatusForm->setTabPage(m_pSetup->iMessagesStatusTabPage); m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); m_pSessionForm->setup(m_pSetup); m_pConnectionsForm->setTabPage(m_pSetup->iConnectionsTabPage); m_pConnectionsForm->setup(m_pSetup); m_pPatchbayForm->setup(m_pSetup); m_pSetupForm->setup(m_pSetup); // Check out some initial nullities(tm)... if (m_pSetup->sMessagesFont.isEmpty() && m_pMessagesStatusForm) m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); if (m_pSetup->sDisplayFont1.isEmpty()) m_pSetup->sDisplayFont1 = m_ui.TimeDisplayTextLabel->font().toString(); if (m_pSetup->sDisplayFont2.isEmpty()) m_pSetup->sDisplayFont2 = m_ui.ServerStateTextLabel->font().toString(); if (m_pSetup->sConnectionsFont.isEmpty() && m_pConnectionsForm) m_pSetup->sConnectionsFont = m_pConnectionsForm->connectionsFont().toString(); // Set the patchbay cable connection notification signal/slot. QObject::connect( m_pPatchbayRack, SIGNAL(cableConnected(const QString&, const QString&, unsigned int)), this, SLOT(cableConnectSlot(const QString&, const QString&, unsigned int))); // Try to restore old window positioning and appearence. m_pSetup->loadWidgetGeometry(this, true); // And for the whole widget gallore... m_pSetup->loadWidgetGeometry(m_pMessagesStatusForm); m_pSetup->loadWidgetGeometry(m_pSessionForm); m_pSetup->loadWidgetGeometry(m_pConnectionsForm); m_pSetup->loadWidgetGeometry(m_pPatchbayForm); // m_pSetup->loadWidgetGeometry(m_pSetupForm); // Make it final show... m_ui.StatusDisplayFrame->show(); // Set other defaults... updateDisplayEffect(); updateTimeDisplayFonts(); updateTimeDisplayToolTips(); updateTimeFormat(); updateMessagesFont(); updateMessagesLimit(); updateConnectionsFont(); updateConnectionsIconSize(); updateJackClientPortAlias(); updateJackClientPortMetadata(); updateBezierLines(); // updateActivePatchbay(); #ifdef CONFIG_SYSTEM_TRAY updateSystemTray(); #endif // Initial XRUN statistics reset. resetXrunStats(); // Check if we can redirect our own stdout/stderr... #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) if (m_pSetup->bStdoutCapture && ::pipe(g_fdStdout) == 0) { ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDOUT_FILENO); ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDERR_FILENO); stdoutBlock(g_fdStdout[QJACKCTL_FDWRITE], false); m_pStdoutNotifier = new QSocketNotifier( g_fdStdout[QJACKCTL_FDREAD], QSocketNotifier::Read, this); QObject::connect(m_pStdoutNotifier, SIGNAL(activated(int)), SLOT(stdoutNotifySlot(int))); } #endif #ifdef CONFIG_ALSA_SEQ if (m_pSetup->bAlsaSeqEnabled) { // Start our ALSA sequencer interface. if (snd_seq_open(&m_pAlsaSeq, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) m_pAlsaSeq = NULL; if (m_pAlsaSeq) { snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; struct pollfd pfd[1]; int iPort = snd_seq_create_simple_port( m_pAlsaSeq, "qjackctl", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE | SND_SEQ_PORT_CAP_NO_EXPORT, SND_SEQ_PORT_TYPE_APPLICATION ); if (iPort >= 0) { snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = SND_SEQ_CLIENT_SYSTEM; seq_addr.port = SND_SEQ_PORT_SYSTEM_ANNOUNCE; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = snd_seq_client_id(m_pAlsaSeq); seq_addr.port = iPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs); snd_seq_poll_descriptors(m_pAlsaSeq, pfd, 1, POLLIN); m_pAlsaNotifier = new QSocketNotifier(pfd[0].fd, QSocketNotifier::Read); QObject::connect(m_pAlsaNotifier, SIGNAL(activated(int)), SLOT(alsaNotifySlot(int))); } } // Could we start without it? if (m_pAlsaSeq) { // Rather obvious setup. if (m_pConnectionsForm) m_pConnectionsForm->stabilizeAlsa(true); } else { appendMessagesError( tr("Could not open ALSA sequencer as a client.\n\n" "ALSA MIDI patchbay will be not available.")); } } #endif #ifdef CONFIG_DBUS // Register D-Bus service... if (m_pSetup->bDBusEnabled) { const QString s; // Just an empty string. const QString sDBusName("org.rncbc.qjackctl"); QDBusConnection dbus = QDBusConnection::systemBus(); dbus.connect(s, s, sDBusName, "start", this, SLOT(startJack())); dbus.connect(s, s, sDBusName, "stop", this, SLOT(stopJack())); dbus.connect(s, s, sDBusName, "main", this, SLOT(toggleMainForm())); dbus.connect(s, s, sDBusName, "messages", this, SLOT(toggleMessagesForm())); dbus.connect(s, s, sDBusName, "status", this, SLOT(toggleStatusForm())); dbus.connect(s, s, sDBusName, "session", this, SLOT(toggleSessionForm())); dbus.connect(s, s, sDBusName, "connections", this, SLOT(toggleConnectionsForm())); dbus.connect(s, s, sDBusName, "patchbay", this, SLOT(togglePatchbayForm())); dbus.connect(s, s, sDBusName, "rewind", this, SLOT(transportRewind())); dbus.connect(s, s, sDBusName, "backward", this, SLOT(transportBackward())); dbus.connect(s, s, sDBusName, "play", this, SLOT(transportStart())); dbus.connect(s, s, sDBusName, "pause", this, SLOT(transportStop())); dbus.connect(s, s, sDBusName, "forward", this, SLOT(transportForward())); dbus.connect(s, s, sDBusName, "setup", this, SLOT(showSetupForm())); dbus.connect(s, s, sDBusName, "about", this, SLOT(showAboutForm())); dbus.connect(s, s, sDBusName, "quit", this, SLOT(quitMainForm())); dbus.connect(s, s, sDBusName, "preset", this, SLOT(activatePreset(const QString&))); // Session related slots... if (m_pSessionForm) { dbus.connect(s, s, sDBusName, "load", m_pSessionForm, SLOT(loadSession())); dbus.connect(s, s, sDBusName, "save", m_pSessionForm, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION dbus.connect(s, s, sDBusName, "savequit", m_pSessionForm, SLOT(saveSessionSaveAndQuit())); dbus.connect(s, s, sDBusName, "savetemplate", m_pSessionForm, SLOT(saveSessionSaveTemplate())); #endif } } // Register JACK D-Bus service... if (m_pSetup->bJackDBusEnabled) { // Detect whether jackdbus is avaliable... QDBusConnection dbusc = QDBusConnection::sessionBus(); m_pDBusControl = new QDBusInterface( "org.jackaudio.service", // Service "/org/jackaudio/Controller", // Path "org.jackaudio.JackControl", // Interface dbusc); // Connection QDBusMessage dbusm = m_pDBusControl->call("IsStarted"); if (dbusm.type() == QDBusMessage::ReplyMessage) { // Yes, jackdbus is available and/or already started // -- use jackdbus control interface... appendMessages(tr("D-BUS: Service is available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Parse reply (should be boolean) m_bDBusStarted = dbusm.arguments().first().toBool(); // Register server start/stop notification slots... dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStarted", this, SLOT(jackStarted())); dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStopped", this, SLOT(jackFinished())); // -- use jackdbus configure interface... m_pDBusConfig = new QDBusInterface( m_pDBusControl->service(), // Service m_pDBusControl->path(), // Path "org.jackaudio.Configure", // Interface m_pDBusControl->connection()); // Connection // Start our log watcher thread... m_pDBusLogWatcher = new qjackctlDBusLogWatcher( QDir::homePath() + "/.log/jack/jackdbus.log"); m_pDBusLogWatcher->start(); // Ready now. } else { // No, jackdbus is not available, not started // or not even installed -- use classic jackd, BAU... appendMessages(tr("D-BUS: Service not available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Destroy tentative jackdbus interface. delete m_pDBusControl; m_pDBusControl = NULL; } } #endif // Load patchbay form recent paths... if (m_pPatchbayForm) { m_pPatchbayForm->setRecentPatchbays(m_pSetup->patchbays); if (!m_pSetup->sPatchbayPath.isEmpty() && QFileInfo(m_pSetup->sPatchbayPath).exists()) m_pPatchbayForm->loadPatchbayFile(m_pSetup->sPatchbayPath); m_pPatchbayForm->updateRecentPatchbays(); m_pPatchbayForm->stabilizeForm(); } // Try to find if we can start in detached mode (client-only) // just in case there's a JACK server already running. startJackClient(true); // Final startup stabilization... stabilizeForm(); jackStabilize(); // Look for immediate server startup?... if (m_pSetup->bStartJack || !m_pSetup->sCmdLine.isEmpty()) m_pSetup->bStartJackCmd = true; if (m_pSetup->bStartJackCmd) startJack(); // Register the first timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); // We're ready to go... return true; } // Window close event handlers. bool qjackctlMainForm::queryClose (void) { bool bQueryClose = true; #ifdef CONFIG_SYSTEM_TRAY // If we're not quitting explicitly and there's an // active system tray icon, then just hide ourselves. if (!m_bQuitClose && !m_bQuitForce && isVisible() && m_pSetup->bSystemTray && m_pSystemTray) { m_pSetup->saveWidgetGeometry(this, true); if (m_pSetup->bSystemTrayQueryClose) { const QString& sTitle = tr("Information") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("The program will keep running in the system tray.\n\n" "To terminate the program, please choose \"Quit\"\n" "in the context menu of the system tray icon."); #if 0//QJACKCTL_SYSTEM_TRAY_QUERY_CLOSE if (QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage( sTitle, sText, QSystemTrayIcon::Information); } else QMessageBox::information(this, sTitle, sText); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Information); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok); QCheckBox cbox(tr("Don't show this message again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); mbox.exec(); if (cbox.isChecked()) m_pSetup->bSystemTrayQueryClose = false; #endif } hide(); bQueryClose = false; } #endif // Check if JACK daemon is currently running... if (bQueryClose && !m_bQuitForce && m_pJack && m_pJack->state() == QProcess::Running && (m_pSetup->bQueryClose || m_pSetup->bQueryShutdown)) { show(); raise(); activateWindow(); if (m_pSetup->bQueryClose) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("JACK is currently running.\n\n" "Do you want to terminate the JACK audio server?"); #if 0//QJACKCTL_QUERY_CLOSE bQueryClose = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryClose = (mbox.exec() == QMessageBox::Ok); if (bQueryClose && cbox.isChecked()) m_pSetup->bQueryClose = false; #endif } } // Try to save current setup settings. if (bQueryClose && m_pSetupForm && !m_bQuitForce) bQueryClose = m_pSetupForm->queryClose(); // Try to save current aliases default settings. if (bQueryClose && m_pConnectionsForm) { if (!m_bQuitForce) bQueryClose = m_pConnectionsForm->queryClose(); if (bQueryClose) m_pSetup->iConnectionsTabPage = m_pConnectionsForm->tabPage(); } // Try to save current patchbay default settings. if (bQueryClose && m_pPatchbayForm) { if (!m_bQuitForce) bQueryClose = m_pPatchbayForm->queryClose(); if (bQueryClose && !m_pPatchbayForm->patchbayPath().isEmpty()) m_pSetup->sPatchbayPath = m_pPatchbayForm->patchbayPath(); } // Try to save current session directories list... if (bQueryClose && m_pSessionForm) { if (!m_bQuitForce) bQueryClose = m_pSessionForm->queryClose(); if (bQueryClose) { m_pSetup->sessionDirs = m_pSessionForm->sessionDirs(); m_pSetup->bSessionSaveVersion = m_pSessionForm->isSaveSessionVersion(); } } // Some windows default fonts are here on demand too. if (bQueryClose && m_pMessagesStatusForm) { m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); m_pSetup->iMessagesStatusTabPage = m_pMessagesStatusForm->tabPage(); } // Whether we're really quitting. #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = bQueryClose; #endif m_bQuitForce = bQueryClose; // Try to save current positioning. if (bQueryClose) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pSetup->saveWidgetGeometry(m_pPatchbayForm); // m_pSetup->saveWidgetGeometry(m_pSetupForm); m_pSetup->saveWidgetGeometry(this, true); // Close popup widgets. if (m_pMessagesStatusForm) m_pMessagesStatusForm->close(); if (m_pSessionForm) m_pSessionForm->close(); if (m_pConnectionsForm) m_pConnectionsForm->close(); if (m_pPatchbayForm) m_pPatchbayForm->close(); if (m_pSetupForm) m_pSetupForm->close(); #if 0//CONFIG_SYSTEM_TRAY // And the system tray icon too. if (m_pSystemTray) m_pSystemTray->close(); #endif // Stop any service out there... if (m_pSetup->bStopJack) stopJackServer(); // Finally, save settings. m_pSetup->saveSetup(); } return bQueryClose; } void qjackctlMainForm::closeEvent ( QCloseEvent *pCloseEvent ) { // Let's be sure about that... if (queryClose()) { pCloseEvent->accept(); QApplication::quit(); } else { pCloseEvent->ignore(); } } void qjackctlMainForm::customEvent ( QEvent *pEvent ) { switch (int(pEvent->type())) { case QJACKCTL_PORT_EVENT: portNotifyEvent(); break; case QJACKCTL_XRUN_EVENT: xrunNotifyEvent(); break; case QJACKCTL_BUFF_EVENT: buffNotifyEvent(); break; case QJACKCTL_SHUT_EVENT: shutNotifyEvent(); break; case QJACKCTL_EXIT_EVENT: exitNotifyEvent(); break; #ifdef CONFIG_DBUS case QJACKCTL_LINE_EVENT: appendStdoutBuffer( static_cast (pEvent)->line()); break; #endif #ifdef CONFIG_JACK_METADATA case QJACKCTL_PROP_EVENT: propNotifyEvent(); break; #endif default: QWidget::customEvent(pEvent); break; } } // Common exit status text formatter... QString qjackctlMainForm::formatExitStatus ( int iExitStatus ) const { QString sTemp = " "; if (iExitStatus == 0) sTemp += tr("successfully"); else sTemp += tr("with exit status=%1").arg(iExitStatus); return sTemp + "."; } // Common shell script executive, with placeholder substitution... void qjackctlMainForm::shellExecute ( const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage ) { QString sTemp = sShellCommand; sTemp.replace("%P", m_pSetup->sDefPreset); sTemp.replace("%N", m_pSetup->sServerName); sTemp.replace("%s", m_preset.sServerPrefix); sTemp.replace("%d", m_preset.sDriver); sTemp.replace("%i", m_preset.sInterface); sTemp.replace("%r", QString::number(m_preset.iSampleRate)); sTemp.replace("%p", QString::number(m_preset.iFrames)); sTemp.replace("%n", QString::number(m_preset.iPeriods)); appendMessages(sStartMessage); appendMessagesColor(sTemp.trimmed(), "#990099"); stabilize(QJACKCTL_TIMER_MSECS); // Execute and set exit status message... sTemp = sStopMessage + formatExitStatus( ::system(sTemp.toUtf8().constData())); // Wait a litle bit before continue... stabilize(QJACKCTL_TIMER_MSECS); // Final log message... appendMessages(sTemp); } // Start jack audio server... void qjackctlMainForm::startJack (void) { // If can't be already a client, are we? if (m_pJackClient) return; // Is the server process instance still here? if (m_pJack) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Could not start JACK.\n\n" "Maybe JACK audio server is already started."), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { m_pJack->terminate(); m_pJack->kill(); } return; } // Stabilize emerging server state... QPalette pal; pal.setColor(QPalette::Foreground, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(false); updateServerState(QJACKCTL_ACTIVATING); // Reset our timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Now we're sure it ain't detached. m_bJackShutdown = false; m_bJackDetach = false; // Load primary/default server preset... if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load preset \"%1\".\n\nRetrying with default.").arg(m_pSetup->sDefPreset)); m_pSetup->sDefPreset = m_pSetup->sDefPresetName; if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load default preset.\n\nSorry.")); jackCleanup(); return; } } // Override server name now... if (m_pSetup->sServerName.isEmpty()) m_pSetup->sServerName = m_preset.sServerName; #if 0 // defined(__GNUC__) && defined(Q_OS_LINUX) // Take care for the environment as well... if (!m_pSetup->sServerName.isEmpty()) { setenv("JACK_DEFAULT_SERVER", m_pSetup->sServerName.toUtf8().constData(), 1); } #endif // If we ain't to be the server master, maybe we'll start // detached as client only (jackd server already running?) if (startJackClient(true)) { m_ui.StopToolButton->setEnabled(true); return; } // Say that we're starting... updateServerState(QJACKCTL_STARTING); // Do we have any startup script?... if (m_pSetup->bStartupScript && !m_pSetup->sStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sStartupScriptShell, tr("Startup script..."), tr("Startup script terminated")); } // Split the server path into arguments... QStringList args = m_preset.sServerPrefix.split(' '); // Look for the executable in the search path; // this enforces the server command to be an // executable absolute path whenever possible. QString sCommand = args[0]; QFileInfo fi(sCommand); if (fi.isRelative()) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) const char chPathSep = ';'; if (fi.suffix().isEmpty()) sCommand += ".exe"; #else const char chPathSep = ':'; #endif const QString sPath = ::getenv("PATH"); QStringList paths = sPath.split(chPathSep); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) paths = paths << "C:\\Program Files\\Jack" << "C:\\Program Files (x86)\\Jack"; #endif QStringListIterator iter(paths); while (iter.hasNext()) { const QString& sDirectory = iter.next(); fi.setFile(QDir(sDirectory), sCommand); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) #ifdef CONFIG_DEBUG printf("\n\n\n\n abs_path: -%s-\ndir: -%s-\nsCommand: -%s-\nexists: %d, executable: %d\n\n", fi.absolutePath().toUtf8().constData(), sDirectory.toUtf8().constData(), sCommand.toUtf8().constData(), fi.exists(), fi.isExecutable() ); #endif #endif if (fi.exists() && fi.isExecutable()) { sCommand = fi.filePath(); break; } } } // Now that we got a command, remove it from args list... args.removeAt(0); // Build process arguments... const bool bDummy = (m_preset.sDriver == "dummy"); const bool bSun = (m_preset.sDriver == "sun"); const bool bOss = (m_preset.sDriver == "oss"); const bool bAlsa = (m_preset.sDriver == "alsa"); const bool bPortaudio = (m_preset.sDriver == "portaudio"); const bool bCoreaudio = (m_preset.sDriver == "coreaudio"); const bool bFreebob = (m_preset.sDriver == "freebob"); const bool bFirewire = (m_preset.sDriver == "firewire"); const bool bNet = (m_preset.sDriver == "net" || m_preset.sDriver == "netone"); if (!m_pSetup->sServerName.isEmpty()) args.append("-n" + m_pSetup->sServerName); if (m_preset.bVerbose) args.append("-v"); if (m_preset.bRealtime) { // args.append("-R"); if (m_preset.iPriority > 5 && !bCoreaudio) args.append("-P" + QString::number(m_preset.iPriority)); } else args.append("-r"); if (m_preset.iPortMax > 0 && m_preset.iPortMax != 256) args.append("-p" + QString::number(m_preset.iPortMax)); if (m_preset.iTimeout > 0 && m_preset.iTimeout != 500) args.append("-t" + QString::number(m_preset.iTimeout)); if (m_preset.bNoMemLock) args.append("-m"); else if (m_preset.bUnlockMem) args.append("-u"); args.append("-d" + m_preset.sDriver); if ((bAlsa || bPortaudio) && (m_preset.iAudio != QJACKCTL_DUPLEX || m_preset.sInDevice.isEmpty() || m_preset.sOutDevice.isEmpty())) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; if (!sInterface.isEmpty()) args.append("-d" + formatQuoted(sInterface)); } if (bPortaudio && m_preset.iChan > 0) args.append("-c" + QString::number(m_preset.iChan)); if ((bCoreaudio || bFreebob || bFirewire) && !m_preset.sInterface.isEmpty()) args.append("-d" + formatQuoted(m_preset.sInterface)); if (m_preset.iSampleRate > 0 && !bNet) args.append("-r" + QString::number(m_preset.iSampleRate)); if (m_preset.iFrames > 0 && !bNet) args.append("-p" + QString::number(m_preset.iFrames)); if (bAlsa || bSun || bOss || bFreebob || bFirewire) { if (m_preset.iPeriods > 0) args.append("-n" + QString::number(m_preset.iPeriods)); } if (bAlsa) { if (m_preset.bSoftMode) args.append("-s"); if (m_preset.bMonitor) args.append("-m"); if (m_preset.bShorts) args.append("-S"); if (m_preset.bHWMon) args.append("-H"); if (m_preset.bHWMeter) args.append("-M"); #ifdef CONFIG_JACK_MIDI if (!m_preset.sMidiDriver.isEmpty()) args.append("-X" + formatQuoted(m_preset.sMidiDriver)); #endif } if (bAlsa || bPortaudio) { switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: if (!m_preset.sInDevice.isEmpty() || !m_preset.sOutDevice.isEmpty()) args.append("-D"); if (!m_preset.sInDevice.isEmpty()) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty()) args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; case QJACKCTL_CAPTURE: args.append("-C" + formatQuoted(m_preset.sInDevice)); break; case QJACKCTL_PLAYBACK: args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; } if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); switch (m_preset.iDither) { case 0: // args.append("-z-"); break; case 1: args.append("-zr"); break; case 2: args.append("-zs"); break; case 3: args.append("-zt"); break; } } else if (bOss || bSun) { if (m_preset.bIgnoreHW) args.append("-b"); if (m_preset.iWordLength > 0) args.append("-w" + QString::number(m_preset.iWordLength)); if (!m_preset.sInDevice.isEmpty() && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty() && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-P" + formatQuoted(m_preset.sOutDevice)); if (m_preset.iAudio == QJACKCTL_PLAYBACK) args.append("-i0"); else if (m_preset.iInChannels > 0) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iAudio == QJACKCTL_CAPTURE) args.append("-o0"); else if (m_preset.iOutChannels > 0) args.append("-o" + QString::number(m_preset.iOutChannels)); } else if (bCoreaudio || bFirewire || bNet) { if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); } else if (bFreebob) { switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: args.append("-D"); break; case QJACKCTL_CAPTURE: args.append("-C"); args.append("-o0"); break; case QJACKCTL_PLAYBACK: args.append("-P"); args.append("-i0"); break; } } if (bDummy && m_preset.iWait > 0 && m_preset.iWait != 21333) args.append("-w" + QString::number(m_preset.iWait)); if (bAlsa || bSun || bOss || bCoreaudio || bPortaudio || bFreebob || bFirewire) { if (m_preset.iInLatency > 0) args.append("-I" + QString::number(m_preset.iInLatency)); if (m_preset.iOutLatency > 0) args.append("-O" + QString::number(m_preset.iOutLatency)); } // Split the server path into arguments... if (!m_preset.sServerSuffix.isEmpty()) args.append(m_preset.sServerSuffix.split(' ')); // This is emulated jackd command line, for future reference purposes... m_sJackCmdLine = sCommand + ' ' + args.join(" ").trimmed(); #ifdef CONFIG_DBUS // Jack D-BUS server backend startup method... if (m_pDBusControl) { // Jack D-BUS server backend configuration... setDBusParameters(); QDBusMessage dbusm = m_pDBusControl->call("StartServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { appendMessages( tr("D-BUS: JACK server is starting...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be started.\n\nSorry")); } // Delay our control client... startJackClientDelay(); } else { #endif // !CONFIG_DBUS // Jack classic server backend startup process... m_pJack = new QProcess(this); // Setup stdout/stderr capture... if (m_pSetup->bStdoutCapture) { #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) // QProcess::ForwardedChannels doesn't seem to work in windows. m_pJack->setProcessChannelMode(QProcess::MergedChannels); #else m_pJack->setProcessChannelMode(QProcess::ForwardedChannels); #endif QObject::connect(m_pJack, SIGNAL(readyReadStandardOutput()), SLOT(readStdout())); QObject::connect(m_pJack, SIGNAL(readyReadStandardError()), SLOT(readStdout())); } // The unforgiveable signal communication... QObject::connect(m_pJack, SIGNAL(started()), SLOT(jackStarted())); QObject::connect(m_pJack, SIGNAL(error(QProcess::ProcessError)), SLOT(jackError(QProcess::ProcessError))); QObject::connect(m_pJack, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(jackFinished())); appendMessages(tr("JACK is starting...")); appendMessagesColor(m_sJackCmdLine, "#990099"); #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) const QString& sCurrentDir = QFileInfo(sCommand).dir().absolutePath(); m_pJack->setWorkingDirectory(sCurrentDir); // QDir::setCurrent(sCurrentDir); #endif // Unquote arguments as necessary... const QChar q = '"'; QStringList cmd_args; QStringListIterator iter(args); while (iter.hasNext()) { const QString& arg = iter.next(); if (arg.contains(q)) { cmd_args.append(arg.section(q, 0, 0)); cmd_args.append(arg.section(q, 1, 1)); } else { cmd_args.append(arg); } } // Go jack, go... m_pJack->start(sCommand, cmd_args); #ifdef CONFIG_DBUS } #endif } // Stop jack audio server... void qjackctlMainForm::stopJack (void) { bool bQueryShutdown = true; // Check if we're allowed to stop (shutdown)... if (m_pSetup->bQueryShutdown && m_pConnectionsForm && (m_pConnectionsForm->isAudioConnected() || m_pConnectionsForm->isMidiConnected())) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Some client audio applications\n" "are still active and connected.\n\n" "Do you want to stop the JACK audio server?"); #if 0//QJACKCTL_QUERY_SHUTDOWN bQueryShutdown = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); bQueryShutdown = (mbox.exec() == QMessageBox::Ok); if (bQueryShutdown && cbox.isChecked()) m_pSetup->bQueryShutdown = false; #endif } // Stop the server unconditionally. if (bQueryShutdown) stopJackServer(); } // Stop jack audio server... void qjackctlMainForm::stopJackServer (void) { // Clear timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Stop client code. stopJackClient(); // And try to stop server. #ifdef CONFIG_DBUS if ((m_pJack && m_pJack->state() == QProcess::Running) || (m_pDBusControl && m_bDBusStarted)) { #else if (m_pJack && m_pJack->state() == QProcess::Running) { #endif updateServerState(QJACKCTL_STOPPING); // Do we have any pre-shutdown script?... if (m_pSetup->bShutdownScript && !m_pSetup->sShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sShutdownScriptShell, tr("Shutdown script..."), tr("Shutdown script terminated")); } // Now it's the time to real try stopping the server daemon... if (!m_bJackShutdown) { // Jack classic server backend... if (m_pJack) { appendMessages(tr("JACK is stopping...")); m_bJackStopped = true; #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) // Try harder... m_pJack->kill(); #else // Try softly... m_pJack->terminate(); #endif } #ifdef CONFIG_DBUS // Jack D-BUS server backend... if (m_pDBusControl) { QDBusMessage dbusm = m_pDBusControl->call("StopServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { appendMessages( tr("D-BUS: JACK server is stopping...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be stopped.\n\nSorry")); } } #endif // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); // Keep on, if not exiting for good. if (!m_bQuitForce) return; } } // Do final processing anyway. jackCleanup(); } void qjackctlMainForm::toggleJack (void) { if (m_pJackClient) stopJack(); else startJack(); } // Stdout handler... void qjackctlMainForm::readStdout (void) { appendStdoutBuffer(m_pJack->readAllStandardOutput()); } // Stdout buffer handler -- now splitted by complete new-lines... void qjackctlMainForm::appendStdoutBuffer ( const QString& s ) { m_sStdoutBuffer.append(s); const int iLength = m_sStdoutBuffer.lastIndexOf('\n'); if (iLength > 0) { QString sTemp = m_sStdoutBuffer.left(iLength); m_sStdoutBuffer.remove(0, iLength + 1); QStringList list = sTemp.split('\n'); QStringListIterator iter(list); while (iter.hasNext()) { sTemp = iter.next(); if (!sTemp.isEmpty()) #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) appendMessagesText(detectXrun(sTemp).trimmed()); #else appendMessagesText(detectXrun(sTemp)); #endif } } } // Stdout flusher -- show up any unfinished line... void qjackctlMainForm::flushStdoutBuffer (void) { if (!m_sStdoutBuffer.isEmpty()) { appendMessagesText(detectXrun(m_sStdoutBuffer)); m_sStdoutBuffer.clear(); } } // Jack audio server startup. void qjackctlMainForm::jackStarted (void) { // Show startup results... if (m_pJack) { appendMessages(tr("JACK was started with PID=%1.") .arg(quint64(m_pJack->pid()))); } #ifdef CONFIG_DBUS // Special for D-BUS control.... if (m_pDBusControl) { m_bDBusStarted = true; appendMessages(tr("D-BUS: JACK server was started (%1 aka jackdbus).") .arg(m_pDBusControl->service())); } #endif // Delay our control client... startJackClientDelay(); } // Jack audio server got an error. void qjackctlMainForm::jackError ( QProcess::ProcessError error ) { qjackctl_on_error(error); } // Jack audio server finish. void qjackctlMainForm::jackFinished (void) { // Force client code cleanup. if (!m_bJackShutdown) jackCleanup(); } // Jack audio server cleanup. void qjackctlMainForm::jackCleanup (void) { // Force client code cleanup. bool bPostShutdown = m_bJackDetach; if (!bPostShutdown) stopJackClient(); // Flush anything that maybe pending... flushStdoutBuffer(); // Classic server control... if (m_pJack) { if (m_pJack->state() != QProcess::NotRunning) { appendMessages(tr("JACK is being forced...")); // Force final server shutdown... m_pJack->kill(); // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); } // Force final server shutdown... appendMessages(tr("JACK was stopped")); // Destroy it. delete m_pJack; m_pJack = NULL; // Flag we need a post-shutdown script... bPostShutdown = true; } #ifdef CONFIG_DBUS // Special for D-BUS control... if (m_pDBusControl && m_bDBusStarted) { m_bDBusStarted = false; appendMessages(tr("D-BUS: JACK server was stopped (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Flag we need a post-shutdown script... bPostShutdown = true; } #endif // Cannot be detached anymore. m_bJackDetach = false; // Do we have any post-shutdown script?... // (this will be always called, despite we've started the server or not) if (bPostShutdown && m_pSetup->bPostShutdownScript && !m_pSetup->sPostShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostShutdownScriptShell, tr("Post-shutdown script..."), tr("Post-shutdown script terminated")); } // Reset server name. m_pSetup->sServerName.clear(); // Stabilize final server state... jackStabilize(); } // Stabilize server state... void qjackctlMainForm::jackStabilize (void) { QPalette pal; pal.setColor(QPalette::Foreground, m_pJackClient == NULL ? Qt::darkYellow : Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(m_pJackClient == NULL); m_ui.StopToolButton->setEnabled(m_pJackClient != NULL); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); int iServerState; if (m_bJackDetach) iServerState = (m_pJackClient ? QJACKCTL_ACTIVE : QJACKCTL_INACTIVE); else iServerState = QJACKCTL_STOPPED; updateServerState(iServerState); } // XRUN detection routine. QString& qjackctlMainForm::detectXrun ( QString& s ) { if (m_iXrunSkips > 1) return s; QRegExp rx(m_pSetup->sXrunRegex); int iPos = rx.indexIn(s); if (iPos >= 0) { s.insert(iPos + rx.matchedLength(), "
"); s.insert(iPos, ""); #ifndef CONFIG_JACK_XRUN_DELAY m_tXrunLast.restart(); updateXrunStats(rx.cap(1).toFloat()); refreshXrunStats(); #endif } return s; } // Update the XRUN last delay and immediate statistical values (in msecs). void qjackctlMainForm::updateXrunStats ( float fXrunLast ) { if (m_iXrunStats > 0) { m_fXrunLast = fXrunLast; m_fXrunTotal += m_fXrunLast; if (m_fXrunLast < m_fXrunMin || m_iXrunCount == 0) m_fXrunMin = m_fXrunLast; if (m_fXrunLast > m_fXrunMax || m_iXrunCount == 0) m_fXrunMax = m_fXrunLast; m_iXrunCount++; // refreshXrunStats(); } m_iXrunStats++; } // Set stdout/stderr blocking mode. bool qjackctlMainForm::stdoutBlock ( int fd, bool bBlock ) const { #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) const int iFlags = ::fcntl(fd, F_GETFL, 0); const bool bNonBlock = bool(iFlags & O_NONBLOCK); if (bBlock && bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags & ~O_NONBLOCK) == 0); else if (!bBlock && !bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags | O_NONBLOCK) != 0); #endif return bBlock; } // Own stdout/stderr socket notifier slot. void qjackctlMainForm::stdoutNotifySlot ( int fd ) { #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) // Set non-blocking reads, if not already... const bool bBlock = stdoutBlock(fd, false); // Read as much as is available... QString sTemp; char achBuffer[1024]; const int cchBuffer = sizeof(achBuffer) - 1; int cchRead = ::read(fd, achBuffer, cchBuffer); while (cchRead > 0) { achBuffer[cchRead] = (char) 0; sTemp.append(achBuffer); cchRead = (bBlock ? 0 : ::read(fd, achBuffer, cchBuffer)); } // Needs to be non-empty... if (!sTemp.isEmpty()) appendStdoutBuffer(sTemp); #endif } // Messages output methods. void qjackctlMainForm::appendMessages ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessages(s); } void qjackctlMainForm::appendMessagesColor ( const QString& s, const QString& c ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesColor(s, c); } void qjackctlMainForm::appendMessagesText ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesText(s); } void qjackctlMainForm::appendMessagesError ( const QString& s ) { if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); m_pMessagesStatusForm->show(); } appendMessagesColor(s.simplified(), "#ff0000"); const QString& sTitle = tr("Error") + " - " QJACKCTL_SUBTITLE1; #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) m_pSystemTray->showMessage(sTitle, s, QSystemTrayIcon::Critical); else #endif QMessageBox::critical(this, sTitle, s, QMessageBox::Cancel); } // Force update of the messages font. void qjackctlMainForm::updateMessagesFont (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm && !m_pSetup->sMessagesFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sMessagesFont)) m_pMessagesStatusForm->setMessagesFont(font); } } // Update messages window line limit. void qjackctlMainForm::updateMessagesLimit (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm) { if (m_pSetup->bMessagesLimit) m_pMessagesStatusForm->setMessagesLimit(m_pSetup->iMessagesLimitLines); else m_pMessagesStatusForm->setMessagesLimit(-1); } } // Update messages logging state. void qjackctlMainForm::updateMessagesLogging (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); } } // Force update of the connections font. void qjackctlMainForm::updateConnectionsFont (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm && !m_pSetup->sConnectionsFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sConnectionsFont)) m_pConnectionsForm->setConnectionsFont(font); } } // Update of the connections view icon size. void qjackctlMainForm::updateConnectionsIconSize (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm) m_pConnectionsForm->setConnectionsIconSize(m_pSetup->iConnectionsIconSize); } // Update of JACK client/port alias display mode. void qjackctlMainForm::updateJackClientPortAlias (void) { if (m_pSetup == NULL) return; qjackctlJackClientList::setJackClientPortAlias(m_pSetup->iJackClientPortAlias); refreshJackConnections(); } // Update of JACK client/port pretty-name (metadata) display mode. void qjackctlMainForm::updateJackClientPortMetadata (void) { if (m_pSetup == NULL) return; qjackctlJackClientList::setJackClientPortMetadata(m_pSetup->bJackClientPortMetadata); refreshJackConnections(); } // Update the connection and patchbay line style. void qjackctlMainForm::updateBezierLines (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm) { m_pConnectionsForm->audioConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->midiConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->alsaConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->audioConnectView()->connectorView()->update(); m_pConnectionsForm->midiConnectView()->connectorView()->update(); m_pConnectionsForm->alsaConnectView()->connectorView()->update(); } if (m_pPatchbayForm) { m_pPatchbayForm->patchbayView()->setBezierLines(m_pSetup->bBezierLines); m_pPatchbayForm->patchbayView()->PatchworkView()->update(); } } // Update main display background effect. void qjackctlMainForm::updateDisplayEffect (void) { if (m_pSetup == NULL) return; // Set the main background... QPalette pal; if (m_pSetup->bDisplayEffect) { QPixmap pm(":/images/displaybg1.png"); pal.setBrush(QPalette::Background, QBrush(pm)); } else { pal.setColor(QPalette::Background, Qt::black); } m_ui.StatusDisplayFrame->setPalette(pal); } // Force update of big time display related fonts. void qjackctlMainForm::updateTimeDisplayFonts (void) { QFont font; if (!m_pSetup->sDisplayFont1.isEmpty() && font.fromString(m_pSetup->sDisplayFont1)) m_ui.TimeDisplayTextLabel->setFont(font); if (!m_pSetup->sDisplayFont2.isEmpty() && font.fromString(m_pSetup->sDisplayFont2)) { m_ui.ServerStateTextLabel->setFont(font); m_ui.ServerModeTextLabel->setFont(font); m_ui.DspLoadTextLabel->setFont(font); m_ui.SampleRateTextLabel->setFont(font); m_ui.XrunCountTextLabel->setFont(font); m_ui.TransportStateTextLabel->setFont(font); m_ui.TransportBpmTextLabel->setFont(font); font.setBold(true); m_ui.TransportTimeTextLabel->setFont(font); } } // Force update of big time display related tooltips. void qjackctlMainForm::updateTimeDisplayToolTips (void) { QString sTimeDisplay = tr("Transport BBT (bar.beat.ticks)"); QString sTransportTime = tr("Transport time code"); switch (m_pSetup->iTimeDisplay) { case DISPLAY_TRANSPORT_TIME: { QString sTemp = sTimeDisplay; sTimeDisplay = sTransportTime; sTransportTime = sTemp; break; } case DISPLAY_RESET_TIME: sTimeDisplay = tr("Elapsed time since last reset"); break; case DISPLAY_XRUN_TIME: sTimeDisplay = tr("Elapsed time since last XRUN"); break; } m_ui.TimeDisplayTextLabel->setToolTip(sTimeDisplay); m_ui.TransportTimeTextLabel->setToolTip(sTransportTime); } // Force update of time format dependant stuff. void qjackctlMainForm::updateTimeFormat (void) { // Time dashes format helper. m_sTimeDashes = "--:--:--"; switch (m_pSetup->iTimeFormat) { case 1: // Tenths of second. m_sTimeDashes += ".-"; break; case 2: // Hundredths of second. m_sTimeDashes += ".--"; break; case 3: // Raw milliseconds m_sTimeDashes += ".---"; break; } } // Update the connections client/port aliases. void qjackctlMainForm::updateAliases (void) { if (m_pConnectionsForm) m_pConnectionsForm->updateAliases(); } // Update the main form buttons display. void qjackctlMainForm::updateButtons (void) { updateTitleStatus(); if (m_pSetup->bLeftButtons) { m_ui.StartToolButton->show(); m_ui.StopToolButton->show(); m_ui.MessagesStatusToolButton->show(); m_ui.SessionToolButton->show(); m_ui.ConnectionsToolButton->show(); m_ui.PatchbayToolButton->show(); } else { m_ui.StartToolButton->hide(); m_ui.StopToolButton->hide(); m_ui.MessagesStatusToolButton->hide(); m_ui.SessionToolButton->hide(); m_ui.ConnectionsToolButton->hide(); m_ui.PatchbayToolButton->hide(); } if (m_pSetup->bRightButtons) { m_ui.QuitToolButton->show(); m_ui.SetupToolButton->show(); } else { m_ui.QuitToolButton->hide(); m_ui.SetupToolButton->hide(); } if (m_pSetup->bRightButtons && (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons)) { m_ui.AboutToolButton->show(); } else { m_ui.AboutToolButton->hide(); } if (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons) { m_ui.RewindToolButton->show(); m_ui.BackwardToolButton->show(); m_ui.PlayToolButton->show(); m_ui.PauseToolButton->show(); m_ui.ForwardToolButton->show(); } else { m_ui.RewindToolButton->hide(); m_ui.BackwardToolButton->hide(); m_ui.PlayToolButton->hide(); m_ui.PauseToolButton->hide(); m_ui.ForwardToolButton->hide(); } Qt::ToolButtonStyle toolButtonStyle = (m_pSetup->bTextLabels ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly); m_ui.StartToolButton->setToolButtonStyle(toolButtonStyle); m_ui.StopToolButton->setToolButtonStyle(toolButtonStyle); m_ui.MessagesStatusToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SessionToolButton->setToolButtonStyle(toolButtonStyle); m_ui.ConnectionsToolButton->setToolButtonStyle(toolButtonStyle); m_ui.PatchbayToolButton->setToolButtonStyle(toolButtonStyle); m_ui.QuitToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SetupToolButton->setToolButtonStyle(toolButtonStyle); m_ui.AboutToolButton->setToolButtonStyle(toolButtonStyle); adjustSize(); } // Force update of active patchbay definition profile, if applicable. bool qjackctlMainForm::isActivePatchbay ( const QString& sPatchbayPath ) const { bool bActive = false; if (m_pSetup && m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) bActive = (m_pSetup->sActivePatchbayPath == sPatchbayPath); return bActive; } // Force update of active patchbay definition profile, if applicable. void qjackctlMainForm::updateActivePatchbay (void) { if (m_pSetup == NULL) return; // Time to load the active patchbay rack profiler? if (m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) { // Check whether to reset/disconect-all on patchbay activation... if (m_pSetup->bActivePatchbayReset) { if (m_pJackClient) { m_pPatchbayRack->disconnectAllJackPorts(m_pJackClient); m_iJackRefresh = 0; } if (m_pAlsaSeq) { m_pPatchbayRack->disconnectAllAlsaPorts(m_pAlsaSeq); m_iAlsaRefresh = 0; } appendMessages(tr("Patchbay reset.")); } // Load/activate patchbay-rack... const QFileInfo fi(m_pSetup->sActivePatchbayPath); if (fi.isRelative()) m_pSetup->sActivePatchbayPath = fi.absoluteFilePath(); if (!qjackctlPatchbayFile::load(m_pPatchbayRack, m_pSetup->sActivePatchbayPath)) { appendMessagesError( tr("Could not load active patchbay definition.\n\n\"%1\"\n\nDisabled.") .arg(m_pSetup->sActivePatchbayPath)); m_pSetup->bActivePatchbay = false; } else { appendMessages(tr("Patchbay activated.")); // If we're up and running, make it dirty :) if (m_pJackClient) m_iJackDirty++; if (m_pAlsaSeq) m_iAlsaDirty++; } } // We're sure there's no active patchbay... else appendMessages(tr("Patchbay deactivated.")); // Should refresh anyway. m_iPatchbayRefresh++; } // Toggle active patchbay setting. void qjackctlMainForm::setActivePatchbay ( const QString& sPatchbayPath ) { if (m_pSetup == NULL) return; if (sPatchbayPath.isEmpty()) { m_pSetup->bActivePatchbay = false; } else { m_pSetup->bActivePatchbay = true; m_pSetup->sActivePatchbayPath = sPatchbayPath; } updateActivePatchbay(); } // Reset the MRU patchbay list. void qjackctlMainForm::setRecentPatchbays ( const QStringList& patchbays ) { m_pSetup->patchbays = patchbays; } // Stabilize current form toggle buttons that may be astray. void qjackctlMainForm::stabilizeForm (void) { m_ui.MessagesStatusToolButton->setChecked( m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible()); m_ui.SessionToolButton->setChecked( m_pSessionForm && m_pSessionForm->isVisible()); m_ui.ConnectionsToolButton->setChecked( m_pConnectionsForm && m_pConnectionsForm->isVisible()); m_ui.PatchbayToolButton->setChecked( m_pPatchbayForm && m_pPatchbayForm->isVisible()); m_ui.SetupToolButton->setChecked( m_pSetupForm && m_pSetupForm->isVisible()); } // Stabilize current business over the application event loop. void qjackctlMainForm::stabilize ( int msecs ) { QTime t; t.start(); while (t.elapsed() < msecs) QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } // Reset XRUN cache items. void qjackctlMainForm::resetXrunStats (void) { m_tResetLast = QTime::currentTime(); m_iXrunStats = 0; m_iXrunCount = 0; m_fXrunTotal = 0.0f; m_fXrunMin = 0.0f; m_fXrunMax = 0.0f; m_fXrunLast = 0.0f; m_tXrunLast.setHMS(0, 0, 0); m_iXrunCallbacks = 0; m_iXrunSkips = 0; #ifdef CONFIG_JACK_MAX_DELAY if (m_pJackClient) jack_reset_max_delayed_usecs(m_pJackClient); #endif refreshXrunStats(); appendMessages(tr("Statistics reset.")); // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } // Update the XRUN count/callbacks item. void qjackctlMainForm::updateXrunCount (void) { // We'll change XRUN status colors here! QColor color = (m_pJackClient ? Qt::green : Qt::darkGreen); if ((m_iXrunCount + m_iXrunCallbacks) > 0) { if (m_iXrunCallbacks > 0) color = (m_pJackClient ? Qt::red : Qt::darkRed); else color = (m_pJackClient ? Qt::yellow : Qt::darkYellow); #ifdef CONFIG_SYSTEM_TRAY // Change the system tray icon background color! if (m_pSystemTray) m_pSystemTray->setBackground(color); } // Reset the system tray icon background! else if (m_pSystemTray) m_pSystemTray->setBackground(Qt::transparent); #else } #endif QPalette pal; pal.setColor(QPalette::Foreground, color); m_ui.XrunCountTextLabel->setPalette(pal); QString sText = QString::number(m_iXrunCount); sText += " ("; sText += QString::number(m_iXrunCallbacks); sText += ")"; updateStatusItem(STATUS_XRUN_COUNT, sText); } // Convert whole elapsed seconds to hh:mm:ss time format. QString qjackctlMainForm::formatTime ( float secs ) const { unsigned int hh, mm, ss; hh = mm = ss = 0; if (secs >= 3600.0f) { hh = (unsigned int) (secs / 3600.0f); secs -= (float) hh * 3600.0f; } if (secs >= 60.0f) { mm = (unsigned int) (secs / 60.0f); secs -= (float) mm * 60.0f; } if (secs >= 0.0) { ss = (unsigned int) secs; secs -= (float) ss; } QString sTemp; switch (m_pSetup->iTimeFormat) { case 1: // Tenths of second. sTemp.sprintf("%02u:%02u:%02u.%u", hh, mm, ss, (unsigned int) (secs * 10.0f)); break; case 2: // Hundredths of second. sTemp.sprintf("%02u:%02u:%02u.%02u", hh, mm, ss, (unsigned int) (secs * 100.0f)); break; case 3: // Raw milliseconds sTemp.sprintf("%02u:%02u:%02u.%03u", hh, mm, ss, (unsigned int) (secs * 1000.0f)); break; default: // No second decimation. sTemp.sprintf("%02u:%02u:%02u", hh, mm, ss); break; } return sTemp; } // Update the XRUN last/elapsed time item. QString qjackctlMainForm::formatElapsedTime ( int iStatusItem, const QTime& t, bool bElapsed ) const { QString sTemp = m_sTimeDashes; QString sText; // Compute and format elapsed time. if (t.isNull()) { sText = sTemp; } else { sText = t.toString(); if (m_pJackClient) { float secs = float(t.elapsed()) / 1000.0f; if (bElapsed && secs > 0) { sTemp = formatTime(secs); sText += " (" + sTemp + ")"; } } } // Display elapsed time as big time? if ((iStatusItem == STATUS_RESET_TIME && m_pSetup->iTimeDisplay == DISPLAY_RESET_TIME) || (iStatusItem == STATUS_XRUN_TIME && m_pSetup->iTimeDisplay == DISPLAY_XRUN_TIME)) { m_ui.TimeDisplayTextLabel->setText(sTemp); } return sText; } // Update the XRUN last/elapsed time item. void qjackctlMainForm::updateElapsedTimes (void) { // Display time remaining on start delay... if (m_iTimerDelay < m_iStartDelay) m_ui.TimeDisplayTextLabel->setText(formatTime( float(m_iStartDelay - m_iTimerDelay) / 1000.0f)); else { updateStatusItem(STATUS_RESET_TIME, formatElapsedTime(STATUS_RESET_TIME, m_tResetLast, true)); updateStatusItem(STATUS_XRUN_TIME, formatElapsedTime(STATUS_XRUN_TIME, m_tXrunLast, ((m_iXrunCount + m_iXrunCallbacks) > 0))); } } // Update the XRUN list view items. void qjackctlMainForm::refreshXrunStats (void) { updateXrunCount(); if (m_fXrunTotal < 0.001f) { const QString n = "--"; updateStatusItem(STATUS_XRUN_TOTAL, n); updateStatusItem(STATUS_XRUN_MIN, n); updateStatusItem(STATUS_XRUN_MAX, n); updateStatusItem(STATUS_XRUN_AVG, n); updateStatusItem(STATUS_XRUN_LAST, n); } else { float fXrunAverage = 0.0f; if (m_iXrunCount > 0) fXrunAverage = (m_fXrunTotal / m_iXrunCount); const QString s = " " + tr("msec"); updateStatusItem(STATUS_XRUN_TOTAL, QString::number(m_fXrunTotal) + s); updateStatusItem(STATUS_XRUN_MIN, QString::number(m_fXrunMin) + s); updateStatusItem(STATUS_XRUN_MAX, QString::number(m_fXrunMax) + s); updateStatusItem(STATUS_XRUN_AVG, QString::number(fXrunAverage) + s); updateStatusItem(STATUS_XRUN_LAST, QString::number(m_fXrunLast) + s); } updateElapsedTimes(); } // Jack port/graph change event notifier. void qjackctlMainForm::portNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK connection graph change."), "#cc9966"); // Do what has to be done. refreshJackConnections(); // We'll be dirty too... m_iJackDirty++; } // Jack XRUN event notifier. void qjackctlMainForm::xrunNotifyEvent (void) { // Just increment callback counter. m_iXrunCallbacks++; // Skip this one? Maybe we're under some kind of storm... m_iXrunSkips++; // Report rate must be under one second... if (m_tXrunLast.restart() < 1000) return; #ifdef CONFIG_JACK_XRUN_DELAY // We have an official XRUN delay value (convert usecs to msecs)... updateXrunStats(0.001f * jack_get_xrun_delayed_usecs(m_pJackClient)); #endif // Just log this single event... appendMessagesColor(tr("XRUN callback (%1).") .arg(m_iXrunCallbacks), "#cc66cc"); } // Jack buffer size event notifier. void qjackctlMainForm::buffNotifyEvent (void) { // Don't need to nothing, it was handled on qjackctl_buffer_size_callback; // just log this event as routine. appendMessagesColor(tr("Buffer size change (%1).") .arg((int) g_nframes), "#996633"); } // Jack shutdown event notifier. void qjackctlMainForm::shutNotifyEvent (void) { // Log this event. appendMessagesColor(tr("Shutdown notification."), "#cc6666"); // SHUTDOWN: JACK client handle might not be valid anymore... m_bJackShutdown = true; // m_pJackClient = NULL; // Do what has to be done. stopJackServer(); } // Process exit event notifier. void qjackctlMainForm::exitNotifyEvent (void) { // Poor-mans read, copy, update (RCU) QProcess::ProcessError error = g_error; g_error = QProcess::UnknownError; switch (error) { case QProcess::FailedToStart: appendMessagesError(tr("Could not start JACK.\n\nSorry.")); jackFinished(); break; case QProcess::Crashed: #if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) if (!m_bJackStopped) #endif appendMessagesColor(tr("JACK has crashed."), "#cc3366"); break; case QProcess::Timedout: appendMessagesColor(tr("JACK timed out."), "#cc3366"); break; case QProcess::WriteError: appendMessagesColor(tr("JACK write error."), "#cc3366"); break; case QProcess::ReadError: appendMessagesColor(tr("JACK read error."), "#cc3366"); break; case QProcess::UnknownError: default: appendMessagesColor(tr("Unknown JACK error (%d).") .arg(int(error)), "#990099"); break; } } #ifdef CONFIG_JACK_METADATA // Jack property (metadata) event notifier. void qjackctlMainForm::propNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK property change."), "#993366"); // Special refresh mode... m_iJackPropertyChange++; // Do what has to be done. refreshJackConnections(); // We'll be dirty too... m_iJackDirty++; } #endif // ALSA announce slot. void qjackctlMainForm::alsaNotifySlot ( int /*fd*/ ) { #ifdef CONFIG_ALSA_SEQ snd_seq_event_t *pAlsaEvent; snd_seq_event_input(m_pAlsaSeq, &pAlsaEvent); snd_seq_free_event(pAlsaEvent); #endif // Log some message here, if new. if (m_iAlsaRefresh == 0) appendMessagesColor(tr("ALSA connection graph change."), "#66cc99"); // Do what has to be done. refreshAlsaConnections(); // We'll be dirty too... m_iAlsaDirty++; } // Timer callback funtion. void qjackctlMainForm::timerSlot (void) { // Is it the first shot on server start after a few delay? if (m_iTimerDelay < m_iStartDelay) { m_iTimerDelay += QJACKCTL_TIMER_MSECS; if (m_iTimerDelay >= m_iStartDelay) { // If we cannot start it now, // maybe we ought to cease & desist... if (!startJackClient(false)) stopJackServer(); } } // Is the connection patchbay dirty enough? if (m_pConnectionsForm) { const QString sEllipsis = "..."; // Are we about to enforce an audio connections persistence profile? if (m_iJackDirty > 0) { m_iJackDirty = 0; if (m_pSessionForm) m_pSessionForm->updateSession(); if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("JACK active patchbay scan") + sEllipsis, "#6699cc"); m_pPatchbayRack->connectJackScan(m_pJackClient); } refreshJackConnections(); } // Or is it from the MIDI field? if (m_iAlsaDirty > 0) { m_iAlsaDirty = 0; if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("ALSA active patchbay scan") + sEllipsis, "#99cc66"); m_pPatchbayRack->connectAlsaScan(m_pAlsaSeq); } refreshAlsaConnections(); } // Are we about to refresh it, really? if (m_iJackRefresh > 0 && m_pJackClient != NULL) { m_iJackRefresh = 0; #ifdef CONFIG_JACK_METADATA const bool bClear = (m_iJackPropertyChange > 0); m_iJackPropertyChange = 0; m_pConnectionsForm->refreshAudio(true, bClear); m_pConnectionsForm->refreshMidi(true, bClear); #else m_pConnectionsForm->refreshAudio(true); m_pConnectionsForm->refreshMidi(true); #endif } if (m_iAlsaRefresh > 0 && m_pAlsaSeq != NULL) { m_iAlsaRefresh = 0; m_pConnectionsForm->refreshAlsa(true); } } // Is the patchbay dirty enough? if (m_pPatchbayForm && m_iPatchbayRefresh > 0) { m_iPatchbayRefresh = 0; m_pPatchbayForm->refreshForm(); } // Update some statistical fields, directly. refreshStatus(); // Register the next timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); } // JACK connection notification slot. void qjackctlMainForm::jackConnectChanged (void) { // Just shake the audio connections status quo. if (++m_iJackDirty == 1) appendMessagesColor(tr("JACK connection change."), "#9999cc"); } // ALSA connection notification slot. void qjackctlMainForm::alsaConnectChanged (void) { // Just shake the MIDI connections status quo. if (++m_iAlsaDirty == 1) appendMessagesColor(tr("ALSA connection change."), "#cccc99"); } // Cable connection notification slot. void qjackctlMainForm::cableConnectSlot ( const QString& sOutputPort, const QString& sInputPort, unsigned int ulCableFlags ) { QString sText = QFileInfo(m_pSetup->sActivePatchbayPath).baseName() + ": "; QString sColor; sText += sOutputPort; sText += " -> "; sText += sInputPort; sText += " "; switch (ulCableFlags) { case QJACKCTL_CABLE_CHECKED: sText += tr("checked"); sColor = "#99cccc"; break; case QJACKCTL_CABLE_CONNECTED: sText += tr("connected"); sColor = "#669999"; break; case QJACKCTL_CABLE_DISCONNECTED: sText += tr("disconnected"); sColor = "#cc9999"; break; case QJACKCTL_CABLE_FAILED: default: sText += tr("failed"); sColor = "#cc6699"; break; } appendMessagesColor(sText + '.', sColor); } // Patchbay (dis)connection slot. void qjackctlMainForm::queryDisconnect ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType ) { if (m_pSetup->bActivePatchbay && m_pSetup->bQueryDisconnect) { qjackctlPatchbayCable *pCable = m_pPatchbayRack->findCable( pOPort->clientName(), pOPort->portName(), pIPort->clientName(), pIPort->portName(), iSocketType); if (pCable) { bool bQueryDisconnect = true; const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("A patchbay definition is currently active,\n" "which is probable to redo this connection:\n\n" "%1 -> %2\n\n" "Do you want to remove the patchbay connection?") .arg(pCable->outputSocket()->name()) .arg(pCable->inputSocket()->name()); #if 0//QJACKCTL_QUERY_DISCONNECT bQueryDisconnect = (QMessageBox::warning(this, sTitle, Text, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryDisconnect = (mbox.exec() == QMessageBox::Ok); if (bQueryDisconnect && cbox.isChecked()) m_pSetup->bQueryDisconnect = false; #endif if (bQueryDisconnect) m_pPatchbayRack->removeCable(pCable); } // Refresh patchbay form anyway... if (m_pPatchbayForm && isActivePatchbay(m_pPatchbayForm->patchbayPath())) m_pPatchbayForm->loadPatchbayRack(m_pPatchbayRack); } } // Delay jack control client start... void qjackctlMainForm::startJackClientDelay (void) { // Sloppy boy fix: may the serve be stopped, just in case // the client will nerver make it... m_ui.StopToolButton->setEnabled(true); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Reset (yet again) the timer counters... m_iStartDelay = 1 + (m_preset.iStartDelay * 1000); m_iTimerDelay = 0; m_iJackRefresh = 0; } // Start our jack audio control client... bool qjackctlMainForm::startJackClient ( bool bDetach ) { // If can't be already started, are we? if (m_pJackClient) return true; // Have it a setup? if (m_pSetup == NULL) return false; // Time to (re)load current preset aliases? if (m_pConnectionsForm && !m_pConnectionsForm->loadAliases()) return false; // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Are we about to start detached? if (bDetach) { // To fool timed client initialization delay. m_iTimerDelay += (m_iStartDelay + 1); // Refresh status (with dashes?) refreshStatus(); } // Create the jack client handle, using a distinct identifier (PID?) const char *pszClientName = "qjackctl"; jack_status_t status = JackFailure; if (m_pSetup->sServerName.isEmpty()) { m_pJackClient = jack_client_open(pszClientName, JackNoStartServer, &status); } else { m_pJackClient = jack_client_open(pszClientName, jack_options_t(JackNoStartServer | JackServerName), &status, m_pSetup->sServerName.toUtf8().constData()); } if (m_pJackClient == NULL) { if (!bDetach) { QStringList errs; if (status & JackFailure) errs << tr("Overall operation failed."); if (status & JackInvalidOption) errs << tr("Invalid or unsupported option."); if (status & JackNameNotUnique) errs << tr("Client name not unique."); if (status & JackServerStarted) errs << tr("Server is started."); if (status & JackServerFailed) errs << tr("Unable to connect to server."); if (status & JackServerError) errs << tr("Server communication error."); if (status & JackNoSuchClient) errs << tr("Client does not exist."); if (status & JackLoadFailure) errs << tr("Unable to load internal client."); if (status & JackInitFailure) errs << tr("Unable to initialize client."); if (status & JackShmFailure) errs << tr("Unable to access shared memory."); if (status & JackVersionError) errs << tr("Client protocol version mismatch."); appendMessagesError( tr("Could not connect to JACK server as client.\n" "- %1\nPlease check the messages window for more info.") .arg(errs.join("\n- "))); } return false; } // Set notification callbacks. jack_set_graph_order_callback(m_pJackClient, qjackctl_graph_order_callback, this); jack_set_port_registration_callback(m_pJackClient, qjackctl_port_registration_callback, this); jack_set_xrun_callback(m_pJackClient, qjackctl_xrun_callback, this); jack_set_buffer_size_callback(m_pJackClient, qjackctl_buffer_size_callback, this); jack_on_shutdown(m_pJackClient, qjackctl_on_shutdown, this); #ifdef CONFIG_JACK_METADATA jack_set_property_change_callback(m_pJackClient, qjackctl_property_change_callback, this); #endif // First knowledge about buffer size. g_nframes = jack_get_buffer_size(m_pJackClient); // Reconstruct our connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(true); m_pConnectionsForm->stabilizeMidi(true); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(true); // Save server configuration file. if (m_pSetup->bServerConfig && !m_sJackCmdLine.isEmpty()) { QString sJackCmdLine = m_sJackCmdLine; if (m_pSetup->bServerConfigTemp) { int iPos = sJackCmdLine.indexOf(' '); if (iPos > 0) sJackCmdLine = sJackCmdLine.insert(iPos, " -T"); } QString sFilename = ::getenv("HOME"); sFilename += '/' + m_pSetup->sServerConfigName; QFile file(sFilename); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QTextStream(&file) << sJackCmdLine << endl; file.close(); appendMessagesColor( tr("Server configuration saved to \"%1\".") .arg(sFilename), "#999933"); } } // Do not forget to reset XRUN stats variables. if (!bDetach) resetXrunStats(); else // We'll flag that we've been detached! m_bJackDetach = true; // Activate us as a client... jack_activate(m_pJackClient); // All displays are highlighted from now on. QPalette pal; pal.setColor(QPalette::Foreground, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.ServerModeTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::darkYellow); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::green); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Whether we've started detached, just change active status. updateServerState(m_bJackDetach ? QJACKCTL_ACTIVE : QJACKCTL_STARTED); m_ui.StopToolButton->setEnabled(true); // Log success here. appendMessages(tr("Client activated.")); // Formal patchbay activation, if any, is in order... updateActivePatchbay(); // Do we have any post-startup scripting?... // (only if we're not a detached client) if (!bDetach && !m_bJackDetach) { if (m_pSetup->bPostStartupScript && !m_pSetup->sPostStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostStartupScriptShell, tr("Post-startup script..."), tr("Post-startup script terminated")); } } // Have we an initial command-line to start away? if (!m_pSetup->sCmdLine.isEmpty()) { // Run it dettached... shellExecute(m_pSetup->sCmdLine, tr("Command line argument..."), tr("Command line argument started")); // And reset it forever more... m_pSetup->sCmdLine.clear(); } // Remember to schedule an initial connection refreshment. refreshConnections(); // OK, we're at it! return true; } // Stop jack audio client... void qjackctlMainForm::stopJackClient (void) { // Deactivate and close us as a client... if (m_pJackClient) { jack_deactivate(m_pJackClient); jack_client_close(m_pJackClient); m_pJackClient = NULL; // Log deactivation here. appendMessages(tr("Client deactivated.")); } // Reset command-line configuration info. m_sJackCmdLine.clear(); // Clear out the connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(false); // Displays are dimmed again. QPalette pal; pal.setColor(QPalette::Foreground, Qt::darkYellow); m_ui.ServerModeTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::darkGreen); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Refresh jack client statistics explicitly. refreshXrunStats(); } // JACK client accessor. jack_client_t *qjackctlMainForm::jackClient (void) const { return (m_bJackShutdown ? NULL : m_pJackClient); } // ALSA sequencer client accessor. snd_seq_t *qjackctlMainForm::alsaSeq (void) const { return m_pAlsaSeq; } // Rebuild all patchbay items. void qjackctlMainForm::refreshConnections (void) { refreshJackConnections(); refreshAlsaConnections(); } void qjackctlMainForm::refreshJackConnections (void) { #if 0 // Hack this as for a while... if (m_pConnectionsForm && m_iJackRefresh == 0) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iJackRefresh++; } void qjackctlMainForm::refreshAlsaConnections (void) { #if 0 // Hack this as for a while... if (m_pConnectionsForm && m_iAlsaRefresh == 0) m_pConnectionsForm->stabilizeAlsa(false); #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iAlsaRefresh++; } void qjackctlMainForm::refreshPatchbay (void) { // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iPatchbayRefresh++; } // Main form visibility requester slot. void qjackctlMainForm::toggleMainForm (void) { m_pSetup->saveWidgetGeometry(this, true); if (isVisible()) { #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray) { // Hide away from sight, if not active... if (isActiveWindow()) { hide(); } else { raise(); activateWindow(); } } else #endif // Minimize (iconify) normally. showMinimized(); } else { show(); raise(); activateWindow(); } } // Message log/status form requester slot. void qjackctlMainForm::toggleMessagesStatusForm (void) { if (m_pMessagesStatusForm) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); if (m_pMessagesStatusForm->isVisible()) { m_pMessagesStatusForm->hide(); } else { m_pMessagesStatusForm->show(); m_pMessagesStatusForm->raise(); m_pMessagesStatusForm->activateWindow(); } } } void qjackctlMainForm::toggleMessagesForm (void) { if (m_pMessagesStatusForm) { int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } void qjackctlMainForm::toggleStatusForm (void) { if (m_pMessagesStatusForm) { int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::StatusTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } // Session form requester slot. void qjackctlMainForm::toggleSessionForm (void) { if (m_pSessionForm) { m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSessionForm->stabilizeForm(m_pJackClient != NULL); if (m_pSessionForm->isVisible()) { m_pSessionForm->hide(); } else { m_pSessionForm->show(); m_pSessionForm->raise(); m_pSessionForm->activateWindow(); } } } // Connections form requester slot. void qjackctlMainForm::toggleConnectionsForm (void) { if (m_pConnectionsForm) { m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pConnectionsForm->stabilizeAudio(m_pJackClient != NULL); m_pConnectionsForm->stabilizeMidi(m_pJackClient != NULL); m_pConnectionsForm->stabilizeAlsa(m_pAlsaSeq != NULL); if (m_pConnectionsForm->isVisible()) { m_pConnectionsForm->hide(); } else { m_pConnectionsForm->show(); m_pConnectionsForm->raise(); m_pConnectionsForm->activateWindow(); } } } // Patchbay form requester slot. void qjackctlMainForm::togglePatchbayForm (void) { if (m_pPatchbayForm) { m_pSetup->saveWidgetGeometry(m_pPatchbayForm); if (m_pPatchbayForm->isVisible()) { m_pPatchbayForm->hide(); } else { m_pPatchbayForm->show(); m_pPatchbayForm->raise(); m_pPatchbayForm->activateWindow(); } } } // Setup dialog requester slot. void qjackctlMainForm::showSetupForm (void) { if (m_pSetupForm) { // m_pSetup->saveWidgetGeometry(m_pSetupForm); if (m_pSetupForm->isVisible()) { m_pSetupForm->hide(); } else { m_pSetupForm->show(); m_pSetupForm->raise(); m_pSetupForm->activateWindow(); } } } // About dialog requester slot. void qjackctlMainForm::showAboutForm (void) { qjackctlAboutForm(this).exec(); } // Transport rewind. void qjackctlMainForm::transportRewind (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_locate(m_pJackClient, 0); // Log this here. appendMessages(tr("Transport rewind.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport backward. void qjackctlMainForm::transportBackward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) - m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here (if on initial toggle). if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport backward.")); // Take care of backward acceleration... if (m_ui.BackwardToolButton->isDown() && m_fSkipAccel < 60.0) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport toggle (start/stop) void qjackctlMainForm::transportPlay ( bool bOn ) { if (m_iTransportPlay > 0) return; if (bOn) transportStart(); else transportStop(); } // Transport start (play) void qjackctlMainForm::transportStart (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_start(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Starting")); // Log this here. appendMessages(tr("Transport start.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport stop (pause). void qjackctlMainForm::transportStop (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_stop(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Stopping")); // Log this here. appendMessages(tr("Transport stop.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport forward. void qjackctlMainForm::transportForward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) + m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here. if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport forward.")); // Take care of forward acceleration... if (m_ui.ForwardToolButton->isDown() && m_fSkipAccel < 60.0f) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Almost-complete running status refresher. void qjackctlMainForm::refreshStatus (void) { const QString n = "--"; const QString b = "-.-.---"; const QString sStopped = tr("Stopped"); m_iStatusRefresh++; if (m_pJackClient) { const QString s = " "; #ifdef CONFIG_JACK_TRANSPORT QString sText = n; jack_position_t tpos; jack_transport_state_t tstate = jack_transport_query(m_pJackClient, &tpos); const bool bPlaying = (tstate == JackTransportRolling || tstate == JackTransportLooping); // Transport timecode position. // if (bPlaying) updateStatusItem(STATUS_TRANSPORT_TIME, formatTime(float(tpos.frame) / float(tpos.frame_rate))); // else // updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); // Transport barcode position (bar:beat.tick) if (tpos.valid & JackPositionBBT) { updateStatusItem(STATUS_TRANSPORT_BBT, QString().sprintf("%u.%u.%03u", tpos.bar, tpos.beat, tpos.tick)); updateStatusItem(STATUS_TRANSPORT_BPM, QString::number(tpos.beats_per_minute, 'g', 4)); } else { updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); } #endif // !CONFIG_JACK_TRANSPORT // Less frequent status items update... if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; const float fDspLoad = jack_cpu_load(m_pJackClient); const char f = (fDspLoad > 0.1f ? 'f' : 'g'); // format const int p = (fDspLoad > 1.0f ? 1 : 2 ); // precision #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { if (m_iXrunCount > 0) { m_pSystemTray->setToolTip(tr("%1 (%2%)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p)); } else { m_pSystemTray->setToolTip(tr("%1 (%2%, %3 xruns)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p) .arg(m_iXrunCount)); } } #endif updateStatusItem(STATUS_DSP_LOAD, tr("%1 %").arg(fDspLoad, 0, f, p)); updateStatusItem(STATUS_SAMPLE_RATE, tr("%1 Hz").arg(jack_get_sample_rate(m_pJackClient))); updateStatusItem(STATUS_BUFFER_SIZE, tr("%1 frames").arg(g_nframes)); // Blink server mode indicator?... if (m_pSetup && m_pSetup->bDisplayBlink) { QPalette pal; pal.setColor(QPalette::Foreground, (++m_iStatusBlink % 2) ? Qt::darkYellow: Qt::yellow); m_ui.ServerModeTextLabel->setPalette(pal); } #ifdef CONFIG_JACK_REALTIME const bool bRealtime = jack_is_realtime(m_pJackClient); updateStatusItem(STATUS_REALTIME, (bRealtime ? tr("Yes") : tr("No"))); m_ui.ServerModeTextLabel->setText(bRealtime ? tr("RT") : n); #else updateStatusItem(STATUS_REALTIME, n); m_ui.ServerModeTextLabel->setText(n); #endif // !CONFIG_JACK_REALTIME #ifdef CONFIG_JACK_TRANSPORT switch (tstate) { case JackTransportStarting: sText = tr("Starting"); break; case JackTransportRolling: sText = tr("Rolling"); break; case JackTransportLooping: sText = tr("Looping"); break; case JackTransportStopped: default: sText = sStopped; break; } updateStatusItem(STATUS_TRANSPORT_STATE, sText); m_ui.RewindToolButton->setEnabled(tpos.frame > 0); m_ui.BackwardToolButton->setEnabled(tpos.frame > 0); m_ui.PlayToolButton->setEnabled(true); m_ui.PauseToolButton->setEnabled(bPlaying); m_ui.ForwardToolButton->setEnabled(true); transportPlayStatus(bPlaying); if (!m_ui.BackwardToolButton->isDown() && !m_ui.ForwardToolButton->isDown()) m_fSkipAccel = 1.0; #else updateStatusItem(STATUS_TRANSPORT_STATE, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); #endif // !CONFIG_JACK_TRANSPORT #ifdef CONFIG_JACK_MAX_DELAY updateStatusItem(STATUS_MAX_DELAY, tr("%1 msec") .arg(0.001f * jack_get_max_delayed_usecs(m_pJackClient))); #endif // Check if we're have some XRUNs to report... if (m_iXrunSkips > 0) { // Maybe we've skipped some... if (m_iXrunSkips > 1) { appendMessagesColor(tr("XRUN callback (%1 skipped).") .arg(m_iXrunSkips - 1), "#cc99cc"); } // Reset skip count. m_iXrunSkips = 0; // Highlight the (new) status... refreshXrunStats(); } } #ifdef CONFIG_SYSTEM_TRAY // XRUN: blink the system-tray icon backgroung... if (m_pSystemTray && m_iXrunCallbacks > 0 && m_pSetup && m_pSetup->bDisplayBlink) { const int iElapsed = m_tXrunLast.elapsed(); if (iElapsed > 0x7ff) { // T=2048ms. QColor color(m_pSystemTray->background()); color.setAlpha(0x0ff - ((iElapsed >> 3) & 0x0ff)); m_pSystemTray->setBackground(color); } } #endif } // No need to update often if we're just idle... else if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; updateStatusItem(STATUS_DSP_LOAD, n); updateStatusItem(STATUS_SAMPLE_RATE, n); updateStatusItem(STATUS_BUFFER_SIZE, n); updateStatusItem(STATUS_REALTIME, n); m_ui.ServerModeTextLabel->setText(n); updateStatusItem(STATUS_TRANSPORT_STATE, n); updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); } // Elapsed times should be rigorous... updateElapsedTimes(); } // Status item updater. void qjackctlMainForm::updateStatusItem( int iStatusItem, const QString& sText ) { switch (iStatusItem) { case STATUS_SERVER_STATE: m_ui.ServerStateTextLabel->setText(sText); break; case STATUS_DSP_LOAD: m_ui.DspLoadTextLabel->setText(sText); break; case STATUS_SAMPLE_RATE: m_ui.SampleRateTextLabel->setText(sText); break; case STATUS_XRUN_COUNT: m_ui.XrunCountTextLabel->setText(sText); break; case STATUS_TRANSPORT_STATE: m_ui.TransportStateTextLabel->setText(sText); break; case STATUS_TRANSPORT_TIME: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TimeDisplayTextLabel->setText(sText); else m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BBT: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_BBT) m_ui.TimeDisplayTextLabel->setText(sText); else if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BPM: m_ui.TransportBpmTextLabel->setText(sText); break; } if (m_pMessagesStatusForm) m_pMessagesStatusForm->updateStatusItem(iStatusItem, sText); } // Main window caption title and system tray icon and tooltip update. void qjackctlMainForm::updateTitleStatus (void) { QString sTitle; if (!m_pSetup->bLeftButtons || !m_pSetup->bRightButtons || !m_pSetup->bTextLabels) { sTitle = QJACKCTL_SUBTITLE0; } else { sTitle = QJACKCTL_SUBTITLE1; } sTitle += " [" + m_pSetup->sDefPreset + "] "; QString sState; QString sDots = "."; const QString s = ".."; switch (m_iServerState) { case QJACKCTL_STARTING: sState = tr("Starting"); sDots += s; break; case QJACKCTL_STARTED: sState = tr("Started"); break; case QJACKCTL_STOPPING: sState = tr("Stopping"); sDots += s; break; case QJACKCTL_STOPPED: sState = tr("Stopped"); break; case QJACKCTL_ACTIVE: sState = tr("Active"); break; case QJACKCTL_ACTIVATING: sState = tr("Activating"); sDots += s; break; case QJACKCTL_INACTIVE: default: sState = tr("Inactive"); break; } sTitle += sState + sDots; setWindowTitle(sTitle); updateStatusItem(STATUS_SERVER_STATE, sState); #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { switch (m_iServerState) { case QJACKCTL_STARTING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarting1.png")); break; case QJACKCTL_STARTED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarted1.png")); break; case QJACKCTL_STOPPING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopping1.png")); break; case QJACKCTL_STOPPED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopped1.png")); break; case QJACKCTL_ACTIVE: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactive1.png")); break; case QJACKCTL_ACTIVATING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactivating1.png")); break; case QJACKCTL_INACTIVE: default: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xinactive1.png")); break; } m_pSystemTray->setToolTip(sTitle); } #endif sTitle = m_pSetup->sServerName; if (sTitle.isEmpty()) sTitle = ::getenv("JACK_DEFAULT_SERVER"); if (sTitle.isEmpty()) sTitle = m_pSetup->sDefPresetName; updateStatusItem(STATUS_SERVER_NAME, sTitle); } // Main server state status update helper. void qjackctlMainForm::updateServerState ( int iServerState ) { // Just set the new server state. m_iServerState = iServerState; // Now's time to update main window // caption title and status immediately. updateTitleStatus(); } #ifdef CONFIG_SYSTEM_TRAY // System tray master switcher. void qjackctlMainForm::updateSystemTray (void) { if (!m_pSetup->bSystemTray && m_pSystemTray) { // Strange enough, this would close the application too. // m_pSystemTray->close(); delete m_pSystemTray; m_pSystemTray = NULL; } if (m_pSetup->bSystemTray && m_pSystemTray == NULL) { m_pSystemTray = new qjackctlSystemTray(this); QObject::connect(m_pSystemTray, SIGNAL(clicked()), SLOT(toggleMainForm())); QObject::connect(m_pSystemTray, SIGNAL(middleClicked()), SLOT(resetXrunStats())); QObject::connect(m_pSystemTray, SIGNAL(doubleClicked()), SLOT(toggleJack())); QObject::connect(m_pSystemTray, SIGNAL(contextMenuRequested(const QPoint &)), SLOT(contextMenu(const QPoint &))); m_pSystemTray->show(); } else { // Make sure the main widget is visible. show(); raise(); activateWindow(); } } #endif // System tray context menu request slot. void qjackctlMainForm::contextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; QString sHideMinimize = tr("Mi&nimize"); QString sShowRestore = tr("Rest&ore"); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray) { sHideMinimize = tr("&Hide"); sShowRestore = tr("S&how"); } #endif pAction = menu.addAction(isVisible() ? sHideMinimize : sShowRestore, this, SLOT(toggleMainForm())); menu.addSeparator(); if (m_pJackClient == NULL) { pAction = menu.addAction(QIcon(":/images/start1.png"), tr("&Start"), this, SLOT(startJack())); } else { pAction = menu.addAction(QIcon(":/images/stop1.png"), tr("&Stop"), this, SLOT(stopJack())); } pAction = menu.addAction(QIcon(":/images/reset1.png"), tr("&Reset"), this, SLOT(resetXrunStats())); // pAction->setEnabled(m_pJackClient != NULL); menu.addSeparator(); // Construct the actual presets menu, // overriding the last one, if any... QMenu *pPresetsMenu = menu.addMenu(tr("&Presets")); // Assume QStringList iteration follows item index order (0,1,2...) int iPreset = 0; QStringListIterator iter(m_pSetup->presets); while (iter.hasNext()) { const QString& sPreset = iter.next(); pAction = pPresetsMenu->addAction(sPreset); pAction->setCheckable(true); pAction->setChecked(sPreset == m_pSetup->sDefPreset); pAction->setData(iPreset); iPreset++; } // Default preset always present, and has invalid index parameter (-1)... if (iPreset > 0) pPresetsMenu->addSeparator(); pAction = pPresetsMenu->addAction(m_pSetup->sDefPresetName); pAction->setCheckable(true); pAction->setChecked(m_pSetup->sDefPresetName == m_pSetup->sDefPreset); pAction->setData(-1); QObject::connect(pPresetsMenu, SIGNAL(triggered(QAction*)), SLOT(activatePresetsMenu(QAction*))); menu.addSeparator(); if (m_pSessionForm) { bool bEnabled = (m_pJackClient != NULL); const QString sTitle = tr("S&ession"); const QIcon iconSession(":/images/session1.png"); QMenu *pSessionMenu = menu.addMenu(sTitle); pSessionMenu->setIcon(iconSession); pAction = pSessionMenu->addAction(m_pSessionForm->isVisible() ? tr("&Hide") : tr("S&how"), this, SLOT(toggleSessionForm())); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/open1.png"), tr("&Load..."), m_pSessionForm, SLOT(loadSession())); pAction->setEnabled(bEnabled); QMenu *pRecentMenu = m_pSessionForm->recentMenu(); pAction = pSessionMenu->addMenu(pRecentMenu); pAction->setEnabled(m_pJackClient != NULL && !pRecentMenu->isEmpty()); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), m_pSessionForm, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = pSessionMenu->addAction( tr("Save and &Quit..."), m_pSessionForm, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = pSessionMenu->addAction( tr("Save &Template..."), m_pSessionForm, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction( tr("&Versioning"), m_pSessionForm, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(m_pSessionForm->isSaveSessionVersion()); pAction->setEnabled(bEnabled); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), m_pSessionForm, SLOT(updateSession())); pAction->setEnabled(bEnabled); } pAction = menu.addAction(QIcon(":/images/messages1.png"), tr("&Messages"), this, SLOT(toggleMessagesForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::MessagesTab); pAction = menu.addAction(QIcon(":/images/status1.png"), tr("St&atus"), this, SLOT(toggleStatusForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::StatusTab); pAction = menu.addAction(QIcon(":/images/connections1.png"), tr("&Connections"), this, SLOT(toggleConnectionsForm())); pAction->setCheckable(true); pAction->setChecked(m_pConnectionsForm && m_pConnectionsForm->isVisible()); pAction = menu.addAction(QIcon(":/images/patchbay1.png"), tr("Patch&bay"), this, SLOT(togglePatchbayForm())); pAction->setCheckable(true); pAction->setChecked(m_pPatchbayForm && m_pPatchbayForm->isVisible()); menu.addSeparator(); QMenu *pTransportMenu = menu.addMenu(tr("&Transport")); pAction = pTransportMenu->addAction(QIcon(":/images/rewind1.png"), tr("&Rewind"), this, SLOT(transportRewind())); pAction->setEnabled(m_ui.RewindToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/backward1.png"), // tr("&Backward"), this, SLOT(transportBackward())); // pAction->setEnabled(m_ui.BackwardToolButton->isEnabled()); pAction = pTransportMenu->addAction(QIcon(":/images/play1.png"), tr("&Play"), this, SLOT(transportStart())); pAction->setEnabled(!m_ui.PlayToolButton->isChecked()); pAction = pTransportMenu->addAction(QIcon(":/images/pause1.png"), tr("Pa&use"), this, SLOT(transportStop())); pAction->setEnabled(m_ui.PauseToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/forward1.png"), // tr("&Forward"), this, SLOT(transportForward())); // pAction->setEnabled(m_ui.ForwardToolButton->isEnabled()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/setup1.png"), tr("Set&up..."), this, SLOT(showSetupForm())); pAction->setCheckable(true); pAction->setChecked(m_pSetupForm && m_pSetupForm->isVisible()); if (!m_pSetup->bRightButtons || !m_pSetup->bTransportButtons) { pAction = menu.addAction(QIcon(":/images/about1.png"), tr("Ab&out..."), this, SLOT(showAboutForm())); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/quit1.png"), tr("&Quit"), this, SLOT(quitMainForm())); menu.exec(pos); } // Server settings change warning. void qjackctlMainForm::showDirtySettingsWarning (void) { // If client service is currently running, // prompt the effective warning... if (m_pJackClient) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Server settings will be only effective after\n" "restarting the JACK audio server."); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage(sTitle, sText, QSystemTrayIcon::Warning); } else #endif QMessageBox::warning(this, sTitle, sText); } // Otherwise, it will be just as convenient to update status... else updateTitleStatus(); } // Setup otions change warning. void qjackctlMainForm::showDirtySetupWarning (void) { const QString& sTitle = tr("Information") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Some settings will be only effective\n" "the next time you start this program."); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage(sTitle, sText, QSystemTrayIcon::Information); } else #endif QMessageBox::information(this, sTitle, sText); } // Select the current default preset (by name from context menu). void qjackctlMainForm::activatePresetsMenu ( QAction *pAction ) { activatePreset(pAction->data().toInt()); } // Select the current default preset (by name). void qjackctlMainForm::activatePreset ( const QString& sPreset ) { activatePreset(m_pSetup->presets.indexOf(sPreset)); } // Select the current default preset (by index). void qjackctlMainForm::activatePreset ( int iPreset ) { if (m_pConnectionsForm && !m_pConnectionsForm->queryClose()) return; if (iPreset >= 0 && iPreset < m_pSetup->presets.count()) m_pSetup->sDefPreset = m_pSetup->presets[iPreset]; else m_pSetup->sDefPreset = m_pSetup->sDefPresetName; // Have current preset changed anyhow? if (m_pSetupForm) m_pSetupForm->updateCurrentPreset(); showDirtySettingsWarning(); } // Close main form slot. void qjackctlMainForm::quitMainForm (void) { #ifdef CONFIG_SYSTEM_TRAY // Flag that we're quitting explicitly. m_bQuitClose = true; #endif // And then, do the closing dance. close(); } // Context menu event handler. void qjackctlMainForm::contextMenuEvent ( QContextMenuEvent *pEvent ) { // We'll just show up the usual system tray menu. contextMenu(pEvent->globalPos()); } void qjackctlMainForm::mousePressEvent(QMouseEvent *pMouseEvent) { if (pMouseEvent->button() == Qt::MidButton && m_ui.StatusDisplayFrame->geometry().contains(pMouseEvent->pos())) { resetXrunStats(); } } #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values from current selected preset options. void qjackctlMainForm::setDBusParameters (void) { // Set configuration parameters... const bool bDummy = (m_preset.sDriver == "dummy"); const bool bSun = (m_preset.sDriver == "sun"); const bool bOss = (m_preset.sDriver == "oss"); const bool bAlsa = (m_preset.sDriver == "alsa"); const bool bPortaudio = (m_preset.sDriver == "portaudio"); const bool bCoreaudio = (m_preset.sDriver == "coreaudio"); const bool bFreebob = (m_preset.sDriver == "freebob"); const bool bFirewire = (m_preset.sDriver == "firewire"); const bool bNet = (m_preset.sDriver == "net" || m_preset.sDriver == "netone"); setDBusEngineParameter("name", m_pSetup->sServerName, !m_pSetup->sServerName.isEmpty()); setDBusEngineParameter("verbose", m_preset.bVerbose); setDBusEngineParameter("realtime", m_preset.bRealtime); setDBusEngineParameter("realtime-priority", m_preset.iPriority, m_preset.bRealtime && m_preset.iPriority > 5); // setDBusEngineParameter("port-max", // m_preset.iPortMax, // m_preset.iPortMax > 0); setDBusEngineParameter("client-timeout", m_preset.iTimeout, m_preset.iTimeout > 0); // setDBusEngineParameter("no-memlock", m_preset.bNoMemLock); // setDBusEngineParameter("unlock-mem", // m_preset.bUnlockMem, // !m_preset.bNoMemLock); setDBusEngineParameter("driver", m_preset.sDriver); if ((bAlsa || bPortaudio) && (m_preset.iAudio != QJACKCTL_DUPLEX || m_preset.sInDevice.isEmpty() || m_preset.sOutDevice.isEmpty())) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; setDBusDriverParameter("device", sInterface); } if (bPortaudio) { setDBusDriverParameter("channel", (unsigned int) m_preset.iChan, m_preset.iChan > 0); } if (bCoreaudio || bFreebob || bFirewire) { setDBusDriverParameter("device", m_preset.sInterface, !m_preset.sInterface.isEmpty()); } if (!bNet) { setDBusDriverParameter("rate", (unsigned int) m_preset.iSampleRate, m_preset.iSampleRate > 0); setDBusDriverParameter("period", (unsigned int) m_preset.iFrames, m_preset.iFrames > 0); } if (bAlsa || bSun || bOss || bFreebob || bFirewire) { setDBusDriverParameter("nperiods", (unsigned int) m_preset.iPeriods, m_preset.iPeriods > 0); } if (bAlsa) { setDBusDriverParameter("softmode", m_preset.bSoftMode); setDBusDriverParameter("monitor", m_preset.bMonitor); setDBusDriverParameter("shorts", m_preset.bShorts); setDBusDriverParameter("hwmon", m_preset.bHWMon); setDBusDriverParameter("hwmeter", m_preset.bHWMeter); #ifdef CONFIG_JACK_MIDI setDBusDriverParameter("midi-driver", m_preset.sMidiDriver, !m_preset.sMidiDriver.isEmpty()); #endif } if (bAlsa || bPortaudio) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; QString sInDevice = m_preset.sInDevice; if (sInDevice.isEmpty()) sInDevice = sInterface; QString sOutDevice = m_preset.sOutDevice; if (sOutDevice.isEmpty()) sOutDevice = sInterface; switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: setDBusDriverParameter("duplex", true); setDBusDriverParameter("capture", sInDevice); setDBusDriverParameter("playback", sOutDevice); break; case QJACKCTL_CAPTURE: resetDBusDriverParameter("duplex"); setDBusDriverParameter("capture", sInDevice); resetDBusDriverParameter("playback"); break; case QJACKCTL_PLAYBACK: resetDBusDriverParameter("duplex"); setDBusDriverParameter("playback", sOutDevice); resetDBusDriverParameter("capture"); break; } setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); unsigned char dither = 0; switch (m_preset.iDither) { case 0: dither = 'n'; break; case 1: dither = 'r'; break; case 2: dither = 's'; break; case 3: dither = 't'; break; } setDBusDriverParameter("dither", QVariant::fromValue(dither), dither > 0); } else if (bOss || bSun) { setDBusDriverParameter("ignorehw", m_preset.bIgnoreHW); setDBusDriverParameter("wordlength", (unsigned int) m_preset.iWordLength, m_preset.iWordLength > 0); QString sInDevice = m_preset.sInDevice; if (sInDevice.isEmpty() && m_preset.iAudio == QJACKCTL_CAPTURE) sInDevice = m_preset.sInterface; setDBusDriverParameter("capture", sInDevice, !sInDevice.isEmpty() && m_preset.iAudio != QJACKCTL_PLAYBACK); QString sOutDevice = m_preset.sOutDevice; if (sOutDevice.isEmpty() && m_preset.iAudio == QJACKCTL_PLAYBACK) sOutDevice = m_preset.sInterface; setDBusDriverParameter("playback", sOutDevice, !sOutDevice.isEmpty() && m_preset.iAudio != QJACKCTL_CAPTURE); setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); } else if (bCoreaudio || bFirewire || bNet) { setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); } else if (bFreebob) { setDBusDriverParameter("duplex", bool(m_preset.iAudio == QJACKCTL_DUPLEX)); resetDBusDriverParameter("capture"); resetDBusDriverParameter("playback"); resetDBusDriverParameter("outchannels"); resetDBusDriverParameter("inchannels"); } if (bDummy) { setDBusDriverParameter("wait", (unsigned int) m_preset.iWait, m_preset.iWait > 0); } else if (!bNet) { setDBusDriverParameter("input-latency", (unsigned int) m_preset.iInLatency, m_preset.iInLatency > 0); setDBusDriverParameter("output-latency", (unsigned int) m_preset.iOutLatency, m_preset.iOutLatency > 0); } } // D-BUS: Set parameter values (with reset option). bool qjackctlMainForm::setDBusEngineParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "engine" << param, value, bSet); } bool qjackctlMainForm::setDBusDriverParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "driver" << param, value, bSet); } bool qjackctlMainForm::setDBusParameter ( const QStringList& path, const QVariant& value, bool bSet ) { if (m_pDBusConfig == NULL) return false; if (!bSet) return resetDBusParameter(path); // Reset option. QDBusMessage dbusm = m_pDBusConfig->call( "SetParameterValue", path, QVariant::fromValue(QDBusVariant(value))); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: SetParameterValue('%1', '%2'):\n\n" "%3.\n(%4)").arg(path.join(":")).arg(value.toString()) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return false; } return true; } // D-BUS: Reset parameter (to default) values. bool qjackctlMainForm::resetDBusEngineParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "engine" << param); } bool qjackctlMainForm::resetDBusDriverParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "driver" << param); } bool qjackctlMainForm::resetDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == NULL) return false; QDBusMessage dbusm = m_pDBusConfig->call("ResetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: ResetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return false; } return true; } // D-BUS: Get parameter values. QVariant qjackctlMainForm::getDBusEngineParameter ( const QString& param ) { return getDBusParameter(QStringList() << "engine" << param); } QVariant qjackctlMainForm::getDBusDriverParameter ( const QString& param ) { return getDBusParameter(QStringList() << "driver" << param); } QVariant qjackctlMainForm::getDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == NULL) return QVariant(); QDBusMessage dbusm = m_pDBusConfig->call("GetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: GetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return QVariant(); } return dbusm.arguments().at(2); } #endif // CONFIG_DBUS // Quotes string with embedded whitespace. QString qjackctlMainForm::formatQuoted ( const QString& s ) const { const QChar b = ' '; const QChar q = '"'; return (s.contains(b) && !s.contains(q) ? q + s + q : s); } // Guarded transport play/pause toggle. void qjackctlMainForm::transportPlayStatus ( bool bOn ) { ++m_iTransportPlay; m_ui.PlayToolButton->setChecked(bOn); --m_iTransportPlay; } void qjackctlMainForm::commitData ( QSessionManager& sm ) { sm.release(); #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = true; #endif m_bQuitForce = true; } // end of qjackctlMainForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlStatus.h0000644000000000000000000000012713215206021016720 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlStatus.h0000644000175000001440000000363613215206021017556 0ustar00rncbcusers00000000000000// qjackctlStatus.h // /**************************************************************************** Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlStatus_h #define __qjackctlStatus_h // List view statistics item indexes #define STATUS_SERVER_NAME 0 #define STATUS_SERVER_STATE 1 #define STATUS_DSP_LOAD 2 #define STATUS_SAMPLE_RATE 3 #define STATUS_BUFFER_SIZE 4 #define STATUS_REALTIME 5 #define STATUS_TRANSPORT_STATE 6 #define STATUS_TRANSPORT_TIME 7 #define STATUS_TRANSPORT_BBT 8 #define STATUS_TRANSPORT_BPM 9 #define STATUS_XRUN_COUNT 10 #define STATUS_XRUN_TIME 11 #define STATUS_XRUN_LAST 12 #define STATUS_XRUN_MAX 13 #define STATUS_XRUN_MIN 14 #define STATUS_XRUN_AVG 15 #define STATUS_XRUN_TOTAL 16 #define STATUS_RESET_TIME 17 #define STATUS_MAX_DELAY 18 // (Big)Time display identifiers. #define DISPLAY_TRANSPORT_TIME 0 #define DISPLAY_TRANSPORT_BBT 1 #define DISPLAY_RESET_TIME 2 #define DISPLAY_XRUN_TIME 3 #endif // __qjackctlStatus_h // end of qjackctlStatus.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayForm.h0000644000000000000000000000012713215206021020014 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlPatchbayForm.h0000644000175000001440000000600613215206021020644 0ustar00rncbcusers00000000000000// qjackctlPatchbayForm.h // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayForm_h #define __qjackctlPatchbayForm_h #include "ui_qjackctlPatchbayForm.h" // Forward declarations. class qjackctlPatchbay; class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. class qjackctlPatchbayForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchbayForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlPatchbayForm(); void setup(qjackctlSetup *pSetup); qjackctlPatchbayView *patchbayView() const; bool queryClose(); const QString& patchbayPath() const; void newPatchbayFile(bool bSnapshot); bool loadPatchbayFile(const QString& sFileName); bool savePatchbayFile(const QString& sFileName); void loadPatchbayRack(qjackctlPatchbayRack *pRack); void setRecentPatchbays(const QStringList& patchbays); void updateRecentPatchbays(); public slots: void newPatchbay(); void loadPatchbay(); void savePatchbay(); void selectPatchbay(int iPatchbay); void toggleActivePatchbay(); void addOSocket(); void removeOSocket(); void editOSocket(); void copyOSocket(); void moveUpOSocket(); void moveDownOSocket(); void addISocket(); void removeISocket(); void editISocket(); void copyISocket(); void moveUpISocket(); void moveDownISocket(); void connectSelected(); void disconnectSelected(); void disconnectAll(); void expandAll(); void contentsChanged(); void refreshForm(); void stabilizeForm(); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlPatchbayForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; int m_iUntitled; qjackctlPatchbay *m_pPatchbay; QString m_sPatchbayPath; QString m_sPatchbayName; QStringList m_recentPatchbays; bool m_bActivePatchbay; int m_iUpdate; }; #endif // __qjackctlPatchbayForm_h // end of qjackctlPatchbayForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlPatchbayFile.h0000644000000000000000000000012713215206021017770 xustar0029 mtime=1513425937.53676694 29 atime=1513425937.53676694 29 ctime=1513425937.53676694 qjackctl-0.5.0/src/qjackctlPatchbayFile.h0000644000175000001440000000260213215206021020616 0ustar00rncbcusers00000000000000// qjackctlPatchbayFile.h // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayFile_h #define __qjackctlPatchbayFile_h #include "qjackctlPatchbayRack.h" // Patchbay XML definition. class qjackctlPatchbayFile { public: // Simple patchbay I/O methods. static bool load (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); static bool save (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); }; #endif // __qjackctlPatchbayFile_h // qjackctlPatchbayFile.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSocketForm.h0000644000000000000000000000012713215206021017511 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlSocketForm.h0000644000175000001440000000554113215206021020344 0ustar00rncbcusers00000000000000// qjackctlSocketForm.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSocketForm_h #define __qjackctlSocketForm_h #include "ui_qjackctlSocketForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlPatchbay; class qjackctlPatchbaySocket; class qjackctlSocketList; class QButtonGroup; class QPixmap; //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. class qjackctlSocketForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSocketForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSocketForm(); void setSocketCaption(const QString& sSocketCaption); void setSocketList(qjackctlSocketList *pSocketList); void setSocketNew(bool bSocketNew); void setPixmaps(QPixmap **ppPixmaps); void setConnectCount(int iConnectCount); void load(qjackctlPatchbaySocket *pSocket); void save(qjackctlPatchbaySocket *pSocket); public slots: void changed(); void addPlug(); void editPlug(); void removePlug(); void moveUpPlug(); void moveDownPlug(); void selectedPlug(); void activateAddPlugMenu(QAction *); void customContextMenu(const QPoint&); void socketTypeChanged(); void socketNameChanged(); void clientNameChanged(); void stabilizeForm(); protected slots: void accept(); void reject(); protected: void updateJackClients(int iSocketType); void updateAlsaClients(int iSocketType); void updateJackPlugs(int iSocketType); void updateAlsaPlugs(int iSocketType); bool validateForm(); private: // The Qt-designer UI struct... Ui::qjackctlSocketForm m_ui; // Instance variables. qjackctlSocketList *m_pSocketList; bool m_bSocketNew; int m_iSocketNameChanged; QPixmap **m_ppPixmaps; int m_iDirtyCount; QButtonGroup *m_pSocketTypeButtonGroup; }; #endif // __qjackctlSocketForm_h // end of qjackctlSocketForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSessionForm.cpp0000644000000000000000000000012713215206021020237 xustar0029 mtime=1513425937.53876694 29 atime=1513425937.53876694 29 ctime=1513425937.53876694 qjackctl-0.5.0/src/qjackctlSessionForm.cpp0000644000175000001440000007052513215206021021076 0ustar00rncbcusers00000000000000// qjackctlSessionForm.cpp // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSessionForm.h" #include "qjackctlSession.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include // Local prototypes. static void remove_dir_list(const QList& list); static void remove_dir(const QString& sDir); // Remove specific file path. static void remove_dir ( const QString& sDir ) { QDir dir(sDir); remove_dir_list( dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)); dir.rmdir(sDir); } static void remove_dir_list ( const QList& list ) { QListIterator iter(list); while (iter.hasNext()) { const QFileInfo& info = iter.next(); const QString& sPath = info.absoluteFilePath(); if (info.isDir()) { remove_dir(sPath); } else { QFile::remove(sPath); } } } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor qjackctlSessionInfraClientItemEditor::qjackctlSessionInfraClientItemEditor ( QWidget *pParent, const QModelIndex& index ) : QWidget(pParent), m_index(index) { m_pItemEdit = new QLineEdit(/*this*/); if (index.column() == 1) { m_pBrowseButton = new QToolButton(/*this*/); m_pBrowseButton->setFixedWidth(18); m_pBrowseButton->setText("..."); } else m_pBrowseButton = NULL; m_pResetButton = new QToolButton(/*this*/); m_pResetButton->setFixedWidth(18); m_pResetButton->setText("x"); QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing(0); pLayout->setMargin(0); pLayout->addWidget(m_pItemEdit); if (m_pBrowseButton) pLayout->addWidget(m_pBrowseButton); pLayout->addWidget(m_pResetButton); QWidget::setLayout(pLayout); QWidget::setFocusPolicy(Qt::StrongFocus); QWidget::setFocusProxy(m_pItemEdit); QObject::connect(m_pItemEdit, SIGNAL(editingFinished()), SLOT(finishSlot())); if (m_pBrowseButton) QObject::connect(m_pBrowseButton, SIGNAL(clicked()), SLOT(browseSlot())); QObject::connect(m_pResetButton, SIGNAL(clicked()), SLOT(resetSlot())); } // Item text accessors. void qjackctlSessionInfraClientItemEditor::setText ( const QString& sText ) { m_pItemEdit->setText(sText); } QString qjackctlSessionInfraClientItemEditor::text (void) const { return m_pItemEdit->text(); } // Item command browser. void qjackctlSessionInfraClientItemEditor::browseSlot (void) { bool bBlockSignals = m_pItemEdit->blockSignals(true); const QString& sCommand = QFileDialog::getOpenFileName(parentWidget(), tr("Infra-command")); if (!sCommand.isEmpty()) m_pItemEdit->setText(sCommand); m_pItemEdit->blockSignals(bBlockSignals); } // Item text clear/toggler. void qjackctlSessionInfraClientItemEditor::resetSlot (void) { if (m_pItemEdit->text() == m_sDefaultText) m_pItemEdit->clear(); else m_pItemEdit->setText(m_sDefaultText); m_pItemEdit->setFocus(); } // Item text finish notification. void qjackctlSessionInfraClientItemEditor::finishSlot (void) { bool bBlockSignals = m_pItemEdit->blockSignals(true); emit finishSignal(); m_index = QModelIndex(); m_sDefaultText.clear(); m_pItemEdit->blockSignals(bBlockSignals); } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate qjackctlSessionInfraClientItemDelegate::qjackctlSessionInfraClientItemDelegate ( QObject *pParent ) : QItemDelegate(pParent) { } QWidget *qjackctlSessionInfraClientItemDelegate::createEditor ( QWidget *pParent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = new qjackctlSessionInfraClientItemEditor(pParent, index); pItemEditor->setDefaultText( index.model()->data(index, Qt::DisplayRole).toString()); QObject::connect(pItemEditor, SIGNAL(finishSignal()), SLOT(commitEditor())); return pItemEditor; } void qjackctlSessionInfraClientItemDelegate::setEditorData ( QWidget *pEditor, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pItemEditor->setText( index.model()->data(index, Qt::DisplayRole).toString()); } void qjackctlSessionInfraClientItemDelegate::setModelData ( QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pModel->setData(index, pItemEditor->text()); } void qjackctlSessionInfraClientItemDelegate::commitEditor (void) { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (sender()); const QString& sText = pItemEditor->text(); const QString& sDefaultText = pItemEditor->defaultText(); if (sText != sDefaultText) emit commitData(pItemEditor); emit closeEditor(pItemEditor); } //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. // Constructor. qjackctlSessionForm::qjackctlSessionForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = NULL; // Common (sigleton) session object. m_pSession = new qjackctlSession(); // Set recent menu stuff... m_pRecentMenu = new QMenu(tr("&Recent")); m_ui.RecentSessionPushButton->setMenu(m_pRecentMenu); m_pSaveMenu = new QMenu(tr("&Save")); m_pSaveMenu->setIcon(QIcon(":/images/save1.png")); m_pSaveMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION m_pSaveMenu->addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); m_pSaveMenu->addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); #endif m_ui.SaveSessionPushButton->setMenu(m_pSaveMenu); // Session tree view... QHeaderView *pHeader = m_ui.SessionTreeView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 200); // Client/Ports pHeader->resizeSection(1, 40); // UUID pHeader->setStretchLastSection(true); m_ui.SessionTreeView->setContextMenuPolicy(Qt::CustomContextMenu); // Infra-client list view... pHeader = m_ui.InfraClientListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 120); // Infra-client pHeader->setStretchLastSection(true); m_ui.InfraClientListView->setItemDelegate( new qjackctlSessionInfraClientItemDelegate(m_ui.InfraClientListView)); m_ui.InfraClientListView->setContextMenuPolicy(Qt::CustomContextMenu); m_ui.InfraClientListView->sortItems(0, Qt::AscendingOrder); // UI connections... QObject::connect(m_ui.LoadSessionPushButton, SIGNAL(clicked()), SLOT(loadSession())); QObject::connect(m_ui.UpdateSessionPushButton, SIGNAL(clicked()), SLOT(updateSession())); QObject::connect(m_ui.SessionTreeView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(sessionViewContextMenu(const QPoint&))); QObject::connect(m_ui.InfraClientListView, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), SLOT(selectInfraClient())); QObject::connect(m_ui.AddInfraClientPushButton, SIGNAL(clicked()), SLOT(addInfraClient())); QObject::connect(m_ui.EditInfraClientPushButton, SIGNAL(clicked()), SLOT(editInfraClient())); QObject::connect(m_ui.RemoveInfraClientPushButton, SIGNAL(clicked()), SLOT(removeInfraClient())); QObject::connect(m_ui.InfraClientListView->itemDelegate(), SIGNAL(commitData(QWidget *)), SLOT(editInfraClientCommit())); QObject::connect(m_ui.InfraClientListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(infraClientContextMenu(const QPoint&))); // Start disabled. stabilizeForm(false); } // Destructor. qjackctlSessionForm::~qjackctlSessionForm (void) { delete m_pSaveMenu; delete m_pRecentMenu; delete m_pSession; } // Set reference to global options, mostly needed for // the initial session save type and directories. void qjackctlSessionForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; if (m_pSetup) { m_ui.SaveSessionVersionCheckBox->setChecked( m_pSetup->bSessionSaveVersion); m_sessionDirs = m_pSetup->sessionDirs; // Setup infra-clients table view... QList sizes; sizes.append(320); sizes.append(120); m_pSetup->loadSplitterSizes(m_ui.InfraClientSplitter, sizes); // Load infra-clients table-view... m_pSession->loadInfraClients(m_pSetup->settings()); } updateRecentMenu(); updateInfraClients(); } // Maybe ask whether we can close. bool qjackctlSessionForm::queryClose (void) { bool bQueryClose = true; // Maybe just save some splitter sizes... if (m_pSetup && bQueryClose) { // Rebuild infra-clients list... m_pSession->clearInfraClients(); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); for (int i = 0; i < iItemCount; ++i) { QTreeWidgetItem *pItem = m_ui.InfraClientListView->topLevelItem(i); if (pItem) { const QString& sKey = pItem->text(0); const QString& sValue = pItem->text(1); if (!sValue.isEmpty()) { qjackctlSession::InfraClientItem *pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } } } // Save infra-clients table-view... m_pSession->saveInfraClients(m_pSetup->settings()); m_pSetup->saveSplitterSizes(m_ui.InfraClientSplitter); } return bQueryClose; } // Recent session directories accessor. const QStringList& qjackctlSessionForm::sessionDirs (void) const { return m_sessionDirs; } // Session save versioning option. bool qjackctlSessionForm::isSaveSessionVersion (void) const { return m_ui.SaveSessionVersionCheckBox->isChecked(); } // Recent menu accessor. QMenu *qjackctlSessionForm::recentMenu (void) const { return m_pRecentMenu; } // Save menu accessor. QMenu *qjackctlSessionForm::saveMenu (void) const { return m_pSaveMenu; } // Notify our parent that we're emerging. void qjackctlSessionForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlSessionForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlSessionForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Open/load session from specific file path. void qjackctlSessionForm::loadSession (void) { #if 0 QFileDialog loadDialog(this, tr("Load Session")); loadDialog.setAcceptMode(QFileDialog::AcceptOpen); loadDialog.setFileMode(QFileDialog::Directory); loadDialog.setViewMode(QFileDialog::List); loadDialog.setOptions(QFileDialog::ShowDirsOnly); loadDialog.setNameFilter(tr("Session directory")); loadDialog.setHistory(m_sessionDirs); if (!m_sessionDirs.isEmpty()) loadDialog.setDirectory(m_sessionDirs.first()); if (!loadDialog.exec()) return; QString sSessionDir = loadDialog.selectedFiles().first(); #else QString sSessionDir; if (!m_sessionDirs.isEmpty()) sSessionDir = m_sessionDirs.first(); sSessionDir = QFileDialog::getExistingDirectory( this, tr("Load Session"), sSessionDir); #endif loadSessionDir(sSessionDir); } // Load a recent session. void qjackctlSessionForm::recentSession (void) { QAction *pAction = qobject_cast (sender()); if (pAction) { int i = pAction->data().toInt(); if (i >= 0 && i < m_sessionDirs.count()) loadSessionDir(m_sessionDirs.at(i)); } } // Save current session to specific file path. void qjackctlSessionForm::saveSessionSave (void) { saveSessionEx(0); } void qjackctlSessionForm::saveSessionSaveAndQuit (void) { saveSessionEx(1); } void qjackctlSessionForm::saveSessionSaveTemplate (void) { saveSessionEx(2); } void qjackctlSessionForm::saveSessionEx ( int iSessionType ) { QString sTitle = tr("Save Session"); switch (iSessionType) { case 1: sTitle += ' ' + tr("and Quit"); break; case 2: sTitle += ' ' + tr("Template"); break; } #if 0 QFileDialog saveDialog(this, sTitle); saveDialog.setAcceptMode(QFileDialog::AcceptSave); saveDialog.setFileMode(QFileDialog::Directory); saveDialog.setViewMode(QFileDialog::List); saveDialog.setOptions(QFileDialog::ShowDirsOnly); saveDialog.setNameFilter(tr("Session directory")); saveDialog.setHistory(m_sessionDirs); if (!m_sessionDirs.isEmpty()) saveDialog.setDirectory(m_sessionDirs.first()); if (!saveDialog.exec()) return; QString sSessionDir = saveDialog.selectedFiles().first(); #else QString sSessionDir; if (!m_sessionDirs.isEmpty()) sSessionDir = m_sessionDirs.first(); sSessionDir = QFileDialog::getExistingDirectory( this, sTitle, sSessionDir); #endif saveSessionDir(sSessionDir, iSessionType); } // Save current session to specific file path. void qjackctlSessionForm::saveSessionVersion ( bool bOn ) { m_ui.SaveSessionVersionCheckBox->setChecked(bOn); } // Update the recent session list and menu. void qjackctlSessionForm::updateRecent ( const QString& sSessionDir ) { int i = m_sessionDirs.indexOf(sSessionDir); if (i >= 0) m_sessionDirs.removeAt(i); m_sessionDirs.prepend(sSessionDir); updateRecentMenu(); } // Update/stabilize recent sessions menu. void qjackctlSessionForm::updateRecentMenu (void) { int iRecent = m_sessionDirs.count(); for (; iRecent > 8; --iRecent) m_sessionDirs.pop_back(); m_pRecentMenu->clear(); for (int i = 0; i < iRecent; ++i) { const QString& sSessionDir = m_sessionDirs.at(i); if (QDir(sSessionDir).exists()) { QAction *pAction = m_pRecentMenu->addAction( QFileInfo(sSessionDir).fileName(), this, SLOT(recentSession())); pAction->setData(i); } } if (iRecent > 0) { m_pRecentMenu->addSeparator(); m_pRecentMenu->addAction(tr("&Clear"), this, SLOT(clearRecentMenu())); } m_ui.RecentSessionPushButton->setEnabled(iRecent > 0); } // Clear recent sessions menu. void qjackctlSessionForm::clearRecentMenu (void) { m_sessionDirs.clear(); updateRecentMenu(); } // Open/load session from specific file path. void qjackctlSessionForm::loadSessionDir ( const QString& sSessionDir ) { if (sSessionDir.isEmpty()) return; const QDir sessionDir(sSessionDir); if (!sessionDir.exists("session.xml")) { QMessageBox::critical(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("A session could not be found in this folder:\n\n\"%1\"") .arg(sSessionDir)); return; } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; pMainForm->appendMessages( tr("%1: loading session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); bool bLoadSession = m_pSession->load(sSessionDir); if (bLoadSession) updateRecent(sessionDir.absolutePath()); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: load session %2.").arg(sSessionDir) .arg(bLoadSession ? "OK" : "FAILED")); } // Save current session to specific file path. void qjackctlSessionForm::saveSessionDir ( const QString& sSessionDir, int iSessionType ) { if (sSessionDir.isEmpty()) return; QDir sessionDir(sSessionDir); const QList list = sessionDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot); if (!list.isEmpty()) { if (sessionDir.exists("session.xml")) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("A session already exists in this folder:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing session?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } else { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This folder already exists and is not empty:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing folder?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } // remove_dir_list(list); } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; pMainForm->appendMessages( tr("%1: saving session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); if (!list.isEmpty()) { if (isSaveSessionVersion()) { int iSessionDirNo = 0; const QString sSessionDirMask = sSessionDir + ".%1"; QFileInfo fi(sSessionDirMask.arg(++iSessionDirNo)); while (fi.exists()) fi.setFile(sSessionDirMask.arg(++iSessionDirNo)); sessionDir.rename(sSessionDir, fi.absoluteFilePath()); } else remove_dir_list(list); sessionDir.refresh(); } if (!sessionDir.exists()) sessionDir.mkpath(sSessionDir); bool bSaveSession = m_pSession->save(sSessionDir, iSessionType); if (bSaveSession) updateRecent(sSessionDir); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: save session %2.").arg(sSessionDir) .arg(bSaveSession ? "OK" : "FAILED")); } // Set icon error status according to given flag. QIcon qjackctlSessionForm::iconStatus ( const QIcon& icon, bool bStatus ) { QPixmap pm(icon.pixmap(16, 16)); // Merge with the overlay pixmap... if (bStatus) { const QPixmap pmOverlay(":/images/error1.png"); if (!pmOverlay.mask().isNull()) { QBitmap mask = pm.mask(); QPainter(&mask).drawPixmap(0, 0, pmOverlay.mask()); pm.setMask(mask); QPainter(&pm).drawPixmap(0, 0, pmOverlay); } } return QIcon(pm); } // Update/populate session tree view. void qjackctlSessionForm::updateSessionView (void) { m_ui.SessionTreeView->clear(); QList items; const QIcon iconClient(":/images/client1.png"); const QIcon iconPort(":/images/port1.png"); const QIcon iconConnect(":/images/connect1.png"); qjackctlSession::ClientList::ConstIterator iterClient = m_pSession->clients().constBegin(); for ( ; iterClient != m_pSession->clients().constEnd(); ++iterClient) { qjackctlSession::ClientItem *pClientItem = iterClient.value(); QTreeWidgetItem *pTopLevelItem = new QTreeWidgetItem(); pTopLevelItem->setIcon(0, iconStatus(iconClient, pClientItem->connected)); pTopLevelItem->setText(0, pClientItem->client_name); pTopLevelItem->setText(1, pClientItem->client_uuid); pTopLevelItem->setText(2, pClientItem->client_command); QListIterator iterPort(pClientItem->ports); QTreeWidgetItem *pChildItem = NULL; while (iterPort.hasNext()) { qjackctlSession::PortItem *pPortItem = iterPort.next(); pChildItem = new QTreeWidgetItem(pTopLevelItem, pChildItem); pChildItem->setIcon(0, iconStatus(iconPort, pPortItem->connected)); pChildItem->setText(0, pPortItem->port_name); QListIterator iterConnect(pPortItem->connects); QTreeWidgetItem *pLeafItem = NULL; while (iterConnect.hasNext()) { qjackctlSession::ConnectItem *pConnectItem = iterConnect.next(); pLeafItem = new QTreeWidgetItem(pChildItem, pLeafItem); pLeafItem->setIcon(0, iconStatus(iconConnect, !pConnectItem->connected)); pLeafItem->setText(0, pConnectItem->client_name + ':' + pConnectItem->port_name); } } items.append(pTopLevelItem); } m_ui.SessionTreeView->insertTopLevelItems(0, items); m_ui.SessionTreeView->expandAll(); } // Update/populate session connections and tree view. void qjackctlSessionForm::updateSession (void) { m_pSession->update(); updateSessionView(); updateInfraClients(); } // Context menu event handler. void qjackctlSessionForm::sessionViewContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; bool bEnabled = false; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) bEnabled = (pMainForm->jackClient() != NULL); pAction = menu.addAction(QIcon(":/images/open1.png"), tr("&Load..."), this, SLOT(loadSession())); pAction->setEnabled(bEnabled); pAction = menu.addMenu(m_pRecentMenu); pAction->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = menu.addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = menu.addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif menu.addSeparator(); pAction = menu.addAction( tr("&Versioning"), this, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(isSaveSessionVersion()); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateSession())); menu.exec(m_ui.SessionTreeView->mapToGlobal(pos)); } // Add a new infra-client entry. void qjackctlSessionForm::addInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::addInfraClient()"); #endif const QString& sNewInfraClient = tr("New Client"); QTreeWidgetItem *pItem = NULL; const QList& items = m_ui.InfraClientListView->findItems(sNewInfraClient, Qt::MatchExactly); if (items.isEmpty()) { pItem = m_ui.InfraClientListView->currentItem(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), true)); pItem->setText(0, sNewInfraClient); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } else { pItem = items.first(); } m_ui.InfraClientListView->editItem(pItem, 0); } // Edit current infra-client entry. void qjackctlSessionForm::editInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) m_ui.InfraClientListView->editItem(pItem, 1); } void qjackctlSessionForm::editInfraClientCommit (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClientCommit()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); if (!sKey.isEmpty()) { const QString& sValue = pItem->text(1); qjackctlSession::InfraClientItem *pInfraClientItem = NULL; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter == list.end()) { pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } else { pInfraClientItem = iter.value(); pInfraClientItem->client_command = sValue; } pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), pInfraClientItem->client_command.isEmpty())); } } } // Remove current infra-client entry. void qjackctlSessionForm::removeInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::removeInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter != list.end()) { list.erase(iter); updateInfraClients(); } } } // Select current infra-client entry. void qjackctlSessionForm::selectInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::selectInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); m_ui.AddInfraClientPushButton->setEnabled(true); m_ui.EditInfraClientPushButton->setEnabled(pItem != NULL); m_ui.RemoveInfraClientPushButton->setEnabled(pItem != NULL); } // Update/populate infra-clients commands list view. void qjackctlSessionForm::updateInfraClients (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::updateInfraClients()"); #endif int iOldItem = m_ui.InfraClientListView->indexOfTopLevelItem( m_ui.InfraClientListView->currentItem()); m_ui.InfraClientListView->clear(); const QIcon iconClient(":/images/client1.png"); QTreeWidgetItem *pItem = NULL; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::ConstIterator iter = list.constBegin(); const qjackctlSession::InfraClientList::ConstIterator& iter_end = list.constEnd(); for( ; iter != iter_end; ++iter) { qjackctlSession::InfraClientItem *pInfraClientItem = iter.value(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(iconClient, pInfraClientItem->client_command.isEmpty())); pItem->setText(0, pInfraClientItem->client_name); pItem->setText(1, pInfraClientItem->client_command); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); if (iOldItem >= 0 && iOldItem < iItemCount) { m_ui.InfraClientListView->setCurrentItem( m_ui.InfraClientListView->topLevelItem(iOldItem)); } } // Infra-client list context menu. void qjackctlSessionForm::infraClientContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("&Add"), this, SLOT(addInfraClient())); // pAction->setEnabled(true); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("&Edit"), this, SLOT(editInfraClient())); pAction->setEnabled(pItem != NULL); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Re&move"), this, SLOT(removeInfraClient())); pAction->setEnabled(pItem != NULL); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateInfraClients())); // pAction->setEnabled(true); menu.exec(m_ui.InfraClientListView->mapToGlobal(pos)); } // Stabilize form status. void qjackctlSessionForm::stabilizeForm ( bool bEnabled ) { m_ui.LoadSessionPushButton->setEnabled(bEnabled); m_ui.RecentSessionPushButton->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); m_ui.SaveSessionPushButton->setEnabled(bEnabled); m_ui.SaveSessionVersionCheckBox->setEnabled(bEnabled); m_ui.UpdateSessionPushButton->setEnabled(bEnabled); if (!bEnabled) { m_pSession->clear(); m_ui.SessionTreeView->clear(); } selectInfraClient(); } // Keyboard event handler. void qjackctlSessionForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlSessionForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlInterfaceComboBox.cpp0000644000000000000000000000012713215206021021321 xustar0029 mtime=1513425937.53276694 29 atime=1513425937.53276694 29 ctime=1513425937.53276694 qjackctl-0.5.0/src/qjackctlInterfaceComboBox.cpp0000644000175000001440000003152513215206021022155 0ustar00rncbcusers00000000000000// qjackctlInterfaceComboBox.cpp // /**************************************************************************** Copyright (C) 2013, Arnout Engelen. All rights reserved. Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlInterfaceComboBox.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #ifdef CONFIG_COREAUDIO #include #include #include #include #include #endif #ifdef CONFIG_PORTAUDIO #include #include #include #endif #ifdef CONFIG_ALSA_SEQ #include #endif // Constructor. qjackctlInterfaceComboBox::qjackctlInterfaceComboBox ( QWidget *pParent ) : QComboBox(pParent) { QTreeView *pTreeView = new QTreeView(this); pTreeView->header()->hide(); pTreeView->setRootIsDecorated(false); pTreeView->setAllColumnsShowFocus(true); pTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); pTreeView->setSelectionMode(QAbstractItemView::SingleSelection); pTreeView->setModel(new QStandardItemModel()); // pTreeView->setMinimumWidth(320); QComboBox::setView(pTreeView); } void qjackctlInterfaceComboBox::showPopup (void) { populateModel(); QComboBox::showPopup(); } QStandardItemModel *qjackctlInterfaceComboBox::model (void) const { return static_cast (QComboBox::model()); } void qjackctlInterfaceComboBox::setup ( QComboBox *pDriverComboBox, int iAudio, const QString& sDefName ) { m_pDriverComboBox = pDriverComboBox; m_iAudio = iAudio; m_sDefName = sDefName; } void qjackctlInterfaceComboBox::clearCards (void) { model()->clear(); } void qjackctlInterfaceComboBox::addCard ( const QString& sName, const QString& sDescription ) { QList items; if (sName == m_sDefName || sName.isEmpty()) items.append(new QStandardItem(m_sDefName)); else items.append(new QStandardItem(QIcon(":/images/device1.png"), sName)); items.append(new QStandardItem(sDescription)); model()->appendRow(items); } #ifdef CONFIG_COREAUDIO // borrowed from jackpilot source static OSStatus getDeviceUIDFromID( AudioDeviceID id, char *name, UInt32 nsize ) { UInt32 size = sizeof(CFStringRef); CFStringRef UI; OSStatus res = AudioDeviceGetProperty(id, 0, false, kAudioDevicePropertyDeviceUID, &size, &UI); if (res == noErr) CFStringGetCString(UI,name,nsize,CFStringGetSystemEncoding()); CFRelease(UI); return res; } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO #include #include #include #include namespace { class PortAudioProber : public QThread { public: static QStringList getNames(QWidget *pParent) { { QMutexLocker locker(&PortAudioProber::mutex); if (!PortAudioProber::names.isEmpty()) return PortAudioProber::names; } QMessageBox mbox(QMessageBox::Information, tr("Probing..."), tr("Please wait, PortAudio is probing audio hardware."), QMessageBox::Abort, pParent); // Make it impossible to start another PortAudioProber while waiting. mbox.setWindowModality(Qt::WindowModal); PortAudioProber *pab = new PortAudioProber; pab->start(); bool bTimedOut = true; for (int i = 0; i < 100; ++i) { if (mbox.isVisible()) QApplication::processEvents(); QThread::msleep(50); if (i == 10) // wait 1/2 second before showing message box mbox.show(); if (mbox.clickedButton() != NULL) { bTimedOut = false; break; } if (pab->isFinished()) { bTimedOut = false; break; } } if (bTimedOut) { QMessageBox::warning(pParent, tr("Warning"), tr("Audio hardware probing timed out.")); } { QMutexLocker locker(&PortAudioProber::mutex); return names; } } private: PortAudioProber() {} ~PortAudioProber() {} static QMutex mutex; static QStringList names; void run() { if (Pa_Initialize() == paNoError) { // Fill HostApi info... const PaHostApiIndex iNumHostApi = Pa_GetHostApiCount(); QString *hostNames = new QString[iNumHostApi]; for (PaHostApiIndex i = 0; i < iNumHostApi; ++i) hostNames[i] = QString(Pa_GetHostApiInfo(i)->name); // Fill device info... const PaDeviceIndex iNumDevice = Pa_GetDeviceCount(); { QMutexLocker locker(&PortAudioProber::mutex); if (PortAudioProber::names.isEmpty()) { for (PaDeviceIndex i = 0; i < iNumDevice; ++i) { PaDeviceInfo *pDeviceInfo = const_cast (Pa_GetDeviceInfo(i)); const QString sName = hostNames[pDeviceInfo->hostApi] + "::" + QString(pDeviceInfo->name); PortAudioProber::names.push_back(sName); } } } delete [] hostNames; Pa_Terminate(); } } }; QMutex PortAudioProber::mutex; QStringList PortAudioProber::names; } // namespace #endif // CONFIG_PORTAUDIO void qjackctlInterfaceComboBox::populateModel (void) { const bool bBlockSignals = QComboBox::blockSignals(true); QComboBox::setUpdatesEnabled(false); QComboBox::setDuplicatesEnabled(false); QLineEdit *pLineEdit = QComboBox::lineEdit(); // FIXME: Only valid for ALSA, Sun and OSS devices, // for the time being... and also CoreAudio ones too. const QString& sDriver = m_pDriverComboBox->currentText(); const bool bAlsa = (sDriver == "alsa"); const bool bSun = (sDriver == "sun"); const bool bOss = (sDriver == "oss"); #ifdef CONFIG_COREAUDIO const bool bCoreaudio = (sDriver == "coreaudio"); std::map coreaudioIdMap; #endif #ifdef CONFIG_PORTAUDIO const bool bPortaudio = (sDriver == "portaudio"); #endif QString sCurName = pLineEdit->text(); QString sName, sSubName; int iCards = 0; clearCards(); int iCurCard = -1; if (bAlsa) { #ifdef CONFIG_ALSA_SEQ // Enumerate the ALSA cards and PCM harfware devices... snd_ctl_t *handle; snd_ctl_card_info_t *info; snd_pcm_info_t *pcminfo; snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); const QString sPrefix("hw:%1"); const QString sSuffix(" (%1)"); const QString sSubSuffix("%1,%2"); QString sName2, sSubName2; bool bCapture, bPlayback; int iCard = -1; while (snd_card_next(&iCard) >= 0 && iCard >= 0) { sName = sPrefix.arg(iCard); if (snd_ctl_open(&handle, sName.toUtf8().constData(), 0) >= 0 && snd_ctl_card_info(handle, info) >= 0) { sName2 = sPrefix.arg(snd_ctl_card_info_get_id(info)); addCard(sName2, snd_ctl_card_info_get_name(info) + sSuffix.arg(sName)); if (sCurName == sName || sCurName == sName2) iCurCard = iCards; ++iCards; int iDevice = -1; while (snd_ctl_pcm_next_device(handle, &iDevice) >= 0 && iDevice >= 0) { // Capture devices.. bCapture = false; if (m_iAudio == QJACKCTL_CAPTURE || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_CAPTURE); bCapture = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // Playback devices.. bPlayback = false; if (m_iAudio == QJACKCTL_PLAYBACK || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_PLAYBACK); bPlayback = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // List iif compliant with the audio mode criteria... if ((m_iAudio == QJACKCTL_CAPTURE && bCapture && !bPlayback) || (m_iAudio == QJACKCTL_PLAYBACK && !bCapture && bPlayback) || (m_iAudio == QJACKCTL_DUPLEX && bCapture && bPlayback)) { sSubName = sSubSuffix.arg(sName).arg(iDevice); sSubName2 = sSubSuffix.arg(sName2).arg(iDevice); addCard(sSubName2, snd_pcm_info_get_name(pcminfo) + sSuffix.arg(sSubName)); if (sCurName == sSubName || sCurName == sSubName2) iCurCard = iCards; ++iCards; } } snd_ctl_close(handle); } } #endif // CONFIG_ALSA_SEQ } else if (bSun) { QFile file("/var/run/dmesg.boot"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; QRegExp rxDevice("audio([0-9]) at (.*)"); while (!stream.atEnd()) { sLine = stream.readLine(); if (rxDevice.exactMatch(sLine)) { sName = "/dev/audio" + rxDevice.cap(1); addCard(sName, rxDevice.cap(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } } file.close(); } } else if (bOss) { // Enumerate the OSS Audio devices... QFile file("/dev/sndstat"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; bool bAudioDevices = false; QRegExp rxHeader("Audio devices.*", Qt::CaseInsensitive); QRegExp rxDevice("([0-9]+):[ ]+(.*)"); while (!stream.atEnd()) { sLine = stream.readLine(); if (bAudioDevices) { if (rxDevice.exactMatch(sLine)) { sName = "/dev/dsp" + rxDevice.cap(1); addCard(sName, rxDevice.cap(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } else break; } else if (rxHeader.exactMatch(sLine)) bAudioDevices = true; } file.close(); } } #ifdef CONFIG_COREAUDIO else if (bCoreaudio) { // Find out how many Core Audio devices are there, if any... // (code snippet gently "borrowed" from Stephane Letz jackdmp;) OSStatus err; Boolean isWritable; UInt32 outSize = sizeof(isWritable); err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &outSize, &isWritable); if (err == noErr) { // Calculate the number of device available... int numCoreDevices = outSize / sizeof(AudioDeviceID); // Make space for the devices we are about to get... AudioDeviceID *coreDeviceIDs = new AudioDeviceID [numCoreDevices]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &outSize, (void *) coreDeviceIDs); if (err == noErr) { // Look for the CoreAudio device name... char coreDeviceName[256]; UInt32 nameSize = 256; for (int i = 0; i < numCoreDevices; i++) { err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &outSize, &isWritable); if (err == noErr) { err = AudioDeviceGetProperty(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &nameSize, (void *) coreDeviceName); if (err == noErr) { char drivername[128]; UInt32 dnsize = 128; // this returns the unique id for the device // that must be used on the commandline for jack if (getDeviceUIDFromID(coreDeviceIDs[i], drivername, dnsize) == noErr) { sName = drivername; } else { sName = "Error"; } coreaudioIdMap[sName] = coreDeviceIDs[i]; // TODO: hide this ugly ID from the user, // only show human readable name // humanreadable \t UID sSubName = QString(coreDeviceName); addCard(sName, sSubName); if (sCurName == sName || sCurName == sSubName) iCurCard = iCards; ++iCards; } } } } delete [] coreDeviceIDs; } } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO else if (bPortaudio) { const QStringList& names = PortAudioProber::getNames(this); const int iCards = names.size(); for (int i = 0; i < iCards; ++i) { const QString& sName = names[i]; if (sCurName == sName) iCurCard = iCards; addCard(sName, QString()); } } #endif // CONFIG_PORTAUDIO addCard(m_sDefName, QString()); if (sCurName == m_sDefName || sCurName.isEmpty()) iCurCard = iCards; ++iCards; QTreeView *pTreeView = static_cast (QComboBox::view()); #if QT_VERSION < 0x050000 pTreeView->header()->setResizeMode(QHeaderView::ResizeToContents); #else pTreeView->header()->resizeSections(QHeaderView::ResizeToContents); #endif pTreeView->setMinimumWidth( pTreeView->sizeHint().width() + QComboBox::iconSize().width()); QComboBox::setCurrentIndex(iCurCard); pLineEdit->setText(sCurName); QComboBox::setUpdatesEnabled(true); QComboBox::blockSignals(bBlockSignals); } // end of qjackctlInterfaceComboBox.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSystemTray.cpp0000644000000000000000000000012713215206021020114 xustar0029 mtime=1513425937.54176694 29 atime=1513425937.54176694 29 ctime=1513425937.54176694 qjackctl-0.5.0/src/qjackctlSystemTray.cpp0000644000175000001440000001004213215206021020737 0ustar00rncbcusers00000000000000// qjackctlSystemTray.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSystemTray.h" #include #include #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. // Constructor. qjackctlSystemTray::qjackctlSystemTray ( QWidget *pParent ) : QSystemTrayIcon(pParent) { // Set things inherited... if (pParent) { m_icon = pParent->windowIcon(); setBackground(Qt::transparent); // also updates pixmap. QSystemTrayIcon::setIcon(m_icon); QSystemTrayIcon::setToolTip(pParent->windowTitle()); } // Set proper context menu, even though it's empty... QSystemTrayIcon::setContextMenu(&m_menu); QObject::connect(&m_menu, SIGNAL(aboutToShow()), SLOT(contextMenuRequested())); QObject::connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(activated(QSystemTrayIcon::ActivationReason))); QSystemTrayIcon::show(); } // Redirect to hide. void qjackctlSystemTray::close (void) { QSystemTrayIcon::hide(); } // Handle systeam tray activity. void qjackctlSystemTray::activated ( QSystemTrayIcon::ActivationReason reason ) { switch (reason) { #if 0 case QSystemTrayIcon::Context: contextMenuRequested(); break; #endif case QSystemTrayIcon::Trigger: emit clicked(); break; case QSystemTrayIcon::MiddleClick: emit middleClicked(); break; case QSystemTrayIcon::DoubleClick: emit doubleClicked(); break; case QSystemTrayIcon::Unknown: default: break; } } void qjackctlSystemTray::contextMenuRequested (void) { // Don't show dummy menu box, ever... if (qobject_cast (sender()) == &m_menu) m_menu.hide(); emit contextMenuRequested(QCursor::pos()); } // Default destructor. qjackctlSystemTray::~qjackctlSystemTray (void) { } // System tray icon/pixmaps update method. void qjackctlSystemTray::updatePixmap (void) { // Renitialize icon as fit... m_pixmap = m_icon.pixmap(32, 32); // Merge with the overlay pixmap... if (!m_pixmapOverlay.mask().isNull()) { const int y = m_pixmap.height() - m_pixmapOverlay.height(); QBitmap mask = m_pixmap.mask(); QPainter(&mask).drawPixmap(0, y, m_pixmapOverlay.mask()); m_pixmap.setMask(mask); QPainter(&m_pixmap).drawPixmap(0, y, m_pixmapOverlay); } if (m_background != Qt::transparent) { QPixmap pixmap(m_pixmap); m_pixmap.fill(m_background); QPainter(&m_pixmap).drawPixmap(0, 0, pixmap); } // Setup system tray icon directly... QSystemTrayIcon::setIcon(QIcon(m_pixmap)); } // Background mask methods. void qjackctlSystemTray::setBackground ( const QColor& background ) { // Set background color, now. m_background = background; updatePixmap(); } const QColor& qjackctlSystemTray::background (void) const { return m_background; } // Set system tray icon overlay. void qjackctlSystemTray::setPixmapOverlay ( const QPixmap& pmOverlay ) { m_pixmapOverlay = pmOverlay; updatePixmap(); } const QPixmap& qjackctlSystemTray::pixmapOverlay (void) const { return m_pixmapOverlay; } // end of qjackctlSystemTray.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSetupForm.cpp0000644000000000000000000000012713215206021017714 xustar0029 mtime=1513425937.54076694 29 atime=1513425937.53976694 29 ctime=1513425937.54076694 qjackctl-0.5.0/src/qjackctlSetupForm.cpp0000644000175000001440000016671613215206021020563 0ustar00rncbcusers00000000000000// qjackctlSetupForm.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetupForm.h" #include "qjackctlMainForm.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #include #include #include #ifdef CONFIG_COREAUDIO #include #include #include #include #include #endif #ifdef CONFIG_PORTAUDIO #include #include #include #endif #ifdef CONFIG_ALSA_SEQ #include #endif //---------------------------------------------------------------------------- // qjackctlSetupForm -- UI wrapper form. // Constructor. qjackctlSetupForm::qjackctlSetupForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // No settings descriptor initially (the caller will set it). m_pSetup = NULL; // Setup time-display radio-button group. m_pTimeDisplayButtonGroup = new QButtonGroup(this); m_pTimeDisplayButtonGroup->addButton(m_ui.TransportTimeRadioButton, 0); m_pTimeDisplayButtonGroup->addButton(m_ui.TransportBBTRadioButton, 1); m_pTimeDisplayButtonGroup->addButton(m_ui.ElapsedResetRadioButton, 2); m_pTimeDisplayButtonGroup->addButton(m_ui.ElapsedXrunRadioButton, 3); m_pTimeDisplayButtonGroup->setExclusive(true); // Initialize dirty control state. m_iDirtySetup = 0; m_iDirtySettings = 0; m_iDirtyOptions = 0; // Set dialog validators... m_ui.PresetComboBox->setValidator( new QRegExpValidator(QRegExp("[\\w-]+"), m_ui.PresetComboBox)); m_ui.FramesComboBox->setValidator( new QIntValidator(m_ui.FramesComboBox)); m_ui.SampleRateComboBox->setValidator( new QIntValidator(m_ui.SampleRateComboBox)); m_ui.WaitComboBox->setValidator( new QIntValidator(m_ui.WaitComboBox)); m_ui.WordLengthComboBox->setValidator( new QIntValidator(m_ui.WordLengthComboBox)); m_ui.TimeoutComboBox->setValidator( new QIntValidator(m_ui.TimeoutComboBox)); m_ui.PortMaxComboBox->setValidator( new QIntValidator(m_ui.PortMaxComboBox)); m_ui.MessagesLimitLinesComboBox->setValidator( new QIntValidator(m_ui.MessagesLimitLinesComboBox)); m_ui.PresetComboBox->setCompleter(NULL); m_ui.ServerNameComboBox->setCompleter(NULL); m_ui.ServerPrefixComboBox->setCompleter(NULL); m_ui.ServerSuffixComboBox->setCompleter(NULL); // UI connections... QObject::connect(m_ui.PresetComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changeCurrentPreset(const QString&))); QObject::connect(m_ui.PresetSavePushButton, SIGNAL(clicked()), SLOT(saveCurrentPreset())); QObject::connect(m_ui.PresetDeletePushButton, SIGNAL(clicked()), SLOT(deleteCurrentPreset())); QObject::connect(m_ui.DriverComboBox, SIGNAL(activated(int)), SLOT(changeDriver(int))); QObject::connect(m_ui.AudioComboBox, SIGNAL(activated(int)), SLOT(changeAudio(int))); QObject::connect(m_ui.ServerPrefixComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ServerNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.DriverComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.RealtimeCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.NoMemLockCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.SoftModeCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.MonitorCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.ShortsCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.HWMonCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.HWMeterCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.IgnoreHWCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.UnlockMemCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.VerboseCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.PrioritySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.FramesComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.SampleRateComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.PeriodsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.WordLengthComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.WaitComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ChanSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.InterfaceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.AudioComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.DitherComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.TimeoutComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.InDeviceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.OutDeviceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.InChannelsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.OutChannelsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.InLatencySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.OutLatencySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); #ifdef CONFIG_JACK_MIDI QObject::connect(m_ui.MidiDriverComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); #endif QObject::connect(m_ui.StartDelaySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.PortMaxComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ServerSuffixComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.StartupScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.StartupScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.PostStartupScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.PostStartupScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ShutdownScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ShutdownScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.PostShutdownScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.PostShutdownScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.StartupScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browseStartupScript())); QObject::connect(m_ui.PostStartupScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browsePostStartupScript())); QObject::connect(m_ui.ShutdownScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browseShutdownScript())); QObject::connect(m_ui.PostShutdownScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browsePostShutdownScript())); QObject::connect(m_ui.StartupScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolStartupScript())); QObject::connect(m_ui.PostStartupScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolPostStartupScript())); QObject::connect(m_ui.ShutdownScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolShutdownScript())); QObject::connect(m_ui.PostShutdownScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolPostShutdownScript())); QObject::connect(m_ui.StdoutCaptureCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.XrunRegexComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayPathComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayPathToolButton, SIGNAL(clicked()), SLOT(browseActivePatchbayPath())); QObject::connect(m_ui.ActivePatchbayResetCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryDisconnectCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogPathComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogPathToolButton, SIGNAL(clicked()), SLOT(browseMessagesLogPath())); QObject::connect(m_ui.TransportTimeRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.TransportBBTRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.ElapsedResetRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.ElapsedXrunRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.TimeFormatComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.DisplayEffectCheckBox, SIGNAL(toggled(bool)), SLOT(toggleDisplayEffect(bool))); QObject::connect(m_ui.DisplayBlinkCheckBox, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.DisplayFont1PushButton, SIGNAL(clicked()), SLOT(chooseDisplayFont1())); QObject::connect(m_ui.DisplayFont2PushButton, SIGNAL(clicked()), SLOT(chooseDisplayFont2())); QObject::connect(m_ui.MessagesFontPushButton, SIGNAL(clicked()), SLOT(chooseMessagesFont())); QObject::connect(m_ui.ConnectionsFontPushButton, SIGNAL(clicked()), SLOT(chooseConnectionsFont())); QObject::connect(m_ui.MessagesLimitCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLimitLinesComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ConnectionsIconSizeComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.BezierLinesCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.AliasesEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.AliasesEditingCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_JACK_PORT_ALIASES QObject::connect(m_ui.JackClientPortAliasComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.JackClientPortMetadataCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.StartJackCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.StopJackCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryCloseCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryShutdownCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.KeepOnTopCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_SYSTEM_TRAY QObject::connect(m_ui.SystemTrayCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.SystemTrayQueryCloseCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.StartMinimizedCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif #ifdef CONFIG_XUNIQUE QObject::connect(m_ui.SingletonCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.ServerConfigCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ServerConfigNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ServerConfigTempCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_ALSA_SEQ QObject::connect(m_ui.AlsaSeqEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif #ifdef CONFIG_DBUS QObject::connect(m_ui.DBusEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.JackDBusEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.LeftButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.RightButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.TransportButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.TextLabelsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.BaseFontSizeComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); // Try to restore old window positioning. adjustSize(); } // Destructor. qjackctlSetupForm::~qjackctlSetupForm (void) { delete m_pTimeDisplayButtonGroup; } // A combo-box text item setter helper. void qjackctlSetupForm::setComboBoxCurrentText ( QComboBox *pComboBox, const QString& sText ) const { if (pComboBox->isEditable()) { pComboBox->setEditText(sText); } else { int iIndex = pComboBox->findText(sText); if (iIndex < 0) { iIndex = 0; if (!sText.isEmpty()) pComboBox->insertItem(0, sText); } pComboBox->setCurrentIndex(iIndex); } } // Populate (setup) dialog controls from settings descriptors. void qjackctlSetupForm::setup ( qjackctlSetup *pSetup ) { // Set reference descriptor. m_pSetup = pSetup; // Avoid dirty this all up. ++m_iDirtySetup; // Load combo box history... m_pSetup->loadComboBoxHistory(m_ui.ServerPrefixComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerNameComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerSuffixComboBox); m_pSetup->loadComboBoxHistory(m_ui.StartupScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.PostStartupScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.ShutdownScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.PostShutdownScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.XrunRegexComboBox); m_pSetup->loadComboBoxHistory(m_ui.ActivePatchbayPathComboBox); m_pSetup->loadComboBoxHistory(m_ui.MessagesLogPathComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerConfigNameComboBox); m_ui.InterfaceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_DUPLEX, m_pSetup->sDefPresetName); m_ui.InDeviceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_CAPTURE, m_pSetup->sDefPresetName); m_ui.OutDeviceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_PLAYBACK, m_pSetup->sDefPresetName); // Load Options... m_ui.StartupScriptCheckBox->setChecked(m_pSetup->bStartupScript); setComboBoxCurrentText(m_ui.StartupScriptShellComboBox, m_pSetup->sStartupScriptShell); m_ui.PostStartupScriptCheckBox->setChecked(m_pSetup->bPostStartupScript); setComboBoxCurrentText(m_ui.PostStartupScriptShellComboBox, m_pSetup->sPostStartupScriptShell); m_ui.ShutdownScriptCheckBox->setChecked(m_pSetup->bShutdownScript); setComboBoxCurrentText(m_ui.ShutdownScriptShellComboBox, m_pSetup->sShutdownScriptShell); m_ui.PostShutdownScriptCheckBox->setChecked(m_pSetup->bPostShutdownScript); setComboBoxCurrentText(m_ui.PostShutdownScriptShellComboBox, m_pSetup->sPostShutdownScriptShell); m_ui.StdoutCaptureCheckBox->setChecked(m_pSetup->bStdoutCapture); setComboBoxCurrentText(m_ui.XrunRegexComboBox, m_pSetup->sXrunRegex); m_ui.ActivePatchbayCheckBox->setChecked(m_pSetup->bActivePatchbay); setComboBoxCurrentText(m_ui.ActivePatchbayPathComboBox, m_pSetup->sActivePatchbayPath); m_ui.ActivePatchbayResetCheckBox->setChecked(m_pSetup->bActivePatchbayReset); m_ui.QueryDisconnectCheckBox->setChecked(m_pSetup->bQueryDisconnect); m_ui.MessagesLogCheckBox->setChecked(m_pSetup->bMessagesLog); setComboBoxCurrentText(m_ui.MessagesLogPathComboBox, m_pSetup->sMessagesLogPath); m_ui.BezierLinesCheckBox->setChecked(m_pSetup->bBezierLines); // Load some other defaults... QRadioButton *pRadioButton = static_cast ( m_pTimeDisplayButtonGroup->button(m_pSetup->iTimeDisplay)); if (pRadioButton) pRadioButton->setChecked(true); m_ui.TimeFormatComboBox->setCurrentIndex(m_pSetup->iTimeFormat); // Load font chooser samples... const QString sSansSerif = "Sans Serif"; QFont font; QPalette pal; if (m_pSetup->sDisplayFont1.isEmpty() || !font.fromString(m_pSetup->sDisplayFont1)) font = QFont(sSansSerif, 12, QFont::Bold); m_ui.DisplayFont1TextLabel->setFont(font); m_ui.DisplayFont1TextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sDisplayFont2.isEmpty() || !font.fromString(m_pSetup->sDisplayFont2)) font = QFont(sSansSerif, 6, QFont::Bold); m_ui.DisplayFont2TextLabel->setFont(font); m_ui.DisplayFont2TextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sMessagesFont.isEmpty() || !font.fromString(m_pSetup->sMessagesFont)) font = QFont("Monospace", 8); pal = m_ui.MessagesFontTextLabel->palette(); pal.setColor(QPalette::Background, pal.base().color()); m_ui.MessagesFontTextLabel->setPalette(pal); m_ui.MessagesFontTextLabel->setFont(font); m_ui.MessagesFontTextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sConnectionsFont.isEmpty() || !font.fromString(m_pSetup->sConnectionsFont)) font = QFont(sSansSerif, 10); pal = m_ui.ConnectionsFontTextLabel->palette(); pal.setColor(QPalette::Background, pal.base().color()); m_ui.ConnectionsFontTextLabel->setPalette(pal); m_ui.ConnectionsFontTextLabel->setFont(font); m_ui.ConnectionsFontTextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); // The main display shiny effect option. m_ui.DisplayEffectCheckBox->setChecked(m_pSetup->bDisplayEffect); m_ui.DisplayBlinkCheckBox->setChecked(m_pSetup->bDisplayBlink); toggleDisplayEffect(m_pSetup->bDisplayEffect); // Connections view icon size. m_ui.ConnectionsIconSizeComboBox->setCurrentIndex( m_pSetup->iConnectionsIconSize); // and this JACK specialities... m_ui.JackClientPortAliasComboBox->setCurrentIndex( m_pSetup->iJackClientPortAlias); m_ui.JackClientPortMetadataCheckBox->setChecked( m_pSetup->bJackClientPortMetadata); // Messages limit option. m_ui.MessagesLimitCheckBox->setChecked(m_pSetup->bMessagesLimit); setComboBoxCurrentText(m_ui.MessagesLimitLinesComboBox, QString::number(m_pSetup->iMessagesLimitLines)); // Other misc options... m_ui.StartJackCheckBox->setChecked(m_pSetup->bStartJack); m_ui.StopJackCheckBox->setChecked(m_pSetup->bStopJack); m_ui.QueryCloseCheckBox->setChecked(m_pSetup->bQueryClose); m_ui.QueryShutdownCheckBox->setChecked(m_pSetup->bQueryShutdown); m_ui.KeepOnTopCheckBox->setChecked(m_pSetup->bKeepOnTop); #ifdef CONFIG_SYSTEM_TRAY m_ui.SystemTrayCheckBox->setChecked(m_pSetup->bSystemTray); m_ui.SystemTrayQueryCloseCheckBox->setChecked(m_pSetup->bSystemTrayQueryClose); m_ui.StartMinimizedCheckBox->setChecked(m_pSetup->bStartMinimized); #endif m_ui.SingletonCheckBox->setChecked(m_pSetup->bSingleton); m_ui.ServerConfigCheckBox->setChecked(m_pSetup->bServerConfig); setComboBoxCurrentText(m_ui.ServerConfigNameComboBox, m_pSetup->sServerConfigName); m_ui.ServerConfigTempCheckBox->setChecked(m_pSetup->bServerConfigTemp); m_ui.AlsaSeqEnabledCheckBox->setChecked(m_pSetup->bAlsaSeqEnabled); m_ui.DBusEnabledCheckBox->setChecked(m_pSetup->bDBusEnabled); m_ui.JackDBusEnabledCheckBox->setChecked(m_pSetup->bJackDBusEnabled); m_ui.AliasesEnabledCheckBox->setChecked(m_pSetup->bAliasesEnabled); m_ui.AliasesEditingCheckBox->setChecked(m_pSetup->bAliasesEditing); m_ui.LeftButtonsCheckBox->setChecked(!m_pSetup->bLeftButtons); m_ui.RightButtonsCheckBox->setChecked(!m_pSetup->bRightButtons); m_ui.TransportButtonsCheckBox->setChecked(!m_pSetup->bTransportButtons); m_ui.TextLabelsCheckBox->setChecked(!m_pSetup->bTextLabels); if (m_pSetup->iBaseFontSize > 0) m_ui.BaseFontSizeComboBox->setEditText(QString::number(m_pSetup->iBaseFontSize)); else m_ui.BaseFontSizeComboBox->setCurrentIndex(0); #ifndef CONFIG_SYSTEM_TRAY m_ui.SystemTrayCheckBox->setChecked(false); m_ui.SystemTrayCheckBox->setEnabled(false); m_ui.SystemTrayQueryCloseCheckBox->setChecked(false); m_ui.SystemTrayQueryCloseCheckBox->setEnabled(false); #endif #ifndef CONFIG_JACK_MIDI m_ui.MidiDriverComboBox->setCurrentIndex(0); m_ui.MidiDriverTextLabel->setEnabled(false); m_ui.MidiDriverComboBox->setEnabled(false); #endif #ifndef CONFIG_JACK_PORT_ALIASES m_ui.JackClientPortAliasComboBox->setCurrentIndex(0); m_ui.JackClientPortAliasTextLabel->setEnabled(false); m_ui.JackClientPortAliasComboBox->setEnabled(false); #endif #ifndef CONFIG_JACK_METADATA m_ui.JackClientPortMetadataCheckBox->setChecked(false); m_ui.JackClientPortMetadataCheckBox->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaSeqEnabledCheckBox->setEnabled(false); #endif #ifndef CONFIG_DBUS m_ui.DBusEnabledCheckBox->setEnabled(false); m_ui.JackDBusEnabledCheckBox->setEnabled(false); #endif // Load preset list... resetPresets(); updateCurrentPreset(); // We're clean now. --m_iDirtySetup; stabilizeForm(); } void qjackctlSetupForm::changePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return; // Load Settings... qjackctlPreset preset; if (m_pSetup->loadPreset(preset, sPreset)) { setComboBoxCurrentText(m_ui.ServerPrefixComboBox, preset.sServerPrefix); setComboBoxCurrentText(m_ui.ServerNameComboBox, preset.sServerName.isEmpty() ? m_pSetup->sDefPresetName : preset.sServerName); m_ui.RealtimeCheckBox->setChecked(preset.bRealtime); m_ui.SoftModeCheckBox->setChecked(preset.bSoftMode); m_ui.MonitorCheckBox->setChecked(preset.bMonitor); m_ui.ShortsCheckBox->setChecked(preset.bShorts); m_ui.NoMemLockCheckBox->setChecked(preset.bNoMemLock); m_ui.UnlockMemCheckBox->setChecked(preset.bUnlockMem); m_ui.HWMonCheckBox->setChecked(preset.bHWMon); m_ui.HWMeterCheckBox->setChecked(preset.bHWMeter); m_ui.IgnoreHWCheckBox->setChecked(preset.bIgnoreHW); m_ui.PrioritySpinBox->setValue(preset.iPriority); setComboBoxCurrentText(m_ui.FramesComboBox, QString::number(preset.iFrames)); setComboBoxCurrentText(m_ui.SampleRateComboBox, QString::number(preset.iSampleRate)); m_ui.PeriodsSpinBox->setValue(preset.iPeriods); setComboBoxCurrentText(m_ui.WordLengthComboBox, QString::number(preset.iWordLength)); setComboBoxCurrentText(m_ui.WaitComboBox, QString::number(preset.iWait)); m_ui.ChanSpinBox->setValue(preset.iChan); setComboBoxCurrentText(m_ui.DriverComboBox, preset.sDriver); setComboBoxCurrentText(m_ui.InterfaceComboBox, preset.sInterface.isEmpty() ? m_pSetup->sDefPresetName : preset.sInterface); m_ui.AudioComboBox->setCurrentIndex(preset.iAudio); m_ui.DitherComboBox->setCurrentIndex(preset.iDither); setComboBoxCurrentText(m_ui.TimeoutComboBox, QString::number(preset.iTimeout)); setComboBoxCurrentText(m_ui.InDeviceComboBox, preset.sInDevice.isEmpty() ? m_pSetup->sDefPresetName : preset.sInDevice); setComboBoxCurrentText(m_ui.OutDeviceComboBox, preset.sOutDevice.isEmpty() ? m_pSetup->sDefPresetName : preset.sOutDevice); m_ui.InChannelsSpinBox->setValue(preset.iInChannels); m_ui.OutChannelsSpinBox->setValue(preset.iOutChannels); m_ui.InLatencySpinBox->setValue(preset.iInLatency); m_ui.OutLatencySpinBox->setValue(preset.iOutLatency); m_ui.StartDelaySpinBox->setValue(preset.iStartDelay); m_ui.VerboseCheckBox->setChecked(preset.bVerbose); setComboBoxCurrentText(m_ui.PortMaxComboBox, QString::number(preset.iPortMax)); #ifdef CONFIG_JACK_MIDI setComboBoxCurrentText(m_ui.MidiDriverComboBox, preset.sMidiDriver); #endif setComboBoxCurrentText(m_ui.ServerSuffixComboBox, preset.sServerSuffix); // Reset dirty flag. m_iDirtySettings = 0; } // Set current preset name.. m_sPreset = sPreset; } bool qjackctlSetupForm::savePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return false; // Unload settings. qjackctlPreset preset; preset.sServerPrefix = m_ui.ServerPrefixComboBox->currentText(); preset.sServerName = m_ui.ServerNameComboBox->currentText(); preset.bRealtime = m_ui.RealtimeCheckBox->isChecked(); preset.bSoftMode = m_ui.SoftModeCheckBox->isChecked(); preset.bMonitor = m_ui.MonitorCheckBox->isChecked(); preset.bShorts = m_ui.ShortsCheckBox->isChecked(); preset.bNoMemLock = m_ui.NoMemLockCheckBox->isChecked(); preset.bUnlockMem = m_ui.UnlockMemCheckBox->isChecked(); preset.bHWMon = m_ui.HWMonCheckBox->isChecked(); preset.bHWMeter = m_ui.HWMeterCheckBox->isChecked(); preset.bIgnoreHW = m_ui.IgnoreHWCheckBox->isChecked(); preset.iPriority = m_ui.PrioritySpinBox->value(); preset.iFrames = m_ui.FramesComboBox->currentText().toInt(); preset.iSampleRate = m_ui.SampleRateComboBox->currentText().toInt(); preset.iPeriods = m_ui.PeriodsSpinBox->value(); preset.iWordLength = m_ui.WordLengthComboBox->currentText().toInt(); preset.iWait = m_ui.WaitComboBox->currentText().toInt(); preset.iChan = m_ui.ChanSpinBox->value(); preset.sDriver = m_ui.DriverComboBox->currentText(); preset.sInterface = m_ui.InterfaceComboBox->currentText(); preset.iAudio = m_ui.AudioComboBox->currentIndex(); preset.iDither = m_ui.DitherComboBox->currentIndex(); preset.iTimeout = m_ui.TimeoutComboBox->currentText().toInt(); preset.sInDevice = m_ui.InDeviceComboBox->currentText(); preset.sOutDevice = m_ui.OutDeviceComboBox->currentText(); preset.iInChannels = m_ui.InChannelsSpinBox->value(); preset.iOutChannels = m_ui.OutChannelsSpinBox->value(); preset.iInLatency = m_ui.InLatencySpinBox->value(); preset.iOutLatency = m_ui.OutLatencySpinBox->value(); preset.iStartDelay = m_ui.StartDelaySpinBox->value(); preset.bVerbose = m_ui.VerboseCheckBox->isChecked(); preset.iPortMax = m_ui.PortMaxComboBox->currentText().toInt(); #ifdef CONFIG_JACK_MIDI preset.sMidiDriver = m_ui.MidiDriverComboBox->currentText(); #endif preset.sServerSuffix = m_ui.ServerSuffixComboBox->currentText(); if (preset.sServerName == m_pSetup->sDefPresetName) preset.sServerName.clear(); if (preset.sInterface == m_pSetup->sDefPresetName) preset.sInterface.clear(); if (preset.sInDevice == m_pSetup->sDefPresetName) preset.sInDevice.clear(); if (preset.sOutDevice == m_pSetup->sDefPresetName) preset.sOutDevice.clear(); m_pSetup->savePreset(preset, sPreset); return true; } bool qjackctlSetupForm::deletePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return false; // Just remove the preset item... m_pSetup->deletePreset(sPreset); return true; } void qjackctlSetupForm::resetPresets (void) { m_ui.PresetComboBox->clear(); m_ui.PresetComboBox->addItems(m_pSetup->presets); m_ui.PresetComboBox->addItem(m_pSetup->sDefPresetName); } void qjackctlSetupForm::updateCurrentPreset (void) { // Have current preset changed anyhow? if (m_pSetup && m_pSetup->sDefPreset != m_sPreset) { ++m_iDirtySetup; setComboBoxCurrentText(m_ui.PresetComboBox, m_pSetup->sDefPreset); changePreset(m_ui.PresetComboBox->currentText()); --m_iDirtySetup; } } void qjackctlSetupForm::changeCurrentPreset ( const QString& sPreset ) { if (m_iDirtySetup > 0) return; // Check if there's any pending changes... if (m_iDirtySettings > 0 && !m_sPreset.isEmpty()) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPreset), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: savePreset(m_sPreset); ++m_iDirtySetup; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, sPreset); --m_iDirtySetup; // Fall thru... case QMessageBox::Discard: m_iDirtySettings = 0; break; default: // Cancel... ++m_iDirtySetup; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, m_sPreset); --m_iDirtySetup; return; } } changePreset(sPreset); optionsChanged(); } void qjackctlSetupForm::saveCurrentPreset (void) { const QString sPreset = m_ui.PresetComboBox->currentText(); if (savePreset(sPreset)) { // Reset preset combobox list. ++m_iDirtySetup; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, sPreset); --m_iDirtySetup; // Reset dirty flag. m_iDirtySettings = 0; stabilizeForm(); } } void qjackctlSetupForm::deleteCurrentPreset (void) { const QString sPreset = m_ui.PresetComboBox->currentText(); // Try to prompt user if he/she really wants this... if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Delete preset:\n\n" "\"%1\"\n\nAre you sure?") .arg(sPreset), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; if (deletePreset(sPreset)) { // Reset preset combobox list, // and load a new available preset.. ++m_iDirtySetup; int iItem = m_ui.PresetComboBox->currentIndex(); resetPresets(); m_ui.PresetComboBox->setCurrentIndex(iItem); changePreset(m_ui.PresetComboBox->currentText()); --m_iDirtySetup; // Take care that maybe it was the default one... if (m_pSetup->sDefPreset == sPreset) m_pSetup->sDefPreset = m_sPreset; // Make this stable now. optionsChanged(); } } void qjackctlSetupForm::computeLatency (void) { float lat = 0.0; int p = m_ui.FramesComboBox->currentText().toInt(); int r = m_ui.SampleRateComboBox->currentText().toInt(); int n = m_ui.PeriodsSpinBox->value(); if (r > 0) lat = (float) (1000.0 * p * n) / (float) r; if (lat > 0.0) m_ui.LatencyTextValue->setText(QString::number(lat, 'g', 3) + " " + tr("msec")); else m_ui.LatencyTextValue->setText(tr("n/a")); } void qjackctlSetupForm::changeDriverAudio ( const QString& sDriver, int iAudio ) { bool bSun = (sDriver == "sun"); bool bOss = (sDriver == "oss"); bool bAlsa = (sDriver == "alsa"); bool bCoreaudio = (sDriver == "coreaudio"); bool bPortaudio = (sDriver == "portaudio"); bool bFreebob = (sDriver == "freebob"); bool bFirewire = (sDriver == "firewire"); bool bNet = (sDriver == "net" || sDriver == "netone"); bool bInEnabled = false; bool bOutEnabled = false; bool bEnabled; switch (iAudio) { case QJACKCTL_DUPLEX: bInEnabled = (bSun || bOss || bAlsa || bCoreaudio || bPortaudio || bNet); bOutEnabled = (bSun || bOss || bAlsa || bCoreaudio || bPortaudio || bNet); break; case QJACKCTL_CAPTURE: bInEnabled = (bSun || bOss || bCoreaudio || bPortaudio || bNet); break; case QJACKCTL_PLAYBACK: bOutEnabled = (bSun || bOss || bCoreaudio || bPortaudio || bNet); break; } bEnabled = (bInEnabled && (bAlsa || bSun || bOss || bPortaudio)); m_ui.InDeviceTextLabel->setEnabled(bEnabled); m_ui.InDeviceComboBox->setEnabled(bEnabled); if (!bEnabled) setComboBoxCurrentText(m_ui.InDeviceComboBox, m_pSetup->sDefPresetName); bEnabled = (bOutEnabled && (bAlsa || bSun || bOss || bPortaudio)); m_ui.OutDeviceTextLabel->setEnabled(bEnabled); m_ui.OutDeviceComboBox->setEnabled(bEnabled); if (!bEnabled) setComboBoxCurrentText(m_ui.OutDeviceComboBox, m_pSetup->sDefPresetName); m_ui.InOutChannelsTextLabel->setEnabled(bInEnabled || (bAlsa || bFirewire)); m_ui.InChannelsSpinBox->setEnabled(bInEnabled || ((bAlsa || bFirewire) && iAudio != QJACKCTL_PLAYBACK)); m_ui.OutChannelsSpinBox->setEnabled(bOutEnabled || ((bAlsa || bFirewire) && iAudio != QJACKCTL_CAPTURE)); m_ui.InOutLatencyTextLabel->setEnabled((bInEnabled && !bNet) || (bAlsa || bFreebob || bFirewire)); m_ui.InLatencySpinBox->setEnabled((bInEnabled && !bNet) || ((bAlsa || bFreebob || bFirewire) && iAudio != QJACKCTL_PLAYBACK)); m_ui.OutLatencySpinBox->setEnabled((bOutEnabled && !bNet) || ((bAlsa || bFreebob || bFirewire) && iAudio != QJACKCTL_CAPTURE)); computeLatency(); } void qjackctlSetupForm::changeAudio ( int iAudio ) { changeDriverAudio(m_ui.DriverComboBox->currentText(), iAudio); } void qjackctlSetupForm::changeDriver ( int iDriver ) { changeDriverUpdate(m_ui.DriverComboBox->itemText(iDriver), true); } void qjackctlSetupForm::changeDriverUpdate ( const QString& sDriver, bool bUpdate ) { bool bDummy = (sDriver == "dummy"); bool bSun = (sDriver == "sun"); bool bOss = (sDriver == "oss"); bool bAlsa = (sDriver == "alsa"); bool bPortaudio = (sDriver == "portaudio"); bool bCoreaudio = (sDriver == "coreaudio"); bool bFreebob = (sDriver == "freebob"); bool bFirewire = (sDriver == "firewire"); bool bNet = (sDriver == "net" || sDriver == "netone"); m_ui.NoMemLockCheckBox->setEnabled(!bCoreaudio); m_ui.UnlockMemCheckBox->setEnabled(!bCoreaudio && !m_ui.NoMemLockCheckBox->isChecked()); m_ui.SoftModeCheckBox->setEnabled(bAlsa); m_ui.MonitorCheckBox->setEnabled(bAlsa); m_ui.ShortsCheckBox->setEnabled(bAlsa); m_ui.HWMonCheckBox->setEnabled(bAlsa); m_ui.HWMeterCheckBox->setEnabled(bAlsa); m_ui.IgnoreHWCheckBox->setEnabled(bSun || bOss); if (bCoreaudio || bPortaudio) { m_ui.PriorityTextLabel->setEnabled(false); m_ui.PrioritySpinBox->setEnabled(false); } else { bool bPriorityEnabled = m_ui.RealtimeCheckBox->isChecked(); m_ui.PriorityTextLabel->setEnabled(bPriorityEnabled); m_ui.PrioritySpinBox->setEnabled(bPriorityEnabled); } m_ui.SampleRateTextLabel->setEnabled(!bNet); m_ui.SampleRateComboBox->setEnabled(!bNet); m_ui.FramesTextLabel->setEnabled(!bNet); m_ui.FramesComboBox->setEnabled(!bNet); m_ui.PeriodsTextLabel->setEnabled(bAlsa || bSun || bOss || bFreebob || bFirewire); m_ui.PeriodsSpinBox->setEnabled(bAlsa || bSun || bOss || bFreebob || bFirewire); if (bUpdate && (bFreebob || bFirewire) && m_ui.PeriodsSpinBox->value() < 3) m_ui.PeriodsSpinBox->setValue(3); m_ui.WordLengthTextLabel->setEnabled(bSun || bOss); m_ui.WordLengthComboBox->setEnabled(bSun || bOss); m_ui.WaitTextLabel->setEnabled(bDummy); m_ui.WaitComboBox->setEnabled(bDummy); m_ui.ChanTextLabel->setEnabled(bPortaudio); m_ui.ChanSpinBox->setEnabled(bPortaudio); int iAudio = m_ui.AudioComboBox->currentIndex(); bool bEnabled = (bAlsa || bPortaudio); if (bEnabled && iAudio == QJACKCTL_DUPLEX) { const QString& sInDevice = m_ui.InDeviceComboBox->currentText(); const QString& sOutDevice = m_ui.OutDeviceComboBox->currentText(); bEnabled = (sInDevice.isEmpty() || sInDevice == m_pSetup->sDefPresetName || sOutDevice.isEmpty() || sOutDevice == m_pSetup->sDefPresetName); } bool bInterface = (bEnabled || bCoreaudio || bFreebob || bFirewire); m_ui.InterfaceTextLabel->setEnabled(bInterface); m_ui.InterfaceComboBox->setEnabled(bInterface); if (!bInterface) setComboBoxCurrentText(m_ui.InterfaceComboBox, m_pSetup->sDefPresetName); m_ui.DitherTextLabel->setEnabled(bAlsa || bPortaudio); m_ui.DitherComboBox->setEnabled(bAlsa || bPortaudio); #ifdef CONFIG_JACK_MIDI m_ui.MidiDriverTextLabel->setEnabled(bAlsa); m_ui.MidiDriverComboBox->setEnabled(bAlsa); #endif changeDriverAudio(sDriver, iAudio); } // Stabilize current form state. void qjackctlSetupForm::stabilizeForm (void) { bool bValid = (m_iDirtySettings > 0 || m_iDirtyOptions > 0); QString sPreset = m_ui.PresetComboBox->currentText(); if (!sPreset.isEmpty()) { const bool bPreset = (m_pSetup->presets.contains(sPreset)); m_ui.PresetSavePushButton->setEnabled(m_iDirtySettings > 0 || (!bPreset && sPreset != m_pSetup->sDefPresetName)); m_ui.PresetDeletePushButton->setEnabled(bPreset); } else { m_ui.PresetSavePushButton->setEnabled(false); m_ui.PresetDeletePushButton->setEnabled(false); } bool bEnabled = m_ui.StartupScriptCheckBox->isChecked(); m_ui.StartupScriptShellComboBox->setEnabled(bEnabled); m_ui.StartupScriptSymbolToolButton->setEnabled(bEnabled); m_ui.StartupScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.PostStartupScriptCheckBox->isChecked(); m_ui.PostStartupScriptShellComboBox->setEnabled(bEnabled); m_ui.PostStartupScriptSymbolToolButton->setEnabled(bEnabled); m_ui.PostStartupScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.ShutdownScriptCheckBox->isChecked(); m_ui.ShutdownScriptShellComboBox->setEnabled(bEnabled); m_ui.ShutdownScriptSymbolToolButton->setEnabled(bEnabled); m_ui.ShutdownScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.PostShutdownScriptCheckBox->isChecked(); m_ui.PostShutdownScriptShellComboBox->setEnabled(bEnabled); m_ui.PostShutdownScriptSymbolToolButton->setEnabled(bEnabled); m_ui.PostShutdownScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.StdoutCaptureCheckBox->isChecked(); m_ui.XrunRegexTextLabel->setEnabled(bEnabled); m_ui.XrunRegexComboBox->setEnabled(bEnabled); bEnabled = m_ui.ActivePatchbayCheckBox->isChecked(); m_ui.ActivePatchbayPathComboBox->setEnabled(bEnabled); m_ui.ActivePatchbayPathToolButton->setEnabled(bEnabled); m_ui.ActivePatchbayResetCheckBox->setEnabled(bEnabled); m_ui.QueryDisconnectCheckBox->setEnabled(bEnabled); if (bEnabled && bValid) { const QString& sPath = m_ui.ActivePatchbayPathComboBox->currentText(); bValid = (!sPath.isEmpty() && QFileInfo(sPath).exists()); } bEnabled = m_ui.MessagesLogCheckBox->isChecked(); m_ui.MessagesLogPathComboBox->setEnabled(bEnabled); m_ui.MessagesLogPathToolButton->setEnabled(bEnabled); if (bEnabled && bValid) { const QString& sPath = m_ui.MessagesLogPathComboBox->currentText(); bValid = !sPath.isEmpty(); } m_ui.MessagesLimitLinesComboBox->setEnabled( m_ui.MessagesLimitCheckBox->isChecked()); #ifdef CONFIG_JACK_METADATA #ifdef CONFIG_JACK_PORT_ALIASES bEnabled = !m_ui.JackClientPortMetadataCheckBox->isChecked(); m_ui.JackClientPortAliasTextLabel->setEnabled(bEnabled); m_ui.JackClientPortAliasComboBox->setEnabled(bEnabled); if (bEnabled) { m_ui.JackClientPortMetadataCheckBox->setEnabled( m_ui.JackClientPortAliasComboBox->currentIndex() == 0); } #endif #endif #ifdef CONFIG_SYSTEM_TRAY bEnabled = m_ui.SystemTrayCheckBox->isChecked(); m_ui.SystemTrayQueryCloseCheckBox->setEnabled(bEnabled); m_ui.StartMinimizedCheckBox->setEnabled(bEnabled); #endif m_ui.StopJackCheckBox->setEnabled( m_ui.JackDBusEnabledCheckBox->isChecked()); if (!m_ui.JackDBusEnabledCheckBox->isChecked()) { m_ui.StopJackCheckBox->setChecked(true); } bEnabled = m_ui.ServerConfigCheckBox->isChecked(); m_ui.ServerConfigNameComboBox->setEnabled(bEnabled); m_ui.ServerConfigTempCheckBox->setEnabled(bEnabled); m_ui.AliasesEditingCheckBox->setEnabled( m_ui.AliasesEnabledCheckBox->isChecked()); #ifndef CONFIG_XUNIQUE m_ui.SingletonCheckBox->setEnabled(false); #endif m_ui.TransportButtonsCheckBox->setEnabled( m_ui.LeftButtonsCheckBox->isChecked()); changeDriverUpdate(m_ui.DriverComboBox->currentText(), false); m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bValid); } // Meta-symbol menu executive. void qjackctlSetupForm::symbolMenu( QLineEdit *pLineEdit, QToolButton *pToolButton ) { const QString s = " "; QMenu menu(this); menu.addAction("%P" + s + tr("&Preset Name")); menu.addSeparator(); menu.addAction("%N" + s + tr("&Server Name")); menu.addAction("%s" + s + tr("&Server Path")); menu.addAction("%d" + s + tr("&Driver")); menu.addAction("%i" + s + tr("&Interface")); menu.addSeparator(); menu.addAction("%r" + s + tr("Sample &Rate")); menu.addAction("%p" + s + tr("&Frames/Period")); menu.addAction("%n" + s + tr("Periods/&Buffer")); QAction *pAction = menu.exec(pToolButton->mapToGlobal(QPoint(0,0))); if (pAction) { const QString sText = pAction->text(); int iMetaChar = sText.indexOf('%'); if (iMetaChar >= 0) { pLineEdit->insert('%' + sText[iMetaChar + 1]); // optionsChanged(); } } } // Startup script meta-symbol button slot. void qjackctlSetupForm::symbolStartupScript (void) { symbolMenu(m_ui.StartupScriptShellComboBox->lineEdit(), m_ui.StartupScriptSymbolToolButton); } // Post-startup script meta-symbol button slot. void qjackctlSetupForm::symbolPostStartupScript (void) { symbolMenu(m_ui.PostStartupScriptShellComboBox->lineEdit(), m_ui.PostStartupScriptSymbolToolButton); } // Shutdown script meta-symbol button slot. void qjackctlSetupForm::symbolShutdownScript (void) { symbolMenu(m_ui.ShutdownScriptShellComboBox->lineEdit(), m_ui.ShutdownScriptSymbolToolButton); } // Post-shutdown script meta-symbol button slot. void qjackctlSetupForm::symbolPostShutdownScript (void) { symbolMenu(m_ui.PostShutdownScriptShellComboBox->lineEdit(), m_ui.PostShutdownScriptSymbolToolButton); } // Startup script browse slot. void qjackctlSetupForm::browseStartupScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Startup Script"), // Caption. m_ui.StartupScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.StartupScriptShellComboBox, sFileName); m_ui.StartupScriptShellComboBox->setFocus(); optionsChanged(); } } // Post-startup script browse slot. void qjackctlSetupForm::browsePostStartupScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Post-Startup Script"), // Caption. m_ui.PostStartupScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.PostStartupScriptShellComboBox, sFileName); m_ui.PostStartupScriptShellComboBox->setFocus(); optionsChanged(); } } // Shutdown script browse slot. void qjackctlSetupForm::browseShutdownScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Shutdown Script"), // Caption. m_ui.ShutdownScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.ShutdownScriptShellComboBox, sFileName); m_ui.ShutdownScriptShellComboBox->setFocus(); optionsChanged(); } } // Post-shutdown script browse slot. void qjackctlSetupForm::browsePostShutdownScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Post-Shutdown Script"), // Caption. m_ui.PostShutdownScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.PostShutdownScriptShellComboBox, sFileName); m_ui.PostShutdownScriptShellComboBox->setFocus(); optionsChanged(); } } // Active Patchbay path browse slot. void qjackctlSetupForm::browseActivePatchbayPath() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Active Patchbay Definition"), // Caption. m_ui.ActivePatchbayPathComboBox->currentText(), // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.ActivePatchbayPathComboBox, sFileName); m_ui.ActivePatchbayPathComboBox->setFocus(); optionsChanged(); } } // Messages log path browse slot. void qjackctlSetupForm::browseMessagesLogPath() { QString sFileName = QFileDialog::getSaveFileName( this, // Parent. tr("Messages Log"), // Caption. m_ui.MessagesLogPathComboBox->currentText(), // Start here. tr("Log files") + " (*.log)" // Filter (log files) ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.MessagesLogPathComboBox, sFileName); m_ui.MessagesLogPathComboBox->setFocus(); optionsChanged(); } } // The display font 1 (big time) selection dialog. void qjackctlSetupForm::chooseDisplayFont1() { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.DisplayFont1TextLabel->font(), this); if (bOk) { m_ui.DisplayFont1TextLabel->setFont(font); m_ui.DisplayFont1TextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The display font 2 (normal time et al.) selection dialog. void qjackctlSetupForm::chooseDisplayFont2() { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.DisplayFont2TextLabel->font(), this); if (bOk) { m_ui.DisplayFont2TextLabel->setFont(font); m_ui.DisplayFont2TextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The channel display effect demo changer. void qjackctlSetupForm::toggleDisplayEffect ( bool bOn ) { QPalette pal; pal.setColor(QPalette::Foreground, Qt::green); if (bOn) { QPixmap pm(":/images/displaybg1.png"); pal.setBrush(QPalette::Background, QBrush(pm)); } else { pal.setColor(QPalette::Background, Qt::black); } m_ui.DisplayFont1TextLabel->setPalette(pal); m_ui.DisplayFont2TextLabel->setPalette(pal); optionsChanged(); } // The messages font selection dialog. void qjackctlSetupForm::chooseMessagesFont (void) { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.MessagesFontTextLabel->font(), this); if (bOk) { m_ui.MessagesFontTextLabel->setFont(font); m_ui.MessagesFontTextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The connections font selection dialog. void qjackctlSetupForm::chooseConnectionsFont (void) { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.ConnectionsFontTextLabel->font(), this); if (bOk) { m_ui.ConnectionsFontTextLabel->setFont(font); m_ui.ConnectionsFontTextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // Mark that some server preset settings have changed. void qjackctlSetupForm::settingsChanged (void) { if (m_iDirtySetup > 0) return; ++m_iDirtySettings; stabilizeForm(); } // Mark that some program options have changed. void qjackctlSetupForm::optionsChanged (void) { if (m_iDirtySetup > 0) return; m_iDirtyOptions++; stabilizeForm(); } // Accept settings (OK button slot). void qjackctlSetupForm::accept (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; if (m_iDirtySettings > 0 || m_iDirtyOptions > 0) { // To track down deferred or immediate changes. const bool bOldMessagesLog = m_pSetup->bMessagesLog; const QString sOldMessagesLogPath = m_pSetup->sMessagesLogPath; const QString sOldMessagesFont = m_pSetup->sMessagesFont; const QString sOldDisplayFont1 = m_pSetup->sDisplayFont1; const QString sOldDisplayFont2 = m_pSetup->sDisplayFont2; const QString sOldConnectionsFont = m_pSetup->sConnectionsFont; const int iOldConnectionsIconSize = m_pSetup->iConnectionsIconSize; const int iOldJackClientPortAlias = m_pSetup->iJackClientPortAlias; const bool bOldJackClientPortMetadata = m_pSetup->bJackClientPortMetadata; const int iOldTimeDisplay = m_pSetup->iTimeDisplay; const int iOldTimeFormat = m_pSetup->iTimeFormat; const bool bOldDisplayEffect = m_pSetup->bDisplayEffect; const bool bOldActivePatchbay = m_pSetup->bActivePatchbay; const QString sOldActivePatchbayPath = m_pSetup->sActivePatchbayPath; const bool bOldStdoutCapture = m_pSetup->bStdoutCapture; const bool bOldKeepOnTop = m_pSetup->bKeepOnTop; #ifdef CONFIG_SYSTEM_TRAY const bool bOldSystemTray = m_pSetup->bSystemTray; #endif const int bOldMessagesLimit = m_pSetup->bMessagesLimit; const int iOldMessagesLimitLines = m_pSetup->iMessagesLimitLines; const bool bOldBezierLines = m_pSetup->bBezierLines; const bool bOldAlsaSeqEnabled = m_pSetup->bAlsaSeqEnabled; const bool bOldDBusEnabled = m_pSetup->bDBusEnabled; const bool bOldJackDBusEnabled = m_pSetup->bJackDBusEnabled; const bool bOldAliasesEnabled = m_pSetup->bAliasesEnabled; const bool bOldAliasesEditing = m_pSetup->bAliasesEditing; const bool bOldLeftButtons = m_pSetup->bLeftButtons; const bool bOldRightButtons = m_pSetup->bRightButtons; const bool bOldTransportButtons = m_pSetup->bTransportButtons; const bool bOldTextLabels = m_pSetup->bTextLabels; const int iOldBaseFontSize = m_pSetup->iBaseFontSize; // Save current preset selection. m_pSetup->sDefPreset = m_ui.PresetComboBox->currentText(); // Always save current settings... savePreset(m_pSetup->sDefPreset); // Save Options... m_pSetup->bStartupScript = m_ui.StartupScriptCheckBox->isChecked(); m_pSetup->sStartupScriptShell = m_ui.StartupScriptShellComboBox->currentText(); m_pSetup->bPostStartupScript = m_ui.PostStartupScriptCheckBox->isChecked(); m_pSetup->sPostStartupScriptShell = m_ui.PostStartupScriptShellComboBox->currentText(); m_pSetup->bShutdownScript = m_ui.ShutdownScriptCheckBox->isChecked(); m_pSetup->sShutdownScriptShell = m_ui.ShutdownScriptShellComboBox->currentText(); m_pSetup->bPostShutdownScript = m_ui.PostShutdownScriptCheckBox->isChecked(); m_pSetup->sPostShutdownScriptShell = m_ui.PostShutdownScriptShellComboBox->currentText(); m_pSetup->bStdoutCapture = m_ui.StdoutCaptureCheckBox->isChecked(); m_pSetup->sXrunRegex = m_ui.XrunRegexComboBox->currentText(); m_pSetup->bActivePatchbay = m_ui.ActivePatchbayCheckBox->isChecked(); m_pSetup->sActivePatchbayPath = m_ui.ActivePatchbayPathComboBox->currentText(); m_pSetup->bActivePatchbayReset = m_ui.ActivePatchbayResetCheckBox->isChecked(); m_pSetup->bQueryDisconnect = m_ui.QueryDisconnectCheckBox->isChecked(); m_pSetup->bMessagesLog = m_ui.MessagesLogCheckBox->isChecked(); m_pSetup->sMessagesLogPath = m_ui.MessagesLogPathComboBox->currentText(); m_pSetup->bBezierLines = m_ui.BezierLinesCheckBox->isChecked(); // Save Defaults... m_pSetup->iTimeDisplay = m_pTimeDisplayButtonGroup->checkedId(); m_pSetup->iTimeFormat = m_ui.TimeFormatComboBox->currentIndex(); m_pSetup->sMessagesFont = m_ui.MessagesFontTextLabel->font().toString(); m_pSetup->bMessagesLimit = m_ui.MessagesLimitCheckBox->isChecked(); m_pSetup->iMessagesLimitLines = m_ui.MessagesLimitLinesComboBox->currentText().toInt(); m_pSetup->sDisplayFont1 = m_ui.DisplayFont1TextLabel->font().toString(); m_pSetup->sDisplayFont2 = m_ui.DisplayFont2TextLabel->font().toString(); m_pSetup->bDisplayEffect = m_ui.DisplayEffectCheckBox->isChecked(); m_pSetup->bDisplayBlink = m_ui.DisplayBlinkCheckBox->isChecked(); m_pSetup->iJackClientPortAlias = m_ui.JackClientPortAliasComboBox->currentIndex(); m_pSetup->bJackClientPortMetadata = m_ui.JackClientPortMetadataCheckBox->isChecked(); m_pSetup->iConnectionsIconSize = m_ui.ConnectionsIconSizeComboBox->currentIndex(); m_pSetup->sConnectionsFont = m_ui.ConnectionsFontTextLabel->font().toString(); m_pSetup->bStartJack = m_ui.StartJackCheckBox->isChecked(); m_pSetup->bStopJack = m_ui.StopJackCheckBox->isChecked(); m_pSetup->bQueryClose = m_ui.QueryCloseCheckBox->isChecked(); m_pSetup->bQueryShutdown = m_ui.QueryShutdownCheckBox->isChecked(); m_pSetup->bKeepOnTop = m_ui.KeepOnTopCheckBox->isChecked(); #ifdef CONFIG_SYSTEM_TRAY m_pSetup->bSystemTray = m_ui.SystemTrayCheckBox->isChecked(); m_pSetup->bSystemTrayQueryClose = m_ui.SystemTrayQueryCloseCheckBox->isChecked(); m_pSetup->bStartMinimized = m_ui.StartMinimizedCheckBox->isChecked(); #endif m_pSetup->bSingleton = m_ui.SingletonCheckBox->isChecked(); m_pSetup->bServerConfig = m_ui.ServerConfigCheckBox->isChecked(); m_pSetup->sServerConfigName = m_ui.ServerConfigNameComboBox->currentText(); m_pSetup->bServerConfigTemp = m_ui.ServerConfigTempCheckBox->isChecked(); m_pSetup->bAlsaSeqEnabled = m_ui.AlsaSeqEnabledCheckBox->isChecked(); m_pSetup->bDBusEnabled = m_ui.DBusEnabledCheckBox->isChecked(); m_pSetup->bJackDBusEnabled = m_ui.JackDBusEnabledCheckBox->isChecked(); m_pSetup->bAliasesEnabled = m_ui.AliasesEnabledCheckBox->isChecked(); m_pSetup->bAliasesEditing = m_ui.AliasesEditingCheckBox->isChecked(); m_pSetup->bLeftButtons = !m_ui.LeftButtonsCheckBox->isChecked(); m_pSetup->bRightButtons = !m_ui.RightButtonsCheckBox->isChecked(); m_pSetup->bTransportButtons = !m_ui.TransportButtonsCheckBox->isChecked(); m_pSetup->bTextLabels = !m_ui.TextLabelsCheckBox->isChecked(); m_pSetup->iBaseFontSize = m_ui.BaseFontSizeComboBox->currentText().toInt(); // Check wheather something immediate has changed. if (( bOldMessagesLog && !m_pSetup->bMessagesLog) || (!bOldMessagesLog && m_pSetup->bMessagesLog) || (sOldMessagesLogPath != m_pSetup->sMessagesLogPath)) pMainForm->updateMessagesLogging(); if (( bOldBezierLines && !m_pSetup->bBezierLines) || (!bOldBezierLines && m_pSetup->bBezierLines)) pMainForm->updateBezierLines(); if (( bOldDisplayEffect && !m_pSetup->bDisplayEffect) || (!bOldDisplayEffect && m_pSetup->bDisplayEffect)) pMainForm->updateDisplayEffect(); if (iOldJackClientPortAlias != m_pSetup->iJackClientPortAlias) pMainForm->updateJackClientPortAlias(); if (( bOldJackClientPortMetadata && !m_pSetup->bJackClientPortMetadata) || (!bOldJackClientPortMetadata && m_pSetup->bJackClientPortMetadata)) pMainForm->updateJackClientPortMetadata(); if (iOldConnectionsIconSize != m_pSetup->iConnectionsIconSize) pMainForm->updateConnectionsIconSize(); if (sOldConnectionsFont != m_pSetup->sConnectionsFont) pMainForm->updateConnectionsFont(); if (sOldMessagesFont != m_pSetup->sMessagesFont) pMainForm->updateMessagesFont(); if (( bOldMessagesLimit && !m_pSetup->bMessagesLimit) || (!bOldMessagesLimit && m_pSetup->bMessagesLimit) || (iOldMessagesLimitLines != m_pSetup->iMessagesLimitLines)) pMainForm->updateMessagesLimit(); if (sOldDisplayFont1 != m_pSetup->sDisplayFont1 || sOldDisplayFont2 != m_pSetup->sDisplayFont2) pMainForm->updateTimeDisplayFonts(); if (iOldTimeDisplay != m_pSetup->iTimeDisplay) pMainForm->updateTimeDisplayToolTips(); if (iOldTimeFormat != m_pSetup->iTimeFormat) pMainForm->updateTimeFormat(); if ((!bOldActivePatchbay && m_pSetup->bActivePatchbay) || (sOldActivePatchbayPath != m_pSetup->sActivePatchbayPath)) pMainForm->updateActivePatchbay(); #ifdef CONFIG_SYSTEM_TRAY if (( bOldSystemTray && !m_pSetup->bSystemTray) || (!bOldSystemTray && m_pSetup->bSystemTray)) pMainForm->updateSystemTray(); #endif if (( bOldAliasesEnabled && !m_pSetup->bAliasesEnabled) || (!bOldAliasesEnabled && m_pSetup->bAliasesEnabled) || ( bOldAliasesEditing && !m_pSetup->bAliasesEditing) || (!bOldAliasesEditing && m_pSetup->bAliasesEditing)) pMainForm->updateAliases(); if (( bOldLeftButtons && !m_pSetup->bLeftButtons) || (!bOldLeftButtons && m_pSetup->bLeftButtons) || ( bOldRightButtons && !m_pSetup->bRightButtons) || (!bOldRightButtons && m_pSetup->bRightButtons) || ( bOldTransportButtons && !m_pSetup->bTransportButtons) || (!bOldTransportButtons && m_pSetup->bTransportButtons) || ( bOldTextLabels && !m_pSetup->bTextLabels) || (!bOldTextLabels && m_pSetup->bTextLabels)) pMainForm->updateButtons(); // Warn if something will be only effective on next run. if (( bOldStdoutCapture && !m_pSetup->bStdoutCapture) || (!bOldStdoutCapture && m_pSetup->bStdoutCapture) || ( bOldKeepOnTop && !m_pSetup->bKeepOnTop) || (!bOldKeepOnTop && m_pSetup->bKeepOnTop) || ( bOldAlsaSeqEnabled && !m_pSetup->bAlsaSeqEnabled) || (!bOldAlsaSeqEnabled && m_pSetup->bAlsaSeqEnabled) || ( bOldDBusEnabled && !m_pSetup->bDBusEnabled) || (!bOldDBusEnabled && m_pSetup->bDBusEnabled) || ( bOldJackDBusEnabled && !m_pSetup->bJackDBusEnabled) || (!bOldJackDBusEnabled && m_pSetup->bJackDBusEnabled) || (iOldBaseFontSize != m_pSetup->iBaseFontSize)) pMainForm->showDirtySetupWarning(); // If server is currently running, warn user... pMainForm->showDirtySettingsWarning(); } // Save combobox history... m_pSetup->saveComboBoxHistory(m_ui.ServerPrefixComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerNameComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerSuffixComboBox); m_pSetup->saveComboBoxHistory(m_ui.StartupScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.PostStartupScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.ShutdownScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.PostShutdownScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.XrunRegexComboBox); m_pSetup->saveComboBoxHistory(m_ui.ActivePatchbayPathComboBox); m_pSetup->saveComboBoxHistory(m_ui.MessagesLogPathComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerConfigNameComboBox); // Save/commit to disk. m_pSetup->saveSetup(); // Reset dirty flags. m_iDirtySettings = 0; m_iDirtyOptions = 0; // Just go with dialog acceptance. QDialog::accept(); } // Reject settings (Cancel button slot). void qjackctlSetupForm::reject (void) { if (queryClose()) QDialog::reject(); } // Check whether we're clear to close. bool qjackctlSetupForm::queryClose (void) { bool bQueryClose = true; // Check if there's any pending changes... if (m_iDirtySettings > 0 || m_iDirtyOptions > 0) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), QMessageBox::Apply | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Apply: accept(); // Fall thru... case QMessageBox::Discard: // Reset dirty flags... m_iDirtySettings = 0; m_iDirtyOptions = 0; break; default: // Cancel. bQueryClose = false; break; } } return bQueryClose; } // Notify our parent that we're emerging. void qjackctlSetupForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); stabilizeForm(); QDialog::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlSetupForm::hideEvent ( QHideEvent *pHideEvent ) { QDialog::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlSetupForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QDialog::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // end of qjackctlSetupForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMessagesStatusForm.cpp0000644000000000000000000000012713215206021021567 xustar0029 mtime=1513425937.53576694 29 atime=1513425937.53576694 29 ctime=1513425937.53576694 qjackctl-0.5.0/src/qjackctlMessagesStatusForm.cpp0000644000175000001440000002375113215206021022425 0ustar00rncbcusers00000000000000// qjackctlMessagesStatusForm.cpp // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlMessagesStatusForm.h" #include "qjackctlStatus.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include // The maximum number of message lines. #define QJACKCTL_MESSAGES_MAXLINES 1000 //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. // Constructor. qjackctlMessagesStatusForm::qjackctlMessagesStatusForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // m_ui.MessagesTextView->setTextFormat(Qt::LogText); // Initialize default message limit. m_iMessagesLines = 0; setMessagesLimit(QJACKCTL_MESSAGES_MAXLINES); m_pMessagesLog = NULL; // Create the list view items 'a priori'... const QString s = " "; const QString c = ":" + s; const QString n = "--"; QTreeWidgetItem *pViewItem; // Status list view... QHeaderView *pHeader = m_ui.StatsListView->header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(320); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); m_apStatus[STATUS_SERVER_NAME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server name") + c << n); m_apStatus[STATUS_SERVER_STATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server state") + c << n); m_apStatus[STATUS_DSP_LOAD] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("DSP Load") + c << n); m_apStatus[STATUS_SAMPLE_RATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Sample Rate") + c << n); m_apStatus[STATUS_BUFFER_SIZE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Buffer Size") + c << n); m_apStatus[STATUS_REALTIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Realtime Mode") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Transport state") + c << n); m_apStatus[STATUS_TRANSPORT_STATE] = pViewItem; m_apStatus[STATUS_TRANSPORT_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport Timecode") + c << n); m_apStatus[STATUS_TRANSPORT_BBT] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BBT") + c << n); m_apStatus[STATUS_TRANSPORT_BPM] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BPM") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("XRUN count since last server startup") + c << n); m_apStatus[STATUS_XRUN_COUNT] = pViewItem; m_apStatus[STATUS_XRUN_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last time detected") + c << n); m_apStatus[STATUS_XRUN_LAST] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last") + c << n); m_apStatus[STATUS_XRUN_MAX] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN maximum") + c << n); m_apStatus[STATUS_XRUN_MIN] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN minimum") + c << n); m_apStatus[STATUS_XRUN_AVG] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN average") + c << n); m_apStatus[STATUS_XRUN_TOTAL] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN total") + c << n); #ifdef CONFIG_JACK_MAX_DELAY m_apStatus[STATUS_MAX_DELAY] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Maximum scheduling delay") + c << n); #endif m_apStatus[STATUS_RESET_TIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Time of last reset") + c << n); m_ui.StatsListView->resizeColumnToContents(0); // Description. m_ui.StatsListView->resizeColumnToContents(1); // Value. // UI connections... QObject::connect(m_ui.ResetPushButton, SIGNAL(clicked()), SLOT(resetXrunStats())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshXrunStats())); } // Destructor. qjackctlMessagesStatusForm::~qjackctlMessagesStatusForm (void) { setLogging(false); } // Notify our parent that we're emerging. void qjackctlMessagesStatusForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlMessagesStatusForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlMessagesStatusForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Tab page accessors. void qjackctlMessagesStatusForm::setTabPage ( int iTabPage ) { m_ui.MessagesStatusTabWidget->setCurrentIndex(iTabPage); } int qjackctlMessagesStatusForm::tabPage (void) const { return m_ui.MessagesStatusTabWidget->currentIndex(); } // Messages view font accessors. QFont qjackctlMessagesStatusForm::messagesFont (void) const { return m_ui.MessagesTextView->font(); } void qjackctlMessagesStatusForm::setMessagesFont ( const QFont & font ) { m_ui.MessagesTextView->setFont(font); } // Messages line limit accessors. int qjackctlMessagesStatusForm::messagesLimit (void) const { return m_iMessagesLimit; } void qjackctlMessagesStatusForm::setMessagesLimit ( int iMessagesLimit ) { m_iMessagesLimit = iMessagesLimit; m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3); // m_ui.MessagesTextView->setMaxLogLines(iMessagesLimit); } // Messages logging stuff. bool qjackctlMessagesStatusForm::isLogging (void) const { return (m_pMessagesLog != NULL); } void qjackctlMessagesStatusForm::setLogging ( bool bEnabled, const QString& sFilename ) { if (m_pMessagesLog) { appendMessages(tr("Logging stopped --- %1 ---") .arg(QDateTime::currentDateTime().toString())); m_pMessagesLog->close(); delete m_pMessagesLog; m_pMessagesLog = NULL; } if (bEnabled) { m_pMessagesLog = new QFile(sFilename); if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) { appendMessages(tr("Logging started --- %1 ---") .arg(QDateTime::currentDateTime().toString())); } else { delete m_pMessagesLog; m_pMessagesLog = NULL; } } } // Messages log output method. void qjackctlMessagesStatusForm::appendMessagesLog ( const QString& s ) { if (m_pMessagesLog) { QTextStream(m_pMessagesLog) << s << endl; m_pMessagesLog->flush(); } } // Messages widget output method. void qjackctlMessagesStatusForm::appendMessagesLine ( const QString& s ) { // Check for message line limit... if (m_iMessagesLines > m_iMessagesHigh) { m_ui.MessagesTextView->setUpdatesEnabled(false); QTextCursor textCursor(m_ui.MessagesTextView->document()->begin()); while (m_iMessagesLines > m_iMessagesLimit) { // Move cursor extending selection // from start to next line-block... textCursor.movePosition( QTextCursor::NextBlock, QTextCursor::KeepAnchor); m_iMessagesLines--; } // Remove the excessive line-blocks... textCursor.removeSelectedText(); m_ui.MessagesTextView->setUpdatesEnabled(true); } m_ui.MessagesTextView->append(s); m_iMessagesLines++; } void qjackctlMessagesStatusForm::appendMessages ( const QString& s ) { appendMessagesColor(s, "#999999"); } void qjackctlMessagesStatusForm::appendMessagesColor ( const QString& s, const QString& c ) { QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s; appendMessagesLine("" + sText + ""); appendMessagesLog(sText); } void qjackctlMessagesStatusForm::appendMessagesText ( const QString& s ) { appendMessagesLine(s); appendMessagesLog(s); } // Ask our parent to reset status. void qjackctlMessagesStatusForm::resetXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->resetXrunStats(); } // Ask our parent to refresh our status. void qjackctlMessagesStatusForm::refreshXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshXrunStats(); } // Update one status item value. void qjackctlMessagesStatusForm::updateStatusItem ( int iStatusItem, const QString& sText ) { m_apStatus[iStatusItem]->setText(1, sText); } // Keyboard event handler. void qjackctlMessagesStatusForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlMessagesStatusForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlMessagesStatusForm.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSetup.h0000644000000000000000000000012713215206021016535 xustar0029 mtime=1513425937.53976694 29 atime=1513425937.53976694 29 ctime=1513425937.53976694 qjackctl-0.5.0/src/qjackctlSetup.h0000644000175000001440000001327713215206021017375 0ustar00rncbcusers00000000000000// qjackctlSetup.h // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetup_h #define __qjackctlSetup_h #include "qjackctlConnectAlias.h" #include // Forward declarations. class QWidget; class QComboBox; class QSplitter; // Audio mode combobox item indexes. #define QJACKCTL_DUPLEX 0 #define QJACKCTL_CAPTURE 1 #define QJACKCTL_PLAYBACK 2 // Icon size combobox item indexes. #define QJACKCTL_ICON_16X16 0 #define QJACKCTL_ICON_32X32 1 #define QJACKCTL_ICON_64X64 2 // Server settings preset struct. struct qjackctlPreset { QString sServerPrefix; QString sServerName; bool bRealtime; bool bSoftMode; bool bMonitor; bool bShorts; bool bNoMemLock; bool bUnlockMem; bool bHWMon; bool bHWMeter; bool bIgnoreHW; int iPriority; int iFrames; int iSampleRate; int iPeriods; int iWordLength; int iWait; int iChan; QString sDriver; QString sInterface; int iAudio; int iDither; int iTimeout; QString sInDevice; QString sOutDevice; int iInChannels; int iOutChannels; int iInLatency; int iOutLatency; int iStartDelay; bool bVerbose; int iPortMax; QString sMidiDriver; QString sServerSuffix; }; // Common settings profile class. class qjackctlSetup { public: // Constructor. qjackctlSetup(); // Destructor; ~qjackctlSetup(); // The settings object accessor. QSettings& settings(); // Explicit I/O methods. void loadSetup(); void saveSetup(); // Command line arguments parser. bool parse_args(const QStringList& args); // Command line usage helper. void print_usage(const QString& arg0); // Default (translated) preset name. QString sDefPresetName; // Immediate server start options. bool bStartJack; bool bStartJackCmd; // Server stop options. bool bStopJack; // User supplied command line. QString sCmdLine; // Current (default) preset name. QString sDefPreset; // Available presets list. QStringList presets; // Options... bool bSingleton; QString sServerName; bool bStartupScript; QString sStartupScriptShell; bool bPostStartupScript; QString sPostStartupScriptShell; bool bShutdownScript; QString sShutdownScriptShell; bool bPostShutdownScript; QString sPostShutdownScriptShell; bool bStdoutCapture; QString sXrunRegex; bool bActivePatchbay; QString sActivePatchbayPath; bool bActivePatchbayReset; bool bQueryDisconnect; bool bMessagesLog; QString sMessagesLogPath; bool bBezierLines; int iTimeDisplay; int iTimeFormat; QString sMessagesFont; bool bMessagesLimit; int iMessagesLimitLines; QString sDisplayFont1; QString sDisplayFont2; bool bDisplayEffect; bool bDisplayBlink; int iJackClientPortAlias; bool bJackClientPortMetadata; int iConnectionsIconSize; QString sConnectionsFont; bool bQueryClose; bool bQueryShutdown; bool bKeepOnTop; bool bSystemTray; bool bSystemTrayQueryClose; bool bStartMinimized; bool bServerConfig; QString sServerConfigName; bool bServerConfigTemp; bool bAlsaSeqEnabled; bool bDBusEnabled; bool bJackDBusEnabled; bool bAliasesEnabled; bool bAliasesEditing; bool bLeftButtons; bool bRightButtons; bool bTransportButtons; bool bTextLabels; int iBaseFontSize; // Defaults... QString sPatchbayPath; // Recent patchbay listing. QStringList patchbays; // Recent session directories. QStringList sessionDirs; // Last open tab page... int iMessagesStatusTabPage; int iConnectionsTabPage; // Last session save type... bool bSessionSaveVersion; // Aliases containers. qjackctlConnectAlias aliasAudioOutputs; qjackctlConnectAlias aliasAudioInputs; qjackctlConnectAlias aliasMidiOutputs; qjackctlConnectAlias aliasMidiInputs; qjackctlConnectAlias aliasAlsaOutputs; qjackctlConnectAlias aliasAlsaInputs; // Aliases preset management methods. bool loadAliases(const QString& sPreset); bool saveAliases(const QString& sPreset); // Preset management methods. bool loadPreset(qjackctlPreset& preset, const QString& sPreset); bool savePreset(qjackctlPreset& preset, const QString& sPreset); bool deletePreset(const QString& sPreset); // Combo box history persistence helper prototypes. void loadComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); void saveComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); // Splitter widget sizes persistence helper methods. void loadSplitterSizes(QSplitter *pSplitter, QList& sizes); void saveSplitterSizes(QSplitter *pSplitter); // Widget geometry persistence helper prototypes. void saveWidgetGeometry(QWidget *pWidget, bool bVisible = false); void loadWidgetGeometry(QWidget *pWidget, bool bVisible = false); private: // Our proper settings profile. QSettings m_settings; }; #endif // __qjackctlSetup_h // end of qjackctlSetup.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlSession.cpp0000644000000000000000000000012713215206021017413 xustar0029 mtime=1513425937.53776694 29 atime=1513425937.53776694 29 ctime=1513425937.53776694 qjackctl-0.5.0/src/qjackctlSession.cpp0000644000175000001440000004221013215206021020240 0ustar00rncbcusers00000000000000// qjackctlSession.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSession.h" #include "qjackctlMainForm.h" #ifdef CONFIG_JACK_SESSION #include #include #endif #include #include #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. // Constructor. qjackctlSession::qjackctlSession (void) { } // Destructor. qjackctlSession::~qjackctlSession (void) { clearInfraClients(); clear(); } // Client list accessor (read-only) const qjackctlSession::ClientList& qjackctlSession::clients (void) const { return m_clients; } // House-keeper. void qjackctlSession::clear (void) { qDeleteAll(m_clients); m_clients.clear(); } // Critical methods. bool qjackctlSession::save ( const QString& sSessionDir, int iSessionType ) { // We're always best to // reset old session settings. clear(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; const QString sSessionPath = sSessionDir + '/'; // First pass: get all client/port connections, no matter what... const char **ports = ::jack_get_ports(pJackClient, NULL, NULL, 0); if (ports) { for (int i = 0; ports[i]; ++i) { const char *pszSrcClientPort = ports[i]; const QString sSrcClientPort = QString::fromLocal8Bit(pszSrcClientPort); const QString sSrcClient = sSrcClientPort.section(':', 0, 0); ClientItem *pClientItem; if (m_clients.contains(sSrcClient)) { pClientItem = m_clients.value(sSrcClient); } else { pClientItem = new ClientItem; pClientItem->client_name = sSrcClient; m_clients.insert(pClientItem->client_name, pClientItem); } PortItem *pPortItem = new PortItem; pPortItem->port_name = sSrcClientPort.section(':', 1); jack_port_t *pJackPort = ::jack_port_by_name(pJackClient, pszSrcClientPort); pPortItem->port_type = (::jack_port_flags(pJackPort) & JackPortIsInput); const char **connections = ::jack_port_get_all_connections(pJackClient, pJackPort); if (connections) { for (int j = 0; connections[j]; ++j) { const QString sDstClientPort = QString::fromLocal8Bit(connections[j]); ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = sDstClientPort.section(':', 0, 0); pConnectItem->port_name = sDstClientPort.section(':', 1); pConnectItem->connected = true; pPortItem->connects.append(pConnectItem); // pPortItem->connected++; } ::jack_free(connections); } pClientItem->ports.append(pPortItem); // pClientItem->connected += pPortItem->connected; } ::jack_free(ports); } #ifdef CONFIG_JACK_SESSION // Second pass: get all session client commands... if (::jack_session_notify) { jack_session_event_type_t etype = JackSessionSave; switch (iSessionType) { case 1: etype = JackSessionSaveAndQuit; break; case 2: etype = JackSessionSaveTemplate; break; } const QByteArray aSessionPath = sSessionPath.toLocal8Bit(); const char *pszSessionPath = aSessionPath.constData(); jack_session_command_t *commands = ::jack_session_notify(pJackClient, NULL, etype, pszSessionPath); if (commands == NULL) return false; // Second pass... for (int k = 0; commands[k].uuid; ++k) { jack_session_command_t *pCommand = &commands[k]; const QString sClientName = QString::fromLocal8Bit(pCommand->client_name); ClientItem *pClientItem; if (m_clients.contains(sClientName)) { pClientItem = m_clients.value(sClientName); } else { pClientItem = new ClientItem; pClientItem->client_name = sClientName; m_clients.insert(pClientItem->client_name, pClientItem); } pClientItem->client_uuid = QString::fromLocal8Bit(pCommand->uuid); pClientItem->client_command = QString::fromLocal8Bit(pCommand->command); } ::jack_session_commands_free(commands); } #endif // CONFIG_JACK_SESSION // Third pass: check whether there are registered infra-clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->client_command.isEmpty()) { const QString& sClientName = pClientItem->client_name; if (sClientName == "system") continue; InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, NULL); if (pInfraClientItem) { pClientItem->client_command = pInfraClientItem->client_command; } else { pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sClientName; pInfraClientItem->client_command = pClientItem->client_command; m_infra_clients.insert(sClientName, pInfraClientItem); } } } // Finally: save to file, immediate... return saveFile(sSessionPath + "session.xml"); } bool qjackctlSession::load ( const QString& sSessionDir ) { // Load from file, immediate... const QString sSessionPath = sSessionDir + '/'; if (!loadFile(sSessionPath + "session.xml")) return false; // Start/load clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); const QString& sClientName = pClientItem->client_name; QString sCommand = pClientItem->client_command; if (sCommand.isEmpty()) { // Maybe a registered infra-client command... InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, NULL); if (pInfraClientItem && !isJackClient(sClientName)) sCommand = pInfraClientItem->client_command; } else if (!pClientItem->client_uuid.isEmpty()){ // Sure a legit session-client command... const QString& sClientDir = sSessionPath + pClientItem->client_name + '/'; sCommand.replace("${SESSION_DIR}", sClientDir); } // Launch command and wait a litle bit before continue... if (!sCommand.isEmpty() && QProcess::startDetached(sCommand)) { QTime time; time.start(); while (time.elapsed() < 200) QApplication::processEvents(); } } // Initial reconnection. update(); // Formerly successful. return true; } // Update (re)connections utility method. bool qjackctlSession::update (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; // We'll count how many connection updates... int iUpdate = 0; // Now, make the saved connections... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->connected < 1) continue; QString sSrcClient = pClientItem->client_name; #ifdef CONFIG_JACK_SESSION if (!pClientItem->client_uuid.isEmpty()) { const QByteArray aSrcUuid = pClientItem->client_uuid.toLocal8Bit(); const char *pszSrcUuid = aSrcUuid.constData(); const char *pszSrcClient = ::jack_get_client_name_by_uuid(pJackClient, pszSrcUuid); if (pszSrcClient) { sSrcClient = QString::fromLocal8Bit(pszSrcClient); ::jack_free((void *) pszSrcClient); } } #endif QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { PortItem *pPortItem = iterPort.next(); if (pPortItem->connected < 1) continue; const QString sSrcPort = pPortItem->port_name; const QString sSrcClientPort = sSrcClient + ':' + sSrcPort; const QByteArray aSrcClientPort = sSrcClientPort.toLocal8Bit(); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { ConnectItem *pConnectItem = iterConnect.next(); if (pConnectItem->connected) continue; QString sDstClient = pConnectItem->client_name; #ifdef CONFIG_JACK_SESSION if (m_clients.contains(sDstClient)) { const QString sDstUuid = m_clients.value(sDstClient)->client_uuid; const QByteArray aDstUuid = sDstUuid.toLocal8Bit(); const char *pszDstUuid = aDstUuid.constData(); const char *pszDstClient = ::jack_get_client_name_by_uuid(pJackClient, pszDstUuid); if (pszDstClient) { sDstClient = QString::fromLocal8Bit(pszDstClient); ::jack_free((void *) pszDstClient); } } #endif const QString sDstPort = pConnectItem->port_name; const QString sDstClientPort = sDstClient + ':' + sDstPort; const QByteArray aDstClientPort = sDstClientPort.toLocal8Bit(); int retc; if (pPortItem->port_type) { // Input port... retc = ::jack_connect(pJackClient, aDstClientPort.constData(), aSrcClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aDstClientPort.constData(), aSrcClientPort.constData(), retc); #endif } else { // Output port... retc = ::jack_connect(pJackClient, aSrcClientPort.constData(), aDstClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aSrcClientPort.constData(), aDstClientPort.constData(), retc); #endif } // Comply with connection result... if (retc == 0 || retc == EEXIST) { pConnectItem->connected = true; pPortItem->connected--; pClientItem->connected--; iUpdate++; } } } } // Report back. return (iUpdate > 0); } // Specific session file load (read) method. bool qjackctlSession::loadFile ( const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("qjackctlSession"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now, we're always best to // reset old session settings. clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Parse for clients... for (QDomNode nClient = eDoc.firstChild(); !nClient.isNull(); nClient = nClient.nextSibling()) { // Client element... QDomElement eClient = nClient.toElement(); if (eClient.isNull()) continue; if (eClient.tagName() != "client") continue; ClientItem *pClientItem = new ClientItem; pClientItem->client_name = eClient.attribute("name"); pClientItem->client_uuid = eClient.attribute("uuid"); // Client properties... for (QDomNode nChild = eClient.firstChild(); !nChild.isNull(); nChild = nChild.nextSibling()) { // Client child element... QDomElement eChild = nChild.toElement(); if (eChild.isNull()) continue; if (eChild.tagName() == "command") pClientItem->client_command = eChild.text(); else if (eChild.tagName() == "port") { // Port properties... PortItem *pPortItem = new PortItem; pPortItem->port_name = eChild.attribute("name"); pPortItem->port_type = (eChild.attribute("type") == "in"); // Connection child element... for (QDomNode nConnect = eChild.firstChild(); !nConnect.isNull(); nConnect = nConnect.nextSibling()) { QDomElement eConnect = nConnect.toElement(); if (eConnect.isNull()) continue; if (eConnect.tagName() != "connect") continue; ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = eConnect.attribute("client"); pConnectItem->port_name = eConnect.attribute("port"); pConnectItem->connected = false; pPortItem->connects.append(pConnectItem); pPortItem->connected++; } pClientItem->ports.append(pPortItem); pClientItem->connected += pPortItem->connected; } } m_clients.insert(pClientItem->client_name, pClientItem); } return true; } // Specific session file save (write) method. bool qjackctlSession::saveFile ( const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("qjackctlSession"); QDomElement eSession = doc.createElement("session"); eSession.setAttribute("name", QFileInfo(fi.absolutePath()).baseName()); doc.appendChild(eSession); // Save clients spec... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); QDomElement eClient = doc.createElement("client"); eClient.setAttribute("name", pClientItem->client_name); if (!pClientItem->client_uuid.isEmpty()) eClient.setAttribute("uuid", pClientItem->client_uuid); if (!pClientItem->client_command.isEmpty()) { QDomElement eCommand = doc.createElement("command"); eCommand.appendChild(doc.createTextNode(pClientItem->client_command)); eClient.appendChild(eCommand); } QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { const PortItem *pPortItem = iterPort.next(); QDomElement ePort = doc.createElement("port"); ePort.setAttribute("name", pPortItem->port_name); ePort.setAttribute("type", pPortItem->port_type ? "in" : "out"); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { const ConnectItem *pConnectItem = iterConnect.next(); QDomElement eConnect = doc.createElement("connect"); eConnect.setAttribute("client", pConnectItem->client_name); eConnect.setAttribute("port", pConnectItem->port_name); ePort.appendChild(eConnect); } eClient.appendChild(ePort); } eSession.appendChild(eClient); } // Finally, save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // Infra-client list accessor (read-only) qjackctlSession::InfraClientList& qjackctlSession::infra_clients (void) { return m_infra_clients; } // Load all infra-clients from configuration file. void qjackctlSession::loadInfraClients ( QSettings& settings ) { clearInfraClients(); settings.beginGroup("/InfraClients"); const QStringList& keys = settings.childKeys(); QStringListIterator iter(keys); while (iter.hasNext()) { const QString& sKey = iter.next(); const QString& sValue = settings.value(sKey).toString(); if (!sValue.isEmpty()) { InfraClientItem *pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; m_infra_clients.insert(sKey, pInfraClientItem); } } settings.endGroup(); } // Save all infra-clients to configuration file. void qjackctlSession::saveInfraClients ( QSettings& settings ) { settings.beginGroup("/InfraClients"); settings.remove(QString()); // Remove all current keys. InfraClientList::ConstIterator iter = m_infra_clients.constBegin(); const InfraClientList::ConstIterator& iter_end = m_infra_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const QString& sKey = iter.key(); const QString& sValue = iter.value()->client_command; if (!sValue.isEmpty()) settings.setValue(sKey, sValue); } settings.endGroup(); } // Clear infra-client table. void qjackctlSession::clearInfraClients (void) { qDeleteAll(m_infra_clients); m_infra_clients.clear(); } // Check whether a given JACK client name exists... bool qjackctlSession::isJackClient ( const QString& sClientName ) const { const QByteArray aClientName = sClientName.toUtf8(); #ifdef CONFIG_JACK_SESSION if (::jack_get_uuid_for_client_name) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; const char *client_uuid = ::jack_get_uuid_for_client_name( pJackClient, aClientName.constData()); if (client_uuid) { ::jack_free((void *) client_uuid); return true; } return false; } #endif jack_client_t *pJackClient = ::jack_client_open(aClientName.constData(), jack_options_t(JackNoStartServer | JackUseExactName), NULL); if (pJackClient) { ::jack_client_close(pJackClient); return true; } return false; } // end of qjackctlSession.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlJackConnect.cpp0000644000000000000000000000012713215206021020152 xustar0029 mtime=1513425937.53376694 29 atime=1513425937.53276694 29 ctime=1513425937.53376694 qjackctl-0.5.0/src/qjackctlJackConnect.cpp0000644000175000001440000004144513215206021021010 0ustar00rncbcusers00000000000000// qjackctlJackConnect.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlJackConnect.h" #include "qjackctlMainForm.h" #include #ifdef CONFIG_JACK_METADATA #include #include static QString prettyName ( jack_uuid_t uuid ) { QString sPrettyName; char *pszValue = NULL; char *pszType = NULL; if (::jack_get_property(uuid, JACK_METADATA_PRETTY_NAME, &pszValue, &pszType) == 0) { if (pszValue) { sPrettyName = QString::fromUtf8(pszValue); ::jack_free(pszValue); } if (pszType) ::jack_free(pszType); } return sPrettyName; } static void setPrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid, const QString& sPrettyName ) { const char *pszValue = sPrettyName.toUtf8().constData(); ::jack_set_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME, pszValue, NULL); } static void removePrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid ) { ::jack_remove_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME); } #endif //---------------------------------------------------------------------- // class qjackctlJackPort -- Jack port list item. // // Constructor. qjackctlJackPort::qjackctlJackPort ( qjackctlJackClient *pClient, jack_port_t *pJackPort ) : qjackctlPortItem(pClient) { m_pJackPort = pJackPort; qjackctlJackConnect *pJackConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pJackConnect) { const unsigned long ulPortFlags = jack_port_flags(m_pJackPort); if (ulPortFlags & JackPortIsInput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTI : QJACKCTL_JACK_PORTLTI))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNI : QJACKCTL_JACK_PORTLNI))); } } else if (ulPortFlags & JackPortIsOutput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTO : QJACKCTL_JACK_PORTLTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNO : QJACKCTL_JACK_PORTLNO))); } } } } // Default destructor. qjackctlJackPort::~qjackctlJackPort (void) { } // Jack port handles accessors. jack_port_t *qjackctlJackPort::jackPort (void) const { return m_pJackPort; } // Pretty/display name method (virtual override). void qjackctlJackPort::updatePortName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = NULL; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sPortNameEx = portNameAlias(&bRenameEnabled); const QString& sPortName = portName(); jack_uuid_t port_uuid = ::jack_port_uuid(m_pJackPort); const QString& sPrettyName = prettyName(port_uuid); if (sPortNameEx != sPortName && sPortNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, port_uuid, sPortNameEx); } else { sPortNameEx = sPrettyName; setPortNameAlias(sPortNameEx); } } else if (sPortNameEx == sPortName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, port_uuid); } setPortText(sPortNameEx, bRenameEnabled); } else #endif qjackctlPortItem::updatePortName(bRename); } // Tooltip text builder (virtual override). QString qjackctlJackPort::tooltip (void) const { jack_latency_range_t latency_range; jack_port_get_latency_range(m_pJackPort, client()->isReadable() ? JackCaptureLatency : JackPlaybackLatency, &latency_range); QString sLatency = QString::number(latency_range.min); if (latency_range.max > latency_range.min) sLatency += '-' + QString::number(latency_range.max); return QObject::tr("%1 (%2 frames)").arg(portName()).arg(sLatency); } //---------------------------------------------------------------------- // class qjackctlJackClient -- Jack client list item. // // Constructor. qjackctlJackClient::qjackctlJackClient ( qjackctlJackClientList *pClientList ) : qjackctlClientItem(pClientList) { qjackctlJackConnect *pJackConnect = static_cast ( (pClientList->listView())->binding()); if (pJackConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTI))); } } } // Default destructor. qjackctlJackClient::~qjackctlJackClient (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClient::findJackPort ( jack_port_t *pJackPort ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlJackPort *pPort = static_cast (iter.next()); if (pPort && pPort->jackPort() == pJackPort) return pPort; } return NULL; } // Pretty/display name method (virtual override). void qjackctlJackClient::updateClientName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = NULL; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sClientNameEx = clientNameAlias(&bRenameEnabled); const QString& sClientName = clientName(); const char *pszClientName = sClientName.toUtf8().constData(); const char *pszClientUuid = ::jack_get_uuid_for_client_name(pJackClient, pszClientName); if (pszClientUuid) { jack_uuid_t client_uuid = 0; ::jack_uuid_parse(pszClientUuid, &client_uuid); const QString& sPrettyName = prettyName(client_uuid); if (sClientNameEx != sClientName && sClientNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, client_uuid, sClientNameEx); } else { sClientNameEx = sPrettyName; setClientNameAlias(sClientNameEx); } } else if (sClientNameEx == sClientName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, client_uuid); } ::jack_free((void *) pszClientUuid); } setClientText(sClientNameEx, bRenameEnabled); } else #endif qjackctlClientItem::updateClientName(bRename); } //---------------------------------------------------------------------- // qjackctlJackClientList -- Jack client list. // // Constructor. qjackctlJackClientList::qjackctlJackClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlJackClientList::~qjackctlJackClientList (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClientList::findJackClientPort ( jack_port_t *pJackPort ) { QListIterator iter(clients()); while (iter.hasNext()) { qjackctlJackClient *pClient = static_cast (iter.next()); if (pClient) { qjackctlJackPort *pPort = pClient->findJackPort(pJackPort); if (pPort) return pPort; } } return NULL; } // Client:port refreshner. int qjackctlJackClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return 0; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return 0; qjackctlJackConnect *pJackConnect = static_cast (listView()->binding()); if (pJackConnect == NULL) return 0; const char *pszJackType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (pJackConnect->jackType() == QJACKCTL_JACK_MIDI) pszJackType = JACK_DEFAULT_MIDI_TYPE; #endif char *aliases[2]; if (g_iJackClientPortAlias > 0) { const unsigned short alias_size = jack_port_name_size() + 1; aliases[0] = new char [alias_size]; aliases[1] = new char [alias_size]; } int iDirtyCount = 0; markClientPorts(0); const char **ppszClientPorts = jack_get_ports(pJackClient, 0, pszJackType, isReadable() ? JackPortIsOutput : JackPortIsInput); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); qjackctlJackClient *pClient = 0; qjackctlJackPort *pPort = 0; jack_port_t *pJackPort = jack_port_by_name(pJackClient, ppszClientPorts[iClientPort]); #ifdef CONFIG_JACK_PORT_ALIASES if (g_iJackClientPortAlias > 0 && jack_port_get_aliases(pJackPort, aliases) >= g_iJackClientPortAlias) sClientPort = QString::fromUtf8(aliases[g_iJackClientPortAlias - 1]); #endif int iColon = sClientPort.indexOf(':'); if (pJackPort && iColon >= 0) { QString sClientName = sClientPort.left(iColon); QString sPortName = sClientPort.right(sClientPort.length() - iColon - 1); pClient = static_cast (findClient(sClientName)); if (pClient) pPort = static_cast (pClient->findPort(sPortName)); if (pClient == 0) { pClient = new qjackctlJackClient(this); pClient->setClientName(sClientName); iDirtyCount++; } if (pClient && pPort == 0) { pPort = new qjackctlJackPort(pClient, pJackPort); pPort->setPortName(sPortName); iDirtyCount++; } if (pPort) pPort->markClientPort(1); } iClientPort++; } ::free(ppszClientPorts); } iDirtyCount += cleanClientPorts(0); if (g_iJackClientPortAlias > 0) { delete [] aliases[0]; delete [] aliases[1]; } return iDirtyCount; } // Jack client port aliases mode. int qjackctlJackClientList::g_iJackClientPortAlias = 0; void qjackctlJackClientList::setJackClientPortAlias ( int iJackClientPortAlias ) { g_iJackClientPortAlias = iJackClientPortAlias; if (g_iJackClientPortAlias > 0) g_bJackClientPortMetadata = false; } int qjackctlJackClientList::jackClientPortAlias (void) { return g_iJackClientPortAlias; } // Jack client port pretty-names (metadata) mode. bool qjackctlJackClientList::g_bJackClientPortMetadata = false; void qjackctlJackClientList::setJackClientPortMetadata ( bool bJackClientPortMetadata ) { g_bJackClientPortMetadata = bJackClientPortMetadata; if (g_bJackClientPortMetadata) g_iJackClientPortAlias = 0; } bool qjackctlJackClientList::isJackClientPortMetadata (void) { return g_bJackClientPortMetadata; } //---------------------------------------------------------------------- // qjackctlJackConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlJackConnect::qjackctlJackConnect ( qjackctlConnectView *pConnectView, int iJackType ) : qjackctlConnect(pConnectView) { m_iJackType = iJackType; createIconPixmaps(); setOClientList(new qjackctlJackClientList( connectView()->OListView(), true)); setIClientList(new qjackctlJackClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlJackConnect::~qjackctlJackConnect (void) { deleteIconPixmaps(); } // Connection type accessors. int qjackctlJackConnect::jackType (void) const { return m_iJackType; } // Local pixmap-set janitor methods. void qjackctlJackConnect::createIconPixmaps (void) { switch (m_iJackType) { case QJACKCTL_JACK_MIDI: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("mporto"); break; case QJACKCTL_JACK_AUDIO: default: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("aclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("acliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("aportpti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("aportpto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("aportpni"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("aportpno"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("aportlti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("aportlto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("aportlni"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("aportlno"); break; } } void qjackctlJackConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_JACK_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = NULL; } } // Common pixmap accessor (static). const QPixmap& qjackctlJackConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Connection primitive. bool qjackctlJackConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_connect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Disconnection primitive. bool qjackctlJackConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_disconnect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Update port connection references. void qjackctlJackConnect::updateConnections (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; qjackctlJackClientList *pIClientList = static_cast (IClientList()); if (pIClientList == NULL) return; // For each output client item... QListIterator oclient(OClientList()->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlJackPort *pOJack = static_cast (pOPort); // Get port connections... const char **ppszClientPorts = jack_port_get_all_connections( pJackClient, pOJack->jackPort()); if (ppszClientPorts) { // Now, for each input client port... int iClientPort = 0; while (ppszClientPorts[iClientPort]) { jack_port_t *pJackPort = jack_port_by_name( pJackClient, ppszClientPorts[iClientPort]); if (pJackPort) { qjackctlPortItem *pIPort = pIClientList->findJackClientPort(pJackPort); if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } } iClientPort++; } ::free(ppszClientPorts); } } } } // Update icon size implementation. void qjackctlJackConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlJackConnect.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlMainForm.ui0000644000000000000000000000012713215206021017333 xustar0029 mtime=1513425937.53576694 29 atime=1513425937.53476694 29 ctime=1513425937.53576694 qjackctl-0.5.0/src/qjackctlMainForm.ui0000644000175000001440000005425213215206021020171 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMainForm 0 0 300 100 1 1 0 0 QjackCtl :/images/qjackctl.png 4 4 28 28 32767 28 Qt::TabFocus Start the JACK server &Start :/images/start1.png false Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Stop the JACK server S&top :/images/stop1.png Qt::ToolButtonTextBesideIcon 7 7 0 0 260 80 true QFrame::Panel QFrame::Sunken 2 0 50 0 8 JACK server state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 20 0 8 JACK server mode Qt::AlignCenter false 40 0 8 DSP Load Qt::AlignCenter false 50 0 8 Sample rate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 30 0 8 XRUN Count (notifications) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 130 0 14 75 true Time display Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 50 0 8 Transport state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 30 0 8 Transport BPM Qt::AlignCenter false 80 0 8 75 true Transport time Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 28 28 32767 28 Qt::TabFocus Quit processing and exit &Quit :/images/quit1.png Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the session management window S&ession :/images/session1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the messages log/status window &Messages :/images/messagesstatus1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show settings and options dialog Set&up... :/images/setup1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the actual connections patchbay window &Connect :/images/connections1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the patchbay editor window &Patchbay :/images/patchbay1.png true Qt::ToolButtonTextBesideIcon 28 28 48 28 Qt::TabFocus Rewind transport &Rewind :/images/rewind1.png 28 28 48 28 Qt::TabFocus Backward transport &Backward :/images/backward1.png true 28 28 48 28 Qt::TabFocus Start transport rolling &Play :/images/play1.png true 1 1 0 0 28 28 48 28 Qt::TabFocus Stop transport rolling Pa&use :/images/pause1.png 28 28 48 28 Qt::TabFocus Forward transport &Forward :/images/forward1.png true 28 28 32767 28 Qt::TabFocus Show information about this application Ab&out... :/images/about1.png Qt::ToolButtonTextBesideIcon StartToolButton StopToolButton QuitToolButton MessagesStatusToolButton SessionToolButton SetupToolButton ConnectionsToolButton PatchbayToolButton RewindToolButton BackwardToolButton PlayToolButton PauseToolButton ForwardToolButton AboutToolButton qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlConnectionsForm.h0000644000000000000000000000012713215206021020543 xustar0029 mtime=1513425937.53276694 29 atime=1513425937.53276694 29 ctime=1513425937.53276694 qjackctl-0.5.0/src/qjackctlConnectionsForm.h0000644000175000001440000000735213215206021021400 0ustar00rncbcusers00000000000000// qjackctlConnectionsForm.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnectionsForm_h #define __qjackctlConnectionsForm_h #include "ui_qjackctlConnectionsForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. class qjackctlConnectionsForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectionsForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlConnectionsForm(); void setup(qjackctlSetup *pSetup); qjackctlConnectView *audioConnectView() const; qjackctlConnectView *midiConnectView() const; qjackctlConnectView *alsaConnectView() const; bool queryClose(); enum TabPage { AudioTab = 0, MidiTab = 1, AlsaTab = 2 }; void setTabPage(int iTabPage); int tabPage() const; QFont connectionsFont() const; void setConnectionsFont(const QFont& font); void setConnectionsIconSize(int iIconSize); bool isAudioConnected() const; bool isMidiConnected() const; bool isAlsaConnected() const; void refreshAudio(bool bEnabled, bool bClear = false); void refreshMidi(bool bEnabled, bool bClear = false); void refreshAlsa(bool bEnabled, bool bClear = false); void stabilizeAudio(bool bEnabled, bool bClear = false); void stabilizeMidi(bool bEnabled, bool bClear = false); void stabilizeAlsa(bool bEnabled, bool bClear = false); void setupAliases(qjackctlSetup *pSetup); void updateAliases(); bool loadAliases(); bool saveAliases(); public slots: void audioConnectSelected(); void audioDisconnectSelected(); void audioDisconnectAll(); void audioExpandAll(); void audioRefreshClear(); void audioRefresh(); void audioStabilize(); void midiConnectSelected(); void midiDisconnectSelected(); void midiDisconnectAll(); void midiExpandAll(); void midiRefreshClear(); void midiRefresh(); void midiStabilize(); void alsaConnectSelected(); void alsaDisconnectSelected(); void alsaDisconnectAll(); void alsaExpandAll(); void alsaRefreshClear(); void alsaRefresh(); void alsaStabilize(); protected slots: void audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlConnectionsForm m_ui; // Instance variables. qjackctlJackConnect *m_pAudioConnect; qjackctlJackConnect *m_pMidiConnect; qjackctlAlsaConnect *m_pAlsaConnect; qjackctlSetup *m_pSetup; QString m_sPreset; }; #endif // __qjackctlConnectionsForm_h // end of qjackctlConnectionsForm.h qjackctl-0.5.0/src/PaxHeaders.4714/qjackctl.cpp0000644000000000000000000000012713215206021016047 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctl.cpp0000644000175000001440000003320213215206021016675 0ustar00rncbcusers00000000000000// qjackctl.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif #ifndef CONFIG_PREFIX #define CONFIG_PREFIX "/usr/local" #endif #ifndef CONFIG_DATADIR #define CONFIG_DATADIR CONFIG_PREFIX "/share" #endif //------------------------------------------------------------------------- // Singleton application instance stuff (Qt/X11 only atm.) // #if QT_VERSION < 0x050000 #if defined(Q_WS_X11) #define CONFIG_X11 #endif #else #if defined(QT_X11EXTRAS_LIB) #define CONFIG_X11 #endif #endif #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #include /* for gethostname() */ #include #include #include #define QJACKCTL_XUNIQUE "qjackctlApplication" #if QT_VERSION >= 0x050100 #include #include #include class qjackctlApplication; class qjackctlXcbEventFilter : public QAbstractNativeEventFilter { public: // Constructor. qjackctlXcbEventFilter(qjackctlApplication *pApp) : QAbstractNativeEventFilter(), m_pApp(pApp) {} // XCB event filter (virtual processor). bool nativeEventFilter(const QByteArray& eventType, void *message, long *); private: // Instance variable. qjackctlApplication *m_pApp; }; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 class qjackctlApplication : public QApplication { public: // Constructor. qjackctlApplication(int& argc, char **argv) : QApplication(argc, argv), m_pQtTranslator(0), m_pMyTranslator(0), m_pWidget(0) { // Load translation support. QLocale loc; if (loc.language() != QLocale::C) { // Try own Qt translation... m_pQtTranslator = new QTranslator(this); QString sLocName = "qt_" + loc.name(); QString sLocPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); if (m_pQtTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pQtTranslator); } else { delete m_pQtTranslator; m_pQtTranslator = 0; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } // Try own application translation... m_pMyTranslator = new QTranslator(this); sLocName = "qjackctl_" + loc.name(); if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { sLocPath = CONFIG_DATADIR "/qjackctl/translations"; if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { delete m_pMyTranslator; m_pMyTranslator = 0; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } } } #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_pDisplay = NULL; m_wOwner = None; #if QT_VERSION >= 0x050100 m_pXcbEventFilter = new qjackctlXcbEventFilter(this); installNativeEventFilter(m_pXcbEventFilter); #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 } // Destructor. ~qjackctlApplication() { #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #if QT_VERSION >= 0x050100 removeNativeEventFilter(m_pXcbEventFilter); delete m_pXcbEventFilter; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 if (m_pMyTranslator) delete m_pMyTranslator; if (m_pQtTranslator) delete m_pQtTranslator; } // Main application widget accessors. void setMainWidget(QWidget *pWidget) { m_pWidget = pWidget; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_wOwner = m_pWidget->winId(); if (m_pDisplay && m_wOwner) { XGrabServer(m_pDisplay); XSetSelectionOwner(m_pDisplay, m_aUnique, m_wOwner, CurrentTime); XUngrabServer(m_pDisplay); } #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 } QWidget *mainWidget() const { return m_pWidget; } // Check if another instance is running, // and raise its proper main widget... bool setup(const QString& sServerName) { #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_pDisplay = QX11Info::display(); QString sUnique = QJACKCTL_XUNIQUE; if (sServerName.isEmpty()) { const char *pszServerName = ::getenv("JACK_DEFAULT_SERVER"); if (pszServerName) { sUnique += '_'; sUnique += pszServerName; } } else { sUnique += '_'; sUnique += sServerName; } char szHostName[255]; if (::gethostname(szHostName, sizeof(szHostName)) == 0) { sUnique += '@'; sUnique += szHostName; } m_aUnique = XInternAtom(m_pDisplay, sUnique.toUtf8().constData(), false); XGrabServer(m_pDisplay); m_wOwner = XGetSelectionOwner(m_pDisplay, m_aUnique); XUngrabServer(m_pDisplay); if (m_wOwner != None) { // First, notify any freedesktop.org WM // that we're about to show the main widget... Screen *pScreen = XDefaultScreenOfDisplay(m_pDisplay); int iScreen = XScreenNumberOfScreen(pScreen); XEvent ev; memset(&ev, 0, sizeof(ev)); ev.xclient.type = ClientMessage; ev.xclient.display = m_pDisplay; ev.xclient.window = m_wOwner; ev.xclient.message_type = XInternAtom(m_pDisplay, "_NET_ACTIVE_WINDOW", false); ev.xclient.format = 32; ev.xclient.data.l[0] = 0; // Source indication. ev.xclient.data.l[1] = 0; // Timestamp. ev.xclient.data.l[2] = 0; // Requestor's currently active window (none) ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSelectInput(m_pDisplay, m_wOwner, StructureNotifyMask); XSendEvent(m_pDisplay, RootWindow(m_pDisplay, iScreen), false, (SubstructureNotifyMask | SubstructureRedirectMask), &ev); XSync(m_pDisplay, false); XRaiseWindow(m_pDisplay, m_wOwner); // And then, let it get caught on destination // by QApplication::native/x11EventFilter... const QByteArray value = QJACKCTL_XUNIQUE; XChangeProperty( m_pDisplay, m_wOwner, m_aUnique, m_aUnique, 8, PropModeReplace, (unsigned char *) value.data(), value.length()); // Done. return true; } #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 return false; } #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE void x11PropertyNotify(Window w) { if (m_pDisplay && m_pWidget && m_wOwner == w) { // Always check whether our property-flag is still around... Atom aType; int iFormat = 0; unsigned long iItems = 0; unsigned long iAfter = 0; unsigned char *pData = 0; if (XGetWindowProperty( m_pDisplay, m_wOwner, m_aUnique, 0, 1024, false, m_aUnique, &aType, &iFormat, &iItems, &iAfter, &pData) == Success && aType == m_aUnique && iItems > 0 && iAfter == 0) { // Avoid repeating it-self... XDeleteProperty(m_pDisplay, m_wOwner, m_aUnique); // Just make it always shows up fine... m_pWidget->show(); m_pWidget->raise(); m_pWidget->activateWindow(); // FIXME: Do our best speciality, although it should be // done iif configuration says so, we'll do it anyway! qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->startJack(); } // Free any left-overs... if (iItems > 0 && pData) XFree(pData); } } #if QT_VERSION < 0x050000 bool x11EventFilter(XEvent *pEv) { if (pEv->type == PropertyNotify && pEv->xproperty.state == PropertyNewValue) x11PropertyNotify(pEv->xproperty.window); return QApplication::x11EventFilter(pEv); } #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 private: // Translation support. QTranslator *m_pQtTranslator; QTranslator *m_pMyTranslator; // Instance variables. QWidget *m_pWidget; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE Display *m_pDisplay; Atom m_aUnique; Window m_wOwner; #if QT_VERSION >= 0x050100 qjackctlXcbEventFilter *m_pXcbEventFilter; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 }; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #if QT_VERSION >= 0x050100 // XCB Event filter (virtual processor). bool qjackctlXcbEventFilter::nativeEventFilter ( const QByteArray& eventType, void *message, long * ) { if (eventType == "xcb_generic_event_t") { xcb_property_notify_event_t *pEv = static_cast (message); if ((pEv->response_type & ~0x80) == XCB_PROPERTY_NOTIFY && pEv->state == XCB_PROPERTY_NEW_VALUE) m_pApp->x11PropertyNotify(pEv->window); } return false; } #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 //------------------------------------------------------------------------- // stacktrace - Signal crash handler. // #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) #include #include #include #include #include void stacktrace ( int signo ) { pid_t pid; int rc; int status = 0; char cmd[80]; // Reinstall default handler; prevent race conditions... signal(signo, SIG_DFL); static const char *shell = "/bin/sh"; static const char *format = "gdb -q --batch --pid=%d" " --eval-command='thread apply all bt'"; snprintf(cmd, sizeof(cmd), format, (int) getpid()); pid = fork(); // Fork failure! if (pid < 0) return; // Fork child... if (pid == 0) { execl(shell, shell, "-c", cmd, NULL); _exit(1); return; } // Parent here: wait for child to terminate... do { rc = waitpid(pid, &status, 0); } while ((rc < 0) && (errno == EINTR)); // Dispatch any logging, if any... QApplication::processEvents(QEventLoop::AllEvents, 3000); // Make sure everyone terminates... kill(pid, SIGTERM); _exit(1); } #endif #endif //------------------------------------------------------------------------- // main - The main program trunk. // int main ( int argc, char **argv ) { Q_INIT_RESOURCE(qjackctl); #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) signal(SIGILL, stacktrace); signal(SIGFPE, stacktrace); signal(SIGSEGV, stacktrace); signal(SIGABRT, stacktrace); signal(SIGBUS, stacktrace); #endif #endif qjackctlApplication app(argc, argv); // Construct default settings; override with command line arguments. qjackctlSetup settings; if (!settings.parse_args(app.arguments())) { app.quit(); return 1; } // Check if we'll just start an external program... if (!settings.sCmdLine.isEmpty()) { jack_client_t *pJackClient = jack_client_open("qjackctl-start", JackNoStartServer, NULL); if (pJackClient) { jack_client_close(pJackClient); int iExitStatus = ::system(settings.sCmdLine.toUtf8().constData()); app.quit(); return iExitStatus; } } // Have another instance running? if (settings.bSingleton) { if (app.setup(settings.sServerName)) { app.quit(); return 2; } } // Dark themes grayed/disabled color group fix... QPalette pal(app.palette()); if (pal.base().color().value() < 0x7f) { #if QT_VERSION >= 0x050000 const QColor& color = pal.window().color(); const int iGroups = int(QPalette::Active | QPalette::Inactive) + 1; for (int i = 0; i < iGroups; ++i) { const QPalette::ColorGroup group = QPalette::ColorGroup(i); pal.setBrush(group, QPalette::Light, color.lighter(150)); pal.setBrush(group, QPalette::Midlight, color.lighter(120)); pal.setBrush(group, QPalette::Dark, color.darker(150)); pal.setBrush(group, QPalette::Mid, color.darker(120)); pal.setBrush(group, QPalette::Shadow, color.darker(200)); } // pal.setColor(QPalette::Disabled, QPalette::ButtonText, pal.mid().color()); #endif pal.setColorGroup(QPalette::Disabled, pal.windowText().color().darker(), pal.button(), pal.light(), pal.dark(), pal.mid(), pal.text().color().darker(), pal.text().color().lighter(), pal.base(), pal.window()); app.setPalette(pal); } // Set default base font... if (settings.iBaseFontSize > 0) app.setFont(QFont(app.font().family(), settings.iBaseFontSize)); // What style do we create these forms? Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (settings.bKeepOnTop) wflags |= Qt::Tool; // Construct the main form, and show it to the world. qjackctlMainForm w(0, wflags); w.setup(&settings); // If we have a systray icon, we'll skip this. if (!settings.bSystemTray) { w.show(); w.adjustSize(); } // Settle this one as application main widget... app.setMainWidget(&w); // Settle session manager shutdown (eg. logoff)... QObject::connect( &app, SIGNAL(commitDataRequest(QSessionManager&)), &w, SLOT(commitData(QSessionManager&)), Qt::DirectConnection); // Register the quit signal/slot. app.setQuitOnLastWindowClosed(false); return app.exec(); } // end of qjackctl.cpp qjackctl-0.5.0/src/PaxHeaders.4714/qjackctlAboutForm.cpp0000644000000000000000000000012713215206021017666 xustar0029 mtime=1513425937.53076694 29 atime=1513425937.53076694 29 ctime=1513425937.53076694 qjackctl-0.5.0/src/qjackctlAboutForm.cpp0000644000175000001440000000752613215206021020526 0ustar00rncbcusers00000000000000// qjackctlAboutForm.cpp // /**************************************************************************** Copyright (C) 2003-2017, rncbc aka Rui Nuno Capela. All rights reserved. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlAboutForm.h" #include #ifdef CONFIG_JACK_VERSION #include #endif //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. // Constructor. qjackctlAboutForm::qjackctlAboutForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); QStringList list; #ifdef CONFIG_DEBUG list << tr("Debugging option enabled."); #endif #ifndef CONFIG_SYSTEM_TRAY list << tr("System tray disabled."); #endif #ifndef CONFIG_JACK_TRANSPORT list << tr("Transport status control disabled."); #endif #ifndef CONFIG_JACK_REALTIME list << tr("Realtime status disabled."); #endif #ifndef CONFIG_JACK_XRUN_DELAY list << tr("XRUN delay status disabled."); #endif #ifndef CONFIG_JACK_MAX_DELAY list << tr("Maximum delay status disabled."); #endif #ifndef CONFIG_JACK_PORT_ALIASES list << tr("JACK Port aliases support disabled."); #endif #ifndef CONFIG_JACK_MIDI list << tr("JACK MIDI support disabled."); #endif #ifndef CONFIG_JACK_SESSION list << tr("JACK Session support disabled."); #endif #ifndef CONFIG_ALSA_SEQ #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) list << tr("ALSA/MIDI sequencer support disabled."); #endif #endif #ifndef CONFIG_DBUS #if !defined(__WIN32__) && !defined(_WIN32) && !defined(WIN32) list << tr("D-Bus interface support disabled."); #endif #endif // Stuff the about box... QString sText = "\n"; m_ui.AboutTextView->setText(sText); // UI connections... QObject::connect(m_ui.AboutQtButton, SIGNAL(clicked()), SLOT(aboutQt())); QObject::connect(m_ui.ClosePushButton, SIGNAL(clicked()), SLOT(close())); } // Destructor. qjackctlAboutForm::~qjackctlAboutForm (void) { } // About Qt request. void qjackctlAboutForm::aboutQt() { QMessageBox::aboutQt(this); } // end of qjackctlAboutForm.cpp qjackctl-0.5.0/PaxHeaders.4714/TODO0000644000000000000000000000013213215206021013444 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/TODO0000644000175000001440000000107013215206021014274 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- TODOs 0.4.0 Backlog - Having parameter settings obey/depend on jackctl API. ... 0.1.1 Backlog - Having some LADCCA support or awareness may be very welcome. 0.0.5 Backlog - Make available some translations, as some has been contributed already; I'm missing "volunteers" for French (fr), German (de) and Spanish (es). 0.0.3 Backlog: - Display of current jackd version string. - XRUN ticker visual charting. - Any other feature one can think of ;) qjackctl-0.5.0/PaxHeaders.4714/TRANSLATORS0000644000000000000000000000013213215206021014513 xustar0030 mtime=1513425937.521766939 30 atime=1513425937.521766939 30 ctime=1513425937.521766939 qjackctl-0.5.0/TRANSLATORS0000644000175000001440000000074413215206021015352 0ustar00rncbcusers00000000000000Czech (cs) Pavel Fric German (de) Guido Scholz Spanish (es) Adrian Pardini French (fr) Raphaël Doursenaud Olivier Humbert Italian (it) Sergio Atzori Japanese (ja) Takashi Sakamoto Dutch (nl) Peter Geirnaert Russian (ru) Alexandre Prokoudine


\n"; sText += "" QJACKCTL_TITLE " - " + tr(QJACKCTL_SUBTITLE) + "
\n"; sText += "
\n"; sText += tr("Version") + ": " CONFIG_BUILD_VERSION "
\n"; // sText += "" + tr("Build") + ": " CONFIG_BUILD_DATE "
\n"; if (!list.isEmpty()) { sText += ""; sText += list.join("
\n"); sText += "
"; } #ifdef CONFIG_JACK_VERSION sText += "
\n"; sText += tr("Using: JACK %1").arg(jack_get_version_string()); sText += "
\n"; #endif sText += "
\n"; sText += tr("Website") + ":
" QJACKCTL_WEBSITE "
\n"; sText += "
\n"; sText += ""; sText += QJACKCTL_COPYRIGHT "
\n"; sText += "
\n"; sText += tr("This program is free software; you can redistribute it and/or modify it") + "
\n"; sText += tr("under the terms of the GNU General Public License version 2 or later."); sText += "
"; sText += "