Rewritten (by Sjoerd again) to use module readcd
diff --git a/Demo/sgi/cd/playcd.py b/Demo/sgi/cd/playcd.py
index 349de7c..dc38ed9 100755
--- a/Demo/sgi/cd/playcd.py
+++ b/Demo/sgi/cd/playcd.py
@@ -1,81 +1,76 @@
-# Read CD audio data from the SCSI bus and play it back over the
-# built-in speaker or audio jack.
-
-import sys
-import al
-import AL
-import cd
-import CD
-
 def playaudio(port, type, audio):
-##	print 'playaudio'
 	port.writesamps(audio)
 
-callbacks = ['audio', 'pnum', 'index', 'ptime', 'atime', 'catalog', 'ident', 'control']
+def callback(arg, type, data):
+	print `type`,`data`
 
-def callback(port, type, data):
-	print 'type', callbacks[type], 'data', `data`
+def triple((a, b, c)):
+	return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
 
-Error = 'playcd.error'
+def zfill(n):
+	s = `n`
+	return '0' * (2 - len(s)) + s
+
+def prtrackinfo(info):
+	for i in range(len(info)):
+		start, total = info[i]
+		print 'Track', zfill(i+1), triple(start), triple(total)
+
+statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
+
+def prstatus(status):
+	state, track, curtime, abstime, totaltime, first, last, \
+		scsi_audio, cur_block, dummy = status
+	print 'Status:',
+	if 0 <= state < len(statedict):
+		print statedict[state]
+	else:
+		print state
+	print 'Track: ', track
+	print 'Time:  ', triple(curtime)
+	print 'Abs:   ', triple(abstime)
+	print 'Total: ', triple(totaltime)
+	print 'First: ', first
+	print 'Last:  ', last
+	print 'SCSI:  ', scsi_audio
+	print 'Block: ', cur_block
+	print 'Future:', dummy
 
 def main():
-	player = cd.open()
-	parser = cd.createparser()
-
-	state, track, (min, sec, frame), (abs_min, abs_sec, abs_frame), \
-		  (total_min, total_sec, total_frame), \
-		  first, last, scsi_audio, \
-		  cur_block, (dum1, dum2, dum3) = player.getstatus()
-	print state, track, (min, sec, frame), \
-		  (abs_min, abs_sec, abs_frame), \
-		  (total_min, total_sec, total_frame), \
-		  first, last, scsi_audio, \
-		  cur_block, (dum1, dum2, dum3)
-
-	if state <> CD.READY:
-		player.close()
-		raise Error, 'CD not ready'
-	if not scsi_audio:
-		player.close()
-		raise Error, 'not an audio-capable CD-ROM player'
-
-	for i in range(first, last+1):
-		trackinfo = player.gettrackinfo(i)
-		print 'Track', i, trackinfo
-
-	if sys.argv[1:]:
-		print 'Start at track', sys.argv[1]
-		player.seektrack(eval(sys.argv[1]))
-
-	size = player.bestreadsize()
-
-	oldparams = [AL.OUTPUT_RATE, 0]
-	params = oldparams[:]
-	al.getparams(AL.DEFAULT_DEVICE, oldparams)
-	params[1] = AL.RATE_44100
+	import sys, readcd, al, string, AL, CD
+	r = readcd.Readcd().init()
+	prstatus(r.getstatus())
+	prtrackinfo(r.gettrackinfo())
+	l = []
+	for arg in sys.argv[1:]:
+		x = eval(arg)
+		try:
+			l = len(x)
+			r.appendstretch(x[0], x[1])
+		except TypeError:
+			r.appendtrack(x)
 	try:
+		oldparams = [AL.OUTPUT_RATE, 0]
+		params = oldparams[:]
+		al.getparams(AL.DEFAULT_DEVICE, oldparams)
+		params[1] = AL.RATE_44100
 		al.setparams(AL.DEFAULT_DEVICE, params)
 		config = al.newconfig()
 		config.setwidth(AL.SAMPLE_16)
 		config.setchannels(AL.STEREO)
 		port = al.openport('CD Player', 'w', config)
 
-		parser.setcallback(CD.AUDIO, playaudio, port)
-		for i in range(1, 8):
-			parser.setcallback(i, callback, port)
-		parser.removecallback(CD.ATIME)
-		parser.removecallback(CD.PTIME)
+		for i in range(8):
+			r.setcallback(i, callback, None)
+		r.removecallback(CD.PTIME)
+		r.removecallback(CD.ATIME)
+		r.setcallback(CD.AUDIO, playaudio, port)
 
-		while 1:
-			frames = player.readda(size)
-			if frames == '':
-				break
-			parser.parseframe(frames)
+		data = r.play()
 	except KeyboardInterrupt:
 		pass
-
 	al.setparams(AL.DEFAULT_DEVICE, oldparams)
-	player.close()
-	parser.deleteparser()
+	r.player.close()
+	r.parser.deleteparser()
 
 main()