:mod:`aifc` --- Read and write AIFF and AIFC files
==================================================

.. module:: aifc
   :synopsis: Read and write audio files in AIFF or AIFC format.


.. index::
   single: Audio Interchange File Format
   single: AIFF
   single: AIFF-C

**Source code:** :source:`Lib/aifc.py`

--------------

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.

.. note::

   Some operations may only work under IRIX; these will raise :exc:`ImportError`
   when attempting to import the :mod:`cl` module, which is only available on
   IRIX.

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
``nchannels * samplesize`` bytes, and a second's worth of audio consists of
``nchannels * samplesize * 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
(176,400 bytes).

Module :mod:`aifc` defines the following function:


.. function:: open(file, mode=None)

   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
   :term:`file object`.  *mode* must be ``'r'`` or ``'rb'`` when the file must be
   opened for reading, or ``'w'``  or ``'wb'`` when the file must be opened for writing.
   If omitted, ``file.mode`` is used if it exists, otherwise ``'rb'`` is used.  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
   :meth:`writeframesraw` and :meth:`setnframes`.
   The :func:`.open` function may be used in a :keyword:`with` statement.  When
   the :keyword:`with` block completes, the :meth:`~aifc.close` method is called.

   .. versionchanged:: 3.4
      Support for the :keyword:`with` statement was added.

Objects returned by :func:`.open` when a file is opened for reading have the
following methods:


.. method:: aifc.getnchannels()

   Return the number of audio channels (1 for mono, 2 for stereo).


.. method:: aifc.getsampwidth()

   Return the size in bytes of individual samples.


.. method:: aifc.getframerate()

   Return the sampling rate (number of audio frames per second).


.. method:: aifc.getnframes()

   Return the number of audio frames in the file.


.. method:: aifc.getcomptype()

   Return a bytes array of length 4 describing the type of compression
   used in the audio file.  For AIFF files, the returned value is
   ``b'NONE'``.


.. method:: aifc.getcompname()

   Return a bytes array convertible to a human-readable description
   of the type of compression used in the audio file.  For AIFF files,
   the returned value is ``b'not compressed'``.


.. method:: aifc.getparams()

   Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth,
   framerate, nframes, comptype, compname)``, equivalent to output of the
   :meth:`get\*` methods.


.. method:: 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).


.. method:: aifc.getmark(id)

   Return the tuple as described in :meth:`getmarkers` for the mark with the given
   *id*.


.. method:: aifc.readframes(nframes)

   Read and return the next *nframes* frames from the audio file.  The returned
   data is a string containing for each frame the uncompressed samples of all
   channels.


.. method:: aifc.rewind()

   Rewind the read pointer.  The next :meth:`readframes` will start from the
   beginning.


.. method:: aifc.setpos(pos)

   Seek to the specified frame number.


.. method:: aifc.tell()

   Return the current frame number.


.. method:: aifc.close()

   Close the AIFF file.  After calling this method, the object can no longer be
   used.

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


.. method:: aifc.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.


.. method:: 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 ``'.aiff'`` in which case the default is an AIFF
   file.


.. method:: aifc.setnchannels(nchannels)

   Specify the number of channels in the audio file.


.. method:: aifc.setsampwidth(width)

   Specify the size in bytes of audio samples.


.. method:: aifc.setframerate(rate)

   Specify the sampling frequency in frames per second.


.. method:: 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.


.. method:: aifc.setcomptype(type, name)

   .. index::
      single: u-LAW
      single: A-LAW
      single: G.722

   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 as a bytes array, the type parameter should be a
   bytes array of length 4.  Currently the following compression types
   are supported: ``b'NONE'``, ``b'ULAW'``, ``b'ALAW'``, ``b'G722'``.


.. method:: 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
   :meth:`getparams` call as argument to :meth:`setparams`.


.. method:: 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 :meth:`close`.


.. method:: aifc.tell()

   Return the current write position in the output file.  Useful in combination
   with :meth:`setmark`.


.. method:: aifc.writeframes(data)

   Write data to the output file.  This method can only be called after the audio
   file parameters have been set.

   .. versionchanged:: 3.4
      Any :term:`bytes-like object` is now accepted.


.. method:: aifc.writeframesraw(data)

   Like :meth:`writeframes`, except that the header of the audio file is not
   updated.

   .. versionchanged:: 3.4
      Any :term:`bytes-like object` is now accepted.


.. method:: 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.

