ossaudiodev — Access to OSS-compatible audio devices¶
This module allows you to access the OSS (Open Sound System) audio interface.OSS is available for a wide range of open-source and commercial Unices, and isthe standard audio interface for Linux and recent versions of FreeBSD.
See also
- Open Sound System Programmer’s Guide
the official documentation for the OSS C API
The module defines a large number of constants supplied by the OSS devicedriver; see<sys/soundcard.h> on either Linux or FreeBSD for a listing.
ossaudiodev defines the following variables and functions:
- exception
ossaudiodev.OSSAudioError¶ This exception is raised on certain errors. The argument is a string describingwhat went wrong.
(If
ossaudiodevreceives an error from a system call such asopen(),write(), orioctl(), it raisesOSError.Errors detected directly byossaudiodevresult inOSSAudioError.)(For backwards compatibility, the exception class is also available as
ossaudiodev.error.)
ossaudiodev.open(mode)¶ossaudiodev.open(device,mode)Open an audio device and return an OSS audio device object. This objectsupports many file-like methods, such as
read(),write(), andfileno()(although there are subtle differences between conventional Unixread/write semantics and those of OSS audio devices). It also supports a numberof audio-specific methods; see below for the complete list of methods.device is the audio device filename to use. If it is not specified, thismodule first looks in the environment variable
AUDIODEVfor a deviceto use. If not found, it falls back to/dev/dsp.mode is one of
'r'for read-only (record) access,'w'forwrite-only (playback) access and'rw'for both. Since many sound cardsonly allow one process to have the recorder or player open at a time, it is agood idea to open the device only for the activity needed. Further, somesound cards are half-duplex: they can be opened for reading or writing, butnot both at once.Note the unusual calling syntax: thefirst argument is optional, and thesecond is required. This is a historical artifact for compatibility with theolder
linuxaudiodevmodule whichossaudiodevsupersedes.
ossaudiodev.openmixer([device])¶Open a mixer device and return an OSS mixer device object.device is themixer device filename to use. If it is not specified, this module first looksin the environment variable
MIXERDEVfor a device to use. If notfound, it falls back to/dev/mixer.
Audio Device Objects¶
Before you can write to or read from an audio device, you must call threemethods in the correct order:
setfmt()to set the output formatchannels()to set the number of channelsspeed()to set the sample rate
Alternately, you can use thesetparameters() method to set all three audioparameters at once. This is more convenient, but may not be as flexible in allcases.
The audio device objects returned byopen() define the following methodsand (read-only) attributes:
oss_audio_device.close()¶Explicitly close the audio device. When you are done writing to or reading froman audio device, you should explicitly close it. A closed device cannot be usedagain.
oss_audio_device.fileno()¶Return the file descriptor associated with the device.
oss_audio_device.read(size)¶Readsize bytes from the audio input and return them as a Python string.Unlike most Unix device drivers, OSS audio devices in blocking mode (thedefault) will block
read()until the entire requested amount of data isavailable.
oss_audio_device.write(data)¶Write abytes-like objectdata to the audio device and return thenumber of bytes written. If the audio device is in blocking mode (thedefault), the entire data is always written (again, this is different fromusual Unix device semantics). If the device is in non-blocking mode, somedata may not be written—see
writeall().Changed in version 3.5:Writablebytes-like object is now accepted.
oss_audio_device.writeall(data)¶Write abytes-like objectdata to the audio device: waits untilthe audio device is able to accept data, writes as much data as it willaccept, and repeats untildata has been completely written. If the deviceis in blocking mode (the default), this has the same effect as
write();writeall()is only useful in non-blocking mode. Hasno return value, since the amount of data written is always equal to theamount of data supplied.Changed in version 3.5:Writablebytes-like object is now accepted.
Changed in version 3.2:Audio device objects also support the context management protocol, i.e. they canbe used in awith statement.
The following methods each map to exactly oneioctl() system call. Thecorrespondence is obvious: for example,setfmt() corresponds to theSNDCTL_DSP_SETFMT ioctl, andsync() toSNDCTL_DSP_SYNC (this canbe useful when consulting the OSS documentation). If the underlyingioctl() fails, they all raiseOSError.
oss_audio_device.nonblock()¶Put the device into non-blocking mode. Once in non-blocking mode, there is noway to return it to blocking mode.
oss_audio_device.getfmts()¶Return a bitmask of the audio output formats supported by the soundcard. Someof the formats supported by OSS are:
Format
Description
AFMT_MU_LAWa logarithmic encoding (used by Sun
.aufiles and/dev/audio)AFMT_A_LAWa logarithmic encoding
AFMT_IMA_ADPCMa 4:1 compressed format defined by theInteractive Multimedia Association
AFMT_U8Unsigned, 8-bit audio
AFMT_S16_LESigned, 16-bit audio, little-endian byteorder (as used by Intel processors)
AFMT_S16_BESigned, 16-bit audio, big-endian byte order(as used by 68k, PowerPC, Sparc)
AFMT_S8Signed, 8 bit audio
AFMT_U16_LEUnsigned, 16-bit little-endian audio
AFMT_U16_BEUnsigned, 16-bit big-endian audio
Consult the OSS documentation for a full list of audio formats, and note thatmost devices support only a subset of these formats. Some older devices onlysupport
AFMT_U8; the most common format used today isAFMT_S16_LE.
oss_audio_device.setfmt(format)¶Try to set the current audio format toformat—see
getfmts()for alist. Returns the audio format that the device was set to, which may not be therequested format. May also be used to return the current audio format—do thisby passing an “audio format” ofAFMT_QUERY.
oss_audio_device.channels(nchannels)¶Set the number of output channels tonchannels. A value of 1 indicatesmonophonic sound, 2 stereophonic. Some devices may have more than 2 channels,and some high-end devices may not support mono. Returns the number of channelsthe device was set to.
oss_audio_device.speed(samplerate)¶Try to set the audio sampling rate tosamplerate samples per second. Returnsthe rate actually set. Most sound devices don’t support arbitrary samplingrates. Common rates are:
Rate
Description
8000
default rate for
/dev/audio11025
speech recording
22050
44100
CD quality audio (at 16 bits/sample and 2channels)
96000
DVD quality audio (at 24 bits/sample)
oss_audio_device.sync()¶Wait until the sound device has played every byte in its buffer. (This happensimplicitly when the device is closed.) The OSS documentation recommends closingand re-opening the device rather than using
sync().
oss_audio_device.reset()¶Immediately stop playing or recording and return the device to a state where itcan accept commands. The OSS documentation recommends closing and re-openingthe device after calling
reset().
oss_audio_device.post()¶Tell the driver that there is likely to be a pause in the output, making itpossible for the device to handle the pause more intelligently. You might usethis after playing a spot sound effect, before waiting for user input, or beforedoing disk I/O.
The following convenience methods combine several ioctls, or one ioctl and somesimple calculations.
oss_audio_device.setparameters(format,nchannels,samplerate[,strict=False])¶Set the key audio sampling parameters—sample format, number of channels, andsampling rate—in one method call.format,nchannels, andsamplerateshould be as specified in the
setfmt(),channels(), andspeed()methods. Ifstrict is true,setparameters()checks tosee if each parameter was actually set to the requested value, and raisesOSSAudioErrorif not. Returns a tuple (format,nchannels,samplerate) indicating the parameter values that were actually set by thedevice driver (i.e., the same as the return values ofsetfmt(),channels(), andspeed()).For example,
(fmt,channels,rate)=dsp.setparameters(fmt,channels,rate)
is equivalent to
fmt=dsp.setfmt(fmt)channels=dsp.channels(channels)rate=dsp.rate(rate)
oss_audio_device.bufsize()¶Returns the size of the hardware buffer, in samples.
oss_audio_device.obufcount()¶Returns the number of samples that are in the hardware buffer yet to be played.
oss_audio_device.obuffree()¶Returns the number of samples that could be queued into the hardware buffer tobe played without blocking.
Audio device objects also support several read-only attributes:
oss_audio_device.closed¶Boolean indicating whether the device has been closed.
oss_audio_device.name¶String containing the name of the device file.
oss_audio_device.mode¶The I/O mode for the file, either
"r","rw", or"w".
Mixer Device Objects¶
The mixer object provides two file-like methods:
oss_mixer_device.close()¶This method closes the open mixer device file. Any further attempts to use themixer after this file is closed will raise an
OSError.
oss_mixer_device.fileno()¶Returns the file handle number of the open mixer device file.
Changed in version 3.2:Mixer objects also support the context management protocol.
The remaining methods are specific to audio mixing:
oss_mixer_device.controls()¶This method returns a bitmask specifying the available mixer controls (“Control”being a specific mixable “channel”, such as
SOUND_MIXER_PCMorSOUND_MIXER_SYNTH). This bitmask indicates a subset of all availablemixer controls—theSOUND_MIXER_*constants defined at module level.To determine if, for example, the current mixer object supports a PCM mixer, usethe following Python code:mixer=ossaudiodev.openmixer()ifmixer.controls()&(1<<ossaudiodev.SOUND_MIXER_PCM):# PCM is supported...code...
For most purposes, the
SOUND_MIXER_VOLUME(master volume) andSOUND_MIXER_PCMcontrols should suffice—but code that uses the mixershould be flexible when it comes to choosing mixer controls. On the GravisUltrasound, for example,SOUND_MIXER_VOLUMEdoes not exist.
oss_mixer_device.stereocontrols()¶Returns a bitmask indicating stereo mixer controls. If a bit is set, thecorresponding control is stereo; if it is unset, the control is eithermonophonic or not supported by the mixer (use in combination with
controls()to determine which).See the code example for the
controls()function for an example of gettingdata from a bitmask.
oss_mixer_device.reccontrols()¶Returns a bitmask specifying the mixer controls that may be used to record. Seethe code example for
controls()for an example of reading from a bitmask.
oss_mixer_device.get(control)¶Returns the volume of a given mixer control. The returned volume is a 2-tuple
(left_volume,right_volume). Volumes are specified as numbers from 0(silent) to 100 (full volume). If the control is monophonic, a 2-tuple is stillreturned, but both volumes are the same.Raises
OSSAudioErrorif an invalid control is specified, orOSErrorif an unsupported control is specified.
oss_mixer_device.set(control,(left,right))¶Sets the volume for a given mixer control to
(left,right).leftandrightmust be ints and between 0 (silent) and 100 (full volume). Onsuccess, the new volume is returned as a 2-tuple. Note that this may not beexactly the same as the volume specified, because of the limited resolution ofsome soundcard’s mixers.Raises
OSSAudioErrorif an invalid mixer control was specified, or if thespecified volumes were out-of-range.
oss_mixer_device.get_recsrc()¶This method returns a bitmask indicating which control(s) are currently beingused as a recording source.
oss_mixer_device.set_recsrc(bitmask)¶Call this function to specify a recording source. Returns a bitmask indicatingthe new recording source (or sources) if successful; raises
OSErrorif aninvalid source was specified. To set the current recording source to themicrophone input:mixer.setrecsrc(1<<ossaudiodev.SOUND_MIXER_MIC)