Hier ist die Musterlösung zu Aufgabe: Kopieren von Audio CDs: cpaudiocd.
Was man daran sehen kann?
#!/bin/sh
# kopiert eine Audio-CD komplett auf Platte, und schreibt ein
# Skript zum Brennen
#
# 27.04.2000 kw
#
# Das Unterdrücken der 2-sec-Pause soll laut "man cdrecord" so nur
# mit TEAC-Brennern funktionieren (ich habe einen TEAC CDR55S, da
# klappt das auch).
#
# SCSI-Bus,SCSI-Id,LUN
DEVICE0="0,6,0"
if [ $# -ge 1 ]
then
projekt=$1
else
echo -n "Name der CD und des Verzeichnisses: "
read projekt
fi
echo "Das Verzeichnis für die Tracks ist $projekt"
echo -n "Der CD-Brenner hat SCSI-Bus,SCSI-Id,LUN: ($DEVICE0) "
read DEVICE
if [ ! "$DEVICE" ]
then
DEVICE=$DEVICE0
fi
echo -n "Welche Tracks, z.B.: 1 5 8 10? (alle) "
read trackliste
echo -n "Zwischen den Stücken eine 2-sec-Pause j/n? (j) "
read jn
if [ "$jn" = "n" -o "$jn" = "N" ]
then
pregap=" defpregap=0"
else
pregap=""
fi
mkdir $projekt 2>/dev/null
cd $projekt
# Inhaltsverzeichnis lesen:
# diese Version hatte ich bis SuSE 6.2/cdda2wav 0.95beta07 verwendet:
# if cdda2wav -D $DEVICE -N -t1 -d1 -v 3 /dev/null 2>tmp.txt
# then
# echo "Audio-CD erkannt."
# else
# echo "keine Audio-CD?"
# false
# exit
# fi
# Das klappt jetzt leider nicht mehr, weil cdda2wav jetzt (SuSE 6.3)
# nicht mehr 0 zurückgibt, wenn alles ok läuft.
# Deshalb wird der Rückgabewert jetzt ignoriert:
cdda2wav -D $DEVICE -N -t1 -d1 -v 3 /dev/null 2>tmp.txt
# jetzt steht in tmp.txt etwa folgendes:
# Read TOC CD Text failed (probably not supported).
# #Cdda2wav version 0.95beta07 plus real time scheduling ...
# AUDIOtrack pre-emphasis copy-permitted tracktype channels
# 1-13 no no audio 2
# Table of Contents: total tracks:13, (total time 39:37.00)
# 1.( 3:21.00), 2.( 2:31.00), 3.( 3:44.00), 4.( 1:23.00),...
# 6.( 5:35.00), 7.( 2:51.00), 8.( 5:39.00), 9.( 2:06.00),...
# 11.( 4:25.00), 12.( 1:20.00), 13.( 1:05.00),
# CDDB discid: 0x9d09470d
# samplefile size will be 176444 bytes.
# recording 1.00000 seconds stereo with 16 bits @ 44100 Hz ->...
# votes for little: 160, votes for big: 0
# little endian detected
# track 1 successfully recorded
#
# Daraus extrahieren wir mit grep die Zeile:
# 1-13 no no audio 2,
# und daraus mit sed dann die Anzahl der Tracks (hier: 13).
#echo "cdda2wav sagt:"
#cat tmp.txt
TRACKS=`cat tmp.txt | grep "^ *1-[0-9]* "|sed 's/^ *1-\([0-9]*\).*$/\1/'`
rm tmp.txt
if [ "$trackliste" ]
then
# Tracks angegeben, also nur die kopieren:
for i in $trackliste
do
# Damit die Dateinamen von ls und der shell richtig sortiert
# werden, schreiben wir in i2 die Tracknummer zweistellig, und
# nehmen dann $i2, um einen Dateinamen daraus zu bilden.
# ( || true, weil cdda2wav wieder irgendeinen Unfug zurückgibt)
i2=`printf %02d $i`
if cdda2wav -q -D $DEVICE -s -b 16 -r 44100 \
-t $i -H $projekt"_"$i2.wav \
|| true
then
echo "Track $i gelesen"
else
echo "Lesen von Track $i gescheitert."
false
exit
fi
done
else
# alle Tracks sollen kopiert werden
# ( || true, weil cdda2wav wieder irgendeinen Unfug zurückgibt)
if cdda2wav -q -D $DEVICE -s -b 16 -r 44100 \
-t 1+$TRACKS -B -H $projekt \
|| true
then
echo "Tracks 1-$TRACKS gelesen"
else
echo "Lesen der CD gescheitert."
false
exit
fi
fi
echo "#!/bin/sh" >brenn
echo "cdrecord -eject -speed=16 dev=$DEVICE -audio -pad$pregap "\
*.wav >>brenn
chmod 755 brenn
echo "Brennen der CD mit:"
echo " cd $projekt; ./brenn; cd .."
true
exit