1992-04-13 15:38:20 -03:00
|
|
|
# Read CD audio data from the SCSI CD player and send it as UDP
|
1992-04-15 13:38:38 -03:00
|
|
|
# packets to "recvcd.py" on another host.
|
|
|
|
#
|
|
|
|
# Usage: python sendcd.py [options] host [track | minutes seconds [frames]]
|
|
|
|
#
|
|
|
|
# Options:
|
|
|
|
# "-l" list track info and quit.
|
|
|
|
# "-s" display status and quit.
|
|
|
|
#
|
|
|
|
# Arguments:
|
|
|
|
# host host to send the audio data to (required unless -l or -s).
|
|
|
|
# track track number where to start; alternatively,
|
|
|
|
# min sec [frames] absolute address where to start;
|
|
|
|
# default is continue at current point according to status.
|
1992-04-13 15:38:20 -03:00
|
|
|
|
|
|
|
import cd
|
|
|
|
import sys
|
|
|
|
from socket import *
|
|
|
|
import getopt
|
|
|
|
|
1992-04-14 08:05:22 -03:00
|
|
|
PORT = 50505 # Must match the port in readcd.py
|
1992-04-13 15:38:20 -03:00
|
|
|
|
|
|
|
def main():
|
|
|
|
try:
|
|
|
|
optlist, args = getopt.getopt(sys.argv[1:], 'ls')
|
|
|
|
except getopt.error, msg:
|
|
|
|
sys.stderr.write(msg + '\n')
|
|
|
|
sys.exit(2)
|
|
|
|
|
|
|
|
player = cd.open()
|
|
|
|
prstatus(player)
|
|
|
|
size = player.bestreadsize()
|
|
|
|
|
|
|
|
if optlist:
|
|
|
|
for opt, arg in optlist:
|
|
|
|
if opt == '-l':
|
|
|
|
prtrackinfo(player)
|
|
|
|
elif opt == '-s':
|
|
|
|
prstatus(player)
|
|
|
|
return
|
|
|
|
|
1992-04-15 13:38:38 -03:00
|
|
|
if not args:
|
|
|
|
sys.stderr.write('usage: ' + sys.argv[0] + ' host [track]\n')
|
|
|
|
sys.exit(2)
|
|
|
|
host, args = args[0], args[1:]
|
|
|
|
|
1992-04-13 15:38:20 -03:00
|
|
|
sys.stdout.write('waiting for socket... ')
|
|
|
|
sys.stdout.flush()
|
|
|
|
port = socket(AF_INET, SOCK_DGRAM)
|
1992-04-15 13:38:38 -03:00
|
|
|
port.connect(host, PORT)
|
1992-04-13 15:38:20 -03:00
|
|
|
print 'socket connected'
|
|
|
|
|
|
|
|
parser = cd.createparser()
|
1995-04-06 11:46:31 -03:00
|
|
|
parser.setcallback(cd.audio, audiocallback, port)
|
|
|
|
parser.setcallback(cd.pnum, pnumcallback, player)
|
|
|
|
parser.setcallback(cd.index, indexcallback, None)
|
|
|
|
## cd.ptime: too many calls
|
|
|
|
## cd.atime: too many calls
|
|
|
|
parser.setcallback(cd.catalog, catalogcallback, None)
|
|
|
|
parser.setcallback(cd.ident, identcallback, None)
|
|
|
|
parser.setcallback(cd.control, controlcallback, None)
|
1992-04-13 15:38:20 -03:00
|
|
|
|
|
|
|
if len(args) >= 2:
|
|
|
|
if len(args) >= 3:
|
|
|
|
[min, sec, frame] = args[:3]
|
|
|
|
else:
|
|
|
|
[min, sec] = args
|
1992-04-15 13:38:38 -03:00
|
|
|
frame = '0'
|
1992-04-13 15:38:20 -03:00
|
|
|
min, sec, frame = eval(min), eval(sec), eval(frame)
|
|
|
|
print 'Seek to', triple(min, sec, frame)
|
|
|
|
dummy = player.seek(min, sec, frame)
|
|
|
|
elif len(args) == 1:
|
|
|
|
track = eval(args[0])
|
|
|
|
print 'Seek to track', track
|
|
|
|
dummy = player.seektrack(track)
|
|
|
|
else:
|
1992-04-15 13:38:38 -03:00
|
|
|
min, sec, frame = player.getstatus()[3]
|
1992-04-13 15:38:20 -03:00
|
|
|
print 'Try to seek back to', triple(min, sec, frame)
|
|
|
|
try:
|
|
|
|
player.seek(min, sec, frame)
|
|
|
|
except RuntimeError:
|
|
|
|
print 'Seek failed'
|
|
|
|
|
|
|
|
try:
|
|
|
|
while 1:
|
|
|
|
frames = player.readda(size)
|
|
|
|
if frames == '':
|
|
|
|
print 'END OF CD'
|
|
|
|
break
|
|
|
|
parser.parseframe(frames)
|
|
|
|
except KeyboardInterrupt:
|
|
|
|
print '[Interrupted]'
|
|
|
|
pass
|
|
|
|
|
|
|
|
def prtrackinfo(player):
|
|
|
|
info = []
|
|
|
|
while 1:
|
|
|
|
try:
|
|
|
|
info.append(player.gettrackinfo(len(info) + 1))
|
|
|
|
except RuntimeError:
|
|
|
|
break
|
|
|
|
for i in range(len(info)):
|
1992-04-15 13:38:38 -03:00
|
|
|
start, total = info[i]
|
|
|
|
print 'Track', zfill(i+1), triple(start), triple(total)
|
1992-04-13 15:38:20 -03:00
|
|
|
|
|
|
|
def audiocallback(port, type, data):
|
|
|
|
## sys.stdout.write('#')
|
|
|
|
## sys.stdout.flush()
|
|
|
|
port.send(data)
|
|
|
|
|
|
|
|
def pnumcallback(player, type, data):
|
|
|
|
print 'pnum =', `data`
|
|
|
|
prstatus(player)
|
|
|
|
|
|
|
|
def indexcallback(arg, type, data):
|
|
|
|
print 'index =', `data`
|
|
|
|
|
|
|
|
def catalogcallback(arg, type, data):
|
|
|
|
print 'catalog =', `data`
|
|
|
|
|
|
|
|
def identcallback(arg, type, data):
|
|
|
|
print 'ident =', `data`
|
|
|
|
|
|
|
|
def controlcallback(arg, type, data):
|
|
|
|
print 'control =', `data`
|
|
|
|
|
|
|
|
statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
|
|
|
|
|
|
|
|
def prstatus(player):
|
1992-04-15 13:38:38 -03:00
|
|
|
state, track, curtime, abstime, totaltime, first, last, \
|
|
|
|
scsi_audio, cur_block, dummy = player.getstatus()
|
1992-04-13 15:38:20 -03:00
|
|
|
print 'Status:',
|
|
|
|
if 0 <= state < len(statedict):
|
|
|
|
print statedict[state]
|
|
|
|
else:
|
|
|
|
print state
|
|
|
|
print 'Track: ', track
|
1992-04-15 13:38:38 -03:00
|
|
|
print 'Time: ', triple(curtime)
|
|
|
|
print 'Abs: ', triple(abstime)
|
|
|
|
print 'Total: ', triple(totaltime)
|
1992-04-13 15:38:20 -03:00
|
|
|
print 'First: ', first
|
|
|
|
print 'Last: ', last
|
|
|
|
print 'SCSI: ', scsi_audio
|
|
|
|
print 'Block: ', cur_block
|
1992-04-15 13:38:38 -03:00
|
|
|
print 'Future:', dummy
|
1992-04-13 15:38:20 -03:00
|
|
|
|
1992-04-15 13:38:38 -03:00
|
|
|
def triple((a, b, c)):
|
1992-04-13 15:38:20 -03:00
|
|
|
return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
|
|
|
|
|
|
|
|
def zfill(n):
|
|
|
|
s = `n`
|
|
|
|
return '0' * (2 - len(s)) + s
|
1992-04-14 08:05:22 -03:00
|
|
|
|
|
|
|
main()
|