o
    IAf]                  	   @   sr  	 d dl Z d dlZd dlZddgZG dd deZdZdd Zdd	 Zd
d Z	dd Z
dd ZdZdd Zdd Zdd Zdd Zdd Zdd Zdd Zd dlmZ d d lmZ ed!d"Zd#ej_d$ej_d%ej_d&ej_d'ej_d(ej_G d)d* d*Z G d+d, d,Z!d>d-dZ"e#d.kr7d dl$Z$e$j%d/d se$j%&d0 e$j%d/ Z'e"e'd1Z(e)d2e' e)d3e(*  e)d4e(+  e)d5e(,  e)d6e(-  e)d7e(.  e)d8e(/  e$j%d9d r$e$j%d9 Z0e)d:e0 e"e0d;Z1e12e(3  	 e(4d<Z5e5sne16e5 qW d   n	1 sw   Y  e)d= W d   dS W d   dS 1 s0w   Y  dS dS )?    NErroropenc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   /usr/lib/python3.10/aifc.pyr      s    l   @Q E c                 C   0   zt d| dd W S  t jy   td w )N>l   r   structunpackreaderrorEOFErrorfiler   r   r   
_read_long   
   r   c                 C   r	   )N>Lr   r   r   r   r   r   r   _read_ulong   r   r   c                 C   r	   )N>h   r   r   r   r   r   r   _read_short   r   r   c                 C   r	   )N>Hr   r   r   r   r   r   r   _read_ushort   r   r   c                 C   s@   t | d}|dkrd}n| |}|d@ dkr| d}|S )N   r       )ordr   )r   lengthdatadummyr   r   r   _read_string   s   

r#   gc                 C   s   t | }d}|dk rd}|d }t| }t| }||  kr'|  kr'dkr/n nd} ||  S |dkr9t} ||  S |d }|d | td	|d
  } ||  S )Nr   r      g          i?  l        g       @?   )r   r   	_HUGE_VALpow)fexponsignhimantlomantr   r   r   _read_float   s    "r/   c                 C      |  td| d S )Nr   writer   packr*   xr   r   r   _write_short      r6   c                 C   r0   )Nr   r1   r4   r   r   r   _write_ushort   r7   r8   c                 C   r0   )Nr
   r1   r4   r   r   r   _write_long   r7   r9   c                 C   r0   )Nr   r1   r4   r   r   r   _write_ulong   r7   r:   c                 C   sV   t |dkr
td| tdt | | | t |d@ dkr)| d d S d S )N   z%string exceeds maximum pstring lengthBr   r       )len
ValueErrorr2   r   r3   )r*   sr   r   r   _write_string   s   
rA   c           	      C   s   dd l }|dk rd}|d }nd}|dkrd}d}d}nP||\}}|dks/|dks/||kr8|dB }d}d}n4|d }|dk rH|||}d}||B }||d}||}t|}||| d}||}t|}t| | t| | t| | d S )	Nr   r%   r$   i @  r   r&   i?      )mathfrexpldexpfloorintr8   r:   )	r*   r5   rC   r,   r+   r-   r.   ZfmantZfsmantr   r   r   _write_float   s8   




rH   )Chunk)
namedtuple_aifc_paramsz7nchannels sampwidth framerate nframes comptype compnamez3Number of audio channels (1 for mono, 2 for stereo)zSample width in byteszSampling frequencyzNumber of audio framesz(Compression type ("NONE" for AIFF files)zRA human-readable version of the compression type
('not compressed' for AIFF files)c                   @   s   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 ZdS )2	Aifc_readNc                 C   s,  d| _ d | _g | _d| _|| _t|}| dkrtd|d}|dkr*d| _	n|dkr2d| _	ntdd| _
d | _	 d| _zt| j}W n	 tyP   Y n:w | }|d	krb| | d| _
n#|d
krr|| _|d}d| _n|dkr|t|| _ n	|dkr| | |  q=| j
r| jstdd S )Nr      FORMz file does not start with FORM idr      AIFF   AIFCr   znot an AIFF or AIFF-C file   COMM   SSND      FVER   MARKz$COMM chunk and/or SSND chunk missing)_version_convert_markers	_soundpos_filerI   Zgetnamer   r   _aifcZ_comm_chunk_read_ssnd_chunk_ssnd_seek_neededr   _read_comm_chunkr   	_readmarkskip)selfr   chunkZformdataZ	chunknamer"   r   r   r   initfp4  sP   



zAifc_read.initfpc                 C   sF   t |trt|d}z| | W d S    |   | | d S )Nrb)
isinstancestrbuiltinsr   rb   closer`   r*   Zfile_objectr   r   r   __init__\  s   
zAifc_read.__init__c                 C      | S Nr   r`   r   r   r   	__enter__h     zAifc_read.__enter__c                 G      |    d S rk   rg   r`   argsr   r   r   __exit__k     zAifc_read.__exit__c                 C      | j S rk   )rY   rl   r   r   r   getfpq     zAifc_read.getfpc                 C   s   d| _ d| _d S )Nr   r   )r\   rX   rl   r   r   r   rewindt  s   
zAifc_read.rewindc                 C   s$   | j }|d urd | _ |  d S d S rk   )rY   rg   r`   r   r   r   r   rg   x  s
   zAifc_read.closec                 C   ru   rk   )rX   rl   r   r   r   tell~  rw   zAifc_read.tellc                 C   ru   rk   )
_nchannelsrl   r   r   r   getnchannels  rw   zAifc_read.getnchannelsc                 C   ru   rk   )_nframesrl   r   r   r   
getnframes  rw   zAifc_read.getnframesc                 C   ru   rk   )
_sampwidthrl   r   r   r   getsampwidth  rw   zAifc_read.getsampwidthc                 C   ru   rk   )
_frameraterl   r   r   r   getframerate  rw   zAifc_read.getframeratec                 C   ru   rk   	_comptyperl   r   r   r   getcomptype  rw   zAifc_read.getcomptypec                 C   ru   rk   	_compnamerl   r   r   r   getcompname  rw   zAifc_read.getcompnamec                 C   s*   t |  |  |  |  |  |  S rk   )rK   r|   r   r   r~   r   r   rl   r   r   r   	getparams  s   zAifc_read.getparamsc                 C      t | jdkr	d S | jS Nr   r>   rW   rl   r   r   r   
getmarkers     zAifc_read.getmarkersc                 C   .   | j D ]}||d kr|  S qtd|Nr   zmarker {0!r} does not existrW   r   formatr`   idmarkerr   r   r   getmark  
   
zAifc_read.getmarkc                 C   s*   |dk s	|| j krtd|| _d| _d S )Nr   zposition not in ranger   )r}   r   rX   r\   )r`   posr   r   r   setpos  s   
zAifc_read.setposc                 C   s   | j r"| jd | jd}| j| j }|r| j|d  d| _ |dkr(dS | j|| j }| jr;|r;| |}| jt|| j| j	   | _|S )Nr   rR   r   )
r\   r[   seekr   rX   
_framesizerV   r>   r{   r   )r`   nframesr"   r   r!   r   r   r   
readframes  s    


zAifc_read.readframesc                 C      dd l }||dS Nr   r   )audioopZalaw2linr`   r!   r   r   r   r   	_alaw2lin     zAifc_read._alaw2linc                 C   r   r   )r   Zulaw2linr   r   r   r   	_ulaw2lin  r   zAifc_read._ulaw2linc                 C   2   dd l }t| dsd | _||d| j\}| _|S Nr   _adpcmstater   )r   hasattrr   Z	adpcm2linr   r   r   r   
_adpcm2lin  s
   
zAifc_read._adpcm2linc                 C   sR  t || _t|| _t |d d | _tt|| _| jdkr#td| jdkr,td| j| j | _	| j
rd}|jdkrGd}td d	|_|d
| _|rnt|jd}|d@ dkra|d }|j| |_|jdd t|| _| jdkr| jdkr| j| _n| jdv r| j| _n| jdv r| j| _ntdd| _d S d S d| _d| _d S )N   rR   r   bad sample widthbad # of channels   r   zWarning: bad COMM chunk size   r   r$      NONE   G722   ulaw   ULAW   alaw   ALAWunsupported compression typer      not compressed)r   r{   r   r}   r   rG   r/   r   r   r   rZ   	chunksizewarningswarnr   r   r   r   r   r#   r   r   rV   r   r   )r`   ra   Zkludger    r   r   r   r]     sF   















zAifc_read._read_comm_chunkc                 C   s   t |}z#t|D ]}t |}t|}t|}|s|r$| j|||f q	W d S  tyI   dt| jt| jdkr<dnd|f }t	| Y d S w )Nz;Warning: MARK chunk contains only %s marker%s instead of %sr    r@   )
r   ranger   r#   rW   appendr   r>   r   r   )r`   ra   Znmarkersir   r   namewr   r   r   r^     s$   	zAifc_read._readmark)r   r   r   rY   rb   ri   rm   rs   rv   rx   rg   rz   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r]   r^   r   r   r   r   rL     s4    $(*rL   c                   @   s0  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Z d<d= Z!d>d? Z"d@dA Z#dBdC Z$dDdE Z%dFdG Z&dHdI Z'dS )J
Aifc_writeNc                 C   s\   t |tr't|d}z| | W n   |   |dr%d| _d S d S | | d S )Nwbz.aiffr   )rd   re   rf   r   rb   rg   endswithrZ   rh   r   r   r   ri   /  s   


zAifc_write.__init__c                 C   s^   || _ t| _d| _d| _d | _d| _d| _d| _d| _	d| _
d| _d| _g | _d| _d| _d S )Nr   r   r   r   )rY   _AIFC_versionrU   r   r   rV   r{   r   r   r}   _nframeswritten_datawritten_datalengthrW   _marklengthrZ   ry   r   r   r   rb   ?  s   
zAifc_write.initfpc                 C   ro   rk   rp   rl   r   r   r   __del__P  rt   zAifc_write.__del__c                 C   rj   rk   r   rl   r   r   r   rm   S  rn   zAifc_write.__enter__c                 G   ro   rk   rp   rq   r   r   r   rs   V  rt   zAifc_write.__exit__c                 C      | j rtdd| _d S )N0cannot change parameters after starting to writer   r   r   rZ   rl   r   r   r   aiff\     
zAifc_write.aiffc                 C   r   )Nr   r   r   rl   r   r   r   aifca  r   zAifc_write.aifcc                 C   s(   | j rtd|dk rtd|| _d S )Nr   r   r   )r   r   r{   )r`   	nchannelsr   r   r   setnchannelsf  
   
zAifc_write.setnchannelsc                 C      | j std| j S )Nznumber of channels not set)r{   r   rl   r   r   r   r|   m     zAifc_write.getnchannelsc                 C   s0   | j rtd|dk s|dkrtd|| _d S )Nr   r   r   r   )r   r   r   )r`   	sampwidthr   r   r   setsampwidthr  s
   
zAifc_write.setsampwidthc                 C   r   )Nzsample width not set)r   r   rl   r   r   r   r   y  r   zAifc_write.getsampwidthc                 C   s(   | j rtd|dkrtd|| _d S )Nr   r   zbad frame rate)r   r   r   )r`   	framerater   r   r   setframerate~  r   zAifc_write.setframeratec                 C   r   )Nzframe rate not set)r   r   rl   r   r   r   r     r   zAifc_write.getframeratec                 C   s   | j rtd|| _d S )Nr   )r   r   r}   )r`   r   r   r   r   
setnframes  r   zAifc_write.setnframesc                 C   ru   rk   r   rl   r   r   r   r~     rw   zAifc_write.getnframesc                 C   s.   | j rtd|dvrtd|| _|| _d S Nr   )r   r   r   r   r   r   r   )r   r   r   r   )r`   comptypecompnamer   r   r   setcomptype  s   
zAifc_write.setcomptypec                 C   ru   rk   r   rl   r   r   r   r     rw   zAifc_write.getcomptypec                 C   ru   rk   r   rl   r   r   r   r     rw   zAifc_write.getcompnamec                 C   sf   |\}}}}}}| j rtd|dvrtd| | | | | | | | | || d S r   )r   r   r   r   r   r   r   )r`   paramsr   r   r   r   r   r   r   r   r   	setparams  s   



zAifc_write.setparamsc                 C   s8   | j r	| jr	| jstdt| j | j| j| j| j| jS )Nznot all parameters set)r{   r   r   r   rK   r}   r   r   rl   r   r   r   r     s
   zAifc_write.getparamsc                 C   s   |dkrt d|dk rt dt|tst dtt| jD ]}|| j| d kr6|||f| j|<  d S q | j|||f d S )Nr   zmarker ID must be > 0zmarker position must be >= 0zmarker name must be bytes)r   rd   bytesr   r>   rW   r   )r`   r   r   r   r   r   r   r   setmark  s   
zAifc_write.setmarkc                 C   r   r   r   r   r   r   r   r     r   zAifc_write.getmarkc                 C   r   r   r   rl   r   r   r   r     r   zAifc_write.getmarkersc                 C   ru   rk   r   rl   r   r   r   rz     rw   zAifc_write.tellc                 C   sz   t |ttfst|d}| t| t|| j| j  }| j	r'| 	|}| j
| | j| | _| jt| | _d S )Nr<   )rd   r   	bytearray
memoryviewcast_ensure_header_writtenr>   r   r{   rV   rY   r2   r   r   )r`   r!   r   r   r   r   writeframesraw  s   
zAifc_write.writeframesrawc                 C   s2   |  | | j| jks| j| jkr|   d S d S rk   )r   r   r}   r   r   _patchheader)r`   r!   r   r   r   writeframes  s
   
zAifc_write.writeframesc                 C   s   | j d u rd S zM| d | jd@ r| j d | jd | _|   | j| jks1| j| jks1| jrE| 	  W d | _
| j }d | _ |  d S W d | _
| j }d | _ |  d S d | _
| j }d | _ |  w )Nr   r   r=   )rY   r   r   r2   _writemarkersr   r}   r   r   r   rV   rg   )r`   r*   r   r   r   rg     s4   




zAifc_write.closec                 C   r   r   )r   Zlin2alawr   r   r   r   	_lin2alaw  r   zAifc_write._lin2alawc                 C   r   r   )r   Zlin2ulawr   r   r   r   	_lin2ulaw  r   zAifc_write._lin2ulawc                 C   r   r   )r   r   r   Z	lin2adpcmr   r   r   r   
_lin2adpcm  s
   
zAifc_write._lin2adpcmc                 C   sj   | j s3| jdv r| jsd| _| jdkrtd| jstd| js%td| js,td| | d S d S )Nr   r   r   r   r   r   zRsample width must be 2 when compressing with ulaw/ULAW, alaw/ALAW or G7.22 (ADPCM)z# channels not specifiedzsample width not specifiedzsampling rate not specified)r   r   r   r   r{   r   _write_header)r`   Zdatasizer   r   r   r     s   

z!Aifc_write._ensure_header_writtenc                 C   sF   | j dkr| j| _d S | j dv r| j| _d S | j dv r!| j| _d S d S )Nr   r   r   )r   r   rV   r   r   rl   r   r   r   _init_compression  s   


zAifc_write._init_compressionc              	   C   s@  | j r| jdkr|   | jd | js|| j| j  | _| j| j | j | _| jd@ r3| jd | _| j re| jdv rM| jd | _| jd@ rL| jd | _n| jdkre| jd d | _| jd@ re| jd | _z| j	 | _
W n ttfy{   d | _
Y nw | | j}| j r| jd	 | jd
 t| jd t| j| j n| jd | jd t| j| t| j| j | j
d ur| j	 | _t| j| j | jdv rt| jd n	t| j| jd  t| j| j | j r| j| j t| j| j | jd | j
d ur	| j	 | _t| j| jd  t| jd t| jd d S )Nr   rM   r   )r   r   r   r   r   r      r   rO   rS   rN   rP   r   rR   rQ   r   )rZ   r   r   rY   r2   r}   r{   r   r   rz   _form_length_posAttributeErrorOSError_write_form_lengthr:   rU   r6   _nframes_posrH   r   rA   r   _ssnd_length_pos)r`   Z
initlength
commlengthr   r   r   r   %  sb   







zAifc_write._write_headerc                 C   s\   | j rdt| j }|d@ r|d }d}nd}d}t| jd| | j d | d |  |S )	Nr   r      r   r   r   rR      )rZ   r>   r   r:   rY   r   )r`   
datalengthr   Z
verslengthr   r   r   r   X  s"   zAifc_write._write_form_lengthc                 C   s   | j  }| jd@ r| jd }| j d n| j}|| jkr2| j| jkr2| jdkr2| j |d d S | j | j	d | 
|}| j | jd t| j | j | j | jd t| j |d  | j |d | j| _|| _d S )Nr   r=   r   rR   )rY   rz   r   r2   r   r}   r   r   r   r   r   r   r:   r   )r`   Zcurposr   r"   r   r   r   r   e  s&   






zAifc_write._patchheaderc                 C   s   t | jdkr	d S | jd d}| jD ]}|\}}}|t | d d }t |d@ dkr1|d }qt| j| |d | _t| jt | j | jD ]}|\}}}t| j| t| j| t| j| qId S )Nr   rT   r   r      rR   )r>   rW   rY   r2   r:   r   r6   rA   )r`   r    r   r   r   r   r   r   r   r   {  s&   




zAifc_write._writemarkers)(r   r   r   rY   ri   rb   r   rm   rs   r   r   r   r|   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   rz   r   r   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sL    	3r   c                 C   sF   |d u rt | dr| j}nd}|dv rt| S |dv rt| S td)Nmoderc   )rrc   )r   r   z$mode must be 'r', 'rb', 'w', or 'wb')r   r   rL   r   r   )r*   r   r   r   r   r     s   
__main__r   z/usr/demos/data/audio/bach.aiffr   ZReadingznchannels =znframes   =zsampwidth =zframerate =zcomptype  =zcompname  =r   ZWritingr   i   zDone.rk   )7r   rf   r   __all__	Exceptionr   r   r   r   r   r   r#   r(   r/   r6   r8   r9   r:   rA   rH   ra   rI   collectionsrJ   rK   r   __doc__r   r   r   r   r   rL   r   r   r   sysargvr   fnr*   printr|   r~   r   r   r   r   Zgngr   r   r   r!   r   r   r   r   r   <module>   s     	
!     








$