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()
