\section{\module{al} ---
         Audio functions on the SGI}

\declaremodule{builtin}{al}
  \platform{IRIX}
\modulesynopsis{Audio functions on the SGI.}


This module provides access to the audio facilities of the SGI Indy
and Indigo workstations.  See section 3A of the IRIX man pages for
details.  You'll need to read those man pages to understand what these
functions do!  Some of the functions are not available in IRIX
releases before 4.0.5.  Again, see the manual to check whether a
specific function is available on your platform.

All functions and methods defined in this module are equivalent to
the C functions with \samp{AL} prefixed to their name.

Symbolic constants from the C header file \code{<audio.h>} are
defined in the standard module
\refmodule[al-constants]{AL}\refstmodindex{AL}, see below.

\warning{The current version of the audio library may dump core
when bad argument values are passed rather than returning an error
status.  Unfortunately, since the precise circumstances under which
this may happen are undocumented and hard to check, the Python
interface can provide no protection against this kind of problems.
(One example is specifying an excessive queue size --- there is no
documented upper limit.)}

The module defines the following functions:


\begin{funcdesc}{openport}{name, direction\optional{, config}}
The name and direction arguments are strings.  The optional
\var{config} argument is a configuration object as returned by
\function{newconfig()}.  The return value is an \dfn{audio port
object}; methods of audio port objects are described below.
\end{funcdesc}

\begin{funcdesc}{newconfig}{}
The return value is a new \dfn{audio configuration object}; methods of
audio configuration objects are described below.
\end{funcdesc}

\begin{funcdesc}{queryparams}{device}
The device argument is an integer.  The return value is a list of
integers containing the data returned by \cfunction{ALqueryparams()}.
\end{funcdesc}

\begin{funcdesc}{getparams}{device, list}
The \var{device} argument is an integer.  The list argument is a list
such as returned by \function{queryparams()}; it is modified in place
(!).
\end{funcdesc}

\begin{funcdesc}{setparams}{device, list}
The \var{device} argument is an integer.  The \var{list} argument is a
list such as returned by \function{queryparams()}.
\end{funcdesc}


\subsection{Configuration Objects \label{al-config-objects}}

Configuration objects returned by \function{newconfig()} have the
following methods:

\begin{methoddesc}[audio configuration]{getqueuesize}{}
Return the queue size.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{setqueuesize}{size}
Set the queue size.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{getwidth}{}
Get the sample width.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{setwidth}{width}
Set the sample width.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{getchannels}{}
Get the channel count.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{setchannels}{nchannels}
Set the channel count.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{getsampfmt}{}
Get the sample format.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{setsampfmt}{sampfmt}
Set the sample format.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{getfloatmax}{}
Get the maximum value for floating sample formats.
\end{methoddesc}

\begin{methoddesc}[audio configuration]{setfloatmax}{floatmax}
Set the maximum value for floating sample formats.
\end{methoddesc}


\subsection{Port Objects \label{al-port-objects}}

Port objects, as returned by \function{openport()}, have the following
methods:

\begin{methoddesc}[audio port]{closeport}{}
Close the port.
\end{methoddesc}

\begin{methoddesc}[audio port]{getfd}{}
Return the file descriptor as an int.
\end{methoddesc}

\begin{methoddesc}[audio port]{getfilled}{}
Return the number of filled samples.
\end{methoddesc}

\begin{methoddesc}[audio port]{getfillable}{}
Return the number of fillable samples.
\end{methoddesc}

\begin{methoddesc}[audio port]{readsamps}{nsamples}
Read a number of samples from the queue, blocking if necessary.
Return the data as a string containing the raw data, (e.g., 2 bytes per
sample in big-endian byte order (high byte, low byte) if you have set
the sample width to 2 bytes).
\end{methoddesc}

\begin{methoddesc}[audio port]{writesamps}{samples}
Write samples into the queue, blocking if necessary.  The samples are
encoded as described for the \method{readsamps()} return value.
\end{methoddesc}

\begin{methoddesc}[audio port]{getfillpoint}{}
Return the `fill point'.
\end{methoddesc}

\begin{methoddesc}[audio port]{setfillpoint}{fillpoint}
Set the `fill point'.
\end{methoddesc}

\begin{methoddesc}[audio port]{getconfig}{}
Return a configuration object containing the current configuration of
the port.
\end{methoddesc}

\begin{methoddesc}[audio port]{setconfig}{config}
Set the configuration from the argument, a configuration object.
\end{methoddesc}

\begin{methoddesc}[audio port]{getstatus}{list}
Get status information on last error.
\end{methoddesc}


\section{\module{AL} ---
         Constants used with the \module{al} module}

\declaremodule[al-constants]{standard}{AL}
  \platform{IRIX}
\modulesynopsis{Constants used with the \module{al} module.}


This module defines symbolic constants needed to use the built-in
module \refmodule{al} (see above); they are equivalent to those defined
in the C header file \code{<audio.h>} except that the name prefix
\samp{AL_} is omitted.  Read the module source for a complete list of
the defined names.  Suggested use:

\begin{verbatim}
import al
from AL import *
\end{verbatim}
