#
# Copyright (C) by Stefano Falsetto
# e-mail contact ....: mailto:stefko5@inwind.it
#
#    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
#
#
# Functions for cdda2wav:
# FORMAT FILE: CD audio track

plugin_present_cdda2wav () {
  return 0
}

ERR_BAD_DEVICE=1
ERR_NO_AUDIO_TRACK=2
CDDA_TMPFILE="$TEMPDIR/cdda-tmpfile.$$"

parse_param_t_cdda2wav () {
  eval cdda2wav_TOFMT=\$cdda2wav_TO_${1}

  if [ -z "$cdda2wav_TOFMT" ]; then
    lechoc GREEN $"Type %s is not supported by cdda2wav. Using sox's auto-conversion." "$1"
    audiocd_OUT_TYPE="$1"
    cdda2wav_TOFMT=$cdda2wav_TO_wav
  fi
  
  T_SUPP="$T_SUPP $1"

  return 0
  
}

syntax_cdda2wav () {
  echo "  cdda:<#trk1,#trk2,#trkS+#trkE...>"
  echo "    Extract audio cd track from $CDDA_DEVICE using cdda2wav"
  echo "    Can be used a list of track (i.e. 1,2,3) or ranges (i.e. 3+7),"
  echo "    or mixed ranges track (i.e. 1,2,5+7,8,10+12)"
  echo "  --cdda-device <scsi-device>"
  echo "    Force using of <scsi-device> to extract CD audio track"
}

check_cd_in_tray () {
  local NUM_TRY=$1 
  $cdda2wav_DECODER -D $CDDA_DEVICE -J -g  -H -v 1 >$CDDA_TMPFILE 2>&1 &
  local CDDAPID=$!
  local count=0
  echo -n "Waiting for CD reader process"
  while [ 0 ]; do
    [ -z "$(ps $CDDAPID|grep $CDDAPID)" ] && break
    echo -n "."
    count=$[ count + 1 ]
    sleep 1
    if [ $count -gt $NUM_TRY ]; then
       kill -9 $CDDAPID
       echo
       STRERR="Unable to open disc.  Is there an audio CD in the drive?"
       USCITA=$ERR_NO_DISC
       return -1
    fi
  done
  echo
  return 0
}

parse_param_cdda2wav () {
  case "$1" in
    cdda:*)
       PLUG="cdda2wav"
       TRACKS=$(echo "$1"|cut -d':' -f2|tr ',' ' ')
       if [ -z "$TRACKS" ]; then
         STRERR="Bad track number(s)"
         USCITA=$ERR_BAD_TRK_NUMBER
         return -1
       fi
       local try_syn=$TRACKS
       try_syn=${try_syn//[[:digit:]]/}
       try_syn=${try_syn//,/}
       try_syn=${try_syn//+/}
       try_syn=${try_syn// /}
       if [ ! -z "$try_syn" ]; then
         STRERR="Bad char in track number(s): $try_syn"
         USCITA=$ERR_BAD_TRK_NUMBER
         return -1
       fi
       if [ -z "$CDDA_MAX_TRACK" ]; then
         check_cd_in_tray $CDDA_SEC_TRY 2>/dev/null
         [ $? -ne 0 ] && return -1
         #CDDA_MAX_TRACK=$($cdda2wav_DECODER -D $CDDA_DEVICE -J -g -H -v 1 2>&1\
         #                 |$GREP "^T[0-9]"|tail -n 1|cut -d':' -f1|cut -b2-)
         CDDA_MAX_TRACK=$(cat $CDDA_TMPFILE|$GREP "^T[0-9]"|tail -n 1|\
                          cut -d':' -f1|cut -b2-)
         if [ -z "$CDDA_MAX_TRACK" ]; then
           STRERR="Can't find a valid audio track in this CD"
           USCITA=$ERR_NO_AUDIO_TRACK
           return -1
         fi
       fi
       if [ "$(expr "$TRACKS" : ".*+.*")" -ne 0 ]; then
         for T in $TRACKS; do
           if [ "$(expr "$T" : ".*+.*")" -ne 0 ]; then
             START_T=$(echo "$T"|cut -d'+' -f1)
             END_T=$(echo "$T"|cut -d'+' -f2)
             ERR_T=$(echo "$T"|cut -d'+' -f3-)
             
             [ -z $END_T ] && END_T=$CDDA_MAX_TRACK
             if [ ! -z "$ERR_T" ] || [ -z "$START_T" ] || \
                [ $START_T -gt $END_T ]; then
               STRERR="Bad track number(s) $T"
               USCITA=$ERR_BAD_TRK_NUMBER
               return -1
             fi
             while [ $START_T -le $END_T ]; do
               NEWTRACK="$NEWTRACK $START_T"
               START_T=$[ START_T + 1 ]
             done
           else
             NEWTRACK="$NEWTRACK $T"
           fi
         done
         TRACKS="$NEWTRACK"
       fi
       (
       for TRK in $TRACKS; do
         TRKNUM=$(printf "%.2d" "$TRK")
         echo "$TEMPDIR/$TRKNUM.audiocd">>"$TEMPDATA"
         touch "$TEMPDIR/$TRKNUM.audiocd"
       done
       )
       SHIFT=1
       return 1
      ;;
   --cdda-device)
       PLUG="cdda2wav"
       if [ ! -z "$2" ] && [ "${2:0:1}" != "-" ]; then
         if [ "$(echo $2|cut -d',' -f1)" != "$2" ]; then
           CDDA_DEVICE="$2"
         else
           STRERR="Bad device: $2"
           USCITA=$ERR_BAD_DEVICE
           return -1
         fi
       else
         STRERR="Bad device: $2"
         USCITA=$ERR_BAD_DEVICE
         return -1
       fi
       SHIFT=2
       return 1
       ;;
   esac
}

sanity_check_cdda2wav () {
  if [ ! -z "$TRACKS" ]; then
    if [ ! -z "$ALVOLO" ] || [ ! -z "$ONE_BY_ONE" ]; then
      if [ $(expr "$CDRECORD" : ".*$CDDA_DEVICE.*") -eq ${#CDRECORD} ]; then
        STRERROR="Can't read and write at the same time on the same CD-R device!"
        USCITA=$ERR_BAD_DEVICE
        return
      fi
    fi
    $cdda2wav_DECODER -D $CDDA_DEVICE -J -g -H -v 1 >$CDDA_TMPFILE 2>&1
    if [ $? -ne 0 ]; then
      STRERROR="There is some problem with cdda2wav on device $CDDA_DEVICE"
      USCITA=1
    fi
  fi
}

extract_time_audiocd () {
  AUDIO_TRACK="$(basename $1 .audiocd)"
  TS=$($GREP "^T$AUDIO_TRACK:" $CDDA_TMPFILE|tr -s ' '|cut -d' ' -f3)
  
  if [ -z "$TS" ]; then
    RET_WCL=1
  else
    if [ ${TS:1:1} = ":" ]; then
      TS="0$TS"
    fi
    RET_WCL=0
  fi
}

extract_check_info_audiocd () {
  RET_KBITSTEREO="128Kb/s, stereo"
  RET_RATE="44100"
}

check_file_type_cdda2wav () {
  if [ "$(basename "$tempf" .audiocd)" != "$(basename "$tempf")" ]; then
    if [ -z "$WRITER" ]; then
      lechoc GREEN "WARNING: CD audio tracks ignored without -w option!"
    else
      ISTYPE="audiocd"
      FILETYPE="CD audio track"
    fi
  fi
}

setup_vars_audiocd () {
  #if [ -z "$cdda2wav_TOFMT" ]; then
  #  cdda2wav_TOFMT="$CDDA_REAL_FORMAT"
  #fi
  TRACK="$(echo "$nomef"|cut -d'-' -f2)"
  OUTPUT_FILE="$SPOOLDIR/${nomef}-audiocd.${cdda2wav_TOFMT}"
  #SOX_OUT_TYPE="$CDDA_REAL_FORMAT"
  FLYFMT="wav"
}

to_stdout_buffered_audiocd () {
  $cdda2wav_DECODER -D $CDDA_DEVICE -l $CDDA_BUFFER -H -v 1 - -O wav \
                    -t "$TRACK"
}

to_stdout_no_buffer_audiocd () {
  $cdda2wav_DECODER -D $CDDA_DEVICE -H -v 1 - -O wav -t "$TRACK"
}

decode_audiocd () {
  local FILEDST="$SPOOLDIR/${nomef}-audiocd.${cdda2wav_TOFMT}"

  $cdda2wav_DECODER -q -D $CDDA_DEVICE -l $CDDA_BUFFER -H -v 1 \
                    -O $cdda2wav_TOFMT -t "$TRACK" "$OUTPUT_FILE"
                    #-O $cdda2wav_TOFMT -t "$TRACK" "$FILEDST"
}

