\section{Standard Module \module{aifc}}
\label{module-aifc}
\stmodindex{aifc}

This module provides support for reading and writing AIFF and AIFF-C
files.  AIFF is Audio Interchange File Format, a format for storing
digital audio samples in a file.  AIFF-C is a newer version of the
format that includes the ability to compress the audio data.
\index{Audio Interchange File Format}
\index{AIFF}
\index{AIFF-C}

Audio files have a number of parameters that describe the audio data.
The sampling rate or frame rate is the number of times per second the
sound is sampled.  The number of channels indicate if the audio is
mono, stereo, or quadro.  Each frame consists of one sample per
channel.  The sample size is the size in bytes of each sample.  Thus a
frame consists of \var{nchannels}*\var{samplesize} bytes, and a
second's worth of audio consists of
\var{nchannels}*\var{samplesize}*\var{framerate} bytes.

For example, CD quality audio has a sample size of two bytes (16
bits), uses two channels (stereo) and has a frame rate of 44,100
frames/second.  This gives a frame size of 4 bytes (2*2), and a
second's worth occupies 2*2*44100 bytes, i.e.\ 176,400 bytes.

Module \module{aifc} defines the following function:

\begin{funcdesc}{open}{file, mode}
Open an AIFF or AIFF-C file and return an object instance with
methods that are described below.  The argument file is either a
string naming a file or a file object.  The mode is either the string
\code{'r'} when the file must be opened for reading, or \code{'w'}
when the file must be opened for writing.  When used for writing, the
file object should be seekable, unless you know ahead of time how many
samples you are going to write in total and use
\method{writeframesraw()} and \method{setnframes()}.
\end{funcdesc}

Objects returned by \function{open()} when a file is opened for
reading have the following methods:

\begin{methoddesc}[aifc]{getnchannels}{}
Return the number of audio channels (1 for mono, 2 for stereo).
\end{methoddesc}

\begin{methoddesc}[aifc]{getsampwidth}{}
Return the size in bytes of individual samples.
\end{methoddesc}

\begin{methoddesc}[aifc]{getframerate}{}
Return the sampling rate (number of audio frames per second).
\end{methoddesc}

\begin{methoddesc}[aifc]{getnframes}{}
Return the number of audio frames in the file.
\end{methoddesc}

\begin{methoddesc}[aifc]{getcomptype}{}
Return a four-character string describing the type of compression used
in the audio file.  For AIFF files, the returned value is
\code{'NONE'}.
\end{methoddesc}

\begin{methoddesc}[aifc]{getcompname}{}
Return a human-readable description of the type of compression used in
the audio file.  For AIFF files, the returned value is \code{'not
compressed'}.
\end{methoddesc}

\begin{methoddesc}[aifc]{getparams}{}
Return a tuple consisting of all of the above values in the above
order.
\end{methoddesc}

\begin{methoddesc}[aifc]{getmarkers}{}
Return a list of markers in the audio file.  A marker consists of a
tuple of three elements.  The first is the mark ID (an integer), the
second is the mark position in frames from the beginning of the data
(an integer), the third is the name of the mark (a string).
\end{methoddesc}

\begin{methoddesc}[aifc]{getmark}{id}
Return the tuple as described in \method{getmarkers()} for the mark
with the given \var{id}.
\end{methoddesc}

\begin{methoddesc}[aifc]{readframes}{nframes}
Read and return the next \var{nframes} frames from the audio file.  The
returned data is a string containing for each frame the uncompressed
samples of all channels.
\end{methoddesc}

\begin{methoddesc}[aifc]{rewind}{}
Rewind the read pointer.  The next \method{readframes()} will start from
the beginning.
\end{methoddesc}

\begin{methoddesc}[aifc]{setpos}{pos}
Seek to the specified frame number.
\end{methoddesc}

\begin{methoddesc}[aifc]{tell}{}
Return the current frame number.
\end{methoddesc}

\begin{methoddesc}[aifc]{close}{}
Close the AIFF file.  After calling this method, the object can no
longer be used.
\end{methoddesc}

Objects returned by \function{open()} when a file is opened for
writing have all the above methods, except for \method{readframes()} and
\method{setpos()}.  In addition the following methods exist.  The
\method{get*()} methods can only be called after the corresponding
\method{set*()} methods have been called.  Before the first
\method{writeframes()} or \method{writeframesraw()}, all parameters
except for the number of frames must be filled in.

\begin{methoddesc}[aifc]{aiff}{}
Create an AIFF file.  The default is that an AIFF-C file is created,
unless the name of the file ends in \code{'.aiff'} in which case the
default is an AIFF file.
\end{methoddesc}

\begin{methoddesc}[aifc]{aifc}{}
Create an AIFF-C file.  The default is that an AIFF-C file is created,
unless the name of the file ends in \code{'.aiff'} in which case the
default is an AIFF file.
\end{methoddesc}

\begin{methoddesc}[aifc]{setnchannels}{nchannels}
Specify the number of channels in the audio file.
\end{methoddesc}

\begin{methoddesc}[aifc]{setsampwidth}{width}
Specify the size in bytes of audio samples.
\end{methoddesc}

\begin{methoddesc}[aifc]{setframerate}{rate}
Specify the sampling frequency in frames per second.
\end{methoddesc}

\begin{methoddesc}[aifc]{setnframes}{nframes}
Specify the number of frames that are to be written to the audio file.
If this parameter is not set, or not set correctly, the file needs to
support seeking.
\end{methoddesc}

\begin{methoddesc}[aifc]{setcomptype}{type, name}
Specify the compression type.  If not specified, the audio data will
not be compressed.  In AIFF files, compression is not possible.  The
name parameter should be a human-readable description of the
compression type, the type parameter should be a four-character
string.  Currently the following compression types are supported:
NONE, ULAW, ALAW, G722.
\index{u-LAW}
\index{A-LAW}
\index{G.722}
\end{methoddesc}

\begin{methoddesc}[aifc]{setparams}{nchannels, sampwidth, framerate, comptype, compname}
Set all the above parameters at once.  The argument is a tuple
consisting of the various parameters.  This means that it is possible
to use the result of a \method{getparams()} call as argument to
\method{setparams()}.
\end{methoddesc}

\begin{methoddesc}[aifc]{setmark}{id, pos, name}
Add a mark with the given id (larger than 0), and the given name at
the given position.  This method can be called at any time before
\method{close()}.
\end{methoddesc}

\begin{methoddesc}[aifc]{tell}{}
Return the current write position in the output file.  Useful in
combination with \method{setmark()}.
\end{methoddesc}

\begin{methoddesc}[aifc]{writeframes}{data}
Write data to the output file.  This method can only be called after
the audio file parameters have been set.
\end{methoddesc}

\begin{methoddesc}[aifc]{writeframesraw}{data}
Like \method{writeframes()}, except that the header of the audio file
is not updated.
\end{methoddesc}

\begin{methoddesc}[aifc]{close}{}
Close the AIFF file.  The header of the file is updated to reflect the
actual size of the audio data. After calling this method, the object
can no longer be used.
\end{methoddesc}
