+++ /dev/null
-from test import test_support\r
-test_support.requires('audio')\r
-\r
-from test.test_support import findfile\r
-\r
-ossaudiodev = test_support.import_module('ossaudiodev')\r
-\r
-import errno\r
-import sys\r
-import sunau\r
-import time\r
-import audioop\r
-import unittest\r
-\r
-# Arggh, AFMT_S16_NE not defined on all platforms -- seems to be a\r
-# fairly recent addition to OSS.\r
-try:\r
- from ossaudiodev import AFMT_S16_NE\r
-except ImportError:\r
- if sys.byteorder == "little":\r
- AFMT_S16_NE = ossaudiodev.AFMT_S16_LE\r
- else:\r
- AFMT_S16_NE = ossaudiodev.AFMT_S16_BE\r
-\r
-\r
-def read_sound_file(path):\r
- with open(path, 'rb') as fp:\r
- au = sunau.open(fp)\r
- rate = au.getframerate()\r
- nchannels = au.getnchannels()\r
- encoding = au._encoding\r
- fp.seek(0)\r
- data = fp.read()\r
-\r
- if encoding != sunau.AUDIO_FILE_ENCODING_MULAW_8:\r
- raise RuntimeError("Expect .au file with 8-bit mu-law samples")\r
-\r
- # Convert the data to 16-bit signed.\r
- data = audioop.ulaw2lin(data, 2)\r
- return (data, rate, 16, nchannels)\r
-\r
-class OSSAudioDevTests(unittest.TestCase):\r
-\r
- def play_sound_file(self, data, rate, ssize, nchannels):\r
- try:\r
- dsp = ossaudiodev.open('w')\r
- except IOError, msg:\r
- if msg.args[0] in (errno.EACCES, errno.ENOENT,\r
- errno.ENODEV, errno.EBUSY):\r
- raise unittest.SkipTest(msg)\r
- raise\r
-\r
- # at least check that these methods can be invoked\r
- dsp.bufsize()\r
- dsp.obufcount()\r
- dsp.obuffree()\r
- dsp.getptr()\r
- dsp.fileno()\r
-\r
- # Make sure the read-only attributes work.\r
- self.assertFalse(dsp.closed)\r
- self.assertEqual(dsp.name, "/dev/dsp")\r
- self.assertEqual(dsp.mode, "w", "bad dsp.mode: %r" % dsp.mode)\r
-\r
- # And make sure they're really read-only.\r
- for attr in ('closed', 'name', 'mode'):\r
- try:\r
- setattr(dsp, attr, 42)\r
- except TypeError:\r
- pass\r
- else:\r
- self.fail("dsp.%s not read-only" % attr)\r
-\r
- # Compute expected running time of sound sample (in seconds).\r
- expected_time = float(len(data)) / (ssize//8) / nchannels / rate\r
-\r
- # set parameters based on .au file headers\r
- dsp.setparameters(AFMT_S16_NE, nchannels, rate)\r
- self.assertTrue(abs(expected_time - 3.51) < 1e-2, expected_time)\r
- t1 = time.time()\r
- dsp.write(data)\r
- dsp.close()\r
- t2 = time.time()\r
- elapsed_time = t2 - t1\r
-\r
- percent_diff = (abs(elapsed_time - expected_time) / expected_time) * 100\r
- self.assertTrue(percent_diff <= 10.0,\r
- "elapsed time > 10% off of expected time")\r
-\r
- def set_parameters(self, dsp):\r
- # Two configurations for testing:\r
- # config1 (8-bit, mono, 8 kHz) should work on even the most\r
- # ancient and crufty sound card, but maybe not on special-\r
- # purpose high-end hardware\r
- # config2 (16-bit, stereo, 44.1kHz) should work on all but the\r
- # most ancient and crufty hardware\r
- config1 = (ossaudiodev.AFMT_U8, 1, 8000)\r
- config2 = (AFMT_S16_NE, 2, 44100)\r
-\r
- for config in [config1, config2]:\r
- (fmt, channels, rate) = config\r
- if (dsp.setfmt(fmt) == fmt and\r
- dsp.channels(channels) == channels and\r
- dsp.speed(rate) == rate):\r
- break\r
- else:\r
- raise RuntimeError("unable to set audio sampling parameters: "\r
- "you must have really weird audio hardware")\r
-\r
- # setparameters() should be able to set this configuration in\r
- # either strict or non-strict mode.\r
- result = dsp.setparameters(fmt, channels, rate, False)\r
- self.assertEqual(result, (fmt, channels, rate),\r
- "setparameters%r: returned %r" % (config, result))\r
-\r
- result = dsp.setparameters(fmt, channels, rate, True)\r
- self.assertEqual(result, (fmt, channels, rate),\r
- "setparameters%r: returned %r" % (config, result))\r
-\r
- def set_bad_parameters(self, dsp):\r
- # Now try some configurations that are presumably bogus: eg. 300\r
- # channels currently exceeds even Hollywood's ambitions, and\r
- # negative sampling rate is utter nonsense. setparameters() should\r
- # accept these in non-strict mode, returning something other than\r
- # was requested, but should barf in strict mode.\r
- fmt = AFMT_S16_NE\r
- rate = 44100\r
- channels = 2\r
- for config in [(fmt, 300, rate), # ridiculous nchannels\r
- (fmt, -5, rate), # impossible nchannels\r
- (fmt, channels, -50), # impossible rate\r
- ]:\r
- (fmt, channels, rate) = config\r
- result = dsp.setparameters(fmt, channels, rate, False)\r
- self.assertNotEqual(result, config,\r
- "unexpectedly got requested configuration")\r
-\r
- try:\r
- result = dsp.setparameters(fmt, channels, rate, True)\r
- except ossaudiodev.OSSAudioError, err:\r
- pass\r
- else:\r
- self.fail("expected OSSAudioError")\r
-\r
- def test_playback(self):\r
- sound_info = read_sound_file(findfile('audiotest.au'))\r
- self.play_sound_file(*sound_info)\r
-\r
- def test_set_parameters(self):\r
- dsp = ossaudiodev.open("w")\r
- try:\r
- self.set_parameters(dsp)\r
-\r
- # Disabled because it fails under Linux 2.6 with ALSA's OSS\r
- # emulation layer.\r
- #self.set_bad_parameters(dsp)\r
- finally:\r
- dsp.close()\r
- self.assertTrue(dsp.closed)\r
-\r
-\r
-def test_main():\r
- try:\r
- dsp = ossaudiodev.open('w')\r
- except (ossaudiodev.error, IOError), msg:\r
- if msg.args[0] in (errno.EACCES, errno.ENOENT,\r
- errno.ENODEV, errno.EBUSY):\r
- raise unittest.SkipTest(msg)\r
- raise\r
- dsp.close()\r
- test_support.run_unittest(__name__)\r
-\r
-if __name__ == "__main__":\r
- test_main()\r