#!/bin/sh progname=mugeco version=0.1 programr='Alexander Leidinger' progdate='7 Dec 2000' progdesc='MUltiGEnerationCOding' # NEEDS: getopt, lame # Please have a look at the DEFAULTS section. # $Id: mugeco.sh,v 1.6 2000/12/08 13:47:56 aleidinger Exp $ usage() { cat << EOF ** $progname v$version, $progdate ** by $programr $progdesc usage: $progname [ <flags> ] -g <num> <file> -v use builtin VBR options -g <num> number of generations -h help used - env vars: * LAME : alternative encoder binary * LAMEOPT: alternative encoder options - VBR opts: $enc_vbr_opts - CBR opts: $enc_cbr_opts EOF } # DEFAULTS # if you can, use getopt(1) (c)1997 by Frodo Looijaard <frodol@dds.nl> # it's in most modern unixen, or look at http://huizen.dds.nl/~frodol/ : ${GETOPT=getopt} # helper program # mktemp (optional) is also in most modern unixen (originally from OpenBSD) : ${MKTEMP=mktemp} # helper program : ${TMPDIR:=/tmp} # set default temp directory : ${LAME:=lame} # path to LAME enc_cbr_opts="-b192 -h --lowpass 18 --lowpass-width 0" enc_vbr_opts="--vbr-mtrh --nspsytune -v -h -d -Y -X3" enc_opts=${LAMEOPT:-$enc_cbr_opts} num= # default number of generations # DEFINE FUNCTIONS e() { echo "$progname: $*"; } die() { # usage: die [ <exitcode> [ <errormessage> ] ] trap '' 1 2 3 13 15 exitcode=0 [ $# -gt 0 ] && { exitcode=$1; shift; } [ $# -gt 0 ] && e "Error: $*" >&2 exit $exitcode } # tfile() # this function creates temporary files. 'tfile temp' will make a tempfile # and put the path to it in the variable $temp (defaults to variable $tf) trap 'for f in $ztfiles; do rm -f "$f"; done' 0 trap 'trap "" 1 2 3 13 15; exit 10' 1 2 3 13 15 unset ztfiles tfile() { # usage: tfile <variable_name> ztf=`$MKTEMP -q $TMPDIR/$progname.XXXXXX 2>/dev/null` # try mktemp if [ $? -gt 0 -o -z "$ztf" ]; then # if mktemp fails, do it unsafely ztf=$TMPDIR/$LOGNAME.$progname.$$ [ -e "$ztf" ] && ztf= || { touch $ztf && chmod 600 $ztf; } fi [ "$ztf" -a -f "$ztf" ] || { echo Could not make tempfile; exit 8; } ztfiles="$ztfiles $ztf" eval ${1:-tf}='$ztf' } # PARSE COMMAND LINE options="g:vh" # option string for getopt(1) help=; [ "$1" = -h -o "$1" = -help -o "$1" = --help ] && help=yes [ "$help" ] && { usage; die; } $GETOPT -T >/dev/null 2>&1 [ $? -eq 4 ] && GETOPT="$GETOPT -n $progname -s sh" #frodol's getopt? eval set -- `$GETOPT "$options" "$@"` [ $# -lt 1 ] && { die 9 getopt failed; } while [ $# -gt 0 ]; do case "$1" in -g) num=$2; shift ;; -v) enc_opts=$enc_cbr_opts ;; -h) help=y ;; --) shift; break ;; *) usage; die 9 "invalid command line syntax!" ;; esac shift done [ "$help" ] && { usage; die; } [ $# -eq 0 ] && { usage; die 9 no arguments; } #change or remove if desired # sanity checking [ "$num" ] && echo "$num"|grep -q '^[0-9]*$' && [ $num -ge 1 ] \ || die 1 please use the -g flag with a valid number # MAIN PROGRAM # what version of lame are we using? lame_vers=`$LAME 2>&1 | awk 'NR==1{print $3}'` # check filename [ -f "$1" ] || die 2 "'$1' isn't a file" echo "$1"|grep -qi '\.wav$' || die 2 "'$1' isn't a .wav" # make tempfiles base=`echo "$1"|sed 's/\.[^.]*$//'` dest=${base}_generation_$num.wav [ -e "$dest" ] && die 2 "'$dest' already exists" touch "$dest" || die 2 "couldn't create '$dest'" TMPDIR=. tfile tmpwav TMPDIR=. tfile tmpmp3 cp -f "$1" "$tmpwav" # do the loop start=`date` i=1 while [ $i -le $num ]; do e "Working on file '$1', generation number $i..." $LAME $enc_opts --tc "lame $lame_vers; Generation: $i" \ "$tmpwav" "$tmpmp3" || die 3 encoding failed $LAME --decode --mp3input "$tmpmp3" "$tmpwav" || die 3 decoding failed i=`expr $i + 1` done end=`date` # save the result ln -f "$tmpwav" "$dest" echo e "Start: $start" e "Stop : $end" die