from test
import test_support
test_support
.requires('audio')
from test
.test_support
import verbose
, findfile
, TestFailed
, TestSkipped
# Arggh, AFMT_S16_NE not defined on all platforms -- seems to be a
# fairly recent addition to OSS.
from ossaudiodev
import AFMT_S16_NE
if sys
.byteorder
== "little":
AFMT_S16_NE
= ossaudiodev
.AFMT_S16_LE
AFMT_S16_NE
= ossaudiodev
.AFMT_S16_BE
def read_sound_file(path
):
size
, enc
, rate
, nchannels
, extra
= sunaudio
.gethdr(fp
)
if enc
!= SND_FORMAT_MULAW_8
:
print "Expect .au file with 8-bit mu-law samples"
# Convert the data to 16-bit signed.
data
= audioop
.ulaw2lin(data
, 2)
return (data
, rate
, 16, nchannels
)
def play_sound_file(data
, rate
, ssize
, nchannels
):
dsp
= ossaudiodev
.open('w')
if msg
[0] in (errno
.EACCES
, errno
.ENODEV
, errno
.EBUSY
):
# at least check that these methods can be invoked
# set parameters based on .au file headers
dsp
.setparameters(AFMT_S16_NE
, nchannels
, rate
)
print "playing test sound file..."
print "elapsed time: %.1f sec" % (t2
-t1
)
def test_setparameters(dsp
):
# Two configurations for testing:
# config1 (8-bit, mono, 8 kHz) should work on even the most
# ancient and crufty sound card, but maybe not on special-
# purpose high-end hardware
# config2 (16-bit, stereo, 44.1kHz) should work on all but the
# most ancient and crufty hardware
config1
= (ossaudiodev
.AFMT_U8
, 1, 8000)
config2
= (AFMT_S16_NE
, 2, 44100)
for config
in [config1
, config2
]:
(fmt
, channels
, rate
) = config
if (dsp
.setfmt(fmt
) == fmt
and
dsp
.channels(channels
) == channels
and
dsp
.speed(rate
) == rate
):
raise RuntimeError("unable to set audio sampling parameters: "
"you must have really weird audio hardware")
# setparameters() should be able to set this configuration in
# either strict or non-strict mode.
result
= dsp
.setparameters(fmt
, channels
, rate
, False)
assert result
== (fmt
, channels
, rate
), \
"setparameters%r: returned %r" % (config
+ result
)
result
= dsp
.setparameters(fmt
, channels
, rate
, True)
assert result
== (fmt
, channels
, rate
), \
"setparameters%r: returned %r" % (config
+ result
)
def test_bad_setparameters(dsp
):
# Now try some configurations that are presumably bogus: eg. 300
# channels currently exceeds even Hollywood's ambitions, and
# negative sampling rate is utter nonsense. setparameters() should
# accept these in non-strict mode, returning something other than
# was requested, but should barf in strict mode.
for config
in [(fmt
, 300, rate
), # ridiculous nchannels
(fmt
, -5, rate
), # impossible nchannels
(fmt
, channels
, -50), # impossible rate
(fmt
, channels
, rate
) = config
result
= dsp
.setparameters(fmt
, channels
, rate
, False)
assert result
!= config
, \
"setparameters: unexpectedly got requested configuration"
result
= dsp
.setparameters(fmt
, channels
, rate
, True)
raise AssertionError("setparameters: expected OSSAudioError")
except ossaudiodev
.OSSAudioError
, err
:
print "setparameters: got OSSAudioError as expected"
(data
, rate
, ssize
, nchannels
) = read_sound_file(findfile('audiotest.au'))
play_sound_file(data
, rate
, ssize
, nchannels
)
dsp
= ossaudiodev
.open("w")
# Disabled because it fails under Linux 2.6 with ALSA's OSS
#test_bad_setparameters(dsp)