
    /;ji`                     v   d Z dZddlZddlZddlmZmZmZ ddl	m
Z ddlmZ 	 eZn# e$ r eZY nw xY wddd	d
ddddddd
Zi ddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=	Zi d>dd?dd@d	dAd
dBddCddDddEddFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWi dXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdyZddzd{d|d}Zi dd?dd?dd?dd?dd?dd?d d?d"d?d$d?d&dDd(dDd*d?d,dfd.d?d0d?d2d?d~d?d?d?d?dFdhd?d?dxdZdddddZddddZ	 ej        dk    rddlmZ d e            z   dz   Znej        dk    riddlmZ ddlmZ  e            d         dk    rdZn e            d         dk    rdZnk e d!                     e             e                                ej        dk    r&ddlmZ  e            dv rdZnd e            z   dz   Zn e d          ddl"Z"ej#        $                    e"j%                  Z&ej#        '                    e&e          Z( ej)        e(          Z*n# e e+e,f$ r 	  ed          Z-e- e d           ej)        e-          Z*n# e $ r ej        dk    rdZ.nej        dk    rdZ.nej        dk    rdZ.n ddlmZ ej        dk    rV e            dk    rHej#        /                    d          rdndZ0 ej)        ej#        '                    e0e.                    Z*n ej)        e.          Z*Y nw xY wY nw xY w ej1        e*2                                          3                    dd          Z4e45                    d          re4 e6d          d         Z4	 	 	 ddZ7	 	 ddZ8	 	 	 	 ddZ9 G d de:          Z;ddZ<d Z=ddZ>ddZ?d Z@ G d de:          ZAddZBd ZCd ZDd ZEd ZFd ZGe*jH        fdZId ZJd ZKd ZL G d deM          ZN G d deNeO          ZP G d deP          ZQdS )ak  python-soundfile is an audio library based on libsndfile, CFFI and NumPy.

Sound files can be read or written directly using the functions
`read()` and `write()`.
To read a sound file in a block-wise fashion, use `blocks()`.
Alternatively, sound files can be opened as `SoundFile` objects.

For further information, see https://python-soundfile.readthedocs.io/.

z0.13.1    N)SEEK_SETSEEK_CURSEEK_END)find_library)ffi                        	      )
title	copyrightsoftwareartistcommentdatealbumlicensetracknumbergenreWAVi   AIFFi   AUi   RAWi   PAFi   SVXi   NISTi   VOCi   IRCAMi  
 W64i   MAT4i   MAT5i   PVFi   XIi   HTKi   SDSi   AVRi   i   i   i   i   i   i    i  ! i  " i  # )	WAVEXSD2FLACCAFWVEOGGMPC2KRF64MP3PCM_S8PCM_16PCM_24PCM_32PCM_U8FLOATDOUBLEULAWALAW   	IMA_ADPCM   MS_ADPCM   GSM610    	VOX_ADPCM!   NMS_ADPCM_16"   NMS_ADPCM_24#   NMS_ADPCM_32$   G721_320   G723_241   G723_402   DWVW_12@   DWVW_16A   DWVW_24B   DWVW_NC   DPCM_8P   DPCM_16Q   VORBIS`   OPUSd   ALAC_16p   ALAC_20q   ALAC_24r   ALAC_32s   MPEG_LAYER_I   MPEG_LAYER_II   MPEG_LAYER_III   i   i    i   0)FILELITTLEBIGCPUr-   )r.   r/   r0   r1   r2   r3   r4   r5   doublefloatintshort)float64float32int32int16)CONSTANTAVERAGEVARIABLEdarwin)machinelibsndfile_z.dylibwin32)architecture64bitzlibsndfile_x64.dll32bitzlibsndfile_x86.dllz%no packaged library for Windows {} {}linux)aarch64
aarch64_bearmv8barmv8lzlibsndfile_arm64.soz.soz%no packaged library for this platformsndfilez8sndfile library not found using ctypes.util.find_libraryzlibsndfile.dylibzlibsndfile.dllzlibsndfile.soarm64z/opt/homebrew/lib/z/usr/local/lib/utf-8replacezlibsndfile-rz   FTc           
          t          | d||	|||
|          5 }|                    |||          }|                    |||||          }ddd           n# 1 swxY w Y   ||j        fS )a  Provide audio data from a sound file as NumPy array.

    By default, the whole file is read from the beginning, but the
    position to start reading can be specified with *start* and the
    number of frames to read can be specified with *frames*.
    Alternatively, a range can be specified with *start* and *stop*.

    If there is less data left in the file than requested, the rest of
    the frames are filled with *fill_value*.
    If no *fill_value* is specified, a smaller array is returned.

    Parameters
    ----------
    file : str or int or file-like object
        The file to read from.  See `SoundFile` for details.
    frames : int, optional
        The number of frames to read. If *frames* is negative, the whole
        rest of the file is read.  Not allowed if *stop* is given.
    start : int, optional
        Where to start reading.  A negative value counts from the end.
    stop : int, optional
        The index after the last frame to be read.  A negative value
        counts from the end.  Not allowed if *frames* is given.
    dtype : {'float64', 'float32', 'int32', 'int16'}, optional
        Data type of the returned array, by default ``'float64'``.
        Floating point audio data is typically in the range from
        ``-1.0`` to ``1.0``.  Integer data is in the range from
        ``-2**15`` to ``2**15-1`` for ``'int16'`` and from ``-2**31`` to
        ``2**31-1`` for ``'int32'``.

        .. note:: Reading int values from a float file will *not*
            scale the data to [-1.0, 1.0). If the file contains
            ``np.array([42.6], dtype='float32')``, you will read
            ``np.array([43], dtype='int32')`` for ``dtype='int32'``.

    Returns
    -------
    audiodata : `numpy.ndarray` or type(out)
        A two-dimensional (frames x channels) NumPy array is returned.
        If the sound file has only one channel, a one-dimensional array
        is returned.  Use ``always_2d=True`` to return a two-dimensional
        array anyway.

        If *out* was specified, it is returned.  If *out* has more
        frames than available in the file (or if *frames* is smaller
        than the length of *out*) and no *fill_value* is given, then
        only a part of *out* is overwritten and a view containing all
        valid frames is returned.
    samplerate : int
        The sample rate of the audio file.

    Other Parameters
    ----------------
    always_2d : bool, optional
        By default, reading a mono sound file will return a
        one-dimensional array.  With ``always_2d=True``, audio data is
        always returned as a two-dimensional array, even if the audio
        file has only one channel.
    fill_value : float, optional
        If more frames are requested than available in the file, the
        rest of the output is be filled with *fill_value*.  If
        *fill_value* is not specified, a smaller array is returned.
    out : `numpy.ndarray` or subclass, optional
        If *out* is specified, the data is written into the given array
        instead of creating a new array.  In this case, the arguments
        *dtype* and *always_2d* are silently ignored!  If *frames* is
        not given, it is obtained from the length of *out*.
    samplerate, channels, format, subtype, endian, closefd
        See `SoundFile`.

    Examples
    --------
    >>> import soundfile as sf
    >>> data, samplerate = sf.read('stereo_file.wav')
    >>> data
    array([[ 0.71329652,  0.06294799],
           [-0.26450912, -0.38874483],
           ...
           [ 0.67398441, -0.11516333]])
    >>> samplerate
    44100

    rN)	SoundFile_prepare_readread
samplerate)fileframesstartstopdtype	always_2d
fill_valueoutr   channelsformatsubtypeendianclosefdfdatas                   C/root/voice-cloning/.venv/lib/python3.11/site-packages/soundfile.pyr   r      s    l 
4j(FFG
5 
5 A89f55vvfeY
C@@A A A A A A A A A A A A A A A s   1AAAc	                     ddl }	|	                    |          }|j        dk    rd}
n|j        d         }
t	          | d||
||||||
  
        5 }|                    |           ddd           dS # 1 swxY w Y   dS )a  Write data to a sound file.

    .. note:: If *file* exists, it will be truncated and overwritten!

    Parameters
    ----------
    file : str or int or file-like object
        The file to write to.  See `SoundFile` for details.
    data : array_like
        The data to write.  Usually two-dimensional (frames x channels),
        but one-dimensional *data* can be used for mono files.
        Only the data types ``'float64'``, ``'float32'``, ``'int32'``
        and ``'int16'`` are supported.

        .. note:: The data type of *data* does **not** select the data
                  type of the written file. Audio data will be
                  converted to the given *subtype*. Writing int values
                  to a float file will *not* scale the values to
                  [-1.0, 1.0). If you write the value ``np.array([42],
                  dtype='int32')``, to a ``subtype='FLOAT'`` file, the
                  file will then contain ``np.array([42.],
                  dtype='float32')``.

    samplerate : int
        The sample rate of the audio data.
    subtype : str, optional
        See `default_subtype()` for the default value and
        `available_subtypes()` for all possible values.

    Other Parameters
    ----------------
    format, endian, closefd, compression_level, bitrate_mode
        See `SoundFile`.

    Examples
    --------
    Write 10 frames of random data to a new file:

    >>> import numpy as np
    >>> import soundfile as sf
    >>> sf.write('stereo_file.wav', np.random.randn(10, 2), 44100, 'PCM_24')

    r   Nr   w)numpyasarrayndimshaper   write)r   r   r   r   r   r   r   compression_levelbitrate_modenpr   r   s               r   r   r   8  s    Z ::dDyA~~:a=	4j(FFG$l
4 
4 78	                 s   A00A47A4c           
   #      K   t          | d|
|||||          5 }|                    |||          }|                    |||||||	          D ]}|V  	 ddd           dS # 1 swxY w Y   dS )a8  Return a generator for block-wise reading.

    By default, iteration starts at the beginning and stops at the end
    of the file.  Use *start* to start at a later position and *frames*
    or *stop* to stop earlier.

    If you stop iterating over the generator before it's exhausted,
    the sound file is not closed. This is normally not a problem
    because the file is opened in read-only mode. To close the file
    properly, the generator's ``close()`` method can be called.

    Parameters
    ----------
    file : str or int or file-like object
        The file to read from.  See `SoundFile` for details.
    blocksize : int
        The number of frames to read per block.
        Either this or *out* must be given.
    overlap : int, optional
        The number of frames to rewind between each block.

    Yields
    ------
    `numpy.ndarray` or type(out)
        Blocks of audio data.
        If *out* was given, and the requested frames are not an integer
        multiple of the length of *out*, and no *fill_value* was given,
        the last block will be a smaller view into *out*.

    Other Parameters
    ----------------
    frames, start, stop
        See `read()`.
    dtype : {'float64', 'float32', 'int32', 'int16'}, optional
        See `read()`.
    always_2d, fill_value, out
        See `read()`.
    samplerate, channels, format, subtype, endian, closefd
        See `SoundFile`.

    Examples
    --------
    >>> import soundfile as sf
    >>> for block in sf.blocks('stereo_file.wav', blocksize=1024):
    >>>     pass  # do something with 'block'

    r   N)r   r   blocks)r   	blocksizeoverlapr   r   r   r   r   r   r   r   r   r   r   r   r   r   blocks                     r   r   r   q  s      f 
4j(FFG
5 
5 89f55XXi&#Y
CA A 	 	EKKKK	                 s   :A!!A%(A%c                   4    e Zd ZdZd Zed             Zd ZdS )_SoundFileInfozInformation about a SoundFilec                    || _         t          |          5 }|j        | _        |j        | _        |j        | _        |j        | _        t          | j                  |j        z  | _        |j        | _        |j	        | _	        |j
        | _
        |j        | _        |j        | _        |j        | _        |j        | _        d d d            d S # 1 swxY w Y   d S N)verboser   namer   r   r   rw   durationr   r   r   format_infosubtype_infosections
extra_info)selfr   r   r   s       r   __init__z_SoundFileInfo.__init__  s    t__ 	+DIlDOJDM(DK!$+..q|;DM(DK9DL(DK }D !DJDMlDO	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   B&C

CCc                 >   t          | j        d          \  }}t          |d          \  }}|dk    rd                    |||          }nS|dk    rd                    ||          }n6|dk    rd                    | j                  }nd                    |          }|S )Ni  <   r   z{0:.0g}:{1:02.0g}:{2:05.3f} hz{0:02.0g}:{1:05.3f} minz{0:d} samplesz	{0:.3f} s)divmodr   r   r   )r   hoursrestminutessecondsr   s         r   _duration_strz_SoundFileInfo._duration_str  s    T]D11t!$++A::6==eWgVVHH\\077IIHH\\&--dk::HH"))'22H    c                     d                     g d          }| j        r|d                     g d          z  }d                     | j                            d                    }|                    | |          S )N
)z{0.name}zsamplerate: {0.samplerate} Hzzchannels: {0.channels}zduration: {0._duration_str}z$format: {0.format_info} [{0.format}]z'subtype: {0.subtype_info} [{0.subtype}])z
endian: {0.endian}zsections: {0.sections}zframes: {0.frames}zextra_info: """z
    {1}"""z
    )joinr   r   splitr   )r   infoindented_extra_infos      r   __repr__z_SoundFileInfo.__repr__  s    yy8 8 89 9 < 	 DII       D  *//0E0Ed0K0KLL{{4!4555r   N)__name__
__module____qualname____doc__r   propertyr   r    r   r   r   r     sS        ''+ + +    X6 6 6 6 6r   r   c                 "    t          | |          S )zReturns an object with information about a `SoundFile`.

    Parameters
    ----------
    verbose : bool
        Whether to print additional information.
    )r   )r   r   s     r   r   r     s     $(((r   c                  d    t          t          t          j        t          j                            S )a  Return a dictionary of available major formats.

    Examples
    --------
    >>> import soundfile as sf
    >>> sf.available_formats()
    {'FLAC': 'FLAC (FLAC Lossless Audio Codec)',
     'OGG': 'OGG (OGG Container format)',
     'WAV': 'WAV (Microsoft)',
     'AIFF': 'AIFF (Apple/SGI)',
     ...
     'WAVEX': 'WAVEX (Microsoft)',
     'RAW': 'RAW (header-less)',
     'MAT5': 'MAT5 (GNU Octave 2.1 / Matlab 5.0)'}

    )dict_available_formats_helper_sndSFC_GET_FORMAT_MAJOR_COUNTSFC_GET_FORMAT_MAJORr   r   r   available_formatsr     s3    " )$*I*.*CE E F F Fr   c                      t          t          j        t          j                  }t	           fd|D                       S )ad  Return a dictionary of available subtypes.

    Parameters
    ----------
    format : str
        If given, only compatible subtypes are returned.

    Examples
    --------
    >>> import soundfile as sf
    >>> sf.available_subtypes('FLAC')
    {'PCM_24': 'Signed 24 bit PCM',
     'PCM_16': 'Signed 16 bit PCM',
     'PCM_S8': 'Signed 8 bit PCM'}

    c              3   J   K   | ]\  }}t          |          ||fV  d S r   )check_format).0r   r   r   s      r   	<genexpr>z%available_subtypes.<locals>.<genexpr>  sJ       D DMGT>\&'%B%B> $!>>>D Dr   )r   r   SFC_GET_FORMAT_SUBTYPE_COUNTSFC_GET_FORMAT_SUBTYPEr   )r   subtypess   ` r   available_subtypesr      sb    " ))J)-)DF FH D D D DX D D D D D Dr   c                 p    	 t          t          | ||                    S # t          t          f$ r Y dS w xY w)zCheck if the combination of format/subtype/endian is valid.

    Examples
    --------
    >>> import soundfile as sf
    >>> sf.check_format('WAV', 'PCM_24')
    True
    >>> sf.check_format('FLAC', 'VORBIS')
    False

    F)bool_format_int
ValueError	TypeError)r   r   r   s      r   r   r     sH    K88999	"   uus     55c                 x    t          |            t                              |                                           S )zReturn the default subtype for a given format.

    Examples
    --------
    >>> import soundfile as sf
    >>> sf.default_subtype('WAV')
    'PCM_16'
    >>> sf.default_subtype('MAT5')
    'DOUBLE'

    )_check_format_default_subtypesgetupper)r   s    r   default_subtyper   )  s.     &  000r   c                      e Zd ZdZ	 	 	 d>dZ ed           Z	  ed           Z	  ed           Z	  ed	           Z		  ed
           Z
	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	  ed           Z	 ed             ZdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z e!fd Z"d! Z#	 	 d?d%Z$d@d&Z%d' Z&d( Z'd) Z(	 	 dAd+Z)dBd,Z*d- Z+d. Z,d/ Z-d0 Z.d1 Z/d2 Z0d3 Z1d4 Z2d5 Z3d6 Z4d7 Z5d8 Z6d9 Z7d: Z8d; Z9d< Z:d= Z;dS )Cr   zA sound file.

    For more documentation see the __init__() docstring (which is also
    used for the online documentation (https://python-soundfile.readthedocs.io/).

    r   NTc           	         t          |d          r|                                n|}|| _        |t          |dd          }t	          |          }|| _        |	| _        |
| _        t          |||||||          | _	        | 
                    |||          | _        t          |                              d          r)|                                 r|                     d           t                               | j        t           j        t&          j        t           j                   | j        =|                     | j                   | j        |                     | j                   dS dS dS )a  Open a sound file.

        If a file is opened with `mode` ``'r'`` (the default) or
        ``'r+'``, no sample rate, channels or file format need to be
        given because the information is obtained from the file. An
        exception is the ``'RAW'`` data format, which always requires
        these data points.

        File formats consist of three case-insensitive strings:

        * a *major format* which is by default obtained from the
          extension of the file name (if known) and which can be
          forced with the format argument (e.g. ``format='WAVEX'``).
        * a *subtype*, e.g. ``'PCM_24'``. Most major formats have a
          default subtype which is used if no subtype is specified.
        * an *endian-ness*, which doesn't have to be specified at all in
          most cases.

        A `SoundFile` object is a *context manager*, which means
        if used in a "with" statement, `close()` is automatically
        called when reaching the end of the code block inside the "with"
        statement.

        Parameters
        ----------
        file : str or int or file-like object
            The file to open.  This can be a file name, a file
            descriptor or a Python file object (or a similar object with
            the methods ``read()``/``readinto()``, ``write()``,
            ``seek()`` and ``tell()``).
        mode : {'r', 'r+', 'w', 'w+', 'x', 'x+'}, optional
            Open mode.  Has to begin with one of these three characters:
            ``'r'`` for reading, ``'w'`` for writing (truncates *file*)
            or ``'x'`` for writing (raises an error if *file* already
            exists).  Additionally, it may contain ``'+'`` to open
            *file* for both reading and writing.
            The character ``'b'`` for *binary mode* is implied because
            all sound files have to be opened in this mode.
            If *file* is a file descriptor or a file-like object,
            ``'w'`` doesn't truncate and ``'x'`` doesn't raise an error.
        samplerate : int
            The sample rate of the file.  If `mode` contains ``'r'``,
            this is obtained from the file (except for ``'RAW'`` files).
        channels : int
            The number of channels of the file.
            If `mode` contains ``'r'``, this is obtained from the file
            (except for ``'RAW'`` files).
        subtype : str, sometimes optional
            The subtype of the sound file.  If `mode` contains ``'r'``,
            this is obtained from the file (except for ``'RAW'``
            files), if not, the default value depends on the selected
            `format` (see `default_subtype()`).
            See `available_subtypes()` for all possible subtypes for
            a given `format`.
        endian : {'FILE', 'LITTLE', 'BIG', 'CPU'}, sometimes optional
            The endian-ness of the sound file.  If `mode` contains
            ``'r'``, this is obtained from the file (except for
            ``'RAW'`` files), if not, the default value is ``'FILE'``,
            which is correct in most cases.
        format : str, sometimes optional
            The major format of the sound file.  If `mode` contains
            ``'r'``, this is obtained from the file (except for
            ``'RAW'`` files), if not, the default value is determined
            from the file extension.  See `available_formats()` for
            all possible values.
        closefd : bool, optional
            Whether to close the file descriptor on `close()`. Only
            applicable if the *file* argument is a file descriptor.
        compression_level : float, optional
            The compression level on 'write()'. The compression level
            should be between 0.0 (minimum compression level) and 1.0
            (highest compression level).
            See `libsndfile document <https://github.com/libsndfile/libsndfile/blob/c81375f070f3c6764969a738eacded64f53a076e/docs/command.md>`__.
        bitrate_mode : {'CONSTANT', 'AVERAGE', 'VARIABLE'}, optional
            The bitrate mode on 'write()'. 
            See `libsndfile document <https://github.com/libsndfile/libsndfile/blob/c81375f070f3c6764969a738eacded64f53a076e/docs/command.md>`__.

        Examples
        --------
        >>> from soundfile import SoundFile

        Open an existing file for reading:

        >>> myfile = SoundFile('existing_file.wav')
        >>> # do something with myfile
        >>> myfile.close()

        Create a new sound file for reading and writing using a with
        statement:

        >>> with SoundFile('new_file.wav', 'x+', 44100, 2) as myfile:
        >>>     # do something with myfile
        >>>     # ...
        >>>     assert not myfile.closed
        >>>     # myfile.close() is called automatically at the end
        >>> assert myfile.closed

        
__fspath__Nmodezr+r   )hasattrr   _namegetattr_check_mode_mode_compression_level_bitrate_mode_create_info_struct_info_open_fileset
issupersetseekableseekr   
sf_commandSFC_SET_CLIPPING_ffiNULLSF_TRUE_set_compression_level_set_bitrate_mode)r   r   r   r   r   r   r   r   r   r   r   mode_ints               r   r   zSoundFile.__init__A  s\   N %,D,$?$?It   T
<4..Dt$$
"3)(tZ)/&B B
ZZh88
t99%% 	$--// 	IIaLLL
D$949	& 	& 	& ".''(?@@@!-&&t'9:::::	 /. .-r   c                     | j         S r   )r   r   s    r   <lambda>zSoundFile.<lambda>       r   c                     | j         S r   )r   r  s    r   r  zSoundFile.<lambda>  r  r   c                     | j         j        S r   )r  r   r  s    r   r  zSoundFile.<lambda>  s    tz'< r   c                     | j         j        S r   r  r   r  s    r   r  zSoundFile.<lambda>  s    4:#4 r   c                     | j         j        S r   )r  r   r  s    r   r  zSoundFile.<lambda>      TZ%8 r   c                 N    t          | j        j        t          j        z            S r   )_format_strr  r   r   SF_FORMAT_TYPEMASKr  s    r   r  zSoundFile.<lambda>  s    [!2T5L!LMM r   c                 N    t          | j        j        t          j        z            S r   )r  r  r   r   SF_FORMAT_SUBMASKr  s    r   r  zSoundFile.<lambda>      [!2T5K!KLL r   c                 N    t          | j        j        t          j        z            S r   )r  r  r   r   SF_FORMAT_ENDMASKr  s    r   r  zSoundFile.<lambda>  r   r   c                 Z    t          | j        j        t          j        z            d         S Nr   )_format_infor  r   r   r  r  s    r   r  zSoundFile.<lambda>  s*    \$*"3"&"9#: ; ;;<> r   c                 Z    t          | j        j        t          j        z            d         S r$  )r%  r  r   r   r  r  s    r   r  zSoundFile.<lambda>  s*    \$*"3"&"8#9 : ::;= r   c                     | j         j        S r   )r  r   r  s    r   r  zSoundFile.<lambda>  r  r   c                     | j         d u S r   )r  r  s    r   r  zSoundFile.<lambda>  s    4:#5 r   c                 @    t                               | j                  S r   )r   sf_errorr  r  s    r   r  zSoundFile.<lambda>  s    t}}TZ'@'@ r   c                     | j         S r   )r   r  s    r   r  zSoundFile.<lambda>  s	    d.E r   c                     | j         S r   )r   r  s    r   r  zSoundFile.<lambda>  s	    ); r   c                     t          j        dd          }t                              | j        t          j        |t          j        |                     t          j        |                              dd          S )z8Retrieve the log string generated when opening the file.zchar[]i @  r   r   )	r  newr   r	  r  SFC_GET_LOG_INFOsizeofstringdecode)r   r   s     r   r   zSoundFile.extra_info  sc     x%((
D$9dk$//	1 	1 	1{4  '';;;r   c                     | j         d                    | j                   nd}|| j        d                    | j                  ndz  }d                    | |          S )Nz, compression_level={0} z, bitrate_mode='{0}'zSoundFile({0.name!r}, mode={0.mode!r}, samplerate={0.samplerate}, channels={0.channels}, format={0.format!r}, subtype={0.subtype!r}, endian={0.endian!r}{1}))r   r   r   )r   compression_settings     r   r   zSoundFile.__repr__  sz    "&"8"D  9??@VWWWJL 	#'#4#@ !7 = =d>O P P PFH	J* +1&7J*K*K	Mr   c                 .    |                                   d S r   closer  s    r   __del__zSoundFile.__del__      

r   c                     | S r   r   r  s    r   	__enter__zSoundFile.__enter__  s    r   c                 .    |                                   d S r   r7  )r   argss     r   __exit__zSoundFile.__exit__  r:  r   c                    |t           v rc|                                  t                              | j        t           |         |                                          }t          |           dS t                              | ||           dS )z:Write text meta-data in the sound file through properties.N)	
_str_types_check_if_closedr   sf_set_stringr  encode_error_checkobject__setattr__)r   r   valueerrs       r   rG  zSoundFile.__setattr__  s|    :!!###$$TZD1A%*\\^^5 5CtT511111r   c                 .   |t           v rk|                                  t                              | j        t           |                   }|r(t          j        |                              dd          ndS t          d	                    |                    )z9Read text meta-data in the sound file through properties.r   r   r4  z)'SoundFile' object has no attribute {0!r})
rA  rB  r   sf_get_stringr  r  r1  r2  AttributeErrorr   )r   r   r   s      r   __getattr__zSoundFile.__getattr__  s    :!!###%%dj*T2BCCDCGO4;t$$++GY???RO ;BB4HHJ J Jr   c                     | j         j        S r   r  r  s    r   __len__zSoundFile.__len__  s     z  r   c                     dS )NTr   r  s    r   __bool__zSoundFile.__bool__  s	     tr   c                 *    |                                  S r   )rQ  r  s    r   __nonzero__zSoundFile.__nonzero__"  s     }}r   c                 6    | j         j        t          j        k    S )z)Return True if the file supports seeking.)r  r  r   r  r  s    r   r  zSoundFile.seekable'  s    z"dl22r   c                     |                                   t                              | j        ||          }t	          | j                   |S )a  Set the read/write position.

        Parameters
        ----------
        frames : int
            The frame index or offset to seek.
        whence : {SEEK_SET, SEEK_CUR, SEEK_END}, optional
            By default (``whence=SEEK_SET``), *frames* are counted from
            the beginning of the file.
            ``whence=SEEK_CUR`` seeks from the current position
            (positive and negative values are allowed for *frames*).
            ``whence=SEEK_END`` seeks from the end (use negative value
            for *frames*).

        Returns
        -------
        int
            The new absolute read/write position in frames.

        Examples
        --------
        >>> from soundfile import SoundFile, SEEK_END
        >>> myfile = SoundFile('stereo_file.wav')

        Seek to the beginning of the file:

        >>> myfile.seek(0)
        0

        Seek to the end of the file:

        >>> myfile.seek(0, SEEK_END)
        44100  # this is the file length

        )rB  r   sf_seekr  rE  
_errorcode)r   r   whencepositions       r   r  zSoundFile.seek+  sC    H 	<<
FF;;T_%%%r   c                 8    |                      dt                    S )z'Return the current read/write position.r   )r  r   r  s    r   tellzSoundFile.tellT  s    yyH%%%r   r   rz   Fc                 2   |.|                      ||          }|                     |||          }n(|dk     s|t          |          k    rt          |          }|                     d||          }t          |          |k    r||d|         }n|||d<   |S )a  Read from the file and return data as NumPy array.

        Reads the given number of frames in the given data format
        starting at the current read/write position.  This advances the
        read/write position by the same number of frames.
        By default, all frames from the current read/write position to
        the end of the file are returned.
        Use `seek()` to move the current read/write position.

        Parameters
        ----------
        frames : int, optional
            The number of frames to read. If ``frames < 0``, the whole
            rest of the file is read.
        dtype : {'float64', 'float32', 'int32', 'int16'}, optional
            Data type of the returned array, by default ``'float64'``.
            Floating point audio data is typically in the range from
            ``-1.0`` to ``1.0``. Integer data is in the range from
            ``-2**15`` to ``2**15-1`` for ``'int16'`` and from
            ``-2**31`` to ``2**31-1`` for ``'int32'``.

            .. note:: Reading int values from a float file will *not*
                scale the data to [-1.0, 1.0). If the file contains
                ``np.array([42.6], dtype='float32')``, you will read
                ``np.array([43], dtype='int32')`` for
                ``dtype='int32'``.

        Returns
        -------
        audiodata : `numpy.ndarray` or type(out)
            A two-dimensional NumPy (frames x channels) array is
            returned. If the sound file has only one channel, a
            one-dimensional array is returned. Use ``always_2d=True``
            to return a two-dimensional array anyway.

            If *out* was specified, it is returned. If *out* has more
            frames than available in the file (or if *frames* is
            smaller than the length of *out*) and no *fill_value* is
            given, then only a part of *out* is overwritten and a view
            containing all valid frames is returned.

        Other Parameters
        ----------------
        always_2d : bool, optional
            By default, reading a mono sound file will return a
            one-dimensional array. With ``always_2d=True``, audio data
            is always returned as a two-dimensional array, even if the
            audio file has only one channel.
        fill_value : float, optional
            If more frames are requested than available in the file,
            the rest of the output is be filled with *fill_value*. If
            *fill_value* is not specified, a smaller array is
            returned.
        out : `numpy.ndarray` or subclass, optional
            If *out* is specified, the data is written into the given
            array instead of creating a new array. In this case, the
            arguments *dtype* and *always_2d* are silently ignored! If
            *frames* is not given, it is obtained from the length of
            *out*.

        Examples
        --------
        >>> from soundfile import SoundFile
        >>> myfile = SoundFile('stereo_file.wav')

        Reading 3 frames from a stereo file:

        >>> myfile.read(3)
        array([[ 0.71329652,  0.06294799],
               [-0.26450912, -0.38874483],
               [ 0.67398441, -0.11516333]])
        >>> myfile.close()

        See Also
        --------
        buffer_read, .write

        Nr   r   )_check_frames_create_empty_arraylen	_array_io)r   r   r   r   r   r   s         r   r   zSoundFile.readX  s    ` ;''
;;F**69eDDCCzzVc#hh..SV44s88f!'6'l)FGG
r   c                    |                      |d          }|                     |          }t          j        |dz   || j        z            }|                     d|||          }||k    sJ t          j        |          S )a  Read from the file and return data as buffer object.

        Reads the given number of *frames* in the given data format
        starting at the current read/write position.  This advances the
        read/write position by the same number of frames.
        By default, all frames from the current read/write position to
        the end of the file are returned.
        Use `seek()` to move the current read/write position.

        Parameters
        ----------
        frames : int, optional
            The number of frames to read. If ``frames < 0``, the whole
            rest of the file is read.
        dtype : {'float64', 'float32', 'int32', 'int16'}
            Audio data will be converted to the given data type.

        Returns
        -------
        buffer
            A buffer containing the read data.

        See Also
        --------
        buffer_read_into, .read, buffer_write

        N)r   z[]r   )r]  _check_dtyper  r.  r   	_cdata_iobuffer)r   r   r   ctypecdataread_framess         r   buffer_readzSoundFile.buffer_read  s    8 ##Ft#<<!!%((v'=>>nnVUE6BBf$$$${5!!!r   c                     |                      |          }|                     ||          \  }}|                     d|||          }|S )a  Read from the file into a given buffer object.

        Fills the given *buffer* with frames in the given data format
        starting at the current read/write position (which can be
        changed with `seek()`) until the buffer is full or the end
        of the file is reached.  This advances the read/write position
        by the number of frames that were read.

        Parameters
        ----------
        buffer : writable buffer
            Audio frames from the file are written to this buffer.
        dtype : {'float64', 'float32', 'int32', 'int16'}
            The data type of *buffer*.

        Returns
        -------
        int
            The number of frames that were read from the file.
            This can be less than the size of *buffer*.
            The rest of the buffer is not filled with meaningful data.

        See Also
        --------
        buffer_read, .read

        r   )rb  _check_bufferrc  )r   rd  r   re  rf  r   s         r   buffer_read_intozSoundFile.buffer_read_into  sL    8 !!%((**6599vuf==r   c                     ddl }|                    |          }|                     d|t          |                    }|t          |          k    sJ |                     |           dS )a  Write audio data from a NumPy array to the file.

        Writes a number of frames at the read/write position to the
        file. This also advances the read/write position by the same
        number of frames and enlarges the file if necessary.

        Note that writing int values to a float file will *not* scale
        the values to [-1.0, 1.0). If you write the value
        ``np.array([42], dtype='int32')``, to a ``subtype='FLOAT'``
        file, the file will then contain ``np.array([42.],
        dtype='float32')``.

        Parameters
        ----------
        data : array_like
            The data to write. Usually two-dimensional (frames x
            channels), but one-dimensional *data* can be used for mono
            files. Only the data types ``'float64'``, ``'float32'``,
            ``'int32'`` and ``'int16'`` are supported.

            .. note:: The data type of *data* does **not** select the
                  data type of the written file. Audio data will be
                  converted to the given *subtype*. Writing int values
                  to a float file will *not* scale the values to
                  [-1.0, 1.0). If you write the value ``np.array([42],
                  dtype='int32')``, to a ``subtype='FLOAT'`` file, the
                  file will then contain ``np.array([42.],
                  dtype='float32')``.

        Examples
        --------
        >>> import numpy as np
        >>> from soundfile import SoundFile
        >>> myfile = SoundFile('stereo_file.wav')

        Write 10 frames of random data to a new file:

        >>> with SoundFile('stereo_file.wav', 'w', 44100, 2, 'PCM_24') as f:
        >>>     f.write(np.random.randn(10, 2))

        See Also
        --------
        buffer_write, .read

        r   Nr   )r   ascontiguousarrayr`  r_  _update_frames)r   r   r   writtens       r   r   zSoundFile.write  sr    \ 	 ##D))..$D		::#d))####G$$$$$r   c                     |                      |          }|                     ||          \  }}|                     d|||          }||k    sJ |                     |           dS )a  Write audio data from a buffer/bytes object to the file.

        Writes the contents of *data* to the file at the current
        read/write position.
        This also advances the read/write position by the number of
        frames that were written and enlarges the file if necessary.

        Parameters
        ----------
        data : buffer or bytes
            A buffer or bytes object containing the audio data to be
            written.
        dtype : {'float64', 'float32', 'int32', 'int16'}
            The data type of the audio data stored in *data*.

        See Also
        --------
        .write, buffer_read

        r   N)rb  rj  rc  rn  )r   r   r   re  rf  r   ro  s          r   buffer_writezSoundFile.buffer_write0  sr    * !!%((**477v..%??&    G$$$$$r   r   c           	   #     K   ddl }d| j        vrd| j        vrt          d          |                     ||          }|?|t	          d          ||nt          ||          }	|                     |	||          }d}
n"|t	          d          t          |          }d	}
d}|dk    r|d}nt          |          }||d|<   t          ||z
  |          }|                     ||||||d                    |r1||	                    || d                   }n|| d         |dd<   |||z   k    r||d||z            }n|}|
r|	                    |          n|V  ||z  }|dk    dS dS )
a  Return a generator for block-wise reading.

        By default, the generator yields blocks of the given
        *blocksize* (using a given *overlap*) until the end of the file
        is reached; *frames* can be used to stop earlier.

        Parameters
        ----------
        blocksize : int
            The number of frames to read per block. Either this or *out*
            must be given.
        overlap : int, optional
            The number of frames to rewind between each block.
        frames : int, optional
            The number of frames to read.
            If ``frames < 0``, the file is read until the end.
        dtype : {'float64', 'float32', 'int32', 'int16'}, optional
            See `read()`.

        Yields
        ------
        `numpy.ndarray` or type(out)
            Blocks of audio data.
            If *out* was given, and the requested frames are not an
            integer multiple of the length of *out*, and no
            *fill_value* was given, the last block will be a smaller
            view into *out*.


        Other Parameters
        ----------------
        always_2d, fill_value, out
            See `read()`.
        fill_value : float, optional
            See `read()`.
        out : `numpy.ndarray` or subclass, optional
            If *out* is specified, the data is written into the given
            array instead of creating a new array. In this case, the
            arguments *dtype* and *always_2d* are silently ignored!

        Examples
        --------
        >>> from soundfile import SoundFile
        >>> with SoundFile('stereo_file.wav') as f:
        >>>     for block in f.blocks(blocksize=1024):
        >>>         pass  # do something with 'block'

        r   Nr   +z*blocks() is not allowed in write-only modez)One of {blocksize, out} must be specifiedTz-Only one of {blocksize, out} may be specifiedF)
r   r   SoundFileRuntimeErrorr]  r   minr^  r_  r   copy)r   r   r   r   r   r   r   r   r   out_sizecopy_outoverlap_memoryoutput_offsettoreadr   s                  r   r   zSoundFile.blocksK  s     d 	diCty$8$8'(TUUU##FJ77;  KLLL$.$:yyIv@V@VH**8YFFCHH$CE E ECIHqjj% ! #N 3 3&4N]N#]2F;;FIIfeY
C<OPPP 7!)%'WWS'^%<%<NN(+WHIIN111%6G+++
0B-Vg--.$,7"''%...%777fF+ qjjjjjjr   c                 N   ||                                  }t                              | j        t          j        t          j        d|          t          j        d                    }|r/t                              | j                  }t          |d          || j
        _        dS )an  Truncate the file to a given number of frames.

        After this command, the read/write position will be at the new
        end of the file.

        Parameters
        ----------
        frames : int, optional
            Only the data before *frames* is kept, the rest is deleted.
            If not specified, the current read/write position is used.

        Nzsf_count_t*
sf_count_tzError truncating the file)r[  r   r	  r  SFC_FILE_TRUNCATEr  r.  r0  r*  LibsndfileErrorr  r   )r   r   rI  s      r   truncatezSoundFile.truncate  s     >YY[[Foodj$*@"h}f=="k,779 9  	D--
++C!#'BCCC"
r   c                 l    |                                   t                              | j                   dS )aj  Write unwritten data to the file system.

        Data written with `write()` is not immediately written to
        the file system but buffered in memory to be written at a later
        time.  Calling `flush()` makes sure that all changes are
        actually written to the file system.

        This has no effect on files opened in read-only mode.

        N)rB  r   sf_write_syncr  r  s    r   flushzSoundFile.flush  s2     	4:&&&&&r   c                     | j         sK|                                  t                              | j                  }d| _        t          |           dS dS )z.Close the file.  Can be called multiple times.N)closedr  r   sf_closer  rE  )r   rI  s     r   r8  zSoundFile.close  sQ    { 	JJLLL--
++CDJ	 	r   c                    t          |t          t          f          r+t          j                            |          rd| j        v r't          d                    | j	                            t          | j                                      d          r>t          j        t          j        |t          j        t          j        z                       t           j        }t          |t                    rCt$          j        dk    rt           j        }n&|                    t%          j                              } |||| j                  }nt          |t0                    r#t                               ||| j        |          }nwt5          ||          r@t                               |                     |          || j        t:          j                  }n't?          d                    | j	                            |t:          j        k    rCt                                |          }tC          |d                    | j	                            |t           j"        k    rd| j        _#        |S )	z9Call the appropriate sf_open*() function from libsndfile.xzFile exists: {0!r}zw+r   zInvalid file: {0!r}zError opening {0!r}: prefixr   )$
isinstance_unicodebytes_ospathisfiler   OSErrorr   r   r  r  r8  openO_WRONLYO_TRUNCr   sf_open_sysplatformsf_wchar_openrD  getfilesystemencodingr  rx   
sf_open_fd_has_virtual_io_attrssf_open_virtual_init_virtual_ior  r  r   r*  r  	SFM_WRITEr   )r   r   r  r   openfunctionfile_ptrrI  s          r   r  zSoundFile._open  s   dXu-.. 	Ext$$ J$)##!"6"="=di"H"HIII^^..t44 JIchtS\CK-GHHIII<L$)) E=G++#'#5LL;;t'A'C'CDDD#|D(DJ??HHc"" 	EtXtz7KKHH"422 	E++D,A,A$,G,G,4dj$)M MHH 188CCDDDty  --))C!#.E.L.LTY.W.WXXXXt~%% !"DJ r   c                    t          j        d          fd            }t          j        d          fd            }t          j        d          fd            }t          j        d          fd            }t          j        d	          fd
            }|||||d| _        t          j        d| j                  S )z4Initialize callback functions for sf_open_virtual().sf_vio_get_filelenc                                                      }                    dt                                                      }                    |t                     |S Nr   )r[  r  r   r   )	user_datacurrsizer   s      r   vio_get_filelenz3SoundFile._init_virtual_io.<locals>.vio_get_filelen  sJ    99;;DIIa"""99;;DIIdH%%%Kr   sf_vio_seekc                 X                         | |                                           S r   )r  r[  )offsetrX  r  r   s      r   vio_seekz,SoundFile._init_virtual_io.<locals>.vio_seek  s%    IIff%%%99;;r   sf_vio_readc                     	 t          j        | |          }                    |          }nP# t          $ rC                     |          }t          |          }t          j        | |          }||d|<   Y nw xY w|S r  )r  rd  readintorL  r   r_  )ptrcountr  buf	data_readr   r   s         r   vio_readz,SoundFile._init_virtual_io.<locals>.vio_read
  s    (k#u-- MM#..		! ( ( (yy''II	k#y11#'AiK   	(
 s   *. A
A;:A;sf_vio_writec                 x    t          j        | |          }|d d          }                    |          }||}|S r   )r  rd  r   )r  r  r  r  r   ro  r   s         r   	vio_writez-SoundFile._init_virtual_io.<locals>.vio_write  sA    +c5))Cqqq6Djj&&GNr   sf_vio_tellc                 ,                                     S r   )r[  )r  r   s    r   vio_tellz,SoundFile._init_virtual_io.<locals>.vio_tell!  s    99;;r   )get_filelenr  r   r   r[  zSF_VIRTUAL_IO*)r  callback_virtual_ior.  )r   r   r  r  r  r  r  s    `     r   r  zSoundFile._init_virtual_io  s*   	+	,	,	 	 	 	 
-	,	 
}	%	%	 	 	 	 
&	%	 
}	%	%
	 
	 
	 
	 
&	%
	 
~	&	&	 	 	 	 
'	&	 
}	%	%	 	 	 	 
&	%	 ,;$,$,%.$,	. . x($*:;;;r   c                     t           S )zReturn all attributes used in __setattr__ and __getattr__.

        This is useful for auto-completion (e.g. IPython).

        )rA  r  s    r   _getAttributeNameszSoundFile._getAttributeNames.  s
     r   c                 2    | j         rt          d          dS )zCheck if the file is closed and raise an error if it is.

        This should be used in every method that uses self._file.

        zI/O operation on closed fileN)r  rt  r  s    r   rB  zSoundFile._check_if_closed6  s*     ; 	H'(FGGG	H 	Hr   c                     |                                  r-| j        |                                 z
  }|dk     s||k    r||}n|dk     rt          d          |S )z8Reduce frames to no more than are available in the file.r   Nz/frames must be specified for non-seekable files)r  r   r[  r   )r   r   r   remaining_framess       r   r]  zSoundFile._check_frames?  se    ==?? 	P#{TYY[[8zzf'777(0)aZZNOOOr   c                 ,   |t                                           v sJ t          |t                    st	          j        |          }t          t          |          | j        t	          j	        |          z            \  }}|rt          d          ||fS )z1Convert buffer to cdata and check for valid size.z*Data size must be a multiple of frame size)
_ffi_typesvaluesr  r  r  from_bufferr   r_  r   r0  r   )r   r   re  r   	remainders        r   rj  zSoundFile._check_bufferJ  s    
))++++++$&& 	*#D))D"3t99#'=4;u3E3E#EG G	 	KIJJJV|r   c                 n    ddl }|s| j        dk    r
|| j        f}n|f}|                    ||d          S )z-Create an empty array with appropriate shape.r   Nr   C)order)r   r   empty)r   r   r   r   r   r   s         r   r^  zSoundFile._create_empty_arrayU  sO     	))DM)EEGExxuCx000r   c           	          	 t           |         S # t          $ rH t          d                    t	          t                                                     |                    w xY w)z7Check if dtype string is valid and return ctype string.z(dtype must be one of {0!r} and not {1!r})r  KeyErrorr   r   sortedkeys)r   r   s     r   rb  zSoundFile._check_dtype^  si    	3e$$ 	3 	3 	3GNNz(())52 2 3 3 3	3s
    AA!c                 b   |j         dvr5t          d                    |j        |j         dk     rdnd                    |j         dk    rdn|j        d         }|| j        k    r.t          d                    |j        | j        |                    |j        j        st          d          |                     |j        j	                  }|j        j
        t          j        |          k    sJ t          j        |dz   |j        d	         d
                   }|                     ||||          S )z+Check array and call low-level IO function.)r   r	   zInvalid shape: {0!r} ({1})r   z0 dimensions not supportedztoo many dimensionsz5Invalid shape: {0!r} (Expected {1} channels, got {2})zData must be C-contiguous*r   r   )r   r   r   r   r   flagsc_contiguousrb  r   r   itemsizer  r0  cast__array_interface__rc  )r   actionarrayr   array_channelsre  rf  s          r   r`  zSoundFile._array_iof  sJ   :U""9@@nsnx{|n|n|NjNj  CX  Y  Y  Z  Z  Z#jAoo5;q>T]**T[[\a\gimiv  yG  H  H  I  I  I{' 	:8999!!%+"233{#t{5'9'99999	%#+u'@'H'KLL~~feUF;;;r   c                    |t                                           v sJ |                                  |                                 r|                                 }t          t          d|z   dz   |z             } || j        ||          }t          | j	                   |                                 r| 
                    ||z   t                     |S )z.Call one of libsndfile's read/write functions.sf_f_)r  r  rB  r  r[  r   r   r  rE  rW  r  r   )r   r  r   re  r   r  funcs          r   rc  zSoundFile._cdata_iot  s    
))++++++==?? 	99;;DtUV^d2U:;;dj$//T_%%%==?? 	/IIdVmX...r   c                    |                                  rV|                                 }|                     dt                    | j        _        |                     |t                     dS | j        xj        |z  c_        dS )z!Update self.frames after writing.r   N)r  r[  r  r   r  r   r   )r   ro  r  s      r   rn  zSoundFile._update_frames  sm    ==?? 	)99;;D $		!X 6 6DJIIdH%%%%%J(r   c                 b   |dk    r#|                                  st          d          |dk    r|t          d          t          ||                              | j                  \  }}}||k     r|}|dk     r||z
  }|                                  r|                     |t                     |S )z)Seek to start frame and calculate length.r   z(start is only allowed for seekable filesNz&Only one of {frames, stop} may be used)r  r   r   sliceindicesr   r  r   )r   r   r   r   _s        r   r   zSoundFile._prepare_read  s    A::dmmoo:GHHHQ;;4+DEEEud++33DK@@tQ%<<DA::E\F==?? 	'IIeX&&&r   c                     i }t                                           D ]R\  }}t                              | j        |          }|r+t          j        |                              dd          ||<   S|S )a5  Get all metadata present in this SoundFile

        Returns
        -------

        metadata: dict[str, str]
            A dict with all metadata. Possible keys are: 'title', 'copyright',
            'software', 'artist', 'comment', 'date', 'album', 'license',
            'tracknumber' and 'genre'.
        r   r   )rA  itemsr   rK  r  r  r1  r2  )r   strsstrtypestridr   s        r   copy_metadatazSoundFile.copy_metadata  ss     (..00 	M 	MNGU%%dj%88D M $D 1 1 8 8) L LWr   c                 d   |t           v sJ t          j        d          }t           |         |d<   t                              | j        t          j        |t          j        |                    }|t          j        k    r2t          	                    | j                  }t          |d|           dS )z,Call libsndfile's set bitrate mode function.zint[1]r   zError set bitrate mode N)_bitrate_modesr  r.  r   r	  r  SFC_SET_BITRATE_MODEr0  r  r*  r  )r   r   pointer_bitrate_moderI  s       r   r  zSoundFile._set_bitrate_mode  s    ~----#x11"0">Qoodj$*CEY[_[fg{[|[|}}$,--
++C!#'O'O'OPPP r   c                 t   d|cxk    rdk    sn t          d          t          j        d          }||d<   t                              | j        t          j        |t          j        |                    }|t          j        k    r2t          	                    | j                  }t          |d|           dS )z1Call libsndfile's set compression level function.r   r   z)Compression level must be in range [0..1]z	double[1]zError set compression level N)r   r  r.  r   r	  r  SFC_SET_COMPRESSION_LEVELr0  r  r*  r  )r   r   pointer_compression_levelrI  s       r   r  z SoundFile._set_compression_level  s    &++++!++++HIII$(H[$9$9!'8!!$oodj$*HJceiep  rK  fL  fL  M  M$,--
++C!#'YFW'Y'YZZZ r   )	r   NNNNNTNN)r   rz   FNN)r   N)Nr   r   rz   FNNr   )<r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  rW  r   r   r   r  r   r9  r<  r?  rG  rM  rO  rQ  rS  r  r   r  r[  r   rh  rk  r   rq  r   r  r  r8  r  r  r  rB  r]  rj  r^  rb  r`  rc  rn  r   r  r  r  r   r   r   r   r   9  sD         BFAE6:}; }; }; };~ 8++,,D*8++,,D7<<==J,X4455F1x8899H3XMMO OF-hLLN NG4XLLN NF8(	> 	>? ?K ?8	= 	=> >L :x8899H3X5566F2@@AAJ' !E!EFF,8;;<<L'< < X< EM M M      2 2 2J J J! ! !
  
  
3 3 3 #+ ' ' ' 'R& & & :?"&\ \ \ \|!" !" !" !"F  B4% 4% 4%l% % %6 BK59[ [ [ [z# # # #0' ' '  " " "H1< 1< 1<f  H H H	 	 		 	 	1 1 13 3 3< < <  ) ) )     $	Q 	Q 	Q
[ 
[ 
[ 
[ 
[r   r   r4  c                 4    | dk    rt          | |          dS )z+Raise LibsndfileError if there is an error.r   r  N)r  )rI  r  s     r   rE  rE    s%    
axxc&1111 xr   c                    t          |           }|4t          |           }|"t          d                    |                     n>t	          |t
          t          f          s"t          d                    |                    	 |t          |                                         z  }n0# t          $ r# t          d                    |                    w xY w|d}n>t	          |t
          t          f          s"t          d                    |                    	 |t          |                                         z  }n0# t          $ r# t          d                    |                    w xY wt          j        d          }||_        d	|_        t                              |          t          j        k    rt          d
          |S )z8Return numeric ID for given format|subtype|endian combo.Nz)No default subtype for major format {0!r}zInvalid subtype: {0!r}zUnknown subtype: {0!r}rr   zInvalid endian-ness: {0!r}zUnknown endian-ness: {0!r}SF_INFO*r   z1Invalid combination of format, subtype and endian)r   r   r   r   r  r  str	_subtypesr   r  r   _endiansr  r.  r   r   sf_format_checkSF_FALSE)r   r   r   resultr   s        r   r   r     s   6""F!&))?;BB6JJL L L  (C11 B077@@AAAC)GMMOO,, C C C188AABBBC~300 E4;;FCCDDDF(6<<>>** F F F5<<VDDEEEF 8JDDKDMD!!T]22?A A 	AMs   "B( (-C"D? ?-E,c                    t          | t          t          f          s"t          d                    |                     t          |           }|                    d          s t          |           t          |          k    r"t          d                    |                     t          |	                    d                    dk    rt          d          d|v rt          j        }nd|v rt          j        }nt          j        }|S )z=Check if mode is valid and return its integer representation.zInvalid mode: {0!r}zxrwb+xrwr   z&mode must contain exactly one of 'xrw'rs  r   )r  r  r  r   r   r  
differencer_  r   intersectionr   SFM_RDWRSFM_READr  )r   mode_setr  s      r   r   r     s    dXsO,, <-44T::;;;4yyH7## =s4yy3x=='@'@.55d;;<<<
8  ''((A--ABBB
h=	=>Or   c                    |}|/t          | |          }t          |t          t          f          sJ nt	          |           t          j        d          }d|vs|                                dk    rG|t          d          ||_	        |t          d          ||_
        t          |||          |_        n-t          d |||||fD                       rt          d          |S )	z*Check arguments and create SF_INFO struct.Nr  r   r   zsamplerate must be specifiedzchannels must be specifiedc              3      K   | ]}|d uV  	d S r   r   )r   args     r   r   z&_create_info_struct.<locals>.<genexpr>  s>       I I3s$ I I I I I Ir   z\Not allowed for existing files (except 'RAW'): samplerate, channels, format, subtype, endian)_get_format_from_filenamer  r  r  r   r  r.  r   r   r   r   r   r   any)	r   r   r   r   r   r   r   original_formatr   s	            r   r  r    s#    O~*466&8S/222222f8JD
$&,,..E11:;;;$8999 !&'6:: I IHow+H I I I I I 	M L M M MKr   c                 X   d}t          | d|           } 	 t          j                            |           d         dd         }|                    dd          }n# t
          $ r Y nw xY w|                                t          vr&d|vr"t          d		                    |                     |S )
a  Return a format string obtained from file (or file.name).

    If file already exists (= read mode), an empty string is returned on
    error.  If not, an exception is raised.
    The return type will always be str or unicode (even if
    file/file.name is a bytes object).

    r4  r   r   r   Nr   r   r   zGNo format specified and unable to get format from file extension: {0!r})
r   r  r  splitextr2  	Exceptionr   _formatsr   r   )r   r   r   s      r   r  r    s     F4&&D""4((,QRR0w	22   ||~~X%%#T// 006t> > 	>Ms   AA 
A&%A&c                     t           t          t          fD ](}|                                D ]\  }}|| k    r|c c S )dS )z;Return the string representation of a given numeric format.zn/a)r	  r  r  r  )
format_int
dictionarykvs       r   r  r  1  s^    	83  
$$&& 	 	DAqJ 	 ur   c                 8   t          j        d          }| |_        t                              t           j        ||t          j        d                     |j        }t          |j                  |r(t          j	        |          
                    dd          ndfS )z6Return the ID and short description of a given format.zSF_FORMAT_INFO*SF_FORMAT_INFOr   r   r4  )r  r.  r   r   r	  r  r0  r   r  r1  r2  )r  format_flagr   r   s       r   r%  r%  ;  s    (,--K#KOODI{KK 0113 3 3D*++<@HDK$$Wi888bJ Jr   c              #      K   t          j        d          }t                              t           j        | |t          j        d                     t          |d                   D ]}t          ||          V  dS )z8Helper for available_formats() and available_subtypes().zint*rx   r   N)r  r.  r   r	  r  r0  ranger%  )
count_flagr  r  r  s       r   r   r   F  su      HVEOODIz5$+e2D2DEEEE!Hoo 4 4
:{3333334 4r   c                 $   t          | t          t          f          s"t          d                    |                     	 t
          |                                          }n0# t          $ r# t          d                    |                     w xY w|S )z4Check if `format_str` is valid and return format ID.zInvalid format: {0!r}zUnknown format: {0!r})	r  r  r  r   r   r	  r   r  r   )
format_strr  s     r   r   r   N  s    j8S/22 D/66zBBCCCEj..001

 E E E077
CCDDDEs    A   -Bc           	          |t           j        k    }|t           j        k    }t          t	          | d          t	          | d          t	          | d          p|t	          | d          pt	          | d          p|g          S )z>Check if file has all the necessary attributes for virtual IO.r  r[  r   r   r  )r   r  r  allr   )r   r  readonly	writeonlys       r   r  r  Y  s~    4=(HDN*Iffg*(fGz!:!:Gi	   r   c                       e Zd ZdZdS )SoundFileErrorz-Base class for all soundfile-specific errors.Nr   r   r   r   r   r   r   r  r  e  s        77Dr   r  c                       e Zd ZdZdS )rt  zKsoundfile module runtime error.

    Errors that used to be `RuntimeError`.Nr  r   r   r   rt  rt  i  s        . . 	Dr   rt  c                   6    e Zd ZdZddZed             Zd ZdS )r  zjlibsndfile errors.


    Attributes
    ----------
    code
        libsndfile internal error number.
    r4  c                 Z    t                               | ||           || _        || _        d S r   )rt  r   coder  )r   r!  r  s      r   r   zLibsndfileError.__init__x  s,    &&tT6:::	r   c                     | j         rGt                              | j                   }t          j        |                              dd          S dS )zRaw libsndfile error message.r   r   z'(Garbled error message from libsndfile))r!  r   sf_error_numberr  r1  r2  )r   err_strs     r   error_stringzLibsndfileError.error_string}  sK     9 	=**4955G;w''..w	BBB
 =<r   c                      | j         | j        z   S r   )r  r%  r  s    r   __str__zLibsndfileError.__str__  s    {T...r   Nr4  )r   r   r   r   r   r   r%  r'  r   r   r   r  r  o  s\            
 	= 	= X	=/ / / / /r   r  )r   r   Nrz   FNNNNNNNT)NNNTNN)Nr   r   r   Nrz   FNNNNNNNT)Fr   )NNr(  )Rr   __version__osr  sysr  r   r   r   ctypes.utilr   _find_library
_soundfiler   r  unicoder  	NameErrorr  rA  r	  r  r  r   r  r  r  r   _machine_packaged_libnamer   _architecturer  r   _soundfile_datar  dirname__file___pathr   
_full_pathdlopenr   ImportErrorr   _libname_explicit_libnameisdir_hbrew_pathr1  sf_version_stringr2  __libsndfile_version__
startswithr_  r   r   r   rF  r   r   r   r   r   r   r   rE  r   r   r  r  r  SFC_GET_FORMAT_INFOr%  r   r   r  r  r  RuntimeErrorrt  r  r   r   r   <module>rD     sf
  	 	          + + + + + + + + + + 5 5 5 5 5 5 " " " " " "HH   HHH
  
	X
X 	X 
X	
 
X 
X X 
X X 
X X X 
X 	X 
X  
X!" 
X#$ 5  :#f#f# f# f	#
 f# f# f# f# f# f# f# f# f# f# f#  f!#" f## #$ f%#& f'#( f)#* f+#, f-#. f/#0 f1#2 f3#4 f5#6 f7#8 f9#: f;#< f=#> f?#@ fA#B fC#D fE# #	L 	 	X
X 	X
 
X 
X X 
X X 
X X X 
X 	Y 
X  
X!" 
X#$ X%& 5   < 	 
  :2}  000000)HHJJ6A	'	!	!::::::000000
 =??1(( 4]__Q7** 4'A!6--//88::>>@ @ @	'	!	!0000008::FFF 5 -

 :U Bg=>>>H_566Eu&788J4;z""DDi( 2 2 22 =++'TUUUt{8$$ 2 2 2=H$$ 2]g%% 0]g%% / 	100000=H$$w)>)>25(..AU2V2V '..& 4;sx}}[:KLLMMDD4;011D'228 %T%;%;%=%=>>EEgyYY $$]33 I3CC4F4F4G4GH JO>B9=Z Z Z Zz EI=A6 6 6 6r FJBF%);?8 8 8 8v16 16 16 16 16V 16 16 16h) ) ) )F F F*D D D D.   $1 1 1 I[ I[ I[ I[ I[ I[ I[ I[X2 2 2 2  @  &  6  0   *.)A J J J J4 4 4  	 	 		 	 	 	 	Y 	 	 		 	 	 	 	NL 	 	 	/ / / / /+ / / / / /sD   ' 11D I" "M+(JMB'L>;M=L>>MM