
    Cc                     d   d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZmZ ddlmZmZmZ g dZ G d	 d
e      Z G d de      Z G d de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)DSDIFF audio stream information and tags.    N)
StreamInfo)FileType)IffChunkIffContainerChunkMixinIffID3IffFileInvalidChunkerror)ID3NoHeaderErrorr
   )convert_errorloadfileendswith)DSDIFFOpendeletec                       e Zd Zy)r
   N)__name__
__module____qualname__     0/usr/lib/python3/dist-packages/mutagen/dsdiff.pyr
   r
   !   s    r   r
   c                   @    e Zd ZdZdZed        Zed        Zd Zd Z	y)DSDIFFChunkz'Representation of a single DSDIFF chunk   c                 .    t        j                  d|      S Nz>4sQ)structunpack)clsheaders     r   parse_headerzDSDIFFChunk.parse_header,   s    }}VV,,r   c                 L    |t         j                  v rt         S |dk(  rt        S | S )NDST)DSDIFFListChunkLIST_CHUNK_IDSDSTChunk)r    ids     r   	get_classzDSDIFFChunk.get_class0   s'    ///""5[OJr   c                 d    | j                   j                  t        j                  d||             y r   )_fileobjwriter   pack)selfid_sizes      r   write_new_headerzDSDIFFChunk.write_new_header9   s!    FKKT:;r   c                 v    | j                   j                  t        j                  d| j                               y )Nz>Q)r+   r,   r   r-   	data_sizer.   s    r   
write_sizezDSDIFFChunk.write_size<   s#    FKKdnn=>r   N)
r   r   r   __doc__HEADER_SIZEclassmethodr"   r)   r1   r5   r   r   r   r   r   '   s:    1K- -  <?r   r   c                   $    e Zd ZdZddgZd Zd Zy)r%   ,A DSDIFF chunk containing other chunks.
    FRM8PROPc                 B    t         j                  | j                  |       S Nr   parser+   r4   s    r   parse_next_subchunkz#DSDIFFListChunk.parse_next_subchunkF         55r   c                     || j                   vrt        d|z        t        j                  | ||||       | j	                          y )NzNot a list chunk: %s)r&   r	   r   __init__init_containerr.   fileobjr(   r3   parent_chunks        r   rD   zDSDIFFListChunk.__init__I   sC    T(((5:;;T7B	<Hr   N)r   r   r   r6   r&   rA   rD   r   r   r   r%   r%   @   s     f%N6r   r%   c                       e Zd ZdZd Zd Zy)r'   r:   c                 B    t         j                  | j                  |       S r>   r?   r4   s    r   rA   zDSTChunk.parse_next_subchunkU   rB   r   c                     |dk7  rt        d|z        t        j                  | ||||       | j                  d       y )Nr$   zNot a DST chunk: %sr   )	name_size)r	   r   rD   rE   rF   s        r   rD   zDSTChunk.__init__X   sA    ;4r9::T7B	<Ha(r   N)r   r   r   r6   rA   rD   r   r   r   r'   r'   Q   s    6)r   r'   c                   "     e Zd ZdZ fdZ xZS )
DSDIFFFilezRepresentation of a DSDIFF filec                     t         |   t        |       | j                  j                  dk7  rt        d| j                  z        y )Nr;   z'Root chunk must be a FRM8 chunk, got %r)superrD   r   rootr(   r	   )r.   rG   	__class__s     r   rD   zDSDIFFFile.__init__c   sC    g.99<<7"H!% + , , #r   )r   r   r   r6   rD   __classcell__)rR   s   @r   rN   rN   `   s    ), ,r   rN   c                   L    e Zd ZdZdZdZdZdZdZdZ	 e
ee      d        Zd Zy)
DSDIFFInfoa  DSDIFF stream information.

    Attributes:
        channels (`int`): number of audio channels
        length (`float`): file length in seconds, as a float
        sample_rate (`int`): audio sampling rate in Hz
        bits_per_sample (`int`): audio sample size (for DSD this is always 1)
        bitrate (`int`): audio bitrate, in bits per second
        compression (`str`): DSD (uncompressed) or DST
    r      Nc                    t        |      }	 |d   }|j                  dk(  ro|j                         D ][  }|j                  dk(  rY|j                  dk(  rJ|j                         }t        |      dk  rt        d      t        j                  d|dd       \  | _        l|j                  dk(  rY|j                  d	k\  rJ|j                         }t        |      d	k  rt        d
      t        j                  d|dd	       \  | _        |j                  dk(  s|j                  dk\  s|j                         }t        |      dk  rt        d      t        j                  d|dd       \  }|j                  d      j!                         | _        ^ | j                  dk  rt        d      | j"                  dk(  r~	 |d   }|j                  dz  | j                  xs dz  }	| j                  dk7  r|	t%        | j                        z  | _        | j                  | j(                  z  | j                  z  | _        y| j"                  dk(  r	 |d   }
|
d   }|j                  dk\  r|j                         }t        |      dk  rt        d      t        j                  d|dd       \  }}|r
||z  | _        |r,|
j                  |j,                  z
  }||z  }|dz  |z  | _        yyyy# t        $ r}t        t        |            d}~ww xY w# t        $ r}t        t        |            d}~ww xY w# t        $ r}t        t        |            d}~ww xY w)zRaises errorr<   NzSND FS   zNot enough data in FS chunkz>LCHNL   zNot enough data in CHNL chunkz>HCMPRzNot enough data in CMPR chunkz>4sasciir   zInvalid sample rateDSD   rV   r$   FRTE   zNot enough data in FRTE chunkz>LH)rN   KeyErrorr
   strname	subchunksr(   r3   readlenr	   r   r   sample_ratechannelsdecoderstripcompressionfloatlengthbits_per_samplebitrater0   )r.   rG   iff
prop_chunkechunkdatacompression_id	dsd_chunksample_count	dst_framedst_frame_infoframe_count
frame_ratedst_data_sizeavg_frame_sizes                   r   rD   zDSDIFFInfo.__init__   s!    !	 VJ ??f$#--/ O88t#1(< ::<D4y1}*+HII(.dD!H(E%D$XX'EOOq,@ ::<D4y1}*+JKK%+]]4bq%BNDMXX'EOOq,@ ::<D4y1}*+JKK&,mmE48&DON'5'<'<W'E'L'L'ND$!O$ a-..u$$J	 %..2dmm6HqIL1$*U43C3C-DD MMD,@,@@"../DL&$J	!*6!2 ''1,%**,t9q=&'FGG*0--tBQx*H'Z"-
":DK$-$7$7.:M:M$MM%2[%@N#1A#5
#BDL  - 'U  	 A-	 8  $CFm#$$  $CFm#$sG   K# ;L 
L- #	L,L  L	L*L%%L*-	M6M

Mc                 z    d| j                   | j                  | j                  | j                  | j                  fz  S )Nz4%d channel DSDIFF (%s) @ %d bps, %s Hz, %.2f seconds)ri   rl   rp   rh   rn   r4   s    r   pprintzDSDIFFInfo.pprint   s9    FMM4++T\\4;K;KKKJ  	r   )r   r   r   r6   ri   rn   rh   ro   rp   rl   r   IOErrorr
   rD   r   r   r   r   rU   rU   k   sJ    	 HFKOGK7E"BC #BCHr   rU   c                       e Zd ZdZd Zy)
_DSDIFFID3zA DSDIFF file with ID3v2 tagsc                     t        |      S r>   )rN   )r.   rG   s     r   
_load_filez_DSDIFFID3._load_file   s    '""r   N)r   r   r   r6   r   r   r   r   r   r      s
    '#r   r   FT)methodwritablec                 P    	 t        | j                        d= y# t        $ r Y yw xY w)z5Completely removes the ID3 chunk from the DSDIFF fileID3N)rN   rG   rb   )	filethings    r   r   r      s,    
y(()&1 s    	%%c                   ^    e Zd ZdZdgZ eee       e       d               Z	d Z
ed        Zy)r   zDSDIFF(filething)

    An DSDIFF audio file.

    For tagging ID3v2 data is added to a chunk with the ID "ID3 ".

    Arguments:
        filething (filething)

    Attributes:
        tags (`mutagen.id3.ID3`)
        info (`DSDIFFInfo`)
    zaudio/x-dffc                    |j                   }	 t        |fi || _        | j                  | j                  _        |j                  dd       t        |      | _	        y # t        $ r
 d | _        Y 5t
        $ r}t        |      d }~ww xY w)Nr   )
rG   r   tagsfilenamer   ID3Errorr
   seekrU   info)r.   r   kwargsrG   rs   s        r   loadzDSDIFF.load   s{     ##	/"75f5DI "&DIIQw'	   	DI 	(N	s   A B/B7BBc                 P    | j                   t               | _         yt        d      )zAdd empty ID3 tags to the file.Nzan ID3 tag already exists)r   r   r
   r4   s    r   add_tagszDSDIFF.add_tags   s!    99"DI344r   c                 D    |j                  d      dz  t        | d      z   S )Ns   FRM8r[   z.dff)
startswithr   )r   rG   r!   s      r   scorezDSDIFF.score  s$      )A-60JJJr   N)r   r   r   r6   _mimesr   r   r
   r   r   r   staticmethodr   r   r   r   r   r      sN     _F7E"Z(  #(5 K Kr   r   ) r6   r   mutagenr   mutagen._filer   mutagen._iffr   r   r   r   r	   r
   IffErrormutagen.id3._utilr   r   mutagen._utilr   r   r   __all__r   r%   r'   rN   rU   r   r   r   r   r   r   r   r   <module>r      s    0   "  B  '	H 	?( ?2k#9 "){2 ), ,\ \~# # w	& ' +KX +K\ r   