blob: a6cf8e76a670ff648dd829dea37ecf1cd38d1fba [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
Guido van Rossumf4be7261992-04-15 16:38:38 +00002# packets to "recvcd.py" on another host.
3#
4# Usage: python sendcd.py [options] host [track | minutes seconds [frames]]
5#
6# Options:
7# "-l" list track info and quit.
8# "-s" display status and quit.
9#
10# Arguments:
11# host host to send the audio data to (required unless -l or -s).
12# track track number where to start; alternatively,
13# min sec [frames] absolute address where to start;
14# default is continue at current point according to status.
Guido van Rossumb9506291992-04-13 18:38:20 +000015
16import cd
17import sys
18from socket import *
19import getopt
20
Guido van Rossumdbdeebb1992-04-14 11:05:22 +000021PORT = 50505 # Must match the port in readcd.py
Guido van Rossumb9506291992-04-13 18:38:20 +000022
23def main():
24 try:
25 optlist, args = getopt.getopt(sys.argv[1:], 'ls')
26 except getopt.error, msg:
27 sys.stderr.write(msg + '\n')
28 sys.exit(2)
29
30 player = cd.open()
31 prstatus(player)
32 size = player.bestreadsize()
33
34 if optlist:
35 for opt, arg in optlist:
36 if opt == '-l':
37 prtrackinfo(player)
38 elif opt == '-s':
39 prstatus(player)
40 return
41
Guido van Rossumf4be7261992-04-15 16:38:38 +000042 if not args:
43 sys.stderr.write('usage: ' + sys.argv[0] + ' host [track]\n')
44 sys.exit(2)
45 host, args = args[0], args[1:]
46
Guido van Rossumb9506291992-04-13 18:38:20 +000047 sys.stdout.write('waiting for socket... ')
48 sys.stdout.flush()
49 port = socket(AF_INET, SOCK_DGRAM)
Guido van Rossumf4be7261992-04-15 16:38:38 +000050 port.connect(host, PORT)
Guido van Rossumb9506291992-04-13 18:38:20 +000051 print 'socket connected'
52
53 parser = cd.createparser()
Sjoerd Mullenderf1bb3341995-04-06 14:46:31 +000054 parser.setcallback(cd.audio, audiocallback, port)
55 parser.setcallback(cd.pnum, pnumcallback, player)
56 parser.setcallback(cd.index, indexcallback, None)
57 ## cd.ptime: too many calls
58 ## cd.atime: too many calls
59 parser.setcallback(cd.catalog, catalogcallback, None)
60 parser.setcallback(cd.ident, identcallback, None)
61 parser.setcallback(cd.control, controlcallback, None)
Guido van Rossumb9506291992-04-13 18:38:20 +000062
63 if len(args) >= 2:
64 if len(args) >= 3:
65 [min, sec, frame] = args[:3]
66 else:
67 [min, sec] = args
Guido van Rossumf4be7261992-04-15 16:38:38 +000068 frame = '0'
Guido van Rossumb9506291992-04-13 18:38:20 +000069 min, sec, frame = eval(min), eval(sec), eval(frame)
70 print 'Seek to', triple(min, sec, frame)
71 dummy = player.seek(min, sec, frame)
72 elif len(args) == 1:
73 track = eval(args[0])
74 print 'Seek to track', track
75 dummy = player.seektrack(track)
76 else:
Guido van Rossumf4be7261992-04-15 16:38:38 +000077 min, sec, frame = player.getstatus()[3]
Guido van Rossumb9506291992-04-13 18:38:20 +000078 print 'Try to seek back to', triple(min, sec, frame)
79 try:
80 player.seek(min, sec, frame)
81 except RuntimeError:
82 print 'Seek failed'
83
84 try:
85 while 1:
86 frames = player.readda(size)
87 if frames == '':
88 print 'END OF CD'
89 break
90 parser.parseframe(frames)
91 except KeyboardInterrupt:
92 print '[Interrupted]'
93 pass
94
95def prtrackinfo(player):
96 info = []
97 while 1:
98 try:
99 info.append(player.gettrackinfo(len(info) + 1))
100 except RuntimeError:
101 break
102 for i in range(len(info)):
Guido van Rossumf4be7261992-04-15 16:38:38 +0000103 start, total = info[i]
104 print 'Track', zfill(i+1), triple(start), triple(total)
Guido van Rossumb9506291992-04-13 18:38:20 +0000105
106def audiocallback(port, type, data):
107## sys.stdout.write('#')
108## sys.stdout.flush()
109 port.send(data)
110
111def pnumcallback(player, type, data):
112 print 'pnum =', `data`
113 prstatus(player)
114
115def indexcallback(arg, type, data):
116 print 'index =', `data`
117
118def catalogcallback(arg, type, data):
119 print 'catalog =', `data`
120
121def identcallback(arg, type, data):
122 print 'ident =', `data`
123
124def controlcallback(arg, type, data):
125 print 'control =', `data`
126
127statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
128
129def prstatus(player):
Guido van Rossumf4be7261992-04-15 16:38:38 +0000130 state, track, curtime, abstime, totaltime, first, last, \
131 scsi_audio, cur_block, dummy = player.getstatus()
Guido van Rossumb9506291992-04-13 18:38:20 +0000132 print 'Status:',
133 if 0 <= state < len(statedict):
134 print statedict[state]
135 else:
136 print state
137 print 'Track: ', track
Guido van Rossumf4be7261992-04-15 16:38:38 +0000138 print 'Time: ', triple(curtime)
139 print 'Abs: ', triple(abstime)
140 print 'Total: ', triple(totaltime)
Guido van Rossumb9506291992-04-13 18:38:20 +0000141 print 'First: ', first
142 print 'Last: ', last
143 print 'SCSI: ', scsi_audio
144 print 'Block: ', cur_block
Guido van Rossumf4be7261992-04-15 16:38:38 +0000145 print 'Future:', dummy
Guido van Rossumb9506291992-04-13 18:38:20 +0000146
Guido van Rossumf4be7261992-04-15 16:38:38 +0000147def triple((a, b, c)):
Guido van Rossumb9506291992-04-13 18:38:20 +0000148 return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
149
150def zfill(n):
151 s = `n`
152 return '0' * (2 - len(s)) + s
Guido van Rossumdbdeebb1992-04-14 11:05:22 +0000153
154main()