3
hV                 @   s   d Z ddlZddlZddlZddlZddlmZ dddgZG dd deZ	G dd	 d	eZ
e
je
jhZd
d ZdddZdd Zdd ZdddZdd Zdd ZdS )z
Module to read / write wav files using NumPy arrays

Functions
---------
`read`: Return the sample rate (in samples/sec) and data from a WAV file.

`write`: Write a NumPy array as a WAV file.

    N)IntEnumWavFileWarningreadwritec               @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r	   r	   1/tmp/pip-build-riy7u7_k/scipy/scipy/io/wavfile.pyr      s   c               @   s|  e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1Z4d2Z5d3Z6d4Z7d5Z8d6Z9d7Z:d8Z;d9Z<d:Z=d;Z>d<Z?d=Z@d>ZAd?ZBd@ZCdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNdLZOdMZPdNZQdOZRdPZSdQZTdRZUdSZVdTZWdUZXdVZYdWZZdXZ[dYZ\dZZ]d[Z^d\Z_d]Z`d^Zad_Zbd`ZcdaZddbZedcZfddZgdeZhdfZidgZjdhZkdiZldjZmdkZndlZodmZpdnZqdoZrdpZsdqZtdrZudsZvdtZwduZxdvZydwZzdxZ{dyZ|dzZ}d{Z~d|Zd}Zd~ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZdZd ZdZdZdZdZdZdZ	dZ
dZd	Zd
ZdZdZdS (  WAVE_FORMATz
    WAVE form wFormatTag IDs

    Complete list is in mmreg.h in Windows 10 SDK.  ALAC and OPUS are the
    newest additions, in v10.0.14393 2016-07
    r                           	   
                                           !   "   #   $   %   &   '   (   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   @   A   B   C   D   E   P   R   S   U   Y   `   a   b   c   d   e   f   g   i   p   q   r   s   t   u   v   w   x   y   z   {                                                                                       i  i  i  i   i!  i#  i%  i0  i1  i2  i3  i4  i5  i6  i@  iA  iB  iP  iQ  iU  i`  ia  ib  ic  id  ip  iq  ir  is  it  iu  iv  iw  ix  i  i  i   i  i  i  i  i  i   i0  i@  iA  iI  iP  iQ  i`  ip  iq  ir  is  i  i  i  i   iP  iQ  i   i  i  iP  i   i  i  i  i  i   i  i  i  i  i   i  i  i  i  i   i  i   i   i  i  i  i	  i
  i  i  i  iq  iy  i  i  i  i  i    i   i3  iCA  iB  iCB  iLC  iLV  iVW  iOg  iPg  iQg  iog  ipg  iqg  ial  i p  iOp  imp  ias  ibs  ics  i!z  i"z  i   i  i  i  i  i  i  i  i  i	  i
  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i   i!  i"  i#  i$  i  i  i  N(  r   r   r   __doc__UNKNOWNPCMZADPCM
IEEE_FLOATZVSELPZIBM_CVSDZALAWZMULAWZDTSZDRMZ	WMAVOICE9Z
WMAVOICE10Z	OKI_ADPCMZ	DVI_ADPCMZ	IMA_ADPCMZMEDIASPACE_ADPCMZSIERRA_ADPCMZ
G723_ADPCMZDIGISTDZDIGIFIXZDIALOGIC_OKI_ADPCMZMEDIAVISION_ADPCMZCU_CODECZHP_DYN_VOICEZYAMAHA_ADPCMZSONARCZDSPGROUP_TRUESPEECHZECHOSC1ZAUDIOFILE_AF36ZAPTXZAUDIOFILE_AF10ZPROSODY_1612ZLRCZ	DOLBY_AC2ZGSM610ZMSNAUDIOZANTEX_ADPCMEZCONTROL_RES_VQLPCZDIGIREALZ	DIGIADPCMZCONTROL_RES_CR10ZNMS_VBXADPCMZCS_IMAADPCMZECHOSC3ZROCKWELL_ADPCMZROCKWELL_DIGITALKZXEBECZ
G721_ADPCMZ	G728_CELPZMSG723ZINTEL_G723_1Z
INTEL_G729Z
SHARP_G726ZMPEGZRT24ZPACZ
MPEGLAYER3ZLUCENT_G723ZCIRRUSZESPCMZVOXWAREZCANOPUS_ATRACZ
G726_ADPCMZ
G722_ADPCMZDSATZDSAT_DISPLAYZVOXWARE_BYTE_ALIGNEDZVOXWARE_AC8ZVOXWARE_AC10ZVOXWARE_AC16ZVOXWARE_AC20ZVOXWARE_RT24ZVOXWARE_RT29ZVOXWARE_RT29HWZVOXWARE_VR12ZVOXWARE_VR18ZVOXWARE_TQ40ZVOXWARE_SC3ZVOXWARE_SC3_1Z	SOFTSOUNDZVOXWARE_TQ60ZMSRT24ZG729AZMVI_MVI2ZDF_G726Z	DF_GSM610ZISIAUDIOZONLIVEZMULTITUDE_FT_SX20ZINFOCOM_ITS_G721_ADPCMZCONVEDIA_G729Z
CONGRUENCYZSBC24ZDOLBY_AC3_SPDIFZMEDIASONIC_G723ZPROSODY_8KBPSZZYXEL_ADPCMZPHILIPS_LPCBBZPACKEDZMALDEN_PHONYTALKZRACAL_RECORDER_GSMZRACAL_RECORDER_G720_AZRACAL_RECORDER_G723_1ZRACAL_RECORDER_TETRA_ACELPZNEC_AACZRAW_AAC1ZRHETOREX_ADPCMZIRATZ	VIVO_G723Z
VIVO_SIRENZPHILIPS_CELPZPHILIPS_GRUNDIGZDIGITAL_G723ZSANYO_LD_ADPCMZSIPROLAB_ACEPLNETZSIPROLAB_ACELP4800ZSIPROLAB_ACELP8V3ZSIPROLAB_G729ZSIPROLAB_G729AZSIPROLAB_KELVINZVOICEAGE_AMRZ	G726ADPCMZDICTAPHONE_CELP68ZDICTAPHONE_CELP54ZQUALCOMM_PUREVOICEZQUALCOMM_HALFRATEZTUBGSMZMSAUDIO1ZWMAUDIO2ZWMAUDIO3ZWMAUDIO_LOSSLESSZWMASPDIFZUNISYS_NAP_ADPCMZUNISYS_NAP_ULAWZUNISYS_NAP_ALAWZUNISYS_NAP_16KZSYCOM_ACM_SYC008ZSYCOM_ACM_SYC701_G726LZSYCOM_ACM_SYC701_CELP54ZSYCOM_ACM_SYC701_CELP68ZKNOWLEDGE_ADVENTURE_ADPCMZFRAUNHOFER_IIS_MPEG2_AACZDTS_DSZCREATIVE_ADPCMZCREATIVE_FASTSPEECH8ZCREATIVE_FASTSPEECH10Z
UHER_ADPCMZULEAD_DV_AUDIOZULEAD_DV_AUDIO_1ZQUARTERDECKZILINK_VCZ	RAW_SPORTZESST_AC3ZGENERIC_PASSTHRUZIPI_HSXZ	IPI_RPELPZCS2ZSONY_SCXZSONY_SCYZSONY_ATRAC3ZSONY_SPCZTELUM_AUDIOZTELUM_IA_AUDIOZNORCOM_VOICE_SYSTEMS_ADPCMZFM_TOWNS_SNDZMICRONASZMICRONAS_CELP833ZBTV_DIGITALZINTEL_MUSIC_CODERZINDEO_AUDIOZQDESIGN_MUSICZON2_VP7_AUDIOZON2_VP6_AUDIOZ	VME_VMPCMZTPCZLIGHTWAVE_LOSSLESSZOLIGSMZOLIADPCMZOLICELPZOLISBCZOLIOPRZLH_CODECZLH_CODEC_CELPZLH_CODEC_SBC8ZLH_CODEC_SBC12ZLH_CODEC_SBC16ZNORRISZ
ISIAUDIO_2ZSOUNDSPACE_MUSICOMPRESSZMPEG_ADTS_AACZMPEG_RAW_AACZ	MPEG_LOASZNOKIA_MPEG_ADTS_AACZNOKIA_MPEG_RAW_AACZVODAFONE_MPEG_ADTS_AACZVODAFONE_MPEG_RAW_AACZ
MPEG_HEAACZVOXWARE_RT24_SPEECHZSONICFOUNDRY_LOSSLESSZINNINGS_TELECOM_ADPCMZLUCENT_SX8300PZLUCENT_SX5363SZCUSEEMEZNTCSOFT_ALF2CM_ACMZDVMZDTS2ZMAKEAVISZDIVIO_MPEG4_AACZNOKIA_ADAPTIVE_MULTIRATEZ
DIVIO_G726ZLEAD_SPEECHZLEAD_VORBISZWAVPACK_AUDIOZOGG_VORBIS_MODE_1ZOGG_VORBIS_MODE_2ZOGG_VORBIS_MODE_3ZOGG_VORBIS_MODE_1_PLUSZOGG_VORBIS_MODE_2_PLUSZOGG_VORBIS_MODE_3_PLUSZALACZ	_3COM_NBXZOPUSZFAAD_AACZAMR_NBZAMR_WBZAMR_WPZGSM_AMR_CBRZGSM_AMR_VBR_SIDZCOMVERSE_INFOSYS_G723_1ZCOMVERSE_INFOSYS_AVQSBCZCOMVERSE_INFOSYS_SBCZSYMBOL_G729_AZVOICEAGE_AMR_WBZINGENIENT_G726Z	MPEG4_AACZENCORE_G726Z	ZOLL_ASAOZSPEEX_VOICEZVIANIX_MASCZWM9_SPECTRUM_ANALYZERZWMF_SPECTRUM_ANAYZERZGSM_610ZGSM_620ZGSM_660ZGSM_690ZGSM_ADAPTIVE_MULTIRATE_WBZPOLYCOM_G722ZPOLYCOM_G728ZPOLYCOM_G729_AZPOLYCOM_SIRENZGLOBAL_IP_ILBCZRADIOTIME_TIME_SHIFT_RADIOZNICE_ACAZ
NICE_ADPCMZVOCORD_G721ZVOCORD_G726ZVOCORD_G722_1ZVOCORD_G728ZVOCORD_G729ZVOCORD_G729_AZVOCORD_G723_1Z
VOCORD_LBCZ	NICE_G728ZFRACE_TELECOM_G729ZCODIANZFLAC
EXTENSIBLEZDEVELOPMENTr	   r	   r	   r
   r      s  r   c             C   s  |r
d}nd}t j|d | jdd  }}d}|dk r@tdt j|d | jd}|d7 }|\}}}}	}
}|tjko~|dkrt j|d
 | jd	d }|d	7 }|dkr| jd}|d7 }|dd }|rd}nd}|j|rt j|d |dd d }ntd|tkrhyt|j}W n tk
rB   |d}Y nX td| ddj	dd tD  ||kr| j||  |||||	|
|fS )a  
    Returns
    -------
    size : int
        size of format subchunk in bytes (minus 8 for "fmt " and itself)
    format_tag : int
        PCM, float, or compressed format
    channels : int
        number of channels
    fs : int
        sampling frequency in samples per second
    bytes_per_second : int
        overall byte rate for the file
    block_align : int
        bytes per sample, including all channels
    bit_depth : int
        bits per sample
    ><Ir   r   r   z.Binary structure of wave file is not compliantZHHIIHHr   Hr   s         8qs         8qNz#06xzUnknown wave file format: z. Supported formats: z, c             s   s   | ]}|j V  qd S )N)name).0xr	   r	   r
   	<genexpr>u  s    z"_read_fmt_chunk.<locals>.<genexpr>r   r   r   r   )
structunpackr   
ValueErrorr   ry   endswithKNOWN_WAVE_FORMATSr~   join)fidis_big_endianfmtsizeres
bytes_read
format_tagchannelsfsbytes_per_secondblock_align	bit_depthZext_chunk_sizeZextensible_chunk_dataZraw_guidtailZformat_namer	   r	   r
   _read_fmt_chunk8  sD    



r   Fc             C   s   |r
d}nd}t j|| jdd }|d }|dkr:d}	n2|rDd}	nd}	|tjkr`|	d	| 7 }	n|	d
| 7 }	|stj| j||	d}
n0| j }tj| |	d||| fd}
| j	||  |dkr|
j
d|}
|
S )Nz>Iz<Ir   r   r   u1rz   r{   zi%dzf%d)dtypec)r   modeoffsetshaper   )r   r   r   r   rw   numpyZ
frombuffertellZmemmapseekZreshape)r   r   r   r   r   mmapr   r   Zbytes_per_sampler   datastartr	   r	   r
   _read_data_chunk  s,    
r   c             C   s<   |r
d}nd}| j d}|r8tj||d }| j|d d S )Nz>Iz<Ir   r   r   )r   r   r   r   )r   r   r   r   r   r	   r	   r
   _skip_unknown_chunk  s    
r   c             C   s   | j d}|dkrd}d}n&|dkr.d}d}ntdt| d	tj|| j dd
 d }| j d}|dkrtdt| d||fS )Nr   s   RIFFFz<Is   RIFXTz>IzFile format z2 not understood. Only 'RIFF' and 'RIFX' supported.r   r   s   WAVEz"Not a WAV file. RIFF form type is .)r   r   reprr   r   )r   Zstr1r   r   	file_sizeZstr2r	   r	   r
   _read_riff_chunk  s    

r   c             C   s  t | dr| }d}n
t| d}zt|\}}d}d}d}d}tj}	xf|j |k r|jd}
|
s|rtjdj	|j |t
dd	 P qtd
n@t|
dk rdt|
 }|r|rtj|d t
dd	 nt||
dkrd}t||}|dd \}	}}|d }|dkrtdj	|qH|
dkr4t|| qH|
dkrdd}|sPtdt||	||||}qH|
dkrzt|| qH|
d krt|| qHtjdt
dd	 t|| qHW W dt | ds|j  n
|jd X ||fS )!a	  
    Open a WAV file

    Return the sample rate (in samples/sec) and data from a WAV file.

    Parameters
    ----------
    filename : string or open file handle
        Input wav file.
    mmap : bool, optional
        Whether to read data as memory-mapped.
        Only to be used on real files (Default: False).

        .. versionadded:: 0.12.0

    Returns
    -------
    rate : int
        Sample rate of wav file.
    data : numpy array
        Data read from wav file. Data-type is determined from the file;
        see Notes.

    Notes
    -----
    This function cannot read wav files with 24-bit data.

    Common data types: [1]_

    =====================  ===========  ===========  =============
         WAV format            Min          Max       NumPy dtype
    =====================  ===========  ===========  =============
    32-bit floating-point  -1.0         +1.0         float32
    32-bit PCM             -2147483648  +2147483647  int32
    16-bit PCM             -32768       +32767       int16
    8-bit PCM              0            255          uint8
    =====================  ===========  ===========  =============

    Note that 8-bit PCM is unsigned.

    References
    ----------
    .. [1] IBM Corporation and Microsoft Corporation, "Multimedia Programming
       Interface and Data Specifications 1.0", section "Data Format of the
       Samples", August 1991
       http://www.tactilemedia.com/info/MCI_Control_Info.html

    Examples
    --------
    >>> from os.path import dirname, join as pjoin
    >>> from scipy.io import wavfile
    >>> import scipy.io

    Get the filename for an example .wav file from the tests/data directory.

    >>> data_dir = pjoin(dirname(scipy.io.__file__), 'tests', 'data')
    >>> wav_fname = pjoin(data_dir, 'test-44100Hz-2ch-32bit-float-be.wav')

    Load the .wav file contents.

    >>> samplerate, data = wavfile.read(wav_fname)
    >>> print(f"number of channels = {data.shape[1]}")
    number of channels = 2
    >>> length = data.shape[0] / samplerate
    >>> print(f"length = {length}s")
    length = 0.01s

    Plot the waveform.

    >>> import matplotlib.pyplot as plt
    >>> import numpy as np
    >>> time = np.linspace(0., length, data.shape[0])
    >>> plt.plot(time, data[:, 0], label="Left channel")
    >>> plt.plot(time, data[:, 1], label="Right channel")
    >>> plt.legend()
    >>> plt.xlabel("Time [s]")
    >>> plt.ylabel("Amplitude")
    >>> plt.show()

    r   Frbr   r   r   zQReached EOF prematurely; finished at {:d} bytes, expected {:d} bytes from header.r   )
stacklevelzUnexpected end of file.zIncomplete chunk ID: z, ignoring it.s   fmt Tr   r   r"   r9   rD   rY   z4Unsupported bit depth: the wav file has {}-bit data.s   facts   datazNo fmt chunk before datas   LIST   JUNK   Fakez-Chunk (non-data) not understood, skipping it.Nr   >   r"   r9   rD   rY   r   r   >   r   r   )hasattropenr   r   rw   r   r   warningswarnformatr   r   lenr   r   r   r   closer   )filenamer   r   r   r   Zfmt_chunk_receivedZdata_chunk_receivedr   r   r   Zchunk_idmsgZ	fmt_chunkr   r   r	   r	   r
   r     sl    Q


















c             C   s4  t | dr| }n
t| d}|}z|jj}|dkpL|dkpL|dkoL|jjdks\td|j d}|d	7 }|d
7 }|d7 }|d7 }|dkrtj}ntj}|j	dkrd}n
|j
d }|jjd }	||	d  | }
||	d  }tjd||||
||	}|dkp|dks|d7 }|tjdt|7 }||7 }|dkp4|dksX|d7 }|tjdd|j
d 7 }t|d d d|j  dkrtd|j| |jd |jtjd|j |jjdks|jjdkrtjdkr|j }t|| |j }|jd |jtjd|d  W dt | ds$|j  n
|jd X dS )a  
    Write a NumPy array as a WAV file.

    Parameters
    ----------
    filename : string or open file handle
        Output wav file.
    rate : int
        The sample rate (in samples/sec).
    data : ndarray
        A 1-D or 2-D NumPy array of either integer or float data-type.

    Notes
    -----
    * Writes a simple uncompressed WAV file.
    * To write multiple-channels, use a 2-D array of shape
      (Nsamples, Nchannels).
    * The bits-per-sample and PCM/float will be determined by the data-type.

    Common data types: [1]_

    =====================  ===========  ===========  =============
         WAV format            Min          Max       NumPy dtype
    =====================  ===========  ===========  =============
    32-bit floating-point  -1.0         +1.0         float32
    32-bit PCM             -2147483648  +2147483647  int32
    16-bit PCM             -32768       +32767       int16
    8-bit PCM              0            255          uint8
    =====================  ===========  ===========  =============

    Note that 8-bit PCM is unsigned.

    References
    ----------
    .. [1] IBM Corporation and Microsoft Corporation, "Multimedia Programming
       Interface and Data Specifications 1.0", section "Data Format of the
       Samples", August 1991
       http://www.tactilemedia.com/info/MCI_Control_Info.html

    Examples
    --------
    Create a 100Hz sine wave, sampled at 44100Hz.
    Write to 16-bit PCM, Mono.

    >>> from scipy.io.wavfile import write
    >>> samplerate = 44100; fs = 100
    >>> t = np.linspace(0., 1., samplerate)
    >>> amplitude = np.iinfo(np.int16).max
    >>> data = amplitude * np.sin(2. * np.pi * fs * t)
    >>> write("example.wav", samplerate, data)

    r   wbifur   zUnsupported data type '%s'    s   RIFFs       s   WAVEs   fmt r   z<HHIIHHs     z<Is   factz<IIr   r   l    z!Data exceeds wave file size limits   datarz   =bigNr   )r   r   r   kinditemsizer   r   rx   rw   ndimr   r   packr   nbytesr   	byteordersysZbyteswap_array_tofiler   r   r   )r   Zrater   r   r   ZdkindZheader_datar   r   r   r   r   Zfmt_chunk_datar   r	   r	   r
   r   d  s^    5




 




c             C   s   | j |j jdj d S )Nb)r   Zravelviewr   )r   r   r	   r	   r
   r     s    r   )F)F)ru   r   r   r   r   enumr   __all__UserWarningr   r   rw   rx   r   r   r   r   r   r   r   r   r	   r	   r	   r
   <module>
   s*     I
#
 