+# abcde.cue2discid
+# This function reads a cuefile on stdin and writes an extended
+# cddb query on stdout. Any PREGAP for track 1 is properly
+# handled, although cue files embedded in FLAC files do not
+# appear to properly store the PREGAP setting. :(
+abcde.cue2discid () {
+
+ cddb_sum () {
+ val=$1
+ ret=0
+ while [ $val -gt 0 ] ; do
+ ret=$(( $ret + ( $val % 10) ))
+ val=$(( $val / 10 ))
+ done
+ echo $ret
+ }
+
+ msf2lba () {
+ OIFS="$IFS"
+ IFS=":"
+ set -- $1
+ IFS="$OIFS"
+ local first second third
+ first=$(expr ${1} + 0 )
+ second=$(expr ${2} + 0 )
+ third=$(expr ${3} + 0 )
+
+ echo $(( ((($first * 60) + $second) * 75) + $third ))
+ }
+
+ OFFSET=150
+ PREGAP=0
+ LEADOUT=0
+ LEADIN=88200
+ i=0
+ N=0
+
+ while read line ; do
+ set -- $line
+ case "$1" in
+ TRACK) i=$(( i + 1 ))
+ ;;
+ INDEX) if [ "$2" -eq 1 ] ; then
+ LBA=$(msf2lba $3)
+ START=$(( $LBA + $PREGAP + $OFFSET ))
+ eval TRACK$i=$START
+ X=$(cddb_sum $(( $START / 75 )) )
+ N=$(( $N + $X ))
+ fi
+ ;;
+ PREGAP) PREGAP=$(msf2lba $2)
+ ;;
+ REM) case "$2" in
+ FLAC__lead-out)
+ LEADOUT=$(( $4 / 588 ))
+ ;;
+ FLAC__lead-in)
+ LEADIN=$(( $3 / 588 ))
+ ;;
+ esac
+ ;;
+ esac
+
+ done
+
+ TRACKS=$i
+ LEADOUT=$(( $LEADOUT + $LEADIN ))
+
+ LENGTH=$(( $LEADOUT/75 - $TRACK1/75 ))
+ DISCID=$(( ( $N % 255 ) * 2**24 | $LENGTH * 2**8 | $TRACKS ))
+ printf "%08x %i" $DISCID $TRACKS
+
+ j=1
+ while [ $j -le $TRACKS ] ; do
+ eval echo -n "\" \$TRACK$j\""
+ j=$((j+1))
+ done
+ echo " $(( $LEADOUT / 75 ))"
+}
+
+# abcde.mkcue
+# abcde.mkcue [--wholedisk]
+# This creates a cuefile directly from the extended discid information
+# The --wholedisk option controls whether we're ripping data from the
+# start of track one or from the start of the disk (usually, but not
+# always the same thing!)
+#
+# Track one leadin/pregap (if any) handeling:
+# --wholedisk specified:
+# TRACK 01 AUDIO
+# INDEX 00 00:00:00
+# INDEX 01 <pregap value>
+# Remaining track index values unchanged from disc TOC
+#
+# --wholedisk not specified
+# TRACK 01 AUDIO
+# PREGAP <pregap value>
+# INDEX 01 00:00:00
+# Remaining track index values offset by <pregap value>
+#
+# Variables used:
+# TRACKINFO
+abcde.mkcue () {
+
+ echomsf () {
+ printf "$1%02i:%02i:%02i\n" $(($2/4500)) $((($2/75)%60)) $(($2%75))
+ }
+
+ local MODE DISCID TRACKS
+ local i OFFSET LBA
+ local CUEWAVFILE
+
+ if [ "$1" = --wholedisc ] ; then
+ MODE=INDEX
+ else
+ MODE=PREGAP
+ fi
+
+ vecho "One track is $ONETRACK"
+ TRACKFILE="$(mungefilename "$TRACKNAME")"
+ ARTISTFILE="$(mungefilename "$TRACKARTIST")"
+ ALBUMFILE="$(mungefilename "$DALBUM")"
+ if [ "$ONETRACK" = "y" ]; then
+ if [ "$VARIOUSARTISTS" = "y" ]; then
+ CUEWAVFILE="$(eval echo \""$VAONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT"
+ else
+ CUEWAVFILE="$(eval echo \""$ONETRACKOUTPUTFORMAT"\" | sed -e 's@^.*/@@').$OUTPUT"
+ fi
+ vecho "Cue wav file is $CUEWAVFILE"
+ else
+ CUEWAVFILE="dummy.wav"
+ fi
+
+ set -- $TRACKINFO
+
+ DISCID=$1
+ TRACKS=$2
+ shift 2
+
+ echo REM DISCID $DISCID
+ echo FILE \""$CUEWAVEFILE"\" WAVE
+
+ if [ $1 -ne 150 ] && [ $MODE = "PREGAP" ] ; then
+ OFFSET=$1
+ else
+ OFFSET=150
+ fi
+
+ i=1
+ while [ $i -le "$TRACKS" ] ; do
+ LBA=$(( $1 - $OFFSET ))
+ printf " TRACK %02i AUDIO\n" $i
+ if [ $i -eq 1 -a $1 -ne 150 ] ; then
+ if [ $MODE = PREGAP ] ; then
+ echomsf " PREGAP " $(($OFFSET-150))
+ else
+ echo " INDEX 00 00:00:00"
+ fi
+ fi
+ echomsf " INDEX 01 " $LBA
+ i=$(($i+1))
+ shift
+ done
+}
+