17db96d56Sopenharmony_ci:mod:`ossaudiodev` --- Access to OSS-compatible audio devices
27db96d56Sopenharmony_ci=============================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: ossaudiodev
57db96d56Sopenharmony_ci   :platform: Linux, FreeBSD
67db96d56Sopenharmony_ci   :synopsis: Access to OSS-compatible audio devices.
77db96d56Sopenharmony_ci   :deprecated:
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci.. deprecated-removed:: 3.11 3.13
107db96d56Sopenharmony_ci   The :mod:`ossaudiodev` module is deprecated
117db96d56Sopenharmony_ci   (see :pep:`PEP 594 <594#ossaudiodev>` for details).
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci--------------
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciThis module allows you to access the OSS (Open Sound System) audio interface.
167db96d56Sopenharmony_ciOSS is available for a wide range of open-source and commercial Unices, and is
177db96d56Sopenharmony_cithe standard audio interface for Linux and recent versions of FreeBSD.
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ci.. Things will get more complicated for future Linux versions, since
207db96d56Sopenharmony_ci   ALSA is in the standard kernel as of 2.5.x.  Presumably if you
217db96d56Sopenharmony_ci   use ALSA, you'll have to make sure its OSS compatibility layer
227db96d56Sopenharmony_ci   is active to use ossaudiodev, but you're going to need it for the vast
237db96d56Sopenharmony_ci   majority of Linux audio apps anyway.
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci   Sounds like things are also complicated for other BSDs.  In response
267db96d56Sopenharmony_ci   to my python-dev query, Thomas Wouters said:
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci   > Likewise, googling shows OpenBSD also uses OSS/Free -- the commercial
297db96d56Sopenharmony_ci   > OSS installation manual tells you to remove references to OSS/Free from the
307db96d56Sopenharmony_ci   > kernel :)
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci   but Aleksander Piotrowsk actually has an OpenBSD box, and he quotes
337db96d56Sopenharmony_ci   from its <soundcard.h>:
347db96d56Sopenharmony_ci   >  * WARNING!  WARNING!
357db96d56Sopenharmony_ci   >  * This is an OSS (Linux) audio emulator.
367db96d56Sopenharmony_ci   >  * Use the Native NetBSD API for developing new code, and this
377db96d56Sopenharmony_ci   >  * only for compiling Linux programs.
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci   There's also an ossaudio manpage on OpenBSD that explains things
407db96d56Sopenharmony_ci   further.  Presumably NetBSD and OpenBSD have a different standard
417db96d56Sopenharmony_ci   audio interface.  That's the great thing about standards, there are so
427db96d56Sopenharmony_ci   many to choose from ... ;-)
437db96d56Sopenharmony_ci
447db96d56Sopenharmony_ci   This probably all warrants a footnote or two, but I don't understand
457db96d56Sopenharmony_ci   things well enough right now to write it!   --GPW
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ci.. versionchanged:: 3.3
487db96d56Sopenharmony_ci   Operations in this module now raise :exc:`OSError` where :exc:`IOError`
497db96d56Sopenharmony_ci   was raised.
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci.. seealso::
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci   `Open Sound System Programmer's Guide <http://www.opensound.com/pguide/oss.pdf>`_
557db96d56Sopenharmony_ci      the official documentation for the OSS C API
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci   The module defines a large number of constants supplied by the OSS device
587db96d56Sopenharmony_ci   driver; see ``<sys/soundcard.h>`` on either Linux or FreeBSD for a listing.
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci:mod:`ossaudiodev` defines the following variables and functions:
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. exception:: OSSAudioError
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   This exception is raised on certain errors.  The argument is a string describing
667db96d56Sopenharmony_ci   what went wrong.
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ci   (If :mod:`ossaudiodev` receives an error from a system call such as
697db96d56Sopenharmony_ci   :c:func:`open`, :c:func:`write`, or :c:func:`ioctl`, it raises :exc:`OSError`.
707db96d56Sopenharmony_ci   Errors detected directly by :mod:`ossaudiodev` result in :exc:`OSSAudioError`.)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci   (For backwards compatibility, the exception class is also available as
737db96d56Sopenharmony_ci   ``ossaudiodev.error``.)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci.. function:: open(mode)
777db96d56Sopenharmony_ci              open(device, mode)
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   Open an audio device and return an OSS audio device object.  This object
807db96d56Sopenharmony_ci   supports many file-like methods, such as :meth:`read`, :meth:`write`, and
817db96d56Sopenharmony_ci   :meth:`fileno` (although there are subtle differences between conventional Unix
827db96d56Sopenharmony_ci   read/write semantics and those of OSS audio devices).  It also supports a number
837db96d56Sopenharmony_ci   of audio-specific methods; see below for the complete list of methods.
847db96d56Sopenharmony_ci
857db96d56Sopenharmony_ci   *device* is the audio device filename to use.  If it is not specified, this
867db96d56Sopenharmony_ci   module first looks in the environment variable :envvar:`AUDIODEV` for a device
877db96d56Sopenharmony_ci   to use.  If not found, it falls back to :file:`/dev/dsp`.
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   *mode* is one of ``'r'`` for read-only (record) access, ``'w'`` for
907db96d56Sopenharmony_ci   write-only (playback) access and ``'rw'`` for both. Since many sound cards
917db96d56Sopenharmony_ci   only allow one process to have the recorder or player open at a time, it is a
927db96d56Sopenharmony_ci   good idea to open the device only for the activity needed.  Further, some
937db96d56Sopenharmony_ci   sound cards are half-duplex: they can be opened for reading or writing, but
947db96d56Sopenharmony_ci   not both at once.
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci   Note the unusual calling syntax: the *first* argument is optional, and the
977db96d56Sopenharmony_ci   second is required.  This is a historical artifact for compatibility with the
987db96d56Sopenharmony_ci   older :mod:`linuxaudiodev` module which :mod:`ossaudiodev` supersedes.
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci   .. XXX it might also be motivated
1017db96d56Sopenharmony_ci      by my unfounded-but-still-possibly-true belief that the default
1027db96d56Sopenharmony_ci      audio device varies unpredictably across operating systems.  -GW
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci.. function:: openmixer([device])
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci   Open a mixer device and return an OSS mixer device object.   *device* is the
1087db96d56Sopenharmony_ci   mixer device filename to use.  If it is not specified, this module first looks
1097db96d56Sopenharmony_ci   in the environment variable :envvar:`MIXERDEV` for a device to use.  If not
1107db96d56Sopenharmony_ci   found, it falls back to :file:`/dev/mixer`.
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ci.. _ossaudio-device-objects:
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ciAudio Device Objects
1167db96d56Sopenharmony_ci--------------------
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ciBefore you can write to or read from an audio device, you must call three
1197db96d56Sopenharmony_cimethods in the correct order:
1207db96d56Sopenharmony_ci
1217db96d56Sopenharmony_ci#. :meth:`setfmt` to set the output format
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci#. :meth:`channels` to set the number of channels
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci#. :meth:`speed` to set the sample rate
1267db96d56Sopenharmony_ci
1277db96d56Sopenharmony_ciAlternately, you can use the :meth:`setparameters` method to set all three audio
1287db96d56Sopenharmony_ciparameters at once.  This is more convenient, but may not be as flexible in all
1297db96d56Sopenharmony_cicases.
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ciThe audio device objects returned by :func:`.open` define the following methods
1327db96d56Sopenharmony_ciand (read-only) attributes:
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci.. method:: oss_audio_device.close()
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ci   Explicitly close the audio device.  When you are done writing to or reading from
1387db96d56Sopenharmony_ci   an audio device, you should explicitly close it.  A closed device cannot be used
1397db96d56Sopenharmony_ci   again.
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci
1427db96d56Sopenharmony_ci.. method:: oss_audio_device.fileno()
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci   Return the file descriptor associated with the device.
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci.. method:: oss_audio_device.read(size)
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci   Read *size* bytes from the audio input and return them as a Python string.
1507db96d56Sopenharmony_ci   Unlike most Unix device drivers, OSS audio devices in blocking mode (the
1517db96d56Sopenharmony_ci   default) will block :func:`read` until the entire requested amount of data is
1527db96d56Sopenharmony_ci   available.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci.. method:: oss_audio_device.write(data)
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci   Write a :term:`bytes-like object` *data* to the audio device and return the
1587db96d56Sopenharmony_ci   number of bytes written.  If the audio device is in blocking mode (the
1597db96d56Sopenharmony_ci   default), the entire data is always written (again, this is different from
1607db96d56Sopenharmony_ci   usual Unix device semantics).  If the device is in non-blocking mode, some
1617db96d56Sopenharmony_ci   data may not be written---see :meth:`writeall`.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1647db96d56Sopenharmony_ci      Writable :term:`bytes-like object` is now accepted.
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci.. method:: oss_audio_device.writeall(data)
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci   Write a :term:`bytes-like object` *data* to the audio device: waits until
1707db96d56Sopenharmony_ci   the audio device is able to accept data, writes as much data as it will
1717db96d56Sopenharmony_ci   accept, and repeats until *data* has been completely written. If the device
1727db96d56Sopenharmony_ci   is in blocking mode (the default), this has the same effect as
1737db96d56Sopenharmony_ci   :meth:`write`; :meth:`writeall` is only useful in non-blocking mode.  Has
1747db96d56Sopenharmony_ci   no return value, since the amount of data written is always equal to the
1757db96d56Sopenharmony_ci   amount of data supplied.
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci   .. versionchanged:: 3.5
1787db96d56Sopenharmony_ci      Writable :term:`bytes-like object` is now accepted.
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci.. versionchanged:: 3.2
1827db96d56Sopenharmony_ci   Audio device objects also support the context management protocol, i.e. they can
1837db96d56Sopenharmony_ci   be used in a :keyword:`with` statement.
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ciThe following methods each map to exactly one :c:func:`ioctl` system call.  The
1877db96d56Sopenharmony_cicorrespondence is obvious: for example, :meth:`setfmt` corresponds to the
1887db96d56Sopenharmony_ci``SNDCTL_DSP_SETFMT`` ioctl, and :meth:`sync` to ``SNDCTL_DSP_SYNC`` (this can
1897db96d56Sopenharmony_cibe useful when consulting the OSS documentation).  If the underlying
1907db96d56Sopenharmony_ci:c:func:`ioctl` fails, they all raise :exc:`OSError`.
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci.. method:: oss_audio_device.nonblock()
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci   Put the device into non-blocking mode.  Once in non-blocking mode, there is no
1967db96d56Sopenharmony_ci   way to return it to blocking mode.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci.. method:: oss_audio_device.getfmts()
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci   Return a bitmask of the audio output formats supported by the soundcard.  Some
2027db96d56Sopenharmony_ci   of the formats supported by OSS are:
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2057db96d56Sopenharmony_ci   | Format                  | Description                                 |
2067db96d56Sopenharmony_ci   +=========================+=============================================+
2077db96d56Sopenharmony_ci   | :const:`AFMT_MU_LAW`    | a logarithmic encoding (used by Sun ``.au`` |
2087db96d56Sopenharmony_ci   |                         | files and :file:`/dev/audio`)               |
2097db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2107db96d56Sopenharmony_ci   | :const:`AFMT_A_LAW`     | a logarithmic encoding                      |
2117db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2127db96d56Sopenharmony_ci   | :const:`AFMT_IMA_ADPCM` | a 4:1 compressed format defined by the      |
2137db96d56Sopenharmony_ci   |                         | Interactive Multimedia Association          |
2147db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2157db96d56Sopenharmony_ci   | :const:`AFMT_U8`        | Unsigned, 8-bit audio                       |
2167db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2177db96d56Sopenharmony_ci   | :const:`AFMT_S16_LE`    | Signed, 16-bit audio, little-endian byte    |
2187db96d56Sopenharmony_ci   |                         | order (as used by Intel processors)         |
2197db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2207db96d56Sopenharmony_ci   | :const:`AFMT_S16_BE`    | Signed, 16-bit audio, big-endian byte order |
2217db96d56Sopenharmony_ci   |                         | (as used by 68k, PowerPC, Sparc)            |
2227db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2237db96d56Sopenharmony_ci   | :const:`AFMT_S8`        | Signed, 8 bit audio                         |
2247db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2257db96d56Sopenharmony_ci   | :const:`AFMT_U16_LE`    | Unsigned, 16-bit little-endian audio        |
2267db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2277db96d56Sopenharmony_ci   | :const:`AFMT_U16_BE`    | Unsigned, 16-bit big-endian audio           |
2287db96d56Sopenharmony_ci   +-------------------------+---------------------------------------------+
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   Consult the OSS documentation for a full list of audio formats, and note that
2317db96d56Sopenharmony_ci   most devices support only a subset of these formats.  Some older devices only
2327db96d56Sopenharmony_ci   support :const:`AFMT_U8`; the most common format used today is
2337db96d56Sopenharmony_ci   :const:`AFMT_S16_LE`.
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci.. method:: oss_audio_device.setfmt(format)
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci   Try to set the current audio format to *format*---see :meth:`getfmts` for a
2397db96d56Sopenharmony_ci   list.  Returns the audio format that the device was set to, which may not be the
2407db96d56Sopenharmony_ci   requested format.  May also be used to return the current audio format---do this
2417db96d56Sopenharmony_ci   by passing an "audio format" of :const:`AFMT_QUERY`.
2427db96d56Sopenharmony_ci
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci.. method:: oss_audio_device.channels(nchannels)
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   Set the number of output channels to *nchannels*.  A value of 1 indicates
2477db96d56Sopenharmony_ci   monophonic sound, 2 stereophonic.  Some devices may have more than 2 channels,
2487db96d56Sopenharmony_ci   and some high-end devices may not support mono. Returns the number of channels
2497db96d56Sopenharmony_ci   the device was set to.
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci.. method:: oss_audio_device.speed(samplerate)
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   Try to set the audio sampling rate to *samplerate* samples per second.  Returns
2557db96d56Sopenharmony_ci   the rate actually set.  Most sound devices don't support arbitrary sampling
2567db96d56Sopenharmony_ci   rates.  Common rates are:
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2597db96d56Sopenharmony_ci   | Rate  | Description                               |
2607db96d56Sopenharmony_ci   +=======+===========================================+
2617db96d56Sopenharmony_ci   | 8000  | default rate for :file:`/dev/audio`       |
2627db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2637db96d56Sopenharmony_ci   | 11025 | speech recording                          |
2647db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2657db96d56Sopenharmony_ci   | 22050 |                                           |
2667db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2677db96d56Sopenharmony_ci   | 44100 | CD quality audio (at 16 bits/sample and 2 |
2687db96d56Sopenharmony_ci   |       | channels)                                 |
2697db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2707db96d56Sopenharmony_ci   | 96000 | DVD quality audio (at 24 bits/sample)     |
2717db96d56Sopenharmony_ci   +-------+-------------------------------------------+
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci.. method:: oss_audio_device.sync()
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci   Wait until the sound device has played every byte in its buffer.  (This happens
2777db96d56Sopenharmony_ci   implicitly when the device is closed.)  The OSS documentation recommends closing
2787db96d56Sopenharmony_ci   and re-opening the device rather than using :meth:`sync`.
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci.. method:: oss_audio_device.reset()
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   Immediately stop playing or recording and return the device to a state where it
2847db96d56Sopenharmony_ci   can accept commands.  The OSS documentation recommends closing and re-opening
2857db96d56Sopenharmony_ci   the device after calling :meth:`reset`.
2867db96d56Sopenharmony_ci
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci.. method:: oss_audio_device.post()
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   Tell the driver that there is likely to be a pause in the output, making it
2917db96d56Sopenharmony_ci   possible for the device to handle the pause more intelligently.  You might use
2927db96d56Sopenharmony_ci   this after playing a spot sound effect, before waiting for user input, or before
2937db96d56Sopenharmony_ci   doing disk I/O.
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ciThe following convenience methods combine several ioctls, or one ioctl and some
2967db96d56Sopenharmony_cisimple calculations.
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci.. method:: oss_audio_device.setparameters(format, nchannels, samplerate[, strict=False])
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   Set the key audio sampling parameters---sample format, number of channels, and
3027db96d56Sopenharmony_ci   sampling rate---in one method call.  *format*,  *nchannels*, and *samplerate*
3037db96d56Sopenharmony_ci   should be as specified in the :meth:`setfmt`, :meth:`channels`, and
3047db96d56Sopenharmony_ci   :meth:`speed`  methods.  If *strict* is true, :meth:`setparameters` checks to
3057db96d56Sopenharmony_ci   see if each parameter was actually set to the requested value, and raises
3067db96d56Sopenharmony_ci   :exc:`OSSAudioError` if not.  Returns a tuple (*format*, *nchannels*,
3077db96d56Sopenharmony_ci   *samplerate*) indicating the parameter values that were actually set by the
3087db96d56Sopenharmony_ci   device driver (i.e., the same as the return values of :meth:`setfmt`,
3097db96d56Sopenharmony_ci   :meth:`channels`, and :meth:`speed`).
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci   For example,  ::
3127db96d56Sopenharmony_ci
3137db96d56Sopenharmony_ci      (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate)
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ci   is equivalent to  ::
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci      fmt = dsp.setfmt(fmt)
3187db96d56Sopenharmony_ci      channels = dsp.channels(channels)
3197db96d56Sopenharmony_ci      rate = dsp.rate(rate)
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ci.. method:: oss_audio_device.bufsize()
3237db96d56Sopenharmony_ci
3247db96d56Sopenharmony_ci   Returns the size of the hardware buffer, in samples.
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci.. method:: oss_audio_device.obufcount()
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci   Returns the number of samples that are in the hardware buffer yet to be played.
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci.. method:: oss_audio_device.obuffree()
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci   Returns the number of samples that could be queued into the hardware buffer to
3357db96d56Sopenharmony_ci   be played without blocking.
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ciAudio device objects also support several read-only attributes:
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci.. attribute:: oss_audio_device.closed
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci   Boolean indicating whether the device has been closed.
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci.. attribute:: oss_audio_device.name
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci   String containing the name of the device file.
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci.. attribute:: oss_audio_device.mode
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   The I/O mode for the file, either ``"r"``, ``"rw"``, or ``"w"``.
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci.. _mixer-device-objects:
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ciMixer Device Objects
3587db96d56Sopenharmony_ci--------------------
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ciThe mixer object provides two file-like methods:
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci.. method:: oss_mixer_device.close()
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci   This method closes the open mixer device file.  Any further attempts to use the
3667db96d56Sopenharmony_ci   mixer after this file is closed will raise an :exc:`OSError`.
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci.. method:: oss_mixer_device.fileno()
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci   Returns the file handle number of the open mixer device file.
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci.. versionchanged:: 3.2
3747db96d56Sopenharmony_ci   Mixer objects also support the context management protocol.
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ciThe remaining methods are specific to audio mixing:
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci.. method:: oss_mixer_device.controls()
3817db96d56Sopenharmony_ci
3827db96d56Sopenharmony_ci   This method returns a bitmask specifying the available mixer controls ("Control"
3837db96d56Sopenharmony_ci   being a specific mixable "channel", such as :const:`SOUND_MIXER_PCM` or
3847db96d56Sopenharmony_ci   :const:`SOUND_MIXER_SYNTH`).  This bitmask indicates a subset of all available
3857db96d56Sopenharmony_ci   mixer controls---the :const:`SOUND_MIXER_\*` constants defined at module level.
3867db96d56Sopenharmony_ci   To determine if, for example, the current mixer object supports a PCM mixer, use
3877db96d56Sopenharmony_ci   the following Python code::
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci      mixer=ossaudiodev.openmixer()
3907db96d56Sopenharmony_ci      if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM):
3917db96d56Sopenharmony_ci          # PCM is supported
3927db96d56Sopenharmony_ci          ... code ...
3937db96d56Sopenharmony_ci
3947db96d56Sopenharmony_ci   For most purposes, the :const:`SOUND_MIXER_VOLUME` (master volume) and
3957db96d56Sopenharmony_ci   :const:`SOUND_MIXER_PCM` controls should suffice---but code that uses the mixer
3967db96d56Sopenharmony_ci   should be flexible when it comes to choosing mixer controls.  On the Gravis
3977db96d56Sopenharmony_ci   Ultrasound, for example, :const:`SOUND_MIXER_VOLUME` does not exist.
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci.. method:: oss_mixer_device.stereocontrols()
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci   Returns a bitmask indicating stereo mixer controls.  If a bit is set, the
4037db96d56Sopenharmony_ci   corresponding control is stereo; if it is unset, the control is either
4047db96d56Sopenharmony_ci   monophonic or not supported by the mixer (use in combination with
4057db96d56Sopenharmony_ci   :meth:`controls` to determine which).
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci   See the code example for the :meth:`controls` function for an example of getting
4087db96d56Sopenharmony_ci   data from a bitmask.
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci.. method:: oss_mixer_device.reccontrols()
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   Returns a bitmask specifying the mixer controls that may be used to record.  See
4147db96d56Sopenharmony_ci   the code example for :meth:`controls` for an example of reading from a bitmask.
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ci.. method:: oss_mixer_device.get(control)
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci   Returns the volume of a given mixer control.  The returned volume is a 2-tuple
4207db96d56Sopenharmony_ci   ``(left_volume,right_volume)``.  Volumes are specified as numbers from 0
4217db96d56Sopenharmony_ci   (silent) to 100 (full volume).  If the control is monophonic, a 2-tuple is still
4227db96d56Sopenharmony_ci   returned, but both volumes are the same.
4237db96d56Sopenharmony_ci
4247db96d56Sopenharmony_ci   Raises :exc:`OSSAudioError` if an invalid control is specified, or
4257db96d56Sopenharmony_ci   :exc:`OSError` if an unsupported control is specified.
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci.. method:: oss_mixer_device.set(control, (left, right))
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci   Sets the volume for a given mixer control to ``(left,right)``. ``left`` and
4317db96d56Sopenharmony_ci   ``right`` must be ints and between 0 (silent) and 100 (full volume).  On
4327db96d56Sopenharmony_ci   success, the new volume is returned as a 2-tuple. Note that this may not be
4337db96d56Sopenharmony_ci   exactly the same as the volume specified, because of the limited resolution of
4347db96d56Sopenharmony_ci   some soundcard's mixers.
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci   Raises :exc:`OSSAudioError` if an invalid mixer control was specified, or if the
4377db96d56Sopenharmony_ci   specified volumes were out-of-range.
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci.. method:: oss_mixer_device.get_recsrc()
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci   This method returns a bitmask indicating which control(s) are currently being
4437db96d56Sopenharmony_ci   used as a recording source.
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci.. method:: oss_mixer_device.set_recsrc(bitmask)
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci   Call this function to specify a recording source.  Returns a bitmask indicating
4497db96d56Sopenharmony_ci   the new recording source (or sources) if successful; raises :exc:`OSError` if an
4507db96d56Sopenharmony_ci   invalid source was specified.  To set the current recording source to the
4517db96d56Sopenharmony_ci   microphone input::
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci      mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC)
454