blob: 10b0fafc553b2286189283fe3e7fa647d077f6f5 [file] [log] [blame]
Guido van Rossumb9506291992-04-13 18:38:20 +00001# Read CD audio data from the SCSI CD player and send it as UDP
2# packets to "readcd.py" on another host.
3# Option:
4# "-l" lists track info and quits.
5# "-s" displays status and quits.
6
7import cd
8import sys
9from socket import *
10import getopt
11
12HOST = 'voorn.cwi.nl' # The host where readcd.py is run
13PORT = 50505 # Must match the port in readcd.py
14
15def main():
16 try:
17 optlist, args = getopt.getopt(sys.argv[1:], 'ls')
18 except getopt.error, msg:
19 sys.stderr.write(msg + '\n')
20 sys.exit(2)
21
22 player = cd.open()
23 prstatus(player)
24 size = player.bestreadsize()
25
26 if optlist:
27 for opt, arg in optlist:
28 if opt == '-l':
29 prtrackinfo(player)
30 elif opt == '-s':
31 prstatus(player)
32 return
33
34 sys.stdout.write('waiting for socket... ')
35 sys.stdout.flush()
36 port = socket(AF_INET, SOCK_DGRAM)
37 port.connect(HOST, PORT)
38 print 'socket connected'
39
40 parser = cd.createparser()
41 parser.setcallback(0, audiocallback, port)
42 parser.setcallback(1, pnumcallback, player)
43 parser.setcallback(2, indexcallback, None)
44 ## 3 = ptime: too many calls
45 ## 4 = atime: too many calls
46 parser.setcallback(5, catalogcallback, None)
47 parser.setcallback(6, identcallback, None)
48 parser.setcallback(7, controlcallback, None)
49
50 if len(args) >= 2:
51 if len(args) >= 3:
52 [min, sec, frame] = args[:3]
53 else:
54 [min, sec] = args
55 frame = 0
56 min, sec, frame = eval(min), eval(sec), eval(frame)
57 print 'Seek to', triple(min, sec, frame)
58 dummy = player.seek(min, sec, frame)
59 elif len(args) == 1:
60 track = eval(args[0])
61 print 'Seek to track', track
62 dummy = player.seektrack(track)
63 else:
64 min, sec, frame = player.getstatus()[5:8]
65 print 'Try to seek back to', triple(min, sec, frame)
66 try:
67 player.seek(min, sec, frame)
68 except RuntimeError:
69 print 'Seek failed'
70
71 try:
72 while 1:
73 frames = player.readda(size)
74 if frames == '':
75 print 'END OF CD'
76 break
77 parser.parseframe(frames)
78 except KeyboardInterrupt:
79 print '[Interrupted]'
80 pass
81
82def prtrackinfo(player):
83 info = []
84 while 1:
85 try:
86 info.append(player.gettrackinfo(len(info) + 1))
87 except RuntimeError:
88 break
89 for i in range(len(info)):
90 start_min, start_sec, start_frame, \
91 total_min, total_sec, total_frame = info[i]
92 print 'Track', zfill(i+1), \
93 triple(start_min, start_sec, start_frame), \
94 triple(total_min, total_sec, total_frame)
95
96def audiocallback(port, type, data):
97## sys.stdout.write('#')
98## sys.stdout.flush()
99 port.send(data)
100
101def pnumcallback(player, type, data):
102 print 'pnum =', `data`
103 prstatus(player)
104
105def indexcallback(arg, type, data):
106 print 'index =', `data`
107
108def catalogcallback(arg, type, data):
109 print 'catalog =', `data`
110
111def identcallback(arg, type, data):
112 print 'ident =', `data`
113
114def controlcallback(arg, type, data):
115 print 'control =', `data`
116
117statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
118
119def prstatus(player):
120 state, track, min, sec, frame, abs_min, abs_sec, abs_frame, \
121 total_min, total_sec, total_frame, first, last, scsi_audio, \
122 cur_block, dum1, dum2, dum3 = player.getstatus()
123 print 'Status:',
124 if 0 <= state < len(statedict):
125 print statedict[state]
126 else:
127 print state
128 print 'Track: ', track
129 print 'Time: ', triple(min, sec, frame)
130 print 'Abs: ', triple(abs_min, abs_sec, abs_frame)
131 print 'Total: ', triple(total_min, total_sec, total_frame)
132 print 'First: ', first
133 print 'Last: ', last
134 print 'SCSI: ', scsi_audio
135 print 'Block: ', cur_block
136 print 'Future:', (dum1, dum2, dum3)
137
138def triple(a, b, c):
139 return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
140
141def zfill(n):
142 s = `n`
143 return '0' * (2 - len(s)) + s