\section{Standard Module \sectcode{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.

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 \code{aifc} defines the following function:

\renewcommand{\indexsubitem}{(in module aifc)}
\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
\code{writeframesraw()} and \code{setnframes()}.
\end{funcdesc}

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

\renewcommand{\indexsubitem}{(aifc object method)}
\begin{funcdesc}{getnchannels}{}
Return the number of audio channels (1 for mono, 2 for stereo).
\end{funcdesc}

\begin{funcdesc}{getsampwidth}{}
Return the size in bytes of individual samples.
\end{funcdesc}

\begin{funcdesc}{getframerate}{}
Return the sampling rate (number of audio frames per second).
\end{funcdesc}

\begin{funcdesc}{getnframes}{}
Return the number of audio frames in the file.
\end{funcdesc}

\begin{funcdesc}{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{funcdesc}

\begin{funcdesc}{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{funcdesc}

\begin{funcdesc}{getparams}{}
Return a tuple consisting of all of the above values in the above
order.
\end{funcdesc}

\begin{funcdesc}{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{funcdesc}

\begin{funcdesc}{getmark}{id}
Return the tuple as described in \code{getmarkers} for the mark with
the given id.
\end{funcdesc}

\begin{funcdesc}{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{funcdesc}

\begin{funcdesc}{rewind}{}
Rewind the read pointer.  The next \code{readframes} will start from
the beginning.
\end{funcdesc}

\begin{funcdesc}{setpos}{pos}
Seek to the specified frame number.
\end{funcdesc}

\begin{funcdesc}{tell}{}
Return the current frame number.
\end{funcdesc}

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

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

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

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

\begin{funcdesc}{setnchannels}{nchannels}
Specify the number of channels in the audio file.
\end{funcdesc}

\begin{funcdesc}{setsampwidth}{width}
Specify the size in bytes of audio samples.
\end{funcdesc}

\begin{funcdesc}{setframerate}{rate}
Specify the sampling frequency in frames per second.
\end{funcdesc}

\begin{funcdesc}{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{funcdesc}

\begin{funcdesc}{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.
\end{funcdesc}

\begin{funcdesc}{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 \code{getparams} call as argument to
\code{setparams}.
\end{funcdesc}

\begin{funcdesc}{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
\code{close}.
\end{funcdesc}

\begin{funcdesc}{tell}{}
Return the current write position in the output file.  Useful in
combination with \code{setmark}.
\end{funcdesc}

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

\begin{funcdesc}{writeframesraw}{data}
Like \code{writeframes}, except that the header of the audio file is
not updated.
\end{funcdesc}

\begin{funcdesc}{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{funcdesc}
