Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 1 | :mod:`ossaudiodev` --- Access to OSS-compatible audio devices |
| 2 | ============================================================= |
| 3 | |
| 4 | .. module:: ossaudiodev |
| 5 | :platform: Linux, FreeBSD |
| 6 | :synopsis: Access to OSS-compatible audio devices. |
| 7 | |
| 8 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 9 | This module allows you to access the OSS (Open Sound System) audio interface. |
| 10 | OSS is available for a wide range of open-source and commercial Unices, and is |
| 11 | the standard audio interface for Linux and recent versions of FreeBSD. |
| 12 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 13 | .. Things will get more complicated for future Linux versions, since |
| 14 | ALSA is in the standard kernel as of 2.5.x. Presumably if you |
| 15 | use ALSA, you'll have to make sure its OSS compatibility layer |
| 16 | is active to use ossaudiodev, but you're gonna need it for the vast |
| 17 | majority of Linux audio apps anyways. |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 18 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 19 | Sounds like things are also complicated for other BSDs. In response |
| 20 | to my python-dev query, Thomas Wouters said: |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 21 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 22 | > Likewise, googling shows OpenBSD also uses OSS/Free -- the commercial |
| 23 | > OSS installation manual tells you to remove references to OSS/Free from the |
| 24 | > kernel :) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 25 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 26 | but Aleksander Piotrowsk actually has an OpenBSD box, and he quotes |
| 27 | from its <soundcard.h>: |
| 28 | > * WARNING! WARNING! |
| 29 | > * This is an OSS (Linux) audio emulator. |
| 30 | > * Use the Native NetBSD API for developing new code, and this |
| 31 | > * only for compiling Linux programs. |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 32 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 33 | There's also an ossaudio manpage on OpenBSD that explains things |
| 34 | further. Presumably NetBSD and OpenBSD have a different standard |
| 35 | audio interface. That's the great thing about standards, there are so |
| 36 | many to choose from ... ;-) |
Georg Brandl | 48310cd | 2009-01-03 21:18:54 +0000 | [diff] [blame] | 37 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 38 | This probably all warrants a footnote or two, but I don't understand |
| 39 | things well enough right now to write it! --GPW |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 40 | |
| 41 | |
| 42 | .. seealso:: |
| 43 | |
| 44 | `Open Sound System Programmer's Guide <http://www.opensound.com/pguide/oss.pdf>`_ |
| 45 | the official documentation for the OSS C API |
| 46 | |
| 47 | The module defines a large number of constants supplied by the OSS device |
| 48 | driver; see ``<sys/soundcard.h>`` on either Linux or FreeBSD for a listing . |
| 49 | |
| 50 | :mod:`ossaudiodev` defines the following variables and functions: |
| 51 | |
| 52 | |
| 53 | .. exception:: OSSAudioError |
| 54 | |
| 55 | This exception is raised on certain errors. The argument is a string describing |
| 56 | what went wrong. |
| 57 | |
| 58 | (If :mod:`ossaudiodev` receives an error from a system call such as |
| 59 | :cfunc:`open`, :cfunc:`write`, or :cfunc:`ioctl`, it raises :exc:`IOError`. |
| 60 | Errors detected directly by :mod:`ossaudiodev` result in :exc:`OSSAudioError`.) |
| 61 | |
| 62 | (For backwards compatibility, the exception class is also available as |
| 63 | ``ossaudiodev.error``.) |
| 64 | |
| 65 | |
| 66 | .. function:: open([device, ]mode) |
| 67 | |
| 68 | Open an audio device and return an OSS audio device object. This object |
| 69 | supports many file-like methods, such as :meth:`read`, :meth:`write`, and |
| 70 | :meth:`fileno` (although there are subtle differences between conventional Unix |
| 71 | read/write semantics and those of OSS audio devices). It also supports a number |
| 72 | of audio-specific methods; see below for the complete list of methods. |
| 73 | |
| 74 | *device* is the audio device filename to use. If it is not specified, this |
| 75 | module first looks in the environment variable :envvar:`AUDIODEV` for a device |
| 76 | to use. If not found, it falls back to :file:`/dev/dsp`. |
| 77 | |
| 78 | *mode* is one of ``'r'`` for read-only (record) access, ``'w'`` for |
| 79 | write-only (playback) access and ``'rw'`` for both. Since many sound cards |
| 80 | only allow one process to have the recorder or player open at a time, it is a |
| 81 | good idea to open the device only for the activity needed. Further, some |
| 82 | sound cards are half-duplex: they can be opened for reading or writing, but |
| 83 | not both at once. |
| 84 | |
| 85 | Note the unusual calling syntax: the *first* argument is optional, and the |
| 86 | second is required. This is a historical artifact for compatibility with the |
| 87 | older :mod:`linuxaudiodev` module which :mod:`ossaudiodev` supersedes. |
| 88 | |
Christian Heimes | 5b5e81c | 2007-12-31 16:14:33 +0000 | [diff] [blame] | 89 | .. XXX it might also be motivated |
| 90 | by my unfounded-but-still-possibly-true belief that the default |
| 91 | audio device varies unpredictably across operating systems. -GW |
| 92 | |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 93 | |
| 94 | .. function:: openmixer([device]) |
| 95 | |
| 96 | Open a mixer device and return an OSS mixer device object. *device* is the |
| 97 | mixer device filename to use. If it is not specified, this module first looks |
| 98 | in the environment variable :envvar:`MIXERDEV` for a device to use. If not |
| 99 | found, it falls back to :file:`/dev/mixer`. |
| 100 | |
| 101 | |
| 102 | .. _ossaudio-device-objects: |
| 103 | |
| 104 | Audio Device Objects |
| 105 | -------------------- |
| 106 | |
| 107 | Before you can write to or read from an audio device, you must call three |
| 108 | methods in the correct order: |
| 109 | |
| 110 | #. :meth:`setfmt` to set the output format |
| 111 | |
| 112 | #. :meth:`channels` to set the number of channels |
| 113 | |
| 114 | #. :meth:`speed` to set the sample rate |
| 115 | |
| 116 | Alternately, you can use the :meth:`setparameters` method to set all three audio |
| 117 | parameters at once. This is more convenient, but may not be as flexible in all |
| 118 | cases. |
| 119 | |
Georg Brandl | 502d9a5 | 2009-07-26 15:02:41 +0000 | [diff] [blame] | 120 | The audio device objects returned by :func:`.open` define the following methods |
Georg Brandl | 116aa62 | 2007-08-15 14:28:22 +0000 | [diff] [blame] | 121 | and (read-only) attributes: |
| 122 | |
| 123 | |
| 124 | .. method:: oss_audio_device.close() |
| 125 | |
| 126 | Explicitly close the audio device. When you are done writing to or reading from |
| 127 | an audio device, you should explicitly close it. A closed device cannot be used |
| 128 | again. |
| 129 | |
| 130 | |
| 131 | .. method:: oss_audio_device.fileno() |
| 132 | |
| 133 | Return the file descriptor associated with the device. |
| 134 | |
| 135 | |
| 136 | .. method:: oss_audio_device.read(size) |
| 137 | |
| 138 | Read *size* bytes from the audio input and return them as a Python string. |
| 139 | Unlike most Unix device drivers, OSS audio devices in blocking mode (the |
| 140 | default) will block :func:`read` until the entire requested amount of data is |
| 141 | available. |
| 142 | |
| 143 | |
| 144 | .. method:: oss_audio_device.write(data) |
| 145 | |
| 146 | Write the Python string *data* to the audio device and return the number of |
| 147 | bytes written. If the audio device is in blocking mode (the default), the |
| 148 | entire string is always written (again, this is different from usual Unix device |
| 149 | semantics). If the device is in non-blocking mode, some data may not be written |
| 150 | ---see :meth:`writeall`. |
| 151 | |
| 152 | |
| 153 | .. method:: oss_audio_device.writeall(data) |
| 154 | |
| 155 | Write the entire Python string *data* to the audio device: waits until the audio |
| 156 | device is able to accept data, writes as much data as it will accept, and |
| 157 | repeats until *data* has been completely written. If the device is in blocking |
| 158 | mode (the default), this has the same effect as :meth:`write`; :meth:`writeall` |
| 159 | is only useful in non-blocking mode. Has no return value, since the amount of |
| 160 | data written is always equal to the amount of data supplied. |
| 161 | |
| 162 | The following methods each map to exactly one :func:`ioctl` system call. The |
| 163 | correspondence is obvious: for example, :meth:`setfmt` corresponds to the |
| 164 | ``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can |
| 165 | be useful when consulting the OSS documentation). If the underlying |
| 166 | :func:`ioctl` fails, they all raise :exc:`IOError`. |
| 167 | |
| 168 | |
| 169 | .. method:: oss_audio_device.nonblock() |
| 170 | |
| 171 | Put the device into non-blocking mode. Once in non-blocking mode, there is no |
| 172 | way to return it to blocking mode. |
| 173 | |
| 174 | |
| 175 | .. method:: oss_audio_device.getfmts() |
| 176 | |
| 177 | Return a bitmask of the audio output formats supported by the soundcard. Some |
| 178 | of the formats supported by OSS are: |
| 179 | |
| 180 | +-------------------------+---------------------------------------------+ |
| 181 | | Format | Description | |
| 182 | +=========================+=============================================+ |
| 183 | | :const:`AFMT_MU_LAW` | a logarithmic encoding (used by Sun ``.au`` | |
| 184 | | | files and :file:`/dev/audio`) | |
| 185 | +-------------------------+---------------------------------------------+ |
| 186 | | :const:`AFMT_A_LAW` | a logarithmic encoding | |
| 187 | +-------------------------+---------------------------------------------+ |
| 188 | | :const:`AFMT_IMA_ADPCM` | a 4:1 compressed format defined by the | |
| 189 | | | Interactive Multimedia Association | |
| 190 | +-------------------------+---------------------------------------------+ |
| 191 | | :const:`AFMT_U8` | Unsigned, 8-bit audio | |
| 192 | +-------------------------+---------------------------------------------+ |
| 193 | | :const:`AFMT_S16_LE` | Signed, 16-bit audio, little-endian byte | |
| 194 | | | order (as used by Intel processors) | |
| 195 | +-------------------------+---------------------------------------------+ |
| 196 | | :const:`AFMT_S16_BE` | Signed, 16-bit audio, big-endian byte order | |
| 197 | | | (as used by 68k, PowerPC, Sparc) | |
| 198 | +-------------------------+---------------------------------------------+ |
| 199 | | :const:`AFMT_S8` | Signed, 8 bit audio | |
| 200 | +-------------------------+---------------------------------------------+ |
| 201 | | :const:`AFMT_U16_LE` | Unsigned, 16-bit little-endian audio | |
| 202 | +-------------------------+---------------------------------------------+ |
| 203 | | :const:`AFMT_U16_BE` | Unsigned, 16-bit big-endian audio | |
| 204 | +-------------------------+---------------------------------------------+ |
| 205 | |
| 206 | Consult the OSS documentation for a full list of audio formats, and note that |
| 207 | most devices support only a subset of these formats. Some older devices only |
| 208 | support :const:`AFMT_U8`; the most common format used today is |
| 209 | :const:`AFMT_S16_LE`. |
| 210 | |
| 211 | |
| 212 | .. method:: oss_audio_device.setfmt(format) |
| 213 | |
| 214 | Try to set the current audio format to *format*---see :meth:`getfmts` for a |
| 215 | list. Returns the audio format that the device was set to, which may not be the |
| 216 | requested format. May also be used to return the current audio format---do this |
| 217 | by passing an "audio format" of :const:`AFMT_QUERY`. |
| 218 | |
| 219 | |
| 220 | .. method:: oss_audio_device.channels(nchannels) |
| 221 | |
| 222 | Set the number of output channels to *nchannels*. A value of 1 indicates |
| 223 | monophonic sound, 2 stereophonic. Some devices may have more than 2 channels, |
| 224 | and some high-end devices may not support mono. Returns the number of channels |
| 225 | the device was set to. |
| 226 | |
| 227 | |
| 228 | .. method:: oss_audio_device.speed(samplerate) |
| 229 | |
| 230 | Try to set the audio sampling rate to *samplerate* samples per second. Returns |
| 231 | the rate actually set. Most sound devices don't support arbitrary sampling |
| 232 | rates. Common rates are: |
| 233 | |
| 234 | +-------+-------------------------------------------+ |
| 235 | | Rate | Description | |
| 236 | +=======+===========================================+ |
| 237 | | 8000 | default rate for :file:`/dev/audio` | |
| 238 | +-------+-------------------------------------------+ |
| 239 | | 11025 | speech recording | |
| 240 | +-------+-------------------------------------------+ |
| 241 | | 22050 | | |
| 242 | +-------+-------------------------------------------+ |
| 243 | | 44100 | CD quality audio (at 16 bits/sample and 2 | |
| 244 | | | channels) | |
| 245 | +-------+-------------------------------------------+ |
| 246 | | 96000 | DVD quality audio (at 24 bits/sample) | |
| 247 | +-------+-------------------------------------------+ |
| 248 | |
| 249 | |
| 250 | .. method:: oss_audio_device.sync() |
| 251 | |
| 252 | Wait until the sound device has played every byte in its buffer. (This happens |
| 253 | implicitly when the device is closed.) The OSS documentation recommends closing |
| 254 | and re-opening the device rather than using :meth:`sync`. |
| 255 | |
| 256 | |
| 257 | .. method:: oss_audio_device.reset() |
| 258 | |
| 259 | Immediately stop playing or recording and return the device to a state where it |
| 260 | can accept commands. The OSS documentation recommends closing and re-opening |
| 261 | the device after calling :meth:`reset`. |
| 262 | |
| 263 | |
| 264 | .. method:: oss_audio_device.post() |
| 265 | |
| 266 | Tell the driver that there is likely to be a pause in the output, making it |
| 267 | possible for the device to handle the pause more intelligently. You might use |
| 268 | this after playing a spot sound effect, before waiting for user input, or before |
| 269 | doing disk I/O. |
| 270 | |
| 271 | The following convenience methods combine several ioctls, or one ioctl and some |
| 272 | simple calculations. |
| 273 | |
| 274 | |
| 275 | .. method:: oss_audio_device.setparameters(format, nchannels, samplerate [, strict=False]) |
| 276 | |
| 277 | Set the key audio sampling parameters---sample format, number of channels, and |
| 278 | sampling rate---in one method call. *format*, *nchannels*, and *samplerate* |
| 279 | should be as specified in the :meth:`setfmt`, :meth:`channels`, and |
| 280 | :meth:`speed` methods. If *strict* is true, :meth:`setparameters` checks to |
| 281 | see if each parameter was actually set to the requested value, and raises |
| 282 | :exc:`OSSAudioError` if not. Returns a tuple (*format*, *nchannels*, |
| 283 | *samplerate*) indicating the parameter values that were actually set by the |
| 284 | device driver (i.e., the same as the return values of :meth:`setfmt`, |
| 285 | :meth:`channels`, and :meth:`speed`). |
| 286 | |
| 287 | For example, :: |
| 288 | |
| 289 | (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate) |
| 290 | |
| 291 | is equivalent to :: |
| 292 | |
| 293 | fmt = dsp.setfmt(fmt) |
| 294 | channels = dsp.channels(channels) |
| 295 | rate = dsp.rate(channels) |
| 296 | |
| 297 | |
| 298 | .. method:: oss_audio_device.bufsize() |
| 299 | |
| 300 | Returns the size of the hardware buffer, in samples. |
| 301 | |
| 302 | |
| 303 | .. method:: oss_audio_device.obufcount() |
| 304 | |
| 305 | Returns the number of samples that are in the hardware buffer yet to be played. |
| 306 | |
| 307 | |
| 308 | .. method:: oss_audio_device.obuffree() |
| 309 | |
| 310 | Returns the number of samples that could be queued into the hardware buffer to |
| 311 | be played without blocking. |
| 312 | |
| 313 | Audio device objects also support several read-only attributes: |
| 314 | |
| 315 | |
| 316 | .. attribute:: oss_audio_device.closed |
| 317 | |
| 318 | Boolean indicating whether the device has been closed. |
| 319 | |
| 320 | |
| 321 | .. attribute:: oss_audio_device.name |
| 322 | |
| 323 | String containing the name of the device file. |
| 324 | |
| 325 | |
| 326 | .. attribute:: oss_audio_device.mode |
| 327 | |
| 328 | The I/O mode for the file, either ``"r"``, ``"rw"``, or ``"w"``. |
| 329 | |
| 330 | |
| 331 | .. _mixer-device-objects: |
| 332 | |
| 333 | Mixer Device Objects |
| 334 | -------------------- |
| 335 | |
| 336 | The mixer object provides two file-like methods: |
| 337 | |
| 338 | |
| 339 | .. method:: oss_mixer_device.close() |
| 340 | |
| 341 | This method closes the open mixer device file. Any further attempts to use the |
| 342 | mixer after this file is closed will raise an :exc:`IOError`. |
| 343 | |
| 344 | |
| 345 | .. method:: oss_mixer_device.fileno() |
| 346 | |
| 347 | Returns the file handle number of the open mixer device file. |
| 348 | |
| 349 | The remaining methods are specific to audio mixing: |
| 350 | |
| 351 | |
| 352 | .. method:: oss_mixer_device.controls() |
| 353 | |
| 354 | This method returns a bitmask specifying the available mixer controls ("Control" |
| 355 | being a specific mixable "channel", such as :const:`SOUND_MIXER_PCM` or |
| 356 | :const:`SOUND_MIXER_SYNTH`). This bitmask indicates a subset of all available |
| 357 | mixer controls---the :const:`SOUND_MIXER_\*` constants defined at module level. |
| 358 | To determine if, for example, the current mixer object supports a PCM mixer, use |
| 359 | the following Python code:: |
| 360 | |
| 361 | mixer=ossaudiodev.openmixer() |
| 362 | if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): |
| 363 | # PCM is supported |
| 364 | ... code ... |
| 365 | |
| 366 | For most purposes, the :const:`SOUND_MIXER_VOLUME` (master volume) and |
| 367 | :const:`SOUND_MIXER_PCM` controls should suffice---but code that uses the mixer |
| 368 | should be flexible when it comes to choosing mixer controls. On the Gravis |
| 369 | Ultrasound, for example, :const:`SOUND_MIXER_VOLUME` does not exist. |
| 370 | |
| 371 | |
| 372 | .. method:: oss_mixer_device.stereocontrols() |
| 373 | |
| 374 | Returns a bitmask indicating stereo mixer controls. If a bit is set, the |
| 375 | corresponding control is stereo; if it is unset, the control is either |
| 376 | monophonic or not supported by the mixer (use in combination with |
| 377 | :meth:`controls` to determine which). |
| 378 | |
| 379 | See the code example for the :meth:`controls` function for an example of getting |
| 380 | data from a bitmask. |
| 381 | |
| 382 | |
| 383 | .. method:: oss_mixer_device.reccontrols() |
| 384 | |
| 385 | Returns a bitmask specifying the mixer controls that may be used to record. See |
| 386 | the code example for :meth:`controls` for an example of reading from a bitmask. |
| 387 | |
| 388 | |
| 389 | .. method:: oss_mixer_device.get(control) |
| 390 | |
| 391 | Returns the volume of a given mixer control. The returned volume is a 2-tuple |
| 392 | ``(left_volume,right_volume)``. Volumes are specified as numbers from 0 |
| 393 | (silent) to 100 (full volume). If the control is monophonic, a 2-tuple is still |
| 394 | returned, but both volumes are the same. |
| 395 | |
| 396 | Raises :exc:`OSSAudioError` if an invalid control was is specified, or |
| 397 | :exc:`IOError` if an unsupported control is specified. |
| 398 | |
| 399 | |
| 400 | .. method:: oss_mixer_device.set(control, (left, right)) |
| 401 | |
| 402 | Sets the volume for a given mixer control to ``(left,right)``. ``left`` and |
| 403 | ``right`` must be ints and between 0 (silent) and 100 (full volume). On |
| 404 | success, the new volume is returned as a 2-tuple. Note that this may not be |
| 405 | exactly the same as the volume specified, because of the limited resolution of |
| 406 | some soundcard's mixers. |
| 407 | |
| 408 | Raises :exc:`OSSAudioError` if an invalid mixer control was specified, or if the |
| 409 | specified volumes were out-of-range. |
| 410 | |
| 411 | |
| 412 | .. method:: oss_mixer_device.get_recsrc() |
| 413 | |
| 414 | This method returns a bitmask indicating which control(s) are currently being |
| 415 | used as a recording source. |
| 416 | |
| 417 | |
| 418 | .. method:: oss_mixer_device.set_recsrc(bitmask) |
| 419 | |
| 420 | Call this function to specify a recording source. Returns a bitmask indicating |
| 421 | the new recording source (or sources) if successful; raises :exc:`IOError` if an |
| 422 | invalid source was specified. To set the current recording source to the |
| 423 | microphone input:: |
| 424 | |
| 425 | mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC) |
| 426 | |