1ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test import test_support 2ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehtest_support.requires('audio') 3ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 4ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehfrom test.test_support import findfile, run_unittest 5ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 6ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport errno 7ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport sys 8ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport audioop 9ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehimport unittest 10ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 11ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehlinuxaudiodev = test_support.import_module('linuxaudiodev', deprecated=True) 12ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehsunaudio = test_support.import_module('sunaudio', deprecated=True) 13ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 14ffab958fd8d42ed7227d83007350e61555a1fa36Andrew HsiehSND_FORMAT_MULAW_8 = 1 15ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 16ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehclass LinuxAudioDevTests(unittest.TestCase): 17ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 18ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def setUp(self): 19ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev = linuxaudiodev.open('w') 20ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 21ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def tearDown(self): 22ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.close() 23ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 24ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_methods(self): 25ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # at least check that these methods can be invoked 26ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.bufsize() 27ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.obufcount() 28ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.obuffree() 29ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.getptr() 30ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.fileno() 31ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 32ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_play_sound_file(self): 33ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh path = findfile("audiotest.au") 34ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp = open(path, 'r') 35ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size, enc, rate, nchannels, extra = sunaudio.gethdr(fp) 36ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = fp.read() 37ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fp.close() 38ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 39ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if enc != SND_FORMAT_MULAW_8: 40ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.fail("Expect .au file with 8-bit mu-law samples") 41ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 42ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # convert the data to 16-bit signed 43ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh data = audioop.ulaw2lin(data, 2) 44ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 45ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # set the data format 46ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if sys.byteorder == 'little': 47ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fmt = linuxaudiodev.AFMT_S16_LE 48ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh else: 49ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fmt = linuxaudiodev.AFMT_S16_BE 50ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 51ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh # set parameters based on .au file headers 52ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, 16, nchannels, fmt) 53ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.write(data) 54ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.flush() 55ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 56ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh def test_errors(self): 57ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh size = 8 58ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh fmt = linuxaudiodev.AFMT_U8 59ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh rate = 8000 60ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh nchannels = 1 61ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 62ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(-1, size, nchannels, fmt) 63ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 64ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "expected rate >= 0, not -1") 65ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 66ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, -2, nchannels, fmt) 67ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 68ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "expected sample size >= 0, not -2") 69ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 70ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, size, 3, fmt) 71ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 72ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "nchannels must be 1 or 2, not 3") 73ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 74ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, size, nchannels, 177) 75ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 76ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "unknown audio encoding: 177") 77ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 78ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, size, nchannels, linuxaudiodev.AFMT_U16_LE) 79ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 80ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "for linear unsigned 16-bit little-endian " 81ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "audio, expected sample size 16, not 8") 82ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 83ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.dev.setparameters(rate, 16, nchannels, fmt) 84ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except ValueError, err: 85ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh self.assertEqual(err.args[0], "for linear unsigned 8-bit audio, expected " 86ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh "sample size 8, not 16") 87ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 88ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehdef test_main(): 89ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh try: 90ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dsp = linuxaudiodev.open('w') 91ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh except linuxaudiodev.error, msg: 92ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh if msg.args[0] in (errno.EACCES, errno.ENOENT, errno.ENODEV, errno.EBUSY): 93ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise unittest.SkipTest(msg) 94ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh raise 95ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh dsp.close() 96ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh run_unittest(LinuxAudioDevTests) 97ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh 98ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsiehif __name__ == '__main__': 99ffab958fd8d42ed7227d83007350e61555a1fa36Andrew Hsieh test_main() 100