mugeco.sh 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/bin/sh
  2. progname=mugeco version=0.1
  3. programr='Alexander Leidinger'
  4. progdate='7 Dec 2000'
  5. progdesc='MUltiGEnerationCOding'
  6. # NEEDS: getopt, lame
  7. # Please have a look at the DEFAULTS section.
  8. # $Id$
  9. usage() {
  10. cat << EOF
  11. ** $progname v$version, $progdate **
  12. by $programr
  13. $progdesc
  14. usage: $progname [ <flags> ] -g <num> <file>
  15. -v use builtin VBR options
  16. -g <num> number of generations
  17. -h help
  18. used
  19. - env vars:
  20. * LAME : alternative encoder binary
  21. * LAMEOPT: alternative encoder options
  22. - VBR opts: $enc_vbr_opts
  23. - CBR opts: $enc_cbr_opts
  24. EOF
  25. }
  26. # DEFAULTS
  27. # if you can, use getopt(1) (c)1997 by Frodo Looijaard <frodol@dds.nl>
  28. # it's in most modern unixen, or look at http://huizen.dds.nl/~frodol/
  29. : ${GETOPT=getopt} # helper program
  30. # mktemp (optional) is also in most modern unixen (originally from OpenBSD)
  31. : ${MKTEMP=mktemp} # helper program
  32. : ${TMPDIR:=/tmp} # set default temp directory
  33. : ${LAME:=lame} # path to LAME
  34. enc_cbr_opts="-b192 -h --lowpass 18 --lowpass-width 0"
  35. enc_vbr_opts="--vbr-mtrh --nspsytune -v -h -d -Y -X3"
  36. enc_opts=${LAMEOPT:-$enc_cbr_opts}
  37. num= # default number of generations
  38. # DEFINE FUNCTIONS
  39. e() { echo "$progname: $*"; }
  40. die() { # usage: die [ <exitcode> [ <errormessage> ] ]
  41. trap '' 1 2 3 13 15
  42. exitcode=0
  43. [ $# -gt 0 ] && { exitcode=$1; shift; }
  44. [ $# -gt 0 ] && e "Error: $*" >&2
  45. exit $exitcode
  46. }
  47. # tfile()
  48. # this function creates temporary files. 'tfile temp' will make a tempfile
  49. # and put the path to it in the variable $temp (defaults to variable $tf)
  50. trap 'for f in $ztfiles; do rm -f "$f"; done' 0
  51. trap 'trap "" 1 2 3 13 15; exit 10' 1 2 3 13 15
  52. unset ztfiles
  53. tfile() { # usage: tfile <variable_name>
  54. ztf=`$MKTEMP -q $TMPDIR/$progname.XXXXXX 2>/dev/null` # try mktemp
  55. if [ $? -gt 0 -o -z "$ztf" ]; then # if mktemp fails, do it unsafely
  56. ztf=$TMPDIR/$LOGNAME.$progname.$$
  57. [ -e "$ztf" ] && ztf= || { touch $ztf && chmod 600 $ztf; }
  58. fi
  59. [ "$ztf" -a -f "$ztf" ] || { echo Could not make tempfile; exit 8; }
  60. ztfiles="$ztfiles $ztf"
  61. eval ${1:-tf}='$ztf'
  62. }
  63. # PARSE COMMAND LINE
  64. options="g:vh" # option string for getopt(1)
  65. help=; [ "$1" = -h -o "$1" = -help -o "$1" = --help ] && help=yes
  66. [ "$help" ] && { usage; die; }
  67. $GETOPT -T >/dev/null 2>&1
  68. [ $? -eq 4 ] && GETOPT="$GETOPT -n $progname -s sh" #frodol's getopt?
  69. eval set -- `$GETOPT "$options" "$@"`
  70. [ $# -lt 1 ] && { die 9 getopt failed; }
  71. while [ $# -gt 0 ]; do
  72. case "$1" in
  73. -g) num=$2; shift ;;
  74. -v) enc_opts=$enc_cbr_opts ;;
  75. -h) help=y ;;
  76. --) shift; break ;;
  77. *) usage; die 9 "invalid command line syntax!" ;;
  78. esac
  79. shift
  80. done
  81. [ "$help" ] && { usage; die; }
  82. [ $# -eq 0 ] && { usage; die 9 no arguments; } #change or remove if desired
  83. # sanity checking
  84. [ "$num" ] && echo "$num"|grep -q '^[0-9]*$' && [ $num -ge 1 ] \
  85. || die 1 please use the -g flag with a valid number
  86. # MAIN PROGRAM
  87. # what version of lame are we using?
  88. lame_vers=`$LAME 2>&1 | awk 'NR==1{print $3}'`
  89. # check filename
  90. [ -f "$1" ] || die 2 "'$1' isn't a file"
  91. echo "$1"|grep -qi '\.wav$' || die 2 "'$1' isn't a .wav"
  92. # make tempfiles
  93. base=`echo "$1"|sed 's/\.[^.]*$//'`
  94. dest=${base}_generation_$num.wav
  95. [ -e "$dest" ] && die 2 "'$dest' already exists"
  96. touch "$dest" || die 2 "couldn't create '$dest'"
  97. TMPDIR=. tfile tmpwav
  98. TMPDIR=. tfile tmpmp3
  99. cp -f "$1" "$tmpwav"
  100. # do the loop
  101. start=`date`
  102. i=1
  103. while [ $i -le $num ]; do
  104. e "Working on file '$1', generation number $i..."
  105. $LAME $enc_opts --tc "lame $lame_vers; Generation: $i" \
  106. "$tmpwav" "$tmpmp3" || die 3 encoding failed
  107. $LAME --decode --mp3input "$tmpmp3" "$tmpwav" || die 3 decoding failed
  108. i=`expr $i + 1`
  109. done
  110. end=`date`
  111. # save the result
  112. ln -f "$tmpwav" "$dest"
  113. echo
  114. e "Start: $start"
  115. e "Stop : $end"
  116. die