\section{Built-in Module \sectcode{al}}
\bimodindex{al}

This module provides access to the audio facilities of the Indigo and
4D/35 workstations, described in section 3A of the IRIX 4.0 man pages
(and also available as an option in IRIX 3.3).  You'll need to read
those man pages to understand what these functions do!
Some of the functions are not available in releases below 4.0.5.
Again, see the manual to check whether a specific function is
available on your platform.

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

\strong{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.)

Module \code{al} defines the following functions:

\renewcommand{\indexsubitem}{(in module al)}
\begin{funcdesc}{openport}{name\, direction\optional{\, config}}
Equivalent to the C function ALopenport().  The name and direction
arguments are strings.  The optional config argument is an opaque
configuration object as returned by \code{al.newconfig()}.  The return
value is an opaque port object; methods of port objects are described
below.
\end{funcdesc}

\begin{funcdesc}{newconfig}{}
Equivalent to the C function ALnewconfig().  The return value is a new
opaque configuration object; methods of configuration objects are
described below.
\end{funcdesc}

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

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

\begin{funcdesc}{setparams}{device\, list}
Equivalent to the C function ALsetparams().  The device argument is an
integer.The list argument is a list such as returned by
\code{al.queryparams}.
\end{funcdesc}

Configuration objects (returned by \code{al.newconfig()} have the
following methods:

\renewcommand{\indexsubitem}{(audio configuration object method)}
\begin{funcdesc}{getqueuesize}{}
Return the queue size; equivalent to the C function ALgetqueuesize().
\end{funcdesc}

\begin{funcdesc}{setqueuesize}{size}
Set the queue size; equivalent to the C function ALsetqueuesize().
\end{funcdesc}

\begin{funcdesc}{getwidth}{}
Get the sample width; equivalent to the C function ALgetwidth().
\end{funcdesc}

\begin{funcdesc}{getwidth}{width}
Set the sample width; equivalent to the C function ALsetwidth().
\end{funcdesc}

\begin{funcdesc}{getchannels}{}
Get the channel count; equivalent to the C function ALgetchannels().
\end{funcdesc}

\begin{funcdesc}{setchannels}{nchannels}
Set the channel count; equivalent to the C function ALsetchannels().
\end{funcdesc}

\begin{funcdesc}{getsampfmt}{}
Get the sample format; equivalent to the C function ALgetsampfmt().
\end{funcdesc}

\begin{funcdesc}{setsampfmt}{sampfmt}
Set the sample format; equivalent to the C function ALsetsampfmt().
\end{funcdesc}

\begin{funcdesc}{getfloatmax}{}
Get the maximum value for floating sample formats;
equivalent to the C function ALgetfloatmax().
\end{funcdesc}

\begin{funcdesc}{setfloatmax}{floatmax}
Set the maximum value for floating sample formats;
equivalent to the C function ALsetfloatmax().
\end{funcdesc}

Port objects (returned by \code{al.openport()} have the following
methods:

\renewcommand{\indexsubitem}{(audio port object method)}
\begin{funcdesc}{closeport}{}
Close the port; equivalent to the C function ALcloseport().
\end{funcdesc}

\begin{funcdesc}{getfd}{}
Return the file descriptor as an int; equivalent to the C function
ALgetfd().
\end{funcdesc}

\begin{funcdesc}{getfilled}{}
Return the number of filled samples; equivalent to the C function
ALgetfilled().
\end{funcdesc}

\begin{funcdesc}{getfillable}{}
Return the number of fillable samples; equivalent to the C function
ALgetfillable().
\end{funcdesc}

\begin{funcdesc}{readsamps}{nsamples}
Read a number of samples from the queue, blocking if necessary;
equivalent to the C function ALreadsamples.  The data is returned 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{funcdesc}

\begin{funcdesc}{writesamps}{samples}
Write samples into the queue, blocking if necessary; equivalent to the
C function ALwritesamples.  The samples are encoded as described for
the \code{readsamps} return value.
\end{funcdesc}

\begin{funcdesc}{getfillpoint}{}
Return the `fill point'; equivalent to the C function ALgetfillpoint().
\end{funcdesc}

\begin{funcdesc}{setfillpoint}{fillpoint}
Set the `fill point'; equivalent to the C function ALsetfillpoint().
\end{funcdesc}

\begin{funcdesc}{getconfig}{}
Return a configuration object containing the current configuration of
the port; equivalent to the C function ALgetconfig().
\end{funcdesc}

\begin{funcdesc}{setconfig}{config}
Set the configuration from the argument, a configuration object;
equivalent to the C function ALsetconfig().
\end{funcdesc}

\begin{funcdesc}{getstatus}{list}
Get status information on last error
equivalent to C function ALgetstatus().
\end{funcdesc}

\section{Standard Module \sectcode{AL}}
\nodename{AL (uppercase)}
\stmodindex{AL}

This module defines symbolic constants needed to use the built-in
module \code{al} (see above); they are equivalent to those defined in
the C header file \file{<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:

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