gnomad2-2.9.6/0000775000076400007640000000000011602630307010070 500000000000000gnomad2-2.9.6/gnomad2.desktop0000664000076400007640000000354311573764475012764 00000000000000[Desktop Entry] Name=Gnomad 2 Name[ca]=Gnomad 2 Name[cs_CZ]=Gnomad 2 Name[de]=Gnomad 2 Name[es]=Gnomad 2 Name[fi]=Gnomad 2 Name[fr]=Gnomad 2 Name[it]=Gnomad 2 Name[nb]=Gnomad 2 Name[nl]=Gnomad 2 Name[pl]=Gnomad 2 Name[sco]=Gnomad 2 Name[sv]=Gnomad 2 GenericName=Nomad/Zen Jukebox/Dell DJ Client GenericName[ca]=Client per a reproductors Nomad/Zen/Dell DJ GenericName[cs_CZ]=Nomad/Zen Jukebox/Dell DJ Client GenericName[de]=Klient für Nomad/Zen Jukeboxen und Dell DJ's GenericName[es]=Cliente Nomad/Zen Jukebox/Dell DJ GenericName[it]=Client per Nomad/Zen jukebox e Dell DJ GenericName[nl]=Nomad/Zen Jukebox/Dell DJ Client GenericName[pl]=Nomad/Zen Jukebox/Dell DJ Client GenericName[sco]=Nomad/Zen Jukebox/Dell DJ Client GenericName[sv]=Klient för Nomad/Zen/Dell DJ Jukebox Comment=A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs Comment[ca]=Una eina per gestionar reproductors Creative Nomad/Zen i Dell DJs Comment[cs_CZ]=Program pro přehrávače Creative Nomad/Zen a Dell DJs Comment[de]=Ein Programm zur Verwaltung von Creative Nomad/Zen Jukeboxen und Dell DJ's Comment[es]=Una herramienta para manejar los reproductores Creative Nomad/Zen Jukebox y Dell DJs Comment[fr]=Un utilitaire pour utiliser les Juxeboxes Creative Nomad/Zen et Dell DJs Comment[it]=Un programma per gestire i Nomad/Zen jukebox di Creative e i Dell DJ Comment[nl]=Een tool om Creative Nomad/Zen Jukeboxes en Dell DJs te beheren Comment[pl]=Oprogramowanie do transferu plikow do/z odtwarzaczy Creative Nomad/Zen i Dell DJs Comment[sco]=A tuil for managin Creative Nomad/Zen Jukeboxes an Dell DJs Comment[sv]=Ett verktyg för att hantera Creative Nomad/Zen Jukebox:ar och Dell DJ-spelare Exec=gnomad2 Terminal=false Type=Application Icon=gnomad2-logo Categories=GTK;AudioVideo; MimeType=application/x-ogg;application/ogg;audio/x-mp3;audio/x-mpeg;audio/mpeg;application/x-flac;x-content/audio-player; gnomad2-2.9.6/missing0000755000076400007640000002623311354106464011421 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2009-04-28.21; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; tar*) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar*) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gnomad2-2.9.6/AUTHORS0000664000076400007640000000117711512614631011070 00000000000000Gnomad2 Written by: Linus Walleij It is no secret that parts of the Gnomad2 code was greatly inspired by gFTP-GTK by Brian Masney. Thanks Brian! (I also looked at several other GTK+ programs in order to figure out how things worked.) Some call this style "Midnight Commander Style", or "Norton Commander Style". Some believe user interfaces like this totally sucks. Of course Gnomad2 draws on the collected works of: * The GTK+ project * The GNOME project * The libnjb project * The id3lib project * The libmtp project The mp3file.c lifts heavily from gtkpod, which in turn borrow stuff from all kind of projects. gnomad2-2.9.6/ChangeLog0000664000076400007640000013233611512614631011574 000000000000002009-02-18 Linus Walleij * src/tagfile.c: implement the public bug fix from: http://blog.steve.org.uk/what_can_you_do__sparta_will_need_sons_.html cheers! 2009-01-22 Linus Walleij * src/filesystem.c: finally (hopefully) nailed the bug that caused unsolicited deletion of "." and "..". * po/LINGUAS: renamed Norweigan bokmaal translation from no.po to nb.po. * po/no.po: deleted. * po/nb.po: created. * src/wmaread.c: disregard meta->trackno == 0. It's OK. 2009-01-20 Linus Walleij * configure.ac: bump to 2.9.3 and check for libmtp 0.3.0+ * src/jukebox.c: conditional code for old libmtp versions. 2008-08-07 Linus Walleij * configure.ac: release 2.9.2 to get a libmtp 0.3.0 compliant version out there. 2008-06-27 Linus Walleij * src/jukebox.c: update to released libmtp 0.3.0 API. 2008-06-21 Linus Walleij * src/riffile.c: a generic interface to read metadata from RIFF files like WAV or AVI. Functions not yet merged. includes new work by Kees van Veen on AVI stuff. * src/riffile.h: header. * src/filesystem.c: use new function to get AVI file info, move header name. * src/wavfile.c: remove. * src/wavfile.h: remove. 2008-06-09 Linus Walleij * configure.ac: require the new libmtp 0.3.0 for the next version of gnomad2. * gnomad2.desktop.in: put in some MIME type handlers. 2008-05-10 Linus Walleij * src/gnomad2.c: make it possible to compile with dbus-glib but without HAL. (But why...) 2008-03-26 Linus Walleij * src/jukebox.c: Fix so that we can compile without libmtp again. 2008-02-16 Richard Quirk * src/metadata.c: patch to sort after song length correctly and also support this in the jukebox view. 2008-01-28 Linus Walleij * Release Gnomad 2.9.1 with all this D-Bus and HAL stuff, it's cool so why not. 2008-01-24 Linus Walleij * configure.ac: properly also detect HAL/libhal. Bump to 2.9.1. * src/Makefile.am: add flags for HAL. * src/gnomad2.c: use D-Bus and HAL to detect devices properly detected through the libmtp and libnjb FDI files. Make gnomad2 connect and shut down automatically when known devices are plugged in/removed. * src/jukebox.c: consequental changes. * src/jukebox.h: consequental changes. * src/playlists.c: consequental changes. 2007-12-02 Linus Walleij * src/filesystem.c: do not delete "." or ".." directories if these are selected. 2007-09-20 Linus Walleij * src/common.h: enable even more customization of colors and styles for folder and directory entries. * src/data.c: dito. * src/xfer.c: dito. 2007-09-14 Linus Walleij * src/jukebox.c: enable cancellation on MTP devices. 2007-09-12 Linus Walleij * src/editmeta.c: make it possible to use taglib only. * src/filesystem.c: dito. * src/filesystem.h. dito. * src/jukebox.c: dito. * src/prefs.c: dito. * src/prefs.h: dito. * src/tagfile.c: dito. 2007-09-02 Linus Walleij * configure.ac: make it possible to use taglib exclusively, like for everything including MP3 files. * src/tagfile.h: expect taglib to be able to strip tags soon. * src/tagfile.c: dito. 2007-08-30 Paweł Wlaź * src/jukebox.c: implement the much-aftersought folder support for the MTP datafile view. 2007-08-29 Linus Walleij * configure.ac: Bump to version 2.9.0 and release. * README: doc on using taglib. * NEWS: dito. 2007-08-23 Linus Walleij * configure.ac: detect taglib C interface if available. * src/Makefile.am: conditionally build taglib support. * src/tagfile.c: taglib support glue courtesy of Peter Randeu * src/tagfile.h: dito. * src/filesystem.c: consequental changes. * src/editmeta.c: dito. 2007-08-14 Linus Walleij * src/gnomad2.c: fix the aboutbox issue with it not closing, bug fix pointed out by Fabrice Foucaud. 2007-06-09 Linus Walleij * src/jukebox.c: fix a problem making it impossible to compile gnomad2 without libmtp. (Sorry.) * configure.ac: bump to 2.8.13 and release. 2007-04-19 Linus Walleij * src/xfer.c: make colors more editable. * src/data.c: dito. 2007-04-14 D. Hugh Redelmeier * src/editmeta.c: replace accidental old-style function declaration -- () => (void) * src/filesystem.c: ditto * src/filesystem.h: ditto * src/jukebox.c: ditto * src/metadata.c: ditto * src/metadata.h: ditto * src/player.c: ditto * src/playlists.c: ditto * src/prefs.h: ditto * src/xfer.c: ditto * src/xfer.h: ditto * src/data.c: ditto plus get type of data_from_hd_to_jukebox right 2007-04-14 D. Hugh Redelmeier * INSTALL: describe how to run autoconf * po/.cvsignore: ignore stamp-it, a generated file 2007-04-14 Linus Walleij * src/jukebox.c: bring the PDE device playlist handling into a sane state. It's been broken for some time... :-( * src/common.h: retire the unused darkblue color. Move file/dir color definitions here. More GPOINTER/GUINT32 fixups, use GTK GUINT32/GUINT64 print formatting macros. * src/xfer.c: color defines. * src/data.c: color defines. * src/gnomad2.c: dito. * release gnomad 2.8.12. 2007-04-13 Linus Walleij * configure.ac: look for * src/common.h: define guint32 and guint64 printing macros. Remove the JAM_Lu() and JAM_lu() macros finally. * src/jukebox.c: start using the macros. * src/jukebox.h: removed one function signature and made it static. * src/util.h: rename a few functions and reprototype to explicit guint32 nature. * src/util.c: dito. * src/editmeta.c: consequental changes. * src/id3read.c: dito. * src/playlists.c: dito. * src/filenaming.c: dito. * src/wmaread.c: dito. * src/metadata.h: dito. * src/filesystem.c: comment out debug code. 2007-04-10 Linus Walleij * src/playlist.c: remove unused variable. * src/id3read.c: remove quarantained hasid3tag() function. 2007-04-10 Gervais Mulongoy * src/jukebox.c: use mkdtemp() instead of tmpnam(). this breaks Windows compatibility for now. * src/mp3file.c: problem with free format frame headers fix-up. * src/filesystem.c: replace g_convert() with the failsafe g_convert_with_fallback(). 2007-04-02 Linus Walleij * src/metadata.h: make size of files gulong, but keep year and track number as guint. (No sense to have bigger numbers.) * src/editmeta.c: ridded a few unsigned long cast JAM:s by printing the types for what they are, other by the aforementioned change in metadata_t. * src/id3read.c: dito. * src/metadata.c: dito. * src/util.c: dito. 2007-04-02 D. Hugh Redelmeier * src/filesystem.c: fixed strncat() off-by-one errors. * src/id3read.c: dito. 2007-04-01 D. Hugh Redelmeier * A large set of patches cleaning up numerous compiler warnings and fixing a host of bad programming practice. After this patchset, a number of problems reported on the 64bit platforms should be fixed. Hugh writes: I started with gnomad2-2.8.11 from Fedora. This appears to be 2.8.11 plus a small patch to src/filesystem.c called gnomad2-2.8.11.patch. The way I did my diff was diff(2.8.11, 2.8.11 + small patch + my changes). So, in effect, my changes are mingled with the small patch. If this is inconvenient, I could easily generate my diff a different way. My changes are almost always very local and designed to fix a problem identified by a gcc warning. I don't know gnomad2 or GTK well enough to make global changes. I have tried not to cover over deeper problems just to shut up gcc. It is important to make sure all function calls occur within the scope of a declaration of that function. The default type inferred for an undeclared function can be dangerous. To that end, I have added a number of include statements. I also added a declaration of scan_jukebox to common.h even though there ought to be a better place. I added forward declarations where they were needed. I eliminated most local variables that were unused. In some cases, these were unused due to conditional compilation. In those cases I made the definitions conditional too. I left one in because the initializer might have an important side-effect (active, defined in playlists.c line 693). I made sure that functions declared to return a non-void did in fact do so. Usually this meant returning NULL. In one important case... printf-like functions require that the format effectors match the corresponding arguments. In a lot of cases this was not the case. I added calls to JAM_lu and JAM_Lu to cast the arguments to match the format. I used these ugly names because I had no way of knowing whether the aregument type or the format needed to be changed. The JAM* call flags that further analysis would be good. I renamed kill_braces to kill_squarebrackets because the old name was wrong. I was mildly inventive about what to return in the case where there is a [ but no ]; this used to be a bug (a return of no value when a gchar * is expected). In a number of places gcc complained that a local variable "may be used uninitialized in this function". In all cases, the logic of the code seemed to be correct, if a little contorted. So I silenced gcc by adding an initializer to variable definitions. I also added a comment to mark this: /* initialize to shut up GCC */ In some cases where a function could be made file-static, I did so. This can improve gcc's analysis and may help a programmer too. I did not do this everywhere (that would be a Good Thing). I fiddled with some string handling code in id3read.c:getTracknum to eliminate a potential buffer overflow. I recast boolean expressions that looked like equality tests but were assignments: - while (playlist = NJB_Get_Playlist(pdedevice)) { + while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { * src/jukebox.c: Got the crazy gint-in-pointer conversions correct in call_fill_in_dir and calls to it. * src/jukebox.c: jb2hd_thread, got the arguments right for a call to set_tag_for_mp3file. * src/jukebox.c: jukebox_synchronize_time I eliminated type punning between GTime and time_t. * src/mp3file.c: I started to add code to detect failures of fread but gave up since I didn't know what to do once failure was detected. * src/prefs.c: In a few places, I changed function definitions like this: -void write_prefs_file() +void write_prefs_file(void) This changed the definition from an old-K&R-style one to one with function prototypes. It would be good style to do this everywhere. Especially in header files. 2007-02-14 Linus Walleij * src/xfer.c: reintroduce 2.6.x compatibility. * src/filesystem.c: handling the fact that g_stat() is broken with some GCC optflags or whatever cause this crap by reverting to using just plain old stat(). * src/configure.ac: require libmtp 0.1.3, bump to 2.8.12. 2007-01-29 Linus Walleij * src/jukebox.c: real sucky bug :-( * RELEASE gnomad 2.8.11. 2007-01-24 Linus Walleij * src/jukebox.c: final bug (in the player) hopefully. * RELEASE gnomad 2.8.10. 2007-01-23 Linus Walleij * src/jukebox.c: found the real nasty bug blocking 2.8.10. 2007-01-09 Linus Walleij * src/jukebox.c: finally remove all kind of drawing operations done in threads. (PHEW!) * src/jukebox.h: the wacko threading args to some functions consequently goes away. * src/playlist.c: side effect of that (calls altered). * src/filenaming.h: added a missing prototype. * configure.ac: no need to set DISABLE_THREADED_DRAWING anylonger. * src/gnomad2.c: no need to initialize GDK thread locking any more. * src/filesystem.c: support some of the new filetypes added to libmtp. 2007-01-08 Linus Walleij * configure.ac: require libmtp 0.1.2 if we shall build with libmtp. Changes in Storage retrieveal require this... Rename "DISABLE THREADING" to "DISABLE_THREADED_DRAWING" since that is what we're actually trying to disable. * src/jukebox.c: reflect change, rename threading define. * src/filesystem.c: remove all threaded drawing. Drawing is now sent down to the main (idle) loop. 2006-11-09 Linus Walleij * src/filesystem.c: made threading code conditional. * src/jukebox.c: dito. * configure.ac: disable threading by default after many bug reports. (Something changed in X11 or GTK I think.) 2006-10-17 Linus Walleij * configure.ac: bump version to 2.8.10, add dbus detection code for experiments. * src/Makefile.am: get D-BUS libs and headers. * src/gnomad2.c: emit some test signals. 2006-09-26 mips * src/filesystem.c: now files >2gb will display (not correctly though). 2006-09-26 mips * src/filesystem.c: improved windows compatibility. 2006-09-25 mips * src/filesystem.c: "Delete selected" works properly now. 2006-09-22 mips * src/filesystem.c: "Delete selected" can't delete non-empty folders. i'm working on that, in the meantime it won't show the folder as deleted if it isn't. 2006-09-22 mips * src/filesystem.c: "Delete selected" now also deletes folders. * src/xfer.c: changed the confirmation dialog message to: "Really delete selected files/folders?". 2006-09-21 mips * src/xfer.c: added a working "new folder" entry to the local folders popup menu. 2006-09-21 mips * src/xfer.c: corrected spelling, "transfering"->"transferring" 2006-09-21 Linus Walleij * configure.ac: bump to 2.8.9 and release. 2006-09-21 mips * src/jukebox.c: no more overwriting when transferring from device to hd. * src/playlists.c: won't crash if selecting "delete playlist" with no playlists selected. 2006-09-19 mips * src/filesystem.c: fixed a bug that caused the codec info column to display garbage characters. 2006-09-03 Linus Walleij * src/id3read.c: fixed a nasty bug that caused problems when sending files with really long ID3 tags. 2006-08-25 Linus Walleij * Release 2.8.7. 2006-08-19 Linus Walleij * configure.ac: require libmtp 0.0.12+ * jukebox.c: set owner/friendly name. 2006-08-03 Linus Walleij * configure.ac: version bump. * src/filesystem.c: atleast one byte the music file must be. 2006-07-28 Linus Walleij * src/player.c: avoid trying to play stuff on MTP devices. * src/jukebox.h: determination function for MTP. * src/jukebox.c: dito. * src/gnomad2.c: spelling error. 2006-07-26 Linus Walleij * configure.ac: rewrote potentially problematic regex for GTK version check, courtesy of Oliver Gould. 2006-06-16 Linus Walleij * src/jukebox.c: more MTP support, now also playlists work. 2006-06-15 Linus Walleij * configure.ac: bump version. * src/jukebox.c: sync to latest libmtp CVS. * src/filesystem.c: ditto, plus support more filetypes properly. 2006-05-30 Linus Walleij * configure.ac: fix LINGUAS again now by bumping intltool to 0.35.0 so we get correct distribution of the files. Also bump to 2.8.5. 2006-05-12 Linus Walleij * src/jukebox.c: patches for new, fresh libmtp support up to libmtp 0.0.5. Patch by Pierre-Yves Strub. Thanks Pierre! 2006-04-10 Linus Walleij * configure.ac: fix use of po/LINGUAS file instead of maintaining languages in configure.ac. * po/LINGUAS: obvious addition. 2006-03-22 Linus Walleij * configure.ac: bump to 2.8.3 and release. Let God sort out the remaining bugs... 2006-03-21 Linus Walleij * src/jukebox.c: assure we have a clean compile also without libmtp. * configure.ac: proper messages on non-detection of libmtp. 2006-03-18 Linus Walleij * src/jukebox.c: added support for libmtp for accessing MTP-enabled devices! But you need libmtp of course. I'm considering including it in the gnomad2 source as a fallback at some point so I don't need the libmtp #ifdefs. * configure.ac: dito. * src/Makefile.am: dito. 2006-01-30 Linus Walleij * src/metadata.c: patch from Martin Bartlett to fix sort order in primary/secondary columns. 2006-01-08 Linus Walleij * Recently folded in numerous Win32 fixes and a number of ordinary stupid bugs found during porting. (It's good to port, one should do it more often.) * Changed track number retrieveal algorithm to concatenate the album number in case it exist in the ID3v2 tag. 2005-12-13 Linus Walleij * src/filesystem.h: windows file mode fixes. * src/filesystem.c: dito. * src/id3read.c: dito. * src/wavfile.c: dito. * src/wmaread.c: dito. 2005-11-11 Linus Walleij * src/editmeta.c: we cannot edit anything else than ID3v1/v2 metadata on the host harddisk side. * src/filesystem.c: small fixes here and there. * src/id3read.c: adding debug messages while trying to locate some Win32 problems. 2005-11-10 Linus Walleij * src/filesystem.c: Windows fixes for porting to Win32. * src/jukebox.c: Dito. * src/metadata.c: Dito. 2005-11-03 Linus Walleij * src/filesystem.h: Windows fixes for porting to Win32. * src/filesystem.c: Windows fixes for porting to Win32. 2005-10-23 Linus Walleij * Release version 2.8.2 because I don't have anything better to do. 2005-10-21 Linus Walleij * src/id3read.c: finally fixed unicode writing UTF-8 tags properly I THINK. 2005-10-17 Linus Walleij * src/common.h: and serveral other files, applied a patch from Maxima Dheneb removing the last dependencies for libgnomeui on GTK+ >= 2.6.0. * Removed all things that can be generated by "autogen.sh", so I don't have to clutter the repository with these. * src/metadata.h: doing some const correctness tests to learn that stuff. * src/metadat.c: same. 2005-10-10 Linus Walleij * src/jukebox.c: add selectable turbo mode per device. This release will require libnjb >= 2.2.4. * src/prefs.c: add a turbo mode preference checkbox. * src/prefs.h: dito. 2005-10-07 Linus Walleij * src/id3tag.c: further fixed up the header handling now looking into the handling of UTF-8 unicode which all of a suddens seems to be ignored... 2005-10-05 Linus Walleij * src/id3tag.c: horrendous bug in ID3v2 header length detection - did not use unsynced integers. No wonder they were getting it wrong all the time! 2005-09-21 Linus Walleij * src/jukebox.c: rely on libnjb for device strings. * configure.ac: bumped to 2.8.2. 2005-09-07 Linus Walleij * configure.ac: bumped to version 2.8.1 * Released gnomad2-2.8.1. 2005-08-29 Linus Walleij * src/filenaming.c: fixed a particularly nasty bug in kill_tracknumber() which would g_free() what should not be g_free():ed causing corruption. Bug courtesy of Carsten Luedtke with support from Shaun Jackman. Plus general cleanup of bogus code. * src/filesystem.c: cleanup and debug code... * src/metadata.c: dito. 2005-08-23 Linus Walleij * src/id3read.c: revamped ID3 tag writing to render tags to RAM before stripping the old ones and appending the new ones at the beginning and the end of the file. * src/util.c: improved hexdump facility. 2005-08-16 Linus Walleij * configure.ac: stopped generating .spec file from spec.in file. No good idea. * gnomad2.spec.in: removed. * gnomad2.spec: added. Target: Fedora Extras. * Makefile.am: stop distributing specfile. 2005-08-07 Linus Walleij * gnomad2.spec.in: some preparations for a move into Fedora Extras. Other distros couldn't care less. * README: update some of the blather. 2005-07-24 Linus Walleij * src/data.c: patch for OK/Cancel swap in accordance with GNOME HIG guidelines from Leandro Licarella. * src/editmeta.c: dito. * src/gnomad2.c: dito. * src/playlists.c: dito. 2005-07-24 Linus Walleij * src/data.c: patch by Leandro Lucarella, arrow order swap for GNOME overall look-and-feel (HIG) compliance. * src/xfer.c: Reflect the change here to make it intuitive. 2005-07-02 Linus Walleij * src/prefs.c: old bug found by Mathias Rodenstein. 2005-06-30 Linus Walleij * Finally release gnomad2 2.8.0. 2005-06-29 Linus Walleij * src/util.c: hunting a memory corruption bug in seconds_to_mmss but couldn't find it. 2005-06-27 Linus Walleij * Hesitated but didn't release gnomad2 2.8.0 2005-06-27 Linus Walleij * configure.ac: bumped to 2.8.0, many changes in libnjb makes this the obvious new version number. * gnomad2.spec.in: dependency on new libnjb updated. 2005-06-20 Linus Walleij * src/filenaming.c: more less cleverness (eQ). 2005-06-19 Linus Walleij * gnomad2-logo.png: made a new icon depicing a NJB1 * src/gnomad2.c: use the icon inside the program as a default icon in GTK+-2.6.x systems. 2005-06-17 Linus Walleij * src/filesystem.c: fixed a nobrainer in metadata model updating thread. 2005-06-16 Linus Walleij * src/gnomad2.c: GTK+-2.6.x about dialog fixes. * src/id3read.c: C casting fixes courtesy of GCC 4.0.0. * src/wmaread.c: dito. * src/mp3file.c: dito. 2005-06-14 Linus Walleij * src/gnomad2.c: more GtkDialog widget porting to remove yet more dependencies on libgnomeui in GTK+-2.4.0 and higher. 2005-06-13 Linus Walleij * src/jukebox.c: reflect changes in libnjb. 2005-06-08 Linus Walleij * src/jukebox.c: adapt to libnjb changes. * src/filenaming.c: make the title detection a bit less stupid when selecting the preference not to detect metadata from path. Filename will be used as title, as in mediasource. (Request from eQ) * src/filenaming.h: dito. 2005-06-07 Linus Walleij * filesystem.c: moved all metadata scanning into separate threads (one will be started for each event, both on track and data pane) * filesystem.h: reflect changes. * xfer.c: reflect changes. * configure.ac: bump to 2.7.2 * util.c: made the error dialog non-locking. 2005-06-06 Linus Walleij * Released bugfix 2.7.1 that fix an error with GTK+-2.6.x. 2005-06-06 Linus Walleij * Require latest libnjb (to-become 2.2) * Fix the insane gnomad2.spec.in file 2005-06-05 Linus Walleij Released Gnomad 2.7.0. 2005-05-31 Linus Walleij Several small bugfixes. Migrated from GNOME dialogs to GTK message dialogs in a few spots. 2005-05-30 Linus Walleij * src/Makefile.am: added in RIFF/WAVE parser files. * src/filesystem.c: added a RIFF/WAVE file parser call. * src/wavfile.c: RIFF/WAVE file parser. * src/wavfile.h: RIFF/WAVE file parser. * src/wmaread.c: fixed a small g_free() memleak. 2005-05-29 Linus Walleij * src/util.c: Added a generic confirmation dialog (YES/NO). * src/util.h: dito. * src/gnomad2.c: fixed double entry to expose() function. * src/xfer.c: confirmation on all delete operations. * src/data.c: confirmation on all delete operations. * src/playlists.c: confirmation on all delete operations. 2005-05-27 Linus Walleij * src/filenaming.c: fix handling of Cyrillic and probably many other charsets in the routine that determine filename from path. * src/gnomad2.c: improved device info dialog by moving stuff into jukebox.c. * src/jukebox.h: dito. * src/jukebox.c: dito. * nomadjukebox: removing this an require libnjb to be installed * nomad.usersmap: dito. * hotplug.sh: dito. * libnjb.spec.in: dito. * Makefile.am: dito. * src/filesystem.c: fixed a length detection bug that made WAV files default to 0 seconds, while 0:01 is a more apropriate default value. * configure.ac: updated and cleaned up. 2005-04-11 Linus Walleij * src/filesystem.c: fix to directory recursive creation routine from Jaime Medrano. 2005-04-04 Linus Walleij * Fixed some autoconf/automake weirdness that appeared as a result of something. Needed to introduce OSFLAGS in configure.ac and AC_SUBST() it to void. Tested with latest libnjb sources. 2005-03-03 Linus Walleij * Bumping to version 2.7.0 as we released libnjb 2.0. 2005-02-11 Linus Walleij * Fixed some problematic codec capitalization bugs both in gnomad2 and libnjb. * Some hackish fixes for skipping in songs (forward and backward) by dragging the song position bar in the player. Doesn't work so well though, probably because of libnjb or (even more probable) device limitations. 2005-02-09 Linus Walleij * Fixed up a few things relating to playlist management and released an incremental 2.6.3. 2005-01-24 Linus Walleij * Modified for the new EAX API changes from David. 2005-01-20 Linus Walleij * Released Gnomad 2.6.2 as an incremental upgrade. 2005-01-13 Linus Walleij * Added som GTK+-2.6 specific things, just as a test. Perhaps it will be possible to move away from libgnomeui in future versions... 2005-01-11 Linus Walleij * Removed WMA parsing bugprints that were just annoying me and others. * Applied a patch from Jaime Medrano that adds directory creation on jukebox->host transfer, and also a fix for getting the track number from the path name if it exists. Thanks Jaime! 2005-01-09 Linus Walleij * Applied a patch from Martin Bartlett that adds playlist shuffle support. Playlists may now be shuffled! 2004-12-30 Linus Walleij * Synced in libnjb support for Dell Pocket DJ. Fixed a few small flunkies. 2004-12-10 Linus Walleij * Fixed a real ugly tag edit bug on the NJB1, added support for the second generation Dell DJ and released Gnomad 2.6.1. 2004-11-19 Linus Walleij * Folders for datafiles now simply works, also creation of new folders. * The EAX settings GUI in the player now responds according to the library specification with regards to exclusive patches. 2004-11-14 Linus Walleij * Fixing a few bugs and lots of changes from the new libnjb API. Looking good now, and folder support in the file view is being worked on. 2004-09-29 Linus Walleij * But not until today will i *REALLY* release 2.5.0. 2004-09-24 Linus Walleij * This is a good opportunity to pack up and release Gnomad 2.5.0. 2004-09-20 Linus Walleij * Gnomad now remembers the last recently used directory, if desired. * Fixed a bug in the WMA parser, making it compatible with big-endian architectures. * Added a function that exports playlists to text files. (In playlist view, select and right-click a playlist entry, select "Export playlist".) 2004-08-22 Linus Walleij * Finalized WMA/ASF file parser, while being infected by a real nasty cold virus and listening to that Total Epygt remix by DHS of TSW. Transferring WMA files from *NIX to jukeboxes now works as expected and supports WMA metadata with Gnomad. * Pushed Gnomad version to 2.5.0. Lots of changes have gone into Gnomad now... 2004-08-21 Linus Walleij * Finalized ID3 (+RIFF) detection, removal and addition algorithms. id3tag is used only for modifying existing tags. * Begun work on a WMA/ASF file parser for atleast reading in WMA metadata correctly. 2004-08-16 Linus Walleij * Imported MP3 songlength detection algorithms from the gtkpod project. (They also have nice replaygain retrieveal functions that we can use if we ever understand how to use the "Smartvolume" thing.) * Switched to using pkgconfig for detecting libnjb, meaning we'll require a real recent version of it (CVS!) for Gnomad to compile correctly. * Switched back to the id3tag library again after looking at the gtkpod code and finally understanding how to use it. 2004-05-01 Linus Walleij * Upped to 2.4.4. and released in sync with the fresh libnjb 1.1 release. Happy mayday! 2004-04-26 Linus Walleij * Added a preference option to disable automatic scanning of contents on startup. 2004-04-22 Linus Walleij * Added the possibility to use the original filename when saving files to the local harddrive. Preference in the prefs tab added for this, and dependencies on reading in extended metadata was added too. 2004-04-21 Linus Walleij * Fixed a filenaming bug when saving using the track number: always prefix with "0", e.g. "01" instead of "1" for the %n macro in filenames. 2004-04-19 Linus Walleij * Updated to reflect changes in the EAX structure of libnjb. (Now it presents max and min volume values.) 2004-04-18 Linus Walleij * Updated the prefs to reflect that libnjb now can do extended metadata scans selectively. 2004-04-10 Linus Walleij * Time to roll out a bugfix 2.4.3 release with the latest fixes of Gnomad2 and libnjb. 2004-04-05 Linus Walleij * Removed deprecation from GTK functions -- we need these for some time still. Things introduced in GTK+ 2.3/2.4 like the GtkComboBox, cannot immediately deprecate all old code using the GtkOptionMenu right now. I have written new code for use with the GtkComboBox that will be activated at some time in the future. 2004-03-31 Linus Walleij * OK I know what the problem is now: several people have old filesystems with filenames in ISO 8859-1 that they use together with a locale like e.g. "de_DE.UTF-8" -- this means conversion functions will fail as they rely on the characters used in filenames to be the same as the ones specified by the locale. * Problems with NULL directories in UTF-8 flunkies avoided. Directories with accented characters caused crashes in filesystems which were treated as UTF-8 while not being UTF-8. Still working on the cause of this problem. 2004-03-09 Linus Walleij * A particularly nasty bug caused by the fact that the code was not checking if a track that was part of a playlist actually existed, was removed today. 2004-02-22 Linus Walleij * Minor bug fixes here and there, syncing up with the much improved metadata handling in libnjb, I release Gnomad 2.4.2. 2004-01-22 Linus Walleij * After some extra bug fixes in libnjb that screwed up the NJB1 track upload, I release 2.4.1. 2004-01-21 Linus Walleij * The libraries libnjb and id3lib are to be linked statically from now on. I have grown tired on distributions where this has not worked as I could expect, so only standard libs will be linked dynamically from now on. 2004-01-20 Linus Walleij * Made the jukebox delete the tracks from playlists before deleting the tracks themselves. * Several new translations too, but that part has its own changelog. 2004-01-12 Linus Walleij * Massive attempt att internationalization. Added a translation file for Swedish as a starter. * Fixed a preference option to turn off the "smart" filename detection that use the filename to figure out what the current artist and track title is. * Oh! Gnomad was 2 years old yesterday! 2004-01-10 Linus Walleij * Bumped to version 2.4.0 and released with Dell Digital Jukebox support and stuff. Not many changes in Gnomad but libnjb is considerably improved! When did I release Gnomad 2.3.0? I forgot to enter it into the ChangeLog! 2004-01-02 Linus Walleij * Added support for Dell Digital Jukebox. 2003-12-06 Linus Walleij * Release to keep up with libnjb 1.0 and the Zen Xtra support. Minor code cleanup. 2003-10-27 Linus Walleij * Full migration to GTK+-2.0 and some fixes. Rolling this out as Gnomad 2.2.0. 2003-10-10 Linus Walleij * Added Zen NX support. From libnjb. 2003-09-27 Linus Walleij * Fixed the bug giving nonsense filename in the filename field of transferred songs. Could be good later when we want to do synchronization stuff... E.g: filename same == same file, it's sync:ed. Else, update. 2003-09-07 Linus Walleij * Some GNOME 2 updates, and a fix so that "edit metadata" does not work on directories (would cause problemz...) 2003-08-22 Linus Walleij * I released 2.1.0 a few days ago and forgot to update the changelog... 2003-07-23 Linus Walleij * Fixed the error that made Gnomad write ID3 tags even if both had been disabled. 2003-07-01 Linus Walleij * Fixed a very annoying bug that made track number display the year instead for NJB3-series. Sorry for this one, I was drunk. 2003-06-29 Linus Walleij * Added multiple playlist selection (cool!) and several GNOME 2 fixes. 2003-06-27 Linus Walleij * Begun a new host of GNOME 2 fixes removing deprecated widgets and function calls. This will take some time. 2003-06-25 Linus Walleij * Removed the clickable column headers in the playlist view, they just crashed the program. Probably a GTK bug but won't dive into it right now. * Fixed the NULL bug in editing and info-from-path detection (meta->genre was not set to "" when not present. 2003-06-14 Linus Walleij * Resurrected the recursive directory transfer function. * Some other debugging and healthy refactoring... 2003-06-07 Linus Walleij * Fixed the GtkListStore code to add rows first and then sort them, to avoid the slow O(n^2) behaviour of the list addition for the often huge jukebox list. * Version is set at 2.0.3. 2003-05-22 Linus Walleij * Pushing out 2.0.2 just to get some of the fixes from libnjb CVS in the RPM package. 2003-05-18 Linus Walleij * Some bugfixes relating to how GTK 2.0 deletes a multiple selection (obviously you're not quite supposed to do this at all!) * Bumped to 2.0.2 2003-03-30 Linus Walleij * OK after more minor fixes this is the time to release 2.0.1. 2003-03-18 Linus Walleij * Replaced the playlist CTree with the new MVC model and view structure. Much better. Bumped to 2.0.1 many changes in libnjb too, perhaps time to roll out a new version soon. 2003-01-17 Linus Walleij * Fixed both selection and sorting. * Releasing this as Gnomad 2.0.0! 2003-01-16 Linus Walleij * Many bugs removed today. Things that need to be taken care of before any release: * Selection of rows. Callback happens after pressing down the right button and thus cannot block the signal. * Sorting of rows. This causes damn segfaults. 2003-01-16 Linus Walleij * This seem to take time. Removing the old CLists in the paned views of the interface in favor of the new Model-View-Controller trees from GTK+-2.0 proved very annoyingly complicated. However it lead to several refactorings of the code and was all for the better. I expect I will release 2.0.0 quite soon. 2002-11-19 Linus Walleij * I have basically ported all of Gnomad to the new name gnomad2 which implies that it is time to move to Gnome 2.0 (the future). Gnomad2 compiles file under Gnome 2, and also under GTK+-2.0 if you use it there. The sources have been moved to Sourceforge. 2002-10-07 Linus Walleij * A lot of bugfixes that are related to the fact that I've been digging in libnjb while implementing support for Nomad Jukebox 3. I will roll the RPM packages with the native NJB3 support... * Rolling out as GNOMAD 1.1.6. 2002-08-07 Linus Walleij * Added fixes to make GNOMAD much more tolerant to older versions of ID3lib. The code was proudly stolen from EasyTag (thanks guys!) * Rolling out recent changes as GNOMAD 1.1.5. 2002-07-26 Linus Walleij * Fixed some extra keybindings so you can atleast navigate the file hierarchy using nothing but the keyboard. Now, how to bring up the popup menu? 2002-07-22 Linus Walleij * Added some accelerator keys to try it out. Just the most basic ones. * Fixed a bug that would unselect ID3v2 tagging all the time, even if you turned it on. (Error in prefs saving, damn.) * Fixed a bug that caused Gnomad to crash if you selected device info before reading in any track listing. * Added the ability to use track number in the file naming when transferring to harddisk. 2002-07-18 Linus Walleij * Found out how to hotplug properly. Documented this procedure in the README file. * Fixed a directory-recursion bug that some users found very annoying (recursion would only descend one level). * Fixed string comparison bug which stopped edited metadata from being written back if the only difference was the CaSe of the characters. Actuallt this was all because of my stupidity, using g_strcasecmp() instead of just using strcmp() which was actually what I wanted. * Rolling out as GNOMAD 1.1.4 2002-06-18 Linus Walleij * Bugfix for a trouble with GNOMAD crashing when there is not .gnomadrc file in the users home directory. I hope I have fixed this now, please report back. * Rolling out as GNOMAD 1.1.3 2002-05-31 Linus Walleij * Merged a patch from David Blackman that adds directory recursion and makes it possible to skip playlist selection. * Added preferences for ID3v1 / ID3v2 writing. * Rolling out changes as GNOMAD 1.1.2 2002-04-08 Linus Walleij * Samuel Monsarrat found a bug in the track number scheme which I instantly had to fix. Transfered files did not get the desired track number. * I was also requested to fix so that the editing of metadata does not redraw the filelist windows. I fixed it, by not redrawing the filelists at all, but instead I just edit the CLIST row data. * Rolled out this as GNOMAD 1.1.1, also I learned how to make RPMs of GNOMAD now, funny thing. 2002-04-05 Linus Walleij * John released libnjb 0.8b so now it's the right time to roll out GNOMAD 1.1.0! 2002-03-31 Linus Walleij * Removed a particulary nasty bug causing memory allocated on the stack to be deallocated (reassigned an allocated memory pointer to local variable, then freed the same memory pointer -- not good). * Various fixes in the GUI. * File transfer functionality is now in both libnjb and GNOMAD. Playing with thoughts about releasing RPMs of GNOMAD linked to the CVS version of libnjb as its release schedule (libnjb) isn't really to be trusted... 2002-03-28 Linus Walleij * Several patches finally included in the libnjb CVS as John gave me write access (thanks!) proceeding to extend libnjb with file transfer functionality. * Pushed GNOMAD version to 1.1.0 as this will obviously be the next version. 2002-03-21 Linus Walleij * Found that several packages of id3lib, including the Mandrake packages, does not link to libstdc++, requiring the using application to link to libstdc++ even if it is not a C++ program! (id3lib has a non-C++ interface which is used by Gnomad.) Tacked on some changes into configure.in to compensate for this, and found that there is some nasty bug somewhere that prevents AC_SEARCH_LIBS from working on GCC3. Need to report this to the Autoconf team, or am I misunderstanding something? 2002-03-11 Linus Walleij * Fixed an extremely annoying memory bug caused by misspeling a variable. (D'oh!) 2002-03-10 Linus Walleij * More changes to the player (now the threading is a lot better), new hacks to libnjb due to problems in the protocol guide, added "play playlist" feature. * Added support for track number and original filename in the metadata listings and editor. Track number and original filename are now stored on the jukebox when transferring, and also stored inside the ID3V2 tag when transfering in the other direction. And now my teawater is boiling!! 2002-03-08 Linus Walleij * Made several changes to the player, including full EAX and equalizer support. Submitted EAX struct code and NJB_Adjust_Sound() patches to John for inclusion in libnjb. The current codebase will probably require an updated version of libnjb when released. However limited functionality on old libraries is a small price to pay for all the new functionality. So it looks like this will one day become GNOMAD 1.1.0. 2002-03-05 Linus Walleij * Removed annoying playing bug - the player window only appeared the first time you selected some tracks to play. Several other tweaks to the player. * GNOMAD will be able to change metadata on jukebox files for folks using the CVS version of libnjb. 2002-01-24 Linus Walleij * Added a few extra GNOME specific dialogs in the ongoing GNOME support. * Lots of fun with the configure.in autoconf macros to make it detect and use/not use libusb correctly. Things should now compile on *BSD not using libusb without any problems. * Bug fixes and beautifications here and there. * Rolled out as GNOMAD 1.0.5 2002-01-16 Linus Walleij * Found out from Dan Gray that GNOMAD didn't compile correctly in GCC 3. After installing GCC 3 I could repeat the problem and solved it by rewriting the id3lib wrapper to use the C-interface of id3lib rather than the C++ wrapper used before. This way I also eliminated all C++ code from the program and made it undependent of the C++ compiler and linker. The cause of the problem was something in GCC 3 (not sure of what) that stops you from linking C code and C++ code into the same executable, possibly because the main() method was not inside a C++ file (though testing that approach didn't help me). The C interface of id3lib is just as useable anyway, though perhaps not as elegant. * By the way, if you have both GCC 2.x and GCC 3 on a RedHat system you can compile with gcc3 by configuring using: CC=gcc3 ./configure * Added a few extra GNOME desktop features. (Still to be completed for full GNOME compliance.) * Rolling these changes out as GNOMAD 1.0.4. 2002-01-12 Linus Walleij * Finally found out that mingling jukebox calls with GTK calls is a major source of unstability, especially so if you are playing around with playlists. Letting jukebox calls create memory structures (lists, hashes) and then building the widgets from the structures added a LOT of stability. Now you can even use the program a bit before it crashes :-) * Also implemented a fast file copy method that improved the speed of stripping ID3 tags by, say 800%. * A lot of other stupid bugs got squashed. So rolling out GNOMAD 1.0.3 is a good thing to do before going to bed. 2002-01-12 Linus Walleij * Removed all use of stdbool.h, and the bool type in favor of gboolean and the C++ builting bool type in id3.cpp. Released this single bugfix as GNOMAD 1.0.1 :-) * Later that night, I moved all opening and closing of the jukebox into the opening and closing of the program, so that NJB_Release() and NJB_Close() are not called all the time. * In the night same day I had still not been able to locate the problem which makes the application crash on clearing and rebuilding the playlist tree. The only thing I know is that the error only occurs when I build playlists which are expandable and with songs in them. Also any destruction of playlists using playlist_destroy() seems to be dangerous. * However things are much more useable right now, so I will roll these fixes as GNOMAD 1.0.2. Just so that folks trying it out will actually be able to use it... 2002-01-11 Linus Walleij * Created the initial release of GNOMAD 1.0 gnomad2-2.9.6/NEWS0000664000076400007640000000163511512614631010516 00000000000000GNOMAD 1.0 Most things are new. Gnomad2 2.0 Moved to GTK+ 2.0 and Gnome 2.0. This is the future. GTK+ 2.0 and Gnome 2.0 introduces Unicode handling and thread abstraction, apart for being good- looking and antialiasing nicely etc etc. Gnomad 2.8.3 First version to support libmtp. Gnomad 2.8.10 Removed all graphic (GTK) call functions from the threads and all use of the GDK drawing thread lock function. It didn't work anyway! Instead all drawing is now done in the main GTK loop, and this works much better on your hyperthreaded systems, SMP machines and on Windows too, hopefully. Gnomad 2.9.0 Added support for taglib to be used for reading/writing Ogg and FLAC files. We might switch over to using solely taglib at some point, but right now we still use libid3tag plus a lot of custom code to deal with ID3 tags. The C interface to taglib need a few extras we don't have currently. gnomad2-2.9.6/intltool-merge.in0000664000076400007640000000000011602630253013267 00000000000000gnomad2-2.9.6/intltool-update.in0000664000076400007640000000000011602630253013452 00000000000000gnomad2-2.9.6/gnomad2.10000664000076400007640000000532211512614631011425 00000000000000.TH GNOMAD2 "1" "September 2004" "Gnome gnomad2 2.8.2" "User Commands" .SH NAME gnomad2 \- transfer files between a host and a Creative Labs Nomad Jukebox, Zen jukebox or Dell Digital Jukebox (DJ). .SH SYNOPSIS .B gnomad2 [\fIOPTION\fR]... .SH DESCRIPTION Gnomad 2 is a GUI built on top of GTK/GNOME 2, id3lib and libnjb that makes it possible to transfer tracks and files from/to a Creative Nomad Jukebox (all brands) and the Dell DJ. It is designed much like an ordinary graphical FTP program, in commander-style. .SH OPTIONS .TP \fB\-D\fR[\fIDEBUGLEVEL\fR] A debug level is a number between 1 and 15, identical to the debug level value of libnjb. .TP \fB\-\-load\-modules\fR=[\fIMODULE\fR]... Dynamic modules to load .SS Help options .TP -?, \fB\-\-help\fR Show this help message .TP \fB\-\-usage\fR Display brief usage message .SS GTK+ .TP \fB\-\-gdk\-debug\fR=\fIFLAGS\fR Gdk debugging flags to set .TP \fB\-\-gdk\-no\-debug\fR=\fIFLAGS\fR Gdk debugging flags to unset .TP \fB\-\-display\fR=\fIDISPLAY\fR X display to use .TP \fB\-\-screen\fR=\fISCREEN\fR X screen to use .TP \fB\-\-sync\fR Make X calls synchronous .TP \fB\-\-name\fR=\fINAME\fR Program name as used by the window manager .TP \fB\-\-class\fR=\fICLASS\fR Program class as used by the window manager .TP \fB\-\-gtk\-debug\fR=\fIFLAGS\fR Gtk+ debugging flags to set .TP \fB\-\-gtk\-no\-debug\fR=\fIFLAGS\fR Gtk+ debugging flags to unset .TP \fB\-\-g\-fatal\-warnings\fR Make all warnings fatal .TP \fB\-\-gtk\-module\fR=\fIMODULE\fR Load an additional Gtk module .SS Bonobo activation support .TP \fB\-\-oaf\-ior\-fd\fR=\fIFD\fR File descriptor to print IOR on .TP \fB\-\-oaf\-activate\-iid\fR=\fIIID\fR IID to activate .TP \fB\-\-oaf\-private\fR Prevent registering of server with OAF .SS GNOME Library .TP \fB\-\-disable\-sound\fR Disable sound server usage .TP \fB\-\-enable\-sound\fR Enable sound server usage .TP \fB\-\-espeaker\fR=\fIHOSTNAME\fR:PORT Host:port on which the sound server to use is running .TP \fB\-\-version\fR 2.6.1.1 .SS Session management .TP \fB\-\-sm\-client\-id\fR=\fIID\fR Specify session management ID .TP \fB\-\-sm\-config\-prefix\fR=\fIPREFIX\fR Specify prefix of saved configuration .TP \fB\-\-sm\-disable\fR Disable connection to session manager .SS GNOME GUI Library .TP \fB\-\-disable\-crash\-dialog\fR Disable crash dialog .SH AUTHOR Written by Linus Walleij. This manual page was written by Shaun Jackman for the Debian system. .SH "REPORTING BUGS" Report bugs to Linus Walleij . .SH COPYRIGHT Copyright 2003 Linus Walleij This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" http://gnomad2.sourceforge.net/ gnomad2-2.9.6/configure.ac0000664000076400007640000002051411602630246012302 00000000000000dnl Process this file with autoconf to produce a configure script. AC_PREREQ(2.52) AC_INIT([gnomad2], [2.9.6], [triad@df.lth.se]) AC_CONFIG_SRCDIR([src/gnomad2.c]) AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) dnl -------------------------------------------------------------------------- dnl dnl Checks for basic stuff like compilers dnl dnl -------------------------------------------------------------------------- AC_LANG_C AC_PROG_MAKE_SET AC_PROG_INSTALL dnl Checks for typedefs, structures, and compiler characteristics. dnl AC_C_CONST dnl -------------------------------------------------------------------------- dnl Too many people miss to add /usr/local/lib/pkgconfig to PKG_CONFIG_PATH dnl this is not elegant, but will solve more problems than it creates. dnl -------------------------------------------------------------------------- if test -d /usr/local/lib/pkgconfig ; then export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig fi PKG_CHECK_MODULES(GN, \ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ ) GTK_VER=`$PKG_CONFIG --modversion gtk+-2.0` LIBNJB_VER=`$PKG_CONFIG --modversion libnjb` dnl This is for some reason needed by the PKG_CHECK macro. OSFLAGS="" AC_SUBST(OSFLAGS) dnl -------------------------------------------------------------------------- dnl Check id3tag library separately: dnl first try to locate it using pkg-config, then fall back on using dnl header files only. dnl -------------------------------------------------------------------------- PKG_CHECK_MODULES(TAG, id3tag >= 0.15, found_id3tag_pkg=yes, found_id3tag_pkg=no) ID3TAG_VER=`pkg-config --modversion id3tag` AC_CHECK_HEADER(id3tag.h, found_id3tag_header=yes, found_id3tag_header=no) AC_ARG_WITH(id3tag-prefix, [ --with-id3tag-prefix=PFX Prefix where id3tag library is installed (optional)], id3tag_prefix="$withval", id3tag_prefix="") if test x"$id3tag_prefix" != "x"; then TAG_LIBS="-L$id3tag_prefix/lib -lid3tag -lz" TAG_CFLAGS="-I$id3tag_prefix/include" else if test x"$found_id3tag_pkg" = "xno" ; then if test x"$found_id3tag_header" = xno ; then AC_MSG_ERROR([*** id3tag.h C header is needed (missing -dev package?) ***\n*** You might have erroneously installed id3lib instead of libid3tag ****\nThis distinction is very delicate, so PLEASE pay attention! ***]) fi ID3TAG_VER=unknown TAG_CFLAGS="" TAG_LIBS="-lid3tag -lz" fi fi AC_SUBST(TAG_CFLAGS) AC_SUBST(TAG_LIBS) dnl -------------------------------------------------------------------------- dnl Check taglib library separately: dnl first try to locate it using pkg-config, then fall back on using dnl header files only. dnl -------------------------------------------------------------------------- PKG_CHECK_MODULES(TAGLIB, taglib >= 1.4, found_taglib_pkg=yes, found_taglib_pkg=no) TAGLIB_VER=`pkg-config --modversion taglib` AC_CHECK_HEADER(taglib/tag_c.h, found_taglib_header=yes, found_taglib_header=no) AC_ARG_WITH(taglib-prefix, [ --with-taglib-prefix=PFX Prefix where taglib library is installed (optional)], taglib_prefix="$withval", taglib_prefix="") if test x"$taglib_prefix" != "x"; then TAGLIB_LIBS="-L$taglib_prefix/lib -ltag_c" TAGLIB_CFLAGS="-I$taglib_prefix/include" have_taglib="yes" AC_DEFINE(HAVE_TAGLIB) else if test x"$found_taglib_pkg" = "xno" ; then if test x"$found_taglib_header" = "xno" ; then AC_MSG_NOTICE([*** taglib was not found on your system. Deactivating Ogg/FLAC support! ***]) TAGLIB_VER="NOT USED" else TAGLIB_VER=unknown TAGLIB_CFLAGS="" TAGLIB_LIBS="-ltag_c" have_taglib="yes" AC_DEFINE(HAVE_TAGLIB) fi else have_taglib="yes" dnl Override the package default which is only for C++ TAGLIB_LIBS="-ltag_c" AC_DEFINE(HAVE_TAGLIB) fi fi AC_SUBST(TAGLIB_CFLAGS) AC_SUBST(TAGLIB_LIBS) AM_CONDITIONAL(TAGLIB_COMPILE, test x"$have_taglib" = "xyes" ) AC_ARG_WITH(taglib-only, [ --with-taglib-only Use ONLY taglib to tag even MP3 files.], taglib_only="yes", taglib_only="no") if test x"$taglib_only" = "xyes" ; then AC_DEFINE(TAGLIB_ONLY) AC_MSG_NOTICE([*** use taglib and taglib only! ***]) fi dnl -------------------------------------------------------------------------- dnl dnl Check for the new, cool libmtp library, and activate functionality dnl if we have it. dnl dnl -------------------------------------------------------------------------- PKG_CHECK_MODULES(MTP, libmtp >= 0.3.0, found_libmtp_pkg=yes, found_libmtp_pkg=no) MTP_VER=`pkg-config --modversion libmtp` AC_CHECK_HEADER(libmtp.h, found_libmtp_header=yes, found_libmtp_header=no) AC_ARG_WITH(libmtp-prefix, [ --with-libmtp-prefix=PFX Prefix where libmtp library is installed (optional)], libmtp_prefix="$withval", libmtp_prefix="") if test x"$libmtp_prefix" != "x"; then MTP_LIBS="-L$libmtp_prefix/lib -lmtp" MTP_CFLAGS="-I$libmtp_prefix/include" MTP_VER=unknown AC_DEFINE(HAVE_LIBMTP) else if test x"$found_libmtp_pkg" = "xno" ; then if test x"$found_libmtp_header" = xno ; then AC_MSG_NOTICE([*** libmtp was not found on your system. Deactivating MTP support! ***]) MTP_VER="NOT USED" else LIBMTP_VER=unknown MTP_CFLAGS="" MTP_LIBS="-lmtp" AC_DEFINE(HAVE_LIBMTP) fi else AC_DEFINE(HAVE_LIBMTP) dnl Check for libmtp 0.3.0+ PKG_CHECK_EXISTS(libmtp >= 0.3.0, found_libmtp_030_pkg=yes, found_libmtp_030_pkg=no) if test x"$found_libmtp_030_pkg" = "xyes" ; then AC_DEFINE([HAVE_LIBMTP_030], 1, [indicates whether libmtp 0.3.0 is installed]) fi fi fi AC_SUBST(MTP_CFLAGS) AC_SUBST(MTP_LIBS) dnl -------------------------------------------------------------------------- dnl Check gudev library separately dnl -------------------------------------------------------------------------- PKG_CHECK_MODULES(GUDEV, gudev-1.0 >= 143, found_gudev_pkg=yes, found_gudev_pkg=no) if test x"$found_gudev_pkg" = "xno" ; then GUDEV_VER="NOT USED" else GUDEV_VER=`pkg-config --modversion gudev-1.0` AC_DEFINE(HAVE_GUDEV) fi AC_SUBST(GUDEV_CFLAGS) AC_SUBST(GUDEV_LIBS) dnl -------------------------------------------------------------------------- dnl dnl Add some deprecation C flags dnl dnl -------------------------------------------------------------------------- CFLAGS="$CFLAGS -DGTK_DISABLE_SINGLE_INCLUDES" CFLAGS="$CFLAGS -DG_DISABLE_SINGLE_INCLUDES" dnl CFLAGS="$CFLAGS -DGTK_DISABLE_DEPRECATED" dnl CFLAGS="$CFLAGS -DG_DISABLE_DEPRECATED" dnl CFLAGS="$CFLAGS -DGDK_DISABLE_DEPRECATED" dnl CFLAGS="$CFLAGS -DGTK_MULTIHEAD_SAFE" dnl This is for the thing to build on Windows. dnl CFLAGS="$CFLAGS -mms-bitfields" dnl -------------------------------------------------------------------------- dnl Internationali[sz]ation dnl -------------------------------------------------------------------------- IT_PROG_INTLTOOL([0.35.0]) GETTEXT_PACKAGE=gnomad2 AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [GetText Package]) AM_GLIB_GNU_GETTEXT if test "x${prefix}" = "xNONE"; then AC_DEFINE_UNQUOTED(GNOMADLOCALEDIR, "${ac_default_prefix}/${DATADIRNAME}/locale", [Locale dir]) else AC_DEFINE_UNQUOTED(GNOMADLOCALEDIR, "${prefix}/${DATADIRNAME}/locale", [Locale dir]) fi dnl -------------------------------------------------------------------------- dnl dnl Checks for generic header files. dnl dnl -------------------------------------------------------------------------- AC_HEADER_DIRENT AC_HEADER_STDC AC_CHECK_HEADERS(malloc.h stdlib.h string.h fcntl.h inttypes.h) AC_CHECK_FUNCS(chdir) dnl -------------------------------------------------------------------------- dnl dnl At last write the configured makefiles dnl dnl -------------------------------------------------------------------------- AC_SUBST(ac_aux_dir) AC_OUTPUT([ Makefile src/Makefile doc/Makefile po/Makefile.in ]) echo " $PACKAGE $VERSION Configuration : --------------- Source code location .: $srcdir C Preprocessor .......: $CPP $CPPFLAGS C Compiler ...........: $CC $CFLAGS C Linker .............: $CC $LDFLAGS $LIBS GTK+ version .........: $GTK_VER libnjb version........: $LIBNJB_VER libmtp version........: $MTP_VER id3tag version........: $ID3TAG_VER taglib version........: $TAGLIB_VER gudev version.........: $GUDEV_VER Install path .........: $prefix Now type 'make' to build $PACKAGE $VERSION, and then 'make install' for installation. " gnomad2-2.9.6/mkinstalldirs0000775000076400007640000000370411512614631012624 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here gnomad2-2.9.6/TODO0000664000076400007640000000356411577735314010527 00000000000000* Problems with GNOMAD: OUTSTANDING BUGS: ----------------- Removing two files after another from a playlist fails :-P This must really be fixed soon. Trying to transfer protected files will end in misery. Warn and remove from transfer list. Large files >= 2GB do not show up in the file view. ENHANCEMENTS: ------------- Modularize protocol support so that libmtp glue code and libnjb glue code is in one file each. So we get: device.c/.h (replaces jukebox.c/.h) pdedevice.c (#include "device.h", #include ) mtpdevice.c (#include "device.h", #include ) device.c will contain new wrappers in the spirit of jukebox.c and all device-agnostic code. All device specific code is then pushed down in respective file. This will make it possible to compile gnomad2 with/without each library and makes it easy to add new protocols too. #typedef intermediary types for things that are generic inside gnomad2 and specific for each device, for example: typedef uint32_t generic_id_t; /* can hold libmtp id or a libnjb id */ RIFF-WAV metadata scanner? (from getid3()). Perhaps switch to using the KDE-centric taglib which can get tags from everything including the MTP supported Ogg files and MP4... Add possibility to send a bitmap. Requires work in libnjb. Add possibility to skip forward/backward in files when playing. (Works so-so on libnjb.) Synch of songs in a harddisk directory, w/checksums? Put jukebox ID in ID3 tag? Add some stuff to the playlist view: sort playlist by different criteria, remove playlist AND files, move files around by drag'n'drop etc. (Hard to do.) Add contents of a playlist to another playlist. Keybindings to all menus (including popups) Transfer queue showing -- even w/o full queue, be able to queue things while transferring. Player queue visible. Queueview widget builder? gnomad2-2.9.6/install-sh0000755000076400007640000003253711354106464012032 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2009-04-28.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gnomad2-2.9.6/gnomad2.applications0000664000076400007640000000016411512614631013752 00000000000000gnomad2 command=gnomad2 name=Gnomad 2 can_open_multiple_files=false expects_uris=false requires_terminal=false gnomad2-2.9.6/depcomp0000755000076400007640000004426711354106464011406 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2009-04-28.21; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u="sed s,\\\\\\\\,/,g" depmode=msvisualcpp fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: gnomad2-2.9.6/Makefile.in0000664000076400007640000007066711602630254012076 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \ ChangeLog INSTALL NEWS TODO depcomp install-sh missing \ mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" \ "$(DESTDIR)$(applicationsdir)" "$(DESTDIR)$(desktopdir)" \ "$(DESTDIR)$(icondir)" NROFF = nroff MANS = $(man_MANS) DATA = $(applications_DATA) $(desktop_DATA) $(icon_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d "$(distdir)" \ || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr "$(distdir)"; }; } am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GN_CFLAGS = @GN_CFLAGS@ GN_LIBS = @GN_LIBS@ GREP = @GREP@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ MTP_CFLAGS = @MTP_CFLAGS@ MTP_LIBS = @MTP_LIBS@ OBJEXT = @OBJEXT@ OSFLAGS = @OSFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ TAG_CFLAGS = @TAG_CFLAGS@ TAG_LIBS = @TAG_LIBS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src doc po desktopdir = $(datadir)/applications desktop_in_files = gnomad2.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) icondir = $(datadir)/pixmaps icon_DATA = gnomad2-logo.png applicationsdir = $(datadir)/application-registry applications_DATA = gnomad2.applications man_MANS = gnomad2.1 EXTRA_DIST = \ AUTHORS \ TODO \ NEWS \ README \ $(desktop_in_files) \ $(desktop_DATA) \ $(applications_DATA) \ $(icon_DATA) \ intltool-merge.in \ intltool-update.in \ intltool-extract.in \ gnomad2.1 \ mkinstalldirs DISTCLEANFILES = \ po/.intltool-merge-cache \ $(desktop_DATA) \ intltool-extract \ intltool-merge \ intltool-update all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): install-man1: $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list=''; test -n "$(man1dir)" || exit 0; \ { for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man1dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.1[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ test -z "$$files" || { \ echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(man1dir)" && rm -f $$files; } install-applicationsDATA: $(applications_DATA) @$(NORMAL_INSTALL) test -z "$(applicationsdir)" || $(MKDIR_P) "$(DESTDIR)$(applicationsdir)" @list='$(applications_DATA)'; test -n "$(applicationsdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(applicationsdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(applicationsdir)" || exit $$?; \ done uninstall-applicationsDATA: @$(NORMAL_UNINSTALL) @list='$(applications_DATA)'; test -n "$(applicationsdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(applicationsdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(applicationsdir)" && rm -f $$files install-desktopDATA: $(desktop_DATA) @$(NORMAL_INSTALL) test -z "$(desktopdir)" || $(MKDIR_P) "$(DESTDIR)$(desktopdir)" @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(desktopdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(desktopdir)" || exit $$?; \ done uninstall-desktopDATA: @$(NORMAL_UNINSTALL) @list='$(desktop_DATA)'; test -n "$(desktopdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(desktopdir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(desktopdir)" && rm -f $$files install-iconDATA: $(icon_DATA) @$(NORMAL_INSTALL) test -z "$(icondir)" || $(MKDIR_P) "$(DESTDIR)$(icondir)" @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(icondir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(icondir)" || exit $$?; \ done uninstall-iconDATA: @$(NORMAL_UNINSTALL) @list='$(icon_DATA)'; test -n "$(icondir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ test -n "$$files" || exit 0; \ echo " ( cd '$(DESTDIR)$(icondir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(icondir)" && rm -f $$files # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @list='$(MANS)'; if test -n "$$list"; then \ list=`for p in $$list; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ if test -f "$$d$$p"; then echo "$$d$$p"; else :; fi; done`; \ if test -n "$$list" && \ grep 'ab help2man is required to generate this page' $$list >/dev/null; then \ echo "error: found man pages containing the \`missing help2man' replacement text:" >&2; \ grep -l 'ab help2man is required to generate this page' $$list | sed 's/^/ /' >&2; \ echo " to fix them, install help2man, remove and regenerate the man pages;" >&2; \ echo " typically \`make maintainer-clean' will remove them" >&2; \ exit 1; \ else :; fi; \ else :; fi $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @$(am__cd) '$(distuninstallcheck_dir)' \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(MANS) $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(applicationsdir)" "$(DESTDIR)$(desktopdir)" "$(DESTDIR)$(icondir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-applicationsDATA install-desktopDATA \ install-iconDATA install-man install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-man1 install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-applicationsDATA uninstall-desktopDATA \ uninstall-iconDATA uninstall-man uninstall-man: uninstall-man1 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-xz dist-zip distcheck \ distclean distclean-generic distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am html html-am info \ info-am install install-am install-applicationsDATA \ install-data install-data-am install-desktopDATA install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-iconDATA install-info install-info-am \ install-man install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ uninstall-applicationsDATA uninstall-desktopDATA \ uninstall-iconDATA uninstall-man uninstall-man1 @INTLTOOL_DESKTOP_RULE@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gnomad2-2.9.6/aclocal.m40000664000076400007640000017516311602630253011665 00000000000000# generated automatically by aclocal 1.11.1 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],, [m4_warning([this file was generated for autoconf 2.68. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.ac. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_ac,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 40 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` [INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` ] AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be executed at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) # nls.m4 serial 5 (gettext-0.18) dnl Copyright (C) 1995-2003, 2005-2006, 2008-2010 Free Software Foundation, dnl Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ([2.50]) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE([nls], [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT([$USE_NLS]) AC_SUBST([USE_NLS]) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT]) ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .]) ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 10 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR gnomad2-2.9.6/README0000664000076400007640000002675111601345534010707 00000000000000README for Gnomad2 0. Easy install for distributions that already package Gnomad2 by default: Debian: apt-get install gnomad2 Fedora: yum install gnomad2 Gentoo: emerge gnomad2 SuSE: use YaST? 1. Gnomad2 requires the library GTK+-2.0 to build. Get it here: http://www.gtk.org/ This comes by default on most systems by the way. You mostly only need to install a gtk+-2.0-dev(el) package to enable compiling. Any distribution built on GNOME 2.2+ will work fine with Gnomad2. 2. Gnomad2 using GTK+ < 2.6 will require the library libGnomeui to build. Newer versions will rely solely on GTK+. (Hey, this also actually works from Gnomad2 >= 2.8.2!) Get it here http://developer.gnome.org/doc/API/ Any distribution built on GNOME 2.2+ will work fine with Gnomad2. 3. Gnomad2 also requires the library libnjb to build. Get it here: http://sourceforge.net/projects/libnjb/ Pay attention to the notes in the libnjb README file for underlying functionality requirements and troubleshooting. libnjb may in turn require libusb if you're building under Linux. Debian: libnjb is now included in the Debian distribution. You might need a newer library revision (subsitute the "5" for something higher). apt-get install libnjb5 apt-get install libnjb5-dev should be available, and you may need later interface revision numbers (substitute the "5" for something higher). Notice that Debian also carries gnomad2 so why bother installing libnjb separately... When you "apt-get install gnomad2" libnjb will be auto-installed anyway. Red Hat / Fedora Core: An RPM package of libusb is included in the Red Hat / Fedora Core distribution. (New versions are available at RawHide (beta)). It is installed by default, you don't have to do anything about it. libnjb is included in the Fedora Extras so simply issue: yum install libnjb as root will be likely to work. Also Fedora Extras carry gnomad2 packages so easy install with "yum install gnomad". SuSE: Use YaST to satisfy the dependencies. You need atleast the following packages unless you already have them: popt and popt-devel pkg-config Most users will prefer to install libnjb and gnomad2 from source. Packman has libnjb packages for SuSE but not for gnomad2 unfortunately. 4. Gnomad2 also requires the library libid3tag to build. NOTE: Gnomad has switched from using id3lib to using libid3tag produced by the libmad project. This latter library is used by e.g. gtkpod and the gstreamer project use id3tag instead of id3lib. These two libraries are confused all the time, so please pay attention. Get it here: http://sourceforge.net/projects/mad/ http://sourceforge.net/project/showfiles.php?group_id=12349 Debian: apt-get install libid3tag0 apt-get install libid3tag0-dev The versions from testing (upcoming Debian 4.0) are needed for gnomad2 to work. Red Hat/Fedora Core: The RPM of Gnomad2 now requires that you have the libnjb RPM installed too. If you want to compile from sources: You may as well build the libid3tag from source, but nice RPMs exist at livna and freshrpms. See the Fedora FAQ (http://www.fedorafaq.org/) 5. Gnomad2 can optionally use libmtp to access MTP devices, too! This is a work in progress: http://libmtp.sourceforge.net/ 6. Gnomad2 can optionally use taglib:s C interface to read/write Ogg and FLAC tags. http://developer.kde.org/~wheeler/taglib.html This will only be needed if you have an MTP device that can play these files I suppose. 7. Gnomad2 will optionally use D-Bus and GUDEV to autodetect attached and removed devices. You'll need development files for the D-Bus glib bindings and libgudev1 if you want this stuff to work. 8. Install gnomad using this sequence: tar xvfz gnomad2-2.X.X.tar.gz cd gnomad2-2.X.X ./configure make make install (make may be named gmake on some systems) FAQ: 1. Q: Hey, it starts, but it doesn't connect to the jukebox! A: First, do you have USB support in your kernel, with the usbfs filesystem activated? /proc/bus/usb/ is a virtual file system implemented (usbfs) in the 2.4.x versions of the Linux kernel that represents the USB port. So this info is worthless for BSD users. In the Linux kernel USB is used in user mode by accessing this virtual file system. Devices that have kernel drivers appear here, and devices that haven't atleast appear in /proc/usb/001/... etc. And this is how libusb access your USB port. * Distributions with hotplugging: (Eg: RedHat 7.2 / 7.3 / 8.0 / 9, Fedora Core, Debian) This is info for distributions with hotplugging enabled for USB / PCI devices. This typically means you have something i /etc/hotplug and that hotplugging is started when you boot your machine in a script named /etc/init.d/hotplug or similar. See the README file of libnjb for instructions on how this works. Compiling libnjb from source will nowadays add hotplugging for you by default. The RPM for Gnomad2 will also try to add hotplugging using a script. * Other distributions: This is if you don't have hotplugging enabled and do not want to set it up on your machine either. You want to mount the usbfs manually. According to Tim Pepper, this should work in your /etc/fstab: none /proc/bus/usb usbdevfs noauto,devmode=0666 0 0 You can find the Linux hotplug project at: http://linux-hotplug.sourceforge.net/ A: Check out the libusb homepage for more information on USB problems that might be caused by USB stuff, and check out: http://www.linux-usb.org/FAQ.html 2: Q: My kernel does not find a driver for the jukebox! A: So I guess you're using Linux. libnjb doesn't use a kernel driver for the jukebox anyway. It uses the USB from userland, accessing the device through /proc/bus/usb. The important thing for you is to see that if you write cat /prob/bus/usb/devices you find your jukebox among the listed devices (the Vendor/Product ID combo can be found in the "nomad.usermap" file that comes with Gnomad2. If you have (very unlikely but some manage to anyway) actually compiled and modprobed a kernel driver for the jukebox, then REMOVE IT for gods sake, that old driver isn't used by anyone. OK this is quite technical but you asked for it. 3. Q: How do I use Gnomad2? A: Plug in your jukebox, start the program. Gnomad2 will locate and scan your jukebox for files. (If it fails you may use the "rescan contents" option in the Jukebox menu, or the popups in the jukebox file lists.) 4. Q: How do I select multiple files? A: Click first file, then hold down CTRL and click additional files. To select a large region of files, click top file, hold down SHIFT and click bottom file. Easy, see? (You really ought to know this behaviour from other applications.) 5. Q: How do I add some tracks in the jukebox library to a playlist? A: OK this might be not-so-logical: you add the files in the music transfer frame, by selecting the files you want in the jukebox view, right clicking your mouse and selectiong "Add selected to playlist" on the popup menu. 6. Q: How does Gnomad2 determine metadata for a file? A: Gnomad2 will try to retrieve metadata from files in the left view of the music transfer view using several heuristic methods. For MP3 files, concerning the "Remove ID3 tag" option: What is shown on the screen is not primarily related to ID3 as a matter of fact. The "Remove ID3" option just removes the ID3-tag block from the file when transferring it, it does not avoid reading in the information from the file in the first place. Gnomad will always try everything it can to retrieve the metadata: * first it reads the ID3 info (on MP3 files) or WMA ASF metadata (on WMA files) * next it looks at the filename path to determine probable metadata * if this fails it will use the string Don't use WMA. Mail Creative and tell them to include support for Ogg Vorbis instead. When transferring files from harddisk to jukebox, the info on the left is always added to the files in the view on the right. If some part of it is missing after a rescan, that's a bug. 7. Q: If I set Gnomad2 to open a 2900 song music dir, it takes 12 minutes to open. If I open it up in another directory, it starts in seconds. If I then change to my 2900 songs, I have to wait 12 minutes again. Is this normal? A: Sadly yes. This is because the MP3 and the associated ID3 tag format gives no good way of [quickly] determining the length of the songs, so this info has to be retrieved from the file anew on every scan. I have evangelized the use of ID3v2:s "TLEN" tag, which makes it possible to tag a file with its playlength, so that gnomad and others don't need to go to such extreme measures to find out how long (in time) they are. Look into the file "mp3file.c" for details. I have added a "progress" dialog and cancel function though, so one know what is happening... If you need a program to add TLEN tags to your songs then look into EasyTAG (http://easytag.sourceforge.net/). When songs are transfered from your jukebox device back to the host, these TLEN tags are happily added. 8. Q: But how do I... A: Hey! did you try selecting something and clicking the right mousebutton? Different popups may appear depending on what is selected. Notably in the playlist. 9. Q: Sometimes the graphics freeze for example when I delete some files on the jukebox. A: OK so Gnomad2 is not 100% multi-threaded. Might fix it someday when everything that is more important has been fixed. Sit back and enjoy the show. 10.Q: Gnomad2 seqfaulted/crashed on me! A: OK so neither Gnomad2 nor the libnjb, libmtp, libusb or id3lib are entirely stable. Please start up you GDB and help us find the error and submit patches to respective maintainer, thats how it works. The problem can be in several different places: * Gnomad2 * libnjb * libmtp * libusb * Your operating system The first task is to find out where the problem is. Some things are obviously in gnomad2, while others, especially relating to the NJB USB communications, are more elusive. To intercept the libnjb USB traffic, invoke gnomad2 with "gnomad2 -D7". If you think the problem is in libnjb join the libnjb mailing list and discuss the problem there. Error messages that explicitly say that they are USB errors (and this happens from time to time) may be either in libnjb (unlikely), libmto, libusb (more likely) or the kernel of your operating system (also very likely). gnomad2-2.9.6/doc/0000775000076400007640000000000011602630307010635 500000000000000gnomad2-2.9.6/doc/Makefile.in0000664000076400007640000002267111602630254012633 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Makefile for pilotpdb documentation. VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GN_CFLAGS = @GN_CFLAGS@ GN_LIBS = @GN_LIBS@ GREP = @GREP@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ MTP_CFLAGS = @MTP_CFLAGS@ MTP_LIBS = @MTP_LIBS@ OBJEXT = @OBJEXT@ OSFLAGS = @OSFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ TAG_CFLAGS = @TAG_CFLAGS@ TAG_LIBS = @TAG_LIBS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ all: all-am .SUFFIXES: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am # EXTRA_DIST = foo.txt # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gnomad2-2.9.6/doc/Makefile.am0000664000076400007640000000007711512614631012617 00000000000000# Makefile for pilotpdb documentation. # EXTRA_DIST = foo.txt gnomad2-2.9.6/po/0000775000076400007640000000000011602630307010506 500000000000000gnomad2-2.9.6/po/cs_CZ.po0000664000076400007640000004563311512614631012004 00000000000000# Czech translation for gnomad2 # This file is distributed under the same license as the gnomad2 package. # FIRST AUTHOR , 2008. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gnomad2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-01-06 10:39+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Translator: Petr Kletečka \n" #: ../gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Program pro přehrávače Creative Nomad/Zen a Dell DJs" #: ../gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: ../gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Nomad/Zen Jukebox/Dell DJ Client" #: ../src/gnomad2.c:66 msgid "Cannot quit! Jukebox is busy!" msgstr "Ukončení nemožné! Zařízení pracuje!" #: ../src/gnomad2.c:138 ../src/gnomad2.c:164 msgid "Select jukebox" msgstr "Vyberte zařízení" #: ../src/gnomad2.c:143 ../src/gnomad2.c:183 msgid "Select jukebox to operate:" msgstr "Vyberte zařízení:" #: ../src/gnomad2.c:235 msgid "" "A program to communicate with\n" "Creative Jukeboxes\n" "and MTP devices" msgstr "" "Program komunikující\n" "s přehravači od Creative\n" "a MTP přehravači" #: ../src/gnomad2.c:236 msgid "translator_credits" msgstr "Petr Kletečka " #: ../src/gnomad2.c:285 ../src/data.c:42 ../src/data.c:114 ../src/xfer.c:55 #: ../src/xfer.c:152 ../src/xfer.c:468 ../src/playlists.c:228 #: ../src/playlists.c:245 ../src/playlists.c:453 ../src/playlists.c:573 #: ../src/playlists.c:594 ../src/playlists.c:611 ../src/playlists.c:831 msgid "Jukebox busy" msgstr "Zařízení pracuje" #: ../src/gnomad2.c:296 ../src/gnomad2.c:314 msgid "Scanning jukebox library" msgstr "Načítám přehrávač" #: ../src/gnomad2.c:297 msgid "Retrieving metadata from jukebox" msgstr "Přenáším popisky z přehravače" #: ../src/gnomad2.c:313 msgid "Retrieveing metadata from jukebox" msgstr "Přenáším popisky z přehravače" #: ../src/gnomad2.c:346 ../src/gnomad2.c:393 msgid "Jukebox busy - change discarded" msgstr "Zařízení pracuje - změna zrušena" #: ../src/gnomad2.c:376 ../src/gnomad2.c:408 ../src/gnomad2.c:631 msgid "Set owner string" msgstr "Nastavit jméno vlastníka" #: ../src/gnomad2.c:379 ../src/gnomad2.c:421 msgid "Edit the owner of this jukebox:" msgstr "Upravit vlastníka tohoto přehravače:" #: ../src/gnomad2.c:440 msgid "Cannot view information! Jukebox is busy!" msgstr "Není možné zobrazit informace! Zařízení pracuje!" #: ../src/gnomad2.c:448 msgid "Cannot retrieve jukebox information!" msgstr "Nelze načíst informace z přehravače!" #. Shall not be shown! #: ../src/gnomad2.c:554 msgid "Quit" msgstr "Konec" #: ../src/gnomad2.c:563 msgid "File" msgstr "Soubor" #: ../src/gnomad2.c:589 msgid "Music transfer" msgstr "Přenos hudby" #: ../src/gnomad2.c:602 msgid "Playlists" msgstr "Seznamy skladeb" #: ../src/gnomad2.c:610 msgid "Data transfer" msgstr "Přenos dat" #: ../src/gnomad2.c:615 msgid "Preferences" msgstr "Nastavení" #: ../src/gnomad2.c:622 ../src/data.c:616 msgid "Rescan contents" msgstr "Připojit" #: ../src/gnomad2.c:638 ../src/jukebox.c:432 ../src/jukebox.c:434 #: ../src/jukebox.c:449 msgid "Jukebox information" msgstr "Informace o přehravači" #: ../src/gnomad2.c:647 msgid "Jukebox library" msgstr "Přehravač" #. Shall not be shown! #: ../src/gnomad2.c:653 msgid "About" msgstr "O programu" #: ../src/gnomad2.c:660 msgid "Help" msgstr "Nápověda" #: ../src/data.c:51 ../src/data.c:59 msgid "Transferring files from jukebox file storage" msgstr "Přenos souborů z přehravače do počítače" #: ../src/data.c:77 msgid "Retrieving data files from Jukebox..." msgstr "Načítám informace o souborech v přehravači..." #: ../src/data.c:122 ../src/data.c:130 msgid "Transferring files to jukebox file storage" msgstr "Přenos souborů do paměti přehravače" #: ../src/data.c:149 msgid "Storing files in Jukebox file storage..." msgstr "Ukládání souborů v paměti přehravače" #: ../src/data.c:220 ../src/data.c:421 msgid "Really delete selected files?" msgstr "Smazat soubory?" #: ../src/data.c:357 ../src/data.c:370 msgid "Create a new folder" msgstr "Nový adresář" #: ../src/data.c:393 msgid "Choose a name for the new folder:" msgstr "Jméno nového adresáře:" #: ../src/data.c:517 ../src/xfer.c:716 msgid "Filename" msgstr "Soubor" #: ../src/data.c:533 ../src/xfer.c:672 msgid "Size (bytes)" msgstr "Velikost (v bajtech)" #: ../src/data.c:545 ../src/xfer.c:730 msgid "ID" msgstr "ID" #: ../src/data.c:588 msgid "Rescan jukebox" msgstr "Obnovit přehravač" #: ../src/data.c:596 ../src/data.c:632 ../src/xfer.c:781 ../src/xfer.c:825 msgid "Transfer selected" msgstr "Přenést do přehravače" #: ../src/data.c:604 ../src/data.c:640 ../src/xfer.c:797 ../src/xfer.c:857 msgid "Delete selected" msgstr "Smazat" #: ../src/data.c:624 msgid "Create folder" msgstr "Nový adresář" #: ../src/data.c:757 msgid "Jukebox data file window" msgstr "Sobory v přehravači" #: ../src/xfer.c:64 ../src/xfer.c:72 msgid "Transferring tracks from jukebox library" msgstr "Přenos skladeb z přehravače" #: ../src/xfer.c:91 msgid "Retrieving tracks from Jukebox..." msgstr "Přenáším skladby z přehravače..." #: ../src/xfer.c:163 ../src/xfer.c:171 ../src/xfer.c:188 msgid "Transferring tracks to jukebox library" msgstr "Přenos skladeb do přehravače" #: ../src/xfer.c:190 msgid "Storing tracks in Jukebox library..." msgstr "Ukládám skladby do přehravače..." #: ../src/xfer.c:279 msgid "Really delete selected files/folders?" msgstr "Smazat vybrané soubory/adresáře?" #: ../src/xfer.c:305 ../src/xfer.c:309 msgid "Could not create folder" msgstr "Nemohu vytvořit adresář" #. Here we use libgnomeui instead. #: ../src/xfer.c:327 ../src/xfer.c:340 msgid "New folder" msgstr "Nový adresář" #: ../src/xfer.c:365 msgid "Enter a name for the folder:" msgstr "Jméno adresáře:" #: ../src/xfer.c:480 ../src/playlists.c:615 msgid "Really delete selected tracks?" msgstr "Smazat vybrané skladby?" #: ../src/xfer.c:600 ../src/playlists.c:900 msgid "Artist" msgstr "Umělec" #: ../src/xfer.c:616 ../src/playlists.c:912 msgid "Title" msgstr "Skladba" #: ../src/xfer.c:628 msgid "Album" msgstr "Deska" #: ../src/xfer.c:639 msgid "Year" msgstr "Rok" #: ../src/xfer.c:650 msgid "Genre" msgstr "Styl" #: ../src/xfer.c:661 ../src/playlists.c:924 msgid "Length" msgstr "Délka" #: ../src/xfer.c:683 msgid "Codec" msgstr "Kodek" #: ../src/xfer.c:694 msgid "Track#" msgstr "Číslo skladby" #: ../src/xfer.c:705 ../src/editmeta.c:586 msgid "Protected" msgstr "Chráněné" #: ../src/xfer.c:773 msgid "Rescan directory metadata" msgstr "Obnovit popisky v adresáři" #: ../src/xfer.c:789 ../src/xfer.c:849 msgid "Edit selected" msgstr "Upravit" #: ../src/xfer.c:805 msgid "New folder..." msgstr "Nový adresář" #: ../src/xfer.c:817 msgid "Rescan jukebox contents" msgstr "Obnovit" #: ../src/xfer.c:833 msgid "Add selected to playlist" msgstr "Přidat do seznamu skladeb" #: ../src/xfer.c:841 msgid "Play selected" msgstr "Přehrát" #: ../src/xfer.c:974 msgid "Jukebox library window" msgstr "Skladby v přehravači" #: ../src/editmeta.c:105 ../src/editmeta.c:591 msgid "YES" msgstr "ANO" #: ../src/editmeta.c:105 msgid "NO" msgstr "NE" #: ../src/editmeta.c:132 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Zařízení pracuje.\n" "Popisky nelze nyní měnit." #. First is artist, second is title #: ../src/editmeta.c:228 #, c-format msgid "Updating metadata on %s - %s" msgstr "Aktualizuji popisky v %s - %s" #: ../src/editmeta.c:340 ../src/editmeta.c:360 msgid "Edit jukebox file metadata" msgstr "Upravit popisky souboru v přehravači" #: ../src/editmeta.c:345 ../src/editmeta.c:363 msgid "Edit track metadata (ID3v2)" msgstr "Upravit popisky skladby(ID3v2)" #: ../src/editmeta.c:379 msgid "Artist:" msgstr "Umělec:" #: ../src/editmeta.c:403 msgid "Title:" msgstr "Skladba:" #: ../src/editmeta.c:424 msgid "Album:" msgstr "Album:" #: ../src/editmeta.c:446 msgid "Year:" msgstr "Rok:" #: ../src/editmeta.c:469 msgid "Genre:" msgstr "Styl:" #: ../src/editmeta.c:493 msgid "Length:" msgstr "Délka:" #: ../src/editmeta.c:518 msgid "Track number:" msgstr "Číslo skladby:" #: ../src/editmeta.c:541 msgid "Original filename:" msgstr "Původní jméno souboru:" #: ../src/editmeta.c:564 msgid "Folder:" msgstr "Adresář:" #: ../src/editmeta.c:605 msgid "Codec:" msgstr "Kodek:" #: ../src/editmeta.c:620 msgid "File size:" msgstr "Velikost souboru:" #: ../src/editmeta.c:636 msgid "File ID:" msgstr "ID souboru:" #: ../src/editmeta.c:638 msgid "Path:" msgstr "Cesta:" #: ../src/filesystem.c:609 msgid "Getting file list from filesystem" msgstr "Načítám seznam souborů" #: ../src/filesystem.c:638 msgid "Adding metadata to view" msgstr "Přidávám popisky do zobrazení" #: ../src/filesystem.c:696 ../src/filesystem.c:697 ../src/filesystem.c:720 #: ../src/filesystem.c:731 msgid "Getting file metadata" msgstr "Načítám popisky souboru" #: ../src/filesystem.c:696 ../src/filesystem.c:697 ../src/filesystem.c:720 #: ../src/filesystem.c:731 msgid "Getting track metadata" msgstr "Načítám popisky skladby" #: ../src/filesystem.c:890 msgid "Could not write preference file" msgstr "Nemohu zapsat nastavení" #: ../src/filesystem.c:1093 msgid "Could not write exported playlist" msgstr "Nemohu zapsat exportovaný seznam skladeb" #: ../src/jukebox.c:206 msgid "Could not open the device on the USB bus" msgstr "Nemohu otevřít zařízení na USB" #: ../src/jukebox.c:210 msgid "(unknown cause)" msgstr "(neznámy důvod)" #: ../src/jukebox.c:458 msgid "Unique device ID:" msgstr "Jedinečné ID zařízení:" #: ../src/jukebox.c:469 msgid "Firmware revision:" msgstr "Werze firmware:" #: ../src/jukebox.c:481 msgid "Hardware revision:" msgstr "Verze hardware:" #: ../src/jukebox.c:493 msgid "Product name:" msgstr "Jméno výrobku:" #: ../src/jukebox.c:504 msgid "Auxilary power (AC or USB) connected:" msgstr "Napájecí zdroj (AC nebo USB) připojen:" #: ../src/jukebox.c:508 ../src/jukebox.c:519 msgid "Yes" msgstr "Ano" #: ../src/jukebox.c:508 ../src/jukebox.c:519 msgid "No" msgstr "Ne" #: ../src/jukebox.c:515 msgid "Battery is charging:" msgstr "Baterie se nabíjí:" #: ../src/jukebox.c:529 msgid "Battery level:" msgstr "Stav baterie:" #: ../src/jukebox.c:542 msgid "Jukebox owner:" msgstr "Vlastník přehravače:" #: ../src/jukebox.c:554 msgid "Time on jukebox:" msgstr "Čas v přehravači:" #: ../src/jukebox.c:567 msgid "Total bytes on disk:" msgstr "Celková velikost:" #: ../src/jukebox.c:580 msgid "Total free bytes available:" msgstr "Volné místo:" #: ../src/jukebox.c:593 msgid "Total bytes used:" msgstr "Obsazené místo:" #: ../src/jukebox.c:606 msgid "Number of songs:" msgstr "Počet skladeb:" #: ../src/jukebox.c:618 msgid "Number of playlists:" msgstr "Počet seznamů skladeb:" #: ../src/jukebox.c:630 msgid "Number of datafiles:" msgstr "Počet datových souborů:" #: ../src/jukebox.c:758 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Nenašel jsem přehravač\n" "Problém USB?" #: ../src/jukebox.c:773 msgid "No jukeboxes found on USB bus" msgstr "Přehravač nebyl nalezen na USB" #: ../src/jukebox.c:819 msgid "Could not open jukebox:\n" msgstr "Nemohu otevřít přehravač:\n" #: ../src/jukebox.c:834 msgid "Could not capture jukebox:\n" msgstr "Nemohu ovládat přehravač:\n" #: ../src/jukebox.c:1384 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Načítání skladeb:\n" "Zvolili jste rozšířené načítání,\n" " které bude velmi pomalé." #: ../src/jukebox.c:1386 msgid "Scanning songs..." msgstr "Načítám skladby skladby..." #: ../src/jukebox.c:1447 ../src/jukebox.c:1604 msgid "%" msgstr "%" #: ../src/jukebox.c:1570 msgid "Scanning datafiles..." msgstr "Načítám soubory..." #: ../src/jukebox.c:1668 msgid "Scanning playlists..." msgstr "Načítam seznamy skladeb..." #: ../src/jukebox.c:2457 msgid "Track ID was zero! Illegal value!" msgstr "ID skladby bylo 0! Neplatná hodnota!" #: ../src/jukebox.c:2461 msgid "Song length must be greater than zero!" msgstr "Délka skladby musí být větší než 0!" #: ../src/jukebox.c:2588 ../src/jukebox.c:2606 msgid "Could not create playlist" msgstr "Nemohu vytvořit seznam skladeb" #: ../src/jukebox.c:2626 ../src/jukebox.c:2631 msgid "Could not delete playlist" msgstr "Nemohu smazat seznam skladeb" #: ../src/jukebox.c:2654 ../src/jukebox.c:2679 msgid "Could not rename playlist" msgstr "Nemohu přejmenovat seznam skladeb" #: ../src/jukebox.c:2686 msgid "Could not locate playlist to rename!" msgstr "Nemohu najít seznam skladeb k přejmenování!" #: ../src/jukebox.c:2774 msgid "Could not find playlist" msgstr "Nemohu najít seznam skladeb" #: ../src/jukebox.c:2978 msgid "Could not find the track in the playlist" msgstr "Nemohu nají skladbu v seznamu" #: ../src/jukebox.c:3002 msgid "Could not set owner string on the device" msgstr "Nemohu otevřít zařízení na USB" #: ../src/jukebox.c:3456 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Adresář nelze vytvořit.\n" "Pravděpodobně používáte přehravač Nomad Jukebox 1\n" "který nepodporuje vytváření adresářů." #: ../src/player.c:446 msgid "Playback is not supported on MTP devices" msgstr "Přehrávání skladby není podporováno na MTP zařízeních" #: ../src/player.c:451 msgid "Playing tracks on the jukebox" msgstr "Přehrávám skladby v přehravači" #: ../src/player.c:456 msgid "Playing:" msgstr "Hraje:" #: ../src/player.c:482 msgid "STOP" msgstr "STOP" #: ../src/player.c:516 msgid "PREV" msgstr "PŘEDCHOZÍ" #: ../src/player.c:535 msgid "NEXT" msgstr "DALŠÍ" #: ../src/playlists.c:168 ../src/playlists.c:181 msgid "Create a new playlist" msgstr "Vytvořit nový seznam skladeb" #: ../src/playlists.c:206 msgid "Choose a name for the new playlist:" msgstr "Jméno nového seznamu skladeb:" #: ../src/playlists.c:265 ../src/playlists.c:278 ../src/playlists.c:1016 msgid "Edit playlist" msgstr "Upravit" #: ../src/playlists.c:301 msgid "Edit the name for this playlist:" msgstr "Jméno seznamu skladeb:" #: ../src/playlists.c:465 ../src/playlists.c:479 ../src/playlists.c:1024 msgid "Export playlist" msgstr "Exportovat" #: ../src/playlists.c:502 msgid "Export playlist to this file:" msgstr "Exportovat seznam skladeb do soboru:" #: ../src/playlists.c:515 msgid "Unnamed playlist.txt" msgstr "Nepojmenovaný seznam skladeb.txt" #: ../src/playlists.c:520 msgid "Format the playlist according to this string:" msgstr "Uspořádat seznam skladeb podle tohoto vzoru::" #: ../src/playlists.c:532 ../src/prefs.c:490 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Umělec, %t = Skladba, %b = Album, %g = Styl, %n = Číslo skladby, %y = " "Rok" #: ../src/playlists.c:536 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Vytvořit seznam skladeb M3U (předpokládá správně nastavená jména souborů)" #: ../src/playlists.c:546 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Vytvořit seznam skladeb PLS (předpokládá správně nastavená jména souborů)" #: ../src/playlists.c:578 msgid "Really delete selected playlist?" msgstr "Smazat vybrané seznamy skladeb?" #: ../src/playlists.c:717 msgid "and" msgstr "a" #: ../src/playlists.c:863 msgid "Transfer to jukebox library" msgstr "Přenos do přehravače" #: ../src/playlists.c:864 ../src/playlists.c:871 msgid "Add tracks to playlist(s):" msgstr "Přidat skladbu do seznamu:" #: ../src/playlists.c:870 msgid "Add to playlist" msgstr "Přidat do seznamu skladeb" #: ../src/playlists.c:887 msgid "Playlist" msgstr "Sezam skladeb" #: ../src/playlists.c:982 ../src/playlists.c:992 ../src/playlists.c:1042 msgid "New playlist" msgstr "Nový seznam skladeb" #: ../src/playlists.c:1000 msgid "Shuffle playlist" msgstr "Zamíchat" #: ../src/playlists.c:1008 msgid "Play playlist" msgstr "Přehrát" #: ../src/playlists.c:1032 msgid "Delete playlist" msgstr "Smazat" #: ../src/playlists.c:1050 msgid "Delete track from playlist" msgstr "Smazat skladbu ze seznamu" #: ../src/prefs.c:459 msgid "Filenaming" msgstr "Pojmenování souborů" #: ../src/prefs.c:463 msgid "Use original filename if present in metadata for the track" msgstr "Použít původní jména souborů pokud jsou dostupná v popiscích souborů." #: ../src/prefs.c:472 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Vzor pojmenování souborů při kopírování souborů z přehravačena pevný disk." #: ../src/prefs.c:479 msgid "Formatting string:" msgstr "Formátovací řetězec:" #: ../src/prefs.c:499 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Popisky z přehravače přepíší aktuální ID3 popisky v přenášených souborech" #: ../src/prefs.c:502 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Smazat popisky ID3 ze souborů nahrávaných do přehravače" #: ../src/prefs.c:505 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Zapsat ID3v1/v2 popisky do souborů přenášených na pevný disk" #: ../src/prefs.c:508 msgid "Force use of Unicode charset for ID3 tags" msgstr "Vynutit použití Unicode v ID3 popiscích" #: ../src/prefs.c:510 msgid "Display hidden (.foo) directories in filesystem" msgstr "Zobrazovat skryté sobuory (.foo)" #: ../src/prefs.c:513 msgid "Ask to add files to a playlist" msgstr "Potvrdit přidání souborů na seznam skladeb" #: ../src/prefs.c:515 msgid "Recurse into any selected directories when transferring" msgstr "Přenášet adresáře rekurzivně" #: ../src/prefs.c:518 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Vynutit znakovou sadu ISO-8859-1 pro lokální systém souborů" #: ../src/prefs.c:521 msgid "Try to extract sound file metadata from path and filename" msgstr "Zkusit uhodnout popisky ze jména souboru a adresáře" #: ../src/prefs.c:523 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Načítat rozšířené údaje z přehravače (např.: původní jméno souborumůže být\n" "pomalé na novějších přehravačích)" #: ../src/prefs.c:530 msgid "Automatically read in jukebox contents on startup" msgstr "Načítat obsah přehravače při startu" #: ../src/prefs.c:532 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "Nastavovat čas v přehravači při spuštění" #: ../src/prefs.c:534 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "Při spuštění přepnout do posledně zobrazeného adresáře" #: ../src/prefs.c:536 msgid "Enable turbo mode - uncheck this if you have problems" msgstr "Povolit turbo režim - zrušte při nestabilitě programu" gnomad2-2.9.6/po/sco.po0000664000076400007640000004217311512614631011563 00000000000000# Scots translation for gnomad2 # Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006 # This file is distributed under the same license as the gnomad2 package. # FIRST AUTHOR , 2006. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gnomad2\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-05-04 23:11+0000\n" "Last-Translator: Alan Rae \n" "Language-Team: Scots \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "A tuil for managin Creative Nomad/Zen Jukeboxes an Dell DJs" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Nomad/Zen Jukebox/Dell DJ Client" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Canna quit! Jukebox is busy!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Chuise jukebox" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Chuise Jukebox tae wirk:" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "A programme tae communicate wi↵\n" "Creative Jukeboxes" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "Alan Rae" #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Jukebox busy" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Scannin jukebox leebrary" #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Gittin metadata frae jukebox" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox busy - cheenge discairdit" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Set ainer string" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Cheenge the ainer o this jukebox:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Canna vizzie information! Jukebox is busy!" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Canna git jukebox information!" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Canna allacate blue colour!↵\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Quit" #: src/gnomad2.c:557 msgid "File" msgstr "File" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Music transfer" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Playlists" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Data transfer" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Preferences" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Rescan contents" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Jukebox information" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukebox leebrary" #: src/gnomad2.c:647 msgid "About" msgstr "Aboot" #: src/gnomad2.c:654 msgid "Help" msgstr "Help" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Transferrin files frae jukebox file storage" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Gittin data files frae Jukebox..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Transferrin files tae jukebox file storage" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Storin files in Jukebox file storage..." #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "Sure ye want tae delete the selectit files?" #: src/data.c:300 msgid "Create a new folder" msgstr "Shape a new directory" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Chuise a name for the new directory:" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Filename" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Size (bytes)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Rescan Jukebox" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transfer chuist" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Delete chuist" #: src/data.c:533 msgid "Create folder" msgstr "Shape directory" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Jukebox data file windae" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Transferrin sangs frae jukebox leebrary" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Gittin sangs frae Jukebox..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Transferrin sangs tae jukebox leebrary" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Storin sangs in Jukebox leebrary..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "Sure ye want tae delete the selectit sangs?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Airtist" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Teetle" #: src/xfer.c:484 msgid "Album" msgstr "Album" #: src/xfer.c:495 msgid "Year" msgstr "Year" #: src/xfer.c:506 msgid "Genre" msgstr "Genre" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Lenth" #: src/xfer.c:539 msgid "Codec" msgstr "Codec" #: src/xfer.c:550 msgid "Track#" msgstr "Track#" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Protectit" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Rescan directory metadata" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Cheenge selectit" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Rescan jukebox contents" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Add selectit tae playlist" #: src/xfer.c:692 msgid "Play selected" msgstr "Play selectit" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Jukebox leebrary windae" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "AYE" #: src/editmeta.c:97 msgid "NO" msgstr "NA" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Jukebox is busy.↵\n" "Canna cheenge metadata the nou" #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Updatin metadata on %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Cheenge jukebox file metadata" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Cheenge track metadata (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Airtist:" #: src/editmeta.c:368 msgid "Title:" msgstr "Teetle:" #: src/editmeta.c:389 msgid "Album:" msgstr "Album:" #: src/editmeta.c:411 msgid "Year:" msgstr "Year:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Genre:" #: src/editmeta.c:458 msgid "Length:" msgstr "Lenth:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Track nummer:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Oreeginal filename:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Directory:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Codec:" #: src/editmeta.c:585 msgid "File size:" msgstr "File size:" #: src/editmeta.c:601 msgid "File ID:" msgstr "File ID:" #: src/editmeta.c:603 msgid "Path:" msgstr "Peth:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Gettin file list frae fileseestem" #: src/filesystem.c:421 msgid "Adding metadata to view" msgstr "Addin metadata tae view" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Gettin file metadata" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Gettin track metadata" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "Coudna screive preference file" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "Coudna screive exportit playlist" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "Coudna open the device on the USB bus" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(unkent cause)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "Unique device ID:" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Firmware reveesion:" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Hardware reveesion" #: src/jukebox.c:321 msgid "Product name:" msgstr "Product name:" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Auxiliary pouer (AC or USB) connectit:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Aye" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "Na" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "Battery is chairgin:" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Battery level:" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Jukebox ainer:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Time on jukebox:" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Hail bytes on disk:" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Hail free bytes available:" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Hail bytes uised" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Nummer o sangs:" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Nummer o playlists:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Nummer o datafiles:" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Coudna try tae fund jukeboxes↵\n" "USB mistak?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "Nae jukeboxes fund on USB bus" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Unkent kynd o jukebox" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "Coudna open jukebox:↵\n" #: src/jukebox.c:676 msgid "Could not capture jukebox:\n" msgstr "Coudna captur jukebox:↵\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "Coudna fund playlist" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Scannin Sangs..." #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Scannin sangs:↵\n" "Ye hae chuisen extendit metadata scan,↵\n" "sae scannin will be gey slaw." #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Scannin playlists..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Scannin datafiles..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u sangs scannit" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u data files scannit" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "Track ID wis zero! Illegal value!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "Sang lenth maun be mair than nocht!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "Coudna shape playlist" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "Coudna delete playlist" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "Coudna rename playlist" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "Coudna fund playlist tae rename" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "Coudna fund the sang in the playlist" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "The directory coudna be shapit.↵\n" "The maist likely reason is that yer uisin a Nomad Jukebox 1↵\n" "whilk is ower auld tae support directories." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Playin sangs on the jukebox" #: src/player.c:448 msgid "Playing:" msgstr "Playin:" #: src/player.c:474 msgid "STOP" msgstr "STAP" #: src/player.c:508 msgid "PREV" msgstr "FORE" #: src/player.c:527 msgid "NEXT" msgstr "NEIST" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Shape a new playlist" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Chuise a name for the new playlist:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Cheenge playlist" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Cheenge the name for this playlist:" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Export playlist" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Export playlist tae this file:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Unnamed playlist.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Format the playlist accordin tae this string:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Airtist, %t = Teetle, %b = Album, %g = Genre, %n = Track nummer, %y = " "Year" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Shape an M3U playlist (assumin the format filter sets the richt filenames)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Create a PLS playlist (assumin the format filter sets the richt filenames)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "Sure ye want tae delete the selectit playlist?" #: src/playlists.c:628 msgid "and" msgstr "an" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transfer tae jukebox leebrary" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Add sangs tae playlist(s):" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Add tae playlist" #: src/playlists.c:778 msgid "Playlist" msgstr "Playlists" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "New playlist" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Shuffle playlist" #: src/playlists.c:899 msgid "Play playlist" msgstr "Play playlist" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Delete playlist" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Delete sang frae playlist" #: src/prefs.c:431 msgid "Filenaming" msgstr "Filenamin" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "Uiss oreeginal filename if praisent in metadata for the sang" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "This string is uist whan namin files copied frae the jukebox leebrary tae " "the seestem." #: src/prefs.c:451 msgid "Formatting string:" msgstr "Formattin string:" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metadata frae the jukebox overrides praisent ID3 tags on transferrit files" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Remove aw ID3 tages frae files transferrit tae jukebox" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Screive ID3v1/v2 tag tae files transferrit tae haurd disc" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Force uiss o Unicode charset for ID3 tags" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Shaw hidden (.foo) directories in fileseestem" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Speir tae add files tae a playlist" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "Recurse intil ony selectit directories whan transferrin" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Force local fileseestem tae ISO-8859-1 charset" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "Try tae extract soond file metadata frae peth an filename" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Read extendit metadata frae jukebox (e.g. oreeginal filename - slaw on newer " "devices)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Automatically read in jukebox contents on stairtup" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Automatically set the time on the Jukebox tae that o yer computer on startup" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" "On stairtup, return tae the place in the fileseestem whaur ye war last time"gnomad2-2.9.6/po/es.po0000664000076400007640000004624311512614631011410 00000000000000# Spanish messages for Gnomad 2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To:\n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-03-19 01:32+0000\n" "Last-Translator: Felipe Ureta \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "" "Una herramienta para manejar los reproductores Creative Nomad/Zen Jukebox y " "Dell DJs" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Cliente Nomad/Zen Jukebox/Dell DJ" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "¡No se puede salir! ¡El reproductor está ocupado!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Seleccione el reproductor" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Seleccione el reproductor con el cual trabajar:" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Un programa para comunicarse con\n" "los reproductores Creative Jukebox" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "" "Traducción al español corregida y actualizada por Leandro Lucarella. " "Traducción original por Pedro Ayala." #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Reproductor ocupado" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Obteniendo contenido del reproductor" #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Obteniendo información del reproductor" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Reproductor ocupado - cambios descartados" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Cambiar el propietario" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Ingrese el nombre del propietario de este reproductor:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "¡No se puede ver la información! ¡Reproductor ocupado!" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Infomación del reproductor" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "¡No se puede poner el color azul!\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Salir" #: src/gnomad2.c:557 msgid "File" msgstr "Archivo" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Música" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Listas" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Datos" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Preferencias" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Actualizar contenidos" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Infomación del reproductor" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Reproductor" #: src/gnomad2.c:647 msgid "About" msgstr "Acerca de" #: src/gnomad2.c:654 msgid "Help" msgstr "Ayuda" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Transfiriendo archivos desde el reproductor" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Obteniendo archivos de datos del reproductor..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Transfiriendo archivos al reproductor" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Almacenando archivos en el reproductor..." #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "¿Está seguro que quiere borrar los archivos seleccionados?" #: src/data.c:300 msgid "Create a new folder" msgstr "Crear una nueva carpeta" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Nombre de la nueva carpeta:" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Nombre del archivo" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Tamaño (bytes)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Actualizar reproductor" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transferir selección" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Borrar selección" #: src/data.c:533 msgid "Create folder" msgstr "Crear carpeta" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Datos en el Reproductor" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Transfiriendo canciones del reproductor" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Obteniendo canciones del reproductor..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Tranfiriendo canciones al reproductor" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Guardando canciones en el reproductor..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "¿Está seguro que quiere borrar las canciones seleccionadas?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Intérprete" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Título" #: src/xfer.c:484 msgid "Album" msgstr "Álbum" #: src/xfer.c:495 msgid "Year" msgstr "Año" #: src/xfer.c:506 msgid "Genre" msgstr "Género" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Duración" #: src/xfer.c:539 msgid "Codec" msgstr "Códec" #: src/xfer.c:550 msgid "Track#" msgstr "#Pista" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Protegido" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Actualizar la meta-informaciòn del directorio" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Editar seleccón" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Actualizar contenido del reproductor" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Añadir selección a una lista" #: src/xfer.c:692 msgid "Play selected" msgstr "Reproducir selección" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Música en el Reproductor" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "SÍ" #: src/editmeta.c:97 msgid "NO" msgstr "NO" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Reproductor ocupado.\n" "No se puede editar la meta-información ahora." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Actualizando meta-información en %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Editar meta-información del archivo" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Editar información de la canción (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Artista:" #: src/editmeta.c:368 msgid "Title:" msgstr "Título:" #: src/editmeta.c:389 msgid "Album:" msgstr "Álbum:" #: src/editmeta.c:411 msgid "Year:" msgstr "Año:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Género:" #: src/editmeta.c:458 msgid "Length:" msgstr "Duración:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Número de pista:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Nombre original del archivo:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Carpeta:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Códec:" #: src/editmeta.c:585 msgid "File size:" msgstr "Tamaño del archivo:" #: src/editmeta.c:601 msgid "File ID:" msgstr "ID del archivo:" #: src/editmeta.c:603 msgid "Path:" msgstr "Ruta:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Transfiriendo archivos desde el reproductor" #: src/filesystem.c:421 msgid "Adding metadata to view" msgstr "Agregando meta-información a la vista" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Obteniendo meta-información de los archivos" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Obteniendo meta-información de las canciones" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "No se pudo escribir el archivo de preferencias" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "No se pudo guardar la lista exportada" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "No se pudo abrir el dispositivo USB" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(causa desconocida)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "ID único del dispositivo:" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Revisión del Firmware" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Revisión del Hardware" #: src/jukebox.c:321 msgid "Product name:" msgstr "Nombre del producto:" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Poder auxiliar (AC o USB) conectado:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Sí" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "No" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "La batería se" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Nivel de la bateía" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Propietario del reproductor:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Hora en el reproductor:" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Bytes totales en el disco:" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Bytes libres disponibles:" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Bytes usados:" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Cantidad de canciones:" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Cantidad de listas:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Cantidad de archivos de datos:" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "No se pudo localizar un reproductor\n" "¿Error USB?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "No se encontró un reproductor en el bus USB" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Tipo de reproductor desconocido" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "No se pudo abrir el reproductor:\n" #: src/jukebox.c:676 msgid "Could not capture jukebox:\n" msgstr "No se puedo capturar el reproductor:\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "No se encontró la lista" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Buscando canciones..." #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Buscando canciones:\n" "Ha elegido buscar la meta-información,\n" "extendida, por lo tanto la búsqueda será lenta." #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Buscando listas de reproducción..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Buscando archivos de datos..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u canciones encontradas" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u archivos de datos encontrados" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "¡El ID de la canción es cero! ¡Valor ilegal!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "¡La duración de la canción debe ser mayor que cero!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "No se pudo crear la lista" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "No se pudo borrar la lista" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "No se pudo renombrar la lista" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "¡No encontró la lista a renombrar!" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "No se encontró la canción en la lista" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "La carpeta no pudo ser creada.\n" "La causa más común es el uso de un reproductor Nomad Jukebox 1\n" "que es demasiado viejo y no soporta carpetas." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Reproducciendo canciones en el reproductor" #: src/player.c:448 msgid "Playing:" msgstr "Reproducciendo:" #: src/player.c:474 msgid "STOP" msgstr "PARAR" #: src/player.c:508 msgid "PREV" msgstr "ANT" #: src/player.c:527 msgid "NEXT" msgstr "SIG" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Crear una nueva lista" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Nombre de la nueva lista:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Editar" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Nombre de la lista:" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Exportar" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Exportar lista a este archivo:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Lista nueva.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Formatear la lista usando esta cadena:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artista, %t = Título, %b = Álbum, %g = Género, %n = Número de tema, %y " "= Año" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crear lista M3U (asumiendo que el filtro de formato pone los nombres de " "archivo correctamente)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crear lista PLS (asumiendo que el filtro de formato pone los nombres de " "archivo correctamente)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "¿Está seguro que quiere borrar la lista seleccionada?" #: src/playlists.c:628 msgid "and" msgstr "y" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transferir al reproductor" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Añadir canciones a lista(s)" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Añadir a lista(s)" #: src/playlists.c:778 msgid "Playlist" msgstr "Lista de reproducción" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Nueva" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Mezclar" #: src/playlists.c:899 msgid "Play playlist" msgstr "Reproducir" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Borrar" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Borrar canción de la lista" #: src/prefs.c:431 msgid "Filenaming" msgstr "Nombre del archivo" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "" "Usar nombre de archivo original si está presente en la meta-información de " "la canción" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Esta cadena es usada cuando se renombran archivos copiados del reproductor " "al sistema:" #: src/prefs.c:451 msgid "Formatting string:" msgstr "Cadena de formato:" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Meta-información del reproductor sobreescribe las etiquetas ID3 de los " "archivos trasferidos" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "" "Borrar todas las etiquetas ID3 de los archivos trasferidos al reproductor" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Escribir etiquetas ID3v1/v2 a los archivos trasferidos al disco duro" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Forzar el uso de juego de caracteres Unicode para los tags ID3" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Mostrar directorios ocultos (.foo) en el sistema de archivos" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Preguntar si se quiere agregar archivos a una lista de reproducción" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "" "Buscar recursivamente en los directorios seleccionados cuando se transfiera" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Forzar sistema de archivos local al juego de caracteres ISO-8859-1" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "" "Intentar obtener meta-información del archivo de sonido de la ruta y nombre " "de archivo" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Leer meta-información extendida del reproductor (lento en dispositivos " "nuevos)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Leer automáticamente el contenido del reproductor al iniciar" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "Poner la fecha del reproductor igual que la fecha local al iniciar" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "Volver a la ruta que se utilizó por última vez al iniciar" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Editar el propietario de esta Jukebox" #~ msgid "Power connected:" #~ msgstr "Fuente de alimentación conectada:" #~ msgid "Unable to read EAX settings" #~ msgstr "Imposible leer la configuración EAX" #~ msgid "Volume" #~ msgstr "Volumen" #~ msgid "Equalizer" #~ msgstr "Ecualizador" #~ msgid "Equalizer active" #~ msgstr "Ecualizador activo" #~ msgid "Bass" #~ msgstr "Bajos" #~ msgid "Mid" #~ msgstr "Medios" #~ msgid "Treble" #~ msgstr "Agudos" #~ msgid "Midrange center frequency:" #~ msgstr "Rango medio de frecuencias:" #~ msgid "EAX effect:" #~ msgstr "Efecto EAX:" #~ msgid "Headphone mode:" #~ msgstr "Modo auriculares:" #~ msgid "Rear speaker mode:" #~ msgstr "Modo altavoces traseros:" #~ msgid "Jukebox muted" #~ msgstr "Jukebox silenciada" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "Escribir etiquetas ID3v2 a los archivos trasferidos al disco duro" #~ msgid "Could not ping jukebox" #~ msgstr "No se puede hacer ping a el reproductor"gnomad2-2.9.6/po/ChangeLog0000664000076400007640000000466711512614631012217 000000000000002008-01-08 Linus Walleij * cs_CZ.po: add Czech translation. 2006-08-19 Linus Walleij * Mass update from the Launchpad Rosetta project. This is where we feel power from the Ubuntu momentum... * ca.po: added Catalan translation by LordRoger. * de.po: update from Rosetta, Simon Wenner. * es.po: update from Rosetta, Felipe Ureta. * fr.po: update from Rosetta, Nicolas Velin. * pl.po: added Polish translation by Jacek Sienkiewicz. * sco.po: added Scots translation by Alan Rae. * nl.po: update from Rosetta, Dominique. 2005-11-08 Linus Walleij * sv.po: a new untranslated message. 2005-09-05 Linus Walleij * sv.po: fixed the last untranslated message. 2005-08-23 Linus Walleij * nl.po: fixed typo. 2005-08-21 Linus Walleij * it.po: updated translation from Giorgio. * nl.po: updated translation from Lieven. 2005-08-17 Linus Walleij * de.po: speling patch from upstream Debian. 2005-07-25 Linus Walleij * es.po: new Spanish translation by Leandro Lucarella. 2005-07-24 Linus Walleij * fr.po: new French translation from Steph. 2005-06-30 Linus Walleij * sv.po: last minute translations. 2005-06-28 Linus Walleij * sv.po: Updated the swedish translation. 2005-01-11 Linus Walleij Updated the Swedish translation myself... 2004-12-28 Linus Walleij Updated the Italian translation to CVS. 2004-09-02 Linus Walleij Added Italian translation by Giorgio Moscardi. 2004-05-06 Linus Walleij Added Norweigan translation by Stian Håklev 2004-04-25 Linus Walleij Updated language files with new strings. Updated Swedish translation. 2004-04-21 Linus Walleij Updated the Dutch translation from Lieven Coghe. 2004-01-25 Linus Walleij Added translation to French from FRLinux (Steph). 2004-01-20 Linus Walleij Added translation to German from Fabian Sturm. Added translation to Spanish from Pedro Ayala. Added translation to Finnish from Pietari Hyvarinen. Added translation to Dutch from Lieven Coghe. 2004-01-19 Linus Walleij Created the changelog. Only Swedish translation exist so far. People are volunteering to make translations! Cool! gnomad2-2.9.6/po/it.po0000664000076400007640000004723611512614631011420 00000000000000# translation of gnomad2-it-new.po to Italiano # translation of gnomad2-it.po to Italiano # translation of gnomad2.po to Italiano # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Giorgio Moscardi , 2004. # Giorgio Moscardi , 2004, 2005. # msgid "" msgstr "" "Project-Id-Version: gnomad2-it-new\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-05-30 09:38+0200\n" "PO-Revision-Date: 2005-08-20 15:44+0200\n" "Last-Translator: Giorgio Moscardi \n" "Language-Team: Italiano \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.10.2\n" #: ../gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Un programma per gestire i Nomad/Zen jukebox di Creative e i Dell DJ" #: ../gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: ../gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Client per Nomad/Zen jukebox e Dell DJ" #: ../src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Impossibile uscire! Il jukebox è occupato!" #: ../src/gnomad2.c:124 ../src/gnomad2.c:150 msgid "Select jukebox" msgstr "Seleziona il jukebox" #: ../src/gnomad2.c:129 ../src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Seleziona il jukebox da gestire:" #: ../src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Un programma per comunicare con\n" "i jukebox di Creative" #: ../src/gnomad2.c:218 msgid "translator_credits" msgstr "" "Giorgio Moscardi \n" "\n" "http://www.nogood.it/prog/\n" "http://www.nyft.org" #: ../src/gnomad2.c:264 ../src/data.c:42 ../src/data.c:113 ../src/xfer.c:51 #: ../src/xfer.c:150 ../src/xfer.c:366 ../src/playlists.c:226 #: ../src/playlists.c:242 ../src/playlists.c:452 ../src/playlists.c:571 #: ../src/playlists.c:589 ../src/playlists.c:607 ../src/playlists.c:828 msgid "Jukebox busy" msgstr "Jukebox occupato" #: ../src/gnomad2.c:275 ../src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Scansione della libreria del jukebox" #: ../src/gnomad2.c:276 ../src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Recupero dei metadati dal jukebox in corso" #: ../src/gnomad2.c:325 ../src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox occupato - Modifiche non effettuate" #: ../src/gnomad2.c:356 ../src/gnomad2.c:388 ../src/gnomad2.c:625 msgid "Set owner string" msgstr "Imposta la stringa del proprietario" #: ../src/gnomad2.c:359 ../src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Modifica il proprietario di questo jukebox:" #: ../src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Impossibile visualizzare le informazioni! Il jukebox è occupato!" #: ../src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Impossibile recuperare le Informazioni sul jukebox!" #: ../src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Impossibile allocare il colore blu!\n" #. Shall not be shown! #: ../src/gnomad2.c:548 msgid "Quit" msgstr "Esci" #: ../src/gnomad2.c:557 msgid "File" msgstr "File" #: ../src/gnomad2.c:583 msgid "Music transfer" msgstr "File musicali" #: ../src/gnomad2.c:596 msgid "Playlists" msgstr "Playlist" #: ../src/gnomad2.c:604 msgid "Data transfer" msgstr "File di dati" #. Add prefs tab #: ../src/gnomad2.c:609 msgid "Preferences" msgstr "Impostazioni" #. Shall not be shown! #: ../src/gnomad2.c:616 ../src/data.c:605 msgid "Rescan contents" msgstr "Riesamina il jukebox" #. dialog = gtk_dialog_new(); #: ../src/gnomad2.c:632 ../src/jukebox.c:377 ../src/jukebox.c:379 #: ../src/jukebox.c:394 msgid "Jukebox information" msgstr "Informazioni sul jukebox" #: ../src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukebox" #. Shall not be shown! #: ../src/gnomad2.c:647 msgid "About" msgstr "Informazioni" #: ../src/gnomad2.c:654 msgid "Help" msgstr "Aiuto" #: ../src/data.c:51 ../src/data.c:59 msgid "Transfering files from jukebox file storage" msgstr "Trasferimento dei file dall'area dati del jukebox" #: ../src/data.c:77 msgid "Retrieving data files from Jukebox..." msgstr "Recupero dei dati dal jukebox..." #: ../src/data.c:121 ../src/data.c:129 msgid "Transfering files to jukebox file storage" msgstr "Trasferimento dei file nell'area dati del jukebox" #: ../src/data.c:148 msgid "Storing files in Jukebox file storage..." msgstr "Memorizzazione dei file nell'area dati del jukebox" #: ../src/data.c:216 ../src/data.c:413 msgid "Really delete selected files?" msgstr "Vuoi davvero eliminare i file selezionati?" #: ../src/data.c:350 ../src/data.c:363 msgid "Create a new folder" msgstr "Crea una nuova cartella" #: ../src/data.c:386 msgid "Choose a name for the new folder:" msgstr "Scegli un nome per la nuova cartella:" #: ../src/data.c:504 ../src/xfer.c:607 msgid "Filename" msgstr "Nome file" #: ../src/data.c:520 ../src/xfer.c:563 msgid "Size (bytes)" msgstr "Dimensione (byte)" #. file ID number #. Track ID number #: ../src/data.c:532 ../src/xfer.c:621 msgid "ID" msgstr "ID" #: ../src/data.c:577 msgid "Rescan jukebox" msgstr "Riesamina il jukebox" #: ../src/data.c:585 ../src/data.c:621 ../src/xfer.c:675 ../src/xfer.c:711 msgid "Transfer selected" msgstr "Trasferisci" #: ../src/data.c:593 ../src/data.c:629 ../src/xfer.c:691 ../src/xfer.c:743 msgid "Delete selected" msgstr "Elimina" #: ../src/data.c:613 msgid "Create folder" msgstr "Crea cartella" #: ../src/data.c:746 msgid "Jukebox data file window" msgstr "Finestra dei file di dati sul Jukebox" #: ../src/xfer.c:60 ../src/xfer.c:68 msgid "Transfering tracks from jukebox library" msgstr "Trasferimento delle tracce dalla libreria del jukebox in corso" #: ../src/xfer.c:87 msgid "Retrieving tracks from Jukebox..." msgstr "Recupero delle tracce dal jukebox..." #: ../src/xfer.c:161 ../src/xfer.c:169 ../src/xfer.c:186 msgid "Transfering tracks to jukebox library" msgstr "Trasferimento delle tracce alla libreria del jukebox in corso" #: ../src/xfer.c:188 msgid "Storing tracks in Jukebox library..." msgstr "Memorizzazione delle tracce nella libreria del jukebox..." #: ../src/xfer.c:272 ../src/xfer.c:377 ../src/playlists.c:611 msgid "Really delete selected tracks?" msgstr "Vuoi davvero eliminare le tracce selezionate?" #: ../src/xfer.c:492 ../src/playlists.c:897 msgid "Artist" msgstr "Artista" #: ../src/xfer.c:508 ../src/playlists.c:909 msgid "Title" msgstr "Titolo" #: ../src/xfer.c:519 msgid "Album" msgstr "Album" #: ../src/xfer.c:530 msgid "Year" msgstr "Anno" #: ../src/xfer.c:541 msgid "Genre" msgstr "Genere" #: ../src/xfer.c:552 ../src/playlists.c:921 msgid "Length" msgstr "Durata" #: ../src/xfer.c:574 msgid "Codec" msgstr "Codec" #: ../src/xfer.c:585 msgid "Track#" msgstr "N. Traccia" #: ../src/xfer.c:596 ../src/editmeta.c:576 msgid "Protected" msgstr "Protetto" #: ../src/xfer.c:667 msgid "Rescan directory metadata" msgstr "Riesamina i metadati della directory" #: ../src/xfer.c:683 ../src/xfer.c:735 msgid "Edit selected" msgstr "Modifica" #: ../src/xfer.c:703 msgid "Rescan jukebox contents" msgstr "Riesamina il contenuto del jukebox" #: ../src/xfer.c:719 msgid "Add selected to playlist" msgstr "Aggiungi alla playlist" #: ../src/xfer.c:727 msgid "Play selected" msgstr "Riproduci" #: ../src/xfer.c:860 msgid "Jukebox library window" msgstr "Finestra della libreria del jukebox" #: ../src/editmeta.c:99 ../src/editmeta.c:581 msgid "YES" msgstr "SÌ" #: ../src/editmeta.c:99 msgid "NO" msgstr "NO" #: ../src/editmeta.c:126 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Il jukebox è occupato.\n" "Impossibile modificare i metadati ora." #. First is artist, second is title #: ../src/editmeta.c:223 #, c-format msgid "Updating metadata on %s - %s" msgstr "Aggiornamento dei metadati di %s - %s" #: ../src/editmeta.c:330 ../src/editmeta.c:350 msgid "Edit jukebox file metadata" msgstr "Modifica i metadati del file sul jukebox" #: ../src/editmeta.c:335 ../src/editmeta.c:353 msgid "Edit track metadata (ID3v2)" msgstr "Modifica i metadati della traccia (ID3v2)" #: ../src/editmeta.c:369 msgid "Artist:" msgstr "Artista: " #: ../src/editmeta.c:393 msgid "Title:" msgstr "Titolo: " #: ../src/editmeta.c:414 msgid "Album:" msgstr "Album: " #: ../src/editmeta.c:436 msgid "Year:" msgstr "Anno: " #: ../src/editmeta.c:459 msgid "Genre:" msgstr "Genere: " #: ../src/editmeta.c:483 msgid "Length:" msgstr "Durata: " #: ../src/editmeta.c:508 msgid "Track number:" msgstr "Numero della traccia: " #: ../src/editmeta.c:531 msgid "Original filename:" msgstr "Nome file originale: " #: ../src/editmeta.c:554 msgid "Folder:" msgstr "Cartella:" #: ../src/editmeta.c:595 msgid "Codec:" msgstr "Codec: " #: ../src/editmeta.c:610 msgid "File size:" msgstr "Dimensione del file: " #: ../src/editmeta.c:626 msgid "File ID:" msgstr "ID del file: " #: ../src/editmeta.c:628 msgid "Path:" msgstr "Percorso: " #: ../src/filesystem.c:462 msgid "Getting file list from filesystem" msgstr "Recupero dell'elenco dei file dal filesystem" #: ../src/filesystem.c:490 ../src/filesystem.c:621 msgid "Adding metadata to view" msgstr "Aggiunta dei metadati alla visuale" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 msgid "Getting file metadata" msgstr "Recupero dei metadati del file" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 msgid "Getting track metadata" msgstr "Recupero dei metadati della traccia" #: ../src/filesystem.c:739 msgid "Could not write preference file" msgstr "Impossibile scrivere il file delle impostazioni" #: ../src/filesystem.c:942 msgid "Could not write exported playlist" msgstr "Impossibile scrivere la playlist esportata" #: ../src/jukebox.c:150 msgid "Could not open the device on the USB bus" msgstr "Impossibile aprire il dispositivo sul bus USB" #: ../src/jukebox.c:154 msgid "(unknown cause)" msgstr "(causa sconosciuta)" #: ../src/jukebox.c:403 msgid "Unique device ID:" msgstr "ID unico del dispositivo: " #: ../src/jukebox.c:414 msgid "Firmware revision:" msgstr "Revisione del firmware: " #: ../src/jukebox.c:426 msgid "Hardware revision:" msgstr "Revisione dell'hardware:" #: ../src/jukebox.c:438 msgid "Product name:" msgstr "Nome del prodotto: " #: ../src/jukebox.c:449 msgid "Auxilary power (AC or USB) connected:" msgstr "Alimentazione ausiliaria (Corrente o USB) collegata:" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "Yes" msgstr "Sì" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "No" msgstr "No" #: ../src/jukebox.c:460 msgid "Battery is charging:" msgstr "Batteria in carica:" #: ../src/jukebox.c:474 msgid "Battery level:" msgstr "Livello batteria:" #: ../src/jukebox.c:487 msgid "Jukebox owner:" msgstr "Proprietario del jukebox: " #: ../src/jukebox.c:499 msgid "Time on jukebox:" msgstr "Ora sul jukebox: " #: ../src/jukebox.c:512 msgid "Total bytes on disk:" msgstr "Byte totali sul disco: " #: ../src/jukebox.c:525 msgid "Total free bytes available:" msgstr "Byte totali disponibili: " #: ../src/jukebox.c:538 msgid "Total bytes used:" msgstr "Byte totali utilizzati: " #: ../src/jukebox.c:551 msgid "Number of songs:" msgstr "Numero delle canzoni: " #: ../src/jukebox.c:563 msgid "Number of playlists:" msgstr "Numero delle playlist: " #: ../src/jukebox.c:575 msgid "Number of datafiles:" msgstr "Numero dei file di dati: " #: ../src/jukebox.c:708 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Impossibile provare a localizzare i jukebox\n" "Errore USB?" #: ../src/jukebox.c:723 msgid "No jukeboxes found on USB bus" msgstr "Nessun jukebox trovato sul bus USB" #: ../src/jukebox.c:769 msgid "Could not open jukebox:\n" msgstr "Impossibile aprire il jukebox:\n" #: ../src/jukebox.c:784 msgid "Could not capture jukebox:\n" msgstr "Impossibile prendere il controllo del jukebox:\n" #: ../src/jukebox.c:1070 msgid "Could not find playlist" msgstr "Impossibile trovare la playlist" #: ../src/jukebox.c:1300 msgid "Scanning songs..." msgstr "Scansione delle canzoni in corso..." #: ../src/jukebox.c:1301 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Scansione delle canzoni:\n" "Hai attivato la scansione dei metadati estesi,\n" " di conseguenza la scansione sarà molto lenta." #: ../src/jukebox.c:1302 msgid "Scanning playlists..." msgstr "Scansione delle playlist in corso..." #: ../src/jukebox.c:1303 msgid "Scanning datafiles..." msgstr "Scansione dei file di dati in corso..." #: ../src/jukebox.c:1382 #, c-format msgid "%u songs scanned" msgstr "Trovate %u canzoni" #: ../src/jukebox.c:1550 #, c-format msgid "%u data files scanned" msgstr "Trovati %u file di dati" #: ../src/jukebox.c:2272 msgid "Track ID was zero! Illegal value!" msgstr "l'ID della traccia è 0! Valore non permesso!" #: ../src/jukebox.c:2276 msgid "Song length must be greater than zero!" msgstr "La lunghezza della canzone deve essere maggiore di zero!" #: ../src/jukebox.c:2408 msgid "Could not create playlist" msgstr "Impossibile creare la playlist" #: ../src/jukebox.c:2427 msgid "Could not delete playlist" msgstr "Impossibile cancellare la playlist" #: ../src/jukebox.c:2461 msgid "Could not rename playlist" msgstr "Impossibile rinominare la playlist" #: ../src/jukebox.c:2472 msgid "Could not locate playlist to rename!" msgstr "Impossibile localizzare la playlist da rinominare!" #: ../src/jukebox.c:2637 msgid "Could not find the track in the playlist" msgstr "Traccia non trovata nella playlist" #: ../src/jukebox.c:3077 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Impossibile creare la cartella.\n" "La ragione più comune è che stai utilizzando un Nomad Jukebox 1,\n" "che è troppo vecchio per supportare le cartelle." #: ../src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Riproduzione delle tracce sul jukebox in corso" #: ../src/player.c:448 msgid "Playing:" msgstr "In riproduzione:" #: ../src/player.c:474 msgid "STOP" msgstr "STOP" #: ../src/player.c:508 msgid "PREV" msgstr "PREC" #: ../src/player.c:527 msgid "NEXT" msgstr "SUCC" #: ../src/playlists.c:165 ../src/playlists.c:178 msgid "Create a new playlist" msgstr "Crea una nuova playlist" #: ../src/playlists.c:203 msgid "Choose a name for the new playlist:" msgstr "Scegli un nome per la nuova playlist:" #: ../src/playlists.c:263 ../src/playlists.c:276 ../src/playlists.c:1013 msgid "Edit playlist" msgstr "Modifica playlist" #: ../src/playlists.c:299 msgid "Edit the name for this playlist:" msgstr "Modifica il nome di questa playlist:" #: ../src/playlists.c:464 ../src/playlists.c:478 ../src/playlists.c:1021 msgid "Export playlist" msgstr "Esporta playlist" #: ../src/playlists.c:501 msgid "Export playlist to this file:" msgstr "Esporta la playlist nel seguente file:" #: ../src/playlists.c:514 msgid "Unnamed playlist.txt" msgstr "Nuova playlist.txt" #: ../src/playlists.c:519 msgid "Format the playlist according to this string:" msgstr "Formatta la playlist secondo questa stringa:" #. Don't translate the magic %-things! #: ../src/playlists.c:531 ../src/prefs.c:488 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artista, %t = Titolo, %b = Album, %g = Genere, %n = Numero della " "traccia, %y = Anno" #: ../src/playlists.c:535 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crea una playlist M3U (assumendo che il filtro sul formato imposti i nomi " "dei file correttamente)" #: ../src/playlists.c:545 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crea una playlist PLS (assumendo che il filtro sul formato imposti i nomi " "dei file correttamente)" #: ../src/playlists.c:574 msgid "Really delete selected playlist?" msgstr "Vuoi davvero eliminare la playlist selezionata?" #. and .. #: ../src/playlists.c:712 msgid "and" msgstr "e" #: ../src/playlists.c:858 msgid "Transfer to jukebox library" msgstr "Trasferisci alla libreria del jukebox" #: ../src/playlists.c:859 ../src/playlists.c:866 msgid "Add tracks to playlist(s):" msgstr "Aggiungi tracce alla/e playlist:" #: ../src/playlists.c:865 msgid "Add to playlist" msgstr "Aggiungi a playlist" #: ../src/playlists.c:884 msgid "Playlist" msgstr "Playlist" #: ../src/playlists.c:979 ../src/playlists.c:989 ../src/playlists.c:1039 msgid "New playlist" msgstr "Nuova playlist" #: ../src/playlists.c:997 msgid "Shuffle playlist" msgstr "Mescola playlist" #: ../src/playlists.c:1005 msgid "Play playlist" msgstr "Riproduci playlist" #: ../src/playlists.c:1029 msgid "Delete playlist" msgstr "Cancella playlist" #: ../src/playlists.c:1047 msgid "Delete track from playlist" msgstr "Cancella traccia dalla playlist" #. Preference for filenaming #: ../src/prefs.c:457 msgid "Filenaming" msgstr "Impostazioni di creazione dei nomi dei file" #: ../src/prefs.c:461 msgid "Use original filename if present in metadata for the track" msgstr "" "Usa il nome del file originale se presente tra i metadati della traccia" #: ../src/prefs.c:470 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Questa stringa viene utilizzata per dare un nome ai file copiati dalla " "libreria del jukebox al filesystem." #: ../src/prefs.c:477 msgid "Formatting string:" msgstr "Stringa di formattazione:" #: ../src/prefs.c:497 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Sovrascrivi i tag ID3 dei file trasferiti con i metadati presenti sul jukebox" #: ../src/prefs.c:500 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Rimuovi tutti i tag ID3 dai file trasferiti sul jukebox" #: ../src/prefs.c:503 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Scrivi tag ID3v1/v2 nei file trasferiti sull'hard disk" #: ../src/prefs.c:506 msgid "Force use of Unicode charset for ID3 tags" msgstr "Forza l'utilizzo del charset Unicode per i tag ID3" #: ../src/prefs.c:508 msgid "Display hidden (.foo) directories in filesystem" msgstr "Mostra le directory nascoste (.antani) del filesystem" #: ../src/prefs.c:511 msgid "Ask to add files to a playlist" msgstr "Chiedi di aggiungere i file a una playlist" #: ../src/prefs.c:513 msgid "Recurse into any selected directories when transferring" msgstr "Scendi ricorsivamente nelle directory quando trasferisci" #: ../src/prefs.c:516 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Forza il filesystem locale al charset ISO-8859-1" #: ../src/prefs.c:519 msgid "Try to extract sound file metadata from path and filename" msgstr "Cerca di estrarre i metadati dei file dal percorso e dal nome del file" #: ../src/prefs.c:521 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Leggi i metadati estesi dal jukebox (ad esempio il nome del file originale - " "Lento sui dispositivi più nuovi)" #: ../src/prefs.c:528 msgid "Automatically read in jukebox contents on startup" msgstr "Leggi automaticamente i contenuti del jukebox all'avvio" #: ../src/prefs.c:530 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Sincronizza automaticamente l'ora sul jukebox con quella del computer " "all'avvio" #: ../src/prefs.c:532 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "All'avvio, ritorna nel punto del filesystem in cui eri l'ultima volta" #: ../src/prefs.c:534 msgid "Enable turbo mode - uncheck this if you have problems" msgstr "" #~ msgid "Unknown jukebox type" #~ msgstr "Tipo del jukebox sconosciuto" gnomad2-2.9.6/po/sv.po0000664000076400007640000004566111512614631011434 00000000000000# Swedish messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-05-30 09:38+0200\n" "PO-Revision-Date: 2006-08-19 15:05+0100\n" "Last-Translator: Linus Walleij \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "" "Ett verktyg för att hantera Creative Nomad/Zen Jukebox:ar och Dell DJ-spelare" #: ../gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: ../gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Klient för Nomad/Zen/Dell DJ Jukebox" #: ../src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Kan ej avsluta! Jukeboxen är upptagen!" #: ../src/gnomad2.c:124 ../src/gnomad2.c:150 msgid "Select jukebox" msgstr "Välj jukebox" #: ../src/gnomad2.c:129 ../src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Välj jukebox att arbeta med:" #: ../src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "Ett program för att kommunicera med Creative:s Jukebox:ar" #: ../src/gnomad2.c:218 msgid "translator_credits" msgstr "Linus Walleij " #: ../src/gnomad2.c:264 ../src/data.c:42 ../src/data.c:113 ../src/xfer.c:51 #: ../src/xfer.c:150 ../src/xfer.c:366 ../src/playlists.c:226 #: ../src/playlists.c:242 ../src/playlists.c:452 ../src/playlists.c:571 #: ../src/playlists.c:589 ../src/playlists.c:607 ../src/playlists.c:828 msgid "Jukebox busy" msgstr "Jukeboxen är upptagen" #: ../src/gnomad2.c:275 ../src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Läser in jukeboxkollektion" #: ../src/gnomad2.c:276 ../src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Hämtar information från jukeboxen" #: ../src/gnomad2.c:325 ../src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukeboxen är upptagen - förändringen ignoreras" #: ../src/gnomad2.c:356 ../src/gnomad2.c:388 ../src/gnomad2.c:625 msgid "Set owner string" msgstr "Sätt ägarsträngen" #: ../src/gnomad2.c:359 ../src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Ställ in ägare för denna jukebox:" #: ../src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Kan inte visa informationen! Jukeboxen är upptagen!" #: ../src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Kan inte hämta information om jukeboxen!" #: ../src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Kunde inte reservera den blå färgen!\n" #. Shall not be shown! #: ../src/gnomad2.c:548 msgid "Quit" msgstr "Avsluta" #: ../src/gnomad2.c:557 msgid "File" msgstr "Arkiv" #: ../src/gnomad2.c:583 msgid "Music transfer" msgstr "Musiköverföring" #: ../src/gnomad2.c:596 msgid "Playlists" msgstr "Spellistor" #: ../src/gnomad2.c:604 msgid "Data transfer" msgstr "Dataöverföring" #. Add prefs tab #: ../src/gnomad2.c:609 msgid "Preferences" msgstr "Inställningar" #. Shall not be shown! #: ../src/gnomad2.c:616 ../src/data.c:605 msgid "Rescan contents" msgstr "Läs om innehållet" #. dialog = gtk_dialog_new(); #: ../src/gnomad2.c:632 ../src/jukebox.c:377 ../src/jukebox.c:379 #: ../src/jukebox.c:394 msgid "Jukebox information" msgstr "Information om jukeboxen" #: ../src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukeboxkollektion" #. Shall not be shown! #: ../src/gnomad2.c:647 msgid "About" msgstr "Om" #: ../src/gnomad2.c:654 msgid "Help" msgstr "Hjälp" #: ../src/data.c:51 ../src/data.c:59 msgid "Transfering files from jukebox file storage" msgstr "Överför filer från jukeboxens fillagringsarea" #: ../src/data.c:77 msgid "Retrieving data files from Jukebox..." msgstr "Hämtar datafiler från jukeboxen..." #: ../src/data.c:121 ../src/data.c:129 msgid "Transfering files to jukebox file storage" msgstr "Överför filer till jukeboxens fillagringsarea" #: ../src/data.c:148 msgid "Storing files in Jukebox file storage..." msgstr "Lagrar filer i jukeboxens fillagringsarea..." #: ../src/data.c:216 ../src/data.c:413 msgid "Really delete selected files?" msgstr "Vill du radera valda filer?" #: ../src/data.c:350 ../src/data.c:363 msgid "Create a new folder" msgstr "Skapa en ny folder" #: ../src/data.c:386 msgid "Choose a name for the new folder:" msgstr "Välj ett namn för den nya foldern:" #: ../src/data.c:504 ../src/xfer.c:607 msgid "Filename" msgstr "Filnamn" #: ../src/data.c:520 ../src/xfer.c:563 msgid "Size (bytes)" msgstr "Storlek (antal byte)" #. file ID number #. Track ID number #: ../src/data.c:532 ../src/xfer.c:621 msgid "ID" msgstr "ID" #: ../src/data.c:577 msgid "Rescan jukebox" msgstr "Läs om innehållet" #: ../src/data.c:585 ../src/data.c:621 ../src/xfer.c:675 ../src/xfer.c:711 msgid "Transfer selected" msgstr "Överför valda filer" #: ../src/data.c:593 ../src/data.c:629 ../src/xfer.c:691 ../src/xfer.c:743 msgid "Delete selected" msgstr "Radera valda filer" #: ../src/data.c:613 msgid "Create folder" msgstr "Skapa folder" #: ../src/data.c:746 msgid "Jukebox data file window" msgstr "Datafiler i jukeboxen" #: ../src/xfer.c:60 ../src/xfer.c:68 msgid "Transfering tracks from jukebox library" msgstr "Överför musikspår från jukeboxkollektionen" #: ../src/xfer.c:87 msgid "Retrieving tracks from Jukebox..." msgstr "Hämtar musikspår från jukeboxen.." #: ../src/xfer.c:161 ../src/xfer.c:169 ../src/xfer.c:186 msgid "Transfering tracks to jukebox library" msgstr "Överför musikspår till jukeboxkollektionen" #: ../src/xfer.c:188 msgid "Storing tracks in Jukebox library..." msgstr "Lagrar musikspår i jukeboxkollektionen" #: ../src/xfer.c:272 ../src/xfer.c:377 ../src/playlists.c:611 msgid "Really delete selected tracks?" msgstr "Vill du radera de valda ljudspåren?" #: ../src/xfer.c:492 ../src/playlists.c:897 msgid "Artist" msgstr "Artist" #: ../src/xfer.c:508 ../src/playlists.c:909 msgid "Title" msgstr "Titel" #: ../src/xfer.c:519 msgid "Album" msgstr "Skiva" #: ../src/xfer.c:530 msgid "Year" msgstr "Årtal" #: ../src/xfer.c:541 msgid "Genre" msgstr "Genre" #: ../src/xfer.c:552 ../src/playlists.c:921 msgid "Length" msgstr "Längd" #: ../src/xfer.c:574 msgid "Codec" msgstr "Codec" #: ../src/xfer.c:585 msgid "Track#" msgstr "Spårnr." #: ../src/xfer.c:596 ../src/editmeta.c:576 msgid "Protected" msgstr "Skyddad" #: ../src/xfer.c:667 msgid "Rescan directory metadata" msgstr "Läs om kataloginnehållet" #: ../src/xfer.c:683 ../src/xfer.c:735 msgid "Edit selected" msgstr "Editera valda filer" #: ../src/xfer.c:703 msgid "Rescan jukebox contents" msgstr "Läs om innehållet" #: ../src/xfer.c:719 msgid "Add selected to playlist" msgstr "Lägg till i spellista" #: ../src/xfer.c:727 msgid "Play selected" msgstr "Spela" #: ../src/xfer.c:860 msgid "Jukebox library window" msgstr "Jukeboxkollektion" #: ../src/editmeta.c:99 ../src/editmeta.c:581 msgid "YES" msgstr "JA" #: ../src/editmeta.c:99 msgid "NO" msgstr "NEJ" #: ../src/editmeta.c:126 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Kan inte editera metadata just nu,\n" "jukeboxen är upptagen." #. First is artist, second is title #: ../src/editmeta.c:223 #, c-format msgid "Updating metadata on %s - %s" msgstr "Uppdaterar metadata på %s - %s" #: ../src/editmeta.c:330 ../src/editmeta.c:350 msgid "Edit jukebox file metadata" msgstr "Editerar metadata på jukeboxen" #: ../src/editmeta.c:335 ../src/editmeta.c:353 msgid "Edit track metadata (ID3v2)" msgstr "Editera metadata för ljudpår (ID3v2)" #: ../src/editmeta.c:369 msgid "Artist:" msgstr "Artist:" #: ../src/editmeta.c:393 msgid "Title:" msgstr "Titel:" #: ../src/editmeta.c:414 msgid "Album:" msgstr "Skiva:" #: ../src/editmeta.c:436 msgid "Year:" msgstr "Årtal:" #: ../src/editmeta.c:459 msgid "Genre:" msgstr "Genre:" #: ../src/editmeta.c:483 msgid "Length:" msgstr "Längd:" #: ../src/editmeta.c:508 msgid "Track number:" msgstr "Spårnummer:" #: ../src/editmeta.c:531 msgid "Original filename:" msgstr "Ursprungligt filnamn:" #: ../src/editmeta.c:554 msgid "Folder:" msgstr "Folder:" #: ../src/editmeta.c:595 msgid "Codec:" msgstr "Codec:" #: ../src/editmeta.c:610 msgid "File size:" msgstr "Filstorlek:" #: ../src/editmeta.c:626 msgid "File ID:" msgstr "Fil-ID:" #: ../src/editmeta.c:628 msgid "Path:" msgstr "Sökväg:" #: ../src/filesystem.c:462 msgid "Getting file list from filesystem" msgstr "Överför filer från jukeboxens fillagringsarea" #: ../src/filesystem.c:490 ../src/filesystem.c:621 msgid "Adding metadata to view" msgstr "Lägger till metadata i vy" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 msgid "Getting file metadata" msgstr "Hämtar metadata för filer" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 msgid "Getting track metadata" msgstr "Hämtar metadata för ljudspår" #: ../src/filesystem.c:739 msgid "Could not write preference file" msgstr "Kunde inte skriva inställningsfil" #: ../src/filesystem.c:942 msgid "Could not write exported playlist" msgstr "Kunde inte skriva exporterad spellista" #: ../src/jukebox.c:150 msgid "Could not open the device on the USB bus" msgstr "Kunde inte öppna enheten på USB-bussen" #: ../src/jukebox.c:154 msgid "(unknown cause)" msgstr "(okänd orsak)" #: ../src/jukebox.c:403 msgid "Unique device ID:" msgstr "Unikt enhets-ID:" #: ../src/jukebox.c:414 msgid "Firmware revision:" msgstr "Version av firmware:" #: ../src/jukebox.c:426 msgid "Hardware revision:" msgstr "Version av hårdvara:" #: ../src/jukebox.c:438 msgid "Product name:" msgstr "Produktnamn:" #: ../src/jukebox.c:449 msgid "Auxilary power (AC or USB) connected:" msgstr "Yttre spänningskälla (AC eller USB) ansluten:" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "Yes" msgstr "Ja" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "No" msgstr "Nej" #: ../src/jukebox.c:460 msgid "Battery is charging:" msgstr "Batteriet laddas:" #: ../src/jukebox.c:474 msgid "Battery level:" msgstr "Batterinivå:" #: ../src/jukebox.c:487 msgid "Jukebox owner:" msgstr "Jukeboxens ägare:" #: ../src/jukebox.c:499 msgid "Time on jukebox:" msgstr "Tid på jukeboxen:" #: ../src/jukebox.c:512 msgid "Total bytes on disk:" msgstr "Totalt antal byte på disken:" #: ../src/jukebox.c:525 msgid "Total free bytes available:" msgstr "Totalt antal lediga byte:" #: ../src/jukebox.c:538 msgid "Total bytes used:" msgstr "Totalt antal använda byte:" #: ../src/jukebox.c:551 msgid "Number of songs:" msgstr "Antal musikstycken:" #: ../src/jukebox.c:563 msgid "Number of playlists:" msgstr "Antal spellistor:" #: ../src/jukebox.c:575 msgid "Number of datafiles:" msgstr "Antal datafiler:" #: ../src/jukebox.c:708 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Kunde inte lokalisera jukeboxar.\n" "USB-fel?" #: ../src/jukebox.c:723 msgid "No jukeboxes found on USB bus" msgstr "Inga jukeboxar upptäcktes på USB-bussen" #: ../src/jukebox.c:769 msgid "Could not open jukebox:\n" msgstr "Kunde inte öppna jukeboxen:\n" #: ../src/jukebox.c:784 msgid "Could not capture jukebox:\n" msgstr "Kunde inte låsa jukeboxen:\n" #: ../src/jukebox.c:1070 msgid "Could not find playlist" msgstr "Kunde inte hitta spellistan" #: ../src/jukebox.c:1300 msgid "Scanning songs..." msgstr "Läser in musikstycken..." #: ../src/jukebox.c:1301 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Läser in musikstycken:\n" "Du har valt att läsa in utökad metadata,\n" " så inläsningen kommer att bli mycket långsam." #: ../src/jukebox.c:1302 msgid "Scanning playlists..." msgstr "Läser in spellistor..." #: ../src/jukebox.c:1303 msgid "Scanning datafiles..." msgstr "Läser in datafiler..." #: ../src/jukebox.c:1382 #, c-format msgid "%u songs scanned" msgstr "%u musikstycken inlästa" #: ../src/jukebox.c:1550 #, c-format msgid "%u data files scanned" msgstr "%u datafiler inlästa" #: ../src/jukebox.c:2272 msgid "Track ID was zero! Illegal value!" msgstr "Spår-ID var noll! Otillåtet värde!" #: ../src/jukebox.c:2276 msgid "Song length must be greater than zero!" msgstr "Ljudspåret måste vara längre än noll sekunder!" #: ../src/jukebox.c:2408 msgid "Could not create playlist" msgstr "Kunde inte skapa spellista" #: ../src/jukebox.c:2427 msgid "Could not delete playlist" msgstr "Kunde inte radera spellista" #: ../src/jukebox.c:2461 msgid "Could not rename playlist" msgstr "Kunde inte byta namn på spellista" #: ../src/jukebox.c:2472 msgid "Could not locate playlist to rename!" msgstr "Kunde inte lokalisera spellista att byta namn på!" #: ../src/jukebox.c:2637 msgid "Could not find the track in the playlist" msgstr "Kunde inte hitta ljudspåret i spellistan" #: ../src/jukebox.c:3077 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Foldern kunde inte skapas.\n" "Den vanligast orsaken är att du använder Nomad Jukebox 1\n" "som är för gammal för att stödja foldrar." #: ../src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Spelar ljudspår på jukeboxen" #: ../src/player.c:448 msgid "Playing:" msgstr "Spelar:" #: ../src/player.c:474 msgid "STOP" msgstr "STOPP" #: ../src/player.c:508 msgid "PREV" msgstr "FÖREG" #: ../src/player.c:527 msgid "NEXT" msgstr "NÄSTA" #: ../src/playlists.c:165 ../src/playlists.c:178 msgid "Create a new playlist" msgstr "Skapa en ny spellista" #: ../src/playlists.c:203 msgid "Choose a name for the new playlist:" msgstr "Välj ett namn för den nya spellistan:" #: ../src/playlists.c:263 ../src/playlists.c:276 ../src/playlists.c:1013 msgid "Edit playlist" msgstr "Editera spellistan" #: ../src/playlists.c:299 msgid "Edit the name for this playlist:" msgstr "Editera namnet för denna spellista:" #: ../src/playlists.c:464 ../src/playlists.c:478 ../src/playlists.c:1021 msgid "Export playlist" msgstr "Exportera spellistan" #: ../src/playlists.c:501 msgid "Export playlist to this file:" msgstr "Exportera spellistan till denna fil:" #: ../src/playlists.c:514 msgid "Unnamed playlist.txt" msgstr "Spellista.txt" #: ../src/playlists.c:519 msgid "Format the playlist according to this string:" msgstr "Formatera spellistan enligt denna sträng:" #. Don't translate the magic %-things! #: ../src/playlists.c:531 ../src/prefs.c:488 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artist, %t = Titel, %b = Skiva, %g = Genre, %n = Spårnummer, %y = Årtal" #: ../src/playlists.c:535 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Skapa en M3U-spellista (under förutsättningen att formatteringsfiltret " "skapar korrekta filnamn)" #: ../src/playlists.c:545 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Skapa en PLS-spellista (under förutsättningen att formatteringsfiltret " "skapar korrekta filnamn)" #: ../src/playlists.c:574 msgid "Really delete selected playlist?" msgstr "Vill du verkligen radera den valda spellistan?" #. and .. #: ../src/playlists.c:712 msgid "and" msgstr "och" #: ../src/playlists.c:858 msgid "Transfer to jukebox library" msgstr "Överför till jukeboxkollektionen" #: ../src/playlists.c:859 ../src/playlists.c:866 msgid "Add tracks to playlist(s):" msgstr "Lägg till ljudspåren i denna spellista/spellistor:" #: ../src/playlists.c:865 msgid "Add to playlist" msgstr "Lägg till i spellista" #: ../src/playlists.c:884 msgid "Playlist" msgstr "Spellista" #: ../src/playlists.c:979 ../src/playlists.c:989 ../src/playlists.c:1039 msgid "New playlist" msgstr "Ny spellista" #: ../src/playlists.c:997 msgid "Shuffle playlist" msgstr "Blanda spellista" #: ../src/playlists.c:1005 msgid "Play playlist" msgstr "Spela spellista" #: ../src/playlists.c:1029 msgid "Delete playlist" msgstr "Radera spellista" #: ../src/playlists.c:1047 msgid "Delete track from playlist" msgstr "Radera ljudspår från spellista" #. Preference for filenaming #: ../src/prefs.c:457 msgid "Filenaming" msgstr "Filnamngivning" #: ../src/prefs.c:461 msgid "Use original filename if present in metadata for the track" msgstr "Använd originalets filnamn, om detta finns lagrat i spårets metadata" #: ../src/prefs.c:470 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Denna sträng används för att namnge filer som kopieras från " "jukeboxkollektionen till filsystemet." #: ../src/prefs.c:477 msgid "Formatting string:" msgstr "Formateringssträng:" #: ../src/prefs.c:497 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metadata från jukeboxen skriver över alla ev. ID3-taggar som finns på " "överförda filer" #: ../src/prefs.c:500 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Ta bort alla ID3-taggar från filer som överförs till jukeboxen" #: ../src/prefs.c:503 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Skriv ID3v1-taggar till filer som överförts till hårddisken" #: ../src/prefs.c:506 msgid "Force use of Unicode charset for ID3 tags" msgstr "Tvinga ID3-taggar att använda Unicode" #: ../src/prefs.c:508 msgid "Display hidden (.foo) directories in filesystem" msgstr "Visa dolda (.foo) kataloger i filsystemet" #: ../src/prefs.c:511 msgid "Ask to add files to a playlist" msgstr "Fråga om musikstycken skall läggas till i spellista" #: ../src/prefs.c:513 msgid "Recurse into any selected directories when transferring" msgstr "Gå ned i valda underkataloger under överföring" #: ../src/prefs.c:516 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Tvinga lokalt filsystem till ISO-8859-1-teckenuppsättning" #: ../src/prefs.c:519 msgid "Try to extract sound file metadata from path and filename" msgstr "Försök utröna ljudfilers metadata från sökväg och filnamn" #: ../src/prefs.c:521 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Läs in utökad metadata från jukebox:en, t.ex. originalets filnamn. Kan vara " "långsamt på nyare enheter." #: ../src/prefs.c:528 msgid "Automatically read in jukebox contents on startup" msgstr "Läs in innehållet i jukebox:en automatiskt vid uppstart" #: ../src/prefs.c:530 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "Sätt klockan i jukebox:en automatiskt vid uppstart" #: ../src/prefs.c:532 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "Vid uppstart, återvänd till den plats i filsystemet där jag var senast" #: ../src/prefs.c:534 msgid "Enable turbo mode - uncheck this if you have problems" msgstr "Avtivera turbomodus - deaktivera detta alternativ vid problem" #~ msgid "Unknown jukebox type" #~ msgstr "Okänd jukeboxtyp" gnomad2-2.9.6/po/fr.po0000664000076400007640000005035611512614631011410 00000000000000# French messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # French Translation by FRLinux # This file is distributed under the GNU General Public License v 2.0 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To:\n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-08-17 18:32+0000\n" "Last-Translator: Nicolas Velin \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "" "Un utilitaire pour utiliser les Juxeboxes Creative Nomad/Zen et Dell DJs" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 #, fuzzy msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Client Jukebox Nomad" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Impossible de quitter ! Jukebox en cours d'utilisation !" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Sélectionnez le jukebox" #: src/gnomad2.c:129 src/gnomad2.c:169 #, fuzzy msgid "Select jukebox to operate:" msgstr "Sélectionnez le jukebox à utiliser" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Un programme pour communiquer avec\n" "les jukeboxes Creative" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "Steph <>\nNicolas Velin " #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Jukebox occupé" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Récupération des données de la bibliothèque" #: src/gnomad2.c:276 src/gnomad2.c:292 #, fuzzy msgid "Retrieveing metadata from jukebox" msgstr "Récupération des informations du jukebox" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox occupé - changement annulé" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Changer l'identifiant du propriétaire" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Editer le nom du possesseur du jukebox" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Impossible de lire les informations ! Le jukebox est occupé" #: src/gnomad2.c:428 #, fuzzy msgid "Cannot retrieve jukebox information!" msgstr "Impossible de récupérer les informations du jukebox !" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Impossible d'utiliser la couleur bleue !\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Quitter" #: src/gnomad2.c:557 msgid "File" msgstr "Fichier" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Transférer de la musique" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Liste de chansons" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Transfert de données" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Préférences" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Re-scanner le contenu" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Informations du jukebox" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Bibliothèque du jukebox" #: src/gnomad2.c:647 msgid "About" msgstr "A propos" #: src/gnomad2.c:654 msgid "Help" msgstr "Aide" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Transfert de fichiers depuis le jukebox" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Récupération des fichiers depuis le jukebox ..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Transfert de fichiers vers le jukebox" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Enregistrement des fichiers dans le jukebox ..." #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "Voulez-vous vraiment supprimer les fichiers sélectionnés ?" #: src/data.c:300 #, fuzzy msgid "Create a new folder" msgstr "Créer une nouvelle liste de chansons" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Choisir un nom pour la nouvelle liste de chansons" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Nom de fichier" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Taille (en octets)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Re-scanner le jukebox" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transfert sélectionné" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Effacement sélectionné" #: src/data.c:533 msgid "Create folder" msgstr "Créer un répertoire" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Fenêtre de transfert de données du jukebox" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Transfert de pistes depuis la bibliothèque du jukebox" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Récupération de pistes depuis le jukebox ..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Transfert de pistes vers le jukebox" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Enregistrement de pistes dans la bibliothèque du jukebox ..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 #, fuzzy msgid "Really delete selected tracks?" msgstr "Voulez-vous vraiment supprimer les pistes sélectionnées?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Artiste" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Titre" #: src/xfer.c:484 msgid "Album" msgstr "Album" #: src/xfer.c:495 msgid "Year" msgstr "Année" #: src/xfer.c:506 msgid "Genre" msgstr "Genre" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Durée" #: src/xfer.c:539 msgid "Codec" msgstr "Codec" #: src/xfer.c:550 msgid "Track#" msgstr "Piste #" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Protégé" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Re-scanner le répertoire des méta-données" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Editer sélection" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Re-scanner le contenu du jukebox" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Ajouter la sélection à la liste de chansons" #: src/xfer.c:692 msgid "Play selected" msgstr "Lire la sélection" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Fenêtre de la bibliothèque du jukebox" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "Oui" #: src/editmeta.c:97 msgid "NO" msgstr "Non" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Le jukebox est en cours d'utilisation.\n" "Impossible d'éditer les méta-données." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Mise à jour des métadonnées sur %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Editer le fichier de métadonnées du jukebox" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Editer la métadonnée de la piste (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Artiste :" #: src/editmeta.c:368 msgid "Title:" msgstr "Titre :" #: src/editmeta.c:389 msgid "Album:" msgstr "Album :" #: src/editmeta.c:411 msgid "Year:" msgstr "Année :" #: src/editmeta.c:434 msgid "Genre:" msgstr "Genre :" #: src/editmeta.c:458 msgid "Length:" msgstr "Durée :" #: src/editmeta.c:483 msgid "Track number:" msgstr "Numéro de piste :" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Nom de fichier original :" #: src/editmeta.c:529 msgid "Folder:" msgstr "Répertoire :" #: src/editmeta.c:570 msgid "Codec:" msgstr "Codec :" #: src/editmeta.c:585 msgid "File size:" msgstr "Taille du fichier :" #: src/editmeta.c:601 msgid "File ID:" msgstr "ID du fichier :" #: src/editmeta.c:603 msgid "Path:" msgstr "Chemin :" #: src/filesystem.c:393 #, fuzzy msgid "Getting file list from filesystem" msgstr "Transfert de fichiers depuis le jukebox" #: src/filesystem.c:421 #, fuzzy msgid "Adding metadata to view" msgstr "Mise à jour des méta-données sur %s - %s" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 #, fuzzy msgid "Getting file metadata" msgstr "Editer le fichier de méta-données du jukebox" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 #, fuzzy msgid "Getting track metadata" msgstr "Editer la méta-donnée de la piste (ID3v2)" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "Impossible d'écrire les préférences du fichier" #: src/filesystem.c:802 #, fuzzy msgid "Could not write exported playlist" msgstr "Impossible de créer une liste de chansons" #: src/jukebox.c:101 #, fuzzy msgid "Could not open the device on the USB bus" msgstr "Impossible de trouver la piste depuis la liste de chansons" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(cause inconnue" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "ID unique du périphérique :" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Révision du firmware :" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Révision du firmware :" #: src/jukebox.c:321 msgid "Product name:" msgstr "Nom du produit :" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Alimentation auxiliaire (AC ou USB) connectée" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Oui" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "Non" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "La batterie est en cours de chargement :" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Niveau de batterie :" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Propriétaire du jukebox" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Heure du jukebox :" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Nombre total d'octets sur le disque :" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Nombre total d'octets disponibles :" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Nombre total d'octets utilisés :" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Nombre total de chansons :" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Nombre de listes de chansons :" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Nombre de fichiers de données :" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Impossible de détecter le jukebox\n" "Erreur USB ?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "Aucun jukebox détecté sur le bus USB" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Type de jukebox inconnu" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "Impossible d'ouvrir le jukebox\n" #: src/jukebox.c:676 #, fuzzy msgid "Could not capture jukebox:\n" msgstr "Impossible de capturer le jukebox\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "Impossible de trouver une liste de chansons" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Récupération des chansons ..." #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Acquisition des chansons :\n" "Vous avez choisi un scan étendu des méta-données,\n" "ce qui va donc prendre plus longtemps." #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Récupération des listes de chansons ..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Récupération des fichiers de données ..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u chansons trouvées" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u fichiers de données trouvés" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "La piste ID était de zéro ! Valeur illégale !" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "La taille d'une chanson doit être supérieure à zéro !" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "Impossible de créer une liste de chansons" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "Impossible d'éffacer la liste de chansons" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "Impossible de renommer la liste de chansons" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "Impossible de trouver la liste de chansons à renommer" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "Impossible de trouver la piste depuis la liste de chansons" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Le répertoire n'a pas pu être créé.\n" "La raison la plus commune est que vous possédez un Jukebox Nomad 1\n" "qui est trop vieux pour supporter les répertoires." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Lecture des pistes du jukebox" #: src/player.c:448 msgid "Playing:" msgstr "Lecture :" #: src/player.c:474 msgid "STOP" msgstr "Stop" #: src/player.c:508 msgid "PREV" msgstr "Précédent" #: src/player.c:527 msgid "NEXT" msgstr "Suivant" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Créer une nouvelle liste de chansons" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Choisir un nom pour la nouvelle liste de chansons" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Editer la liste de chansons" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Editer le nom de cette liste de chansons" #: src/playlists.c:403 src/playlists.c:915 #, fuzzy msgid "Export playlist" msgstr "Editer la liste de chansons" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Exporter la liste de chansons vers ce fichier :" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Nouvelle liste de chansons" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Formater la liste de chansons en suivant cette chaîne :" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artiste, %t = Titre, %b = Album, %g = Genre, %n = Numéro de piste, %y = " "Année" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Créer une liste de chansons M3U (en présumant que le filtre lise " "correctement les noms de fichiers)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Créer une liste de chansons PLS (en présumant que le filtre lise " "correctement les noms de fichiers)" #: src/playlists.c:490 #, fuzzy msgid "Really delete selected playlist?" msgstr "Ajouter la sélection à la liste de chansons" #: src/playlists.c:628 msgid "and" msgstr "et" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transfert vers la bibliothèque du jukebox" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Ajouter les pistes vers la(es) liste(s) de chanson(s)" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Ajouter à la liste de chansons" #: src/playlists.c:778 msgid "Playlist" msgstr "Liste de chansons" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Nouvelle liste de chansons" #: src/playlists.c:891 #, fuzzy msgid "Shuffle playlist" msgstr "Nouvelle liste de chansons" #: src/playlists.c:899 msgid "Play playlist" msgstr "Jouer la liste de chansons" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Effacer la liste de chansons" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Effacer la piste de la sélection" #: src/prefs.c:431 msgid "Filenaming" msgstr "Nommage de fichier" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "" "Utiliser le nom de fichier original si présent dans les méta-données de la " "piste" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Cette chaîne est utilisée lorsque vous nommez des fichiers copiés depuis la " "bibliothèque du jukebox vers le système." #: src/prefs.c:451 msgid "Formatting string:" msgstr "Formatage de la chaîne" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "La méta-donnée du jukebox remplace les tags ID3 présents sur les fichiers " "transférés" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Efface tous les tags ID3 des fichiers transférés depuis le jukebox" #: src/prefs.c:477 #, fuzzy msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Inscrit un tag ID3v1 sur les fichiers transférés vers le disque dur" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Forcer l'utilisation du jeu de caractères unicode pour les tags ID3" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Affiche les répertoires cachés (.caché) du système" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Demande l'ajout de fichiers à la liste de chansons" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "" "Passe récursivement dans tous les répertoires sélectionnés lors du transfert" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "" "Force le système de fichiers local à utiliser les caractères ISO-8859-1" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "" "Essaie d'extraire des métadonnées du fichier musical depuis le chemin et le " "nom de fichier" #: src/prefs.c:493 #, fuzzy msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Lire les métadonnées étendues du jukebox (par exemple, nom de fichier " "original - lent sur les nouveaux périphériques)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Toujours lire le contenu du jukebox lors du démarrage" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Toujours synchoniser l'heure de votre ordinateur avec celui du jukebox au " "démarrage" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" "Au démarrage, retourner au dernier endroit où était le programme sur le " "disque dur" #, fuzzy #~ msgid "Retrieving metadata from jukebox" #~ msgstr "Récupération des informations du jukebox" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Editer le nom du possesseur du jukebox" #~ msgid "Power connected:" #~ msgstr "Alimentation connectée :" #~ msgid "Unable to read EAX settings" #~ msgstr "Impossible de lire les paramètres EAX" #~ msgid "Volume" #~ msgstr "Volume" #~ msgid "Equalizer" #~ msgstr "Egaliseur" #~ msgid "Equalizer active" #~ msgstr "Egaliseur actif" #~ msgid "Bass" #~ msgstr "Basse" #~ msgid "Mid" #~ msgstr "Milieu" #~ msgid "Treble" #~ msgstr "Aigu" #~ msgid "Midrange center frequency:" #~ msgstr "Fréquence du milieu :" #~ msgid "EAX effect:" #~ msgstr "Effet EAX :" #~ msgid "Headphone mode:" #~ msgstr "Mode casque :" #~ msgid "Rear speaker mode:" #~ msgstr "Mode du haut parleur arrière :" #~ msgid "Jukebox muted" #~ msgstr "Jukebox en mode silencieux" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "Inscrit un tag ID3v2 sur les fichiers transférés vers le disque dur" #~ msgid "Could not ping jukebox" #~ msgstr "Impossible de faire un ping vers le jukebox" gnomad2-2.9.6/po/fi.po0000664000076400007640000004540711512614631011400 00000000000000# Finnish messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # , fuzzy # # msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-05-30 09:38+0200\n" "PO-Revision-Date: 2004-01-20 10:13+0200\n" "Last-Translator: Pietari Hyvärinen \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gnomad2.desktop.in.h:1 #, fuzzy msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Työkal Creative Nomad Jukeboxien hallintaan" #: ../gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: ../gnomad2.desktop.in.h:3 #, fuzzy msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Nomad Jukebox asiakasohjelmisto" #: ../src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Ei voi Lopettaa! Jukebox on varattu!" #: ../src/gnomad2.c:124 ../src/gnomad2.c:150 msgid "Select jukebox" msgstr "Valitse jukeboxi" #: ../src/gnomad2.c:129 ../src/gnomad2.c:169 #, fuzzy msgid "Select jukebox to operate:" msgstr "Valitse käytettävä jukeboxi" #: ../src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "Ohjelma Creativen Jukeboxien hallintaan" #: ../src/gnomad2.c:218 msgid "translator_credits" msgstr "Pietari Hyvärinen 2004" #: ../src/gnomad2.c:264 ../src/data.c:42 ../src/data.c:113 ../src/xfer.c:51 #: ../src/xfer.c:150 ../src/xfer.c:366 ../src/playlists.c:226 #: ../src/playlists.c:242 ../src/playlists.c:452 ../src/playlists.c:571 #: ../src/playlists.c:589 ../src/playlists.c:607 ../src/playlists.c:828 msgid "Jukebox busy" msgstr "Jukebox varattu" #: ../src/gnomad2.c:275 ../src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Luetaan jukeboxin kokoelmaa" #: ../src/gnomad2.c:276 ../src/gnomad2.c:292 #, fuzzy msgid "Retrieveing metadata from jukebox" msgstr "Haetaan informaatiota jukeboxilta" #: ../src/gnomad2.c:325 ../src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox varattu -muutos hylätty" #: ../src/gnomad2.c:356 ../src/gnomad2.c:388 ../src/gnomad2.c:625 msgid "Set owner string" msgstr "Aseta omistajatieto" #: ../src/gnomad2.c:359 ../src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Muuta jukeboxin omistajaa" #: ../src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Tietoa ei voida näyttää! Jukebox on varattu" #: ../src/gnomad2.c:428 #, fuzzy msgid "Cannot retrieve jukebox information!" msgstr "Tietoja jukeboxista" #: ../src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Ei voitu varata sinistä väriä!\n" #. Shall not be shown! #: ../src/gnomad2.c:548 msgid "Quit" msgstr "Lopeta" #: ../src/gnomad2.c:557 msgid "File" msgstr "Tiedosto" #: ../src/gnomad2.c:583 msgid "Music transfer" msgstr "Musiikin siirto" #: ../src/gnomad2.c:596 msgid "Playlists" msgstr "Soittolista" #: ../src/gnomad2.c:604 msgid "Data transfer" msgstr "Tiedostonsiirto" #. Add prefs tab #: ../src/gnomad2.c:609 msgid "Preferences" msgstr "Asetukset" #. Shall not be shown! #: ../src/gnomad2.c:616 ../src/data.c:605 msgid "Rescan contents" msgstr "Päivitä sisältö" #. dialog = gtk_dialog_new(); #: ../src/gnomad2.c:632 ../src/jukebox.c:377 ../src/jukebox.c:379 #: ../src/jukebox.c:394 msgid "Jukebox information" msgstr "Tietoja jukeboxista" #: ../src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukeboxin kokoelma" #. Shall not be shown! #: ../src/gnomad2.c:647 msgid "About" msgstr "Tietoja" #: ../src/gnomad2.c:654 msgid "Help" msgstr "Apua" #: ../src/data.c:51 ../src/data.c:59 msgid "Transfering files from jukebox file storage" msgstr "Siirretään tiedostoja jukeboxista" #: ../src/data.c:77 msgid "Retrieving data files from Jukebox..." msgstr "Haetaan tiedostoja Jukeboxista..." #: ../src/data.c:121 ../src/data.c:129 msgid "Transfering files to jukebox file storage" msgstr "Siirretään tiedostoja jukeboxiin" #: ../src/data.c:148 msgid "Storing files in Jukebox file storage..." msgstr "Talletetaan tiedostoja Jukeboxiin" #: ../src/data.c:216 ../src/data.c:413 #, fuzzy msgid "Really delete selected files?" msgstr "Poista valitut" #: ../src/data.c:350 ../src/data.c:363 #, fuzzy msgid "Create a new folder" msgstr "Luo uusi soittolista" #: ../src/data.c:386 #, fuzzy msgid "Choose a name for the new folder:" msgstr "Anna soittolistan nimi:" #: ../src/data.c:504 ../src/xfer.c:607 msgid "Filename" msgstr "Tiedostonimi" #: ../src/data.c:520 ../src/xfer.c:563 msgid "Size (bytes)" msgstr "Koko (tavuja)" #. file ID number #. Track ID number #: ../src/data.c:532 ../src/xfer.c:621 msgid "ID" msgstr "ID" #: ../src/data.c:577 msgid "Rescan jukebox" msgstr "Päivitä jukeboxi" #: ../src/data.c:585 ../src/data.c:621 ../src/xfer.c:675 ../src/xfer.c:711 msgid "Transfer selected" msgstr "Siirrä valitut" #: ../src/data.c:593 ../src/data.c:629 ../src/xfer.c:691 ../src/xfer.c:743 msgid "Delete selected" msgstr "Poista valitut" #: ../src/data.c:613 msgid "Create folder" msgstr "" #: ../src/data.c:746 msgid "Jukebox data file window" msgstr "Jukeboxin tiedostoikkuna" #: ../src/xfer.c:60 ../src/xfer.c:68 msgid "Transfering tracks from jukebox library" msgstr "Siirretään kappaleita jukeboxista" #: ../src/xfer.c:87 msgid "Retrieving tracks from Jukebox..." msgstr "haetaan kappaleita jukeboxista" #: ../src/xfer.c:161 ../src/xfer.c:169 ../src/xfer.c:186 msgid "Transfering tracks to jukebox library" msgstr "Siirretään kappaleita jukeboxin kokoelmaan" #: ../src/xfer.c:188 msgid "Storing tracks in Jukebox library..." msgstr "Talletetaan kappaleita jukeboxin kokoelmaan..." #: ../src/xfer.c:272 ../src/xfer.c:377 ../src/playlists.c:611 #, fuzzy msgid "Really delete selected tracks?" msgstr "Poista valitut" #: ../src/xfer.c:492 ../src/playlists.c:897 msgid "Artist" msgstr "Esittäjä" #: ../src/xfer.c:508 ../src/playlists.c:909 msgid "Title" msgstr "Nimi" #: ../src/xfer.c:519 msgid "Album" msgstr "Albumi" #: ../src/xfer.c:530 msgid "Year" msgstr "Vuosi" #: ../src/xfer.c:541 msgid "Genre" msgstr "Tyylilaji" #: ../src/xfer.c:552 ../src/playlists.c:921 msgid "Length" msgstr "Pituus" #: ../src/xfer.c:574 msgid "Codec" msgstr "Codec" #: ../src/xfer.c:585 msgid "Track#" msgstr "Kappale#" #: ../src/xfer.c:596 ../src/editmeta.c:576 msgid "Protected" msgstr "Suojattu" #: ../src/xfer.c:667 msgid "Rescan directory metadata" msgstr "" #: ../src/xfer.c:683 ../src/xfer.c:735 msgid "Edit selected" msgstr "Muokkaa valittua" #: ../src/xfer.c:703 #, fuzzy msgid "Rescan jukebox contents" msgstr "Päivitä sisältö" #: ../src/xfer.c:719 msgid "Add selected to playlist" msgstr "Lisää valittu soittolistaan" #: ../src/xfer.c:727 msgid "Play selected" msgstr "Soita valittu" #: ../src/xfer.c:860 msgid "Jukebox library window" msgstr "Jukeboxin kokoelmaikkuna" #: ../src/editmeta.c:99 ../src/editmeta.c:581 msgid "YES" msgstr "KYLLÄ" #: ../src/editmeta.c:99 msgid "NO" msgstr "EI" #: ../src/editmeta.c:126 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Jukebox käytössä\n" "metadataa ei voi käsitellä nyt." #. First is artist, second is title #: ../src/editmeta.c:223 #, c-format msgid "Updating metadata on %s - %s" msgstr "Päivitetään metadata %s - %s" #: ../src/editmeta.c:330 ../src/editmeta.c:350 msgid "Edit jukebox file metadata" msgstr "Muokkaa jukeboxin tiedoston metadataa" #: ../src/editmeta.c:335 ../src/editmeta.c:353 msgid "Edit track metadata (ID3v2)" msgstr "Muokkaa kappaleen metadataa (ID3v2" #: ../src/editmeta.c:369 msgid "Artist:" msgstr "Esittäjä:" #: ../src/editmeta.c:393 msgid "Title:" msgstr "Kappale:" #: ../src/editmeta.c:414 msgid "Album:" msgstr "Albumi:" #: ../src/editmeta.c:436 msgid "Year:" msgstr "Vuosi:" #: ../src/editmeta.c:459 msgid "Genre:" msgstr "Tyylilaji:" #: ../src/editmeta.c:483 msgid "Length:" msgstr "Pituus:" #: ../src/editmeta.c:508 msgid "Track number:" msgstr "Kappalenumero:" #: ../src/editmeta.c:531 msgid "Original filename:" msgstr "Alkuperäinen tiedostonimi:" #: ../src/editmeta.c:554 #, fuzzy msgid "Folder:" msgstr "Codec:" #: ../src/editmeta.c:595 msgid "Codec:" msgstr "Codec:" #: ../src/editmeta.c:610 msgid "File size:" msgstr "Tiedoston koko:" #: ../src/editmeta.c:626 msgid "File ID:" msgstr "Tiedoston ID" #: ../src/editmeta.c:628 msgid "Path:" msgstr "Polku:" #: ../src/filesystem.c:462 #, fuzzy msgid "Getting file list from filesystem" msgstr "Siirretään tiedostoja jukeboxista" #: ../src/filesystem.c:490 ../src/filesystem.c:621 #, fuzzy msgid "Adding metadata to view" msgstr "Päivitetään metadata %s - %s" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 #, fuzzy msgid "Getting file metadata" msgstr "Muokkaa jukeboxin tiedoston metadataa" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 #, fuzzy msgid "Getting track metadata" msgstr "Muokkaa kappaleen metadataa (ID3v2" #: ../src/filesystem.c:739 msgid "Could not write preference file" msgstr "preferenssitiedostoa ei voida kirjoittaa" #: ../src/filesystem.c:942 #, fuzzy msgid "Could not write exported playlist" msgstr "Soittolistaa ei voi luoda" #: ../src/jukebox.c:150 #, fuzzy msgid "Could not open the device on the USB bus" msgstr "Kappaletta ei löytynyt soittolistasta" #: ../src/jukebox.c:154 msgid "(unknown cause)" msgstr "" #: ../src/jukebox.c:403 msgid "Unique device ID:" msgstr "Yksilöllinen laite ID:" #: ../src/jukebox.c:414 msgid "Firmware revision:" msgstr "Firmware versio:" #: ../src/jukebox.c:426 #, fuzzy msgid "Hardware revision:" msgstr "Firmware versio:" #: ../src/jukebox.c:438 msgid "Product name:" msgstr "tuotenimi:" #: ../src/jukebox.c:449 msgid "Auxilary power (AC or USB) connected:" msgstr "" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "Yes" msgstr "Kyllä" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "No" msgstr "Ei" #: ../src/jukebox.c:460 msgid "Battery is charging:" msgstr "" #: ../src/jukebox.c:474 msgid "Battery level:" msgstr "" #: ../src/jukebox.c:487 msgid "Jukebox owner:" msgstr "Jukeboxin omistaja:" #: ../src/jukebox.c:499 msgid "Time on jukebox:" msgstr "Kellonaika jukeboxissa:" #: ../src/jukebox.c:512 msgid "Total bytes on disk:" msgstr "Kokonaismäärä tavuja levyllä:" #: ../src/jukebox.c:525 msgid "Total free bytes available:" msgstr "Tavuja vapaana:" #: ../src/jukebox.c:538 msgid "Total bytes used:" msgstr "Tavuja käytössä:" #: ../src/jukebox.c:551 msgid "Number of songs:" msgstr "Kappaleita:" #: ../src/jukebox.c:563 msgid "Number of playlists:" msgstr "Soittolistoja:" #: ../src/jukebox.c:575 msgid "Number of datafiles:" msgstr "Muita tiedostoja:" #: ../src/jukebox.c:708 #, fuzzy msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Jukeboxeja ei voitu havaita\n" "USB virhe?" #: ../src/jukebox.c:723 msgid "No jukeboxes found on USB bus" msgstr "Yhtään jukeboxia ei löytynyt USB väylästä" #: ../src/jukebox.c:769 #, fuzzy msgid "Could not open jukebox:\n" msgstr "Jukeboxia ei voida avata" #: ../src/jukebox.c:784 #, fuzzy msgid "Could not capture jukebox:\n" msgstr "Jukeboxia ei voida valjastaa" #: ../src/jukebox.c:1070 msgid "Could not find playlist" msgstr "Soittolistaa ei löytynyt" #: ../src/jukebox.c:1300 msgid "Scanning songs..." msgstr "Selataan kappaleita..." #: ../src/jukebox.c:1301 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" #: ../src/jukebox.c:1302 msgid "Scanning playlists..." msgstr "Selataan soittolistoja..." #: ../src/jukebox.c:1303 msgid "Scanning datafiles..." msgstr "Selataan tiedostoja..." #: ../src/jukebox.c:1382 #, c-format msgid "%u songs scanned" msgstr "%u kappaletta selattu" #: ../src/jukebox.c:1550 #, c-format msgid "%u data files scanned" msgstr "%u tiedostoja selattu" #: ../src/jukebox.c:2272 msgid "Track ID was zero! Illegal value!" msgstr "" #: ../src/jukebox.c:2276 msgid "Song length must be greater than zero!" msgstr "" #: ../src/jukebox.c:2408 msgid "Could not create playlist" msgstr "Soittolistaa ei voi luoda" #: ../src/jukebox.c:2427 msgid "Could not delete playlist" msgstr "soittolistaa ei voi poistaa" #: ../src/jukebox.c:2461 msgid "Could not rename playlist" msgstr "soittolistaa ei voida uudelleennimetä" #: ../src/jukebox.c:2472 msgid "Could not locate playlist to rename!" msgstr "Uudelleennimettävää soittolistaa ei löytynyt!" #: ../src/jukebox.c:2637 msgid "Could not find the track in the playlist" msgstr "Kappaletta ei löytynyt soittolistasta" #: ../src/jukebox.c:3077 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" #: ../src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Soitetaan kappaleita jukeboxissa" #: ../src/player.c:448 msgid "Playing:" msgstr "Soitetaan:" #: ../src/player.c:474 msgid "STOP" msgstr "STOP" #: ../src/player.c:508 msgid "PREV" msgstr "EDELLINEN" #: ../src/player.c:527 msgid "NEXT" msgstr "SEURAAVA" #: ../src/playlists.c:165 ../src/playlists.c:178 msgid "Create a new playlist" msgstr "Luo uusi soittolista" #: ../src/playlists.c:203 msgid "Choose a name for the new playlist:" msgstr "Anna soittolistan nimi:" #: ../src/playlists.c:263 ../src/playlists.c:276 ../src/playlists.c:1013 msgid "Edit playlist" msgstr "Muokkaa soittolistaa" #: ../src/playlists.c:299 msgid "Edit the name for this playlist:" msgstr "muokkaa soittolistan nimeä:" #: ../src/playlists.c:464 ../src/playlists.c:478 ../src/playlists.c:1021 #, fuzzy msgid "Export playlist" msgstr "Muokkaa soittolistaa" #: ../src/playlists.c:501 msgid "Export playlist to this file:" msgstr "" #: ../src/playlists.c:514 #, fuzzy msgid "Unnamed playlist.txt" msgstr "Uusi soittolista" #: ../src/playlists.c:519 msgid "Format the playlist according to this string:" msgstr "" #. Don't translate the magic %-things! #: ../src/playlists.c:531 ../src/prefs.c:488 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a·=·Esittäjä,·%t·=Kappale,·%b·=·Albumi,·%g·=·Tyylilaji,·%n·=·Kappaleen " "numero,·%y·=·Vuosi" #: ../src/playlists.c:535 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" #: ../src/playlists.c:545 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" #: ../src/playlists.c:574 #, fuzzy msgid "Really delete selected playlist?" msgstr "Lisää valittu soittolistaan" #. and .. #: ../src/playlists.c:712 msgid "and" msgstr "ja" #: ../src/playlists.c:858 msgid "Transfer to jukebox library" msgstr "Siirrä jukeboxin kokoelmaan" #: ../src/playlists.c:859 ../src/playlists.c:866 msgid "Add tracks to playlist(s):" msgstr "Lisää kappale soittolistaan/listoihin" #: ../src/playlists.c:865 msgid "Add to playlist" msgstr "Lisää soittolistaan" #: ../src/playlists.c:884 msgid "Playlist" msgstr "Soittolista" #: ../src/playlists.c:979 ../src/playlists.c:989 ../src/playlists.c:1039 msgid "New playlist" msgstr "Uusi soittolista" #: ../src/playlists.c:997 #, fuzzy msgid "Shuffle playlist" msgstr "Uusi soittolista" #: ../src/playlists.c:1005 msgid "Play playlist" msgstr "Soita soittolista" #: ../src/playlists.c:1029 msgid "Delete playlist" msgstr "Poista soittolista" #: ../src/playlists.c:1047 msgid "Delete track from playlist" msgstr "poista kappale soittolistalta" #. Preference for filenaming #: ../src/prefs.c:457 msgid "Filenaming" msgstr "Tiedoston nimeäminen" #: ../src/prefs.c:461 msgid "Use original filename if present in metadata for the track" msgstr "" #: ../src/prefs.c:470 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Tätä käytetään tiedostojen nimeämiseen niitä tiedostojärjestelmään " "siirrettäessä" #: ../src/prefs.c:477 msgid "Formatting string:" msgstr "Muotoilu rivi:" #: ../src/prefs.c:497 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Jukeboxin metadata päällekirjoittaa olemassaolevat ID3 tagit siirretyistä " "tiedostoista" #: ../src/prefs.c:500 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Poista kaikki ID3 tagit jukeboxiin siirrettävistä tiedostoista" #: ../src/prefs.c:503 #, fuzzy msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Kirjoita ID3v1 tagit levyjärjestelmään siirrettäviin kappaleisiin" #: ../src/prefs.c:506 msgid "Force use of Unicode charset for ID3 tags" msgstr "" #: ../src/prefs.c:508 msgid "Display hidden (.foo) directories in filesystem" msgstr "Näytä levyjärjestelmän piilotetut (.foo) hakemistot" #: ../src/prefs.c:511 msgid "Ask to add files to a playlist" msgstr "Kysy lisätäänkö kappale soittolistaan" #: ../src/prefs.c:513 msgid "Recurse into any selected directories when transferring" msgstr "siirrettäessä käy läpi myös valitut alihakemistot" #: ../src/prefs.c:516 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Pakota paikallinen tiedostojärjestelmä käyttämään ISO-8859-1 merkistöä" #: ../src/prefs.c:519 msgid "Try to extract sound file metadata from path and filename" msgstr "Koita luoda kappaleen metadata polusta ja tiedostonnimestä" #: ../src/prefs.c:521 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" #: ../src/prefs.c:528 msgid "Automatically read in jukebox contents on startup" msgstr "" #: ../src/prefs.c:530 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" #: ../src/prefs.c:532 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" #: ../src/prefs.c:534 msgid "Enable turbo mode - uncheck this if you have problems" msgstr "" #~ msgid "Unknown jukebox type" #~ msgstr "Tuntematon jukeboxityyppi" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Muuta jukeboxin omistajaa" #~ msgid "Power connected:" #~ msgstr "Virta kytketty:" #~ msgid "Unable to read EAX settings" #~ msgstr "EAX asetuksia ei voida lukea" #~ msgid "Volume" #~ msgstr "Äänenvoimakkuus" #~ msgid "Equalizer" #~ msgstr "Ekvalisaattori" #~ msgid "Equalizer active" #~ msgstr "Ekvalisaattori Käytössä" #~ msgid "Bass" #~ msgstr "Basso" #~ msgid "Mid" #~ msgstr "Keski" #~ msgid "Treble" #~ msgstr "Diskantti" #~ msgid "Midrange center frequency:" #~ msgstr "Keskialueen keskitaajuus:" #~ msgid "EAX effect:" #~ msgstr "EAX efekti:" #~ msgid "Headphone mode:" #~ msgstr "Kuuloke moodi:" #~ msgid "Rear speaker mode:" #~ msgstr "Taka-kaiutin moodi:" #~ msgid "Jukebox muted" #~ msgstr "Jukeboxi mykistetty" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "Kirjoita ID3v2 tagit levyjärjestelmään siirrettäviin kappaleisiin" #~ msgid "Could not ping jukebox" #~ msgstr "Jukeboxi ei vastaa pingiin" gnomad2-2.9.6/po/Makefile.in.in0000644000000000000000000001537711524510624013053 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info ctags tags CTAGS TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gnomad2-2.9.6/po/pl.po0000664000076400007640000004461711512614631011417 00000000000000# Polish translation for gnomad2 # Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006 # This file is distributed under the same license as the gnomad2 package. # FIRST AUTHOR , 2006. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gnomad2\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-08-17 10:01+0000\n" "Last-Translator: jaceks \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "" "Oprogramowanie do transferu plikow do/z odtwarzaczy Creative Nomad/Zen i " "Dell DJs" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Nomad/Zen Jukebox/Dell DJ Client" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Zakończenie niemożliwe! Urządzenie pracuje!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Wybierz urządzenie" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Wybierz urządzenie:" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Program do komunikacji z\n" "odtwarzaczami firmy Creative" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "Jacek Sienkiewicz " #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Urządzenie pracuje" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Odczytuje kolekcję odtwarzacza" #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Odczytuję metadane z urządzenia" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Urządzenie pracuje - zmiany nie poczynione" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Ustaw informację o właścicielu" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Edytuj informację o właścicielu tego urządzenia:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Nie można zobaczyć informacji! Urządzenie pracuje!" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Nie można odczytać informacji z odtwarzacza!" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Nie można zaalokować niebieskiego koloru\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Koniec" #: src/gnomad2.c:557 msgid "File" msgstr "Plik" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Transfer muzyki" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Listy odtwarzania" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Transfer danych" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Ustawienia" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Ponowne odczytaj zawartości" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Dane odtwarzacza" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Kolekcja odtwarzacza" #: src/gnomad2.c:647 msgid "About" msgstr "O programie" #: src/gnomad2.c:654 msgid "Help" msgstr "Pomoc" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Transfer plików z pamięci masowej urządzenia" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Odczytywanie informacji o plikach z urządzenia..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Transfer plików do pamięci masowej urządzenia" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Składowanie plików w pamięci masowej urządzenia" #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "Czy na pewno chcesz skasować wybrane pliki?" #: src/data.c:300 msgid "Create a new folder" msgstr "Utwórz nowy katalog" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Podaj nazwę nowego katalogu" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Nazwa pliku" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Wielkość (w bajtach)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Przeskanuj ponownie urządzenie" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transferuj wybrane" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Skasuj wybrane" #: src/data.c:533 msgid "Create folder" msgstr "Utwórz katalog" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Okno plików urządzenia" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Przenoszenie utworów z kolekcji urządzenia" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Odczyt utworów z urządzenia..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Przenoszenie utworów do kolekcji urządzenia" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Zapisywanie utworów kolekcji urządzenia..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "Czy na pewno chcesz skasować wybrane ścieżki?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Wykonawca" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Tytuł" #: src/xfer.c:484 msgid "Album" msgstr "Tytuł płyty" #: src/xfer.c:495 msgid "Year" msgstr "Rok" #: src/xfer.c:506 msgid "Genre" msgstr "Kategoria" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Długość" #: src/xfer.c:539 msgid "Codec" msgstr "Kodek" #: src/xfer.c:550 msgid "Track#" msgstr "Numer utworu" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Chroniony" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Ponowny odczyt metadanych" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Edytuj wybrane" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Ponownie odczytaj zawartość odtwarzacza" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Dodaj wybrane do listy odtwarzania" #: src/xfer.c:692 msgid "Play selected" msgstr "Odtwarzaj wybrane" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Okno kolekcji urządzenia" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "TAK" #: src/editmeta.c:97 msgid "NO" msgstr "NIE" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Urządzenie pracuje.\n" "Edycja metadanych nie jest aktualnie możliwa." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Uaktualnianie metadanych w %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Edytuj plik metadanych urządzenia" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Edytuj metadane ścieżki (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Wykonawca:" #: src/editmeta.c:368 msgid "Title:" msgstr "Tytuł:" #: src/editmeta.c:389 msgid "Album:" msgstr "Album:" #: src/editmeta.c:411 msgid "Year:" msgstr "Rok:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Kategoria:" #: src/editmeta.c:458 msgid "Length:" msgstr "Długość:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Numer utworu:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Orginalna nazwa pliku:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Katalog:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Kodek:" #: src/editmeta.c:585 msgid "File size:" msgstr "Rozmiar pliku:" #: src/editmeta.c:601 msgid "File ID:" msgstr "ID pliku:" #: src/editmeta.c:603 msgid "Path:" msgstr "Ścieżka:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Odczytywanie listy plików" #: src/filesystem.c:421 msgid "Adding metadata to view" msgstr "Dodawanie metadanych do widoku" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Pobieranie metadanych pliku" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Pobieranie metadanych utworu" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "Nie mogę zapisać pliku konfiguracyjnego" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "Nie mogę zapisać exportowanej listy odtwarzania" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "Nie moge połączyć sie z urządzeniem na złaczu USB" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(nieznany powód)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "Unikalny ID urządzenia:" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Wersja firmware'u:" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Wersja sprzetu:" #: src/jukebox.c:321 msgid "Product name:" msgstr "Nazwa produktu:" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Zewnetrzne zasilanie (zasilacz lub USB) podłączone:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Tak" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "Nie" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "Bateria się ładuje:" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Poziom naładowania baterii:" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Właściciel odtwarzacza:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Czas odtwarzacza:" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Wielkość pamięci masowej w bajtach (megabajtach):" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Ilość wolnego miejsca w bajtach (megabajtach):" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Ilość zajętego miejsca w bajtach (megabajtach):" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Liczba utworów:" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Ilość list odtwarzania:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Ilość plików danych:" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Nie mogę znaleźć urządzeń\n" "Problem z USB?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "Nie znaleziono urządzenia na złączu USB" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Nieznane urządzenie" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "Nie mogę czytać z urządzenia:\n" #: src/jukebox.c:676 msgid "Could not capture jukebox:\n" msgstr "Nie mogę przechwycić polączenia z odtwarzaczem:\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "Nie znaleziono listy odtwarzania" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Odczytywanie utworów..." #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Odczytywanie utworów:\n" "Wybrałeś rozszerzone odczytywanie metadanych,\n" " dlatego odczyt może być bardzo wolny" #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Odczytywanie list odtwarzania..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Odczytywanie plików danych..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "Ilość odczytanych utworów: %u" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "Ilość odczytanych plików danych: %u" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "ID ścieżki był zerowy! Niepoprawna wartość!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "Długość utworu musi być wieksza niż zero!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "Nie można stworzyć listy odtwarzania" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "Nie można skasować listy odtwarzania" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "Nie można zmienić nazwy listy odtwarzania" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "Nie można odnaleźć listy odtwarzania do zmiany nazwy!" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "Nie można znaleźć ścieżki z listy odtwarzania" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Katalog nie może zostać utworzony.\n" "Być może używasz Nomad Jukebox 1\n" "który jest za stary i nie pozwala na tworzenie folderów." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Odtwarzanie utworów na urządzeniu" #: src/player.c:448 msgid "Playing:" msgstr "Odtwarzanie:" #: src/player.c:474 msgid "STOP" msgstr "STOP" #: src/player.c:508 msgid "PREV" msgstr "POPRZEDNI" #: src/player.c:527 msgid "NEXT" msgstr "NASTĘPNY" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Utwórz nową listę odtwarzania" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Podaj nazwę nowej listy odtwarzania:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Edytuj listę odtwarzania" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Edytuj nazwę listy odtwarzania" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Eksportuj listę odtwarzania" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Eksportuj listę odtwarzania do pliku:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Nienazwany playlist.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Formatuj liste odtwarzania zgodnie ze stringiem formatującym:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Wykonawca, %t = Tytuł, %b = Album, %g = Kategoria, %n = Numer ścieżki, " "%y = Rok" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Utwórz liste odtwarzania M3U (zakładając że filtry formatuące wygenerują " "poprawne nazwy plików)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Utwórz liste odtwarzania PLS (zakładając że filtry formatuące wygenerują " "poprawne nazwy plików)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "Czy na pewno chcesz skasowac zaznaczoną listę odtwarzania?" #: src/playlists.c:628 msgid "and" msgstr "i" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transfer do kolekcji urządzenia" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Dodaj ścieżki do list(y) odtwarzania:" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Dodaj do listy odtwarzania" #: src/playlists.c:778 msgid "Playlist" msgstr "Lista odtwarzania" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Nowa lista odtwarzania" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Wymieszaj listę odtwarzania" #: src/playlists.c:899 msgid "Play playlist" msgstr "Odtwarzaj listę odtwarzania" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Skasuj listę odtwarzania" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Skasuj utwory z listy odtwarzania" #: src/prefs.c:431 msgid "Filenaming" msgstr "Nazewnictwo plików" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "Użyj orginalnej nazwy pliku jeśli obecna w metadanych utworu" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Podczas kopiowania plików z kolekcji do lokalnego filesystemu bedzie użyta " "ta nazwa." #: src/prefs.c:451 msgid "Formatting string:" msgstr "String formatujący:" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metadane z urządzenia nadpiszą informacje tagów ID3 w transferowanych plikach" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Usuń wszystkie ID3 tagi z plików przenoszonych do odtwarzacza" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Zapisz tagi ID3v1/v2 w plikach transferowanych na twardy dysk" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Wymuś użycie zestawu znaków Unicode dla tagów ID3" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Wyświetlaj ukryte (.foo) kartoteki systemu plików" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Potwierdz dodanie plików do listy odtwarzania" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "Kopiuj również zawartość podkatalogow podczas transferu" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Wymuś użycie zestawu znaków ISO-8859-1 dla lokalnego systemu plików" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "Spróbuj zgadnąć metainformacje na podstawie ścieżki i nazwy pliku" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Czytaj rozszerzone metadane z urządzenia (np. orginalną nazwę pliku - wolne " "na nowych urządzeniach)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Automatycznie czytaj zawartość urządzenia przy starcie programu" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Automatycznie zsynchronizuj czas urządzenia z czasem komputera przy starcie " "programu" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" "Na starcie rozpocznij w katalogu w ktorym zakonczyłeś pracy przy poprzednim " "uruchomieniu programu"gnomad2-2.9.6/po/de.po0000664000076400007640000004560011512614631011365 00000000000000# Swedish messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To:\n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-04-16 14:52+0000\n" "Last-Translator: Simon Wenner \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "" "Ein Programm zur Verwaltung von Creative Nomad/Zen Jukeboxen und Dell DJ's" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Klient für Nomad/Zen Jukeboxen und Dell DJ's" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Kann nicht beendet werden! Die Jukebox ist beschäftigt!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Jukebox auswählen" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Wählen sie eine Jukebox aus:" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Ein Programm für die Kommunikation mit \n" "Creative Jukeboxen" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "Fabian Sturm Simon Wenner " #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Jukebox beschäftigt" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Einlesen der Jukebox Bibliothek" #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Empfange Metadaten von der Jukebox" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox beschäftigt - Änderung verworfen" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Setze Besitzer Namen" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Besitzers dieser Jukebox ändern:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Kann Information nicht anzeigen! Jukebox ist beschäftigt" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Jukebox Information kann nicht gelesen werden!" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Konnte blaue Farbe nicht reservieren!\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Beenden" #: src/gnomad2.c:557 msgid "File" msgstr "Datei" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Musikübertragung" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Playlisten" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Datenübertragung" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Einstellungen" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Inhalt neu einlesen" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Jukebox Information" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukebox Bibliothek" #: src/gnomad2.c:647 msgid "About" msgstr "Über" #: src/gnomad2.c:654 msgid "Help" msgstr "Hilfe" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Übertrage Dateien von der Jukebox auf Festplatte" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Empfange Daten-Dateien von der Jukebox..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Übertrage Dateien von Festplatte auf die Jukebox" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Speichere Dateien auf die Jukebox Festplatte..." #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "Ausgewählte Dateien wirklich löschen?" #: src/data.c:300 msgid "Create a new folder" msgstr "Einen neuen Ordner anlegen" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Wähle einen Namen für den neuen Ordner:" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Dateiname" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Größe (bytes)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Jukebox erneut einlesen" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Übertrage ausgewählte" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Lösche ausgewählte" #: src/data.c:533 msgid "Create folder" msgstr "Ordner anlegen" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Jukebox Daten-Datei Fenster" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Übertrage Titel von der Jukebox Bibliothek" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Empfange Titel von der Jukebox..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Sende Titel an die Jukebox Bibliothek" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Speichere Titel in der Jukebox Bibliothek..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "Ausgewählte Titel löschen?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Interpret" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Titel" #: src/xfer.c:484 msgid "Album" msgstr "Album" #: src/xfer.c:495 msgid "Year" msgstr "Jahr" #: src/xfer.c:506 msgid "Genre" msgstr "Genre" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Länge" #: src/xfer.c:539 msgid "Codec" msgstr "Codec" #: src/xfer.c:550 msgid "Track#" msgstr "Title#" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Geschützt" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Verzeichnis Metadaten neu einlesen" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Bearbeite ausgewählte" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Jukebox Inhalte neu einlesen" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Ausgewählte einer Playliste hinzufügen" #: src/xfer.c:692 msgid "Play selected" msgstr "Spiele ausgewählte" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Jukebox Bibliotheksfenster" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "JA" #: src/editmeta.c:97 msgid "NO" msgstr "NEIN" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Jukebox ist beschäftigt.\n" "Metadaten können jetzt nicht bearbeitet werden." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Aktualisiere Metadaten von %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Bearbeite Jukebox Datei Metadaten" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Bearbeite Titel Metadaten (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Interpret:" #: src/editmeta.c:368 msgid "Title:" msgstr "Titel:" #: src/editmeta.c:389 msgid "Album:" msgstr "Album:" #: src/editmeta.c:411 msgid "Year:" msgstr "Jahr:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Genre:" #: src/editmeta.c:458 msgid "Length:" msgstr "Länge:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Titel Nummer:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Original Dateiname:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Ordner:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Codec:" #: src/editmeta.c:585 msgid "File size:" msgstr "Datei Größe:" #: src/editmeta.c:601 msgid "File ID:" msgstr "Datei ID:" #: src/editmeta.c:603 msgid "Path:" msgstr "Pfad:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Übertrage Dateiliste von der Festplatte" #: src/filesystem.c:421 #, fuzzy msgid "Adding metadata to view" msgstr "Metadaten zur Ansicht hinzufügen" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Empfange Datei Metadaten" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Empfange Titel Metadaten" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "Konnte Einstellungsdatei nicht schreiben" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "Konnte exportierte Playliste nicht erstellen" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "Konnte das USB Gerät nicht finden" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(unbekannte Ursache)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "Eindeutige Gerätenummer:" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Firmware Version:" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Hardware Version:" #: src/jukebox.c:321 msgid "Product name:" msgstr "Produkt Name:" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Ladegerät (AC oder USB) verbunden:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Ja" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "Nein" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "Batterie ladet auf:" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Batterie-Füllstand:" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Jukebox Besitzer:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Zeit auf der Jukebox:" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Gesamtzahl Bytes auf der Festplatte:" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Gesamtzahl freier Bytes verfügbar:" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Gesamtzahl verwendeter Bytes:" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Anzahl an Liedern:" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Anzahl an Playlisten:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Anzahl an Daten-Dateien" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Konnte Jukebox Suche nicht ausführen\n" "USB Fehler?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "Keine Jukeboxen auf dem USB Bus gefunden" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Unbekannter Jukebox Typ" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "Konnte Jukebox nicht öffnen\n" #: src/jukebox.c:676 msgid "Could not capture jukebox:\n" msgstr "Konnte nicht zur Jukebox verbinden\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "Konnte Playliste nicht finden" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Einlesen der Lieder..." #: src/jukebox.c:1075 #, fuzzy msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Lese Lied ein:\n" "Sie haben die erweiterte Metadaten Abfrage aktiviert,\n" "was das Scannen sehr langsam macht." #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Einlesen der Playlisten..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Einlesen der Daten-Dateien..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u Lieder eingelesen" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u Daten-Dateien eingelesen" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "Lied ID war null! Unzulässiger Wert!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "Lied Länge muss grösser als null sein!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "Konnte Playliste nicht erstellen" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "Konnte Playliste nicht löschen" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "Konnte Playliste nicht umbenennen" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "Konnte Playliste zum Umbenennen nicht finden" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "Konnte den Titel nicht in der Playliste finden" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "Der Ordner konnte nicht erstellt werden.\n" "Vermutlich verwendest du eine Nomad Jukebox 1,\n" "welche keine Ordner unterstützt." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Spiele Titel auf der Jukebox" #: src/player.c:448 msgid "Playing:" msgstr "Spiele:" #: src/player.c:474 msgid "STOP" msgstr "STOP" #: src/player.c:508 msgid "PREV" msgstr "VORHERIGES" #: src/player.c:527 msgid "NEXT" msgstr "NÄCHSTES" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Erstelle eine neue Playliste" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Wähle einen Namen für die neue Playliste:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Bearbeite Playliste" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Bearbeite den Namen dieser Playliste:" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Playliste exportieren" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Playliste in diese Datei exportieren:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Unbenannte playlist.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Formatiere die Playliste entsprechend dieser Zeichenkette:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Interpret, %t = Titel, %b = Album, %g = Genre, %n = Titel Nummer, %y = " "Jahr" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Erstelle eine M3U Playliste (in der Annahme, dass der Format Filter die " "korrekten Dateinamen setzt)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Erstelle eine PLS Playliste (in der Annahme, dass der Format Filter die " "korrekten Dateinamen setzt)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "Ausgewählte Playliste wirklich löschen?" #: src/playlists.c:628 msgid "and" msgstr "und" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Übertrage in die Jukebox Bibliothek" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Titel zu Playliste(n) hinzufügen:" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Zur Playliste hinzufügen" #: src/playlists.c:778 msgid "Playlist" msgstr "Playliste" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Neue Playliste" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Mische Playlist" #: src/playlists.c:899 msgid "Play playlist" msgstr "Spiele Playliste" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Lösche Playliste" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Lösche Titel aus der Playliste" #: src/prefs.c:431 msgid "Filenaming" msgstr "Dateibenennung" #: src/prefs.c:435 #, fuzzy msgid "Use original filename if present in metadata for the track" msgstr "" "Verwende origianl Dateiname falls er mit den Metadaten des Songs " "übereinstimmt." #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Dieser Zeichenkette wird verwendet bei der Benennung von Dateien die von der " "Jukebox auf die Festplatte übertragen werden." #: src/prefs.c:451 msgid "Formatting string:" msgstr "Formattierungs Zeichenkette" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metadata von der Jukebox überschreibt vorhandene ID3 Tags von übertragenen " "Dateien" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Lösche alle ID3 Tags von zur Jukebox übertragenen Dateien" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Schreibe ID3v1/v2 Tags in die zur Festplatte übertragenen Dateien" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Erzwinge Unicode Zechensatz für ID3 Tags" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Zeige versteckte (.foo) Verzeichnisse im Dateisystem" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Frage nach um Dateien zu einer Playliste hinzuzufügen" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "Wechsle in jedes ausgewählte Verzeichnis bei der Übertragung" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Erzwinge lokales Dateisystem zum ISO-8859-1 Zeichensatz" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "" "Versuche Musik-Datei Metadata aus dem Pfad und Dateinamen zu extrahieren" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Lese erweiterte Metadaten von der Jukebox (z. B. original Dateiname - " "langsam bei neueren Geräten)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Jukebox Inhalte beim Start automatisch einlesen" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Synchronisiere beim Start die Uhrzeit der Jukebox mit derjenigen auf dem " "Computer" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "Springe beim Neustart in das zuletzt ausgewählte Verzeichnis" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Ändern des Besitzers dieser Jukebox:" #~ msgid "Power connected:" #~ msgstr "Netzgerät angeschlossen" #~ msgid "Unable to read EAX settings" #~ msgstr "Konnte EAX Einstellungen nicht lesen" #~ msgid "Volume" #~ msgstr "Lautstärke" #~ msgid "Equalizer" #~ msgstr "Equalizer" #~ msgid "Equalizer active" #~ msgstr "Equalizer aktiv" #~ msgid "Bass" #~ msgstr "Bass" #~ msgid "EAX effect:" #~ msgstr "EAX Effekt" #~ msgid "Headphone mode:" #~ msgstr "Kopfhöhrer Modus:" #~ msgid "Rear speaker mode:" #~ msgstr "Hinterer Lautsprecher Modus:" #~ msgid "Jukebox muted" #~ msgstr "Jukebox stumm geschaltet" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "Schreibe ID3v2 Tags in zur Festplatte übertragenen Dateien" #~ msgid "Could not ping jukebox" #~ msgstr "Konnte Jukebox nixht ansprechen"gnomad2-2.9.6/po/nb.po0000664000076400007640000004561311512614631011400 00000000000000# Norwegian messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2006-05-30 09:38+0200\n" "PO-Revision-Date: 2004-06-05 15:05+0100\n" "Last-Translator: Stian Håklev \n" "Language-Team: Norweigan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../gnomad2.desktop.in.h:1 #, fuzzy msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Et verktøy for å�håndtere Creative Nomad Jukeboxer" #: ../gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: ../gnomad2.desktop.in.h:3 #, fuzzy msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Klient for Nomad Jukebox" #: ../src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Kan ikke avslutte! Jukeboxen er opptatt!" #: ../src/gnomad2.c:124 ../src/gnomad2.c:150 msgid "Select jukebox" msgstr "Velg Jukebox" #: ../src/gnomad2.c:129 ../src/gnomad2.c:169 #, fuzzy msgid "Select jukebox to operate:" msgstr "Velg Jukeboxen som du vil jobbe med" #: ../src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "Et program for å kommunisere med Creatives Jukeboxer" #: ../src/gnomad2.c:218 msgid "translator_credits" msgstr "Stian Håklev " #: ../src/gnomad2.c:264 ../src/data.c:42 ../src/data.c:113 ../src/xfer.c:51 #: ../src/xfer.c:150 ../src/xfer.c:366 ../src/playlists.c:226 #: ../src/playlists.c:242 ../src/playlists.c:452 ../src/playlists.c:571 #: ../src/playlists.c:589 ../src/playlists.c:607 ../src/playlists.c:828 msgid "Jukebox busy" msgstr "Jukeboxen er opptatt" #: ../src/gnomad2.c:275 ../src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Leser inn jukeboxsamlingen" #: ../src/gnomad2.c:276 ../src/gnomad2.c:292 #, fuzzy msgid "Retrieveing metadata from jukebox" msgstr "Henter fra jukeboxen" #: ../src/gnomad2.c:325 ../src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukeboxen er opptatt - forandringen blir ignorert" #: ../src/gnomad2.c:356 ../src/gnomad2.c:388 ../src/gnomad2.c:625 msgid "Set owner string" msgstr "Sett eierstrengen" #: ../src/gnomad2.c:359 ../src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Endre jukeboxens eier" #: ../src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Kan ikke vise informasjonen! Jukeboxen er opptatt!" #: ../src/gnomad2.c:428 #, fuzzy msgid "Cannot retrieve jukebox information!" msgstr "Informasjon om jukeboxen" #: ../src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Kunne ikke reservere den bl�fargen!\n" #. Shall not be shown! #: ../src/gnomad2.c:548 msgid "Quit" msgstr "Avslutt" #: ../src/gnomad2.c:557 msgid "File" msgstr "Fil" #: ../src/gnomad2.c:583 msgid "Music transfer" msgstr "Musikkoverføring" #: ../src/gnomad2.c:596 msgid "Playlists" msgstr "Spillelister" #: ../src/gnomad2.c:604 msgid "Data transfer" msgstr "Dataoverføring" #. Add prefs tab #: ../src/gnomad2.c:609 msgid "Preferences" msgstr "Innstillinger" #. Shall not be shown! #: ../src/gnomad2.c:616 ../src/data.c:605 msgid "Rescan contents" msgstr "Les inn innholdet igjen" #. dialog = gtk_dialog_new(); #: ../src/gnomad2.c:632 ../src/jukebox.c:377 ../src/jukebox.c:379 #: ../src/jukebox.c:394 msgid "Jukebox information" msgstr "Informasjon om jukeboxen" #: ../src/gnomad2.c:641 msgid "Jukebox library" msgstr "Jukeboxsamling" #. Shall not be shown! #: ../src/gnomad2.c:647 msgid "About" msgstr "Om" #: ../src/gnomad2.c:654 msgid "Help" msgstr "Hjelp" #: ../src/data.c:51 ../src/data.c:59 msgid "Transfering files from jukebox file storage" msgstr "Overfører filer fra jukeboxens fillagringsområde" #: ../src/data.c:77 msgid "Retrieving data files from Jukebox..." msgstr "Henter datafiler fra jukeboxen..." #: ../src/data.c:121 ../src/data.c:129 msgid "Transfering files to jukebox file storage" msgstr "Overfører filer til jukeboxens fillagringsområde" #: ../src/data.c:148 msgid "Storing files in Jukebox file storage..." msgstr "Lagrer filer i jukeboxens fillagringsområde" #: ../src/data.c:216 ../src/data.c:413 #, fuzzy msgid "Really delete selected files?" msgstr "Slett valgte filer" #: ../src/data.c:350 ../src/data.c:363 #, fuzzy msgid "Create a new folder" msgstr "Skape en ny spilleliste" #: ../src/data.c:386 #, fuzzy msgid "Choose a name for the new folder:" msgstr "Velg et navn for den nye spillelista" #: ../src/data.c:504 ../src/xfer.c:607 msgid "Filename" msgstr "Filnavn" #: ../src/data.c:520 ../src/xfer.c:563 msgid "Size (bytes)" msgstr "Størrelse (i byte)" #. file ID number #. Track ID number #: ../src/data.c:532 ../src/xfer.c:621 msgid "ID" msgstr "ID" #: ../src/data.c:577 msgid "Rescan jukebox" msgstr "Les om innholdet" #: ../src/data.c:585 ../src/data.c:621 ../src/xfer.c:675 ../src/xfer.c:711 msgid "Transfer selected" msgstr "Overfør valgte filer" #: ../src/data.c:593 ../src/data.c:629 ../src/xfer.c:691 ../src/xfer.c:743 msgid "Delete selected" msgstr "Slett valgte filer" #: ../src/data.c:613 msgid "Create folder" msgstr "" #: ../src/data.c:746 msgid "Jukebox data file window" msgstr "Datafiler i jukeboxen" #: ../src/xfer.c:60 ../src/xfer.c:68 msgid "Transfering tracks from jukebox library" msgstr "Overfører musikkspor fra jukeboxens samling" #: ../src/xfer.c:87 msgid "Retrieving tracks from Jukebox..." msgstr "Henter musikkspor fra jukeboxen..." #: ../src/xfer.c:161 ../src/xfer.c:169 ../src/xfer.c:186 msgid "Transfering tracks to jukebox library" msgstr "Overfører musikkspor til jukeboxen" #: ../src/xfer.c:188 msgid "Storing tracks in Jukebox library..." msgstr "Lagrer musikkspor i jukeboxens samling" #: ../src/xfer.c:272 ../src/xfer.c:377 ../src/playlists.c:611 #, fuzzy msgid "Really delete selected tracks?" msgstr "Slett valgte filer" #: ../src/xfer.c:492 ../src/playlists.c:897 msgid "Artist" msgstr "Artist" #: ../src/xfer.c:508 ../src/playlists.c:909 msgid "Title" msgstr "Tittel" #: ../src/xfer.c:519 msgid "Album" msgstr "Album" #: ../src/xfer.c:530 msgid "Year" msgstr "År" #: ../src/xfer.c:541 msgid "Genre" msgstr "Sjanger" #: ../src/xfer.c:552 ../src/playlists.c:921 msgid "Length" msgstr "Lengde" #: ../src/xfer.c:574 msgid "Codec" msgstr "Codec" #: ../src/xfer.c:585 msgid "Track#" msgstr "Spor nr." #: ../src/xfer.c:596 ../src/editmeta.c:576 msgid "Protected" msgstr "Beskyttet" #: ../src/xfer.c:667 msgid "Rescan directory metadata" msgstr "" #: ../src/xfer.c:683 ../src/xfer.c:735 msgid "Edit selected" msgstr "Endre valgte" #: ../src/xfer.c:703 #, fuzzy msgid "Rescan jukebox contents" msgstr "Les inn innholdet igjen" #: ../src/xfer.c:719 msgid "Add selected to playlist" msgstr "Legg valgte til i spillelista" #: ../src/xfer.c:727 msgid "Play selected" msgstr "Spill valgte" #: ../src/xfer.c:860 msgid "Jukebox library window" msgstr "Jukeboxens samling" #: ../src/editmeta.c:99 ../src/editmeta.c:581 msgid "YES" msgstr "JA" #: ../src/editmeta.c:99 msgid "NO" msgstr "NEI" #: ../src/editmeta.c:126 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "Kan ikke endre metadata akkurat nå." #. First is artist, second is title #: ../src/editmeta.c:223 #, c-format msgid "Updating metadata on %s - %s" msgstr "Endrer metadata p�%s - %s" #: ../src/editmeta.c:330 ../src/editmeta.c:350 msgid "Edit jukebox file metadata" msgstr "Endrer metadata på�jukeboxen" #: ../src/editmeta.c:335 ../src/editmeta.c:353 msgid "Edit track metadata (ID3v2)" msgstr "Endre sangens metadata (ID3V2)" #: ../src/editmeta.c:369 msgid "Artist:" msgstr "Artist:" #: ../src/editmeta.c:393 msgid "Title:" msgstr "Tittel:" #: ../src/editmeta.c:414 msgid "Album:" msgstr "Album:" #: ../src/editmeta.c:436 msgid "Year:" msgstr "År:" #: ../src/editmeta.c:459 msgid "Genre:" msgstr "Sjanger:" #: ../src/editmeta.c:483 msgid "Length:" msgstr "Lengde:" #: ../src/editmeta.c:508 msgid "Track number:" msgstr "Spor nr.:" #: ../src/editmeta.c:531 msgid "Original filename:" msgstr "Opprinnelig filnavn:" #: ../src/editmeta.c:554 #, fuzzy msgid "Folder:" msgstr "Codec:" #: ../src/editmeta.c:595 msgid "Codec:" msgstr "Codec:" #: ../src/editmeta.c:610 msgid "File size:" msgstr "Filstørrelse:" #: ../src/editmeta.c:626 msgid "File ID:" msgstr "Fil-ID:" #: ../src/editmeta.c:628 msgid "Path:" msgstr "Sti:" #: ../src/filesystem.c:462 #, fuzzy msgid "Getting file list from filesystem" msgstr "Overfører filer fra jukeboxens fillagringsområde" #: ../src/filesystem.c:490 ../src/filesystem.c:621 #, fuzzy msgid "Adding metadata to view" msgstr "Endrer metadata p�%s - %s" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 #, fuzzy msgid "Getting file metadata" msgstr "Endrer metadata på�jukeboxen" #: ../src/filesystem.c:557 ../src/filesystem.c:558 ../src/filesystem.c:581 #: ../src/filesystem.c:592 #, fuzzy msgid "Getting track metadata" msgstr "Endre sangens metadata (ID3V2)" #: ../src/filesystem.c:739 msgid "Could not write preference file" msgstr "Kunne ikke skrive innstillingsfilen" #: ../src/filesystem.c:942 #, fuzzy msgid "Could not write exported playlist" msgstr "Kunne ikke skape spilleliste" #: ../src/jukebox.c:150 #, fuzzy msgid "Could not open the device on the USB bus" msgstr "Kunne ikke finne sporet i spillelista" #: ../src/jukebox.c:154 msgid "(unknown cause)" msgstr "" #: ../src/jukebox.c:403 msgid "Unique device ID:" msgstr "Unik enhets-ID:" #: ../src/jukebox.c:414 msgid "Firmware revision:" msgstr "Firmware-versjon:" #: ../src/jukebox.c:426 #, fuzzy msgid "Hardware revision:" msgstr "Firmware-versjon:" #: ../src/jukebox.c:438 msgid "Product name:" msgstr "Produktnavn:" #: ../src/jukebox.c:449 msgid "Auxilary power (AC or USB) connected:" msgstr "" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "Yes" msgstr "Ja" #: ../src/jukebox.c:453 ../src/jukebox.c:464 msgid "No" msgstr "Nei" #: ../src/jukebox.c:460 msgid "Battery is charging:" msgstr "" #: ../src/jukebox.c:474 msgid "Battery level:" msgstr "" #: ../src/jukebox.c:487 msgid "Jukebox owner:" msgstr "Jukeboxens eier:" #: ../src/jukebox.c:499 msgid "Time on jukebox:" msgstr "Tid på�jukeboxen:" #: ../src/jukebox.c:512 msgid "Total bytes on disk:" msgstr "Totalt antall byte på disken:" #: ../src/jukebox.c:525 msgid "Total free bytes available:" msgstr "Totalt antall ledige bytes:" #: ../src/jukebox.c:538 msgid "Total bytes used:" msgstr "Totalt antall anvendte byte" #: ../src/jukebox.c:551 msgid "Number of songs:" msgstr "Antall sanger:" #: ../src/jukebox.c:563 msgid "Number of playlists:" msgstr "Antall spillelister:" #: ../src/jukebox.c:575 msgid "Number of datafiles:" msgstr "Antall datafiler:" #: ../src/jukebox.c:708 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Kunne ikke finne noen jukeboxer.\n" "USB feil?" #: ../src/jukebox.c:723 msgid "No jukeboxes found on USB bus" msgstr "Fant ingen jukeboxer på�USB-bussen" #: ../src/jukebox.c:769 #, fuzzy msgid "Could not open jukebox:\n" msgstr "Kunne ikke åpne jukeboxen" #: ../src/jukebox.c:784 #, fuzzy msgid "Could not capture jukebox:\n" msgstr "Kunne ikke lese jukeboxen" #: ../src/jukebox.c:1070 msgid "Could not find playlist" msgstr "Kunne ikke finne spillelista" #: ../src/jukebox.c:1300 msgid "Scanning songs..." msgstr "Leser inn sanger..." #: ../src/jukebox.c:1301 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" #: ../src/jukebox.c:1302 msgid "Scanning playlists..." msgstr "Leser inn spillelister..." #: ../src/jukebox.c:1303 msgid "Scanning datafiles..." msgstr "Leser inn datafiler..." #: ../src/jukebox.c:1382 #, c-format msgid "%u songs scanned" msgstr "%u sanger lest inn" #: ../src/jukebox.c:1550 #, c-format msgid "%u data files scanned" msgstr "%u datafiler lest inn" #: ../src/jukebox.c:2272 msgid "Track ID was zero! Illegal value!" msgstr "" #: ../src/jukebox.c:2276 msgid "Song length must be greater than zero!" msgstr "" #: ../src/jukebox.c:2408 msgid "Could not create playlist" msgstr "Kunne ikke skape spilleliste" #: ../src/jukebox.c:2427 msgid "Could not delete playlist" msgstr "Kunne ikke slette spilleliste" #: ../src/jukebox.c:2461 msgid "Could not rename playlist" msgstr "Kunne ikke bytte navn på�spillelista" #: ../src/jukebox.c:2472 msgid "Could not locate playlist to rename!" msgstr "Kunne ikke finne spilleliste å�bytte navn på" #: ../src/jukebox.c:2637 msgid "Could not find the track in the playlist" msgstr "Kunne ikke finne sporet i spillelista" #: ../src/jukebox.c:3077 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" #: ../src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Spiller sanger fra jukeboxen" #: ../src/player.c:448 msgid "Playing:" msgstr "Spiller:" #: ../src/player.c:474 msgid "STOP" msgstr "STOPP" #: ../src/player.c:508 msgid "PREV" msgstr "FORRIGE" #: ../src/player.c:527 msgid "NEXT" msgstr "NESTE" #: ../src/playlists.c:165 ../src/playlists.c:178 msgid "Create a new playlist" msgstr "Skape en ny spilleliste" #: ../src/playlists.c:203 msgid "Choose a name for the new playlist:" msgstr "Velg et navn for den nye spillelista" #: ../src/playlists.c:263 ../src/playlists.c:276 ../src/playlists.c:1013 msgid "Edit playlist" msgstr "Endre spillelista" #: ../src/playlists.c:299 msgid "Edit the name for this playlist:" msgstr "Endre navnet på�denne spillelista:" #: ../src/playlists.c:464 ../src/playlists.c:478 ../src/playlists.c:1021 #, fuzzy msgid "Export playlist" msgstr "Endre spillelista" #: ../src/playlists.c:501 msgid "Export playlist to this file:" msgstr "" #: ../src/playlists.c:514 #, fuzzy msgid "Unnamed playlist.txt" msgstr "Ny spilleliste" #: ../src/playlists.c:519 msgid "Format the playlist according to this string:" msgstr "" #. Don't translate the magic %-things! #: ../src/playlists.c:531 ../src/prefs.c:488 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artist, %t = Tittel, %b = Album, %g = Sjanger, %n = Spor nummer, %y = �" #: ../src/playlists.c:535 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" #: ../src/playlists.c:545 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" #: ../src/playlists.c:574 #, fuzzy msgid "Really delete selected playlist?" msgstr "Legg valgte til i spillelista" #. and .. #: ../src/playlists.c:712 msgid "and" msgstr "og" #: ../src/playlists.c:858 msgid "Transfer to jukebox library" msgstr "Overfør til jukeboxen" #: ../src/playlists.c:859 ../src/playlists.c:866 msgid "Add tracks to playlist(s):" msgstr "Legg til sanger i spillelista/spillelistene" #: ../src/playlists.c:865 msgid "Add to playlist" msgstr "Legg til spillelista" #: ../src/playlists.c:884 msgid "Playlist" msgstr "Spilleliste" #: ../src/playlists.c:979 ../src/playlists.c:989 ../src/playlists.c:1039 msgid "New playlist" msgstr "Ny spilleliste" #: ../src/playlists.c:997 #, fuzzy msgid "Shuffle playlist" msgstr "Ny spilleliste" #: ../src/playlists.c:1005 msgid "Play playlist" msgstr "Spill av spillelista" #: ../src/playlists.c:1029 msgid "Delete playlist" msgstr "Slett spillelista" #: ../src/playlists.c:1047 msgid "Delete track from playlist" msgstr "Slett sang fra spillelista" #. Preference for filenaming #: ../src/prefs.c:457 msgid "Filenaming" msgstr "Navngiving av filer" #: ../src/prefs.c:461 msgid "Use original filename if present in metadata for the track" msgstr "" "Bruk det originale filnavnet til sangen, hvis det er tilstede i sangens " "metadata" #: ../src/prefs.c:470 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Denne strengen anvendes for å navngi filer som blir kopiert fra jukeboxen " "til filsystemet." #: ../src/prefs.c:477 msgid "Formatting string:" msgstr "Formatteringsstreng:" #: ../src/prefs.c:497 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metada fra jukeboxen skriver over alle ID3-tager som allerede finnes på " "overførte filer" #: ../src/prefs.c:500 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "Fjern alle ID3-tagger fra filer som overføres til jukeboxen" #: ../src/prefs.c:503 #, fuzzy msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Skriv ID3v1-tagger til filer som overføres til harddisken" #: ../src/prefs.c:506 msgid "Force use of Unicode charset for ID3 tags" msgstr "" #: ../src/prefs.c:508 msgid "Display hidden (.foo) directories in filesystem" msgstr "Vis skjulte (.foo) kataloger i filsystemet" #: ../src/prefs.c:511 msgid "Ask to add files to a playlist" msgstr "Spør om sanger skal legges til i spillelista" #: ../src/prefs.c:513 msgid "Recurse into any selected directories when transferring" msgstr "Gå ned i valgte underkataloger under overføring" #: ../src/prefs.c:516 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Tving det lokale filsystemet til ISO-8859-1-tegnoppsett" #: ../src/prefs.c:519 msgid "Try to extract sound file metadata from path and filename" msgstr "Prøv å uthente lydfilers metadata fra sti og filnavn" #: ../src/prefs.c:521 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Les ekstra metadata fra jukeboxen (f.eks. opprinnelig filnavn). Kan være " "langsomt på nyere enheter." #: ../src/prefs.c:528 msgid "Automatically read in jukebox contents on startup" msgstr "Les inn jukeboxens innhold automatisk ved oppstart" #: ../src/prefs.c:530 #, fuzzy msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "Les inn jukeboxens innhold automatisk ved oppstart" #: ../src/prefs.c:532 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" #: ../src/prefs.c:534 msgid "Enable turbo mode - uncheck this if you have problems" msgstr "" #~ msgid "Unknown jukebox type" #~ msgstr "Ukjent jukebox-type" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Endre jukeboxens eier" #~ msgid "Power connected:" #~ msgstr "Tilkoblet strøm:" #~ msgid "Unable to read EAX settings" #~ msgstr "Kunne ikke lese inn EAX-innstillingene" #~ msgid "Volume" #~ msgstr "Volum" #~ msgid "Equalizer" #~ msgstr "Equalizer" #~ msgid "Equalizer active" #~ msgstr "Equalizer er aktiv" #~ msgid "Bass" #~ msgstr "Bass" #~ msgid "Mid" #~ msgstr "Mellomregister" #~ msgid "Treble" #~ msgstr "Diskant" #~ msgid "Midrange center frequency:" #~ msgstr "Mellomregisterets mittfrekvens:" #~ msgid "EAX effect:" #~ msgstr "EAX-effekt:" #~ msgid "Headphone mode:" #~ msgstr "Hodetelefonmodus:" #~ msgid "Rear speaker mode:" #~ msgstr "Bakhøytaler-modus:" #~ msgid "Jukebox muted" #~ msgstr "Lyden er av" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "Skriv ID3v2-tagger til filer som overføres til harddisken" gnomad2-2.9.6/po/POTFILES.in0000664000076400007640000000036511512614631012211 00000000000000# List of source files containing translatable strings. # Please keep this file sorted alphabetically. gnomad2.desktop.in src/gnomad2.c src/data.c src/xfer.c src/editmeta.c src/filesystem.c src/jukebox.c src/player.c src/playlists.c src/prefs.c gnomad2-2.9.6/po/nl.po0000664000076400007640000004531311512614631011407 00000000000000# Dutch messages for Gnomad2 # Copyright (C) 2000 - 2004 Linus Walleij # Linus Walleij , 2004 # This file is distributed under the GNU General Public License v 2.0 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Gnomad2\n" "Report-Msgid-Bugs-To:\n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-04-25 10:46+0000\n" "Last-Translator: Dominique \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Een tool om Creative Nomad/Zen Jukeboxes en Dell DJs te beheren" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Nomad/Zen Jukebox/Dell DJ Client" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "Kan niet afsluiten! Jukebox is bezig!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Selecteer jukebox" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Selecteer jukebox:" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Een programma dat\n" "Creative Jukeboxes beheert" #: src/gnomad2.c:218 msgid "translator_credits" msgstr "Lieven Coghe \nDominique " #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Jukebox is bezig" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Scannen van muziekbibliotheek..." #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Jukebox metadata aan het ophalen" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "Jukebox is bezig - wijziging verworpen" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 msgid "Set owner string" msgstr "Verander eigenaar" #: src/gnomad2.c:359 src/gnomad2.c:401 msgid "Edit the owner of this jukebox:" msgstr "Eigenaar van deze jukebox:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "Kan informatie niet weergeven! Jukebox is bezig!" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "Jukebox gegevens kunnen niet opgehaald worden!" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "Blauwe kleur kan niet toegewezen worden!\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Afsluiten" #: src/gnomad2.c:557 msgid "File" msgstr "Bestand" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Muziek overdracht" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Afspeellijsten" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Data overdracht" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Voorkeuren" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Inhoud herscannen" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Jukebox gegevens" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Muziekbibliotheek" #: src/gnomad2.c:647 msgid "About" msgstr "Over Gnomad 2" #: src/gnomad2.c:654 msgid "Help" msgstr "Help" #: src/data.c:45 msgid "Transfering files from jukebox file storage" msgstr "Bestandoverdracht naar computer bezig" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Databestanden aan het ophalen..." #: src/data.c:93 msgid "Transfering files to jukebox file storage" msgstr "Bestandoverdracht naar jukebox bezig" #: src/data.c:106 msgid "Storing files in Jukebox file storage..." msgstr "Bestanden op Jukebox aan het opslaan..." #: src/data.c:167 src/data.c:333 msgid "Really delete selected files?" msgstr "Geselecteerde bestanden echt verwijderen?" #: src/data.c:300 #, fuzzy msgid "Create a new folder" msgstr "Nieuwe afspeellijst" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Kies een naam voor de nieuwe map:" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Bestandsnaam" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Grootte (bytes)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Herscan jukebox" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transfer" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Verwijderen" #: src/data.c:533 msgid "Create folder" msgstr "Nieuwe map" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Databestanden" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Tracks uit muziekbibliotheek aan het overzetten" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Tracks uit Jukebox aan het ophalen..." #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Tracks naar muziekbibliotheek aan het overzetten" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Tracks in muziekbibliotheek aan het opslaan..." #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "Geselecteerde tracks echt verwijderen?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Artiest" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Titel" #: src/xfer.c:484 msgid "Album" msgstr "Album" #: src/xfer.c:495 msgid "Year" msgstr "Jaar" #: src/xfer.c:506 msgid "Genre" msgstr "Genre" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Lengte" #: src/xfer.c:539 msgid "Codec" msgstr "Codec" #: src/xfer.c:550 msgid "Track#" msgstr "Track#" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Beveiligd" #: src/xfer.c:632 msgid "Rescan directory metadata" msgstr "Directory metadata herscannen" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Bewerken" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Inhoud herscannen" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Toevoegen aan afspeellijst" #: src/xfer.c:692 msgid "Play selected" msgstr "Afspelen" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Muziekbibliotheek" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "JA" #: src/editmeta.c:97 msgid "NO" msgstr "NEE" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "Jukebox is bezig.\n" "Metadata kan niet gewijzigd worden." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Metadata van %s - %s aan het bijwerken" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Bewerk metadata van bestand" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Bewerk trackinfo (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Artiest:" #: src/editmeta.c:368 msgid "Title:" msgstr "Titel:" #: src/editmeta.c:389 msgid "Album:" msgstr "Album:" #: src/editmeta.c:411 msgid "Year:" msgstr "Jaar:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Genre:" #: src/editmeta.c:458 msgid "Length:" msgstr "Lengte:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Track nummer:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Oorspronkelijke bestandsnaam:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Map:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Codec:" #: src/editmeta.c:585 msgid "File size:" msgstr "Bestandsgrootte:" #: src/editmeta.c:601 msgid "File ID:" msgstr "Bestand ID:" #: src/editmeta.c:603 msgid "Path:" msgstr "Pad:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Bestandslijst aan het ophalen" #: src/filesystem.c:421 msgid "Adding metadata to view" msgstr "Metadata toevoegen aan weergave" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Metadata van bestand aan het ophalen" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Track metadata aan het ophalen" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "Voorkeuren konden niet bewaard worden" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "Afspeellijst kon niet aangemaakt worden" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "Toestel kon niet gevonden worden op de USB-bus" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(onbekende oorzaak)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "Toestel ID:" #: src/jukebox.c:297 msgid "Firmware revision:" msgstr "Firmware versie:" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Hardware revisie:" #: src/jukebox.c:321 msgid "Product name:" msgstr "Productnaam:" #: src/jukebox.c:332 msgid "Auxilary power (AC or USB) connected:" msgstr "Externe stroom (AC of USB) aangesloten:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Ja" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "Nee" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "Batterij wordt opgeladen:" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Batterij:" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Eigenaar jukebox:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Tijd op jukebox" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Totale schijfruimte (bytes):" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Beschikbare schijfruimte (bytes):" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Gebruikte schijfruimte (bytes):" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Aantal tracks" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Aantal afspeellijsten:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Aantal databestanden:" #: src/jukebox.c:585 msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "Jukebox kon niet gevonden worden.\n" "USB fout?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "Geen jukeboxen gevonden op de USB bus" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Onbekend jukebox type" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "Jukebox kon niet geopend worden:\n" #: src/jukebox.c:676 msgid "Could not capture jukebox:\n" msgstr "Geen toegang tot jukebox:\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "Afspeellijst kon niet gevonden worden" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Scannen van tracks..." #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Scannen van tracks:\n" "Uitgebreide metadata wordt gescand,\n" "scannen zal zeer traag verlopen." #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Scannen van afspeellijsten..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Scannen van databestanden..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u tracks gescand" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u databestanden gescand" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "Track ID was nul! Ongeldige waarde!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "Track lengte moet groter zijn dan nul!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "Afspeellijst kon niet gemaakt worden" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "Afspeellijst kon niet verwijderd worden" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "Afspeellijst kon niet hernoemd worden" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "Afspeellijst om te hernoemen niet gevonden!" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "Track niet gevonden in afspeellijst" #: src/jukebox.c:2495 msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "De map kon niet gemaakt worden.\n" "De meest voor de hand liggende reden is dat u een Nomad Jukbox 1\n" "gebruikt die te oud is om mappen te ondersteunen." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Tracks op de jukebox aan het afspelen" #: src/player.c:448 msgid "Playing:" msgstr "Huidige track:" #: src/player.c:474 msgid "STOP" msgstr "STOP" #: src/player.c:508 msgid "PREV" msgstr "VORIGE" #: src/player.c:527 msgid "NEXT" msgstr "VOLGENDE" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Nieuwe afspeellijst" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Naam voor de nieuwe afspeellijst:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Afspeellijst bewerken" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Afspeellijstnaam wijzigen:" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Afspeellijst exporteren" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Afspeellijst exporteren naar dit bestand:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Nieuwe afspeellijst.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Afspeellijstformaat volgens deze string:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artiest, %t = Titel, %b = Album, %g = Genre, %n = Track nummer, %y = " "Jaar" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Maak een M3U afspeellijst (er van uitgaande dat de formaatfilter de correcte " "bestandsnamen gebruikt)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Maak een PLS afspeellijst (er van uitgaande dat de formaatfilter de correcte " "bestandsnamen gebruikt)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "Weet u zeker dat u de geselecteerde afspeellijst wilt verwijderen?" #: src/playlists.c:628 msgid "and" msgstr "en" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transfer naar muziekbibliotheek" #: src/playlists.c:753 src/playlists.c:760 msgid "Add tracks to playlist(s):" msgstr "Voeg tracks toe aan afspeellijst(en):" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Voeg toe aan afspeellijst" #: src/playlists.c:778 msgid "Playlist" msgstr "Afspeellijst" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Nieuwe afspeellijst" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Shuffle afspeellijst" #: src/playlists.c:899 msgid "Play playlist" msgstr "Afspeellijst afspelen" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Afspeellijst verwijderen" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Track uit afspeellijst verwijderen" #: src/prefs.c:431 msgid "Filenaming" msgstr "Bestandsbenaming" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "Gebruik de oorspronkelijke bestandsnaam indien aanwezig in metadata" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Deze string wordt gebruikt bij het benoemen van bestanden die gekopieerd " "worden uit de muziekbibliotheek." #: src/prefs.c:451 msgid "Formatting string:" msgstr "Formaatstring:" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "Metadata van de jukebox gaat voor op de aanwezige ID3 tags op gekopieerde " "bestanden" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "" "Verwijder alle ID3 tags van bestanden die naar de jukebox gekopieerd worden" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "" "Voeg ID3v1/v2 tag toe aan bestanden die naar de harde schijf gekopieerd " "worden" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Gebruik enkel Unicode charset foor ID3 tags" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Toon verborgen (.foo) directories in bestandsysteem" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Vraag om bestanden toe te voegen aan een afspeellijst" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "Transfer subdirectories bij het overbrengen van een directory" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Gebruik ISO-8859-1 charset voor lokaal bestandensysteem" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "Probeer trackinfo uit bestandsnaam en pad te halen" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Lees uitgebreide metadata uit jukebox (vb. oorspronkelijke bestandsnaam - " "traag op nieuwere toestellen)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Automatisch inhoud van jukebox lezen bij opstarten" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Automatisch de tijd op de jukebox synchroniseren met deze van de commputer" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" "Bij opstarten automatisch naar de plaats in het bestandsysteem gaan waar u " "het laatst was" #, fuzzy #~ msgid "Edit the owner of this jukebox" #~ msgstr "Eigenaar van deze jukebox:" #~ msgid "Power connected:" #~ msgstr "Netstroom aangesloten:" #~ msgid "Unable to read EAX settings" #~ msgstr "Kon EAX instellingen niet lezen" #~ msgid "Volume" #~ msgstr "Volume" #~ msgid "Equalizer" #~ msgstr "Equalizer" #~ msgid "Equalizer active" #~ msgstr "Equalizer actief" #~ msgid "Bass" #~ msgstr "Bass" #~ msgid "Mid" #~ msgstr "Mid" #~ msgid "Treble" #~ msgstr "Treble" #~ msgid "Midrange center frequency:" #~ msgstr "Middentonen:" #~ msgid "EAX effect:" #~ msgstr "EAX effect:" #~ msgid "Headphone mode:" #~ msgstr "Hoofdtelefoon modus:" #~ msgid "Rear speaker mode:" #~ msgstr "Luidspreker modus:" #~ msgid "Jukebox muted" #~ msgstr "Jukebox stil" #~ msgid "Write ID3v2 tag to files transferred to harddisk" #~ msgstr "" #~ "Voeg ID3v2 tag toe aan bestanden die naar de harde schijf overgebracht worden" #~ msgid "Could not ping jukebox" #~ msgstr "Kon jukebox niet pingen" gnomad2-2.9.6/po/LINGUAS0000664000076400007640000000013011512614631011447 00000000000000# please keep this list sorted alphabetically # ca cs_CZ de es fi fr it nl nb pl sco sv gnomad2-2.9.6/po/ca.po0000664000076400007640000004623011512614631011360 00000000000000# Catalan translation for gnomad2 # Copyright (c) (c) 2006 Canonical Ltd, and Rosetta Contributors 2006 # This file is distributed under the same license as the gnomad2 package. # FIRST AUTHOR , 2006. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gnomad2\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2005-06-30 21:42+0200\n" "PO-Revision-Date: 2006-07-23 22:21+0000\n" "Last-Translator: LordRoger \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: gnomad2.desktop.in.h:1 msgid "A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs" msgstr "Una eina per gestionar reproductors Creative Nomad/Zen i Dell DJs" #: gnomad2.desktop.in.h:2 msgid "Gnomad 2" msgstr "Gnomad 2" #: gnomad2.desktop.in.h:3 msgid "Nomad/Zen Jukebox/Dell DJ Client" msgstr "Client per a reproductors Nomad/Zen/Dell DJ" #: src/gnomad2.c:55 msgid "Cannot quit! Jukebox is busy!" msgstr "No es pot sortir! El reproductor està ocupat!" #: src/gnomad2.c:124 src/gnomad2.c:150 msgid "Select jukebox" msgstr "Seleccioneu el reproductor" #: src/gnomad2.c:129 src/gnomad2.c:169 msgid "Select jukebox to operate:" msgstr "Seleccioneu quin reproductor voleu gestionar" #: src/gnomad2.c:217 msgid "" "A program to communicate with\n" "Creative Jukeboxes" msgstr "" "Un programa per comunicar-se amb\n" "Reproductors Creative" #: src/gnomad2.c:218 #, fuzzy msgid "translator_credits" msgstr "Roger Pueyo Centelles " #: src/gnomad2.c:264 src/data.c:37 src/data.c:85 src/xfer.c:44 src/xfer.c:128 #: src/xfer.c:331 src/playlists.c:188 src/playlists.c:204 src/playlists.c:392 #: src/playlists.c:487 src/playlists.c:505 src/playlists.c:523 #: src/playlists.c:722 msgid "Jukebox busy" msgstr "Reproductor ocupat" #: src/gnomad2.c:275 src/gnomad2.c:293 msgid "Scanning jukebox library" msgstr "Escanejant la llibreria del reproductor" #: src/gnomad2.c:276 src/gnomad2.c:292 msgid "Retrieveing metadata from jukebox" msgstr "Obtenint metadata del reproductor" #: src/gnomad2.c:325 src/gnomad2.c:373 msgid "Jukebox busy - change discarded" msgstr "El reproductor està ocupat - els canvis s'han descartat" #: src/gnomad2.c:356 src/gnomad2.c:388 src/gnomad2.c:625 #, fuzzy msgid "Set owner string" msgstr "Establir el nom del propietari" #: src/gnomad2.c:359 src/gnomad2.c:401 #, fuzzy msgid "Edit the owner of this jukebox:" msgstr "Editar el nom del propietari d'aquest reproductor:" #: src/gnomad2.c:420 msgid "Cannot view information! Jukebox is busy!" msgstr "No es pot veure la informació! El reproductor està ocupat!" #: src/gnomad2.c:428 msgid "Cannot retrieve jukebox information!" msgstr "No s'ha pogut recuperar la informació del reproductor!" #: src/gnomad2.c:495 msgid "Could not allocate blue color!\n" msgstr "No s'ha pogut assignar el color blau!\n" #: src/gnomad2.c:548 msgid "Quit" msgstr "Sortir" #: src/gnomad2.c:557 msgid "File" msgstr "Fitxer" #: src/gnomad2.c:583 msgid "Music transfer" msgstr "Transferència de música" #: src/gnomad2.c:596 msgid "Playlists" msgstr "Llistes de reproducció" #: src/gnomad2.c:604 msgid "Data transfer" msgstr "Transferència de dades" #: src/gnomad2.c:609 msgid "Preferences" msgstr "Preferències" #: src/gnomad2.c:616 src/data.c:525 msgid "Rescan contents" msgstr "Reescanejar els continguts" #: src/gnomad2.c:632 src/jukebox.c:260 src/jukebox.c:262 src/jukebox.c:277 msgid "Jukebox information" msgstr "Informació del reproductor" #: src/gnomad2.c:641 msgid "Jukebox library" msgstr "Llibreria del reproductor" #: src/gnomad2.c:647 msgid "About" msgstr "Sobre" #: src/gnomad2.c:654 msgid "Help" msgstr "Ajuda" #: src/data.c:45 #, fuzzy msgid "Transfering files from jukebox file storage" msgstr "Transferint fitxers des de l'arxiu del reproductor" #: src/data.c:58 msgid "Retrieving data files from Jukebox..." msgstr "Obenint fitxers de dades del reproductor..." #: src/data.c:93 #, fuzzy msgid "Transfering files to jukebox file storage" msgstr "Transferint fitxers a l'arxiu de fitxers del reproductor" #: src/data.c:106 #, fuzzy msgid "Storing files in Jukebox file storage..." msgstr "Desant fitxers a l'arxiu de fitxers del reproductor" #: src/data.c:167 src/data.c:333 #, fuzzy msgid "Really delete selected files?" msgstr "Esteu segur que voleu esborrar els fitxers seleccionats?" #: src/data.c:300 msgid "Create a new folder" msgstr "Crear una nova carpeta" #: src/data.c:314 msgid "Choose a name for the new folder:" msgstr "Escolliu un nom per a la nova carpeta" #: src/data.c:424 src/xfer.c:572 msgid "Filename" msgstr "Nom de fitxer" #: src/data.c:440 src/xfer.c:528 msgid "Size (bytes)" msgstr "Mida (bytes)" #. file ID number #: src/data.c:452 src/xfer.c:586 msgid "ID" msgstr "ID" #: src/data.c:497 msgid "Rescan jukebox" msgstr "Reescanejar el reproductor" #: src/data.c:505 src/data.c:541 src/xfer.c:640 src/xfer.c:676 msgid "Transfer selected" msgstr "Transferir la selecció" #: src/data.c:513 src/data.c:549 src/xfer.c:656 src/xfer.c:708 msgid "Delete selected" msgstr "Esborrar la selecció" #: src/data.c:533 msgid "Create folder" msgstr "Crear una carpeta" #: src/data.c:666 msgid "Jukebox data file window" msgstr "Finestra de fitxers de dades del reproductor" #: src/xfer.c:52 msgid "Transfering tracks from jukebox library" msgstr "Transferint pistes des de la llibreria del reproductor" #: src/xfer.c:65 msgid "Retrieving tracks from Jukebox..." msgstr "Obenint pistes des del reproductor" #: src/xfer.c:139 src/xfer.c:151 msgid "Transfering tracks to jukebox library" msgstr "Transferint pistes a la llibreria del reproductor" #: src/xfer.c:153 msgid "Storing tracks in Jukebox library..." msgstr "Desant pistes a la biblioteca del reproductor" #: src/xfer.c:237 src/xfer.c:342 src/playlists.c:527 msgid "Really delete selected tracks?" msgstr "Esteu segur que voleu esborrar les pistes seleccionades?" #: src/xfer.c:457 src/playlists.c:791 msgid "Artist" msgstr "Artista" #: src/xfer.c:473 src/playlists.c:803 msgid "Title" msgstr "Títol" #: src/xfer.c:484 msgid "Album" msgstr "Àlbum" #: src/xfer.c:495 msgid "Year" msgstr "Any" #: src/xfer.c:506 msgid "Genre" msgstr "Gènere" #: src/xfer.c:517 src/playlists.c:815 msgid "Length" msgstr "Durada" #: src/xfer.c:539 msgid "Codec" msgstr "Còdec" #: src/xfer.c:550 msgid "Track#" msgstr "Pista#" #: src/xfer.c:561 src/editmeta.c:551 msgid "Protected" msgstr "Protegit" #: src/xfer.c:632 #, fuzzy msgid "Rescan directory metadata" msgstr "Reescanejar la metadata del directori" #: src/xfer.c:648 src/xfer.c:700 msgid "Edit selected" msgstr "Editar la selecció" #: src/xfer.c:668 msgid "Rescan jukebox contents" msgstr "Reescanejar els continguts del reproductor" #: src/xfer.c:684 msgid "Add selected to playlist" msgstr "Afegir la selecció a la llista de reproducció" #: src/xfer.c:692 msgid "Play selected" msgstr "Reproduir la selecció" #: src/xfer.c:825 msgid "Jukebox library window" msgstr "Finestra de la lliberia del reproductor" #: src/editmeta.c:97 src/editmeta.c:556 msgid "YES" msgstr "SÍ" #: src/editmeta.c:97 msgid "NO" msgstr "NO" #: src/editmeta.c:124 msgid "" "Jukebox is busy.\n" "Cannot edit metadata now." msgstr "" "El reproductor està ocupat.\n" "No es pot editar la metadata ara." #: src/editmeta.c:221 #, c-format msgid "Updating metadata on %s - %s" msgstr "Actualitzant la metadata en %s - %s" #: src/editmeta.c:323 msgid "Edit jukebox file metadata" msgstr "Editar la metadata de fitxer del reproductor" #: src/editmeta.c:328 msgid "Edit track metadata (ID3v2)" msgstr "Editar la metadata de la pista (ID3v2)" #: src/editmeta.c:344 msgid "Artist:" msgstr "Artista:" #: src/editmeta.c:368 msgid "Title:" msgstr "Títol:" #: src/editmeta.c:389 msgid "Album:" msgstr "Àlbum:" #: src/editmeta.c:411 msgid "Year:" msgstr "Any:" #: src/editmeta.c:434 msgid "Genre:" msgstr "Gènere:" #: src/editmeta.c:458 msgid "Length:" msgstr "Durada:" #: src/editmeta.c:483 msgid "Track number:" msgstr "Número de pista:" #: src/editmeta.c:506 msgid "Original filename:" msgstr "Nom de fitxer original:" #: src/editmeta.c:529 msgid "Folder:" msgstr "Carpeta:" #: src/editmeta.c:570 msgid "Codec:" msgstr "Còdec:" #: src/editmeta.c:585 msgid "File size:" msgstr "Mida del fitxer:" #: src/editmeta.c:601 msgid "File ID:" msgstr "ID del fitxer:" #: src/editmeta.c:603 msgid "Path:" msgstr "Camí:" #: src/filesystem.c:393 msgid "Getting file list from filesystem" msgstr "Obtenint llista de fitxers del sistema" #: src/filesystem.c:421 #, fuzzy msgid "Adding metadata to view" msgstr "Afegint la metadata a la vista" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting file metadata" msgstr "Obtenint la metadata del fitxer" #: src/filesystem.c:483 src/filesystem.c:484 src/filesystem.c:507 #: src/filesystem.c:518 msgid "Getting track metadata" msgstr "Obtening la metadata de lapista" #: src/filesystem.c:619 msgid "Could not write preference file" msgstr "No s'ha pogut escriure el fitxer de preferències" #: src/filesystem.c:802 msgid "Could not write exported playlist" msgstr "No s'ha pogut escriure la llista de reproducció exportada" #: src/jukebox.c:101 msgid "Could not open the device on the USB bus" msgstr "No s'ha pogut obrir el dispositiu en el bus USB" #: src/jukebox.c:105 msgid "(unknown cause)" msgstr "(causa desconeguda)" #: src/jukebox.c:286 msgid "Unique device ID:" msgstr "ID de dispositiu única:" #: src/jukebox.c:297 #, fuzzy msgid "Firmware revision:" msgstr "Revisió de firmware:" #: src/jukebox.c:309 msgid "Hardware revision:" msgstr "Revisió de maquinari:" #: src/jukebox.c:321 msgid "Product name:" msgstr "Nom del producte:" #: src/jukebox.c:332 #, fuzzy msgid "Auxilary power (AC or USB) connected:" msgstr "Alimentació externa (AC o USB) connectada:" #: src/jukebox.c:336 src/jukebox.c:347 msgid "Yes" msgstr "Sí" #: src/jukebox.c:336 src/jukebox.c:347 msgid "No" msgstr "No" #: src/jukebox.c:343 msgid "Battery is charging:" msgstr "La bateria s'està carregant:" #: src/jukebox.c:355 msgid "Battery level:" msgstr "Nivell de la bateria:" #: src/jukebox.c:368 msgid "Jukebox owner:" msgstr "Propietari del reproductor:" #: src/jukebox.c:380 msgid "Time on jukebox:" msgstr "Hora del reproductor:" #: src/jukebox.c:394 msgid "Total bytes on disk:" msgstr "Quantitat total de bytes en el disk:" #: src/jukebox.c:407 msgid "Total free bytes available:" msgstr "Quantitat total de bytes lliures disponibles:" #: src/jukebox.c:420 msgid "Total bytes used:" msgstr "Quantitat total de bytes ocupats:" #: src/jukebox.c:433 msgid "Number of songs:" msgstr "Número de cançons:" #: src/jukebox.c:445 msgid "Number of playlists:" msgstr "Número de llistes de reproducció:" #: src/jukebox.c:457 msgid "Number of datafiles:" msgstr "Número de fitxers de dades:" #: src/jukebox.c:585 #, fuzzy msgid "" "Could not try to locate jukeboxes\n" "USB error?" msgstr "" "No s'ha pogut provar de localitzar cap reproductor\n" "Hi ha algun error de USB?" #: src/jukebox.c:590 msgid "No jukeboxes found on USB bus" msgstr "No s'han trobat reproductors en el bus USB" #: src/jukebox.c:643 msgid "Unknown jukebox type" msgstr "Tipus de reproductor desconegut" #: src/jukebox.c:661 msgid "Could not open jukebox:\n" msgstr "No s'ha pogut obrir el reproductor:\n" #: src/jukebox.c:676 #, fuzzy msgid "Could not capture jukebox:\n" msgstr "No s'ha pogut capturar el reproductor:\n" #: src/jukebox.c:891 msgid "Could not find playlist" msgstr "No s'ha pogut trobar la llista de reproducció" #: src/jukebox.c:1074 msgid "Scanning songs..." msgstr "Escanejant cançons" #: src/jukebox.c:1075 msgid "" "Scanning songs:\n" "You have selected extended metadata scan,\n" " so scanning will be very slow." msgstr "" "Escanejant cançons:\n" "Heu seleccionat un escanejat de metadata extens,\n" "l'escanejat serà molt lent" #: src/jukebox.c:1076 msgid "Scanning playlists..." msgstr "Escanejant llistes de reproducció..." #: src/jukebox.c:1077 msgid "Scanning datafiles..." msgstr "Escanejant fitxers de dades..." #: src/jukebox.c:1120 #, c-format msgid "%u songs scanned" msgstr "%u cançons escanejades" #: src/jukebox.c:1202 #, c-format msgid "%u data files scanned" msgstr "%u fitxers de dades escanejats" #: src/jukebox.c:1733 msgid "Track ID was zero! Illegal value!" msgstr "La ID de la pista és zero! Això és un valor il·legal!" #: src/jukebox.c:1737 msgid "Song length must be greater than zero!" msgstr "La durada de la cançó ha de ser major que zero!" #: src/jukebox.c:1836 msgid "Could not create playlist" msgstr "No s'ha pogut crear la llista de reproducció" #: src/jukebox.c:1855 msgid "Could not delete playlist" msgstr "No s'ha pogut esborrar la llista de reproducció" #: src/jukebox.c:1889 msgid "Could not rename playlist" msgstr "No s'ha pogut reanomenar la llista de reproducció" #: src/jukebox.c:1900 msgid "Could not locate playlist to rename!" msgstr "No s'ha pogut trobar la llista de reproducció a reanomenar!" #: src/jukebox.c:2065 msgid "Could not find the track in the playlist" msgstr "No s'ha pogut trobar la pista a la llista de reproducció" #: src/jukebox.c:2495 #, fuzzy msgid "" "The folder could not be created.\n" "The most typical reason is that you are using a Nomad Jukebox 1\n" "which is too old to support folders." msgstr "" "No s'ha pogut crear la carpeta.\n" "El motiu més usual és que estiguis usant un Nomad Jukebox1\n" "que massa antic i no suporta les carpetes." #: src/player.c:443 msgid "Playing tracks on the jukebox" msgstr "Reproduint pistes al reproductor" #: src/player.c:448 msgid "Playing:" msgstr "Reproduint:" #: src/player.c:474 #, fuzzy msgid "STOP" msgstr "ATURAR" #: src/player.c:508 #, fuzzy msgid "PREV" msgstr "ANTERIOR" #: src/player.c:527 #, fuzzy msgid "NEXT" msgstr "SEGÜENT" #: src/playlists.c:151 msgid "Create a new playlist" msgstr "Crear una nova llista de reproducció" #: src/playlists.c:165 msgid "Choose a name for the new playlist:" msgstr "Escolliu un nom per a la nova llista de reproducció:" #: src/playlists.c:225 src/playlists.c:907 msgid "Edit playlist" msgstr "Editar la llista de reproducció" #: src/playlists.c:239 msgid "Edit the name for this playlist:" msgstr "Editar el nom d'aquesta llista de reproducció:" #: src/playlists.c:403 src/playlists.c:915 msgid "Export playlist" msgstr "Exportar la llista de reproducció" #: src/playlists.c:417 msgid "Export playlist to this file:" msgstr "Exportar la llista de reproducció a aquest fitxer:" #: src/playlists.c:430 msgid "Unnamed playlist.txt" msgstr "Llista de reproducció sense nom.txt" #: src/playlists.c:435 msgid "Format the playlist according to this string:" msgstr "Formatar la llista de reproducció segons aquesta cadena:" #: src/playlists.c:447 src/prefs.c:462 msgid "" "%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year" msgstr "" "%a = Artista, %t = Títol, %b = Àlbum, %g = Gènere, %n = Número de pista, %y " "= Any" #: src/playlists.c:451 msgid "" "Create an M3U playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crear una llista de reproducció M3U (assumint que el filtre de format " "estableix els noms de fitxers correctes)" #: src/playlists.c:461 msgid "" "Create an PLS playlist (assuming the format filter sets the correct " "filenames)" msgstr "" "Crear una llista de reproducció PLS (assumint que el filtre de format " "estableix els noms de fitxers correctes)" #: src/playlists.c:490 msgid "Really delete selected playlist?" msgstr "" "Esteu segur que voleu esborrar les llistes de reproducció seleccionades?" #: src/playlists.c:628 msgid "and" msgstr "i" #: src/playlists.c:752 msgid "Transfer to jukebox library" msgstr "Transferir a la llibreria del reproductor" #: src/playlists.c:753 src/playlists.c:760 #, fuzzy msgid "Add tracks to playlist(s):" msgstr "Afegir pistes a la llista o llistes de reproducció:" #: src/playlists.c:759 msgid "Add to playlist" msgstr "Afegir a la llista de reproducció" #: src/playlists.c:778 msgid "Playlist" msgstr "Llista de reproducció" #: src/playlists.c:873 src/playlists.c:883 src/playlists.c:933 msgid "New playlist" msgstr "Nova llista de reproducció" #: src/playlists.c:891 msgid "Shuffle playlist" msgstr "Llista de reproducció aleatòria" #: src/playlists.c:899 msgid "Play playlist" msgstr "Reproduir llista de reproducció" #: src/playlists.c:923 msgid "Delete playlist" msgstr "Esborrar llista de reproducció" #: src/playlists.c:941 msgid "Delete track from playlist" msgstr "Esborrar una pista de la llista de reproducció" #: src/prefs.c:431 msgid "Filenaming" msgstr "Noms de fitxers" #: src/prefs.c:435 msgid "Use original filename if present in metadata for the track" msgstr "" "Emprar el nom de fitxer original si hi és present a la metadata per la pista" #: src/prefs.c:444 msgid "" "This string is used when naming files copied from the jukebox library to the " "filesystem." msgstr "" "Aquesta cadena s'empra quan s'anomenen fitxers copiats des de la biblioteca " "del reproductor al sistema de fitxers" #: src/prefs.c:451 #, fuzzy msgid "Formatting string:" msgstr "Cadena de format:" #: src/prefs.c:471 msgid "" "Metadata from the jukebox overrides present ID3 tags on transfered files" msgstr "" "La metadata del reproductor sobreescriu les etiquetes ID3 presents en els " "fitxers transferits" #: src/prefs.c:474 msgid "Remove all ID3 tags from files transferred to jukebox" msgstr "" "Esborrar totes les etiquetes ID3 dels fitxers transferits al reproductor" #: src/prefs.c:477 msgid "Write ID3v1/v2 tag to files transferred to harddisk" msgstr "Escriure les etiquetes ID3v1/v2 als fitxers transferits al disc dur" #: src/prefs.c:480 msgid "Force use of Unicode charset for ID3 tags" msgstr "Forçar l'ús del mapa de caràcters Unicode per a les etiquetes ID3" #: src/prefs.c:482 msgid "Display hidden (.foo) directories in filesystem" msgstr "Mostrar els directoris ocults (.foo) del sistema de fitxers" #: src/prefs.c:485 msgid "Ask to add files to a playlist" msgstr "Pregunta per a afegir fitxers a una llista de reproducció" #: src/prefs.c:487 msgid "Recurse into any selected directories when transferring" msgstr "" "Entra recursivament a cadascun dels directoris seleccionats durant la " "transferència" #: src/prefs.c:489 msgid "Force local filesystem to ISO-8859-1 charset" msgstr "Força el mapa de caràcters ISO-8859-1 al sistema de fitxers local" #: src/prefs.c:491 msgid "Try to extract sound file metadata from path and filename" msgstr "" "Intentar extreure la metadata del fitxer de so del camí i del nom del fitxer" #: src/prefs.c:493 msgid "" "Read extended metadata from jukebox (e.g. original filename - slow on newer " "devices)" msgstr "" "Llegir la metadata extesa del reproductor (p.ex. el nom de fitxer original - " "lent en els dispositius més nous)" #: src/prefs.c:500 msgid "Automatically read in jukebox contents on startup" msgstr "Llegir automàticament els continguts del reproductor a l'inici" #: src/prefs.c:502 msgid "" "Automatically set the time on the Jukebox to that of your computer on startup" msgstr "" "Establir automàticament l'hora del Reproductor a la mateixa que el sistema a " "l'inici" #: src/prefs.c:504 msgid "" "On startup, return to the place in the filesystem where you were last time" msgstr "" "A l'inici, tornar al punt del sistema de fitxers on éreu l'última vegada"gnomad2-2.9.6/configure0000775000076400007640000067175411602630254011744 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.68 for gnomad2 2.9.6. # # Report bugs to . # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software # Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and triad@df.lth.se $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='gnomad2' PACKAGE_TARNAME='gnomad2' PACKAGE_VERSION='2.9.6' PACKAGE_STRING='gnomad2 2.9.6' PACKAGE_BUGREPORT='triad@df.lth.se' PACKAGE_URL='' ac_unique_file="src/gnomad2.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS ac_aux_dir MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES CATOBJEXT CATALOGS MSGFMT_OPTS GETTEXT_PACKAGE DATADIRNAME ALL_LINGUAS INTLTOOL_PERL GMSGFMT MSGFMT MSGMERGE XGETTEXT INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE USE_NLS GUDEV_LIBS GUDEV_CFLAGS MTP_LIBS MTP_CFLAGS TAGLIB_COMPILE_FALSE TAGLIB_COMPILE_TRUE TAGLIB_LIBS TAGLIB_CFLAGS EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC TAG_LIBS TAG_CFLAGS OSFLAGS GN_LIBS GN_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking with_id3tag_prefix with_taglib_prefix with_taglib_only with_libmtp_prefix enable_nls ' ac_precious_vars='build_alias host_alias target_alias PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GN_CFLAGS GN_LIBS TAG_CFLAGS TAG_LIBS CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP TAGLIB_CFLAGS TAGLIB_LIBS MTP_CFLAGS MTP_LIBS GUDEV_CFLAGS GUDEV_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used" >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gnomad2 2.9.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gnomad2] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gnomad2 2.9.6:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-nls do not use Native Language Support Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-id3tag-prefix=PFX Prefix where id3tag library is installed (optional) --with-taglib-prefix=PFX Prefix where taglib library is installed (optional) --with-taglib-only Use ONLY taglib to tag even MP3 files. --with-libmtp-prefix=PFX Prefix where libmtp library is installed (optional) Some influential environment variables: PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GN_CFLAGS C compiler flags for GN, overriding pkg-config GN_LIBS linker flags for GN, overriding pkg-config TAG_CFLAGS C compiler flags for TAG, overriding pkg-config TAG_LIBS linker flags for TAG, overriding pkg-config CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor TAGLIB_CFLAGS C compiler flags for TAGLIB, overriding pkg-config TAGLIB_LIBS linker flags for TAGLIB, overriding pkg-config MTP_CFLAGS C compiler flags for MTP, overriding pkg-config MTP_LIBS linker flags for MTP, overriding pkg-config GUDEV_CFLAGS C compiler flags for GUDEV, overriding pkg-config GUDEV_LIBS linker flags for GUDEV, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gnomad2 configure 2.9.6 generated by GNU Autoconf 2.68 Copyright (C) 2010 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------ ## ## Report this to triad@df.lth.se ## ## ------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gnomad2 $as_me 2.9.6, which was generated by GNU Autoconf 2.68. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=gnomad2 VERSION=2.9.6 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi if test -d /usr/local/lib/pkgconfig ; then export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GN" >&5 $as_echo_n "checking for GN... " >&6; } if test -n "$GN_CFLAGS"; then pkg_cv_GN_CFLAGS="$GN_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ glib-2.0 \\ gthread-2.0 \\ libnjb >= 2.2.4 \\ gtk+-2.0 >= 2.6.0 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GN_CFLAGS=`$PKG_CONFIG --cflags "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ " 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GN_LIBS"; then pkg_cv_GN_LIBS="$GN_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\\ glib-2.0 \\ gthread-2.0 \\ libnjb >= 2.2.4 \\ gtk+-2.0 >= 2.6.0 \\ \""; } >&5 ($PKG_CONFIG --exists --print-errors "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ ") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GN_LIBS=`$PKG_CONFIG --libs "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ " 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GN_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ " 2>&1` else GN_PKG_ERRORS=`$PKG_CONFIG --print-errors "\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ " 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GN_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (\ glib-2.0 \ gthread-2.0 \ libnjb >= 2.2.4 \ gtk+-2.0 >= 2.6.0 \ ) were not met: $GN_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GN_CFLAGS and GN_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GN_CFLAGS and GN_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else GN_CFLAGS=$pkg_cv_GN_CFLAGS GN_LIBS=$pkg_cv_GN_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi GTK_VER=`$PKG_CONFIG --modversion gtk+-2.0` LIBNJB_VER=`$PKG_CONFIG --modversion libnjb` OSFLAGS="" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TAG" >&5 $as_echo_n "checking for TAG... " >&6; } if test -n "$TAG_CFLAGS"; then pkg_cv_TAG_CFLAGS="$TAG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"id3tag >= 0.15\""; } >&5 ($PKG_CONFIG --exists --print-errors "id3tag >= 0.15") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAG_CFLAGS=`$PKG_CONFIG --cflags "id3tag >= 0.15" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TAG_LIBS"; then pkg_cv_TAG_LIBS="$TAG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"id3tag >= 0.15\""; } >&5 ($PKG_CONFIG --exists --print-errors "id3tag >= 0.15") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAG_LIBS=`$PKG_CONFIG --libs "id3tag >= 0.15" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TAG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "id3tag >= 0.15" 2>&1` else TAG_PKG_ERRORS=`$PKG_CONFIG --print-errors "id3tag >= 0.15" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TAG_PKG_ERRORS" >&5 found_id3tag_pkg=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } found_id3tag_pkg=no else TAG_CFLAGS=$pkg_cv_TAG_CFLAGS TAG_LIBS=$pkg_cv_TAG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_id3tag_pkg=yes fi ID3TAG_VER=`pkg-config --modversion id3tag` DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_header_mongrel "$LINENO" "id3tag.h" "ac_cv_header_id3tag_h" "$ac_includes_default" if test "x$ac_cv_header_id3tag_h" = xyes; then : found_id3tag_header=yes else found_id3tag_header=no fi # Check whether --with-id3tag-prefix was given. if test "${with_id3tag_prefix+set}" = set; then : withval=$with_id3tag_prefix; id3tag_prefix="$withval" else id3tag_prefix="" fi if test x"$id3tag_prefix" != "x"; then TAG_LIBS="-L$id3tag_prefix/lib -lid3tag -lz" TAG_CFLAGS="-I$id3tag_prefix/include" else if test x"$found_id3tag_pkg" = "xno" ; then if test x"$found_id3tag_header" = xno ; then as_fn_error $? "*** id3tag.h C header is needed (missing -dev package?) ***\n*** You might have erroneously installed id3lib instead of libid3tag ****\nThis distinction is very delicate, so PLEASE pay attention! ***" "$LINENO" 5 fi ID3TAG_VER=unknown TAG_CFLAGS="" TAG_LIBS="-lid3tag -lz" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TAGLIB" >&5 $as_echo_n "checking for TAGLIB... " >&6; } if test -n "$TAGLIB_CFLAGS"; then pkg_cv_TAGLIB_CFLAGS="$TAGLIB_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"taglib >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "taglib >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAGLIB_CFLAGS=`$PKG_CONFIG --cflags "taglib >= 1.4" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$TAGLIB_LIBS"; then pkg_cv_TAGLIB_LIBS="$TAGLIB_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"taglib >= 1.4\""; } >&5 ($PKG_CONFIG --exists --print-errors "taglib >= 1.4") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_TAGLIB_LIBS=`$PKG_CONFIG --libs "taglib >= 1.4" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then TAGLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "taglib >= 1.4" 2>&1` else TAGLIB_PKG_ERRORS=`$PKG_CONFIG --print-errors "taglib >= 1.4" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$TAGLIB_PKG_ERRORS" >&5 found_taglib_pkg=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } found_taglib_pkg=no else TAGLIB_CFLAGS=$pkg_cv_TAGLIB_CFLAGS TAGLIB_LIBS=$pkg_cv_TAGLIB_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_taglib_pkg=yes fi TAGLIB_VER=`pkg-config --modversion taglib` ac_fn_c_check_header_mongrel "$LINENO" "taglib/tag_c.h" "ac_cv_header_taglib_tag_c_h" "$ac_includes_default" if test "x$ac_cv_header_taglib_tag_c_h" = xyes; then : found_taglib_header=yes else found_taglib_header=no fi # Check whether --with-taglib-prefix was given. if test "${with_taglib_prefix+set}" = set; then : withval=$with_taglib_prefix; taglib_prefix="$withval" else taglib_prefix="" fi if test x"$taglib_prefix" != "x"; then TAGLIB_LIBS="-L$taglib_prefix/lib -ltag_c" TAGLIB_CFLAGS="-I$taglib_prefix/include" have_taglib="yes" $as_echo "#define HAVE_TAGLIB 1" >>confdefs.h else if test x"$found_taglib_pkg" = "xno" ; then if test x"$found_taglib_header" = "xno" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: *** taglib was not found on your system. Deactivating Ogg/FLAC support! ***" >&5 $as_echo "$as_me: *** taglib was not found on your system. Deactivating Ogg/FLAC support! ***" >&6;} TAGLIB_VER="NOT USED" else TAGLIB_VER=unknown TAGLIB_CFLAGS="" TAGLIB_LIBS="-ltag_c" have_taglib="yes" $as_echo "#define HAVE_TAGLIB 1" >>confdefs.h fi else have_taglib="yes" TAGLIB_LIBS="-ltag_c" $as_echo "#define HAVE_TAGLIB 1" >>confdefs.h fi fi if test x"$have_taglib" = "xyes" ; then TAGLIB_COMPILE_TRUE= TAGLIB_COMPILE_FALSE='#' else TAGLIB_COMPILE_TRUE='#' TAGLIB_COMPILE_FALSE= fi # Check whether --with-taglib-only was given. if test "${with_taglib_only+set}" = set; then : withval=$with_taglib_only; taglib_only="yes" else taglib_only="no" fi if test x"$taglib_only" = "xyes" ; then $as_echo "#define TAGLIB_ONLY 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: *** use taglib and taglib only! ***" >&5 $as_echo "$as_me: *** use taglib and taglib only! ***" >&6;} fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MTP" >&5 $as_echo_n "checking for MTP... " >&6; } if test -n "$MTP_CFLAGS"; then pkg_cv_MTP_CFLAGS="$MTP_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmtp >= 0.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmtp >= 0.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MTP_CFLAGS=`$PKG_CONFIG --cflags "libmtp >= 0.3.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$MTP_LIBS"; then pkg_cv_MTP_LIBS="$MTP_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmtp >= 0.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmtp >= 0.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_MTP_LIBS=`$PKG_CONFIG --libs "libmtp >= 0.3.0" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then MTP_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "libmtp >= 0.3.0" 2>&1` else MTP_PKG_ERRORS=`$PKG_CONFIG --print-errors "libmtp >= 0.3.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$MTP_PKG_ERRORS" >&5 found_libmtp_pkg=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } found_libmtp_pkg=no else MTP_CFLAGS=$pkg_cv_MTP_CFLAGS MTP_LIBS=$pkg_cv_MTP_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_libmtp_pkg=yes fi MTP_VER=`pkg-config --modversion libmtp` ac_fn_c_check_header_mongrel "$LINENO" "libmtp.h" "ac_cv_header_libmtp_h" "$ac_includes_default" if test "x$ac_cv_header_libmtp_h" = xyes; then : found_libmtp_header=yes else found_libmtp_header=no fi # Check whether --with-libmtp-prefix was given. if test "${with_libmtp_prefix+set}" = set; then : withval=$with_libmtp_prefix; libmtp_prefix="$withval" else libmtp_prefix="" fi if test x"$libmtp_prefix" != "x"; then MTP_LIBS="-L$libmtp_prefix/lib -lmtp" MTP_CFLAGS="-I$libmtp_prefix/include" MTP_VER=unknown $as_echo "#define HAVE_LIBMTP 1" >>confdefs.h else if test x"$found_libmtp_pkg" = "xno" ; then if test x"$found_libmtp_header" = xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: *** libmtp was not found on your system. Deactivating MTP support! ***" >&5 $as_echo "$as_me: *** libmtp was not found on your system. Deactivating MTP support! ***" >&6;} MTP_VER="NOT USED" else LIBMTP_VER=unknown MTP_CFLAGS="" MTP_LIBS="-lmtp" $as_echo "#define HAVE_LIBMTP 1" >>confdefs.h fi else $as_echo "#define HAVE_LIBMTP 1" >>confdefs.h if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmtp >= 0.3.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libmtp >= 0.3.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then found_libmtp_030_pkg=yes else found_libmtp_030_pkg=no fi if test x"$found_libmtp_030_pkg" = "xyes" ; then $as_echo "#define HAVE_LIBMTP_030 1" >>confdefs.h fi fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GUDEV" >&5 $as_echo_n "checking for GUDEV... " >&6; } if test -n "$GUDEV_CFLAGS"; then pkg_cv_GUDEV_CFLAGS="$GUDEV_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0 >= 143\""; } >&5 ($PKG_CONFIG --exists --print-errors "gudev-1.0 >= 143") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_CFLAGS=`$PKG_CONFIG --cflags "gudev-1.0 >= 143" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GUDEV_LIBS"; then pkg_cv_GUDEV_LIBS="$GUDEV_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0 >= 143\""; } >&5 ($PKG_CONFIG --exists --print-errors "gudev-1.0 >= 143") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GUDEV_LIBS=`$PKG_CONFIG --libs "gudev-1.0 >= 143" 2>/dev/null` else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GUDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors "gudev-1.0 >= 143" 2>&1` else GUDEV_PKG_ERRORS=`$PKG_CONFIG --print-errors "gudev-1.0 >= 143" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GUDEV_PKG_ERRORS" >&5 found_gudev_pkg=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } found_gudev_pkg=no else GUDEV_CFLAGS=$pkg_cv_GUDEV_CFLAGS GUDEV_LIBS=$pkg_cv_GUDEV_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } found_gudev_pkg=yes fi if test x"$found_gudev_pkg" = "xno" ; then GUDEV_VER="NOT USED" else GUDEV_VER=`pkg-config --modversion gudev-1.0` $as_echo "#define HAVE_GUDEV 1" >>confdefs.h fi CFLAGS="$CFLAGS -DGTK_DISABLE_SINGLE_INCLUDES" CFLAGS="$CFLAGS -DG_DISABLE_SINGLE_INCLUDES" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then : enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) as_fn_error $? "Automake 1.5 or newer is required to use intltool" "$LINENO" 5 ;; *) ;; esac if test -n "0.35.0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for intltool >= 0.35.0" >&5 $as_echo_n "checking for intltool >= 0.35.0... " >&6; } INTLTOOL_REQUIRED_VERSION_AS_INT=`echo 0.35.0 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || as_fn_error $? "Your intltool is too old. You need intltool 0.35.0 or later." "$LINENO" 5 fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_UPDATE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_MERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_EXTRACT+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then as_fn_error $? "The intltool scripts were not found. Please install intltool." "$LINENO" 5 fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGMERGE+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then as_fn_error $? "GNU gettext tools not found; required for intltool" "$LINENO" 5 fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_INTLTOOL_PERL+:} false; then : $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then as_fn_error $? "perl not found" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then as_fn_error $? "perl 5.8.1 is required for intltool" "$LINENO" 5 else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } else as_fn_error $? "XML::Parser perl module is required for intltool" "$LINENO" 5 fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi GETTEXT_PACKAGE=gnomad2 cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF for ac_header in locale.h do : ac_fn_c_check_header_mongrel "$LINENO" "locale.h" "ac_cv_header_locale_h" "$ac_includes_default" if test "x$ac_cv_header_locale_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LOCALE_H 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if ${am_cv_val_LC_MESSAGES+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_val_LC_MESSAGES=yes else am_cv_val_LC_MESSAGES=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then $as_echo "#define HAVE_LC_MESSAGES 1" >>confdefs.h fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= ac_fn_c_check_header_mongrel "$LINENO" "libintl.h" "ac_cv_header_libintl_h" "$ac_includes_default" if test "x$ac_cv_header_libintl_h" = xyes; then : gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if ${gt_cv_func_ngettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_ngettext_libc=yes else gt_cv_func_ngettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if ${gt_cv_func_dgettext_libc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gt_cv_func_dgettext_libc=yes else gt_cv_func_dgettext_libc=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if ${ac_cv_lib_intl_bindtextdomain+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_bindtextdomain=yes else ac_cv_lib_intl_bindtextdomain=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dgettext=yes else ac_cv_lib_intl_dgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if ${ac_cv_lib_intl_ngettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_ngettext=yes else ac_cv_lib_intl_ngettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = xyes; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if ${ac_cv_lib_intl_dcgettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_dcgettext=yes else ac_cv_lib_intl_dcgettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = xyes; then : gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do : ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BIND_TEXTDOMAIN_CODESET 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then $as_echo "#define HAVE_GETTEXT 1" >>confdefs.h # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_MSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do : ac_fn_c_check_func "$LINENO" "dcgettext" "ac_cv_func_dcgettext" if test "x$ac_cv_func_dcgettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DCGETTEXT 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:${as_lineno-$LINENO}: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { { $as_echo "$as_me:${as_lineno-$LINENO}: \$MSGFMT -c -o /dev/null conftest.foo"; } >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_GMSGFMT+:} false; then : $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XGETTEXT+:} false; then : $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : CATOBJEXT=.gmo DATADIRNAME=share else case $host in *-*-solaris*) ac_fn_c_check_func "$LINENO" "bind_textdomain_codeset" "ac_cv_func_bind_textdomain_codeset" if test "x$ac_cv_func_bind_textdomain_codeset" = xyes; then : CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then $as_echo "#define ENABLE_NLS 1" >>confdefs.h fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:${as_lineno-$LINENO}: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES if test "x${prefix}" = "xNONE"; then cat >>confdefs.h <<_ACEOF #define GNOMADLOCALEDIR "${ac_default_prefix}/${DATADIRNAME}/locale" _ACEOF else cat >>confdefs.h <<_ACEOF #define GNOMADLOCALEDIR "${prefix}/${DATADIRNAME}/locale" _ACEOF fi ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if eval \${$as_ac_Header+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if ${ac_cv_search_opendir+:} false; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if ${ac_cv_search_opendir+:} false; then : break fi done if ${ac_cv_search_opendir+:} false; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi for ac_header in malloc.h stdlib.h string.h fcntl.h inttypes.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in chdir do : ac_fn_c_check_func "$LINENO" "chdir" "ac_cv_func_chdir" if test "x$ac_cv_func_chdir" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_CHDIR 1 _ACEOF fi done ac_config_files="$ac_config_files Makefile src/Makefile doc/Makefile po/Makefile.in" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TAGLIB_COMPILE_TRUE}" && test -z "${TAGLIB_COMPILE_FALSE}"; then as_fn_error $? "conditional \"TAGLIB_COMPILE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi ac_config_commands="$ac_config_commands po/stamp-it" : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gnomad2 $as_me 2.9.6, which was generated by GNU Autoconf 2.68. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ gnomad2 config.status 2.9.6 configured by $0, generated by GNU Autoconf 2.68, with options \\"\$ac_cs_config\\" Copyright (C) 2010 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then as_fn_error $? "po/Makefile.in.in was not created by intltoolize." "$LINENO" 5 fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo " $PACKAGE $VERSION Configuration : --------------- Source code location .: $srcdir C Preprocessor .......: $CPP $CPPFLAGS C Compiler ...........: $CC $CFLAGS C Linker .............: $CC $LDFLAGS $LIBS GTK+ version .........: $GTK_VER libnjb version........: $LIBNJB_VER libmtp version........: $MTP_VER id3tag version........: $ID3TAG_VER taglib version........: $TAGLIB_VER gudev version.........: $GUDEV_VER Install path .........: $prefix Now type 'make' to build $PACKAGE $VERSION, and then 'make install' for installation. " gnomad2-2.9.6/Makefile.am0000664000076400007640000000127411512614631012052 00000000000000SUBDIRS = src doc po desktopdir = $(datadir)/applications desktop_in_files = gnomad2.desktop.in desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) @INTLTOOL_DESKTOP_RULE@ icondir = $(datadir)/pixmaps icon_DATA = gnomad2-logo.png applicationsdir = $(datadir)/application-registry applications_DATA = gnomad2.applications man_MANS = gnomad2.1 EXTRA_DIST = \ AUTHORS \ TODO \ NEWS \ README \ $(desktop_in_files) \ $(desktop_DATA) \ $(applications_DATA) \ $(icon_DATA) \ intltool-merge.in \ intltool-update.in \ intltool-extract.in \ gnomad2.1 \ mkinstalldirs DISTCLEANFILES = \ po/.intltool-merge-cache \ $(desktop_DATA) \ intltool-extract \ intltool-merge \ intltool-update gnomad2-2.9.6/intltool-extract.in0000664000076400007640000000000011602630253013642 00000000000000gnomad2-2.9.6/src/0000775000076400007640000000000011602630307010657 500000000000000gnomad2-2.9.6/src/id3read.h0000664000076400007640000000140511512614631012265 00000000000000/* id3tag.h id3 interface, headers. Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef ID3HEADER_INCLUDED #define ID3HEADER_INCLUDED 1 void remove_tag_from_mp3file(gchar *path); void get_tag_for_mp3file (metadata_t *meta); void set_tag_for_mp3file (metadata_t *meta, gboolean override); #endif gnomad2-2.9.6/src/mp3file.h0000664000076400007640000000130011512614631012303 00000000000000/* mp3file.h Accessing the metadata of a raw MPEG stream, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef MP3FILEH_INCLUDED #define MP3FILEH_INCLUDED 1 gchar *length_from_file(gchar *path, size_t size); #endif gnomad2-2.9.6/src/filesystem.c0000664000076400007640000007071111601423527013140 00000000000000/* filesystem.c Interface to the posix (well...) file system Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "metadata.h" #include "filesystem.h" #include "filenaming.h" #include "prefs.h" #include "util.h" #include "mp3file.h" #include "id3read.h" #include "wmaread.h" #include "riffile.h" #include "xfer.h" #ifdef HAVE_TAGLIB #include "tagfile.h" #endif #include #include /* Extra includes used by this file only */ #include #include #include #include #include #ifndef G_OS_WIN32 #include #endif /* Globally imported variables */ extern GtkWidget *main_window; /* Local variables */ static gint preffd; /* * Types and function to send drawing down to idle thread */ typedef struct { GtkWidget *label; gchar *text; } draw_label_args_t; typedef struct { GtkWidget *progress; gfloat fraction; } fraction_set_args_t; typedef struct { listtype_t listtype; GList *metalist; } metadata_set_args_t; static gboolean draw_label(gpointer p) { draw_label_args_t *args = (draw_label_args_t *) p; if (args != NULL) { if (args->label != NULL && args->text != NULL) { gtk_label_set_text(GTK_LABEL(args->label), args->text); } if (args->text != NULL) g_free(args->text); g_free(args); } return FALSE; } static gboolean update_fraction(gpointer p) { fraction_set_args_t *args = (fraction_set_args_t *) p; if (args != NULL) { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(args->progress), args->fraction); g_free(args); } return FALSE; } static gboolean update_metadata(gpointer p) { metadata_set_args_t *metarg = (metadata_set_args_t *) p; GList *tmp; if (metarg != NULL) { recreate_list_store(metarg->listtype); tmp = metarg->metalist; while (tmp) { metadata_t *meta; meta = (metadata_t *) tmp->data; // g_print("Adding metadata for \"%s\" to model\n", meta->path); add_metadata_to_model(meta, metarg->listtype); tmp = tmp->next; destroy_metadata_t(meta); } g_list_free(metarg->metalist); view_and_sort_list_store(metarg->listtype); g_free(metarg); } return FALSE; } /* Filecopy routine loosely based on * http://www.snippets.org/snippets/portable/WB_FCOPY+C.php3 */ gboolean copy_file(gchar *source, gchar *dest) { gint f1, f2; f1 = (gint) g_open(source, READONLY_FLAGS, 0); if (f1 < 0) return FALSE; #if !GLIB_CHECK_VERSION(2,8,0) f2 = (gint) creat(dest, (mode_t) CREATE_FILEMODE); #else f2 = (gint) g_creat(dest, (mode_t) CREATE_FILEMODE); #endif if (f2 >= 0) { guint bufsiz; gboolean retval = FALSE; gchar *buffer; for (bufsiz = 0x8000; bufsiz >= 128; bufsiz >>= 1) { buffer = (gchar *) g_malloc(bufsiz); } if (buffer == NULL) { return FALSE; } while (1) { register gint n; n = read(f1,buffer,bufsiz); if (n == -1) { break; } if (n == 0) { retval = TRUE; break; } if (n != write(f2,buffer,n)) { break; } } g_free(buffer); close(f1); close(f2); if (!retval) { remove(dest); // Delete partial file } return retval; } close(f1); return FALSE; } /** * Get the 64bit file size for a file. Return 0 if failed. * Does not currently expect path to be UTF-8 but assumes * local filesystem encoding. */ guint64 get_64bit_file_size(const gchar * const path) { struct stat sb; // Get the size that we actually have now... if ( stat(path, &sb) == -1 ) { g_print("Error getting file size for \"%s\"!!\n", path); return 0; } // TODO: fix this to actually find the 64bit size! return (guint64) sb.st_size; } /* Unicode conversion wrappers that enables * forcing the local charset to something disregarding * the locale setting and such stuff. */ gchar *filename_toutf8(const gchar * const instr) { #ifndef G_OS_WIN32 gchar *tmp; if (get_prefs_force_8859()) { tmp = g_convert(instr,-1,"UTF-8","ISO-8859-1",NULL,NULL,NULL); } else { tmp = g_filename_to_utf8(instr,-1,NULL,NULL,NULL); /* If this conversion fails, fall back to ISO 8859-1 */ if (tmp == NULL) { /* Something is wrong with the locales */ gchar *lang = getenv("LANG"); g_print("Seems like you're using a filesystem which still contains ISO 8859-1 characters\n"); g_print("though your locale is \"%s\". The right thing to do is to convert\n", lang); g_print("all file- and directorynames in your filesystem to UTF-8 format.\n"); g_print("Otherwise, consider checking \"force to 8859-1\" option for a workaround.\n\n"); tmp = g_convert(instr,-1,"UTF-8","ISO-8859-1",NULL,NULL,NULL); } } return tmp; #else // Windows will always use UTF-8 everywhere. return g_strdup(instr); #endif } gchar *filename_fromutf8(const gchar * const instr) { #ifndef G_OS_WIN32 gchar *tmp; if (get_prefs_force_8859()) { /* FIXME utf8 conversion * when the system fails to convert the fname, ask the user * but until the dialog box is created, don't crash, use * "?" for fname characters that can't be converted instead of: * tmp = g_convert(instr,-1,"ISO-8859-1","UTF-8",NULL,NULL,NULL); */ tmp = g_convert_with_fallback(instr,-1,"ISO-8859-1","UTF-8","?",NULL,NULL,NULL); } else { tmp = g_filename_from_utf8(instr,-1,NULL,NULL,NULL); } return tmp; #else // Windows will always use UTF-8 everywhere. return g_strdup(instr); #endif } gboolean is_directory(gchar *dir) { struct stat st; gchar *tmp; tmp = filename_fromutf8(dir); stat(tmp, &st); g_free(tmp); return S_ISDIR(st.st_mode); } static GList *get_directory_listing(gchar* base_path, gboolean anyfile) { GList *filelist; DIR * dirp; struct dirent * dir_entry; gchar *tmppath; /* Returns a listing of applicable files */ /* returned GSList contains file / size pairs. */ /* Directories: no full path, just dirname; size 0 */ filelist = NULL; tmppath = filename_fromutf8(base_path); if (gnomad_debug != 0) { g_print("Getting directory listing for: %s\n", base_path); } dirp = opendir(tmppath); if (!dirp){ if (gnomad_debug != 0) { g_print("Unable to open directory %s.\n", tmppath); } return NULL; } while ((dir_entry = readdir(dirp)) != NULL) { struct stat entry_status; gchar path_buffer[512]; gchar *filename; int size; int is_dir; int is_file; strncpy(path_buffer, tmppath, sizeof(path_buffer)-1); path_buffer[sizeof(path_buffer)-1] = '\0'; strncat(path_buffer, G_DIR_SEPARATOR_S, sizeof(path_buffer)-1-strlen(path_buffer)); strncat(path_buffer, dir_entry->d_name, sizeof(path_buffer)-1-strlen(path_buffer)); if (gnomad_debug != 0) { g_print("Examining dir path: %s\n", path_buffer); } if (stat(path_buffer, &entry_status)) { if (gnomad_debug != 0) { g_print("Failed to read file status for %s.\n", path_buffer); } continue; } size = (int) entry_status.st_size; is_dir = S_ISDIR(entry_status.st_mode); is_file = S_ISREG(entry_status.st_mode); if (is_dir) { /* We don't want this "dir" */ if (!strcmp(dir_entry->d_name,".")) { continue; } /* If the prefs are selected not to display the hidden * directories, we hide them. */ #ifndef G_OS_WIN32 if (strlen(dir_entry->d_name) >= 2) { if (dir_entry->d_name[0] == '.' && dir_entry->d_name[1] != '.' && !get_prefs_display_dotdirs()) continue; } #endif } else if (is_file) { char tmp_codec[5]; char *tmp; if (!anyfile) { /* Must be more atleast one byte */ if (size == 0) continue; /* Must have sane filename */ if (strlen(dir_entry->d_name) < 4) continue; strcpy(tmp_codec, dir_entry->d_name+strlen(dir_entry->d_name)-4); tmp = g_utf8_strdown(tmp_codec, -1); /* Only display valid files */ if (g_ascii_strcasecmp(tmp+1,"mp3") && g_ascii_strcasecmp(tmp+1,"wav") && g_ascii_strcasecmp(tmp+1,"avi") && g_ascii_strcasecmp(tmp+1,"wmv") && g_ascii_strcasecmp(tmp+1,"wma") #ifdef HAVE_LIBMTP // Additional music codecs supported by libmtp // TODO: base this on the list of filetypes actually // supported by a particular device, if one is connected. && g_ascii_strcasecmp(tmp+1,"ogg") && g_ascii_strcasecmp(tmp,"flac") && g_ascii_strcasecmp(tmp+1,"mp2") && g_ascii_strcasecmp(tmp+1,"m4a") && g_ascii_strcasecmp(tmp+1,"aac") && g_ascii_strcasecmp(tmp+1,"mp4") #endif ) { g_free(tmp); continue; } g_free(tmp); } } /* only directories and valid files come here, the * list is NOT in UTF-8, that conversion will be * done by the caller of this routine. */ if (is_dir) { /* For directories, set size to 0 */ size = 0; } #ifndef G_OS_WIN32 filename = g_strdup(path_buffer); // g_printf("strdup(%s)=%s\n", path_buffer, filename); #else // On Windows we need to convert into UTF-8 since // this does not use the stdio wrappers properly. filename = g_locale_to_utf8(path_buffer,-1,NULL,NULL,NULL); #endif if (gnomad_debug != 0) { g_print("Adding dir entry: %s, size %d\n", filename, size); } filelist = g_list_append(filelist, filename); filelist = g_list_append(filelist, GUINT_TO_POINTER(size)); } closedir(dirp); g_free(tmppath); return filelist; } static GList *get_metadata_for_dirlist(GList *inlist, listtype_t listtype, dirfill_thread_arg_t *args) { GList *metalist = NULL; GList *filelist; guint nofiles = 0; /* initialize to shut up GCC */ guint currentfile; gboolean use_dialog = FALSE; gboolean cancelled = FALSE; /* Count the number of files */ if (args != NULL) { use_dialog = TRUE; filelist = inlist; nofiles = 0; while (filelist) { nofiles ++; filelist = filelist->next; filelist = filelist->next; } currentfile = 0; } filelist = inlist; while ((filelist != NULL) && !cancelled) { metadata_t *meta; gchar *path; gchar *tmp; gchar fileext[5]; meta = new_metadata_t(); /* Full path -> ID column */ path = filelist->data; meta->path = filename_toutf8(path); if (meta->path == NULL) { g_print("%s created a NULL value in conversion to UTF-8!\n", path); } /* If filename is ISO-8859-1 convert it by force! */ filelist = filelist->next; meta->size = GPOINTER_TO_UINT(filelist->data); filelist = filelist->next; tmp = g_path_get_basename(path); if (tmp == NULL) { meta->filename = NULL; g_print("Basename was NULL\n"); } else { meta->filename = filename_toutf8(tmp); g_free(tmp); } if (use_dialog) { draw_label_args_t *da; da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup_printf("File %d of %d", currentfile, nofiles); g_idle_add(draw_label, da); currentfile ++; if (gnomad_debug != 0) { g_print("Getting metadata for: %s (%d/%d)\n", meta->filename, currentfile, nofiles); } } /* Find codec/file extension first */ fileext[0] = 0; if (strlen(meta->path) > 5) { gchar *tmp = meta->path; // Accept 3 or 4 character extensions if (tmp[strlen(tmp)-4] == '.') { strcpy(fileext, tmp+strlen(tmp)-3); } else if (tmp[strlen(tmp)-5] == '.') { strcpy(fileext, tmp+strlen(tmp)-4); } // Uppercase it. g_strup(fileext); meta->codec = g_strdup(fileext); } if (listtype == HDDATA_LIST) { /* * For data files, provide basic data nothing additional is needed. * The file extension will be used to map the apropriate transfer * type later. */ } else { /* For music files, fill in row by using libid3tag and friends */ if (meta->size != 0) { if (!strcmp(meta->codec,"MP3")) { /* Gets the ID3 tag if any */ if (gnomad_debug != 0) { g_print("Getting ID3 info for: %s\n", meta->filename); } #if defined(HAVE_TAGLIB) && defined(TAGLIB_ONLY) get_tag_for_file(meta); #else get_tag_for_mp3file(meta); /* FIXME: use taglib to do this, if it is available. */ /* Scans the mp3 frames to calculate play length */ if ((meta->length == NULL) && (meta->path != NULL)) { // g_print("Calling length_from_file()...\n"); gchar *tmppath = filename_fromutf8(meta->path); meta->length = length_from_file(tmppath, meta->size); g_free(tmppath); } #endif } if (!strcmp(meta->codec,"WAV")) { /* FIXME: learn how to read metadata from WAV files */ get_tag_for_wavfile(meta); if (meta->length == NULL) { meta->length = strdup("0:01"); } } if (!strcmp(meta->codec,"WMA")) { get_tag_for_wmafile(meta); } #ifdef HAVE_LIBMTP if (!strcmp(meta->codec,"OGG")) { #ifdef HAVE_TAGLIB get_tag_for_file(meta); #endif } if (!strcmp(meta->codec,"FLAC")) { #ifdef HAVE_TAGLIB get_tag_for_file(meta); #endif } if (!strcmp(meta->codec,"AVI")) { get_tag_for_avifile(meta); } // Implement getting track metadata for the other libmtp // supported filetypes here... if (!strcmp(meta->codec,"MP2")) { } if (!strcmp(meta->codec,"M4A")) { } if (!strcmp(meta->codec,"AAC")) { } if (!strcmp(meta->codec,"MP4")) { } #endif /* * Gather additional information from the path and file name * if this preference is set. */ if (get_prefs_detect_metadata()) { info_from_path(meta, TRUE); } else { info_from_path(meta, FALSE); } /* At last pad any empty fields to be * (the way playcenter does it) */ if (meta->artist == NULL) meta->artist = g_strdup(""); if (meta->title == NULL) meta->title = g_strdup(""); if (meta->album == NULL) meta->album = g_strdup(""); if (meta->codec == NULL) meta->codec = g_strdup(""); if (meta->genre == NULL) meta->genre = g_strdup(""); if (meta->length == NULL) meta->length = g_strdup(""); if (meta->filename == NULL) { tmp = g_path_get_basename(path); meta->filename = filename_toutf8(tmp); g_free(tmp); } } else { if (meta->path == NULL) { meta->artist = g_strdup(""); } else { /* For directories: copy dirname to Artist field */ gchar **tmpv; gint i; tmpv = g_strsplit(meta->path, G_DIR_SEPARATOR_S, 0); /* Find last component */ for (i = 0; tmpv[i] != NULL; i++) {}; if (i >= 1) meta->artist = g_strdup(tmpv[i-1]); g_strfreev(tmpv); } } } /* Add this to the metadata list */ metalist = g_list_append(metalist, meta); /* Update progress bar */ if (use_dialog) { fraction_set_args_t *fsa; gfloat fraction = ((gdouble) currentfile / (gdouble) nofiles); fsa = (fraction_set_args_t *) g_malloc(sizeof(fraction_set_args_t)); fsa->progress = args->progress; fsa->fraction = fraction; g_idle_add(update_fraction, fsa); cancelled = args->cancelled; } } return metalist; } /** * @param args if this and the following parameter is null the call is assumed to be * non-threaded, else it is updated and handled as if called from a thread. * Else it is assumed to be called from a single-threaded context and will not * display update information. */ GList *get_metadata_dir(listtype_t listtype, gchar *path, dirfill_thread_arg_t *args) { GList *metalist; GList *filelist; GList *tmp; /* If it is for the data view, get for ALL files */ if (args != NULL) { draw_label_args_t *da; da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(_("Getting file list from filesystem")); g_idle_add(draw_label, da); } filelist = get_directory_listing(path, (listtype == HDDATA_LIST)); /* This is the heavy part */ metalist = get_metadata_for_dirlist(filelist, listtype, args); /* Free the filelist, not used any more */ tmp = filelist; while (tmp) { g_free(tmp->data); /* Free all paths */ tmp = tmp->next; tmp = tmp->next; } g_list_free(filelist); return metalist; } static gboolean call_destroy_args(gpointer data) { dirfill_thread_arg_t *args = data; GtkWidget *w = (GtkWidget *) args->dialog; if (args == NULL) return FALSE; if (args->dialog != NULL) gtk_widget_destroy(GTK_WIDGET(args->dialog)); if (args->path != NULL) g_free(args->path); g_free(args); return FALSE; } static gpointer dirfill_thread(gpointer thread_args) { dirfill_thread_arg_t *args = (dirfill_thread_arg_t *) thread_args; GList *metalist; draw_label_args_t *da; metadata_set_args_t *metarg; /* This is time consuming */ metalist = get_metadata_dir(args->listtype, args->path, args); da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(_("Adding metadata to view")); g_idle_add(draw_label, da); metarg = (metadata_set_args_t *) g_malloc(sizeof(metadata_set_args_t)); metarg->listtype = args->listtype; metarg->metalist = metalist; g_idle_add(update_metadata,metarg); g_idle_add(call_destroy_args, args); return NULL; } /** * This callback function will cancel the ongoing * fill-in of metadata for a certain thread. */ void swapped_cancel_fillin_callback(gpointer *data) { dirfill_thread_arg_t *args = (dirfill_thread_arg_t *) data; g_print("Cancelled scan of %s!\n", args->path); args->cancelled = TRUE; } /** * This will fire up a separate thread which retrieves * the metadata for a certain host-side directory. Both * tracks and common data files. * @param listtype the list pane to retrieve. Must be one * of the harddisk-refering panes. * @param path the path to retrieve metadata from. */ void fill_in_dir(listtype_t listtype, gchar *path) { dirfill_thread_arg_t *dirfill_thread_args; GtkWidget *label1; GtkWidget *dialog, *scanlabel, *metadata_progress_bar, *separator; dirfill_thread_args = (dirfill_thread_arg_t *) g_malloc(sizeof(dirfill_thread_arg_t)); // Create a dialog... dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, (listtype == HDDATA_LIST) ? _("Getting file metadata") : _("Getting track metadata")); gtk_window_set_title (GTK_WINDOW(dialog), (listtype == HDDATA_LIST) ? _("Getting file metadata") : _("Getting track metadata")); gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 5); gtk_box_set_homogeneous(GTK_BOX(GTK_DIALOG(dialog)->action_area), TRUE); g_signal_connect_swapped(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(swapped_cancel_fillin_callback), (gpointer) dirfill_thread_args); g_signal_connect_swapped(GTK_OBJECT(dialog), "response", G_CALLBACK(swapped_cancel_fillin_callback), (gpointer) dirfill_thread_args); label1 = gtk_label_new(path); scanlabel = gtk_label_new(""); metadata_progress_bar = gtk_progress_bar_new(); separator = gtk_hseparator_new (); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scanlabel, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), metadata_progress_bar, TRUE, TRUE, 0); gtk_progress_bar_update(GTK_PROGRESS_BAR(metadata_progress_bar), (gfloat) 0); gtk_widget_show_all(dialog); dirfill_thread_args->dialog = dialog; dirfill_thread_args->label = scanlabel; dirfill_thread_args->progress = metadata_progress_bar; dirfill_thread_args->listtype = listtype; dirfill_thread_args->path = g_strdup(path); dirfill_thread_args->cancelled = FALSE; g_thread_create(dirfill_thread,(gpointer) dirfill_thread_args, FALSE, NULL); } gchar *get_current_dir(void) { gchar *tmp, *path; /* Retrieve the current working directory somehow */ tmp = g_get_current_dir(); path = filename_toutf8(tmp); g_free(tmp); return path; } void change_directory(gchar *dir) { gchar *tmp; tmp = filename_fromutf8(dir); #if GLIB_CHECK_VERSION(2,8,0) g_chdir(tmp); #else chdir(tmp); #endif g_free(tmp); } gint remove_dir_contents(gchar *dir) { GDir * current_dir; const gchar * file = NULL; gchar * current_file = NULL; gint c = 0; if ((current_dir = g_dir_open(dir,0,NULL)) == NULL) return -1; while ((file = g_dir_read_name(current_dir)) != NULL) { current_file = g_build_filename (dir, file, NULL); if (g_file_test(current_file, G_FILE_TEST_IS_DIR)) { c += remove_dir_contents(current_file); } c += g_remove(current_file); g_free(current_file); } g_dir_close(current_dir); return c; } gint delete_files(GList *filelist) { GList *tmplist = g_list_first(filelist); gchar *tmp; guint c = 0; while (tmplist != NULL) { metadata_t *meta = (metadata_t *) tmplist->data; /* g_print("Deleting: %s\n", meta->path); */ tmp = filename_fromutf8(meta->path); /* * Skip past current and parent directory if selected. * Be sure to avoid also /foo/bar/.. and /foo/bar/. */ if ( (strlen(tmp) >= 1 && !strcmp(tmp+strlen(tmp)-1, ".")) || (strlen(tmp) >= 2 && !strcmp(tmp+strlen(tmp)-2, "..")) ) { g_print("Skipping deletion of: %s\n", meta->path); g_free(tmp); tmplist = tmplist->next; continue; } if (g_file_test(tmp, G_FILE_TEST_IS_DIR)) { remove_dir_contents(tmp); } c += g_remove(tmp); g_free(tmp); tmplist = tmplist->next; } return c; } /* Copy a file and remove the tag */ gboolean clone_and_strip_tag(const gchar * const source, const gchar * const dest, const gchar * const codec) { gchar *tmpsource, *tmpdest; tmpsource = filename_fromutf8(source); tmpdest = filename_fromutf8(dest); if (copy_file(tmpsource, tmpdest)) { /* Next strip the tag */ /* g_print("Stripping tag from %s\n", dest); */ if (!strcmp(codec, "MP3")) { #if defined(HAVE_TAGLIB) && defined(TAGLIB_ONLY) remove_tag_from_file(tmpdest); #else remove_tag_from_mp3file(tmpdest); #endif } #ifdef HAVE_TAGLIB else if (!strcmp(codec, "OGG") || !strcmp(codec, "FLAC")) { remove_tag_from_file(tmpdest); } #endif g_free(tmpsource); g_free(tmpdest); return TRUE; } g_free(tmpsource); g_free(tmpdest); return FALSE; } /* Get a file descriptor for the preference file */ gint get_prefsfile_fd(gboolean write) { static gchar filename[] = "." PACKAGE "rc"; static gchar *path = NULL; if (path == NULL) { gchar *tmp; tmp = g_utf8_strdown(filename, -1); path = g_strdup(g_get_home_dir()); path = stringcat(path, G_DIR_SEPARATOR_S); path = stringcat(path, tmp); g_free(tmp); } if (write) { preffd = (gint) g_open(path, WRITEONLY_FLAGS, (mode_t) CREATE_FILEMODE); if (preffd < 0) #if !GLIB_CHECK_VERSION(2,8,0) preffd = (gint) creat(path, (mode_t) CREATE_FILEMODE); #else preffd = (gint) g_creat(path, (mode_t) CREATE_FILEMODE); #endif } else { preffd = (gint) g_open(path, READONLY_FLAGS, 0); } if (preffd < 0 && write) { create_error_dialog(_("Could not write preference file")); } return preffd; } /* Close a preference file */ void close_prefsfile(void) { close(preffd); preffd = 0; } /* Close a preference file */ void rewrite_prefsfile(gchar *prefs) { get_prefsfile_fd(TRUE); write(preffd, prefs, strlen(prefs)); close_prefsfile(); } /* Function from gftp lib/misc.c */ char *expand_path (char *src) { // The following is very POSIX #ifndef G_OS_WIN32 char *str, *pos, *endpos, *prevpos, *newstr, *tempstr, tempchar; struct passwd *pw; pw = NULL; str = filename_fromutf8(src); if (*str == '~') { if (*(str + 1) == G_DIR_SEPARATOR || (pos = strchr (str, G_DIR_SEPARATOR)) == NULL) { pw = getpwuid (geteuid ()); } else { *pos = '\0'; pw = getpwnam (str + 1); *pos = G_DIR_SEPARATOR; } } endpos = str; newstr = NULL; while ((pos = strchr (endpos, G_DIR_SEPARATOR)) != NULL) { pos++; while (*pos == G_DIR_SEPARATOR) pos++; if ((endpos = strchr (pos, G_DIR_SEPARATOR)) == NULL) endpos = strchr (pos, '\0'); tempchar = *endpos; *endpos = '\0'; if (strcmp (pos, "..") == 0) { *(pos - 1) = '\0'; if (newstr != NULL && (prevpos = strrchr (newstr, G_DIR_SEPARATOR)) != NULL) *prevpos = '\0'; } else if (strcmp (pos, ".") != 0) { if (newstr == NULL) { newstr = g_malloc (strlen (pos - 1) + 1); strcpy (newstr, pos - 1); } else { tempstr = g_strconcat (newstr, pos - 1, NULL); g_free (newstr); newstr = tempstr; } } *endpos = tempchar; if (*endpos == '\0') break; endpos = pos + 1; } if (newstr == NULL || *newstr == '\0') { if (newstr != NULL) g_free (newstr); newstr = g_malloc (2); *newstr = G_DIR_SEPARATOR; *(newstr + 1) = '\0'; } if (newstr != NULL) { g_free (str); str = newstr; } if (pw != NULL) { if ((pos = strchr (str, G_DIR_SEPARATOR)) == NULL) { newstr = g_malloc (strlen (pw->pw_dir) + 1); strcpy (newstr, pw->pw_dir); } else newstr = g_strconcat (pw->pw_dir, pos, NULL); if (str) g_free (str); return (newstr); } else { newstr = g_malloc (strlen (str) + 1); strcpy (newstr, str); } g_free (str); str = newstr; newstr = filename_toutf8(str); g_free(str); return (newstr); #else return g_strdup(src); #endif } /* Test if a file is writeable or not */ gboolean test_writeable(gchar *path) { FILE *file; /* Test to know if we can write into the file */ file = (FILE *) g_fopen(path,READPLUS_FOPEN_STRING); if (file == NULL) { return FALSE; } fclose(file); return TRUE; } gboolean create_directory(gchar *path) { if (g_mkdir(path, CREATE_DIRMODE) == -1) { return FALSE; } else { return TRUE; } } void create_dirs(gchar *filename) { struct stat st; gchar **tmpv; gchar *path; gint i, dirs; tmpv = g_strsplit(filename, G_DIR_SEPARATOR_S, 0); for (dirs=0; tmpv[dirs]; ++dirs); if (--dirs < 1) goto out; path = g_strdup(tmpv[0]); for (i=0;;) { gchar *tmp; gint ret = 0; ret = stat(path, &st); if (ret < 0 || !S_ISDIR(st.st_mode)) create_directory(path); if (++i >= dirs) break; tmp = path; path = g_strjoin(G_DIR_SEPARATOR_S, path, tmpv[i], NULL); g_free(tmp); } g_free(path); out: g_strfreev(tmpv); } void export_playlistfile(gchar *filename, gchar *formatstring, GList *playlist, gboolean m3ufile, gboolean plsfile) { gchar *tmpname = filename_toutf8(filename); gint fd; gchar m3uheader[] = "#EXTM3U\n"; gchar plsheader[] = "[playlist]\n"; GList *tmp; guint i; fd = (gint) g_open(tmpname, WRITEONLY_FLAGS, (mode_t) CREATE_FILEMODE); if (fd < 0) #if !GLIB_CHECK_VERSION(2,8,0) fd = (gint) creat(tmpname, (mode_t) CREATE_FILEMODE); #else fd = (gint) g_creat(tmpname, (mode_t) CREATE_FILEMODE); #endif if (fd < 0) { create_error_dialog(_("Could not write exported playlist")); return; } if (m3ufile) { write(fd, m3uheader, strlen(m3uheader)); } else if (plsfile) { write(fd, plsheader, strlen(plsheader)); } tmp = g_list_first(playlist); i = 1; while (tmp != NULL) { gchar *song; gchar *row; metadata_t *meta; meta = (metadata_t *) tmp->data; tmp = g_list_next(tmp); song = compose_metadata_string(meta, formatstring, FALSE); if (m3ufile || plsfile) { guint tmplen = mmss_to_seconds(meta->length); gchar *tmpfname = compose_filename(meta); if (m3ufile) { row = g_strdup_printf("#EXTINF:%u,%s\n%s\n", tmplen, song, tmpfname); } else { row = g_strdup_printf("File%u=%s\nTitle%u=%s\nLength%u=%u\n", i, tmpfname, i, song, i, tmplen); } g_free(tmpfname); } else { row = g_strdup_printf("%d. %s\n", i, song); } write(fd, row, strlen(row)); g_free(song); g_free(row); i++; } if (plsfile) { gchar *footer = g_strdup_printf("NumberOfEntries=%u\nVersion=2\n", i-1); write(fd, footer, strlen(footer)); g_free(footer); } close(fd); } gnomad2-2.9.6/src/metadata.h0000664000076400007640000000553711512614631012544 00000000000000/* metadata.h Metadata list stores, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef METADATAH_INCLUDED #define METADATAH_INCLUDED 1 typedef struct { gchar *artist; gchar *title; gchar *album; guint32 year; gchar *genre; gchar *length; gulong size; gchar *codec; guint32 trackno; gboolean protect; gchar *filename; gchar *path; gchar *folder; } metadata_t; enum { TRACKLIST_ARTIST_COLUMN, TRACKLIST_TITLE_COLUMN, TRACKLIST_ALBUM_COLUMN, TRACKLIST_YEAR_COLUMN, TRACKLIST_GENRE_COLUMN, TRACKLIST_LENGTH_COLUMN, TRACKLIST_SIZE_COLUMN, TRACKLIST_CODEC_COLUMN, TRACKLIST_TRACKNO_COLUMN, TRACKLIST_PROTECTED_COLUMN, TRACKLIST_FILENAME_COLUMN, TRACKLIST_ID_COLUMN, /* Hidden */ TRACKLIST_FOLDER_COLUMN, /* Hidden */ TRACKLIST_N_COLUMNS }; enum { PLIST_PLAYLISTNAME_COLUMN, PLIST_ARTIST_COLUMN, PLIST_TITLE_COLUMN, PLIST_LENGTH_COLUMN, PLIST_PLID_COLUMN, /* Hidden */ PLIST_SONGID_COLUMN, /* Hidden */ PLIST_N_COLUMNS }; enum { FILELIST_FILENAME_COLUMN, FILELIST_SIZE_COLUMN, FILELIST_ID_COLUMN, /* Hidden */ FILELIST_FOLDER_COLUMN, /* Hidden */ FILELIST_EXTENSION_COLUMN, /* Hidden */ FILELIST_N_COLUMNS }; typedef enum { HD_LIST, JB_LIST, HDDATA_LIST, JBDATA_LIST, PL_TREE } listtype_t; metadata_t *new_metadata_t(void); void destroy_metadata_t(metadata_t *meta); metadata_t *clone_metadata_t(metadata_t const * const meta); void dump_metadata_t(metadata_t const * const meta); gchar *compose_metadata_string(metadata_t const * const meta, gchar const * const template, gboolean const filesystemsafe); metadata_t *get_metadata_from_model(GtkTreeModel *model, GtkTreeIter *iter); metadata_t *get_data_metadata_from_model(GtkTreeModel *model, GtkTreeIter *iter); void add_metadata_to_model(metadata_t const * const meta, listtype_t const listtype); GtkTreeSelection *get_metadata_selection(listtype_t listtype); GList *get_all_metadata_from_selection(listtype_t listtype); void destroy_metalist(GList *metalist); metadata_t *get_first_metadata_from_selection(listtype_t listtype); void remove_selected(listtype_t listtype); void view_and_sort_list_store(listtype_t listtype); void recreate_list_store(listtype_t listtype); void create_list_stores(void); void clear_list_store(listtype_t listtype); #endif gnomad2-2.9.6/src/prefs.c0000664000076400007640000004616411512614631012077 00000000000000/* prefs.c Graphical widgets and callbacks for the preferences frame Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "prefs.h" #include "util.h" #include "filesystem.h" static GtkWidget *tagoverride = NULL; static GtkWidget *tagremove = NULL; static GtkWidget *usetag = NULL; static GtkWidget *useid3_unicode = NULL; static GtkWidget *display_dotdirs = NULL; #ifndef G_OS_WIN32 static GtkWidget *force_8859 = NULL; #endif static GtkWidget *filenameformat = NULL; static GtkWidget *use_origname = NULL; static GtkWidget *ask_playlist = NULL; static GtkWidget *recurse_dir = NULL; static GtkWidget *detect_metadata = NULL; static GtkWidget *extended_metadata = NULL; static GtkWidget *autoscan = NULL; static GtkWidget *set_time = NULL; static GtkWidget *remember_dir = NULL; static GtkWidget *turbo_mode = NULL; static gboolean get_prefs_remember_dir(void); static void read_prefs_file(void) { const gchar scannername[] = PACKAGE " lexical scanner"; GScanner *scanner; GTokenType token = G_TOKEN_NONE; gint preffd; /* This indicates that said option _must_ be selected */ gboolean must_read_extended_metadata = FALSE; gchar *name; /* These shall be TRUE by default */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tagremove), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usetag), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useid3_unicode), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_playlist), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(detect_metadata), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(autoscan), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(set_time), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remember_dir), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(turbo_mode), TRUE); /* g_print("Called read prefs\n"); */ scanner = g_scanner_new(NULL); scanner->input_name = scannername; preffd = get_prefsfile_fd(FALSE); if (preffd <= 0) return; g_scanner_input_file(scanner, preffd); while (!g_scanner_eof(scanner) && token != G_TOKEN_LAST) { token = g_scanner_get_next_token(scanner); if (token == G_TOKEN_IDENTIFIER) { name = g_strdup(g_scanner_cur_value(scanner).v_identifier); /* g_print("Found identifier %s\n", name); */ /* We found an identifier! Get the value! * only accept strings and bits as of now */ while (token != G_TOKEN_STRING && token != G_TOKEN_INT && !g_scanner_eof(scanner)) token = g_scanner_get_next_token(scanner); if (!strcmp(name, "FILENAME_FORMAT_STRING")) { gtk_entry_set_text(GTK_ENTRY(filenameformat), g_scanner_cur_value(scanner).v_string); } else if (!strcmp(name, "USE_ORIGNAME")) { if (g_scanner_cur_value(scanner).v_int) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_origname), TRUE); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(extended_metadata), TRUE); must_read_extended_metadata = TRUE; } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_origname), FALSE); } } else if (!strcmp(name, "DISPLAY_DOTDIRS")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(display_dotdirs), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(display_dotdirs), FALSE); } else if (!strcmp(name, "ID3_REMOVE") || !strcmp(name, "TAG_REMOVE")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tagremove), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tagremove), FALSE); } else if (!strcmp(name, "ID3_OVERRIDE") || !strcmp(name, "TAG_OVERRIDE")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tagoverride), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(tagoverride), FALSE); } else if (!strcmp(name, "USE_ID3V1") || !strcmp(name, "USE_ID3V2") || !strcmp(name, "USE_ID3") || !strcmp(name, "USE_TAG")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usetag), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usetag), FALSE); } else if (!strcmp(name, "USE_ID3_UNICODE")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useid3_unicode), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(useid3_unicode), FALSE); } else if (!strcmp(name, "ASK_PLAYLIST")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_playlist), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ask_playlist), FALSE); } else if (!strcmp(name, "RECURSE_DIR")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(recurse_dir), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(recurse_dir), FALSE); #ifndef G_OS_WIN32 } else if (!strcmp(name, "FORCE_8859")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(force_8859), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(force_8859), FALSE); #endif } else if (!strcmp(name, "DETECT_METADATA")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(detect_metadata), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(detect_metadata), FALSE); } else if (!strcmp(name, "EXTENDED_METADATA")) { if (g_scanner_cur_value(scanner).v_int || must_read_extended_metadata) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(extended_metadata), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(extended_metadata), FALSE); } else if (!strcmp(name, "AUTOSCAN")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(autoscan), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(autoscan), FALSE); } else if (!strcmp(name, "SET_TIME")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(set_time), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(set_time), FALSE); } else if (!strcmp(name, "REMEMBER_DIR")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remember_dir), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(remember_dir), FALSE); } else if (!strcmp(name, "TURBO_MODE")) { if (g_scanner_cur_value(scanner).v_int) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(turbo_mode), TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(turbo_mode), FALSE); } else if (!strcmp(name, "CURRENT_DIRECTORY")) { if (get_prefs_remember_dir() && is_directory(g_scanner_cur_value(scanner).v_string)) { change_directory(g_scanner_cur_value(scanner).v_string); } } // Then also change dir g_free(name); } } g_scanner_destroy(scanner); close_prefsfile(); } void write_prefs_file(void) { gchar *prefs = NULL; gchar *fnameformat = NULL; gchar *tmp; /* g_print("Called write prefs\n"); */ prefs = stringcat(prefs, "# " PACKAGE " PREFERENCES\n\n"); prefs = stringcat(prefs, "FILENAME_FORMAT_STRING='"); fnameformat = get_prefs_filenameformat(); prefs = stringcat(prefs, fnameformat); g_free(fnameformat); prefs = stringcat(prefs, "'\n"); prefs = stringcat(prefs, "USE_ORIGNAME="); if (get_prefs_use_origname()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "DISPLAY_DOTDIRS="); if (get_prefs_display_dotdirs()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "TAG_REMOVE="); if (get_prefs_tagremove()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "TAG_OVERRIDE="); if (get_prefs_tagoverride()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "USE_TAG="); if (get_prefs_usetag()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "USE_ID3_UNICODE="); if (get_prefs_useid3_unicode()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "ASK_PLAYLIST="); if (get_prefs_ask_playlist()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "RECURSE_DIR="); if (get_prefs_recurse_dir()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); #ifndef G_OS_WIN32 prefs = stringcat(prefs, "FORCE_8859="); if (get_prefs_force_8859()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); #endif prefs = stringcat(prefs, "DETECT_METADATA="); if (get_prefs_detect_metadata()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "EXTENDED_METADATA="); if (get_prefs_extended_metadata() || get_prefs_use_origname()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "AUTOSCAN="); if (get_prefs_autoscan()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "SET_TIME="); if (get_prefs_set_time()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "REMEMBER_DIR="); if (get_prefs_remember_dir()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "TURBO_MODE="); if (get_prefs_turbo_mode()) prefs = stringcat(prefs, "1"); else prefs = stringcat(prefs, "0"); prefs = stringcat(prefs, "\n"); prefs = stringcat(prefs, "CURRENT_DIRECTORY='"); tmp = get_current_dir(); prefs = stringcat(prefs, tmp); g_free(tmp); prefs = stringcat(prefs, "'\n"); rewrite_prefsfile(prefs); } gboolean get_prefs_use_origname(void) { if (use_origname == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(use_origname)); } gboolean get_prefs_tagoverride(void) { if (tagoverride == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tagoverride)); } gboolean get_prefs_tagremove(void) { if (tagremove == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tagremove)); } gboolean get_prefs_usetag(void) { if (usetag == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usetag)); } gboolean get_prefs_useid3_unicode(void) { if (useid3_unicode == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(useid3_unicode)); } gboolean get_prefs_display_dotdirs(void) { if (display_dotdirs == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(display_dotdirs)); } gboolean get_prefs_ask_playlist(void) { if (ask_playlist == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ask_playlist)); } gboolean get_prefs_recurse_dir(void) { if (recurse_dir == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(recurse_dir)); } #ifndef G_OS_WIN32 gboolean get_prefs_force_8859(void) { if (force_8859 == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(force_8859)); } #endif gboolean get_prefs_detect_metadata(void) { if (detect_metadata == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(detect_metadata)); } gboolean get_prefs_extended_metadata(void) { if (extended_metadata == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(extended_metadata)); } gboolean get_prefs_autoscan(void) { if (autoscan == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(autoscan)); } gboolean get_prefs_set_time(void) { if (set_time == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(set_time)); } static gboolean get_prefs_remember_dir(void) { if (remember_dir == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(remember_dir)); } gboolean get_prefs_turbo_mode(void) { if (turbo_mode == NULL) return FALSE; else return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(turbo_mode)); } gchar *get_prefs_filenameformat(void) { static gchar defaultformat[] = "%a - %t"; G_CONST_RETURN gchar *returnformat; if (tagremove == NULL) returnformat = defaultformat; returnformat = gtk_entry_get_text(GTK_ENTRY(filenameformat)); if (!strlen(returnformat)) returnformat = defaultformat; return g_strdup(returnformat); } static void toggle_origname (GtkCheckButton *toggle, gpointer data) { if (get_prefs_use_origname()) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(extended_metadata), TRUE); } } static void toggle_extended_metadata (GtkCheckButton *toggle, gpointer data) { if (!get_prefs_extended_metadata()) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(use_origname), FALSE); } } void create_prefs_widgets(GtkWidget *box) { GtkWidget *hbox, *vbox, *vbox_naming, *frame, *label; /* Pack all prefs into a vbox */ vbox = gtk_vbox_new(FALSE, 0); /* Preference for filenaming */ frame = gtk_frame_new(_("Filenaming")); gtk_widget_show (frame); vbox_naming = gtk_vbox_new(FALSE, 0); use_origname = gtk_check_button_new_with_label(_("Use original filename if present in metadata for the track")); g_signal_connect_object(GTK_OBJECT(use_origname), "toggled", G_CALLBACK(toggle_origname), NULL, 0); gtk_box_pack_start(GTK_BOX(vbox_naming), use_origname, FALSE, FALSE, 0); gtk_widget_show(use_origname); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(_("This string is used when naming files copied " \ "from the jukebox library to the filesystem.") ); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(vbox_naming), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new(_("Formatting string:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); /* Add text entry */ filenameformat = gtk_entry_new(); gtk_entry_set_text(GTK_ENTRY(filenameformat), "%a - %t"); gtk_box_pack_start(GTK_BOX(hbox), filenameformat, TRUE, TRUE, 0); gtk_widget_show(filenameformat); gtk_box_pack_start(GTK_BOX(vbox_naming), hbox, FALSE, FALSE, 0); gtk_widget_show(hbox); /* Don't translate the magic %-things! */ label = gtk_label_new(_("%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year")); gtk_box_pack_start(GTK_BOX(vbox_naming), label, FALSE, FALSE, 0); gtk_widget_show(label); gtk_widget_show(vbox_naming); gtk_container_add(GTK_CONTAINER (frame), vbox_naming); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0); /* Checkbutton preferences */ tagoverride = gtk_check_button_new_with_label(_("Metadata from the jukebox overrides " \ "present tags on transfered files")); tagremove = gtk_check_button_new_with_label(_("Remove all metadata tags from files " \ "transferred to jukebox")); usetag = gtk_check_button_new_with_label(_("Write tags to files transferred to " \ "harddisk")); useid3_unicode = gtk_check_button_new_with_label(_("Force use of Unicode charset for ID3 tags")); display_dotdirs = gtk_check_button_new_with_label(_("Display hidden (.foo) directories " \ "in filesystem")); ask_playlist = gtk_check_button_new_with_label(_("Ask to add files to a playlist")); recurse_dir = gtk_check_button_new_with_label(_("Recurse into any selected directories when transferring")); #ifndef G_OS_WIN32 force_8859 = gtk_check_button_new_with_label(_("Force local filesystem to ISO-8859-1 charset")); #endif detect_metadata = gtk_check_button_new_with_label(_("Try to extract sound file metadata from path and filename")); extended_metadata = gtk_check_button_new_with_label(_("Read extended metadata from jukebox (e.g. original filename - slow on newer devices)")); g_signal_connect_object(GTK_OBJECT(extended_metadata), "toggled", G_CALLBACK(toggle_extended_metadata), NULL, 0); autoscan = gtk_check_button_new_with_label(_("Automatically read in jukebox contents on startup")); set_time = gtk_check_button_new_with_label(_("Automatically set the time on the Jukebox to that of your computer on startup")); remember_dir = gtk_check_button_new_with_label(_("On startup, return to the place in the filesystem where you were last time")); turbo_mode = gtk_check_button_new_with_label(_("Enable turbo mode - uncheck this if you have problems")); gtk_box_pack_start(GTK_BOX(vbox), tagoverride, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), tagremove, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), usetag, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), useid3_unicode, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), display_dotdirs, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), ask_playlist, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), recurse_dir, FALSE, FALSE, 0); #ifndef G_OS_WIN32 gtk_box_pack_start(GTK_BOX(vbox), force_8859, FALSE, FALSE, 0); #endif gtk_box_pack_start(GTK_BOX(vbox), detect_metadata, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), extended_metadata, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), autoscan, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), set_time, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), remember_dir, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), turbo_mode, FALSE, FALSE, 0); gtk_widget_show(tagoverride); gtk_widget_show(tagremove); gtk_widget_show(usetag); gtk_widget_show(useid3_unicode); gtk_widget_show(display_dotdirs); gtk_widget_show(ask_playlist); gtk_widget_show(recurse_dir); #ifndef G_OS_WIN32 gtk_widget_show(force_8859); #endif gtk_widget_show(detect_metadata); gtk_widget_show(extended_metadata); gtk_widget_show(autoscan); gtk_widget_show(set_time); gtk_widget_show(remember_dir); gtk_widget_show(turbo_mode); gtk_widget_show(vbox); gtk_box_pack_start(GTK_BOX(box), vbox, TRUE, TRUE, 0); /* Read in preferences */ read_prefs_file(); } gnomad2-2.9.6/src/id3read.c0000664000076400007640000006447011573774372012313 00000000000000/* id3read.c interface for the id3tag library Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define ID3V2_MAX_STRING_LEN 4096 #include "common.h" #include "metadata.h" #include "util.h" #include "filesystem.h" #include "prefs.h" #include #include #include #include #include #include #include #include /* Eventually make charset selectable */ static id3_utf8_t *charset_to_utf8(const id3_latin1_t *str) { id3_utf8_t *tmp; tmp = (id3_utf8_t *) g_convert((gchar *) str,-1,"UTF-8","ISO-8859-1",NULL,NULL,NULL); return (id3_utf8_t *) tmp; } static id3_latin1_t *charset_from_utf8(const id3_utf8_t *str) { id3_latin1_t *tmp; tmp = (id3_latin1_t *) g_convert((gchar *) str,-1,"ISO-8859-1","UTF-8",NULL,NULL,NULL); return (id3_latin1_t *) tmp; } /* * This function checks if a RIFF header exists at the beginning of * the *data buffer. In that case its size is returned. The size * of the *data buffer must be supplied. */ static guint riff_header_size(gchar *data, guint bufsize) { guint retsize = 0; // Too small to be a RIFF header if (bufsize < 20) { return 0; } // Remove any RIFF header too (EVIL GARBAGE!) if (data[0] == 'R' && data[1] == 'I' && data[2] == 'F' && data[3] == 'F' && data[8] == 'W' && data[9] == 'A' && data[10] == 'V' && data[11] == 'E') { gchar chunk_type[5]; guint chunk_size; guint p = 12; // Parse point chunk_type[4] = '\0'; while (p+8 < bufsize) { memcpy(chunk_type,&data[p],4); chunk_size = (data[p+7] << 24) + (data[p+6] << 16) + (data[p+5] << 8) + data[p+4]; // Even 16 bit boundary if (chunk_size % 2 != 0) { chunk_size++; } // Pointer behind chunk metadata p += 8; // g_print("Chunk \'%s\' size %d bytes\n", chunk_type, chunk_size); if (!strcmp(chunk_type, "data")) { // The 'data' chunk is the vital one. We need not scan further. retsize = p; if (gnomad_debug != 0) { g_print("Found a RIFF tag of size %d bytes (%x)\n", retsize, retsize); } break; } p += chunk_size; } } return retsize; } /***************************************************************************** * ID3TAG interface * Many parts of this code copied in from gtkpod or plagiated, I confess. * Acknowledgements to Jorg Schuler for that... *****************************************************************************/ /* * Returns a text frame, or NULL */ static gchar* getFrameText(struct id3_tag *tag, char *frame_name) { const id3_ucs4_t *string; struct id3_frame *frame; union id3_field *field; gchar *utf8 = NULL; enum id3_field_textencoding encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1; frame = id3_tag_findframe (tag, frame_name, 0); if (!frame) return NULL; /* Find the encoding used for the field */ field = id3_frame_field (frame, 0); //printf ("field: %p\n", field); if (field && (id3_field_type(field) == ID3_FIELD_TYPE_TEXTENCODING)) { encoding = field->number.value; //printf ("encoding: %d\n", encoding); } if (frame_name == ID3_FRAME_COMMENT) field = id3_frame_field (frame, 3); else field = id3_frame_field (frame, 1); //printf ("field: %p\n", field); if (!field) return NULL; if (frame_name == ID3_FRAME_COMMENT) string = id3_field_getfullstring (field); else string = id3_field_getstrings (field, 0); // g_print("string: %s\n", string); if (!string) return NULL; if (frame_name == ID3_FRAME_GENRE) string = id3_genre_name (string); if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) { /* ISO_8859_1 is just a "marker" -- most people just drop whatever coding system they are using into it, so we use charset_to_utf8() to convert to utf8 */ id3_latin1_t *raw = id3_ucs4_latin1duplicate(string); utf8 = (gchar *) charset_to_utf8(raw); g_free (raw); } else { /* Standard unicode is being used -- we won't have to worry about charsets then. */ // g_print("This frame is a Unicode frame!\n"); utf8 = (gchar *) id3_ucs4_utf8duplicate (string); } // g_print("Found tag: %s, value: %s\n", frame_name, utf8); return utf8; } /* * Set the specified frame. * Create it, if it doesn't exists, else change it. * * If value is NULL or the empty string "", the frame will be deleted. * Please note that a copy of value is made, so you can safely free() * id and value as soon as this function returns. */ static void setFrameText(struct id3_tag *tag, const char *frame_name, const char *data, enum id3_field_textencoding encoding, gboolean override) { int res; struct id3_frame *frame; union id3_field *field; id3_ucs4_t *ucs4; if (data == NULL) return; if (gnomad_debug != 0) { g_print("Updating id3 frame (enc: %d): %s: ", encoding, frame_name); hexdump((unsigned char *) data, strlen(data)); g_print(" %s\n", data); } /* * An empty string removes the frame altogether. */ if ((strlen(data) == 0) && (!override)) return; if (strlen(data) == 0) { // g_print("removing ID3 frame: %s\n", frame_name); while ((frame = id3_tag_findframe (tag, frame_name, 0))) id3_tag_detachframe (tag, frame); return; } frame = id3_tag_findframe (tag, frame_name, 0); if (!frame) { // g_print("new frame: %s!\n", frame_name); frame = id3_frame_new(frame_name); id3_tag_attachframe(tag, frame); } else if (!override) { /* Do not overwrite old tags then */ return; } else { // Needed for unicode? id3_tag_detachframe(tag, frame); frame = id3_frame_new(frame_name); id3_tag_attachframe(tag, frame); } /* Set the encoding - always field 0 */ field = id3_frame_field(frame, 0); id3_field_settextencoding(field, encoding); /* Modify the default text field type */ if (frame_name == ID3_FRAME_COMMENT) { /* Get the latin-1 string list, convert it to a Unicode list */ field = id3_frame_field (frame, 3); field->type = ID3_FIELD_TYPE_STRINGFULL; } else { /* Get the latin-1 string, convert it to a Unicode string */ field = id3_frame_field (frame, 1); field->type = ID3_FIELD_TYPE_STRINGLIST; } if (frame_name == ID3_FRAME_GENRE) { id3_ucs4_t *tmp_ucs4 = id3_utf8_ucs4duplicate ((id3_utf8_t *)data); int index = id3_genre_number (tmp_ucs4); if (index != -1) { /* valid genre -- simply store the genre number */ gchar *tmp = g_strdup_printf("%d", index); ucs4 = id3_latin1_ucs4duplicate ((id3_latin1_t *) tmp); g_free (tmp); } else { /* oups -- not a valid genre -- save the entire genre string */ if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) { /* we read 'ISO_8859_1' to stand for 'any locale charset' -- most programs seem to work that way */ id3_latin1_t *raw = charset_from_utf8((id3_utf8_t *) data); ucs4 = id3_latin1_ucs4duplicate (raw); g_free (raw); } else { /* Yeah! We use unicode encoding and won't have to worry about charsets */ ucs4 = tmp_ucs4; tmp_ucs4 = NULL; } } // Perhaps not good that this will be NULL sometimes... g_free (tmp_ucs4); } else { if (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1) { /* we read 'ISO_8859_1' to stand for 'any locale charset' -- most programs seem to work that way */ id3_latin1_t *raw = charset_from_utf8((id3_utf8_t *) data); ucs4 = id3_latin1_ucs4duplicate (raw); g_free (raw); } else { /* Yeah! We use unicode encoding and won't have to worry about charsets */ ucs4 = id3_utf8_ucs4duplicate ((id3_utf8_t *)data); } } if (gnomad_debug != 0) { g_print("UCS 4 copy of tag %s:\n", frame_name); hexdump((unsigned char *) ucs4, g_utf8_strlen(data,-1)*4); } if (frame_name == ID3_FRAME_COMMENT) { res = id3_field_setfullstring (field, ucs4); } else { res = id3_field_setstrings (field, 1, &ucs4); } g_free (ucs4); if (res != 0) g_print("Error setting ID3 field: %s\n", frame_name); } static enum id3_field_textencoding get_encoding_of_field(struct id3_tag *tag, const char *frame_name) { struct id3_frame *frame; enum id3_field_textencoding encoding = -1; frame = id3_tag_findframe (tag, frame_name, 0); if (frame) { union id3_field *field = id3_frame_field (frame, 0); if (field && (id3_field_type (field) == ID3_FIELD_TYPE_TEXTENCODING)) encoding = field->number.value; } return encoding; } /* Find out which encoding is being used. If in doubt, return * latin1. This code assumes that the same encoding is used in all * fields. */ static enum id3_field_textencoding get_encoding_of_tag(struct id3_tag *tag) { enum id3_field_textencoding enc; enc = get_encoding_of_field(tag, ID3_FRAME_TITLE); if (enc != -1) return enc; enc = get_encoding_of_field(tag, ID3_FRAME_ARTIST); if (enc != -1) return enc; enc = get_encoding_of_field(tag, ID3_FRAME_ALBUM); if (enc != -1) return enc; enc = get_encoding_of_field(tag, "TCOM"); if (enc != -1) return enc; enc = get_encoding_of_field(tag, ID3_FRAME_COMMENT); if (enc != -1) return enc; enc = get_encoding_of_field(tag, ID3_FRAME_YEAR); if (enc != -1) return enc; return ID3_FIELD_TEXTENCODING_ISO_8859_1; } /***************************************************************************** * FUNCTIONS FOR SETTING ID3v2 FIELDS *****************************************************************************/ static void setArtist(struct id3_tag *tag, gchar *artist, enum id3_field_textencoding encoding, gboolean override) { setFrameText(tag, "TPE1", artist, encoding, override); } static void setTitle(struct id3_tag *tag, gchar *title, enum id3_field_textencoding encoding, gboolean override) { setFrameText(tag, "TIT2", title, encoding, override); } static void setAlbum(struct id3_tag *tag, gchar *album, enum id3_field_textencoding encoding, gboolean override) { setFrameText(tag, "TALB", album, encoding, override); } static void setYear(struct id3_tag *tag, gchar *year, enum id3_field_textencoding encoding, gboolean override) { /* Some confusion here... */ setFrameText(tag, "TYER", year, encoding, override); setFrameText(tag, "TDRC", year, encoding, override); } static void setGenre(struct id3_tag *tag, gchar *genre, enum id3_field_textencoding encoding, gboolean override) { setFrameText(tag, "TCON", genre, encoding, override); } static void setSonglen(struct id3_tag *tag, gchar *length, enum id3_field_textencoding encoding, gboolean override) { guint32 seconds; gchar *tmp; seconds = mmss_to_seconds(length); if (seconds > 0) { // Convert seconds to milliseconds seconds *= 1000; // Print the length to a string tmp = g_strdup_printf("%" PRIguint32, seconds); setFrameText(tag, "TLEN", tmp, encoding, override); g_free(tmp); } return; } static void setTracknum(struct id3_tag *tag, guint tracknumin, enum id3_field_textencoding encoding, gboolean override) { gchar *tracknum; tracknum = g_strdup_printf("%.2d", tracknumin); setFrameText(tag, "TRCK", tracknum, encoding, override); g_free(tracknum); return; } static void setOrigFilename(struct id3_tag *tag, gchar *filename, enum id3_field_textencoding encoding, gboolean override) { setFrameText(tag, "TOFN", filename, encoding, override); } /***************************************************************************** * FUNCTIONS FOR GETTING ID3v2 FIELDS *****************************************************************************/ static gchar* getArtist(struct id3_tag *tag) { gchar *artname = NULL; artname = getFrameText(tag, "TPE1"); if (artname == NULL) artname = getFrameText(tag, "TPE2"); if (artname == NULL) artname = getFrameText(tag, "TPE3"); if (artname == NULL) artname = getFrameText(tag, "TPE4"); if (artname == NULL) artname = getFrameText(tag, "TCOM"); return artname; } static gchar* getTitle(struct id3_tag *tag) { return getFrameText(tag, "TIT2"); } static gchar* getAlbum(struct id3_tag *tag) { return getFrameText(tag, "TALB"); } static gchar* getYear(struct id3_tag *tag) { gchar *year = NULL; year = getFrameText(tag, "TYER"); if (year == NULL) { year = getFrameText(tag, "TDRC"); } return year; } static gchar* getGenre(struct id3_tag *tag) { return getFrameText(tag, "TCON"); } static int getSonglen (struct id3_tag *tag) { gchar *timetext; long milliseconds; int seconds; timetext = getFrameText(tag, "TLEN"); if (timetext == NULL) return -1; // g_print("Found time tag TLEN: %s ms ... ", timetext); milliseconds = atol(timetext); g_free(timetext); if (milliseconds > 0) { seconds = (int) milliseconds / 1000; // g_print("%d milliseconds is %d seconds.\n", milliseconds, seconds); return seconds; } g_print("ID3v2 TLEN tag time was 0\n"); return -1; } static gchar* getTracknum(struct id3_tag *tag) { gchar trackno[40]; gchar *trackstr = getFrameText(tag, "TRCK"); gchar *posstr = getFrameText(tag, "TPOS"); gint i; if (trackstr == NULL) { return NULL; } trackno[0] = '\0'; // Take care of any a/b formats for (i = 0; i < strlen(trackstr); i++) { if (trackstr[i] == '/') { // Terminate it at switch character trackstr[i] = '\0'; break; } } // "Part of set" variable if (posstr != NULL) { // Same a/b format problem again for (i = 0; i < strlen(posstr); i++) { if (posstr[i] == '/') { // Terminate it at switch character posstr[i] = '\0'; break; } } strncpy(trackno, posstr, sizeof(trackno)-1); trackno[sizeof(trackno)-1] = '\0'; if (strlen(trackstr) == 1) { strncat(trackno, "0", sizeof(trackno)-1-strlen(trackno)); } strncat(trackno, trackstr, sizeof(trackno)-1-strlen(trackno)); g_free(trackstr); g_free(posstr); } else { strncpy(trackno, trackstr, sizeof(trackno)-1); trackno[sizeof(trackno)-1] = '\0'; g_free(trackstr); } // Terminate and return return g_strdup(trackno); } static gchar* getOrigFilename(struct id3_tag *tag) { return getFrameText(tag, "TOFN"); } /** * Removes a tag from an MP3 file or adds a tag (and removes any old at the same time) * @param add whether to add a tag (TRUE) or remove a tag (FALSE) * @param path the UTF-8 path to the file, always UTF-8 * @param v2tag the ID3v2 tag * @param v2taglen the length (in bytes) of the ID3v2 tag * @param v1tag the ID3v1 tag * @param v1taglen the ID3v1 tag length in bytes (128 bytes) */ static void remove_or_add_tag(gboolean add, gchar *path, guchar *v2tag, guint v2taglen, guchar *v1tag, guint v1taglen) { // File descriptors... gint f1, f2, f3; gchar template[128]; guint header_taglength = 0; guint footer_taglength = 0; guint filelength = 0; register gchar *buffer; guint bufsiz; gchar *tmppath; strcpy(template, g_get_tmp_dir()); template[strlen(template)+1] = '\0'; template[strlen(template)] = G_DIR_SEPARATOR; strcat(template, "gnomadXXXXXX"); if (gnomad_debug != 0) { g_print("Removing ID3 tags from/to %s\n", path); } // Will be UTF-8 on Windows // The following code will support wchar_t filenames by way of glib. tmppath = filename_fromutf8(path); // Sanity check if (tmppath == NULL) { g_print("Path was NULL when calling remove_or_add_tag()\n"); return; } f1 = (gint) g_open(tmppath, READONLY_FLAGS, 0); if (f1 < 0) { g_print("Could not open file f1 in remove_or_add_tag()\n"); g_free(tmppath); return; } // g_print("Opened file f1...\n"); // Allocate a copying buffer for (bufsiz = 0x8000; bufsiz >= 128; bufsiz >>= 1) { buffer = (gchar *) g_malloc(bufsiz); if (buffer) break; } // Temporary file f2 = g_mkstemp(template); // g_print("Opened temporary file f2...\n"); if (f2 >= 0) { guchar tag[10]; gint n; // g_print("Allocated a buffer of %d bytes...\n", bufsiz); if (gnomad_debug != 0) { g_print("Looking for ID3v2 header tag\n"); } n = read(f1,tag,10); if (n == 10 && tag[0] == 'I' && tag[1] == 'D' && tag[2] == '3' ) { if (gnomad_debug != 0) { g_print("Found ID3v2 tag header..."); } // Get tag length from the tag - notice that this is an // UNSYNCED integer, so the highest bit of each 8-bit group // is unused (always 0). header_taglength = ((tag[6] & 0x7F) << 21) | ((tag[7] & 0x7F) << 14) | ((tag[8] & 0x7F) << 7) | (tag[9] & 0x7F); if ((tag[5] & 0x10) == 0) { header_taglength += 10; } else { header_taglength += 20; } if (gnomad_debug != 0) { g_print(" %d (0x%x) bytes\n", header_taglength, header_taglength); } // Wind past ID3 header lseek(f1, 10+header_taglength, SEEK_SET); // Wind past any RIFF header too n = read(f1,buffer,bufsiz); header_taglength += riff_header_size(&buffer[0], n); if (gnomad_debug != 0) { g_print("ID3v2 header (and any RIFF header) %d (0x%x) bytes\n", header_taglength, header_taglength); } } else { // Any plain RIFF header is removed too. gint n; n = read(f1,buffer,bufsiz); header_taglength = riff_header_size(&buffer[0], n); } // As we move to the end of the file, detect the filelength filelength = lseek(f1, 0, SEEK_END); if (filelength > 0) { // Then detect the length of any ID3v1 tag if (gnomad_debug != 0) { g_print("Detecting ID3v1 tag\n"); } if (lseek(f1, -128, SEEK_END) > 0) { guchar tag[3]; gint n; n = read(f1,tag,3); if (n == 3 && tag[0] == 'T' && tag[1] == 'A' && tag[2] == 'G') { if (gnomad_debug != 0) { g_print("Found ID3v1 tag footer, 128 (0x80) bytes...\n"); } footer_taglength = 128; } } // Then detect the length of any ID3v2 footer tag if (gnomad_debug != 0) { g_print("Detecting ID3v2 footer tag\n"); } if (lseek(f1, -10-footer_taglength, SEEK_END) > 0) { guchar tag[10]; guint footlen; gint n; n = read(f1,tag,10); if (n == 10 && tag[0] == '3' && tag[1] == 'D' && tag[2] == 'I') { if (gnomad_debug != 0) { g_print("Found ID3v2 footer tag..."); } footlen = ((tag[6] & 0x7F) << 21) | ((tag[7] & 0x7F) << 14) | ((tag[8] & 0x7F) << 7) | (tag[9] & 0x7F); // First remove the tag headers footer_taglength += 20; // Then remove the indicated length (no looking for bad tag here) footer_taglength += footlen; if (gnomad_debug != 0) { g_print(" %d (0x%x) bytes.\n", footlen, footlen); } } } if (gnomad_debug != 0) { g_print("Header %d (0x%x) bytes, footer %d (0x%x) bytes to be removed.\n", header_taglength, header_taglength, footer_taglength, footer_taglength); } if (add) { // Write ID3v2 tag at the beginning of the file if (gnomad_debug != 0) { g_print("Adding ID3v2 tag to file\n"); } if (v2taglen != write(f2,v2tag,v2taglen)) { g_print("Error writing ID3v2 header tag in remove_or_add_tag()\n"); } } // Next skip past the header, and copy until we reach the footer if (gnomad_debug != 0) { g_print("Copying original file, "); } if (lseek(f1, header_taglength, SEEK_SET) >= 0) { guint remain = filelength - header_taglength - footer_taglength; if (gnomad_debug != 0) { g_print("%d bytes.\n", remain); } while (remain > 0) { register gint n; if (remain > bufsiz) { n = read(f1,buffer,bufsiz); } else { n = read(f1,buffer,remain); } if (n == -1) { g_print("Error reading source file during file copying in remove_or_add_tag()\n"); break; } if (n == 0) { break; } if (n != write(f2,buffer,n)) { g_print("Error writing target file during file copying in remove_or_add_tag()\n"); break; } remain -= n; } } } close(f1); if (add) { // Write ID3v1 tag at the end of the file if (gnomad_debug != 0) { g_print("Adding ID3v1 tag to file\n"); } if (v1taglen != write(f2,v1tag,v1taglen)) { g_print("Error writing ID3v1 footer tag in remove_or_add_tag()\n"); } } // Then copy back the stripped file // Rewind the temporary file lseek(f2, 0, SEEK_SET); if (gnomad_debug != 0) { g_print("Copying the file back...\n"); } #if GLIB_CHECK_VERSION(2,8,0) f3 = (gint) g_creat(tmppath, (mode_t) CREATE_FILEMODE); #else f3 = (gint) creat(tmppath, (mode_t) CREATE_FILEMODE); #endif if (f3) { // g_print("Creat() on original file succeeded...\n"); while (1) { register gint n; n = read(f2,buffer,bufsiz); if (n == -1) { g_print("Error reading source file during final copying in remove_or_add_tag()\n"); break; } if (n == 0) { break; } if (n != write(f3,buffer,n)) { g_print("Error writing target file during final copying in remove_or_add_tag()\n"); break; } } close(f3); } else { g_print("Erroneous file descriptor when copying file back in remove_or_add_tag()\n"); } close(f2); // g_print("Deleting %s\n", template); g_unlink(template); } else { // In case we couldn't open f2 close(f1); } g_free(tmppath); g_free(buffer); } /***************************************************************************** * EXPORTED FUNCTIONS *****************************************************************************/ void remove_tag_from_mp3file(gchar *path) { remove_or_add_tag(FALSE, path, NULL, 0, NULL, 0); } void get_tag_for_mp3file (metadata_t *meta) { struct id3_file *fh; struct id3_tag *tag; gchar *tracknum; gchar *tmppath; gint songlen; #ifndef G_OS_WIN32 tmppath = filename_fromutf8(meta->path); #else // The libid3tag library cannot handle UTF-8/unicode filenames // so under Windows we have to switch the path into the locale. tmppath = g_locale_from_utf8(meta->path,-1,NULL,NULL,NULL); #endif if (tmppath == NULL) { g_printf("get_tag_for_mp3file(): filepath was NULL.\n"); return; } /* g_print("Getting tag info for %s...\n", path); */ fh = id3_file_open(tmppath, ID3_FILE_MODE_READONLY); if (fh == 0) { g_print("get_tag_for_mp3file(), file could not be opened: %s\n", tmppath); g_print("This may be caused by bad locale settings.\n"); return; } g_free(tmppath); tag = id3_file_tag(fh); /* Any embedded ID3V1 or ID3V2 tags will take * prescedence over any titles, artist names * etc gathered from analyzing the filename */ meta->artist = getArtist(tag); meta->title = getTitle(tag); meta->album = getAlbum(tag); meta->genre = getGenre(tag); meta->year = string_to_guint32(getYear(tag)); /* If there is a songlength tag it will take * precedence over any length calculated from * the bitrate and filesize */ songlen = getSonglen(tag); if (songlen > 0) { meta->length = seconds_to_mmss(songlen); } else { meta->length = NULL; } tracknum = getTracknum(tag); meta->trackno = string_to_guint32(tracknum); g_free(tracknum); meta->filename = getOrigFilename(tag); id3_file_close(fh); } void set_tag_for_mp3file (metadata_t *meta, gboolean override) { struct id3_file *fh; struct id3_tag *tag; gchar *tmppath; enum id3_field_textencoding encoding; id3_length_t tagv2len; id3_length_t tagv1len; id3_byte_t *tagv2; id3_byte_t *tagv1; #ifndef G_OS_WIN32 tmppath = filename_fromutf8(meta->path); #else // The libid3tag library cannot handle UTF-8/unicode filenames // so under Windows we have to switch the path into the locale. tmppath = g_locale_from_utf8(meta->path,-1,NULL,NULL,NULL); #endif if (tmppath == NULL) { g_printf("set_tag_for_mp3file(): filepath was NULL.\n"); return; } if (gnomad_debug != 0) { g_print("Setting tag info for %s...\n", tmppath); } /* Get the tag for the old file */ fh = id3_file_open(tmppath, ID3_FILE_MODE_READONLY); if (!fh) { g_print("Could not open file %s!\n", meta->path); return; } tag = id3_file_tag(fh); if (!tag) { g_print("Could not get tag for file %s!\n", meta->path); return; } /* use the same encoding as before... */ encoding = get_encoding_of_tag(tag); /* ...unless it's ISO_8859_1 and prefs say we should use unicode (i.e. ID3v2.4) */ if (get_prefs_useid3_unicode() && (encoding == ID3_FIELD_TEXTENCODING_ISO_8859_1)) { encoding = ID3_FIELD_TEXTENCODING_UTF_8; } /* Close old file. */ // id3_file_close(fh); if (meta->artist != NULL && strcmp(meta->artist, "")) { setArtist(tag, meta->artist, encoding, override); } if (meta->title != NULL && strcmp(meta->title, "")) { setTitle(tag, meta->title, encoding, override); } if (meta->album != NULL && strcmp(meta->album, "")) { setAlbum(tag, meta->album, encoding, override); } if (meta->year != 0) { gchar *tmp; tmp = g_strdup_printf("%" PRIguint32, meta->year); setYear(tag, tmp, encoding, override); g_free(tmp); } if (meta->genre != NULL && strcmp(meta->genre, "")) { setGenre(tag, meta->genre, encoding, override); } if (meta->length != NULL && strcmp(meta->length, "")) { setSonglen(tag, meta->length, encoding, override); } setTracknum(tag, meta->trackno, encoding, override); if (meta->filename != NULL && strlen(meta->filename) && strcmp(meta->filename, "0")) { setOrigFilename(tag, meta->filename, encoding, override); } /* Render tag so we can look at it */ tagv2 = g_malloc(64738); tagv1 = g_malloc(128); /* Render ID3v2 tag */ id3_tag_options(tag, ID3_TAG_OPTION_ID3V1, 0); tagv2len = id3_tag_render(tag, tagv2); if (gnomad_debug != 0) { g_print("Rendered ID3v2 tag, length %lu (0x%lx) bytes:\n", tagv2len, tagv2len); hexdump(tagv2, tagv2len); } /* Render ID3v1 tag */ id3_tag_options(tag, ID3_TAG_OPTION_ID3V1, ~0); tagv1len = id3_tag_render(tag, tagv1); if (gnomad_debug != 0) { g_print("Rendered ID3v1 tag 128 (0x80) bytes:\n"); hexdump(tagv1, tagv1len); } /* Close old file */ id3_file_close(fh); /* Totally revamp file */ remove_or_add_tag(TRUE, meta->path, tagv2, tagv2len, tagv1, tagv1len); g_free(tagv2); g_free(tagv1); g_free(tmppath); } gnomad2-2.9.6/src/mp3file.c0000664000076400007640000006041611573771774012336 00000000000000/* mp3file.c Accessing the metadata of a raw MPEG stream Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "common.h" #include "util.h" #include "filesystem.h" #include #include /* * The following code is extracted from gtkpod, which in turn * extracted it from various sources. */ /* * The code in the first section of this file is taken from the * mp3info project. Only the code needed for the playlength * calculation has been extracted. */ /* * The code in the second section of this file is taken from the * mpg123 code used in xmms-1.2.7 (Input/mpg123). Only the code needed * for the playlength calculation has been extracted. */ /* * The code in the last section of this file is original gnomad2 * code. */ /* * Description of each item of the TagList list */ typedef struct _File_Tag File_Tag; struct _File_Tag { gchar *title; /* Title of track */ gchar *artist; /* Artist name */ gchar *album; /* Album name */ gchar *year; /* Year of track */ gchar *trackstring; /* Position of track in the album */ gchar *track_total; /* The number of tracks for the album (ex: 12/20) */ gchar *genre; /* Genre of song */ gchar *comment; /* Comment */ gchar *composer; /* Composer */ guint32 songlen; /* Length of file in ms */ }; /* This code is taken from the mp3info code. Only the code needed for * the playlength calculation has been extracted */ /* mp3tech.c - Functions for handling MP3 files and most MP3 data structure manipulation. Copyright (C) 2000-2001 Cedric Tefft 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., 675 Mass Ave, Cambridge, MA 02139, USA. *************************************************************************** This file is based in part on: * MP3Info 0.5 by Ricardo Cerqueira * MP3Stat 0.9 by Ed Sweetman and Johannes Overmann */ /* MIN_CONSEC_GOOD_FRAMES defines how many consecutive valid MP3 frames we need to see before we decide we are looking at a real MP3 file */ #define MIN_CONSEC_GOOD_FRAMES 4 #define FRAME_HEADER_SIZE 4 #define MIN_FRAME_SIZE 21 enum VBR_REPORT { VBR_VARIABLE, VBR_AVERAGE, VBR_MEDIAN }; typedef struct { gulong sync; guint version; guint layer; guint crc; guint bitrate; guint freq; guint padding; guint extension; guint mode; guint mode_extension; guint copyright; guint original; guint emphasis; } mp3header; typedef struct { gchar *filename; FILE *file; off_t datasize; gint header_isvalid; mp3header header; gint id3_isvalid; gint vbr; float vbr_average; gint milliseconds; gint frames; gint badframes; } mp3info; /* These are for mp3info code */ static gint mp3file_header_bitrate(mp3header *h); static int mp3file_header_frequency(mp3header *h); /* This is for xmms code */ static guint get_track_time(gchar *path); /* * ------------------------------------------------------------ * * start of first section * * ------------------------------------------------------------ */ gint get_header(FILE *file,mp3header *header); gint frame_length(mp3header *header); gint sameConstant(mp3header *h1, mp3header *h2); gint get_first_header(mp3info *mp3,long startpos); gint get_next_header(mp3info *mp3); void get_mp3_info(mp3info *mp3); int layer_tab[4]= {0, 3, 2, 1}; gint frequencies[3][4] = { {22050,24000,16000,50000}, /* MPEG 2.0 */ {44100,48000,32000,50000}, /* MPEG 1.0 */ {11025,12000,8000,50000} /* MPEG 2.5 */ }; /* FIXME handling free format (or when bits 12-15 in each frame header = 0) For now, use default values bitrate[0][0][0] = free format constant bitrate[0][1][0] = free format constant bitrate[0][2][0] = free format constant bitrate[1][0][0] = free format constant bitrate[1][1][0] = free format constant bitrate[1][2][0] = free format constant What is the correct way to handle this? -Gervais */ gint bitrate[2][3][15] = { { /* MPEG 2.0 */ {32,32,48,56,64,80,96,112,128,144,160,176,192,224,256}, /* layer 1 */ {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160}, /* layer 2 */ {8,8,16,24,32,40,48,56,64,80,96,112,128,144,160} /* layer 3 */ }, { /* MPEG 1.0 */ {32,32,64,96,128,160,192,224,256,288,320,352,384,416,448}, /* layer 1 */ {32,32,48,56,64,80,96,112,128,160,192,224,256,320,384}, /* layer 2 */ {32,32,40,48,56,64,80,96,112,128,160,192,224,256,320} /* layer 3 */ } }; gint frame_size_index[] = {24000, 72000, 72000}; gchar *mode_text[] = { "stereo", "joint stereo", "dual channel", "mono" }; gchar *emphasis_text[] = { "none", "50/15 microsecs", "reserved", "CCITT J 17" }; void get_mp3_info(mp3info *mp3) { gint frame_type[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; float milliseconds=0,total_rate=0; gint frames=0,frame_types=0,frames_so_far=0; gint vbr_median=-1; gint bitrate; gint counter=0; mp3header header; struct stat filestat; off_t data_start=0; if (gnomad_debug != 0) { g_print("entered get_mp3_info()\n"); } stat(mp3->filename,&filestat); mp3->datasize=filestat.st_size; if(get_first_header(mp3,0L)) { data_start=ftell(mp3->file); while((bitrate=get_next_header(mp3))) { frame_type[15-bitrate]++; frames++; } memcpy(&header,&(mp3->header),sizeof(mp3header)); for(counter=0;counter<15;counter++) { if(frame_type[counter]) { frame_types++; header.bitrate=counter; frames_so_far += frame_type[counter]; milliseconds += (float)(8*frame_length(&header)*frame_type[counter])/ (float)(mp3file_header_bitrate(&header)); total_rate += (float)((mp3file_header_bitrate(&header))*frame_type[counter]); if((vbr_median == -1) && (frames_so_far >= frames/2)) vbr_median=counter; } } mp3->milliseconds=(gint)(milliseconds+0.5); mp3->header.bitrate=vbr_median; mp3->vbr_average=total_rate/(float)frames; mp3->frames=frames; if(frame_types > 1) { mp3->vbr=1; } } } gint get_first_header(mp3info *mp3, long startpos) { gint k, l=0,c; mp3header h, h2; long valid_start=0; fseek(mp3->file,startpos,SEEK_SET); while (1) { while((c=fgetc(mp3->file)) != 255 && (c != EOF)); if(c == 255) { ungetc(c,mp3->file); valid_start=ftell(mp3->file); if((l=get_header(mp3->file,&h))) { fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR); for(k=1; (k < MIN_CONSEC_GOOD_FRAMES) && (mp3->datasize-ftell(mp3->file) >= FRAME_HEADER_SIZE); k++) { if(!(l=get_header(mp3->file,&h2))) break; if(!sameConstant(&h,&h2)) break; fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR); } if(k == MIN_CONSEC_GOOD_FRAMES) { fseek(mp3->file,valid_start,SEEK_SET); memcpy(&(mp3->header),&h2,sizeof(mp3header)); mp3->header_isvalid=1; return 1; } } } else { return 0; } } return 0; } /* * get_next_header() - read header at current position or look for * the next valid header if there isn't one at the current position */ gint get_next_header(mp3info *mp3) { gint l=0,c,skip_bytes=0; mp3header h; while(1) { while((c=fgetc(mp3->file)) != 255 && !feof(mp3->file) && (ftell(mp3->file) < mp3->datasize)) skip_bytes++; if(c == 255) { ungetc(c,mp3->file); if((l=get_header(mp3->file,&h))) { if(skip_bytes) mp3->badframes++; fseek(mp3->file,l-FRAME_HEADER_SIZE,SEEK_CUR); return 15-h.bitrate; } else { skip_bytes += FRAME_HEADER_SIZE; } } else { if(skip_bytes) mp3->badframes++; return 0; } } } /* * Get next MP3 frame header. * Return codes: * positive value = Frame Length of this header * 0 = No, we did not retrieve a valid frame header */ gint get_header(FILE *file,mp3header *header) { guchar buffer[FRAME_HEADER_SIZE]; gint fl; if(fread(&buffer,FRAME_HEADER_SIZE,1,file)<1) { header->sync=0; return 0; } header->sync=(((gint)buffer[0]<<4) | ((gint)(buffer[1]&0xE0)>>4)); if(buffer[1] & 0x10) header->version=(buffer[1] >> 3) & 1; else header->version=2; header->layer=(buffer[1] >> 1) & 3; if((header->sync != 0xFFE) || (header->layer != 1)) { header->sync=0; return 0; } header->crc=buffer[1] & 1; header->bitrate=(buffer[2] >> 4) & 0x0F; header->freq=(buffer[2] >> 2) & 0x3; header->padding=(buffer[2] >>1) & 0x1; header->extension=(buffer[2]) & 0x1; header->mode=(buffer[3] >> 6) & 0x3; header->mode_extension=(buffer[3] >> 4) & 0x3; header->copyright=(buffer[3] >> 3) & 0x1; header->original=(buffer[3] >> 2) & 0x1; header->emphasis=(buffer[3]) & 0x3; return ((fl=frame_length(header)) >= MIN_FRAME_SIZE ? fl : 0); } gint frame_length(mp3header *header) { return header->sync == 0xFFE ? (frame_size_index[3-header->layer]*((header->version&1)+1)* mp3file_header_bitrate(header)/mp3file_header_frequency(header))+ header->padding : 1; } static gint mp3file_header_bitrate(mp3header *h) { return bitrate[h->version & 1][3-h->layer][h->bitrate]; } static gint mp3file_header_frequency(mp3header *h) { return frequencies[h->version][h->freq]; } gint sameConstant(mp3header *h1, mp3header *h2) { if((*(guint*)h1) == (*(guint*)h2)) return 1; if((h1->version == h2->version ) && (h1->layer == h2->layer ) && (h1->crc == h2->crc ) && (h1->freq == h2->freq ) && (h1->mode == h2->mode ) && (h1->copyright == h2->copyright ) && (h1->original == h2->original ) && (h1->emphasis == h2->emphasis )) return 1; else return 0; } /* Returns a filled-in mp3info struct that must be g_free'd after use */ static mp3info *mp3file_get_info (gchar *filename) { mp3info *mp3 = NULL; FILE *fp; if (gnomad_debug != 0) { g_print("entered mp3file_get_info()\n"); } if ( !( fp = g_fopen(filename,READONLY_FOPEN_STRING) ) ) { g_print(("Error opening MP3 file '%s'\n"),filename); } else { mp3 = g_malloc0 (sizeof (mp3info)); mp3->filename=filename; mp3->file=fp; get_mp3_info (mp3); fclose (fp); } return mp3; } /* * ------------------------------------------------------------ * xmms code * ------------------------------------------------------------ */ /* | Changed by Jorg Schuler to | compile with the gtkpod project. 2003/04/01 */ /* * This code is taken from the mpg123 code used in xmms-1.2.7 * (Input/mpg123). Only the code needed for the playlength calculation * has been extracted */ #define FRAMES_FLAG 0x0001 #define BYTES_FLAG 0x0002 #define TOC_FLAG 0x0004 #define VBR_SCALE_FLAG 0x0008 #define SBLIMIT 32 #define SCALE_BLOCK 12 #define SSLIMIT 18 #define MPG_MD_STEREO 0 #define MPG_MD_JOINT_STEREO 1 #define MPG_MD_DUAL_CHANNEL 2 #define MPG_MD_MONO 3 #define MAXFRAMESIZE 1792 #define real float struct bitstream_info { int bitindex; unsigned char *wordpointer; }; struct bitstream_info bsi; real mpg123_muls[27][64]; /* also used by layer 1 */ int tabsel_123[2][3][16] = { { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,}, {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,}, {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}}, { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}, {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}} }; long mpg123_freqs[9] = {44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000}; /* * structure to receive extracted header */ typedef struct { int frames; /* total bit stream frames from Xing header data */ int bytes; /* total bit stream bytes from Xing header data */ unsigned char toc[100]; /* "table of contents" */ } xing_header_t; struct al_table { short bits; short d; }; struct frame { struct al_table *alloc; int (*synth) (real *, int, unsigned char *, int *); int (*synth_mono) (real *, unsigned char *, int *); int stereo; int jsbound; int single; int II_sblimit; int down_sample_sblimit; int lsf; int mpeg25; int down_sample; int header_change; int lay; int (*do_layer) (struct frame * fr); int error_protection; int bitrate_index; int sampling_frequency; int padding; int extension; int mode; int mode_ext; int copyright; int original; int emphasis; int framesize; /* computed framesize */ }; static guint32 convert_to_header(guint8 * buf) { return (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3]; } static int mpg123_head_check(unsigned long head) { if ((head & 0xffe00000) != 0xffe00000) return FALSE; if (!((head >> 17) & 3)) return FALSE; if (((head >> 12) & 0xf) == 0xf) return FALSE; if (!((head >> 12) & 0xf)) return FALSE; if (((head >> 10) & 0x3) == 0x3) return FALSE; if (((head >> 19) & 1) == 1 && ((head >> 17) & 3) == 3 && ((head >> 16) & 1) == 1) return FALSE; if ((head & 0xffff0000) == 0xfffe0000) return FALSE; return TRUE; } /* * the code a header and write the information * into the frame structure */ static int mpg123_decode_header(struct frame *fr, unsigned long newhead) { int ssize; if (newhead & (1 << 20)) { fr->lsf = (newhead & (1 << 19)) ? 0x0 : 0x1; fr->mpeg25 = 0; } else { fr->lsf = 1; fr->mpeg25 = 1; } fr->lay = 4 - ((newhead >> 17) & 3); if (fr->mpeg25) { fr->sampling_frequency = 6 + ((newhead >> 10) & 0x3); } else { fr->sampling_frequency = ((newhead >> 10) & 0x3) + (fr->lsf * 3); } fr->error_protection = ((newhead >> 16) & 0x1) ^ 0x1; fr->bitrate_index = ((newhead >> 12) & 0xf); fr->padding = ((newhead >> 9) & 0x1); fr->extension = ((newhead >> 8) & 0x1); fr->mode = ((newhead >> 6) & 0x3); fr->mode_ext = ((newhead >> 4) & 0x3); fr->copyright = ((newhead >> 3) & 0x1); fr->original = ((newhead >> 2) & 0x1); fr->emphasis = newhead & 0x3; fr->stereo = (fr->mode == MPG_MD_MONO) ? 1 : 2; ssize = 0; if (!fr->bitrate_index) return (0); switch (fr->lay) { case 1: /* fr->do_layer = mpg123_do_layer1; */ /* mpg123_init_layer2(); /\* inits also shared tables with layer1 *\/ */ fr->framesize = (long) tabsel_123[fr->lsf][0][fr->bitrate_index] * 12000; fr->framesize /= mpg123_freqs[fr->sampling_frequency]; fr->framesize = ((fr->framesize + fr->padding) << 2) - 4; break; case 2: /* fr->do_layer = mpg123_do_layer2; */ /* mpg123_init_layer2(); /\* inits also shared tables with layer1 *\/ */ fr->framesize = (long) tabsel_123[fr->lsf][1][fr->bitrate_index] * 144000; fr->framesize /= mpg123_freqs[fr->sampling_frequency]; fr->framesize += fr->padding - 4; break; case 3: /* fr->do_layer = mpg123_do_layer3; */ if (fr->lsf) ssize = (fr->stereo == 1) ? 9 : 17; else ssize = (fr->stereo == 1) ? 17 : 32; if (fr->error_protection) ssize += 2; fr->framesize = (long) tabsel_123[fr->lsf][2][fr->bitrate_index] * 144000; fr->framesize /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf); fr->framesize = fr->framesize + fr->padding - 4; break; default: return (0); } if(fr->framesize > MAXFRAMESIZE) return 0; return 1; } #define GET_INT32BE(b) \ (i = (b[0] << 24) | (b[1] << 16) | b[2] << 8 | b[3], b += 4, i) static int mpg123_get_xing_header(xing_header_t * xing, unsigned char *buf) { int i, head_flags; int id, mode; memset(xing, 0, sizeof(xing_header_t)); /* get selected MPEG header data */ id = (buf[1] >> 3) & 1; mode = (buf[3] >> 6) & 3; buf += 4; /* Skip the sub band data */ if (id) { /* mpeg1 */ if (mode != 3) buf += 32; else buf += 17; } else { /* mpeg2 */ if (mode != 3) buf += 17; else buf += 9; } if (strncmp((char *) buf, "Xing", 4)) return 0; buf += 4; head_flags = GET_INT32BE(buf); if (head_flags & FRAMES_FLAG) xing->frames = GET_INT32BE(buf); if (xing->frames < 1) xing->frames = 1; if (head_flags & BYTES_FLAG) xing->bytes = GET_INT32BE(buf); if (head_flags & TOC_FLAG) { for (i = 0; i < 100; i++) xing->toc[i] = buf[i]; buf += 100; } #ifdef XING_DEBUG for (i = 0; i < 100; i++) { if ((i % 10) == 0) fprintf(stderr, "\n"); fprintf(stderr, " %3d", xing->toc[i]); } #endif return 1; } static double mpg123_compute_tpf(struct frame *fr) { const int bs[4] = {0, 384, 1152, 1152}; double tpf; tpf = bs[fr->lay]; tpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf); return tpf; } static double mpg123_compute_bpf(struct frame *fr) { double bpf; switch (fr->lay) { case 1: bpf = tabsel_123[fr->lsf][0][fr->bitrate_index]; bpf *= 12000.0 * 4.0; bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf); break; case 2: case 3: bpf = tabsel_123[fr->lsf][fr->lay - 1][fr->bitrate_index]; bpf *= 144000; bpf /= mpg123_freqs[fr->sampling_frequency] << (fr->lsf); break; default: bpf = 1.0; } return bpf; } unsigned int mpg123_getbits(int number_of_bits) { unsigned long rval; #ifdef DEBUG_GETBITS fprintf(stderr, "g%d", number_of_bits); #endif if(!number_of_bits) return 0; #if 0 check_buffer_range(number_of_bits + bsi.bitindex); #endif { rval = bsi.wordpointer[0]; rval <<= 8; rval |= bsi.wordpointer[1]; rval <<= 8; rval |= bsi.wordpointer[2]; rval <<= bsi.bitindex; rval &= 0xffffff; bsi.bitindex += number_of_bits; rval >>= (24-number_of_bits); bsi.wordpointer += (bsi.bitindex >> 3); bsi.bitindex &= 7; } #ifdef DEBUG_GETBITS fprintf(stderr,":%x ",rval); #endif return rval; } void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT], struct frame *fr) { unsigned int *ba = balloc; unsigned int *sca = (unsigned int *) scale_index; if (fr->stereo) { int i; int jsbound = fr->jsbound; for (i = 0; i < jsbound; i++) { *ba++ = mpg123_getbits(4); *ba++ = mpg123_getbits(4); } for (i = jsbound; i < SBLIMIT; i++) *ba++ = mpg123_getbits(4); ba = balloc; for (i = 0; i < jsbound; i++) { if ((*ba++)) *sca++ = mpg123_getbits(6); if ((*ba++)) *sca++ = mpg123_getbits(6); } for (i = jsbound; i < SBLIMIT; i++) if ((*ba++)) { *sca++ = mpg123_getbits(6); *sca++ = mpg123_getbits(6); } } else { int i; for (i = 0; i < SBLIMIT; i++) *ba++ = mpg123_getbits(4); ba = balloc; for (i = 0; i < SBLIMIT; i++) if ((*ba++)) *sca++ = mpg123_getbits(6); } } void I_step_two(real fraction[2][SBLIMIT], unsigned int balloc[2 * SBLIMIT], unsigned int scale_index[2][SBLIMIT], struct frame *fr) { int i, n; int smpb[2 * SBLIMIT]; /* values: 0-65535 */ int *sample; register unsigned int *ba; register unsigned int *sca = (unsigned int *) scale_index; if (fr->stereo) { int jsbound = fr->jsbound; register real *f0 = fraction[0]; register real *f1 = fraction[1]; ba = balloc; for (sample = smpb, i = 0; i < jsbound; i++) { if ((n = *ba++)) *sample++ = mpg123_getbits(n + 1); if ((n = *ba++)) *sample++ = mpg123_getbits(n + 1); } for (i = jsbound; i < SBLIMIT; i++) if ((n = *ba++)) *sample++ = mpg123_getbits(n + 1); ba = balloc; for (sample = smpb, i = 0; i < jsbound; i++) { if ((n = *ba++)) *f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++]; else *f0++ = 0.0; if ((n = *ba++)) *f1++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++]; else *f1++ = 0.0; } for (i = jsbound; i < SBLIMIT; i++) { if ((n = *ba++)) { real samp = (((-1) << n) + (*sample++) + 1); *f0++ = samp * mpg123_muls[n + 1][*sca++]; *f1++ = samp * mpg123_muls[n + 1][*sca++]; } else *f0++ = *f1++ = 0.0; } for (i = fr->down_sample_sblimit; i < 32; i++) fraction[0][i] = fraction[1][i] = 0.0; } else { register real *f0 = fraction[0]; ba = balloc; for (sample = smpb, i = 0; i < SBLIMIT; i++) if ((n = *ba++)) *sample++ = mpg123_getbits(n + 1); ba = balloc; for (sample = smpb, i = 0; i < SBLIMIT; i++) { if ((n = *ba++)) *f0++ = (real) (((-1) << n) + (*sample++) + 1) * mpg123_muls[n + 1][*sca++]; else *f0++ = 0.0; } for (i = fr->down_sample_sblimit; i < 32; i++) fraction[0][i] = 0.0; } } static guint get_track_time_file(FILE * file) { guint32 head; guchar tmp[4], *buf; struct frame frm; xing_header_t xing_header; double tpf, bpf; guint32 len; if (!file) return -1; fseek(file, 0, SEEK_SET); if (fread(tmp, 1, 4, file) != 4) return 0; head = convert_to_header(tmp); while (!mpg123_head_check(head)) { head <<= 8; if (fread(tmp, 1, 1, file) != 1) return 0; head |= tmp[0]; } if (mpg123_decode_header(&frm, head)) { buf = g_malloc(frm.framesize + 4); fseek(file, -4, SEEK_CUR); if (fread(buf, 1, frm.framesize + 4, file) != frm.framesize + 4) return 0; // we came up short -- what should we do??? tpf = mpg123_compute_tpf(&frm); if (mpg123_get_xing_header(&xing_header, buf)) { g_free(buf); return ((guint) (tpf * xing_header.frames * 1000)); } g_free(buf); bpf = mpg123_compute_bpf(&frm); fseek(file, 0, SEEK_END); len = ftell(file); fseek(file, -128, SEEK_END); if (fread(tmp, 1, 3, file) != 3) return 0; // we came up short -- what should we do??? if (!strncmp((char *) tmp, "TAG", 3)) len -= 128; return ((guint) ((guint)(len / bpf) * tpf * 1000)); } return 0; } static guint get_track_time (gchar *path) { guint result = 0; if (path) { FILE *file = g_fopen (path, READONLY_FOPEN_STRING); result = get_track_time_file (file); if (file) fclose (file); } return result; } /* * ---------------------------------------------------------------------- * * Gnomad 2 code * *---------------------------------------------------------------------- */ gchar *length_from_file(gchar *path, size_t size) { mp3info *mp3info; gint millisec = 0; gint bitrate; // mp3_read_gain (path, track); /* Get additional info (play time and bitrate) */ mp3info = mp3file_get_info(path); if (mp3info) { millisec = mp3info->milliseconds; bitrate = (gint)(mp3info->vbr_average); g_free (mp3info); } /* Fall back to xmms code if tracklen is 0 */ if (millisec == 0) { millisec = get_track_time(path); if (millisec) bitrate = (float)size*8/millisec; } if (millisec == 0) { /* Tracks with zero play length are ignored by iPod... */ g_print ("File \"%s\" has zero play length.\n", path); return NULL; } /* g_print("Playlength from file: %s is %u seconds long.\n", path, millisec/1000); */ return seconds_to_mmss((int) millisec/1000); } gnomad2-2.9.6/src/player.h0000664000076400007640000000132111512614631012243 00000000000000/* player.h Player window for jukebox file playing, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLAYERH_INCLUDED #define PLAYERH_INCLUDED 1 void create_player_window(GList *metalist); void play_playlist(guint plid); #endif gnomad2-2.9.6/src/xfer.c0000664000076400007640000010206011573772510011720 00000000000000/* xfer.c Transfer window widgets and callbacks Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you xcan redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "metadata.h" #include "editmeta.h" #include "filesystem.h" #include "filenaming.h" #include "prefs.h" #include "jukebox.h" #include "playlists.h" #include "util.h" #include "player.h" #include "xfer.h" /* Local variables */ static GtkWidget *new_folder_dialog; static GtkWidget *new_folder_entry; /***************************************************************************** * Here comes the jukebox transfer functions. *****************************************************************************/ /* Move the files off the Jukebox and into the harddisk directory */ static void transfer_from_jukebox_to_hd (GtkButton *button, gpointer data) { jb2hd_thread_arg_t *jb2hd_thread_args; GList *metalist = get_all_metadata_from_selection(JB_LIST); jb2hd_thread_args = (jb2hd_thread_arg_t *) malloc(sizeof (jb2hd_thread_arg_t)); if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); destroy_metalist(metalist); return; } if (metalist != NULL) { GtkWidget *label1, *label2, *dialog, *button, *separator; dialog=gtk_dialog_new_with_buttons(_("Transferring tracks from jukebox library"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(cancel_jukebox_operation_click), NULL); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog), 0); gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); label1 = gtk_label_new(_("Retrieving tracks from Jukebox...")); label2 = gtk_label_new(""); progress_bar = gtk_progress_bar_new(); separator = gtk_hseparator_new (); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress_bar, TRUE, TRUE, 0); gtk_widget_show_all(dialog); jb2hd_thread_args->dialog = dialog; jb2hd_thread_args->label = label2; jb2hd_thread_args->metalist = metalist; jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; g_thread_create(jb2hd_thread,(gpointer) jb2hd_thread_args, FALSE, NULL); } } /* Create a list of the files to be transferred */ static GList *get_files_to_xfer(GList *metalist, GList *appendum) { GList *newlist = appendum; GList *templist = g_list_first(metalist); while (templist != NULL) { metadata_t *meta = (metadata_t *) templist->data; gchar *file = filename_fromutf8(meta->path); if(is_directory(file)) { /* Do not recurse into . and .. */ if(get_prefs_recurse_dir() && strcmp(meta->artist,"..") && strcmp(meta->artist,".") ) { GList *inner_metalist; /* g_print("Recursing directory...\n"); */ /* Get metalist for directory */ inner_metalist = get_metadata_dir(HD_LIST, meta->path, NULL); /* Call myself */ newlist = get_files_to_xfer(inner_metalist, newlist); /* Free the metalist and temppath */ destroy_metalist(inner_metalist); } } else { newlist = g_list_append(newlist, clone_metadata_t(meta)); } g_free(file); templist = templist->next; } return newlist; } /* Move the files off the Harddisk and into the Jukebox */ void transfer_from_hd_to_jukebox(GList *playlists) { GList *metalist = get_all_metadata_from_selection(HD_LIST); GList *xferlist; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); destroy_metalist(metalist); return; } if (metalist != NULL) { hd2jb_thread_arg_t *hd2jb_thread_args; GtkWidget *label1, *label2, *dialog, *button, *separator; hd2jb_thread_args = (hd2jb_thread_arg_t *) malloc(sizeof (hd2jb_thread_arg_t)); dialog=gtk_dialog_new_with_buttons(_("Transferring tracks to jukebox library"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(cancel_jukebox_operation_click), NULL); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog), 0); gtk_window_set_title (GTK_WINDOW (dialog), _("Transferring tracks to jukebox library")); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); label1 = gtk_label_new(_("Storing tracks in Jukebox library...")); label2 = gtk_label_new(""); /* FIXME: Instead add a list to the dialog so progress may be seen better */ progress_bar = gtk_progress_bar_new(); separator = gtk_hseparator_new (); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress_bar, TRUE, TRUE, 0); gtk_widget_show_all(dialog); hd2jb_thread_args->dialog = dialog; hd2jb_thread_args->label = label2; xferlist = get_files_to_xfer(metalist, NULL); destroy_metalist(metalist); hd2jb_thread_args->metalist = xferlist; hd2jb_thread_args->pltreestore = playlist_widgets.pltreestore; hd2jb_thread_args->playlists = playlists; /* Dumps the xfer list without transferring anything - for debugging */ /* { GList *templist = g_list_first(xferlist); g_print("Transferring...\n"); while (templist) { metadata_t *meta = (metadata_t *) templist->data; g_print("To transfer: %s\n", meta->path); templist = g_list_next(templist); } destroy_metalist(xferlist); gtk_widget_destroy(dialog); } */ jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; g_thread_create(hd2jb_thread,(gpointer) hd2jb_thread_args, FALSE, NULL); } } /***************************************************************************** * Other tool functions for popup choices etc. *****************************************************************************/ #define MAX_HISTORY 10 static void add_to_history(gchar *string) { /* See if the string is already in the history */ GList *history = transfer_widgets.history; while (history) { if (!strcmp(history->data, string)) return; history = g_list_next(history); } history = transfer_widgets.history; /* Else add it */ transfer_widgets.history = g_list_prepend (transfer_widgets.history, string); /* Do not remember more than MAX_HISTORY strings */ while (g_list_length(history) > MAX_HISTORY) { GList *elem; elem = g_list_last(history); transfer_widgets.history = g_list_remove(history, elem->data); } } static void set_popup_history(GtkWidget *combo) { GList *history = transfer_widgets.history; #if GTK_CHECK_VERSION(3,0,0) // Use the new combobox abstractions in 3.0 and later gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(combo)); while (history) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), history->data); history = g_list_next(history); } #else // Dead ugly code for older GTK static gboolean firstrun = TRUE; int i; // Blank out all 5 entries if (!firstrun) { for (i = 0; i < MAX_HISTORY; i++) { gtk_combo_box_remove_text(GTK_COMBO_BOX(combo), 0); } } else { firstrun = FALSE; } for (i = 0; i < MAX_HISTORY; i++) { if (history) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), history->data); history = g_list_next(history); } else { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), ""); } i++; } #endif } /* Response to the "rescan" call from the harddisk popup menu */ static GCallback hdmenu_rescan_response(gpointer data) { fill_in_dir(HD_LIST, get_current_dir()); return NULL; } /* Response to the "transfer" call from the harddisk popup menu */ static GCallback hdmenu_transfer_response(gpointer data) { transfer_from_hd_dialog(NULL, NULL); return NULL; } /* Response to the "delete" call from the harddisk popup menu */ static GCallback hdmenu_delete_response(gpointer data) { if (request_confirmation_dialog(_("Really delete selected files/folders?"))) { GList *metalist = get_all_metadata_from_selection(HD_LIST); if (!delete_files(metalist)) { remove_selected(HD_LIST); // This or fill in directory? This is faster. } else fill_in_dir(HD_LIST, get_current_dir()); destroy_metalist(metalist); } return NULL; } static GCallback create_new_folder_ok_button (GtkButton *button, gpointer data) { gchar *foldername; gchar *current; gchar *fullpath; current = get_current_dir(); foldername = g_strdup(gtk_entry_get_text(GTK_ENTRY(new_folder_entry))); gtk_widget_destroy(new_folder_dialog); fullpath = g_strconcat(current,"/",foldername,NULL); #if !GTK_CHECK_VERSION(2,8,0) if (g_mkdir(fullpath,0755)) { create_error_dialog(_("Could not create folder")); } #else if (g_mkdir_with_parents(fullpath,0755)) { create_error_dialog(_("Could not create folder")); } #endif fill_in_dir(HD_LIST, get_current_dir()); g_free(fullpath); g_free(current); g_free(foldername); return NULL; } /* Response to the "new folder..." call from the harddisk popup menu */ static GCallback hdmenu_new_folder_response(gpointer data) { GtkWidget *label, *button; new_folder_dialog=gtk_dialog_new_with_buttons(_("New folder"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(new_folder_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(new_folder_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(new_folder_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(create_new_folder_ok_button), NULL); gtk_window_set_position (GTK_WINDOW(new_folder_dialog), GTK_WIN_POS_MOUSE); label = gtk_label_new(_("Enter a name for the folder:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_folder_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); new_folder_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_folder_dialog)->vbox), new_folder_entry, TRUE, TRUE, 0); gtk_widget_show(new_folder_entry); g_signal_connect(G_OBJECT (new_folder_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), G_OBJECT (new_folder_dialog)); gtk_widget_show_all(new_folder_dialog); return NULL; } /* Handles descending into a directory in the clist */ static void go_down(void) { gchar *path; metadata_t *meta; meta = get_first_metadata_from_selection(HD_LIST); if (meta == NULL) { return; } /* * Get the size column. If this is zero, * we're dealing with a directory! Only * directories of size 0 are allowed, no * files of size 0. */ if (meta->size == 0) { GtkWidget *combo = transfer_widgets.combo; add_to_history (get_current_dir()); change_directory(meta->path); path = get_current_dir(); // Set the text in the box, then switch directory view set_popup_history(combo); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))), path); fill_in_dir(HD_LIST, path); } destroy_metadata_t(meta); } /* If we come here, then the user has selected a row in the * harddisk file listing */ static GCallback hdlist_mouseevent (GtkWidget *widget, GdkEventButton *event, gpointer data ) { /* GDK_2BUTTON_PRESS doesn't seem to work OK with GTK+-2.0 */ if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { go_down(); return (gpointer) 1; } else if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GdkEventButton *bevent = (GdkEventButton *) event; gtk_menu_popup (GTK_MENU (transfer_widgets.harddiskpopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); return (gpointer) 1; } return data; } static GCallback hdlist_keyevent (GtkWidget *widget, GdkEventKey *event, gpointer data ) { if (event->type == GDK_KEY_PRESS && (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter)) { go_down(); return (gpointer) 1; } else if (event->keyval == GDK_KP_Delete || event->keyval == GDK_Delete) { /* Delete on something */ return (gpointer) 1; } return data; } /* Response to the "transfer" call from the jukebox popup menu */ static GCallback jbmenu_rescan_response(gpointer data) { scan_jukebox(NULL); return NULL; } /* Response to the "transfer" call from the jukebox popup menu */ static GCallback jbmenu_transfer_response(gpointer data) { transfer_from_jukebox_to_hd(NULL, NULL); return NULL; } /* Response to a request to play some music */ static GCallback jbmenu_play_response(gpointer data) { GList *metalist = get_all_metadata_from_selection(JB_LIST); if (metalist == NULL) return NULL; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); destroy_metalist(metalist); return NULL; } create_player_window(metalist); return NULL; } /* Response to the "delete" call from the jukebox popup menu */ static GCallback jbmenu_delete_response(gpointer data) { if (request_confirmation_dialog(_("Really delete selected tracks?"))) { GList *metalist = get_all_metadata_from_selection(JB_LIST); jukebox_delete_tracks(metalist, playlist_widgets.pltreestore); remove_selected(JB_LIST); destroy_metalist(metalist); } return NULL; } static GCallback jblist_mouseevent (GtkWidget *clist, GdkEventButton *event, gpointer data ) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GdkEventButton *bevent = (GdkEventButton *) event; gtk_menu_popup (GTK_MENU (transfer_widgets.jukeboxpopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); return (gpointer) 1; } return data; } static int chdir_edit(GtkWidget * widget, gpointer data) { gchar *text, *tempstr, *path; #if GTK_CHECK_VERSION(2,24,0) text = (gchar *) gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(transfer_widgets.combo)); #else text = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(transfer_widgets.combo)); #endif if ((tempstr = expand_path (text)) == NULL) { g_free (tempstr); } else text = tempstr; if (text == NULL) return (FALSE); /* Add the current directory to the history */ add_to_history(get_current_dir()); change_directory(text); /* Set the text in the box, then switch directory view */ path = get_current_dir(); set_popup_history(transfer_widgets.combo); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(transfer_widgets.combo))), path); fill_in_dir(HD_LIST, path); return (FALSE); } static void cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { metadata_t *meta = get_metadata_from_model(model, iter); if (meta->size == 0) { g_object_set(G_OBJECT(cell), "foreground", GNOMAD_DIRECTORY_FOLDER_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FOLDER_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FOLDER_ENTRY_STYLE, "underline", PANGO_UNDERLINE_SINGLE, NULL); } else { g_object_set(G_OBJECT(cell), "foreground", GNOMAD_DIRECTORY_FILE_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FILE_ENTRY_STYLE, "underline", FALSE, NULL); } destroy_metadata_t(meta); } static GtkWidget *create_listview(GtkListStore *liststore) { GtkWidget *listview; GtkCellRenderer *dirtextrenderer; GtkCellRenderer *textrenderer; GtkCellRenderer *timerenderer; GtkCellRenderer *togglerenderer; GtkTreeViewColumn *view; /* For testing to add something to the store. GtkTreeIter listiter; gtk_list_store_append (GTK_LIST_STORE(liststore), &listiter); gtk_list_store_set (GTK_LIST_STORE(liststore), &listiter, TRACKLIST_ARTIST_COLUMN, "Artist", TRACKLIST_TITLE_COLUMN, "Title", TRACKLIST_ALBUM_COLUMN, "Album", TRACKLIST_YEAR_COLUMN, 2003, TRACKLIST_GENRE_COLUMN, "Genre", TRACKLIST_LENGTH_COLUMN, "1:00", TRACKLIST_SIZE_COLUMN, 1000000, TRACKLIST_CODEC_COLUMN, "MP3", TRACKLIST_TRACKNO_COLUMN, 1, TRACKLIST_PROTECTED_COLUMN, FALSE, TRACKLIST_FILENAME_COLUMN, "Fnord.mp3", TRACKLIST_ID_COLUMN, "12345", -1); */ listview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(liststore)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(listview), TRUE); dirtextrenderer = gtk_cell_renderer_text_new(); textrenderer = gtk_cell_renderer_text_new(); /* This renderer render time measures */ timerenderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(textrenderer), "foreground", GNOMAD_DIRECTORY_FILE_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FILE_ENTRY_STYLE, "underline", FALSE, NULL); g_object_set(G_OBJECT(timerenderer), "foreground", GNOMAD_DIRECTORY_FILE_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FILE_ENTRY_STYLE, "underline", FALSE, NULL); togglerenderer = gtk_cell_renderer_toggle_new (); view = gtk_tree_view_column_new_with_attributes (_("Artist"), dirtextrenderer, "text", TRACKLIST_ARTIST_COLUMN, NULL); gtk_tree_view_column_set_cell_data_func(view, dirtextrenderer, (GtkTreeCellDataFunc) cell_data_func, NULL, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_ARTIST_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Title"), textrenderer, "text", TRACKLIST_TITLE_COLUMN, NULL); // FIXME: color this gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_TITLE_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Album"), textrenderer, "text", TRACKLIST_ALBUM_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_ALBUM_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Year"), textrenderer, "text", TRACKLIST_YEAR_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 40); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_YEAR_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Genre"), textrenderer, "text", TRACKLIST_GENRE_COLUMN, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 80); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_GENRE_COLUMN); view = gtk_tree_view_column_new_with_attributes (_("Length"), timerenderer, "text", TRACKLIST_LENGTH_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 40); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_LENGTH_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Size (bytes)"), textrenderer, "text", TRACKLIST_SIZE_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 80); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_SIZE_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Codec"), textrenderer, "text", TRACKLIST_CODEC_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 48); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_CODEC_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Track#"), textrenderer, "text", TRACKLIST_TRACKNO_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 48); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_TRACKNO_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Protected"), togglerenderer, "active", TRACKLIST_PROTECTED_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 48); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_PROTECTED_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Filename"), textrenderer, "text", TRACKLIST_FILENAME_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); /* Hide it */ gtk_tree_view_column_set_visible(view, FALSE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_FILENAME_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (/* Track ID number */ _("ID"), textrenderer, "text", TRACKLIST_ID_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); /* Hide it */ gtk_tree_view_column_set_visible(view, FALSE); gtk_tree_view_column_set_sort_column_id(view, TRACKLIST_ID_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); return listview; } GtkWidget *create_xfer_widgets(void) { GtkWidget *popupmenu, *popupmenu_item; GtkWidget *button; GtkWidget *leftbox; GtkWidget *music_panel; GtkWidget *transfer_button_vbox; GtkWidget *combo; GtkWidget *arrow; GtkWidget *left_vbox; GtkWidget *right_vbox; GtkWidget *scrolled_window; /* Fresh widgets */ GtkWidget *hdlistview; GtkWidget *jblistview; GtkTreeSelection *hdlistselection; GtkTreeSelection *jblistselection; GtkWidget *label; transfer_widgets.history = NULL; /* Just add something to the history... */ transfer_widgets.history = g_list_append (transfer_widgets.history, (gpointer) get_current_dir()); /* The popup menu for the harddisk files */ popupmenu = gtk_menu_new (); popupmenu_item = gtk_menu_item_new_with_label (_("Rescan directory metadata")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_rescan_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Transfer selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_transfer_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Edit selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_edit_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Delete selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("New folder...")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_new_folder_response), NULL, 0); gtk_widget_show (popupmenu_item); transfer_widgets.harddiskpopupmenu = popupmenu; /* The popup menu for the jukebox files */ popupmenu = gtk_menu_new (); popupmenu_item = gtk_menu_item_new_with_label (_("Rescan jukebox contents")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_rescan_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Transfer selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_transfer_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Add selected to playlist")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_add_playlist_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Play selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_play_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Edit selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_edit_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Delete selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); transfer_widgets.jukeboxpopupmenu = popupmenu; /* Then the panel (handle in the middle) */ music_panel = gtk_hpaned_new(); leftbox = gtk_hbox_new(FALSE, 0); left_vbox = gtk_vbox_new(FALSE, 0); #if GTK_CHECK_VERSION(2,24,0) // Use the new combo box type in 2.24 and later combo = gtk_combo_box_text_new_with_entry(); #else combo = gtk_combo_box_entry_new_text(); #endif transfer_widgets.combo = combo; set_popup_history(combo); gtk_box_pack_start(GTK_BOX(left_vbox), combo, FALSE, FALSE, 0); // signal "changed" on the combo directly will not work g_signal_connect_object(GTK_OBJECT(gtk_bin_get_child(GTK_BIN(combo))), "activate", G_CALLBACK(chdir_edit), NULL, 0); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))), get_current_dir()); gtk_widget_show(combo); /* Create the stores and their views */ hdlistview = create_listview(transfer_widgets.hdliststore); transfer_widgets.hdlistview = hdlistview; jblistview = create_listview(transfer_widgets.jbliststore); transfer_widgets.jblistview = jblistview; hdlistselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(hdlistview)); gtk_tree_selection_set_mode(hdlistselection, GTK_SELECTION_EXTENDED); jblistselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(jblistview)); gtk_tree_selection_set_mode(jblistselection, GTK_SELECTION_EXTENDED); /* Connect signal handlers */ g_signal_connect_object((gpointer) hdlistview, "button_press_event", G_CALLBACK(hdlist_mouseevent), NULL, 0); g_signal_connect_object((gpointer) jblistview, "button_press_event", G_CALLBACK(jblist_mouseevent), NULL, 0); /* FIXME: this doesn't seem to work. Look up code for the list MVCs. */ g_signal_connect_object((gpointer) hdlistview, "key_press_event", G_CALLBACK(hdlist_keyevent), NULL, 0); /* Fill in and sort directory */ #if GTK_CHECK_VERSION(2,24,0) fill_in_dir(HD_LIST, (gchar *) gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo))); #else fill_in_dir(HD_LIST, (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo))); #endif view_and_sort_list_store(HD_LIST); /* Create a scrolled window for the harddisk files */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(scrolled_window), hdlistview); gtk_widget_show(hdlistview); gtk_box_pack_start(GTK_BOX(left_vbox), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); gtk_widget_show(left_vbox); gtk_box_pack_start(GTK_BOX(leftbox), left_vbox, TRUE, TRUE, 0); /* A vertical box for the transfer buttons */ transfer_button_vbox=gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(transfer_button_vbox), 5); /* Add buttons to this vertical box */ button = gtk_button_new(); arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_widget_show(arrow); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(transfer_from_hd_dialog), NULL, 0); gtk_box_pack_start(GTK_BOX(transfer_button_vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); button = gtk_button_new(); arrow = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_widget_show(arrow); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(jbmenu_transfer_response), NULL, 0); gtk_box_pack_start(GTK_BOX(transfer_button_vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(leftbox), transfer_button_vbox, FALSE, FALSE, 0); gtk_paned_pack1 (GTK_PANED(music_panel), leftbox, TRUE, TRUE); gtk_widget_show(leftbox); gtk_widget_show(transfer_button_vbox); /* A vertical box for jukebox scroll and label */ right_vbox=gtk_vbox_new(FALSE, 0); /* Create a scrolled window for the jukebox files */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); /* Add the CList widget to the vertical box and show it. */ gtk_container_add(GTK_CONTAINER(scrolled_window), jblistview); gtk_widget_show(jblistview); gtk_widget_show (scrolled_window); label = gtk_label_new(_("Jukebox library window")); gtk_box_pack_start(GTK_BOX(right_vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); gtk_box_pack_start(GTK_BOX(right_vbox), scrolled_window, TRUE, TRUE, 0); gtk_paned_pack2 (GTK_PANED(music_panel), right_vbox, TRUE, TRUE); gtk_widget_show (right_vbox); gtk_paned_set_position (GTK_PANED(music_panel), 320); /* Show the entire music panel */ gtk_widget_show(music_panel); return music_panel; } gnomad2-2.9.6/src/data.c0000664000076400007640000006047711573770655011714 00000000000000/* data.c Data transferring window widgets and callbacks Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you xcan redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "filesystem.h" #include "jukebox.h" #include "data.h" #include "util.h" static GtkWidget *new_folder_dialog; static GtkWidget *new_folder_entry; /* Move the files off the Jukebox and into the harddisk directory */ static GCallback data_from_jukebox_to_hd (GtkButton *button, gpointer data) { jb2hd_data_thread_arg_t *jb2hd_data_thread_args; GList *metalist = get_all_metadata_from_selection(JBDATA_LIST); jb2hd_data_thread_args = (jb2hd_data_thread_arg_t *) malloc(sizeof (jb2hd_data_thread_arg_t)); if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); destroy_metalist(metalist); return NULL; } if (metalist != NULL) { GtkWidget *label1, *label2, *dialog, *button, *separator; dialog = gtk_dialog_new_with_buttons(_("Transferring files from jukebox file storage"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(cancel_jukebox_operation_click), NULL); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog), 0); gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); label1 = gtk_label_new(_("Retrieving data files from Jukebox...")); label2 = gtk_label_new(""); progress_bar = gtk_progress_bar_new(); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress_bar, TRUE, TRUE, 0); gtk_widget_show_all(dialog); jb2hd_data_thread_args->dialog = dialog; jb2hd_data_thread_args->label = label2; jb2hd_data_thread_args->metalist = metalist; jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; g_thread_create(jb2hd_data_thread,(gpointer) jb2hd_data_thread_args, FALSE, NULL); } return NULL; } /* Move the files off the Harddisk and into the Jukebox */ static GCallback data_from_hd_to_jukebox(GtkButton *button/*UNUSED*/, gpointer user_data/*UNUSED*/) { hd2jb_data_thread_arg_t *hd2jb_data_thread_args; GList *metalist = get_all_metadata_from_selection(HDDATA_LIST); hd2jb_data_thread_args = (hd2jb_data_thread_arg_t *) malloc(sizeof (hd2jb_data_thread_arg_t)); if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); destroy_metalist(metalist); return NULL; } if (metalist != NULL) { GtkWidget *label1, *label2, *dialog, *button, *separator; dialog=gtk_dialog_new_with_buttons(_("Transferring files to jukebox file storage"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(cancel_jukebox_operation_click), NULL); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(dialog), 0); gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE); label1 = gtk_label_new(_("Storing files in Jukebox file storage...")); label2 = gtk_label_new(""); progress_bar = gtk_progress_bar_new(); separator = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progress_bar, TRUE, TRUE, 0); gtk_widget_show_all(dialog); hd2jb_data_thread_args->dialog = dialog; hd2jb_data_thread_args->label = label2; hd2jb_data_thread_args->metalist = metalist; jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; g_thread_create(hd2jb_data_thread,(gpointer) hd2jb_data_thread_args, FALSE, NULL); } return NULL; } #define MAX_HISTORY 10 static void add_to_history (gchar *string) { /* See if the string is already in the history */ GList *history = data_widgets.history; while (history) { if (!strcmp(history->data, string)) return; history = g_list_next(history); } history = data_widgets.history; /* Else add it */ data_widgets.history = g_list_prepend (data_widgets.history, string); /* Do not remember more than MAX_HISTORY strings */ while (g_list_length(history) > MAX_HISTORY) { GList *elem; elem = g_list_last(history); data_widgets.history = g_list_remove(history, elem->data); } } static void set_popup_history(GtkWidget *combo) { GList *history = data_widgets.history; #if GTK_CHECK_VERSION(3,0,0) // Use the new combobox abstractions in 3.0 and later gtk_combo_box_text_remove_all(GTK_COMBO_BOX_TEXT(combo)); while (history) { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), history->data); history = g_list_next(history); } #else // Dead ugly code for older GTK static gboolean firstrun = TRUE; int i; // Blank out all 5 entries if (!firstrun) { for (i = 0; i < MAX_HISTORY; i++) { gtk_combo_box_remove_text(GTK_COMBO_BOX(combo), 0); } } else { firstrun = FALSE; } for (i = 0; i < MAX_HISTORY; i++) { if (history) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), history->data); history = g_list_next(history); } else { gtk_combo_box_append_text(GTK_COMBO_BOX(combo), ""); } i++; } #endif } /* Response to the "rescan" call from the harddisk popup menu */ static GCallback hdmenu_rescan_response(gpointer data) { fill_in_dir(HDDATA_LIST, get_current_dir()); return NULL; } /* Response to the "transfer" call from the harddisk popup menu */ static GCallback hdmenu_transfer_response(gpointer data) { data_from_hd_to_jukebox(NULL, NULL); return NULL; } /* Response to the "delete" call from the harddisk popup menu */ static GCallback hdmenu_delete_response(gpointer data) { if (request_confirmation_dialog(_("Really delete selected files?"))) { GList *metalist = get_all_metadata_from_selection(HDDATA_LIST); delete_files(metalist); remove_selected(HDDATA_LIST); destroy_metalist(metalist); // fill_in_dir(HDDATA_LIST, get_current_dir()); } return NULL; } /* Handles descending into a directory */ static void go_down(void) { gchar *path; metadata_t *meta; meta = get_first_metadata_from_selection(HDDATA_LIST); if (meta == NULL) { return; } /* * Get the size column. If this is zero, * we're dealing with a directory! Only * directories of size 0 are allowed, no * files of size 0. */ if (meta->size == 0) { GtkWidget *combo = data_widgets.combo; add_to_history (get_current_dir()); change_directory(meta->path); path = get_current_dir(); // Set the text in the box, then switch directory view set_popup_history(combo); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))), path); fill_in_dir(HDDATA_LIST, path); } destroy_metadata_t(meta); } static void go_down_jukebox(void) { metadata_t *meta; meta = get_first_metadata_from_selection(JBDATA_LIST); if (meta == NULL) { return; } /* * Get the size column. If this is zero, * we're dealing with a directory! Only * directories of size 0 are allowed, no * files of size 0. */ if (meta->size == 0) { GtkWidget *entry = data_widgets.jbentry; // g_print("Changing directory to %s\n", meta->folder); rebuild_datafile_list(meta->folder); // Set the text in the box gtk_entry_set_text (GTK_ENTRY(entry), meta->folder); } destroy_metadata_t(meta); } /* * If we come here, then the user has selected a row in the * harddisk file listing */ static GCallback hdlist_mouseevent(GtkWidget *widget, GdkEventButton *event, gpointer data ) { if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { go_down(); return (gpointer) 1; } else if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GdkEventButton *bevent = (GdkEventButton *) event; gtk_menu_popup (GTK_MENU (data_widgets.harddiskpopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); return (gpointer) 1; } return data; } static GCallback hdlist_keyevent (GtkWidget *widget, GdkEventKey *event, gpointer data ) { if (event->type == GDK_KEY_PRESS && (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter)) { go_down(); return (gpointer) 1; } else if (event->keyval == GDK_KP_Delete || event->keyval == GDK_Delete) { /* Delete on something */ return (gpointer) 1; } return data; } /* Response to the "transfer" call from the jukebox popup menu */ static GCallback jbmenu_rescan_response(gpointer data) { scan_jukebox(NULL); return NULL; } /* Response to the "transfer" call from the jukebox popup menu */ static GCallback jbmenu_transfer_response(gpointer data) { data_from_jukebox_to_hd(NULL, NULL); return NULL; } static GCallback create_new_folder_ok_button (GtkButton *button, gpointer data) { gchar *foldername; foldername = g_strdup(gtk_entry_get_text(GTK_ENTRY(new_folder_entry))); gtk_widget_destroy(new_folder_dialog); // Create it on the jukebox g_print("Creating folder \"%s\"...\n", foldername); jukebox_create_folder(foldername); g_free(foldername); return NULL; } /* Response to the "create folder" call from the harddisk popup menu */ static GCallback jbmenu_create_folder_response(gpointer data) { GtkWidget *label, *button; new_folder_dialog=gtk_dialog_new_with_buttons(_("Create a new folder"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(new_folder_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(new_folder_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(new_folder_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(create_new_folder_ok_button), NULL); gtk_window_set_position (GTK_WINDOW(new_folder_dialog), GTK_WIN_POS_MOUSE); label = gtk_label_new(_("Choose a name for the new folder:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_folder_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); new_folder_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_folder_dialog)->vbox), new_folder_entry, TRUE, TRUE, 0); gtk_widget_show(new_folder_entry); g_signal_connect(G_OBJECT (new_folder_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), G_OBJECT (new_folder_dialog)); gtk_widget_show_all(new_folder_dialog); return NULL; } /* Response to the "delete" call from the jukebox popup menu */ static GCallback jbmenu_delete_response(gpointer data) { if (request_confirmation_dialog(_("Really delete selected files?"))) { GList *metalist = get_all_metadata_from_selection(JBDATA_LIST); jukebox_delete_files(metalist); remove_selected(JBDATA_LIST); destroy_metalist(metalist); } return NULL; } /* * If we come here, then the user has selected a row in the * jukebox files listing */ static GCallback jblist_mouseevent(GtkWidget *clist, GdkEventButton *event, gpointer data ) { if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { go_down_jukebox(); return (gpointer) 1; } else if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GdkEventButton *bevent = (GdkEventButton *) event; gtk_menu_popup (GTK_MENU (data_widgets.jukeboxpopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); return (gpointer) 1; } return data; } static int chdir_edit(GtkWidget * widget, gpointer data) { gchar *text, *tempstr, *path; #if GTK_CHECK_VERSION(2,24,0) text = (gchar *) gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(data_widgets.combo)); #else text = (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(data_widgets.combo)); #endif if ((tempstr = expand_path (text)) == NULL) { g_free (tempstr); } else text = tempstr; if (text == NULL) return (FALSE); /* Add the current directory to the history */ add_to_history(get_current_dir()); change_directory(text); /* Set the text in the box, then switch directory view */ path = get_current_dir(); set_popup_history(data_widgets.combo); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(data_widgets.combo))), path); fill_in_dir(HDDATA_LIST, path); return (FALSE); } static void cell_data_func (GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *model, GtkTreeIter *iter, gpointer data) { metadata_t *meta = get_data_metadata_from_model(model, iter); if (meta->size == 0) { g_object_set(G_OBJECT(cell), "foreground", GNOMAD_DIRECTORY_FOLDER_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FOLDER_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FOLDER_ENTRY_STYLE, "underline", PANGO_UNDERLINE_SINGLE, NULL); } else { g_object_set(G_OBJECT(cell), "foreground", GNOMAD_DIRECTORY_FILE_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FILE_ENTRY_STYLE, "underline", FALSE, NULL); } destroy_metadata_t(meta); } static GtkWidget *create_listview(GtkListStore *liststore) { GtkWidget *listview; GtkCellRenderer *dirtextrenderer; GtkCellRenderer *textrenderer; GtkTreeViewColumn *view; listview = gtk_tree_view_new_with_model (GTK_TREE_MODEL(liststore)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(listview), TRUE); dirtextrenderer = gtk_cell_renderer_text_new (); textrenderer = gtk_cell_renderer_text_new (); g_object_set(G_OBJECT(textrenderer), "foreground", GNOMAD_DIRECTORY_FILE_ENTRY_COLOR, "weight", GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT, "style", GNOMAD_DIRECTORY_FILE_ENTRY_STYLE, "underline", FALSE, NULL); view = gtk_tree_view_column_new_with_attributes (_("Filename"), dirtextrenderer, "text", FILELIST_FILENAME_COLUMN, NULL); gtk_tree_view_column_set_cell_data_func(view, dirtextrenderer, (GtkTreeCellDataFunc) cell_data_func, NULL, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, FILELIST_FILENAME_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (_("Size (bytes)"), textrenderer, "text", FILELIST_SIZE_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 80); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, FILELIST_SIZE_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); view = gtk_tree_view_column_new_with_attributes (/* file ID number */ _("ID"), textrenderer, "text", FILELIST_ID_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); /* Hide it */ gtk_tree_view_column_set_visible(view, FALSE); gtk_tree_view_column_set_sort_column_id(view, FILELIST_ID_COLUMN); gtk_tree_view_append_column (GTK_TREE_VIEW(listview), view); return listview; } GtkWidget *create_data_widgets(void) { GtkWidget *popupmenu, *popupmenu_item; GtkWidget *button; GtkWidget *leftbox; GtkWidget *panel; GtkWidget *transfer_button_vbox; GtkWidget *combo; GtkWidget *jbentry; GtkWidget *arrow; GtkWidget *left_vbox; GtkWidget *right_vbox; GtkWidget *scrolled_window; GtkWidget *label; /* Fresh widgets */ GtkWidget *hdlistview; GtkWidget *jblistview; GtkTreeSelection *hdlistselection; GtkTreeSelection *jblistselection; data_widgets.history = NULL; /* Just add something to the history... */ data_widgets.history = g_list_append (data_widgets.history, (gpointer) get_current_dir()); /* The popup menu for the harddisk files */ popupmenu = gtk_menu_new (); popupmenu_item = gtk_menu_item_new_with_label (_("Rescan jukebox")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_rescan_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Transfer selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_transfer_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Delete selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(hdmenu_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); data_widgets.harddiskpopupmenu = popupmenu; /* The popup menu for the jukebox files */ popupmenu = gtk_menu_new (); popupmenu_item = gtk_menu_item_new_with_label (_("Rescan contents")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_rescan_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Create folder")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_create_folder_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Transfer selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_transfer_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label (_("Delete selected")); gtk_menu_shell_append (GTK_MENU_SHELL(popupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(jbmenu_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); data_widgets.jukeboxpopupmenu = popupmenu; /* Then the panel (handle in the middle) */ panel = gtk_hpaned_new(); leftbox = gtk_hbox_new(FALSE, 0); left_vbox = gtk_vbox_new(FALSE, 0); #if GTK_CHECK_VERSION(2,24,0) // Use the new combo box type in 2.24 and later combo = gtk_combo_box_text_new_with_entry(); #else combo = gtk_combo_box_entry_new_text(); #endif data_widgets.combo = combo; set_popup_history(combo); gtk_box_pack_start(GTK_BOX(left_vbox), combo, FALSE, FALSE, 0); // signal "changed" on the combo directly will not work g_signal_connect_object(GTK_OBJECT(gtk_bin_get_child(GTK_BIN(combo))), "activate", G_CALLBACK(chdir_edit), NULL, 0); gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))), get_current_dir()); gtk_widget_show(combo); /* Create the stores and their views */ hdlistview = create_listview(data_widgets.hdliststore); data_widgets.hdlistview = hdlistview; jblistview = create_listview(data_widgets.jbliststore); data_widgets.jblistview = jblistview; hdlistselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(hdlistview)); gtk_tree_selection_set_mode(hdlistselection, GTK_SELECTION_EXTENDED); jblistselection = gtk_tree_view_get_selection(GTK_TREE_VIEW(jblistview)); gtk_tree_selection_set_mode(jblistselection, GTK_SELECTION_EXTENDED); /* Connect signal handlers */ g_signal_connect_object((gpointer) hdlistview, "button_press_event", G_CALLBACK(hdlist_mouseevent), NULL, 0); g_signal_connect_object((gpointer) jblistview, "button_press_event", G_CALLBACK(jblist_mouseevent), NULL, 0); /* FIXME: this doesn't seem to work. Look up code for the list MVCs. */ g_signal_connect_object((gpointer) hdlistview, "key_press_event", G_CALLBACK(hdlist_keyevent), NULL, 0); /* Fill in and sort directory */ #if GTK_CHECK_VERSION(2,24,0) fill_in_dir(HDDATA_LIST, (gchar *) gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo))); #else fill_in_dir(HDDATA_LIST, (gchar *) gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo))); #endif view_and_sort_list_store(HDDATA_LIST); /* Create a scrolled window for the harddisk files */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); /* Add the CList widget to the vertical box and show it. */ gtk_container_add(GTK_CONTAINER(scrolled_window), hdlistview); gtk_widget_show(hdlistview); gtk_box_pack_start(GTK_BOX(left_vbox), scrolled_window, TRUE, TRUE, 0); gtk_widget_show (scrolled_window); gtk_widget_show(left_vbox); gtk_box_pack_start(GTK_BOX(leftbox), left_vbox, TRUE, TRUE, 0); /* A vertical box for the transfer buttons */ transfer_button_vbox=gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(transfer_button_vbox), 5); /* Add buttons to this vertical box */ button = gtk_button_new(); arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_widget_show(arrow); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(data_from_hd_to_jukebox), NULL, 0); gtk_box_pack_start(GTK_BOX(transfer_button_vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); button = gtk_button_new(); arrow = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(button), arrow); gtk_widget_show(arrow); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(data_from_jukebox_to_hd), NULL, 0); gtk_box_pack_start(GTK_BOX(transfer_button_vbox), button, TRUE, FALSE, 0); gtk_widget_show(button); gtk_box_pack_start(GTK_BOX(leftbox), transfer_button_vbox, FALSE, FALSE, 0); gtk_paned_pack1 (GTK_PANED(panel), leftbox, TRUE, TRUE); gtk_widget_show(leftbox); gtk_widget_show(transfer_button_vbox); /* A vertical box for jukebox scroll and label */ right_vbox=gtk_vbox_new(FALSE, 0); /* Create a scrolled window for the jukebox files */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); /* Add the ListView widget to the vertical box and show it. */ gtk_container_add(GTK_CONTAINER(scrolled_window), jblistview); gtk_widget_show(jblistview); gtk_widget_show (scrolled_window); label = gtk_label_new(_("Jukebox data file window")); gtk_box_pack_start(GTK_BOX(right_vbox), label, FALSE, FALSE, 0); gtk_widget_show (label); /* An entry for showing jukebox directory */ jbentry = gtk_entry_new(); data_widgets.jbentry = jbentry; gtk_box_pack_start(GTK_BOX(right_vbox), jbentry, FALSE, FALSE, 0); gtk_entry_set_text (GTK_ENTRY(jbentry), "\\"); gtk_widget_show (jbentry); /* Then the rest of the stuff... */ gtk_box_pack_start(GTK_BOX(right_vbox), scrolled_window, TRUE, TRUE, 0); gtk_paned_pack2 (GTK_PANED(panel), right_vbox, TRUE, TRUE); gtk_widget_show (right_vbox); gtk_paned_set_position (GTK_PANED(panel), 320); /* Show the entire data file panel */ gtk_widget_show(panel); return panel; } gnomad2-2.9.6/src/riffile.h0000664000076400007640000000137011512614631012373 00000000000000/* riffile.h WAV & AVI interface, headers Copyright (C) 2004-2008 Linus Walleij Copyright (C) 2008 Kees van Veen This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef RIFFHEADER_INCLUDED #define RIFFHEADER_INCLUDED 1 void get_tag_for_wavfile (metadata_t *meta); void get_tag_for_avifile (metadata_t *meta); #endif gnomad2-2.9.6/src/playlists.c0000664000076400007640000007520211573772457013021 00000000000000/* playlists.c Playlist GUI and call handling Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "jukebox.h" #include "xfer.h" #include "player.h" #include "util.h" #include "prefs.h" #include "filesystem.h" /* Local variables */ static GtkWidget *new_pl_dialog; static GtkWidget *new_pl_entry; static GtkWidget *edit_pl_dialog; static GtkWidget *edit_pl_entry; static GtkWidget *export_pl_dialog; static GtkWidget *export_pl_entry; static GtkWidget *export_pl_format_entry; static GtkWidget *select_playlist_dialog; static GtkWidget *m3ulist; static GtkWidget *plslist; /*************************************************************************************** * UTILITY FUNCTIONS ***************************************************************************************/ /* Text you get from here must be freed afterwards */ static gchar *get_text_from_selection_column(gint column) { GtkTreeSelection *selection; GtkTreeIter iter; gchar *text = NULL; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(playlist_widgets.pltreeview)); if (gtk_tree_selection_get_selected (selection, (GtkTreeModel **) &playlist_widgets.pltreestore, &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(playlist_widgets.pltreestore), &iter, column, &text, -1); } return text; } static guint32 get_playlistid_from_selection(void) { gchar *text = NULL; guint32 plid = 0; text = get_text_from_selection_column(PLIST_PLID_COLUMN); if (text != NULL) { plid = string_to_guint32(text); g_free(text); } return plid; } static guint32 get_trackid_from_selection(void) { gchar *text = NULL; guint32 trackid = 0; text = get_text_from_selection_column(PLIST_SONGID_COLUMN); if (text != NULL) { trackid = string_to_guint32(text); g_free(text); } return trackid; } static void remove_selected_row(void) { GtkTreeSelection *selection; GtkTreeIter iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(playlist_widgets.pltreeview)); if (gtk_tree_selection_get_selected (selection, (GtkTreeModel **) &playlist_widgets.pltreestore, &iter)) { gtk_tree_store_remove(playlist_widgets.pltreestore, &iter); } } static gboolean foreach_renumber(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer data) { gchar *text; gchar **swap = (gchar **) data; gtk_tree_model_get(model, iter, PLIST_PLID_COLUMN, &text, -1); /* g_print("Found playlist %s\n", text); */ if (!strcmp(text, swap[0])) { /* g_print("Renumbering to %s\n", swap[1]); */ gtk_tree_store_set(GTK_TREE_STORE(model), iter, PLIST_PLID_COLUMN, swap[1], -1); } g_free(text); return FALSE; } /* Change playlist ID on all occurences in the list store */ static void update_playlistid_in_store(guint32 old_plid, guint32 new_plid) { gchar *swap[2]; swap[0] = g_strdup_printf("%" PRIguint32, old_plid); swap[1] = g_strdup_printf("%" PRIguint32, new_plid); /* g_print("Trying to renumber playlist %s to %s...\n", swap[0], swap[1]); */ gtk_tree_model_foreach(GTK_TREE_MODEL(playlist_widgets.pltreestore), (GtkTreeModelForeachFunc) foreach_renumber, (gpointer) swap); g_free(swap[0]); g_free(swap[1]); } /*************************************************************************************** * CALLBACK FUNCTIONS FOR GUI ***************************************************************************************/ /* Deletes the dialog windows, passed as data */ GCallback dispose_of_dialog_window(GtkButton * button, gpointer data) { GtkWidget * tmpwid=GTK_WIDGET(data); gtk_widget_destroy(tmpwid); return NULL; } static GCallback create_new_playlist_ok_button (GtkButton *button, gpointer data) { gchar *plname; guint32 plid; plname = g_strdup(gtk_entry_get_text(GTK_ENTRY(new_pl_entry))); gtk_widget_destroy(new_pl_dialog); plid = jukebox_create_playlist(plname, playlist_widgets.pltreestore); g_free(plname); return NULL; } /* Response to the New playlist popup menu function */ static GCallback playlist_new_response(gpointer data) { GtkWidget *label, *button; new_pl_dialog=gtk_dialog_new_with_buttons(_("Create a new playlist"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(new_pl_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(new_pl_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(new_pl_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(create_new_playlist_ok_button), NULL); gtk_window_set_position (GTK_WINDOW(new_pl_dialog), GTK_WIN_POS_MOUSE); label = gtk_label_new(_("Choose a name for the new playlist:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_pl_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); new_pl_entry = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(new_pl_dialog)->vbox), new_pl_entry, TRUE, TRUE, 0); gtk_widget_show(new_pl_entry); g_signal_connect(G_OBJECT (new_pl_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), G_OBJECT (new_pl_dialog)); gtk_widget_show_all(new_pl_dialog); return NULL; } /* Response to the Play playlist popup menu function */ static GCallback playlist_play_response(gpointer data) { guint32 plid; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } /* Get the ID of the playlist */ plid = get_playlistid_from_selection(); if (plid > 0) play_playlist(plid); return NULL; } static GCallback edit_playlist_ok_button (GtkButton *button, gpointer data) { guint plid; gchar *plname; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } plid = get_playlistid_from_selection(); plname = g_strdup(gtk_entry_get_text(GTK_ENTRY(edit_pl_entry))); jukebox_rename_playlist(plid, plname, playlist_widgets.pltreestore); gtk_widget_destroy(edit_pl_dialog); g_free(plname); return NULL; } /* Response to the Edit playlist popup menu function */ static GCallback playlist_edit_response(gpointer data) { GtkWidget *label, *button; gchar *text; edit_pl_dialog=gtk_dialog_new_with_buttons(_("Edit playlist"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(edit_pl_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(edit_pl_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(edit_pl_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(edit_playlist_ok_button), NULL); gtk_window_set_position (GTK_WINDOW(edit_pl_dialog), GTK_WIN_POS_MOUSE); label = gtk_label_new(_("Edit the name for this playlist:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(edit_pl_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); edit_pl_entry = gtk_entry_new(); // Get the old name of the playlist text = get_text_from_selection_column(PLIST_PLAYLISTNAME_COLUMN); if (text != NULL) { gtk_entry_set_text(GTK_ENTRY(edit_pl_entry), text); g_free(text); } gtk_box_pack_start(GTK_BOX(GTK_DIALOG(edit_pl_dialog)->vbox), edit_pl_entry, TRUE, TRUE, 0); gtk_widget_show(edit_pl_entry); g_signal_connect_object(GTK_OBJECT (edit_pl_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT (edit_pl_dialog), 0); gtk_widget_show_all(edit_pl_dialog); return NULL; } static void toggle_m3ulist (GtkCheckButton *toggle, gpointer data) { gboolean state; gchar *text; guint len; if (m3ulist == NULL) return; text = g_strdup(gtk_entry_get_text(GTK_ENTRY(export_pl_entry))); if (text == NULL) return; len = strlen(text); state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m3ulist)); if (state == TRUE) { // We just selected to use an M3U list // First deselect the PLS option gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(plslist), FALSE); if (text != NULL) { if (!strcmp(text+len-4, ".txt") || !strcmp(text+len-4, ".pls")) { // Replace .txt or .pls for .m3u text[len-3] = 'm'; text[len-2] = '3'; text[len-1] = 'u'; gtk_entry_set_text(GTK_ENTRY(export_pl_entry), text); } } } else { // We just deselected the use of an m3u list if (text != NULL) { if (!strcmp(text+len-4, ".m3u")) { // Replace .m3u for .txt text[len-3] = 't'; text[len-2] = 'x'; text[len-1] = 't'; gtk_entry_set_text(GTK_ENTRY(export_pl_entry), text); } } } g_free(text); } static void toggle_plslist (GtkCheckButton *toggle, gpointer data) { gboolean state; gchar *text; guint len; if (plslist == NULL) return; text = g_strdup(gtk_entry_get_text(GTK_ENTRY(export_pl_entry))); if (text == NULL) return; len = strlen(text); state = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(plslist)); if (state == TRUE) { // We just selected to use an PLS list // First deselect the M3U option gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m3ulist), FALSE); if (text != NULL) { if (!strcmp(text+len-4, ".txt") || !strcmp(text+len-4, ".m3u")) { // Replace .txt or .m3u for .pls text[len-3] = 'p'; text[len-2] = 'l'; text[len-1] = 's'; gtk_entry_set_text(GTK_ENTRY(export_pl_entry), text); } } } else { // We just deselected the use of an m3u list if (text != NULL) { if (!strcmp(text+len-4, ".pls")) { // Replace .pls for .txt text[len-3] = 't'; text[len-2] = 'x'; text[len-1] = 't'; gtk_entry_set_text(GTK_ENTRY(export_pl_entry), text); } } } g_free(text); } static GCallback export_playlist_ok_button (GtkButton *button, gpointer data) { gchar *filename; gchar *formatstring; GList *playlist = (GList *) data; gboolean m3ufile = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m3ulist)); gboolean plsfile = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(plslist)); filename = g_strdup(gtk_entry_get_text(GTK_ENTRY(export_pl_entry))); formatstring = g_strdup(gtk_entry_get_text(GTK_ENTRY(export_pl_format_entry))); gtk_widget_destroy(export_pl_dialog); export_playlistfile(filename, formatstring, playlist, m3ufile, plsfile); destroy_metalist(playlist); g_free(filename); g_free(formatstring); return NULL; } /* Response to the Export playlist popup menu function */ static GCallback playlist_export_response(gpointer data) { guint plid; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } /* Get the ID of the playlist */ plid = get_playlistid_from_selection(); if (plid > 0) { GList *playlist = jukebox_get_playlist_for_play(plid); GtkWidget *label; gchar *text; if (playlist != NULL) { GtkWidget * button; export_pl_dialog=gtk_dialog_new_with_buttons(_("Export playlist"), NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(export_pl_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(export_pl_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(export_pl_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(export_playlist_ok_button), playlist); gtk_window_set_position (GTK_WINDOW(export_pl_dialog), GTK_WIN_POS_MOUSE); label = gtk_label_new(_("Export playlist to this file:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); export_pl_entry = gtk_entry_new(); // Get the old name of the playlist text = get_text_from_selection_column(PLIST_PLAYLISTNAME_COLUMN); if (text != NULL) { text = stringcat(text, ".txt"); gtk_entry_set_text(GTK_ENTRY(export_pl_entry), text); g_free(text); } else { gtk_entry_set_text(GTK_ENTRY(export_pl_entry), _("Unnamed playlist.txt")); } gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), export_pl_entry, TRUE, TRUE, 0); gtk_widget_show(export_pl_entry); label = gtk_label_new(_("Format the playlist according to this string:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); export_pl_format_entry = gtk_entry_new(); text = get_prefs_filenameformat(); gtk_entry_set_text(GTK_ENTRY(export_pl_format_entry), text); g_free(text); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), export_pl_format_entry, TRUE, TRUE, 0); gtk_widget_show(export_pl_format_entry); /* Don't translate the magic %-things! */ label = gtk_label_new(_("%a = Artist, %t = Title, %b = Album, %g = Genre, %n = Track number, %y = Year")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); m3ulist = gtk_check_button_new_with_label(_("Create an M3U playlist (assuming the format filter sets " \ "the correct filenames)")); g_signal_connect_object(GTK_OBJECT(m3ulist), "toggled", G_CALLBACK(toggle_m3ulist), NULL, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), m3ulist, TRUE, TRUE, 0); gtk_widget_show(m3ulist); plslist = gtk_check_button_new_with_label(_("Create an PLS playlist (assuming the format filter sets " \ "the correct filenames)")); g_signal_connect_object(GTK_OBJECT(plslist), "toggled", G_CALLBACK(toggle_plslist), NULL, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(export_pl_dialog)->vbox), plslist, TRUE, TRUE, 0); gtk_widget_show(plslist); g_signal_connect_object(GTK_OBJECT (export_pl_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT (export_pl_dialog), 0); gtk_widget_show_all(export_pl_dialog); } } return NULL; } /* Response to the Delete playlist popup menu function */ static GCallback playlist_delete_response(gpointer data) { guint plid; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } plid = get_playlistid_from_selection(); if (plid) { if (request_confirmation_dialog(_("Really delete selected playlist?"))) { jukebox_delete_playlist(plid); /* g_print("Deleting playlist %lu...\n", plid); */ remove_selected_row(); } } return NULL; } /* Response to the Shuffle playlist popup menu function */ static GCallback playlist_shuffle_response(gpointer data) { guint plid; guint newplaylist; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } plid = get_playlistid_from_selection(); newplaylist = jukebox_randomize_playlist(plid, playlist_widgets.pltreestore); /* g_print("Shuffeling playlist %lu...\n", plid); */ return NULL; } /* Response to the Delete track popup menu function */ static GCallback node_delete_response(gpointer data) { guint32 plid; guint32 track; guint32 newplaylist; if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return NULL; } if (request_confirmation_dialog(_("Really delete selected tracks?"))) { plid = get_playlistid_from_selection(); track = get_trackid_from_selection(); /* g_print("Trying to delete track %lu from playlist %lu\n", track, plid); */ newplaylist = jukebox_delete_track_from_playlist(track, plid, playlist_widgets.pltreestore); remove_selected_row(); /* Change this in all affected places in the liststore */ // This should work now. update_playlistid_in_store(plid, newplaylist); } return NULL; } static GCallback mouseevent (GtkWidget *clist, GdkEventButton *event, gpointer data ) { if (event->type == GDK_BUTTON_PRESS && event->button == 3) { GdkEventButton *bevent = (GdkEventButton *) event; guint trackid = 0; /* Get the trackid of what is under the mouse cursor */ trackid = get_trackid_from_selection(); if (trackid == 0) { gtk_menu_popup (GTK_MENU (playlist_widgets.playlistpopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); } else { gtk_menu_popup (GTK_MENU (playlist_widgets.nodepopupmenu), NULL, NULL, NULL, NULL, bevent->button, bevent->time); } return (gpointer) 1; } return data; } static GtkWidget *create_option_menu(void) { GtkWidget *combo; GList *tmplist = g_list_first(jukebox_playlist); /* Create the option menu */ #if GTK_CHECK_VERSION(2,24,0) // Use the new combo box type in 2.24 and later combo = gtk_combo_box_text_new(); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), "(None)"); #else combo = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "(None)"); #endif /* Add a row to the menu */ while (tmplist) { #if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), tmplist->data); #else gtk_combo_box_append_text(GTK_COMBO_BOX(combo), tmplist->data); #endif tmplist = tmplist->next; tmplist = tmplist->next; } gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); return combo; } /* Pre-declare this function */ static void add_pl_selection(GtkBox *box, guint number); static GCallback toggle_and(gpointer a, gpointer b) { GtkToggleButton *tbutton = GTK_TOGGLE_BUTTON(a); guint next = GPOINTER_TO_UINT(b)+1; /* Force the toggle button to active and grey it out */ gtk_toggle_button_set_active(tbutton, TRUE); gtk_widget_set_sensitive(GTK_WIDGET(tbutton), FALSE); /* If this was not previously selected, it's time to create a new one */ add_pl_selection(GTK_BOX(GTK_DIALOG(select_playlist_dialog)->vbox), next); return NULL; } /* * box = box to add this one to * number = menu number (successive created) first is 0. */ static void add_pl_selection(GtkBox *box, guint number) { GtkWidget *and = NULL; GtkWidget *option_menu, *hbox; hbox = gtk_hbox_new(FALSE, 0); option_menu = create_option_menu(); selected_target_playlists = g_list_append(selected_target_playlists, option_menu); gtk_box_pack_start(GTK_BOX(hbox), option_menu, TRUE, TRUE, 0); gtk_widget_show(option_menu); /* and .. */ and = gtk_check_button_new_with_label(_("and")); g_signal_connect(GTK_OBJECT(and), "clicked", G_CALLBACK(toggle_and), GUINT_TO_POINTER(number)); gtk_box_pack_start(GTK_BOX(hbox), and, TRUE, TRUE, 0); gtk_widget_show(and); gtk_box_pack_start(GTK_BOX(box), hbox, TRUE, TRUE, 0); gtk_widget_show(hbox); } static void playlist_selection_dialog(gchar *title, gchar *prompt, GCallback ok_signal) { GtkWidget *label, *button; /* Make sure this is cleared */ if (selected_target_playlists != NULL) { g_list_free(selected_target_playlists); selected_target_playlists = NULL; } select_playlist_dialog=gtk_dialog_new_with_buttons(title, NULL, 0, NULL); button = gtk_dialog_add_button(GTK_DIALOG(select_playlist_dialog), GTK_STOCK_CANCEL, 0); g_signal_connect(button, "clicked", G_CALLBACK(dispose_of_dialog_window), GTK_OBJECT(select_playlist_dialog)); button = gtk_dialog_add_button(GTK_DIALOG(select_playlist_dialog), GTK_STOCK_OK, 1); g_signal_connect(button, "clicked", G_CALLBACK(ok_signal), NULL); gtk_window_set_position (GTK_WINDOW(select_playlist_dialog), GTK_WIN_POS_MOUSE); g_signal_connect_object(GTK_OBJECT (select_playlist_dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), GTK_OBJECT(select_playlist_dialog), 0); /* Add a label and the option menu */ label = gtk_label_new(prompt); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(select_playlist_dialog)->vbox), label, TRUE, TRUE, 0); /* Initially add one selector */ add_pl_selection(GTK_BOX(GTK_DIALOG(select_playlist_dialog)->vbox), 0); gtk_widget_show(select_playlist_dialog); } /* Find the playlists selected for addition */ static GList *get_selected_playlists(void) { GList *templist; GList *retlist = NULL; templist = g_list_first(selected_target_playlists); while (templist != NULL) { guint selection; selection = gtk_combo_box_get_active(GTK_COMBO_BOX(templist->data)); if (selection != 0) { /* Find out playlist ID of this entry */ GList *tmp = g_list_nth(jukebox_playlist, (selection-1)*2+1); retlist = g_list_append(retlist, tmp->data); } templist = g_list_next(templist); } return retlist; } static void add_to_playlist_ok_button (GtkButton *button, gpointer data) { GList *metalist = get_all_metadata_from_selection(JB_LIST); GList *listlist = get_selected_playlists(); /* Playlists to add these to. */ /* If no songs were selected, abort this */ if (!metalist) { gtk_widget_destroy(select_playlist_dialog); g_list_free(selected_target_playlists); return; } /* If no playlist was selected, abort this. */ if (listlist == NULL) { gtk_widget_destroy(select_playlist_dialog); g_list_free(selected_target_playlists); destroy_metalist(metalist); return; } /* See if the jukebox is locked. */ if (jukebox_locked) { gtk_widget_destroy(select_playlist_dialog); g_list_free(listlist); g_list_free(selected_target_playlists); destroy_metalist(metalist); create_error_dialog(_("Jukebox busy")); return; } /* g_print("Calling add_tracks_to_playlists()\n"); */ add_tracks_to_playlists(listlist, metalist); build_playlist_tree(); /* Free any used memory */ g_list_free(listlist); g_list_free(selected_target_playlists); selected_target_playlists = NULL; gtk_widget_destroy(select_playlist_dialog); destroy_metalist(metalist); } static GCallback transfer_from_hd_ok_button (GtkButton *button, gpointer data) { GList *listlist = get_selected_playlists(); /* Playlists to add these to. */ gtk_widget_destroy(select_playlist_dialog); /* Set it as argument */ transfer_from_hd_to_jukebox(listlist); return NULL; } void transfer_from_hd_dialog (GtkButton *inbutton, gpointer data) { /* If the user does not want to select playlist, s/he shan't have to */ if (get_prefs_ask_playlist() == FALSE){ transfer_from_hd_to_jukebox(NULL); return; } playlist_selection_dialog(_("Transfer to jukebox library"), _("Add tracks to playlist(s):"), G_CALLBACK(transfer_from_hd_ok_button)); } void jbmenu_add_playlist_response(gpointer data) { playlist_selection_dialog(_("Add to playlist"), _("Add tracks to playlist(s):"), G_CALLBACK(add_to_playlist_ok_button)); } static GtkWidget *create_treeview(GtkTreeStore *treestore) { GtkWidget *treeview; GtkCellRenderer *textrenderer; GtkTreeViewColumn *view; GtkTreeSelection *select; treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(treestore)); gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE); textrenderer = gtk_cell_renderer_text_new (); view = gtk_tree_view_column_new_with_attributes (_("Playlist"), textrenderer, "text", PLIST_PLAYLISTNAME_COLUMN, NULL); gtk_tree_view_column_set_sort_column_id (view, PLIST_PLAYLISTNAME_COLUMN); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 200); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, PLIST_PLAYLISTNAME_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); view = gtk_tree_view_column_new_with_attributes (_("Artist"), textrenderer, "text", PLIST_ARTIST_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, PLIST_ARTIST_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); view = gtk_tree_view_column_new_with_attributes (_("Title"), textrenderer, "text", PLIST_TITLE_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 150); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, PLIST_TITLE_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); view = gtk_tree_view_column_new_with_attributes (_("Length"), textrenderer, "text", PLIST_LENGTH_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 40); gtk_tree_view_column_set_reorderable(view, TRUE); gtk_tree_view_column_set_sort_column_id(view, PLIST_LENGTH_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); view = gtk_tree_view_column_new_with_attributes ("PLID", textrenderer, "text", PLIST_PLID_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 100); gtk_tree_view_column_set_reorderable(view, TRUE); /* Hide it */ gtk_tree_view_column_set_visible(view, FALSE); gtk_tree_view_column_set_sort_column_id(view, PLIST_PLID_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); view = gtk_tree_view_column_new_with_attributes ("SONGID", textrenderer, "text", PLIST_SONGID_COLUMN, NULL); gtk_tree_view_column_set_sizing (view, GTK_TREE_VIEW_COLUMN_FIXED); gtk_tree_view_column_set_resizable(view, TRUE); gtk_tree_view_column_set_fixed_width(view, 100); gtk_tree_view_column_set_reorderable(view, TRUE); /* Hide it */ gtk_tree_view_column_set_visible(view, FALSE); gtk_tree_view_column_set_sort_column_id(view, PLIST_SONGID_COLUMN); gtk_tree_view_column_set_clickable(view, FALSE); gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), view); /* Configure selection mode */ select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(select,GTK_SELECTION_SINGLE); return treeview; } void create_playlist_widgets(GtkWidget *box) { GtkWidget *scrolled_window, *pltreeview, *playlistpopupmenu, *blankpopupmenu, *nodepopupmenu, *popupmenu_item; selected_target_playlists = NULL; /* The popup menu for the playlists */ blankpopupmenu = gtk_menu_new(); popupmenu_item = gtk_menu_item_new_with_label(_("New playlist")); gtk_menu_shell_append (GTK_MENU_SHELL(blankpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_new_response), NULL, 0); gtk_widget_show (popupmenu_item); playlistpopupmenu = gtk_menu_new(); popupmenu_item = gtk_menu_item_new_with_label(_("New playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_new_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Shuffle playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_shuffle_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Play playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_play_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Edit playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_edit_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Export playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_export_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Delete playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(playlistpopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(playlist_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); nodepopupmenu = gtk_menu_new (); popupmenu_item = gtk_menu_item_new_with_label(_("New playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(nodepopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT(popupmenu_item), "activate", G_CALLBACK(playlist_new_response), NULL, 0); gtk_widget_show (popupmenu_item); popupmenu_item = gtk_menu_item_new_with_label(_("Delete track from playlist")); gtk_menu_shell_append(GTK_MENU_SHELL(nodepopupmenu), popupmenu_item); g_signal_connect_object(GTK_OBJECT (popupmenu_item), "activate", G_CALLBACK(node_delete_response), NULL, 0); gtk_widget_show (popupmenu_item); playlist_widgets.blankpopupmenu = blankpopupmenu; playlist_widgets.playlistpopupmenu = playlistpopupmenu; playlist_widgets.nodepopupmenu = nodepopupmenu; /* Create a scrolled window for the playlists */ scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); pltreeview = create_treeview(playlist_widgets.pltreestore); g_signal_connect_object((gpointer) pltreeview, "button_press_event", G_CALLBACK(mouseevent), NULL, 0); playlist_widgets.pltreeview = pltreeview; gtk_container_add(GTK_CONTAINER(scrolled_window), pltreeview); gtk_widget_show (pltreeview); gtk_widget_show (scrolled_window); gtk_box_pack_start(GTK_BOX(box), scrolled_window, TRUE, TRUE, 0); } gnomad2-2.9.6/src/common.h0000664000076400007640000001031611573770465012262 00000000000000/* common.h Shared header file for the GNOMAD package Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with Yelah xmltools; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef COMMON_INCLUDED #define COMMON_INCLUDED #include #if HAVE_STRING_H # include #endif #if HAVE_STDLIB_H # include #endif /* Internationalization */ #ifdef ENABLE_NLS #include #define _(String) gettext(String) #ifdef gettext_noop #define N_(String) gettext_noop(String) #else #define N_(String) (String) #endif #else /* NLS is disabled */ #define _(String) (String) #define N_(String) (String) #define textdomain(String) (String) #define gettext(String) (String) #define dgettext(Domain,String) (String) #define dcgettext(Domain,String,Type) (String) #define bindtextdomain(Domain,Directory) (Domain) #define bind_textdomain_codeset(Domain,Codeset) (Codeset) #endif /* ENABLE_NLS */ /* The GTK library */ #include #include #include /* Macros lacking in GTK+ */ #ifdef G_GUINT32_FORMAT #define PRIguint32 G_GUINT32_FORMAT #define PRIguint64 G_GUINT64_FORMAT #else /* Retrieve C99 format macros */ #if HAVE_INTTYPES_H #define __STDC_FORMAT_MACROS #include #define PRIguint32 PRIu32 #define PRIguint64 PRIu64 #else #define PRIguint32 "u" #define PRIguint64 "Lu" #endif #endif #define GUINT32_TO_GPOINTER GUINT_TO_POINTER #define GPOINTER_TO_GUINT32 GPOINTER_TO_UINT /* Directory colors and styles */ #define GNOMAD_DIRECTORY_FILE_ENTRY_COLOR "black" #define GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT NULL #define GNOMAD_DIRECTORY_FILE_ENTRY_STYLE NULL #define GNOMAD_DIRECTORY_FOLDER_ENTRY_COLOR "blue" #define GNOMAD_DIRECTORY_FOLDER_ENTRY_WEIGHT "bold" #define GNOMAD_DIRECTORY_FOLDER_ENTRY_STYLE NULL /* * Example high contrast colors and style. * comment these in and comment out the lines above * to activate a high-visibility style. */ /* #define GNOMAD_DIRECTORY_FILE_ENTRY_COLOR "green" #define GNOMAD_DIRECTORY_FILE_ENTRY_WEIGHT PANGO_WEIGHT_BOLD #define GNOMAD_DIRECTORY_FILE_ENTRY_STYLE NULL #define GNOMAD_DIRECTORY_FOLDER_ENTRY_COLOR "green" #define GNOMAD_DIRECTORY_FOLDER_ENTRY_WEIGHT PANGO_WEIGHT_BOLD #define GNOMAD_DIRECTORY_FOLDER_ENTRY_STYLE PANGO_STYLE_ITALIC */ /* Globally useful structures */ typedef struct { GtkListStore *hdliststore; GtkListStore *jbliststore; GtkWidget *hdlistview; GtkWidget *jblistview; GtkWidget *harddiskpopupmenu; GtkWidget *jukeboxpopupmenu; GtkWidget *combo; GList *history; } transfer_widgets_t; typedef struct { GtkListStore *hdliststore; GtkListStore *jbliststore; GtkWidget *hdlistview; GtkWidget *jblistview; GtkWidget *harddiskpopupmenu; GtkWidget *jukeboxpopupmenu; GtkWidget *combo; GtkWidget *jbentry; GList *history; } data_widgets_t; typedef struct { GtkTreeStore *pltreestore; GtkWidget *pltreeview; GtkWidget *playlistpopupmenu; GtkWidget *nodepopupmenu; GtkWidget *blankpopupmenu; } playlist_widgets_t; /* Globally known widgets */ transfer_widgets_t transfer_widgets; data_widgets_t data_widgets; playlist_widgets_t playlist_widgets; /* Global progress bar - not so good but... */ GtkWidget *progress_bar; /* Global playlist selection for the popup, not good either ... */ GList *jukebox_playlist; GList *selected_target_playlists; /* Global lock variable for the jukebox */ gboolean volatile jukebox_locked; /* Global cancellation variable for jukebox operations */ gboolean volatile cancel_jukebox_operation; /* Global debug level variable (standard = 7) */ gint gnomad_debug; /* A proc for hiding dialog windows */ GCallback dispose_of_dialog_window(GtkButton * button, gpointer data); /* THIS PROBABLY BELONGS IN A DIFFERENT HEADER. * THIS IS THE ONLY EXTERNAL FUNCTION DEFINED IN gnomad2.c (other than main). */ extern void scan_jukebox(gpointer data); #endif gnomad2-2.9.6/src/util.h0000664000076400007640000000233011512614631011725 00000000000000/* util.h General utility functions, eg for string formatting header definitions. Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef UTILH_INCLUDED #define UTILH_INCLUDED 1 /* Exported functions */ gint vectorlength(gchar **vector); gchar *stringcat(gchar *org, gchar *add); void replacechar(gchar *string, gchar find, gchar replace); gchar *replacestring(gchar *string, gchar *find, gchar *replace); gchar *seconds_to_mmss(guint32 seconds); guint32 mmss_to_seconds(gchar *mmss); guint32 string_to_guint32(gchar *string); gboolean is_a_number(gchar *string); void add_empty_hbox (GtkWidget *tobox); void create_error_dialog(gchar *errorstring); gboolean request_confirmation_dialog(gchar *confirmstring); void hexdump(unsigned char *data, guint len); #endif gnomad2-2.9.6/src/editmeta.h0000664000076400007640000000134211512614631012546 00000000000000/* editmeta.h Edit metadata for an mp3- or similar file, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EDITMETAH_INCLUDED #define EDITMETAH_INCLUDED 1 void hdmenu_edit_response(gpointer data); void jbmenu_edit_response(gpointer data); #endif gnomad2-2.9.6/src/util.c0000664000076400007640000001372211573772552011745 00000000000000/* util.c General utility functions, eg for string formatting Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" extern GtkWidget *main_window; /* Find the length of a string vector */ gint vectorlength(gchar **vector) { gchar **tmp = vector; gint size = 0; if (!tmp) return 0; while (*tmp) { size ++; tmp ++; } return size; } /* Concatenate two dynamic strings */ gchar *stringcat(gchar *org, gchar *add) { /* This can be improved under GTK+ 2.0 * new GLib functions -> 2.0 */ gchar *tmpstring; if (add == NULL) return org; if (org == NULL) return g_strdup(add); tmpstring = (gchar *) g_malloc(strlen(org) + strlen(add) + 1); tmpstring = strcpy(tmpstring, org); tmpstring = strcat(tmpstring, add); g_free(org); return tmpstring; } void replacechar(gchar *string, gchar find, gchar replace) { /* Replaces character find with character replace * in string */ gchar *tmp = string; if (!string || !find || !replace) return; while (*tmp) { if (*tmp == find) *tmp = replace; tmp ++; } } gchar *replacestring(gchar *string, gchar *find, gchar *replace) { /* Replaces the substring find with substring replace * in string */ static gchar stringbuffer[512]; gchar *returnstring; gchar **tmp2; gchar **tmp3; if (!string || !find || !replace) return string; tmp2 = g_strsplit(string, find, 0); /* This is the case when the replacement is in the * last characters of the string */ if (vectorlength(tmp2) == 1 && strlen(string) > strlen(*tmp2)) { stringbuffer[0] = '\0'; strcat(stringbuffer, *tmp2); strcat(stringbuffer, replace); g_free(string); returnstring = g_strdup(stringbuffer); } /* If there were no matches, return original string */ else if (vectorlength(tmp2) > 1) { stringbuffer[0] = '\0'; tmp3 = tmp2; while (*tmp3) { strcat(stringbuffer, *tmp3); /* If there are more strings in the list, insert the replacement */ if (*(tmp3+1)) strcat(stringbuffer, replace); tmp3 ++; } /* Free old string */ g_free(string); returnstring = g_strdup(stringbuffer); } else { returnstring = string; } g_strfreev(tmp2); return returnstring; } /* Converts a string into guint representation (if possible) */ guint32 string_to_guint32(gchar *string) { gchar *dummy; if (!string) return 0; return (guint32) strtoul(string, &dummy, 10); } /* Converts a figure representing a number of seconds to * a string in mm:ss notation */ gchar *seconds_to_mmss(guint32 seconds) { gchar tmp2[10]; gchar tmp[10]; guint32 secfrac = seconds % 60; guint32 minfrac = seconds / 60; if (seconds == 0) return g_strdup("0:00"); snprintf(tmp2, 10, "0%" PRIguint32, secfrac); while (strlen(tmp2)>2) { tmp2[0]=tmp2[1]; tmp2[1]=tmp2[2]; tmp2[2]='\0'; } snprintf(tmp, 10, "%" PRIguint32 ":%s", minfrac, tmp2); return g_strdup(tmp); } /* Converts a string in mm:ss notation to a figure * representing seconds */ guint32 mmss_to_seconds(gchar *mmss) { gchar **tmp; guint32 seconds = 0; if (!mmss) return seconds; tmp = g_strsplit(mmss, ":", 0); if (vectorlength(tmp) == 2) { seconds = 60 * string_to_guint32(tmp[0]); seconds += string_to_guint32(tmp[1]); } if (tmp != NULL) g_strfreev(tmp); return seconds; } /* are there only numbers in this string? */ gboolean is_a_number(gchar *string) { gchar *tmp; if (string == NULL) return FALSE; tmp = string; while (*tmp) { /* See if it is not a number, skip spaces */ if ((*tmp < '0' || *tmp > '9') && *tmp != ' ' && *tmp != '.') return FALSE; tmp ++; } return TRUE; } /* Good for mocking up correctly adjusted dialogs */ void add_empty_hbox (GtkWidget *tobox) { GtkWidget *thing = gtk_hbox_new (FALSE, 0); gtk_widget_show (thing); gtk_box_pack_start (GTK_BOX (tobox), thing, TRUE, FALSE, 0); } /* Create an error dialog */ void create_error_dialog(gchar *errorstring) { GtkWidget *dialog; dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, errorstring); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL, 0); g_signal_connect_object(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL, 0); gtk_widget_show(dialog); } gboolean request_confirmation_dialog(gchar *confirmstring) { GtkWidget *dialog; gint i; gboolean retval = FALSE; dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, confirmstring); i = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (i == GTK_RESPONSE_YES) { retval = TRUE; } return retval; } void hexdump(unsigned char *data, guint len) { guint i,j,k; for (i=0; i= 0x20 && ch <= 0x7e ) ? ch : '.'); } g_print("\n"); } g_print("%02x ", (guchar) data[i]); } k = i % 16; if (k != 0) { for (j = 0; j < k+2; j++) { g_print(" "); } } else { k = 16; } g_print(" "); for (j = i-k; j < i; j++) { gchar ch = data[j]; g_print("%c", ( ch >= 0x20 && ch <= 0x7e ) ? ch : '.'); } g_print("\n\n"); } gnomad2-2.9.6/src/jukebox.c0000664000076400007640000031277311601426075012433 00000000000000/** * \file jukebox.c * Functions related to the communication with jukebox hardware * using the libnjb library. * Copyright (C) 2001-2011 Linus Walleij * * This file is part of the GNOMAD package. * * GNOMAD is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * You should have received a copy of the GNU General Public License * along with GNOMAD; see the file COPYING. If not, write to * the Free Software Foundation, 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #include #include "common.h" #include "jukebox.h" #include "xfer.h" #include "prefs.h" #include "filesystem.h" #include "filenaming.h" #include "util.h" #include "id3read.h" #include #include extern GtkWidget *main_window; /* Local variables */ static gboolean use_mtp = FALSE; static njb_t pde_devices[NJB_MAX_DEVICES]; static njb_t *pdedevice = NULL; static int PDE_device_count = 0; static int MTP_device_count = 0; static gboolean device_connected = FALSE; #ifdef HAVE_LIBMTP static LIBMTP_mtpdevice_t *mtpdevice; static LIBMTP_folder_t * mtp_folders=NULL; static uint32_t mtp_current_filter_id=0; static uint32_t mtp_last_folder_id=0; static gchar * mtp_last_fullpath=NULL; #endif /* Jukebox properties variables */ static gchar *jukebox_ownerstring = NULL; static gchar *jukebox_timestring = NULL; static gchar *jukebox_firmware = NULL; static gchar *jukebox_hardware = NULL; static u_int64_t jukebox_totalbytes = 0; static u_int64_t jukebox_freebytes = 0; static u_int64_t jukebox_usedbytes = 0; static guint32 jukebox_songs = 0; static guint32 jukebox_playlists = 0; static guint32 jukebox_datafiles = 0; /* Variables used for playing tracks */ static GList *playlist; static GList *playlistitr; static GList *playlistlast; static GtkWidget *songnamelabel; static gboolean created_play_mutex = FALSE; static GMutex *play_thread_mutex = NULL; static gboolean passed_first_zero = FALSE; /* After initial scan, this hash table always contains * all the songs arranged by song ID */ static GHashTable *songhash = NULL; /* This is used temporarily for storing a list of * playlist entries (gnomadplaylist_entry_t), which * in turn stores the playlists as GSLists with track * IDs. * * playlistlist -> list-> list -> list -> ... -> NULL * | | | * entry entry entry * | * +-> name * +-> plid * +-> tracklist * | * +-> track -> track -> ... -> NULL */ static GSList *playlistlist = NULL; /* * This is a file list with folder information, filtered * to present a folder view */ static GSList *datafilelist = NULL; #ifdef HAVE_LIBMTP /* * MTP FILETYPE <-> INTERNAL CODEC STRING relation */ typedef struct { LIBMTP_filetype_t filetype; const gchar *codec; } mtp_filetype_description_t; static const mtp_filetype_description_t mtp_filetype_descriptions[] = { { LIBMTP_FILETYPE_WAV, "WAV" }, { LIBMTP_FILETYPE_MP3, "MP3" }, { LIBMTP_FILETYPE_WMA, "WMA" }, { LIBMTP_FILETYPE_OGG, "OGG" }, { LIBMTP_FILETYPE_MP4, "MP4" }, { LIBMTP_FILETYPE_WMV, "WMV" }, { LIBMTP_FILETYPE_AVI, "AVI" }, { LIBMTP_FILETYPE_MPEG, "MPG" }, { LIBMTP_FILETYPE_MPEG, "MPEG" }, { LIBMTP_FILETYPE_ASF, "ASF" }, { LIBMTP_FILETYPE_QT, "MOV" }, { LIBMTP_FILETYPE_JPEG, "JPG" }, { LIBMTP_FILETYPE_JPEG, "JPEG" }, { LIBMTP_FILETYPE_JFIF, "JFIF" }, { LIBMTP_FILETYPE_TIFF, "TIF" }, { LIBMTP_FILETYPE_TIFF, "TIFF" }, { LIBMTP_FILETYPE_BMP, "BMP" }, { LIBMTP_FILETYPE_GIF, "GIF" }, { LIBMTP_FILETYPE_PICT, "PIC" }, { LIBMTP_FILETYPE_PICT, "PICT" }, { LIBMTP_FILETYPE_PNG, "PNG" }, { LIBMTP_FILETYPE_WINDOWSIMAGEFORMAT, "WMF" }, { LIBMTP_FILETYPE_VCALENDAR2, "ICS" }, { LIBMTP_FILETYPE_VCARD3, "VCF" }, { LIBMTP_FILETYPE_WINEXEC, "EXE" }, { LIBMTP_FILETYPE_WINEXEC, "COM" }, { LIBMTP_FILETYPE_WINEXEC, "BAT" }, { LIBMTP_FILETYPE_WINEXEC, "DLL" }, { LIBMTP_FILETYPE_WINEXEC, "SYS" }, { LIBMTP_FILETYPE_TEXT, "TXT" }, { LIBMTP_FILETYPE_HTML, "HTML" }, { LIBMTP_FILETYPE_AAC, "AAC" }, { LIBMTP_FILETYPE_FLAC, "FLAC" }, { LIBMTP_FILETYPE_MP2, "MP2" }, { LIBMTP_FILETYPE_M4A, "M4A" }, { LIBMTP_FILETYPE_DOC, "DOC" }, { LIBMTP_FILETYPE_XML, "XML" }, { LIBMTP_FILETYPE_XLS, "XLS" }, { LIBMTP_FILETYPE_PPT, "PPT" }, { LIBMTP_FILETYPE_MHT, "MHT" }, { LIBMTP_FILETYPE_JP2, "JP2" }, { LIBMTP_FILETYPE_JPX, "JPX" }, { LIBMTP_FILETYPE_UNKNOWN, "N/A" } }; #endif /* Forward declarations where necessary */ static void build_tree_widget(void); static void destroy_datafile_list(void); static void destroy_tree_structure(void); /* Local static functions */ #ifdef HAVE_LIBMTP static const mtp_filetype_description_t* get_mtp_filetype_description(LIBMTP_filetype_t type) { const mtp_filetype_description_t *current; current = &mtp_filetype_descriptions[0]; while (current->filetype != LIBMTP_FILETYPE_UNKNOWN) { if (current->filetype == type) return current; ++current; } return current; /* I.E. type == LIBMTP_FILETYPE_UNKNOWN */ } static const mtp_filetype_description_t* get_mtp_filetype_description_by_codec(const gchar *name) { const mtp_filetype_description_t *current; g_assert(name != NULL); current = &mtp_filetype_descriptions[0]; while (current->filetype != LIBMTP_FILETYPE_UNKNOWN) { if (strcmp(current->codec, name) == 0) return current; ++current; } return current; /* I.E. type == LIBMTP_FILETYPE_UNKNOWN */ } #endif /* Return disk usage */ static void jukebox_getusage(guint64 *total, guint64 *free, guint64 *used, guint32 *songs, guint32 *playlists, guint32 *datafiles) { *total = jukebox_totalbytes; *free = jukebox_freebytes; *used = jukebox_usedbytes; *songs = jukebox_songs; *playlists = jukebox_playlists; *datafiles = jukebox_datafiles; } /* * Public and private functions */ static void display_njberror(njb_t *njb, gchar *template) { gboolean found_njb_error = FALSE; const gchar *sp; GString *error_string = g_string_new(template); if (njb != NULL) { NJB_Error_Reset_Geterror(njb); while ((sp = NJB_Error_Geterror(njb)) != NULL) { found_njb_error = TRUE; g_string_append_printf(error_string, "%s\n", sp); } } else { found_njb_error = TRUE; g_string_append_printf(error_string, _("Could not open the device on the USB bus")); } if (!found_njb_error) g_string_append_printf(error_string, _("(unknown cause)")); create_error_dialog(error_string->str); g_string_free(error_string, TRUE); } static void refresh_id(void) { if (!use_mtp && pdedevice != NULL) { NJB_Ping(pdedevice); } } /* Returns the unique jukebox ID */ static gchar *jukebox_get_idstring(void) { if (use_mtp) { #ifdef HAVE_LIBMTP return LIBMTP_Get_Serialnumber(mtpdevice); #else return NULL; #endif } else { if (pdedevice != NULL) { u_int8_t sdmiid[16]; if (NJB_Get_SDMI_ID(pdedevice, (u_int8_t *) &sdmiid) == 0) { return g_strdup_printf("%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", sdmiid[0], sdmiid[1], sdmiid[2], sdmiid[3], sdmiid[4], sdmiid[5], sdmiid[6], sdmiid[7], sdmiid[8], sdmiid[9], sdmiid[10], sdmiid[11], sdmiid[12], sdmiid[13], sdmiid[14], sdmiid[15]); } else { return NULL; } } else { return NULL; } } } /* Returns a string representing the firmware revision */ static gchar *jukebox_get_firmware(void) { if (use_mtp) { #ifdef HAVE_LIBMTP return LIBMTP_Get_Deviceversion(mtpdevice); #else return NULL; #endif } else { if (pdedevice != NULL) { if (jukebox_firmware == NULL) { u_int8_t major, minor, release; if (NJB_Get_Firmware_Revision(pdedevice, &major, &minor, &release) == -1) { return NULL; } if (pdedevice->device_type == NJB_DEVICE_NJB1) { jukebox_firmware = g_strdup_printf("%u.%u", major, minor); } else { jukebox_firmware = g_strdup_printf("%u.%u.%u", major, minor, release); } } return jukebox_firmware; } else { return NULL; } } } /* Returns a string representing the hardware revision */ static gchar *jukebox_get_hardware(void) { if (use_mtp) { #ifdef HAVE_LIBMTP return LIBMTP_Get_Deviceversion(mtpdevice); #else return NULL; #endif } else { if (pdedevice != NULL) { if (jukebox_hardware == NULL) { u_int8_t major, minor, release; if (NJB_Get_Hardware_Revision(pdedevice, &major, &minor, &release) == -1) { return NULL; } jukebox_hardware = g_strdup_printf("%u.%u.%u", major, minor, release); } return jukebox_hardware; } else { return NULL; } } } /* Returns the product name */ static gchar *jukebox_get_prodname(void) { if (use_mtp) { #ifdef HAVE_LIBMTP return LIBMTP_Get_Modelname(mtpdevice); #else return NULL; #endif } else { if (pdedevice != NULL) { return (gchar *) NJB_Get_Device_Name(pdedevice, 1); } else { return NULL; } } } /* Returns data about if the power cord is connected */ static gboolean jukebox_get_power(void) { if (use_mtp) { // Not supported yet. return FALSE; } else { if (pdedevice != NULL) { int powerstat = NJB_Get_Auxpower(pdedevice); if (powerstat == 1) { return TRUE; } else { return FALSE; } } else { return FALSE; } } } /* Returns data about if the power cord is connected */ static gboolean jukebox_get_charging(void) { if (use_mtp) { // Not supported yet. return TRUE; } else { if (pdedevice != NULL) { int chargestat = NJB_Get_Battery_Charging(pdedevice); if (chargestat == 1) { return TRUE; } else { return FALSE; } } else { return FALSE; } } } /* Returns the battery level in percent */ static guint jukebox_get_battery_level(void) { if (use_mtp) { #ifdef HAVE_LIBMTP uint8_t max, current; gint ret; ret = LIBMTP_Get_Batterylevel(mtpdevice, &max, ¤t); if (ret == 0) { // Adjust to a scale between 0 and 100, linear interpolation gfloat percentage = ((gfloat) current) / ((gfloat) max); return (guint) (percentage * (gfloat) 100); } else { return 0; } #else return 0; #endif } else { if (pdedevice != NULL) { return NJB_Get_Battery_Level(pdedevice); } else { return 0; } } } static void add_to_dialog(GtkWidget *dialog, GtkWidget *thing) { gtk_box_pack_start (GTK_BOX(GTK_DIALOG(dialog)->vbox), thing, TRUE, TRUE, 0); } /* This creates a device information dialog and returns it. */ GtkWidget *jukebox_get_deviceinfo_dialog(void) { GtkWidget *label, *dialog, *hbox; gchar tmp[50]; guint64 total, free, used; guint32 songs, playlists, datafiles; if (use_mtp) { #ifdef HAVE_LIBMTP if (mtpdevice == NULL) { return NULL; } #else return NULL; #endif } else { if (pdedevice == NULL) { return NULL; } } // Make sure our information is up-to-date refresh_id(); dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, _("Jukebox information")); // dialog = gtk_dialog_new(); gtk_window_set_title (GTK_WINDOW (dialog), (_("Jukebox information"))); gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(gtk_widget_destroy), NULL, 0); g_signal_connect_object(GTK_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL, 0); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Unique device ID:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new(jukebox_get_idstring()); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Firmware revision:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new(jukebox_get_firmware()); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); if (!use_mtp && (pdedevice->device_type != NJB_DEVICE_NJB1)) { hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Hardware revision:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new(jukebox_get_hardware()); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); } hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Product name:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new(jukebox_get_prodname()); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Auxilary power (AC or USB) connected:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new((jukebox_get_power()) ? _("Yes") : _("No")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Battery is charging:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new((jukebox_get_charging()) ? _("Yes") : _("No")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); // The pdedevice struct will not be dereferenced unless // PDE is used. if (use_mtp || (pdedevice != NULL && pdedevice->device_type != NJB_DEVICE_NJB1)) { hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Battery level:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%d%%", jukebox_get_battery_level()); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); } hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Jukebox owner:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%s", jukebox_get_ownerstring()); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Time on jukebox:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); label = gtk_label_new(jukebox_get_time()); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); jukebox_getusage(&total, &free, &used, &songs, &playlists, &datafiles); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Total bytes on disk:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint64 " (%" PRIguint64 " MB)", total, (guint64) total/G_GINT64_CONSTANT(1048576)); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Total free bytes available:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint64 " (%" PRIguint64 " MB)", free, (guint64) free/G_GINT64_CONSTANT(1048576)); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Total bytes used:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint64 " (%" PRIguint64 " MB)", used, (guint64) used/G_GINT64_CONSTANT(1048576)); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Number of songs:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint32, songs); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Number of playlists:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint32, playlists); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new(FALSE, 0); label = gtk_label_new (_("Number of datafiles:")); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox (hbox); sprintf(tmp, "%" PRIguint32, datafiles); label = gtk_label_new(tmp); gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show(label); add_to_dialog(dialog, hbox); gtk_widget_show (hbox); return dialog; } gchar *jukebox_get_time(void) { njb_time_t *time; if (use_mtp) { // Not implemented return g_strdup("Not implemented"); } else { if (pdedevice != NULL) { time = NJB_Get_Time(pdedevice); if (time != NULL) { if (jukebox_timestring != NULL) { g_free(jukebox_timestring); jukebox_timestring = NULL; } jukebox_timestring = g_strdup_printf("%u-%.2u-%.2u %.2u:%.2u:%.2u", time->year, time->month, time->day, time->hours, time->minutes, time->seconds); free(time); } } else { if (jukebox_timestring != NULL) { g_free(jukebox_timestring); } jukebox_timestring = NULL; } return jukebox_timestring; } } /* Functions for manipulating the song hash */ static void destroy_hash (gpointer key, gpointer value, gpointer user_data) { metadata_t *meta = (metadata_t *) value; destroy_metadata_t(meta); } static void destroy_hashes(void) { /* Destroy the song hash */ if (songhash != NULL) { g_hash_table_foreach(songhash, (GHFunc) destroy_hash, NULL); g_hash_table_destroy(songhash); songhash = NULL; } } static void add_row_from_songhash (gpointer key, gpointer value, gpointer user_data) { metadata_t *meta = (metadata_t *) value; add_metadata_to_model(meta, JB_LIST); //g_print("Added %s\n", meta->title); } static void jblist_from_songhash(void) { /* Little trick I learned from Sven Neumann, recreate the store each time, * because otherwise you cannot remove the sorting attribute from the store, * and that in turn will result in O(n^2) addition times for this store. * So we add rows in O(n) time to a fresh store and then connect it to the * view and sort it afterwards. */ recreate_list_store(JB_LIST); /* This does not need to be threaded! */ if (songhash != NULL) { g_hash_table_foreach(songhash, (GHFunc) add_row_from_songhash, NULL); } /* Then sort everything */ view_and_sort_list_store(JB_LIST); } /* This callback handle all "cancel" buttons during * jukebox operations */ void cancel_jukebox_operation_click ( GtkButton *button, gpointer data ) { cancel_jukebox_operation = TRUE; } /* * Discover devices on the USB bus and return an array of * descriptions that may be used to select the jukebox with * index from 0 upwards. */ gchar **jukebox_discover(void) { int device_count; gchar **retarray; /* * Intercept USB communications - invoke gnomad2 * with gnomad2 -D7 to activate a lot of USB debugging * information */ if (gnomad_debug != 0) { NJB_Set_Debug(gnomad_debug); } /* Select UTF8 because we are running Gnome 2 */ /* Also test with NJB_UC_8859 */ NJB_Set_Unicode(NJB_UC_UTF8); if ( NJB_Discover(pde_devices, 0, &PDE_device_count) == -1 ) { create_error_dialog(_("Could not try to locate jukeboxes\nUSB error?")); return NULL; } #ifdef HAVE_LIBMTP LIBMTP_Init(); mtpdevice = LIBMTP_Get_First_Device(); if (mtpdevice != NULL) { MTP_device_count = 1; } #endif device_count = PDE_device_count + MTP_device_count; if ( device_count == 0 ) { create_error_dialog(_("No jukeboxes found on USB bus")); return NULL; } // Add a nice selection dialog here njb->device_type tells the type, // and owner string is useful too. if ( device_count >= 1) { int i; // Space for jukebox strings. retarray = g_malloc((device_count+1) * sizeof(gchar *)); for (i = 0; i < PDE_device_count; i++) { pdedevice = &pde_devices[i]; // This function may be called prior to opening the jukebox // if parameterized with type 0. retarray[i] = g_strdup(NJB_Get_Device_Name(pdedevice, 0)); } pdedevice = NULL; // Replace with for() statement once libmtp support multiple devices if (MTP_device_count > 0) { i++; #ifdef HAVE_LIBMTP retarray[i] = g_strdup(LIBMTP_Get_Modelname(mtpdevice)); g_print("Queried %s\n", retarray[i]); #else // Should not happen but to be certain ... retarray[i] = NULL; #endif } retarray[device_count] = NULL; return retarray; } return NULL; } // This selects a certain jukebox for use and sets the // global njb variable to point to thus jukebox. gboolean jukebox_select(gint i) { if (i < PDE_device_count) { g_print("This is a PDE device\n"); pdedevice = &pde_devices[i]; if (NJB_Open(pdedevice) == -1) { display_njberror(pdedevice, _("Could not open jukebox:\n")); return FALSE; } /* * Causing problems. Removing for now. 2004-04-12 if ((njbid = NJB_Ping(njb)) == NULL) { create_error_dialog(_("Could not ping jukebox")); NJB_Error_Dump(stderr); NJB_Close(njb); return FALSE; } */ if (NJB_Capture(pdedevice) == -1) { display_njberror(pdedevice, _("Could not capture jukebox:\n")); NJB_Close(pdedevice); return FALSE; } /* Set turbo mode according to preferences */ if (get_prefs_turbo_mode()) { NJB_Set_Turbo_Mode(pdedevice, NJB_TURBO_ON); } else { NJB_Set_Turbo_Mode(pdedevice, NJB_TURBO_OFF); } use_mtp = FALSE; #ifdef HAVE_LIBMTP mtpdevice = NULL; #endif } // Else try to connect to the MTP device else if (MTP_device_count > 0) { // g_print("This is an MTP device\n"); use_mtp = TRUE; // This is implicitly connected to in the first library call. // Set njb to NULL to be certain this is the only device used. pdedevice = NULL; } // Else we have no devices else { g_print("We have no devices!\n"); pdedevice = NULL; use_mtp = FALSE; #ifdef HAVE_LIBMTP mtpdevice = NULL; #endif return FALSE; } device_connected = TRUE; return TRUE; } // Check if a jukebox has been selected. gboolean jukebox_selected(void) { if (use_mtp) { #ifdef HAVE_LIBMTP if (mtpdevice == NULL) { g_print("MTP device NULL.\n"); return FALSE; } #else return FALSE; #endif } else { if (pdedevice == NULL) { g_print("PDE device NULL.\n"); return FALSE; } } if (!device_connected) { g_print("Device was not connected.\n"); return FALSE; } return TRUE; } gboolean jukebox_is_mtp(void) { return use_mtp; } /* Called at end of session to release jukebox */ void jukebox_release(void) { // First clean up all metadata storage internally etc. destroy_hashes(); destroy_datafile_list(); jukebox_songs = 0; jukebox_datafiles = 0; jukebox_playlists = 0; // Redraw song and data window blank. jblist_from_songhash(); recreate_list_store(JBDATA_LIST); view_and_sort_list_store(JBDATA_LIST); // Rebuild this all blank. destroy_tree_structure(); // Should already be blank really. build_tree_widget(); // Then actually release the device connection if (device_connected) { if (use_mtp) { #ifdef HAVE_LIBMTP if (mtpdevice != NULL) { LIBMTP_Release_Device(mtpdevice); } #endif } else { if (pdedevice != NULL) { NJB_Ping(pdedevice); NJB_Release(pdedevice); NJB_Close(pdedevice); } } device_connected = FALSE; } // Just to make sure jukebox_locked = FALSE; } /* Builds the list in memory that the dialog * drop down is then built from */ static void build_playlist_list(void) { // g_print("Called build playlist list...\n"); // Make sure we destroyed the old playlist list if (playlistlist != NULL) g_print("Playlistlist was not NULL!\n"); // Destroy the playlist list used for choosing // during transfer. if (jukebox_playlist != NULL) { GList *tmplist = jukebox_playlist; // g_print("Destroy jukebox_playlist...\n"); while(tmplist) { if (tmplist->data != NULL) g_free(tmplist->data); tmplist = tmplist->next; tmplist = tmplist->next; } g_list_free(jukebox_playlist); jukebox_playlist = NULL; } if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_playlist_t *playlists; // Get playlist listing. playlists = LIBMTP_Get_Playlist_List(mtpdevice); if (playlists != NULL) { LIBMTP_playlist_t *pl, *tmpl; pl = playlists; while (pl != NULL) { gnomadplaylist_entry_t *entry; gchar *tmp; gint i; // List of choices when transfering tracks jukebox_playlists++; jukebox_playlist = g_list_append(jukebox_playlist, g_strdup(pl->name)); jukebox_playlist = g_list_append(jukebox_playlist, GUINT32_TO_GPOINTER((guint32) pl->playlist_id)); // Widget playlist tree entry = (gnomadplaylist_entry_t *) g_malloc(sizeof(gnomadplaylist_entry_t)); entry->name = NULL; entry->plid = 0; entry->tracklist = NULL; entry->name = g_strdup(pl->name); tmp = g_strdup_printf("%" PRIguint32, (guint32) pl->playlist_id); entry->plid = tmp; // Then build the tree structure immediately for (i = 0; i < pl->no_tracks; i++) { entry->tracklist = g_slist_append(entry->tracklist, GUINT32_TO_GPOINTER((guint32) pl->tracks[i])); } playlistlist = g_slist_append(playlistlist, (gpointer) entry); if (cancel_jukebox_operation) break; tmpl = pl; pl = pl->next; LIBMTP_destroy_playlist_t(tmpl); } } #endif } else { njb_playlist_t *playlist; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { gnomadplaylist_entry_t *entry; gchar *tmp; njb_playlist_track_t *track; jukebox_playlists++; jukebox_playlist = g_list_append(jukebox_playlist, g_strdup(playlist->name)); jukebox_playlist = g_list_append(jukebox_playlist, GUINT32_TO_GPOINTER((guint32) playlist->plid)); // Widget playlist tree entry = (gnomadplaylist_entry_t *) g_malloc(sizeof(gnomadplaylist_entry_t)); entry->name = NULL; entry->plid = 0; entry->tracklist = NULL; entry->name = g_strdup(playlist->name); tmp = g_strdup_printf("%" PRIguint32, (guint32) playlist->plid); entry->plid = tmp; // Then build the tree structure immediately NJB_Playlist_Reset_Gettrack(playlist); while ((track = NJB_Playlist_Gettrack(playlist)) != NULL) { entry->tracklist = g_slist_append(entry->tracklist, GUINT32_TO_GPOINTER((guint32) track->trackid)); } playlistlist = g_slist_append(playlistlist, (gpointer) entry); if (cancel_jukebox_operation) break; // Dangerous? NJB_Playlist_Destroy(playlist); } } } static void build_tree_widget(void) { GSList *tmplist; clear_list_store(PL_TREE); tmplist = playlistlist; // Draw the tree... while (tmplist != NULL) { gnomadplaylist_entry_t *entry; GSList *tmplist2; GtkTreeIter treeiter; entry = (gnomadplaylist_entry_t *) tmplist->data; // g_print("Playlist: %s, ID %lu\n", entry->name, entry->plid); gtk_tree_store_append (GTK_TREE_STORE(playlist_widgets.pltreestore), &treeiter, NULL); gtk_tree_store_set(GTK_TREE_STORE(playlist_widgets.pltreestore), &treeiter, PLIST_PLAYLISTNAME_COLUMN, entry->name, PLIST_PLID_COLUMN, entry->plid, PLIST_SONGID_COLUMN, "0", -1); tmplist2 = entry->tracklist; while (tmplist2 != NULL) { metadata_t *meta; GtkTreeIter treeiter2; // g_print("Track: %" PRIguint32 "\n", GPOINTER_TO_GUINT32(tmplist2->data)); meta = (metadata_t *) g_hash_table_lookup(songhash, tmplist2->data); /* * This might have caused lots of trouble to people with bad tracks * in their playlists... Fixed 2004-03-09 Linus Walleij */ if (meta != NULL) { // g_print("Adding song with ID %" PRIguint32 " to playlist %" PRIguint32 "\n", // GPOINTER_TO_GUINT32(tmplist2->data), entry->plid); // dump_metadata_t(meta); gtk_tree_store_append (GTK_TREE_STORE(playlist_widgets.pltreestore), &treeiter2, &treeiter); gtk_tree_store_set(GTK_TREE_STORE(playlist_widgets.pltreestore), &treeiter2, PLIST_ARTIST_COLUMN, meta->artist, PLIST_TITLE_COLUMN, meta->title, PLIST_LENGTH_COLUMN, meta->length, PLIST_PLID_COLUMN, entry->plid, PLIST_SONGID_COLUMN, meta->path, -1); } else { g_print("Bad track detected in playlist, track ID: %" PRIguint32 "\n", GPOINTER_TO_GUINT32(tmplist2->data)); } tmplist2 = tmplist2->next; } tmplist = tmplist->next; } } static void destroy_tree_structure(void) { /* This destroys the playlists in memory again */ GSList *tmplist; tmplist = playlistlist; while (tmplist != NULL) { gnomadplaylist_entry_t *entry; entry = (gnomadplaylist_entry_t *) tmplist->data; g_free(entry->name); g_free(entry->plid); g_slist_free(entry->tracklist); tmplist = tmplist->next; } g_slist_free(playlistlist); playlistlist = NULL; } void build_playlist_tree(void) { jukebox_locked = TRUE; /* First build the structure for dialog boxes */ build_playlist_list(); /* Now we are finished with the jukebox communication and we have * all playlists in memory, so let's enter the GTK thread and * redraw the tree. */ build_tree_widget(); /* Destroy the memory allocated by temporary playlist * tree structure */ destroy_tree_structure(); jukebox_locked = FALSE; } /* * This function is used to push the playlist tree building * down to the main loop. */ static gboolean call_build_playlist_tree(gpointer data) { GtkTreeStore *pltreestore = (GtkTreeStore *) data; // g_print("Called call_build_playlist_tree\n"); build_playlist_tree(); // g_print("returned...\n"); return FALSE; } /* * Simple helper to destroy a dialog from the main loop. */ static gboolean call_widget_destroy(gpointer data) { GtkWidget *dialog = (GtkWidget *) data; gtk_widget_destroy(GTK_WIDGET(dialog)); return FALSE; } /* Update the usage information */ static void flush_usage(void) { u_int64_t totalbytes = 0; u_int64_t freebytes = 0; if (use_mtp) { #ifdef HAVE_LIBMTP gint ret; ret = LIBMTP_Get_Storage(mtpdevice, 0); if (mtpdevice->storage != NULL) { totalbytes = mtpdevice->storage->MaxCapacity; freebytes = mtpdevice->storage->FreeSpaceInBytes; } if (ret != 0) { totalbytes = 0; freebytes = 0; } #endif } else { if (NJB_Get_Disk_Usage (pdedevice, &totalbytes, &freebytes) == -1) { NJB_Error_Dump(pdedevice, stderr); return; } } jukebox_totalbytes = totalbytes; jukebox_freebytes = freebytes; jukebox_usedbytes = jukebox_totalbytes - jukebox_freebytes; } static void destroy_datafile_list(void) { GSList *tmplist = datafilelist; metadata_t *meta; while (tmplist != NULL) { meta = (metadata_t *) tmplist->data; destroy_metadata_t(meta); tmplist = g_slist_next(tmplist); } g_slist_free(datafilelist); datafilelist = NULL; } static void remove_from_datafile_list(gchar *path) { GSList *tmplist1 = datafilelist; GSList *tmplist2 = NULL; metadata_t *meta; while (tmplist1 != NULL) { meta = (metadata_t *) tmplist1->data; if (!strcmp(path, meta->path)) { // Found it... destroy_metadata_t(meta); } else { // Keep it... tmplist2 = g_slist_append(tmplist2, meta); } tmplist1 = g_slist_next(tmplist1); } g_slist_free(datafilelist); datafilelist = tmplist2; } #ifdef HAVE_LIBMTP static void mtp_initialize_folders() { if (mtp_folders != NULL) { LIBMTP_destroy_folder_t(mtp_folders); }; mtp_folders = LIBMTP_Get_Folder_List(mtpdevice); mtp_last_folder_id=0; if (mtp_last_fullpath!=NULL) { g_free(mtp_last_fullpath); mtp_last_fullpath=NULL; }; }; static LIBMTP_folder_t * mtp_find_name_in_sibling(LIBMTP_folder_t * folder,gchar * name) { LIBMTP_folder_t * f=folder; int found=0; while ((f!=NULL)&&(!found)) { if (strcmp(f->name,name)==0) { found=1; } else { f=f->sibling; }; }; return f; }; static gchar * mtp_find_fullpath(uint32_t folder_id) { if (mtp_last_fullpath!=NULL) { if (mtp_last_folder_id==folder_id) { return mtp_last_fullpath; }; }; gchar * ret; if (folder_id == 0) { ret="\\"; } else { LIBMTP_folder_t * folder=LIBMTP_Find_Folder(mtp_folders,folder_id); if (folder==NULL) { ret=""; } else { gchar * tmp=mtp_find_fullpath(folder->parent_id); ret=g_strconcat(tmp,folder->name,"\\",NULL); }; }; mtp_last_folder_id=folder_id; if (mtp_last_fullpath!=NULL) { g_free(mtp_last_fullpath); }; mtp_last_fullpath=g_strdup(ret); return ret; }; static uint32_t mtp_find_folder_id(gchar * filter){ if (strcmp(filter,"\\")==0) { return 0; }; gchar ** tmp = g_strsplit(filter, "\\", 0); LIBMTP_folder_t * f=mtp_folders; LIBMTP_folder_t * fprev=f; int i; int n=vectorlength(tmp)-1; for (i=1; ichild; }; g_strfreev(tmp); return (fprev->folder_id); }; static LIBMTP_folder_t * mtp_find_first_subfolder(uint32_t ID){ if (ID==0) { return mtp_folders; } else { LIBMTP_folder_t * f = LIBMTP_Find_Folder(mtp_folders, ID); return f->child; }; }; static GSList * mtp_add_subfolders(gchar * filter,GSList * filterlist) { mtp_current_filter_id=mtp_find_folder_id(filter); LIBMTP_folder_t * the_subfolder=mtp_find_first_subfolder(mtp_current_filter_id); metadata_t * meta; while (the_subfolder!=NULL) { meta=new_metadata_t(); meta->filename = g_strdup(the_subfolder->name); meta->size = 0; meta->path = g_strdup_printf("%" PRIguint32, (guint32) the_subfolder->folder_id); meta->folder=g_strdup(mtp_find_fullpath(the_subfolder->folder_id)); filterlist = g_slist_append(filterlist, meta); the_subfolder=the_subfolder->sibling; }; return filterlist; }; #endif static GSList *filter_datafile_list(gchar *filter) { GSList *tmplist = datafilelist; GSList *filterlist = NULL; metadata_t *meta; gchar **tmp; int veclen; if (filter == NULL) { return NULL; } /* Create a ".." directory */ meta = new_metadata_t(); meta->filename = g_strdup(".."); meta->size = 0; tmp = g_strsplit(filter, "\\", 0); veclen = vectorlength(tmp); if (veclen > 2) { int i; gchar *newdir = NULL; for (i = 0; i < veclen - 2; i++) { newdir = stringcat(newdir, tmp[i]); newdir = stringcat(newdir, "\\"); } meta->folder = newdir; } else { meta->folder = g_strdup(filter); } g_strfreev(tmp); filterlist = g_slist_append(filterlist, meta); #ifdef HAVE_LIBMTP if (use_mtp) { filterlist = mtp_add_subfolders(filter,filterlist); } #endif /* Then filter the list */ while (tmplist != NULL) { meta = (metadata_t *) tmplist->data; if (meta->folder != NULL) { if (!strcmp(meta->folder, filter) && meta->size != 0) { /* First just add all regular files belonging to this directory */ filterlist = g_slist_append(filterlist, meta); } else if (meta->size == 0) { /* Then add any subdirectories */ gchar **tmp1 = g_strsplit(meta->folder, "\\", 0); gchar **tmp2 = g_strsplit(filter, "\\", 0); int veclen1 = vectorlength(tmp1); int veclen2 = vectorlength(tmp2); int i; /* It must be exactly one more component in the folder than in the filter */ if (veclen1 == veclen2+1) { gboolean match = TRUE; /* We don't match the last component of the filter, it's NULL, see. */ for (i = 0; i < veclen2-1; i++) { if (tmp1[i] != NULL && tmp2[i] != NULL && strcmp(tmp1[i],tmp2[i])) { match = FALSE; } } if (match) { /* If it's matching up to the filter length, add it */ if (!use_mtp) { filterlist = g_slist_append(filterlist, meta); }; } } g_strfreev(tmp1); g_strfreev(tmp2); } } else if (!strcmp(filter, "\\")) { filterlist = g_slist_append(filterlist, meta); } tmplist = g_slist_next(tmplist); } return filterlist; } void rebuild_datafile_list(gchar *filter) { /* * Add everything to the model by filtering out the root * directory files only from the datafile list. */ if (datafilelist != NULL) { GSList *filtered; /* Hack to get the datafile list store built in O(n) instead of O(n^2) */ recreate_list_store(JBDATA_LIST); filtered = filter_datafile_list(filter); if (filtered != NULL) { GSList *tmplist = filtered; metadata_t *meta; while (tmplist != NULL) { meta = (metadata_t *) tmplist->data; add_metadata_to_model(meta, JBDATA_LIST); tmplist = g_slist_next(tmplist); } g_slist_free(tmplist); } view_and_sort_list_store(JBDATA_LIST); } } /* * These structs and functions are only here to be able to * push all drawing operations up to the main GTK (idle) loop. */ typedef struct { GtkWidget *label; gchar *text; } draw_label_args_t; typedef struct { GtkWidget *progress; gfloat fraction; } draw_progress_args_t; static gboolean draw_label(gpointer p) { draw_label_args_t *args = (draw_label_args_t *) p; if (args != NULL) { if (args->label != NULL && args->text != NULL) { gtk_label_set_text(GTK_LABEL(args->label), args->text); } if (args->text != NULL) g_free(args->text); g_free(args); } return FALSE; } static gboolean draw_progress(gpointer p) { draw_progress_args_t *args = (draw_progress_args_t *) p; if (args != NULL) { if (args->progress != NULL) { gtk_progress_bar_update(GTK_PROGRESS_BAR(args->progress), args->fraction); } g_free(args); } return FALSE; } static gboolean call_jblist_from_songhash(gpointer data) { jblist_from_songhash(); return FALSE; } static gboolean call_rebuild_datafile_list(gpointer data) { rebuild_datafile_list("\\"); return FALSE; } /** * Scanning thread - reads in the Jukebox track directory, the datafile directory * and all playlists, along with some general information about the jukebox. * All the GUI related stuff is conditional and will not be used on Windows * since Windows don't like that more than one thread tries to write to the * widgets (i.e. the Win32 widget set is simply not natively thread safe!) */ gpointer scan_thread(gpointer thread_args) { gboolean last_item = FALSE; njb_songid_t *songtag = NULL; /* initialize to shut up GCC */ njb_datafile_t *datatag = NULL; /* initialize to shut up GCC */ #ifdef HAVE_LIBMTP LIBMTP_track_t *mtptracks; LIBMTP_track_t *mtptrack = NULL; /* initialize to shut up GCC */ LIBMTP_file_t *mtpfiles; LIBMTP_file_t *mtpfile = NULL; /* initialize to shut up GCC */ #endif draw_label_args_t *da; scan_thread_arg_t *args = (scan_thread_arg_t *) thread_args; /* Destroy old song hashes */ destroy_hashes(); jukebox_songs = 0; jukebox_datafiles = 0; jukebox_playlists = 0; /* Retrieve general information about the jukebox */ da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; if (get_prefs_extended_metadata()) { da->text = g_strdup(_("Scanning songs:\nYou have selected extended metadata scan,\n so scanning will be very slow.")); } else { da->text = g_strdup(_("Scanning songs...")); } g_idle_add(draw_label, da); /* If it has already been read, free the old string */ if (jukebox_ownerstring != NULL) g_free(jukebox_ownerstring); if (use_mtp) { #ifdef HAVE_LIBMTP jukebox_ownerstring = LIBMTP_Get_Friendlyname(mtpdevice); #else jukebox_ownerstring = NULL; #endif } else { jukebox_ownerstring = g_strdup(NJB_Get_Owner_String (pdedevice)); } flush_usage(); songhash = g_hash_table_new(NULL, NULL); if (!use_mtp) { // Activate extended metadata mode if desired // FIXME: Modify metadata editor to reflect this. if (get_prefs_extended_metadata()) { NJB_Get_Extended_Tags(pdedevice, 1); } else { NJB_Get_Extended_Tags(pdedevice, 0); } } /* Next retrieve the track listing */ if (use_mtp) { #ifdef HAVE_LIBMTP mtptracks = LIBMTP_Get_Tracklisting_With_Callback(mtpdevice,NULL,NULL); mtptrack = mtptracks; if (mtptrack == NULL) { last_item = TRUE; } mtp_initialize_folders(); #else last_item = TRUE; #endif } else { NJB_Reset_Get_Track_Tag(pdedevice); songtag = NJB_Get_Track_Tag(pdedevice); if (songtag == NULL) { last_item = TRUE; } } /* * FIXME/IMPROVEMENT: If jukebox_songs != 0 start displaying progress bar? * series 3 devices can actually report the number of songs. However it * is so fast anyway, so who'd want it? Most time is spent updating the * widget, not communicating with the device. */ while (!last_item) { metadata_t *meta; jukebox_songs++; /* Number of songs scanned during scan. */ da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup_printf(_("%" PRIguint32 " songs scanned"), jukebox_songs); g_idle_add(draw_label, da); // Create a structure to hold the data in the columns meta = new_metadata_t(); if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_track_t *tmp; gchar *tmpyear; const mtp_filetype_description_t *filetype_d; // Retrieve filetype infos. filetype_d = get_mtp_filetype_description(mtptrack->filetype); // Add to metadata holder meta->path = g_strdup_printf("%" PRIguint32, (guint32) mtptrack->item_id); meta->artist = g_strdup(mtptrack->artist); meta->title = g_strdup(mtptrack->title); meta->genre = g_strdup(mtptrack->genre); meta->album = g_strdup(mtptrack->album); meta->length = seconds_to_mmss((guint) (mtptrack->duration/1000)); meta->size = (guint32) mtptrack->filesize; meta->codec = g_strdup(filetype_d->codec); meta->trackno = (guint) mtptrack->tracknumber; // TODO: Complicated. Fix later. tmpyear = g_strdup(mtptrack->date); if (tmpyear != NULL && strlen(tmpyear) > 4) { // Terminate after the year tmpyear[4] = '\0'; // Convert to a figure. meta->year = string_to_guint32(tmpyear); } if (tmpyear != NULL) { g_free(tmpyear); } meta->filename = g_strdup(mtptrack->filename); // These two are not supported yet. meta->folder = NULL; meta->protect = FALSE; tmp = mtptrack; mtptrack = mtptrack->next; LIBMTP_destroy_track_t(tmp); if (mtptrack == NULL) { last_item = TRUE; } #else last_item = TRUE; #endif } else { njb_songid_frame_t *frame; NJB_Songid_Reset_Getframe(songtag); meta->path = g_strdup_printf("%" PRIguint32, (guint32) songtag->trid); /* Loop through the song tags */ while((frame = NJB_Songid_Getframe(songtag)) != NULL){ // FIXME: add progress bar for scanning? if (!strcmp(frame->label, FR_ARTIST)) { meta->artist = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_TITLE)) { meta->title = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_ALBUM)) { meta->album = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_GENRE)) { meta->genre = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_LENGTH)) { meta->length = seconds_to_mmss((guint) frame->data.u_int16_val); } else if (!strcmp(frame->label, FR_SIZE)) { meta->size = frame->data.u_int32_val; } else if (!strcmp(frame->label, FR_CODEC)) { // Uppercaseify it. Work in all GTK+ >= 2.0? meta->codec = g_ascii_strup(frame->data.strval, -1); } else if (!strcmp(frame->label, FR_TRACK)) { meta->trackno = (guint) frame->data.u_int16_val; } else if (!strcmp(frame->label, FR_YEAR)) { meta->year = (guint) frame->data.u_int16_val; } else if (!strcmp(frame->label, FR_FNAME)) { meta->filename = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_FOLDER)) { meta->folder = g_strdup(frame->data.strval); } else if (!strcmp(frame->label, FR_PROTECTED)) { meta->protect = TRUE; } else { g_print("Unknown frame type %s\n", frame->label); } } NJB_Songid_Destroy(songtag); songtag = NJB_Get_Track_Tag(pdedevice); if (songtag == NULL) { last_item = TRUE; } } // Compensate for missing tag information if (!meta->artist) meta->artist = g_strdup(""); if (!meta->title) meta->title = g_strdup(""); if (!meta->album) meta->album = g_strdup(""); if (!meta->genre) meta->genre = g_strdup(""); if (!meta->length) meta->length = g_strdup("0:00"); // Add to song hash if (gnomad_debug != 0) { g_print("Adding song \"%s\" to songhash...\n", meta->title); dump_metadata_t(meta); } g_hash_table_insert(songhash, GUINT32_TO_GPOINTER(string_to_guint32(meta->path)), (gpointer) meta); if (cancel_jukebox_operation) break; } /* Build songlist from hash */ g_idle_add(call_jblist_from_songhash, NULL); da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(_("Scanning datafiles...")); g_idle_add(draw_label, da); /* Next retrieve the datafile listing */ last_item = FALSE; if (use_mtp) { #ifdef HAVE_LIBMTP mtpfiles = LIBMTP_Get_Filelisting_With_Callback(mtpdevice,NULL,NULL); mtp_initialize_folders(); mtpfile = mtpfiles; if (mtpfile == NULL) { last_item = TRUE; } #else last_item = TRUE; #endif } else { NJB_Reset_Get_Datafile_Tag(pdedevice); datatag = NJB_Get_Datafile_Tag(pdedevice); if (datatag == NULL) { last_item = TRUE; } } /* Destroy the old datafile list */ destroy_datafile_list(); while (!last_item) { metadata_t *meta; u_int64_t filesize; jukebox_datafiles++; da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup_printf(_("%" PRIguint32 " data files scanned"), jukebox_datafiles); g_idle_add(draw_label, da); // Create a structure to hold the data in the columns meta = new_metadata_t(); if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_file_t *tmp; // Add to metadata holder meta->path = g_strdup_printf("%" PRIguint32, (guint32) mtpfile->item_id); meta->size = (guint32) mtpfile->filesize; meta->filename = g_strdup(mtpfile->filename); // These two are not supported yet. meta->folder = g_strdup(mtp_find_fullpath(mtpfile->parent_id)); meta->protect = FALSE; tmp = mtpfile; mtpfile = mtpfile->next; LIBMTP_destroy_file_t(tmp); if (mtpfile == NULL) { last_item = TRUE; } #else last_item = TRUE; #endif } else { /* Convert filesize from 64 bit unsigned integer value */ filesize = (u_int64_t) datatag->filesize; /* FIXME: here we loos all the 64-bit quality, because meta->size is 32-bit ... */ meta->size = (guint) filesize; meta->folder = g_strdup(datatag->folder); if (datatag->filesize == 0) { gchar **tmp = g_strsplit(datatag->folder, "\\", 0); gint veclen = vectorlength(tmp); if (veclen > 2) { gchar *basename = tmp[veclen-2]; meta->filename = g_strdup(basename); } else { /* This should not happen */ meta->filename = g_strdup("Erroneous folder"); } g_strfreev(tmp); } else { meta->filename = g_strdup(datatag->filename); } /* File ID */ meta->path = g_strdup_printf("%" PRIguint32, (guint32) datatag->dfid); // destroy_metadata_t(meta); NJB_Datafile_Destroy (datatag); datatag = NJB_Get_Datafile_Tag(pdedevice); if (datatag == NULL) { last_item = TRUE; } } datafilelist = g_slist_append(datafilelist, (gpointer) meta); if (cancel_jukebox_operation) break; } /* Then refill and sort everything */ da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(_("Scanning playlists...")); g_idle_add(draw_label, da); /* * Tell main loop to rebuild datafile list and playlist tree, then * close the dialog. */ g_idle_add(call_rebuild_datafile_list, NULL); g_idle_add(call_build_playlist_tree, (gpointer) args->pltreestore); g_idle_add(call_widget_destroy, (gpointer) args->dialog); jukebox_locked = FALSE; return NULL; } static void set_progress_fraction(guint64 const sent, guint64 const total) { draw_progress_args_t *dp; dp = (draw_progress_args_t *) g_malloc(sizeof(draw_progress_args_t)); dp->progress = progress_bar; dp->fraction = ((gdouble) sent / (gdouble) total); g_idle_add(draw_progress, dp); // g_print("Sent: %llu, total: %llu, fraction: %f\n", sent, total, fraction); } /* * Progression callback for transfer both back and forth to the * jukebox */ static NJB_Xfer_Callback pde_progress; static int pde_progress (u_int64_t sent, u_int64_t total, const char* buf, unsigned len, void *data) { set_progress_fraction(sent, total); /* This cancels any jukebox operation */ if (cancel_jukebox_operation) return -1; return 0; } /** * Same thing but for MTP. */ #ifdef HAVE_LIBMTP //static const LIBMTP_progressfunc_t mtp_progress; static int mtp_progress (uint64_t const sent, uint64_t const total, void const * const data) { set_progress_fraction(sent, total); if (cancel_jukebox_operation) return -1; return 0; } #endif /* * These functions only serves to send different drawing * operations to the main loop. */ static gboolean call_fill_in_dir(gpointer what) { fill_in_dir((listtype_t)GPOINTER_TO_INT(what), get_current_dir()); return FALSE; } typedef struct { listtype_t listtype; metadata_t *meta; } metadata_add_args_t; static gboolean call_add_metadata_to_model(gpointer data) { metadata_add_args_t *args = (metadata_add_args_t *) data; add_metadata_to_model(args->meta, args->listtype); destroy_metadata_t(args->meta); g_free(args); return FALSE; } /***********************************************************************************/ /* Transferring music from jukebox thread */ /***********************************************************************************/ gpointer jb2hd_thread(gpointer thread_args) { jb2hd_thread_arg_t *args = (jb2hd_thread_arg_t *) thread_args; GList *tmplist = args->metalist; while (tmplist && !cancel_jukebox_operation) { metadata_t *jbmeta; metadata_t *meta; u_int32_t id; gchar *filename; gchar *tmpfname; draw_label_args_t *da; draw_progress_args_t *dp; metadata_add_args_t *metaddarg; /* Get title from filelist */ jbmeta = (metadata_t *) tmplist->data; filename = compose_filename(jbmeta); #ifndef G_OS_WIN32 tmpfname = filename_fromutf8(filename); #else // Windows locale version of filename, since libnjb does not // convert filenames into widechar unicode... tmpfname = g_locale_from_utf8(filename,-1,NULL,NULL,NULL); #endif // Check if file exists to avoid overwriting. // Add an underscore just before the extension if file exists. while (g_file_test(tmpfname, G_FILE_TEST_EXISTS)) { tmpfname = add_underscore(tmpfname); } create_dirs(tmpfname); id = string_to_guint32(jbmeta->path); // Draw next file da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(tmpfname); g_idle_add(draw_label, da); dp = (draw_progress_args_t *) g_malloc(sizeof(draw_progress_args_t)); dp->progress = progress_bar; dp->fraction = (gfloat) 0; g_idle_add(draw_progress, dp); /* g_print("Transferring %s...\n", file); */ /* Transfer track */ if (use_mtp) { #ifdef HAVE_LIBMTP int ret; ret = LIBMTP_Get_Track_To_File(mtpdevice, id, tmpfname, mtp_progress, NULL); if (ret != 0) { g_free(filename); g_free(tmpfname); g_print("Error getting file \"%s\" from MTP device!\n", tmpfname); LIBMTP_Dump_Errorstack(mtpdevice); LIBMTP_Clear_Errorstack(mtpdevice); goto clean_up_and_return; } #endif } else { if ( NJB_Get_Track(pdedevice, id, jbmeta->size, tmpfname, pde_progress, NULL) == -1 ) { NJB_Error_Dump(pdedevice, stderr); g_free(filename); g_free(tmpfname); goto clean_up_and_return; } } /* Copy all metadata, but replace jukebox ID with path */ meta = clone_metadata_t(jbmeta); g_free(meta->path); meta->path = g_strdup(tmpfname); g_free(filename); /* Tag file unless already present */ if (get_prefs_usetag()) { if (meta->codec != NULL) { if (!strcmp(meta->codec, "MP3")) { #if defined(HAVE_TAGLIB) && defined(TAGLIB_ONLY) set_tag_for_file (meta, get_prefs_tagoverride()); #else set_tag_for_mp3file (meta, get_prefs_tagoverride()); #endif } #ifdef HAVE_TAGLIB else if (!strcmp(meta->codec, "OGG") || !strcmp(meta->codec, "FLAC")) { set_tag_for_file (meta, get_prefs_tagoverride()); } #endif } } /* Add to disk listbox and re-sort */ g_free(tmpfname); /* Send to main loop for drawing */ metaddarg = (metadata_add_args_t *) g_malloc(sizeof(metadata_add_args_t)); metaddarg->listtype = HD_LIST; metaddarg->meta = meta; g_idle_add(call_add_metadata_to_model,metaddarg); tmplist = tmplist->next; } clean_up_and_return: jukebox_locked = FALSE; g_idle_add((GSourceFunc) gtk_widget_destroy, args->dialog); g_idle_add(call_fill_in_dir, GINT_TO_POINTER((gint)HD_LIST)); /* Free the memory used by the list */ destroy_metalist(args->metalist); g_free(args); return NULL; } /***********************************************************************************/ /* Transferring data files from jukebox thread */ /***********************************************************************************/ gpointer jb2hd_data_thread(gpointer thread_args) { jb2hd_data_thread_arg_t *args = (jb2hd_data_thread_arg_t *) thread_args; GList *metalist = args->metalist; while (metalist && !cancel_jukebox_operation) { metadata_t *jbmeta; u_int32_t id; gchar *tmpfname; draw_label_args_t *da; draw_progress_args_t *dp; metadata_add_args_t *metaddarg; jbmeta = (metadata_t *) metalist->data; id = string_to_guint32(jbmeta->path); // Draw next file da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(jbmeta->filename); g_idle_add(draw_label, da); dp = (draw_progress_args_t *) g_malloc(sizeof(draw_progress_args_t)); dp->progress = progress_bar; dp->fraction = (gfloat) 0; g_idle_add(draw_progress, dp); /* g_print("Transferring %s\n", jbmeta->filename); */ /* Transfer file */ #ifndef G_OS_WIN32 tmpfname = filename_fromutf8(jbmeta->filename); #else // Windows locale version of filename, since libnjb does not // convert filenames into unicode... tmpfname = g_locale_from_utf8(jbmeta->filename,-1,NULL,NULL,NULL); #endif if (use_mtp) { #ifdef HAVE_LIBMTP int ret; ret = LIBMTP_Get_File_To_File(mtpdevice, id, tmpfname, mtp_progress, NULL); if (ret != 0) { g_free(tmpfname); g_print("Error getting file \"%s\" from MTP device!\n", tmpfname); LIBMTP_Dump_Errorstack(mtpdevice); LIBMTP_Clear_Errorstack(mtpdevice); goto data_error; } #endif } else { if (NJB_Get_File(pdedevice, id, jbmeta->size, tmpfname, pde_progress, NULL) == -1) { g_free(tmpfname); NJB_Error_Dump(pdedevice, stderr); goto data_error; } } g_free(tmpfname); /* Send to main loop for drawing */ metaddarg = (metadata_add_args_t *) g_malloc(sizeof(metadata_add_args_t)); metaddarg->listtype = HDDATA_LIST; metaddarg->meta = jbmeta; g_idle_add(call_add_metadata_to_model,metaddarg); metalist = g_list_next(metalist); } data_error: destroy_metalist(args->metalist); jukebox_locked = FALSE; g_idle_add((GSourceFunc) gtk_widget_destroy, args->dialog); g_idle_add(call_fill_in_dir, GINT_TO_POINTER((gint)HDDATA_LIST)); g_free(args); return NULL; } /***********************************************************************************/ /* Transferring music to jukebox thread */ /***********************************************************************************/ gpointer hd2jb_thread(gpointer thread_args) { hd2jb_thread_arg_t *args = (hd2jb_thread_arg_t *) thread_args; GList *templist = args->metalist; GList *new_metalist = NULL; gchar *tmpdirname = NULL; #ifndef G_OS_WIN32 gchar tmpdirtmpl[] = "/tmp/gnomad-XXXXXX"; #else // FIXME: I'm not quite sure this always works on Windows. gchar tmpdirtmpl[] = "C:\\gnomad-XXXXXX"; #endif // Create a temporary directory for tag-stripped files. if (get_prefs_tagremove()) { tmpdirname = mkdtemp(tmpdirtmpl); if (tmpdirname == NULL) { goto hd2jb_cleanup; } } while (templist && !cancel_jukebox_operation) { metadata_t *hdmeta; metadata_t *jbmeta; gint protectint; gchar *tmpfname = NULL; gchar *tmpfname8 = NULL; guint32 id; guint length; gboolean clone_and_strip = FALSE; draw_label_args_t *da; draw_progress_args_t *dp; metadata_add_args_t *metaddarg; hdmeta = (metadata_t *) templist->data; // g_print("Storing %s on jukebox...\n", hdmeta->filename); // If we want to remove tags then we fix that here if (tmpdirname != NULL) { clone_and_strip = TRUE; tmpfname8 = g_build_filename(tmpdirname, hdmeta->filename, NULL); tmpfname = filename_fromutf8(tmpfname8); /* Call the filesystem to clone the file and remove the tag */ if (!clone_and_strip_tag(hdmeta->path, tmpfname8, hdmeta->codec)) { goto hd2jb_cleanup; } } else { tmpfname = filename_fromutf8(hdmeta->path); } // Draw next file da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup_printf("%s - %s", hdmeta->artist, hdmeta->title); g_idle_add(draw_label, da); dp = (draw_progress_args_t *) g_malloc(sizeof(draw_progress_args_t)); dp->progress = progress_bar; dp->fraction = (gfloat) 0; g_idle_add(draw_progress, dp); length = mmss_to_seconds(hdmeta->length); protectint = hdmeta->protect ? 1 : 0; if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_track_t *trackmeta = LIBMTP_new_track_t(); int ret; const mtp_filetype_description_t *filetype_d; // Retrieve filetype infos filetype_d = get_mtp_filetype_description_by_codec(hdmeta->codec); // This will be filled in, dummy set to 0. trackmeta->item_id = 0; trackmeta->title = g_strdup(hdmeta->title); trackmeta->album = g_strdup(hdmeta->album); trackmeta->artist = g_strdup(hdmeta->artist); trackmeta->genre = g_strdup(hdmeta->genre); trackmeta->date = g_strdup_printf("%4d0101T0000.0", hdmeta->year); trackmeta->filename = g_strdup(hdmeta->filename); trackmeta->tracknumber = hdmeta->trackno; // This need to be in milliseconds trackmeta->duration = length * 1000; trackmeta->filesize = get_64bit_file_size(tmpfname); trackmeta->filetype = filetype_d->filetype; // TODO: Discarding return value as for now // g_print("Transferring MTP track...\n"); #ifdef HAVE_LIBMTP_030 // Hardcode parent (folder) to 0 (== root directory) trackmeta->parent_id = 0; // Hardcode storage to primary trackmeta->storage_id = 0; ret = LIBMTP_Send_Track_From_File(mtpdevice, tmpfname, trackmeta, mtp_progress, NULL); #else ret = LIBMTP_Send_Track_From_File(mtpdevice, tmpfname, trackmeta, mtp_progress, NULL, 0); #endif if (ret != 0) { g_print("Error sending file \"%s\" to MTP device!\n", tmpfname); LIBMTP_Dump_Errorstack(mtpdevice); LIBMTP_Clear_Errorstack(mtpdevice); goto hd2jb_cleanup; } // Fetch new track ID. id = (guint32) trackmeta->item_id; LIBMTP_destroy_track_t(trackmeta); #endif } else { njb_songid_t *songid; njb_songid_frame_t *frame; songid = NJB_Songid_New(); frame = NJB_Songid_Frame_New_Codec(hdmeta->codec); NJB_Songid_Addframe(songid, frame); // libnjb will add this if not added by hand // frame = NJB_Songid_Frame_New_Filesize(filesize); // NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Title(hdmeta->title); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Album(hdmeta->album); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Artist(hdmeta->artist); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Genre(hdmeta->genre); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Year(hdmeta->year); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Tracknum(hdmeta->trackno); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Length((u_int32_t) length); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Filename(hdmeta->filename); NJB_Songid_Addframe(songid, frame); if (hdmeta->protect) { frame = NJB_Songid_Frame_New_Protected(1); NJB_Songid_Addframe(songid, frame); } // g_print("Transferring track.\n"); if (NJB_Send_Track (pdedevice, tmpfname, songid, pde_progress, NULL, (u_int32_t *) &id) == -1) { NJB_Error_Dump(pdedevice, stderr); goto hd2jb_cleanup; } // FIXME: do we need to destroy songid? Memleak? /* g_print("%s stored on jukebox with ID: %lu\n", file, id); */ } jukebox_songs++; /* Add to disk listbox and re-sort */ /* Add correct trackid in col 7, add the row */ jbmeta = clone_metadata_t(hdmeta); g_free(jbmeta->path); jbmeta->path = g_strdup_printf("%" PRIguint32, id); /* Send to main loop for drawing */ metaddarg = (metadata_add_args_t *) g_malloc(sizeof(metadata_add_args_t)); metaddarg->listtype = JB_LIST; metaddarg->meta = clone_metadata_t(jbmeta); g_idle_add(call_add_metadata_to_model,metaddarg); g_hash_table_insert(songhash, GUINT32_TO_GPOINTER(id), (gpointer) clone_metadata_t(jbmeta)); new_metalist = g_list_append (new_metalist, jbmeta); if (clone_and_strip) { /* Afterwards delete the tempfile */ unlink(tmpfname); if (tmpfname8 != NULL) { g_free(tmpfname8); } } if (tmpfname != NULL) { g_free(tmpfname); } templist = g_list_next(templist); } /* * At last add the tracks to default playlists if * any such are selected. */ if (args->playlists != NULL) { add_tracks_to_playlists(args->playlists, new_metalist); } destroy_metalist(new_metalist); flush_usage(); hd2jb_cleanup: // Remove temporary directory for tag-stripped files. if (tmpdirname != NULL) { rmdir(tmpdirname); } g_idle_add((GSourceFunc) gtk_widget_destroy, args->dialog); if (args->playlists != NULL) { g_idle_add(call_build_playlist_tree, (gpointer) args->pltreestore); } jukebox_locked = FALSE; g_list_free(args->playlists); destroy_metalist(args->metalist); g_free(args); #ifdef HAVE_LIBMTP if (use_mtp) { mtp_initialize_folders(); } #endif return NULL; } /***********************************************************************************/ /* Transferring data file to jukebox thread */ /***********************************************************************************/ gpointer hd2jb_data_thread(gpointer thread_args) { hd2jb_data_thread_arg_t *args = (hd2jb_data_thread_arg_t *) thread_args; GList *metalist = args->metalist; while (metalist && !cancel_jukebox_operation) { gchar *tmpfname; gchar *folder; gchar rootdir[] = "\\"; guint32 id; metadata_t *hdmeta; metadata_t *jbmeta; draw_label_args_t *da; draw_progress_args_t *dp; metadata_add_args_t *metaddarg; hdmeta = (metadata_t *) metalist->data; // FIXME: is this getting operation really thread safe??? folder = (gchar *) gtk_entry_get_text(GTK_ENTRY(data_widgets.jbentry)); if (folder == NULL) { /* This shouldn't happen, but include it anyway. */ folder = rootdir; } // Draw next file // g_print("Storing %s (extension %s) on jukebox as %s in folder %s...\n", hdmeta->path, hdmeta->codec, hdmeta->filename, folder); da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->label; da->text = g_strdup(hdmeta->filename); g_idle_add(draw_label, da); dp = (draw_progress_args_t *) g_malloc(sizeof(draw_progress_args_t)); dp->progress = progress_bar; dp->fraction = (gfloat) 0; g_idle_add(draw_progress, dp); tmpfname = filename_fromutf8(hdmeta->path); if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_file_t *filemeta = LIBMTP_new_file_t(); const mtp_filetype_description_t *filetype_d; // Retrieve filetype infos. filetype_d = get_mtp_filetype_description_by_codec(hdmeta->codec); filemeta->filename = g_strdup(hdmeta->filename); filemeta->filesize = (uint64_t) hdmeta->size; filemeta->filetype = filetype_d->filetype; #ifdef HAVE_LIBMTP_030 filemeta->parent_id = mtp_current_filter_id; if (LIBMTP_Send_File_From_File(mtpdevice, tmpfname, filemeta, mtp_progress, NULL) != 0) { #else if (LIBMTP_Send_File_From_File(mtpdevice, tmpfname, filemeta, mtp_progress, NULL, mtp_current_filter_id) != 0) { #endif LIBMTP_destroy_file_t(filemeta); g_free(tmpfname); g_print("Error sending file \"%s\" to MTP device!\n", tmpfname); LIBMTP_Dump_Errorstack(mtpdevice); LIBMTP_Clear_Errorstack(mtpdevice); goto hd2jb_data_cleanup; } LIBMTP_destroy_file_t(filemeta); #endif } else { if (NJB_Send_File (pdedevice, tmpfname, hdmeta->filename, folder, pde_progress, NULL, (u_int32_t *) &id) == -1) { g_free(tmpfname); NJB_Error_Dump(pdedevice, stderr); goto hd2jb_data_cleanup; } } g_free(tmpfname); /* g_print("%s stored on jukebox with ID: %lu\n", hdmeta->filename, id); */ jukebox_datafiles++; /* Add to disk listbox and re-sort */ /* Add correct trackid in col 7, add the row * then restore the old contents so they will * be freed correctly */ jbmeta = clone_metadata_t(hdmeta); g_free(jbmeta->path); jbmeta->path = g_strdup_printf("%" PRIguint32, id); if (jbmeta->folder != NULL) { g_free(jbmeta->folder); } jbmeta->folder = g_strdup(folder); /* Send to main loop for drawing */ metaddarg = (metadata_add_args_t *) g_malloc(sizeof(metadata_add_args_t)); metaddarg->listtype = JBDATA_LIST; metaddarg->meta = jbmeta; g_idle_add(call_add_metadata_to_model,metaddarg); /* Keep this in the global metadata file list! */ datafilelist = g_slist_append(datafilelist, (gpointer) jbmeta); metalist = g_list_next(metalist); } flush_usage(); hd2jb_data_cleanup: g_idle_add((GSourceFunc) gtk_widget_destroy, args->dialog); jukebox_locked = FALSE; destroy_metalist(args->metalist); g_free(args); return NULL; } #ifdef HAVE_LIBMTP static gboolean delete_one_track_from_playlist(LIBMTP_playlist_t *pl, uint32_t trackid) { guint i; guint instances = 0; // See if the track is on this playlist, remove it if it is for (i = 0; i < pl->no_tracks; i++) { if (pl->tracks[i] == trackid) { instances ++; } } // If there were instances of this track on this playlist, // remove them. if (instances != 0) { uint32_t *copy = g_malloc((pl->no_tracks - instances) * sizeof(uint32_t)); guint j = 0; for (i = 0; i < pl->no_tracks; i++) { if (pl->tracks[i] != trackid) { copy[j] = pl->tracks[i]; j++; } } g_free(pl->tracks); pl->tracks = copy; pl->no_tracks = pl->no_tracks - instances; if (LIBMTP_Update_Playlist(mtpdevice, pl) != 0) { g_printf("Failed to remove tracks from playlist during device update\n"); return FALSE; } } return TRUE; } #endif // HAVE_LIBMTP /* Called after file deletion to remove the deleted * tracks from any playlists they may occur in. UNTHREADED */ static void remove_tracks_from_playlists(GList *metalist, GtkTreeStore *pltreestore) { GList *tmplist; if (metalist == NULL) { return; } /* g_print("Called remove_tracks_from_playlists()\n"); */ tmplist = metalist; // FIXME: this routine is O(n^2) due to two linear // searches. Should be improved some day. while (tmplist) { metadata_t *meta; u_int32_t id; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_playlist_t *playlists; // Get playlist listing. playlists = LIBMTP_Get_Playlist_List(mtpdevice); if (playlists == NULL) { // No playlists == nothing to do return; } else { LIBMTP_playlist_t *pl, *tmp; pl = playlists; while (pl != NULL) { if(!delete_one_track_from_playlist(pl, id)) { g_print("Could not remove track %d from playlist %d\n", id, pl->playlist_id); } // Then iterate over next playlist tmp = pl; pl = pl->next; LIBMTP_destroy_playlist_t(tmp); } } #endif } else { njb_playlist_t *playlist; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { NJB_Playlist_Deltrack_TrackID(playlist, id); /* If the playlist changed, update it */ if (playlist->_state == NJB_PL_CHTRACKS) { if (NJB_Update_Playlist(pdedevice, playlist) == -1) NJB_Error_Dump(pdedevice, stderr); } NJB_Playlist_Destroy(playlist); } if (NJB_Error_Pending(pdedevice)) { NJB_Error_Dump(pdedevice, stderr); } } tmplist = g_list_next(tmplist); } build_playlist_tree(); } /* Delete a list of files from the jukebox */ void jukebox_delete_files(GList *metalist) { GList *tmplist = metalist; if (!metalist) return; jukebox_locked = TRUE; while (tmplist) { guint32 id; metadata_t *meta; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); /* g_print("Deleting: %" PRIguint32 " from jukebox library\n", id); */ if (id) { if (use_mtp) { #ifdef HAVE_LIBMTP if (LIBMTP_Delete_Object(mtpdevice, (uint32_t) id) != 0) { // Error message g_print("Unable to delete files.\n"); } #endif } else { if ( NJB_Delete_Datafile(pdedevice, (u_int32_t) id) == -1 ) { NJB_Error_Dump(pdedevice, stderr); } } // Remove it from the datafile cache remove_from_datafile_list(meta->path); // Then decrease the counter if (jukebox_datafiles) jukebox_datafiles--; } tmplist = g_list_next(tmplist); } #ifdef HAVE_LIBMTP if (use_mtp) { mtp_initialize_folders(); }; #endif flush_usage(); jukebox_locked = FALSE; } /* Delete a list of tracks from the jukebox */ void jukebox_delete_tracks(GList *metalist, GtkTreeStore *pltreestore) { GList *tmplist = metalist; if (!metalist) return; jukebox_locked = TRUE; /* First remove tracks from any playlists they are in */ remove_tracks_from_playlists(metalist, pltreestore); while (tmplist) { metadata_t *meta; u_int32_t id; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); /* g_print("Deleting: %lu from jukebox library\n", id); */ if (id) { metadata_t *tmpmeta; if (use_mtp) { #ifdef HAVE_LIBMTP if (LIBMTP_Delete_Object(mtpdevice, id) != 0) { g_print("Unable to delete tracks.\n"); } #endif } else { if ( NJB_Delete_Track(pdedevice, id) == -1 ) { NJB_Error_Dump(pdedevice, stderr); } } /* Remove song from hash */ tmpmeta = (metadata_t *) g_hash_table_lookup(songhash, GUINT_TO_POINTER(id)); /* Sometimes tracks are removed that are not part of any playlist. Weird but happens. */ if (tmpmeta != NULL) { destroy_hash(NULL, tmpmeta, NULL); g_hash_table_remove(songhash, GUINT_TO_POINTER(id)); } if (jukebox_songs) jukebox_songs--; } tmplist = tmplist->next; } flush_usage(); jukebox_locked = FALSE; } gboolean jukebox_begin_metadata_set(void) { /* Begin metadata transaction, return TRUE if transaction * is OK to begin */ jukebox_locked = TRUE; return TRUE; } void jukebox_set_metadata (metadata_t *meta) { /* Set metadata on the file with ID id */ u_int32_t id, length; metadata_t *tmpmeta; id = string_to_guint32(meta->path); length = mmss_to_seconds(meta->length); if (id == 0) { create_error_dialog(_("Track ID was zero! Illegal value!")); return; } if (length < 0) { create_error_dialog(_("Song length must be greater than zero!")); return; } if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_track_t *trackmeta = LIBMTP_new_track_t(); int ret; const mtp_filetype_description_t *filetype_d; // Retrieve filetype infos. filetype_d = get_mtp_filetype_description_by_codec(meta->codec); trackmeta->item_id = id; trackmeta->title = g_strdup(meta->title); trackmeta->album = g_strdup(meta->album); trackmeta->artist = g_strdup(meta->artist); trackmeta->genre = g_strdup(meta->genre); trackmeta->date = g_strdup_printf("%4d0101T0000.0", meta->year); // This cannot be set this way but send it anyway trackmeta->filename = g_strdup(meta->filename); trackmeta->tracknumber = meta->trackno; // This need to be in milliseconds trackmeta->duration = length * 1000; // This cannot be set this way but send it anyway trackmeta->filesize = (uint64_t) meta->size; trackmeta->filetype = filetype_d->filetype; // TODO: Discarding return value as for now ret = LIBMTP_Update_Track_Metadata(mtpdevice, trackmeta); LIBMTP_destroy_track_t(trackmeta); #endif } else { njb_songid_t *songid; njb_songid_frame_t *frame; songid = NJB_Songid_New(); /* On NJB1 incremental update is not possible! */ if (pdedevice->device_type == NJB_DEVICE_NJB1) { // Sometimes it fails with old codec names. gchar *tmpcodec = g_ascii_strup(meta->codec, -1); frame = NJB_Songid_Frame_New_Codec(tmpcodec); g_free(tmpcodec); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Filesize(meta->size); NJB_Songid_Addframe(songid, frame); } /* Ultimately only send altered fields to NJB series 3 */ frame = NJB_Songid_Frame_New_Title(meta->title); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Album(meta->album); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Artist(meta->artist); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Genre(meta->genre); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Year(meta->year); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Tracknum(meta->trackno); NJB_Songid_Addframe(songid, frame); frame = NJB_Songid_Frame_New_Length(length); NJB_Songid_Addframe(songid, frame); /* * These will only be set if the jukebox has retrieved * extended metadata so that the user has a chance of modifying * an existing tag, not just overwrite what is already there. */ if (get_prefs_extended_metadata()) { if (meta->filename != NULL) { frame = NJB_Songid_Frame_New_Filename(meta->filename); NJB_Songid_Addframe(songid, frame); } if (meta->folder != NULL) { frame = NJB_Songid_Frame_New_Folder(meta->folder); NJB_Songid_Addframe(songid, frame); } } if (meta->protect) { frame = NJB_Songid_Frame_New_Protected(1); NJB_Songid_Addframe(songid, frame); } if (NJB_Replace_Track_Tag(pdedevice, id, songid) == -1) { NJB_Error_Dump(pdedevice, stderr); } } /* Replace the data in the hash table */ tmpmeta = (metadata_t *) g_hash_table_lookup(songhash, GUINT_TO_POINTER(id)); /* Make sure we actually find it! Sometimes it is non-existant... */ if (tmpmeta != NULL) { destroy_hash(NULL, tmpmeta, NULL); g_hash_table_remove(songhash, GUINT_TO_POINTER(id)); } /* Clone metadata */ tmpmeta = clone_metadata_t(meta); /* Insert the new row */ g_hash_table_insert(songhash, GUINT_TO_POINTER(id), (gpointer) tmpmeta); } void jukebox_end_metadata_set(void) { /* End metadata transaction */ jukebox_locked = FALSE; /* Update the window with the new metadata */ jblist_from_songhash(); } /* Creates a new playlist and returns its playlist ID UNTHREADED */ guint32 jukebox_create_playlist(gchar *plname, GtkTreeStore *pltreestore) { njb_playlist_t *playlist; guint32 plid = 0; /* g_print("Called create playlist\n"); */ if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_playlist_t *pl; pl = LIBMTP_new_playlist_t(); pl->name = g_strdup(plname); // This will create the new playlist in the default folder #ifdef HAVE_LIBMTP_030 pl->parent_id = 0; // Hardcode storage to primary pl->storage_id = 0; if (LIBMTP_Create_New_Playlist(mtpdevice, pl) != 0) { #else if (LIBMTP_Create_New_Playlist(mtpdevice, pl, 0) != 0) { #endif create_error_dialog(_("Could not create playlist")); return 0; } LIBMTP_destroy_playlist_t(pl); #endif } else { /* Create the new playlist in memory */ playlist = NJB_Playlist_New(); if (playlist == NULL) { return 0; } if (NJB_Playlist_Set_Name(playlist, plname) == -1) { NJB_Error_Dump(pdedevice, stderr); return 0; } jukebox_locked = TRUE; /* g_print("Calling NJB_Update_Playlist\n"); */ if (NJB_Update_Playlist(pdedevice, playlist) == -1) { create_error_dialog(_("Could not create playlist")); NJB_Error_Dump(pdedevice, stderr); } jukebox_playlists++; plid = (guint32) playlist->plid; NJB_Playlist_Destroy(playlist); } build_playlist_tree(); jukebox_locked = FALSE; /* g_print("Created playlist\n"); */ return plid; } /* Delete a playlist with playlist ID plid UNTHREADED */ void jukebox_delete_playlist(guint32 plid) { jukebox_locked = TRUE; if (use_mtp) { #ifdef HAVE_LIBMTP if (LIBMTP_Delete_Object(mtpdevice, (uint32_t) plid) != 0) { create_error_dialog(_("Could not delete playlist")); } #endif } else { if (NJB_Delete_Playlist(pdedevice, (u_int32_t) plid) == -1) { create_error_dialog(_("Could not delete playlist")); NJB_Error_Dump(pdedevice, stderr); } } jukebox_playlists--; build_playlist_list(); jukebox_locked = FALSE; } /* Rename the playlist with ID plid */ void jukebox_rename_playlist(guint32 plid, gchar *name, GtkTreeStore *pltreestore) { if (use_mtp) { #ifdef HAVE_LIBMTP // Get metadata for one single playlist, update and write back. LIBMTP_playlist_t *pl; pl = LIBMTP_Get_Playlist(mtpdevice, (uint32_t) plid); if (pl->name != NULL) { g_free(pl->name); } pl->name = g_strdup(name); if (LIBMTP_Update_Playlist(mtpdevice, pl) != 0) { create_error_dialog(_("Could not rename playlist")); } LIBMTP_destroy_playlist_t(pl); #endif } else { njb_playlist_t *playlist; gboolean found = FALSE; jukebox_locked = TRUE; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { /* g_print("Playlist %" PRIguint32 " == Playlist %" PRIguint32 " ... ",playlist->plid, plid); */ if (playlist->plid == (u_int32_t) plid) { /* g_print("Yes.\n"); */ found = TRUE; break; } /* g_print("No.\n"); */ NJB_Playlist_Destroy(playlist); } if (found) { if (NJB_Playlist_Set_Name(playlist, name) == -1) { NJB_Error_Dump(pdedevice, stderr); } else { if (NJB_Update_Playlist(pdedevice, playlist) == -1) { create_error_dialog(_("Could not rename playlist")); NJB_Error_Dump(pdedevice, stderr); } } NJB_Playlist_Destroy(playlist); build_playlist_tree(); } else { create_error_dialog(_("Could not locate playlist to rename!")); } jukebox_locked = FALSE; } } static void add_tracks_to_single_playlist(guint32 playlistid, GList *metalist) { // Sanity check if (!metalist) return; if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_playlist_t *pl; GList *tmplist; guint i; guint toadd; uint32_t *copy; if (gnomad_debug != 0) { g_print("Getting playlist %" PRIguint32 "\n", playlistid); } pl = LIBMTP_Get_Playlist(mtpdevice, (uint32_t) playlistid); if (pl == NULL) { return; } // Count the tracks and allocate space for playlist tmplist = metalist; toadd = 0; while(tmplist) { toadd++; tmplist = g_list_next(tmplist); } // Allocate the new playlist copy = g_malloc((pl->no_tracks + toadd) * sizeof(uint32_t)); // Copy old tracks for (i = 0; i < pl->no_tracks; i++) { copy[i] = pl->tracks[i]; } // Remove old contents if (pl->tracks != NULL) { g_free(pl->tracks); } pl->tracks = copy; pl->no_tracks = pl->no_tracks + toadd; // Add each new track tmplist = metalist; while(tmplist) { metadata_t *meta; guint32 id; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); if (gnomad_debug != 0) { g_print("Adding track %" PRIguint32 " to playlist %" PRIguint32 "\n", id, playlistid); } pl->tracks[i] = (uint32_t) id; tmplist = g_list_next(tmplist); i++; } if (LIBMTP_Update_Playlist(mtpdevice, pl) != 0) { g_print("Failed to add tracks to playlist on MTP device.\n"); } #endif } else { njb_playlist_track_t *pl_track; njb_playlist_t *playlist; GList *tmplist = metalist; gboolean found = FALSE; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { /* g_print("Is it %lu?\n", playlist->plid */ if (playlist->plid == playlistid) { /* g_print("YES!\n"); */ found = TRUE; break; } /* g_print("NO.\n"); */ NJB_Playlist_Destroy(playlist); } if (!found) { g_print(_("Could not find playlist")); } else if (tmplist) { while(tmplist) { metadata_t *meta; u_int32_t id; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); /* g_print("Adding track %lu to playlist %lu\n", id, playlistid); */ pl_track = NJB_Playlist_Track_New(id); NJB_Playlist_Addtrack(playlist, pl_track, NJB_PL_END); tmplist = g_list_next(tmplist); } if (NJB_Update_Playlist(pdedevice, playlist) == -1) NJB_Error_Dump(pdedevice, stderr); NJB_Playlist_Destroy(playlist); } } } /** * Add a list of tracks to a list of playlists. */ void add_tracks_to_playlists(GList *playlists, GList *metalist) { GList *templist = g_list_first(playlists); if (gnomad_debug != 0) { g_print("Called add_tracks_to_playlist()\n"); } jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; while (templist != NULL) { guint32 plid = GPOINTER_TO_GUINT32(templist->data); // g_printf("Adding track to playlist 0x%08x\n", plid); add_tracks_to_single_playlist(plid, metalist); templist = g_list_next(templist); } jukebox_locked = FALSE; } /* Randomize file from playlist UNTHREADED */ guint jukebox_randomize_playlist(guint plist, GtkTreeStore *pltreestore) { guint new_plid = plist; if (use_mtp) { // FIXME: implement for MTP, not yet done. return plist; } if (plist != 0) { njb_playlist_t *playlist; gboolean found = FALSE; jukebox_locked = TRUE; // g_print("randomizing playlist %lu\n", plist); NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { // g_print("Is it %lu?\n", playlist->plid); if (playlist->plid == plist) { // g_print("YES!"); found = TRUE; break; } // g_print("NO."); NJB_Playlist_Destroy(playlist); } if (found) { GPtrArray *contents = g_ptr_array_sized_new (playlist->ntracks); gpointer temp; njb_playlist_track_t *current = playlist->first; njb_playlist_track_t *prev = NULL; GRand* randnum = g_rand_new(); gint i, j; // g_print(" playlist size is %u\n", playlist->ntracks); if (playlist->ntracks > 1) { //g_print("Old order\n"); while(current != NULL) { //g_print("%lu\n", current->trackid); g_ptr_array_add(contents, current); current = current->next; } //For each item, swap with a randommly selected later item for (i = 0; i < playlist->ntracks; ++i) { j = g_rand_int_range(randnum, i, playlist->ntracks); //g_print("Swapping %lu [%i] with %lu [%i]\n",((njb_playlist_track_t *)contents->pdata[i])->trackid,i,((njb_playlist_track_t *)contents->pdata[j])->trackid,j); temp = contents->pdata[i]; contents->pdata[i] = contents->pdata[j]; contents->pdata[j] = temp; } // Repair the chaining // g_print("New order\n"); for (i = 0; i < playlist->ntracks; ++i) { current = (njb_playlist_track_t *)contents->pdata[i]; //g_print("%lu\n", current->trackid); current->prev = prev; if (prev != NULL) prev->next = current; current->next = NULL; prev = current; } playlist->first = contents->pdata[0]; playlist->last = prev; // Mark it shuffled playlist->_state = NJB_PL_CHTRACKS; if (NJB_Update_Playlist(pdedevice, playlist) == -1) NJB_Error_Dump(pdedevice, stderr); new_plid = playlist->plid; } else { g_print("Playlist is too small to shuffle\n"); } // Clean up NJB_Playlist_Destroy(playlist); g_ptr_array_free(contents, FALSE); g_rand_free(randnum); // Then rebuild the playlist list (necessary). build_playlist_tree(); } } jukebox_locked = FALSE; // g_print("Old playlist ID: %lu, new playlist ID: %lu\n", plist, new_plid); return new_plid; } /* Delete file from playlist UNTHREADED */ guint jukebox_delete_track_from_playlist(guint32 trackid, guint32 plist, GtkTreeStore *pltreestore) { guint new_plid = plist; if (trackid != 0 && plist != 0) { jukebox_locked = TRUE; g_print("Removing track: %" PRIguint32 " from playlist %" PRIguint32 "\n", trackid, plist); if (use_mtp) { #ifdef HAVE_LIBMTP LIBMTP_playlist_t *pl; pl = LIBMTP_Get_Playlist(mtpdevice, plist); if (pl == NULL) { g_print("Failed to locate playlist for track removal.\n"); } else { if (!delete_one_track_from_playlist(pl, trackid)) { g_print("Failed to remove track %" PRIguint32 " from playlist %" PRIguint32 "\n", trackid, (guint32) pl->playlist_id); } LIBMTP_destroy_playlist_t(pl); } #endif } else { gboolean found = FALSE; njb_playlist_t *playlist; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { // g_print("Is it in %lu? ...", playlist->plid); if (playlist->plid == plist) { // g_print("YES!\n"); found = TRUE; break; } // g_print("NO.\n"); NJB_Playlist_Destroy(playlist); } /* If the playlist was found, remove the track */ if (found) { njb_playlist_track_t *track; // g_print("Found playlist %lu\n", playlist->plid); while ((track = NJB_Playlist_Gettrack(playlist)) != NULL) { if (trackid == track->trackid) { /* When the track is located in a playlist, remove it */ // g_print("Removing track: %lu from playlist %lu\n", track->trackid, playlist->plid); if (track->prev != NULL) track->prev->next = track->next; else playlist->first = track->next; if (track->next != NULL) track->next->prev = track->prev; NJB_Playlist_Track_Destroy(track); playlist->ntracks--; playlist->_state = NJB_PL_CHTRACKS; break; } } if (playlist->_state==NJB_PL_CHTRACKS) { /* g_print("Called NJB_Update_Playlist...\n"); */ if (NJB_Update_Playlist(pdedevice, playlist) == -1) NJB_Error_Dump(pdedevice, stderr); new_plid = playlist->plid; } NJB_Playlist_Destroy(playlist); } else { create_error_dialog(_("Could not find the track in the playlist")); } } } jukebox_locked = FALSE; // g_print("Old playlist ID: %lu, new playlist ID: %lu\n", plist, new_plid); // When replacing playlist ID does not work we must use this // build_playlist_tree(pltreestore); return new_plid; } /* Retrieve ownerstring */ gchar *jukebox_get_ownerstring(void) { return jukebox_ownerstring; } /* Set the ownerstring */ void jukebox_set_ownerstring(gchar *owner) { jukebox_locked = TRUE; if (use_mtp) { #ifdef HAVE_LIBMTP if (LIBMTP_Set_Friendlyname(mtpdevice, owner) != 0) { create_error_dialog(_("Could not set owner string on the device")); } #endif } else { NJB_Set_Owner_String (pdedevice, owner); } if (jukebox_ownerstring != NULL) g_free(jukebox_ownerstring); jukebox_ownerstring = g_strdup(owner); /* The ownerstring max length is 64 bytes * including the null-terminator according * to the protocol specification */ if (strlen(jukebox_ownerstring) >= OWNER_STRING_LENGTH) jukebox_ownerstring[OWNER_STRING_LENGTH-1] = '\0'; jukebox_locked = FALSE; } /* Returns the hh:mm:ss representation from seconds */ static void hhmmss (u_int16_t seconds, u_int16_t *hh, u_int16_t *mm, u_int16_t *ss) { if ( seconds >= 3600 ) { *hh= seconds/3600; seconds-= 3600*(*hh); } else *hh = 0; if ( seconds >= 60 ) { *mm= seconds/60; seconds-= 60*(*mm); } else *mm = 0; *ss= seconds; } /* Reset EAX retrieval routine */ void jukebox_reset_get_eax(void) { jukebox_locked = TRUE; if (!use_mtp) { NJB_Reset_Get_EAX_Type(pdedevice); } } /* Gets an EAX setting struct, returns NULL if * something fails. */ njb_eax_t *jukebox_get_eax(void) { if (!use_mtp) { njb_eax_t *eax = NJB_Get_EAX_Type(pdedevice); if (eax == NULL) jukebox_locked = FALSE; return eax; } return NULL; } /* Free the memory used by the EAX structure */ void jukebox_destroy_eax(njb_eax_t *eax) { if (!use_mtp) { NJB_Destroy_EAX_Type(eax); } } void jukebox_adjust_eax(guint16 effect, guint16 patch, gint16 value) { if (!use_mtp) { if (created_play_mutex) { g_mutex_lock(play_thread_mutex); NJB_Adjust_EAX(pdedevice, effect, patch, value); g_mutex_unlock(play_thread_mutex); } } } /* Returns the playlist in a format suiting for * the player thread below */ GList *jukebox_get_playlist_for_play(guint plid) { GList *retlist = NULL; njb_playlist_t *playlist; gboolean found = FALSE; if (use_mtp) { // FIXME: not implemented for MTP return NULL; } jukebox_locked = TRUE; NJB_Reset_Get_Playlist(pdedevice); while ((playlist = NJB_Get_Playlist(pdedevice)) != NULL) { if (playlist->plid == plid) { found = TRUE; break; } // Dangerous? NJB_Playlist_Destroy(playlist); } /* Get the tracks from the playlist */ if (found) { njb_playlist_track_t *track; metadata_t *meta; metadata_t *newmeta; while ((track = NJB_Playlist_Gettrack(playlist)) != NULL) { meta = (metadata_t *) g_hash_table_lookup(songhash, GUINT_TO_POINTER(track->trackid)); // Sometimes it's non-existant if (meta != NULL) { newmeta = clone_metadata_t(meta); retlist = g_list_append(retlist, (gpointer) newmeta); } } } jukebox_locked = FALSE; return retlist; } /* Transfer playlist to jukebox */ static void send_playlist(GList *list) { gboolean first = TRUE; GList *tmplist = list; if (use_mtp) { // FIXME: not implemented for MTP. return; } if (tmplist != NULL) NJB_Stop_Play(pdedevice); while (tmplist) { metadata_t *meta; u_int32_t id; meta = (metadata_t *) tmplist->data; id = string_to_guint32(meta->path); if (id) { if (first) { /* g_print("Playing: %lu\n", id); */ first = FALSE; if (NJB_Play_Track(pdedevice, id) == -1) NJB_Error_Dump(pdedevice, stderr); } else { /* g_print("Queueing: %lu\n", id); */ if (NJB_Queue_Track(pdedevice, id) == -1) NJB_Error_Dump(pdedevice, stderr); } } tmplist = tmplist->next; } } /* Sets the songname in the dialog - you have to * lock mutexes before * calling this function */ static void set_songname_label(gchar *artist, gchar *title, gchar *seconds) { draw_label_args_t *da; da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = songnamelabel; da->text = g_strdup_printf("%s - %s, %s", artist, title, seconds); g_idle_add(draw_label, da); } /** * Returns metadata for the currently playing track. */ metadata_t *jukebox_get_current_playing_metadata(void) { metadata_t *retval = NULL; if (created_play_mutex) { g_mutex_lock(play_thread_mutex); if (playlistitr != NULL) { retval = (metadata_t *) playlistitr->data; } g_mutex_unlock(play_thread_mutex); } return retval; } /** * Skips forward/backward in song (position given * as milliseconds). */ void jukebox_skip_songposition(guint songpos) { if (created_play_mutex) { g_mutex_lock(play_thread_mutex); NJB_Seek_Track(pdedevice, (u_int32_t) songpos); g_mutex_unlock(play_thread_mutex); } } void jukebox_previous(void) { if (created_play_mutex) { g_mutex_lock(play_thread_mutex); /* Twice, because each read advances three steps */ if (playlistitr->prev != NULL) { metadata_t *meta; playlistitr = g_list_previous(playlistitr); meta = (metadata_t *) playlistitr->data; set_songname_label(meta->artist, meta->title, meta->length); } send_playlist(playlistitr); passed_first_zero = FALSE; g_mutex_unlock(play_thread_mutex); } } /** * The parameter tells if the next song is already * playing, so that the list does not need to be * resent. */ void jukebox_next(gboolean already_playing) { if (created_play_mutex) { g_mutex_lock(play_thread_mutex); if (playlistitr != playlistlast) { playlistitr = g_list_next(playlistitr); if (playlistitr != NULL) { metadata_t *meta; meta = (metadata_t *) playlistitr->data; set_songname_label(meta->artist, meta->title, meta->length); if (!already_playing) { send_playlist(playlistitr); passed_first_zero = FALSE; } } } g_mutex_unlock(play_thread_mutex); } } static void jukebox_current(void) { /* g_print("Called jukebox_current...\n"); */ if (playlistitr != NULL) { metadata_t *meta; meta = (metadata_t *) playlistitr->data; set_songname_label(meta->artist, meta->title, meta->length); send_playlist(playlistitr); } } typedef struct { GtkAdjustment *adjustment; gdouble position; } set_adjustment_args_t; static gboolean call_set_adjustment_value(gpointer data) { set_adjustment_args_t *sa = (set_adjustment_args_t *) data; gtk_adjustment_set_value(sa->adjustment, sa->position); g_free(sa); return FALSE; } /* Start playing a bunch of selected files */ gpointer play_thread(gpointer thread_args) { play_thread_arg_t *args = (play_thread_arg_t *) thread_args; u_int16_t sec, hh, mm, ss; gint change = 0; gboolean repeat = TRUE; gfloat position; /* Just mail out on MTP devices */ if (use_mtp) { return NULL; } /* This mutex is to avoid collisions with EAX changes */ if (!created_play_mutex) { g_assert (play_thread_mutex == NULL); play_thread_mutex = g_mutex_new(); created_play_mutex = TRUE; } jukebox_locked = TRUE; /* Lock playing mutex and initialize */ g_mutex_lock(play_thread_mutex); playlist = args->metalist; songnamelabel = args->songlabel; passed_first_zero = FALSE; if (!playlist) { g_mutex_unlock(play_thread_mutex); return NULL; } /* The iterator is used for walking the playlist */ playlistitr = playlist; /* Set playlistlast to the pointer of the last song */ playlistlast = g_list_last(playlist); /* Setup for the first round */ jukebox_current(); g_mutex_unlock(play_thread_mutex); while (!cancel_jukebox_operation && repeat) { if (change) { if (playlistitr == NULL) { /* It would be nice if the jukebox sent a signal * like this at the end of playing all tracks, * but unfortunately it doesn't so this clause * is not executed on any device I've seen. */ repeat = FALSE; } else { jukebox_next(TRUE); } change = 0; } else { gchar tmp[10]; metadata_t *meta; guint seconds; draw_label_args_t *da; set_adjustment_args_t *sa; g_mutex_lock(play_thread_mutex); NJB_Elapsed_Time(pdedevice, &sec, &change); g_mutex_unlock(play_thread_mutex); hhmmss(sec, &hh, &mm, &ss); sprintf(tmp, "%02u:%02u:%02u", hh, mm, ss); meta = (metadata_t *) playlistitr->data; //dump_metadata_t(meta); seconds = mmss_to_seconds(meta->length); position = (gfloat) 100 * ((gfloat) sec / (gfloat) seconds); /* This is a guard against things that may happen if * you have MP3s with variable bitrate -- the second * tag may be incorrect */ if (position < 0) position = 100.0; da = (draw_label_args_t *) g_malloc(sizeof(draw_label_args_t)); da->label = args->timelabel; da->text = g_strdup(tmp); g_idle_add(draw_label, da); sa = (set_adjustment_args_t *) g_malloc(sizeof(set_adjustment_args_t)); sa->adjustment = args->adj; sa->position = position; g_idle_add(call_set_adjustment_value, sa); } /* The Jukebox reports zero seconds of time at the * beginning of play, and after the song ends. This * detects it and uses the situation after the last * song ends to kill the player window */ g_mutex_lock(play_thread_mutex); if (playlistitr == playlistlast && sec > 0) passed_first_zero = TRUE; if (passed_first_zero && sec == 0 && playlistitr == playlistlast) { /* g_print("End of last track\n"); */ g_mutex_unlock(play_thread_mutex); break; } g_mutex_unlock(play_thread_mutex); /* Sleep for a second */ sleep(1); } // Let the main loop destroy the dialog g_idle_add(call_widget_destroy, args->dialog); g_mutex_lock(play_thread_mutex); // Free the playlist destroy_metalist(playlist); playlist = NULL; NJB_Stop_Play(pdedevice); g_mutex_unlock(play_thread_mutex); jukebox_locked = FALSE; return NULL; } /* This routine synchronize the time on the * jukebox to that of the host system */ void jukebox_synchronize_time(void) { GTimeVal currenttimeval; GTime currenttime; g_get_current_time(¤ttimeval); currenttime = (GTime) currenttimeval.tv_sec; if (use_mtp) { // FIXME: implement for MTP if device can set time. } else { njb_time_t *jukeboxtime; struct tm *tm; const time_t tt_currenttime = currenttime; // Get the time from the jukebox, then modify it. jukeboxtime = NJB_Get_Time(pdedevice); // Uses UNIX library calls, might need to be portablized tm = localtime(&tt_currenttime); /* g_print("Setting: %d-%d-%d (wkd: %d) %d:%d:%d\n", 1900+tm->tm_year, 1+tm->tm_mon, tm->tm_mday, tm->tm_wday-1, tm->tm_hour, tm->tm_min, tm->tm_sec); */ jukeboxtime->year = 1900+tm->tm_year; jukeboxtime->month = 1+tm->tm_mon; jukeboxtime->day = tm->tm_mday; jukeboxtime->weekday = tm->tm_wday-1; jukeboxtime->hours = tm->tm_hour; jukeboxtime->minutes = tm->tm_min; jukeboxtime->seconds = tm->tm_sec; NJB_Set_Time(pdedevice, jukeboxtime); NJB_Destroy_Time(jukeboxtime); } } /* * This creates a new folder on the device */ void jukebox_create_folder(gchar *foldername) { gchar rootdir[] = "\\"; guint32 id; metadata_t *jbmeta; gchar *folder; jbmeta = new_metadata_t(); folder = (gchar *) gtk_entry_get_text(GTK_ENTRY(data_widgets.jbentry)); if (folder == NULL) { /* This shouldn't happen, but include it anyway. */ folder = rootdir; } // Add the new folder name jbmeta->folder = g_strdup_printf("%s%s\\", folder, foldername); jbmeta->filename = g_strdup(foldername); jbmeta->size = 0; #ifdef HAVE_LIBMTP if (use_mtp) { #ifdef HAVE_LIBMTP_030 int ret=LIBMTP_Create_Folder(mtpdevice,foldername,mtp_current_filter_id,0); #else int ret=LIBMTP_Create_Folder(mtpdevice,foldername,mtp_current_filter_id); #endif mtp_initialize_folders(); rebuild_datafile_list(folder); return; } #endif if (NJB_Create_Folder (pdedevice, jbmeta->folder, (u_int32_t *) &id) == -1) { // Error back off destroy_metadata_t(jbmeta); NJB_Error_Dump(pdedevice, stderr); create_error_dialog(_("The folder could not be created.\nThe most typical reason is that you are using a Nomad Jukebox 1\nwhich is too old to support folders.")); return; } jbmeta->path = g_strdup_printf("%" PRIguint32, id); /* Keep this in the global metadata file list! */ datafilelist = g_slist_append(datafilelist, (gpointer) jbmeta); // Redraw rebuild_datafile_list(folder); } gnomad2-2.9.6/src/xfer.h0000664000076400007640000000133011512614631011713 00000000000000/* xfer.h Transfer window widgets and callbacks, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef XFERH_INCLUDED #define XFERH_INCLUDED 1 void transfer_from_hd_to_jukebox(GList *playlists); GtkWidget *create_xfer_widgets(void); #endif gnomad2-2.9.6/src/Makefile.in0000664000076400007640000004235411602630254012655 00000000000000# Makefile.in generated by automake 1.11.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = gnomad2$(EXEEXT) @TAGLIB_COMPILE_TRUE@am__append_1 = tagfile.c tagfile.h subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am__gnomad2_SOURCES_DIST = id3read.c id3read.h gnomad2.c prefs.c \ prefs.h filenaming.c filenaming.h jukebox.c jukebox.h util.c \ util.h mp3file.c mp3file.h editmeta.c editmeta.h filesystem.c \ filesystem.h playlists.c playlists.h xfer.c xfer.h data.c \ data.h player.c player.h common.h metadata.c metadata.h \ wmaread.c wmaread.h riffile.c riffile.h tagfile.c tagfile.h @TAGLIB_COMPILE_TRUE@am__objects_1 = tagfile.$(OBJEXT) am_gnomad2_OBJECTS = id3read.$(OBJEXT) gnomad2.$(OBJEXT) \ prefs.$(OBJEXT) filenaming.$(OBJEXT) jukebox.$(OBJEXT) \ util.$(OBJEXT) mp3file.$(OBJEXT) editmeta.$(OBJEXT) \ filesystem.$(OBJEXT) playlists.$(OBJEXT) xfer.$(OBJEXT) \ data.$(OBJEXT) player.$(OBJEXT) metadata.$(OBJEXT) \ wmaread.$(OBJEXT) riffile.$(OBJEXT) $(am__objects_1) gnomad2_OBJECTS = $(am_gnomad2_OBJECTS) gnomad2_LDADD = $(LDADD) gnomad2_DEPENDENCIES = DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(gnomad2_SOURCES) DIST_SOURCES = $(am__gnomad2_SOURCES_DIST) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GN_CFLAGS = @GN_CFLAGS@ GN_LIBS = @GN_LIBS@ GREP = @GREP@ GUDEV_CFLAGS = @GUDEV_CFLAGS@ GUDEV_LIBS = @GUDEV_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ MTP_CFLAGS = @MTP_CFLAGS@ MTP_LIBS = @MTP_LIBS@ OBJEXT = @OBJEXT@ OSFLAGS = @OSFLAGS@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ TAGLIB_CFLAGS = @TAGLIB_CFLAGS@ TAGLIB_LIBS = @TAGLIB_LIBS@ TAG_CFLAGS = @TAG_CFLAGS@ TAG_LIBS = @TAG_LIBS@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_aux_dir = @ac_aux_dir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ MAINTAINERCLEANFILES = Makefile.in INCLUDES = \ @GN_CFLAGS@ \ @TAG_CFLAGS@ \ @MTP_CFLAGS@ \ @TAGLIB_CFLAGS@ \ @GUDEV_CFLAGS@ \ -DPREFIX=\"$(prefix)\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -DDATADIR=\"$(datadir)\" \ -DLIBDIR=\"$(libdir)\" \ -DPIXMAPSDIR=\""$(datadir)/pixmaps"\" LDADD = \ @GN_LIBS@ \ @TAG_LIBS@ \ @MTP_LIBS@ \ @TAGLIB_LIBS@ \ @GUDEV_LIBS@ gnomad2_SOURCES = id3read.c id3read.h gnomad2.c prefs.c prefs.h \ filenaming.c filenaming.h jukebox.c jukebox.h util.c util.h \ mp3file.c mp3file.h editmeta.c editmeta.h filesystem.c \ filesystem.h playlists.c playlists.h xfer.c xfer.h data.c \ data.h player.c player.h common.h metadata.c metadata.h \ wmaread.c wmaread.h riffile.c riffile.h $(am__append_1) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p; \ then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gnomad2$(EXEEXT): $(gnomad2_OBJECTS) $(gnomad2_DEPENDENCIES) @rm -f gnomad2$(EXEEXT) $(LINK) $(gnomad2_OBJECTS) $(gnomad2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/data.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/editmeta.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filenaming.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filesystem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gnomad2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/id3read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jukebox.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metadata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mp3file.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/player.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/playlists.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prefs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/riffile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tagfile.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmaread.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xfer.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gnomad2-2.9.6/src/prefs.h0000664000076400007640000000261111512614631012071 00000000000000/* prefs.h Graphical widgets and callbacks for the preferences frame header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PREFSH_INCLUDED #define PREFSH_INCLUDED 1 /* Get windows indicator macro */ #include /* Exported functions */ void write_prefs_file(void); gboolean get_prefs_tagoverride(void); gboolean get_prefs_tagremove(void); gboolean get_prefs_usetag(void); gboolean get_prefs_useid3_unicode(void); gboolean get_prefs_display_dotdirs(void); gboolean get_prefs_ask_playlist(void); gboolean get_prefs_recurse_dir(void); #ifndef G_OS_WIN32 gboolean get_prefs_force_8859(void); #endif gboolean get_prefs_detect_metadata(void); gboolean get_prefs_extended_metadata(void); gboolean get_prefs_use_origname(void); gboolean get_prefs_autoscan(void); gboolean get_prefs_set_time(void); gboolean get_prefs_turbo_mode(void); gchar *get_prefs_filenameformat(void); void create_prefs_widgets(GtkWidget *box); #endif gnomad2-2.9.6/src/gnomad2.c0000664000076400007640000004343711601623606012310 00000000000000/* gnomad2.c Main loop and GTK+ GUI setup file and callback functions Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "jukebox.h" #include "xfer.h" #include "data.h" #include "playlists.h" #include "prefs.h" #include "util.h" #ifdef HAVE_GUDEV #define G_UDEV_API_IS_SUBJECT_TO_CHANGE #include const char * const gudev_subsystems[] = { "usb", NULL }; GUdevClient *gudev_client; guint uevent_id; guint uevent_bus_hooked = 0; guint uevent_device_hooked = 0; #endif /* This one should be global really */ GtkWidget *main_window; /* Local variables */ static GdkPixbuf *icon_pixbuf; // The expose() event will be treated JUST ONCE at the first window creation static gboolean justonce = TRUE; /* Expect these functions */ void scan_jukebox(gpointer data); /* Response to DELETE event (window destruction) */ static gint delete(GtkWidget *widget, GtkWidget *event, gpointer data) { if (jukebox_locked) { create_error_dialog(_("Cannot quit! Jukebox is busy!")); return TRUE; } write_prefs_file(); jukebox_release(); gtk_main_quit(); return FALSE; } static GtkWidget *create_jukebox_menu(gchar **jukeboxes) { GtkWidget *combo; GtkWidget *menu; GSList *group = NULL; GtkWidget *menu_item; gint i; /* Create the option menu */ #if GTK_CHECK_VERSION(2,24,0) // Use the new combo box type in 2.24 and later combo = gtk_combo_box_text_new(); #else combo = gtk_combo_box_new_text(); #endif /* Add a row to the menu */ for (i = 0; i < vectorlength(jukeboxes); i++) { #if GTK_CHECK_VERSION(2,24,0) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), jukeboxes[i]); #else gtk_combo_box_append_text(GTK_COMBO_BOX(combo), jukeboxes[i]); #endif } gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); return combo; } static void create_select_jukebox_dialog(void) { gchar **jukeboxes; jukeboxes = jukebox_discover(); if (jukeboxes != NULL) { if (vectorlength(jukeboxes) > 1) { gint i; GtkWidget *label; // Build a selection menu GtkWidget *select_jukebox_dialog; GtkWidget *jukebox_menu; GtkWidget *content_area; select_jukebox_dialog = gtk_message_dialog_new(GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, _("Select jukebox")); jukebox_menu = create_jukebox_menu(jukeboxes); gtk_window_set_position (GTK_WINDOW(select_jukebox_dialog), GTK_WIN_POS_MOUSE); gtk_box_set_spacing (GTK_BOX(GTK_DIALOG(select_jukebox_dialog)->vbox), 5); label = gtk_label_new(_("Select jukebox to operate:")); #if GTK_CHECK_VERSION(2,14,0) content_area = gtk_dialog_get_content_area(GTK_DIALOG(select_jukebox_dialog)); gtk_container_add(GTK_CONTAINER(content_area), label); gtk_widget_show(label); gtk_container_add(GTK_CONTAINER(content_area), jukebox_menu); gtk_widget_show(jukebox_menu); #else gtk_box_pack_start(GTK_BOX(GTK_DIALOG(select_jukebox_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(select_jukebox_dialog)->vbox), jukebox_menu, TRUE, TRUE, 0); gtk_widget_show(jukebox_menu); #endif gtk_widget_show_all(select_jukebox_dialog); i = gtk_dialog_run(GTK_DIALOG(select_jukebox_dialog)); if (i == GTK_RESPONSE_OK) { guint selection; selection = gtk_combo_box_get_active(GTK_COMBO_BOX(jukebox_menu)); gtk_widget_destroy(select_jukebox_dialog); // Select the first jukebox if (jukebox_select(selection)) { // Initially scan the jukebox scan_jukebox(NULL); } } else { gtk_widget_destroy(select_jukebox_dialog); } } else { // Select the first jukebox if (jukebox_select(0)) { // Initially scan the jukebox scan_jukebox(NULL); } } } } /* Run at startup from the idle thread */ static gboolean startup_actions(gpointer p) { if (justonce) { justonce = FALSE; if (get_prefs_autoscan()) { // This will be treated JUST ONCE at the first window creation create_select_jukebox_dialog(); } if (get_prefs_set_time()) { if (jukebox_selected() && !jukebox_locked) { jukebox_synchronize_time(); } } } return FALSE; } /* The about box */ static void about_box(gpointer data) { const gchar *authors[] = {"Linus Walleij - main code, parts of libnjb and libmtp", "John Mechalas (Seagull) - libnjb", "César Talón - Jukebox 3 examinations", "Richard A. Low - initial MTP work and libmtp", NULL}; const gchar *copystring = "Copyright (C) 2011 Linus Walleij"; gchar *aboutstring = _("A program to communicate with\nCreative Jukeboxes\nand MTP devices"); gchar *translator_credits = _("translator_credits"); GtkWidget *about; about = gtk_about_dialog_new(); gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(about), PACKAGE); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(about), VERSION); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(about), copystring); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(about), aboutstring); gtk_about_dialog_set_license(GTK_ABOUT_DIALOG(about), "GPL 2+"); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(about), "http://gnomad2.sourceforge.net/"); gtk_about_dialog_set_website_label(GTK_ABOUT_DIALOG(about), "Gnomad Homepage"); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(about), authors); if (strcmp(translator_credits, "translator_credits")) { gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(about), translator_credits); } gtk_dialog_run(GTK_DIALOG(about)); gtk_widget_destroy(about); } /* * Scan the jukebox for files */ void scan_jukebox(gpointer data) { GtkWidget *label, *dialog; static scan_thread_arg_t scan_thread_args; if (!jukebox_selected()) { create_select_jukebox_dialog(); return; } if (jukebox_locked) { create_error_dialog(_("Jukebox busy")); return; } jukebox_locked = TRUE; cancel_jukebox_operation = FALSE; dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, _("Scanning jukebox library")); gtk_window_set_title (GTK_WINDOW (dialog), _("Retrieving metadata from jukebox")); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(cancel_jukebox_operation_click), NULL, 0); g_signal_connect_object(GTK_OBJECT(dialog), "response", G_CALLBACK(cancel_jukebox_operation_click), NULL, 0); /* A blank label for progress messages */ label = gtk_label_new(""); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show_all(dialog); /* A bunch of arguments needed by the scanning thread */ scan_thread_args.dialog = dialog; scan_thread_args.label = label; scan_thread_args.pltreestore = playlist_widgets.pltreestore; g_thread_create(scan_thread,(gpointer) &scan_thread_args, FALSE, NULL); return; } /* A dialog to select the owner */ static void set_jukeboxowner_dialog(gpointer data) { GtkWidget *label; gchar *ownerstring; GtkWidget *jukeboxowner_dialog; GtkWidget *jukeboxowner_entry; gint i; gchar *owner; if (!jukebox_selected()) { create_select_jukebox_dialog(); return; } jukeboxowner_dialog = gtk_message_dialog_new (GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_OK_CANCEL, _("Set owner string")); gtk_box_set_spacing (GTK_BOX(GTK_DIALOG(jukeboxowner_dialog)->vbox), 5); label = gtk_label_new(_("Edit the owner of this jukebox:")); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(jukeboxowner_dialog)->vbox), label, TRUE, TRUE, 0); gtk_widget_show(label); jukeboxowner_entry = gtk_entry_new(); ownerstring = jukebox_get_ownerstring(); if (ownerstring != NULL) gtk_entry_set_text(GTK_ENTRY(jukeboxowner_entry), ownerstring); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(jukeboxowner_dialog)->vbox), jukeboxowner_entry, TRUE, TRUE, 0); gtk_widget_show(jukeboxowner_entry); gtk_widget_show_all(jukeboxowner_dialog); i = gtk_dialog_run(GTK_DIALOG(jukeboxowner_dialog)); if (i == GTK_RESPONSE_OK) { if (jukebox_locked) { create_error_dialog(_("Jukebox busy - change discarded")); return; } owner = g_strdup(gtk_entry_get_text(GTK_ENTRY(jukeboxowner_entry))); jukebox_set_ownerstring(owner); g_free(owner); gtk_widget_destroy(jukeboxowner_dialog); } else { gtk_widget_destroy(jukeboxowner_dialog); } } static void information_dialog(gpointer data) { GtkWidget *dialog; if (jukebox_locked) { create_error_dialog(_("Cannot view information! Jukebox is busy!")); return; } dialog = jukebox_get_deviceinfo_dialog(); if (dialog != NULL) { gtk_widget_show(dialog); } else { create_error_dialog(_("Cannot retrieve jukebox information!")); } } #ifdef HAVE_GUDEV static guint get_property_as_int(GUdevDevice *device, const char *property, int base) { const char *strvalue; strvalue = g_udev_device_get_property(device, property); if (strvalue == NULL) { return 0; } return strtol(strvalue, NULL, base); } static void uevent_cb(GUdevClient *client, const char *action, GUdevDevice *device, void *data) { guint64 devicenum; guint vendor; guint model; guint busnum; guint devnum; guint mtpdevice; guint njbdevice; devicenum = (guint64) g_udev_device_get_device_number(device); g_print("%s event for %s (%"G_GINT64_MODIFIER"x)", action, g_udev_device_get_sysfs_path (device), devicenum); /* get device info */ vendor = get_property_as_int(device, "ID_VENDOR_ID", 16); model = get_property_as_int(device, "ID_MODEL_ID", 16); busnum = get_property_as_int(device, "BUSNUM", 10); devnum = get_property_as_int(device, "DEVNUM", 10); mtpdevice = get_property_as_int(device, "ID_MTP_DEVICE", 10); njbdevice = get_property_as_int(device, "ID_LIBNJB_DEVICE", 10); if (vendor == 0 || model == 0) { g_print("couldn't get vendor or model ID for device at (%x:%x)\n", busnum, devnum); return; } else { g_print("vendor = %x, model = %x, bus = %x, device = %x\n", vendor, model, busnum, devnum); } if (mtpdevice || njbdevice) { g_print("device is MTP or libnjb compliant\n"); if (g_str_equal(action, "add")) { // If we haven't yet selected a jukebox, take this one! if (uevent_bus_hooked == 0 && uevent_device_hooked == 0 && !jukebox_selected()) { g_print("Unhooked, hook this device!\n"); uevent_bus_hooked = busnum; uevent_device_hooked = devnum; scan_jukebox(NULL); } } else if (g_str_equal (action, "remove")) { if (uevent_bus_hooked == busnum && uevent_device_hooked == devnum) { g_print("Found hooked device, unhook this device!\n"); jukebox_release(); uevent_bus_hooked = 0; uevent_device_hooked = 0; } } } } #endif /* * And this is where everything starts, everything graphic is initialized etc */ int main(int argc, char *argv[]) { const gchar cProgramName[]= PACKAGE " " VERSION; /* For the menus */ GtkWidget *menu; GtkWidget *menu_bar; GtkWidget *root_menu; GtkWidget *menu_item; GtkWidget *music_panel; GtkWidget *data_panel; GtkWidget *vbox, *prefshbox; // GtkWidget *hbox; GtkWidget *notebook; GtkWidget *label; GtkAccelGroup *accel_group; extern char *optarg; gint opt; GError *icon_load_error = NULL; /* Binds for internationalization (i18n) */ bindtextdomain (GETTEXT_PACKAGE, GNOMADLOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); g_thread_init(NULL); gtk_init(&argc, &argv); /* Parse extra arguments */ gnomad_debug = 0; while ((opt = getopt(argc, argv, "D:")) != -1 ) { switch (opt) { case 'D': gnomad_debug = atoi(optarg); break; default: break; } } main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (main_window), cProgramName); icon_pixbuf = gdk_pixbuf_new_from_file(PIXMAPSDIR "/gnomad2-logo.png", &icon_load_error); if (icon_pixbuf != NULL) { gtk_window_set_default_icon(icon_pixbuf); } gtk_window_set_wmclass(GTK_WINDOW(main_window), PACKAGE, "main"); gtk_widget_set_usize(GTK_WIDGET(main_window), 640, 480); g_signal_connect(GTK_OBJECT(main_window), "delete_event", G_CALLBACK(delete), NULL); gtk_container_set_border_width (GTK_CONTAINER (main_window), 0); /* Create metadata list stores */ create_list_stores(); /* Create a GtkAccelGroup and add it to the window. */ accel_group = gtk_accel_group_new(); gtk_window_add_accel_group (GTK_WINDOW (main_window), accel_group); /* Stuff everything into a vertical box */ vbox = gtk_vbox_new(FALSE, 5); gtk_container_set_border_width(GTK_CONTAINER(vbox), 0); gtk_container_add(GTK_CONTAINER(main_window), vbox); gtk_widget_show(vbox); /* Create the menu bar */ menu_bar = gtk_menu_bar_new (); gtk_widget_show (menu_bar); gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 0); menu = gtk_menu_new (); // Shall not be shown! menu_item = gtk_menu_item_new_with_label(_("Quit")); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menu_item); gtk_widget_add_accelerator (menu_item, "activate", accel_group, GDK_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); g_signal_connect(GTK_OBJECT(menu_item), "activate", G_CALLBACK(delete), NULL); gtk_widget_show(menu_item); root_menu = gtk_menu_item_new_with_label(_("File")); gtk_widget_show(root_menu); gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu); gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu); /* Create a new notebook, place the position of the tabs */ notebook = gtk_notebook_new(); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); gtk_widget_show(notebook); /* * Prefs tab */ prefshbox = gtk_hbox_new(FALSE, 0); gtk_widget_show (prefshbox); /* Put preferences in the hbox */ create_prefs_widgets(prefshbox); // gtk_box_pack_start(GTK_BOX(hbox), transfer_widgets.playlistmenu, TRUE, TRUE, 0); /* * Music transfer tab */ music_panel = create_xfer_widgets(); label = gtk_label_new(_("Music transfer")); gtk_notebook_append_page (GTK_NOTEBOOK(notebook), music_panel, label); /* * Playlists tab * This is an option menu wih playlist that is filled in * by the scanning function */ vbox=gtk_vbox_new(FALSE, 0); create_playlist_widgets(vbox); gtk_widget_show(vbox); label = gtk_label_new (_("Playlists")); gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label); /* * Data file transfer tab */ data_panel = create_data_widgets(); label = gtk_label_new (_("Data transfer")); gtk_notebook_append_page (GTK_NOTEBOOK(notebook), data_panel, label); /* Add prefs tab */ label = gtk_label_new (_("Preferences")); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), prefshbox, label); /* Set what page to start at (page 4) */ gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0); menu = gtk_menu_new (); // Shall not be shown! menu_item = gtk_menu_item_new_with_label (_("Rescan contents")); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menu_item); gtk_widget_add_accelerator (menu_item, "activate", accel_group, GDK_r, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); g_signal_connect(GTK_OBJECT (menu_item), "activate", G_CALLBACK(scan_jukebox), NULL); gtk_widget_show(menu_item); menu_item = gtk_menu_item_new_with_label(_("Set owner string")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); g_signal_connect(GTK_OBJECT (menu_item), "activate", G_CALLBACK(set_jukeboxowner_dialog), NULL); gtk_widget_show (menu_item); menu_item = gtk_menu_item_new_with_label (_("Jukebox information")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); gtk_widget_add_accelerator (menu_item, "activate", accel_group, GDK_i, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); g_signal_connect(GTK_OBJECT(menu_item), "activate", G_CALLBACK(information_dialog), NULL); gtk_widget_show (menu_item); root_menu = gtk_menu_item_new_with_label (_("Jukebox library")); gtk_widget_show (root_menu); gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu); gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu); menu = gtk_menu_new(); // Shall not be shown! menu_item = gtk_menu_item_new_with_label (_("About")); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); g_signal_connect(GTK_OBJECT (menu_item), "activate", G_CALLBACK(about_box), NULL); gtk_widget_show (menu_item); root_menu = gtk_menu_item_new_with_label (_("Help")); gtk_widget_show (root_menu); gtk_menu_item_set_right_justified(GTK_MENU_ITEM(root_menu), TRUE); gtk_menu_item_set_submenu(GTK_MENU_ITEM(root_menu), menu); gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), root_menu); #ifdef HAVE_GUDEV /* * Monitor udev device events - we're only really interested in events * for USB devices. */ gudev_client = g_udev_client_new(gudev_subsystems); uevent_id = g_signal_connect_object(gudev_client, "uevent", G_CALLBACK(uevent_cb), NULL, 0); #endif gtk_widget_show(main_window); g_idle_add(startup_actions, NULL); gtk_main(); return 0; } gnomad2-2.9.6/src/playlists.h0000664000076400007640000000150211512614631012774 00000000000000/* playlists.h Playlist GUI and call handling, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef PLAYLISTSH_INCLUDED #define PLAYLISTSH_INCLUDED 1 /* Exported functions */ void jbmenu_add_playlist_response(gpointer data); void transfer_from_hd_dialog (GtkButton *inbutton, gpointer data); void create_playlist_widgets(GtkWidget *box); #endif gnomad2-2.9.6/src/wmaread.h0000664000076400007640000000123211512614631012370 00000000000000/* wmaread.h WMA interface, headers Copyright (C) 2004 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef WMAHEADER_INCLUDED #define WMAHEADER_INCLUDED 1 void get_tag_for_wmafile (metadata_t *meta); #endif gnomad2-2.9.6/src/jukebox.h0000664000076400007640000000715011512614631012424 00000000000000/* jukebox.h Functions related to the communication with jukebox hardware using the libnjb library, header file Copyright (C) 2001-2007 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef JUKEBOXH_INCLUDED #define JUKEBOXH_INCLUDED 1 /* * The jukebox library is included into all files * using this file */ #include /* * libmtp is included conditionally. */ #ifdef HAVE_LIBMTP #include #endif #include "metadata.h" typedef struct { GtkWidget *dialog; GtkWidget *label; GtkTreeStore *pltreestore; } scan_thread_arg_t; typedef struct { GtkWidget *dialog; GtkWidget *label; GList *metalist; } jb2hd_thread_arg_t; typedef struct { GtkWidget *dialog; GtkWidget *label; GList *metalist; } jb2hd_data_thread_arg_t; typedef struct { GtkWidget *dialog; GtkWidget *label; GtkTreeStore *pltreestore; GList *metalist; GList *playlists; } hd2jb_thread_arg_t; typedef struct { GtkWidget *dialog; GtkWidget *label; GList *metalist; } hd2jb_data_thread_arg_t; typedef struct { GtkWidget *dialog; GtkWidget *songlabel; GtkWidget *timelabel; GtkAdjustment *adj; GList *metalist; } play_thread_arg_t; typedef struct { gchar *name; gchar *plid; GSList *tracklist; } gnomadplaylist_entry_t; /* Exported functions */ gchar **jukebox_discover(void); gboolean jukebox_select(gint i); gboolean jukebox_selected(void); gboolean jukebox_is_mtp(void); GtkWidget *jukebox_get_deviceinfo_dialog(void); void cancel_jukebox_operation_click(GtkButton *button, gpointer data); void jukebox_release(void); void rebuild_datafile_list(gchar *filter); gpointer scan_thread(gpointer thread_args); gpointer jb2hd_thread(gpointer thread_args); gpointer jb2hd_data_thread(gpointer thread_args); gpointer hd2jb_thread(gpointer thread_args); gpointer hd2jb_data_thread(gpointer thread_args); void jukebox_delete_tracks(GList *metalist, GtkTreeStore *pltreestore); void jukebox_delete_files(GList *metalist); gboolean jukebox_begin_metadata_set(void); void jukebox_set_metadata (metadata_t *meta); void jukebox_end_metadata_set(void); guint32 jukebox_create_playlist(gchar *plname, GtkTreeStore *pltreestore); void jukebox_delete_playlist(guint32 plid); void jukebox_rename_playlist(guint32 plid, gchar *name, GtkTreeStore *pltreestore); void add_tracks_to_playlists(GList *playlists, GList *metalist); void build_playlist_tree(void); guint jukebox_randomize_playlist(guint playlist, GtkTreeStore *pltreestore); guint jukebox_delete_track_from_playlist(guint32 trackid, guint32 plist, GtkTreeStore *pltreestore); gchar *jukebox_get_ownerstring(void); void jukebox_set_ownerstring(gchar *owner); gchar *jukebox_get_time(void); void jukebox_reset_get_eax(void); njb_eax_t *jukebox_get_eax(void); void jukebox_destroy_eax(njb_eax_t *eax); void jukebox_adjust_eax(guint16 effect, guint16 patch, gint16 value); GList *jukebox_get_playlist_for_play(guint plid); metadata_t *jukebox_get_current_playing_metadata(void); void jukebox_skip_songposition(guint songpos); void jukebox_previous(void); void jukebox_next(gboolean already_playing); gpointer play_thread(gpointer thread_args); void jukebox_synchronize_time(void); void jukebox_create_folder(gchar *foldername); #endif gnomad2-2.9.6/src/editmeta.c0000664000076400007640000005154511573771171012565 00000000000000/* editmeta.c Edit metadata for an mp3- or similar file Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "filesystem.h" #include "jukebox.h" #include "xfer.h" #include "util.h" #include "id3read.h" #include "prefs.h" #ifdef HAVE_TAGLIB #include "tagfile.h" #endif static listtype_t target; static GtkWidget *edit_dialog; static GtkWidget *edit_dialog_msglabel; static GtkTreeSelection *selection; static GList *metalist = NULL; static gchar *artist; static gchar *title; static gchar *album; static gchar *year; static gchar *genre; static gchar *length; static gchar *trackno; static gchar *origfname; static gchar *folder; static gchar *protect; static gchar *ret_nonull(gchar *retval) { if (retval == NULL) { return g_strdup(""); } else { return g_strdup(retval); } } static gchar *metalist_get_column(GList *metalist, gint column) { if (g_list_length(metalist) == 0) return NULL; else { /* We all assume file data */ metadata_t *meta = (metadata_t *) metalist->data; switch (column) { case TRACKLIST_ARTIST_COLUMN: return ret_nonull(meta->artist); case TRACKLIST_TITLE_COLUMN: return ret_nonull(meta->title); case TRACKLIST_ALBUM_COLUMN: return ret_nonull(meta->album); case TRACKLIST_YEAR_COLUMN: /* Convert to string and return */ return g_strdup_printf("%" PRIguint32,meta->year); case TRACKLIST_GENRE_COLUMN: return ret_nonull(meta->genre); case TRACKLIST_LENGTH_COLUMN: return g_strdup(meta->length); case TRACKLIST_SIZE_COLUMN: /* Convert to string and return */ return g_strdup_printf("%lu", meta->size); case TRACKLIST_CODEC_COLUMN: return ret_nonull(meta->codec); case TRACKLIST_TRACKNO_COLUMN: /* Convert to string and return */ return g_strdup_printf("%" PRIguint32,meta->trackno); case TRACKLIST_PROTECTED_COLUMN: return g_strdup_printf("%s", meta->protect ? _("YES") : _("NO")); case TRACKLIST_FILENAME_COLUMN: return ret_nonull(meta->filename); case TRACKLIST_ID_COLUMN: /* Only for TRACKLIST */ return ret_nonull(meta->path); case TRACKLIST_FOLDER_COLUMN: return ret_nonull(meta->folder); default: return NULL; } } } static int nullcmp(gchar *one, gchar *two) { if (one == NULL || two == NULL) return 1; else return strcmp(one, two); } static void edit_ok_click ( GtkButton *button, gpointer data ) { if (target == JB_LIST) { if (jukebox_locked) { create_error_dialog(_("Jukebox is busy.\nCannot edit metadata now.")); gtk_grab_remove(edit_dialog); gtk_widget_destroy(edit_dialog); if (metalist != NULL) { destroy_metalist(metalist); } metalist = NULL; return; } if (!jukebox_begin_metadata_set()) { gtk_grab_remove(edit_dialog); gtk_widget_destroy(edit_dialog); if (metalist != NULL) { destroy_metalist(metalist); } metalist = NULL; return; } } /* Remove all selected entries from the list store */ remove_selected(target); while (metalist) { metadata_t *meta; metadata_t *newmeta; gboolean changed; meta = (metadata_t *) metalist->data; newmeta = clone_metadata_t(meta); changed = FALSE; if (artist != NULL && strlen(artist) && nullcmp(artist, meta->artist)) { changed = TRUE; g_free(newmeta->artist); newmeta->artist = g_strdup(artist); } if (title != NULL && strlen(title) && nullcmp(title, meta->title)) { changed = TRUE; g_free(newmeta->title); newmeta->title = g_strdup(title); } if (album != NULL && strlen(album) && nullcmp(album, meta->album)) { changed = TRUE; g_free(newmeta->album); newmeta->album = g_strdup(album); } if (genre != NULL && strlen(genre) && nullcmp(genre, meta->genre)) { changed = TRUE; g_free(newmeta->genre); newmeta->genre = g_strdup(genre); } if (length != NULL && strlen(length) && nullcmp(length, meta->length)) { changed = TRUE; g_free(newmeta->length); newmeta->length = g_strdup(length); } if (trackno != NULL && strlen(trackno) && string_to_guint32(trackno) != meta->trackno) { changed = TRUE; newmeta->trackno = string_to_guint32(trackno); } if (origfname != NULL && strlen(origfname) && nullcmp(origfname, meta->filename)) { changed = TRUE; g_free(newmeta->filename); newmeta->filename = g_strdup(origfname); } if (folder != NULL && strlen(folder) && nullcmp(folder, meta->folder)) { changed = TRUE; g_free(newmeta->folder); newmeta->folder = g_strdup(folder); } if (year != NULL && strlen(year) && string_to_guint32(year) != meta->year) { changed = TRUE; newmeta->year = string_to_guint32(year); } if (changed) { /* Write the new tag */ gchar tmp[512]; /* First is artist, second is title */ sprintf(tmp, _("Updating metadata on %s - %s"), newmeta->artist, newmeta->title); gtk_label_set_text(GTK_LABEL(edit_dialog_msglabel), tmp); /* Make sure the dialog is updated */ while (gtk_events_pending()) gtk_main_iteration(); if (target == HD_LIST) { /* * g_print("Updating: %s\n", newmeta->path); * dump_metadata_t(newmeta); */ if(!strcmp(newmeta->codec, "MP3")) #if defined(HAVE_TAGLIB) && defined(TAGLIB_ONLY) set_tag_for_file(newmeta, TRUE); #else set_tag_for_mp3file(newmeta, TRUE); #endif #ifdef HAVE_TAGLIB else if(!strcmp(newmeta->codec, "OGG") || !strcmp(newmeta->codec, "FLAC")) set_tag_for_file(newmeta, TRUE); #endif } else { /* * g_print("Updating: %s\n", newmeta->path); * dump_metadata_t(newmeta); */ jukebox_set_metadata(newmeta); } } add_metadata_to_model(newmeta, target); destroy_metadata_t(newmeta); metalist = metalist->next; } gtk_label_set_text(GTK_LABEL(edit_dialog_msglabel), ""); if (target == JB_LIST) { jukebox_end_metadata_set(); } /* There is strictly no reason ro re-read the directory, so why are we doing it? In the past because we could not trust id3lib, so this is to be certain the correct metadata is displayed. if (target == HD_LIST) { fill_in_dir(HD_LIST, get_current_dir()); } */ gtk_grab_remove(edit_dialog); gtk_widget_destroy(edit_dialog); if (metalist != NULL) { destroy_metalist(metalist); } metalist = NULL; } /* This is needed to free up some memory used by the edit dialog */ static void edit_cancel_click ( GtkButton *button, gpointer data ) { gtk_grab_remove(edit_dialog); gtk_widget_destroy(edit_dialog); if (metalist != NULL) { destroy_metalist(metalist); } metalist = NULL; } static void entry_edit_callback(GtkWidget *entry, gpointer data) { gchar **string; string = (gchar **) data; *string = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); /* printf("Entry changed to: %s\n", *string); */ } static gboolean all_strings_same(GList *metalist, gint column) { GList *tmplist = metalist; gchar *firstval; if (g_list_length(metalist) < 2) return TRUE; firstval = metalist_get_column(metalist, column); tmplist = tmplist->next; while (tmplist != NULL) { gchar *secondval = metalist_get_column(tmplist, column); if (nullcmp(firstval, secondval)) { g_free(firstval); g_free(secondval); return FALSE; } g_free(secondval); tmplist = tmplist->next; } g_free(firstval); return TRUE; } static void add_to_dialog(GtkWidget *dialog, GtkWidget *thing) { gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), thing, TRUE, TRUE, 0); } /* Editing the metadata... */ static void edit_dialog_create(void) { GtkWidget *hbox, *label, *dialog, *tempwid, *entry; if (target == JB_LIST) { dialog = gtk_dialog_new_with_buttons(_("Edit jukebox file metadata"), NULL, 0, NULL); } else { dialog = gtk_dialog_new_with_buttons(_("Edit track metadata"), NULL, 0, NULL); } tempwid = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, 0); g_signal_connect (tempwid, "clicked", G_CALLBACK (edit_cancel_click), NULL); tempwid = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_OK, 1); g_signal_connect (tempwid, "clicked", G_CALLBACK (edit_ok_click), NULL); edit_dialog = dialog; /* Add the metadata edit field for the dialog box */ hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Artist:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); if (all_strings_same(metalist, TRACKLIST_ARTIST_COLUMN)) { artist = metalist_get_column(metalist, TRACKLIST_ARTIST_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), artist); g_free(artist); } artist = (gchar*) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &artist); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); /* We may want to edit the title only if one file is selected... */ if (g_list_length(metalist) == 1) { hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Title:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); title = metalist_get_column(metalist, TRACKLIST_TITLE_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), title); g_free(title); title = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &title); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Album:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); if (all_strings_same(metalist, TRACKLIST_ALBUM_COLUMN)) { album = metalist_get_column(metalist, TRACKLIST_ALBUM_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), album); g_free(album); } album = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &album); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Year:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); /* 5 but does not work... */ if (all_strings_same(metalist, TRACKLIST_YEAR_COLUMN)) { year = metalist_get_column(metalist, TRACKLIST_YEAR_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), year); g_free(year); } year = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &year); /* Alignment widget for left alignments */ gtk_widget_show(entry); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 0); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Genre:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); /* 30 but does not work... */ if (all_strings_same(metalist, TRACKLIST_GENRE_COLUMN)) { genre = metalist_get_column(metalist, TRACKLIST_GENRE_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), genre); g_free(genre); } genre = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &genre); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); /* If there was only one file selected we may edit the play length */ if (g_list_length(metalist) == 1) { hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Length:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); /* 6 but does not work... */ if (all_strings_same(metalist, TRACKLIST_LENGTH_COLUMN)) { length = metalist_get_column(metalist, TRACKLIST_LENGTH_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), length); g_free(length); } length = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &length); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } /* If there was only one file selected we may show the track number */ if (g_list_length(metalist) == 1) { hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Track number:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); /* 3 but does not work... */ trackno = metalist_get_column(metalist, TRACKLIST_TRACKNO_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), trackno); g_free(trackno); trackno = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &trackno); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } /* If there was only one file selected we may show the original filename */ if (g_list_length(metalist) == 1 && get_prefs_extended_metadata()) { hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Original filename:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); origfname = metalist_get_column(metalist, TRACKLIST_FILENAME_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), origfname); g_free(origfname); origfname = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &origfname); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } /* If there was only one file selected we may show the folder name */ if (g_list_length(metalist) == 1 && get_prefs_extended_metadata()) { hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Folder:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_empty_hbox(hbox); entry = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(entry), 45); folder = metalist_get_column(metalist, TRACKLIST_FOLDER_COLUMN); gtk_entry_set_text(GTK_ENTRY(entry), folder); g_free(folder); folder = (gchar *) gtk_entry_get_text(GTK_ENTRY(entry)); g_signal_connect(GTK_OBJECT(entry), "changed", G_CALLBACK(entry_edit_callback), (gpointer) &folder); gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, TRUE, 0); gtk_widget_show(entry); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } /* Protection */ if (g_list_length(metalist) == 1) { GtkWidget *checkbox = gtk_check_button_new_with_label(_("Protected")); gtk_widget_set_sensitive(GTK_WIDGET(checkbox), FALSE); hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), checkbox, FALSE, FALSE, 0); protect = metalist_get_column(metalist, TRACKLIST_PROTECTED_COLUMN); if (!strcmp(protect,_("YES"))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), TRUE); } g_free(protect); gtk_widget_show(checkbox); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); } /* Show codec type if it is the same for all files */ if (all_strings_same(metalist, TRACKLIST_CODEC_COLUMN)) { gchar *tmpcodec = metalist_get_column(metalist, TRACKLIST_CODEC_COLUMN); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("Codec:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); label = gtk_label_new(tmpcodec); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); g_free(tmpcodec); } /* Show size if only one file is selected */ if (g_list_length(metalist) == 1) { gchar *tmpfilesize = metalist_get_column(metalist, TRACKLIST_SIZE_COLUMN); hbox = gtk_hbox_new (FALSE, 0); label = gtk_label_new(_("File size:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); label = gtk_label_new(tmpfilesize); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); g_free(tmpfilesize); } /* If there was only one file selected we may show the path/trackid */ if (g_list_length(metalist) == 1) { gchar *tmpid = metalist_get_column(metalist, TRACKLIST_ID_COLUMN); hbox = gtk_hbox_new (FALSE, 0); if (target == JB_LIST) label = gtk_label_new(_("File ID:")); else label = gtk_label_new(_("Path:")); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); label = gtk_label_new(tmpid); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_widget_show (label); add_to_dialog(dialog , hbox); gtk_widget_show (hbox); g_free(tmpid); } /* Label for displaying tagging messages */ label = gtk_label_new(""); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); edit_dialog_msglabel = label; add_to_dialog(dialog, label); gtk_widget_show (label); gtk_widget_show (dialog); /* grab focus */ gtk_grab_add (dialog); } /* Removes any directories from a selection */ static GList *filter_for_editing(GList *metadatas, guint listtype) { GList *tmp = metadatas; GList *newmetas = NULL; if (metadatas == NULL) { return NULL; } while (tmp) { metadata_t *meta = (metadata_t *) tmp->data; if (meta->size == 0) { /* Throw this away */ destroy_metadata_t(meta); } else if ( (listtype == HD_LIST) && strcmp(meta->codec, "MP3") #ifdef HAVE_TAGLIB && strcmp(meta->codec, "OGG") && strcmp(meta->codec, "FLAC") #endif ) { // If on the host side, we can only edit MP3 ID3v1/v2 plug OGG/FLAC // metadata, so filter out anything else. destroy_metadata_t(meta); } else { /* Keep this */ newmetas = g_list_append (newmetas, meta); } tmp = g_list_next(tmp); } g_list_free(metadatas); return newmetas; } static void prepare_dialog(guint listtype) { /* This is for the harddisk list only */ GList *metadatas = get_all_metadata_from_selection(listtype); metadatas = filter_for_editing(metadatas, listtype); selection = get_metadata_selection(listtype); artist = NULL; title = NULL; album = NULL; year = NULL; genre = NULL; length = NULL; trackno = NULL; origfname = NULL; folder = NULL; protect = NULL; if (metadatas == NULL) return; metalist = metadatas; // Create the editing dialog if (g_list_length(metalist) > 0) edit_dialog_create(); } /* Response to the "edit" call from the harddisk popup menu */ void hdmenu_edit_response(gpointer data) { target = HD_LIST; prepare_dialog(target); } /* Response to the "edit" call from the jukebox popup menu */ void jbmenu_edit_response(gpointer data) { target = JB_LIST; prepare_dialog(target); } gnomad2-2.9.6/src/wmaread.c0000664000076400007640000004270311573774634012414 00000000000000/* wmaread.c WMA interface Copyright (C) 2004-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Much of the code in this file was derived from the getid3() code, written in PHP. The C implementation here is however made from scratch. */ #include "common.h" #include "metadata.h" #include "filesystem.h" #include "util.h" #include #include #include #include #include #include static gboolean guid_compare(guchar *guid1, guchar *guid2) { gboolean retval = TRUE; guint i; for (i = 0; i < 16; i++) { if (guid1[i] != guid2[i]) { retval = FALSE; break; } } return retval; } static void get_ucs2_string(const guchar *in, guint length, gchar **out) { // Some fixes to aviod problems on big-endian systems. gunichar2 tmp[256]; guint i, j; // Copy the string, beware of buffer overflows j = 0; for (i = 0; i < length && i < 510; i+=2) { tmp[j] = (gunichar2) (in[i+1] << 8) | in[i]; j++; } *out = g_utf16_to_utf8(tmp, j, NULL, NULL, NULL); } static void parse_content_description(guchar *data, guint size, metadata_t *meta) { // This extracts some metadata from the content description object // Content Description Object: (optional, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for Content Description object - GETID3_ASF_Content_Description_Object // Object Size QWORD 64 // size of Content Description object, including 34 bytes of Content Description Object header // Title Length WORD 16 // number of bytes in Title field // Author Length WORD 16 // number of bytes in Author field // Copyright Length WORD 16 // number of bytes in Copyright field // Description Length WORD 16 // number of bytes in Description field // Rating Length WORD 16 // number of bytes in Rating field // Title WCHAR 16 // array of Unicode characters - Title // Author WCHAR 16 // array of Unicode characters - Author // Copyright WCHAR 16 // array of Unicode characters - Copyright // Description WCHAR 16 // array of Unicode characters - Description // Rating WCHAR 16 // array of Unicode characters - Rating guint title_length = (data[25] << 8) + data[24]; guint author_length = (data[27] << 8) + data[26]; // guint copyright_length = (data[29] << 8) + data[28]; // guint description_length = (data[31] << 8) + data[30]; // guint rating_length = (data[33] << 8) + data[32]; guint offset = 34; // Points to first string if ((title_length > 0) && (meta->title == NULL)) { get_ucs2_string(&data[offset], title_length, &meta->title); // g_print("Found title: %s\n", meta->title); } offset += title_length; if ((offset < size) && (author_length > 0) && (meta->artist == NULL)) { get_ucs2_string(&data[offset], author_length, &meta->artist); // g_print("Found author/artist: %s\n", meta->artist); } // Skip the other fields. offset += author_length; return; } static void parse_extended_content_description(guchar *data, guint size, metadata_t *meta) { // Extended Content Description Object: (optional, one only) // Field Name Field Type Size (bits) Offset // Object ID GUID 128 0 // GUID for Extended Content Description object - GETID3_ASF_Extended_Content_Description_Object // Object Size QWORD 64 16 // size of ExtendedContent Description object, including 26 bytes of Extended Content Description Object header // Content Descriptors Count WORD 16 24 // number of entries in Content Descriptors list // Content Descriptors array of: variable 26 // // * Descriptor Name Length WORD 16 // size in bytes of Descriptor Name field // * Descriptor Name WCHAR variable // array of Unicode characters - Descriptor Name // * Descriptor Value Data Type WORD 16 // Lookup array: // 0x0000 = Unicode String (variable length) // 0x0001 = BYTE array (variable length) // 0x0002 = BOOL (DWORD, 32 bits) // 0x0003 = DWORD (DWORD, 32 bits) // 0x0004 = QWORD (QWORD, 64 bits) // 0x0005 = WORD (WORD, 16 bits) // * Descriptor Value Length WORD 16 // number of bytes stored in Descriptor Value field // * Descriptor Value variable variable // value for Content Descriptor guint descriptors = (data[25] << 8) + data[24]; guint offset = 26; // g_print("%d descriptors\n", descriptors); while ((descriptors > 0) && (offset < size)) { guint desc_namelen; gchar *desc_name; guint desc_datatype; guint desc_datalen; desc_namelen = (data[offset+1] << 8) + data[offset]; offset += 2; get_ucs2_string(&data[offset], desc_namelen, &desc_name); offset += desc_namelen; desc_datatype = (data[offset+1] << 8) + data[offset]; offset += 2; desc_datalen = (data[offset+1] << 8) + data[offset]; offset += 2; if (desc_datatype == 0x0000) { // Unicode string. Let's look at it... gchar *desc_string = NULL; get_ucs2_string(&data[offset], desc_datalen, &desc_string); // g_print("Descriptor: %s, value=\'%s\'\n", desc_name, desc_string); if (!strcmp(desc_name, "WM/Genre") || !strcmp(desc_name, "Genre")) { if (meta->genre != NULL) { g_free(meta->genre); } meta->genre = desc_string; } else if(!strcmp(desc_name, "WM/AlbumArtist") || !strcmp(desc_name, "Artist")) { if (meta->artist != NULL) { g_free(meta->artist); } meta->artist = desc_string; } else if(!strcmp(desc_name, "WM/AlbumTitle") || !strcmp(desc_name, "Album")) { if (meta->album != NULL) { g_free(meta->album); } meta->album = desc_string; } else if(!strcmp(desc_name, "WM/Year") || !strcmp(desc_name, "Year")) { meta->year = string_to_guint32(desc_string); g_free(desc_string); } else if(!strcmp(desc_name, "WM/TrackNumber") || !strcmp(desc_name, "TrackNumber")) { meta->trackno = string_to_guint32(desc_string); g_free(desc_string); } else { g_free(desc_string); } } else if (desc_datatype == 0x0003) { guint desc_value = (data[offset+3] << 24) + (data[offset+2] << 16) + (data[offset+1] << 8) + data[offset]; if (!strcmp(desc_name, "WM/TrackNumber") || !strcmp(desc_name, "TrackNumber")) { meta->trackno = desc_value; } // This is only used unless something better is present. if (!strcmp(desc_name, "WM/Track") || !strcmp(desc_name, "Track")) { meta->trackno = desc_value; } } else { // g_print("Skipped descriptor: %s (type=%d,namelen=%lu,datalen=%lu)\n", desc_name, desc_datatype, desc_namelen, desc_datalen); } offset += desc_datalen; g_free(desc_name); descriptors--; } } static void parse_file_properties(guchar *data, guint size, metadata_t *meta) { // File Properties Object: (mandatory, one only) // Field Name Field Type Size (bits) Offset // Object ID GUID 128 0 // GUID for file properties object - GETID3_ASF_File_Properties_Object // Object Size QWORD 64 16 // size of file properties object, including 104 bytes of File Properties Object header // File ID GUID 128 24 // unique ID - identical to File ID in Data Object // File Size QWORD 64 40 // entire file in bytes. Invalid if Broadcast Flag == 1 // Creation Date QWORD 64 48 // date & time of file creation. Maybe invalid if Broadcast Flag == 1 // Data Packets Count QWORD 64 56 // number of data packets in Data Object. Invalid if Broadcast Flag == 1 // Play Duration QWORD 64 64 // playtime, in 100-nanosecond units. Invalid if Broadcast Flag == 1 // Send Duration QWORD 64 72 // time needed to send file, in 100-nanosecond units. Players can ignore this value. Invalid if Broadcast Flag == 1 // Preroll QWORD 64 80 // time to buffer data before starting to play file, in 1-millisecond units. If <> 0, PlayDuration and PresentationTime have been offset by this amount // Flags DWORD 32 88 // // * Broadcast Flag bits 1 (0x01) // file is currently being written, some header values are invalid // * Seekable Flag bits 1 (0x02) // is file seekable // * Reserved bits 30 (0xFFFFFFFC) // reserved - set to zero // Minimum Data Packet Size DWORD 32 92 // in bytes. should be same as Maximum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Data Packet Size DWORD 32 96 // in bytes. should be same as Minimum Data Packet Size. Invalid if Broadcast Flag == 1 // Maximum Bitrate DWORD 32 100 // maximum instantaneous bitrate in bits per second for entire file, including all data streams and ASF overhead guint flags = (data[89] << 8) + data[88]; guint64 playtime = ((guint64) data[71] << 56) + ((guint64) data[70] << 48) + ((guint64) data[69] << 40) + ((guint64) data[68] << 32) + ((guint64) data[67] << 24) + ((guint64) data[66] << 16) + ((guint64) data[65] << 8) + data[64]; // g_print("Flags value %02X, (%d)\n", flags, flags); // g_print("Playtime: %llu\n", playtime); if ((flags & 0x0001) == 0) { // We have valid values gint seconds; playtime /= 10000000; seconds = (gint) playtime; // g_print("Play time %d seconds\n", seconds); if (meta->length == NULL) { meta->length = seconds_to_mmss(seconds); } } else { // g_print("Stream had broadcast flag set: length tag is invalid.\n"); } return; } static void parse_header_extension(guchar *data, guint size, metadata_t *meta) { // Header Extension Object: (mandatory, one only) // Field Name Field Type Size (bits) Offset // Object ID GUID 128 0 // GUID for Header Extension object - GETID3_ASF_Header_Extension_Object // Object Size QWORD 64 16 // size of Header Extension object, including 46 bytes of Header Extension Object header // Reserved Field 1 GUID 128 24 // hardcoded: GETID3_ASF_Reserved_1 // Reserved Field 2 WORD 16 40 // hardcoded: 0x00000006 // Header Extension Data Size DWORD 32 42 // in bytes. valid: 0, or > 24. equals object size minus 46 // Header Extension Data BYTESTREAM variable 46 // array of zero or more extended header objects // Not parsed or interpreted in any way. return; } /* -------------------------------------- */ /* EXPORTED FUNCTIONS */ /* -------------------------------------- */ void get_tag_for_wmafile (metadata_t *meta) { gint fd; guchar header[30]; // ASF structure: // * Header Object [required] // * File Properties Object [required] (global file attributes) // * Stream Properties Object [required] (defines media stream & characteristics) // * Header Extension Object [required] (additional functionality) // * Content Description Object (bibliographic information) // * Script Command Object (commands for during playback) // * Marker Object (named jumped points within the file) // * Data Object [required] // * Data Packets // * Index Object // Header Object: (mandatory, one only) // Field Name Field Type Size (bits) // Object ID GUID 128 // GUID for header object - GETID3_ASF_Header_Object // Object Size QWORD 64 // size of header object, including 30 bytes of Header Object header // Number of Header Objects DWORD 32 // number of objects in header object // Reserved1 BYTE 8 // hardcoded: 0x01 // Reserved2 BYTE 8 // hardcoded: 0x02 gchar *tmppath = filename_fromutf8(meta->path); gint n; // g_print("Getting WMA tag info for %s...\n", meta->path); fd = (gint) g_open(tmppath, READONLY_FLAGS, 0); if (fd < 0) { g_free(tmppath); return; } // g_print("Opened file\n"); g_free(tmppath); // Read in some stuff... n = read(fd,header,30); if (n == 30) { // Hardcoded ASF header GUID guchar ASF_header[] = {0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66 ,0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}; if (guid_compare(ASF_header, header)) { guint headersize; guchar *headerobject; guint objects; if (header[20] != 0x00 || header[21] != 0x00 || header[22] != 0x00 || header[23] != 0x00) { // We don't handle tags which require this magnitude of memory to read in! return; } headersize = (header[19] << 24) + (header[18] << 16) + (header[17] << 8) + header[16] - 30; objects = (header[27] << 24) + (header[26] << 16) + (header[25] << 8) + header[24]; // g_print("Found an ASF header of %lu bytes with %lu objects\n", headersize, objects); headerobject = g_malloc(headersize); n = read(fd,headerobject,headersize); if (n == headersize) { // Parse the header... guchar asf_object_guid[16]; guint asf_object_size; guint current_object = 0; guint offset = 0; // g_print("Retrieved ASF header\n"); while (current_object < objects) { // Available objects // GUID entrance pattern: // 8CABDCA1-A947-11CF-8EE4-00C00C205365 -> // A1DCAB8C 47A9 CF11 8EE4 00C00C205365 guchar File_Properties_Object_GUID[] = {0xA1, 0xDC, 0xAB, 0x8C, 0x47, 0xA9, 0xCF, 0x11, 0x8E, 0xE4, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}; guchar Stream_Properties_Object_GUID[] = {0x91, 0x07, 0xDC, 0xB7, 0xB7, 0xA9, 0xCF, 0x11, 0x8E, 0xE6, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}; guchar Header_Extension_Object_GUID[] = {0xB5, 0x03, 0xBF, 0x5F, 0x2E, 0xA9, 0xCF, 0x11, 0x8E, 0xE3, 0x00, 0xC0, 0x0C, 0x20, 0x53, 0x65}; guchar Content_Description_Object_GUID[] = {0x33, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}; guchar Extended_Content_Description_Object_GUID[] = {0x40, 0xA4, 0xD0, 0xD2, 0x07, 0xE3, 0xD2, 0x11, 0x97, 0xF0, 0x00, 0xA0, 0xC9, 0x5E, 0xA8, 0x50}; memcpy(asf_object_guid, &headerobject[offset], 16); // g_print("Object GUID: %02X-%02X-%02X-%02X...\n", asf_object_guid[0], asf_object_guid[1], asf_object_guid[2], asf_object_guid[3]); if (headerobject[offset+20] != 0x00 || headerobject[offset+21] != 0x00 || headerobject[offset+22] != 0x00 || headerobject[offset+23] != 0x00) { // We don't handle tags which require this magnitude of memory to read in! break; } asf_object_size = (headerobject[offset+19] << 24) + (headerobject[offset+18] << 16) + (headerobject[offset+17] << 8) + headerobject[offset+16]; // g_print("Found object of size %lu\n", asf_object_size); if (guid_compare(asf_object_guid, File_Properties_Object_GUID)) { // g_print("Found File Properties Object\n"); parse_file_properties(&headerobject[offset], asf_object_size, meta); } else if (guid_compare(asf_object_guid, Stream_Properties_Object_GUID)) { // g_print("Found Stream Properties Object\n"); } else if (guid_compare(asf_object_guid, Header_Extension_Object_GUID)) { // g_print("Found Header Extension Object\n"); parse_header_extension(&headerobject[offset], asf_object_size, meta); } else if (guid_compare(asf_object_guid, Content_Description_Object_GUID)) { // g_print("Found a Content Description Object\n"); parse_content_description(&headerobject[offset], asf_object_size, meta); } else if (guid_compare(asf_object_guid, Extended_Content_Description_Object_GUID)) { // g_print("Found an Extended Content Description Object\n"); parse_extended_content_description(&headerobject[offset], asf_object_size, meta); } offset += asf_object_size; current_object ++; } } g_free(headerobject); } /* Any embedded ID3V1 or ID3V2 tags will take * prescedence over any titles, artist names * etc gathered from analyzing the filename */ //meta->artist = getArtist(tag); //meta->title = getTitle(tag); //meta->album = getAlbum(tag); //meta->genre = getGenre(tag); //meta->year = string_to_guint32(getYear(tag)); /* If there is a songlength tag it will take * precedence over any length calculated from * the bitrate and filesize */ //songlen = getSonglen(tag); //if (songlen > 0) { // meta->length = seconds_to_mmss(songlen); //} else { // meta->length = NULL; //} //meta->trackno = string_to_guint(tracknum); //meta->filename = getOrigFilename(tag); } close(fd); } gnomad2-2.9.6/src/filenaming.c0000664000076400007640000004066011512614631013064 00000000000000/* filenaming.c Naming of files stored to and read from harddisk Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * I have put all functions that deal with filename formatting * and tagging of (eg) mp3 files into this file. If you are * displeased with how GNOMAD handles tagging or filenaming, this * is where you start hacking. Don't forget to send in any smart * pathces to me. /Linus */ #include "common.h" #include "filenaming.h" #include "prefs.h" #include "util.h" #include "metadata.h" #include gchar *chomp_strings[] = { /* What a decoder is it that puts !s at the end of every filename * and a N01Songtitle thing at the beginning of the file??? */ "!s", /* Beatforge and friends - put your SIGs in the ID3 tag plz */ " bf", " bftop", " xtd bftop", " nbd", " 12i", " 12inch", " oz", " wax", " atm", " we", " ii", /* From some stuid man that signifies "disks" with d1 for disc 1 etc */ " d1", " d2", " d3", " d4", " d5", /* Remove trailing dash */ "-" }; gchar *replacement_strings[] = { /* Some obvious mistakes I've found... * add all things you find erroneously named in here. */ "Dj ","DJ ", "Djs ","DJs ", "DJ - ","DJ ", "Ac - Dc ","AC-DC ", "Acdc ","AC-DC ", "Ebtg ","Everything But the Girl ", "Bjrk ","Bjrk ", "Bjrn ","Bjrn ", "Beastieboys ","Beastie Boys ", "C - Tec","C-Tec", "Ccr ","CCR ", "Atr ","ATR ", "Abba ","ABBA ", "Rmb ","RMB ", "Zz Top ","ZZ Top ", "A - Ha ","A-Ha ", "B - Charme ","B-Charme ", "C - Block ","C-Block ", "D - Tune ","D-Tune ", "E - Type ","E-Type ", "X - Perience ","X-Perience ", "Dee - Lite ","Dee-Lite ", "Run - Dmc ","Run-DMC ", "Run Dmc ","Run-DMC ", "Ann - Lie ","Ann-Lie ", "Cajsa - Stina ","Cajsa-Stina ", " - Rmx"," RMX", " Rmx"," RMX", " - Remix"," RMX", " Remix"," RMX", " Ft. "," ft ", " Feat "," ft ", " Feat. "," ft ", }; const gint chomp_string_count = ((gint)(sizeof(chomp_strings)/sizeof(gchar*))-1); const gint replacement_string_count = ((gint)(sizeof(replacement_strings)/sizeof(gchar*))-1); /* Adds an underscore before the file extension. */ gchar *add_underscore(gchar *str) { gchar *res; gchar *res2; gchar *ext; guint c = strlen(str); while (str[c] != '.') c--; res = g_strndup(str,c); ext = g_strdup(str+c); res2 = g_strconcat(res, "_", ext, NULL); g_free(str); g_free(ext); g_free(res); return res2; } /** * This routine composes a suitable filename for a track file * based on user configuration. * @param meta the metadata to use for constructing the filename * @return a UTF-8 string with the desired filename */ gchar *compose_filename(metadata_t *meta) { gchar *returnname; gchar *template; gchar *tmpcodec; if (get_prefs_use_origname()) { if (meta->filename != NULL) { if (strlen(meta->filename) > 1) { return g_strdup(meta->filename); } } } /* This is also the default if no filename exists in the metadata */ template = get_prefs_filenameformat(); returnname = compose_metadata_string(meta, template, TRUE); g_free(template); returnname = stringcat(returnname, "."); tmpcodec = g_utf8_strdown(meta->codec,-1); returnname = stringcat(returnname, tmpcodec); g_free(tmpcodec); /* g_print("Returnname: %s\n", returnname); */ return returnname; } static gint number_of_dashes(const gchar *string) { const gchar *tmp; gint no = 0; tmp = string; while (*tmp) { if (*tmp == '-') no ++; tmp ++; } return no; } static gchar *kill_tracknumber(const gchar *string) { /* If something beginning with two figures is followed * by something that is not a figure, we assume it is * a track number and NUKE IT. */ gchar *tmp; if (strlen(string) < 4) return g_strdup(string); if (g_ascii_isdigit(string[0]) && g_ascii_isdigit(string[1]) && !g_ascii_isdigit(string[2]) && string[2] != '\'') { // This last condition is for year albums like "70's". tmp = g_strdup(string+2); g_strstrip(tmp); return tmp; } return g_strdup(string); } static void stripdblspaces(gchar *string) { /* Remove any double spaces in the string * (does not deallocate memory) */ gchar *tmp; gchar *tmp2; if (strlen(string) < 2) return; tmp = string + 1; while (*tmp) { if (*tmp == ' ' && *(tmp-1) == ' ') { tmp2 = tmp + 1; while (*tmp2) { *(tmp2 - 1) = *tmp2; tmp2 ++; } *(tmp2 - 1) = '\0'; } tmp ++; } return; } static void capitalize(gchar *string) { /* Markov process that capitalizes every letter * in the beginning of a word - hm if you're a * communist, perhaps you don't like the name * of this function? */ gchar *tmp; if (strlen(string) < 2) return; string[0] = toupper(string[0]); tmp = string + 1; while (*tmp) { if (*(tmp - 1) == ' ') *tmp = toupper(*tmp); tmp ++; } } static gchar hex_to_char(gchar c) { if (c >= '0' && c <= '9') return (c - '0'); if (c >= 'A' && c <= 'F') return (c - 'A' + 10); if (c >= 'a' && c <= 'f') return (c - 'a' + 10); return '\0'; } /* Performs on-the-fly URL decoding */ static void url_decode(gchar *string) { gchar *sp; if (!string) return; sp = string; while(*sp) { if (*sp == '%') { gchar *tmp; gchar tmpchar; tmp = sp; sp ++; tmpchar = 16 * hex_to_char(*sp); sp ++; tmpchar += hex_to_char(*sp); sp = tmp; /* Only deURLencode stuff that makes sense */ if (tmpchar) { *sp = tmpchar; tmp += 3; while (*tmp) { *(tmp-2) = *tmp; tmp ++; } *(tmp-2) = '\0'; } } sp ++; } } static gchar *remove_crap_from_filename(gchar *instring) { gint i; gchar *string; /* Return on empty string */ if (!instring) return instring; /* Make a lowercase working copy */ string = g_utf8_strdown(instring,-1); g_free(instring); /* Remove any underscores */ replacechar(string, '_', ' '); /* Remove URL encoding present in some MP3 file * I've seen (on my CDs :) */ url_decode(string); /* Find some clear candidates of junk at the * end of the filename and kill 'em */ for (i = 0; i < chomp_string_count; i ++) { if (!strcmp(chomp_strings[i], string+strlen(string)-strlen(chomp_strings[i]))) { string[strlen(string)-strlen(chomp_strings[i])] = '\0'; } } /* Another fix for the stupid encoder that names all files * insanely and puts !s at the end of then filename */ if (string[0] == 'n' && strlen(string) > 4) { static gchar tmp[3]; gchar *tmp2; tmp[0] = string[1]; tmp[1] = string[2]; tmp[2] = '\0'; if (is_a_number(tmp)) { tmp2 = g_strdup(string+3); g_free(string); string = tmp2; } } /* Finally trim and return it */ g_strstrip(string); return string; } static gchar *remove_crap_from_dirname(gchar *string) { /* Remove any underscores */ replacechar(string, '_', ' '); return string; } static gchar *kill_squarebrackets(gchar *string) { /* Some people insist on naming their files: * [Artist name] Trackname - remove such crap * and replace with the more common * Artist name - Trackname */ if (*string == '[') { gchar *tmp; gchar *tmp2; tmp = string; while(*tmp && *tmp != ']') tmp ++; if (!tmp) return string+1; // no matching ']': just strip '[' *tmp = '\0'; tmp2 = g_strdup(string+1); tmp2 = stringcat(tmp2, " - "); tmp2 = stringcat(tmp2, tmp+1); g_free(string); return tmp2; } else { return string; } } static gchar *beautify_string(gchar *instring) { gint i; gchar *string = instring; /* See comment in this function for details */ string = kill_squarebrackets(string); /* Obvious misuse of dashes */ if (number_of_dashes(string) > 3) replacechar(string, '-', ' '); /* Kill that stoopid paranthesis indenting */ string = replacestring(string,"( ","("); string = replacestring(string," )",")"); string = replacestring(string,"[ ","["); string = replacestring(string," ]","]"); /* Lighten crunched parantheses */ string = replacestring(string,")[",") ["); string = replacestring(string,"](","] ("); /* Fix up spacing (OK this is crude too) */ string = replacestring(string,"("," ("); string = replacestring(string,")",") "); string = replacestring(string,"["," ["); string = replacestring(string,"]","] "); /* This is a case of insanely genious programming */ string = replacestring(string,"--","-"); string = replacestring(string,"-"," - "); /* So it corrects its own mistakes (even cruder) */ string = replacestring(string," ("," ("); string = replacestring(string,") ",") "); string = replacestring(string," ["," ["); string = replacestring(string,"] ","] "); string = replacestring(string,"] .","]."); string = replacestring(string,") .",")."); /* Replace all kind of double spaces */ stripdblspaces(string); /* Remove space in the end or beginning of string */ g_strstrip(string); /* We want to capitalize the first letter in every word as * is common in titles, and we're dealing with titles * most definately */ capitalize(string); /* OK so things might become a 'lil bit TOO proper, and we * fix it by hardwiring a bit of English grammar. As every kid * knows, in titles all words EXCEPT prepositions, especially * those with one syllable, are NOT written with capital letters. * The words "and" and "but" are also exceptions. I didnt include * the word "on" because it can have different meanings... */ string = replacestring(string," The "," the "); string = replacestring(string," To "," to "); string = replacestring(string," At "," at "); string = replacestring(string," For "," for "); string = replacestring(string," Of "," of "); string = replacestring(string," In "," in "); string = replacestring(string," On Top Of "," On top of "); string = replacestring(string," By "," by "); string = replacestring(string," From "," from "); string = replacestring(string," With "," with "); string = replacestring(string," And "," and "); string = replacestring(string," But "," but "); for (i = 0; i < replacement_string_count; i+=2) { string = replacestring(string, replacement_strings[i], replacement_strings[i+1]); } return string; } static gchar *get_artist (gchar *dir, gchar *file) { gchar **tmp; gchar *artist = NULL; if (gnomad_debug != 0) { g_print("get_artist()\n"); } tmp = g_strsplit(dir, " - ", 0); /* If the directory is named "Foo - Bar", we presume * Foo is the artist, and Bar is the album title */ if (vectorlength(tmp) > 1) { artist = g_strdup(*tmp); g_strfreev(tmp); } else { gchar *file2 = kill_tracknumber(file); g_strfreev(tmp); tmp = g_strsplit(file2, " - ", 0); /* Else if the file is named "0x - Foo - Bar", we assume * Foo is the artist name */ if (vectorlength(tmp) > 2) { if (is_a_number(tmp[0])) { artist = g_strdup(tmp[1]); } else { /* Else if the file is named "Foo - 0x - Bar", we assume * Foo is the artist name */ artist = g_strdup(tmp[0]); } /* Else if the file is named "Foo - Bar", we assume * Foo is the artist name */ } else if (vectorlength(tmp) > 1) { artist = g_strdup(*tmp); } else { /* Otherwise we will use the directory name as it is, * assuming this is the artist is the best we can do... */ artist = g_strdup(dir); } g_strfreev(tmp); g_free(file2); } return artist; } static gchar *get_title (gchar *file) { gchar **tmp; gchar *title = NULL; gchar *file2; if (gnomad_debug != 0) { g_print("get_title()\n"); } file2 = kill_tracknumber(file); if (file2 == NULL) { return NULL; } tmp = g_strsplit(file, " - ", 0); g_free(file2); if (vectorlength(tmp) > 1) { gchar **tmp2 = tmp; gchar *tmp3; while(*tmp2 != NULL) { tmp3 = *tmp2; tmp2++; } } g_strfreev(tmp); return g_strdup(file); tmp = g_strsplit(file2, " - ", 0); g_free(file2); if (vectorlength(tmp) > 1) { gchar **tmp2 = tmp; gchar *tmp3; while(*tmp2 != NULL) { tmp3 = *tmp2; tmp2++; } title = g_strdup(tmp3); } else { /* Otherwise we will use the file name as it is, * assuming this is the title is the best we can do... */ title = g_strdup(file); } // This is the culprit g_strfreev(tmp); if (gnomad_debug != 0) { if (title != NULL) { g_print("Found title \"%s\"...\n", title); } else { g_print("Didn't find any title.\n"); } } return title; } static gchar *get_album (gchar *dir) { gchar **tmp; gchar *album = NULL; if (gnomad_debug != 0) { g_print("get_album()\n"); } tmp = g_strsplit(dir, " - ", 0); /* If the directory is named "Foo - Bar", we presume * Foo is the artist, and Bar is the album title */ if (vectorlength(tmp) > 1) album = g_strdup(*(tmp+1)); g_strfreev(tmp); return album; } static guint32 get_trackno(gchar *file) { /* If something beginning with two figures is followed * by something that is not a figure, we assume it is * a track number. */ gchar test[3]; guint i; if (gnomad_debug != 0) { g_print("get_trackno()\n"); } if (strlen(file) < 3) { return 0; } for (i = 0; i < (strlen(file) - 2); i++) { if (g_ascii_isdigit(file[i]) && g_ascii_isdigit(file[i+1]) && !g_ascii_isdigit(file[i+2])) { test[0] = file[i]; test[1] = file[i+1]; test[2] = '\0'; if (gnomad_debug != 0) { g_print("Found track number: %s\n", test); } return string_to_guint32(test); } } return 0; } void info_from_path(metadata_t *meta, gboolean be_clever) { gchar *path; gchar **tmppath; gchar *tmpdir; gchar *tmpfile; guint track = 0; int i; if (gnomad_debug != 0) { g_print("Getting info from path...\n"); } /* If ID3lib has already set seriously acceptable tags, * use them and return */ if (meta->artist != NULL && meta->title != NULL && meta->album != NULL && meta->trackno > 0) { if (gnomad_debug != 0) { g_print("All metadata already set.\n"); } return; } /* It's not much use trying to determine something * with too little input information. */ if (strlen(meta->path) <= 4) { return; } /* OK now we will use some artificial intelligence to * cook up Artist / Title / Album fields from the path. */ path = g_strdup(meta->path); if (gnomad_debug != 0) { g_print("Processing path: %s\n", path); } /* Chop off the file extension */ if (path[strlen(path)-3] == '.') path[strlen(path)-3] = '\0'; else if (path[strlen(path)-4] == '.') path[strlen(path)-4] = '\0'; /* We are interested in the last directory name * and the filename from the path */ tmppath = g_strsplit(path, G_DIR_SEPARATOR_S, 0); g_free(path); for (i = 0; tmppath[i] != NULL; i++) {}; if (i >= 2) tmpdir = g_strdup(tmppath[i-2]); else tmpdir = NULL; if (i >= 1) tmpfile = g_strdup(tmppath[i-1]); else tmpfile = NULL; g_strfreev(tmppath); if (be_clever) { tmpdir = remove_crap_from_dirname(tmpdir); tmpfile = remove_crap_from_filename(tmpfile); tmpdir = beautify_string(tmpdir); tmpfile = beautify_string(tmpfile); } if (gnomad_debug != 0) { g_print("Dir: %s\n", tmpdir); g_print("File: %s\n", tmpfile); } // If we're not being too clever, do as mediasource do. if (!be_clever) { if ((meta->title == NULL) && (tmpfile != NULL)) { meta->title = tmpfile; g_free(tmpdir); } return; } if (meta->trackno <=0 && track > 0) meta->trackno = track; /* Now guess the artist, title and album from * looking at the file- and directoryname */ if (meta->artist == NULL) meta->artist = get_artist(tmpdir, tmpfile); if (meta->title == NULL) meta->title = get_title(tmpfile); if (meta->album == NULL) meta->album = get_album(tmpdir); if (meta->trackno == 0) meta->trackno = get_trackno(tmpfile); g_free(tmpdir); g_free(tmpfile); if (gnomad_debug != 0) { g_print("Got all info from path...\n"); dump_metadata_t(meta); } } gnomad2-2.9.6/src/Makefile.am0000664000076400007640000000147611576173772012665 00000000000000MAINTAINERCLEANFILES = Makefile.in INCLUDES = \ @GN_CFLAGS@ \ @TAG_CFLAGS@ \ @MTP_CFLAGS@ \ @TAGLIB_CFLAGS@ \ @GUDEV_CFLAGS@ \ -DPREFIX=\"$(prefix)\" \ -DSYSCONFDIR=\"$(sysconfdir)\" \ -DDATADIR=\"$(datadir)\" \ -DLIBDIR=\"$(libdir)\" \ -DPIXMAPSDIR=\""$(datadir)/pixmaps"\" LDADD = \ @GN_LIBS@ \ @TAG_LIBS@ \ @MTP_LIBS@ \ @TAGLIB_LIBS@ \ @GUDEV_LIBS@ bin_PROGRAMS = gnomad2 gnomad2_SOURCES = id3read.c id3read.h \ gnomad2.c prefs.c prefs.h \ filenaming.c filenaming.h jukebox.c jukebox.h \ util.c util.h \ mp3file.c mp3file.h \ editmeta.c editmeta.h filesystem.c filesystem.h \ playlists.c playlists.h xfer.c xfer.h \ data.c data.h player.c player.h common.h \ metadata.c metadata.h \ wmaread.c wmaread.h \ riffile.c riffile.h if TAGLIB_COMPILE gnomad2_SOURCES += tagfile.c tagfile.h endifgnomad2-2.9.6/src/filesystem.h0000664000076400007640000000505611527071042013143 00000000000000/* filesystem.h Interface to the posix (well...) file system header definitions Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FILESYSTEMH_INCLUDED #define FILESYSTEMH_INCLUDED 1 #include #include "metadata.h" /* Mode flags for files and dirs */ #ifdef G_OS_WIN32 #define READONLY_FOPEN_STRING ("rb") #define READPLUS_FOPEN_STRING ("rb+") #define READONLY_FLAGS (O_RDONLY | O_BINARY) #define WRITEONLY_FLAGS (O_WRONLY | O_BINARY) #define CREATE_FILEMODE (S_IRUSR | S_IWUSR) #define CREATE_DIRMODE (S_IRUSR | S_IWUSR | S_IXUSR) #else #define READONLY_FOPEN_STRING ("r") #define READPLUS_FOPEN_STRING ("rb") #define READONLY_FLAGS (O_RDONLY) #define WRITEONLY_FLAGS (O_WRONLY) #define CREATE_FILEMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) #define CREATE_DIRMODE (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) #endif /* Local type for the metadata read thread */ typedef struct { GtkWidget *dialog; GtkWidget *label; GtkWidget *progress; listtype_t listtype; gchar *path; gboolean cancelled; } dirfill_thread_arg_t; /* Exported functions */ guint64 get_64bit_file_size(const gchar * const path); gchar *filename_toutf8(const gchar * const instr); gchar *filename_fromutf8(const gchar * const instr); GList *get_metadata_dir(listtype_t listtype, gchar *path, dirfill_thread_arg_t *args); void fill_in_dir(listtype_t listtype, gchar *path); gchar *get_current_dir(void); gboolean is_directory(gchar *dir); void change_directory(gchar *dir); gint delete_dir_contents(gchar *dir); gint delete_files(GList *filelist); gboolean clone_and_strip_tag(const gchar *const source, const gchar * const dest, const gchar * const codec); gint get_prefsfile_fd(gboolean write); void close_prefsfile(void); void rewrite_prefsfile(gchar *prefs); char *expand_path (char *src); gboolean test_writeable(gchar *path); gboolean create_directory(gchar *path); void create_dirs(gchar *filename); gboolean copy_file(gchar *source, gchar *dest); void export_playlistfile(gchar *filename, gchar *formatstring, GList *playlist, gboolean m3ufile, gboolean plsfile); #endif gnomad2-2.9.6/src/tagfile.c0000664000076400007640000000746111512614631012370 00000000000000/* tagfile.c Interface to the taglib library for Ogg/FLAC file tags. Copyright (C) 2007 Peter Randeu This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "metadata.h" #include "util.h" #include "filesystem.h" #include /***************************************************************************** * EXPORTED FUNCTIONS *****************************************************************************/ void remove_tag_from_file(gchar *path) { gchar *tmppath = filename_fromutf8(path); TagLib_File *file = taglib_file_new(tmppath); // FIXME: taglib doesn't know how to strip all tags. That would be good // because on our devices, metadata is sent with PDE/MTP commands, not // stored in the tags. if(file == NULL) { g_printf("could not open file %s", tmppath); g_free(tmppath); return; } g_free(tmppath); // I introduced this to taglib by patch. Let's see if they accept it. // taglib_mpeg_strip_tag(file); taglib_tag_free_strings(); taglib_file_free(file); } void get_tag_for_file (metadata_t *meta) { gchar *tmppath = filename_fromutf8(meta->path); TagLib_Tag *tag; const TagLib_AudioProperties *properties; TagLib_File *file = taglib_file_new(tmppath); if(file == NULL) { g_printf("could not open file %s", tmppath); g_free(tmppath); return; } g_free(tmppath); tag = taglib_file_tag(file); if (tag == NULL) { g_print("tag was NULL in file %s", tmppath); return; } properties = taglib_file_audioproperties(file); gchar* artist = taglib_tag_artist(tag); meta->artist = strlen(artist) ? g_strdup(artist) : NULL; gchar* title = taglib_tag_title(tag); meta->title = strlen(title) ? g_strdup(title) : NULL; gchar* album = taglib_tag_album(tag); meta->album = strlen(album) ? g_strdup(album) : NULL; gchar* genre = taglib_tag_genre(tag); meta->genre = strlen(genre) ? g_strdup(genre) : NULL; meta->year = taglib_tag_year(tag); meta->length = seconds_to_mmss(taglib_audioproperties_length(properties)); meta->trackno = taglib_tag_track(tag); meta->filename = NULL; taglib_tag_free_strings(); taglib_file_free(file); } void set_tag_for_file (metadata_t *meta, gboolean override) { gchar *tmppath = filename_fromutf8(meta->path); TagLib_Tag *tag; const TagLib_AudioProperties *properties; TagLib_File *file = taglib_file_new(tmppath); if(file == NULL) { g_printf("could not open file %s", tmppath); g_free(tmppath); return; } g_free(tmppath); // If taglib >= 1.5 // taglib_id3v2_set_default_text_encoding(TagLib_ID3v2_UTF16); tag = taglib_file_tag(file); if (tag == NULL) { g_print("tag was NULL in file %s", tmppath); return; } if (meta->artist != NULL && strcmp(meta->artist, "")) { taglib_tag_set_artist(tag, meta->artist); } if (meta->title != NULL && strcmp(meta->title, "")) { taglib_tag_set_title(tag, meta->title); } if (meta->album != NULL && strcmp(meta->album, "")) { taglib_tag_set_album(tag, meta->album); } if (meta->year != 0) { taglib_tag_set_year(tag, meta->year); } if (meta->genre != NULL && strcmp(meta->genre, "")) { taglib_tag_set_genre(tag, meta->genre); } taglib_tag_set_track(tag, meta->trackno); taglib_file_save(file); taglib_tag_free_strings(); taglib_file_free(file); } gnomad2-2.9.6/src/riffile.c0000664000076400007640000001224011573774513012401 00000000000000/* riffile.c WAV and AVI interface Copyright (C) 2004-2011 Linus Walleij Copyright (C) 2008 Kees van Veen This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Much of the code in this file was derived from the getid3() code, written in PHP. The C implementation here is however made from scratch. */ #include "common.h" #include "metadata.h" #include "filesystem.h" #include "util.h" #include #include #include #include #include #include #define b2len(b) ( ((b)[0])+((b)[1]<<8)+((b)[2]<<16)+((b)[3]<<24) ) static guint32 le_to_guint(guchar *data) { return data[3] << 24 | data[2] << 16 | data[1] << 8 | data[0]; } /* -------------------------------------- */ /* EXPORTED FUNCTIONS */ /* -------------------------------------- */ void get_tag_for_wavfile (metadata_t *meta) { gint fd; guchar header[46]; gchar *tmppath = filename_fromutf8(meta->path); gint n; // g_print("Getting WAV tag info for %s...\n", meta->path); fd = (gint) g_open(tmppath, READONLY_FLAGS, 0); if (fd < 0) { g_free(tmppath); return; } // g_print("Opened file\n"); g_free(tmppath); // Read in some stuff... n = read(fd,header,46); if (n == 46) { // Hardcoded RIFF header if ((header[0] == 'R' || header[0] == 'r') && (header[1] == 'I' || header[1] == 'i') && (header[2] == 'F' || header[2] == 'f') && (header[3] == 'F' || header[3] == 'f') && (header[8] == 'W' || header[8] == 'w') && (header[9] == 'A' || header[9] == 'a') && (header[10] == 'V' || header[10] == 'v') && (header[11] == 'E' || header[11] == 'e') && (header[12] == 'f' || header[12] == 'F') && (header[13] == 'm' || header[13] == 'M') && (header[14] == 't' || header[14] == 'T') && header[15] == ' ') { // This is indeed a RIFF/WAVE file guint32 chunksize = le_to_guint(&header[4]); guint32 fmtchunksize = le_to_guint(&header[16]); //guint32 samplerate = le_to_guint(&header[24]); guint32 byterate = le_to_guint(&header[28]); guint32 calctime; // Calculate the run time. Remove the format chunk size, // the four remaining bytes of the RIFF header and the // data header (8 bytes). calctime = (chunksize - fmtchunksize - 8 - 4) / byterate; if (calctime == 0) { // Atleast one second, please. calctime = 1; } //g_print("RIFF/WAVE chunksize: %d bytes\n", chunksize); //g_print("Sample rate: %d samples/s\n", samplerate); //g_print("Byte rate: %d bytes/s\n", byterate); //g_print("Calculated time: %d seconds\n", calctime); if (meta->length != NULL) { g_free(meta->length); } meta->length = seconds_to_mmss(calctime); } } close(fd); } void get_tag_for_avifile (metadata_t *meta) { gint fd; unsigned char header[256+1], buffer[256+1], type[256+1]; gchar *tmppath = filename_fromutf8(meta->path); size_t len; int length = -1; // g_print("Getting WAV tag info for %s...\n", meta->path); fd = (gint) g_open(tmppath, READONLY_FLAGS, 0); if (fd < 0) { g_free(tmppath); return; } g_free(tmppath); if (read(fd, header, 12)!=12) goto BAD; len = b2len(header+4); if (! (strncmp(header, "RIFF", 4)==0 && strncmp(header+8, "AVI ", 4)==0) ) goto BAD; /* Bad AVI file */ for (;;) { if (read(fd, header, 12)!=12) goto BAD; if (strncmp(header, "LIST", 4)==0) { int max = b2len(header+4); if (strncmp(header+8, "hdrl", 4)==0) { for (; max>0; ) { if (read(fd,header, 12)!=12) goto BAD; max -= 12; len = b2len(header+4); if (strncmp(header, "LIST", 4)==0) { if (len>max) break; else continue; } else if (strncmp(header, "strh", 4)==0) { int newlength; double scale, rate; strncpy(type, header+8, 4); type[4]='\0'; if (read(fd, buffer, 36)!=36) goto BAD; len -= 36; scale = (double) b2len(buffer+16); rate = (double) b2len(buffer+20); newlength = b2len(buffer+28); if (scale==0.0) scale = 0.0000001; newlength /= rate/scale; if (newlength>length) /* Previous length may be audio/video - choose largest */ length = newlength; // } else if (strncmp(header, "strf", 4)==0) { // if (strcmp(type, "vids")==0) // printf("Video length: %d\n", length); // else // printf("Audio length: %d\n", length); } if (lseek(fd, len-4, SEEK_CUR)<0) goto BAD; max -= len-4; } break; } else { if (lseek(fd, len-4, SEEK_CUR)<0) goto BAD; } } else { goto BAD; } } // if (length>=0) { // int h=length/3600, m=(length%3600)/60, s=length-h*3600-m*60; // printf("length: %02d:%02d:%02d\n", h,m,s); // } BAD: // if (meta->length != NULL) { // g_free(meta->length); // } meta->length = seconds_to_mmss(length); close(fd); } gnomad2-2.9.6/src/filenaming.h0000664000076400007640000000153011512614631013062 00000000000000/* filenaming.h Naming of files stored to and read from harddisk, resource file. Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef FILENAMING_INCLUDED #define FILENAMING_INCLUDED 1 #include "metadata.h" /* Exported functions */ gchar *add_underscore(gchar *str); gchar *compose_filename(metadata_t *meta); void info_from_path(metadata_t *meta, gboolean be_clever); #endif gnomad2-2.9.6/src/metadata.c0000664000076400007640000006762011573771700012550 00000000000000/* metadata.c Metadata list stores and handler functions Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "metadata.h" #include "util.h" metadata_t *new_metadata_t(void) { metadata_t *meta; meta = (metadata_t *) g_malloc(sizeof(metadata_t)); meta->artist = NULL; meta->title = NULL; meta->album = NULL; meta->year = 0; meta->genre = NULL; meta->length = NULL; meta->size = 0; meta->codec = NULL; meta->trackno = 0; meta->protect = FALSE; meta->filename = NULL; meta->path = NULL; meta->folder = NULL; return meta; } void destroy_metadata_t(metadata_t *meta) { if (meta->artist != NULL) g_free(meta->artist); if (meta->title != NULL) g_free(meta->title); if (meta->album != NULL) g_free(meta->album); if (meta->genre != NULL) g_free(meta->genre); if (meta->codec != NULL) g_free(meta->codec); if (meta->filename != NULL) g_free(meta->filename); if (meta->path != NULL) g_free(meta->path); if (meta->folder != NULL) g_free(meta->folder); g_free(meta); } metadata_t *clone_metadata_t(metadata_t const * const meta) { metadata_t *clone = new_metadata_t(); if (meta->artist != NULL) clone->artist = g_strdup(meta->artist); if (meta->title != NULL) clone->title = g_strdup(meta->title); if (meta->album != NULL) clone->album = g_strdup(meta->album); clone->year = meta->year; if (meta->genre != NULL) clone->genre = g_strdup(meta->genre); clone->length = meta->length; clone->size = meta->size; if (meta->codec != NULL) clone->codec = g_strdup(meta->codec); clone->trackno = meta->trackno; clone->protect = meta->protect; if (meta->filename != NULL) clone->filename = g_strdup(meta->filename); if (meta->path != NULL) clone->path = g_strdup(meta->path); if (meta->folder != NULL) clone->folder = g_strdup(meta->folder); return clone; } static gchar *metadata_string_escape(gchar *str) { static gchar null_value[] = "(null)"; if (str == NULL) { return null_value; } return str; } void dump_metadata_t(metadata_t const * const meta) { g_print("\n---- Song metadata -----\n"); g_print("Artist: %s\n", metadata_string_escape(meta->artist)); g_print("Title: %s\n", metadata_string_escape(meta->title)); g_print("Album: %s\n", metadata_string_escape(meta->album)); g_print("Year: %" PRIguint32 "\n", meta->year); g_print("Genre: %s\n", metadata_string_escape(meta->genre)); g_print("Length: %s\n", metadata_string_escape(meta->length)); g_print("Size: %lu bytes\n", meta->size); g_print("Codec: %s\n", metadata_string_escape(meta->codec)); g_print("Track#: %" PRIguint32 "\n", meta->trackno); g_print("Protected: %s\n", meta->protect ? "YES" : "NO"); g_print("Filename: %s\n", metadata_string_escape(meta->filename)); g_print("Path: %s\n", metadata_string_escape(meta->path)); g_print("Folder: %s\n", metadata_string_escape(meta->folder)); } static void strip_filename_illegal_chars(gchar * const str) { guint i; for (i = 0; i < strlen(str); i++) { if (str[i] == G_DIR_SEPARATOR || str[i] == G_SEARCHPATH_SEPARATOR) { str[i] = '_'; } } } /** * This function creates a metadata string to be used for * e.g. filenames using a template. * @param meta the metadata to use for composing the string * @param template a template string giving the metadata arrangement * @param filesystemsafe whether some illegal characters that cannot * be used in the underlying filesystem should be stripped from * the string. */ gchar *compose_metadata_string(metadata_t const * const meta, gchar const * const template, gboolean const filesystemsafe) { gchar *tmp; gchar *tmpyear; gchar *tmptrackno; gchar *returnname; if (meta == NULL) { return NULL; } returnname = g_strdup(template); if (meta->artist) { tmp = g_strdup(meta->artist); if (filesystemsafe) { strip_filename_illegal_chars(tmp); } returnname = replacestring(returnname, "%a", tmp); g_free(tmp); } else { returnname = replacestring(returnname, "%a", ""); } if (meta->title) { tmp = g_strdup(meta->title); if (filesystemsafe) { strip_filename_illegal_chars(tmp); } returnname = replacestring(returnname, "%t", tmp); g_free(tmp); } else { returnname = replacestring(returnname, "%t", ""); } if (meta->album) { tmp = g_strdup(meta->album); if (filesystemsafe) { strip_filename_illegal_chars(tmp); } returnname = replacestring(returnname, "%b", tmp); g_free(tmp); } else { returnname = replacestring(returnname, "%b", ""); } if (meta->genre) { tmp = g_strdup(meta->genre); if (filesystemsafe) { strip_filename_illegal_chars(tmp); } returnname = replacestring(returnname, "%g", tmp); g_free(tmp); } else { returnname = replacestring(returnname, "%g", ""); } // The following does not contain filesystem-illegal characters tmptrackno = g_strdup_printf("%02u", meta->trackno); if (tmptrackno) { returnname = replacestring(returnname, "%n", tmptrackno); } else { returnname = replacestring(returnname, "%n", "00"); } g_free(tmptrackno); tmpyear = g_strdup_printf("%" PRIguint32, meta->year); if (tmpyear) returnname = replacestring(returnname, "%y", tmpyear); else returnname = replacestring(returnname, "%y", "1900"); g_free(tmpyear); return returnname; } /***************************************************************************** * These functions retrieve data from selections in metadata trees *****************************************************************************/ metadata_t *get_metadata_from_model(GtkTreeModel *model, GtkTreeIter *iter) { metadata_t *meta = new_metadata_t(); gtk_tree_model_get(model, iter, TRACKLIST_ARTIST_COLUMN, &meta->artist, TRACKLIST_TITLE_COLUMN, &meta->title, TRACKLIST_ALBUM_COLUMN, &meta->album, TRACKLIST_YEAR_COLUMN, &meta->year, TRACKLIST_GENRE_COLUMN, &meta->genre, TRACKLIST_LENGTH_COLUMN, &meta->length, TRACKLIST_SIZE_COLUMN, &meta->size, TRACKLIST_CODEC_COLUMN, &meta->codec, TRACKLIST_TRACKNO_COLUMN, &meta->trackno, TRACKLIST_PROTECTED_COLUMN, &meta->protect, TRACKLIST_FILENAME_COLUMN, &meta->filename, TRACKLIST_ID_COLUMN, &meta->path, TRACKLIST_FOLDER_COLUMN, &meta->folder, -1); return meta; } metadata_t *get_data_metadata_from_model(GtkTreeModel *model, GtkTreeIter *iter) { metadata_t *meta = new_metadata_t(); gtk_tree_model_get(model, iter, FILELIST_FILENAME_COLUMN, &meta->filename, FILELIST_SIZE_COLUMN, &meta->size, FILELIST_ID_COLUMN, &meta->path, FILELIST_FOLDER_COLUMN, &meta->folder, FILELIST_EXTENSION_COLUMN, &meta->codec, -1); return meta; } void add_metadata_to_model(metadata_t const * const meta, listtype_t const listtype) { GtkListStore *liststore = NULL; /* initialize to shut up GCC */ GtkTreeIter listiter; if (listtype == HD_LIST || listtype == JB_LIST) { if (listtype == HD_LIST) liststore = transfer_widgets.hdliststore; else if (listtype == JB_LIST) liststore = transfer_widgets.jbliststore; gtk_list_store_append (liststore, &listiter); gtk_list_store_set (liststore, &listiter, TRACKLIST_ARTIST_COLUMN, meta->artist, TRACKLIST_TITLE_COLUMN, meta->title, TRACKLIST_ALBUM_COLUMN, meta->album, TRACKLIST_YEAR_COLUMN, meta->year, TRACKLIST_GENRE_COLUMN, meta->genre, TRACKLIST_LENGTH_COLUMN, meta->length, TRACKLIST_SIZE_COLUMN, meta->size, TRACKLIST_CODEC_COLUMN, meta->codec, TRACKLIST_TRACKNO_COLUMN, meta->trackno, TRACKLIST_PROTECTED_COLUMN, meta->protect, TRACKLIST_FILENAME_COLUMN, meta->filename, TRACKLIST_ID_COLUMN, meta->path, TRACKLIST_FOLDER_COLUMN, meta->folder, -1); } else if (listtype == HDDATA_LIST || listtype == JBDATA_LIST) { if (listtype == HDDATA_LIST) liststore = data_widgets.hdliststore; else if (listtype == JBDATA_LIST) liststore = data_widgets.jbliststore; gtk_list_store_append (liststore, &listiter); gtk_list_store_set (liststore, &listiter, FILELIST_FILENAME_COLUMN, meta->filename, FILELIST_SIZE_COLUMN, meta->size, FILELIST_ID_COLUMN, meta->path, FILELIST_FOLDER_COLUMN, meta->folder, FILELIST_EXTENSION_COLUMN, meta->codec, -1); } } static void select_foreach_xfer(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, GList **list) { metadata_t *meta = get_metadata_from_model(model, iter); *list = g_list_append (*list, meta); } static void select_foreach_data(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, GList **list) { metadata_t *meta = get_data_metadata_from_model(model, iter); *list = g_list_append (*list, meta); } static GtkTreeView* get_view(listtype_t listtype) { if (listtype == HD_LIST) return GTK_TREE_VIEW(transfer_widgets.hdlistview); else if (listtype == JB_LIST) return GTK_TREE_VIEW(transfer_widgets.jblistview); else if (listtype == HDDATA_LIST) return GTK_TREE_VIEW(data_widgets.hdlistview); else if (listtype == JBDATA_LIST) return GTK_TREE_VIEW(data_widgets.jblistview); else return NULL; } static GtkListStore* get_store(listtype_t listtype) { if (listtype == HD_LIST) return transfer_widgets.hdliststore; else if (listtype == JB_LIST) return transfer_widgets.jbliststore; else if (listtype == HDDATA_LIST) return data_widgets.hdliststore; else if (listtype == JBDATA_LIST) return data_widgets.jbliststore; else return NULL; } GtkTreeSelection *get_metadata_selection(listtype_t listtype) { GtkTreeSelection *select = NULL; select = gtk_tree_view_get_selection(get_view(listtype)); return select; } /* Returns the paths for all selected rows so they may be processed */ static GList *get_metadata_selection_paths(listtype_t listtype) { GtkTreeSelection *select = get_metadata_selection(listtype); GtkTreeModel *model = GTK_TREE_MODEL(get_store(listtype)); GList *selectlist = gtk_tree_selection_get_selected_rows(select, &model); return selectlist; } GList *get_all_metadata_from_selection(listtype_t listtype) { GtkTreeSelection *select; GList *metadatas = NULL; select = get_metadata_selection(listtype); if (select == NULL) return NULL; if (listtype == HD_LIST || listtype == JB_LIST) { gtk_tree_selection_selected_foreach(select, (GtkTreeSelectionForeachFunc) select_foreach_xfer, (gpointer) &metadatas); } else if (listtype == HDDATA_LIST || listtype == JBDATA_LIST) { gtk_tree_selection_selected_foreach(select, (GtkTreeSelectionForeachFunc) select_foreach_data, (gpointer) &metadatas); } else if (listtype == PL_TREE) { g_print("Illegal call to retrieve playlist metadata!"); } return metadatas; } void destroy_metalist(GList *metalist) { GList *tmplist = g_list_first(metalist); while(tmplist != NULL) { metadata_t *meta = (metadata_t *) tmplist->data; destroy_metadata_t(meta); tmplist = g_list_next(tmplist); } g_list_free(metalist); } metadata_t *get_first_metadata_from_selection(listtype_t listtype) { GList *metadatas = get_all_metadata_from_selection(listtype); GList *tmplist; metadata_t *retmeta; if (metadatas == NULL) return NULL; tmplist = g_list_first(metadatas); retmeta = (metadata_t *) tmplist->data; tmplist = g_list_next(tmplist); while(tmplist != NULL) { metadata_t *meta = (metadata_t *) tmplist->data; destroy_metadata_t(meta); tmplist = g_list_next(tmplist); } g_list_free(metadatas); return retmeta; } /***************************************************************************** * These functions destroy data from selections in metadata trees *****************************************************************************/ void remove_selected(listtype_t listtype) { GList *selection; selection = get_metadata_selection_paths(listtype); while (selection != NULL) { GList *tmp; GtkTreeIter iter; tmp = g_list_first(selection); /* Get the iterator for the first row and remove it */ if (gtk_tree_model_get_iter(GTK_TREE_MODEL(get_store(listtype)), &iter, (GtkTreePath *) tmp->data)) { gtk_list_store_remove(get_store(listtype), &iter); } /* * We have to free this selection list and get the * paths again, because when we removed the line * all path references changed and are now invalid. */ g_list_foreach (selection, (GFunc) gtk_tree_path_free, NULL); g_list_free(selection); selection = get_metadata_selection_paths(listtype); } } gint sort_iter_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer userdata) { gint sortcol = GPOINTER_TO_INT(userdata); gint ret = 0; gchar *name1 = NULL, *name2 = NULL; gchar *subname1 = NULL, *subname2 = NULL; guint subint1 = 0, subint2 = 0; gtk_tree_model_get(model, a, sortcol, &name1, -1); gtk_tree_model_get(model, b, sortcol, &name2, -1); switch (sortcol) { case TRACKLIST_ARTIST_COLUMN: { gtk_tree_model_get(model, a, TRACKLIST_TITLE_COLUMN, &subname1, -1); gtk_tree_model_get(model, b, TRACKLIST_TITLE_COLUMN, &subname2, -1); break; } case TRACKLIST_TITLE_COLUMN: { gtk_tree_model_get(model, a, TRACKLIST_ARTIST_COLUMN, &subname1, -1); gtk_tree_model_get(model, b, TRACKLIST_ARTIST_COLUMN, &subname2, -1); break; } case TRACKLIST_ALBUM_COLUMN: { gtk_tree_model_get(model, a, TRACKLIST_TRACKNO_COLUMN, &subint1, -1); gtk_tree_model_get(model, b, TRACKLIST_TRACKNO_COLUMN, &subint2, -1); gtk_tree_model_get(model, a, TRACKLIST_TITLE_COLUMN, &subname1, -1); gtk_tree_model_get(model, b, TRACKLIST_TITLE_COLUMN, &subname2, -1); } } if (name1 != NULL || name2 != NULL) ret = g_utf8_collate(name1,name2); else if (!(name1 == NULL && name2 == NULL)) ret = (name1 == NULL ? -1 : 1); if (ret == 0) ret = subint1 - subint2; if (ret == 0) { if (subname1 != NULL || subname2 != NULL) ret = g_utf8_collate(subname1,subname2); else if (!(name1 == NULL && name2 == NULL)) ret = (subname1 == NULL ? -1 : 1); } if (name1 != NULL) g_free(name1); if (name2 != NULL) g_free(name2); if (subname1 != NULL) g_free(subname1); if (subname2 != NULL) g_free(subname2); return ret; } static GtkListStore *create_hdliststore(void) { GtkListStore *hdliststore; GtkTreeSortable *sortable; hdliststore = gtk_list_store_new (TRACKLIST_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, /*ID*/ G_TYPE_STRING /* Folder */ ); sortable = GTK_TREE_SORTABLE(hdliststore); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_ARTIST_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_ARTIST_COLUMN), NULL); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_TITLE_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_TITLE_COLUMN), NULL); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_ALBUM_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_ALBUM_COLUMN), NULL); return hdliststore; } static GtkListStore *create_jbliststore(void) { GtkListStore *jbliststore; GtkTreeSortable *sortable; jbliststore = gtk_list_store_new (TRACKLIST_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, /*ID*/ G_TYPE_STRING /* Folder */ ); sortable = GTK_TREE_SORTABLE(jbliststore); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_ARTIST_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_ARTIST_COLUMN), NULL); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_TITLE_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_TITLE_COLUMN), NULL); gtk_tree_sortable_set_sort_func(sortable, TRACKLIST_ALBUM_COLUMN, sort_iter_compare_func, GINT_TO_POINTER(TRACKLIST_ALBUM_COLUMN), NULL); return jbliststore; } static GtkListStore *create_hddataliststore(void) { GtkListStore *hddataliststore; hddataliststore = gtk_list_store_new (FILELIST_N_COLUMNS, G_TYPE_STRING, /*Filename */ G_TYPE_INT, /* Size */ G_TYPE_STRING, /*ID*/ G_TYPE_STRING, /* Folder */ G_TYPE_STRING /* Codec */ ); return hddataliststore; } static GtkListStore *create_jbdataliststore(void) { GtkListStore *jbdataliststore; jbdataliststore = gtk_list_store_new (FILELIST_N_COLUMNS, G_TYPE_STRING, /*Filename */ G_TYPE_INT, /* Size */ G_TYPE_STRING, /*ID*/ G_TYPE_STRING, /* Folder */ G_TYPE_STRING /* Codec */ ); return jbdataliststore; } static gint compare_lengths(gchar * length1, gchar * length2) { gint retval; if (!length2) retval = (length1 != NULL); else if (!length1) retval = -1; else { gchar * sep; gchar ** cmp1; gchar ** cmp2; gint min1, sec1, min2, sec2; cmp1 = g_strsplit(length1, ":", 2); cmp2 = g_strsplit(length2, ":", 2); min1 = g_ascii_strtoll(cmp1[0], 0, 10); sec1 = g_ascii_strtoll(cmp1[1], 0, 10); min2 = g_ascii_strtoll(cmp2[0], 0, 10); sec2 = g_ascii_strtoll(cmp2[1], 0, 10); if (min1 < min2) retval = -1; else if (min1 > min2) retval = 1; else { if (sec1 < sec2) retval = -1; else if (sec1 > sec2) retval = 1; else retval = 0; } g_strfreev(cmp1); g_strfreev(cmp2); } return retval; } /* This intercompare function sorts the directories on top of * the files in the harddisk list view. (It is not used at all * for the jukebox view.) */ static gint hdlist_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { GType coltype; gint retval = 0; gint sort_column_id; GtkSortType order; gboolean sort; guint size1; guint size2; /* Check validity of iterators */ if (a == NULL || b == NULL || a->user_data == NULL || b->user_data == NULL || a->stamp == 0 || b->stamp == 0) { g_print("Bad iterator!\n"); return 0; } sort = gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model), &sort_column_id, &order); if (!sort) { return 0; } gtk_tree_model_get(model, a, TRACKLIST_SIZE_COLUMN, &size1, -1); gtk_tree_model_get(model, b, TRACKLIST_SIZE_COLUMN, &size2, -1); coltype = gtk_tree_model_get_column_type(model, sort_column_id); /* First, if the size is zero, it should be on top * (directory!) */ if (size1 == 0 && size2 != 0) { if (order == GTK_SORT_ASCENDING) return -1; else return 1; } else if (size2 == 0 && size1 != 0) { if (order == GTK_SORT_ASCENDING) return 1; else return -1; } /* And directories are ALWAYS internally sorted on directory name! */ else if(size1 == 0 && size2 == 0) { gchar *text1; gchar *text2; gtk_tree_model_get(model, a, TRACKLIST_ARTIST_COLUMN, &text1, -1); gtk_tree_model_get(model, b, TRACKLIST_ARTIST_COLUMN, &text2, -1); if (!text2) retval = (text1 != NULL); else if (!text1) retval = -1; else { retval = g_strcasecmp(text1, text2); } g_free(text1); g_free(text2); if (order == GTK_SORT_DESCENDING) retval = -retval; } else { switch(sort_column_id) { case TRACKLIST_ALBUM_COLUMN: case TRACKLIST_ARTIST_COLUMN: case TRACKLIST_TITLE_COLUMN: { retval = sort_iter_compare_func(model, a, b, GINT_TO_POINTER(sort_column_id)); } break; case TRACKLIST_LENGTH_COLUMN: { gchar *text1; gchar *text2; gtk_tree_model_get(model, a, sort_column_id, &text1, -1); gtk_tree_model_get(model, b, sort_column_id, &text2, -1); retval = compare_lengths(text1, text2); g_free(text1); g_free(text2); } break; default: { /* Dynamically decide how to handle different text types */ if (coltype == G_TYPE_STRING) { gchar *text1; gchar *text2; gtk_tree_model_get(model, a, sort_column_id, &text1, -1); gtk_tree_model_get(model, b, sort_column_id, &text2, -1); if (!text2) retval = (text1 != NULL); else if (!text1) retval = -1; else retval = g_strcasecmp(text1, text2); g_free(text1); g_free(text2); } else if (coltype == G_TYPE_INT) { guint int1; guint int2; gtk_tree_model_get(model, a, sort_column_id, &int1, -1); gtk_tree_model_get(model, b, sort_column_id, &int2, -1); if (int1 < int2) retval = -1; else if (int1 > int2) retval = 1; else retval = 0; } } } } return retval; } /* This intercompare function sorts the directories on top of * the files in the harddisk list view. (It is not used at all * for the jukebox view.) */ static gint datalist_compare_func (GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) { GType coltype; gint retval = 0; gint sort_column_id; GtkSortType order; gboolean sort; guint size1; guint size2; /* Check validity of iterators */ if (a == NULL || b == NULL || a->user_data == NULL || b->user_data == NULL || a->stamp == 0 || b->stamp == 0) { g_print("Bad iterator!\n"); return 0; } sort = gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE(model), &sort_column_id, &order); if (!sort) { return 0; } gtk_tree_model_get(model, a, FILELIST_SIZE_COLUMN, &size1, -1); gtk_tree_model_get(model, b, FILELIST_SIZE_COLUMN, &size2, -1); coltype = gtk_tree_model_get_column_type(model, sort_column_id); /* First, if the size is zero, it should be on top * (directory!) */ if (size1 == 0 && size2 != 0) { if (order == GTK_SORT_ASCENDING) return -1; else return 1; } else if (size2 == 0 && size1 != 0) { if (order == GTK_SORT_ASCENDING) return 1; else return -1; } /* And directories are ALWAYS internally sorted on directory name! */ else if(size1 == 0 && size2 == 0) { gchar *text1; gchar *text2; gtk_tree_model_get(model, a, FILELIST_FILENAME_COLUMN, &text1, -1); gtk_tree_model_get(model, b, FILELIST_FILENAME_COLUMN, &text2, -1); if (!text2) retval = (text1 != NULL); else if (!text1) retval = -1; else { retval = g_strcasecmp(text1, text2); } g_free(text1); g_free(text2); if (order == GTK_SORT_DESCENDING) retval = -retval; } else { /* Dynamically decide how to handle different text types */ if (coltype == G_TYPE_STRING) { gchar *text1; gchar *text2; gtk_tree_model_get(model, a, sort_column_id, &text1, -1); gtk_tree_model_get(model, b, sort_column_id, &text2, -1); if (!text2) retval = (text1 != NULL); else if (!text1) retval = -1; else retval = g_strcasecmp(text1, text2); g_free(text1); g_free(text2); } else if (coltype == G_TYPE_INT) { guint int1; guint int2; gtk_tree_model_get(model, a, sort_column_id, &int1, -1); gtk_tree_model_get(model, b, sort_column_id, &int2, -1); if (int1 < int2) retval = -1; else if (int1 > int2) retval = 1; else retval = 0; } } return retval; } void view_and_sort_list_store(listtype_t listtype) { gint i; if (gnomad_debug != 0) { g_print("Enter view_and_sort_list_store(%d)...\n", (gint) listtype); } /* All should be found now */ gtk_tree_view_set_model (GTK_TREE_VIEW (get_view(listtype)), GTK_TREE_MODEL (get_store(listtype))); if (listtype == HD_LIST) { for (i = TRACKLIST_ARTIST_COLUMN; i < TRACKLIST_ARTIST_COLUMN + TRACKLIST_N_COLUMNS; i++) { gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(transfer_widgets.hdliststore), i, hdlist_compare_func, NULL, NULL); } gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(transfer_widgets.hdliststore), TRACKLIST_ARTIST_COLUMN, GTK_SORT_ASCENDING); } else if (listtype == JB_LIST) { for (i = TRACKLIST_ARTIST_COLUMN; i < TRACKLIST_ARTIST_COLUMN + TRACKLIST_N_COLUMNS; i++) { gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(transfer_widgets.jbliststore), i, hdlist_compare_func, NULL, NULL); } gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(transfer_widgets.jbliststore), TRACKLIST_ARTIST_COLUMN, GTK_SORT_ASCENDING); } else if (listtype == HDDATA_LIST) { for (i = FILELIST_FILENAME_COLUMN; i < FILELIST_FILENAME_COLUMN + FILELIST_N_COLUMNS; i++) { gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(data_widgets.hdliststore), i, datalist_compare_func, NULL, NULL); } gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(data_widgets.hdliststore), FILELIST_FILENAME_COLUMN, GTK_SORT_ASCENDING); } else if (listtype == JBDATA_LIST) { for (i = FILELIST_FILENAME_COLUMN; i < FILELIST_FILENAME_COLUMN + FILELIST_N_COLUMNS; i++) { gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(data_widgets.jbliststore), i, datalist_compare_func, NULL, NULL); } gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(data_widgets.jbliststore), FILELIST_FILENAME_COLUMN, GTK_SORT_ASCENDING); } } void recreate_list_store(listtype_t listtype) { clear_list_store(listtype); g_object_unref(get_store(listtype)); if (listtype == HD_LIST) transfer_widgets.hdliststore = create_hdliststore(); else if (listtype == JB_LIST) transfer_widgets.jbliststore = create_jbliststore(); else if (listtype == HDDATA_LIST) data_widgets.hdliststore = create_hddataliststore(); else if (listtype == JBDATA_LIST) data_widgets.jbliststore = create_jbdataliststore(); } void create_list_stores(void) { /* The list stores */ GtkTreeStore *pltreestore; pltreestore = gtk_tree_store_new(PLIST_N_COLUMNS, G_TYPE_STRING, /* name */ G_TYPE_STRING, /* artist */ G_TYPE_STRING, /* title */ G_TYPE_STRING, /* length */ G_TYPE_STRING, /* Playlist ID */ G_TYPE_STRING /* Song ID */ ); transfer_widgets.hdliststore = create_hdliststore(); transfer_widgets.jbliststore = create_jbliststore(); playlist_widgets.pltreestore = pltreestore; data_widgets.hdliststore = create_hddataliststore(); data_widgets.jbliststore = create_jbdataliststore(); } void clear_list_store(listtype_t listtype) { if (listtype == HD_LIST) gtk_list_store_clear(GTK_LIST_STORE(transfer_widgets.hdliststore)); else if (listtype == JB_LIST) gtk_list_store_clear(GTK_LIST_STORE(transfer_widgets.jbliststore)); else if (listtype == HDDATA_LIST) gtk_list_store_clear(GTK_LIST_STORE(data_widgets.hdliststore)); else if (listtype == JBDATA_LIST) gtk_list_store_clear(GTK_LIST_STORE(data_widgets.jbliststore)); else if (listtype == PL_TREE) gtk_tree_store_clear(GTK_TREE_STORE(playlist_widgets.pltreestore)); } gnomad2-2.9.6/src/data.h0000664000076400007640000000125611512614631011667 00000000000000/* data.h Data transferring window widgets and callbacks, header file Copyright (C) 2001 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you xcan redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef DATAH_INCLUDED #define DATAH_INCLUDED 1 GtkWidget *create_data_widgets(void); #endif gnomad2-2.9.6/src/player.c0000664000076400007640000003425111601425627012252 00000000000000/* player.c Player window for jukebox file playing Copyright (C) 2001-2011 Linus Walleij This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "common.h" #include "player.h" #include "jukebox.h" #include "util.h" typedef struct { guint16 effect; gint16 min; gint16 max; } eax_adjust_props_t; static gboolean playing = FALSE; static GSList *exclusive_patches = NULL; // Previous (since last callback) position in the file as percent static guint prevpos; /* option values */ static void patch_changed (gpointer combo, gpointer data) { GSList *tmplist; gboolean was_exclusive = FALSE; guint effect = GPOINTER_TO_UINT(data); guint patch = gtk_combo_box_get_active(GTK_COMBO_BOX(combo)); // See if it is exclusive tmplist = exclusive_patches; while (tmplist != NULL) { if (combo == tmplist->data) { was_exclusive = TRUE; } tmplist = g_slist_next(tmplist); } // OK it was exclusive, reset all other exclusive patches... if (was_exclusive) { tmplist = exclusive_patches; // Reset all while (tmplist != NULL) { if (combo != tmplist->data) { // Reset it gtk_combo_box_set_active(GTK_COMBO_BOX(tmplist->data), 0); } tmplist = g_slist_next(tmplist); } // Then make sure it is set gtk_combo_box_set_active(GTK_COMBO_BOX(combo), patch); } if (playing) { // Wire scalevalue to 0 // g_print("Selecting patch %d for effect %04X\n", patch, effect); jukebox_adjust_eax(effect, patch, 0); } } /* options = name -> value -> name -> value -> ... */ /* This code for GTK+ 2.3 / 2.4 and up */ static GtkWidget *create_patch_menu(guint16 effect, GSList *patches, GCallback callback_function, guint default_patch) { GtkWidget *combo_box; GSList *tmplist = patches; guint mr_effect = (guint) effect; // Create a combo box combo_box = gtk_combo_box_new_text(); // Then use gtk_combo_box_get_active() for numbering // Add rows to the combo box while (tmplist) { gtk_combo_box_append_text(GTK_COMBO_BOX(combo_box), tmplist->data); tmplist = tmplist->next; } gtk_combo_box_set_active(GTK_COMBO_BOX(combo_box), default_patch); g_signal_connect(GTK_OBJECT(combo_box), "changed", G_CALLBACK(callback_function), GUINT_TO_POINTER(mr_effect)); gtk_widget_show(combo_box); // Free memory used by list tmplist = patches; while (tmplist != NULL) { g_free(tmplist->data); tmplist = tmplist->next; } g_slist_free(patches); return combo_box; } void prevbutton_click ( GtkButton *button, gpointer data ) { if (playing) jukebox_previous(); } void nextbutton_click ( GtkButton *button, gpointer data ) { if (playing) jukebox_next(FALSE); } void stop_playing ( GtkButton *button, gpointer data ) { if (playing) { cancel_jukebox_operation = TRUE; playing = FALSE; } } static void adjust_scalevalue (GtkAdjustment *adj, gpointer data) { eax_adjust_props_t *adjprops = (eax_adjust_props_t *) data; // gint16 scalevalue = adjprops->max+1 - ((gint16) adj->value); gint16 scalevalue = (gint16) adj->value; if (playing) { //g_print("Setting scalevalue for effect %04X to %d\n", // adjprops->effect, scalevalue); jukebox_adjust_eax(adjprops->effect, 0, scalevalue); } } static void close_scalevalue (gpointer data, GClosure *closure) { eax_adjust_props_t *adjprops = (eax_adjust_props_t *) data; //g_print("Destroying adjprops for %04X\n", adjprops->effect); g_free(adjprops); } static GtkWidget *create_adjustment_control(guint16 effect, gint16 min, gint16 max, gint16 current) { GtkObject *adjustment; GtkWidget *vscale; eax_adjust_props_t *adjprops; adjprops = (eax_adjust_props_t *) g_malloc(sizeof(eax_adjust_props_t)); adjprops->effect = effect; adjprops->min = min; adjprops->max = max; /* adjustment = gtk_adjustment_new ((gfloat) max+1 - current, (gfloat) min, (gfloat) max+1, 1.0, 1.0, 1.0); */ adjustment = gtk_adjustment_new ((gfloat) current, (gfloat) min, (gfloat) max+1, 1.0, 1.0, 1.0); vscale = gtk_vscale_new (GTK_ADJUSTMENT (adjustment)); g_signal_connect_data(GTK_OBJECT(adjustment), "value_changed", G_CALLBACK(adjust_scalevalue), adjprops, close_scalevalue, 0); gtk_widget_set_usize (GTK_WIDGET (vscale), 20, 120); gtk_range_set_update_policy (GTK_RANGE (vscale), GTK_UPDATE_CONTINUOUS); gtk_range_set_inverted (GTK_RANGE(vscale), TRUE); gtk_scale_set_draw_value (GTK_SCALE(vscale), TRUE); gtk_scale_set_digits (GTK_SCALE(vscale), 0); return vscale; } static void toggle_onoff (GtkCheckButton *toggle, gpointer data) { gboolean togglestatus; guint16 onoff; guint effect = GPOINTER_TO_UINT(data); togglestatus = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)); if (togglestatus) onoff = 1; else onoff = 0; if (playing) { // Wire scalevalue to 0 jukebox_adjust_eax(effect, onoff, 0); } } static GtkWidget *get_eax_controls(void) { njb_eax_t *eax; GtkWidget *hbox; GtkWidget *group_box = NULL; GtkWidget *label; GtkWidget *checkbox; GtkWidget *vbox; guint16 lastgroup = 0xFFFF; #define HORIZONTAL 0x00 #define VERTICAL 0x01 u_int8_t last_direction = HORIZONTAL; // Clear old exclusive list... if (exclusive_patches != NULL) { g_slist_free(exclusive_patches); exclusive_patches = NULL; } // Stuff all EAX stuff into this frame hbox = gtk_hbox_new(FALSE, 5); jukebox_reset_get_eax(); while ((eax = jukebox_get_eax()) != NULL) { // FIXME: reset all exclusive effects when an exclusive is selected. // Eax group has its own box if (lastgroup != eax->group) { if (group_box != NULL) { // pack previous frame gtk_box_pack_start(GTK_BOX(hbox), group_box, TRUE, TRUE, 0); gtk_widget_show(group_box); } // If this groups consists of scalevalues (we are guessing // that the first group member speaks for the rest), then create // a hbox, else (for patches etc) create a hbox. if (eax->type == NJB_EAX_SLIDER_CONTROL) { group_box = gtk_hbox_new(FALSE, 0); last_direction = HORIZONTAL; } else { group_box = gtk_vbox_new(FALSE, 0); last_direction = VERTICAL; } } // Then each effect with it's label is stuffed in a vbox vbox = gtk_vbox_new(FALSE, 0); // onoff values if (eax->type == NJB_EAX_FIXED_OPTION_CONTROL && eax->min_value == 0x00 && eax->max_value == 0x01) { guint effect = (guint) eax->number; checkbox = gtk_check_button_new_with_label(eax->name); if (eax->current_value != 0x00) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), TRUE); } g_signal_connect(GTK_OBJECT(checkbox), "toggled", G_CALLBACK(toggle_onoff), GUINT_TO_POINTER(effect)); gtk_box_pack_start(GTK_BOX(vbox), checkbox, TRUE, TRUE, 0); } else { // All non-onoff effects need a label too. label = gtk_label_new(eax->name); gtk_misc_set_alignment(GTK_MISC(label), 0.0f, 0.0f); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); // Patch value combobox if (eax->type == NJB_EAX_FIXED_OPTION_CONTROL) { guint i; GSList *names = NULL; GtkWidget *patches; for(i = 0; i < eax->max_value - eax->min_value + 1; i++) { names = g_slist_append(names, g_strdup(eax->option_names[i])); } patches = create_patch_menu(eax->number, names, G_CALLBACK(patch_changed), eax->current_value); gtk_box_pack_start(GTK_BOX(vbox), patches, TRUE, TRUE, 0); if (eax->exclusive) { // Add to list of exclusive stuff exclusive_patches = g_slist_append(exclusive_patches, (gpointer) patches); } } // Scale value slider if (eax->type == NJB_EAX_SLIDER_CONTROL) { GtkWidget *slider; // g_print("Scalevalue %s, min %d, max %d, current %d\n", // eax->name, eax->min_scalevalue, eax->max_scalevalue, // eax->current_scalevalue); slider = create_adjustment_control(eax->number, eax->min_value, eax->max_value, eax->current_value); gtk_box_pack_start(GTK_BOX(vbox), slider, TRUE, TRUE, 0); gtk_widget_show(slider); } } gtk_box_pack_start(GTK_BOX(group_box), vbox, TRUE, TRUE, 0); gtk_widget_show(vbox); lastgroup = eax->group; jukebox_destroy_eax(eax); } // Pack the last group box gtk_box_pack_start(GTK_BOX(hbox), group_box, TRUE, TRUE, 0); gtk_widget_show(group_box); return hbox; } static void adjust_position (GtkAdjustment *adj, gpointer data) { // eax_adjust_props_t *adjprops = (eax_adjust_props_t *) data; // gint16 scalevalue = adjprops->max+1 - ((gint16) adj->value); gint16 pos = (gint16) adj->value; // Calculate the byte position offset guint delta = 0; guint skipto = 0; // If we just passed a track boundary there is no delta, // else we find out how much the position has changed. if ((prevpos == 100 || prevpos == 99) && (pos == 0 || pos == 1)) { delta = 0; } else if (pos >= prevpos) { delta = pos - prevpos; } else if (pos < prevpos) { delta = prevpos - pos; } // If someone has dragged the progress bar, delta will be more // than 2 percent (let's say). if (delta > 2) { skipto = pos; } // If we're skipping backward or forward, execute this. if (playing && skipto > 0) { metadata_t *meta = jukebox_get_current_playing_metadata(); guint seconds = mmss_to_seconds(meta->length); guint mspos = (seconds * 1000 * skipto) / 100; g_print("Skipping to millisecond offset %d in track\n", mspos); // Call NJB jukebox_skip_songposition(mspos); } prevpos = pos; } /* Creates a complicated player window */ void create_player_window(GList *metalist) { static play_thread_arg_t play_thread_args; GtkWidget *label1, *label2, *label3, *dialog, *button, *separator; GtkWidget *hscale, *eax_controls; GtkWidget *hbox, *hbox2, *vbox; GtkAdjustment *adj; // Playback on MTP devices not supported. (Yet.) if (jukebox_is_mtp()) { create_error_dialog(_("Playback is not supported on MTP devices")); return; } play_thread_args.metalist = metalist; dialog = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW (dialog), (_("Playing tracks on the jukebox"))); gtk_box_set_spacing(GTK_BOX (GTK_DIALOG (dialog)->vbox), 5); gtk_box_set_homogeneous(GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE); gtk_window_set_position(GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE); label1 = gtk_label_new(_("Playing:")); label2 = gtk_label_new(""); /* value, lower, upper, step_increment, page_increment, page_size */ /* Note that the page_size value only makes a difference for * scrollbar widgets, and the highest value you'll get is actually * (upper - page_size). */ adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 101.0, 0.1, 1.0, 1.0)); hscale = gtk_hscale_new(adj); // To make it possible to skip into the song // gtk_widget_set_sensitive(hscale, FALSE); g_signal_connect_data(GTK_OBJECT(adj), "value_changed", G_CALLBACK(adjust_position), NULL, // data NULL, // destructor 0); gtk_widget_set_usize (GTK_WIDGET (hscale), 200, 30); gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS); gtk_scale_set_digits (GTK_SCALE(hscale), 1); gtk_scale_set_value_pos (GTK_SCALE(hscale), GTK_POS_TOP); gtk_scale_set_draw_value (GTK_SCALE(hscale), FALSE); gtk_widget_show (hscale); button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_STOP); gtk_widget_set_can_default(button, TRUE); gtk_box_pack_start(GTK_BOX (GTK_DIALOG (dialog)->action_area), button, FALSE, FALSE, 0); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(stop_playing), NULL, 0); g_signal_connect_object(GTK_OBJECT(dialog), "delete_event", G_CALLBACK(stop_playing), NULL, // GTK_OBJECT(dialog) ??? 0); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, TRUE, TRUE, 0); vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); separator = gtk_hseparator_new (); gtk_box_pack_start(GTK_BOX(vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), label1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), label2, TRUE, TRUE, 0); /* Manouver panel */ hbox2 = gtk_hbox_new(FALSE, 0); button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_PREVIOUS); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(prevbutton_click), NULL, 0); gtk_box_pack_start(GTK_BOX(hbox2), button, FALSE, TRUE, 0); gtk_widget_set_can_default(button, TRUE); label3 = gtk_label_new("00:00:00"); gtk_box_pack_start(GTK_BOX(hbox2), label3, TRUE, TRUE, 0); button = gtk_button_new_from_stock(GTK_STOCK_MEDIA_NEXT); g_signal_connect_object(GTK_OBJECT(button), "clicked", G_CALLBACK(nextbutton_click), NULL, 0); gtk_box_pack_start(GTK_BOX(hbox2), button, FALSE, TRUE, 0); gtk_widget_set_can_default(button, TRUE); gtk_box_pack_start(GTK_BOX(vbox), hbox2, FALSE, TRUE, 0); separator = gtk_hseparator_new (); gtk_box_pack_start(GTK_BOX(vbox), separator, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hscale, TRUE, TRUE, 0); eax_controls = get_eax_controls(); gtk_box_pack_start(GTK_BOX(hbox), eax_controls, TRUE, TRUE, 0); /* Get all settings from jukebox */ gtk_widget_show_all(dialog); play_thread_args.songlabel = label2; play_thread_args.timelabel = label3; play_thread_args.adj = adj; play_thread_args.dialog = dialog; cancel_jukebox_operation = FALSE; g_thread_create(play_thread,(gpointer) &play_thread_args, FALSE, NULL); playing = TRUE; } /* Plays a certain playlist with ID plid */ void play_playlist(guint plid) { GList *playlist; /* Get the playlist from the jukebox */ playlist = jukebox_get_playlist_for_play(plid); if (playlist != NULL) create_player_window(playlist); } gnomad2-2.9.6/src/tagfile.h0000664000076400007640000000144411512614631012370 00000000000000/* tagfile.h Interface to the taglib library for Ogg/FLAC file tags. Copyright (C) 2007 Peter Randeu This file is part of the GNOMAD package. GNOMAD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. You should have received a copy of the GNU General Public License along with GNOMAD; see the file COPYING. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TAGFILEHEADER_INCLUDED #define TAGFILEHEADER_INCLUDED 1 void remove_tag_from_file(gchar *path); void get_tag_for_file (metadata_t *meta); void set_tag_for_file (metadata_t *meta, gboolean override); #endif gnomad2-2.9.6/gnomad2-logo.png0000664000076400007640000011465711512614631013023 00000000000000PNG  IHDRLPbKGDC pHYs.#.#x?vtIME- < IDATx̽Ymu%6kۼ||#)JHITʱ;UbUFb@AB> g* |بHP"2%R۝sk91׹Aws^{9cu>{|06 Y4hhjZ5LQ-*fM , 3GBęDDRZPG`D?὾̌\_5 0L̎wD$wIoDTX#c]k},z?,GW^>JU˥KI90Ų?\f؎LS̢]L}7~fMLQ"+&^! ˂b^2HD# b0o5 ,`恉2Y.ۦHA0@@zYfq F3@cngyF͢5 ڨikj:S-5V77"b1Q&≙WL<'aYxdߌ30̟2} 7kf6+lNxj5,.Ns/z«ז'}D42JQ״P{fSJVׯ>3|v3QuL1phE!P33C$!6 ؽq)LS©',#UFo}|0u9&(dhC\ipk"a9cocN95OJȦF0 B(TB` 1T@lp̠jTT)"䬔rU1ĢQC!bn!ԅ09jJCJՐLSn28C &I)& DYQR56TP!-(EY$_6߼z.ʹzWG[ovio-h'e}`jP&5әհgoy;=-žimش! b"1Qj``9aMcc 4`Ωj MmmیY5G+efEFY1,2,*!4 ¦iJQs\JTURXUYUXU1@e!e! B$\JjR.Tf6gÐfŨE[3@b0J!""Ubf ajLdjb(e4ٰg]inKI&鵷opJ>sO>vgN{y6|}^ie`ׂoXfƪJ8^ox3O~x[w^<\ M;ۢqjf=!FAl"8F!  1BhſO Pbl`DRд6 AAdM#!dB4& 10OD8Z&FM\` G%b0`lN.$ 1@UEUEY9h#J,5iS-c)J,E!0 bj-aDٴ~*( -W֫l;ӰiLB9<սy?/'?3+]ۿc{e^B)O9兯}}y[m7 d A\%X!A`̆ YBL/mKMB]=n'N M#L4 ±mUb؆bf ۙa?%?}/.^Dic{kO^ą/a |ý%}l?[osun.hsʯ۱bƁ40dLED Ta&`5LH 5sx֘) 6 Aj!g (9q,Ld,,Ĭ f2f&dE˱]rk ~\2l4`l9cU(/c7i޳Ca˪pςaHS vb5f3-i±]=y<NX{`[\gya~l/C|jveJKWJӐ97wfvx0WXr|.ٶeRb -9(%^oݼqɓ'KLyG@UYo8{8;\,"̻pX q 667m 9Ibu4LI b#4҂2SZ:#x0Rz٨gz3QE3z"ꉨkBH#EKčfjQFAM3X LDD ̈A1%7nAd(WtEhNk'\4yH}4ʛ#VSc6 a!"fMlDB%k;|+-ec~ ͌մ)̆auc{0 $D$ "0S}08F4]}y@姞w|~~4 ܼ;^5VZS_vc1"p`Nڶ R`FN2yaáy'o:S.4Ϊ{b,3 X;2Sab085 ZSo㋟0C' _b)8?`i@$9`"7y0~v!MzS.D5v5""&@ՈELU j``Ab)  0 %9SGR`fPRD0U(`*>Fb,l NcRc;L7s5^CV! rpb'_=,]Woe8o\_`ȍ-f8BdSh"(7o"׉Vs7ݍvrLpVxW|U}xhWc30` Ym 6|g B fC?o@#<8@^DM`f`(E$XBhԁBij2@jǶV{S3MeS N#5PZ?rңג\0uˁ1@L< jK 2X (2 ʹ ApLF`XIf[%2*d|staʠoD+d nÜDiٌn-<3 X!^vk3i^teCUۢyvbN)1DX+~ fE@  D)+@#"Lędv`& #3# ZPTT@SsB߻:i% LJ!UaPDE=1}V3<КbPң7"hTJ 3-J. K2ĽD(iQ&ShQRF >s-: #r~JIA;Y{ثXo|XR&o[axM\!LT24 2b1 D3fEBl+ Ҭ[Od~m9B ]a(R{08(ceG ZJ`vǕ(HW19j(j hyy]7:-۴(J`u&3j{ b kGjQI@,4wi{Ҙz)| z&?8\dي:ݎm*+ Hشȥ 6E-<`*^Bӂ*#` d-@YfAl[hQ2N؜x̜jA5 hPMn\VXpwRX #E[[66!t=$D@ kptLa*@ѱfqfA:O!%]3Ng:hAx1#Kݐ9jsA5J#Ź9a6jX͊jfR/eAU0rh)I)8qj1LbxlcRDMl_APKeH`RQ4 ]׮:``TK{\ KX-G6F7{g3l:Mۂػq¸u+XF@ٻŻu0HY&I}ͼ U\jG4m=Y~ &"BV]:Cn)% 9Zw +NUáLnF9w0CZ1UKTiS\KKPPʀ"bП@JMs#C&B#!+ɹڑP& jW A%aVxG/o=Cl=Ν;~fm"4 ;/"-נTձ8!aouO 4ę+8ye4H3LdW[ FV^@91vfkMNQT^hH?#Zvq$"bjjZOc0 C7cȹO/0cwQCS݌LU] (   m睢kuv׼QQR#3<;#`X,fXn)ƶw ;10L]KbN}]oBU"Q;[JAjլ`\N8.8#^G֗2Nr|GpI631 hbD.~)6P !֠0d5Vjr9c⭷o/'_`}'/܅guj# &$m1 #3HeR”v8i7Tt]210V&ѷHY1q0 y)윹 -L j$j'Uv*V %)bm"ik#oL Į>#V*@qʲX:-SZA>]aJP\J:vn=MOnUOL6!;tsEu)efd3M|'p5<{sl ;[gQ0ztMD#(@3pX*RZ="#~ L MtB3k0:iքvvqsrW/sopx@uҟLp%v@ou}rNȹR {ĪLlV) ϴB CAQ;ʒLbilޙ3\2-cZ2_scwbQaK.RHb|պ+48&5@nOQ%Cд(՜%@=4"0#qلꃂ@C·ocG c`Rm&Z06(*6YԖ5?^w3nrCV@܂(:%h*{VX^cqq76bYۢ "EւbI)*{WTpܻ TJFם=U D E ([t]f587p KST5=_3J k 1m1w+`1b1 q BuLI:LcගCx?GQt=-<)\TOc_ V;(*1' jfw* Xv5B3Rl WpWȣĕ{ƙ3 ]C`ҚH 90n~}7n"kmJ;$rBn"83p|gOé[@l{貕Pm4D7-:0a hv66}b9O= \zuPM.FqwUw8PuܖjN#= *ȹ@y:s@%@Bф; eLSq21YjsQJQRAOeqOQ N" +k٧X,};/)X; }nquc\uV,9 b+*HjX 1MSG|/>#SJ2,8(U/J\B1ؑ:_qvc* HkTJ5cr|sA@ƃ܏:;;D?k#;p.jL  /|m$ 8q">1-X #R\@ K8e|S`vl ;o;`Xᇯ>MhZ>8s,b5 9#0#Ygh k,)|;=? fVԎdb.,0x@r+ƍFNzH qJA!G IU4MMNY(#̻ (Ds]总k6 mW{5WaVx 2p:YjrAYxg҃W_|SXN ˫`9;ɨk}rEVȔrl4Uq!1^z6!m&=OO9u()rkf " ,c4Mr(NJ #Z9DTNO$-=s!xH>A}݋sb{k ~mw1nO>׮끇_{(E+qzJӇiDIE]"CQX5z$5gmY~by(݀>lm hY2._<rx_ƃ{fk:XRm@J0rw Qw#R\̠.[O jմƱ)R2#rU]TŹ(ꡮdkTF kSfRݷNWDY-ؘv-&Wx O>,; S^f^UӔ!iq \߃zzi#b2Hg!,D$"6YӂCi\0z|?|>~19C Ξ;l(3_7Ľz !uR;U!sQ@IQ82353JQW!4L3hRxd:0L}r6)"l0cb}_x O޿sc}3G#.؆](9aZs]?ǹ{H&#9WZsG(En^]Rr}+sI\dRk Ё̻X5L[ҭqs3$~#ԟ GáTAj9 )lJ,]+$ kAd| o"rNƬG7k(O~ 'qF -~)!?R5)9gWp Rp`WJ 6[_0W5ZND"x$8 "1:llm`wavN _}_9wl43?TA2ůb6u;=ɐsbEu/unq=แ`YX0 Su_ cJIal|hзϙu) VcJvNvx^\BJ)0-ri۩;wm|9i6SZ.+ˎ2ȇ Nh{I?{ 'N&CFĭ `X0V〒ZVsՃTϞn%RO%u[S=ǘ)TT>Ѐj1r5]#8`[wsj'm{4m62=h:F&kymLKC3PmvU]OcBTe)[a~<`:\~oz.g~'oågXG>,}Mӂٙ}]NJ0%=N>Tvsrj3ONZj9Ē(ڶYV+>"R\# MtX!S {Hp޻sl Mׁ /~{K8yKz T#Wˎ-@6ݪ(p;k-]w# OXA|͡I"{nk~mܸp'Ona܃O~ױ1㞻aX'gqeNc YB!2Xqv="T4P24hRwKarDUev0E )jmAXCV@x~fwC4,G7<"F6~ :m?YvqTNgzdb aEM;lv+t #0]$G76| HXR $Z"EI$dy^kU.>FڵzP1z'a둏cw{wqtoҵH)!"M#y~-R2 61Y^YC dNԭA Rt%Jssdi٬.h '8^< Z\[^CWlK/'G`/|sn4 H֩Ǩ=^{zУ%&%da<$Zc%q6esκ+w6? '֫Uh֤DӉG2$wI)I4 FDCDE"ⷿ)60PU|Q…~9+.Ve&ԮѬOе) Դo"S4.5rȃ4 wwL`j`Z]go쬙0tl!A͓"`k{w<`M\t O=y翃>HY ӹ$Q\*&PV U:AoCN_D)%r.!Y{O\ )z^ڶ+ع2#5҆:^1{sUE '(ka:10Gb>{ W uj(X/mA̝P-orzt\~ا7$[7̵Hx6UD bT:a]/F%uYa=,h/>]|O{ݭ \|O~q7y Ge03X9ո-m \6ګә(nbhۦ4޻wk9j4]躖-|H7b*r#8RJF[ţs6ԳT^C o]\UY*j roazQ۝"%Ǽ~1%4vɸsT%ཇ<.tȠjhס=Fp7K@6 @ɔ)]`DbgsmDXtJ$tmӭMlƿ| M*Pvwqܼ֟?.&\փMȍ }qẅVA3q.r1+u+\}]\Fzv]ּgeu.FS<hV1iQs?.00KQ)oݜ㡧> @69[;fsM ʲ9A&DʶdjKk1!c +H&,VK5 +mۘ'C2? -f)* ]'8;Bn:3$vX--5+8_V#HMOV2ȧrd<•KpKy&x1@Y$"f߭ua125mW8KE>X,">Trܶbb">gu2uW:y`-"GxpM\xQ _u _xch81"F.b8@&L7&NJ:qHBFy MR)Eh BU7#( 8/ntZ"fe;k3:p`1>a~ۨ#Ĕڡ)!Ƅjm<|/By'}2n}gqzb0AS17ڮTC%(ۺ@u/\HS}ᰈwU+}N)V''Q6>D*"Dv|[INQ\7a{g=ѐ`^}01T( fnoa2*|e ssv[(GBWb^C쀐^6V *bhmbQ5:#T ePT%\U^PoTѬ#RХ5I#6bu кiSBrtZf1& >K\h:AJɟ{6hhUWaAQxl6p. p+;u9"ń^ѮȄ,H֖[B mreR$ s֊^GŢjΥYM@X@hw &T2Қ3 H^69q.@]&x.6U(Mm ;#CQ;0^:ţq sM̬تڞDDtMw1ll{,ˠ{38Q;A oFTH)#mOkl޽CU'9]6.^}'5e>W^zo_?lH,SuU虥(̋պgԙzêfu[Įcu퍻ذk9AOe&Qƨ#RFBw^yI.ݲ7uIQj) !6PJGwڄ0TGiRFQfP$*0CZ.ΣJFfAfħļNW?PFUᭆocs{W/fu3|h oϘN@Y+g3KG|:egFt(g \tz}*wqE^.VETlc$s'6.eg8f.aIؔ7[Ǿ!%-d NmU$z>x6UbOK2a.GYWL^ حP,qr@:0(m`h@)NQ` 8V/gr IDAT?L{؁02jz{MR(B B=0TnZ4md(/q8q~{/_/}>N*ދo ]gJssSjʪQHVA@2͗Md֝{v ]2@zl#"0s_% kIj9ĄoH]zIQq~66_( >vА2<% VmQ{lD5-1ި5EYW(J QC]{L&jVTʺZegCXFZtjғͥ5ͥ ,xjS7ЋVQ3s.g^\{"`<3`8s) bנJi] 欇#$'IԷ2VϒtK0sZK[{bsF3^1&O XN}4A_1b7png,;`{w0|9t1GZb>lNJ^U ~f4 `dQU[! $Gdaq=RN-&ADDеsN<\b8*A=ssqL*S}@6XϜ @;aѠ6%hNRߤWUB) u]t8{W:I6ŐYUQv0t1bR)G8 O&K'zcqv5l=Vٗȩ?7Q}ms̥`YCY:̶Go@B9(v S3 Wm~Ni?YL@-BIPȾuu&33)iGΈ].WOa.~bQMx-IQ^|͢xĒ='JkCX腪b=l=K)PϷpUS(ݷ_E5,^BdC1"fFY!`9_q0wN#ʂf0.y>TZe2¨֊8ͬ”g%c=@4^haH4j7H*ِޏ1wήNrmLTWUs9p9('t&`F 9:javp>^.P#"VF  C<ڦU=jakgv SrD% 66QqI* ( )sll K0+Kȁq*$ZcC%B2 PVא;m%8;۸:e+Z(gR[*D-H<|\̉{1a*|'tdXJI)q A\RW8R)C |$'>uWܻ $;{+\ӒMxDt3K(1oZfΒ `qtt _DӒUxʓh`]D&5D"hCڔ2u&TDSP/X,M۝ Bf <P Cy Rıћ 7q>ʰsi;5ilk<:[> 9h&@}d1mku+еJ ==}w^r$u&, 4Ebѩ9Y"]sL 6ѻ$wS_R:@qIۇl[yG9a9*O4N@YDz-uT P+> -5RE`x2ޔE vH{y~1jXnj/XMJȐ 蹴XBNhsCs  ư',4K|خ]_Jbz!v yɬjb21*5zػCUG؋iE &\DprC/҇{l/p bXHYNޢR. .;_hK0b۩+ch?۷1"uB!`1;8 6k (za }cBĹWw>xv.$"6w^ w̶Ȃ;f'&#ʪ2LX%J [[8*B D#d sHVD '9) _e/ EbДf@=]źFᑰY{{bkeX8Rt#ѫ`yPՍwnXd">gb]=ِ%]hx틗r |Uk`]_y)#z=v~09陓_R$"P`[dy@zM)]43b HY\ػ{v"&LXkZBJBys%]t&ŶS5@ek9,cc,q6ݷ Xpxf"velSK{h0*Lӏ*'BP 6nR+5Y8uz2͸n6Zkͩ4B3ϝD&`t)?I;ăP%n^E8MIj*!iղE`GJ:8lP.UQTB0Lg$bĕ xrW5Wz\hF;hR;l4$%xι`ÙW+83ӖX"dD9 c:<`ř?D5-Q be,dY$CC${H@E6Y5d&W(\Aϟa<޲(Z7]X':DF$CN6l?AGs.c'#F5wA+N@^c2>kl4l~B)TL'yI;["@ʢ('H }"#D8z3eb@D6w9ΐz>n.(3N fln`\M-;EY/QNGmȲlx"tm;rGYk:5.2rOcV[jJCEwH1Y3&i DW/#SEO7̈9"8lQf{X|{-UDL7.20)gYW&䨑lDk-MIĻ8  hEY$g?~ϠGpC68>>$nzL9 Zo8@{z8guȈ$)%!uMu،% 3KJI;%p(D-ŢK!yH5]3sέ-$sVvڷFbTuc9rspP{(Y-V/[hy$jmر2|wĜ?`YoE:b^X!ty Zd8X"BNP?;9w` *MrJc}(ĜJ~羈W<]X,8! Ղ=U; EeBRɵ9U뽜yD :fad*t!>EtAKrf9PJDĹk[';G H"0dIf%Hˡp Jaһgǜ IbUޑ2(ۤ,`92HDh^sMӲSsuk"Ϻ(vL$)frbIcRjEr#bؿ׾uݿQԛۈmq;jُf5Nlz Κ^֥d*G6m' w, U.Zyq3Ɉ1Gfnʢ\Uv[D,i t5I^Ν6}71۾*!WvO%{w sW(UvLG$?яI5,km^f;',$$;xU 1$sy$a$ 3qE.! ŔID((LY.!޾K{{.O(3lF[vUr^78^|:!D0_y&aF̀Dl [24AB.0HeYQdv+bj T,#(1QtڲMQm(Bv .كavXrAHhWs2 ͐Q-rש L@t I O~#鍍w_Ͽ,ٟz:o+W.s[d[_o>'}aW\((:[{/$\xan0$W%mʢxTLqI[5d]\SLԛ`{{wo=QC; !u=. |mݟp|rdCS +j:Ḃtj q_>OUg,^}索j '?ܹu?1&*bzд %ĦQY[3c>7xSѶ 's5=,]Xjh,ly4(*cFG'fy Zw IDATv6{]fuA&j5cn)B]pǎr<)"9焨#I|KH \QmrlcY?.d hZMqPBDYƲ`d)tHRĝogKwnڮG}\}5h \) G^CqVUu_|%؜/ 6rlO|[[(' ) uUI[u|bwo) ʕȏ=?$nܼG]lUd@!#fIzAHLnXޑ 6r|SŠI eF]P,u]Ѥ6f㓲Nޯy̔~>x2焙 `@^s.P!k׵h ܾmeq.(K566?-`[H4sܾ0E ][+H3Sd$wx,qv4/\HQxO__~^~eWc ɱM7_'r>j+ qɌU+|rK~m]̉BY-su 沌S t]+YSQ2<*އAuCYW(.^(I%)|37[;ğ9̊R]!Ptf& 1\$F%5__ԕ[7v#DtcE5wi}6r(Kۡ]brpA9LD?cBEi֍|c:d dkkv`2(#Gz~:fP4]DZ2q:6c^ӏX}sM(¢,t:O'~ŽH2(F)${Z0Qkfn;b.ܑ|LOwno߿]ܾ~r20*lEN=r&=L"rȊ I,lsfBʫ0qYnRʙ$jIȃ@;]z_a0ɶL)v!=UBd5C{p?T|G67W_{?̳x덷 (a*g|.v@IEd޽xu\y2d>M f5{ߎǓn-tr/<_}0`S SUlj$e`X sU)SDNr׊g񸊛rwwc(C܂;u_K#8rҭՓѸj}kb21,TzA.5wuxkח_o_-hٔ'{w@MMjFXؾI!K4RȷbhrRJN 3E1Dj `ղO@&5I4w5UŖRnִn֔5I-R_>?zèDd}#H0# 9aZW2ۭCܒ[V:X֐5ܹ7vgٺ, yD8$*{a)#v  ELe"F\{7nUOҿW>=~ͷhXz݂C>!;%qOI ✙T5,?gZe[d42 V8>q* fҏJ+:PR082ͦD5d3XbČ$QU;9)hTt5;ܼ?fvKy%>hipWn?QUŦglzRo ʡ 1aQ:`u@WxsSxS_k;:Ã-W,ѐ2W?sb4u]7hrfb'UjLfEjzJ][gs&dȴv,+H,ӂrF,RɂP4}IZ| +/<'wܑ]<#铟l|艏gon-5i0%~D9X̤7J1(L&v{cvrawΨ5{&BQWa&>sBE֚:1soSG҆UIGri"$"'8zp]bur}aڒ`I¾Y&uvq⅕&a^w4&vw;tѝ}xl!fb m}[J:0,ѼQ{:_}66?݅W:rIww?|cNѥx7 }⬨'01i~$9C2mGysއ.>uΝTeqx~ŗ.2 'Ӝgdi@"}Mu\.Y5v(BweY~Ә\HF gb$ȓd~$TUɰ.9lX]Չ$ ۀrȢ]Q&N(ƎTxG2xf@;mHҞ ')2fG'{䕲(01- ]U4"3'uU_x窺S'R6;a?$q;l ΍} .^WΥ$pVklnnb2 r*» >`l&JCf͗V*^ (N}D1%>&wϼf6dק(gAL zE9,[dkk,綧ቻ}6W.W:,!xĶ YD\zTw>>W7669<נȊ{HxeYw,ի\8PJ@kƫ3wHY0̰.W[7ܕC~R/4[TfNc=zUNUsZsz1qiJ)R"DE f ~dA,̔S}:)4"{׾3W=a̦ ݖ7bz:;wqmo|lnn 3]#("ȧ W^;u}<v4RVzt؋+,O67&ǻ[[h!פֈY=rFpڨf:M'0'k̗?~GGXV )qwƹO<[7rrZVϼp^CςﱟlNfWd.ke^[wpM?slIvv ]ɱCKTEY )*v<ؘkʖ^DNE8&fh[׮ӧ~ gؠ^],毆}>(Bϩ=(fDAd݂-"jD]Ǟz omoo]c3uCX}* o]II2a'=r/Azq^~޺7ަCI%4YR[芭Xd1ltrpr|+\8KݼGQWu'عL!j*V{w=ܼu&e[WP7]OwW`>>?>3/9ɉcJm[MC'ܶ mK[\}o]ӖLa ]۪W Q'?tצ-!59K6ET>UY>ҹswU ]ZZ2zWAzJDIݛ+1/w?Cۘ/CWe?g]{ݳىg[Zz:.٣cpƈ5 Mې*}%MUo|-|W~7:nieF{jN'87G՝t<<2`sCXc;B[X)xzuՆVJ'JvEnZQ¯V3LzIнH6؀ު|J* /@PɅTZPJ(1 km[e0t1bdJ(gjܰ0&׿| v&nڧ[~nwo1/8yg!w2ĨpN5!?scgk3ZJ4?ػ۝>Ͳ|am֫?D'C)(YkƓq;/yU6V7-1F(PO2 ֬nP.q PˌuݚΉah uPK0v̇Iuĉ aZ()!`Rt?\~}?d0QCM"1,fK{X-67i6y*A9A-!?X8"m e:UNwK!6j<T{ý8 BHB\mIB6BMų^[LèMi7UW1pgD~"턛0g'aOXOBzDܞ]xʊ1MvxK.Fe@@d)8'899EcFt^`O"ě4A(/)q ~^ȗ{t- 懰NGh[ ޻G20A20VKsK(¨uFĺ#c&qh^;N3Ŭm#c'9>XFRp(,upr6e}ʍ5hΈf<<^YB:/ͷs}7G}NqCkд8??5 i/J cQ# K?A"Icζs3Nd(eYv5]Ffoj-0:o| V~Zi[%2kET@΁0I#0A@. ѥ?yk$8_hڦK! &q&~qxxpytttog( 3mt-eBTO ,w1 p˲p0ho6_'AEITi&u]viwW]6^{5 H5Jy|o+?ph{il(0Wg3{ =~vLF)^N*ĿϾ'x9a@H0䎧'P)»FM]Jo&*.6X.a ̯.aM;fp$!)ˊ3s?{w0>j M+B`)rE8<,-Wpﱲl[s~_èY&o`y+R?fn5uEwٻ{w~p Mcc~krxxD 菆v3Gݿ v`@*;Jp!+z2F5q ȱՖuzC@߇Am(Z˓gx1Ӊ%ժM]m2Q79) mc+3#YX/MH6Ҵ{ջvIs^,iO=:wi:ˬ?`g6Ne'ɗKB@I579|~}@4( }u=nR6ݥyfh7?UQh/aj9$CxK! B~;{$D+4@,Pnqf2:rt3 KZOhgg/./6]np~~EE]D|C( %-#V{7H57vUѭ rJ B,c܆B^/mF\w7K!/)e9!4uէ -!4M0)"Mxr:L./U!t<YJ Iu^m̿)ClKIuv6}u@lm<EFF`BpɡZCJ# ^8C. us! ;Q}j%>,s3ӝʍA9uJECDkr@UUj&PMmlK;XYkaz8uPΒLxs}ջwۙNax_Bm)O_u{ 8Ntz|ZjIL%Y/,um?y7Ƒ߄B8R[VDw@H b(ggT!~7T`!$WdqBet"Z0C"oiuZD_/hݴH\,Myʽ}c´-Pe;ww75&irh`]lo=w_^j9!F8'q~h`$Nq.fK IDATCO ^j9!cҲ,.ٓG[=xI\R3A$/756e٢USB]>BPgKNw6L" ݿ?zmke";{G[5Ek5AS+lMY@z%AH4QBJ pƀv#PNp{vշJ[u S_7 VWח'KZS{Y{?~+O<۽7U1I=RT%z]`h-}W["qL)~Ntk'` !bLG(|)P (MCPn6[ IXH{;d~4AX%zUW89A^?C?&w_9BD_u@JGo8@֟>Gve'G&Et]n͍5^%En~b)&v8{Ӄ'{'~F7RSTX[pB)+pv}מ|1XVAY7L`EUWWz8.ɋRH@|lIcpqk~_ XtnXMkp||  :c27Iwly⟛%X(g><;{p P"zH{p5<8x~pwgx4Ax9_B?W`G3lfWo~ypWg-դ4WNѳ{;;I9gN+>Ѹ?9~1]I)IOb7&׫pZMlfݽ]q !9B!Cz(TRc\ٖe]<ָS. K2+;C}>AFB8tF) 1}"QU5wOcLCQmaE]Qt 2-d~!̶{zN=#gDƀԧnCsB^ k&Q>N/?O˲a'A 甲R'?sWg !-c|e J몌/=ﭖkrJ)rxZb4Ao!hக|(+h23u, C{DT*L0F;f$O'VY|k1\C%- (;q'laT`)1 y|+#y>*CJv|t8tvm 8hƥjI֟>< v0l&ttѠ=8O 攲҃AiaV-\$IrFiꤩn8==-f3iۖjXbKlq!( Ŧ¦k` 4s X%{$ɩ1qsrbuRRJ9Ks= ۶ U#LY"KW(˚A0jiYb4K' AzAY7hj Njj F]F LPgD p1{)VW8?9/1_^!D5{u0N}\\-\}[ .~%T)F( MբiӨ+'O0F@Hئql^^Ze?_Qt&ы,M{'A,8gjէ)|G0<>FKc40J 8%r,i4D3TEa" &DU֨Z-j b[XwWpƭRR \:mOܲzǸ<{ L}_V5.ʹ>Ϛ92"ж W3y! R c5~d%yU4 7"1lG)r'$D6NBGJJ{Ub<=Ͳ(Ji!g=~\^8pEgRMӌ&xBW kІXmP,hp8@E@e٠i5vAAV0c+(J<[qE 01.Oz 01mXMW5[Bnl94S VA|fi kIh#IbI( m&BFIњY$NO'ɣ`,K!eN)kT*zsػxxΕ h*B-"ܬ7jbE6D55(I@@ $P,+TUu6C%FƸA&ևg (e^\Gxs )ў)й Y'qq7iv-Dl#v#ooZ A@ $q4M!022& VTh<ٽ?i,g)T?+~ڕ[B, I,!TQJ2((*(ܻ 2XFU.V9SR@MmYA$H"Q!ZGS( uݠi|ƋWبK  AQd;=Wr#0qqN9L}Jqq(8XRnр; ^.=]{.)u.8P c$Q(  42%n<%Σth|?M{/0sΫt\@YNWŹQsy 6QII_]^< BVKQhMiPoZF8FAhDQ UYn5B9_Z`¸&2ԭ>8lRӧ7`N(,7:|8.Jܬiq& `Ar( $D.4\pe-i*Pj:=N'`8IҗA^sJohL]G ! !Pj!D"I{^ZeGu//x^zͫDD+MtS! $A$a9 m\uU{OR2he5qNmJL)[l+;!!TwDRGkgqv\{z 1R w:(R+E`6A>ӝdx8?egqGuX?\! !ᜯ*B0\$Iz˲l0ۻܿ.yEhD)xUUQhe+EY Dq  Rr hCUi6-ڶVy[0 eK[(^Ū|ǿ0t[x7#ng+M? 9u-.B)OcI@JD. BeU]-gYGWd2>&4M_At!Xr4d Pc,Rk a4,|}_]_ݽsuy;t\z%ʲ`uH6DK IFo=;VPZC5 uӠv ܐ Eb+;nN-3ap[N4\OA(B RJ@ZjڦeM/ 7h>L'xt0=M{(ϥ[ X,`Za jӦeY׫;|6,d^y^(X]פi1]KEA:v2Ơm[Mm[Voi5\1ۺ ö?e;;y!:ޘ;u9)C 91nZkڶ4iAO&d4Y?L<z8N:!0[/F~T톹bo!.Aܦk,15\p+4A( ^ԽWU8 pxN^2ӳ = uSGm~N/X`בR*mzPU(6joZ/r9^jn<.",RuCZV)vCWՖo2K<[qB֍EVS%p9>1K 2(QC832#A u*M&NzeE` .~|)5bնiUUb3)ͤl&f3,6AQn,zeQ%UU$UQFUUEUUM]iiӶ35ug;bEt oC`BPA 0 J$$II[iL2IU' a̓ XH!看%e,p_/~QDp6ƍ)@CTҶMiA]WêUQ ˲U1b)6(FeQ:OR6nݢ݇~Xn^z88g[. daTQ:$I/$xE< ek) Q+R-" >@ _$`}$|=f-Pc4FZX6iUMӫjPU,ʝbNfZUeimִ-1nX2npPa&1˹K%,0\atɋ$I$yYG(Jfq,cHW7f$RيIENDB`gnomad2-2.9.6/gnomad2.desktop.in0000664000076400007640000000055011512614631013341 00000000000000[Desktop Entry] _Name=Gnomad 2 _GenericName=Nomad/Zen Jukebox/Dell DJ Client _Comment=A tool for managing Creative Nomad/Zen Jukeboxes and Dell DJs Exec=gnomad2 Terminal=false Type=Application Icon=gnomad2-logo Categories=GTK;AudioVideo; MimeType=application/x-ogg;application/ogg;audio/x-mp3;audio/x-mpeg;audio/mpeg;application/x-flac;x-content/audio-player; gnomad2-2.9.6/INSTALL0000664000076400007640000002023311512614631011043 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. Running Autoconf ================ Generally you don't need to run autoconf (the program that generates ./configure and related support files). You do need to run it if your source comes from the CVS repository -- ./configure does not belong in CVS because it can be generated. You might also want to run it if you need to use a newer version than was used to generate the ./configure file that you have. To run autoconf, in the top level directory, run this command: ./autogen.sh This will create ./configure. gnomad2-2.9.6/COPYING0000664000076400007640000004365311512614631011060 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy 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 Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.