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