| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | :mod:`sunau` --- Read and write Sun AU files
 | 
					
						
							|  |  |  | ============================================
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. module:: sunau
 | 
					
						
							|  |  |  |    :synopsis: Provide an interface to the Sun AU sound format.
 | 
					
						
							| 
									
										
										
										
											2016-06-11 15:02:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | .. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-27 20:38:46 +00:00
										 |  |  | **Source code:** :source:`Lib/sunau.py`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | --------------
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-02 03:37:02 +00:00
										 |  |  |    A *mode* of ``'r'`` returns an :class:`AU_read` object, while a *mode* of ``'w'``
 | 
					
						
							|  |  |  |    or ``'wb'`` returns an :class:`AU_write` object.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. function:: openfp(file, mode)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  |    A synonym for :func:`.open`, maintained for backwards compatibility.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-10 11:38:25 -05:00
										 |  |  |    .. deprecated-removed:: 3.7 3.9
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  | The :mod:`sunau` module defines the following exception:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. exception:: Error
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    An error raised when something is impossible because of Sun AU specs or
 | 
					
						
							|  |  |  |    implementation deficiency.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  | The :mod:`sunau` module defines the following data items:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. 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
 | 
					
						
							|  |  |  | ---------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  | AU_read objects, as returned by :func:`.open` above, have the following methods:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_read.close()
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Close the stream, and make the instance unusable. (This is  called automatically
 | 
					
						
							|  |  |  |    on deletion.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_read.getnchannels()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-19 14:37:57 -06:00
										 |  |  |    Returns number of audio channels (1 for mono, 2 for stereo).
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. 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()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-04 00:43:03 +03:00
										 |  |  |    Returns a :func:`~collections.namedtuple` ``(nchannels, sampwidth,
 | 
					
						
							|  |  |  |    framerate, nframes, comptype, compname)``, equivalent to output of the
 | 
					
						
							|  |  |  |    :meth:`get\*` methods.
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_read.readframes(n)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-23 20:43:56 -04:00
										 |  |  |    Reads and returns at most *n* frames of audio, as a :class:`bytes` object.  The data
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  |    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
 | 
					
						
							|  |  |  | ----------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 15:02:41 +00:00
										 |  |  | AU_write objects, as returned by :func:`.open` above, have the following methods:
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_write.setnchannels(n)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Set the number of channels.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_write.setsampwidth(n)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Set the sample width (in bytes.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-10 21:02:53 +02:00
										 |  |  |    .. versionchanged:: 3.4
 | 
					
						
							|  |  |  |       Added support for 24-bit samples.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. 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*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 14:01:31 +02:00
										 |  |  |    .. versionchanged:: 3.4
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  |       Any :term:`bytes-like object` is now accepted.
 | 
					
						
							| 
									
										
										
										
											2013-11-16 14:01:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. method:: AU_write.writeframes(data)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Write audio frames and make sure *nframes* is correct.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-16 14:01:31 +02:00
										 |  |  |    .. versionchanged:: 3.4
 | 
					
						
							| 
									
										
										
										
											2014-03-15 21:13:56 -07:00
										 |  |  |       Any :term:`bytes-like object` is now accepted.
 | 
					
						
							| 
									
										
										
										
											2013-11-16 14:01:31 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-15 14:28:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. 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`.
 | 
					
						
							|  |  |  | 
 |