1 # Read CD audio data from the SCSI CD player and send it as UDP
2 # packets to "recvcd.py" on another host.
4 # Usage: python sendcd.py [options] host [track | minutes seconds [frames]]
7 # "-l" list track info and quit.
8 # "-s" display status and quit.
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.
21 PORT
= 50505 # Must match the port in readcd.py
25 optlist
, args
= getopt
.getopt(sys
.argv
[1:], 'ls')
26 except getopt
.error
, msg
:
27 sys
.stderr
.write(msg
+ '\n')
32 size
= player
.bestreadsize()
35 for opt
, arg
in optlist
:
43 sys
.stderr
.write('usage: ' + sys
.argv
[0] + ' host [track]\n')
45 host
, args
= args
[0], args
[1:]
47 sys
.stdout
.write('waiting for socket... ')
49 port
= socket(AF_INET
, SOCK_DGRAM
)
50 port
.connect(host
, PORT
)
51 print 'socket connected'
53 parser
= cd
.createparser()
54 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)
65 [min, sec
, frame
] = args
[:3]
69 min, sec
, frame
= eval(min), eval(sec
), eval(frame
)
70 print 'Seek to', triple(min, sec
, frame
)
71 dummy
= player
.seek(min, sec
, frame
)
74 print 'Seek to track', track
75 dummy
= player
.seektrack(track
)
77 min, sec
, frame
= player
.getstatus()[3]
78 print 'Try to seek back to', triple(min, sec
, frame
)
80 player
.seek(min, sec
, frame
)
86 frames
= player
.readda(size
)
90 parser
.parseframe(frames
)
91 except KeyboardInterrupt:
95 def prtrackinfo(player
):
99 info
.append(player
.gettrackinfo(len(info
) + 1))
102 for i
in range(len(info
)):
103 start
, total
= info
[i
]
104 print 'Track', zfill(i
+1), triple(start
), triple(total
)
106 def audiocallback(port
, type, data
):
107 ## sys.stdout.write('#')
108 ## sys.stdout.flush()
111 def pnumcallback(player
, type, data
):
112 print 'pnum =', `data`
115 def indexcallback(arg
, type, data
):
116 print 'index =', `data`
118 def catalogcallback(arg
, type, data
):
119 print 'catalog =', `data`
121 def identcallback(arg
, type, data
):
122 print 'ident =', `data`
124 def controlcallback(arg
, type, data
):
125 print 'control =', `data`
127 statedict
= ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
129 def prstatus(player
):
130 state
, track
, curtime
, abstime
, totaltime
, first
, last
, \
131 scsi_audio
, cur_block
, dummy
= player
.getstatus()
133 if 0 <= state
< len(statedict
):
134 print statedict
[state
]
137 print 'Track: ', track
138 print 'Time: ', triple(curtime
)
139 print 'Abs: ', triple(abstime
)
140 print 'Total: ', triple(totaltime
)
141 print 'First: ', first
143 print 'SCSI: ', scsi_audio
144 print 'Block: ', cur_block
145 print 'Future:', dummy
147 def triple((a
, b
, c
)):
148 return zfill(a
) + ':' + zfill(b
) + ':' + zfill(c
)
152 return '0' * (2 - len(s
)) + s