# 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(port, type, data):
	print 'type', callbacks[type], 'data', `data`

Error = 'playcd.error'

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
	try:
		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)

		while 1:
			frames = player.readda(size)
			if frames == '':
				break
			parser.parseframe(frames)
	except KeyboardInterrupt:
		pass

	al.setparams(AL.DEFAULT_DEVICE, oldparams)
	player.close()
	parser.deleteparser()

main()
