Rewritten (by Sjoerd again) to use module readcd

This commit is contained in:
Guido van Rossum 1992-04-22 13:39:48 +00:00
parent daea6c842e
commit 60c225c27c
1 changed files with 56 additions and 61 deletions

View File

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