--- ecasound2.2-2.7.0.orig/autogen-vc.sh +++ ecasound2.2-2.7.0/autogen-vc.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# version:20080819-3 + +# explicitly select autoconf version to use +ECA_AM_VERSION="" +#ECA_AM_VERSION="-1.9" + +# explicitly select autoconf version to use +ECA_AC_VERSION="" +#ECA_AC_VERSION="2.50" + +# created variables for tools +export AUTOMAKE=automake${ECA_AM_VERSION} +export ACLOCAL=aclocal${ECA_AM_VERSION} +export AUTOHEADER=autoheader${ECA_AC_VERSION} +export AUTOCONF=autoconf${ECA_AC_VERSION} + +autoreconf --install --force --verbose + +# test for --reconf +if test x$1 = "x--reconf"; then + ./config.status --recheck && ./config.status +fi --- ecasound2.2-2.7.0.orig/missing +++ ecasound2.2-2.7.0/missing @@ -1,9 +1,9 @@ #! /bin/sh # Common stub for a few missing GNU programs while installing. -scriptversion=2005-06-08.21 +scriptversion=2006-05-10.23 -# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. @@ -33,6 +33,8 @@ fi run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. @@ -44,7 +46,7 @@ msg="missing on your system" -case "$1" in +case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= @@ -77,6 +79,7 @@ aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c @@ -106,7 +109,7 @@ # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). -case "$1" in +case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; @@ -135,7 +138,7 @@ # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. -case "$1" in +case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if @@ -164,7 +167,7 @@ test -z "$files" && files="config.h" touch_files= for f in $files; do - case "$f" in + case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; @@ -192,8 +195,8 @@ You can get \`$1' as part of \`Autoconf' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` - test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else @@ -214,25 +217,25 @@ in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi - if [ ! -f y.tab.h ]; then + if test ! -f y.tab.h; then echo >y.tab.h fi - if [ ! -f y.tab.c ]; then + if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; @@ -244,18 +247,18 @@ in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c - if [ $# -ne 1 ]; then + if test $# -ne 1; then eval LASTARG="\${$#}" - case "$LASTARG" in + case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` - if [ -f "$SRCFILE" ]; then + if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi - if [ ! -f lex.yy.c ]; then + if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; @@ -267,11 +270,9 @@ \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` - fi - if [ -f "$file" ]; then + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then touch $file else test -z "$file" || exec >$file @@ -289,11 +290,17 @@ DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi @@ -317,13 +324,13 @@ fi firstarg="$1" if shift; then - case "$firstarg" in + case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac - case "$firstarg" in + case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 --- ecasound2.2-2.7.0.orig/config.h +++ ecasound2.2-2.7.0/config.h @@ -0,0 +1,270 @@ +/* config.h. Generated from config.h.in by configure. */ +/* config.h.in. Generated from configure.in by autoheader. */ + +/* disable all use of shared libs */ +/* #undef ECA_ALL_STATIC */ + +/* enable ALSA support */ +#define ECA_COMPILE_ALSA 1 + +/* enable aRts support */ +/* #undef ECA_COMPILE_ARTS */ + +/* enable libaudiofile support */ +#define ECA_COMPILE_AUDIOFILE 1 + +/* enable JACK support */ +#define ECA_COMPILE_JACK 1 + +/* enable OSS audio input/output */ +#define ECA_COMPILE_OSS 1 + +/* enable libsamplerate support */ +#define ECA_COMPILE_SAMPLERATE 1 + +/* enable libsndfile support */ +#define ECA_COMPILE_SNDFILE 1 + +/* debugging mode build */ +/* #undef ECA_DEBUG_MODE */ + +/* disable all effects */ +/* #undef ECA_DISABLE_EFFECTS */ + +/* disable use of OSS trigger API */ +/* #undef ECA_DISABLE_OSS_TRIGGER */ + +/* enable experimental features */ +/* #undef ECA_FEELING_EXPERIMENTAL */ + +/* version of JACK transport API to use */ +#define ECA_JACK_TRANSPORT_API 3 + +/* enable ecasound curses console interface */ +#define ECA_PLATFORM_CURSES 1 + +/* Ecasound configure script prefix */ +#define ECA_PREFIX "/usr" + +/* use ncurses.h for curses interface */ +/* #undef ECA_USE_CURSES_H */ + +/* use C++ std namespace */ +#define ECA_USE_CXX_STD_NAMESPACE 1 + +/* Use liblo for OSC support */ +/* #undef ECA_USE_LIBLO */ + +/* Use liboil */ +/* #undef ECA_USE_LIBOIL */ + +/* use curses.h for curses interface */ +#define ECA_USE_NCURSES_H 1 + +/* ncurses headers are installed in ncurses subdir */ +/* #undef ECA_USE_NCURSES_NCURSES_H */ + +/* Define to 1 if you have the `clock_gettime' function. */ +#define HAVE_CLOCK_GETTIME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_EXECINFO_H 1 + +/* Define to 1 if you have the `execvp' function. */ +#define HAVE_EXECVP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FEATURES_H 1 + +/* Define to 1 if you have the `getpagesize' function. */ +#define HAVE_GETPAGESIZE 1 + +/* Define to 1 if you have the `gettimeofday' function. */ +#define HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LADSPA_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mlockall' function. */ +#define HAVE_MLOCKALL 1 + +/* Define to 1 if you have a working `mmap' system call. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the `munlockall' function. */ +#define HAVE_MUNLOCKALL 1 + +/* Define to 1 if you have the `nanosleep' function. */ +#define HAVE_NANOSLEEP 1 + +/* Define to 1 if you have the `pause' function. */ +#define HAVE_PAUSE 1 + +/* Define to 1 if you have the `posix_memalign' function. */ +#define HAVE_POSIX_MEMALIGN 1 + +/* Define to 1 if you have the `pthread_getschedparam' function. */ +#define HAVE_PTHREAD_GETSCHEDPARAM 1 + +/* Define to 1 if you have the `pthread_kill' function. */ +#define HAVE_PTHREAD_KILL 1 + +/* Define to 1 if you have the `pthread_mutexattr_init' function. */ +#define HAVE_PTHREAD_MUTEXATTR_INIT 1 + +/* Define to 1 if you have the `pthread_self' function. */ +#define HAVE_PTHREAD_SELF 1 + +/* Define to 1 if you have the `pthread_setschedparam' function. */ +#define HAVE_PTHREAD_SETSCHEDPARAM 1 + +/* Define to 1 if you have the `pthread_sigmask' function. */ +#define HAVE_PTHREAD_SIGMASK 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_REGEX_H 1 + +/* Define to 1 if you have the `sched_getparam' function. */ +#define HAVE_SCHED_GETPARAM 1 + +/* Define to 1 if you have the `sched_getscheduler' function. */ +#define HAVE_SCHED_GETSCHEDULER 1 + +/* Define to 1 if you have the `sched_get_priority_max' function. */ +#define HAVE_SCHED_GET_PRIORITY_MAX 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SCHED_H 1 + +/* Define to 1 if you have the `sched_setscheduler' function. */ +#define HAVE_SCHED_SETSCHEDULER 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `sigprocmask' function. */ +#define HAVE_SIGPROCMASK 1 + +/* Define to 1 if you have the `sigwait' function. */ +#define HAVE_SIGWAIT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_POLL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `usleep' function. */ +#define HAVE_USLEEP 1 + +/* libecasoundc interface version */ +#define LIBECASOUNDC_VERSION 2 + +/* libecasound interface version */ +#define LIBECASOUND_VERSION 22 + +/* libecasound interface age */ +#define LIBECASOUND_VERSION_AGE 0 + +/* libkvutils interface version */ +#define LIBKVUTILS_VERSION 9 + +/* libkvutils interface age */ +#define LIBKVUTILS_VERSION_AGE 5 + +/* Name of package */ +#define PACKAGE "ecasound" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "ecasound" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "ecasound 2.7.0" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "ecasound" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "2.7.0" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if you can safely include both and . */ +#define TIME_WITH_SYS_TIME 1 + +/* Version number of package */ +#define VERSION "2.7.0" + +/* Define to 1 if your processor stores words with the most significant byte + first (like Motorola and SPARC, unlike Intel and VAX). */ +/* #undef WORDS_BIGENDIAN */ + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ --- ecasound2.2-2.7.0.orig/stamp-h1 +++ ecasound2.2-2.7.0/stamp-h1 @@ -0,0 +1 @@ +timestamp for config.h --- ecasound2.2-2.7.0.orig/libtool +++ ecasound2.2-2.7.0/libtool @@ -0,0 +1,7941 @@ +#! /bin/sh + +# libtoolT - Provide generalized library-building support services. +# Generated automatically by (GNU ecasound 2.7.0) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED="/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="/bin/sed -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags=" CXX F77" + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host core2duo: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=yes + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=needless + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2 -D_REENTRANT -DNDEBUG -ffast-math -fstrict-aliasing -funroll-loops" + +# A language-specific compiler. +CC="gcc" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=98304 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + \$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=no + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.3.2 /usr/lib /lib" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/R/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION="1.5.26 Debian 1.5.26-4" +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () +{ + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $echo $win32_libid_type +} + + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$base_compile $lastarg" + continue + ;; + + * ) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$pre_post_deps $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$newdlfiles $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$2" + number_minor="$3" + number_revision="$4" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$echo "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) dlfiles="$dlfiles $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + deplibs="$deplibs -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval \\$echo \"$libname_spec\"` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + deplibs="$new_libs" + + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $echo "Libraries have been installed in:" + for libdir in $libdirs; do + $echo " $libdir" + done + $echo + $echo "If you ever happen to want to link against installed libraries" + $echo "in a given directory, LIBDIR, you must either use libtool, and" + $echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + $echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + $echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + $echo " during execution" + fi + if test -n "$runpath_var"; then + $echo " - add LIBDIR to the \`$runpath_var' environment variable" + $echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $echo " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $echo " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + $echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + $echo + $echo "See any operating system documentation about shared libraries for" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# Libtool was configured on host core2duo: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=needless + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2 -D_REENTRANT -DNDEBUG -ffast-math -fstrict-aliasing -funroll-loops" + +# A language-specific compiler. +CC="g++" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=98304 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtbeginS.o" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtfastmath.o /usr/lib/gcc/x86_64-linux-gnu/4.3.2/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib/crtn.o" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="/usr/lib/gcc/x86_64-linux-gnu/4.3.2 /usr/lib/gcc/x86_64-linux-gnu/4.3.2 /usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib /lib/../lib /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../.." + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.3.2 -L/usr/lib/gcc/x86_64-linux-gnu/4.3.2 -L/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.3.2/../../.." + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=no + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.3.2 /usr/lib /lib" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/R/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: CXX + +# ### BEGIN LIBTOOL TAG CONFIG: F77 + +# Libtool was configured on host core2duo: + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=needless + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2 -D_REENTRANT -DNDEBUG -ffast-math -fstrict-aliasing -funroll-loops" + +# A language-specific compiler. +CC="gfortran" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=98304 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag="" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + \$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=no + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib/gcc/x86_64-linux-gnu/4.3.2 /usr/lib /lib" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/lib/R/lib /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: F77 + --- ecasound2.2-2.7.0.orig/install-sh +++ ecasound2.2-2.7.0/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2005-05-14.22 +scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -39,38 +39,68 @@ # when there is no Makefile. # # This script is compatible with the BSD install script, but was written -# from scratch. It can only install one file at a time, a restriction -# shared with many OS's install programs. +# from scratch. + +nl=' +' +IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi -# put in absolute paths if you don't have them in your path; or use env. vars. +# Put in absolute file names if you don't have them in your path; +# or use environment vars. -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 -chmodcmd="$chmodprog 0755" -chowncmd= chgrpcmd= -stripcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog rmcmd="$rmprog -f" -mvcmd="$mvprog" +stripcmd= + src= dst= dir_arg= -dstarg= +dst_arg= + +copy_on_change=false no_target_directory= -usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... @@ -80,81 +110,86 @@ In the 4th, create DIRECTORIES. Options: --c (ignored) --d create directories instead of installing files. --g GROUP $chgrpprog installed files to GROUP. --m MODE $chmodprog installed files to MODE. --o USER $chownprog installed files to USER. --s $stripprog installed files. --t DIRECTORY install into DIRECTORY. --T report an error if DSTFILE is a directory. ---help display this help and exit. ---version display version info and exit. + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG " -while test -n "$1"; do +while test $# -ne 0; do case $1 in - -c) shift - continue;; + -c) ;; - -d) dir_arg=true - shift - continue;; + -C) copy_on_change=true;; + + -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; + shift;; --help) echo "$usage"; exit $?;; - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -s) stripcmd=$stripprog - shift - continue;; - - -t) dstarg=$2 - shift - shift - continue;; - - -T) no_target_directory=true - shift - continue;; + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; - *) # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - test -n "$dir_arg$dstarg" && break - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dstarg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dstarg" - shift # fnord - fi - shift # arg - dstarg=$arg - done + --) shift break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; esac + shift done -if test -z "$1"; then +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 @@ -164,24 +199,47 @@ exit 0 fi +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + for src do # Protect names starting with `-'. case $src in - -*) src=./$src ;; + -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src - src= - - if test -d "$dst"; then - mkdircmd=: - chmodcmd= - else - mkdircmd=$mkdirprog - fi + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? else + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. @@ -190,71 +248,199 @@ exit 1 fi - if test -z "$dstarg"; then + if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi - dst=$dstarg + dst=$dst_arg # Protect names starting with `-'. case $dst in - -*) dst=./$dst ;; + -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then - echo "$0: $dstarg: Is a directory" >&2 + echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi - dst=$dst/`basename "$src"` + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? fi fi - # This sed command emulates the dirname command. - dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'` - - # Make sure that the destination directory exists. + obsolete_mkdir_used=false - # Skip lots of stat calls in the usual case. - if test ! -d "$dstdir"; then - defaultIFS=' - ' - IFS="${IFS-$defaultIFS}" - - oIFS=$IFS - # Some sh's can't handle IFS=/ for some reason. - IFS='%' - set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` - shift - IFS=$oIFS + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac - pathcomp= + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else - while test $# -ne 0 ; do - pathcomp=$pathcomp$1 + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir shift - if test ! -d "$pathcomp"; then - $mkdirprog "$pathcomp" - # mkdir can fail with a `File exist' error in case several - # install-sh are creating the directory concurrently. This - # is OK. - test -d "$pathcomp" || exit + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi - pathcomp=$pathcomp/ - done + fi fi if test -n "$dir_arg"; then - $doit $mkdircmd "$dst" \ - && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } - + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else - dstfile=`basename "$dst"` # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ @@ -262,10 +448,9 @@ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - trap '(exit $?); exit' 1 2 13 15 # Copy the file name to the temp name. - $doit $cpprog "$src" "$dsttmp" && + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -273,47 +458,58 @@ # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ - && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ - && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ - && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && - - # Now rename the file to the real destination. - { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ - || { - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - if test -f "$dstdir/$dstfile"; then - $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ - || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ - || { - echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 - (exit 1); exit 1 - } - else - : - fi - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" - } - } - fi || { (exit 1); exit 1; } -done + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || -# The final little trick to "correctly" pass the exit status to the exit trap. -{ - (exit 0); exit 0 -} + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) --- ecasound2.2-2.7.0.orig/libecasound/audioeffectx.cpp +++ ecasound2.2-2.7.0/libecasound/audioeffectx.cpp @@ -0,0 +1,558 @@ +#ifndef __audioeffectx__ +#include "audioeffectx.h" +#endif + +// *** steinberg developers: this is a public file, *do not edit!* + +//------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// version 2.0 extension +// (c)1999 Steinberg Soft+Hardware GmbH +// +// you should not have to edit this file +// use override methods instead, as suggested in the class declaration (audioeffectx.h) +//------------------------------------------------------------------------------------------------------- + +//--------------------------------------------------------------------------------------------- +// 'canDo' strings. note other 'canDos' can be evaluated by calling the according +// function, for instance if getSampleRate returns 0, you +// will certainly want to assume that this selector is not supported. +//--------------------------------------------------------------------------------------------- + +const char* hostCanDos [] = +{ + "sendVstEvents", + "sendVstMidiEvent", + "sendVstTimeInfo", + "receiveVstEvents", + "receiveVstMidiEvent", + "receiveVstTimeInfo", + + "reportConnectionChanges", + "acceptIOChanges", + "sizeWindow", + + "asyncProcessing", + "offline", + "supplyIdle", + "supportShell" // 'shell' handling via uniqueID as suggested by Waves +}; + +const char* plugCanDos [] = +{ + "sendVstEvents", + "sendVstMidiEvent", + "sendVstTimeInfo", + "receiveVstEvents", + "receiveVstMidiEvent", + "receiveVstTimeInfo", + "offline", + "plugAsChannelInsert", + "plugAsSend", + "mixDryWet", + "noRealTime", + "multipass", + "metapass", + "1in1out", + "1in2out", + "2in1out", + "2in2out", + "2in4out", + "4in2out", + "4in4out", + "4in8out", // 4:2 matrix to surround bus + "8in4out", // surround bus to 4:2 matrix + "8in8out" +}; + +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- +// AudioEffectX extends AudioEffect with the new features. so you should derive +// your plug from AudioEffectX +//------------------------------------------------------------------------------------------------------- +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +// VstEvents + VstTimeInfo +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +AudioEffectX::AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams) + : AudioEffect (audioMaster, numPrograms, numParams) +{ +} + +//------------------------------------------------------------------------------------------------------- +AudioEffectX::~AudioEffectX () +{ +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::dispatcher (long opCode, long index, long value, void *ptr, float opt) +{ + long v = 0; + switch(opCode) + { + // VstEvents + case effProcessEvents: + v = processEvents ((VstEvents*)ptr); + break; + + // parameters and programs + case effCanBeAutomated: + v = canParameterBeAutomated (index) ? 1 : 0; + break; + case effString2Parameter: + v = string2parameter (index, (char*)ptr) ? 1 : 0; + break; + + case effGetNumProgramCategories: + v = getNumCategories (); + break; + case effGetProgramNameIndexed: + v = getProgramNameIndexed (value, index, (char*)ptr) ? 1 : 0; + break; + case effCopyProgram: + v = copyProgram (index) ? 1 : 0; + break; + + // connections, configuration + case effConnectInput: + inputConnected (index, value ? true : false); + v = 1; + break; + case effConnectOutput: + outputConnected (index, value ? true : false); + v = 1; + break; + case effGetInputProperties: + v = getInputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; + break; + case effGetOutputProperties: + v = getOutputProperties (index, (VstPinProperties*)ptr) ? 1 : 0; + break; + case effGetPlugCategory: + v = (long)getPlugCategory (); + break; + + // realtime + case effGetCurrentPosition: + v = reportCurrentPosition (); + break; + + case effGetDestinationBuffer: + v = (long)reportDestinationBuffer (); + break; + + // offline + case effOfflineNotify: + v = offlineNotify ((VstAudioFile*)ptr, value, index != 0); + break; + case effOfflinePrepare: + v = offlinePrepare ((VstOfflineTask*)ptr, value); + break; + case effOfflineRun: + v = offlineRun ((VstOfflineTask*)ptr, value); + break; + + // other + case effSetSpeakerArrangement: + v = setSpeakerArrangement ((VstSpeakerArrangement*)value, (VstSpeakerArrangement*)ptr) ? 1 : 0; + break; + case effProcessVarIo: + v = processVariableIo ((VstVariableIo*)ptr) ? 1 : 0; + break; + case effSetBlockSizeAndSampleRate: + setBlockSizeAndSampleRate (value, opt); + v = 1; + break; + case effSetBypass: + v = setBypass (value ? true : false) ? 1 : 0; + break; + case effGetEffectName: + v = getEffectName ((char *)ptr) ? 1 : 0; + break; + case effGetErrorText: + v = getErrorText ((char *)ptr) ? 1 : 0; + break; + case effGetVendorString: + v = getVendorString ((char *)ptr) ? 1 : 0; + break; + case effGetProductString: + v = getProductString ((char *)ptr) ? 1 : 0; + break; + case effGetVendorVersion: + v = getVendorVersion (); + break; + case effVendorSpecific: + v = vendorSpecific (index, value, ptr, opt); + break; + case effCanDo: + v = canDo ((char*)ptr); + break; + case effGetIcon: + v = (long)getIcon (); + break; + case effSetViewPosition: + v = setViewPosition (index, value) ? 1 : 0; + break; + case effGetTailSize: + v = getGetTailSize (); + break; + case effIdle: + v = fxIdle (); + break; + + case effGetParameterProperties: + v = getParameterProperties (index, (VstParameterProperties*)ptr) ? 1 : 0; + break; + + case effKeysRequired: + v = (keysRequired () ? 0 : 1); // reversed to keep v1 compatibility + break; + case effGetVstVersion: + v = getVstVersion (); + break; + + // version 1.0 or unknown + default: + v = AudioEffect::dispatcher (opCode, index, value, ptr, opt); + } + return v; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::wantEvents (long filter) +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterWantMidi, 0, filter, 0, 0); + +} + +//------------------------------------------------------------------------------------------------------- +VstTimeInfo* AudioEffectX::getTimeInfo (long filter) +{ + if (audioMaster) + return (VstTimeInfo*) audioMaster (&cEffect, audioMasterGetTime, 0, filter, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::tempoAt (long pos) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterTempoAt, 0, pos, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::sendVstEventsToHost (VstEvents* events) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterProcessEvents, 0, 0, events, 0) == 1; + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// parameters +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getNumAutomatableParameters () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetNumAutomatableParameters, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getParameterQuantization () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetParameterQuantization, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// configuration +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::ioChanged () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterIOChanged, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::needIdle () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterNeedIdle, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::sizeWindow (long width, long height) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterSizeWindow, width, height, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +double AudioEffectX::updateSampleRate () +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterGetSampleRate, 0, 0, 0, 0); // calls setSampleRate if implemented + return sampleRate; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::updateBlockSize () +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterGetBlockSize, 0, 0, 0, 0); // calls setBlockSize if implemented + return blockSize; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getInputLatency () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetInputLatency, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getOutputLatency () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetOutputLatency, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +AEffect* AudioEffectX::getPreviousPlug (long input) +{ + if (audioMaster) + return (AEffect*) audioMaster (&cEffect, audioMasterGetPreviousPlug, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +AEffect* AudioEffectX::getNextPlug (long output) +{ + if (audioMaster) + return (AEffect*) audioMaster (&cEffect, audioMasterGetNextPlug, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +// configuration +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::willProcessReplacing () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterWillReplaceOrAccumulate, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getCurrentProcessLevel () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetCurrentProcessLevel, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getAutomationState () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetAutomationState, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::wantAsyncOperation (bool state) +{ + if (state) + cEffect.flags |= effFlagsExtIsAsync; + else + cEffect.flags &= ~effFlagsExtIsAsync; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::hasExternalBuffer (bool state) +{ + if (state) + cEffect.flags |= effFlagsExtHasBuffer; + else + cEffect.flags &= ~effFlagsExtHasBuffer; +} + +//------------------------------------------------------------------------------------------------------- +// offline +//------------------------------------------------------------------------------------------------------- + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineRead, readSource, option, offline, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineWrite (VstOfflineTask* offline, VstOfflineOption option) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineWrite, 0, option, offline, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::offlineStart (VstAudioFile* audioFiles, long numAudioFiles, long numNewAudioFiles) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineStart, numNewAudioFiles, numAudioFiles, audioFiles, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::offlineGetCurrentPass () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineGetCurrentPass, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::offlineGetCurrentMetaPass () +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterOfflineGetCurrentMetaPass, 0, 0, 0, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +// other +//------------------------------------------------------------------------------------------------------- + + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::setOutputSamplerate (float sampleRate) +{ + if (audioMaster) + audioMaster (&cEffect, audioMasterSetOutputSampleRate, 0, 0, 0, sampleRate); +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetSpeakerArrangement, 0, (long)pluginInput, pluginOutput, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getHostVendorString (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetVendorString, 0, 0, text, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::getHostProductString (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterGetProductString, 0, 0, text, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getHostVendorVersion () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetVendorVersion, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg) +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterVendorSpecific, lArg1, lArg2, ptrArg, floatArg); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::canHostDo (char* text) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterCanDo, 0, 0, text, 0) != 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::isSynth (bool state) +{ + if (state) + cEffect.flags |= effFlagsIsSynth; + else + cEffect.flags &= ~effFlagsIsSynth; +} + +//------------------------------------------------------------------------------------------------------- +void AudioEffectX::noTail (bool state) +{ + if (state) + cEffect.flags |= effFlagsNoSoundInStop; + else + cEffect.flags &= ~effFlagsNoSoundInStop; +} + +//------------------------------------------------------------------------------------------------------- +long AudioEffectX::getHostLanguage () +{ + if (audioMaster) + return audioMaster (&cEffect, audioMasterGetLanguage, 0, 0, 0, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +void* AudioEffectX::openWindow (VstWindow* window) +{ + if (audioMaster) + return (void*)audioMaster (&cEffect, audioMasterOpenWindow, 0, 0, window, 0); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::closeWindow (VstWindow* window) +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterCloseWindow, 0, 0, window, 0) != 0); + return false; +} + +//------------------------------------------------------------------------------------------------------- +void* AudioEffectX::getDirectory () +{ + if (audioMaster) + return (void*)(audioMaster (&cEffect, audioMasterGetDirectory, 0, 0, 0, 0)); + return 0; +} + +//------------------------------------------------------------------------------------------------------- +bool AudioEffectX::updateDisplay() +{ + if (audioMaster) + return (audioMaster (&cEffect, audioMasterUpdateDisplay, 0, 0, 0, 0)) ? true : false; + return 0; +} --- ecasound2.2-2.7.0.orig/libecasound/audiofx_vst.h +++ ecasound2.2-2.7.0/libecasound/audiofx_vst.h @@ -0,0 +1,58 @@ +#ifndef INCLUDE_AUDIOFX_VST_H +#define INCLUDE_AUDIOFX_VST_H + +#include +#include + +#include "samplebuffer.h" +#include "audiofx.h" + +#ifdef FEELING_EXPERIMENTAL +#include "aeffectx.h" + +typedef AEffect* (*VST_plugin_descriptor)(audioMasterCallback audioMaster); + +long vst_audiomaster(AEffect *effect, long opcode, long index, long value, void *ptr, float opt); + +/** + * Wrapper class for VST1.0/2.0 plugins + * @author Kai Vehmanen + */ +class EFFECT_VST : public EFFECT_BASE { + +public: + + EFFECT_VST (const std::string& fname) throw(ECA_ERROR&); + virtual ~EFFECT_VST (void); + + EFFECT_VST* clone(void) { return new EFFECT_VST(library_file_rep); } + EFFECT_VST* new_expr(void) { return new EFFECT_VST(library_file_rep); } + + virtual virtual std::string name(void) const { return("VST/" + label_rep); } + virtual std::string description(void) const { return("Wrapper for VST-plugins."); } + virtual virtual std::string parameter_names(void) const { return(param_names_rep); } + + std::string unique(void) const { return(unique_rep); } + + virtual void set_parameter(int param, parameter_t value); + virtual parameter_t get_parameter(int param) const; + + virtual void init(SAMPLE_BUFFER *insample); + virtual void process(void); + + private: + + EFFECT_VST (const EFFECT_VST& x) { } + EFFECT_VST& operator=(const EFFECT_VST& x) { return *this; } + +private: + + SAMPLE_BUFFER* buffer; + + VST_plugin_descriptor master_func; + std::vector vst_handles; + std::string label_rep, unique_rep, param_names_rep, library_file_rep; +}; + +#endif // experimental +#endif --- ecasound2.2-2.7.0.orig/libecasound/adsr-envelope.h +++ ecasound2.2-2.7.0/libecasound/adsr-envelope.h @@ -0,0 +1,32 @@ +#ifndef INCLUDE_TWO_STAGE_LINEAR_ENVELOPE_H +#define INCLUDE_TWO_STAGE_LINEAR_ENVELOPE_H + +#include + +#include "finite-envelope.h" + +/** + * Linear envelope + */ +class TWO_STAGE_LINEAR_ENVELOPE : public FINITE_ENVELOPE { + + public: + + std::string name(void) const { return("Two-stage linear envelope"); } + parameter_t value(void); + + void init(parameter_t step); + + std::string parameter_names(void) const { return("1st_stage_sec,2nd_stage_sec,mid_level_%"); } + void set_parameter(int param, parameter_t value); + parameter_t get_parameter(int param) const; + + TWO_STAGE_LINEAR_ENVELOPE_ENVELOPE(parameter_t time_in_seconds = 0.0); + TWO_STAGE_LINEAR_ENVELOPE_ENVELOPE* clone(void) const { return new TWO_STAGE_LINEAR_ENVELOPE_ENVELOPE(*this); } + + private: + + parameter_t curpos, curval; +}; + +#endif --- ecasound2.2-2.7.0.orig/libecasound/audioeffectx.h +++ ecasound2.2-2.7.0/libecasound/audioeffectx.h @@ -0,0 +1,185 @@ +#ifndef __audioeffectx__ +#define __audioeffectx__ + +//---------------------------------------------------------------------------------------------------------------------------- +// VST Plug-Ins SDK +// version 2.0 extension +// (c)1999 Steinberg Soft+Hardware GmbH +//---------------------------------------------------------------------------------------------------------------------------- + +#ifndef __AudioEffect__ +#include "AudioEffect.hpp" // version 1.0 base class AudioEffect +#endif + +#ifndef __aeffectx__ +#include "aeffectx.h" // version 2.0 'C' extensions and structures +#endif + +//---------------------------------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------------------------------- +// AudioEffectX extends AudioEffect with the new features. so you should derive +// your plug from AudioEffectX +//---------------------------------------------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------------------------------------------- + +class AudioEffectX : public AudioEffect +{ +public: + AudioEffectX (audioMasterCallback audioMaster, long numPrograms, long numParams); + virtual ~AudioEffectX (); + + virtual long dispatcher (long opCode, long index, long value, void *ptr, float opt); + + // 'host' are methods which go from plug to host, and are usually not overridden + // 'plug' are methods which you may override to implement the according functionality (to host) + +//---------------------------------------------------------------------------------------------------------------------------- +// events + time +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual void wantEvents (long filter = 1); // filter is currently ignored, midi channel data only (default) + virtual VstTimeInfo* getTimeInfo (long filter); + // returns const VstTimeInfo* (or 0 if not supported) + // filter should contain a mask indicating which fields are requested + // (see valid masks in aeffectx.h), as some items may require extensive + // conversions + virtual long tempoAt (long pos); // returns tempo (in bpm * 10000) at sample frame location + bool sendVstEventsToHost (VstEvents* events); // true:success + + // plug + virtual long processEvents (VstEvents* events) {return 0;} // wants no more...else return 1! + // VstEvents and VstMidiEvents are declared in aeffectx.h + +//---------------------------------------------------------------------------------------------------------------------------- +// parameters and programs +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual long getNumAutomatableParameters (); + virtual long getParameterQuantization (); // returns the integer value for +1.0 representation, + // or 1 if full single float precision is maintained + // in automation. parameter index in (-1: all, any) + // plug + virtual bool canParameterBeAutomated (long index) { return true; } + virtual bool std::string2parameter (long index, char* text) {return false;} // note: implies setParameter. text==0 is to be + // expected to check the capability (returns true). + virtual float getChannelParameter (long channel, long index) {return 0;} + virtual long getNumCategories () {return 1L;} + virtual bool getProgramNameIndexed (long category, long index, char* text) {return false;} + virtual bool copyProgram (long destination) {return false;} + +//---------------------------------------------------------------------------------------------------------------------------- +// connections, configuration +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual bool ioChanged (); // tell host numInputs and/or numOutputs and/or numParameters has changed + virtual bool needIdle (); // plug needs idle calls (outside its editor window) + virtual bool sizeWindow (long width, long height); + virtual double updateSampleRate (); // gets and returns sample rate from host (may issue setSampleRate() ) + virtual long updateBlockSize (); // same for block size + virtual long getInputLatency (); + virtual long getOutputLatency (); + virtual AEffect* getPreviousPlug (long input); // input can be -1 in which case the first found is returned + virtual AEffect* getNextPlug (long output); // output can be -1 in which case the first found is returned + + // plug + virtual void inputConnected (long index, bool state) {} // input at has been (dis-)connected, + virtual void outputConnected (long index, bool state) {} // same as input; state == true: connected + virtual bool getInputProperties (long index, VstPinProperties* properties) {return false;} + virtual bool getOutputProperties (long index, VstPinProperties* properties) {return false;} + virtual VstPlugCategory getPlugCategory() + { if (cEffect.flags & effFlagsIsSynth) return kPlugCategSynth; return kPlugCategUnknown; } + +//---------------------------------------------------------------------------------------------------------------------------- +// realtime +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual long willProcessReplacing (); // returns 0: not implemented, 1: replacing, 2: accumulating + virtual long getCurrentProcessLevel (); // returns: 0: not supported, + // 1: currently in user thread (gui) + // 2: currently in audio thread or irq (where process is called) + // 3: currently in 'sequencer' thread or irq (midi, timer etc) + // 4: currently offline processing and thus in user thread + // other: not defined, but probably pre-empting user thread. + virtual long getAutomationState (); // returns 0: not supported, 1: off, 2:read, 3:write, 4:read/write + virtual void wantAsyncOperation (bool state = true); // notify host that we want to operate asynchronously. + // process() will return immedeately; host will poll getCurrentPosition + // to see if data are available in time. + virtual void hasExternalBuffer (bool state = true); // external dsp, may have their own output buffe (32 bit float) + // host then requests this via effGetDestinationBuffer + + // plug + virtual long reportCurrentPosition () {return 0;} // for external dsp, see wantAsyncOperation () + virtual float* reportDestinationBuffer () {return 0;} // for external dsp (dma option) + +//---------------------------------------------------------------------------------------------------------------------------- +// offline +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual bool offlineRead (VstOfflineTask* offline, VstOfflineOption option, bool readSource = true); + virtual bool offlineWrite (VstOfflineTask* offline, VstOfflineOption option); + virtual bool offlineStart (VstAudioFile* ptr, long numAudioFiles, long numNewAudioFiles); + virtual long offlineGetCurrentPass (); + virtual long offlineGetCurrentMetaPass (); + + // plug + virtual bool offlineNotify (VstAudioFile* ptr, long numAudioFiles, bool start) { return false; } + virtual bool offlinePrepare (VstOfflineTask* offline, long count) {return false;} + virtual bool offlineRun (VstOfflineTask* offline, long count) {return false;} + + virtual long offlineGetNumPasses () {return 0;} + virtual long offlineGetNumMetaPasses () {return 0;} + +//---------------------------------------------------------------------------------------------------------------------------- +// other +//---------------------------------------------------------------------------------------------------------------------------- + + // host + virtual void setOutputSamplerate (float samplerate); + virtual bool getSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput); + virtual bool getHostVendorString (char* text); // fills with a std::string identifying the vendor (max 64 char) + virtual bool getHostProductString (char* text); // fills with a std::string with product name (max 64 char) + virtual long getHostVendorVersion (); // returns vendor-specific version + virtual long hostVendorSpecific (long lArg1, long lArg2, void* ptrArg, float floatArg); // no definition + virtual long canHostDo (char* text); // see 'hostCanDos' in audioeffectx.cpp + // returns 0: don't know (default), 1: yes, -1: no + virtual void isSynth (bool state = true); // will call wantEvents if true + virtual void noTail (bool state = true); // true: tells host we produce no output when silence comes in + // enables host to omit process() when no data are present + // on any one input. + virtual long getHostLanguage (); // returns VstHostLanguage + virtual void* openWindow (VstWindow*); // create new window + virtual bool closeWindow (VstWindow*); // close a newly created window + virtual void* getDirectory (); // get the plug's directory, FSSpec on mac, else char* + virtual bool updateDisplay(); // something has changed, update 'multi-fx' display + // returns true if supported + + // plug + virtual bool processVariableIo (VstVariableIo* varIo) {return false;} + virtual bool setSpeakerArrangement (VstSpeakerArrangement* pluginInput, VstSpeakerArrangement* pluginOutput) {return false;} + virtual void setBlockSizeAndSampleRate (long blockSize, float sampleRate) + {this->blockSize = blockSize; this->sampleRate = sampleRate;} + virtual bool setBypass(bool onOff) {return false;} // for 'soft-bypass; process() still called + virtual bool getEffectName (char* name) {return false;} // name max 32 char + virtual bool getErrorText (char* text) {return false;} // max 256 char + virtual bool getVendorString (char* text) {return false;} // fill text with a std::string identifying the vendor (max 64 char) + virtual bool getProductString (char* text) {return false;} // fill text with a std::string identifying the product name (max 64 char) // fills with a std::string with product name (max 64 char) + virtual long getVendorVersion () {return 0;} // return vendor-specific version + virtual long vendorSpecific (long lArg, long lArg2, void* ptrArg, float floatArg) {return 0;} + // no definition, vendor specific handling + virtual long canDo (char* text) {return 0;} // see 'plugCanDos' in audioeffectx.cpp. return values: + // 0: don't know (default), 1: yes, -1: no + virtual void* getIcon () {return 0;} // not yet defined + virtual bool setViewPosition (long x, long y) {return false;} + virtual long getGetTailSize () {return 0; } + virtual long fxIdle () {return 0;} + virtual bool getParameterProperties (long index, VstParameterProperties* p) {return false;} + virtual bool keysRequired () {return false;} // version 1 plugs will return true + virtual long getVstVersion () {return 2;} +}; + +#endif --- ecasound2.2-2.7.0.orig/libecasound/libecasound-config +++ ecasound2.2-2.7.0/libecasound/libecasound-config @@ -0,0 +1,65 @@ +#!/bin/sh + +usage() +{ + echo "usage: $0 [OPTIONS]" +cat << EOH + +options: + [--prefix] + [--libs] + [--libs_debug] + [--ldflags] + [--cflags] + [--version] +EOH + exit 1; +} + +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include +libecasound_version=22 +libkvutils_version=9 + +flags="" + +while test $# -gt 0 +do + case $1 in + --prefix) + flags="$flags $prefix" + ;; + --libs) + flags="$flags -L$libdir -lecasound -lkvutils -lsamplerate -laudiofile -lsndfile -lasound -ljack" + ;; + --libs_debug) + flags="$flags -L$libdir -lecasound_debug -lkvutils_debug -lsamplerate -laudiofile -lsndfile -lasound -ljack" + ;; + --ldflags) + case "$libdir" in + /usr/lib);; + *) + flags="$flags -Wl,--rpath -Wl,$libdir" ;; + esac + ;; + --cflags) + flags="$flags -I$includedir/libecasound -I$includedir/kvutils " + ;; + --version) + echo 2.7.0 + ;; + *) + echo "$0: unknown option $1" + echo + usage + ;; + esac + shift +done + +if test -n "$flags" +then + echo $flags +fi --- ecasound2.2-2.7.0.orig/libecasound/audioio-wave_impl.h +++ ecasound2.2-2.7.0/libecasound/audioio-wave_impl.h @@ -0,0 +1,4 @@ +#ifndef _AUDIOIO_WAVE_IMPL_H +#define _AUDIOIO_WAVE_IMPL_H + +#endif --- ecasound2.2-2.7.0.orig/libecasound/audiofx_vst.cpp +++ ecasound2.2-2.7.0/libecasound/audiofx_vst.cpp @@ -0,0 +1,114 @@ +// ------------------------------------------------------------------------ +// audiofx_vsp.cpp: Wrapper class for VST1.0/2.0 plugins +// Copyright (C) 2000 Kai Vehmanen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#ifdef HAVE_CONFIG_H +#include +#endif +#ifdef FEELING_EXPERIMENTAL + +#include +#include + +#include "samplebuffer.h" +#include "audiofx_vst.h" + +#include "eca-error.h" + +long vst_audiomaster(AEffect *effect, + long opcode, + long index, + long value, + void *ptr, + float opt) { + switch(opcode) + { + case audioMasterAutomate: {} + case audioMasterVersion: {} + case audioMasterCurrentId: {} + case audioMasterIdle: {} + case audioMasterPinConnected: {} + default: { } + } +} + +VST_plugin_descriptor create_vst_plugin(const std::string& fname) throw(ECA_ERROR&); + +EFFECT_VST::EFFECT_VST (const std::string& fname) throw(ECA_ERROR&) { + cerr << "here!" << endl; + library_file_rep = fname; + master_func = create_vst_plugin(fname); + vst_handles.push_back(master_func(vst_audiomaster)); +// if ((vst_handles.back()->flags & effFlagsCanReplacing) != +// effFlagsCanReplacing) +// throw(ECA_ERROR("AUDIOFX_VST", "Plugin doesn't support process_replacing().")); + + label_rep = "VST-plugin"; + unique_rep = kvu_numtostr(vst_handles.back()->uniqueID); + + for(int n = 0; n < vst_handles.back()->numParams; n++) { + param_names_rep += "p" + kvu_numtostr(n + 1); + if (n != vst_handles.back()->numParams) param_names_rep += ","; + } +} + +EFFECT_VST::~EFFECT_VST (void) { } + +void EFFECT_VST::set_parameter(int param, CHAIN_OPERATOR::parameter_t value) { + for(int n = 0; n < static_cast(vst_handles.size()); n++) { + vst_handles[n]->setParameter(vst_handles[n], param, value); + } +} + +CHAIN_OPERATOR::parameter_t EFFECT_VST::get_parameter(int param) const { + return(vst_handles.back()->getParameter(vst_handles.back(), param)); +} + +void EFFECT_VST::init(SAMPLE_BUFFER *insample) { + buffer = insample; +// for(int n = static_cast(vst_handles.size()); n < +// buffer->number_of_channels(); n++) { +// vst_handles.push_back(master_func(vst_audiomaster)); +// } +} + +void EFFECT_VST::process(void) { + for(int n = 0; n < static_cast(vst_handles.size()); n++) { + // vst_handles[n]->processReplacing(vst_handles[n], + vst_handles[n]->process(vst_handles[n], + &(buffer->buffer[n]), + &(buffer->buffer[n]), + buffer->length_in_samples()); + } +} + +VST_plugin_descriptor create_vst_plugin(const std::string& fname) throw(ECA_ERROR&) { + cerr << "fname: " << fname << endl; + void *plugin_handle = dlopen(fname.c_str(), RTLD_LAZY); + if (plugin_handle == 0) + throw(ECA_ERROR("ECA_STATIC_OBJECT_MAPS", "Unable to open VST plugin file.")); + + VST_plugin_descriptor desc_func; + desc_func = (VST_plugin_descriptor)dlsym(plugin_handle, "main_plugin"); + if (desc_func == 0) + throw(ECA_ERROR("ECA_STATIC_OBJECT_MAPS", "Unable find plugin VST's main_plugin().")); + + return(desc_func); +} + +#endif // experimental --- ecasound2.2-2.7.0.orig/libecasound/acinclude.m4 +++ ecasound2.2-2.7.0/libecasound/acinclude.m4 @@ -0,0 +1,51 @@ +## ------------------------------------------------------------------------ +## Find the meta object compiler in the PATH, in $QTDIR/bin, and some +## more usual places +## ------------------------------------------------------------------------ +## +AC_DEFUN(AC_PATH_QT_MOC, +[ +AC_PATH_PROG(MOC, moc, /usr/bin/moc, + $ac_qt_bindir:$QTDIR/bin:$PATH:/usr/bin:/usr/X11R6/bin:/usr/lib/qt/bin:/usr/local/qt/bin) +]) + + +## ------------------------------------------------------------------------ +## Try to find the QT headers and libraries. +## ------------------------------------------------------------------------ +## +AC_DEFUN(AC_PATH_QT, +[ + +qt_incdirs="$ac_qt_includes /usr/lib/qt/include /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt $x_includes $QTINC" + +test -n "$QTDIR" && qt_incdirs="$QTDIR/include $QTDIR $qt_incdirs" +AC_FIND_FILE(qmovie.h, $qt_incdirs, qt_incdir) + +ac_qt_includes="$qt_incdir" +qt_includes="$ac_qt_includes" + +AC_SUBST(qt_includes) + +QT_INCLUDES="-I$qt_includes" +AC_SUBST(QT_INCLUDES) +]) + +## ------------------------------------------------------------------------ +## Find a file (or one of more files in a list of dirs) +## ------------------------------------------------------------------------ +## +AC_DEFUN(AC_FIND_FILE, +[ +$3=NO +for i in $2; +do + for j in $1; + do + if test -r "$i/$j"; then + $3=$i + break 2 + fi + done +done +]) --- ecasound2.2-2.7.0.orig/libecasound/plugins/audioio_alsa_hw.cpp +++ ecasound2.2-2.7.0/libecasound/plugins/audioio_alsa_hw.cpp @@ -0,0 +1,30 @@ +// ------------------------------------------------------------------------ +// audioio_alsa_hw.cpp: ALSA PCM device (hw/plugin) input/output. +// Copyright (C) 2001,2002 Kai Vehmanen +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#include "eca-version.h" +#include "audioio_alsa.h" + +#ifdef ECA_ENABLE_AUDIOIO_PLUGINS +static const char* audio_io_keyword_const = "alsahw_09"; +static const char* audio_io_keyword_regex_const = "(^alsahw_09$)|(^alsaplugin_09$)"; + +const char* audio_io_keyword(void){return(audio_io_keyword_const); } +const char* audio_io_keyword_regex(void){return(audio_io_keyword_regex_const); } +AUDIO_IO* audio_io_descriptor(void) { return(new AUDIO_IO_ALSA_PCM()); } +int audio_io_interface_version(void) { return(ecasound_library_version_current); } +#endif --- ecasound2.2-2.7.0.orig/debian/ecasound-el.emacsen-install +++ ecasound2.2-2.7.0/debian/ecasound-el.emacsen-install @@ -0,0 +1,51 @@ +#! /bin/sh -e +# /usr/lib/emacsen-common/packages/install/ecasound-el + +# Written by Jim Van Zandt , borrowing heavily +# from the install scripts for gettext by Santiago Vila +# and octave by Dirk Eddelbuettel . +# modified by Junichi Uekawa for ecasound, 11 Jan 2003 + +FLAVOR=$1 +PACKAGE=ecasound-el + +case ${FLAVOR} in + emacs|emacs20) + exit 0;; + *) + ;; +esac + +echo install/${PACKAGE}: Handling install for emacsen flavor ${FLAVOR} + +#FLAVORTEST=`echo $FLAVOR | cut -c-6` +#if [ ${FLAVORTEST} = xemacs ] ; then +# SITEFLAG="-no-site-file" +#else +# SITEFLAG="--no-site-file" +#fi +FLAGS="${SITEFLAG} -q -batch -l path.el -f batch-byte-compile" + +ELDIR=/usr/share/emacs/site-lisp/${PACKAGE} +ELCDIR=/usr/share/${FLAVOR}/site-lisp/${PACKAGE} + +# Install-info-altdir does not actually exist. +# Maybe somebody will write it. +if test -x /usr/sbin/install-info-altdir; then + echo install/${PACKAGE}: install Info links for ${FLAVOR} + install-info-altdir --quiet --section "" "" --dirname=${FLAVOR} /usr/info/${PACKAGE}.info.gz +fi + +install -m 755 -d ${ELCDIR} +cd ${ELDIR} +FILES=`echo *.el` +cp ${FILES} ${ELCDIR} +cd ${ELCDIR} + +cat << EOF > path.el +(setq load-path (cons "." load-path) byte-compile-warnings nil) +EOF +${FLAVOR} ${FLAGS} ${FILES} +rm -f *.el path.el + +exit 0 --- ecasound2.2-2.7.0.orig/debian/menu +++ ecasound2.2-2.7.0/debian/menu @@ -0,0 +1,2 @@ +?package(ecasound):needs="text" section="Applications/Sound"\ + title="ecasound" command="/usr/bin/ecasound -c" --- ecasound2.2-2.7.0.orig/debian/changelog-2.0 +++ ecasound2.2-2.7.0/debian/changelog-2.0 @@ -0,0 +1,49 @@ +ecasound package held the following changelog entries: + + +ecasound (2.0.4-11) unstable; urgency=low + + * section devel -> libdevel, interpreters -> python + * Fix: "libecasound7c102 missing conflicts with libecasound7" + From: Don Armstrong (closes: #207982) + + -- Junichi Uekawa Sun, 31 Aug 2003 12:59:05 +0900 + +ecasound (2.0.4-10) unstable; urgency=low + + * update TODO file + * python 2.3 rebuild. + * build-dep update -- require libtool1.4 + * configure.in: update to support python2.3 + - 01_autoconfhack.dpatch + * debian/rules: force-link libstdc++ + + -- Junichi Uekawa Tue, 26 Aug 2003 07:36:16 +0900 + +ecasound (2.0.4-9) unstable; urgency=low + + * include cassert.h on files, and other gcc-3.3 fixes (closes: #197634) + - 07_gcc33.dpatch + * fix configure.in to be buildable using automake1.4 and autoconf 2.5 + apparently AC_CHECK_HEADER cannot be nested. + - 08_no_nest_ac_check_header + * change build process to call automake and autoconf, and clean up later. + + -- Junichi Uekawa Sun, 29 Jun 2003 09:06:45 +0900 + +ecasound (2.0.4-8) unstable; urgency=low + + * revert hppa hack, defaults is moved over to gcc-3.2 + * remove gcc-3.2 hack + * rebuilt with gcc-3.2 + * rename libs to add c102. + * use dpatch system for patching upstream source. + * re-run libtoolize, this should fix build failure on MIPS, + thanks rmurray. (closes: #177658) + * remove libtool.m4 from acinclude.m4. + * Build-Conflict with libkvutils2.2-dev + * unhack libtool workaround in Makefile.am + * Build-depend on libartsc0-dev instead of libarts-dev + + -- Junichi Uekawa Fri, 7 Feb 2003 21:32:31 +0900 + --- ecasound2.2-2.7.0.orig/debian/control +++ ecasound2.2-2.7.0/debian/control @@ -0,0 +1,142 @@ +Source: ecasound2.2 +section: sound +Priority: extra +Maintainer: Ubuntu Developers +XSBC-Original-Maintainer: Junichi Uekawa +Standards-Version: 3.7.2 +Build-Depends: libsndfile1-dev (>= 1.0.17-2), libaudiofile-dev, libasound2-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], debhelper (>> 4.1.1), libwrap0-dev, libncurses5-dev, python-dev, ladspa-sdk (>= 1.0.LGPL-3), libtool, m4, libreadline-dev, libjack-dev, libsamplerate0-dev, dpatch, hevea, doxygen, texlive-base-bin, texlive-base, texlive-latex-recommended, texlive-latex-extra, autoconf, automake, python, yodl (>= 2.13.1), ruby1.8, ruby, python-docutils, python-support (>= 0.4.0) +Build-Conflicts: libecasound7, libkvutils2, libecasound7c102, libkvutils2c102 +Vcs-Git: ssh://git.debian.org/git/users/dancer/ecasound.git +Vcs-Browser: http://git.debian.org/?p=users/dancer/ecasound.git + +Package: ecasound +Architecture: any +Depends: ${shlibs:Depends}, python-ecasound2.2 (= ${source:Version}), python +Suggests: mp3-encoder, mpg321 | mp3-decoder, vorbis-tools, swh-plugins | ladspa-plugin, timidity, mikmod +Provides: ladspa-host, ecasound +Replaces: ecasound2.2 (<< 2.3.2-1), libecasound7c102, libecasound7 +Description: Multitrack-capable audio recorder and effect processor + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. A versatile console mode + interface is included in the package. + +Package: libecasound2.2-dev +Architecture: any +Section: libdevel +Depends: libkvutils2.2-dev, libaudiofile-dev, ${libasound2-dev}, libjack0.100.0-dev, libsamplerate0-dev, libsndfile1-dev +Conflicts: libecasound-development +Provides: libecasound-development +Description: development files for ecasound + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. + . + includes development files for ecasound (C++) bindings + +Package: libkvutils2.2-dev +Architecture: any +Section: libdevel +Depends: libc-dev, libreadline-dev +Conflicts: libkvutils1-dev, libkvutils-dev, libkvutils-development +Provides: libkvutils-development +Description: kvutils library required for ecasound - development + Kvutils is a simple utility library, It is not meant for general use. + There is no documentation available. + . + Kvutils is freely distributable according to the terms of the GNU + General Public License (see the file 'COPYING'). + . + For more info about projects in which kvutils library is used, + see http://eca.cx + . + includes definition-by-contract routines, and command-line parsing + modules, some string processing routines, and support for locks. + +Package: python-ecasound2.2 +Architecture: all +Section: python +Depends: ${shlibs:Depends}, ${python:Depends} +Provides: python-ecasound, ${python:Provides} +Conflicts: python-ecasound +Description: Python binding files for ecasound 2.2 + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. + . + Includes Python bindings for ecasound. + +Package: libecasound-ruby1.8 +Architecture: any +Section: libs +Depends: ${shlibs:Depends}, ruby1.8, libruby1.8, ecasound (>= 2.2.0) +Provides: libecasound-ruby +Description: ruby binding files for ecasound + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. + . + Includes ruby bindings for ecasound. + +Package: libecasoundc2.2-dev +Architecture: any +Section: libdevel +Depends: libreadline-dev +Provides: libecasoundc-dev +Conflicts: libecasoundc-dev +Replaces: libecasound-dev (<< 2.0.2-4) +Description: c binding files for ecasound (devel) + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. + . + includes development files for C (libecasoundc) + +Package: ecasound-el +Architecture: all +Section: sound +Depends: ecasound (>= 2.2.0), emacs23 | xemacs21 | emacsen +Description: emacs binding files for ecasound sound editing environment + Ecasound is a software package designed for multitrack audio + processing. It can be used for simple tasks like audio playback, + recording and format conversions, as well as for multitrack effect + processing, mixing, recording and signal recycling. Ecasound supports + a wide range of audio inputs, outputs and effect algorithms. + Effects and audio objects can be combined in various ways, and their + parameters can be controlled by operator objects like oscillators + and MIDI-CCs. As most functionality is located in shared libraries, + creating alternative user-interfaces is easy. + . + This package provides an interactive mode for running ecasound + sessions from within Emacs as well as Emacs Lisp bindings + to the Ecasound Control Interface (ECI). --- ecasound2.2-2.7.0.orig/debian/ecasound-el.emacsen-remove +++ ecasound2.2-2.7.0/debian/ecasound-el.emacsen-remove @@ -0,0 +1,20 @@ +#!/bin/sh -e +# /usr/lib/emacsen-common/packages/remove/ecasound-el +#modified for ecasound-el 11 Jan 2003, Junichi Uekawa + +FLAVOR=$1 +PACKAGE=ecasound-el + +case ${FLAVOR} in + emacs|emacs20) + ;; + *) + if test -x /usr/sbin/install-info-altdir; then + echo remove/${PACKAGE}: removing Info links for ${FLAVOR} + install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/info/#PACKAGE#.info.gz + fi + + echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR} + rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE} + ;; +esac --- ecasound2.2-2.7.0.orig/debian/libecasound-ruby1.8.dirs +++ ecasound2.2-2.7.0/debian/libecasound-ruby1.8.dirs @@ -0,0 +1 @@ +usr/lib/ruby/1.8 --- ecasound2.2-2.7.0.orig/debian/python-ecasound2.2.dirs +++ ecasound2.2-2.7.0/debian/python-ecasound2.2.dirs @@ -0,0 +1 @@ +usr/lib \ No newline at end of file --- ecasound2.2-2.7.0.orig/debian/rules +++ ecasound2.2-2.7.0/debian/rules @@ -0,0 +1,188 @@ +#!/usr/bin/make -f +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 to 1999 by Joey Hess. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS) + +include /usr/share/dpatch/dpatch.make + +#specify the changeable names here... + +LIBECASOUND=libecasound7 +LIBECASOUNDDEV=libecasound2.2-dev +LIBKVUTILS=libkvutils2 +LIBKVUTILSDEV=libkvutils2.2-dev +LIBECASOUNDC=libecasoundc0 +LIBECASOUNDCDEV=libecasoundc2.2-dev +PYTHONECASOUND=python-ecasound2.2 +RUBYECASOUND=libecasound-ruby1.8 +ECASOUND=ecasound + +CONFIGURE_OPTIONS=--prefix=/usr --mandir=/usr/share/man --enable-pyecasound=python --enable-python-force-site-packages --enable-sys-readline --with-largefile --datadir=/usr/share/ecasound2.2 --disable-shared --disable-arts + +ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS))) +# debug is found... debug version +CONFIGURE_OPTIONS+= --enable-debug=yes +else +# debug is not found, do not need to do anything really. +#CONFIGURE_OPTIONS+=--enable-debug=no # there was a bug in configure.in +endif + + +COMPILER_FLAGS=CXX=g++ CC=gcc + +COMPILER_FLAGS+= CFLAGS="-g -O2 -D_REENTRANT -DNDEBUG -ffast-math -fstrict-aliasing -funroll-loops" CXXFLAGS="-g -O2 -D_REENTRANT -DNDEBUG -ffast-math -fstrict-aliasing -funroll-loops" + +ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) + COMPILER_FLAGS+= CFLAGS="-O0 -D_REENTRANT" CXXFLAGS="-O0 -D_REENTRANT" +endif + +# RUBY related configs. +RUBYVER=1.8 +RUBY_FLAGS= ECA_S_RUBY_SITEDIR="/usr/lib/ruby/${RUBYVER}/" + +configure: configure-stamp +configure-stamp: patch-stamp + dh_testdir + libtoolize --force + aclocal-1.9 + autoheader + autoconf + automake-1.9 --add-missing + ( ${COMPILER_FLAGS} ./configure ${CONFIGURE_OPTIONS} ) + touch configure-stamp + +build: configure-stamp build-stamp +build-stamp: configure-stamp + dh_testdir + $(MAKE) + $(MAKE) -C Documentation docs + touch build-stamp + +clean: unpatch + dh_testdir + dh_testroot + rm -f build-stamp configure-stamp + + # Add here commands to clean up after the build process. + -$(MAKE) clean + -$(MAKE) -C Documentation clean + -$(MAKE) -C Documentation clean-docs + -$(MAKE) -C Documentation/programmers_guide clean-docs + -$(MAKE) -C Documentation/users_guide clean-docs + -$(MAKE) -C Documentation distclean + -$(MAKE) distclean + -rm depcomp + # remove files that are autogenerated. + -rm -f compile + -rm Documentation/*_manpage.man + -rm -f aclocal.m4 configure stamp-h.in config.guess config.sub ltmain.sh readline-4.0/config.log readline-4.0/config.status + -for a in . \ + Documentation/users_guide \ + Documentation/programmers_guide \ + Documentation \ + contrib \ + ecasound \ + ecatools \ + examples \ + kvutils \ + libecasound \ + libecasound/plugins \ + libecasoundc \ + pyecasound \ + rubyecasound \ + ; do \ + rm -f $$a/Makefile.in $$a/Makefile; done + -rm -f Documentation/users_guide/users_guide.dvi Documentation/users_guide/ecasound_users_guide.pdf Documentation/programmers_guide/programmers_guide.dvi Documentation/programmers_guide/ecasound_programmers_guide.pdf Documentation/programmers_guide/eci_doc.dvi Documentation/programmers_guide/ecasound_eci_doc.pdf + -rm -f config.status config.log + dh_clean + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # Add here commands to install the package into debian/tmp. + # $(MAKE) install prefix=`pwd`/debian/tmp/usr + $(MAKE) install DESTDIR=`pwd`/debian/${ECASOUND} ${RUBY_FLAGS} + for A in a la ; do \ + rm -f `pwd`/debian/${ECASOUND}/usr/lib/ecasound-plugins/*.$$A \ + `pwd`/debian/${ECASOUND}/usr/lib/python*/site-packages/*.$$A; done + + #dh_movefiles is removed. Do the mving myself. + # libecasound-dev + for FILES in usr/bin/libecasound-config \ + usr/lib/libecasound.a usr/lib/libecasound.la usr/include/libecasound; do \ + mv $(CURDIR)/debian/${ECASOUND}/$$FILES $(CURDIR)/debian/$(LIBECASOUNDDEV)/$$FILES; \ + done + # libkvutils-dev + for FILES in usr/lib/libkvutils.a usr/lib/libkvutils.la usr/include/kvutils ; do \ + mv $(CURDIR)/debian/${ECASOUND}/$$FILES $(CURDIR)/debian/$(LIBKVUTILSDEV)/$$FILES; \ + done + # python + mv $(CURDIR)/debian/${ECASOUND}/usr/lib/python* $(CURDIR)/debian/$(PYTHONECASOUND)/usr/lib/ + chmod 644 $(CURDIR)/debian/$(PYTHONECASOUND)/usr/lib/python*/site-packages/pyeca.py + # ruby + mv $(CURDIR)/debian/${ECASOUND}/usr/lib/ruby/1.8/ecasound.rb $(CURDIR)/debian/$(RUBYECASOUND)/usr/lib/ruby/1.8/ + chmod 644 $(CURDIR)/debian/$(RUBYECASOUND)/usr/lib/ruby/1.8/ecasound.rb + # libecasoundc-dev + mv $(CURDIR)/debian/${ECASOUND}/usr/lib/libecasoundc.a $(CURDIR)/debian/$(LIBECASOUNDCDEV)/usr/lib + mv $(CURDIR)/debian/${ECASOUND}/usr/lib/libecasoundc.la $(CURDIR)/debian/$(LIBECASOUNDCDEV)/usr/lib + mv $(CURDIR)/debian/${ECASOUND}/usr/bin/libecasoundc-config $(CURDIR)/debian/$(LIBECASOUNDCDEV)/usr/bin + mv $(CURDIR)/debian/${ECASOUND}/usr/include/libecasoundc/ $(CURDIR)/debian/$(LIBECASOUNDCDEV)/usr/include/ + +# Build architecture-independent files here. +binary-indep: build install + dh_testdir -i + dh_testroot -i + dh_installdocs -i + dh_installdirs -i + install -m644 -o root -g root ecatools/ecasound.el debian/ecasound-el/usr/share/emacs/site-lisp/ecasound-el/ecasound.el + dh_installemacsen -p ecasound-el --priority=60 + dh_installchangelogs -i + dh_pysupport -i + dh_compress -i + dh_fixperms -i + dh_installdeb -i + dh_gencontrol -i + dh_md5sums -i + dh_builddeb -i + +# Build architecture-dependent files here. +binary-arch: build install + dh_testdir -a + dh_testroot -a + dh_installdocs -a + sed 's/\.pdf\"/\.pdf.gz\"/' < Documentation/index.html \ + > debian/${ECASOUND}/usr/share/doc/${ECASOUND}/index.html + cp -a Documentation/users_guide debian/${ECASOUND}/usr/share/doc/${ECASOUND}/ + cp -a Documentation/programmers_guide debian/${ECASOUND}/usr/share/doc/${ECASOUND}/ + dh_installexamples -a + dh_installmenu -a + dh_installcron -a + dh_installman -a + dh_installman -p$(LIBECASOUNDDEV) debian/libecasound-config.1 + dh_installman -p$(LIBECASOUNDCDEV) debian/libecasoundc-config.1 + dh_installinfo -a + dh_installchangelogs -a + dh_pysupport -a + dh_link -a + dh_strip -a + dh_shlibdeps -a + dh_compress -a + dh_fixperms -a +ifeq (linux,$(DEB_HOST_ARCH_OS)) + dh_gencontrol -a -- -Vlibasound2-dev="libasound2-dev" +else + dh_gencontrol -a +endif + dh_installdeb -a + dh_md5sums -a + dh_builddeb -a + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install --- ecasound2.2-2.7.0.orig/debian/docs +++ ecasound2.2-2.7.0/debian/docs @@ -0,0 +1,17 @@ +Documentation/ecasound-iam_manpage.html +Documentation/ecasound_manpage.html +Documentation/ecalength_manpage.html +Documentation/ecasound-iam_manpage.html +Documentation/ecasound_manpage.html +Documentation/ecasoundrc_manpage.html +Documentation/ecatools_manpage.html +Documentation/ecasoundrc_manpage.html +Documentation/ecatools_manpage.html +Documentation/examples.html +Documentation/manpages.html +Documentation/tutorials.html +BUGS +NEWS +README +TODO + --- ecasound2.2-2.7.0.orig/debian/python-ecasound2.2.postinst +++ ecasound2.2-2.7.0/debian/python-ecasound2.2.postinst @@ -0,0 +1,4 @@ +#! /bin/bash -e + +#DEBHELPER# + --- ecasound2.2-2.7.0.orig/debian/libecasoundc-config.1 +++ ecasound2.2-2.7.0/debian/libecasoundc-config.1 @@ -0,0 +1,32 @@ +.TH ecasoundc-config 1 "28 February 2001" "ecasound" "Debian GNU/Linux" +.SH NAME +libecasoundc-config \- get information about installed ecasoundc library +.SH SYNOPSIS +.B ecasoundc-config [\-\-libs] [\-\-libs_debug] [\-\-cflags] [\-\-version] +.SH DESCRIPTION +.PP +.B libecasoundc-config +is a tool that is used to determine the compiler and linker flags used +to compile programs using the ecasoundc liberary. It is meant to be +used like +.P +.B gcc `libecasoundc-config --libs --cflags` some-code.c +.SH OPTIONS +.TP 8 +.B \-\-libs +returns the linker options. +.TP 8 +.B \-\-libs_debug +returns the linker options for debug libraries. +.TP 8 +.B \-\-cflags +returns include options. +.TP 8 +.B \-\-version +returns the version of ecasoundc library. +.SH "AUTHOR" +This manpage has been written by Junichi Uekawa +for Debian GNU/Linux system. +.SH "SEE ALSO" +ecasound(1), "Ecasound Programmer's Manual". + --- ecasound2.2-2.7.0.orig/debian/ecasound.manpages +++ ecasound2.2-2.7.0/debian/ecasound.manpages @@ -0,0 +1,6 @@ +./Documentation/ecasound.1 +./Documentation/ecatools.1 +./Documentation/ecalength.1 +./Documentation/ecamonitor.1 +./Documentation/ecasound-iam.1 +./Documentation/ecasoundrc.5 --- ecasound2.2-2.7.0.orig/debian/compat +++ ecasound2.2-2.7.0/debian/compat @@ -0,0 +1 @@ +4 \ No newline at end of file --- ecasound2.2-2.7.0.orig/debian/watch +++ ecasound2.2-2.7.0/debian/watch @@ -0,0 +1,2 @@ +version=3 +http://ecasound.seul.org/download/ecasound-([\d+\.]+).tar.gz --- ecasound2.2-2.7.0.orig/debian/dirs +++ ecasound2.2-2.7.0/debian/dirs @@ -0,0 +1,4 @@ +usr/share +usr/lib +usr/bin +usr/sbin --- ecasound2.2-2.7.0.orig/debian/libecasoundc2.2-dev.dirs +++ ecasound2.2-2.7.0/debian/libecasoundc2.2-dev.dirs @@ -0,0 +1,3 @@ +usr/bin +usr/lib +usr/share/man/man1 --- ecasound2.2-2.7.0.orig/debian/libecasound7.postinst +++ ecasound2.2-2.7.0/debian/libecasound7.postinst @@ -0,0 +1,10 @@ +#!/bin/sh -e + +case "$1" in + configure*) + ldconfig + ;; +esac + +#DEBHELPER# + --- ecasound2.2-2.7.0.orig/debian/README.Debian +++ ecasound2.2-2.7.0/debian/README.Debian @@ -0,0 +1,35 @@ +ecasound for Debian +---------------------- + + The author's page is at http://www.eca.cx/ecasound/ + + LADSPA support is included. Plug-ins should be found in /usr/lib/ladspa + + ecasound prepackaged version for Debian supports ALSA 0.9 series and later, + and not ALSA 0.5 (which is ancient). + + aRts support is disabled since 2.4.0, since it's not well-maintained + and has a work-around. You can use artsdsp program instead of native + aRts support. + + +Historical explanation of ecasound2.2 package name for Debian +------------------------------------------------------------- + + ecasound2.2 release was a major change from 2.0 series; +and that was the reason for ecasound2.2 package name; we had two +versions to coexist. + +For transition purposes Debian source package name still retains +the ecasound2.2 name. + + +A simple testing of function for ecasound +----------------------------------------- + +I tend to do this to test jackd functionality: + +jackd -d alsa -d via -s & ecasound -f s16_le,2,48000 -i XXX.ogg -o jack_alsa +jackd -d alsa -d card0 -s & ecasound -i resample,auto,XXX.ogg -o jack_alsa + + -- Junichi Uekawa , Tue Jul 12 23:05:02 2005 --- ecasound2.2-2.7.0.orig/debian/python-ecasound2.2.prerm +++ ecasound2.2-2.7.0/debian/python-ecasound2.2.prerm @@ -0,0 +1,3 @@ +#! /bin/bash -e + +#DEBHELPER# --- ecasound2.2-2.7.0.orig/debian/links +++ ecasound2.2-2.7.0/debian/links @@ -0,0 +1,5 @@ +usr/share/man/man1/ecatools.1.gz usr/share/man/man1/ecaplay.1.gz +usr/share/man/man1/ecatools.1.gz usr/share/man/man1/ecaconvert.1.gz +usr/share/man/man1/ecatools.1.gz usr/share/man/man1/ecafixdc.1.gz +usr/share/man/man1/ecatools.1.gz usr/share/man/man1/ecanormalize.1.gz +usr/share/man/man1/ecatools.1.gz usr/share/man/man1/ecasignalview.1.gz --- ecasound2.2-2.7.0.orig/debian/ecasound-el.emacsen-startup +++ ecasound2.2-2.7.0/debian/ecasound-el.emacsen-startup @@ -0,0 +1,21 @@ +;; -*-emacs-lisp-*- +;; +;; Emacs startup file for the Debian GNU/Linux ecasound-el package +;; +;; Originally contributed by Nils Naumann +;; Modified by Dirk Eddelbuettel +;; Adapted for dh-make by Jim Van Zandt +;; modified for ecasound-el by Junichi Uekawa , 11 Jan 2003. + +;; The ecasound-el package follows the Debian/GNU Linux 'emacsen' policy and +;; byte-compiles its elisp files for each 'emacs flavor' (emacs19, +;; xemacs19, emacs20, xemacs20...). The compiled code is then +;; installed in a subdirectory of the respective site-lisp directory. +;; We have to add this to the load-path: +(setq load-path + (nconc load-path + (list (concat "/usr/share/" + (symbol-name flavor) + "/site-lisp/ecasound-el")))) +(autoload 'ecasound "ecasound" "Run an inferior ecasound, with I/O through BUFFER." t) +(autoload 'ecasound-ewf-mode "ecasound" "A major mode for editing ecasound .ewf files." t) --- ecasound2.2-2.7.0.orig/debian/libecasound2.2-dev.dirs +++ ecasound2.2-2.7.0/debian/libecasound2.2-dev.dirs @@ -0,0 +1,5 @@ +usr/ +usr/lib +usr/bin +usr/share/man/man1 +usr/include --- ecasound2.2-2.7.0.orig/debian/changelog +++ ecasound2.2-2.7.0/debian/changelog @@ -0,0 +1,1009 @@ +ecasound2.2 (2.7.0-1.1ubuntu1) maverick; urgency=low + + * Adjust build-dep on liback-dev for JACK transition. + * Don't build-depend on versioned automake. + + -- Alessio Treglia Wed, 21 Jul 2010 13:24:01 +0200 + +ecasound2.2 (2.7.0-1.1) unstable; urgency=low + + * Non-maintainer upload. + * Change dependency on emacs flavours to emacsen; preserv emacs23 as a + non-virtual alternative dependency (Closes: #562039) + + -- Stefano Zacchiroli Fri, 12 Mar 2010 11:19:50 +0100 + +ecasound2.2 (2.7.0-1) unstable; urgency=low + + * New upstream release. + * Depend on libreadline-dev instead of libreadline5-dev by request of + Mattias Klose. It's now libreadline6-dev. (closes: #553748) + * Update menu file to use section Applications/ instead of Apps/. + + -- Junichi Uekawa Mon, 02 Nov 2009 18:22:35 +0900 + +ecasound2.2 (2.6.0-1) unstable; urgency=low + + * New upstream release + - 08_fix_header_install: remove + - 07_configure_in_maintainer_mode: update + - do not install manpage copies, and just install symlinks for + ecatools.1 + * Build-Depend on texlive-latex-recommended too for ecrm1000 font. + (closes: #526535) + + -- Junichi Uekawa Wed, 06 May 2009 15:18:46 +0900 + +ecasound2.2 (2.5.2-3) unstable; urgency=low + + * yodl 2.13.1 removed --unique-output option. Remove --unique-output + accordingly. + + -- Junichi Uekawa Fri, 26 Sep 2008 09:58:52 -0700 + +ecasound2.2 (2.5.2-2) unstable; urgency=low + + * Add Vcs-Git information + * Update debian/copyright with upstream information. + * fix typo in configure.in + 08_fix_header_install + * add --unique-output options to yodl to fix manpage generation. + + -- Junichi Uekawa Sat, 20 Sep 2008 22:28:40 -0700 + +ecasound2.2 (2.5.2-1) unstable; urgency=low + + * New Upstream Version + * Make debian/rules work with parallel build (test with -j5) + + -- Junichi Uekawa Sat, 30 Aug 2008 22:25:19 -0700 + +ecasound2.2 (2.4.6.1-2) unstable; urgency=low + + * Bug fix: "FTBFS with GCC 4.3: missing #includes", thanks to Martin + Michlmayr (Closes: #454890). + - 13_gcc4: updated + + -- Junichi Uekawa Sun, 23 Mar 2008 21:42:49 +0900 + +ecasound2.2 (2.4.6.1-1) unstable; urgency=low + + * New Upstream Version + * Update dpatches: + - 15_documentation_makefile: drop, included upstream + - 13_gcc4: updated: mostly merged, one remaining. keep. + + -- Junichi Uekawa Sun, 19 Aug 2007 19:08:31 +0900 + +ecasound2.2 (2.4.5-7) unstable; urgency=low + + * run latex twice to make index work in documentation. + - 15_documentation_makefile.dpatch + + -- Junichi Uekawa Mon, 06 Aug 2007 08:58:33 +0900 + +ecasound2.2 (2.4.5-6) unstable; urgency=low + + * really prefer emacs22 (Closes: #434913). + + -- Junichi Uekawa Fri, 03 Aug 2007 08:28:02 +0900 + +ecasound2.2 (2.4.5-5) unstable; urgency=low + + * ecasound-el: remove emacs-snapshot from list of dependencies. + * Bug fix: "ecasound-el: please prefer emacs22", thanks to Tatsuya + Kinoshita (Closes: #434913). + * Build-Depend libwrap-dev -> libwrap0-dev + + -- Junichi Uekawa Wed, 01 Aug 2007 08:18:19 +0900 + +ecasound2.2 (2.4.5-4) unstable; urgency=low + + * ecasound-el: add emacs22 + + -- Junichi Uekawa Sun, 15 Jul 2007 10:28:40 +0900 + +ecasound2.2 (2.4.5-3) unstable; urgency=low + + * "FLAC 1.1.4 library transition" (Closes: #426644). + - Updated build-depends to depend on libsndfile1 1.0.17-2 or greater + * Bug fix: "ecasound2.2: not binNMU-safe, uninstallable in unstable", + thanks to Steve Langasek (Closes: #431095). + + -- Junichi Uekawa Sat, 30 Jun 2007 12:43:25 +0900 + +ecasound2.2 (2.4.5-2) unstable; urgency=low + + * Bug fix: "FTBFS with GCC 4.3: missing #includes", thanks to Martin + Michlmayr (Closes: #417178), further updates to patch. + + -- Junichi Uekawa Fri, 18 May 2007 21:43:48 +0900 + +ecasound2.2 (2.4.5-1) unstable; urgency=low + + * new upstream release + * build-depend on texlive + * pbuilder-test: error code changed from '-1' to '1', so update test. + + -- Junichi Uekawa Sun, 22 Apr 2007 01:25:44 +0900 + +ecasound2.2 (2.4.4-7) unstable; urgency=low + + * Bug fix: "FTBFS with GCC 4.3: missing #includes", thanks to Martin + Michlmayr (Closes: #417178). + - 13_gcc4.3 + + -- Junichi Uekawa Wed, 11 Apr 2007 08:46:41 +0900 + +ecasound2.2 (2.4.4-6) unstable; urgency=HIGH + + * Bug fix: "libecasound2.2-dev: missing dependency on libasound2-dev", + thanks to Steve Langasek (Closes: #409438). + + -- Junichi Uekawa Sun, 4 Feb 2007 11:32:59 +0900 + +ecasound2.2 (2.4.4-5) unstable; urgency=low + + * Bug fix: "ecasound-el: Please add a depends against emacsen or + emacs-snapshot", thanks to arnaud@andesi.org (Closes: #403146). + + -- Junichi Uekawa Fri, 5 Jan 2007 14:15:13 +0900 + +ecasound2.2 (2.4.4-4) unstable; urgency=low + + * Bug fix: "FTBFS: Non-ascii character in input, consider using package + inputenc", thanks to Martin Michlmayr (Closes: #396851). + Remove the weird bit from documentation. + + -- Junichi Uekawa Sat, 4 Nov 2006 13:42:53 +0900 + +ecasound2.2 (2.4.4-3) unstable; urgency=low + + * Bug fix: "Python policy transition" (Closes: #373316). + - Build-depend on python-dev instead of python2.4-dev + - python-ecasound is arch all + - fix description to remove reference to python 2.3 + - debian/rules: remove reference to python2.3 and use dh_pysupport instead of dh_python + - remove existing byte-compilation handling from postinst/preinst. + some of it thanks to Pierre Habouzit + * Bug fix: "ecasound2.2: FTBFS on kfreebsd-amd64: unsatisfied + Build-Depends", thanks to Petr Salinger (Closes: #361469). + add hurd-i386 to list + * Standards-Version: 3.7.2 + * remove g++ versioned build-dependency, and add python-support (>= + 0.4.0) to build-dependency. + * update watch file format + * debian/rules clean config.log, config.status. + * ecasound now has versioned depends on python-ecasound, since it was + the original intention. + + -- Junichi Uekawa Sat, 12 Aug 2006 22:03:54 +0900 + +ecasound2.2 (2.4.4-2) unstable; urgency=low + + * Work with newer autoconf/automake ? which seems to be using more {}s. + - 11_configure_in_alsa_fix: "FTBFS: ./configure: line 23306: syntax + error near unexpected token `}'" (Closes: #377936). + + -- Junichi Uekawa Thu, 13 Jul 2006 00:49:48 +0900 + +ecasound2.2 (2.4.4-1) unstable; urgency=low + + * New upstream release + - 10_unprotect_filename_with_comma: integrated upstream + - 07_configure_in_maintainer_mode: update + * fix pbuilder-test + + -- Junichi Uekawa Sat, 28 Jan 2006 06:23:45 +0900 + +ecasound2.2 (2.4.3-3) unstable; urgency=low + + * 10_unprotect_filename_with_comma: ecatools did not accept filenames with + comma, but alsa devices are filenames starting with comma; accept them. + + -- Junichi Uekawa Mon, 5 Dec 2005 23:54:49 +0900 + +ecasound2.2 (2.4.3-2) unstable; urgency=low + + * make libasound2 optional for kFreeBSD (closes: #327648) + + -- Junichi Uekawa Sun, 18 Sep 2005 08:10:34 +0900 + +ecasound2.2 (2.4.3-1) unstable; urgency=low + + * New upstream release + - fixes: ecasound freezes the computer under root with double buffering(closes: #317900) + + -- Junichi Uekawa Thu, 25 Aug 2005 07:43:03 +0900 + +ecasound2.2 (2.4.2-1) unstable; urgency=low + + * New upstream release + * no longer generate ecasound2.2 transition package (closes: #321981) + + -- Junichi Uekawa Sat, 20 Aug 2005 10:57:32 +0900 + +ecasound2.2 (2.4.1-2) unstable; urgency=low + + * README.Debian: Note that arts is disabled + * rebuild with readline5-dev + - Bug fix: "use libreadline5-dev after sarge", thanks to Laurent Bonnaud + (Closes: #292313). + * Build-depend on g++ 4.0 or greater. + * rebuild with jack 0.100 as build-depends + - Bug fix: "libjack0.80.0-0 removed from unstable; rebuild required", + (Closes: #317191). + + -- Junichi Uekawa Tue, 12 Jul 2005 22:58:08 +0900 + +ecasound2.2 (2.4.1-1) unstable; urgency=low + + * New upstream version + - 01_ecasoundrc-location-fix: included in upstream + - 07_configure_in_maintainer_mode: updated + * removed refererence to artsc-dev + * [debian/control, debian/rules] Use automake1.9 + * documentation is now in rst + - add Build-Depends: python-docutils + * debian/menu: quote + * debian/watch: add + + -- Junichi Uekawa Thu, 14 Apr 2005 09:15:48 +0900 + +ecasound2.2 (2.4.0-1) unstable; urgency=low + + * New upstream release + - fixes filename parsing code (closes #285265, #284312, #285264) + - effect presets value eca:0.69 is now eca:69 (closes: #296505) + * disable arts support temporarily since it doesn't build + * debian/rules, debian/ecasound.manpages: + use installman instead of installmanpages + + -- Junichi Uekawa Sun, 13 Mar 2005 19:16:08 +0900 + +ecasound2.2 (2.3.5-8) unstable; urgency=low + + * README.Debian: update upstream URL, and explain why the source package is + thusly called. (closes: #284310) + * TODO; update with current todo items. + + -- Junichi Uekawa Tue, 8 Feb 2005 18:39:00 +0900 + +ecasound2.2 (2.3.5-7) unstable; urgency=low + + * Typo fix: replaces libecasound7c -> libecasound7. (closes: #290630) + + -- Junichi Uekawa Sun, 16 Jan 2005 15:59:10 +0900 + +ecasound2.2 (2.3.5-6) unstable; urgency=low + + * libecasound2.2-dev should depend on libsndfile1-dev. + (closes: #282226, #282229) + + -- Junichi Uekawa Thu, 25 Nov 2004 08:53:13 +0900 + +ecasound2.2 (2.3.5-5) unstable; urgency=low + + * ecasound-el depend on ecasound instead of ecasound2.2 + * 01_ecasoundrc-location-fix: fix patch so that effects_presets can be used. + default 'ecasoundrc' was not modified correctly. + + -- Junichi Uekawa Wed, 17 Nov 2004 08:28:31 +0900 + +ecasound2.2 (2.3.5-3) unstable; urgency=low + + * Build-dep on ruby + + -- Junichi Uekawa Mon, 15 Nov 2004 07:14:00 +0900 + +ecasound2.2 (2.3.5-2) unstable; urgency=low + + * Fix upgrade path from ecasound->ecasound2.2; + replace libecasound7c102, libecasound7 packages since documentation has + moved from these packages to ecasound package + * upload to unstable + - newer libtool is used than libtool1.4 (closes: #279389) + - gcc-3.4 bug is not there anymore (closes: #266709) + - largefile support is enabled (closes: #272551) + - ICE on gcc apparently doesn't happen with ecasound2.2 (closes: #249804) + - menu command is interactive (closes: #235560). + - new upstream version is now uploaded to unstable (closes: #247746) + + -- Junichi Uekawa Sat, 13 Nov 2004 23:04:32 +0900 + +ecasound2.2 (2.3.5-1) experimental; urgency=low + + * New upstream release + * debian/copyright: new upstream website/mail address. + * Fixed 01_ecasoundrc-location-fix patch so that I can send it upstream. + + -- Junichi Uekawa Sat, 13 Nov 2004 11:37:22 +0900 + +ecasound2.2 (2.3.4-1) experimental; urgency=low + + * New upstream release + * checked against Debian policy 3.6.1. + * patch updates + 01_ecasoundrc-location-fix: keep + 07_configure_in_maintainer_mode: keep + * libsndfile support added, we have new enough version now. + * Bug fix: "ecasound2.2: menu command needs to call ecasound + interactively", thanks to tim hall (Closes: #235560). + * Add libecasound-ruby1.8 package + - Add build-dep on ruby1.8 + - force-install to usr/lib/ruby/1.8 instead of /usr/local/ + + -- Junichi Uekawa Wed, 3 Nov 2004 13:12:56 +0900 + +ecasound2.2 (2.3.2-1) UNRELEASED; urgency=low + + * New upstream release + * patch updates + 01_ecasoundrc-location-fix: keep + 07_configure_in_maintainer_mode: keep + * ecasound package + * README.Debian: update notes on ecasound2.2 + * disable libsndfile support for now, since libsndfile 1.0.4 is not supported, requires 1.0.5 + * rebuild against jack 0.80.0 + + -- Junichi Uekawa Sun, 31 Oct 2004 14:16:09 +0900 + +ecasound2.2 (2.3.1-2) unstable; urgency=low + + * Fix build failure of ecawave/ecamegapedal packages, backporting fix for 2.3.2 + some header files were missing + - 08_fix_header_install.dpatch + + -- Junichi Uekawa Sat, 10 Jan 2004 11:10:00 +0900 + +ecasound2.2 (2.3.1-1) unstable; urgency=low + + * New upstream version + - incorporates Debian patches, and minor fixes. + * dpatch updates: + 01_ecasoundrc-location-fix: keep + 03_fix_unmatching_braces_in_ecasound_makefile_am: merged upstream + 04_ecasound_el_0.8.3: merged upstream + 05_audioio_jack_0.75_fix: merged upstream + 06_documentation_hevea: merged upstream + 07_configure_in_maintainer_mode: still applies, keep + * debian/control: Build-Depends: add yodl + + -- Junichi Uekawa Fri, 12 Dec 2003 05:48:51 +0900 + +ecasound2.2 (2.3.0-5) unstable; urgency=high + + * add build-Depends on python to work around /usr/bin/python not being + available when after installing python2.3-dev; dependency of + python2.3-dev upon python is downgraded to recommends now. + + -- Junichi Uekawa Wed, 19 Nov 2003 22:29:27 +0900 + +ecasound2.2 (2.3.0-4) unstable; urgency=high + + * Fix build failure; do not include html.sty in documentation. + * remove depcomp; old version seems to be incompatible with newer automake. + + -- Junichi Uekawa Tue, 18 Nov 2003 22:29:22 +0900 + +ecasound2.2 (2.3.0-3) unstable; urgency=HIGH + + * debian/control: Do not use latex2html, use hevea instead. + (Closes: #221334). + - 06_documentation_hevea.dpatch + * AM_MAINTAINER_MODE added, to fix debian/rules clean interaction with files patching. + - 07_configure_in_maintainer_mode.dpatch + + -- Junichi Uekawa Tue, 18 Nov 2003 07:58:32 +0900 + +ecasound2.2 (2.3.0-2) experimental; urgency=low + + * backport fix for 0.75.0 compatibility from CVS. + - 05_audioio_jack_0.75_fix.dpatch + + -- Junichi Uekawa Sat, 4 Oct 2003 14:03:39 +0900 + +ecasound2.2 (2.3.0-1) experimental; urgency=low + + * New upstream release (closes: #208160) + - ecasound2.2: Processing time (option -t) wrong with sample-rate != 44100 Hz + From: Stephan Niemz (closes: #195027) + * update Build-conflicts for libkvutils and libecasound; for c102. + * configure option "--enable-pyecasound=python" to ensure + pure python implementation of pyecasound. + * Run autoconf-automake-libtool in build. + * Fix to get ecasound building: + - ecasound/Makefile.am: "$(readline_library}" -> "$(readline_library)" + 03_fix_unmatching_braces_in_ecasound_makefile_am + - libtool tries to build shared libraries anyway: + 02_makefile_am_hack.dpatch: an unsuccessful attempt to not to + try to add libasound and libjack et al into static library. + -- the resulting output is no different ? + rather, tried --disable-shared. + * Update ecasound.el + 04_ecasound_el_0.8.3.dpatch + ecasound2.2: Please update ecasound.el to 0.8.3 + From: Mario Lang (closes: #208215) + * Note: JACK support is temporarily broken; thus experimental + + -- Junichi Uekawa Tue, 2 Sep 2003 06:05:39 +0900 + +ecasound2.2 (2.2.3-6) unstable; urgency=low + + * python2.3 transition (closes: #206047) + + -- Junichi Uekawa Mon, 25 Aug 2003 22:45:28 +0900 + +ecasound2.2 (2.2.3-5.1) unstable; urgency=low + + * NMU + * Build with python2.3 as the default python version. + + -- Matthias Klose Thu, 21 Aug 2003 22:36:38 +0200 + +ecasound2.2 (2.2.3-5) unstable; urgency=low + + * Add Build-Depends on tetex-bin + Thanks to Bdale for reporting. (closes: #202048) + + -- Junichi Uekawa Sun, 20 Jul 2003 13:07:40 +0900 + +ecasound2.2 (2.2.3-4) unstable; urgency=low + + * fix documentation install process, and build the documentation + - added build-dep on latex2html + - debian/rules, debian/docs: added build process and install process. + - doxygen documentation cannot be produced from source, sent upstream. + - debian/rules: use sed for index.html to change .pdf link to .pdf.gz + (closes: #200578) + * debian/TODO: update, there is nothing notable to do anymore. + + -- Junichi Uekawa Sat, 19 Jul 2003 09:39:21 +0900 + +ecasound2.2 (2.2.3-3) unstable; urgency=low + + * use dpatch to manage patches + 01_ecasoundrc-location-fix: use usr/share/ecasound2.2/ecasound/ecasoundrc + * debian/compat: use this file to specify debhelper compat version. + + -- Junichi Uekawa Mon, 2 Jun 2003 23:49:07 +0900 + +ecasound2.2 (2.2.3-2) unstable; urgency=low + + * change sections. + * Build and require jack 0.71.2 + + -- Junichi Uekawa Mon, 26 May 2003 00:41:51 +0900 + +ecasound2.2 (2.2.3-1) unstable; urgency=low + + * New upstream release + - ecasoundrc.in, libecasound/eca-resources.cpp: usr/share/ecasound2.2/ecasound/ecasoundrc + * update README.Debian + + -- Junichi Uekawa Tue, 29 Apr 2003 00:02:45 +0900 + +ecasound2.2 (2.2.2-1) unstable; urgency=low + + * New upstream release + - ecasoundrc.in, libecasound/eca-resources.cpp: usr/share/ecasound2.2/ecasoundrc + - other Debian-local patches merged upstream. + + -- Junichi Uekawa Tue, 25 Mar 2003 00:44:41 +0900 + +ecasound2.2 (2.2.1-2) unstable; urgency=low + + * Rebuild with libjack0.50.0 + + -- Junichi Uekawa Sun, 2 Mar 2003 18:05:33 +0900 + +ecasound2.2 (2.2.1-1) unstable; urgency=low + + * New upstream release + * Update config.guess/sub from autotools-dev. + * Hack ecasoundrc.in, libecasound/eca-resources.cpp to look in + /usr/share/ecasound2.2/ecasound + * Forward-port pyecasound compile rules. + * AM_MAINTAINER_MODE, aclocal, autoconf, automake + * Build-Depend and libecasound2.2-dev depend on libsamplerate0-dev. + * ecalength.c: int curopt, not char. (closes: #181228) + + -- Junichi Uekawa Mon, 17 Feb 2003 15:19:09 +0900 + +ecasound2.2 (2.2.0-rel-7) unstable; urgency=low + + * Add missing Depends on -dev packages. + + -- Junichi Uekawa Wed, 12 Feb 2003 10:16:17 +0900 + +ecasound2.2 (2.2.0-rel-6) unstable; urgency=low + + * Build-depend on libartsc0-dev instead of libarts-dev + + -- Junichi Uekawa Fri, 7 Feb 2003 21:30:50 +0900 + +ecasound2.2 (2.2.0-rel-5) unstable; urgency=low + + * ecasoundrc.in, libecasound/eca-resources.cpp: hand-fix problems with ecasoundrc path (resource-directory is /share/ecasound2.2/ecasound) + (closes: #179184) + * link .lo file instead of .o file for pyecasound. (closes: #179380) + * run aclocal/autoconf/automake + - debian/rules chmod a+x depcomp + * apply description improvement for ecasound-el from mlang@debian.org, + thanks! + (closes: #178256) + * fix libecasound-config.in to not generate -rpath when library is + installed in standard install path. + + -- Junichi Uekawa Tue, 4 Feb 2003 18:33:31 +0900 + +ecasound2.2 (2.2.0-rel-4) unstable; urgency=low + + * Build-Depend on libjack0.44.0-dev (closes: #177107, #177732) + * Do not link libecasoundc.a static link library to shared library, + link libecasoundc_sa.lo which is compiled with -fPIC + (closes: #177096) + * add AM_MAINTAINER_MODE to configure.in, and relibtoolize/autoconf/automake + + -- Junichi Uekawa Wed, 22 Jan 2003 12:02:02 +0900 + +ecasound2.2 (2.2.0-rel-3) unstable; urgency=low + + * set datadir=/usr/share/ecasound2.2, to avoid file conflicts + with libecasound7. + (closes: #176880) + + -- Junichi Uekawa Thu, 16 Jan 2003 13:34:37 +0900 + +ecasound2.2 (2.2.0-rel-2) unstable; urgency=low + + * install changelogs for ecasound-el package. + * update TODO file. + * add missing Depends to emacs21,xemacs21 on ecasound-el + * change so that ecasound-el does not byte-compile for emacs20. + thanks "Aaron M. Ucko" (closes: #176775) + + -- Junichi Uekawa Wed, 15 Jan 2003 16:48:45 +0900 + +ecasound2.2 (2.2.0-rel-1) unstable; urgency=low + + * New upstream release, naming it 2.2.0-rel (real version is 2.2.0) + * Remove hacks to build with gcc-3.2 on hppa, gcc-3.2 should be default now. + * Remove hackgcc3 option + * Rebuild with gcc-3.2 + * Change ecasound.el default ecasound value to /usr/bin/ecasound + * New ecasound-el package. + + -- Junichi Uekawa Sat, 11 Jan 2003 12:30:42 +0900 + +ecasound2.2 (2.2.0-rc1-1) unstable; urgency=low + + * new upstream release (closes: #173300) + Does not co-install with previous versions. + There are some known and unknown bugs in this release, + and would be nice if people tested this version out before I completely + replace ecasound. + * enable largefile support. + * do not ship documentation for now, since build system changed from + yodl to latex, we'll fix later. + * ecamonitor in ecasound2.2 require python-ecasound, so Depend on + python-ecasound2.2, and also python. + * debian/rules: chmod 644 pyeca.py + * -dev packages provide and conflict -development, and conflict with + lib*-dev, because old ecasound -dev packages were not with soname. + + -- Junichi Uekawa Mon, 23 Dec 2002 20:09:54 +0900 + +ecasound (2.0.4-7) unstable; urgency=low + + * Inadvertently uploaded a broken package. + Fix it so that we actually have a working "ecasound" package! + + -- Junichi Uekawa Mon, 16 Dec 2002 12:14:46 +0900 + +ecasound (2.0.4-6) unstable; urgency=low + + * update README/Debian wrt gcc and libasound2 + * Standards-Version: 3.5.8, rewrite of some portion of build scripts: + - support noopt compilation option, nostrip is pending. + - DH_COMPAT=4 + - debian/control: Build-Dep on debhelper 4.1.1 or greater + - libasound2 is Depends:, not Suggests:. + - dh_shlibs call changed + - debian/rules: remove unnecessary touching of Makefile.in's. + AM_INIT_AUTOMAKE should take care of that + - debian/shlibs.local is no longer needed, removed. + * do not set CXXFLAGS in configure.ac + * re-run autoconf. + + -- Junichi Uekawa Sun, 15 Dec 2002 13:13:29 +0900 + +ecasound (2.0.4-5) unstable; urgency=low + + * update hackgcc3 DEB_BUILD_OPTIONS to use gcc-3.2 + * debian/rules: special-case hppa to use gcc-3.2. (closes: #165582) + + -- Junichi Uekawa Mon, 21 Oct 2002 18:19:50 +0900 + +ecasound (2.0.4-4) unstable; urgency=low + + * configure.in: fix python dirs specification to work with python 2.2 + (closes: #159979) + * regenerate autoconf scripts + + -- Junichi Uekawa Mon, 9 Sep 2002 12:23:38 +0900 + +ecasound (2.0.4-3) unstable; urgency=low + + * Fix compilation on g++-3.x and newer readline. + char* -> const char*, and remove spurious typecast (closes: #157118) + * configure.in: Change check for map.h to map + * Recompile with libasound2 + * Remove spurious architecture field on Build-Depends + * Compile with python2.2 (closes: #159711) + + -- Junichi Uekawa Fri, 6 Sep 2002 12:56:13 +0900 + +ecasound (2.0.4-2) unstable; urgency=low + + * apply upstream patch to add -mieee to alpha build. + * add AM_MAINTAINER_MODE to configure.in + + -- Junichi Uekawa Wed, 17 Jul 2002 15:48:52 +0900 + +ecasound (2.0.4-1) unstable; urgency=low + + * new upstream release, incoorporating most of my previous modifications. + * ecasound_faq.html seems to have disappeared, remove the reference from + libecasound7.docs. + * --enable-sys-readline + * add libreadline4-dev build-depends. + * ecasound/eca_text.cpp: completion_matches to rl_completion_matches + * configure.in: fix pymoddirs and python_incdirs to include python2.1 + (forward port from 2.0.3-3) + + -- Junichi Uekawa Sat, 30 Mar 2002 15:37:48 +0900 + +ecasound (2.0.3-5) unstable; urgency=low + + * Dependency: libecasound-dev -> libkvutils-dev and libecasoundc-dev -> + libecasound-dev (closes: #128221) + + -- Junichi Uekawa Wed, 9 Jan 2002 15:53:53 +0900 + +ecasound (2.0.3-4) unstable; urgency=low + + * "Package for my Christmas..." + * Cosmetic fixes for release, for bugs described in 125972. + * fixed debian/rules. It depended on python 1.5 or 2.0 being available. + I want python 2.1 + * debian/control: remove reference to mpg123 from Suggest, instead, + suggest mpg321 | mp3-decoder. + * debian/control: add mikmod, and timidity to Suggests: list. + * debian/control: change from suggests to ladspa-plugin to + swh-plugins | ladspa-plugin, so that it is more obvious which to install. + * debian/README: updated the text, and did a spell-check. + * debian/TODO: modified the obvious typo. + + -- Junichi Uekawa Sun, 23 Dec 2001 16:15:33 +0900 + +ecasound (2.0.3-3) unstable; urgency=low + + * debian/control: libecasound0-dev provides and conflicts libecasound-dev. + so that future versions can coexist (kind of). Future versions may + wish to Conflict: with <= 2.0.3-2 + * changed to python-2.1 (closes: #118264) + * changed configure.in to look for python2.1 + * added : touch configure.in aclocal.m4 `find -name Makefile.in ` configure + to debian/rules, this seems to pass pdebuild test. + * changed postinst for python-ecasound to use python instead of python2 + + -- Junichi Uekawa Mon, 19 Nov 2001 06:37:15 +0900 + +ecasound (2.0.3-2) unstable; urgency=low + + * debian/rules, debian/control: alpha version is no longer built with g++-3.0. + * updated shlibs.local to represent that change. + + -- Junichi Uekawa Sun, 21 Oct 2001 16:06:34 +0900 + +ecasound (2.0.3-1) unstable; urgency=low + + * new upstream version with some upstream bugfixes, and some Debian + fixes merged. + Some upstream fixes include: + o problems with ALSA 0.9beta7 (dlopen() issue) + o minor samplerated bug with LADSPA plugins + * removed automake/autoconf calls from configure target ( I am no + longer using a cvs-checkout version of ecasound, so I should not need + to re-run those programs.) (closes: #114209) + * debian/control: removed build-deps for autoconf, automake + * debian/rules: removed the removing of autoconf/automake generated files from clean target. + * fixed priorities to match overrides file + + -- Junichi Uekawa Thu, 4 Oct 2001 01:14:25 +0900 + +ecasound (2.0.2-4) unstable; urgency=low + + * split out libecasoundc package. adding libecasoundc0.postinst etc. + * ALSA 0.9 support is still removed ... probably for a longer time than anticipated. + * changed from using dh_movefiles, to using mv directly, in debian/rules. + Hoping not to have dropped any files. + * adding a replaces libecasound, for libecasoundc, because some files + have moved over + + -- Junichi Uekawa Sun, 30 Sep 2001 23:56:45 +0900 + +ecasound (2.0.2-3) unstable; urgency=low + + * fixing shlibs.local file to depend above 2.0.2-2 + * Remove ALSA 0.9 support temporarily (hopefully) because + apparently ALSA in Debian is broken (again). + Reverted to ALSA 0.5, because + that's better than nothing, IMO. + Changed libasound2-dev [i386 alpha ia64 powerpc m68k] to + libasound1-dev [i386 alpha ia64 powerpc m68k] + (closes: #111555) + + -- Junichi Uekawa Mon, 3 Sep 2001 19:35:18 +0900 + +ecasound (2.0.2-2) unstable; urgency=low + + * Build with gcc-3.0 on alpha. + * Build depends on gcc-3.0 and g++-3.0 [alpha] + * add a DEB_BUILD_OPTION for test-building for g++-3.0 + + -- Junichi Uekawa Thu, 30 Aug 2001 02:27:14 +0900 + +ecasound (2.0.2-1) unstable; urgency=low + + * New upstream release with bugfixes. + * gcc-3.0 patch has been integrated upstream (partially, the + patching done for 2.0.1-6 did not make it.) + fixed gcc-3.0 - libasound1-dev compilation errors, + and copied newer config.{sub,guess} + + -- Junichi Uekawa Sat, 18 Aug 2001 02:21:08 +0900 + +ecasound (2.0.1-6) unstable; urgency=low + + * updated config.sub and config.guess. + I hope this is what LaMont meant... (closes: #108244) + * fixing build-deps to the latest state. Moving over to libasound2 all those arches which seem to support libasound2. + * fixing some more gcc-3.0 incompatibility + + -- Junichi Uekawa Sun, 12 Aug 2001 00:21:35 +0900 + +ecasound (2.0.1-5) unstable; urgency=low + + * fix postinst to work with python2. (closes: #104509) + * compile with python2. python2 seems to be GPL-compatible now, and it + is better supported by external application programs. + * python-ecasound Depends: python2-base + * build-depends on python2-dev + * python-ecasound postinst and preinst is updated to work with python2 + + -- Junichi Uekawa Sat, 14 Jul 2001 07:33:23 +0900 + +ecasound (2.0.1-4) unstable; urgency=low + + * patched so that it can work with g++-3.0, please verify. + + -- Junichi Uekawa Thu, 12 Jul 2001 07:17:33 +0900 + +ecasound (2.0.1-3) unstable; urgency=low + + * fixed build-deps for arm. Thanks to Philip Brandell for pointing this out. + (closes: #101984) + * bumped up standards-version to 3.5.5 (no change) + + -- Junichi Uekawa Sun, 24 Jun 2001 00:23:42 +0900 + +ecasound (2.0.1-2) unstable; urgency=low + + * removed dependency for alsa 0.5 on arm which is not available + and changed build-dependency to point to ladspa-sdk + and changed build-dependency to libarts arch specification to be + more specific. (closes: #100425) + + -- Junichi Uekawa Wed, 20 Jun 2001 16:27:12 +0900 + +ecasound (2.0.1-1) unstable; urgency=low + + * new upstream release with many bugfixes. Try this if you have experienced + mp3 zombies, or some mysterious segfaults. + * debian/control: build with alsa version 0.9 for ia32, and not for other arches, and use alsa 0.4 for arm. + TODO: build a 0.5 version separately if possible. + + -- Junichi Uekawa Mon, 21 May 2001 16:05:35 +0900 + +ecasound (2.0.0-3) unstable; urgency=low + + * debian/control: corrected build-depends (closes: #96883) + + -- Junichi Uekawa Thu, 10 May 2001 14:37:53 +0900 + +ecasound (2.0.0-2) unstable; urgency=low + + * Recompiling with ladspa support + + -- Junichi Uekawa Wed, 9 May 2001 21:35:38 +0900 + +ecasound (2.0.0-1) unstable; urgency=low + + * New upstream stable version + * debian/control: removed arts build dependency to allow for alpha build. (closes: #95710) + * debian/rules: ALSA 0.5 in unstable is working again. Re-enabling ALSA. (#95717) + + -- Junichi Uekawa Mon, 7 May 2001 15:58:48 +0900 + +ecasound (1.9dev7.cvs20010428-1) unstable; urgency=low + + * CVS version getting ready for the version 2 release. + * ladspa.h removed from distribution. (closes: #88750) + * debian/control: added arts build-dependency + * debian/rules: hack for catman pages is removed because patch was + accepted. + * debian/control: Build-depends on ncurses 5 (closes: #90709) + * debian/control: Build-depends on automake/autoconf + * debian/control: Build-conflicts on python2-base. + * debian/rules: ALSA in debian is currently broken, as a workaround, + --disable-alsa is passed to ./configure + * debian/control: libecasound7 conflicts with older version of eca* software + * debian/rules: removes Makefile.in to reduce diff size. + * debian/README.Debian: changed the documentation to suit the reality. + + -- Junichi Uekawa Sat, 28 Apr 2001 10:43:06 +0900 + +ecasound (1.9dev2-2) unstable; urgency=low + + * debian/rules: dh_testversion to test version of debhelper + * debian/control: Maintainer: field points to dancer@debian.org now. + * debian/control: policy version to 3.5.2 + * debian/rules: accepts debug options in DEB_BUILD_OPTIONS + * debian/control: arm and mips added for Build-Depends to libasound1 + hoping that they actually are working. + * debian/ecasoundc-config.1, debian/ecasound-config.1, debian/rules: + removed the undocumented.7.gz symlink, and created real manpages. + * debian/rules: removed reference to CFLAGS because it is not necessary + + -- Junichi Uekawa Wed, 28 Feb 2001 14:33:11 +0900 + +ecasound (1.9dev2-1) unstable; urgency=low + + * change maintainer mail address to a debian one. + * upgrade to the latest upstream development release as to avoid forking + and backporting fixes. + * new versioning policy in the upstream. Hope it works. + * the dependency is bumped up to make things look better. + + -- Junichi Uekawa Wed, 21 Feb 2001 01:42:11 +0900 + +ecasound (1.8.5d15-9) unstable; urgency=low + + * Add a #define __KERNEL__ in the hope that kvutils will compile for + arches that require that in asm/atomic.h for read_atomic(). + + -- Junichi Uekawa Sun, 28 Jan 2001 23:04:55 +0900 + +ecasound (1.8.5d15-8) unstable; urgency=low + + * change rm to rm -f so that minor discrepancies do not prohibit + things from building. Python code gets compiled into "lib-dynload" on + some systems, and "site-packages" on others. + * added little more verbose description about libkvutils, closes:#83295 + * added a hack into ./configure so that python modules get installed + into site-packages regardless of whether that directory already exists + or not. + + -- Junichi Uekawa Fri, 26 Jan 2001 18:28:57 +0900 + +ecasound (1.8.5d15-7) unstable; urgency=low + + * added suggests for mpg123 into libecasound7, closes:#83183 + * added suggests for vorbis-tools (for completeness) to libecasound7. + + -- Junichi Uekawa Wed, 24 Jan 2001 02:08:17 +0900 + +ecasound (1.8.5d15-6) unstable; urgency=low + + * Add depends from python-ecasound to python-base because the + install script requires compileall.py to be existant. + * Change the section of ecasound-python to interpreters as per + ftpadmin. + * ecasound is in the debian archive, should have closed the ITP bug, + and I'm doing it now, closes: #72971 + + -- Junichi Uekawa Sat, 20 Jan 2001 00:42:06 +0900 + +ecasound (1.8.5d15-5) unstable; urgency=low + + * Modified python-ecasound postinst to work with latest python1.5 + * Modified libecasoundc/Makefile.am to add "-L" to link libecasound + * Modified libpyecasound/ to add libecasound + * Modified debian/control to update descriptions of packages to be + more appropriate, esp. python-ecasound. + + -- Junichi Uekawa Mon, 25 Dec 2000 01:56:24 +0900 + +ecasound (1.8.5d15-4) unstable; urgency=low + + * Added suggests mp3-encoder/decoder + * Added build-depends python-dev + * Catman pages are now manpages. + * Created python-ecasound package + * fixed pyecasound/libpyecasound.la to include ecasound into depends. + + -- Junichi Uekawa Tue, 19 Dec 2000 01:45:26 +0900 + +ecasound (1.8.5d15-3) unstable; urgency=low + + * rebuilt. + + -- Junichi Uekawa Sat, 16 Dec 2000 01:31:53 +0900 + +ecasound (1.8.5d15-2) unstable; urgency=low + + * removed ecasound-plugin package and reintegrated into libecasound7 + * It should work with libecasound7 suggesting audio dependencies. + + -- Junichi Uekawa Thu, 14 Dec 2000 18:19:21 +0900 + +ecasound (1.8.5d15-1) unstable; urgency=low + + * Moved documentation files around so that html links work for + users_guide, and programmers_guide. They are now in libecasound7 + * C-binding library files have been moved to libecasound{7,-dev} + * Updated debian/shlibs.local to (>> 1.8.5d15) + * python bindings are not quite checked yet. + + -- Junichi Uekawa Thu, 14 Dec 2000 16:15:40 +0900 + +ecasound (1.8.5d15-0) unstable; urgency=low + + * New upstream version. A quick-hack build. + * (not uploaded to Debian) + + -- Junichi Uekawa Fri, 8 Dec 2000 03:26:53 +0900 + +ecasound (1.8.4d15-1) unstable; urgency=low + + * New upstream release + * Moved out ecasound-plugin to be a separate package depended by the main + package to go along with the design of rpm package version. ecasound-plugin + can be a Suggests:. + * Please note that configuration file .ecasoundrc has changed slightly, + remember to delete the file from home directories, if you have had them + installed. + * To be uploaded to Debian (closes: Bug#72971) + * Added support for doc-base. + + -- Junichi Uekawa Fri, 8 Dec 2000 03:26:36 +0900 + +ecasound (1.8.3d15-2) unstable; urgency=low + + * Changed control files to make libs files go to libs section, and dev + files go into dev section. + * Fixed menu files so that Debian menu entries get added. + * (not uploaded to Debian) + + -- Junichi Uekawa Tue, 24 Oct 2000 22:07:53 +0900 + +ecasound (1.8.3d15-1) unstable; urgency=low + + * Initial packaging attempt, ported to the current development version + required for ecawave + * please note that plugins directory is moved to + /usr/lib/libecasound7/ecasound-plugins + * (not uploaded to Debian) + + -- Junichi Uekawa Thu, 5 Oct 2000 20:51:37 +0900 + +ecasound (1.8.2r14-1) unstable; urgency=low + + * Initial packaging attempt + * (not uploaded to Debian) + + -- Junichi Uekawa Sun, 1 Oct 2000 23:50:02 +0900 + + --- ecasound2.2-2.7.0.orig/debian/TODO +++ ecasound2.2-2.7.0/debian/TODO @@ -0,0 +1,8 @@ + + * Close +#285265: ecasound: unable to specify files with ',' in name +#285264: ecasound: playing of ogg files with spaces in names doesn't work +#284312: OGG recording with low bit-rates doesn't work + with newer upload + +Junichi Uekawa -- 2005 feb 7 --- ecasound2.2-2.7.0.orig/debian/libecasound7.dirs +++ ecasound2.2-2.7.0/debian/libecasound7.dirs @@ -0,0 +1,5 @@ +usr +usr/share +usr/lib +usr/share/doc/ecasound/programmers_guide +usr/share/doc/ecasound/users_guide --- ecasound2.2-2.7.0.orig/debian/copyright +++ ecasound2.2-2.7.0/debian/copyright @@ -0,0 +1,35 @@ +This package was debianized by Junichi Uekawa on +Sun, 1 Oct 2000 23:50:02 +0900. + +It was downloaded from +http://www.eca.cx/ecasound/ +http://ecasound.seul.org/download/ecasound-2.7.0.tar.gz +http://ecasound.seul.org/ecasound.git + +Upstream Author: Kai Vehmanen, + +Copyright: + +GPL, see /usr/share/common-licenses/GPL + +Some parts are LGPL: +from COPYING: + +======================================================================= +*** Ecasound - Licensing/distribution policy *** +======================================================================= + +Copyright (C) 1997-2006 Kai Vehmanen and others (see ecasound/AUTHORS). + +Ecasound is freely distributable according to the terms of the +GNU General Public License (see the file 'COPYING.GPL'). + +This program is distributed without any warranty. See the file +'COPYING.GPL' for details. + +As an exception to the above, the C, C++ and python implementations +of the Ecasound Control Interface (ECI) are licensed under the LGPL +(see the file 'COPYING.LGPL'). This allows writing ECI applications +that are not licensed under GPL. + +======================================================================= --- ecasound2.2-2.7.0.orig/debian/libkvutils2.2-dev.dirs +++ ecasound2.2-2.7.0/debian/libkvutils2.2-dev.dirs @@ -0,0 +1,2 @@ +usr/lib +usr/include \ No newline at end of file --- ecasound2.2-2.7.0.orig/debian/ecasound-el.dirs +++ ecasound2.2-2.7.0/debian/ecasound-el.dirs @@ -0,0 +1 @@ +usr/share/emacs/site-lisp/ecasound-el --- ecasound2.2-2.7.0.orig/debian/libecasound-config.1 +++ ecasound2.2-2.7.0/debian/libecasound-config.1 @@ -0,0 +1,32 @@ +.TH ecasound-config 1 "28 February 2001" "ecasound" "Debian GNU/Linux" +.SH NAME +libecasound-config \- get information about installed ecasound library +.SH SYNOPSIS +.B ecasound-config [\-\-libs] [\-\-libs_debug] [\-\-cflags] [\-\-version] +.SH DESCRIPTION +.PP +.B libecasound-config +is a tool that is used to determine the compiler and linker flags used +to compile programs using the ecasound liberary. It is meant to be +used like +.P +.B gcc `libecasound-config --libs --cflags` some-code.c +.SH OPTIONS +.TP 8 +.B \-\-libs +returns the linker options. +.TP 8 +.B \-\-libs_debug +returns the linker options for debug libraries. +.TP 8 +.B \-\-cflags +returns include options. +.TP 8 +.B \-\-version +returns the version of ecasound library. +.SH "AUTHOR" +This manpage has been written by Junichi Uekawa +for Debian GNU/Linux system. +.SH "SEE ALSO" +ecasound(1), "Ecasound Programmer's Manual". + --- ecasound2.2-2.7.0.orig/debian/pbuilder-test/001_ecasoundrun +++ ecasound2.2-2.7.0/debian/pbuilder-test/001_ecasoundrun @@ -0,0 +1,10 @@ +#!/bin/bash + +set +e +ecasound +case $? in + 1) exit 0;; + *) exit 1;; +esac + + --- ecasound2.2-2.7.0.orig/debian/pbuilder-test/002_sample.c +++ ecasound2.2-2.7.0/debian/pbuilder-test/002_sample.c @@ -0,0 +1,15 @@ +/* + test code to test that libecasoundc can be compiled + */ +#include +#include + +int main() +{ + printf("hello world\n"); + eci_init(); + eci_command("engine-status"); + printf("%s\n", eci_last_string()); + eci_cleanup(); + return 0; +} --- ecasound2.2-2.7.0.orig/debian/pbuilder-test/002_libecasoundc +++ ecasound2.2-2.7.0/debian/pbuilder-test/002_libecasoundc @@ -0,0 +1,5 @@ +#!/bin/bash + +gcc /tmp/buildd/*/debian/pbuilder-test/002_sample.c -o /tmp/002_sample.out $(libecasoundc-config --libs --cflags +) +/tmp/002_sample.out --- ecasound2.2-2.7.0.orig/debian/pbuilder-test/000_prepinstall +++ ecasound2.2-2.7.0/debian/pbuilder-test/000_prepinstall @@ -0,0 +1,5 @@ +#!/bin/bash + +apt-get update +#apt-get install binfmtc + --- ecasound2.2-2.7.0.orig/debian/patches/07_configure_in_maintainer_mode.dpatch +++ ecasound2.2-2.7.0/debian/patches/07_configure_in_maintainer_mode.dpatch @@ -0,0 +1,18 @@ +#! /bin/sh /usr/share/dpatch/dpatch-run +## 07_configure_in_maintainer_mode.dpatch by Junichi Uekawa +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: AM_MAINTAINER_MODE is required to get things working with make clean and unpatch. + +@DPATCH@ +diff -urNad ecasound2.2~/configure.in ecasound2.2/configure.in +--- ecasound2.2~/configure.in 2009-11-02 17:49:12.000000000 +0900 ++++ ecasound2.2/configure.in 2009-11-02 17:51:35.502596418 +0900 +@@ -23,6 +23,7 @@ + + dnl FIXME: replace with AC_CONFIG_HEADERS when upgrading to a newer automake + AM_CONFIG_HEADER([config.h]) ++AM_MAINTAINER_MODE + + dnl ------------------------------------------------------------------ + --- ecasound2.2-2.7.0.orig/debian/patches/00list +++ ecasound2.2-2.7.0/debian/patches/00list @@ -0,0 +1 @@ +07_configure_in_maintainer_mode --- ecasound2.2-2.7.0.orig/examples/jackdemo.c +++ ecasound2.2-2.7.0/examples/jackdemo.c @@ -0,0 +1,61 @@ +#include +#include + +/* compile with: "gcc -o jackdemo jackdemo.c -lecasoundc" */ + +int main(int argc, char *argv[]) +{ + eci_init(); + + /* create the chainsetup and one chain */ + eci_command("cs-add jackdemo_chainsetup"); + eci_command("c-add chain1"); + + /* add the audio inputs and outputs */ + eci_command("ai-add foo.wav"); + eci_command("ao-add jack_alsa,out"); + + /* add an LADSPA plate reverb */ + eci_command("cop-add -el:plate,50,0.5,0.5"); + + /* select the 3rd param (wet/dry) for real-time control */ + eci_command("copp-select 3"); + + /* connect the setup and start */ + eci_command("cs-connect"); + if (eci_error()) { + printf("cs-connect error:\n%s\n\n", eci_last_error()); + } + else { + eci_command("start"); + + while(1) { + double curpos; + sleep(1); + /* fetch current play position */ + eci_command("get-position"); + curpos = eci_last_float(); + if (curpos > 10.0) { + /* at pos=10sec, quit playing */ + break; + } + else if (curpos > 5.0) { + /* at pos=5sec, set reverb length to 80% */ + eci_command_float_arg("copp-set", 0.8); + } + } + + eci_command("status"); + printf("General Status::\n%s\n\n", eci_last_string()); + + eci_command("aio-status"); + printf("Audio Object Status:\n%s\n\n", eci_last_string()); + + eci_command("stop"); + eci_command("cs-disconnect"); + } + + eci_cleanup(); + + return(0); +} --- ecasound2.2-2.7.0.orig/Documentation/index.html +++ ecasound2.2-2.7.0/Documentation/index.html @@ -0,0 +1,57 @@ + + +Ecasound Documentation + + + + + +
+ +

Ecasound Documentation

+ +
+ +

Getting Started

+
    +
  • Examples +
      The best place to get started with Ecasound.
  • +
  • Tutorials +
      Tutorials, articles and other such resources.
  • +
  • Troubleshooting +
      Solutions to common problems.
  • +
  • Ecasound User's Guide + (html, + pdf) +
      Introduces the central concepts and areas of functionality.
  • +
  • README and BUGS +
      Latest README and BUGS files from the distribution package. The latter + contains some instructions for submitting bug reports.
  • +
+ +

Reference Material

+
    +
  • Man pages +
      Manual pages for Ecasound
  • +
  • Mailing list archives + (gmame.org, + eca.cx) +
      Messages posted to ecasound-list
  • +
+ +

Developer Material

+
    +
  • Ecasound Programmer's Guide + (ascii/txt, + html) +
      How Ecasound works and how to use it in your own projects
  • +
  • Ecasound Control Interface Guide + (html, + pdf) +
      Using the ECI API for application development
  • +
+ +
+ + + --- ecasound2.2-2.7.0.orig/Documentation/tutorials.html +++ ecasound2.2-2.7.0/Documentation/tutorials.html @@ -0,0 +1,214 @@ + + +Ecasound Documentation - Tutorials and Articles + + + + + +
+
+ +

Ecasound Documentation - Tutorials, Articles and Other Such Resources

+ + + +
+ + + + + + + +

The entries are ordered in latest-update-first order. If you have +material that you'd like to see on this page, mail me (Kai Vehmanen) about it.

+ +

+

+ +
+ + +

Maintained Resources

+ + + +

Tutorials and Articles

+ + + +

General Level Tutorials

+
    + + + + + +
  • Example of mixing with ecasound (en) + - Weblog entry that describes mixing with ecasound. By Paul Ford.
  • +
  • Achieving Reliable Low Latency (en) + - Dave Phillips' article at O'Reilly Network covers techniques + for improving the real-time performance and reliability of Linux + systems. Ecasound is used as one example application.
  • +
+ + +

Ecasound as a Building Block

+
    +
  • Tank-FX + - An audio/internet-installation where an 11 meter concrete tank is used as an reverb unit.
  • +
  • Identity Distortor + - An interactive A/V installation.
  • +
  • 02L - Outside Standing Level + - Multimedia installation presented at the Umbria Jazz Festival 2002 in Piazza, Italy.
  • +
+ + +

Selected Messages from ecasound-list List Archives

+ + + + + + + +
+

Back to index.

+

[Document version 20050423-7.]

+
+ + + +





















+



+ + + --- ecasound2.2-2.7.0.orig/Documentation/ecatools_manpage.yo +++ ecasound2.2-2.7.0/Documentation/ecatools_manpage.yo @@ -0,0 +1,228 @@ +mailto(kvehmanen -at- eca -dot- cx) + +manpage(ecatools) + (1) + (12.11.2005) + () + (Multimedia software) + +manpagename(ecatools)(audio processing utils based on ecasound) + +manpagesynopsis() +bf(ecaconvert) .extension file1 [ file2 ... fileN ] + +bf(ecafixdc) file1 [ file2 ... fileN ] + +bf(ecalength) file1 [ file2 ... fileN ] + +bf(ecamonitor) [host][:port] + +bf(ecanormalize) file1 [ file2 ... fileN ] + +bf(ecaplay) [-dfhklopq] [ file1 file2 ... fileN ] + +bf(ecasignalview) [ options ] [ input ] [ output ] + +manpagedescription() + +Ecatools are simple command line utils for audio file processing. +Each tool is designed to perform one specific operation. Most of +the tools also support batch processing. + +bf(ECACONVERT) + +A tool for converting a set of files to a common target format. +This target format is given as the first command line +argument, and its syntax is em(.ext). + +bf(ECAFIXDC) + +A simple command-line tool for fixing DC-offset. + +bf(ECALENGTH) + +See the separate ecalength(1) man page. + +bf(ECAMONITOR) + +Ecamonitor is a util program that can be used +to monitor an active ecasound session. Ecamonitor +is able to show information about the current +chainsetup such as list of inputs, outputs, +current position, effects, the engine status +and numerous other things. + +By default ecamonitor will try to connect +to IP4 address "localhost", to port "2868". +A different address can be specified when +starting ecamonitor, for example +"ecamonitor foo.mynetwork.com" or +"ecamonitor foo.mynetwork.com:4500". + +To enable inbound connections, ecasound has to be +started with the em(--daemon) option. Ecamonitor is +implemented in Python using the NetECI API. + +bf(ECANORMALIZE) + +Ecanormalize is a command-line tool for normalizing audio +files to utilize the full available sample resolution. Ecanormalize +first finds out how much the input file can be amplified without +clipping and if there is room for increase, a static gain will +be applied to the file. + +bf(ECAPLAY) + +Ecaplay is a command-line tool for playing audio files. Ecaplay +uses the libecasound engine and is thus able to handle all audio formats +supported by the library. + +Files can be selected for playback either by specifying the +filenames on the command-line, or by using the playlist +mechanism. In playlist mode, files can be added to the playlist +using the em(-q) option. The em(-p) option can then be used +to play all tracks on the playlist. Ecaplay will repeat the +playlist tracks until explicitly stopped (with double Ctrl-C). +Playlist can be flushed with em(-f) and its contents listed +with em(-l) option. + +If not otherwise specified, ecaplay will use the audio output device +specified in em(~/.ecasound/ecasoundrc) for playback. A different +output device can be selected with em(ECAPLAY_OUTPUT_DEVICE) shell +environment variable or with the em(-o:output_device) command-line +option. + +Playback can be stopped at any time with Ctrl-C. If multiple +files are played, first Ctrl-C will stop the current file and move +on to play the next one. Issuing Ctrl-C twice (within one second), +will cause ecaplay to exit. + +startdit() +dit(-d:debuglevel) +Set libecasound debug level. See ecasound(1). + +dit(-f) +Flush the playlist contents. See also +options em(-l, -p and -q). + +dit(-h) +Print usage information and exit. + +dit(-k:number) +Skip 'number' of files. + +dit(-l) +List the current playlist contents to stdout. See also +options em(-f, -p and -q). + +dit(-o:output_device) +Use 'output_device' instead of the default output device +(as specified in em(~/.ecasound/ecasoundrc)). Syntax is same +as used by "-o" ecasound option (see ecasound(1) man page). +This option overrides the em(ECAPLAY_OUTPUT_DEVICE) environment +variable (more info below). + +dit(-p) +Play tracks in the playlist (in looped mode). See also +options em(-f, -l and -q). + +dit(-q) +Queue new tracks to the playlist. All filenames given on +the command-line will be added to the the playlist. It is +possible to queue new tracks while another instance of +ecaplay is using the playlist. See also options em(-f, -l +and -p). + +enddit() + +bf(ECASIGNALVIEW) + +Ecasignalview is meant for monitoring signal amplitude and peak +statistics. It accepts the following options: + +startdit() +dit(input) +The first option not starting with a '-' is interpreted +as an input string. This can be a device or a filename. All formats +supported by libecasound are accepted. Defaults to '/dev/dsp'. + +dit(output) +Similarly to input, second option not starting with a '-' +is interpreted as output. Defaults to 'null'. + +dit(-b:buffersize) +Buffersize in sample frames. Defaults to 128. + +dit(-c) +Enable cumulative mode. Counters are not reseted after refresh. +em(*deprecated*) + +dit(-d) +Enable debug mode. + +dit(-f:format_string) +Specify default audio format. See ecasound(1) for details. + +dit(-r:rate_msec) +Specify screen refresh rate in milliseconds. + +dit(-I) +Use linear scale for showing audio sample amplitude. + +dit(-L) +Use logarithmic scale for showing audio sample amplitude. + +dit(-G, -B, -M*, -r, -z) +Ecasound options use to modify the engine behaviour, see +ecasound(1) manpage for details. + +enddit() + +When ecasignalview is running, the following keyboard +commands can be used to control the operation (requires +system support for UNIX terminal interface control): + +startdit() +dit(spacebar) +Reset statistics (max-peak, avg-amplitude and clipped +samples count). + +dit(q or Q or Esc) +Quit ecasignalview. + +enddit() + +It is also possible to reset the max-peak and clipped-samples +counters by sending a SIGHUP signal to the process (i.e. +from another console: "killall -v -HUP ecasignalview"). + +More complete documentation for ecasignalview can be found +from "Ecasound User's Guide" (see ''http://www.eca.cx/ecasound +-> Documentation''). + +manpagesection(ENVIRONMENT) + + em(ECASOUND) + Path to the ecasound executable. Used by many ecatools. + + em(ECAPLAY_OUTPUT_DEVICE) + Device ecaplay should use for audio output. Same syntax + as for ecaplay/ecasound "-o" option. + +manpagefiles() + + em(~/.ecasound/ecasoundrc) + The default ecasound resource file. See ecasoundrc(5) + for details. + + em(~/.ecasound/ecaplay_queue) + File used to store the ecaplay playlist (one track per + line with full path). + +manpageseealso() + + ecasound (1), ecalength(1), "HTML docs in the Documentation subdirectory" + +manpageauthor() + + Kai Vehmanen, --- ecasound2.2-2.7.0.orig/Documentation/ecasound_osc_interface.txt +++ ecasound2.2-2.7.0/Documentation/ecasound_osc_interface.txt @@ -0,0 +1,64 @@ +:editor: -*- mode: fundamental; tab-width: 4; indent-tabs-mode: nil -*- +:version: 1 +:syntax: loosely follows restructured text, http://docutils.sourceforge.net/rst.html + +=========================================== +Ecasound Open Sound Control (OSC) Interface +=========================================== + +Introduction +~~~~~~~~~~~~ + +OSC support was added as to Ecasound version 2.7.0. However, +the OSC interface (as defined by this document), is still +considered experimental, and the interface may change in +later Ecasound versions. + +To understand Ecasound concepts such as "chain", "chain operator" and +"controller", please see the User's Guide at: +http://eca.cx/ecasound/Documentation/users_guide/html_uguide/users_guide.html + +Specification +~~~~~~~~~~~~~ + +Modify chain operator parameter +------------------------------- + +/ecasound/chain/NAME/op/OID/param/PID FVAL + +NAME = + A name of a chain in the currently connected chainsetup +OID = + The OIDth (1...N) chain operator in chain NAME. +PID = + The PIDth (1...N) parameter of chain op OID. +FVAL = + New parameter value as an OSC float32 value + +Related ECI action is 'cop-set' (see ecasound-iam(1) man page). + +Modify controller parameter +--------------------------- + +/ecasound/chain/NAME/ctrl/OID/param/PID FVAL + +NAME = + A name of a chain in the currently connected chainsetup +OID = + The OIDth (1...N) controller in chain NAME. +PID = + The PIDth (1...N) parameter of chain op OID. +FVAL = + New parameter value as an OSC float32 value + +Related ECI action is 'ctrlp-set' (see ecasound-iam(1) man page). + +References +~~~~~~~~~~ + +http://archive.cnmat.berkeley.edu/OpenSoundControl/OSC-spec.html + +Examples +~~~~~~~~ + +TBD --- ecasound2.2-2.7.0.orig/Documentation/ecasound_manpage.yo +++ ecasound2.2-2.7.0/Documentation/ecasound_manpage.yo @@ -0,0 +1,1159 @@ +mailto(kvehmanen -at- eca -dot- cx) + +manpage(ecasound) + (1) + (10.10.2009) + () + (Multimedia software) + +manpagename(ecasound)(sample editor, multitrack recorder, fx-processor, etc.) + +manpagesynopsis() + bf(ecasound) [ general_options ] { [ chain_setup ] [ effect_setup ] [ input_setup ] [ output_setup ] } + +manpagedescription() + +Ecasound is a software package designed for multitrack audio +processing. It can be used for simple tasks like audio playback, +recording and format conversions, as well as for multitrack effect +processing, mixing, recording and signal recycling. Ecasound supports +a wide range of audio inputs, outputs and effect algorithms. +Effects and audio objects can be combined in various ways, and their +parameters can be controlled by operator objects like oscillators +and MIDI-CCs. A versatile console mode user-interface is included +in the package. + +manpageoptions() + +Note! All options except those mentioned in em(ecasound options) and + em(Global options), can be used in ecasound chainsetup files (.ecs). + +startdit() + +COMMENT(----------------------------------------------------------------) +bf(ECASOUND OPTIONS) + +These options are parsed and handled by the ecasound frontend binary and +are not passed to backend library. This means that these options may +not work in other applications that use ecasound libraries for their +functionality. + +startdit() +dit(-c) +Starts ecasound in interactive mode. In interactive mode you can +control ecasound with simple commands ("start", "stop", "pause", +etc.). See url(ecasound-iam )(ecasound-iam_manpage.html). + +dit(-C) +Disables ecasound's interactive mode (see '-c' and '-K'). +enddit() + +dit(-D) +Print all debug information to stderr (unbuffered, plain output +without ncurses). + +dit(-s[:]chainsetup-file) +Create a new chainsetup from file 'chainsetup-file' and add +it to the current session. Chainsetup files commonly have +a filename ending to the '.ecs' extension. A chainsetup can +contain inputs, outputs, chains, effects, controllers -- i.e. +objects one one specific configuration of audio processing +elements. A session, on the other hand, is a collection of +one or more chainsetups. Only one of the chainsetups may be +connected (i.e. it can be run/processed). But it is possible +to have another chainsetup select (i.e. can be configured) +while other one is current connteced (i.e. running). + +dit(-E "cmd1 [[args] ; cmd2 args ; ... ; cmdN]") +Execute a set of Ecasound Interactive mode (EIAM) commands +at launch. These commands are executed immediately after +ecasound is started. If the command line contains sufficient +options to create a valid chainsetup that will be executed, +the launch commands are executed after the other command +line options are parsed, but before the processing engine +is started. Note that this command is a feature of +the ecasound frontend binary and not supported by +the library backend. This means that other clients may +not support the '-E' option, and also that the launch +commands are not saved as part of chainsetup or session +state. + +dit(--server) +Enables the so called NetECI mode, in which ecasound can +be controlled remotely over a socket connection. When +activated, clients can connect to the running ecasound +session, and use interactive mode commands to control and +observe ecasound processing. + +The NetECI protocol is defined in +url(Ecasound's Programmer Guide)(http://eca.cx/ecasound/Documentation/programmers_guide/ecasound_programmers_guide.html#neteci-various) + +One example client using this feature is ecamonitor(1). This +utility is included in the Ecasound distribution package (requires +a working Python environment). + +em(Warning!) If the machine running ecasound, is connected to +a public network, be sure to block ecasound's port in your +firewall! As there is no access control implemented for incoming +connections, anyone can otherwise connect, control and observe your +ecasound sessions. +This option replaces '--daemon' (deprecated in 2.6.0). + +dit(--server-tcp-port=NNN) +Set the TCP port used by the daemon mode. By default +ecasound will use port number em(2868). +This option replaces '--daemon-port' (deprecated in 2.6.0). + +dit(--no-server) +Disable ecasound's daemon mode. This is the default. +This option replaces '--nodaemon' (deprecated in 2.6.0). + +dit(--osc-udp-port=NNN) +Enables support for Open Source Control (OSC). Ecasound will listen +for incoming OSC messages on UDP port NNN. Ecasound's OSC interface +is documented at: + + +Note that OSC support is still experimental and the interface +might change in later versions of Ecasound. + +This option was added to ecasound 2.7.0. + +dit(--keep-running,-K) +Do not exit when processing is finished/stopped. Only affects +non-interactive operating mode (see -c/-C). +Option added to ecasound 2.4.2. + +dit(--help,-h) +Show this help. + +dit(--version) +Print version info. + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(GLOBAL OPTIONS) + +startdit() + +dit(-d, -dd, -ddd) +Increase the amount of printed debug messages. em(-d) adds +some verbosity, while em(-ddd) results in very detailed +output. + +dit(-d:debug_level) +Set the debug level mask to 'debug_level'. This a bitmasked value with +the following classes: errors (1), info (2), subsystems (4), module_names (8), +user_objects (16), system_objects 32, functions (64), continuous (128) and +eiam_return_values (256). Default is 271 (1+2+4+8+256). See sourcode +documentation for the ECA_LOGGER class for more detailed information. + +dit(-R[:]path-to-file) +Use ecasound resource file (see ecasoundrc man page) 'path-to-file' as +the only source of setting resource value. Specifying this option +will disable the normal policy of querying both global and user (if exists) +resource files. + +dit(-q) +Quiet mode, no output. Same as em(-d:0). + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(GENERAL CHAINSETUP OPTIONS) +startdit() + +dit(-a:chainname1, chainname2, ...) +Selects active signal chains. All inputs and outputs following +this '-a' option are assigned to selected chains (until a new -a +option is specified). When adding effects, controllers and other +chain operators, only one chain can be selected at a time. If no -a option +has been given, chain 'default' is used instead when adding objects. +Chain name 'all' is also reserved. It will cause all existing chains +to be selected. By giving multiple -a options, you can control to which +chains effects, inputs and outputs are assigned to. Look at the bf(EXAMPLES) +section for more detailed info about the usage of this option. + +dit(-n:name) +Sets the name of chainsetup to 'name'. If not specified, defaults +either to "command-line-setup" or to the file name from which +chainsetup was loaded. Whitespaces are not allowed. + +dit(-x) +Truncate outputs. All output object are opened in overwrite mode. +Any existing files will be truncated. + +dit(-X) +Open outputs for updating. Ecasound opens all outputs - if target +format allows it - in readwrite mode. + +dit(-z:feature) +Enables 'feature'. Most features can be disabled using notation +em(-z:nofeature). '-z:db,dbsize' enables double-buffering for audio +objects that support it (dbsize=0 for default, otherwise buffer +size in sample frames). '-z:nodb' disables double-buffering. +'-z:intbuf' and '-z:nointbuf' control whether extra internal buffering +is allowed for realtime devices. Disabling this can reduce +latency times in some situations. With '-z:xruns', processing will be +halted if an under/overrun occurs. '-z:multitrack' and +'z:nomultitrack' can be used to force ecasound to enable or disable +multitrack-mode. In rare cases you may want to explicitly specify +the recording offset with '-z:multitrack,offset-in-samples'. The +offset is the amount of samples skipped when recording from +real-time inputs. '-z:psr' enables the em(precise-sample-rates) mode +for OSS-devices. '-z:mixmode,sum' enables mixing mode where channels +are mixed by summing all channels. The default is '-z:mixmode,avg', +in which channels are mixed by averaging. Mixmode selection was first +added to ecasound 2.4.0. +See url(ecasoundrc man page)(ecasoundrc_manpage.html). + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(CHAINSETUP BUFFERING AND PERFORMANCE OPTIONS) +startdit() + +dit(-B:buffering_mode) +Selects the default buffering mode. Mode is one of: 'auto' (default), +'nonrt', 'rt', 'rtlowlatency'. + +dit(-b:buffer size) +Sets the size of buffer in samples (must be an exponent of 2). This +is quite an important option. For real-time processing, you should +set this as low as possible to reduce the processing delay. Some +machines can handle buffer values as low as 64 and 128. In some +circumstances (for instance when using oscillator envelopes) small +buffer sizes will make envelopes act more smoothly. When not processing +in real-time (all inputs and outputs are normal files), values between +512 - 4096 often give better results. Default is 1024. + +dit(-r:sched_priority) +Use realtime scheduling policy (SCHED_FIFO). This is impossible if +ecasound doesn't have root priviledges. Beware! This gives better +performance, but can cause total lock-ups if something goes wrong. +The 'sched_priority' can be omitted (0=omitted). If given, +this is the static priority to the highest priority ecasound thread. +Other ecasound threads run with priority 'sched_priority-1...n'. +Value '-1' can be used to disable raised-priority mode. + +dit(-z:feature) +Relevant features are -z:db,xxx (-z:nodb) and -z:intbuf (-z:nointbuf). +See section em(General chainsetup options) for details. + +enddit() + + +COMMENT(----------------------------------------------------------------) +bf(PROCESSING CONTROL) +startdit() +dit(-t:seconds) +Sets processing time in seconds (doesn't have to be an integer value). +If processing time isn't set, engine stops when all inputs are +finished. This option is equivalent to the 'cs-set-length' EIAM +command. A special-case value of '-1' will set the chainsetup length +according to the longest input object. + +dit(-tl) +Enables looping. When processing is finished, engine will start +again from beginning. This option is equivalent to the 'cs-loop' +EIAM command. + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(INPUT/OUTPUT SETUP) + +See url(ecasound user's guide)(users_guide/html_uguide/users_guide.html) for +more detailed documentation. + +startdit() +dit(-G:mgrtype,optstring) +Sets options for audio object manager type 'mgrtype'. +For available options, see "OBJECT TYPE SPECIFIC NOTES" below. + +dit(-f:sample_format,channel,sample-rate,interleaving) +Sets the audio stream parameters for subsequent audio objects. +To set different parameters for different audio objects, multiple +'-f' options have to be specified (note the ordering, the '-f' +options should precede the audio objects for them to have any +effect). See documentation for '-i' and '-o' options. + +When an audio object is opened (e.g. a file or sound device +is opened, or connection is made to a sound server), the audio +stream parameters are passed to the object. It should be noted that +not all audio objects allow to set any or all of the parameters. +For instance when opening existing audio files, many file formats +have a header describing the file audio parameters. In +these cases the audio file header overrides the parameters +passed with '-f' option. Similarly when creating JACK inputs and +outputs, the JACK server mandates the sampling rate and sample +format. + +If no '-f' option is specified, or some of the argument fields +are left empty (e.g. '-f:,2,44100'), ecasound will use default values. These +default values are defined in ecasoundrc configuration file. See +ecasoundrc(5) manual page. + +Note that ecasound opens out files by default in update mode. +Unless option '-x' (overwrite outputs) option is given, +audio parameters of an existing audio file take preference over +the params set with '-f'. + +Sample format is given as a formatted string. The first letter is +either "u", "s" and "f" (unsigned, signed, floating point). The +following number specifies sample size in bits. If sample is +little endian, "_le" is added to the end. Similarly if big endian, +"_be" is added. If endianess is not specified, host byte-order is used. +Currently supported formats are "u8" (same as "8"), "s16_le" (same +as "16"), "s16_be", "s24_le", "s24_be", "s32_le", "s32_be", "f32_le" +and "f32_be". An empty string "" picks the system default sample +format. + +The 4th parameter defines the channel layout. The available +options are 'i' (interleaved' and 'n' (noninterleaved). With +the noninterleaved setting, ecasound will process samples +one channel at a time, and the blocksize is set with '-b'. +The default setting is 'i'. + +dit(-y:seconds) +Sets starting position for last specified input/output. If +you need more flexible control over audio objects, you should +use the em(.ewf) format. + +dit(-i[:]input-file-or-device[,params]) +Specifies a new input source that is connected to all selected chains (chains +are selected with '-a:...'). Connecting multiple inputs to the same chain is +not possible, but one input can be connected to multiple chains. Input can be +a a file, device or some other audio object (see below). If the input is +a file, its type is determined using the file name extension. If the object +name contains any commas, the name must be enclosed in backquotes to avoid +confusing the parser. Currently supported formats are RIFF WAVE files (.wav), +audio-cd tracks (.cdr), ecasound EWF files (.ewf), RAW audio data (.raw) and +MPEG audio files (.mp2,.mp3). More audio formats are supported via libaudiofile +and libsndfile libraries (see documentation below). MikMod is also supported (.xm, +.mod, .s3m, .it, etc). MIDI files (.mid) are supported using Timidity++. +Similarly Ogg Vorbis (.ogg) can be read, and written if ogg123 and vorbize tools +are installed; FLAC files (.flac) with flac command-line tools or using +libsndfile; and AAC files (.aac/.m4a/.mp4) with faad2/faac tools. Supported +realtime devices are OSS audio devices (/dev/dsp*), ALSA audio and loopback +devices and JACK audio subsystem. If no inputs are specified, the first +non-option (doesn't start with '-') command line argument is considered +to be an input. + +dit(-o[:]output-file-or-device[,params]) +Works in the same way as the -i option. If no outputs are specified, +the default output device is used (see ~/.ecasoundrc). If the object +name contains any commas, the name must be enclosed in backquotes to +avoid confusing the parser. Note, many object types do not support +output (e.g. MikMod, MIDI and many others). + +em(OBJECT TYPE SPECIFIC NOTES) +dit(ALSA devices - 'alsa') +When using ALSA drivers, instead of a device filename, you need to +use the following option syntax: bf(-i[:]alsa,pcm_device_name). + +dit(ALSA direct-hw and plugin access - 'alsahw', 'alsaplugin') +It's also possible to use a specific card and device combination +using the following notation: bf(-i[:]alsahw,card_number,device_number,subdevice_number). +Another option is the ALSA PCM plugin layer. It works just like +the normal ALSA pcm-devices, but with automatic channel count and +sample format conversions. Option syntax is +bf(-i[:]alsaplugin,card_number,device_number,subdevice_number). + +dit(aRts input/output - 'arts') +If enabled at compile-time, ecasound supports audio input and +output using aRts audio server. Option syntax is bf(-i:arts), +bf(-o:arts). + +dit(Audio file sequencing - 'audioloop', 'select', 'playat') +Ecasound provides a set of special audio object types that +can be used for temporal sequencing of audio files - i.e. looping, +playing only a select portion of a file, playing file at a spefific +time, and other such operation. + +Looping is possible with bf(-i:audioloop,file.ext,params). The +file name (or any object type understood by Ecasound) given +as the second parameter is played back continuously looping +back to the beginning when the end of file is reached. Any additional +parameters given are passed unaltered to the file object. +Parameters 3...N are passed as is to the child object (i.e. +"-i audioloop,foo.wav,bar1,bar2" will pass parameters +"bar1,bar2" to the "foo.wav" object. + +To select and use only a specific segment of an audio object, +the bf(-i:select,start-time,duration,file.ext,params) can +be used. This will play "duration" of "file.ext", starting at +"start-time". The time values should be given as seconds (e.g. +"2.25", or as samples (e.g. "25000sa"). Parameters 4...N are +passed as is to the child object. + +To play an audio object at a given moment in time, +the bf(-i:playat,play-at-time,file.ext,params) can be +used. This will play "file.ext" after position reaches +"play-at-time". The time values should be given as seconds (e.g. +"2.25", or as samples (e.g. "25000sa"). Parameters 2...N are +passed as is to the child object. + +dit(Ecasound Wave Files (EWF) - '*.ewf') +A special file format that allows to slice and loop full (or segments) +of audio files. This format is specific to Ecasound. +See url(ecasound user's guide)(users_guide/html_uguide/users_guide.html) for more +detailed information. + +See also audio object types 'audioloop', 'select' and 'playat'. + +dit(JACK input/outputs - Overview) +JACK is a low-latency audio server that can be used to connect +multiple independent audio application to each other. +It is different from other audio server efforts in that +it has been designed from the ground up to be suitable for low-latency +professional audio work. + +dit(JACK input/outputs - 'jack') +Ecasound provides multiple ways to communicate with JACK +servers. To create a JACK input or output object, one should use bf(-i jack) and +bf(-o jack). These create JACK client ports "ecasound:in_N" and +"ecasound:out_n" respectively ('N' is replaced by the channel number). +Ecasound automatically creates one JACK port for each channel (number +of channels is set with bf(-f:bits,channels,rate) option). + +It is important to note that by default JACK ports are not connected +anywhere (e.g. to soundcard input/outputs, or to other apps). One thus +has to connect the ports with an external program (e.g. "QJackCtl" +or "jack_connect"). + +dit(JACK input/outputs - 'jack,clientname,portprefix') +bf("jack,clientname") For simple use scanerios, ecasound provides a way to autoconnect +the ecasound ports. This can be done with by giving the peer client +name as the second parameter to the "jack" object, e.g. bf(-o jack,clientname). +As an example, bf(-o jack,system) will create an output that is +automatically connected to outputs of the default system soundcard. +The client parameter can be omitted, in which case no automatic +connections are made. + +If one needs to change the port prefix (e.g. "in" in client name +"ecasound:in_N"), the prefix can be specified as the third parameter to +"jack" object, e.g. bf(-o jack,,fxout). Also the third parameter can be +omitted, in which case the default prefixes "in" and "out" are used. + +dit(JACK input/outputs - 'jack_multi') +A variant of 'jack' object type is 'jack_multi'. The full object syntax +is bf(jack_multi,destport1,...,destportN). When a 'jack_multi' object +is connected to a JACK server, first channel of the object is connected +to JACK port 'destport1', second to 'destport2' and so forth. For +instance "-f:32,2,44100 -o jack_multi,foo:in,bar:in" +creates a stereo ecasound output object, with its left and right +channels routed to two difference JACK clients. The destination ports +must be active when the ecasound engine is launched, or otherwise +the connections cannot be established. If destination ports are not +specified for all channels, or zero length strings are given, those +ports are not connected at launch by ecasound. + +dit(JACK input/outputs - 'jack_alsa', 'jack_auto', 'jack_generic' (**deprecated since 2.6.0**)) +Ecasound 2.5 and older supported "jack_alsa", "jack_auto" and "jack_generic" object +types, but these are now replaced by a more generic "jack" interface, and thus are +now deprecated (they work but are no longer documented). + +dit(JACK input/outputs - client options) +Additionally global JACK options can be set using +bf(-G:jack,client_name,operation_mode) option. 'client_name' +is the name used when registering ecasound to the JACK system. +If 'operation_mode' is "notransport", ecasound will ignore +any transport state changes in the JACK-system; in mode +"send" it will send all start, stop and position-change events to +other JACK clients; in mode "recv" ecasound will follow JACK start, +stop and position-change events; and mode "sendrecv" (the default) +which is a combination of the two previous modes. + +More details about ecasound's JACK support can be found +from Ecasound User's Guide. + +dit(Libaudiofile - 'audiofile') +If libaudiofile support was enabled at compile-time, this +option allows you to force Ecasound to use libaudiofile +for reading/writing a certain audio file. Option syntax +is bf(-i:audiofile,foobar.ext) (same for bf(-o)). + +dit(Libsndfile - 'sndfile') +If libsndfile support was enabled at compile-time, this +option allows you to force Ecasound to use libsndfile +for reading/writing a certain audio file. Option syntax +is bf(-i:sndfile,foobar.ext[,.format-ext]) (same for bf(-o)). +The optional third parameter "format" can be used to +override the audio format (for example you can create an +AIFF file with filename "foo.wav"). + +dit(Loop device - 'loop') +Loop devices make it possible to route (loop back) data between +chains. Option syntax is bf(-[io][:]loop,tag). If you add +a loop output with tag '1', all data written to this output is routed +to any loop input with tag '1'. The tag can be either numerical +(e.g. '-i:loop,1') or a string (e.g. "-i:loop,vocals"). Like +with other input/output objects, you can attach the same loop +device to multiple chains and this way split/mix the signal. + +Note: this 'loop' device is different from 'audioloop' (latter +added to ecasound v2.5.0). + +dit(Mikmod - 'mikmod') +If mikmod support was enabled at compile-time, this +option allows you to force Ecasound to use Mikmod +for reading/writing a certain module file. Option syntax +is bf(-i:mikmod,foobar.ext). + +dit(Null inputs/outputs - 'null') +If you specify "null" or "/dev/null" as the input or output, +a null audio device is created. This is useful if you just want +to analyze sample data without writing it to a file. There's +also a realtime variant, "rtnull", which behaves just like "null" +objects, except all i/o is done at realtime speed. + +dit(Resample - 'resample') +Object type 'resample' can be used to resample audio +object's audio data to match the sampling rate used +in the active chainsetup. For example, +bf(ecasound -f:16,2,44100 -i resample,22050,foo.wav -o /dev/dsp), +will resample file from 22.05kHz to 44.1kHz and write the +result to the soundcard device. Child sampling rate can be +replaced with keyword 'auto'. In this case ecasound will try +to query the child object for its sampling rate. This works with +files formats such as .wav which store meta information about +the audio file format. To use 'auto' in the previous example, +bf(ecasound -f:16,2,44100 -i resample,auto,foo.wav -o /dev/dsp). + +Parameters 4...N are passed as is to the child object (i.e. +"-i resample,22050,foo.wav,bar1,bar2" will pass parameters +"bar1,bar2" to the "foo.wav" object. + +If ecasound was compiled with support for libsamplerate, you can +use 'resample-hq' to use the highest quality resampling algorithm +available. To force ecasound to use the internal resampler, +'resampler-lq' (low-quality) can be used. + +dit(Reverse - 'reverse') +Object type 'reverse' can be used to reverse audio +data coming from an audio object. As an example, +bf(ecasound -i reverse,foo.wav -o /dev/dsp) will play +'foo.wav' backwards. Reversing output objects is not +supported. Note! Trying to reverse audio object types with really +slow seek operation (like mp3), works extremely badly. +Try converting to an uncompressed format (wav or raw) +first, and then do reversation. + +Parameters 3...N are passed as is to the child object (i.e. +"-i reverse,foo.wav,bar1,bar2" will pass parameters +"bar1,bar2" to the "foo.wav" object. + +dit(System standard streams and named pipes - 'stdin', 'stdout') +You can use standard streams (stdin and stdout) by giving bf(stdin) +or bf(stdout) as the file name. Audio data is assumed to be in +raw/headerless (.raw) format. If you want to use named pipes, +create them with the proper file name extension before use. + +dit(Tone generator - 'tone') +To generate a test tone, input bf(-i:tone,type,freq,duration-secs) +can be used. Parameter 'type' specifies the tone type: currently +only 'sine' is supported. The 'freq' parameter sets the frequency +of the generated tone and 'duration-secs' the length of the generated +stream. Specifying zero, or a negative value, as the duration will +produce an infinite stream. This feature was first added to Ecasound +2.4.7. + +dit(Typeselect - 'typeselect') +The special 'typeselect' object type can be used to override +how ecasound maps filename extensions and object types. For +instance bf(ecasound -i typeselect,.mp3,an_mp3_file.wav -o /dev/dsp). +would play the file 'an_mp3_file.wav' as an mp3-file and not +as an wav-file as would happen without typeselect. + +Parameters 4...N are passed as is to the child object (i.e. +"-i typeselect,.au,foo.wav,bar1,bar2" will pass parameters +"bar1,bar2" to the "foo.wav" object. + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(MIDI SETUP) + +startdit() +dit(MIDI I/O devices - general) +If no MIDI-device is specified, the default MIDI-device is +used (see ecasoundrc(5)). + +dit(-Md:rawmidi,device_name) +Add a rawmidi MIDI I/O device to the setup. 'device_name' can be anything +that can be accessed using the normal UNIX file operations and +produces raw MIDI bytes. Valid devices are for example OSS rawmidi +devices (/dev/midi00), ALSA rawmidi devices (/dev/snd/midiC2D0), named +pipes (see mkfifo man page), and normal files. + +dit(-Md:alsaseq,sequencer-port) +Adds a ALSA MIDI sequencer port to the setup. 'sequencer-port' identifies +a port to connect to. It can be numerical (e.g. 128:1), or a client +name (e.g. "KMidimon"). + +dit(-Mms:device_id) +Sends MMC start ("Deferred Play") and stop ("Stop") with +device ID 'device_id'. + +While Ecasound does not directly support syncing transport state +to incoming MMC messages, this can be achieved by connecting Ecasound +to JACK input/outputs, and using a tool such as JackMMC and JackCtlMMC ( +see ) to convert MMC messages +into JACK transport change events. + +dit(-Mss) +Sends MIDI-sync (i.e. "MIDI Start" and "MIDI Stop" system realtime +messages) .to the selected MIDI-device. Notice that as Ecasound will +not send em(MIDI-clock), but only the em(start) and em(stop) messages. + +enddit() + +COMMENT(----------------------------------------------------------------) +bf(EFFECT SETUP) + +em(PRESETS) + +Ecasound has a powerful effect preset system that allows you create +new effects by combining basic effects and controllers. See +url(ecasound user's guide)(users_guide/html_uguide/users_guide.html) for more +detailed information. + +startdit() + +dit(-pf:preset_file.eep) +Uses the first preset found from file 'preset_file.eep' as +a chain operator. + +dit(-pn:preset_name) +Find preset 'preset_name' from global preset database and use +it as a chain operator. See ecasoundrc man page for info about the +preset database. + +enddit() + +em(SIGNAL ANALYSIS) + +startdit() + +dit(-ev) +Analyzes sample data to find out how much the signal can +be amplified without clipping. The resulting percent value +can be used as a parameter to '-ea' (amplify). A statistical +summary, containing info about the stereo-image and +distribution of sample values, is printed out at the end +of processing. + +dit(-evp) +Peak amplitude watcher. Maintains peak information for +each processed channels. Peak information is resetted +on every read. + +dit(-ezf) +Finds the optimal value for DC-adjusting. You can use the result +as a parameter to -ezx effect. + +enddit() + +em(GENERAL SIGNAL PROCESSING ALGORITHMS) +startdit() +dit(-eS:stamp-id) +Audio stamp. Takes a snapshot of passing audio data and stores +it using id 'stamp-id' (integer number). This data can later be +used by controllers and other operators. + +dit(-ea:amplify%) +Adjusts the signal amplitude to 'amplify%' percent (linear scale, i.e. +individual samples are multiplied by 'amplify%/100'). See also +'-eadb'. + +dit(-eac:amplify%,channel) +Amplifies signal of channel 'channel' by amplify-% percent (linear +scale, i.e. individual samples are multiplied by 'amplify%/100'). +'channel' ranges from 1...n where n is the total number of channels. +See also '-eadb'. + +dit(-eadb:gain-dB[,channel]) +Adjusts signal level by 'gain-dB', with a gain of 0dB having no effect +to the signal, negative gains attenuating the signal and positive +gain values amplifying it. The 'channel' parameter (1...n) is optional. +If 'channel' parameter is specified, and its value is nonzero, gain is +only applied to the given channel (1...n). + +dit(-eaw:amplify%,max-clipped-samples) +Amplifies signal by amplify-% percent (linear scale, i.e. individual +samples are multiplied by 'amplify%/100'). If number of consecutive +clipped samples (resulting sample value is outside the nominal +[-1,1] range), a warning will be issued. + +dit(-eal:limit-%) +Limiter effect. Limits audio level to 'limit-%' (linear scale) with +values equal or greater than 100% resulting in no change to +the signal. + +dit(-ec:rate,threshold-%) +Compressor (a simple one). 'rate' is the compression rate in +decibels ('rate' dB change in input signal causes 1dB change +in output). 'threshold' varies between 0.0 (silence) and +1.0 (max amplitude). + +dit(-eca:peak-level-%, release-time-sec, fast-crate, crate) +A more advanced compressor (original algorithm by John S. Dyson). +If you give a value of 0 to any parameter, the default is used. +'peak-level-%' essentially specifies how hard the peak limiter +is pushed. The default of 69% is good. 'release_time' is given +in seconds. This compressor is very sophisticated, and actually +the release time is complex. This is one of the dominant release +time controls, but the actual release time is dependent on a lot of +factors regarding the dynamics of the audio in. 'fastrate' is the +compression ratio for the fast compressor. This is not really +the compression ratio. Value of 1.0 is infinity to one, while the +default 0.50 is 2:1. Another really good value is special cased in +the code: 0.25 is somewhat less than 2:1, and sounds super smooth. +'rate' is the compression ratio for the entire compressor chain. +The default is 1.0, and holds the volume very constant without many nasty +side effects. However the dynamics in music are severely restricted, +and a value of 0.5 might keep the music more intact. + +dit(-enm:threshold-level-%,pre-hold-time-msec,attack-time-msec,post-hold-time-msec,release-time-msec) +Noise gate. Supports multichannel processing (each channel +processed separately). When signal amplitude falls below +'threshold_level_%' percent (100% means maximum amplitude), gate +is activated. If the signal stays below the threshold for +'th_time' ms, it's faded out during the attack phase of +'attack' ms. If the signal raises above the 'threshold_level' +and stays there over 'hold' ms the gate is released during +'release' ms. + +dit(-ei:pitch-shift-%) +Pitch shifter. Modifies audio pitch by altering its length. + +dit(-epp:right-%) +Stereo panner. Changes the relative balance between the first +two channels. When 'right-%' is 0, only signal on the left +(1st) channel is passed through. Similarly if it is '100', +only right (2nd) channel is let through. + +dit(-ezx:channel-count,delta-ch1,...,delta-chN) +Adjusts the signal DC by 'delta-chX', where X is the +channel number. Use -ezf to find the optimal delta +values. + +enddit() + +em(ENVELOPE MODULATION) +startdit() + +dit(-eemb:bpm,on-time-%) +Pulse gate (pulse frequency given as beats-per-minute). + +dit(-eemp:freq-Hz,on-time-%) +Pulse gate. + +dit(-eemt:bpm,depth-%) +Tremolo effect (tremolo speed given as beats-per-minute). + +enddit() + +em(FILTER EFFECTS) +startdit() +dit(-ef1:center_freq, width) +Resonant bandpass filter. 'center_freq' is the center frequency. Width +is specified in Hz. + +dit(-ef3:cutoff_freq, reso, gain) +Resonant lowpass filter. 'cutoffr_freq' is the filter cutoff +frequency. 'reso' means resonance. Usually the best values for +resonance are between 1.0 and 2.0, but you can use even bigger values. +'gain' is the overall gain-factor. It's a simple multiplier (1.0 +is the normal level). With high resonance values it often is useful +to reduce the gain value. + +dit(-ef4:cutoff, resonance) +Resonant lowpass filter (3rd-order, 36dB, original algorithm by Stefan +M. Fendt). Simulates an analog active RC-lowpass design. Cutoff is a +value between [0,1], while resonance is between [0,infinity). + +dit(-efa:delay-samples,feedback-%) +Allpass filter. Passes all frequencies with no change in amplitude. +However, at the same time it imposes a frequency-dependent +phase-shift. + +dit(-efc:delay-samples,radius) +Comb filter. Allows the spikes of the comb to pass through. +Value of 'radius' should be between [0, 1.0). + +dit(-efb:center-freq,width) +Bandpass filter. 'center_freq' is the center frequency. Width +is specified in Hz. + +dit(-efh:cutoff-freq) +Highpass filter. Only frequencies above 'cutoff_freq' are passed +through. + +dit(-efi:delay-samples,radius) +Inverse comb filter. Filters out the spikes of the comb. There +are 'delay_in_samples-2' spikes. Value of 'radius' should be +between [0, 1.0). The closer it is to the maximum value, +the deeper the dips of the comb are. + +dit(-efl:cutoff-freq) +Lowpass filter. Only frequencies below 'cutoff_freq' are passed +through. + +dit(-efr:center-freq,width) +Bandreject filter. 'center_freq' is the center frequency. Width +is specified in Hz. + +dit(-efs:center-freq,width) +Resonator. 'center_freq' is the center frequency. Width is specified +in Hz. Basicly just another resonating bandpass filter. + +enddit() + +em(CHANNEL MIXING / ROUTING) +startdit() + +COMMENT(Rough order: common operators first, not alphabetical) + +dit(-chcopy:from-channel, to-channel) +Copy channel 'from_channel' to 'to_channel'. If 'to_channel' +doesn't exist, it is created. Channel indexing starts from 1. +Option added to ecasound 2.4.5. + +dit(-chmove:from-channel, to-channel) +Copy channel 'from_channel' to 'to_channel', and mutes the source +channel 'from_channel'. Channel indexing starts from 1. +Option added to ecasound 2.4.5. + +dit(-chorder:ch1,...,chN) +Reorder, omit and/r duplicate chain channels. The resulting +audio stream has total of 'N' channels. Each parameter specifies +the source channel to use for given output channel. As an +example, '-chorder:2,1' would reverse the channels of +a stereo stream ('out1,out2' = 'in2,in1'). Specifying the same +source channel multiple times is allowed. For example, '-chorder:2,2' +would route the second channel to both two output channels +('out1,out2' = 'in2,in2'). If 'chX' is zero, the given channel 'X' +will be muted in the output stream. Option added to ecasound 2.7.0. + +dit(-chmix:to-channel) +Mix all source channels to channel 'to_channel'. If 'to_channel' +doesn't exist, it is created. Channel indexing starts from 1. +Option added to ecasound 2.4.5. + +dit(-chmute:channel) +Mutes the channel 'channel'. Channel indexing starts from 1. +Option added to ecasound 2.4.5. + +dit(-erc:from-channel,to-channel) +Deprecated, see em(-chcopy). + +dit(-erm:to-channel) +Deprecated, see em(-chmix). + +enddit() + +em(TIME-BASED EFFECTS) +startdit() + +dit(-etc:delay-time-msec,variance-time-samples,feedback-%,lfo-freq) +Chorus. + +dit(-etd:delay-time-msec,surround-mode,number-of-delays,mix-%,feedback-%) +Delay effect. 'delay time' is the delay time in milliseconds. +'surround-mode' is a integer with following meanings: 0 = normal, +1 = surround, 2 = stereo-spread. 'number_of_delays' should be +obvious. Beware that large number of delays and huge delay times +need a lot of CPU power. 'mix-%' determines how much effected (wet) +signal is mixed to the original. 'feedback-%' represents how much of +the signal is recycled in each delay or, if you prefer, at what rate +the repeated snippet of delayed audio fades. Note that sufficiently +low feedback values may result in a number of audible repetitions +lesser than what you have specified for 'number_of_delays', especially +if you have set a low value for 'mix-%'. By default the value for this +parameter is 100% (No signal loss.). + +dit(-ete:room_size,feedback-%,wet-%) +A more advanced reverb effect (original algorithm by Stefan M. Fendt). +'room_size' is given in meters, 'feedback-%' is the feedback level +given in percents and 'wet-%' is the amount of reverbed signal added +to the original signal. + +dit(-etf:delay-time-msec) +Fake-stereo effect. The input signal is summed to mono. The +original signal goes to the left channels while a delayed +version (with delay of 'delay time' milliseconds) is goes to +the right. With a delay time of 1-40 milliseconds this +adds a stereo-feel to mono-signals. + +dit(-etl:delay-time-msec,variance-time-samples,feedback-%,lfo-freq) +Flanger. + +dit(-etm:delay-time-msec,number-of-delays,mix-%) +Multitap delay. 'delay time' is the delay time in milliseconds. +'number_of_delays' should be obvious. 'mix-%' determines how much +effected (wet) signal is mixed to the original. + +dit(-etp:delay-time-msec,variance-time-samples,feedback-%,lfo-freq) +Phaser. + +dit(-etr:delay-time,surround-mode,feedback-%) +Reverb effect. 'delay time' is the delay time in milliseconds. +If 'surround-mode' is 'surround', reverbed signal moves around the +stereo image. 'feedback-%' determines how much effected (wet) +signal is fed back to the reverb. + +enddit() + +em(LADSPA-PLUGINS) +startdit() +dit(-el:plugin_unique_name,param-1,...,param-N) +Ecasound supports LADSPA-effect plugins (Linux Audio Developer's Simple +Plugin API). Plugins are located in shared library (.so) files in +/usr/local/share/ladspa (configured in ecasoundrc man page). One shared +library file can contain multiple plugin objects, but every plugin +has a unique plugin name. This name is used for selecting plugins. +See url(LAD mailing list web site)(http://www.linuxdj.com/audio/lad) for +more info about LADSPA. Other useful sites are url(LADSPA home +page)(http://www.ladspa.org) and url(LADSPA +documentation)(http://www.ffem.org/gdam/ladspa-doc/ladspa.html). + +dit(-eli:plugin_unique_number,param-1,...,param-N) +Same as above expect plugin's unique id-number is used. It +is guaranteed that these id-numbers are unique among all +LADSPA plugins. + +enddit() + +em(GATE SETUP) + +startdit() + +dit(-gc:start-time,len) +Time crop gate. Initially gate is closed. After 'start-time' seconds +has elapsed, gate opens and remains open for 'len' seconds. When +closed, passing audio buffers are trucated to zero length. + +dit(-ge:open-threshold-%,close-thold-%,volume-mode,reopen-count) +Threshold gate. Initially gate is closed. It is opened when volume +goes over 'othreshold' percent. After this, if volume drops below +'cthold' percent, gate is closed and won't be opened again, unless the +'reopen-count' is set to anything other than zero. +If 'value_mode' is 'rms', average RMS volume is used. Otherwise +peak average is used. When closed, passing audio buffers are trucated +to zero length. +If the 'reopen-count' is set to a positive number, then the gate will +restart its operation that many times. So for example, a reopen count +of 1 will cause up to 2 openings of the gate. A negative value for 'reopen-count' +will result in the gate reopening indefinitely. The 'reopen-count' is invaluable +in recording vinyl and tapes, where you can set things up and then recording +starts whenever the needle is on the vinyl, and stops when it's off. As many sides +as you like can be recorded in one session. You will need to experiment with +buffer lengths and start/stop levels to get reliable settings for your equipment. + +enddit() + +COMMENT(----------------------------------------------------------------) +em(CONTROL ENVELOPE SETUP) +startdit() + +Controllers can be used to dynamically change effect parameters +during processing. All controllers are attached to the selected +(=usually the last specified effect/controller) effect. The first +three parameters are common for all controllers. 'fx_param' +specifies the parameter to be controlled. Value '1' means +the first parameter, '2' the second and so on. 'start_value' +and 'end_value' set the value range. For examples, look at the +the bf(EXAMPLES) section. + +dit(-kos:fx-param,start-value,end-value,freq,i-phase) +Sine oscillator with frequency of 'freq' Hz and initial phase +of 'i_phase' times pi. + +dit(-kog:fx-param,freq,mode,point-pairs,start-value,end-value,pos1,value1,...) +Generic oscillator. Frequency 'freq' Hz, mode either '0' for +static values or '1' for linear interpolation. 'point-pairs' +specifies the number of 'posN' - 'valueN' pairs to include. +'start-value' and 'end-value' are used as border values. +All 'posN' and 'valueN' must be between 0.0 and 1.0. Also, +for all 'posN' values 'pos1 < pos2 < ... < posN' must be true. + +dit(-kf:fx-param,start-value,end-value,freq,mode,genosc-number) +Generic oscillator. 'genosc_number' is the number of the +oscillator preset to be loaded. Mode is either '0' for +static values or '1' for linear interpolation. The location for +the preset file is taken from ./ecasoundrc (see em(ecasoundrc man page)). + +dit(-kl:fx-param,start-value,end-value,time-seconds) +Linear envelope that starts from 'start_value' and linearly +changes to 'end_value' during 'time_in_seconds'. Can +be used for fadeins and fadeouts. + +dit(-kl2:fx-param,start-value,end-value,1st-stage-length-sec,2nd-stage-length-sec) +Two-stage linear envelope, a more versatile tool for doing fade-ins +and fade-outs. Stays at 'start_value' for '1st_stage_length' seconds +and then linearly changes towards 'end_value' during +'2nd_stage_length' seconds. + +dit(-klg:fx-param,low-value,high-value,point_count,pos1,value1,...,posN,valueN) +Generic linear envelope. This controller source can be +used to map custom envelopes to chain operator parameters. Number of +envelope points is specified in 'point_count'. Each envelope point +consists of a position and a matching value. Number of pairs must +match 'point_count' (i.e. 'N==point_count'). The 'posX' parameters are given +as seconds (from start of the stream). The envelope points are specified as +float values in range '[0,1]'. Before envelope values are mapped to operator +parameters, they are mapped to the target range of '[low-value,high-value]'. E.g. +a value of '0' will set operator parameter to 'low-value' and a value of +'1' will set it to 'high-value'. For the initial segment '[0,pos1]', the envelope +will output value of 'value1' (e.g. 'low-value'). + +dit(-km:fx-param,start-value,end-value,controller,channel) +MIDI continuous controller (control change messages). +Messages on the MIDI-channel 'channel' that are coming from +controller number 'controller' are used as the controller +source. As recommended by the MIDI-specification, channel +numbering goes from 1 to 16. Possible controller numbers +are values from 0 to 127. The MIDI-device where bytes +are read from can be specified using em(-Md) option. +Otherwise the default MIDI-device is used as specified in +em(~ecasound/ecasoundrc) (see em(ecasoundrc man page)). +Defaults to em(/dev/midi). + +dit(-ksv:fx-param,start-value,end-value,stamp-id,rms-toggle) +Volume analyze controller. Analyzes the audio stored in +stamp 'stamp-id' (see '-eS:id' docs), and creates +control data based on the results. If 'rms-toggle' is non-zero, +RMS-volume is used to calculate the control value. Otherwise +average peak-amplitude is used. + +dit(-kx) +This is a special switch that can be used when you need +to control controller parameters with another controller. +When you specify em(-kx), the last specified controller +will be set as the control target. Then you just add +another controller as usual. +enddit() + +COMMENT(----------------------------------------------------------------) +bf(INTERACTIVE MODE) + +See em(ecasound-iam(1)) man page. + +enddit() + +manpagesection(ENVIRONMENT) + + startdit() + dit(ECASOUND) + If defined, some utility programs and scripts will use + the em(ECASOUND) environment as the default path to + ecasound executable. + + dit(ECASOUND_LOGFILE) + Output all debugging messages to a separate log file. If defined, + em(ECASOUND_LOGFILE) defines the logfile path. This is a good tool for + debugging ECI/EIAM scripts and applications. + + dit(ECASOUND_LOGLEVEL) + Select which messages are written to the logfile defined by + em(ECASOUND_LOGFILE). The syntax for em(-d:level) is used. If not + defined, all messages are written. Defaults to -d:319 (everything else + but 'functions (64)' and 'continuous (128)' class messages). + + dit(COLUMNS) + Ecasound honors the em(COLUMNS) environment variable when + formatting printed trace messages. If em(COLUMNS) is not set, + a default of 74 is used. + enddit() + +manpagesection(RETURN VALUES) + + In interactive mode, ecasound always returns zero. + + In non-interactive (batch) mode, a non-zero value is returned + for the following errors: + + startdit() + dit(1) + Unable to create a valid chainsetup with the given parameters. Can be + caused by invalid option syntax, etc. + + dit(2) + Unable to start processing. This can be caused by insufficient file + permissions, inability to access some system resources, etc. + + dit(3) + Error during processing. Possible causes: output object has run + out of free disk space, etc. + + dit(4) + Error during process termination and/or cleanup. See section + on 'SIGNALS' for further details. + +manpagesection(SIGNALS) + + When ecasound receives any of the POSIX signals SIGINT (ctrl-c), + SIGHUP, SIGTERM or SIGQUIT, normal cleanup and exit procedure is + initiated. Here normal exit means that e.g. file headers are + updated before closing, helper processes are terminated in normal + way, and so forth. + + If, while doing the cleanup described above, ecasound receives + another signal (of the same set of POSIX signals), ecasound + will skip the normal cleanup procedure, and terminate + immediately. Any remaining cleanup tasks will be skipped. + Depending on the runtime state and configuration, this brute + force exit may have some side-effects. Ecasound will return + exit code of '4' if normal cleanup was skipped. + + Special case handling is applied to the SIGINT (ctrl-c) signal. + If a SIGINT signal is received during the cleanup procedure, + ecasound will ignore the signal once, and emit a notice to 'stderr' + that cleanup is already in progress. Any subsequent SIGINT signals + will no longer get special handling, and instead process will + terminate immediately (and possibly without proper cleanup). + +manpagefiles() + + em(~/.ecasound) + The default directory for ecasound user resource files. + See the url(ecasoundrc (5) man page)(ecasoundrc_manpage.html) man page. + + em(*.ecs) + Ecasound Chainsetup files. Syntax is more or less the + same as with command-line arguments. + + em(*.ecp) + Ecasound Chain Preset files. Used for storing effect + and chain operator presets. See url(ecasound user's guide)(users_guide/html_uguide/users_guide.html) for + more better documentation. + + em(*.ews) + Ecasound Wave Stats. These files are used to cache + waveform data. + + +manpagesection(EXAMPLES) + + Examples of how to perform common tasks with ecasound can + be found at + url(http://eca.cx/ecasound/Documentation/examples.html)(http://eca.cx/ecasound/Documentation/examples.html). + +manpageseealso() + + url(ecatools (1) man page)(ecatools_manpage.html), + url(ecasound-iam (1) man page)(ecasound-iam_manpage.html) + url(ecasoundrc (5) man page)(ecasoundrc_manpage.html), + url("HTML docs in the Documentation subdirectory")(index.html) + +manpagebugs() + + See file BUGS. If ecasound behaves weirdly, try to + increase the debug level to see what's going on. + +manpageauthor() + + Kai Vehmanen, --- ecasound2.2-2.7.0.orig/Documentation/ecalength_manpage.yo +++ ecasound2.2-2.7.0/Documentation/ecalength_manpage.yo @@ -0,0 +1,75 @@ +mailto(observer .at. colba .dot. net) + +manpage(ecalength) + (1) + (18.04.2004) + () + (Multimedia software) + +manpagename(ecalength)(prints audio file lenght and other information) + +manpagesynopsis() + bf(ecalength) [-ahtsfmbcr] FILE1 [FILE2] [FILEn] + +manpagedescription() + +This is ecalength, a few lines of code pompously named so because they +let one retrieve the length of an audio file from the command line +using ecasound's engine. + +Limitations: +startdit() +dit()- With files without header information (raw files), ecalength will only work + correctly if the audio file is at a sampling rate of 44100 hz. + (Addressed with the -a switch.) +dit() - It is not foolproof, feeding it with something other than an audio + file WILL result in ugly things being spewed back. + (A bit better) +dit() - A thousand more that I haven't thought of. +enddit() + +manpageoptions() + +startdit() +dit(-h) +Prints this usage message. (help) + +dit(-a[:]bits,channels,rate) +Changes the format assumed by default for headerless data. (adjust) + +dit(-t) +Prints the summed length of all the files processed. (total) +(Ignored if with -s) + +dit(-s) +Enables script mode: One info type per file per line. (script) +(Defaults to length in secs.) + +dit(-f) +With -s will return the format string as info, alone it will +add it to the main display. (format) + +dit(-b) +If -s and -f are enabled with this the info printed will be +the sample's bitwidth. (bits) + +dit(-c) +If -s and -f are enabled with this the info printed will be +the channel count. (channel count) + +dit(-r) +If -s and -f are enabled with this the info printed will be +the sampling rate. (rate) + +dit(-m) +Will print human computable time as in main display but in +batch fashion. (minutes) (Only with -s) +enddit() + +manpageseealso() + + ecasound(1), ecatools(1) + +manpageauthor() + +S.Massy, --- ecasound2.2-2.7.0.orig/Documentation/ecasound-iam_manpage.yo +++ ecasound2.2-2.7.0/Documentation/ecasound-iam_manpage.yo @@ -0,0 +1,756 @@ +mailto(kvehmanen -at- eca -dot- cx) + +manpage(ecasound-iam) + (1) + (11.10.2009) + () + (Multimedia software) + + +manpagename(ecasound-iam)(ecasound interactive mode) +manpagesynopsis() + +manpagedescription() + +Ecasound library contains an interpreter module that understands +a set of commands aimed at controlling various library services. +This is called the ecasound interactive mode (EIAM). All programs +linked to ecasound library can use this facility. + +manpagesection(ECI API and return types) +A special case of interactive mode use is ecasound's control interface (ECI), +which is a small library providing easy access to the interactive +mode commands from outside of libecasound. When issuing inter commands using +the control interface, it's possible that commands also return information. +Currently supported return value types are: string [s], list of strings [S] +(elements separated by commas; escaped if necessary), integer [i], +long integer [li] and floating-point number [f]. These definitions are +used throughout this document. Commands that return nothing (void) are +marked with [-]. Additionally, return type [e] marks an error condition. +When an interactive mode command results in an error, an error string +explaining the condition is returned. + +manpagesection(Real-time commands) +It's not possible to use all interactive mode commands to modify and +control objects that belong to a connected chainsetup. Commands that +do NOT support this are: + +quote( + cs-remove, cs-set-length, cs-set-length-samples, cs-toggle-loop, + cs-set-param, cs-option, + c-add, c-remove, c-rename, c-clear, + ai-add, ai-remove, ai-attach, ai-forward, ai-rewind, ai-set-position, + ai-set-position-samples, + ao-add, ao-add-default, ao-remove, ao-attach, ao-forward, ao-rewind, + ao-set-position, ao-set-position-samples. +) + +If one of these commands is issued when a chainsetup is connected, +ecasound will first stop and disconnect the chainsetup, process +the command, and the reconnect. + +In addition, most non-modifying (const) commands work with +connected setups. + +manpagesection(GENERAL) +startdit() +dit(quit, q) +Quit ecasound session. What this means in practice depends on the +client implementation. In ecasound interactive mode, 'quit' terminates +the ecasound process. When sent over ecasound server connection (aka +NetECI), 'quit' terminates the active network connection, but does not +terminate the ecasound server process. em([-]) + +dit(start, t) +Processing is started (play). Error string is return if any errors upon +startup are encountered. em([e]) + +dit(stop, s) +Stop processing. em([-]) + +dit(run) +Like 'start' but blocks until processing is finished. Error string +is return if any errors upon startup, or during process, are +encountered. em([e]) + +dit(debug 'debug-level') +Set debug level to 'debug-level'. Notice that client programs can +reimplement the debug routines. em([-]) +enddit() + +dit(resource-file 'path-to-file') +Overrides the global and user resource files. Does not affect +already created objects. This command is equivalent to '-R' ecasound +option (see ecasound (1) man page). + +dit(-prefix:arg1,...,argN) +Equivalent to issuing 'cs-option -prefix:arg1,...,argN). See documentation +for 'cs-option'. + +dit(help', 'h') +Help! em([-]) + +enddit() + +manpagesection(GLOBAL) + +startdit() + +dit(engine-status) +Returns a string describing the engine status (running, stopped, +finished, error, not ready). See also em(cs-status). em([s]) + +dit(engine-launch) +Starts the real-time engine. Engine will execute the currently +connected chainsetup (see 'cs-connect). This action does not yet +start actual processing (see em(start) and em(stop)). When +ecasound is used as a JACK client, issuing em(engine-launch) +makes ecasound an active JACK client (i.e. ecasound's ports +can be connected to other JACK clients). em([-]) + +dit(engine-halt) +Stops the engine. Does not disconnect the chainsetup that +was running. See also em(cs-disconnet) and em(stop). When +ecasound is used as a JACK client, em(engine-halt) will +cause ecasound to become a deactivated client (all JACK +connections are torn down). em([-]) + +enddit() + +manpagesection(CHAINSETUPS) +Chainsetup is the central data object. All other objects (inputs, +outputs, chains, etc) are connected to some chainsetup. There can be +many chainsetups but only one can be connected. Similarly only +one chainsetup can be selected. If not otherwise specified operations +are done on the selected chainsetup. Some operations also require +that selected chainsetup is not connected. + +startdit() +dit(cs-add 'name') +Adds a new chainsetup with name 'name'. 'name' is now +the selected chainsetup. em([-]) + +dit(cs-remove) +Removes currently selected chainsetup. em([-]) + +dit(cs-list) +Returns a list of all chainsetups. em([S]) + +dit(cs-select 'name') +Selects chainsetup 'name'. em([-]) + +dit(cs-selected) +Returns the name of currently selected chainsetup. em([s]) + +dit(cs-index-select 'cs_index', cs-iselect 'cs_index') +Selects a chainsetup based on a short index string. Chainsetup names +can be rather long. This command can be used to avoid typing +these long names. 'cs_index' is an integer value, where '1' refers to +the first audio input/output. You can use 'cs-list' and 'cs-status' +to get a full list of currently available chainsetups. em([-]) + +dit(cs-load 'filename') +Adds a new chainsetup by loading it from file 'filename'. +'filename' is now the selected chainsetup. em([-]) + +dit(cs-save) +Saves the currently selected chainsetup to file. If chainsetup was loaded +from a file, the saved version will replace the original. If it doesn't +have a default filename, it's saved to "chainsetup_name.ecs". em([-]) + +dit(cs-save-as 'filename') +Saves currently selected chainsetup to file 'filename'. em([-]) + +dit(cs-edit) +Currently selected chainsetup is saved to a temporary file. This +file is loaded to an external editor (see ecasoundrc (5)). After +editing, the chainsetup is loaded back to ecasound. em([-]) + +dit(cs-is-valid) +Whether currently selected chainsetup is valid (=can be connected)? em([i]) + +dit(cs-connect) +Connect currently selected chainsetup to engine. When connecting, +all resources (e.g. files, soundcard devices, external programs) needed +to execute the chainsetup are reserved. Only one chainsetup can be connected +at a time. Error string is returned if connection fails (for instance +due to error in allocating the resources). em([e]) + +dit(cs-disconnect) +Disconnect currently connected chainsetup. This action will free +all external resources needed by the chainsetup. em([-]) + +dit(cs-connected) +Returns the name of currently connected chainsetup. em([s]) + +dit(cs-rewind 'time-in-seconds', rewind 'time-in-seconds', rw 'time-in-seconds') +Rewinds the current chainsetup position by 'time-in-seconds' seconds. +Position of all inputs and outputs attached to the selected chainsetup +is also affected. em([-]) + +dit(cs-forward 'time-in-seconds', forward 'time-in-seconds', fw 'ttime-in-seconds') +The current chainsetup position is forwarded by 'time-in-seconds' +seconds. Position of all inputs and outputs attached to the selected chainsetup +is also affected. em([-]) + +dit(cs-set-position 'time-in-seconds', cs-setpos 'time-in-seconds', setpos 'time-in-seconds', set-position 'time-in-seconds') +Sets the chainsetup position to 'time-in-seconds' seconds from the +beginning. Position of all inputs and outputs attached to the selected +chainsetup is also affected. em([-]) + +dit(cs-set-position-samples 'time-in-samples') +Sets the chainsetup position to 'time-in-samples' samples from the +beginning. Position of all inputs and outputs attached to the selected +chainsetup is also affected. em([-]) + +dit(cs-get-position, cs-getpos, getpos, get-position) +Returns the current chainsetup position in seconds. em([f]) + +dit(cs-get-position-samples) +Returns the current chainsetup position in samples. em([li]) + +dit(cs-get-length, get-length) +Returns the chainsetup length in seconds (if known). em([f]) + +dit(cs-get-length-samples, get-length-samples) +Returns the chainsetup length in samples (if known). em([li]) + +dit(cs-set-length 'seconds') +Sets processing time in seconds (doesn't have to be an integer value). +A special-case value of '-1' will set the chainsetup length +according to the longest input object. em([-]) + +dit(cs-set-length-samples 'samples') +Sets processing time in samples. em([-]) + +dit(cs-toggle-loop) +Toggle looping. When processing is finished, engine will start +again from the initial position. It's not always possible to enable looping +(for instance all inputs and outputs have infinite length and +chainsetup length is not explicitly set with 'cs-set-length'). em([-]) + +dit(cs-set-param) +Interpret general chainsetup parameters like for example +"-b" (buffersize), "-n" (name), etc. See ecasound (1) for +more info. em([-]) + +dit(cs-set-audio-format 'bits,channels,sample_rate') +Set the default sample parameters for currently selected chainsetup. +For example cd-quality audio would be "16,2,44100". This does the +same as command-line argument "-f" (see ecasound (1)). em([-]) + +dit(cs-status, status, st) +Prints out status information about available chainsetup. +Detailed information is printed out for connected (=available +for running) nd selected (=available for editing) chainsetups. +Other chainsetups are listed, but further details are +suppressed. To get full details of a specific chainsetup, +select it with 'cs-select' or 'cs-iselect', and then +issue 'cs-select'. em([s]) + +dit(cs-option '-prefix:arg1,...,argN') +One powerful feature of the interactive-mode is that it +provides full access to ecasound's command-line syntax. +For instance, command "cs-option -efb:400,200" means that +a bandpass filter is added to the currently selected +chain, with initial parameters 400 (center frequency) +and 200 (width in Hz). + +Note that session level options (such as setting debug level) +can not be used with 'cs-option' (i.e. only options that modify +chainsetups). + +Note! Ecasound interactive mode implicitly interprets all strings +beginning with a '-' as "cs-option string". +enddit() + +manpagesection(CHAINS) +Chain is a simple signal flow abstraction. Every chain has one input +and one output. All chain operators and their controllers are attached +to chains. Chains can be muted, unmuted and be bypassed. If not +otherwise stated, all operations are done to currently selected +chainsetup. + +startdit() +dit(c-add 'cname1,...,cnameN') +Adds a set of chains. Added chains are automatically selected. Note +that commas in chain names are not allowed. em([-]) + +dit(c-remove) +Removes selected chains. em([-]) + +dit(c-list) +Returns a list of all chains. em([S]) + +dit(c-select 'cname1,...,cnameN') +Selects chains. Other chains are automatically deselected. em([-]) + +dit(c-index-select 'index1,...,indexN', c-iselect 'index1,...,indexN') +Selects a set of chains based on the list of indixes. Each index is +an integer value, where '1' refers to the first chain. You can use +'c-list' and 'c-status' to get a full list of currently available +chains. em([-]) + +dit(c-select-all) +Selects all chains. em([-]) + +dit(c-select-add 'cname1,...,cnameN') +Selects more chains. em([-]) + +dit(c-deselect 'cname1,...,cnameN') +Deselects chains. em([-]) + +dit(c-selected) +Returns a list of selected chains. em([S]) + +dit(c-clear) +Clear selected chains by removing all chain operators and controllers. +Doesn't change how chains are connected to inputs and outputs. em([-]) + +dit(c-rename 'new_name') +Renames the selected chain. When using this command, exactly one chain must +be selected. em([-]) + +dit(c-muting, c-mute) +Toggle chain muting. When chain is muted, all data that goes through +is muted. em([-]) + +dit(c-bypass) +Toggle chain bypassing. When chain is bypassed, sample data is passed +through unprocessed (all chain operators are disabled for the given +chain). em([-]) + +dit(c-status, cs) +Print status info about all chains. em([s]) + +enddit() + +manpagesection(AUDIO INPUT/OUTPUT OBJECTS) +If not otherwise stated, all operations are done to currently selected +object. All commands with em(ai-) prefix operate on audio inputs, +while commands with em(ao-) operate on outputs. + +startdit() + +dit(ai-add 'input_format_string') +Adds a new input object. See ecasound (1) man page for more info about +the argument format ('-i' option). Note on syntax: if any of +the parameters (such as a filename) contains commas, the parameter +should be enclosed in double-quotes. em([-]) + +dit(ao-add 'output_format_string') +Adds a new output object. See ecasound (1) man page for more info about +the argument format ('-o' option). If argument is omitted, +a default output device is added (see ecasoundrc (5)). Note on syntax: if any +of the parameters (such as a filename) contains commas, the parameter +should be enclosed in double-quotes. em([-]) + +dit(ao-add-default) +Adds the default output device (see ecasoundrc (5)). em([-]) + +dit(ai-describe, ao-describe) +Returns a Ecasound Option Syntax (EOS) compliant string +describing the input/output. See the Ecasound User's Guide +for more information about EOS. This command was introduced in +ecasound 2.4.4. em([s]) + +dit(ai-select 'aobject_name', ao-select 'aobject_name') +Selects an audio object. 'aobject_name' refers to the string +used when creating the object (the first argument given to ai-add/ao-add). +Note that as a important difference to ai-add/ao-add, one should not +enclose the object name in double quotes for ai-select/ao-select. In the +case a chainsetup contains multiple inputs, or outputs, with +identical name, 'ai-select' and 'ao-select' will select +the first matching instance. In order to select a specific +instance, the 'ai-iselect' and 'ao-iselect' commands need to +be used. em([-]) + +dit(ai-index-select 'aobject_index', ai-iselect 'aobject_index', ao-index-select 'aobject_index', ao-iselect 'aobject_index') +Select some audio object based on a short index string. Especially file +names can be rather long. This command can be used to avoid typing +these long names when selecting audio objects. 'aobject_index' is +an integer value, where '1' refers to the first audio input/output. +You can use 'ai-list' and 'ao-list' to get a full list of currently +available inputs/outputs. em([-]) + +dit(ai-selected, ao-selected) +Returns the name of the currently selected audio object. em([s]) + +dit(ai-attach, ao-attach) +Attaches the currently selected audio object to all selected chains. em([-]) + +dit(ai-remove, ao-remove) +Removes the currently selected audio object from the chainsetup. em([-]) + +dit(ai-forward 'time_in_seconds', ai-fw 'time_in_seconds', ao-forward 'time_in_seconds', ao-fw 'time_in_seconds') +Selected audio object is forwarded by 'time-in-seconds' seconds. +Time should be given as a floating point value (eg. 0.001 is the +same as 1ms). em([-]) + +dit(ai-rewind 'time_in_seconds', ai-rw 'time_in_seconds', ao-rewind 'time_in_seconds', ao-rw 'time_in_seconds') +Selected audio object is rewinded by 'time-in-seconds' seconds. +Time should be given as a floating point value (eg. 0.001 is the +same as 1ms). em([-]) + +dit(ai-setpos 'time_in_seconds', ai-set-position 'time_in_seconds', ao-setpos 'time_in_seconds', ao-set-position 'time_in_seconds') +Set audio object position to 'time_in_seconds'. em([-]) + +dit(ai-set-position-samples 'time_in_samples', ao-set-position-samples 'time_in_samples') +Set audio object position to 'time_in_samples'. em([-]) + +dit(ai-getpos, ai-get-position, ao-getpos, ao-get-position) +Returns the audio object position in seconds. em([f]) + +dit(ai-get-position-samples, ao-get-position-samples) +Returns the audio object position in samples. em([li]) + +dit(ai-get-length, ao-get-length) +Returns the audio object length in seconds. em([f]) + +dit(ai-get-length-samples, ao-get-length-samples) +Returns the audio object length in samples. em([li]) + +dit(ai-get-format, ao-get-format) +Returns the audio format of the selected audio input/output as a +formatted string. See documentation for '-f' command-line option. em([s]) + +dit(ai-list, ao-list) +Returns a list of all input/output objects. em([S]) + +dit(aio-register) +Prints a list of registered audio object types. em([s]) + +dit(aio-status) +Audio object status (index strings, position, length, etc). em([s]) + +enddit() + +manpagesection(CHAIN OPERATORS) +Chain operators are used to process and analyze sample data. +They are attached to chains. If not otherwise stated, +currently selected chainsetup and chain are used. Also, +'chainop_id' and 'param_id' are used to select chain operators +and their parameters. First valid value for these parameters +is 1. + +startdit() +dit(cop-add 'cop_format_string') +Adds a new chain operator. In addition to normal chain operators, +this commmand can also be used to add effect presets and various +plugins. Note; it is not possible to add operators to multiple +chains at once. In other words only one chain should be selected +when issuing 'cop-add'. See ecasound (1) man page for more info. em([-]) + +dit(cop-describe) +Returns a Ecasound Option Syntax (EOS) compliant string +describing the chain operator. See the Ecasound User's Guide +for more information about EOS. This command was introduced in +ecasound 2.4.4. em([s]) + +dit(cop-remove) +Removes the selected chain operator. em([-]) + +dit(cop-list) +Returns a list of all chain operators attached to the currently +selected chain. em([S]) + +dit(cop-select 'param_id', cop-index-select 'param_id', cop-iselect 'param_id') +Selects a chain operator. em([-]) + +dit(cop-selected) +Returns the index number of currently selected chain operator. em([i]) + +dit(cop-set 'chainop_id,param_id,value') +Changes the value of a single chain operator parameter. Unlike other +chain operator commands, this can also be used during processing. +See also 'cop-get'. em([-]) + +dit(cop-get 'chainop_id,param_id') +Returns the current value of chain operator parameter identified by +'chainop_id' and 'param_id'. This command is a shorthand for +'cop-select chainop_id ; copp-iselect param_id ; copp-get'. em([f]) + +dit(cop-status) +Returns info about chain operator status. em([s]) + +dit(copp-list) +Returns a list of selected chain operator's parameters. em([S]) + +dit(copp-select 'param_id', copp-index-select 'param_id', copp-iselect 'param_id') +Selects a chain operator parameter. em([-]) + +dit(copp-selected) +Returns the index number of currently selected chain operator parameter. em([i]) + +dit(copp-set 'value') +Sets the selected parameter value to 'value'. em([-]) + +dit(copp-get) +Returns the selected parameter value. See also 'cop-get'. em([f]) + +dit(cop-register) +Prints a list of registered chain operators. em([s]) + +dit(preset-register) +Prints a list of registered effect presets. em([s]) + +dit(ladspa-register) +Prints a list of registered LADSPA plugins. em([s]) + +enddit() + +manpagesection(CONTROLLERS) +Controllers are used to control individual chain operator parameters. +They are attached to chains. If not otherwise stated, currently +selected chainsetup and chains are used. + +dit(ctrl-add 'copc_format_string') +Adds a new controller and attach it to currently selected chain +operator. The argument syntax is either "-:par1,...,parN" +or just ":par1,...,parN". If parameter itself contains +commas, the parameter should be enclosed in double-quotes. +See ecasound (1) man page for more info. em([-]) + +dit(ctrl-describe) +Returns a Ecasound Option Syntax (EOS) compliant string +describing the controller. See the Ecasound User's Guide +for more information about EOS. This command was introduced in +ecasound 2.4.4. em([s]) + +dit(ctrl-remove) +Removes the selected controller. em([-]) + +dit(ctrl-list) +Returns a list of all controllers attached to the currently +selected chain. em([S]) + +dit(ctrl-select 'param_id', ctrl-index-select 'param_id', ctrl-iselect 'param_id') +Selects a controller. em([-]) + +dit(ctrl-selected) +Returns the index number of currently selected controller. em([i]) + +dit(ctrl-status) +Returns info about controller status. em([s]) + +dit(ctrl-register) +Prints a list of registered controllers. em([s]) + +dit(ctrl-get-target) +Returns the index number of the chain operator that is +connected to the selected controller. The returned index +refers to the currently selected chain (see 'cop-list'). em([i]) + +dit(ctrlp-list) +Returns a list of all controller parameters. This command was introduced in +ecasound 2.4.2. em([S]) + +dit(ctrlp-select) +Selects a controller parameter. This command was introduced in +ecasound 2.4.2. em([-]) + +dit(ctrlp-selected) +Returns the index number of currently selected controller parameter. This command +was introduced in ecasound 2.4.2. em([i]) + +dit(ctrlp-get) +Returns the selected controller parameter value. This command was introduced in +ecasound 2.4.2. em([f]) + +dit(ctrlp-set) +Sets the selected controller parameter value to 'value'. This command was introduced in +ecasound 2.4.2. em([-]) + +enddit() + +manpagesection(JACK CONNECTION MANAGEMENT) +If Ecasound is compiled with support for url(JACK audio server)(http://jackaudio.org/), +the following set of commands is provided for controlling connections +between JACK ports. + +startdit() + +dit(jack-connect 'src-port' 'dest-port') +Make a connection between the two ports given as parameters. This command +is similar to the 'jack_connect' command line tool that is distributed +with JACK package. em([-]) + +dit(jack-disconnect 'src-port' 'dest-port') +Disconnect the two ports given as parameters. This command is similar +to the 'jack_disconnect' command line tool that is distributed +with JACK package. em([-]) + +dit(jack-list-connections) +Returns a list of all JACK ports and a list of connections +for each port. This command is similar to the 'jack_lsp' command +line tool (e.g. 'jack_lsp -c') that is distributed with JACK package. em([s]) + +enddit() + +manpagesection(INTERNAL COMMANDS) +Internal commands are not directly aimed at normal use. They +are primarily meant for use in scripting and frontends. + +startdit() +dit(int-cmd-list) +Returns a list of all registered interactive mode commands. em([S]) + +dit(int-log-history) +Returns recent log messages sent by libecasound modules. This +is a good tool for debugging ECI/EIAM scripts and applications. This +command was introduced in ecasound 2.4.0. em([s]) + +dit(int-output-mode-wellformed) +Select the well-format output format for log messages. em([-]) + +dit(int-set-float-to-string-precision) +Sets precision used in float to text conversions. Note that +this can be used to control the precision of float return values +for ECI commands. em([-]) + +dit(int-set-log-history-length) +Sets the log history length. Defaults to 0 items. +This command was introduced in ecasound 2.4.0. em([-]) + +dit(int-cmd-version-string) +Returns ecasound interactive mode parser version string. em([s]) + +dit(int-cmd-version-lib-current) +Returns ecasound interactive mode library interface version (libtool). em([i]) + +dit(int-cmd-version-lib-revision) +Returns ecasound interactive mode library interface revision (libtool). em([i]) + +dit(int-cmd-version-lib-age) +Returns ecasound interactive mode library interface age (libtool). em([i]) + +enddit() + +manpagesection(OBJECT MAPS) +Object maps are central repositories for commonly used object types. +By querying the maps, applications can get a list of all registered +object types and their properties. + +startdit() + +dit(map-cop-list) +Prints a list of registered chain operators using +the format specified in section em(OPERATOR DESCRIPTIONS). em([s]) + +dit(map-preset-list) +Prints a list of registered effect presets using +the format specified in section em(OPERATOR DESCRIPTIONS). em([s]) + +dit(map-ladspa-list) +Prints a list of registered LADSPA plugins using +the format specified in section em(OPERATOR DESCRIPTIONS). em([s]) + +dit(map-ladspa-id-list) +Prints a list of registered LADSPA plugins using +the format specified in section em(OPERATOR DESCRIPTIONS). +Numerical LADPSA plugin identifiers are used. em([s]) + +dit(map-ctrl-list) +Prints a list of registered controllers using +the format specified in section em(OPERATOR DESCRIPTIONS). em([s]) + +enddit() + +manpagesection(DUMP COMMANDS) +The following dump commands are not meant for normal use. +Their primary purpose is to provide an easy way to get +internal state information from libecasound. All dump +commands output a single line with syntax "key value" +to the selected output stream (defaults to stdout). + +startdit() + +dit(dump-target 'filename') +Set target stream for dumping. em([-]) + +dit(dump-status) +Dumps engine status - 'running', 'stopped', 'finished' or 'notready'. em([-]) + +dit(dump-position) +Dumps the global position. Printed in seconds using a floating-point +representation. em([-]) + +dit(dump-length) +Dumps the overall processing length. Printed in seconds using a floating-point +representation. em([-]) + +dit(dump-cs-status) +Dumps status string for the currently selected chainsetup - 'connected', +'selected' or an empty string. em([-]) + +dit(dump-c-selected) +Dumps the name of currently selected chain. em([-]) + +dit(dump-ai-selected) +Dumps label of currently selected audio input. If no input is +selected, dumps an empty string. em([-]) + +dit(dump-ai-position) +Dumps position of currently selected audio inputs. Printed in +seconds, using a floating-point representation. em([-]) + +dit(dump-ai-length) +Dumps length of currently selected audio input. Printed in seconds, +using a floating-point representation. em([-]) + +dit(dump-ai-open-state) +Dumps audio input state info. Either 'open' or 'closed'. em([-]) + +dit(dump-ao-selected) +Dumps label of currently selected audio output. If no output is +selected, dumps an empty string. em([-]) + +dit(dump-ao-position) +Dumps position of currently selected audio outputs. Printed in +seconds, using a floating-point representation. em([-]) + +dit(dump-ao-length) +Dumps length of currently selected audio output. Printed in seconds, +using a floating-point representation. em([-]) + +dit(dump-ao-open-state) +Dumps audio output state info. Either 'open' or 'closed'. em([-]) + +dit(dump-cop-value 'chainop,param') +Dumps chain operator parameter value. 'chainop' and 'param' are +operator and parameter index values (1...n). em([-]) + +enddit() + +manpagesection(OPERATOR DESCRIPTIONS) +The em(map-xxx-list) commands return a string containing all registered +objects of the given type em(xxx). Each line of the output describes +one registered type. The used syntax is: + +'keyword,name,description,num_of_params,par1_def,par2_def,...' + +em(parX_def) describes one object parameter. This definition +is present for all parameters of the described object type. +The used syntax is: + +'name,description,defaultvalue,upper_bound_flag,upper_bound, +lower_bound_flag,lower_bound,toggled_flag,integer_flag, +logarithmic_flag,output_flag' + +For exact descriptions of these fields, please see +the header file em(ecasound/libecasound/eca-operator.h). + +manpagesection(DEPRECATED COMMANDS) +Use of following commands is deprecated. They still work in +current version of Ecasound, but will be dropped in +the future: + +quote( + ai-wave-edit, ao-wave-edit +) + +manpageseealso() + ecasound (1), ecatools (1), ecasoundrc (5) + +manpageauthor() + Kai Vehmanen, --- ecasound2.2-2.7.0.orig/Documentation/manpages.html +++ ecasound2.2-2.7.0/Documentation/manpages.html @@ -0,0 +1,27 @@ + + +Ecasound Manual Pages + + + + + +
+ +

Ecasound Documentation - Manual Pages

+ +
+ + + +
+

Back to index.

+
+ + + --- ecasound2.2-2.7.0.orig/Documentation/style_ecasound.css +++ ecasound2.2-2.7.0/Documentation/style_ecasound.css @@ -0,0 +1,12 @@ +body { background-color: #ffffff } +a { color: #662a00 } +a:visited {color: #666655 } +#code { color: #0000ff } +#pre { color: #0000ff } +code { background-color: #cccccc } +pre { background-color: #cccccc } +pre.codepre { background-color: #cccccc; margin-left: 0.5cm } +p.examplecat { color: #662a00; font-size: 130% } +p.desc { text-align: center; margin-left: 3cm; margin-right: 3cm } +p.index { text-align: center; font-weight: bold } +p.mirrors { text-align: center; font-variant: small-caps} --- ecasound2.2-2.7.0.orig/Documentation/ecasoundrc_manpage.yo +++ ecasound2.2-2.7.0/Documentation/ecasoundrc_manpage.yo @@ -0,0 +1,233 @@ +mailto(kvehmanen -at- eca -dot- cx) + +manpage(ecasoundrc) + (5) + (22.03.2009) + () + (Multimedia software) + + +manpagename(ecasoundrc)(ecasound rcfile) + +manpagesynopsis() + {prefix}/share/ecasound/ecasoundrc (for instance '/usr/local/share/ecasound/ecasoundrc') + $HOME/.ecasound/ecasoundrc + +manpagedescription() + + bf(ecasoundrc) is the main configuration file for ecasound. + Any user-specific modification should be done to + $HOME/.ecasound/ecasoundrc, not to the global resource file. Ecasound + also allows to disable the normal policy and only read from a specific + resource file (see ecasound (1) and documentation for the bf(-R) option). + + The format is quite simple. One line consists of + a configuration variable and its value. Variable and value + are separated with either '=' or ' '. Lines beginning with a + "#" are ignored (comment lines). + +manpagesection(VARIABLES) + +startdit() + + dit(midi-device) + MIDI-device. If the device name is given in em(rawmidi,/dev/midi*) + format, OSS/Linux or OSS/Lite drivers are used. + Device em(rawmidi,/dev/snd/midiCxDy) opens an ALSA raw-MIDI + device with card number 'x' and device number 'y'. + See ecasound (1) man page (the '-Md option) for more info. + Defaults to em(rawmidi,/dev/midi). + + dit(default-output) + Output device to use by default. If a chainsetup with zero + outputs, but with one or more inputs, is connected, a default output + is added and all the chains are connected to it. If the special-case + value 'autodetect' is specified, ecasound will try to auto-detect + a suitable device (JACK -> ALSA -> OSS -> rtnull). + Defaults to em(autodetect). + + dit(default-audio-format) + Default values for sample format, channel count, sampling rate + and channel interleaving. Syntax is the same as used by + ecasound's em(-f) option (see ecasound (1)). + Defaults to em(s16_le,2,44100,i). + + dit(default-to-precise-sample-rates) + Whether to ignore sample rate differences (and possibly avoid + resampling). Currently only affects OSS-devices. Defaults to em(false). + + dit(default-mix-mode) + If em(default-mix-mode) is em(sum), engine will mix multiple channels into + one output channel by summing all input channels. In mode em(avg), + mixing is done by taking the average of all input channels. The + em(avg) mode is safe from clipping, while em(sum) is closer + to the way analog mixers work. Defaults to em(avg). + + dit(bmode-defaults-nonrt) + Selects the default parameters to use with buffering + mode 'nonrt' (other modes are 'rt' and 'rtlowlatency). + Parameters are given as a comma-separated tuple of values: + 1) buffersize (number,-b), 2) raised priority (true/false,-r), + 3) sched_priority (number,-r:X), 4) double buffering + (true/false,-z:db), 5) db-bufsize (number,-z:db,X), and + 6) max intbuf (true/false,-z:intbuf). Defaults to + em(1024,false,50,false,100000,true). + + dit(bmode-defaults-rt) + See 'bmode-defaults-nonrt'. Defaults to + em(1024,true,50,true,100000,true). + + dit(bmode-defaults-rtlowlatency) + See 'bmode-defaults-nonrt'. Defaults to + em(256,true,50,true,100000,false). + + dit(resource-directory) + Directory for global ecasound configuration files. + Defaults to em({prefix-dir}/share/ecasound). + Note! User-specific resource files can be be stored + to '$(HOME)/.ecasound/'. For instance you can + add your own presets definitions to + '$(HOME)/.ecasound/effect_presets'. + + dit(resource-file-genosc-envelopes) + Configuration file for generic oscillators. Is located in the + resource directory. Defaults to em(generic_oscillators). + + dit(resource-file-effect-presets) + Configuration file for effect presets. Is located in the + resource directory. Defaults to em(effect_presets). + + dit(ladspa-plugin-directory) + Directory containing LADSPA effect plugins. Defaults to em({prefix-dir}/lib/ladspa). + If environment variable em(LADSPA_PATH) exists, directories + specified in it are automatically searched for plugins. + Note! To match the syntax of the em(LADSPA_PATH) environment + variable, 'ladspa-plugin-directory' can contain multiple + directories, separated by ':' characters. + + dit(ext-cmd-text-editor) + If em(ext-cmd-text-editor-use-getenv) is em(false) or "EDITOR" + is null, value of this field is used. + + dit(ext-cmd-text-editor-use-getenv) + Should ecasound try to query environment variable "EDITOR". + Defaults to em(true). + + dit(ext-cmd-mp3-input) + Command for starting mp3 input. Ecasound expects to read signed, + 16bit, little-endian stereo audio samples from its standard + input. Ecsound will query other audio format parameters by parsing + the mp3 file header. Before execution, %f is replaced with + path to the input mp3. If exists, "%o" is replaced with he + start offset in mp3 frames. Double-quotes and backslash-espacing + can be used to include white-space to individual parameters. + By default, em(mpg123) is launched. + + dit(ext-cmd-mp3-output) + Command for starting mp3 output. Ecasound will write stereo, + signed, 16bit, little-endian samples to standard output. Sample + rate is configurable. Before execution, %f is replaced with + path to the output mp3, %S with sample rate in kHz, and + %B with encoding bitrate in kbps. Double-quotes and + backslash-espacing can be used to include white-space to + individual parameters. By default Ecasound will try to + launch em(lame). As a special exception (added to Ecasound + 2.7.0), if the output program is "lame" and options + include "--big-endian", Ecasound will detect this and output + big-endian samples. + + dit(ext-cmd-ogg-input) + Command for starting Ogg Vorbis input. Ecasound expects that audio samples + are written to standard output. It should be noted that + Ecasound is not able to query the audio format parameters from + ogg files, so these need to be set manually by the user. + Before execution, %f is replaced with path to the input ogg. + Double-quotes and backslash-espacing can be used to include white-space + to individual parameters. By default Ecasound will try to + launch (ogg123). + + dit(ext-cmd-ogg-output) + Command for starting Ogg Vorbis output. Ecasound will write + samples in little-endian format to standard output. Other + audio parameters are configurable. Before execution, %f is + replaced with path to the output ogg, %c, %s and %b with matching audio + format parameters, and %B with encoding bitrate in kbps. + Double-quotes and backslash-espacing can be used to include white-space to + individual parameters. By default Ecasound will try to + launch (oggenc). + + dit(ext-cmd-mikmod) + Command for starting mikmod input. Ecasound expects that + signed, 16bit, stereo audio samples are written to standard + output. Before execution, %f is replaced with + file path, and %s with selected sample rate. Double-quotes + and backslash-espacing can be used to include white-space to + individual parameters. By default Ecasound will try to launch + em(mikmod). + + dit(ext-cmd-timidity) + Command for starting timidity++ input. Ecasound expects that + signed, 16bit, stereo audio samples are written to standard + output. Before execution, %f is replaced with file path, and + %s with sample rate. Double-quotes and backslash-espacing can + be used to include white-space to individual parameters. + By default Ecasound will try to launch em(timidity). + + dit(ext-cmd-flac-input) + Command for starting FLAC input. Ecasound expects that audio samples + are written to standard output. It should be noted that + Ecasound is not able to query the audio format parameters from + FLAC files, so these need to be set manually by the user. + Before execution, %f is replaced with path to the input FLAC + file. Double-quotes and backslash-espacing can be used to include + white-space to individual parameters. By default Ecasound will + try to launch (flac). + + dit(ext-cmd-flac-output) + Command for starting FLAC output. Ecasound will write + samples to standard output. All audio parameters are + configurable. Before execution, %f is replaced with path to + the output flac, %c, %b and %s with matching audio + format parameters, %I with either 'signed' or 'unsigned', and + %E with either 'little' or 'big'. Double-quotes and backslash-espacing + can be used to include white-space to individual parameters. By default + Ecasound will try to launch (flac). + + dit(ext-cmd-aac-input) + Command for starting AAC input. Ecasound expects that signed, + 16bit, stereo, big-endian audio samplesare written to standard + output. It should be noted that Ecasound is not able to query + the input sample rate, so this needs to be set manually by the user. + Before execution, %f is replaced with path to the input AAC + file. Note! FAAC must be compiled with MP4 support. Double-quotes + and backslash-espacing can be used to include white-space to + individual parameters. By default Ecasound will try to + laucnh em(faad). + + dit(ext-cmd-aac-output) + Command for starting AAC output. Ecasound will write big-endian + audio samples to standard output. All other audio parameters are + configurable. Before execution, %f is replaced with path to + the output AAC file, %c, %b and %s with matching audio format + parameters. Note! FAAC must be compiled with MP4 support. Double-quotes + and backslash-espacing can be used to include white-space to + individual parameters. By default Ecasound will try to launch + em(faac). + +enddit() + +manpagesection(DEPRECATED) + +startdit() + + dit(ext-cmd-wave-editor) + +enddit() + +manpageseealso() + + ecasound (1), ecatools (1), ecasound-iam (1) + +manpageauthor() + + Kai Vehmanen, --- ecasound2.2-2.7.0.orig/Documentation/examples.html +++ ecasound2.2-2.7.0/Documentation/examples.html @@ -0,0 +1,785 @@ + + + +Ecasound Examples + + + + + + +
+ +

Ecasound Examples - The Best Place to Get Started with Ecasound

+ +
+ +

Remember to also check out the +Ecasound Tutorials and Articles +[alt link] +page, the +ecasound(1) +[alt link] +manpage, and +the +Ecasound User’s Guide.

+ +

+The console mode user-interface, ecasound, is +used in all the following examples. Other ecasound frontends +may use a different syntax, but the basic principles are the +still the same as long as ecasound is used as the backend +engine. +

+ +

+Version note: sections describing recently introduced features +have a note about the minimum required version. +

+ + + +
+ + +

+Format Conversions +

+

+These first two commands do the exact same thing, conver somefile.wav to +somefile.cdr (CDR is the CD-Audio track format). As no chains are +specified, the default chain is created and used. +

+ +
+
1. ecasound -i:somefile.wav -o:somefile.cdr
+2. ecasound -i somefile.wav -o somefile.cdr
+
+ +

+This is not a very useful example, but hopefully helps to understand +the way chains work: +

+ +
+
3. ecasound -a:1,2 -i somefile.wav -a:1 -o somefile.cdr -a:2 -o somefile.mp3
+
+ +

+First, two new chains 1 and 2 (you can also use strings: +'-a:some_name_with_no_whitespaces,some_other_name') are created. +They are now the active chains. After this, input somefile.wav is +connected to both these chains. The rest follows the same scheme. +Chain '1' is set active and output somefile.cdr is +attached to it. In the same way, somefile.mp3 is attached to +chain '2'. +

+ +

+The last example is similar to the first two, but now ecasound is +started in interactive mode: +

+ +
+
4. ecasound -c -i somefile.wav -o somefile.cdr
+
+ + +

+Format Conversions - Resampling +

+ +
+
1. ecasound -f:16,2,96000 -i resample,auto,foo44100.wav -o bar96k.wav
+2. ecasound -f:16,2,44100 -i resample,auto,bar96k.wav -o foo44100.wav
+3. ecasound -f:16,2,44100 -i resample-hq,48k,foo48k.wav -o bar.wav
+4. ecasound -f:16,2,44100 -i resample,96k,third.raw -o foo44100.wav
+
+ +

+To do resampling, a special 'resample' input type must be used. +In the first example above, the 44100Hz file foo44100.wav is +resampled to 96kHz and the result is written to bar96k.wav. +In the second example the reverse is done, sample rate is converted +from 96khz to 44100Hz. In the last example, the from rate has to +be specified explicitly as raw audio files do not contain the +necessary header information. +

+ +

+In the last example we do a 48000Hz to 44100Hz conversion using +the 'resample-hq' input type. If Ecasound was built with support +for the libsamplerate package, 'resample-hq' selects +the high-quality conversion mode. In this mode the conversion +process requires more CPU power, but the results are of +higher quality. Using libsamplerate also improves quality +of the default 'resample' mode. +

+ + +

+Realtime Outputs (playing to a sound device) +

+ +

+Following are examples of recording from, and playing back to, +ALSA sound device (Linux): +

+ +
+
1. ecasound -i somefile.mp3 -o alsa
+2. ecasound -i somefile.mp3 -o alsahw,0,0
+3. ecasound -i somefile.mp3 -o alsaplugin,0,0
+4. ecasound -i somefile.mp3 -o alsa,soundcard_name
+
+ +

+ALSA sound subsystem provides multiple ways to select which audio +device to use, and how it is accessed. A plain "alsa" will use the default +ALSA sound device (depends on system configuration). Alternatively you can either +specify "alsahw" (to indicate you want use the ALSA direct hardware interface), +or "alsaplugin" (to utilize the ALSA plugin layer). Both accept card number and +device number as parameters. Optionally also subdevice can be given. +The plugin layer is able to handle some type conversions automatically. +Yet another option is to specify the ALSA device name ('soundcard_name'). +The device name must be defined in the ALSA configuration files (either in +~/.asoundrc or in the global settings file). +

+ +

+Following are examples of recording from, and playing back to, +OSS sound device (Linux, BSDs and many other OS'es): +

+ +
+
1. ecasound somefile.wav
+2. ecasound -i somefile.wav
+3. ecasound -i:somefile.wav
+4. ecasound -i somefile.wav -o /dev/dsp
+
+ +

+If you haven't touched your ~/.ecasound/ecasoundrc configuration file, +these should all do the same thing, output somefile.wav to +/dev/dsp using the default chain. If no inputs are +specified, ecasound tries to use the first non-option argument on the +command line as a default input. If no chains are specified, the chain +'default' is created and set active. If no outputs are specified, +the default-output defined in ~/.ecasound/ecasoundrc is used. +This is normally /dev/dsp. +

+ +

+See also section on JACK below. +

+ + +

+Realtime Inputs (recording from a sound device) +

+ +
+
1. ecasound -i /dev/dsp0 -o somefile.wav
+2. ecasound -i alsa -o somefile.wav -c
+3. ecasound -i alsahw,1,0 -o somefile.wav
+
+ +

+These are simple examples of recording. When recording, it may +be useful to run ecasound in interactive mode (-c). +

+ +

+See also section on JACK below. +

+ + +

+Use with JACK audio server +

+ +
+
1. ecasound -i foo.wav -o jack,system
+2. ecasound -i foo.wav -o jack
+
+ +

+This will create a separate JACK output port for each channel +of foo.wav, and automatically connect these Ecasound ports to +the system PCM output ports in the JACK server. The second +example will create JACK output ports, but does not establish +any connections (you have to do this yourself with jack_connect, +qjackconnet, qjackctl, or other similar tool). +

+ +
+
3. ecasound -c -i foo.wav -o jack,system -G:jack,eca_slave,recv
+
+ +

+Like in previous examples, but the ecasound client name (as shown +to other JACK clients) is set to "eca_slave", and ecasound is +configured to react to incoming transport changes (play, stop, +seek, etc). By default ecasound both sends and reacts to +transport events. +

+ +

+Version note: the above describes the updated JACK interface +introduced in Ecasound 2.6. The old interfaces, "jack_alsa", "jack_auto" +and "jack_generic" are deprecated, but still available in current +versions of Ecasound. +

+ + +

+Effect Processing +

+ +

+Ecasound is an extremely versatile tool when it comes to effect +processing. After all, it was originally programmed for non-realtime +signal processing. Here are some of examples: +

+ +
+
1. ecasound -i somefile.mp3 -o alsa -ea:120
+2. ecasound -a:default -i somefile.mp3 -o alsa -ea:120
+
+ +

+These two perform the same thing: an mp3 input file is amplified to 120% +(linear scale) and fed to ALSA default PCM sound device. +

+ +
+
3.ecasound -i somefile.mp3 -o alsa -etr:40,0,55 -ea:120
+
+ +

+Like the previous examples, but now a reverb effect, with a delay of 40 +milliseconds, with surround mode disabled and mix ratio of 55%, is added to +the chain before the amplify effect. In other words the signal is first +processed with the reverb and then amplified. Any number of effects +can be combined this way. Note that when a real-time input/output, +like the ALSA PCM device in above example, is part of the setup, one +must have enough CPU power to run the effect algorithms in real-time (at +the speed of the sound device). When this happens, ecasound will start +warning about buffer over- or underruns (often referred to as 'xruns'), +and the audio output may be garbled. An easy way to work aroud processing +power limitations is to split the processing into two steps: first apply +the effects and write output to a file, and then as a separate step +play the file to a sound device. +

+ +
+
+4. ecasound -a:1,2 -i somefile.mp3 -o alsa \
+        -a:1 -etr:40,0,55 -ea:120 \
+        -a:2 -efl:400
+
+ +

+Ok, let's next do some parallel processing: two chains are created and +the input and output files are connected to them. As a result, the input +signal is processed with two sets of effects, and then mixed back +together. You can create as many chains this way as you want. +

+ + +

+Using controller sources with effects +

+ +
+
1. ecasound -i somefile.wav -o alsa -ef3:800,1.5,0.9 -kos:1,400,4200,0.2,0 -kos:2,0.1,1.5,0.15,0
+2. ecasound -i somefile.wav -o alsa -ef3:800,1.5,0.9 -km:1,400,4200,74,1 -km:2,0.1,1.5,71,1
+
+ +

+The first example uses two sine oscillators +('-kos:parameter,range_low,range_high,speed_in_Hz,initial_phase') +to control a resonant lowpass filter. The cutoff frequency varies +betweeen 400 and 4200 Hz, while resonance varies between 0.1 and 1.5. +The initial phase is 0 (times pi). The second example uses MIDI continuous +controllers +('-km:parameter,range_low,range_high,controller_number,midi-channel') +as controller sources. The ranges are the same as in the +in first example. Controller numbers used are 74 (cutoff) and 71 +(resonance). In other words you can use your synth's cutoff and +resonance knobs. +

+ +

+It's also possible to control controllers with other controllers +using the '-kx' option. Normally when you add a controller, +you're controlling the last specified chain operator. +'-kx' changes this. Let's take an example: +

+ +
+
3. ecasound -i file.wav -o alsa -ea:100 -kos:1,0,100,0.5,0 -kx -kos:4,0.1,5,0.5,0
+
+ +

+Same as before, but now another 0.5Hz sine oscillator is controlling +the frequency of the first oscillator. +

+ +

+Now let's add a MIDI-controller (CC) to the mix. In the following, a sine oscillator +is assigned to the cutoff frequency, while other controller is controlling the resonance. +MIDI control change messages from controller 2 (range of 0-127) on channel 1 (range of 1-16 +channels) are used to control the frequency of the sine oscillator (with MIDI control +value range of 0-127 mapped to oscillator frequencies 0.5-1.5kHz). +

+ +
+
4. ecasound -i file.wav -o alsa -ef3:1000,1.0,1.0 -kos:1,500,2000,1,0 \
+        -kos:2,0.2,1.0,0.5,0 \
+        -kx -km:1,0.1,1.5,2,1
+
+ + +

+Multitrack Recording +

+ +
+
1. ecasound -c -f:16,2,44100 \
+        -a:1 -i monitor-track.wav -o alsa \
+        -a:2 -i alsa -o new-track.wav
+
+ +

+It really is this simple. Then a default sample format +is set with '-f:bits,channels,sample_rate'. Now all that's left +is to specify two chains: one for monitoring and one for recording. +When using the above command, you need to have some way of monitoring +the signal that is recorded. The preferred way is to utilize +hw-monitoring of the audio device: unmute and adjust the line-in level +with the mixer application (e.g. "alsamixer" or "alsamixergui"). +If you want to use ecasound for digital monitoring, you have to add +a separate chain for it:

+ +
+
2. ecasound -c -b:256 \
+        -a:1 -i monitor-track.wav \
+        -a:2,3 -i alsa \
+        -a:2 -o new-track.wav \
+        -a:1,3 -o alsa
+
+ +

+You can always do test recordings until you find the optimal volume +levels (using the soundcard mixer apps and adjusting source volume), +but ecasound offers a better way to do this. This is a bit ugly, +but what's most important, it works in text-mode: +

+ +
+
3. ecasound -c -f:16,2,44100 -a:1 -i alsa -o alsa -ev
+
+ +

Basicly this just records from ALSA default PCM input, puts the signal through +an analyze ('-ev') operator and outputs to ALSA output. The secret +here is that you can get volume statistics with the estatus (or +es) command in interactive mode. Newer ecasound versions (1.8.5 +and newer) provide a separate 'ecasignalview' application, which can +be used to monitor signal level in real-time. +

+ + +

+Mixing

+ +

+Here's a few real-life mixdown examples. +

+ +
+
1. ecasound -c \
+     -a:1 -i drums.wav \
+     -a:2 -i synth-background.wav \
+     -a:3 -i bass-guitar_take-2.ewf \
+     -a:4 -i brass-house-lead.wav \
+     -a:all -o alsa
+
+ +

+First of all, interactive-mode is selected with '-c' to allow +controlling of mixdown playback (starting, stopping, seeking and +so forth). The mixdown consists of four inputs (all stereo). Each +input is routed to a dedicated chains (named '1'...'4'). The +chains are mixed by routing them all to a single output +device (the ALSA default PCM device). +

+ +
+
2. ecasound -c -r \
+     -a:1 -i drums.wav -ea:200 \
+     -a:2 -i synth-background.wav -epp:40 -ea:120 \
+     -a:3 -i bass-guitar_take-2.ewf -ea:75 \
+     -a:4 -i brass-house-lead.wav -epp:60 -ea:50 \
+     -a:1,2,3,4 -o loop,1 \
+     -a:5,6 -i loop,1 \
+     -a:5 -o alsa \
+     -a:6 -o current-mix.wav
+
+ +

+This second example is more complex. The same inputs are used, but +this time effects (amplify '-ea:mix_percent' and panning '-epp:left_right_balance') +are also used. Additionally we want to route the full mix to both the ALSA sound +device and to a file. As a single chain can be connected to at most one input +and one output, use of a virtual loop device is needed in this example. The four +input chains are first routed to a loop device 'loop,1' ('1' identifies the loop +object instance). Then two new chains, '5' and '6', are defined. The loop +device is set as input to both of these chains (using the '-a:5,6 -i loop,1' +syntax). As the final step, the ALSA device is set as the output for chain '5' +and the file 'current-mix.wav' as the output of chain '6'. +

+ + +

+Cut, Copy and Paste

+ +

+Here's a simple example where the first 60 seconds of bigfile.wav +is written to part1.wav and the rest to part2.wav: +

+ +
+
1.a) ecasound -i bigfile.wav -o part1.wav -t:60.0
+  b) ecasound -i bigfile.wav -y:60.0 -o part2.wav
+
+ +

+If you want to combine these files back to one big file: +

+ +
+
2. ecasound -i part2.wav -o part1.wav -y:500
+
+ +

+In the above second example, part2.wav is appended to part1.wav. +

+ + +

+Manipulating objects - looping, reversing, ...

+ +

+To continuously loop an audio file, you can use 'audioloop': +

+ +
+
1. ecasound -i audioloop,drumloop.wav -o alsa
+
+ +

+To run the loop for 65.0secs, you can use '-t': +

+ +
+
2. ecasound -i audioloop,drumloop.wav -o alsa -t:65.0
+
+ +

+To play an audio file in reserve: +

+ +
+
3. ecasound -i reverse,drumloop.wav -o alsa
+
+ +

+The various operations can also be stacked. Let's first start +by selecting a 5sec second out of a bigger file and play +that out to the ALSA device. +

+ +
+
4. ecasound  -i select,5,10,audioclip.wav -o alsa
+
+ +

+Next let's play that segment in reverse: +

+ +
+
5. ecasound  -i reverse,select,5,10,audioclip.wav -o alsa
+
+ +

+But you can still keep adding new operators. Let's now +loop the reversed segment: +

+ +
+
6. ecasound  -i audioloop,reverse,select,5,10,audioclip.wav -o alsa
+
+ +Another available operator is "playat", which can be used to play an audio +clip at a given moment in time (i.e. postpone the time it is +played). A simple example of playing "audioclip.wav" at position 20sec (i.e. +20secs of silences and then file is played out from start). + +
+
7. ecasound  -i playat,20.0,audioclip.wav -o alsa
+
+ +This operatoror can be combined with others as well. To select +a 10sec clip, starting at 25sec (i.e. 25-35sec of "audioclip.wav"), and +play it at 180.5sec (with total length of 180.5+10.0=190.5sec): + +
+
8. ecasound  -i playat,180.5,select,25,10.0,audioclip.wav -o alsa
+
+ +

+Version note: 'audioloop', 'select' and 'playat' audio object types were +added to ecasound version 2.5.0. +

+ + +

+Multichannel Processing

+ +

+Ecasound chains can transport multiple channels of audio. The channel +count of a chain is defined by the input and output connected +to it. Normally effects and other chain operators operate on +all channels of a chain. But it is also possible to operate on specific c +hannels only. Here's an example of how to split a four channel input +file into four separate one channel output files: +

+ +
+
1. ecasound -a:1,2,3,4 -i 4-channel-file.wav \
+ 	    -a:1 -f:16,1,44100 -o mono-1.wav \
+ 	    -a:2 -f:16,1,44100 -o mono-2.wav -chcopy:2,1 \
+ 	    -a:3 -f:16,1,44100 -o mono-3.wav -chcopy:3,1 \
+ 	    -a:4 -f:16,1,44100 -o mono-4.wav -chcopy:4,1
+
+ +

+Note that all four channels of '4-channel-file.raw' are routed +to all the four chains '1' through '4'. At the output stage, +all the output files are one channel (because of '-f:16,1,44100) and +thus only the first channel of each chain is written to the output. To +perform the correct routing, the '-chcopy' operator is used to copy +source channel 'N' to first channel (which will be written to +the output file). In chain '1' no channel copying is needed as the +first channel already has the necessary contents. +

+ +

+Version note: '-chcopy' was introduced in version 2.4.5. In earlier versions +'-erc' provides similar functionality. +

+ +

+To amplify a specific channel, '-eac' can be used. Here's an +example where 3rd channel of a 4ch file is amplified by 150% (linear +scale): +

+ +
+
2. ecasound -i 4ch-infile.wav -ea:150,3 -o 4ch-outfile.wav
+
+ + +

+Signal Routing through External Devices

+ +

+Signal routing is done using similar setups as is used for multirack +recording. The only difference is that the realtime input(s) and output(s) +are externally connected (fed through an external effect processor +for instance). +

+ +
+
1. ecasound -c -f:16,2,44100 \
+	      -a:1 -i source-track.wav -o alsa \
+  	      -a:2 -i alsa -o processed-track.wav
+
+ + +

+Presets and LADSPA Effect Plugins

+ +

+The following produces a 440Hz sine tone (e.g. for tuning purposes) and +plays it out with the default ALSA PCM device. For this to work, one +needs to have the LADSPA SDK needs installed (see +www.ladspa.org). +

+ +
+
1. ecasound -i null -o alsa -el:sine_fcac,440,1
+
+ +

+The next example produces a metrome signal with tempo of 120BPM: +

+ +
+
2. ecasound -i:null -o:alsa -el:sine_fcac,880,1 -eemb:120,10 -efl:2000
+
+ +

+As the syntax might look a bit difficult for everyday use, the above is provided +also as an effect preset: +

+ +
+
3. ecasound -i:null -o:alsa -pn:metronome,120
+
+ +

+To look at the definition of 'metronome', see the file 'effect_presets' that +comes with ecasound distribution (contains the the predefined effect presets). +By default, location of this file is '/usr/share/ecasound/effect_presets'. +

+ + +

+More MIDI examples

+ +

+The following is a simple example how an MIDI continuous controller (CC) is +used to control an ecasound effect parameter (the cutoff frequency of +the low-pass filter '-efl'): +

+ +
+
1. ecasound -i somefile.wav -o alsa -efl:400 -km:1,400,4200,74,1
+
+ +

+The above example uses OSS rawmidi access, which is equivalent to adding '-Md:rawmidi,/dev/midi' +to the command line. To do the same with ALSA, the syntax is as follows:

+ +
+
2. ecasound -i somefile.wav -o alsa -efl:400 -km:1,400,4200,74,1 -Md:rawmidi,/dev/snd/midiC0D0
+3. ecasound -i somefile.wav -o alsa -efl:400 -km:1,400,4200,74,1 -Md:alsaseq,80:1
+4. ecasound -i somefile.wav -o alsa -efl:400 -km:1,400,4200,74,1 -Md:alsaseq,KMidimon
+
+ +

+The first one uses the ALSA rawmidi interface and opens an +ALSA device (card 0, device 0) for raw MIDI I/0. The second +example uses the ALSA sequencer API, which is more powerful as +you can route MIDI packets not only to hardware interfaces, but +also to and from other applications supporting the sequencer API. +"80,1" and "KMidimon" are sequencr ports to which ecasound should +connect. You can use the "aconnect" (part of the alsa-utils package) tool +to list all available sequencer ports. +

+ +

+Version note: For ALSA sequencer support, you need ecasound 2.4.3 or +newer. +

+ + +

+Tone generation

+ +

+Ecasound also provides a few tone generation primitives. These are +mainly intended for testing, but can have other uses as well. For +a more versatile set of tone generators, one can utilize the various +LADSPA plugins that produce tones. +

+ +

+A sine tone of 880Hz, played out to the default ALSA +sound device: +

+ +
+
1. ecasound -i tone,sine,880 -o alsa
+
+ +

+The above continuous to produce the tone indefinitely. It is +also possible to create a test tone of finite length. First, +a sine tone of 440Hz with length of exactly 22.25secs. Then +a similar example, in which the length of the tone is given +in samples (88200 in this case): +

+ +
+
2. ecasound -i tone,sine,440,22.25 -o alsa
+3. ecasound -i tone,sine,880,88200sa -o alsa
+
+ +

+Version note: 'tone' audio object type was added to ecasound +version 2.5.0. +

+ + +

+Piping data from other processes

+ +

+Here is one example of how audio can be piped to ecasound: +

+ +
+
1. mpg123 -s sometune.mp3 | ecasound -i:stdin -o alsa
+
+ +

+The above sends the output of mpg123 to standard output ('-s' option +of mpg123) and reads it from standard input with ecasound ('-i:stdin' option), +and plays it out through the default ALSA PCM device. Similarly, 'stdout' +can be used to pipe data out from ecasound. +

+ +
+

Back to index.

+
+ + + +









+









+ +

+ + + Valid XHTML 1.0! + + Valid CSS! + +

+ + + --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-template.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-template.txt @@ -0,0 +1,32 @@ +------------------------------------------------------------------------ +Status: OPEN/CLOSED/FROZEN + +(edi-xxx): Short description of the item. This should be no more + than a few lines. + - submitted: who submitted, date + - action: what happened, who and when +------------------------------------------------------------------------ +Details: + +[background: what] +- item background +- description of current solutions to the problem + +[rationale: why] +- why this item should be implemented, why is it + important + +[description: how] +- how the edi aims to solve the problem + +[todo-list] +- list of practical steps on implementing the item (can + be updated during development) + +------------------------------------------------------------------------ + +- rest of the sections are reserverd for quotes from ecasound-list, + comments, etc +- each section should contain information about who wrote the comment + and when +- sections not edited --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-38.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-38.txt @@ -0,0 +1,35 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-38): Initial EIAM commands upon connecting a chainsetup. + - submitted: kaiv, 20.08.2003 + - frozen: kaiv, 20.08.2003 + +------------------------------------------------------------------------ +Outcome + +Implemented as '-E' frontend option in 2.5.0 release. + +------------------------------------------------------------------------ +Reasons for the frozen status: + +- nice idea, but overlaps numerous existing mechanisms (ECI, -y, + ewf), while at the same time doesn't provide any functionality + that is not implementable by other means +- if someone comes up with a good use-case, we should considering + opening this item again + +------------------------------------------------------------------------ +Details: + +- new option to add chainsetup-specific initial EIAM commands +- for example: '-U "ai-setpos 10"' +- commands are executed immediately before connecting the chainsetup + to the engine +- multiple commands can be given +- use-cases: + - replacing the -y option + - replacing some of the .ewf functionality + - possibility to save initial commands in chainsetup files (.ecs) + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-28.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-28.txt @@ -0,0 +1,195 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-28): Extending the EIAM command set to allow writing standalone ECI + implementations. + - submitted: kaiv, 29.09.2002 + - initial implmementation: kaiv, 05.10.2002 + - done: kaiv, 29.10.2002 + +------------------------------------------------------------------------ +Details: + +- rationale + - currently all ECI implementations depend on libecasound (either + or directly or indirectly) and are thus susceptible to + library versioning conflicts + - a standalone implementation would not depend on ecasound + libraries in any way, which again would greatly improve + user-friendliness of ECI apps (easier installation, fewer + problems with libraries, etc, etc) +- list of goals/requirements that should be reached + - a reference standalone ECI implementation in some language +- ideas + - EIAM commands for selecting the ecasound return value + syntax -> either normal (current) or one matching the + the NetECI wire-syntax +- arlready-done-list + - new EIAM commands are needed to make it possible to + parse return values + - redirecting all iactive mode prompt to stderr (solved + by using '-D) + - adding 'e' and '-' return types to eca-control and + eca-control-base + - making eca-control create the output differently in + wellformed and normal modes (1. whether to add + a type prefix, 2. whether to print empty replies + and 3. how to print errors) + - reference C implementation (libecasoundc) + - document the use of ECASOUND environment variable + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 28.09.2002] + +Tkeca-0.2.1, which btw is a really usable app, uses ecasound by forking +the console interface on the background and then piping commands and +replies via stdin and stdout. + +Compared to using ECI or directly linking against libecasound, this +approach has the huge benefit of complete independence from ecasound +libraries. In practice, just by renaming the ecasound executable (or +changing PATH), I can select between ecasound 2.0.4 and 2.1dev12 (CVS). +Tkeca-0.2.1 works nicely with both versions! + +Now what if all ECI apps would use the same mechanism? This could be +achieved by making a new C-implementation of the ECI API, which would do: + +- fork "ecasound -c" to the background +- pass ECI commands to the ecasound instance via its stdin +- read the return codes from ecasound's stdout, parse them and + pass them to the ECI app + +... that's about it. The C++, Python, Perl and PHP ECI implementations +could either use the C implementation or alternatively provide their own +implementation. For instance, a Python ECI implementation could be +written totally in Python. This means that no extension modules would +need to installed. Just a Python interpreter and the ecasound executable +and that's it! + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 01.10.2002] + +One of the best alternatives I've come up with so far is reusing the +NetECI protocol wire format: + +--- +[1. int-output-eci] + +There would be a new ecasound command for enabling +a parser-friendly output mode (for instance 'int-output-eci'). + +--- +[2. well-formed stdout messages] + +Once 'int-output-eci' is issued, all output from libecasound +to stdout will adhere to the following format: + +" " + +Different types of messages already all have a different loglevel +associacated with them. For instance when setting ecasound's debug level +(with -d:x), you're actually setting a mask specifying which loglevels to +pass through. + +Example: "16 10\r\nMy message". Ie. "My message" (length=10) was sent with +loglevel 16. + +--- +[3. the ECI loglevel] + +One loglevel would be allocated to command return values. These messages +would adhere to the following format, which is an extension of the +message format in the NetECI protocol: + +" " + +Example (response to 'c-selected'): "64 100 s 7\r\ndefault\r\n\r\n". Ie. +the response was "default" (length=7), response type s=string, status +100=ok and it was sent with loglevel 64. + +... + +With this new output mode, it should be quite easy to reliably parse +ecasound's output. Just issue a command and then read log messages until +you encounter the next message with eci-loglevel. The msg 'status-code' +will indicate whether the command succeeded or not. 'return-type' and +'msg-size' will help in parsing the actual message contents (and to find +the next well-formed message). + +In addition to making parsing easier, the line-feeds (crlf) also serve as +a mechanism to recover from errors (parser receives an invalid message and +does not know where the next message starts ==> search for an empty line +to find a possible new well-formed message). + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 02.10.2002] + +1. Enabling the well-formed mode + +The new log message mode can be enabled with the new +"int-output-mode-wellformed" EIAM command. + +2. Syntax of well-format log messages + +I've added the below documentation to Ecasound Programmer's Guide: + +--cut-- +By issuing the EIAM command ``int-output-mode-wellformed'', +ecasound will start printing all messages using the following +format: + + = ( | ) + + = ; loglevel number + ; size of content in octets + = ; generic log message + = + ; EIAM return value message + = + ; actual content of the message + = ``i'' | ``li'' | ``f'' | ``s'' | ``S'' | ``e'' + ; type of the return value (see ECI/EIAM docs) + = * ; zero or more octets of message content + + = 0x20 ; space + = 0x00-0xff ; 8bits of data + = ; new line + = 0x0d ; carriage return + = 0x0a ; line feed + = + ; one or more digits + = 0x30-0x39 ; digits 0-9 +--cut-- + +3. Loglevel for ECI/EIAM return values + +I've assigned value 256 (0x100) for the return value messages. As an +example: + +--cut-- +ecasound ('h' for help)> int-output-mode-wellformed +ecasound ('h' for help)> cs-is-valid +256 1 i +1 + +ecasound ('h' for help)> cs-selected +256 18 s +command-line-setup + +--cut-- + +256 = loglevel for the return-type messages +1 = length of content is 1 octet +i = return value is an integer +1 = the content (boolean one, ie. cs-is-valid returned true) + = an empty line ends the message +... and so on. + +That's about it I think. Now it should be possible to write a native, +standalone ECI implementation in any language that supports launching +external apps (ie. forking) and using pipes to communicate with the +executed process. + +PS If this turns out to work ok, I might also add this functionality + to the 2.x tree (-> 2.0.5 release). + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-16.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-16.txt @@ -0,0 +1,45 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-16): More flexible system for assigning controllers of + controllers (-kx). + - submitted: jhalttun, 02.09.2001 + - migrated to sf.net: sffeat:2134159 + +------------------------------------------------------------------------ +Details: + +- see Janne's post below + +------------------------------------------------------------------------ +[jhalttune on ecasound-list 11.10.2002] + +Hi all, + +I am developing a higher level python interface to ecasound. I have collided +with the inability to set controllers to an effect after the -kx switch, +once more. + +Consider the following test-code: +eca=Session() +ei=eca('ei', 56) # pitch shifter +kl=ei('kl2',0,23, range_high=32) # 2-stage linear envelope +kl('kl2', 0, range_low=32) +ei('kl2',1,3, range_high=2) # <-- this can't be done! +### + +I think that imposing on a possible programmer that you can't add +controllers to an effect after adding a controller-chain to it is restraining, +not to mention hard to implement sanely. + +I think that imposing on a possible programmer that you can't add +controllers to an effect after adding a controller-chain to it is restraining, +not to mention hard to implement sanely. Ofcourse I could forbid controllers +on controllers altogether, but I think this would nullify the advances of +having this kind of programming environment somewhat. + +So, what if we could have a new special switch, say, -ky? This would end +the controller on controller chain and return focus to previous controller +or effect. What do you think? + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-25.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-25.txt @@ -0,0 +1,21 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-25): Distortion with multitap delay -etm if delay length changes + dynamically. + - submitted: rjpoelstra, 27.01.2002 + - migrated to sf.net: sfbug:2134149 + +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ +- Remco Poelstra, Sun, 27 Jan 2002 (ecasound-list): + +On 2002.01.27 17:23 Kai Vehmanen wrote: +> ecasound -a:1,2 -i foo.wav \ +> -a:1 -ea:-100 \ +> -a:2 -etd:0,0,1,100 -kos:1,0.05,5,0.1,0 \ +> -a:1,2 -o /dev/dsp + +Cool, thanks for the examples. But why does this last example crisp? --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-29.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-29.txt @@ -0,0 +1,30 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-29): Ecamonitor - ecasound monitor client implemented using NetECI. + - submitted: kaiv, 29.09.2002 + - closed: 07.11.2002 + +------------------------------------------------------------------------ +Details: + +- rationale + - there's a need for better real-time status monitoring than that + provided by current ecasound frontends +- list of goals/requirements that should be reached + - ability to monitor (in real-time) at least the following: + - lists of chains, inputs and outputs of the connected cs + - current position and overall length of the connected cs + - engine status (running/stopped/finished/notready/error) + - list of chainops and ctrls plus their current parameter + values + - no need to restart if ecasound is restarted; ie. ability to + automatically reconnect if connection is lost +- future work + - monitoring central cs-params: srate, buffersize, raisedpriority, ... + - MIDI-activity monitoring + - monitoring volume levels +- related EDIs + - edi-27: NetECI - network interface for controlling ecasound operation. + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-26.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-26.txt @@ -0,0 +1,19 @@ +------------------------------------------------------------------------ +Status: OPEN/CLOSED + +(edi-26): Logarithmic linear envelopes + - submitted: jhall, 23.04.2002 + - migrated to sf.net -> sffeat:2134171 + +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ + +[kaiv on ecasound-list, 23.04.2002] + +Implementation should be quite straightforward. You should start from +ecasound/libecasound/linear-envelope.cpp (log-envelope.cpp), and just +rewrite the value() member function. Similarly with the two-stage +envelope. + --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-3.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-3.txt @@ -0,0 +1,40 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-3) Extra parameters for effect presets describing its parameters, + author, etc + - submitted: kaiv, 17.08.2001 + - done: kaiv, 20.10.2001 +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ +- kaiv, 18.10.2001: + +--cut-- +I've been thinking about adding new preset-specific options. Something +like: + +- pd* (preset description) + - descripton: -pd:"A more verbose description of the preset." +- pp* (preset parameter information) + - upper bounds: -ppu:200,1.2,-,- + - lower bounds: -ppl:100,-1.0,0,- + - default values: -ppd:150,0,0,0 + - type flags: -ppt:-,log,int,toggle + +The above matches with hint-information provided by LADSPA plugins and +ecasound's internal effects (libecasound/eca-operator.h). Let's try to +compose a complete example + +two_filters = -efl:800 -ea:%lowgain | -efh:800 -ea:%highgain \ + -pd:"Parallel highpass and lowpass filters." \ + -ppu:-,- \ + -ppl:0,0 \ + -ppd:100,100 \ + -ppt:-,- + +This would set the default for %lowgain and %highgain to 100, and +low-bound them to positive values. As no type flags are specified, the +parameters are to be treated as normal floating-point values. +--cut-- \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-27.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-27.txt @@ -0,0 +1,107 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-27): NetECI - network interface for controlling ecasound operation. + - submitted: kaiv, 28.06.2002 + - done: kaiv, 31.10.2002 + +------------------------------------------------------------------------ +Details: + +- rationale + - current ecasound frontends are not good at giving real-time + status information; using separate monitor clients could + solve this problem +- list of goals/requirements that should be reached + - to allow control of an ecasound session from multiple + indepedent client instances + - functionality available to clients equivalent to + the ECI API +- todo-list +- results + - see screenshot at... + http://www.eca.cx/screenshots/ecasound-2.2.0-pre4_neteci_ecamonitor.png + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 28.06.2002] + +1. NetECI + +NetECI is a slightly modified version of the ECI API that allows +applications to communicate with remote ecasound sessions. The +basic use-case is: + +(machine-1) (machine-3) +'NetECI App A' <-- TCP/IP --> 'ecasound -c --daemon' + ^ +(machine-2) | +'NetECI App B' <-- TCP/IP ---------| + +2. ECI vs NetECI + +The only required API change is extending the init function. So instead of +'eci_init(void)' you'd have 'neteci_init(const char* hostname, int port)'. +The NetECI library will handle all the network communication. App using +NetECI can just issue EIAM commands as usual and not worry about the +implementation details. + +3. Protocol + +NetECI is really just a RPC-version (remote procedure call, or +remote-invocation (RMI) for you java-men) of ECI. I could use any of the +numerous available RPC mechanisms (Sun's RPC, CORBA, SOAP, KDE's DCOP, +GNOME's Bonobo, XML-RPC, etc, etc) for the implementation, but I'm pretty +certain won't. Instead the protocol will be a straightforward, text-based +protocol using TCP/IP or UNIX-sockets. I can once again reuse the EIAM +parser code in libecasound and use it this time as a protocol parser. This +way there's really not that much new code for me to write. + +One interesting thing is that it will be quite easy to write a native +implementation of the NetECI client side in perl, python, C, java, etc. +You just need to handle the TCP/IP communication with the ecasound daemon +and that's it, no need to link against libecasound or install glue-code +like pyeca. Of course, using the C++ NetECI implementation would still be +possible, too. + +The protocol itself will probably be a request-response system, where the +request format is: + +--cut-- + +--cut-- + +... and the response: + +--cut-- + +--cut-- + +So extremely simple. One possible problem is bandwidth usage, so I don't +want to make the protocol overly complex. Any comments? + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 30.06.2002] + +First version of the NetECI daemon code is now in the CVS. +There's also a simple client program written in python +in the examples directory (netecimonitor.py). To test it out: + +[console 1] +ecasound -c --daemon -i foo.wav -o alsa -ea:100 -kl:1,80,120,0.2 + +[console 2] +cd ecasound/examples +./netecimonitor.py + +You should get a status screen of ecasound operation that is updated once +a second. You can exit and restart the ecasound instance and +netecimonitor will try to reconnect automatically to the new server +instance. If you run ecasound without --daemon, everything works like +before. + +NetECI binds to the TCP port 2868 and is able to handle multiple clients +at the same time. While it does work, the server currently crashes once in +a while for some unknown reason. I suspect there're problems in the +multithread locking code. + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-6.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-6.txt @@ -0,0 +1,84 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-6) 100% transparent implementation of -z:db system. + - submitted: smassy, xx.06.2001 + - first version: kaiv, 03.10.2001, 2.1 CVS-tree + - done: 06.10.2001, ecasound 2.1dev0 + +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ +- test #1, 15.10.2001, 2.1dev2-CVS + --> root, -B:rtlowlatency, + --> runtime 90s + --> setup 9ch-16bit + 10ch-32bit (mixing-test.ecs) + + (eca-engine) *** profile begin *** + Loops faster than realtime: 7785 (<5.8 msec) + Loops slower than realtime: 8303 (>=5.8 msec) + Loops slower than realtime: 1 (>11.6 msec) + Loops exceeding all buffering: 0 (>17.4 msec) + Total loops: 16088 + Fastest/slowest/average loop time: 0.4/11.7/5.8 msec. + (eca-engine) *** profile end *** + (audioio-proxy-server) *** profile begin *** + Profile_full_rep: 1 + Profile_no_processing_rep: 148 + Profile_not_full_anymore_rep: 15551 + Profile_processing_rep: 913 + Profile_read_xrun_danger_rep: 42296 + Profile_write_xrun_danger_rep: 0 + Profile_rounds_total_rep: 16613 + Fastest/slowest/average loop time: 0.0/421.5/3.7 msec. + (audioio-proxy-server) *** profile end *** +- test #2, 15.10.2001 + --> like #1, but run as non-root (mixing-test.ecs) + + (eca-engine) *** profile begin *** + Loops faster than realtime: 7506 (<5.8 msec) + Loops slower than realtime: 7996 (>=5.8 msec) + Loops slower than realtime: 29 (>11.6 msec) + Loops exceeding all buffering: 2 (>17.4 msec) + Total loops: 15504 + Fastest/slowest/average loop time: 0.4/19.0/5.8 msec. + (eca-engine) *** profile end *** + (audioio-proxy-server) *** profile begin *** + Profile_full_rep: 2 + Profile_no_processing_rep: 142 + Profile_not_full_anymore_rep: 15002 + Profile_processing_rep: 891 + Profile_read_xrun_danger_rep: 41117 + Profile_write_xrun_danger_rep: 0 + Profile_rounds_total_rep: 16037 + Fastest/slowest/average loop time: 0.0/446.2/3.7 msec. + (audioio-proxy-server) *** profile end *** +- test #2, 15.10.2001 + --> root, -B:auto, -z:db running with sched_fifo, ecasound_debug v2.1dev2-CVS + --> runtime 200s (mixing-test.ecs) + --> setup 3x 1ch 16bit-wavs + 3x 2ch 16bit-wavs + 1x 10ch 32bit-wav, + 4x 2ch mp3 + 1x 2ch ogg + total -> 29ch + + (eca-engine) *** profile begin *** + Loops faster than realtime: 4427 (<23.2 msec) + Loops slower than realtime: 4076 (>=23.2 msec) + Loops slower than realtime: 595 (>46.4 msec) + Loops exceeding all buffering: 0 (>185.8 msec) + Total loops: 8503 + Fastest/slowest/average loop time: 6.9/53.1/23.2 msec. + (eca-engine) *** profile end *** + (audioio-proxy-server) *** profile begin *** + Profile_full_rep: 1 + Profile_no_processing_rep: 275 + Profile_not_full_anymore_rep: 5833 + Profile_processing_rep: 2765 + Profile_read_xrun_danger_rep: 1504 + Profile_write_xrun_danger_rep: 0 + Profile_rounds_total_rep: 8874 + Fastest/slowest/average loop time: 0.0/323.7/15.1 msec. + (audioio-proxy-server) *** profile end *** \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-23.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-23.txt @@ -0,0 +1,33 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-23): Extending the max_buffers audio i/o parameter + - submitted: kaiv, 22.02.2002 + - migrated to sf.net: sffeat:2134167 + +------------------------------------------------------------------------ +Details: + +- rationale + - currently use of hw-level buffering for realtime + can be controlled by a toggle option max_buffers + - this is too limited for many situations + +- goal + - to replace max_buffers with the concept of + buffer_count in AUDIO_IO_DEVICE interface + - extending the command-line syntx + - make it possible for user to select between + 1) maximum bufferin, 2) minumum (= 3 buffers) + or 3) exact buffer count + +- solution ideas + - -z:intbuf and -z:nointbuf (still before) + - -z:bufcount,X (use X buffers of -b:Y frames) + - similar notation in buffering profile handling + +- list of critical points (possibly problems, difficult use cases) + - if -z:intbuf is specified, how many period should + engine use for prefilling...? + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-40.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-40.txt @@ -0,0 +1,51 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-40): Update to error and warning reporting mechanisms. + - submitted: kaiv, 13.05.2004 + - closed: kaiv, 03.03.2008 + +------------------------------------------------------------------------ +Details: + +- rationale; why should this item be implemented? + - in many cases, ecasound does not give a user-understandable + explanation on why the requested operation failed + - distinction between errors and warnings is not clear in many + places + +- list of goals/requirements that should be reached + - better error reporting for key places: + - ...when adding user-visible objects + - ...when connecting a chainsetup + - ...when issuing EIAM commands + +- todo-list + - none + +- done items list + - return explanation on why chainsetup is not considered to be valid [2008] + - proposal: ECA_CONTROL::chainsetup_details_to_string() + - implemented in: ECA_CHAINSETUP::is_valid_for_connection() + - common errors: invalid -f:... options [12/2006] + - common errors: trying to seek non-seekable objects [12/2006] + - returning explanations why a csetup is not valid + - ECA_CONTROL::check_action_preconditions() (case 5) + -> these are now reasonably good [12/2004] + - ECA_CONTROL::action() -> cs_connect [done, 12/2004] + - ECA_CONTROL::action() -> reconnect after case-switch + -> these are now reasonably good [12/2004] + - added explanations to engine run errors [12/2004] + - print more detailed explanation why a chainsetup + cannot be connected [12/2004] + - do not raise an error conditions on non-fatal cases when + connecting chainsetups [12/2004] + +- detected error scenerios: + - warning: some inputs and/or outputs are not connected + to any chain (ecasound -i foo.wav -i foo.bar -o rtnull) -> can + be connected but result is probably not what the user expected + - error: some chain is missing either an input or output -> cannot + be connected (ecasound -a:1 -i foo.wav -a:2 -i bar.wav -o rtnull) + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-4.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-4.txt @@ -0,0 +1,16 @@ +------------------------------------------------------------------------ +Status: FROZEN + +(edi-4): 14bit MIDI-CCs controller source. + - submitted: kaiv, 17.08.2001 + - frozen: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134195 + +------------------------------------------------------------------------ +Reason for the frozen status: + +- proper implementation of requires use of timeout, which can get + pretty messy +- see messages on alsa-devel in June 2003 + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-19.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-19.txt @@ -0,0 +1,277 @@ +------------------------------------------------------------------------ +Status: FROZEN + +(edi-19) Separate file format for multitrack setups (.emt). + - submitted: kaiv, 18.10.2001 + - frozen: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134201 + +------------------------------------------------------------------------ +Reason for the frozen status: + +- there's already too many alternatives on how to use ecasound; a new + file format would jus add confusion and bloat (even though the idea + itself is not a bad one) + +------------------------------------------------------------------------ +- kaiv, 18.10.2001 + +--cut-- +What if ecasound could understand the following file format: + +file "my_next_big_hit.emt" +--cut-- +[globals] +input = /dev/dsp +output = /dev/dsp +options = -t:20 +[tracks] +# name mon/rec gain-% pan-% chain ops +drums.wav mon 100 50 -efl:4000 +303line.wav mon 120 50 -etr:60,0,7 +lead.wav rec 100 50 +--cut-- + +You'd write the above (or use a separate frontend app that can save to +.emt), and then use it like: + +ecasound my_next_big_hit.emt -c +[...] +ecasound ('h' for help)> start + +... and so on. The benefits of .emt would be: + +- easier to use (hides ecasound's input, output and chain concepts); + anyone who knows how to use cakewalk, cooledit or an analog + 4-track should be able to understand how the above works (perhaps + a gui is needed, but that doesn't change the concept) +- faster changing between mix-to-dsp, mix-to-file and + record-new-track modes (only one .emt file instead of + multiple ecs-files) + +Negative things: + +- conversion from .ecs to .emt might prove to be trickier + (.emt cannot express all chainsetup configurations), + which again means that changes made in iactive + mode are not (necessarily) stored to .emt files + +Internally ecasound would convert the .emt files to chainsetup (.ecs) +files before loading. So something like: + +--cut-- +# ecasound chainsetup file + +# general +-sr:44100 -t:20 -z:noxruns -z:nopsr + +# audio inputs +-a:mon1 -i:drums.wav +-a:mon2 -i:303line.wav + +# audio outputs +-a:mon1,mon2 -o:/dev/dsp + +# chain operators and controllers +-a:mon1 -ea:100.00 -epp:50.00 -efl:4000.00 +-a:mon2 -ea:120.00 -epp:50.00 -etr:60.00,0.00,7.00 +-a:rec1 -ea:100.00 -epp:50.00 +--cut-- + +--cut-- + +------------------------------------------------------------------------ +- Luis Pablo Gasparotto, 18.10.2001 + +--cut-- +What do you think about this? + +# name mon/rec Start time gain-% pan-% chain ops +drums.wav mon 00:00 100 50 -efl:4000 +303line.wav mon 00:00 120 50 -etr:60,0,7 +lead.wav rec 01:30 100 50 + --cut-- + +------------------------------------------------------------------------ +- S. Massy, 19.10.2001 + +--cut-- +> What if ecasound could understand the following file format: +Very interesting... +> +> file "my_next_big_hit.emt" +> --cut-- +> [globals] +> input = /dev/dsp +> output = /dev/dsp +> options = -t:20 +> [tracks] +> # name mon/rec gain-% pan-% chain ops +> drums.wav mon 100 50 -efl:4000 +> 303line.wav mon 120 50 -etr:60,0,7 +> lead.wav rec 100 50 +> --cut-- +- I like the way you divide it into either rec (read `input' and write to + `name) and mon (read from `name' and write to `output') +- Why use up fields for gain and pan while they can be expressed as cops? + To make it look like an analog multitrack recorder? +- You'd need a field to specify the format for each file. +- Cruel lack of identifiers. (see below) + +> +> You'd write the above (or use a separate frontend app that can save to +> .emt), and then use it like: +> +> ecasound my_next_big_hit.emt -c +> [...] +> ecasound ('h' for help)> start +While I agree that it's nice for a new user to have a more simple format to +specify a cs, I only see it as I side benefit (if the user is into asci files +he might as well write an .ecs.) The real benefit in such format I deem would +be for front-ends. +- Ability to store information into a file format already understood by + ecasound. +- Ability to store information in a way that is compatible between different + front-ends. + (You can have a simple shell script to create a multitrack spec and then + load it into a full-featured x-based c++ program.) +You'll say that programs might as well write directly to .ecs and do the +vulgarization on its own; that may be true, but .emt would simplify the job +greatly. + +So here we come to my point which is the need for identifiers in an +hypothetical .emt file; wouldn't it be nice if you could always reuse the +template of an .emt file, only changing the filenames? Also, identifiers +help make it more concrete (names) and more coherent between different +front-ends (you load your .emt file in another app and the tracks are still +described the same way.) +So here's my idea of an .emt format with a setup that is frequent to me (it +uses braces though, be warned, I know some don't like braces.): + +my_next_big_hit.emt +---------- +guitar_recording_stage { + # Always have comments allowed in a file format. + input = /dev/dsp + output = /dev/dsp + format = 16,2,44100 + options = -t:500 + + rt_monitor { + type = mon + target = /dev/dsp + operators = -erc:1,2 -ea:120 + } + + bass_monitor { + type = mon + target = bass/take2.wav + format = 16,1,44100 + operators = -pn:bassboost + } + + drums_monitor { + type = mon + target = drums/drums.ewf + } + + metronome { + type = mon + target = null + operators = -pn:metronome,120 + } + + guitar_rec { + type = rec + target = guitar/take1.raw + operators = -erc:1,2 + } +} + +Of course, you seldom need a metronome when you already have other tracks +to monitor, I'm just trying to show what we need to have to be happy. :) + +One thing that I'd like to see would be the ability to set offsets directly +from the command-line (and from a file like .emt) because, to quote Janne in +an approximate way, "You need to take a breath between the moment you hit +start and the moment you start to play." Also, while a metronome isn't +altogether required while monitoring with other tracks, some sort of clicks +at the beginning would be quite welcome, but right now there aren't any +simple way to do it, is there? Apart from wrapping every file into an ewf? +Wouldn't it be nice if we could do: +---------- +my_project { + [...] + offset = 25 # 25 seconds to go from the keyboard to the guitar. + [...] + clicks { + type = mon + target = null + length = 4 # 8 clicks + operators = -pn:metronome,120 + } + + monitor { + [...] + offset = 4 # += general offset + [...] + } + + recording { + [...] + offset = 4 # += general offset + [...] + } +} +---------- + +> +> ... and so on. The benefits of .emt would be: +> +> - easier to use (hides ecasound's input, output and chain concepts); +> anyone who knows how to use cakewalk, cooledit or an analog +> 4-track should be able to understand how the above works (perhaps +> a gui is needed, but that doesn't change the concept) +> - faster changing between mix-to-dsp, mix-to-file and +> record-new-track modes (only one .emt file instead of +> multiple ecs-files) +I'm not sure to understand what you mean here... +> +> Negative things: +> +> - conversion from .ecs to .emt might prove to be trickier +> (.emt cannot express all chainsetup configurations), +> which again means that changes made in iactive +> mode are not (necessarily) stored to .emt files +Ah, well, that's the price to pay for gained simplicity. +> +> Internally ecasound would convert the .emt files to chainsetup (.ecs) +> files before loading. So something like: +BTW, with the format I described above, you could store multiple templates +in one .emt file, possibly describing each stage of a recording. Then, it +would be transformed into multiple cs by ecasound and you'd only have to +select the appropriate one. +> +> --cut-- +> # ecasound chainsetup file +> +> # general +> -sr:44100 -t:20 -z:noxruns -z:nopsr +> +> # audio inputs +> -a:mon1 -i:drums.wav +> -a:mon2 -i:303line.wav +> +> # audio outputs +> -a:mon1,mon2 -o:/dev/dsp +> +> # chain operators and controllers +> -a:mon1 -ea:100.00 -epp:50.00 -efl:4000.00 +> -a:mon2 -ea:120.00 -epp:50.00 -etr:60.00,0.00,7.00 +> -a:rec1 -ea:100.00 -epp:50.00 +> --cut-- +Here comes again the problem of identifiers that I spoke of earlier, in +this way, how would the front-end app know which chain is which? +--cut-- + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-1.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-1.txt @@ -0,0 +1,27 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-1): Initial reverb-spike with the -ete reverb. + - submitted: Anthony Paul Van Groningen, 04.01.2001 + - fixed: Hans-Georg Fischer, 07.12.2002 + +------------------------------------------------------------------------ +Details: + +----------------------------------------------------------------------- +[Bill Allen on ecasound-list, 9 Jul 2002] + +I completely inadvertently found a workaround - a real hack, but it +works! In any chain containing -ete:..., include -ef4:0.8,0.5. The parameters +of the -ef4 (low-pass filter) don't seem to matter, so if you use +-ef4:1.0,0.5, then you've got essentially a noop filter (all-pass +filter). I tried this trick with the -ef1:5000 and a couple of other filters to no +avail. It only works with -ef4:...! I think this is significant because +Kai's full reply to my original question noted that the author of -ete +was Stefan M. Fendt who is also the author of -ef4: according to the +ecasound man page. + +I just haven't found a better sounding reverb effect that that of -ete. +I've heard good things about freeverb3, but it hasn't worked well for me. + +----------------------------------------------------------------------- --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-39.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-39.txt @@ -0,0 +1,25 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-39): Timestamped EIAM commands. + - submitted: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134189 + +------------------------------------------------------------------------ +Details: + +- rationale; why should this item be implemented? + - lots of flexibility to mixing + +- reasons agains + - partly overlapping controller sourced + - timestamping might be more easy to use for adding non-regular + param-change events to the mix + +- possible limitation + - without adding a completely new event system, timestamping + granularity will be limited to buffersize (-b:x) + - for accurate timestamping; only rt-capable EIAM commands + can be used + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-24.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-24.txt @@ -0,0 +1,24 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-24): Resample audio object + - submitted: kaiv, 22.02.2002 + - implemented: kaiv, 22.08.2002, 2.1dev12 + +------------------------------------------------------------------------ +Details: + +- rationale + - to replace the old implicit resampling feature that + was present in 2.1dev7 and earlier +- solution ideas + - usage: -i resample,child_freq,audio_object + - example: -i resample,22050,foo.wav + - or alternatively: -f:16,2,22050 -i autoresample,foo.wav +- open issues + - what algorithm to use? maybe use a better algorithms + taken for instance from sox... + - still using linear-interpolation + +------------------------------------------------------------------------ + --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-35.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-35.txt @@ -0,0 +1,39 @@ +------------------------------------------------------------------------ +Status: PARTIALLY-IMPLEMENTED + +(edi-35): JACK support to ecasound's interactive mode (EIAM) + - submitted: kaiv, 16.11.2002 + - frozen: kaiv, 20.08.2003 + - unfrozen: kaiv, 20.09.2008 + - partially implemented: kaiv, 20.09.2008 (2.6.x) + +------------------------------------------------------------------------ +Reasons for not implementing: + +- duplicated effort with projects like 'qjackconnect', + 'jackd_plumbing', 'jackctl', and various others + implementing good set of features (especially client and port name + completion is not a trivial job) + +------------------------------------------------------------------------ +Details: + +- add a set of commands to control JACK using EIAM commands +- provided services + - connecting and disconnection ports + - jack-connect , + - jack-disconnect --"-- + - querying list of (all) connections + - jack-get-connections + - querying port and total latency + - jack-get-latency + - jack-get-total-latency + - querying timebase state + - and so on... +- new functionality compared to existing command-line JACK tools + - interactive shell with command completion and command + history + - use via the ecasound control API (interfaces available + for C++, C, lisp, perl, php, python) + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-13.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-13.txt @@ -0,0 +1,22 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-13): Possible bug in forked-stream module (mp3,ogg), which + causes ecawave crashes. + - submitted: kaiv, 17.08.2001 + - fixed: kaiv, 24.02.2002 + +------------------------------------------------------------------------ +Details: + +- description of problem/idea with background info + - ecawave crashed when playing mp3 files + +- solution ideas + - it seems that problem was caused by the fact that + ecawave was _not_ linked against libpthread + - most libecasound functions worked fine, but + when a libecasound thread called fork(), that thread + died right away and left very little trace + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-21.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-21.txt @@ -0,0 +1,44 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-21) Review of object position functionality + - submitted: kaiv, 31.01.2002 + - done: kaiv, 01.02.2002 + +------------------------------------------------------------------------ +Details: + +- goals + - find out which objects contain audio position and length + information [done!] + - determine how different objects behave when position (or length) + is set in different situations (chainsetup connected/disconnect, + with/without engine running) [done!] + - add concept of current position to controller objects (to + make for example fade-ins work even if chainsetup position + is changed during operation) [done!] + - make sure all ECI commands work correctly in all + situations described above [done!] + - update documentation [done!] +- technical details + - separate ECA_AUDIO_POSITION from ECA_AUDIO_FORMAT; make + both of them inherit ECA_SAMPLERATE_AWARE [done!] + - implement ECA_CHAINSETUP_POSITION using ECA_AUDIO_POSITION [done!] +- open issues + - what's the role of ECA_AUDIO_TIME? [=> separate concrete class] + - should new functionality (locations, alternative position + representations) be added to ECA_AUDIO_POSITION? [=> maybe, + now it involves much less work than before] +- changelog + - added: edi-21 implemented; a much improved framework + for handling audio position information is now + in place; -kl, -kl2 and -klg are now position + aware - changing chainsetup position also affects + controller sources + - removed: ia-mode - 'c-rewind', 'c-forward' and + 'c-setpos' + - changed: looping with -tl always loops from the start; + -y can't be used for offseting loop start + offset -> use ewf-files instead + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-list.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-list.txt @@ -0,0 +1,227 @@ +----------------------------------------------------------------------- +*** Ecasound - List of Ecasound Development Items (edi-xxx) *** +----------------------------------------------------------------------- + +----------------------------------------------------------------------- +[ Ecasound Development Items - (edi-x) codes ] + +The Ecasound Development Item concept was used for keeping track of +bugs, open issues, enhancement proposals, and other similar issues +for Ecasound develoment through years 2002-08. In September 2008, +all remaining items were transfered to the web based tracker +at sourceforge.net: + + - https://sourceforge.net/tracker/?group_id=4605&atid=104605 + +Each new EDI item is identified by a unique number. The resulting +tag '(edi-xxx)' is used as a reference in mailing list discussions, +changelogs, etc. + +----------------------------------------------------------------------- +[ Meta: Syntax ] + +(edi-xxx): Short description of the item. This should be no more + than a few lines. + - submitted: who submitted, date + - action: what happened, who and when + +Note! See README for a list of defined developer tags (kaiv -> me). + +----------------------------------------------------------------------- +[ Section: Bugs, problems -> transfered to sourceforge.net tracker ] + +(edi-25): Distortion with multitap delay -etm if delay length changes + dynamically. + - submitted: rjpoelstra, 27.01.2002 + - migrated to sf.net -> sfbug:2134149 + +----------------------------------------------------------------------- +[ Section: Enhancements, new features -> transfered to sourceforge.net tracker in 2008/09 ] + +(edi-5): Threshold parameter to -eca. + - submitted: ecasound-list daemon :), 2001 + - migrated to sf.net -> sffeat:2134151 +(edi-7): Adding a 'loop x times' option to the ewf file format. + - submitted: nolan_d, 09.07.2001 + - partially implemented: kaiv, 11.07.2008 (combination of 'select' + and 'audioloop' provides similar functionality) + - migrated to sf.net -> sffeat:2134153 +(edi-9): Adding and removing audio and chainop objects on-the-fly. + - submitted: jhalttun, xx.06.2001 + - migrated to sf.net -> sffeat:2134154 +(edi-16): More flexible system for assigning controllers of + controllers (-kx). + - submitted: jhalttun, 02.09.2001 + - migrated to sf.net -> sffeat:2134159 +(edi-20): Ewf-v2 format. + - submitted: kaiv, 26.11.2001 + - migrated to sf.net -> sffeat:2134162 +(edi-23): Extending the max_buffers audio i/o parameter + - submitted: kaiv, 22.02.2002 + - migrated to sf.net -> sffeat:2134167 +(edi-26): Logarithmic linear envelopes + - submitted: jhall, 23.04.2002 + - migrated to sf.net -> sffeat:2134171 +(edi-31): Support for dynamic sampling rate and buffersize changes. + - submitted: kaiv, 23.10.2002 + - migrated to sf.net -> sffeat:2134175 +(edi-34): Better checks for parsing operator arguments. + - submitted: jhalttun, 28.10.2002 + - migrated to sf.net -> sffeat:2134179 +(edi-35): JACK support to ecasound's interactive mode (EIAM) + - submitted: kaiv, 16.11.2002 + - frozen: kaiv, 20.08.2003 + - unfrozen: kaiv, 20.09.2008 + - partially implemented: kaiv, 20.09.2008 (2.6.x) + - migrated to sf.net -> sffeat:2134183 +(edi-36): Addition of position markers. + - submitted: julien, 17.03.2003 + - migrated to sf.net -> sffeat:2134186 +(edi-37): Porting Steve Harris' dither code from JACK to ecasound + - submitted: jhall, 17.03.2003 + - migrated to sf.net -> sffeat:2134188 +(edi-39): Timestamped EIAM commands. + - submitted: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134189 +(edi-41): Addition of "bus" concept. + - submitted: kaiv, 13.11.2005 + - migrated to sf.net -> sffeat:2134191 +(edi-42): Ability to split recording output into multiple files. + - submitted: aolrich, 30.12.2005 + - migrated to sf.net -> sffeat:2134193 + +----------------------------------------------------------------------- +[ Section: Frozen -> transfered to sourceforge.net tracker in 2008/09 ] + +(edi-4): 14bit MIDI-CCs controller source. + - submitted: kaiv, 17.08.2001 + - frozen: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134195 +(edi-19): Separate file format for multitrack setups (.emt). + - submitted: kaiv, 18.10.2001 + - frozen: kaiv, 20.08.2003 + - migrated to sf.net -> sffeat:2134201 + +----------------------------------------------------------------------- +[ Section: Closed items ] + +(edi-1): Initial reverb-spike with the -ete reverb. + - submitted: Anthony Paul Van Groningen, 04.01.2001 + - fixed: Hans-Georg Fischer, 07.12.2002 +(edi-2): Possibility to specify audio object's type instead of using + filename extensions. + - submitted: Toby Shepard, 13.07.2001 + - done: kaiv, 06.10.2001, to ecasound 2.1dev0 +(edi-3): Extra parameters for effect presets describing its parameters, + author, etc + - submitted: kaiv, 17.08.2001 + - done: kaiv, 20.10.2001 +(edi-6): 100% transparent implementation of -z:db system. + - submitted: smassy, xx.06.2001 + - first version: kaiv, 03.10.2001, 2.1 CVS-tree + - done: 06.10.2001, ecasound 2.1dev0 +(edi-8): EIAM parser doesn't handle white-space properly (for instance + "ai-add Filename with whitespace"). + - submitted: smassy, 8.5.2001 + - done; junichi; 22.12.2001, ecasound 2.1dev6 +(edi-10): Adding ecalength to ecatools package. + - submitted: kaiv, xx.07.2001 + - done: kaiv, 06.10.2001, to ecasound 2.1dev0 +(edi-11): Hierarchy-based config file system. + - submitted: kaiv, xx.07.2001 + - done: kaiv, 06.12.2001, ecasound 2.1dev6 +(edi-12): Conversions problems with non-interleaved, s32_le streams. + - submitted: jhall, 16.7.2001 + - done: kaiv, 16.1.2002, ecasound 2.1dev7 +(edi-13): Possible bug in forked-stream module (mp3,ogg), which + causes ecawave crashes. + - submitted: kaiv, 17.08.2001 + - fixed: kaiv, 24.02.2002 +(edi-14): Making ALSA the default output device with a compile + time options. + - submitted: Patrick Shirkey, 18.8.2001 + - not implemented: kaiv, 12.05.2004 (workaround in 2.3.3) +(edi-15): More intelligent system for selecting buffering modes + and sizes for optimal out-of-the-box performance. + - submitted: kaiv, 09.08.2001 + - first version: kaiv, 05.10.2001, 2.1 CVS-tree + - done: kaiv, 06.10.2001, ecasound 2.1dev0 +(edi-17): Add bitrate parameter to mp3 objects. + - submitted: 30.09.2001, William Goldsmith + - done: 06.12.2001, Kai Vehmanen +(edi-18): Intelligent system for setting the internal sample rate. + - submitted: smassy, 17.10.2001 + - done: kaiv, 31.01.2002 +(edi-21): Review of object position functionality + - submitted: kaiv, 31.01.2002 + - done: kaiv, 01.02.2002 +(edi-22): Engine iteration from outside sources + - submitted: kaiv, 22.02.2002 + - closed: kaiv, 17.05.2002 +(edi-24): Resample audio object + - submitted: kaiv, 22.02.2002 + - implemented: kaiv, 22.08.2002, 2.1dev12 +(edi-27): NetECI - network interface for controlling ecasound operation. + - submitted: kaiv, 28.06.2002 + - done: kaiv, 31.10.2002 +(edi-28): Extending the EIAM command set to allow writing standalone ECI + implementations. + - submitted: kaiv, 29.09.2002 + - done: kaiv, 29.10.2002 +(edi-29): Ecamonitor - ecasound monitor client implemented using NetECI. + - submitted: kaiv, 29.09.2002 + - closed: kaiv, 07.11.2002 +(edi-30): Turning libecasound and libkvutils into static libraries. + - submitted: kaiv, 08.10.2002 + - initial implementation: kaiv, 16.10.2002 + - done: kaiv, 29.10.2002 +(edi-32): FLAC support. + - submitted: nolan_d, 17.10.2002 + - closed: kaiv, 09.07.2004 +(edi-33): Libsndfile support. + - submitted: kaiv, 29.10.2002 + - closed: kaiv, 28.11.2003 +(edi-38): Initial EIAM commands upon connecting a chainsetup. + - submitted: kaiv, 20.08.2003 + - frozen: kaiv, 20.08.2003 + - reopened: kaiv, 10.07.2008 + - closed: kaiv, 11.07.2008 +(edi-40): Update to error and warning reporting mechanisms. + - submitted: kaiv, 13.05.2004 + - closed: kaiv, 03.03.2008 + +----------------------------------------------------------------------- +[ History (newest first) ] + +28.09.2008 - rampdown, all remaining items transfered to sourceforge.net +20.09.2008 - edi-35 unfrozen, now partially implemented +03.03.2008 - edi-40 closed +07.07.2004 - edi-32 closed +13.05.2004 - edi-40 added, edi-14 closed +28.11.2003 - edi-33 closed +20.08.2003 - edi-4, edi-19 and edi-35 frozen, edi-38 added and frozen + immediately, edi-39 added +17.03.2003 - edi-36 and edi-37 added +07.12.2002 - edi-1 closed +16.11.2002 - edi-35 added +07.11.2002 - edi-29 closed +31.10.2002 - edi-27 closed +29.10.2002 - edi-28 and edi-30 closed, edi-32, edi-33 and edi-34 added +23.10.2002 - edi-31 added +15.10.2002 - edi-30 added +29.09.2002 - edi-27, edi-28 and edi-29 added +22.08.2002 - edi-24 closed +17.05.2002 - edi-22 closed +23.04.2002 - edi-26 opened +24.02.2002 - edi-13 closed +22.02.2002 - edi-22, edi-23, edi-24 and edi-25 opened +22.02.2002 - edi-template.txt updated +01.02.2002 - edi-12 closed +31.01.2002 - edi-12 opened +31.01.2002 - edi-18 closed +12.01.2002 - edi-12 closed + +2001 - no history information + +----------------------------------------------------------------------- + --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-31.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-31.txt @@ -0,0 +1,26 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-31): Support for dynamic sampling rate and buffersize changes. + - submitted: kaiv, 23.10.2002 + - migrated to sf.net -> sffeat:2134175 + +------------------------------------------------------------------------ +Details: + +- goals + - ability to dynamically change engine sampling rate and buffering + - primary aimed at supporting changes initiated by the JACK server +- status + - update 29.01.2003: is this needed anymore now that libjack + no longer required variable-nframes support from clients... + let's wait and see +- work to be done + - change the audioio-db system so that the double-buffer + can be read in blocks of != buffersize() + - ability to update all components of a chainsetup that + require knowledge of current buffersize + - ability to update all components of a chainsetup that + require knowledge of current sampling rate + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-15.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-15.txt @@ -0,0 +1,53 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-15) A more intelligent system for selecting buffering modes + and sizes for optimal out-of-the-box performance. + - submitted: kaiv, 09.08.2001 + - done: kaiv, 06.10.2001, ecasound 2.1.0 +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ +Inputs the engine should consider: + +- command-line options +- ~/.ecasoundrc + - bmode-XXX-raisedpriority (-r) + - bmode-XXX-buffersize (-b:x) + - bmode-XXX-double-buffering (-z:db) + - bmode-XXX-double-buffer-size (-z:db,size) + - bmode-XXX-max-internal-buffering (-z:intbuf) +- system user priviledges + - do we have root-permission for enabling rt-scheduling? +- used chainsetup + - multitrack-recording setup (recording w/ monitoring) + - recording from one or more realtime sources + - playback to one or more realtime sources + - playback to one or more realtime sources with + one or more chain operators + +Outputs - ie. what is set: + +- buffersize; -b:x +- use of per-object buffering (internal buffering); -z:intbuf / -z:nointbuf +- enabling/disabling rt-scheduling mode; -r +- enabling/disabling double-buffering; -z:db / -z:nodb + +Possible solution - operating modes: + +- rtreliable, rtlowlatency, normal/batch, auto +- set with -B:mode_name +- the mode determinates what default values are used +- possible mode-rtreliable-buffersize, etc +- rules for selecting a mode + 1) if we have root-priviledges (access to SCHED_FIFO), + default rt-mode is rtlowlatency + 2) if we have rt inputs or rt outputs, use + rt-mode (depending on (1), either rtlowlatency + or rtreliable) + 3) otherwise use 'normal' +- defaults could be: + - -B:rtlowlatency --> -b:256 -z:nointbuf -r -z:db + - -B:rtreliable --> -b:1024 -z:intbuf -r -z:db + - -B:batch --> -b:1024 -z:intbuf -z:nodb --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-30.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-30.txt @@ -0,0 +1,104 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-30): Turning libecasound and libkvutils into static libraries. + - submitted: kaiv, 08.10.2002 + - initial implementation: kaiv, 16.10.2002 + - done: kaiv, 29.10.2002 + +------------------------------------------------------------------------ +Details: + +- rationale: see below +- immediate goals + - shared versions of libecasound and libkvutils are never installed + - ecasound, ecamegapedal, ecawave and other apps that require + direct access to libecasound should use static linkage (but _not_ + necessarily to other libs than libecasound and libkvutils) + - ecasound-plugins are linked statically to the binaries +- long-term goals + - utils in the ecatools package should be rewritten using + the ECI API +- new ecasound packages + - runtime: ecasound binary, ECI apps, documentation and + libecasoundc + - devel: header files and .a libraries (libecasound + libkvutils) + +------------------------------------------------------------------------ +[kaiv on ecasound-list, 08.10.2002] + +First of all, if you think this is a very bad way to go, do let me know. +This request is aimed especially to those of you who are involved with +distribution issues. I'll consider silence as 'I agree'. :) Ok, let me +continue. + +1. Problem + +The current ecasound development model does not work very well. Nowadays +it's simply impossible for me to spend long periods of time on ecasound +development. I still have time for it, but it's just much more irregular. +The common scenario nowadays is that I spent a hectic day or two +implementing some new feature, and then have to return to other tasks. +After a month or so the cycle repeats. + +2. Symptoms + +With the current model, the development series just never gets enough +testing. As it is now, most ecasound users are using the stable branch. +Only very few people actively use the development versions. This means I'm +getting very little feedback concerning the new features, especially when +compared to the huge amount of functionality that ecasound nowadays +provides. + +A prime example of this is that yesterday, when doing some multitrack +recording with the latest 2.1dev12, I noticed a huge bug in the +multitrack-mode code. It turned out that ecasound would stop processing if +all inputs tracks became finished, _even though_ we were still recording a +live input. The fact that a bug of this magnitude has gone unnoticed for +many _months_ makes me very, very, very uncomfortable about the status of +the current development branch. + +3. Lost in the woods + +During the last year or so I've tried to find a cure to this problem. I've +spent lots and lots of time with library versioning issues, defining roles +for different branches, change control, developer documentation and other +stuff that doesn't directly benefit the normal end-users of ecasound +(including myself). + +I've also tried to attack the problem with testing. I've written separate +test tools for libecasound and libecasoundc, a general testsuite and +various smaller tools. These have helped a lot, but in the end, testing +just doesn't replace real-life use. + +At the same time, the reality is that aside ECI apps, _nobody_ is using +ecasound as a platform. So most of this work is just wasted effort. And +this isn't a problem of slow adoption. Although released versions of +libecasound have been available for over two years, the only applications +using it are ecawave and ecamegapedal (both written by me). Maintaining +the whole shared-library thing going on for just these two, +not-so-widely-used apps just doesn't seem sensible. + +4. Improvement Proposal + +Inspired by the recent work on standalone ECI implementations, I'd like to +drop the whole ecasound-as-a-platform concept, and instead, continue +developing ecasound as an application. Only supported way of using +ecasound as a development platform would be ECI. + +5. Implications + +- only one code-branch (no more separate stable and development + releases; just releases and CVS-access for bleeding-edge development) +- removal of all shared libraries (libkvutils and libecasound) +- ecasound binary would be statically linked against libkvutils + and libecasound, but dynamically against other libraries +- ecatools have to be rewritten using ECI (otherwise + we'd have too many multi-megabyte binaries :)) +- ecawave and ecamegapedal have to be linked statically (this + isn't that big of a problem, I'm quite sure the few people + on this planet that use all these three apps can + sacrifice the harddrive space for three copies of libecasound + and libkvutils + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-34.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-34.txt @@ -0,0 +1,29 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-34): Better checks for parsing operator arguments. + - submitted: jhalttun, 28.10.2002 + - migrated to sf.net -> sffeat:2134179 + +------------------------------------------------------------------------ +Details: + +- ecasound has detailed information about all operators + - audio objects + - chain operators + - LADSPA plugins + - effect presets + - controller sources +- much of this information could be used to implement more + intelligent parameter argument parsing + - correct number of parameters + - defaults values for those paramaters that are not + given + - the type of parameter (boolean, integer, an output + or read-only parameter, etc) + - a warning if the given value is out of recommended + parameter values bounds (lower and upper bounds) +- implementation location + - ecasound/libecasound/eca-object-factory.cpp + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-41.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-41.txt @@ -0,0 +1,41 @@ +------------------------------------------------------------------------ +Status: OPEN/CLOSED/FROZEN + +(edi-41): Addition of "bus" concept. + - submitted: kaiv, 13.11.2005 + - migrated to sf.net -> sffeat:2134191 + +------------------------------------------------------------------------ +Details: + +[background: what] +- problem of "loop" objects + - currently "loop" objects can be used to route audio + between chains + - loops however add delay to the processing chain + +[rationale: why] +- make it easier to create more complex configurations +- avoid unnecessary processing delays in complex + configurations due to loop objects +- concept of "buses" is familiar to many users (something + to which you mix multiple sources of audio) + +[description: how] +- list of goals/requirements that should be reached + - a new bus audio object type, based on current loop + object code + - changes to engine allowing to process the busses + without additional delay + +[todo-list] +- add the "bus" object type +- engine optimizations + +------------------------------------------------------------------------ + +- rest of the sections are reserverd for quotes from ecasound-list, + comments, etc +- each section should contain information about who wrote the comment + and when +- sections not edited \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-36.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-36.txt @@ -0,0 +1,28 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-36): Addition of position markers. + - submitted: julien, 17.03.2003 + - migrated to sf.net -> sffeat:2134186 + +------------------------------------------------------------------------ +Details: + +- discussed a few times on ecasound-list but so far no implementations +- the original idea was proposed by Jeremy Hall + +------------------------------------------------------------------------ +- Julien Claassen one casound-list, 16.03.2003 + + I just had the idea of having marks in ecasound. so that you could set them +and use them for finding certain positions. I thought this commands might be +necessary: + cs-setmark - set a mark at a specific position + cs-remove-mark - remove the selected mark + cs-goto-mark - goto the selected mark + cs-play-to-mark - just play from the current position to the selected mark +(to +see if it is set correctly) + cs-list-mark - list all the marks with their positions + +------------------------------------------------------------------------ --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-20.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-20.txt @@ -0,0 +1,29 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-20) Ewf-v2 format. + - submitted: kaiv, 26.11.2001 + - migrated to sf.net: sffeat:2134162 + +------------------------------------------------------------------------ +Details: + +------------------------------------------------------------------------ +- kaiv, 26.11.2001: + +I think it's time to redesign the ewf code (ewf-v2). The current +format is not ideal to work with and to extend. Few ideas I've had +in mind: + +- support for exact position information (ie. samples or seconds, + probably a toggle setting that lets ecasound know which format + to use when saving ewf-files) +- support for multiple audio objects +- well-defined behaviour when ewf-files is used as input and + output +- .... + +Any others? Ideas on how to implement the above are welcome (for instance, +how the multiple files should be specified in ewf-v2 files, how to handle +multiple ewf-versions, xml/ascii/bin, etc)? Hmm, I guess I'll make an EDI +entry for this... "(edi-20) Ewf-v2 format. \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-18.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-18.txt @@ -0,0 +1,86 @@ +------------------------------------------------------------------------ +Status: CLOSED + +(edi-18) Intelligent system for setting the internal sample rate. + - submitted: smassy, 17.10.2001 + - done: kaiv, 31.01.2002 + +------------------------------------------------------------------------ +Details: + +- added: edi-18 implemented; engine samplerate is now + set automatically - if object sample rates don't + match, an error is printed +- added: ecasoundrc - 'default-audio-format'; same syntax + as with the -f option; defaults to s16_le,2,44100,i +- removed: ecasoundrc - 'default-samplerate' +- removed: -sr option; not needed anymore + +------------------------------------------------------------------------ +- S.Massy, 17.10.2001: + +--cut-- + - When all objects have the same sr, use it as internal sr also. + - When objects have different sr always set internal sr equal to the highest + sr connected in the cs. + example: + if (-i:48000 && -o:48000) { sr = 48000 } + if (-i:44100 && -o:22050 && -o:48000) { sr = 48000 } + + That would improve ecasound's ease of use for many as well as its + apparent sound quality to a new user; because right now as soon as the + internal sr and the objects' sr differ, sound quality drops + dramatically because of the way ecasound converts sr's (as we + discussed on the list a while ago.) + Also maybe something similar should be done for rt objects. Because + if you have something like `-i:test.wav -o:alsa" though test.wav is at + a sample rate of 11025, alsa device is still open at 44100; ideally, + -f and -sr should only be used to override (or for headerless + formats). +--cut-- + +------------------------------------------------------------------------ +- kaiv, 24.01.2002 + - should be placed to ECA_CHAINSETUP::enable() (after input + and output init) + - ECA_ENGINE takes caref of initializing chains, so it's + not a problem + - issue a warning if -sr was not given and resampling results + +------------------------------------------------------------------------ +- kaiv, 29.01.2002 + +--cut-- +What if we just removed implicit resampling altogether? My reasoning +behind this is: + +- current resampling is not high-quality (mostly just causes + bad pr for ecasound) +- for any kind of realtime work, resampling should _not_ + be used (wastes cpu-resource for no good reason) +- only real use for resampling is file format conversions +- by removing the "resampling_needed()" check we + make the common code path a little bit faster (although + not much) and cleaner +- we avoid problems with unexpected resampling + +As a result you could not execute a chainsetup, where sampling rate of +one or more objects differs from engine's sampling rate. + +If this was done, implementation of 'edi-18' would be reduced to: + +- find the common sampling rate between audio objects +- if found: set engine's rate to it +- else: print an error message + +This would also make the -sr option obsolete. + +For cases where resampling is needed, a new audio object type could be +added - something like: + +ecasound -f:16,2,44100 -i resample,22050hz_file.wav,44100 -o output.wav + +As a bonus, as now resampling would be a special-case operation, we are +not limited to light resampling algorithms. In practise we could use a +much more high-quality (=cpu-heavy) alternative (if someone has the time +to do it). \ No newline at end of file --- ecasound2.2-2.7.0.orig/Documentation/archived/edi-22.txt +++ ecasound2.2-2.7.0/Documentation/archived/edi-22.txt @@ -0,0 +1,153 @@ +------------------------------------------------------------------------ +Status: OPEN + +(edi-22) Engine iteration from outside sources + - submitted: kaiv, 22.02.2002 + - closed: kaiv, 17.05.2002 + +------------------------------------------------------------------------ +Details: + +- goal: to make it possible to run ecasound's engine, loop at + at a time, from external sources such as JACK + client process() callback + +- engine public functionality + - is created to operate on a chainsetup (chainsetup + is tied to the engine when engine is created, so + reinitialization with a different chainsetup + object is not possible) + - accepting and reacting to incoming commands + (COMMAND_QUEUE) + - engine is launched by issuing the exec() member + function which blocks until engine operation + stops + +- engine modes + - one-shot/batch operation; once finished state is + reached, engine is exited (exec() returns) + +- areas that need attention + - how to handle multitrack-sync + - we need to discard input data; amount + equals to jack's output latency + - device specific latency() is problematic as + it depends on how engine use them (for instance + it might just write 2 blocks of data before + triggering although device is configured with + 8 blocks of buffering -> real latency is + 2 blocks, not 8 as device reports) + - latency times for all inputs must match, + same for outputs; this could be avoided, but + would require complex logic in the engine + code (not at least in the first version) + - various start and stop scenarios: + - jackd shutdown + - client timeout + - chainsetup is finished (all inputs are, or some + output is, finished) + - the state-change problem [done] + - case: stop command from ECA_CONTROL (engine-thread context) + - case: csetup becomes finished (callback context) + - case: csetup errors occurs (callback context) + - case: jackd shut down (callback context) + - prefilling of rt-outputs [done] + +- todo-list + - multitrack sync, see above [done] + - allowing driver objects to change sample rate and + buffersize [postponed] + +------------------------------------------------------------------------ +- Kai Vehmanen on jackit-devel, 23.02.2002 + +Subject: Re: [Jackit-devel] dealing with capture latency in a JACK system + +Answering to an older message... + +On Fri, 11 Jan 2002, Paul Davis wrote: + +> we can't start capturing data from the audio interface until a certain +> amount of time has passed after the onset of transport motion - that +> time corresponds to the playback latency of the audio interface. this +> is because before that time, audio playback from ardour will not be +> audible, and thus any data arriving from the audio interface matches a +> point in time before the matching, pre-existing audio was heard. + +If nothing else, it's this issue that will force me to redesign ecasound's +engine operation for JACK-type systems. + +Currently ecasound's multitrack-sync is based on running the top-level +graph for a few rounds with realtime objects disabled. In other words we +are prefilling realtime outputs with valid audio data (unlike jackd, which +prefills the buffers with silence). + +Once prefill phase is over, all realtime objects are triggered. We +don't need to care about capture latency, as recording was started +exactly at the same time as the first prefilled frame was outputted by +soundcard-hw. This has proven to work extremely well with different types +of realtime objects (no need to rely on querying latency information). + +But prefilling a JACK output port is not possible, so it seems I have to +rewrite the whole mechanism. :( + +> however, moving to JACK (or any other form of callback driven system, +> i think) removes the notion of "audio interface capture latency". all +> we have are ports, and the ports that we are capturing from may have +> varying latency. here, "latency" means the time between data being +[...] +> however, notice that in terms of real world practice, since nothing +> can be heard without passing through a physical audio interface first, +> all ports are subject to *at least* the latency of those on the +> physical audio interface client. this means that if we have a software +> synth that we are recording on track 1, despite the zero latency +> between audio synthesis by the synth and its receipt by ardour, its +> still not OK to capture the sound until enough time has passed that +> the sound has made it out to some kind of loudspeaker or +> headphones. otherwise, we are recording sound that doesn't correspond +> to what the user/musician can hear. + +How is this handled at the moment (for instance in ardour)? We already +have jack_get_latency() and jack_set_latency(), but as you describe above, +these are not enough for generic multitrack sync. + +I noticed that there's a jack_get_total_latency() implemented in engine.c, +but it's not available to the clients. Is this something you've intended +to do, but have not had time to finish? + +Let's take an example: + +ecasound -a:mon -i jack_mono,softsynth:in,in -o solo_guitar.wav \ + -a:rec -i dr_rhythm.wav -o jack_mono,fxrack:out,out + +Then we have connections: + +alsa_pcm:in_1 -> softsynth_pcm:in +softsynth_pcm:out -> ecasound_1:in +ecasound_1:out -> fxrack:in +fxrack:out -> alsa_pcm:out_1 + +Port latencies are: + +alsa_pcm:in_1 = x (period size) * y (period count) +alsa_pcm:out_1 = x * y +softsynth:in = 2*x +softsynth:out = 2*x +ecasound_1:in = 0 +ecasound_1:out = 0 +fxrack:in = x +fxrack:out = x + +Now to make sure the recorded 'solo_guitar.wav' audio is correctly +synced to 'dr_rhythm.wav', ecasound needs to know both the total latency +of 'softsynth:in' and 'fxrack:out'. + +In the above scenario, the total output latency of 'softsynth:in' is x*y+x +frames. So ecasound needs to ignore the first x*y+x recorded samples. And +as the total latency of 'softsynth:in' is x*y+2x, ecasounds has to ignore +yet x frames more of captured data until it starts to write to +'solo_guitar.wav'. + +Does this seem correct to you? + +------------------------------------------------------------------------ \ No newline at end of file --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/test-klg.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/test-klg.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# +# version:20091004-4 +# +# Script to generate and test common resampling +# use cases. The output files need to be verified +# manually. +# +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/test-klg.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +if test "x${ECASOUND}" = "x" ; then + ECASOUND=../../ecasound/ecasound_debug +fi + +# specify ecasound binary used to generate test reference files +ECAS_REF=ecasound-2.6.0 +CMP=../utils/ecacompare + +. test-common-sh + +check_ecabin + +set -x + +# control amplify with klg +# 0.0 -> 5.5: 0% -> 100% +# 5.5 -> 10.5: 100% -> 20% +# 10.5 -> 20.0: 20% -> 80% +# 20.0 -> 30.0: 80% -> 10% +# +$ECAS_REF -q -f:16,1,44100 -b:1024 -i tone,sine,440,30 -o klg-dst-ref.wav -ea:100 -klg:1,0,100,5,0,0,5.5,1,10.5,0.2,20.0,0.8,30,0.1 -x || error_exit +$ECASOUND -q -f:16,1,44100 -b:1024 -i tone,sine,440,30 -o klg-dst.wav -ea:100 -klg:1,0,100,5,0,0,5.5,1,10.5,0.2,20.0,0.8,30,0.1 -x || error_exit +#check_1dbpeak_count klg-dst.wav 5756 +check_filesize klg-dst.wav 2646044 +check_samples klg-dst.wav 1323000 +set -x +$CMP klg-dst-ref.wav klg-dst.wav +if [ $? != 0 ] ; then + set +x + echo "NOTE: ecacompare returned failure, manual verification recommended." +fi + +set +x +echo "Test run succesful." +echo "Run './clean.sh' to remove created audio files." + +exit 0 --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/run-all.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/run-all.sh @@ -0,0 +1,12 @@ +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/run-all.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +for i in `ls test-*.sh` ; do + ./$i + if test $? != 0; then + break + fi +done + --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/test-rtnull.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/test-rtnull.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# +# version:20080324-1 +# +# Script to generate and test common resampling +# use cases. The output files need to be verified +# manually. +# +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/test-rtnull.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +. test-common-sh + +set_ecasound_envvar +check_ecabin + +t=`( time -p $TESTECASOUND -q -f:16,1,44100 -i rtnull -o null -t:5.0 -z:nodb -z:nointbuf -b:128 2>/dev/null ) 2>&1 |grep real | cut -f2 -d' ' |cut -f1 -d'.'` + +# test is succesful if the duration is 5.x or 6.x seconds +# (the duration varies somewhat due to process startup delays, etc, +# and is thus not exact) +test "x$t" = "x6" || test "x$t" = "x5" || error_exit + +echo "Test run succesful." +exit 0 \ No newline at end of file --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/test-audioselect.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/test-audioselect.sh @@ -0,0 +1,64 @@ +#!/bin/bash +# +# version:20091004-4 +# +# Script to generate and test audio selecting. +# The output files need to be verified manually. +# +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/test-klg.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +if test "x${ECASOUND}" = "x" ; then + ECASOUND=../../ecasound/ecasound_debug +fi + +. test-common-sh + +check_ecabin + +# specify ecasound binary used to generate test reference files +ECAS_REF=ecasound-2.6.0 +CMP=../utils/ecacompare + +set -x + +# generate source file +$ECASOUND -q -f:16,1,44100 -i tone,sine,880,0 -o src44100.wav -t:10 || error_exit +ln -s src44100.wav src44100.foobar + +# perform test 1 +set -x +$ECAS_REF -q -f:16,1,44100 -i select,1,22000sa,src44100.wav -o as-dst22000sa-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,44100 -i select,1,22000sa,src44100.wav -o as-dst22000sa.wav -x || error_exit +set +x +samples=`sndfile-info as-dst22000sa.wav |grep Frames |cut -d ':' -f2` +if [ $samples != "22000" ] ; then error_exit ; fi +$CMP as-dst22000sa.wav as-dst22000sa-ref.wav +if [ $? != 0 ] ; then error_exit ; fi + +# perform test 2 (lq -> ext resamplers are not necessarily supported) +set -x +$ECAS_REF -q -f:16,1,88200 -i select,1.9,33000sa,resample-lq,44100,src44100.wav -o as-dst33000sa-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,88200 -i select,1.9,33000sa,resample-lq,44100,src44100.wav -o as-dst33000sa.wav -x || error_exit +set +x +samples=`sndfile-info as-dst33000sa.wav |grep Frames |cut -d ':' -f2` +if [ $samples != "33000" ] ; then error_exit ; fi +$CMP as-dst33000sa.wav as-dst33000sa-ref.wav +if [ $? != 0 ] ; then error_exit ; fi + +# perform test 3 +set -x +$ECAS_REF -q -f:16,1,44100 -i select,40000sa,55000sa,typeselect,.wav,src44100.foobar -o as-dst55000sa-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,44100 -i select,40000sa,55000sa,typeselect,.wav,src44100.foobar -o as-dst55000sa.wav -x || error_exit +set +x +samples=`sndfile-info as-dst55000sa.wav |grep Frames |cut -d ':' -f2` +if [ $samples != "55000" ] ; then error_exit ; fi +$CMP as-dst55000sa.wav as-dst55000sa-ref.wav +if [ $? != 0 ] ; then error_exit ; fi + +echo "Test run succesful (no manual verification needed)." +echo "Run './clean.sh' to remove created audio files." + +exit 0 --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/README +++ ecasound2.2-2.7.0/manual-tests/sh-tests/README @@ -0,0 +1,18 @@ +This directory contains various manual test cases for Ecasound. + +Files +----- + +run-all.sh + Shell script to run all the tests. + +clean.sh + Script to clean all temporary files created when + running the test cases. + +test-*.sh + The test cases. + +test-common-sh + Common bash functions used by test cases. + --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/clean.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/clean.sh @@ -0,0 +1,6 @@ +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/clean.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +rm -vf *dst*.wav src*.wav *.foobar --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/test-resample.sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/test-resample.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# +# version:20080321-2 +# +# Script to generate and test common resampling +# use cases. The output files need to be verified +# manually. +# +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/test-resample.sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +if test "x${ECASOUND}" = "x" ; then + ECASOUND=../../ecasound/ecasound_debug +fi + +# specify ecasound binary used to generate test reference files +ECAS_REF=ecasound +CMP=../utils/ecacompare + +. test-common-sh + +check_ecabin + +set -x + +# generate source file +$ECASOUND -q -f:16,1,96000 -b:1024 -i tone,sine,880,5 -o src96k.wav || error_exit +check_samples src96k.wav 480000 + +# perform resampling +$ECAS_REF -q -f:16,1,48000 -i resample,auto,src96k.wav -o re-dst48000-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,48000 -i resample,auto,src96k.wav -o re-dst48000.wav -x || error_exit +check_zerosum re-dst48000-ref.wav re-dst48000.wav +$CMP re-dst48000.wav re-dst48000-ref.wav ; if [ $? != 0 ] ; then echo "Note: diff" ; fi +check_samples re-dst48000.wav 240000 + +$ECAS_REF -q -f:16,1,44100 -i resample,auto,src96k.wav -o re-dst44100-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,44100 -i resample,auto,src96k.wav -o re-dst44100.wav -x || error_exit +check_zerosum re-dst44100-ref.wav re-dst44100.wav +#check_samples re-dst44100.wav 220450 + +$ECAS_REF -q -f:16,1,22050 -i resample,auto,src96k.wav -o re-dst22050-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,22050 -i resample,auto,src96k.wav -o re-dst22050.wav -x || error_exit +check_zerosum re-dst22050-ref.wav re-dst22050.wav +#check_samples re-dst22050.wav 110250 + +$ECAS_REF -q -f:16,1,16000 -i resample,auto,src96k.wav -o re-dst16000-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,16000 -i resample,auto,src96k.wav -o re-dst16000.wav -x || error_exit +check_zerosum re-dst16000-ref.wav re-dst16000.wav +#check_samples re-dst16000.wav 60000 + +$ECAS_REF -q -f:16,1,8000 -i resample,auto,src96k.wav -o re-dst8000-ref.wav -x || error_exit +$ECASOUND -q -f:16,1,8000 -i resample,auto,src96k.wav -o re-dst8000.wav -x || error_exit +check_zerosum re-dst8000-ref.wav re-dst8000.wav +#check_samples re-dst8000.wav 30000 + +echo "Test run succesful." +exit 0 \ No newline at end of file --- ecasound2.2-2.7.0.orig/manual-tests/sh-tests/test-common-sh +++ ecasound2.2-2.7.0/manual-tests/sh-tests/test-common-sh @@ -0,0 +1,95 @@ +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/test-common-sh +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +function error_exit() { + echo "ERROR: Test failure, exiting." + exit 1 +} + +function check_ecabin() { + if [ ! -e $TESTECASOUND ] ; then + echo "Ecasound binary not found." + error_exit + fi +} + +function set_ecasound_envvar() { + if test "x$TESTECASOUND" = "x"; then + if test -e "../../ecasound/ecasound_debug" ; then + TESTECASOUND="../../ecasound/ecasound_debug" + else + TESTECASOUND="../../ecasound/ecasound" + fi + fi +} + +function check_md5sum() { + set +x + if test "`md5sum $1 |cut -f1 -d' '`" != "$2" ; then + echo -e "\n\nWARNING: md5sum did not match (not necessarily an error, but" + echo -e "\tneeds to be manually verified).\n" + if test "x$SKIP_MD5SUM" != "x1"; then + error_exit + fi + fi + set -x +} + +function check_filesize() { + set +x + if test "`stat --format=%s $1`" != "$2" ; then + echo -e "WARNING: size did not match (not necessarily an error, but" + echo -e "\tneeds to be manually verified)." + if test "x$SKIP_FILESIZE_CHECK" != "x1"; then + error_exit + fi + fi + set -x +} + +function check_zerosum() { + set +x + ecasound -a:1 -i $1 -a:2 -i $2 -ea:-100 -a:1,2 -o dst-tmp.wav -x -q || error_exit + sigmax=`sndfile-info dst-tmp.wav |grep "Signal Max" |cut -d ':' -f2 |cut -d ' ' -f2 |cut -d ' ' -f2` + sndfile-info dst-tmp.wav |grep "Signal Max" + if [ $sigmax != "0" -a $sigmax != "1" ] ; then + echo -e "WARNING: zerosum signal left $sigmax, manual verification required." + if test "$SKIP_ZEROSUM_CHECK" = "x" ; then + error_exit + fi + fi + set -x +} + +function check_samples() { + set +x + samples=`sndfile-info $1 |grep Frames |cut -d ':' -f2` + if [ $samples != $2 ] ; then + echo -e "WARNING: sample count did not match (not necessarily an error, but" + echo -e "\tneeds to be manually verified)." + if test "$SKIP_SAMPLECNT_CHECK" = "x" ; then + error_exit + fi + fi + set -x +} + +# a very rough way to check whether newly +# created audio file has similar content than +# the orignal: count how many positive samples +# went above -1dB +# +function check_1dbpeak_count() { + set +x + count=`ecasound -i $1 -o null -ev |grep "Pos -1.0" |cut -d':' -f2 |cut -d',' -f1 |cut -c4-` + if test $count != $2 ; then + echo -e "WARNING: peak count samples did not match (not necessarily an error, but" + echo -e "\tneeds to be manually verified)." + if test "x$SKIP_1DBPEAK_CHECK" = "x"; then + error_exit + fi + fi + set -x +} --- ecasound2.2-2.7.0.orig/manual-tests/utils/Makefile +++ ecasound2.2-2.7.0/manual-tests/utils/Makefile @@ -0,0 +1,23 @@ +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/utils/Makefile +# +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +CPPFLAGS = `sh ../../libecasound/libecasound-config --cflags` +LIBS_DEBUG = -L../../libecasound/.libs -L../../kvutils `sh ../../libecasound/libecasound-config --libs_debug` +LIBS = -L../../libecasound/.libs -L../../kvutils `sh ../../libecasound/libecasound-config --libs` + +all: ecacompare + +ecacompare: ecacompare.cpp + ( c++ -o ecacompare ecacompare.cpp $(CPPFLAGS) $(LIBS) || \ + echo "Compiling with debug libs instead: " && \ + c++ -o ecacompare ecacompare.cpp $(CPPFLAGS) $(LIBS_DEBUG) ) + +clean: + rm -vf ecacompare + +.PHONY: all clean + + --- ecasound2.2-2.7.0.orig/manual-tests/utils/ecacompare.cpp +++ ecasound2.2-2.7.0/manual-tests/utils/ecacompare.cpp @@ -0,0 +1,107 @@ +// ------------------------------------------------------------------------ +// ecacompare.cpp: Compare two audio files sample by sample +// Copyright (C) 2009 Kai Vehmanen +// +// Attributes: +// eca-style-version: 3 (see Ecasound Programmer's Guide) +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#include + +#include +#include +#include +#include +#include +#include + +int main(int argc, char *argv[]) +{ + AUDIO_IO *a, *b; + SAMPLE_BUFFER buf_a, buf_b; + int buffersize = 1024; + bool verbose = std::getenv("V") != 0 ? true : false; + int res = 0; + + if (argc < 3) + return 1; + + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::errors, true); + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::info, true); + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::subsystems, true); + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::eiam_return_values, true); + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::module_names, true); + if (verbose == true) { + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::user_objects, true); + ECA_LOGGER::instance().set_log_level(ECA_LOGGER::system_objects, true); + } + + a = ECA_OBJECT_FACTORY::create_audio_object(argv[1]); + b = ECA_OBJECT_FACTORY::create_audio_object(argv[2]); + + if (a == 0 || + b == 0) + return 1; + + a->set_io_mode(AUDIO_IO::io_read); + b->set_io_mode(AUDIO_IO::io_read); + a->set_buffersize(buffersize); + b->set_buffersize(buffersize); + + a->open(); + b->open(); + + if (a->is_open() != true || + b->is_open() != true) { + ECA_LOG_MSG(ECA_LOGGER::errors, "Cannot open inputs"); + return 1; + } + + if (a->finite_length_stream() != true || + b->finite_length_stream() != true) { + ECA_LOG_MSG(ECA_LOGGER::errors, "Input not of finite length, cannot compare"); + return 1; + } + + if (a->length().samples() != + b->length().samples()) { + ECA_LOG_MSG(ECA_LOGGER::errors, "File size mismatch"); + res = 1; + } + + while(1) { + a->read_buffer(&buf_a); + b->read_buffer(&buf_b); + + /* note: use 14bit precision for checks */ + if (SAMPLE_BUFFER_FUNCTIONS::is_almost_equal(buf_a, buf_b, 14, verbose) != true) { + ECA_LOG_MSG(ECA_LOGGER::errors, "Files differ at pos " + + kvu_numtostr(a->position_in_seconds_exact())); + res = 2; + break; + } + + if (a->finished() == true || + b->finished() == true) + break; + } + + a->close(); + b->close(); + + return res; +} --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/con_test1.cpp +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/con_test1.cpp @@ -0,0 +1,87 @@ +// ------------------------------------------------------------------------ +// Copyright (C) 2009 Kai Vehmanen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#include +#include +#include +#include +#include + +#include "ecatestsuite.h" + +using namespace std; + +static const string input_file("foo.wav"); + +static void eci_execute_test(const string& cmd); + +int main(int argc, char *argv[]) { + ECA_TEST_ENTRY(); + + string ecasound_exec ("./ecasound_test"); + const char *ecasound_env = getenv("ECASOUND"); + if (ecasound_env) + ecasound_exec = string(ecasound_env); + + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -gc:1,0.5 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -i:" + input_file + " -o:null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -d:255 -z:db -r -z:nointbuf -i:" + input_file + " -o:null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -i:" + input_file + " -o:null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -epp:0 -kf:1,0,100,0.2,0,1 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:0 -kl:1,400,4000,10 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:0 -kl2:1,400,4000,5,10 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:0 -klg:1,400,4000,4,0,0.0,10,1.0,20,0.0,30,1.0 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:0 -kog:1,400,4000,0.2,1,2,0,1,0.3,1,0.6,0 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:400 -kos:1,200,2000,0.5,0 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + " -a:1 -i " + input_file + " -efl:4000.00 -ea:120.00 -efb:2000.00,4000.00 -kl:1.00,200.00,8000.00,50.00 -o null -t:5 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + + " -f:16,1,44100 -a:bus1 -i rtnull -eac:0,2 " + + " -f:16,1,44100 -a:bus2 -i foo.wav -erc:1,2 -eac:0,1 " + + " -a:bus1,bus2 -o loop,1 " + + " -f:16,2,44100 -a:bus3 " + + " -i loop,1 -f:16,1,44100 " + + " -o null " + + " -epp:50 -erm:1" + + " -t:5 2>/dev/null >/dev/null"); + + string many_chains (ecasound_exec); + many_chains += " -a:"; + for(int n = 0; n < 128; n++) { + std::stringstream tmp; + tmp << n; + many_chains += tmp.str(); + if (n != 128) many_chains += ","; + } + many_chains += " -i:" + input_file; + many_chains += " -o:null -t:5 2>/dev/null >/dev/null"; + eci_execute_test(many_chains); + + ECA_TEST_SUCCESS(); +} + +void eci_execute_test(const string& cmd) { + ECA_TEST_CASE(); + + cout << endl << "---" << endl; + cout << "Running test case:" << endl; + cout << cmd << endl; + + if (system(cmd.c_str()) != 0) { + ECA_TEST_FAIL(1, cmd.c_str()); + } +} --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/eca_test1.cpp +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/eca_test1.cpp @@ -0,0 +1,50 @@ +#include +#include +#include +#include +#include + +#include "eca-logger.h" +#include "eca-test-repository.h" +#include "eca-test-repository.cpp" +#include "eca-test-case.h" +#include "eca-test-case.cpp" + +#include "ecatestsuite.h" + +using namespace std; + +/** + * See also 'ecasound/libecasound/libecasound_tester.cpp' + */ + +int main(int argc, char *argv[]) { + ECA_TEST_ENTRY(); + + /** + * Uncomment to enable libecasound log messages + */ + // ECA_LOGGER::instance().set_log_level_bitmask(0x63); + + ECA_TEST_REPOSITORY& repo = ECA_TEST_REPOSITORY::instance(); + + repo.run(); + + if (repo.success() != true) { + cerr << "---" << endl; + cerr << repo.failures().size() << " failed test cases "; + cerr << "in ECA_TEST_REPOSITORY:" << endl << endl; + + const list& failures = repo.failures(); + list::const_iterator q = failures.begin(); + int n = 1; + while(q != failures.end()) { + cerr << n++ << ". " << *q << endl; + ++q; + } + + ECA_TEST_FAIL(1, "ECA_TEST_REPOSITORY"); + } + + ECA_TEST_SUCCESS(); +} --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/ecatestsuite.h +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/ecatestsuite.h @@ -0,0 +1,16 @@ +#ifndef INCLUDED_ECATESTSUITE_H +#define INCLUDED_ECATESTSUITE_H + +#ifdef VERBOSE +#define ECA_TEST_ENTRY() printf("\n%s:%d - Test started", __FILE__, __LINE__) +#define ECA_TEST_SUCCESS() printf("\n%s:%d - Test passed\n", __FILE__, __LINE__); exit(0) +#define ECA_TEST_FAIL(x,y) printf("\n%s:%d - Test failed: \"%s\"\n", __FILE__, __LINE__, y); exit(x) +#define ECA_TEST_CASE() printf("."); fflush(stdout) +#else +#define ECA_TEST_ENTRY() ((void) 0) +#define ECA_TEST_SUCCESS() exit(0) +#define ECA_TEST_FAIL(x,y) exit(x) +#define ECA_TEST_CASE() ((void) 0) +#endif + +#endif /* INCLUDED_ECATESTSUITE_H */ --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/README.txt +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/README.txt @@ -0,0 +1,61 @@ +======================================================================= +*** Ecasound Testsuite - README.txt *** +======================================================================= + +--- +General + +This directory contains a set of small programs that +test various parts of ecasound. + +--- +Test programs + +All test programs are standalone applications that either +return 0 (for success), or non-zero (for error). + +Issue './run_tests.py' to run the whole test suite. + +--- +Test data files + +Most tests are performed using ecasound's 'null' and +'rtnull' audio objects. Howver, some tests require +real audio objects. In these cases, the following +files and device are used: + +./ecasound_test = ecasound executable to use in tests +./libecasound-config + = library configuration script to + use in building module tests +./foo.wav - generic input wav-file +./bigfoo.wav - a big (>10MB) input file + +--- +List of test categories + +CON - Test cases for testing the 'ecasound' console + interface. +ECI - Test cases utilizing the ECI API (Ecasound Control + Interface); (eci_*) +ECA - Tests cases for testing libecasound components. + +--- +List of current tests (not necessarily complete) + +CON-1 - Simple tests for command-line options and basic + operations. +CON-2 - Tests for various rt and nonrt object combinations. + Should be run both with and without root-priviledges. + +OSC-1 - Test Ecasound's OSC interface + +ECI-1 - Initializing the ECI C-interface multiple times. +ECI-2 - Like ECI-1, but uses re-entrant API functions. +ECI-3 - Snapshot test for basic ECI C API functionality, where + a simple chainsetup is configured, connected and then + executed. Multiple error conditions. + +ECA-1 - Runs all tests cases in ECA_TEST_REPOSITORY. + +----------------------------------------------------------------------- --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/eca_loop_bench.cpp +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/eca_loop_bench.cpp @@ -0,0 +1,410 @@ +// ------------------------------------------------------------------------ +// Copyright (C) 2009 Kai Vehmanen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#include +#include +#include + +#include "eca-version.h" +#include "samplebuffer.h" +#include "audiofx_amplitude.h" + +#include "kvu_procedure_timer.h" +#include "ecatestsuite.h" + +int test_sbuf_make_silent(void); +int test_sbuf_copy_ops(void); +int test_sbuf_constructor(void); +int test_sbuf_mix(void); +int test_sbuf_iter(void); + +#ifndef LIBECASOUND_VERSION +#define LIBECASOUND_VERSION 22 +#endif + +int main(int argc, char *argv[]) +{ + int res = 0; + + std::printf("--------------------------------------------------------\n" + "Testing with libecasound *** v%s *** (%s).\n", + ecasound_library_version, __FILE__); + + res += test_sbuf_copy_ops(); + res += test_sbuf_constructor(); + res += test_sbuf_make_silent(); + res += test_sbuf_mix(); + res += test_sbuf_iter(); + + return res; +} + +void helper_print_one_result(const char *casename, const PROCEDURE_TIMER& t1, int loops, int bsize) +{ + double per_loop = t1.last_duration_seconds() / loops; + + std::printf("\t%-20.20s:\t%.03fms (%.03fus/loop, %.04f%% CPU@48kHz)\n", + casename, + t1.last_duration_seconds() * 1000.0, + per_loop * 1000000.0, + (per_loop / (((double)bsize) / 48000.0))); +} + +int test_sbuf_make_silent(void) +{ + const int loops = 10000; + const int bufsize = 1024; + const int channels = 12; + + std::printf("sbuf_make_silent with %d loops (bufsize=%d, ch=%d):\n", + loops, bufsize, channels); + + PROCEDURE_TIMER t1; + SAMPLE_BUFFER sbuf (bufsize, channels); + + /* note: make sure code is paged in */ + sbuf.make_silent(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf.make_silent_range(0, bufsize); + } + t1.stop(); + + helper_print_one_result("make_silent_range", t1, loops, bufsize); + + /* note: make sure code is paged in */ + sbuf.make_silent_range(0, bufsize); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf.make_silent(); + } + t1.stop(); + + helper_print_one_result("make_silent", t1, loops, bufsize); +} + +int test_sbuf_copy_ops(void) +{ + const int loops = 10000; + const int bufsize = 1024; + const int channels = 12; + + PROCEDURE_TIMER t1; + SAMPLE_BUFFER sbuf_a (bufsize, channels); + SAMPLE_BUFFER sbuf_b (bufsize, channels); + + std::printf("sbuf_copy_ops with %d loops (bufsize=%d, ch=%d):\n", + loops, bufsize, channels); + +#if LIBECASOUND_VERSION >= 22 + { + /* note: make sure code is paged in */ + sbuf_a.copy_all_content(sbuf_b); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.copy_all_content(sbuf_b); + } + t1.stop(); + helper_print_one_result("copy_all_content", t1, loops, bufsize); + } + { + /* note: make sure code is paged in */ + sbuf_a.copy_matching_channels(sbuf_b); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.copy_matching_channels(sbuf_b); + } + t1.stop(); + helper_print_one_result("copy_matching_channels", t1, loops, bufsize); + } +#else + { + /* note: make sure code is paged in */ + sbuf_a.copy(sbuf_b); + + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.copy(sbuf_b); + } + t1.stop(); + + helper_print_one_result("copy (v21-lib)", t1, loops, bufsize); + } +#endif + { + size_t rawsize = sizeof(SAMPLE_BUFFER::sample_t) * bufsize * channels; + void *rawbuf1 = std::malloc(rawsize); + void *rawbuf2 = std::malloc(rawsize); + + std::memcpy(rawbuf1, rawbuf2, rawsize); + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + std::memcpy(rawbuf1, rawbuf2, rawsize); + } + t1.stop(); + helper_print_one_result("copy_raw_memcpy", t1, loops, bufsize); + std::free(rawbuf1); + std::free(rawbuf2); + } +} + +int test_sbuf_constructor(void) +{ + const int loops = 10000; + const int bufsize = 1024; + const int channels = 12; + + PROCEDURE_TIMER t1; + SAMPLE_BUFFER sbuf_a (bufsize, channels); + + std::printf("sbuf constructor with %d loops (bufsize=%d, ch=%d):\n", + loops, bufsize, channels); + + /* note: make sure code is paged in */ + + t1.start(); + for(int n = 0; n < loops; n++) { + SAMPLE_BUFFER sbuf_b (bufsize, channels); + } + t1.stop(); + + helper_print_one_result("constructor", t1, loops, bufsize); +} + +int test_sbuf_mix(void) +{ + const int loops = 10000; + const int bufsize = 1024; + const int channels = 12; + + std::printf("sbuf_mix with %d loops (bufsize=%d, ch=%d):\n", + loops, bufsize, channels); + + PROCEDURE_TIMER t1; + SAMPLE_BUFFER sbuf_a (bufsize, channels); + SAMPLE_BUFFER sbuf_b (bufsize, channels); + + /* case 1 */ + { + sbuf_a.divide_by(1.23456789); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.divide_by(1.23456789); + } + t1.stop(); + + helper_print_one_result("divide_by", t1, loops, bufsize); + } + + /* case 1b */ + { +#if LIBECASOUND_VERSION >= 22 + sbuf_a.divide_by_ref(1.23456789); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.divide_by_ref(1.23456789); + } + t1.stop(); + + helper_print_one_result("divide_by_ref", t1, loops, bufsize); +#endif + } + + /* case 2 */ + { + sbuf_a.add_with_weight(sbuf_b, 2); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.add_with_weight(sbuf_b, 2); + } + t1.stop(); + + helper_print_one_result("add_with_weight", t1, loops, bufsize); + } + + /* case 3 */ + { +#if LIBECASOUND_VERSION >= 22 + sbuf_a.add_matching_channels(sbuf_b); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.add_matching_channels(sbuf_b); + } + t1.stop(); + + helper_print_one_result("add_matching_channels", t1, loops, bufsize); + + /* case 3b */ + sbuf_a.add_matching_channels_ref(sbuf_b); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.add_matching_channels_ref(sbuf_b); + } + t1.stop(); + + helper_print_one_result("add_matching_ch...ref", t1, loops, bufsize); + +#else + sbuf_a.add(sbuf_b); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.add(sbuf_b); + } + t1.stop(); + + helper_print_one_result("add (v21-lib)", t1, loops, bufsize); +#endif + } + + /* case 4 */ + { + sbuf_a.limit_values(); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.limit_values(); + } + t1.stop(); + + helper_print_one_result("limit_values", t1, loops, bufsize); + + /* case 4b */ +#if LIBECASOUND_VERSION >= 22 + sbuf_a.limit_values_ref(); + t1.reset(); + + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.limit_values_ref(); + } + t1.stop(); + + helper_print_one_result("limit_values_ref", t1, loops, bufsize); +#endif + } +} + +int test_sbuf_iter(void) +{ + const int loops = 10000; + const int bufsize = 1024; + const int channels = 12; + const SAMPLE_BUFFER::sample_t multiplier = 100.1f; + + std::printf("sbuf_iter with %d loops (bufsize=%d, ch=%d):\n", + loops, bufsize, channels); + + PROCEDURE_TIMER t1; + SAMPLE_BUFFER sbuf_a (bufsize, channels); + EFFECT_AMPLIFY amplify (multiplier); + + /* case 1a */ + { + amplify.init(&sbuf_a); + amplify.process(); + + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + amplify.process(); + } + t1.stop(); + + helper_print_one_result("effect_amplify", t1, loops, bufsize); + } + + /* case 1b */ + { + amplify.init(&sbuf_a); + amplify.process_ref(); + + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + amplify.process_ref(); + } + t1.stop(); + + helper_print_one_result("effect_amplify_ref", t1, loops, bufsize); + } + + /* case 2 */ + { + int ch_count = sbuf_a.number_of_channels(); + int i_count = sbuf_a.length_in_samples(); + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + for (int ch = 0; ch < ch_count; ch++) { + SAMPLE_BUFFER::sample_t *buf = sbuf_a.buffer[ch]; + for (int i = 0; i < i_count; i++) { + buf[i] *= multiplier; + } + } + } + t1.stop(); + + helper_print_one_result("amplify_plainc", t1, loops, bufsize); + } + + /* case 3+4 */ + { +#if LIBECASOUND_VERSION >= 22 + sbuf_a.multiply_by(multiplier); + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.multiply_by(multiplier); + } + t1.stop(); + helper_print_one_result("amplify_sbuf", t1, loops, bufsize); + + sbuf_a.multiply_by_ref(multiplier); + t1.reset(); + t1.start(); + for(int n = 0; n < loops; n++) { + sbuf_a.multiply_by_ref(multiplier); + } + t1.stop(); + helper_print_one_result("amplify_sbuf_ref", t1, loops, bufsize); + +#endif + } + +} --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/Makefile +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/Makefile @@ -0,0 +1,54 @@ +# ---------------------------------------------------------------------- +# File: ecasound/manual-tests/misc-test-apps/Makefile +# Description: Ecasound multitrack audio processing tool +# License: GPL (see ecasound/{AUTHORS,COPYING}) +# ---------------------------------------------------------------------- + +ECAFLAGS = $(shell sh ./libecasound-config --cflags) -I. +ECALDFLAGS = $(shell sh ./libecasound-config --ldflags) +#ECALIBS = $(shell sh ./libecasound-config --libs) +ECALIBS = $(shell sh ./libecasound-config --libs_debug) + +CXX=c++ +CPPFLAGS += -DVERBOSE +CXXFLAGS += -Werror -O2 -g + +# FIXME: move C eci tests to libecasoundc? + +COMMON_SRC = ecatestsuite.h +GENERATED_FILES = ecatestlist.txt + +LIB_TESTS= eca_loop_bench$(EXEEXT) +EXEC_TESTS= con_test1 \ + con_test2 +SCRIPT_TESTS= osc_tes1.expect + +ALL_TESTS= $(LIB_TESTS) $(EXEC_TESTS) $(SCRIPT_TESTS) + +# not built: +# eca_test1 + +all: $(ALL_TESTS) ecatestlist.txt + +con_test1: con_test1.o +con_test2: con_test2.o +eca_loop_bench: eca_loop_bench.o +eca_loop_bench$(EXEEXT): eca_loop_bench$(EXEEXT).o + +%$(EXEEXT).o: %.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(ECAFLAGS) -c -o $@ $< + +%.o: %.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(ECAFLAGS) -c -o $@ $< + +$(LIB_TESTS) $(EXEC_TESTS): + $(CXX) $(LDFLAGS) $(ECALDFLAGS) -o $@ $@.o $(ECALIBS) + +ecatestlist.txt: $(ALL_TESTS) + echo "# This is an autogenerated file" > ecatestlist.txt + echo $(ALL_TESTS) >> ecatestlist.txt + +clean: + rm -fv $(LIBS_TESTS) $(EXEC_TESTS) $(GENERATED_FILES) *.o + +.PHONY: all \ No newline at end of file --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/osc_tes1.expect +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/osc_tes1.expect @@ -0,0 +1,155 @@ +#!/usr/bin/expect -f +# +# ------------------------------------------------------------------------ +# Copyright (C) 2009 Kai Vehmanen +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# ------------------------------------------------------------------------ +# +# refs: +# - expect(1) +# - http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html + +proc start_ecasound {} { + global opts expect_out spawn_id osc_udp_port + spawn ./ecasound_test -c --osc-udp-port=$osc_udp_port + + expect { + "ecasound ('h' for help)>" { } + timeout { + failed "unable to start ecasound" + } + } +} + +proc send_ecasound {command} { + global opts expect_out spawn_id + send $command + expect { + "ecasound ('h' for help)>" { } + } +} + +proc setup_ecasound {} { + global opts expect_out spawn_id + send_ecasound "cs-iselect 1\n" + send_ecasound "cs-remove\n" + send_ecasound "cs-add test\n" + send_ecasound "c-iselect\n" + send_ecasound "c-remove\n" + send_ecasound "c-add ch1\n" + send_ecasound "ai-add null\n" + send_ecasound "ao-add rtnull\n" + send_ecasound "cop-add -ea:100\n" + send_ecasound "cop-add -epp:100\n" + send_ecasound "ctrl-add -kos:1,0,100,0.2,0\n" + send_ecasound "c-add ch2\n" + send_ecasound "ai-add null\n" + send_ecasound "ao-add rtnull\n" + send_ecasound "cop-add -efl:2000\n" + send_ecasound "cop-add -epp:100\n" + send_ecasound "ctrl-add -kl:1,0,100,200\n" + send_ecasound "cs-connect\n" +} + +proc osc_send_command {command} { + global opts expect_out spawn_id + + send_user "\nTRACE: sending\n$command\n\n" + system $command + sleep 1 +} + +proc osc_user_check {casedesc} { + global timeout + + send_user "\nTRACE: USER INPUT NEEDED\n" + send_user $casedesc + send_user "\nTRACE: press to continue (timeout in $timeout secs)\n" + expect_user { + "\n" { } + timeout { send_user "TRACE: time out, continuing other tests\n" } + } + send_user "TRACE: continuing...\n" +} + +proc osc_test_banner {} { + global timeout osc_udp_port + + send_user "**************************************************************\n" + send_user "This is an interactive test for Ecasound OSC interface\n" + send_user "\n" + send_user "Dependencies: expect, ecasound_test, oscsend, and free \n" + send_user "UDP/$osc_udp_port port.\n" + send_user "\n" + send_user "Follow the verification instructions (prefixed with 'TRACE'),\n" + send_user "and continue tests by pressing . If no response within\n" + send_user "$timeout seconds, tests will continue automatically.\n" + send_user "Press to start.\n" + send_user "**************************************************************\n" + + expect_user { + "\n" { } + timeout { send_user "TRACE: time out, continuing other tests\n" } + } +} + +proc osc_test {} { + global opts expect_out spawn_id + + send_ecasound "status\n" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/1/param/1 f 300" + send_ecasound "status\n" + osc_user_check "Check ch1 change -ea:100 to -ea:300" + + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/0/param/1 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/-1/param/1 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/3/param/1 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/1/param/0 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/1/param/-1 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1/op/1/param/3 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch1t/op/1/param/1 f 400" + osc_send_command "oscsend localhost 34000 /ecasound/chain/tch1/op/1/param/1 f 400" + osc_send_command "oscsend localhost 34000 \"/ecasound/chain/ ch1/op/1/param/1\" f 400" + send_ecasound "status\n" + osc_user_check "ch1: should still be -ea:300" + + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch2/op/1/param/1 f 1234" + send_ecasound "status\n" + osc_user_check "ch2: -efl should be set to 1234Hz" + + osc_send_command "oscsend localhost 34000 /ecasound/chain/ch2/ctrl/1/param/3 f 123" + send_ecasound "status\n" + osc_user_check "ch2: -kl 3rd param should be 123" +} + +proc quit_ecasound {} { + global opts expect_out spawn_id + + send_ecasound "quit\n" + wait +} + +set timeout 15 +set osc_udp_port 34000 + +osc_test_banner +start_ecasound +setup_ecasound +send_ecasound "start\n" +osc_test +quit_ecasound + + --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/con_test2.cpp +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/con_test2.cpp @@ -0,0 +1,75 @@ +// ------------------------------------------------------------------------ +// Copyright (C) 2009 Kai Vehmanen +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// ------------------------------------------------------------------------ + +#include +#include +#include +#include + +#include "ecatestsuite.h" + +using namespace std; + +static const string rtobject("rtnull"); +static const string nonrtobject("null"); + +static void eci_execute_test(const string& cmd); +static void eci_combination_test(string arg); + +int main(int argc, char *argv[]) { + ECA_TEST_ENTRY(); + + eci_combination_test("-B:auto"); + eci_combination_test("-B:nonrt"); + eci_combination_test("-B:rt"); + eci_combination_test("-B:rtlowlatency"); + + eci_combination_test("-b:128 -z:nointbuf -z:db -r:50"); + eci_combination_test("-b:8192 -z:intbuf -z:db -r:50"); + eci_combination_test("-b:1024 -z:nodb -r:50"); + + ECA_TEST_SUCCESS(); +} + +void eci_combination_test(string arg) { + string ecasound_exec ("./ecasound_test"); + const char *ecasound_env = getenv("ECASOUND"); + if (ecasound_env) + ecasound_exec = string(ecasound_env); + + eci_execute_test(ecasound_exec + + " -a:1 -i:" + rtobject + " -o:" + nonrtobject + " " + arg + " -t:2 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + + " -a:1 -i:" + nonrtobject + " -o:" + rtobject + " " + arg + " -t:2 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + + " -a:1 -i:" + nonrtobject + " -o:" + nonrtobject + " " + arg + " -t:2 2>/dev/null >/dev/null"); + eci_execute_test(ecasound_exec + + " -a:1 -i:" + rtobject + " -o:" + rtobject + " " + arg + " -t:2 2>/dev/null >/dev/null"); +} + +void eci_execute_test(const string& cmd) { + ECA_TEST_CASE(); + + cout << endl << "---" << endl; + cout << "Running test case:" << endl; + cout << cmd << endl; + + if (system(cmd.c_str()) != 0) { + ECA_TEST_FAIL(1, cmd.c_str()); + } +} --- ecasound2.2-2.7.0.orig/manual-tests/misc-test-apps/run_tests.py +++ ecasound2.2-2.7.0/manual-tests/misc-test-apps/run_tests.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +# ----------------------------------------------------------------------- +# Runs all misc-test-apps test cases +# +# Copyright (C) 2009 Kai Vehmanen +# Licensed under GPL. See the file 'COPYING' for more information. +# ----------------------------------------------------------------------- + +import sys +import os +import string + +def check_for_test_data_files(filenamestr): + try: + file = open(filenamestr) + file.close() + except IOError: + print "Test data file '" + filenamestr + "' not found; can't run tests. See 'README.txt'." + sys.exit(1) + +def run_tests(): + check_for_test_data_files("foo.wav") + check_for_test_data_files("ecatestlist.txt") + check_for_test_data_files("ecasound_test") + + file = open("ecatestlist.txt") + lines = file.readlines() + file.close() + + failed = 0 + for line in lines: + if line[0] == "#": + continue + testcases = string.split(line) + for testcase in testcases: + print "Running test " + testcase + ":" + res = os.system("./" + testcase) + print "" + if res: + failed = 1 + return failed + +# main +sys.exit(run_tests()) + --- ecasound2.2-2.7.0.orig/libecasoundc/libecasoundc-config +++ ecasound2.2-2.7.0/libecasoundc/libecasoundc-config @@ -0,0 +1,58 @@ +#!/bin/sh + +usage() +{ + echo "usage: $0 [OPTIONS]" +cat << EOH + +options: + [--libs] + [--libs_debug] + [--cflags] + [--version] +EOH + exit 1; +} + +prefix=/usr +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +flags="" + +while test $# -gt 0 +do + case $1 in + --libs) + flags="$flags -L$libdir -lecasoundc" + ;; + --libs_debug) + flags="$flags -L$libdir -lecasoundc_debug" + ;; + --ldflags) + case "$libdir" in + /usr/lib);; + *) + flags="$flags -Wl,--rpath -Wl,$libdir" ;; + esac + ;; + --cflags) + flags="$flags -I$includedir/libecasoundc" + ;; + --version) + echo 2.7.0 + ;; + *) + echo "$0: unknown option $1" + echo + usage + ;; + esac + shift +done + +if test -n "$flags" +then + echo $flags +fi