:mod:`sunau` --- Read and write Sun AU files
============================================

.. module:: sunau
   :synopsis: Provide an interface to the Sun AU sound format.
.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>

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

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

The :mod:`sunau` module provides a convenient interface to the Sun AU sound
format.  Note that this module is interface-compatible with the modules
:mod:`aifc` and :mod:`wave`.

An audio file consists of a header followed by the data.  The fields of the
header are:

+---------------+-----------------------------------------------+
| Field         | Contents                                      |
+===============+===============================================+
| magic word    | The four bytes ``.snd``.                      |
+---------------+-----------------------------------------------+
| header size   | Size of the header, including info, in bytes. |
+---------------+-----------------------------------------------+
| data size     | Physical size of the data, in bytes.          |
+---------------+-----------------------------------------------+
| encoding      | Indicates how the audio samples are encoded.  |
+---------------+-----------------------------------------------+
| sample rate   | The sampling rate.                            |
+---------------+-----------------------------------------------+
| # of channels | The number of channels in the samples.        |
+---------------+-----------------------------------------------+
| info          | ASCII string giving a description of the      |
|               | audio file (padded with null bytes).          |
+---------------+-----------------------------------------------+

Apart from the info field, all header fields are 4 bytes in size. They are all
32-bit unsigned integers encoded in big-endian byte order.

The :mod:`sunau` module defines the following functions:


.. function:: open(file, mode)

   If *file* is a string, open the file by that name, otherwise treat it as a
   seekable file-like object. *mode* can be any of

   ``'r'``
      Read only mode.

   ``'w'``
      Write only mode.

   Note that it does not allow read/write files.

   A *mode* of ``'r'`` returns a :class:`AU_read` object, while a *mode* of ``'w'``
   or ``'wb'`` returns a :class:`AU_write` object.


.. function:: openfp(file, mode)

   A synonym for :func:`.open`, maintained for backwards compatibility.


The :mod:`sunau` module defines the following exception:

.. exception:: Error

   An error raised when something is impossible because of Sun AU specs or
   implementation deficiency.


The :mod:`sunau` module defines the following data items:

.. data:: AUDIO_FILE_MAGIC

   An integer every valid Sun AU file begins with, stored in big-endian form.  This
   is the string ``.snd`` interpreted as an integer.


.. data:: AUDIO_FILE_ENCODING_MULAW_8
          AUDIO_FILE_ENCODING_LINEAR_8
          AUDIO_FILE_ENCODING_LINEAR_16
          AUDIO_FILE_ENCODING_LINEAR_24
          AUDIO_FILE_ENCODING_LINEAR_32
          AUDIO_FILE_ENCODING_ALAW_8

   Values of the encoding field from the AU header which are supported by this
   module.


.. data:: AUDIO_FILE_ENCODING_FLOAT
          AUDIO_FILE_ENCODING_DOUBLE
          AUDIO_FILE_ENCODING_ADPCM_G721
          AUDIO_FILE_ENCODING_ADPCM_G722
          AUDIO_FILE_ENCODING_ADPCM_G723_3
          AUDIO_FILE_ENCODING_ADPCM_G723_5

   Additional known values of the encoding field from the AU header, but which are
   not supported by this module.


.. _au-read-objects:

AU_read Objects
---------------

AU_read objects, as returned by :func:`.open` above, have the following methods:


.. method:: AU_read.close()

   Close the stream, and make the instance unusable. (This is  called automatically
   on deletion.)


.. method:: AU_read.getnchannels()

   Returns number of audio channels (1 for mone, 2 for stereo).


.. method:: AU_read.getsampwidth()

   Returns sample width in bytes.


.. method:: AU_read.getframerate()

   Returns sampling frequency.


.. method:: AU_read.getnframes()

   Returns number of audio frames.


.. method:: AU_read.getcomptype()

   Returns compression type. Supported compression types are ``'ULAW'``, ``'ALAW'``
   and ``'NONE'``.


.. method:: AU_read.getcompname()

   Human-readable version of :meth:`getcomptype`.  The supported types have the
   respective names ``'CCITT G.711 u-law'``, ``'CCITT G.711 A-law'`` and ``'not
   compressed'``.


.. method:: AU_read.getparams()

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


.. method:: AU_read.readframes(n)

   Reads and returns at most *n* frames of audio, as a string of bytes.  The data
   will be returned in linear format.  If the original data is in u-LAW format, it
   will be converted.


.. method:: AU_read.rewind()

   Rewind the file pointer to the beginning of the audio stream.

The following two methods define a term "position" which is compatible between
them, and is otherwise implementation dependent.


.. method:: AU_read.setpos(pos)

   Set the file pointer to the specified position.  Only values returned from
   :meth:`tell` should be used for *pos*.


.. method:: AU_read.tell()

   Return current file pointer position.  Note that the returned value has nothing
   to do with the actual position in the file.

The following two functions are defined for compatibility with the  :mod:`aifc`,
and don't do anything interesting.


.. method:: AU_read.getmarkers()

   Returns ``None``.


.. method:: AU_read.getmark(id)

   Raise an error.


.. _au-write-objects:

AU_write Objects
----------------

AU_write objects, as returned by :func:`.open` above, have the following methods:


.. method:: AU_write.setnchannels(n)

   Set the number of channels.


.. method:: AU_write.setsampwidth(n)

   Set the sample width (in bytes.)


.. method:: AU_write.setframerate(n)

   Set the frame rate.


.. method:: AU_write.setnframes(n)

   Set the number of frames. This can be later changed, when and if more  frames
   are written.


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

   Set the compression type and description. Only ``'NONE'`` and ``'ULAW'`` are
   supported on output.


.. method:: AU_write.setparams(tuple)

   The *tuple* should be ``(nchannels, sampwidth, framerate, nframes, comptype,
   compname)``, with values valid for the :meth:`set\*` methods.  Set all
   parameters.


.. method:: AU_write.tell()

   Return current position in the file, with the same disclaimer for the
   :meth:`AU_read.tell` and :meth:`AU_read.setpos` methods.


.. method:: AU_write.writeframesraw(data)

   Write audio frames, without correcting *nframes*.


.. method:: AU_write.writeframes(data)

   Write audio frames and make sure *nframes* is correct.


.. method:: AU_write.close()

   Make sure *nframes* is correct, and close the file.

   This method is called upon deletion.

Note that it is invalid to set any parameters after calling  :meth:`writeframes`
or :meth:`writeframesraw`.

