test_linuxaudiodev.py 3.1 KB

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