diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
commit | 458120dd40db6b4df55a4e96b650e16798ef06a0 (patch) | |
tree | 8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Doc/lib/libossaudiodev.tex | |
parent | 3a742c699f6806c1145aea5149bf15de15a0afd7 (diff) |
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Doc/lib/libossaudiodev.tex')
-rw-r--r-- | sys/src/cmd/python/Doc/lib/libossaudiodev.tex | 401 |
1 files changed, 401 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Doc/lib/libossaudiodev.tex b/sys/src/cmd/python/Doc/lib/libossaudiodev.tex new file mode 100644 index 000000000..4c19aafbd --- /dev/null +++ b/sys/src/cmd/python/Doc/lib/libossaudiodev.tex @@ -0,0 +1,401 @@ +\section{\module{ossaudiodev} --- + Access to OSS-compatible audio devices} + +\declaremodule{builtin}{ossaudiodev} +\platform{Linux, FreeBSD} +\modulesynopsis{Access to OSS-compatible audio devices.} + +\versionadded{2.3} + +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 is the standard audio interface for Linux and +recent versions of FreeBSD. + +% Things will get more complicated for future Linux versions, since +% ALSA is in the standard kernel as of 2.5.x. Presumably if you +% use ALSA, you'll have to make sure its OSS compatibility layer +% is active to use ossaudiodev, but you're gonna need it for the vast +% majority of Linux audio apps anyways. +% +% Sounds like things are also complicated for other BSDs. In response +% to my python-dev query, Thomas Wouters said: +% +% > Likewise, googling shows OpenBSD also uses OSS/Free -- the commercial +% > OSS installation manual tells you to remove references to OSS/Free from the +% > kernel :) +% +% but Aleksander Piotrowsk actually has an OpenBSD box, and he quotes +% from its <soundcard.h>: +% > * WARNING! WARNING! +% > * This is an OSS (Linux) audio emulator. +% > * Use the Native NetBSD API for developing new code, and this +% > * only for compiling Linux programs. +% +% There's also an ossaudio manpage on OpenBSD that explains things +% further. Presumably NetBSD and OpenBSD have a different standard +% audio interface. That's the great thing about standards, there are so +% many to choose from ... ;-) +% +% This probably all warrants a footnote or two, but I don't understand +% things well enough right now to write it! --GPW + +\begin{seealso} +\seetitle[http://www.opensound.com/pguide/oss.pdf] + {Open Sound System Programmer's Guide} {the official + documentation for the OSS C API} +\seetext{The module defines a large number of constants supplied by + the OSS device driver; see \code{<sys/soundcard.h>} on either + Linux or FreeBSD for a listing .} +\end{seealso} + +\module{ossaudiodev} defines the following variables and functions: + +\begin{excdesc}{OSSAudioError} +This exception is raised on certain errors. The argument is a string +describing what went wrong. + +(If \module{ossaudiodev} receives an error from a system call such as +\cfunction{open()}, \cfunction{write()}, or \cfunction{ioctl()}, it +raises \exception{IOError}. Errors detected directly by +\module{ossaudiodev} result in \exception{OSSAudioError}.) + +(For backwards compatibility, the exception class is also available as +\code{ossaudiodev.error}.) +\end{excdesc} + +\begin{funcdesc}{open}{\optional{device, }mode} +Open an audio device and return an OSS audio device object. This +object supports many file-like methods, such as \method{read()}, +\method{write()}, and \method{fileno()} (although there are subtle +differences between conventional \UNIX{} read/write semantics and those of +OSS audio devices). It also supports a number of audio-specific +methods; see below for the complete list of methods. + +\var{device} is the audio device filename to use. If it is not +specified, this module first looks in the environment variable +\envvar{AUDIODEV} for a device to use. If not found, it falls back to +\file{/dev/dsp}. + +\var{mode} is one of \code{'r'} for read-only (record) access, +\code{'w'} for write-only (playback) access and \code{'rw'} for both. +Since many sound cards only allow one process to have the recorder or +player open at a time, it is a good idea to open the device only for the +activity needed. Further, some sound cards are half-duplex: they can be +opened for reading or writing, but not both at once. + +Note the unusual calling syntax: the \emph{first} argument is optional, +and the second is required. This is a historical artifact for +compatibility with the older \module{linuxaudiodev} module which +\module{ossaudiodev} supersedes. % XXX it might also be motivated +% by my unfounded-but-still-possibly-true belief that the default +% audio device varies unpredictably across operating systems. -GW +\end{funcdesc} + +\begin{funcdesc}{openmixer}{\optional{device}} +Open a mixer device and return an OSS mixer device object. +\var{device} is the mixer device filename to use. If it is +not specified, this module first looks in the environment variable +\envvar{MIXERDEV} for a device to use. If not found, it falls back to +\file{/dev/mixer}. + +\end{funcdesc} + +\subsection{Audio Device Objects \label{ossaudio-device-objects}} + +Before you can write to or read from an audio device, you must call +three methods in the correct order: +\begin{enumerate} +\item \method{setfmt()} to set the output format +\item \method{channels()} to set the number of channels +\item \method{speed()} to set the sample rate +\end{enumerate} +Alternately, you can use the \method{setparameters()} method to set all +three audio parameters at once. This is more convenient, but may not be +as flexible in all cases. + +The audio device objects returned by \function{open()} define the +following methods and (read-only) attributes: + +\begin{methoddesc}[audio device]{close}{} +Explicitly close the audio device. When you are done writing to or +reading from an audio device, you should explicitly close it. A closed +device cannot be used again. +\end{methoddesc} + +\begin{methoddesc}[audio device]{fileno}{} +Return the file descriptor associated with the device. +\end{methoddesc} + +\begin{methoddesc}[audio device]{read}{size} +Read \var{size} bytes from the audio input and return them as a Python +string. Unlike most \UNIX{} device drivers, OSS audio devices in +blocking mode (the default) will block \function{read()} until the +entire requested amount of data is available. +\end{methoddesc} + +\begin{methoddesc}[audio device]{write}{data} +Write the Python string \var{data} to the audio device and return the +number of bytes written. If the audio device is in blocking mode (the +default), the entire string is always written (again, this is different +from usual \UNIX{} device semantics). If the device is in non-blocking +mode, some data may not be written---see \method{writeall()}. +\end{methoddesc} + +\begin{methoddesc}[audio device]{writeall}{data} +Write the entire Python string \var{data} to the audio device: waits +until the audio device is able to accept data, writes as much data as it +will accept, and repeats until \var{data} has been completely written. +If the device is in blocking mode (the default), this has the same +effect as \method{write()}; \method{writeall()} is only useful in +non-blocking mode. Has no return value, since the amount of data +written is always equal to the amount of data supplied. +\end{methoddesc} + +The following methods each map to exactly one +\function{ioctl()} system call. The correspondence is obvious: for +example, \method{setfmt()} corresponds to the \code{SNDCTL_DSP_SETFMT} +ioctl, and \method{sync()} to \code{SNDCTL_DSP_SYNC} (this can be useful +when consulting the OSS documentation). If the underlying +\function{ioctl()} fails, they all raise \exception{IOError}. + +\begin{methoddesc}[audio device]{nonblock}{} +Put the device into non-blocking mode. Once in non-blocking mode, there +is no way to return it to blocking mode. +\end{methoddesc} + +\begin{methoddesc}[audio device]{getfmts}{} +Return a bitmask of the audio output formats supported by the +soundcard. Some of the formats supported by OSS are: + +\begin{tableii}{l|l}{constant}{Format}{Description} +\lineii{AFMT_MU_LAW} + {a logarithmic encoding (used by Sun \code{.au} files and + \filenq{/dev/audio})} +\lineii{AFMT_A_LAW} + {a logarithmic encoding} +\lineii{AFMT_IMA_ADPCM} + {a 4:1 compressed format defined by the Interactive Multimedia + Association} +\lineii{AFMT_U8} + {Unsigned, 8-bit audio} +\lineii{AFMT_S16_LE} + {Signed, 16-bit audio, little-endian byte order (as used by + Intel processors)} +\lineii{AFMT_S16_BE} + {Signed, 16-bit audio, big-endian byte order (as used by 68k, + PowerPC, Sparc)} +\lineii{AFMT_S8} + {Signed, 8 bit audio} +\lineii{AFMT_U16_LE} + {Unsigned, 16-bit little-endian audio} +\lineii{AFMT_U16_BE} + {Unsigned, 16-bit big-endian audio} +\end{tableii} +Consult the OSS documentation for a full list of audio formats, and note +that most devices support only a subset of these formats. Some older +devices only support \constant{AFMT_U8}; the most common format used +today is \constant{AFMT_S16_LE}. +\end{methoddesc} + +\begin{methoddesc}[audio device]{setfmt}{format} +Try to set the current audio format to \var{format}---see +\method{getfmts()} for a list. Returns the audio format that the device +was set to, which may not be the requested format. May also be used to +return the current audio format---do this by passing an ``audio format'' +of +\constant{AFMT_QUERY}. +\end{methoddesc} + +\begin{methoddesc}[audio device]{channels}{nchannels} +Set the number of output channels to \var{nchannels}. A value of 1 +indicates monophonic sound, 2 stereophonic. Some devices may have more +than 2 channels, and some high-end devices may not support mono. +Returns the number of channels the device was set to. +\end{methoddesc} + +\begin{methoddesc}[audio device]{speed}{samplerate} +Try to set the audio sampling rate to \var{samplerate} samples per +second. Returns the rate actually set. Most sound devices don't +support arbitrary sampling rates. Common rates are: +\begin{tableii}{l|l}{textrm}{Rate}{Description} +\lineii{8000}{default rate for \filenq{/dev/audio}} +\lineii{11025}{speech recording} +\lineii{22050}{} +\lineii{44100}{CD quality audio (at 16 bits/sample and 2 channels)} +\lineii{96000}{DVD quality audio (at 24 bits/sample)} +\end{tableii} +\end{methoddesc} + +\begin{methoddesc}[audio device]{sync}{} +Wait until the sound device has played every byte in its buffer. (This +happens implicitly when the device is closed.) The OSS documentation +recommends closing and re-opening the device rather than using +\method{sync()}. +\end{methoddesc} + +\begin{methoddesc}[audio device]{reset}{} +Immediately stop playing or recording and return the device to a +state where it can accept commands. The OSS documentation recommends +closing and re-opening the device after calling \method{reset()}. +\end{methoddesc} + +\begin{methoddesc}[audio device]{post}{} +Tell the driver that there is likely to be a pause in the output, making +it possible for the device to handle the pause more intelligently. You +might use this after playing a spot sound effect, before waiting for +user input, or before doing disk I/O. +\end{methoddesc} + +The following convenience methods combine several ioctls, or one ioctl +and some simple calculations. + +\begin{methoddesc}[audio device]{setparameters} + {format, nchannels, samplerate \optional{, strict=False}} + +Set the key audio sampling parameters---sample format, number of +channels, and sampling rate---in one method call. \var{format}, +\var{nchannels}, and \var{samplerate} should be as specified in the +\method{setfmt()}, \method{channels()}, and \method{speed()} +methods. If \var{strict} is true, \method{setparameters()} checks to +see if each parameter was actually set to the requested value, and +raises \exception{OSSAudioError} if not. Returns a tuple (\var{format}, +\var{nchannels}, \var{samplerate}) indicating the parameter values that +were actually set by the device driver (i.e., the same as the return +values of \method{setfmt()}, \method{channels()}, and \method{speed()}). + +For example, +\begin{verbatim} + (fmt, channels, rate) = dsp.setparameters(fmt, channels, rate) +\end{verbatim} +is equivalent to +\begin{verbatim} + fmt = dsp.setfmt(fmt) + channels = dsp.channels(channels) + rate = dsp.rate(channels) +\end{verbatim} +\end{methoddesc} + +\begin{methoddesc}[audio device]{bufsize}{} +Returns the size of the hardware buffer, in samples. +\end{methoddesc} + +\begin{methoddesc}[audio device]{obufcount}{} +Returns the number of samples that are in the hardware buffer yet to be +played. +\end{methoddesc} + +\begin{methoddesc}[audio device]{obuffree}{} +Returns the number of samples that could be queued into the hardware +buffer to be played without blocking. +\end{methoddesc} + +Audio device objects also support several read-only attributes: + +\begin{memberdesc}[audio device]{closed}{} +Boolean indicating whether the device has been closed. +\end{memberdesc} + +\begin{memberdesc}[audio device]{name}{} +String containing the name of the device file. +\end{memberdesc} + +\begin{memberdesc}[audio device]{mode}{} +The I/O mode for the file, either \code{"r"}, \code{"rw"}, or \code{"w"}. +\end{memberdesc} + + +\subsection{Mixer Device Objects \label{mixer-device-objects}} + +The mixer object provides two file-like methods: + +\begin{methoddesc}[mixer device]{close}{} +This method closes the open mixer device file. Any further attempts to +use the mixer after this file is closed will raise an \exception{IOError}. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{fileno}{} +Returns the file handle number of the open mixer device file. +\end{methoddesc} + +The remaining methods are specific to audio mixing: + +\begin{methoddesc}[mixer device]{controls}{} +This method returns a bitmask specifying the available mixer controls +(``Control'' being a specific mixable ``channel'', such as +\constant{SOUND_MIXER_PCM} or \constant{SOUND_MIXER_SYNTH}). This +bitmask indicates a subset of all available mixer controls---the +\constant{SOUND_MIXER_*} constants defined at module level. To determine if, +for example, the current mixer object supports a PCM mixer, use the +following Python code: + +\begin{verbatim} +mixer=ossaudiodev.openmixer() +if mixer.controls() & (1 << ossaudiodev.SOUND_MIXER_PCM): + # PCM is supported + ... code ... +\end{verbatim} + +For most purposes, the \constant{SOUND_MIXER_VOLUME} (master volume) and +\constant{SOUND_MIXER_PCM} controls should suffice---but code that uses the +mixer should be flexible when it comes to choosing mixer controls. On +the Gravis Ultrasound, for example, \constant{SOUND_MIXER_VOLUME} does not +exist. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{stereocontrols}{} +Returns a bitmask indicating stereo mixer controls. If a bit is set, +the corresponding control is stereo; if it is unset, the control is +either monophonic or not supported by the mixer (use in combination with +\method{controls()} to determine which). + +See the code example for the \method{controls()} function for an example +of getting data from a bitmask. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{reccontrols}{} +Returns a bitmask specifying the mixer controls that may be used to +record. See the code example for \method{controls()} for an example of +reading from a bitmask. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{get}{control} +Returns the volume of a given mixer control. The returned volume is a +2-tuple \code{(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 still returned, but both volumes are +the same. + +Raises \exception{OSSAudioError} if an invalid control was is specified, +or \exception{IOError} if an unsupported control is specified. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{set}{control, (left, right)} +Sets the volume for a given mixer control to \code{(left,right)}. +\code{left} and \code{right} must be ints and between 0 (silent) and 100 +(full volume). On success, the new volume is returned as a 2-tuple. +Note that this may not be exactly the same as the volume specified, +because of the limited resolution of some soundcard's mixers. + +Raises \exception{OSSAudioError} if an invalid mixer control was +specified, or if the specified volumes were out-of-range. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{get_recsrc}{} +This method returns a bitmask indicating which control(s) are +currently being used as a recording source. +\end{methoddesc} + +\begin{methoddesc}[mixer device]{set_recsrc}{bitmask} +Call this function to specify a recording source. Returns a bitmask +indicating the new recording source (or sources) if successful; raises +\exception{IOError} if an invalid source was specified. To set the current +recording source to the microphone input: + +\begin{verbatim} +mixer.setrecsrc (1 << ossaudiodev.SOUND_MIXER_MIC) +\end{verbatim} +\end{methoddesc} + + + |