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