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

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:

\setindexsubitem{(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:

\setindexsubitem{(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 \code{'.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 \code{'.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}
