PageRenderTime 50ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/lib-python/2.7/audiodev.py

https://bitbucket.org/dac_io/pypy
Python | 260 lines | 215 code | 31 blank | 14 comment | 50 complexity | 2b77fafd633173c58beb813e6e5b196c MD5 | raw file
  1. """Classes for manipulating audio devices (currently only for Sun and SGI)"""
  2. from warnings import warnpy3k
  3. warnpy3k("the audiodev module has been removed in Python 3.0", stacklevel=2)
  4. del warnpy3k
  5. __all__ = ["error","AudioDev"]
  6. class error(Exception):
  7. pass
  8. class Play_Audio_sgi:
  9. # Private instance variables
  10. ## if 0: access frameratelist, nchannelslist, sampwidthlist, oldparams, \
  11. ## params, config, inited_outrate, inited_width, \
  12. ## inited_nchannels, port, converter, classinited: private
  13. classinited = 0
  14. frameratelist = nchannelslist = sampwidthlist = None
  15. def initclass(self):
  16. import AL
  17. self.frameratelist = [
  18. (48000, AL.RATE_48000),
  19. (44100, AL.RATE_44100),
  20. (32000, AL.RATE_32000),
  21. (22050, AL.RATE_22050),
  22. (16000, AL.RATE_16000),
  23. (11025, AL.RATE_11025),
  24. ( 8000, AL.RATE_8000),
  25. ]
  26. self.nchannelslist = [
  27. (1, AL.MONO),
  28. (2, AL.STEREO),
  29. (4, AL.QUADRO),
  30. ]
  31. self.sampwidthlist = [
  32. (1, AL.SAMPLE_8),
  33. (2, AL.SAMPLE_16),
  34. (3, AL.SAMPLE_24),
  35. ]
  36. self.classinited = 1
  37. def __init__(self):
  38. import al, AL
  39. if not self.classinited:
  40. self.initclass()
  41. self.oldparams = []
  42. self.params = [AL.OUTPUT_RATE, 0]
  43. self.config = al.newconfig()
  44. self.inited_outrate = 0
  45. self.inited_width = 0
  46. self.inited_nchannels = 0
  47. self.converter = None
  48. self.port = None
  49. return
  50. def __del__(self):
  51. if self.port:
  52. self.stop()
  53. if self.oldparams:
  54. import al, AL
  55. al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
  56. self.oldparams = []
  57. def wait(self):
  58. if not self.port:
  59. return
  60. import time
  61. while self.port.getfilled() > 0:
  62. time.sleep(0.1)
  63. self.stop()
  64. def stop(self):
  65. if self.port:
  66. self.port.closeport()
  67. self.port = None
  68. if self.oldparams:
  69. import al, AL
  70. al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
  71. self.oldparams = []
  72. def setoutrate(self, rate):
  73. for (raw, cooked) in self.frameratelist:
  74. if rate == raw:
  75. self.params[1] = cooked
  76. self.inited_outrate = 1
  77. break
  78. else:
  79. raise error, 'bad output rate'
  80. def setsampwidth(self, width):
  81. for (raw, cooked) in self.sampwidthlist:
  82. if width == raw:
  83. self.config.setwidth(cooked)
  84. self.inited_width = 1
  85. break
  86. else:
  87. if width == 0:
  88. import AL
  89. self.inited_width = 0
  90. self.config.setwidth(AL.SAMPLE_16)
  91. self.converter = self.ulaw2lin
  92. else:
  93. raise error, 'bad sample width'
  94. def setnchannels(self, nchannels):
  95. for (raw, cooked) in self.nchannelslist:
  96. if nchannels == raw:
  97. self.config.setchannels(cooked)
  98. self.inited_nchannels = 1
  99. break
  100. else:
  101. raise error, 'bad # of channels'
  102. def writeframes(self, data):
  103. if not (self.inited_outrate and self.inited_nchannels):
  104. raise error, 'params not specified'
  105. if not self.port:
  106. import al, AL
  107. self.port = al.openport('Python', 'w', self.config)
  108. self.oldparams = self.params[:]
  109. al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
  110. al.setparams(AL.DEFAULT_DEVICE, self.params)
  111. if self.converter:
  112. data = self.converter(data)
  113. self.port.writesamps(data)
  114. def getfilled(self):
  115. if self.port:
  116. return self.port.getfilled()
  117. else:
  118. return 0
  119. def getfillable(self):
  120. if self.port:
  121. return self.port.getfillable()
  122. else:
  123. return self.config.getqueuesize()
  124. # private methods
  125. ## if 0: access *: private
  126. def ulaw2lin(self, data):
  127. import audioop
  128. return audioop.ulaw2lin(data, 2)
  129. class Play_Audio_sun:
  130. ## if 0: access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
  131. ## inited_nchannels, converter: private
  132. def __init__(self):
  133. self.outrate = 0
  134. self.sampwidth = 0
  135. self.nchannels = 0
  136. self.inited_outrate = 0
  137. self.inited_width = 0
  138. self.inited_nchannels = 0
  139. self.converter = None
  140. self.port = None
  141. return
  142. def __del__(self):
  143. self.stop()
  144. def setoutrate(self, rate):
  145. self.outrate = rate
  146. self.inited_outrate = 1
  147. def setsampwidth(self, width):
  148. self.sampwidth = width
  149. self.inited_width = 1
  150. def setnchannels(self, nchannels):
  151. self.nchannels = nchannels
  152. self.inited_nchannels = 1
  153. def writeframes(self, data):
  154. if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
  155. raise error, 'params not specified'
  156. if not self.port:
  157. import sunaudiodev, SUNAUDIODEV
  158. self.port = sunaudiodev.open('w')
  159. info = self.port.getinfo()
  160. info.o_sample_rate = self.outrate
  161. info.o_channels = self.nchannels
  162. if self.sampwidth == 0:
  163. info.o_precision = 8
  164. self.o_encoding = SUNAUDIODEV.ENCODING_ULAW
  165. # XXX Hack, hack -- leave defaults
  166. else:
  167. info.o_precision = 8 * self.sampwidth
  168. info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
  169. self.port.setinfo(info)
  170. if self.converter:
  171. data = self.converter(data)
  172. self.port.write(data)
  173. def wait(self):
  174. if not self.port:
  175. return
  176. self.port.drain()
  177. self.stop()
  178. def stop(self):
  179. if self.port:
  180. self.port.flush()
  181. self.port.close()
  182. self.port = None
  183. def getfilled(self):
  184. if self.port:
  185. return self.port.obufcount()
  186. else:
  187. return 0
  188. ## # Nobody remembers what this method does, and it's broken. :-(
  189. ## def getfillable(self):
  190. ## return BUFFERSIZE - self.getfilled()
  191. def AudioDev():
  192. # Dynamically try to import and use a platform specific module.
  193. try:
  194. import al
  195. except ImportError:
  196. try:
  197. import sunaudiodev
  198. return Play_Audio_sun()
  199. except ImportError:
  200. try:
  201. import Audio_mac
  202. except ImportError:
  203. raise error, 'no audio device'
  204. else:
  205. return Audio_mac.Play_Audio_mac()
  206. else:
  207. return Play_Audio_sgi()
  208. def test(fn = None):
  209. import sys
  210. if sys.argv[1:]:
  211. fn = sys.argv[1]
  212. else:
  213. fn = 'f:just samples:just.aif'
  214. import aifc
  215. af = aifc.open(fn, 'r')
  216. print fn, af.getparams()
  217. p = AudioDev()
  218. p.setoutrate(af.getframerate())
  219. p.setsampwidth(af.getsampwidth())
  220. p.setnchannels(af.getnchannels())
  221. BUFSIZ = af.getframerate()/af.getsampwidth()/af.getnchannels()
  222. while 1:
  223. data = af.readframes(BUFSIZ)
  224. if not data: break
  225. print len(data)
  226. p.writeframes(data)
  227. p.wait()
  228. if __name__ == '__main__':
  229. test()