#
# 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 cdparanoia:
# FORMAT FILE: CD audio track

plugin_present_cdparanoia () {
  return 0
}

ERR_BAD_DEVICE=1

parse_param_t_cdparanoia () {
  eval cdparanoia_TOFMT=\$cdparanoia_TO_${1}

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

  return 0
  
}

syntax_cdparanoia () {
  echo "  cdda:<#trk1,#trk2,...>"
  echo "    Extract audio cd track from $CDPARA_DEVICE using cdparanoia"
  echo "  --cdda-device <scsi-device>"
  echo "    Force using of specified device to extract CD audio track;"
  echo "    scsi-device must be in format: scsibus,target,lun" 
}

parse_param_cdparanoia () {
  case "$1" in
    cdda:*)
       PLUG="cdparanoia"
       if [ -z "$CDPARA_MAX_TRACK" ]; then
         CDPARA_MAX_TRACK=$($cdparanoia_DECODER -d $CDPARA_DEVICE -Q 2>&1|\
                            tail +11|$GREP -E "^[[:space:]]*[1-9].*"|tail -n 1|\
                            cut -d'.' -f1)
       fi
       if [ -z "$CDPARA_MAX_TRACK" ]; then
         STRERR="Unable to open disc. Is there an audio CD in the drive?"
         USCITA=$ERR_NO_DISC
         return -1
       fi
       TRACKS=$(echo "$1"|cut -d':' -f2|tr ',' ' ')
       if [ -z "$TRACKS" ]; then
         STRERR="Bad track numbers $TRACKS"
         USCITA=$ERR_BAD_TRK_NUMBER
         return -1
       fi
       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 [ "$(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=$CDPARA_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
         echo "$TEMPDIR/$TRK.audiocd">>"$TEMPDATA"
         touch "$TEMPDIR/$TRK.audiocd"
       done
       )
       SHIFT=1
       return 1
      ;;
   --cdda-device)
       PLUG="cdparanoia"
       if [ ! -z "$2" ] && [ "${2:0:1}" != "-" ]; then
         if [ -b "$2" ]; then
           CDPARA_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
}

from_dev_to_btl () {
  # IS THIS CORRECT???
  # I will extract from cdrecord --scanbus bus,target,lun
  # number of /dev/scd?? from bus,target,lun is assigned in sequential
  # order, so I don't have a direct method to understand what device is 
  # assigned to what bus,target,lun.
  # But I know that (i.e.) /dev/scd4 is the fourth device in SCSI CD-ROM 
  # chain, so I take fourth CD-ROM device listed in scanbus.
  
  local conta=0
  local MYCD=$(echo "$CDRECORD"|cut -d' ' -f1)

  # Extract device number from /dev/scd??
  # Looking for a symbolic link...
  local TRUE_DEV=$(ls -l $CDPARA_DEVICE|cut -d'>' -f2|tr -d ' ')
  if [ -z "$TRUE_DEV" ]; then
    TRUE_DEV=$CDPARA_DEVICE
  fi

  trova=${TRUE_DEV#\/dev\/scd}


  $MYCD --scanbus 2>&1|$GREP "[0-9])"|$GREP "Removable CD-ROM" >$CDDA_TMPFILE
  
  while read i; do
    if [ $conta -eq $trova ]; then
      CDPARA_BTL=$(echo "$i"|cut -d' ' -f1)
      break
    fi
    conta=$[ conta + 1 ]
  done<$CDDA_TMPFILE
}

sanity_check_cdparanoia () {
  if [ ! -z "$TRACKS" ]; then
    CDDA_TMPFILE="$TEMPDIR/cdparanoia-tmpfile.$$"
    if [ ! -z "$ALVOLO" ] || [ ! -z "$ONE_BY_ONE" ]; then
      from_dev_to_btl
      if [ $(expr "$CDRECORD" : ".*$CDPARA_BTL.*") -eq ${#CDRECORD} ]; then
        STRERROR="Can't read and write on the same CD-R device!"
        USCITA=$ERR_BAD_DEVICE
        return
      fi
    fi
    $cdparanoia_DECODER -d $CDPARA_DEVICE -Q 2>&1 |\
                       $EGREP "^[[:space:]].*[1-9]{1}*.\." >$CDDA_TMPFILE
                       #old:$EGREP "^[[:space:]].*[1-9]{1}[0-9]*.\." >$CDDA_TMPFILE
    if [ $? -ne 0 ]; then
      STRERROR="There is some problem with cdparanoia on device $CDPARA_DEVICE"
      USCITA=1
      return -1
    fi
  fi
}

extract_time_audiocd () {
  AUDIO_TRACK="$(basename $1 .audiocd)"
  TS=$($EGREP "^[[:space:]]+$AUDIO_TRACK{1}\." $CDDA_TMPFILE|\
       cut -d'[' -f2|cut -d']' -f1)
  
  if [ -z "$TS" ]; then
    RET_WCL=1
  else
    RET_WCL=0
  fi
}

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

check_file_type_cdparanoia () {
  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 "$cdparanoia_TOFMT" ]; then
  #  cdparanoia_TOFMT="$CDDA_REAL_FORMAT"
  #fi
  OUTPUT_FILE="$SPOOLDIR/${nomef}-audiocd.$(echo $cdparanoia_TOFMT|cut -d'-' -f4)"
  #SOX_OUT_TYPE="$CDDA_REAL_FORMAT"
  FLYFMT="wav"
}

to_stdout_no_buffer_audiocd () {
  # Will output to stdout in wav format.
  # Using -Z -Y to avoid buffer underruns

  local FILESRC="$(echo "$nomef"|cut -d'-' -f2)"
  $cdparanoia_DECODER -Z -Y -d $CDPARA_DEVICE $FILESRC -
}

to_stdout_buffered_audiocd () {
  to_stdout_no_buffer_audiocd
}

decode_audiocd () {
  #local FILEDST="${nomef}-audiocd.$(echo $cdparanoia_TOFMT|cut -d'-' -f4)"
  local TRACK="$(echo "$nomef"|cut -d'-' -f2)"

  $cdparanoia_DECODER -d $CDPARA_DEVICE $cdparanoia_TOFMT "$TRACK" "$OUTPUT_FILE"
  #"$FILEDST"
}

