mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	Rewritten (by Sjoerd again) to use module readcd
This commit is contained in:
		
							parent
							
								
									daea6c842e
								
							
						
					
					
						commit
						60c225c27c
					
				
					 1 changed files with 56 additions and 61 deletions
				
			
		| 
						 | 
					@ -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):
 | 
					def playaudio(port, type, audio):
 | 
				
			||||||
##	print 'playaudio'
 | 
					 | 
				
			||||||
	port.writesamps(audio)
 | 
						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):
 | 
					def triple((a, b, c)):
 | 
				
			||||||
	print 'type', callbacks[type], 'data', `data`
 | 
						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():
 | 
					def main():
 | 
				
			||||||
	player = cd.open()
 | 
						import sys, readcd, al, string, AL, CD
 | 
				
			||||||
	parser = cd.createparser()
 | 
						r = readcd.Readcd().init()
 | 
				
			||||||
 | 
						prstatus(r.getstatus())
 | 
				
			||||||
	state, track, (min, sec, frame), (abs_min, abs_sec, abs_frame), \
 | 
						prtrackinfo(r.gettrackinfo())
 | 
				
			||||||
		  (total_min, total_sec, total_frame), \
 | 
						l = []
 | 
				
			||||||
		  first, last, scsi_audio, \
 | 
						for arg in sys.argv[1:]:
 | 
				
			||||||
		  cur_block, (dum1, dum2, dum3) = player.getstatus()
 | 
							x = eval(arg)
 | 
				
			||||||
	print state, track, (min, sec, frame), \
 | 
							try:
 | 
				
			||||||
		  (abs_min, abs_sec, abs_frame), \
 | 
								l = len(x)
 | 
				
			||||||
		  (total_min, total_sec, total_frame), \
 | 
								r.appendstretch(x[0], x[1])
 | 
				
			||||||
		  first, last, scsi_audio, \
 | 
							except TypeError:
 | 
				
			||||||
		  cur_block, (dum1, dum2, dum3)
 | 
								r.appendtrack(x)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	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:
 | 
						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)
 | 
							al.setparams(AL.DEFAULT_DEVICE, params)
 | 
				
			||||||
		config = al.newconfig()
 | 
							config = al.newconfig()
 | 
				
			||||||
		config.setwidth(AL.SAMPLE_16)
 | 
							config.setwidth(AL.SAMPLE_16)
 | 
				
			||||||
		config.setchannels(AL.STEREO)
 | 
							config.setchannels(AL.STEREO)
 | 
				
			||||||
		port = al.openport('CD Player', 'w', config)
 | 
							port = al.openport('CD Player', 'w', config)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		parser.setcallback(CD.AUDIO, playaudio, port)
 | 
							for i in range(8):
 | 
				
			||||||
		for i in range(1, 8):
 | 
								r.setcallback(i, callback, None)
 | 
				
			||||||
			parser.setcallback(i, callback, port)
 | 
							r.removecallback(CD.PTIME)
 | 
				
			||||||
		parser.removecallback(CD.ATIME)
 | 
							r.removecallback(CD.ATIME)
 | 
				
			||||||
		parser.removecallback(CD.PTIME)
 | 
							r.setcallback(CD.AUDIO, playaudio, port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		while 1:
 | 
							data = r.play()
 | 
				
			||||||
			frames = player.readda(size)
 | 
					 | 
				
			||||||
			if frames == '':
 | 
					 | 
				
			||||||
				break
 | 
					 | 
				
			||||||
			parser.parseframe(frames)
 | 
					 | 
				
			||||||
	except KeyboardInterrupt:
 | 
						except KeyboardInterrupt:
 | 
				
			||||||
		pass
 | 
							pass
 | 
				
			||||||
 | 
					 | 
				
			||||||
	al.setparams(AL.DEFAULT_DEVICE, oldparams)
 | 
						al.setparams(AL.DEFAULT_DEVICE, oldparams)
 | 
				
			||||||
	player.close()
 | 
						r.player.close()
 | 
				
			||||||
	parser.deleteparser()
 | 
						r.parser.deleteparser()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
main()
 | 
					main()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue