home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / Other Langs / python / python folder / Lib / audiodev.py < prev    next >
Encoding:
Python Source  |  1994-01-05  |  4.5 KB  |  206 lines  |  [TEXT/????]

  1. import AL, SUNAUDIODEV
  2.  
  3. error = 'audiodev.error'
  4.  
  5. class Play_Audio_sgi:
  6.     # Private instance variables
  7.     access frameratelist, nchannelslist, sampwidthlist, oldparams, \
  8.           params, config, inited_outrate, inited_width, \
  9.           inited_nchannels, port, converter: private
  10.  
  11.     frameratelist = [(48000, AL.RATE_48000),
  12.              (44100, AL.RATE_44100),
  13.              (32000, AL.RATE_32000),
  14.              (22050, AL.RATE_22050),
  15.              (16000, AL.RATE_16000),
  16.              (11025, AL.RATE_11025),
  17.              ( 8000,  AL.RATE_8000)]
  18.     nchannelslist = [(1, AL.MONO),
  19.              (2, AL.STEREO)]
  20.     sampwidthlist = [(1, AL.SAMPLE_8),
  21.              (2, AL.SAMPLE_16),
  22.              (3, AL.SAMPLE_24)]
  23.  
  24.     def __init__(self):
  25.         import al
  26.         self.oldparams = []
  27.         self.params = [AL.OUTPUT_RATE, 0]
  28.         self.config = al.newconfig()
  29.         self.inited_outrate = 0
  30.         self.inited_width = 0
  31.         self.inited_nchannels = 0
  32.         self.converter = None
  33.         self.port = None
  34.         return
  35.  
  36.     def __del__(self):
  37.         if self.port:
  38.             self.stop()
  39.         if self.oldparams:
  40.             import al
  41.             al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
  42.             self.oldparams = []
  43.  
  44.     def wait(self):
  45.         if not self.port:
  46.             return
  47.         import time
  48.         while self.port.getfilled() > 0:
  49.             time.sleep(0.1)
  50.         self.stop()
  51.  
  52.     def stop(self):
  53.         if self.port:
  54.             self.port.closeport()
  55.             self.port = None
  56.         if self.oldparams:
  57.             import al
  58.             al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
  59.             self.oldparams = []
  60.  
  61.     def setoutrate(self, rate):
  62.         for (raw, cooked) in self.frameratelist:
  63.             if rate == raw:
  64.                 self.params[1] = cooked
  65.                 self.inited_outrate = 1
  66.                 break
  67.         else:
  68.             raise error, 'bad output rate'
  69.  
  70.     def setsampwidth(self, width):
  71.         for (raw, cooked) in self.sampwidthlist:
  72.             if width == raw:
  73.                 self.config.setwidth(cooked)
  74.                 self.inited_width = 1
  75.                 break
  76.         else:
  77.             if width == 0:
  78.                 self.inited_width = 0
  79.                 self.config.setwidth(AL.SAMPLE_16)
  80.                 self.converter = self.ulaw2lin
  81.             else:
  82.                 raise error, 'bad sample width'
  83.  
  84.     def setnchannels(self, nchannels):
  85.         for (raw, cooked) in self.nchannelslist:
  86.             if nchannels == raw:
  87.                 self.config.setchannels(cooked)
  88.                 self.inited_nchannels = 1
  89.                 break
  90.         else:
  91.             raise error, 'bad # of channels'
  92.  
  93.     def writeframes(self, data):
  94.         if not (self.inited_outrate and self.inited_nchannels):
  95.             raise error, 'params not specified'
  96.         if not self.port:
  97.             import al
  98.             self.port = al.openport('Python', 'w', self.config)
  99.             self.oldparams = self.params[:]
  100.             al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
  101.             al.setparams(AL.DEFAULT_DEVICE, self.params)
  102.         if self.converter:
  103.             data = self.converter(data)
  104.         self.port.writesamps(data)
  105.  
  106.     def getfilled(self):
  107.         if self.port:
  108.             return self.port.getfilled()
  109.         else:
  110.             return 0
  111.  
  112.     def getfillable(self):
  113.         if self.port:
  114.             return self.port.getfillable()
  115.         else:
  116.             return self.config.getqueuesize()
  117.  
  118.     # private methods
  119.     access *: private
  120.  
  121.     def ulaw2lin(self, data):
  122.         import audioop
  123.         return audioop.ulaw2lin(data, 2)
  124.  
  125. class Play_Audio_sun:
  126.     access outrate, sampwidth, nchannels, inited_outrate, inited_width, \
  127.           inited_nchannels, converter: private
  128.  
  129.     def __init__(self):
  130.         self.outrate = 0
  131.         self.sampwidth = 0
  132.         self.nchannels = 0
  133.         self.inited_outrate = 0
  134.         self.inited_width = 0
  135.         self.inited_nchannels = 0
  136.         self.converter = None
  137.         self.port = None
  138.         return
  139.  
  140.     def __del__(self):
  141.         self.stop()
  142.  
  143.     def setoutrate(self, rate):
  144.         self.outrate = rate
  145.         self.inited_outrate = 1
  146.  
  147.     def setsampwidth(self, width):
  148.         self.sampwidth = width
  149.         self.inited_width = 1
  150.  
  151.     def setnchannels(self, nchannels):
  152.         self.nchannels = nchannels
  153.         self.inited_nchannels = 1
  154.  
  155.     def writeframes(self, data):
  156.         if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
  157.             raise error, 'params not specified'
  158.         if not self.port:
  159.             import sunaudiodev
  160.             self.port = sunaudiodev.open('w')
  161.             info = self.port.getinfo()
  162.             info.o_sample_rate = self.outrate
  163.             info.o_channels = self.nchannels
  164.             if self.sampwidth == 0:
  165.                 info.o_precision = 8
  166.                 self.o_encoding = ENCODING_ULAW
  167.             else:
  168.                 info.o_precision = 8 * self.sampwidth
  169.                 info.o_encoding = SUNAUDIODEV.ENCODING_LINEAR
  170.             self.port.setinfo(info)
  171.         if self.converter:
  172.             data = self.converter(data)
  173.         self.port.write(data)
  174.  
  175.     def wait(self):
  176.         if not self.port:
  177.             return
  178.         self.port.drain()
  179.         self.stop()
  180.  
  181.     def stop(self):
  182.         if self.port:
  183.             self.port.flush()
  184.             self.port.close()
  185.             self.port = None
  186.  
  187.     def getfilled(self):
  188.         if self.port:
  189.             return self.port.obufcount()
  190.         else:
  191.             return 0
  192.  
  193.     def getfillable(self):
  194.         return BUFFERSIZE - self.getfilled()
  195.  
  196. def AudioDev():
  197.     try:
  198.         import al
  199.         return Play_Audio_sgi()
  200.     except ImportError:
  201.         try:
  202.             import sunaudiodev
  203.             return Play_Audio_sun()
  204.         except ImportError:
  205.             raise error, 'no audio device'
  206.