
    Cc                     Z   d Z ddlZddlmZ ddlmZmZ ddlmZmZ	 ddl
mZmZmZmZmZmZ ddlmZmZmZ g dZ G d	 d
e      ZdZd Z G d de      Z G d dee      Z G d de      Z G d de      Z G d de      Z eee       edd      d               Z G d de      ZeZ y)z'AIFF audio stream information and tags.    N)pack)
StreamInfoFileType)ID3NoHeaderErrorerror)IffChunkIffContainerChunkMixinIffFileIffID3InvalidChunkr   )convert_errorloadfileendswith)AIFFOpendeletec                       e Zd Zy)r   N)__name__
__module____qualname__     ./usr/lib/python3/dist-packages/mutagen/aiff.pyr   r   #   s    r   r   gc                    t        |       dk(  sJ t        j                  d|       \  }}}d}|dk  rd}|dz   }||cxk(  r|cxk(  rdk(  r
n nd}||z  S |dk(  rt        d	      |d
z
  }|dz  |z   t	        d|dz
        z  }||z  S )zRaises OverflowError
   z>hLL   r   i   g        i  zinf and nan not supportedi?  l        g       @?   )lenstructunpackOverflowErrorpow)dataexponhimantlomantsignfs         r   
read_floatr*   +   s     t9??"MM&$7E66Dqy%&%A% !8O 
&788k!F*c#urz.BB!8Or   c                   <    e Zd ZdZed        Zed        Zd Zd Zy)	AIFFChunkz$Representation of a single IFF chunkc                 .    t        j                  d|      S Nz>4sI)r    r!   )clsheaders     r   parse_headerzAIFFChunk.parse_headerB   s    }}VV,,r   c                     |dk(  rt         S | S NFORM)AIFFFormChunk)r/   ids     r   	get_classzAIFFChunk.get_classF   s    <  Jr   c                 P    | j                   j                  t        d||             y r.   )_fileobjwriter   )selfid_sizes      r   write_new_headerzAIFFChunk.write_new_headerM   s    Dd34r   c                 b    | j                   j                  t        d| j                               y )Nz>I)r9   r:   r   	data_sizer;   s    r   
write_sizezAIFFChunk.write_sizeP   s    Dt~~67r   N)	r   r   r   __doc__classmethodr1   r7   r>   rB   r   r   r   r,   r,   ?   s5    .- -  58r   r,   c                       e Zd ZdZd Zd Zy)r5   zThe  AIFF root chunk.c                 B    t         j                  | j                  |       S N)r,   parser9   rA   s    r   parse_next_subchunkz!AIFFFormChunk.parse_next_subchunkW   s    t}}d33r   c                 |    |dk7  rt        d|z        t        j                  | ||||       | j                          y )Nr4   zExpected FORM chunk, got %s)r   r,   __init__init_container)r;   fileobjr6   r@   parent_chunks        r   rK   zAIFFFormChunk.__init__Z   s<    =<rABB4"iFr   N)r   r   r   rC   rI   rK   r   r   r   r5   r5   T   s    4r   r5   c                   6     e Zd ZdZ fdZ fdZ fdZ xZS )AIFFFilezRepresentation of a AIFF filec                     t         |   t        |       | j                  j                  dk7  r"t        d| j                  j                  z        y )Nr4   z'Root chunk must be a FORM chunk, got %s)superrK   r,   rootr6   r   )r;   rM   	__class__s     r   rK   zAIFFFile.__init__e   sI     	G,99<<7"H!% . / / #r   c                 .    |dk(  ryt         |   |      S )Nr4   T)rR   __contains__r;   r<   rT   s     r   rV   zAIFFFile.__contains__n   s    &=w#C((r   c                 D    |dk(  r| j                   S t        | 	  |      S r3   )rS   rR   __getitem__rW   s     r   rY   zAIFFFile.__getitem__s   s$    &=99w"3''r   )r   r   r   rC   rK   rV   rY   __classcell__)rT   s   @r   rP   rP   b   s    '/)
( (r   rP   c                   D    e Zd ZdZdZdZdZdZ ee	e
      d        Zd Zy)AIFFInfoa  AIFFInfo()

    AIFF audio stream information.

    Information is parsed from the COMM chunk of the AIFF file

    Attributes:
        length (`float`): audio length, in seconds
        bitrate (`int`): audio bitrate, in bits per second
        channels (`int`): The number of audio channels
        sample_rate (`int`): audio sample rate, in Hz
        bits_per_sample (`int`): The audio sample size
    r   c                 @   t        |      }	 |d   }|j	                         }t        |      dk  rt        t        j                  d|dd       }|\  }}}	}
	 t        t        |
            | _
        | j                  dk  rt        d      | j                  dk7  r|t        | j                        z  | _        |	| _        |	| _        || _        ||	z  | j                  z  | _        y# t        $ r}t        t        |            d}~ww xY w# t        $ r t        d      w xY w)zRaises errorCOMMN   z>hLh10szInvalid sample rater   )rP   KeyErrorr   strreadr   r    r!   intr*   sample_rater"   floatlengthbits_per_samplesample_sizechannelsbitrate)r;   rM   iffcommon_chunker$   infori   frame_countrh   rd   s              r   rK   zAIFFInfo.__init__   s"    w	 w<L   "t9r>K}}YSb	2:>7+{K	/":k#:;D a-..q %d.>.>(??DK*& +-0@0@@-  	 A-	   	/-..	/s#   C# D #	D,D  DDc                 d    d| j                   | j                  | j                  | j                  fz  S )Nz-%d channel AIFF @ %d bps, %s Hz, %.2f seconds)ri   rj   rd   rf   rA   s    r   pprintzAIFFInfo.pprint   s3    ?MM4<<)9)94;;CH H 	Hr   N)r   r   r   rC   rf   rj   ri   rd   r   IOErrorr   rK   rq   r   r   r   r\   r\   y   s>     FGHK7E"A #A<Hr   r\   c                       e Zd ZdZd Zy)_IFFID3zA AIFF file with ID3v2 tagsc                     t        |      S rG   )rP   )r;   rM   s     r   
_load_filez_IFFID3._load_file   s      r   N)r   r   r   rC   rv   r   r   r   rt   rt      s
    %!r   rt   FT)methodwritablec                 P    	 t        | j                        d= y# t        $ r Y yw xY w)z3Completely removes the ID3 chunk from the AIFF fileID3N)rP   rM   r`   )	filethings    r   r   r      s,    
Y&&'/ s    	%%c                   `    e Zd ZdZddgZed        Zd Z ee	e
       e       d               Zy)r   zAIFF(filething)

    An AIFF audio file.

    Arguments:
        filething (filething)

    Attributes:
        tags (`mutagen.id3.ID3`)
        info (`AIFFInfo`)
    z
audio/aiffzaudio/x-aiffc                     | j                         } |j                  d      dz  t        | d      z   t        | d      z   t        | d      z   S )Ns   FORM   s   .aifs   .aiffs   .aifc)lower
startswithr   )filenamerM   r0   s      r   scorez
AIFF.score   sR    >>#!!'*Q.(G1LL8,-/7(/KL 	Mr   c                 P    | j                   t               | _         yt        d      )z!Add an empty ID3 tag to the file.Nzan ID3 tag already exists)tagsrt   r   rA   s    r   add_tagszAIFF.add_tags   s!    99	DI344r   c                    |j                   }	 t        |fi || _        | j                  | j                  _        |j                  dd       t        |      | _	        y# t        $ r
 d| _        Y 5t
        $ r}t        |      d}~ww xY w)z,Load stream and tag information from a file.Nr   )
rM   rt   r   r   r   ID3Errorr   seekr\   rn   )r;   r{   kwargsrM   rm   s        r   loadz	AIFF.load   s{    
 ##	/262DI "&DIIQW%	   	DI 	(N	s   A B/B7BBN)r   r   r   rC   _mimesstaticmethodr   r   r   rr   r   r   r   r   r   r   r   r      sQ    
 N+FM M5 7E"Z&  #&r   r   )!rC   r    r   mutagenr   r   mutagen.id3._utilr   r   r   mutagen._iffr   r	   r
   r   r   IffErrormutagen._utilr   r   r   __all__	_HUGE_VALr*   r,   r5   rP   r\   rt   rr   r   r   r   r   r   r   <module>r      s    .   ( A   %	H 	
 "	(8 8*I5 (w (.5Hz 5Hp!f ! w	& ' .&8 .&b r   