
    P3j             '          U d Z dZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZmZmZmZ ddlZddlmZ dd	lmZ eez  ez  ej<                  e   z  Zee d
<   ejB                  e"edf   ejF                  ejH                  ejJ                  z  ejL                  z  ejN                  z     f   Z(ee d<   ejB                  e"eef   ejF                  ejH                  ejJ                  z  ejL                  z  ejN                  z     f   Z)ee d<   ed   Z*ee d<   ee d<   ee d<   ddddddddddd
Z+ee,eef      e d<   i ddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdI	Z-ee,eef      e dJ<   i dKddLddMddNddOddPddQddRddSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcddi dedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddZ.ee,eef      e d<   dddddZ/ee,eef      e d<   i ddLd dLd"dLd&dLd(dLd*dLd,dLd.dLd0dLd2dQd4dQd6dLd8dsd:dLd<dLd>dLddLdLdLdLdSdudLdLddZ0ee,eef      e d<   dddddZ1ee,eef      e d<   ddddZ2ee,eef      e d<   	 ejf                  dk(  rddl3m4Z5 d e5       z   dz   Z6n~ejf                  dk(  r8ddl7Z8 e8jr                         Z:e:dk(  rdZ6nRe:dk(  rdZ6nJe:dk(  rdZ6nB e;de:       ejf                  dk(  r ddl3m4Z5  e5       dv rdZ6nd e5       z   dz   Z6n e;d      ddl<Z<ejz                  j}                  e<j~                        Z@ejz                  j                  e@e6      ZB ej                  eB      ZD ej                  eDj                               j                  dd      ZNeNj                  d      reN ePd      d ZN	 	 	 	 ddededededz  de*deQdeRdz  de(e)z  dz  dedz  dedz  dedz  dedz  dedz  deQde"e(e)z  ef   fdZS	 	 	 	 ddede(dededz  dedz  dedz  deQdeRdz  dedz  ddfdńZT	 	 	 	 	 	 	 	 ddededz  dededededz  de*deQdeRdz  de(e)z  dz  dedz  dedz  dedz  dedz  dedz  deQde	e(ddf   e	e)ddf   z  f"dȄZU G dɄ dʫ      ZVddedeQdeVfd̄ZWde,eef   fd̈́ZXddedz  de,eef   fd΄ZY	 	 ddededz  dedz  deQfdτZZdededz  fdЄZ[ G dф dҫ      Z\ddӄZ]dԄ Z^dՄ Z_dք Z`dׄ Zad؄ ZbeDj                  fdلZddڄ Zedۄ Zfd܄ Zg G d݄ deh      Zi G d߄ deiej      Zk G d dek      Zly# e;eEeFf$ r 	  ed      ZGeG e;d       ej                  eG      ZDn# e;$ r ejf                  dk(  rdZHn%ejf                  dk(  rdZHnejf                  dk(  rdZHn ddl3m4Z5 ejf                  dk(  rV e5       dk(  rLejz                  j                  d      rdndZJ ej                  ejz                  j                  eJeH            ZDn ej                  eH      ZDY nw xY wY w xY w)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.14.0    N)	Generator)find_library)SEEK_CURSEEK_ENDSEEK_SET)AnyBinaryIOFinalLiteral	TypeAlias)Self)ffiFileDescriptorOrPath.	AudioDataAudioData_2d)float64float32int32int16	dtype_str_snd_ffi                        	      )
title	copyrightsoftwareartistcommentdatealbumlicensetracknumbergenre
_str_types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_formats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   	_subtypesi   i    i   0)FILELITTLEBIGCPU_endiansr?   )r@   rA   rB   rC   rD   rE   rF   rG   _default_subtypesdoublefloatintshort
_ffi_types)CONSTANTAVERAGEVARIABLE_bitrate_modesdarwin)machinelibsndfile_z.dylibwin32z	win-arm64zlibsndfile_arm64.dllz	win-amd64zlibsndfile_x64.dllz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-fileframesstartstopdtype	always_2d
fill_valueout
sampleratechannelsformatsubtypeendianclosefdreturnc           
          t        | d||	|||
|      5 }|j                  |||      }|j                  |||||      }ddd       j                  fS # 1 sw Y   xY w)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readr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   fdatas                   6/DATA/.local/lib/python3.12/site-packages/soundfile.pyr   r      sj    p 
4j(FFG
589f5vvfeY
C@
5 	
5 
5s   )AAr   compression_levelbitrate_modec	                     ddl }	|	j                  |      }|j                  dk(  rd}
n|j                  d   }
t	        | d||
||||||
      5 }|j                  |       ddd       y# 1 sw Y   yxY w)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   r   r   npr   r   s               r   r   r   A  so    ` ::dDyyA~::a=	4j(FFG$l
478	
4 
4 
4s   A&&A/	blocksizeoverlapc           
   #      K   t        | d|
|||||      5 }|j                  |||      }|j                  |||||||	      E d{    ddd       y7 # 1 sw Y   yxY ww)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   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                    r   r   r   |  sq     n 
4j(FFG
589f588Iwy*VYZZZ
5 
5 	[
5 
5s.   A.AAA	AAAAc                   ,    e Zd ZdZd Zed        Zd Zy)_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        y # 1 sw Y   y xY wN)verboser   namer   r   r   r   durationr   r   r   format_infosubtype_infosections
extra_info)selfr   r   r   s       r   __init__z_SoundFileInfo.__init__  s    $t_)*DI#$<<DO!"DM xxDK#(#5all#BDM xxDK !		DL xxDK$%MMD%&^^D!"DM#$<<DO __s   C#C??Dc                     t        | j                  d      \  }}t        |d      \  }}|dk\  r|dd|dd|dd}|S |dk\  r|dd|dd	}|S |dk  r| j                  d
d}|S |dd}|S )Ni  <   r   z.0g:z02.0gz05.3fz hz mindz samplesz.3fz s)divmodr   r   )r   hoursrestminutessecondsr   s         r   _duration_strz_SoundFileInfo._duration_str  s    T]]D1t!$+A:Age_Age_BGH  \!%'%=H
 	 \++a1H  "#b)H    c                    dj                  | j                   d| j                   dd| j                   d| j                   d| j
                   d| j                   dd	| j                   d| j                   dg      }| j                  rnd
j                  | j                  j                  d            }|dj                  d| j                   d| j                   d| j                   dd| dg      z  }|S )N
zsamplerate: z Hzz
channels: z
duration: zformat: z []z	subtype: z
    z	
endian: z
sections: zframes: zextra_info: """z    z""")joinr   r   r   r   r   r   r   r   r   r   splitr   r   r   )r   infoindented_extra_infos      r   __repr__z_SoundFileInfo.__repr__  s   yy		{DOO,C0$--)$,,-.(()DKK=:**+2dll^1=?@ <<#-"3"3DOO4I4I$4O"PDIIdkk]+dmm_-DKK=)"+,C0	23 3D r   N)__name__
__module____qualname____doc__r   propertyr   r    r   r   r   r     s#    '0   r   r   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_helperr   SFC_GET_FORMAT_MAJOR_COUNTSFC_GET_FORMAT_MAJORr   r   r   available_formatsr     s-    " )$*I*I*.*C*CE F Fr   c                     t        t        j                  t        j                        }|D ci c]  \  }}| t	        | |      r|| c}}S c c}}w )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'}

    )r   r   SFC_GET_FORMAT_SUBTYPE_COUNTSFC_GET_FORMAT_SUBTYPEcheck_format)r   subtypesr   r   s       r   available_subtypesr     s]    " ))J)J)-)D)DFH/7 Dxmgt>\&'%B TMx D D Ds   Ac                 Z    	 t        t        | ||            S # t        t        f$ r Y y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   $  s2    K899	" s    **c                 ^    t        |        t        j                  | j                               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_formatr   getupper)r   s    r   default_subtyper  7  s#     &  00r   c                   &   e Zd ZdZ	 	 	 	 	 	 dPdededz  dedz  dedz  dedz  dedz  d	edz  d
ededz  dedz  ddf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efdZdQd Zdefd!Zd"e ddfd#Z!d$ed%e ddfd&Z"d$ede fd'Z#defd(Z$defd)Z%defd*Z&defd+Z'e(fd,ed-edefd.Z)defd/Z*	 	 	 dRd,ed0e+d1ed2edz  d3e,e-z  dz  de,e-z  fd4Z.dSd,ed0e+dz  de/fd5Z0d6e1e/z  e z  d0e+defd7Z2d8e,ddfd9Z3d8e4d0e+ddfd:Z5	 	 	 	 dTd;edz  d<ed,ed0e+d1ed2edz  d3e,e-z  dz  de6e,ddf   e6e-ddf   z  fd=Z7dUd,edz  ddfd>Z8dQd?Z9dQd@Z: e;jx                         Z=dA Z>dB Z?dC Z@dD ZAdE ZBdF ZCdG ZDdH ZEdI ZFdJ ZGdK ZHdL ZIdeJeef   fdMZKdN ZLdO ZMy)Vr   zA sound file.

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

    Nr   moder   r   r   r   r   r   r   r   r   c           	         t        |t        j                        rt        j                  |      }|| _        |t        |dd      }|t        d      t        |      }|| _        |	| _	        |
| _
        t        |||||||      | _        | j                  |||      | _        t        |      j!                  d      r!| j#                         r| j%                  d       t&        j)                  | j                  t&        j*                  t,        j.                  t&        j0                         | j                  D| j3                  | j                         | j                  | j5                  | j                         yyy)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

        Nr  z6Can not get `mode` from file. provided `mode` is None.zr+r   )
isinstance_osPathLikefspath_namegetattrr   _check_mode_mode_compression_level_bitrate_mode_create_info_struct_info_open_fileset
issupersetseekableseekr   
sf_commandSFC_SET_CLIPPINGr   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__O  s5   P dCLL)::d#D
<4.D| XYYt$
"3)(tZ)/&B
ZZh8
t9%$--/IIaL

D$9$9499	& "".''(?(?@!!-&&t'9'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    tzz'<'<r   c                 .    | j                   j                  S r   r  r   r!  s    r   r"  zSoundFile.<lambda>  s    4::#4#4r   c                 .    | j                   j                  S r   )r  r   r!  s    r   r"  zSoundFile.<lambda>      TZZ%8%8r   c                 b    t        | j                  j                  t        j                  z        S r   )_format_strr  r   r   SF_FORMAT_TYPEMASKr!  s    r   r"  zSoundFile.<lambda>  s    [!2!2T5L5L!LMr   c                 b    t        | j                  j                  t        j                  z        S r   )r+  r  r   r   SF_FORMAT_SUBMASKr!  s    r   r"  zSoundFile.<lambda>      [!2!2T5K5K!KLr   c                 b    t        | j                  j                  t        j                  z        S r   )r+  r  r   r   SF_FORMAT_ENDMASKr!  s    r   r"  zSoundFile.<lambda>  r/  r   c                 h    t        | j                  j                  t        j                  z        d   S Nr   )_format_infor  r   r   r,  r!  s    r   r"  zSoundFile.<lambda>  s+    \$**"3"3"&"9"9#: ;;<>r   c                 h    t        | j                  j                  t        j                  z        d   S r3  )r4  r  r   r   r.  r!  s    r   r"  zSoundFile.<lambda>  s+    \$**"3"3"&"8"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::#5r   c                 @    t         j                  | j                        S r   )r   sf_errorr  r!  s    r   r"  zSoundFile.<lambda>  s    t}}TZZ'@r   c                     | j                   S r   )r  r!  s    r   r"  zSoundFile.<lambda>  s
    d.E.Er   c                     | j                   S r   )r  r!  s    r   r"  zSoundFile.<lambda>  s
    ););r   c                     t        j                  dd      }t        j                  | j                  t        j
                  |t        j                  |             t        j                  |      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  sX     xx%(

D$9$9dkk$/	1{{4 '';;r   c                 >   | j                   d| j                    nd}|| j                  d| j                   dndz  }d| j                  d| j                  d| j                   d| j
                   d	| j                  d
| j                  d| j                  | dS )Nz, compression_level= z, bitrate_mode=''z
SoundFile(z, mode=z, samplerate=z, channels=z	, format=z
, subtype=z	, endian=))	r   r   r   r  r   r   r   r   r   )r   compression_settings     r   r   zSoundFile.__repr__  s    "&"8"8"D "6d6L6L5MNJL 	#'#4#4#@ #343D3D2EQ GFH	JTYYM >"oo.k$-- I++
4<<2B C++)<(=Q@ 	Ar   c                 $    | j                          y r   closer!  s    r   __del__zSoundFile.__del__      

r   c                     | S r   r   r!  s    r   	__enter__zSoundFile.__enter__  s    r   argsc                 $    | j                          y r   rH  )r   rN  s     r   __exit__zSoundFile.__exit__  rK  r   r   valuec                     |t         v rR| j                          t        j                  | j                  t         |   |j                               }t        |       yt        j                  | ||       y)z:Write text meta-data in the sound file through properties.N)	r-   _check_if_closedr   sf_set_stringr  encode_error_checkobject__setattr__)r   r   rQ  errs       r   rX  zSoundFile.__setattr__  sV    :!!#$$TZZD1A%*\\^5CtT51r   c                     |t         v r`| j                          t        j                  | j                  t         |         }|r%t        j                  |      j                  dd      S dS t        d|      )z9Read text meta-data in the sound file through properties.r   r   rC  z$'SoundFile' object has no attribute )	r-   rS  r   sf_get_stringr  r   r@  rA  AttributeError)r   r   r   s      r   __getattr__zSoundFile.__getattr__   sm    :!!#%%djj*T2BCDCG4;;t$++GY?ORO 6th?A Ar   c                 .    | j                   j                  S r   r'  r!  s    r   __len__zSoundFile.__len__*  s     zz   r   c                      y)NTr   r!  s    r   __bool__zSoundFile.__bool__/  s     r   c                 "    | j                         S r   )ra  r!  s    r   __nonzero__zSoundFile.__nonzero__4  s     }}r   c                 P    | j                   j                  t        j                  k(  S )z)Return True if the file supports seeking.)r  r  r   r  r!  s    r   r  zSoundFile.seekable9  s    zz""dll22r   r   whencec                     | j                          t        j                  | 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

        )rS  r   sf_seekr  rV  
_errorcode)r   r   re  positions       r   r  zSoundFile.seek=  s8    H 	<<

FF;T__%r   c                 .    | j                  dt              S )z'Return the current read/write position.r   )r  r   r!  s    r   tellzSoundFile.tellf  s    yyH%%r   r   r   r   r   c                     |&| j                  ||      }| j                  |||      }n|dk  s|t        |      kD  rt        |      }| j                  d||      }t        |      |kD  r||d| }|S |||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.readk  s    b ;''
;F**69eDCzVc#h.SV4s8f!'6l 
  *FG
r   c                     | j                  |d      }| j                  |      }t        j                  |dz   || j                  z        }| j                  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   )rm  _check_dtyper   r=  r   	_cdata_iobuffer)r   r   r   ctypecdataread_framess         r   buffer_readzSoundFile.buffer_read  sw    8 ##Ft#<!!%(v'=>nnVUE6Bf$$${{5!!r   rt  c                 z    | j                  |      }| j                  ||      \  }}| j                  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   )rr  _check_bufferrs  )r   rt  r   ru  rv  r   s         r   buffer_read_intozSoundFile.buffer_read_into  sC    8 !!%(**659vuf=r   r   c                     ddl }|j                  |      }| j                  d|t        |            }|t        |      k(  sJ | j	                  |       y)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   ascontiguousarrayrp  ro  _update_frames)r   r   r   writtens       r   r   zSoundFile.write  sP    \ 	 ##D)..$D	:#d)###G$r   c                     | j                  |      }| j                  ||      \  }}| j                  d|||      }||k(  sJ | j                  |       y)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)rr  rz  rs  r~  )r   r   r   ru  rv  r   r  s          r   buffer_writezSoundFile.buffer_writeE  sZ    * !!%(**47v..%?&   G$r   r   r   c           	   #   `  K   ddl }d| j                  vrd| j                  vrt        d      | j                  ||      }|3|t	        d      ||nt        ||      }	| j                  |	||      }d}
n|t	        d      t        |      }d	}
d}|dkD  r|d}nt        |      }||d| t        ||z
  |      }| j                  ||||||d        |r!||j                  || d       }n	|| d |dd |||z   kD  r|	|d||z    }n|}|
r|j                  |      n| ||z  }|dkD  ryyw)
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  SoundFileRuntimeErrorrm  r   minrn  ro  r   copy)r   r   r   r   r   r   r   r   r   out_sizecopy_outoverlap_memoryoutput_offsettoreadblocks                  r   r   zSoundFile.blocks`  s    h 	diiCtyy$8'(TUU##FJ7;  KLL$.$:yIv@VH**8YFCH$CE ECIHqj% ! #N 3&4N]#]2F;FIIfeY
C<OP!)%'WWS'^%<N(+WHIN1%6G++
0B-Vg-.$,"''%.%7fF+ qjs   D)D.,D.c                 R   || j                         }t        j                  | j                  t        j                  t        j                  d|      t        j                  d            }|r+t        j                  | j                        }t        |d      || j                  _        y)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)rk  r   r  r  SFC_FILE_TRUNCATEr   r=  r?  r9  LibsndfileErrorr  r   )r   r   rY  s      r   truncatezSoundFile.truncate  s{     >YY[Foodjj$*@*@"hh}f="kk,79 --

+C!#'BCC"

r   c                 b    | j                          t        j                  | j                         y)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)rS  r   sf_write_syncr  r!  s    r   flushzSoundFile.flush  s"     	4::&r   c                     | j                   sB| j                          t        j                  | j                        }d| _        t        |       yy)z.Close the file.  Can be called multiple times.N)closedr  r   sf_closer  rV  )r   rY  s     r   rI  zSoundFile.close  s8    {{JJL--

+CDJ r   c                 $    t        |t        t        f      rt        j                  j                  |      rd j                  v rt        d j                        t         j                        j                  d      rHt        j                  t        j                  |t        j                  t        j                  z               t        j                   }t        |t              rt"        j$                  dk(  rt        j&                  }nd|j)                  t#        j*                               }n@t        |t,              rfd}n*t/        ||      r fd}nt1        d j                         j2                  5   ||| j4                        }|t6        j8                  k(  r0t        j;                  |      }t=        |d j                  d	
      	 ddd       |t        j>                  k(  rd j4                  _         S # 1 sw Y   /xY w)z9Call the appropriate sf_open*() function from libsndfile.xzFile exists: zw+r   c                 4    t         j                  | ||      S r   )r   
sf_open_fd)r   r  r   r   s      r   r"  z!SoundFile._open.<locals>.<lambda>  s    hX\^e8fr   c                 n    t         j                  j                  |       ||t        j                        S r   )r   sf_open_virtual_init_virtual_ior   r  )r   r  r   r   s      r   r"  z!SoundFile._open.<locals>.<lambda>  s*    8L8LTMbMbcgMh,4dDII9Gr   zInvalid file: zError opening z: prefixNr   )!r  strbytesr  pathisfiler  OSErrorr   r  r  rI  openO_WRONLYO_TRUNCr   sf_open_sysplatformsf_wchar_openrU  getfilesystemencodingr   _has_virtual_io_attrsr   _sf_error_lockr  r   r  r9  r  	SFM_WRITEr   )r   r   r  r   openfunctionfile_ptrrY  s   `  `   r   r  zSoundFile._open  s|   dS%L)xxt$$))#!M$))"?@@^..t4IIchhtS\\CKK-GHI<<L$$==G+#'#5#5L;;t'A'A'CDDc"fL"42GL nTYYM:;;  #D(DJJ?H499$mmH-%cN499-r2RSS % !
 t~~% !"DJJ  ! s   ?AHH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                     j                         }j                  dt               j                         }j                  |t               |S Nr   )rk  r  r   r   )	user_datacurrsizer   s      r   vio_get_filelenz3SoundFile._init_virtual_io.<locals>.vio_get_filelen  s:    99;DIIa"99;DIIdH%Kr   sf_vio_seekc                 H    j                  | |       j                         S r   )r  rk  )offsetre  r  r   s      r   vio_seekz,SoundFile._init_virtual_io.<locals>.vio_seek$  s    IIff%99;r   sf_vio_readc                     	 t        j                  | |      }j                  |      }|S # t        $ r; j	                  |      }t        |      }t        j                  | |      }||d| Y |S w xY wr  )r   rt  readintor\  r   ro  )ptrcountr  buf	data_readr   r   s         r   vio_readz,SoundFile._init_virtual_io.<locals>.vio_read)  sx    (kk#u- MM#.	  " (yy'I	kk#y1#'Ai (s   ', A A0/A0sf_vio_writec                 h    t        j                  | |      }|d d  }j                  |      }||}|S r   )r   rt  r   )r  r  r  r  r   r  r   s         r   	vio_writez-SoundFile._init_virtual_io.<locals>.vio_write6  s9    ++c5)Cq6Djj&GNr   sf_vio_tellc                 $    j                         S r   )rk  )r  r   s    r   vio_tellz,SoundFile._init_virtual_io.<locals>.vio_tell@  s    99;r   )get_filelenr  r   r   rk  zSF_VIRTUAL_IO*)r   callback_virtual_ior=  )r   r   r  r  r  r  r  s    `     r   r  zSoundFile._init_virtual_io  s    	+	,	 
-	 
}	%	 
&	 
}	%
	 
&
	 
~	&	 
'	 
}	%	 
&	 ,;$,$,%.$,	. xx($*:*:;;r   c                     t         S )zReturn all attributes used in __setattr__ and __getattr__.

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

        )r-   r!  s    r   _getAttributeNameszSoundFile._getAttributeNamesM  s
     r   c                 2    | j                   rt        d      y)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  r  r!  s    r   rS  zSoundFile._check_if_closedU  s     ;;'(FGG r   c                     | j                         r-| j                  | j                         z
  }|dk  s||kD  r||}|S |dk  rt        d      |S )z8Reduce frames to no more than are available in the file.r   z/frames must be specified for non-seekable files)r  r   rk  r   )r   r   r   remaining_framess       r   rm  zSoundFile._check_frames^  s[    ==?#{{TYY[8zf'77(0)  aZNOOr   c                    |t         j                         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)r   valuesr  r  r   from_bufferr   ro  r   r?  r   )r   r   ru  r   	remainders        r   rz  zSoundFile._check_bufferi  sw    
))++++$&##D)D"3t9#'==4;;u3E#EG	IJJV|r   c                 x    ddl }|s| j                  dkD  r|| j                  f}n|f}|j                  ||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   rn  zSoundFile._create_empty_arrayt  s=    )DMM)EGExxuCx00r   c                     	 t         |   S # t        $ r- t        dt        t         j	                               d|      w xY w)z7Check if dtype string is valid and return ctype string.zdtype must be one of z	 and not )r   KeyErrorr   sortedkeys)r   r   s     r   rr  zSoundFile._check_dtype}  sM    	fe$$ 	f4VJOO<M5N4QQZ[`Zcdee	fs	    6Ac           	         |j                   dvr-t        d|j                  d|j                   dk  rdnd d      |j                   dk(  rdn|j                  d   }|| j                  k7  r)t        d|j                  d| j                   d	| d      |j                  j
                  st        d
      | j                  |j                  j                        }|j                  j                  t        j                  |      k(  sJ t        j                  |dz   |j                  d   d         }| j                  ||||      S )z+Check array and call low-level IO function.)r   r   zInvalid shape: z (r   z0 dimensions not supportedztoo many dimensionsrE  z (Expected z channels, got zData must be C-contiguous*r   r   )r   r   r   r   flagsc_contiguousrr  r   r   itemsizer   r?  cast__array_interface__rs  )r   actionarrayr   array_channelsru  rv  s          r   rp  zSoundFile._array_io  s4   ::U"u{{oR`e`j`jmn`n@\  uJ  @K  KL  M  N  N#jjAo5;;q>T]]*u{{o[Wfgufvvwxyy{{''899!!%++"2"23{{##t{{5'9999		%#+u'@'@'H'KL~~feUF;;r   c                 p   |t         j                         v sJ | j                          d}| j                         r| j	                         }t        t        d|z   dz   |z         } || j                  ||      }t        | j                         | j                         r| j                  ||z   t               |S )z.Call one of libsndfile's read/write functions.r   sf_f_)r   r  rS  r  rk  r  r   r  rV  rh  r  r   )r   r  r   ru  r   r  funcs          r   rs  zSoundFile._cdata_io  s    
))++++==?99;DtUV^d2U:;djj$/T__%==?IIdVmX.r   c                     | j                         rL| j                         }| j                  dt              | j                  _        | j                  |t               y| j                  xj
                  |z  c_        y)z!Update self.frames after writing.r   N)r  rk  r  r   r  r   r   )r   r  r  s      r   r~  zSoundFile._update_frames  sP    ==?99;D $		!X 6DJJIIdH%JJ(r   c                 *   |dk7  r| j                         st        d      |dk\  r|t        d      t        ||      j	                  | j
                        \  }}}||k  r|}|dk  r||z
  }| j                         r| j                  |t               |S )z)Seek to start frame and calculate length.r   z(start is only allowed for seekable filesz&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:dmmoGHHQ;4+DEEud+33DKK@tQ%<DA:E\F==?IIeX&r   c                     i }t         j                         D ]P  \  }}t        j                  | j                  |      }|s)t        j                  |      j                  dd      ||<   R |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   )r-   itemsr   r[  r  r   r@  rA  )r   strsstrtypestridr   s        r   copy_metadatazSoundFile.copy_metadata  s_     (..0NGU%%djj%8D $D 1 8 8) LW 1 r   c                 b   |t         v sJ t        j                  d      }t         |   |d<   t        j	                  | j
                  t        j                  |t        j                  |            }|t        j                  k7  r.t        j                  | j
                        }t        |d|       y)z,Call libsndfile's set bitrate mode function.zint[1]r   zError set bitrate mode N)r   r   r=  r   r  r  SFC_SET_BITRATE_MODEr?  r  r9  r  )r   r   pointer_bitrate_moderY  s       r   r  zSoundFile._set_bitrate_mode  s    ~---#xx1"0">Qoodjj$*C*CEY[_[f[fg{[|}$,,--

+C!#)@'OPP r   c                    d|cxk  rdk  st        d       t        d      t        j                  d      }||d<   t        j	                  | j
                  t        j                  |t        j                  |            }|t        j                  k7  r.t        j                  | j
                        }t        |d|       y)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_LEVELr?  r  r9  r  )r   r   pointer_compression_levelrY  s       r   r  z SoundFile._set_compression_level  s    &+!+HII ,HII$(HH[$9!'8!!$oodjj$*H*HJceiepep  rK  fL  M$,,--

+C!#)EFWEX'YZZ r   )	r   NNNNNTNN)r   N)r   FNN)r   N)Nr   r   r   FNNr   )Nr   r   r   r   r   r  r   r   r   r   r   r   r  r   r   r   r   r   r   r   r   r   r  rh  r   r   r   r  r   rJ  r   rM  r   rP  rX  r]  r_  ra  rc  r  r   r  rk  r   r   r   r   
memoryviewrx  	bytearrayr{  r   r  r  r   r   r  r  rI  
_threadingLockr  r  r  r  rS  rm  rz  rn  rr  rp  rs  r~  r   r   r  r  r  r   r   r   r   r   G  sx    GJGKBF<@37,0A;1 A;t A; 4ZA;:=*A;*A;584ZA; tA; 6:A; %*DL	A;
  #TzA;
 6:A;F +,D*+,D7<=J,45F189H3MOF-LNG4LNF8	>?K ?	=>L :89H356F2@AJ' !EF,;<L'< < EA# A4 c d 2 2C 2D 2A A A! !
$ 
T 
3$ 3 /7 '3 ' '3 'R&c &
 9B@D37]3 ]I ]]16]\)D0]<E<T]@!"# !"9t3C !"z !"Fy:'='C I Z] B4%) 4% 4%l% %y %T %6 CD4=CG6:]d
 ]C ]](1]]49DL] ,t3] @ITXZ^I^?_bklxz~  AE  mE  cF  @F]~#sTz #T #0' %Z__&N#J1<fH		1f<) tCH~ $	Q
[r   r   c                 (    | dk7  rt        | |      y)z+Raise LibsndfileError if there is an error.r   r  N)r  )rY  r  s     r   rV  rV    s    
axc&11 r   c                 X   t        |       }|t        |       }|,t        d|       t        |t              st        d|      	 |t
        |j                            z  }|d}nt        |t              st        d|      	 |t        |j                            z  }t        j                  d      }||_        d|_        t        j                  |      t        j                   k(  rt        d	      |S # t        $ r t        d|      w xY w# t        $ r t        d|      w xY w)
z8Return numeric ID for given format|subtype|endian combo.z$No default subtype for major format zInvalid subtype: zUnknown subtype: r   zInvalid endian-ness: zUnknown endian-ness: SF_INFO*r   z1Invalid combination of format, subtype and endian)r   r  r   r  r  r   r  r  r   r   r   r=  r   r   r   sf_format_checkSF_FALSE)r   r   r   resultr   s        r   r   r     sF   6"F!&)?6vjAC C%+G;788:)GMMO,, ~$/z:;;=(6<<>** 88JDDKDMD!T]]2?A 	AM#  :,WK899:  =0
;<<=s   C6 D 6DD)c                    t        | t              st        d|       t        |       }|j	                  d      st        |       t        |      kD  rt        d|       t        |j                  d            dk7  rt        d      d|v rt        j                  }|S d|v rt        j                  }|S t        j                  }|S )z=Check if mode is valid and return its integer representation.zInvalid mode: zxrwb+xrwr   z&mode must contain exactly one of 'xrw'r  r   )r  r  r   r  
differencero  r   intersectionr   SFM_RDWRSFM_READr  )r  mode_setr  s      r   r  r  
  s    dC .1224yH7#s4y3x='@>$233
8  '(A-ABB
h==
 O	 
== O >>Or   c                 t   |}|t        | |      }t        |t              sJ t        |       t	        j
                  d      }d|vs|j                         dk(  r<|t        d      ||_        |t        d      ||_	        t        |||      |_        |S t        d |||||fD              rt        d      |S )z*Check arguments and create SF_INFO struct.r  r   r1   zsamplerate must be specifiedzchannels must be specifiedc              3   $   K   | ]  }|d u 
 y wr   r   ).0args     r   	<genexpr>z&_create_info_struct.<locals>.<genexpr>1  s       I +H3s$ +Hs   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   any)	r   r  r   r   r   r   r   original_formatr   s	            r   r  r    s     O~*46&#&&&f88JD
$&,,.E1:;;$899 !&'6: K	  IHow+H I I L M MKr   c                    d}t        | d|       } 	 t        j                  j                  |       d   dd }|j	                  dd      }|j                         t        vrd|vrt        d	|       |S # t
        $ r Y 5w xY w)
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).

    rC  r   r   r   Nr   r   r   zBNo format specified and unable to get format from file extension: )	r  r  r  splitextrA  	Exceptionr  rH   r   )r   r  r   s      r   r  r  8  s     F4&D""4(,QR0w	2 ||~X%#T/ ++/(4 5 	5M  s   7A2 2	A>=A>c                 v    t         t        t        fD ]%  }|j                         D ]  \  }}|| k(  s|c c S  ' y)z;Return the string representation of a given numeric format.zn/a)rH   r   r   r  )
format_int
dictionarykvs       r   r+  r+  P  s;    	83
$$&DAqJ ' 4
 r   c                 B   t        j                  d      }| |_        t        j	                  t         j
                  ||t        j                  d             |j                  }t        |j                        |r&t        j                  |      j                  dd      fS dfS )z6Return the ID and short description of a given format.zSF_FORMAT_INFO*SF_FORMAT_INFOr   r   rC  )r   r=  r   r   r  r  r?  r   r+  r@  rA  )r  format_flagr   r   s       r   r4  r4  Z  s    ((,-K#KOODII{KKK 013D**+<@DKK$$Wi8J JFHJ Jr   c              #      K   t        j                  d      }t        j                  t         j                  | |t        j
                  d             t        |d         D ]  }t        ||        yw)z8Helper for available_formats() and available_subtypes().zint*r   r   N)r   r=  r   r  r  r?  ranger4  )
count_flagr$  r  r  s       r   r   r   e  sR     HHVEOODIIz5$++e2DEE!Ho
:{33 &s   A1A3c                     t        | t              st        d|       	 t        | j	                            }|S # t
        $ r t        d|       w xY w)z4Check if `format_str` is valid and return format ID.zInvalid format: zUnknown format: )r  r  r   rH   r  r  r   )
format_strr  s     r   r   r   m  sc    j#&*:.9::<j..01
   <+J>:;;<s	   9 Ac           	          |t         j                  k(  }|t         j                  k(  }t        t	        | d      t	        | d      t	        | d      xs |t	        | d      xs t	        | d      xs |g      S )z>Check if file has all the necessary attributes for virtual IO.r  rk  r   r   r  )r   r  r  allhasattr)r   r  readonly	writeonlys       r   r  r  x  sn    4==(HDNN*Iffg*(fGz!:Gi	  r   c                       e Zd ZdZy)SoundFileErrorz-Base class for all soundfile-specific errors.Nr   r   r   r   r   r   r   r0  r0    s    7r   r0  c                       e Zd ZdZy)r  zKsoundfile module runtime error.

    Errors that used to be `RuntimeError`.Nr1  r   r   r   r  r    s    . 	r   r  c                   H    e Zd ZdZd	dededdfdZedefd       ZdefdZ	y)
r  zjlibsndfile errors.


    Attributes
    ----------
    code
        libsndfile internal error number.
    coder  r   Nc                 N    t         j                  | ||       || _        || _        y r   )r  r   r4  r  )r   r4  r  s      r   r   zLibsndfileError.__init__  s"    &&tT6:	r   c                     | j                   rDt        j                  | j                         }t        j                  |      j                  dd      S y)zRaw libsndfile error message.r   r   z'(Garbled error message from libsndfile))r4  r   sf_error_numberr   r@  rA  )r   err_strs     r   error_stringzLibsndfileError.error_string  s@     99**4995G;;w'..w	BB
 =r   c                 4    | j                   | j                  z   S r   )r  r9  r!  s    r   __str__zLibsndfileError.__str__  s    {{T....r   rC  )
r   r   r   r   r   r  r   r   r9  r;  r   r   r   r  r    sH    S # t 
 	=c 	= 	=/ /r   r  )r   r   Nr   FNNNNNNNT)NNNTNN)Nr   r   r   Nr   FNNNNNNNT)Fr   )NNr<  )mr   __version__osr  sysr  	threadingr  collections.abcr   ctypes.utilr   _find_libraryr   r   r   typingr   r	   r
   r   r   r   typing_extensionsr   
_soundfiler   r   r  r   r	  r   __annotations__ndarraytupler   r   r   r   r   r   r   r   r-   r   rH   r   r   r   r   r   r  r   _machine_packaged_libname	sysconfig
_sysconfigget_platform_win_machiner  _soundfile_datar  dirname__file___pathr   
_full_pathdlopenr   ImportErrorr   _libname_explicit_libnameisdir_hbrew_pathr@  sf_version_stringrA  __libsndfile_version__
startswithro  r   r   r   r   r   r   r   r   r   r   r  r   rV  r   r  r  r  r+  SFC_GET_FORMAT_INFOr4  r   r   r  r  r0  RuntimeErrorr  r  r   r   r   <module>r`     sc  	     % 5 + + ; ;  " ""%)h"6c9J"J i J}}U38_ekk%--RWR_R_B_bgbmbmBmpup{p{B{6|%|}	9 }--c3hU]]UZUbUbEbejepepEpsxs~s~E~9(  Ai  AEF	9 F				 %
E$sCx.! #	X#
X# 	X# 
X	#
 
X# 
X# X# 
X# X# 
X# X# X# 
X# 	X# 
X#  
X!#" 
X##$ 5#%S#X
 :#$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#$	5c3h  #L 	#%S#X
 ,	X,
X, 	X,
 
X, 
X, X, 
X, X, 
X, X, X, 
X, 	Y, 
X,  
X!," 
X#,$ X%,& 5, 5c3h( < 	%
E$sCx.!  )d38n% 82}} 0)HJ6A	'	!&.z..0;& 6[( 4W$ 4<\NKLL	'	!0:FF 5 -
 :U B=>>HH_556Eu&78J4;;z"D< %T%;%;%=>EEgyY $$]33C4F4GH t}imuy37\# \S \c \SSWZ \gp \\-2T\\GPS_G_bfGf\$J\14t\LORVJ\hknrhr\ d
\ -1\ =B)lBZ\_B_<`\B <@59,0%)	9$ 9I 93 9:9.1Dj9*9.29 #T\9 d
	9 /3	9v @D<=7@?CQU=A<@:[% :[#* :[:[%(:[69:[t:[+4:[ :[ 16:[ L(4/	:[ EH$J	:[
 4Z:[
 14d
:[ $J:[ 03Tz:[ :[ %.it.C$DyQ]_ceiQiGj$j:[z1 1h)# )d )~ )F4S> F*DsTz DT#s(^ D. 59&* sTz t/3&1C 1C$J 1 Z[ Z[z2@&60 *.)A)A J4		Y 		NL 	/+ /]. 	i( 22 +TUUt{{8$ 2==H$ 2]]g% 0]]g% / 	1==H$w)>25((..AU2V.& 4;;sxx}}[:KLMD4;;01D'22s8   C8U Y$U>=Y>B9X:7Y9X::Y Y