PageRenderTime 49ms CodeModel.GetById 14ms RepoModel.GetById 1ms app.codeStats 0ms

/lib-python/2.7/plat-irix5/readcd.py

https://bitbucket.org/dac_io/pypy
Python | 247 lines | 225 code | 18 blank | 4 comment | 80 complexity | b5f596e4585433ee8c0c5a38e0c677f5 MD5 | raw file
  1. # Class interface to the CD module.
  2. from warnings import warnpy3k
  3. warnpy3k("the readcd module has been removed in Python 3.0", stacklevel=2)
  4. del warnpy3k
  5. import cd, CD
  6. class Error(Exception):
  7. pass
  8. class _Stop(Exception):
  9. pass
  10. def _doatime(self, cb_type, data):
  11. if ((data[0] * 60) + data[1]) * 75 + data[2] > self.end:
  12. ## print 'done with list entry', repr(self.listindex)
  13. raise _Stop
  14. func, arg = self.callbacks[cb_type]
  15. if func:
  16. func(arg, cb_type, data)
  17. def _dopnum(self, cb_type, data):
  18. if data > self.end:
  19. ## print 'done with list entry', repr(self.listindex)
  20. raise _Stop
  21. func, arg = self.callbacks[cb_type]
  22. if func:
  23. func(arg, cb_type, data)
  24. class Readcd:
  25. def __init__(self, *arg):
  26. if len(arg) == 0:
  27. self.player = cd.open()
  28. elif len(arg) == 1:
  29. self.player = cd.open(arg[0])
  30. elif len(arg) == 2:
  31. self.player = cd.open(arg[0], arg[1])
  32. else:
  33. raise Error, 'bad __init__ call'
  34. self.list = []
  35. self.callbacks = [(None, None)] * 8
  36. self.parser = cd.createparser()
  37. self.playing = 0
  38. self.end = 0
  39. self.status = None
  40. self.trackinfo = None
  41. def eject(self):
  42. self.player.eject()
  43. self.list = []
  44. self.end = 0
  45. self.listindex = 0
  46. self.status = None
  47. self.trackinfo = None
  48. if self.playing:
  49. ## print 'stop playing from eject'
  50. raise _Stop
  51. def pmsf2msf(self, track, min, sec, frame):
  52. if not self.status:
  53. self.cachestatus()
  54. if track < self.status[5] or track > self.status[6]:
  55. raise Error, 'track number out of range'
  56. if not self.trackinfo:
  57. self.cacheinfo()
  58. start, total = self.trackinfo[track]
  59. start = ((start[0] * 60) + start[1]) * 75 + start[2]
  60. total = ((total[0] * 60) + total[1]) * 75 + total[2]
  61. block = ((min * 60) + sec) * 75 + frame
  62. if block > total:
  63. raise Error, 'out of range'
  64. block = start + block
  65. min, block = divmod(block, 75*60)
  66. sec, frame = divmod(block, 75)
  67. return min, sec, frame
  68. def reset(self):
  69. self.list = []
  70. def appendtrack(self, track):
  71. self.appendstretch(track, track)
  72. def appendstretch(self, start, end):
  73. if not self.status:
  74. self.cachestatus()
  75. if not start:
  76. start = 1
  77. if not end:
  78. end = self.status[6]
  79. if type(end) == type(0):
  80. if end < self.status[5] or end > self.status[6]:
  81. raise Error, 'range error'
  82. else:
  83. l = len(end)
  84. if l == 4:
  85. prog, min, sec, frame = end
  86. if prog < self.status[5] or prog > self.status[6]:
  87. raise Error, 'range error'
  88. end = self.pmsf2msf(prog, min, sec, frame)
  89. elif l != 3:
  90. raise Error, 'syntax error'
  91. if type(start) == type(0):
  92. if start < self.status[5] or start > self.status[6]:
  93. raise Error, 'range error'
  94. if len(self.list) > 0:
  95. s, e = self.list[-1]
  96. if type(e) == type(0):
  97. if start == e+1:
  98. start = s
  99. del self.list[-1]
  100. else:
  101. l = len(start)
  102. if l == 4:
  103. prog, min, sec, frame = start
  104. if prog < self.status[5] or prog > self.status[6]:
  105. raise Error, 'range error'
  106. start = self.pmsf2msf(prog, min, sec, frame)
  107. elif l != 3:
  108. raise Error, 'syntax error'
  109. self.list.append((start, end))
  110. def settracks(self, list):
  111. self.list = []
  112. for track in list:
  113. self.appendtrack(track)
  114. def setcallback(self, cb_type, func, arg):
  115. if cb_type < 0 or cb_type >= 8:
  116. raise Error, 'type out of range'
  117. self.callbacks[cb_type] = (func, arg)
  118. if self.playing:
  119. start, end = self.list[self.listindex]
  120. if type(end) == type(0):
  121. if cb_type != CD.PNUM:
  122. self.parser.setcallback(cb_type, func, arg)
  123. else:
  124. if cb_type != CD.ATIME:
  125. self.parser.setcallback(cb_type, func, arg)
  126. def removecallback(self, cb_type):
  127. if cb_type < 0 or cb_type >= 8:
  128. raise Error, 'type out of range'
  129. self.callbacks[cb_type] = (None, None)
  130. if self.playing:
  131. start, end = self.list[self.listindex]
  132. if type(end) == type(0):
  133. if cb_type != CD.PNUM:
  134. self.parser.removecallback(cb_type)
  135. else:
  136. if cb_type != CD.ATIME:
  137. self.parser.removecallback(cb_type)
  138. def gettrackinfo(self, *arg):
  139. if not self.status:
  140. self.cachestatus()
  141. if not self.trackinfo:
  142. self.cacheinfo()
  143. if len(arg) == 0:
  144. return self.trackinfo[self.status[5]:self.status[6]+1]
  145. result = []
  146. for i in arg:
  147. if i < self.status[5] or i > self.status[6]:
  148. raise Error, 'range error'
  149. result.append(self.trackinfo[i])
  150. return result
  151. def cacheinfo(self):
  152. if not self.status:
  153. self.cachestatus()
  154. self.trackinfo = []
  155. for i in range(self.status[5]):
  156. self.trackinfo.append(None)
  157. for i in range(self.status[5], self.status[6]+1):
  158. self.trackinfo.append(self.player.gettrackinfo(i))
  159. def cachestatus(self):
  160. self.status = self.player.getstatus()
  161. if self.status[0] == CD.NODISC:
  162. self.status = None
  163. raise Error, 'no disc in player'
  164. def getstatus(self):
  165. return self.player.getstatus()
  166. def play(self):
  167. if not self.status:
  168. self.cachestatus()
  169. size = self.player.bestreadsize()
  170. self.listindex = 0
  171. self.playing = 0
  172. for i in range(8):
  173. func, arg = self.callbacks[i]
  174. if func:
  175. self.parser.setcallback(i, func, arg)
  176. else:
  177. self.parser.removecallback(i)
  178. if len(self.list) == 0:
  179. for i in range(self.status[5], self.status[6]+1):
  180. self.appendtrack(i)
  181. try:
  182. while 1:
  183. if not self.playing:
  184. if self.listindex >= len(self.list):
  185. return
  186. start, end = self.list[self.listindex]
  187. if type(start) == type(0):
  188. dummy = self.player.seektrack(
  189. start)
  190. else:
  191. min, sec, frame = start
  192. dummy = self.player.seek(
  193. min, sec, frame)
  194. if type(end) == type(0):
  195. self.parser.setcallback(
  196. CD.PNUM, _dopnum, self)
  197. self.end = end
  198. func, arg = \
  199. self.callbacks[CD.ATIME]
  200. if func:
  201. self.parser.setcallback(CD.ATIME, func, arg)
  202. else:
  203. self.parser.removecallback(CD.ATIME)
  204. else:
  205. min, sec, frame = end
  206. self.parser.setcallback(
  207. CD.ATIME, _doatime,
  208. self)
  209. self.end = (min * 60 + sec) * \
  210. 75 + frame
  211. func, arg = \
  212. self.callbacks[CD.PNUM]
  213. if func:
  214. self.parser.setcallback(CD.PNUM, func, arg)
  215. else:
  216. self.parser.removecallback(CD.PNUM)
  217. self.playing = 1
  218. data = self.player.readda(size)
  219. if data == '':
  220. self.playing = 0
  221. self.listindex = self.listindex + 1
  222. continue
  223. try:
  224. self.parser.parseframe(data)
  225. except _Stop:
  226. self.playing = 0
  227. self.listindex = self.listindex + 1
  228. finally:
  229. self.playing = 0