
    Cc&                     z   d Z ddlZddlZddl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 ddlmZmZ g dZ G d	 d
e
      Z G d de      Z G d de      Z G d de      Z G d de      Z G d d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 eZ!y)z5Read and write DSF audio stream information and tags.    N)BytesIO)FileType
StreamInfo)cdataMutagenErrorloadfileconvert_errorreraiseendswith)ID3)ID3NoHeaderErrorerror)DSFOpendeletec                       e Zd Zy)r   N)__name__
__module____qualname__     -/usr/lib/python3/dist-packages/mutagen/dsf.pyr   r      s    r   r   c                   0    e Zd ZdZdZdZdZd	dZd Zd Z	y)
DSFChunkzA generic chunk of a DSFFile.r   z    c                 b    || _         |s&|j                         | _        | j                          y y N)fileobjtellchunk_offsetload)selfr   creates      r   __init__zDSFChunk.__init__$   s(     'DIIK r   c                     t         r   NotImplementedErrorr"   s    r   r!   zDSFChunk.load+       !!r   c                     t         r   r&   r(   s    r   writezDSFChunk.write.   r)   r   NF)
r   r   r   __doc__r    chunk_header
chunk_sizer$   r!   r+   r   r   r   r   r      s#    'LLJ""r   r   c                   B     e Zd ZdZdZdZdZd fd	Zd Zd Z	d Z
 xZS )	DSDChunkz(Represents the first chunk of a DSF file   r   c                 l    t         t        |   ||       |rd| _        t        j                  | _        y y )N   DSD )superr1   r$   r.   
CHUNK_SIZEr/   r"   r   r#   	__class__s      r   r$   zDSDChunk.__init__:   s1    h&w7 'D&11DO r   c                    | j                   j                  t        j                        }t	        |      t        j                  k7  rt        d      |dd | _        | j                  dk7  rt        d      t        j                  |dd       | _	        | j                  t        j                  k7  rt        d      t        j                  |dd       | _
        t        j                  |dd	       | _        y )
NDSF chunk truncatedr      r4   zDSF dsd header not found   DSF dsd header size mismatch   r2   )r   readr1   r6   lenr   r.   r   ulonglong_ler/   
total_sizeoffset_metdata_chunkr"   datas     r   r!   zDSDChunk.loadA   s    ||  !4!45t9+++-.. 1I'233,,T!BZ8??h111677,,T"R[9$)$6$6tBr{$C!r   c                    t               }|j                  | j                         |j                  t        j                  dt
        j                               |j                  t        j                  d| j                               |j                  t        j                  d| j                               | j                  j                  | j                         | j                  j                  |j                                y )Nz<Q)r   r+   r.   structpackr1   r6   rB   rC   r   seekr    getvalue)r"   fs     r   r+   zDSDChunk.writeQ   s    I	!!"	D("5"567	D$//23	D$";";<=$++,1::<(r   c                 8    d| j                   | j                  fz  S )Nz@DSD Chunk (Total file size = %d, Pointer to Metadata chunk = %d))rB   rC   r(   s    r   pprintzDSDChunk.pprint[   s(    3OOT%>%>6@@ 	Ar   r,   )r   r   r   r-   r6   rB   rC   r$   r!   r+   rM   __classcell__r8   s   @r   r1   r1   2   s,    2JJ2D )Ar   r1   c                   Z     e Zd ZdZdZdZ	 eZeZdZdZ	dZ
dZdZdZd	 fd	Zd Zd Z xZS )
FormatChunk4      r   i + i   c                 l    t         t        |   ||       |rd| _        t        j                  | _        y y )N   fmt )r5   rQ   r$   r.   r6   r/   r7   s      r   r$   zFormatChunk.__init__s   s1    k4)'6: 'D)44DO r   c                    | j                   j                  t        j                        }t	        |      t        j                  k7  rt        d      |dd | _        | j                  dk7  rt        d      t        j                  |dd       | _	        | j                  t        j                  k7  rt        d      t        j                  |dd       | _        | j                  t        j                  k7  rt        d	      t        j                  |dd
       | _        | j                  t        j                  k7  rt        d      t        j                  |d
d       | _        t        j                  |dd       | _        t        j                  |dd       | _        t        j                  |dd       | _        t        j                  |dd       | _        y )Nr:   r   r;   rU   zDSF fmt header not foundr<   r=      zUnsupported format versionr>   zUnsupported format ID   r2       $   ,   )r   r?   rQ   r6   r@   r   r.   r   rA   r/   uint_leformat_versionVERSION	format_idFORMAT_DSD_RAWchannel_typechannel_numsampling_frequencybits_per_samplesample_countrD   s     r   r!   zFormatChunk.loadz   sx   ||  !7!78t9...-.. 1I'233,,T!BZ8??k444677#mmDBK8+"5"55455tBr{3>>[777/00!MM$r"+6 ==b5"'--R"<$}}T"R[9!..tBr{;r   c                 d    d| j                   | j                  | j                  | j                  fz  S )NzVfmt Chunk (Channel Type = %d, Channel Num = %d, Sampling Frequency = %d, %.2f seconds))ra   rb   rc   lengthr(   s    r   rM   zFormatChunk.pprint   s6    9!!4#3#3T5L5L 	r   r,   )r   r   r   r6   r^   r`   r]   r_   ra   rb   rc   rd   re   block_size_per_channelr$   r!   rM   rN   rO   s   @r   rQ   rQ   a   sN    JGNNILK OL!5<6r   rQ   c                   4     e Zd ZdZdZd fd	Zd Zd Z xZS )	DataChunkr<    c                 l    t         t        |   ||       |rd| _        t        j                  | _        y y )N   data)r5   rj   r$   r.   r6   r/   r7   s      r   r$   zDataChunk.__init__   s1    i'8 'D'22DO r   c                 v   | j                   j                  t        j                        }t	        |      t        j                  k7  rt        d      |dd | _        | j                  dk7  rt        d      t        j                  |dd       | _	        | j                  t        j                  k  rt        d      y )Nr:   r   r;   rm   zDSF data header not foundr<   zDSF data header size mismatch)
r   r?   rj   r6   r@   r   r.   r   rA   r/   rD   s     r   r!   zDataChunk.load   s    ||  !5!56t9	,,,-.. 1I'344,,T!BZ8??Y111788 2r   c                 8    d| j                   | j                  fz  S )Nz/data Chunk (Chunk Offset = %d, Chunk Size = %d))r    r/   r(   s    r   rM   zDataChunk.pprint   s$    AtE0 0 	0r   r,   )	r   r   r   r6   rE   r$   r!   rM   rN   rO   s   @r   rj   rj      s    JD390r   rj   c                   f    e Zd ZdZ eee      d        Z eee       ed      dd              Z	y)_DSFID3zA DSF file with ID3v2 tagsc                     |j                  d       t        |      j                  }|dk(  rt        d      |j                  |       y )Nr   zFile has no existing ID3 tag)rI   r1   rC   r   )r"   r   id3_locations      r   _pre_load_headerz_DSFID3._pre_load_header   s=    Q(==1"#ABB\"r   TwritableNc                 p   |j                   }|j                  d       t        |      }|j                  dk(  r7|j                  dd       |j	                         |_        |j                          	 | j                  ||j                  | j                  |||      }|j                  |j                         |j                         |j                          |j	                         |_        |j                          y# t        $ r0}t        t        |t        j                         d          Y d}~d}~ww xY w)zSave ID3v2 data to the DSF filer      N)r   rI   r1   rC   r   r+   _prepare_datasizeID3Errorr
   r   sysexc_infotruncaterB   )	r"   	filething
v2_versionv23_seppaddingr   
dsd_headerrE   es	            r   savez_DSFID3.save   s    
 ##Qg&
**a/LLA /6llnJ+	1%%88$))GW.D 	Z445d !(
  	1E1cllnQ/00	1s   0*C< <	D5&D00D5)Nr;   /N)
r   r   r   r-   r	   IOErrorr   rt   r   r   r   r   r   rq   rq      sF    $7E"# ## 7E"t  #r   rq   c                   l    e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
d Zy	)
DSFInfoa  DSF audio stream information.

    Information is parsed from the fmt chunk of the DSF file.

    Attributes:
        length (`float`): audio length, in seconds.
        channels (`int`): The number of audio channels.
        sample_rate (`int`):
            Sampling frequency, in Hz.
            (2822400, 5644800, 11289600, or 22579200)
        bits_per_sample (`int`): The audio sample size.
        bitrate (`int`): The audio bitrate.
    c                     || _         y r   )	fmt_chunk)r"   r   s     r   r$   zDSFInfo.__init__   s	    "r   c                 Z    t        | j                  j                        | j                  z  S r   )floatr   re   sample_rater(   s    r   rg   zDSFInfo.length   s"    T^^001D4D4DDDr   c                 .    | j                   j                  S r   )r   rb   r(   s    r   channelszDSFInfo.channels   s    ~~)))r   c                 .    | j                   j                  S r   )r   rc   r(   s    r   r   zDSFInfo.sample_rate  s    ~~000r   c                 .    | j                   j                  S r   )r   rd   r(   s    r   rd   zDSFInfo.bits_per_sample  s    ~~---r   c                 N    | j                   | j                  z  | j                  z  S r   )r   rd   r   r(   s    r   bitratezDSFInfo.bitrate
  s"    $"6"66FFr   c                 d    d| j                   | j                  | j                  | j                  fz  S )Nz-%d channel DSF @ %d bits, %s Hz, %.2f seconds)r   rd   r   rg   r(   s    r   rM   zDSFInfo.pprint  s5    ?MM4//1A1A4;;CP P 	Pr   N)r   r   r   r-   r$   propertyrg   r   r   rd   r   rM   r   r   r   r   r      sz    # E E * * 1 1 . . G GPr   r   c                       e Zd ZdZdZdZd Zy)DSFFileNc                 d    t        |      | _        t        |      | _        t	        |      | _        y r   )r1   	dsd_chunkrQ   r   rj   
data_chunk)r"   r   s     r   r$   zDSFFile.__init__  s&    !'*$W-#G,r   )r   r   r   r   r   r   r$   r   r   r   r   r     s    IIJ-r   r   c                   ~    e Zd ZdZdgZed        Zd Z ee	e
       e       d               Z ed      d
d	       Zy)r   zAn DSF audio file.

    Arguments:
        filething (filething)

    Attributes:
        info (`DSFInfo`)
        tags (`mutagen.id3.ID3Tags` or `None`)
    z	audio/dsfc                 `    |j                  d      dz  t        | j                         d      z   S )Nr4   rx   z.dsf)
startswithr   lower)filenamer   headers      r   scorez	DSF.score,  s0      )A-X^^%v./ 	/r   c                 P    | j                   t               | _         yt        d      )z Add a DSF tag block to the file.Nzan ID3 tag already exists)tagsrq   r   r(   s    r   add_tagszDSF.add_tags1  s#     99	DI344r   c                 *   t        |j                        }	 t        |j                  fi || _        | j                  | j                  _        t        |j                        | _
        y # t
        $ r
 d | _        Y -t        $ r}t        |      d }~ww xY wr   )r   r   rq   r   r   r   r{   r   r   r   info)r"   r   kwargsdsf_filer   s        r   r!   zDSF.load9  s~     9,,-	/	 1 1<V<DI "&DIIH../	   	DI 	(N	s   A( (B:BBBTru   Nc                 (    d | _         t        |       y r   )r   r   )r"   r   s     r   r   z
DSF.deleteI  s    	yr   r   )r   r   r   r-   _mimesstaticmethodr   r   r	   r   r   r   r!   r   r   r   r   r   r     se     ]F/ /5 7E"Z0  #0 t r   r   FT)methodrv   c                 N   t        | j                        }|j                  j                  dk7  rw|j                  j                  }d|j                  _        |j                  j	                          | j                  j                  |       | j                  j                          yy)zoRemove tags from a file.

    Args:
        filething (filething)
    Raises:
        mutagen.MutagenError
    r   N)r   r   r   rC   r+   rI   r~   )r   r   rs   s      r   r   r   O  s     y(()H..!3))>>23/  "|,""$ 4r   )"r-   r|   rG   ior   mutagenr   r   mutagen._utilr   r   r   r	   r
   r   mutagen.id3r   mutagen.id3._utilr   r   r{   __all__objectr   r1   rQ   rj   rq   r   r   r   r   r   r   r   r   r   <module>r      s    <    (% %  A $	L 	"v "*,Ax ,A^8( 8v0 0>*c *Z(Pj (PV	-f 	--( -` w	&% ' %( r   