# Play CD audio on speaker or headphones. callbacktypes = ['audio','pnum','index','ptime','atime','catalog','ident','control'] def playaudio(port, type, audio): port.writesamps(audio) def prtrack(cdinfo, type, pnum): if cdinfo.track[pnum] <> '': print 'playing "' + cdinfo.track[pnum] + '"' else: print callbacktypes[type]+': '+`pnum` def callback(arg, type, data): print callbacktypes[type]+': '+`data` def tcallback(arg, type, data): print callbacktypes[type]+': '+triple(data) def triple((a, b, c)): return zfill(a) + ':' + zfill(b) + ':' + zfill(c) 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(): import sys, readcd, al, AL, cd, cdplayer verbose = 0 r = readcd.Readcd() prstatus(r.getstatus()) prtrackinfo(r.gettrackinfo()) cdinfo = cdplayer.Cdplayer(r.gettrackinfo()) if cdinfo.title <> '': print 'Title: "' + cdinfo.title + '"' if cdinfo.artist <> '': print 'Artist: ' + cdinfo.artist for arg in sys.argv[1:]: if arg == '-v': verbose = 1 continue 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) for i in range(8): r.setcallback(i, callback, None) if verbose: r.setcallback(cd.ptime, tcallback, None) r.setcallback(cd.atime, tcallback, None) else: r.removecallback(cd.ptime) r.removecallback(cd.atime) r.setcallback(cd.pnum, prtrack, cdinfo) r.setcallback(cd.audio, playaudio, port) data = r.play() except KeyboardInterrupt: status = r.getstatus() print 'Interrupted at '+triple(status[2])+' into track '+ \ `status[1]`+' (absolute time '+triple(status[3])+')' al.setparams(AL.DEFAULT_DEVICE, oldparams) main()