
46ic        	   @   s  d  d l  Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z e j j d d  Z	 e	 ry d  d l
 j j Z n e Z e a e j   Z d a d   Z d   Z d e f d     YZ d	 e j j f d
     YZ d a d e f d     YZ y d  d l m Z Wn n Xy d  d l m Z Wn n Xg  Z i  Z e e e  e! d d e  e! d  Z" d   Z# d   Z$ d   Z% d   Z& d   Z' e a( e! a) d   Z* d   Z+ d   Z, e! a- d   Z. d   Z/ d   Z0 d   Z1 d S(   iNt   RENPY_DISABLE_SOUNDt    i    c           C   s   t  d 7a  t t  f S(   sE   
    Gets a globally unique serial number for each music change.
    i   (   t   serialt   unique(    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt
   get_serial4   s    
c         C   s   t  j j |   } | S(   s<   
    Returns a file-like object for the given filename.
    (   t   renpyt   loadert   load(   t   fnt   rv(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   >   s    t
   QueueEntryc           B   s   e  Z d  Z d   Z RS(   s   
    A queue entry object.
    c         C   s(   | |  _  | |  _ | |  _ | |  _ d  S(   N(   t   filenamet   fadeint   tightt   loop(   t   selfR   R   R   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   __init__L   s    			(   t   __name__t
   __module__t   __doc__R   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR
   G   s   t   MusicContextc           B   s,   e  Z d  Z d Z e Z d   Z d   Z RS(   s   
    This stores information about the music in a game. This object
    participates in rollback, so when the user goes back in time, all
    the values get reverted as well.
    i    c         C   sh   t  t |   j   d  |  _ d |  _ d  |  _ d |  _ d |  _ t	 |  _
 g  |  _ t	 |  _ t	 |  _ d  S(   Ni    g      ?(   t   superR   R   t   Nonet   pan_timet   pant   secondary_volume_timet   secondary_volumet   last_changedt   Falset
   last_tightt   last_filenamest
   force_stopt   pause(   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   ^   s    								c         C   s    t    } | j j |  j  | S(   s9   
        Returns a shallow copy of this context.
        (   R   t   __dict__t   update(   R   R	   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   copy}   s    	(   R   R   R   t   __version__R   R    R   R#   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   S   s
   	t   Channelc           B   s   e  Z d  Z d   Z d   Z e e  Z d   Z e e  Z d   Z	 d   Z
 e d  Z d   Z d   Z e e d	 d e d
  Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z RS(   sD   
    This stores information about the currently-playing music.
    c	   	      C   s   | |  _  d  |  _ d  |  _ d |  _ d |  _ g  |  _ g  |  _ t |  _	 t |  _
 t |  _ d |  _ d  |  _ d  |  _ d  |  _ | |  _ | |  _ d |  _ | |  _ | |  _ | |  _ t |  _ | d  k r t |  _ t |  _ n | |  _ t |  _ | |  _ d  S(   Ng      ?i    (   t   nameR   t   _numbert   mixert   chan_volumet   actual_volumet   queueR   R   t   playingt	   wait_stopt   synchro_startR   t   callbackR   R   t   stop_on_muteR   t
   keep_queuet   file_prefixt   file_suffixt   buffer_queuet   pausedt   Truet   default_loopt   default_loop_sett   movie(	   R   R&   R7   R0   R   R2   R3   R4   R9   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR      s6    																								c         C   s3   |  j  } | d k r/ t } |  _  t d 7a n  | S(   sk   
        Returns the number of this channel, allocating a number if that
        proves necessary.
        i   N(   R'   R   t   next_channel_number(   R   R	   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt
   get_number   s
    	c         C   sK   t  j j   j } | j |  j  } | d k rG t   } | |  j <n  | S(   s   
        Returns the MusicContext corresponding to this channel, taken from
        the context object. Allocates a MusicContext if none exists.
        N(   R   t   gamet   contextt   musict   getR&   R   R   (   R   t   mcdR	   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   get_context   s
    c   
         sA   f d        f d   } t  j d   } | sF  d d f S| j d   | j d  }  j    d } d } d } x  r j d  }	 |	 d k r |   } q |	 d	 k r |   } q |	 d
 k r |   } q |	 d k r |   } d } q   d j |	    q W| d k	 r4| r4| } n  | | | f S(   sN   
        Splits a filename into a filename, start time, and end time.
        c            s   t  d j   |    S(   Ns   Parsing audio spec {!r}: {}.(   t	   Exceptiont   format(   t   msg(   R   (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt	   exception  s    c             sU    s   d   n   j  d  }  y t |   SWn   d j |     n Xd  S(   Ns   expected float at end.i    s   expected float, got {!r}.(   t   popt   floatRC   (   t   v(   RE   t   spec(    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   expect_float  s    s
   <(.*)>(.*)i    ii   i   t   fromt   toR   t   silences   _silence.oggs   expected keyword, got {!r}.N(   t   ret   matcht   groupt   splitR   RF   RC   (
   R   R   t   loopedRJ   t   mR   t   startR   t   endt   clause(    (   RE   R   RI   s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   split_filename  s4    				c         C   sG  |  j  t j j j |  j } | |  j k rK t j |  j	 |  | |  _ n  |  j
 j ps t j j j |  j os |  j } |  j r | r t j |  j	  t |  _ t |  _ n  | r |  j r |  j t |  j  |  _ n	 g  |  _ d St } d } xot r`t j |  j	  } | d k r+t |  _ t |  _ n  |  j s8Pn  | d k rHPn  |  j rb| d k rbPn  |  j ru| ruPn  t j |  j	  d k rPn  |  j j d  } | j j   |  j j   } x& d D] } | j |  rd } qqW| sq n  y|  j | j | j  \ } }	 }
 |
 d k rC|
 |	 d k rC|  j rCw n  t  |  j! | |  j  } t j" |  j	 |  j#  | d k rt j$ |  j	 | | j d	 |  j d
 | j% d | j& d |	 d |
 n7 t j |  j	 | | j d
 | j% d | j& d |	 d |
 t |  _ WnV x) | j |  j k r4|  j j' | j  qWt j( j) rTt j j* rT  q\d Sn XPq W|  j r|  j rxf |  j D]R } | d k	 rt+ | d | j& t  } n t+ | d t t  } |  j j, |  q~Wn t } | r|  j- r|  j-   n  |  j
 j. pt/ } |  j0 | k rC| r-|  j.   n
 |  j1   | |  _0 n  d S(   s}   
        This is the periodic call that causes this channel to load new stuff
        into its queues, if necessary.
        Ni    i   i   s   .mods   .xms   .mids   .midiR5   R   R   RT   RU   (   s   .mods   .xms   .mids   .midi(2   R)   R   R<   t   preferencest   volumesR(   R*   t
   renpysoundt
   set_volumet   numberR=   R   t   muteR0   R,   t   stopR   R-   R   R+   t   lenR   R6   t   queue_depthR4   R.   RF   R   t   lowerR3   t   endswithRW   R   R2   t	   set_videoR9   t   playR   R   t   removet   configt   debug_soundt   after_rollbackR
   t   appendR/   R    t   global_pauseR5   t   unpause(   R   t   volR   t   do_callbackt   topqt   deptht   lfnt   iR   RT   RU   t   topft   newqt
   want_pause(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   periodic<  s    +						!%C7
c         C   sO   |  j  |  j  |  _  g  |  _ t s& d S|  j d k rK t j |  j |  n  d S(   s   
        Clears the queued music.

        If the first item in the queue has not been started, then it is
        left in the queue unless all is given.
        Ni    (   R+   R1   R   t   pcm_okRZ   t   dequeueR\   (   R   t
   even_tight(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyRw     s    	c         C   s   d |  _  t r |  j |  j j k rR |  j j |  _ t j |  j |  j j d  n  |  j |  j j k r |  j j |  _ t j	 |  j |  j j
 d  q n  |  j r |  j r |  j   n  d S(   s7   
        Called (mostly) once per interaction.
        i    N(   R1   Rv   R   R=   RZ   t   set_panR\   R   R   t   set_secondary_volumeR   R+   R/   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   interact  s    		
	c         C   s]   d |  _  |  j   t s d S| d k r< t j |  j  n t j |  j t | d   d S(   s   
        Causes the playing music to be faded out for the given number
        of seconds. Also clears any queued music.
        i    Ni  (   R1   Rw   Rv   RZ   R^   R\   t   fadeoutt   int(   R   t   secs(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR|     s    	
i    c   
      C   s   x< | D]4 } |  j  | t  \ } } } t t j j j | <q Wt sI d  S| s | d  k rg |  j	 } n  |  j
 d 7_
 xC | D]; } t | t | d  | t  }	 |  j j |	  d } q} W| |  _ | |  _ n  | r t |  |  _ n	 g  |  _ d  S(   Ni   i  i    (   RW   R   R6   R   R<   t
   persistentt   _seen_audioRv   R   R   R1   R
   R}   R+   Ri   R-   R.   t   listR   (
   R   t	   filenamesR   R.   R   R   t	   loop_onlyR   t   _t   qe(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   enqueue   s$    
	c         C   sm   t  s
 d  St j |  j  } | d  k rD |  j rD |  j d j } n  | d  k ri |  j ri |  j d } n  | S(   Ni    (   Rv   R   RZ   t   playing_nameR\   R+   R   R   (   R   R	   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   get_playing  s    c         C   s   | |  _  d  S(   N(   R)   (   R   t   volume(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR[   .  s    c         C   s   t  s
 d St j |  j  S(   Ni(   Rv   RZ   t   get_posR\   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   1  s    c         C   s   t  s
 d St j |  j  S(   Ng        (   Rv   RZ   t   get_durationR\   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   8  s    c         C   sY   t    } | |  j _ | |  j _ t rU |  j j |  _ t j |  j |  j j |  n  d  S(   N(   R   R=   R   R   Rv   RZ   Ry   R\   (   R   R   t   delayt   now(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyRy   ?  s    	c         C   sY   t    } | |  j _ | |  j _ t rU |  j j |  _ t j |  j |  j j |  n  d  S(   N(   R   R=   R   R   Rv   RZ   Rz   R\   (   R   R   R   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyRz   H  s    	c         C   s   t  j |  j  d  S(   N(   RZ   R    R\   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR    Q  s    c         C   s   t  j |  j  d  S(   N(   RZ   Rk   R\   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyRk   T  s    c         C   s   t  r t j |  j  Sd  S(   N(   Rv   RZ   t
   read_videoR\   R   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   W  s    c         C   s   t  s
 d St j |  j  S(   Ni   (   Rv   RZ   t   video_readyR\   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR   \  s    N(   R   R   R   R   R;   t   propertyR\   RA   R=   RW   Ru   R   Rw   R{   R|   R6   R   R   R   R[   R   R   Ry   Rz   R    Rk   R   R   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR%      s,   	W			5														(   t   AndroidVideoChannel(   t   IOSVideoChannelc	   
   
   C   s  |  d k r t  } n  t j j   j rC d |  k rC t d   n  t j r t j j r |  d k r t	 |  d | d | d | }	 nf t j
 r t j j r |  d k r t |  d | d | d | }	 n$ t |  | | | | | | d | }	 | |	 _ t j |	  |	 t |  <d S(   s  
    :doc: audio

    This registers a new audio channel named `name`. Audio can then be
    played on the channel by supplying the channel name to the play or
    queue statements.

    `mixer`
        The name of the mixer the channel uses. By default, Ren'Py
        knows about the "music", "sfx", and "voice" mixers. Using
        other names is possible, but may require changing the
        preferences screens.

    `loop`
        If true, sounds on this channel loop by default.

    `stop_on_mute`
        If true, music on the channel is stopped when the channel is muted.

    `tight`
        If true, sounds will loop even when fadeout is occurring. This should
        be set to True for a sound effects or seamless music channel, and False
        if the music fades out on its own.

    `file_prefix`
        A prefix that is prepended to the filenames of the sound files being
        played on this channel.

    `file_suffix`
        A suffix that is appended to the filenames of the sound files being
        played on this channel.

    `buffer_queue`
        Should we buffer the first second or so of a queued file? This should
        be True for audio, and False for movie playback.

    `movie`
        If true, this channel will be set up to play back videos.
    R9   t    s-   Can't register channel outside of init phase.R7   R2   R3   N(   R6   R   R<   R=   t
   init_phaseRB   t   androidRf   t   hw_videoR   t   iosR   R%   R(   t   all_channelsRi   t   channels(
   R&   R(   R   R0   R   R2   R3   R4   R9   t   c(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   register_channelw  s    )	!!!!$	c         C   s;   t  j j   j s! t d   n  t |   } | t | <d  S(   Ns*   Can't alias channel outside of init phase.(   R   R<   R=   R   RB   t   get_channelR   (   R&   t   newnameR   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   alias_channel  s    c      
   C   s   t  j |  d   } | d  k r |  t j j k r d } x t r t d j |  |   } | j	   sg | St j j
 rw | S| d 7} q9 Wq d |  k r |  j   d } t j j | \ } } } t |  d t d | d | d | t  |  St d	 |    n  | S(
   Ni    s   {} {}i   R   R   R(   R2   R3   s   Audio channel %r is unknown.(   R   R?   R   R   Rf   t   auto_channelsR6   R   RC   R   t   skippingRQ   R   R   RB   (   R&   R	   Rq   R   t   baseR(   R2   R3   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s.    	c         C   s   | t  |   j _ d  S(   N(   R   R=   R   (   R&   t   value(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   set_force_stop  s    c          C   s*  t  j j s t a t a d  St d  k r t r d }  d t j	 k rY t
 t j	 d  }  n  y& t j t  j j d |  t  t a Wq t  j j r   n  t a q Xn  g  } x0 t D]( } | j | k r | j | j  q q Wd } x@ | D]8 } t  j j j j | |  t  j j j j | t  q Wd  S(   Ni   t   RENPY_SOUND_BUFSIZEi   g      ?(   R   Rf   t   soundR   Rv   t   mix_okR   RZ   t   ost   environR}   t   initt   sound_sample_rateR6   Rg   R   R(   Ri   R<   RX   RY   t
   setdefaultR]   (   t   bufsizet   mixersR   t   default_volumeRS   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s.    
c          C   s   t  s
 d  Sx[ t D]S }  |  j   |  j d  g  |  _ g  |  _ t |  _ t |  _ t |  _	 t |  _
 q Wt j   d  a  d  a d  S(   Ni    (   Rv   R   Rw   R|   R+   R   R   R,   t   playing_midiR-   R.   RZ   t   quitR   R   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s    
					
c          C   s  t  s
 t Syg  }  t } xB t j j D]4 } t |  } |  j |  | j   r& t } q& q& Wt j	 j
 j sv t } n  | r t r t j j } n | r t r d } n d } | a | d k	 r x9 t D]. } | |  k r q n  | j | t j j  q Wn  x t D] } | j   qWt j   t } xF t D]> } | j rP| j rPt } Pn  | j r.| j r.t } q.q.W| rt j   x t D] } t | _ qWn  Wn t j j r  qn Xd S(   s	  
    The periodic sound callback. This is called at around 20hz, and is
    responsible for adjusting the volume of the playing music if
    necessary, and also for calling the periodic functions of midi and
    the various channels, which then may play music.
    g      ?N(   Rv   R   R   Rf   t   emphasize_audio_channelsR   Ri   R   R6   R<   RX   t   emphasize_audiot   old_emphasizedt   emphasize_audio_volumeR   R   Rz   t   emphasize_audio_timeRu   RZ   R.   R-   t   unpause_allRg   (   t   emphasize_channelst
   emphasizedRq   R   Rl   t   need_ss(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyRu   1  sP    		

c       	   C   s   t  s
 d Sy x t D] }  |  j   |  j } |  j | j k rE q n  | j } | j } |  j r | sy |  j   | k r |  j	 t
 j j  q n  | r |  j | d t d t d | n  | j |  _ q WWn t
 j j r   q n Xt   d S(   s/   
    Called at least once per interaction.
    NR   R.   R   (   Rv   R   R{   R=   R   R   R   R   R   R|   R   Rf   t
   fade_musicR   R6   Rg   Ru   (   R   t   ctxR   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR{   {  s(    
				"
c          C   s.   x' t  D] }  |  j s |  j d  q q Wd S(   sN   
    On rollback, we want to stop all the channels with non-empty sounds.
    i    N(   R   R   R|   (   R   (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   rollback  s    	c           C   s   t  a t   d S(   s&   
    Pause all playback channels.
    N(   R6   Rj   Ru   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt	   pause_all  s    c           C   s   t  a t   d S(   s(   
    Unpause all playback channels.
    N(   R   Rj   Ru   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s    c         C   s   t  s
 d  St  j |  |  d  S(   N(   RZ   t   sample_surfaces(   t   rgbt   rgba(    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s    c           C   s   t  s
 d  St  j   d  S(   N(   RZ   t   advance_time(    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyR     s    (2   t   renpy.audioR   t   renpy.displayt   timet   pygame_sdl2R   RN   R   R?   t   disablet   renpy.audio.renpysoundt   audioRZ   R   Rv   R   R   R   R   t   objectR
   t   pythont   RevertableObjectR   R:   R%   t   renpy.audio.androidhwR   t   renpy.audio.ioshwR   R   R   R6   R   R   R   R   R   R   R   t
   pcm_volumeR   Ru   R{   R   Rj   R   R   R   R   (    (    (    s`   Z:\home\souce\.local\share\Steam\steamapps\common\Doki Doki Literature Club\renpy\audio\audio.pyt   <module>   sZ   	
		5 !<		.		&		J	*					