home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / pyos2bin.zip / Demo / sgi / cd / sendcd.py < prev   
Text File  |  1995-04-06  |  4KB  |  155 lines

  1. # Read CD audio data from the SCSI CD player and send it as UDP
  2. # 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.
  15.  
  16. import cd
  17. import sys
  18. from socket import *
  19. import getopt
  20.  
  21. PORT = 50505                # Must match the port in readcd.py
  22.  
  23. def 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.  
  42.     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.  
  47.     sys.stdout.write('waiting for socket... ')
  48.     sys.stdout.flush()
  49.     port = socket(AF_INET, SOCK_DGRAM)
  50.     port.connect(host, PORT)
  51.     print 'socket connected'
  52.  
  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)
  62.  
  63.     if len(args) >= 2:
  64.         if len(args) >= 3:
  65.             [min, sec, frame] = args[:3]
  66.         else:
  67.             [min, sec] = args
  68.             frame = '0'
  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)
  72.     elif len(args) == 1:
  73.         track = eval(args[0])
  74.         print 'Seek to track', track
  75.         dummy = player.seektrack(track)
  76.     else:
  77.         min, sec, frame = player.getstatus()[3]
  78.         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.  
  95. def 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)):
  103.         start, total = info[i]
  104.         print 'Track', zfill(i+1), triple(start), triple(total)
  105.  
  106. def audiocallback(port, type, data):
  107. ##    sys.stdout.write('#')
  108. ##    sys.stdout.flush()
  109.     port.send(data)
  110.  
  111. def pnumcallback(player, type, data):
  112.     print 'pnum =', `data`
  113.     prstatus(player)
  114.  
  115. def indexcallback(arg, type, data):
  116.     print 'index =', `data`
  117.  
  118. def catalogcallback(arg, type, data):
  119.     print 'catalog =', `data`
  120.  
  121. def identcallback(arg, type, data):
  122.     print 'ident =', `data`
  123.  
  124. def controlcallback(arg, type, data):
  125.     print 'control =', `data`
  126.  
  127. statedict = ['ERROR', 'NODISK', 'READY', 'PLAYING', 'PAUSED', 'STILL']
  128.  
  129. def prstatus(player):
  130.     state, track, curtime, abstime, totaltime, first, last, \
  131.         scsi_audio, cur_block, dummy = player.getstatus()
  132.     print 'Status:',
  133.     if 0 <= state < len(statedict):
  134.         print statedict[state]
  135.     else:
  136.         print state
  137.     print 'Track: ', track
  138.     print 'Time:  ', triple(curtime)
  139.     print 'Abs:   ', triple(abstime)
  140.     print 'Total: ', triple(totaltime)
  141.     print 'First: ', first
  142.     print 'Last:  ', last
  143.     print 'SCSI:  ', scsi_audio
  144.     print 'Block: ', cur_block
  145.     print 'Future:', dummy
  146.  
  147. def triple((a, b, c)):
  148.     return zfill(a) + ':' + zfill(b) + ':' + zfill(c)
  149.  
  150. def zfill(n):
  151.     s = `n`
  152.     return '0' * (2 - len(s)) + s
  153.  
  154. main()
  155.