§
    ‘M§jN(  ã                   ó@  — d Z ddlZddlZddlZddlmZ ddlZdej        d<   i Z	dZ
da ej        ¦   «         Zh d£Zd	„ Z ed
¦  «        Z ed¦  «        Zdadadadad„ Zd„ Zd„ Zdd„Zde
fd„Zd„ Ze
fd„Ze
fd„Ze
fd„Zdd„Zdd„Z dd„Z!dD ]Z" ee"¦  «         ŒdS )aA  Notification sounds for Wan2GP video generation application.

Pure Python audio notification system with multiple backend support.
Set WAN2GP_DISABLE_AUDIO=1 on headless servers to skip pygame/sounddevice initialization.
Set WAN2GP_FORCE_AUDIO=1 to bypass the automatic device detection when audio hardware is available.
é    N)ÚPathÚ1ÚPYGAME_HIDE_SUPPORT_PROMPTiD¬  F>   r   ÚonÚyesÚtruec                 óœ   — t           j                             | d¦  «        }|                     ¦   «                              ¦   «         t
          v S )NÚ )ÚosÚenvironÚgetÚstripÚlowerÚ_TRUE_VALUES)ÚnameÚvalues     úGC:\Users\johnn\OneDrive\Documents\AI\shared\utils\notification_sound.pyÚ	_env_flagr      s6   € ÝŒJ�NŠN˜4 Ñ$Ô$€EØ�;Š;‰=Œ=×ÒÑ Ô ¥LÐ0Ð0ó    ÚWAN2GP_FORCE_AUDIOÚWAN2GP_DISABLE_AUDIOc                  óÚ  — t          d¦  «        } |                      ¦   «         sdS 	 |                      d¬¦  «        }n# t          t          f$ r d}Y nw xY w|                     ¦   «         sdS d|                     ¦   «         v rdS t          d	¦  «        }|                     ¦   «         sd
S 	 d„ |                     ¦   «         D ¦   «         }n# t          $ r Y dS w xY wd„ |D ¦   «         }|sdS dS )Nz/proc/asound/cards)Fz//proc/asound/cards is missing (no ALSA devices)Úignore)Úerrorsr
   )Fz8ALSA reports no soundcards (/proc/asound/cards is empty)zno soundcards)Fz/ALSA reports no soundcards (/proc/asound/cards)z/dev/snd)Fz/dev/snd is not availablec                 ó   — g | ]	}|j         ‘Œ
S © )r   )Ú.0Úentrys     r   ú
<listcomp>z*_linux_audio_available.<locals>.<listcomp>6   s   € ÐCÐCÐC u˜œ
ÐCÐCÐCr   )Fz!no permission to inspect /dev/sndc                 ó<   — g | ]}|                      d ¦  «        ¯|‘ŒS ))ÚpcmÚcontrolCÚhwCÚmidiC)Ú
startswith)r   r   s     r   r   z*_linux_audio_available.<locals>.<listcomp>9   s;   € ð ð ð àØ�?Š?Ð>Ñ?Ô?ðØðð ð r   )Fz2no ALSA pcm/control devices exposed under /dev/snd©TN)	r   ÚexistsÚ	read_textÚOSErrorÚUnicodeDecodeErrorr   r   ÚiterdirÚPermissionError)Ú
cards_pathÚcards_contentÚsnd_pathÚdevice_namesÚpcm_likes        r   Ú_linux_audio_availabler2   %   sM  € ÝÐ*Ñ+Ô+€JØ×ÒÑÔð HØGÐGðØ"×,Ò,°HÐ,Ñ=Ô=ˆˆøÝÕ'Ð(ð ð ð Øˆˆˆðøøøà×ÒÑ Ô ð QØPÐPØ˜-×-Ò-Ñ/Ô/Ð/Ð/ØGÐGå�JÑÔ€HØ�?Š?ÑÔð 2Ø1Ð1ð:ØCÐC°×0@Ò0@Ñ0BÔ0BÐCÑCÔCˆˆøÝð :ð :ð :Ø9Ð9Ð9ð:øøøðð à ðñ ô €Hð
 ð KØJÐJØˆ:s!   §> ¾AÁAÂ+C
 Ã

CÃCc                  ó„   — t           rdS t          rdS t          j                             d¦  «        rt          ¦   «         S dS )Nr&   )Fz!disabled via WAN2GP_DISABLE_AUDIOÚlinux)Ú_FORCE_AUDIO_BACKENDSÚ_DISABLE_AUDIO_BACKENDSÚsysÚplatformr%   r2   r   r   r   Ú_detect_audio_supportr9   C   sF   € Ýð ØˆzÝð :Ø9Ð9Ý
„|×Ò˜wÑ'Ô'ð (Ý%Ñ'Ô'Ð'Øˆ:r   c                  ó`   — t           r	t          sdS t          €t          ¦   «         \  aat          S )NF)Ú_audio_backends_failedr5   Ú_audio_support_cacher9   Ú_audio_support_reasonr   r   r   Ú_should_try_audio_backendsr>   M   s5   € åð Õ&;ð ØˆuÝÐ#Ý6KÑ6MÔ6MÑ3ÐÐ3ÝÐr   c                 óÌ   — d}| rd| › d�}|t           k    rt          |¦  «         |a t          j                             d¦  «         t          j                             ¦   «          d S )Nz1Audio notification fallback: using terminal beep.zAudio notification fallback: z; using terminal beep.ú)Ú_last_beep_noticeÚprintr7   ÚstdoutÚwriteÚflush)ÚreasonÚmessages     r   Ú_terminal_beeprH   V   sm   € àA€GØð QØP°&ÐPÐPÐPˆØÕ#Ò#Ð#Ýˆg‰ŒˆØ#ÐÝ„J×Ò�TÑÔÐÝ„J×ÒÑÔÐÐÐr   é2   c                 ó(  — | dk    rt          j        g ¦  «        S t          dt          d| ¦  «        ¦  «        } | dk    r	| dz  dz  }n8| dk    rd| dz
  dz  dz  z   }n#| dk    rd	| dz
  dz  dz  z   }nd
| dz
  dz  dz  z   }|} d\  }}}d}t          j        d|t          ||z  ¦  «        d¦  «        }t          j        |dz  t           j        z  |z  ¦  «        dz  t          j        |dz  t           j        z  |z  ¦  «        dz  z   t          j        |dz  t           j        z  |z  ¦  «        dz  z   }t          j        t          j        |¦  «        ¦  «        }	|	dk    r||	z  dz  }d„ }
 |
|¦  «        }dd„} ||¦  «        }t          |¦  «        |dz  k    r>t          d|z  ¦  «        }t          j
        |¦  «        }|d| …         dz  ||d…<   ||z   }|| z  dz  }t          j        t          j        |¦  «        ¦  «        }	|	dk    r||	z  dz  }|S )z2Generate pleasant C major chord notification soundr   éd   é   g      9@ç      à?rI   g      Ð?éK   g      è?g      ð?gš™™™™™©?)g®GázZp@g®Gázšt@g     €x@çš™™™™™é?Fé   gš™™™™™Ù?g333333Ó?çš™™™™™É?c           	      óò  — t          | ¦  «        }t          d|z  ¦  «        }t          d|z  ¦  «        }t          d|z  ¦  «        }t          j        |¦  «        }|dk    r.t          j        t          j        dd|¦  «        d¦  «        |d |…<   |dk    r"|||z   }}t          j        dd|¦  «        |||…<   |dk    r8||z
  }dt          j        dt          j        dd|¦  «        z  ¦  «        z  ||d …<   | |z  S )	NrQ   gš™™™™™¹?rM   r   é   é   ç333333ë?éüÿÿÿ)ÚlenÚintÚnpÚonesÚpowerÚlinspaceÚexp)Ú	wave_dataÚlengthÚattack_timeÚ
decay_timeÚrelease_timeÚenvelopeÚ	start_idxÚend_idxs           r   Úapply_adsr_envelopez8_generate_notification_beep.<locals>.apply_adsr_envelope†   s  € Ý�Y‘”ˆÝ˜# ™,Ñ'Ô'ˆÝ˜˜v™Ñ&Ô&ˆ
Ý˜3 ™<Ñ(Ô(ˆå”7˜6‘?”?ˆà˜Š?ˆ?Ý%'¤X­b¬k¸!¸QÀÑ.LÔ.LÈaÑ%PÔ%PˆH�\�k�\Ñ"à˜Š>ˆ>Ø!,¨k¸JÑ.F�wˆIÝ*,¬+°a¸¸zÑ*JÔ*JˆH�Y˜wÐ&Ñ'à˜!ÒÐØ Ñ-ˆIØ#'­"¬&°µb´kÀ!ÀQÈÑ6UÔ6UÑ1UÑ*VÔ*VÑ#VˆH�Y�Z�ZÑ à˜8Ñ#Ð#r   c                 ó*  — t          dt          t          | ¦  «        dz  ¦  «        ¦  «        }|dz  dk    r|dz  }t          j        |¦  «        |z  }t          j        | |dz  d¬¦  «        }t          j        ||d¬¦  «        }||dz  | dz  …         S )	NrT   gü©ñÒMbP?rP   r   rS   Úedge)ÚmodeÚsame)ÚmaxrX   rW   rY   rZ   ÚpadÚconvolve)ÚsignalÚcutoff_ratioÚwindow_sizeÚkernelÚpaddedÚfiltereds         r   Úsimple_lowpass_filterz:_generate_notification_beep.<locals>.simple_lowpass_filterž   sž   € Ý˜!�S¥ V¡¤¨uÑ!4Ñ5Ô5Ñ6Ô6ˆØ˜‰?˜aÒÐØ˜1ÑˆKå”˜Ñ%Ô%¨Ñ3ˆÝ”˜ ¨qÑ 0°vÐ>Ñ>Ô>ˆÝ”;˜v v°FÐ;Ñ;Ô;ˆØ˜ qÑ(¨K¨<¸1Ñ+<Ð<Ô=Ð=r   é   g¸…ëQ¸¾?Ng{®Gáz´?rU   )rO   )rY   Úarrayrk   Úminr\   rX   ÚsinÚpiÚabsrW   Ú
zeros_like)ÚvolumeÚsample_rateÚvolume_mappedÚfreq_cÚfreq_eÚfreq_gÚdurationÚtÚwaveÚmax_amplituderf   rt   Údelay_samplesÚreverbs                 r   Ú_generate_notification_beeprˆ   a   s|  € à�‚{€{ÝŒx˜‰|Œ|Ðå�•C˜˜VÑ$Ô$Ñ%Ô%€Fð �‚|€|Ø $™¨#Ñ-ˆˆØ	�2ŠˆØ ¨¡¨tÑ3°tÑ;Ñ;ˆˆØ	�2ŠˆØ ¨"¡°Ñ 4¸Ñ<Ñ<ˆˆà ¨¡¨tÑ3°tÑ;Ñ;ˆà€Fð 4Ñ€FˆF�FØ€HÝ
Œ�A�x¥ [°8Ñ%;Ñ!<Ô!<¸eÑDÔD€Aõ 	Œˆv˜‰z�BœEÑ! AÑ%Ñ&Ô&¨Ñ,Ý
Œ&�˜!‘�bœeÑ# aÑ'Ñ
(Ô
(¨3Ñ
.ñ	/å
Œ&�˜!‘�bœeÑ# aÑ'Ñ
(Ô
(¨3Ñ
.ñ	/ð 	õ ”F�2œ6 $™<œ<Ñ(Ô(€MØ�qÒÐØ�mÑ# cÑ)ˆð$ð $ð $ð* Ð˜tÑ$Ô$€Dð>ð >ð >ð >ð !Ð  Ñ&Ô&€Dõ ˆ4�y„y�; !Ñ#Ò#Ð#Ý˜D ;Ñ.Ñ/Ô/ˆÝ”˜tÑ$Ô$ˆØ!% o¨ ~ oÔ!6¸Ñ!=ˆˆ}ˆ~ˆ~ÑØ�f‰}ˆð �&‰=˜3Ñ€DÝ”F�2œ6 $™<œ<Ñ(Ô(€MØ�tÒÐØ�mÑ# dÑ*ˆà€Kr   c                 ó\   — | t           vrt          | ¦  «        t           | <   t           |          S )z!Return cached waveform for volume)Ú_cached_waveformsrˆ   )r|   s    r   Ú_get_cached_waveformr‹   ¹   s,   € àÕ&Ð&Ð&Ý$?ÀÑ$GÔ$GÕ˜&Ñ!Ý˜VÔ$Ð$r   c                 óÒ  — 	 ddl }t          5  t          s9|j                             |ddd¬¦  «         |j                             ¦   «          da|j                             ¦   «         }|�|d         dk    r	 ddd¦  «         dS | d	z                       t          j	        ¦  «        }t          |j        ¦  «        d
k    r|                     ¦   «         }t          j        t          |¦  «        dft          j	        ¬¦  «        }||dd…df<   ||dd…d
f<   |j                             |¦  «        }|j                             ¦   «          |                     ¦   «          t%          t          | ¦  «        |z  dz  ¦  «        dz   }|j                             |¦  «         	 ddd¦  «         dS # 1 swxY w Y   dS # t*          $ r Y dS t,          $ r}t/          d|› �¦  «         Y d}~dS d}~ww xY w)zPlay audio with pygame backendr   NiðÿÿÿrP   i   )Ú	frequencyÚsizeÚchannelsÚbufferTFéÿ  rS   )Údtypeiè  rI   zPygame error: )ÚpygameÚ_mixer_lockÚ_mixer_initializedÚmixerÚpre_initÚinitÚget_initÚastyperY   Úint16rW   ÚshapeÚflattenÚzerosÚsndarrayÚ
make_soundÚstopÚplayrX   ÚtimeÚwaitÚImportErrorÚ	ExceptionrB   )	Ú
audio_datar}   r“   Ú
mixer_infoÚaudio_int16Ústereo_dataÚsoundÚduration_msÚes	            r   Úplay_audio_with_pygamer®   À   sh  € ð"Øˆˆˆåð 	ð 	Ý%ð *Ø”×%Ò%°À#ÐPQÐZ]Ð%Ñ^Ô^Ð^Ø”×!Ò!Ñ#Ô#Ð#Ø%)Ð"àœ×.Ò.Ñ0Ô0ˆJØÐ! Z°¤]°aÒ%7Ð%7Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð &¨Ñ-×5Ò5µb´hÑ?Ô?ˆKÝ�;Ô$Ñ%Ô%¨Ò)Ð)Ø)×1Ò1Ñ3Ô3�åœ(¥C¨Ñ$4Ô$4°aÐ#8ÅÄÐIÑIÔIˆKØ +ˆK˜˜˜˜1˜ÑØ +ˆK˜˜˜˜1˜Ñà”O×.Ò.¨{Ñ;Ô;ˆEØŒL×ÒÑÔÐØ�JŠJ‰LŒLˆLå�c *™oœo°Ñ;¸dÑBÑCÔCÀbÑHˆKØŒK×Ò˜[Ñ)Ô)Ð)àð3	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ6 ð ð ð ØˆuˆuÝð ð ð ÝÐ"˜qÐ"Ð"Ñ#Ô#Ð#ØˆuˆuˆuˆuˆuøøøøðøøøsN   ‚F3 �A)F&Á6F3 ÂDF&ÆF3 Æ&F*Æ*F3 Æ-F*Æ.F3 Æ3
G&Ç 	G&Ç	G!Ç!G&c                 óÐ   — 	 ddl }|                     | |¦  «         |                     ¦   «          dS # t          $ r Y dS t          $ r}t          d|› �¦  «         Y d}~dS d}~ww xY w)z$Play audio using sounddevice backendr   NTFzSounddevice error: )Úsounddevicer¢   r¤   r¥   r¦   rB   )r§   r}   Úsdr­   s       r   Úplay_audio_with_sounddevicer²   ç   s•   € ð	Ø Ð Ð Ð Ø
�Š�
˜KÑ(Ô(Ð(Ø
�Š‰	Œ	ˆ	ØˆtøÝð ð ð ØˆuˆuÝð ð ð ÝÐ' AÐ'Ð'Ñ(Ô(Ð(Øˆuˆuˆuˆuˆuøøøøðøøøs   ‚.2 ²
A%¿	A%ÁA Á A%c                 óô  — t           j        dk    rdS 	 ddl}ddl}ddl}ddl}|                     ¦   «         }t          j         	                    |d| 
                    ¦   «         j        › d�¦  «        }	 |                     |d¦  «        5 }|                     d¦  «         |                     d	¦  «         |                     |¦  «         | d
z                       t"          j        ¦  «        }	|                     |	                     ¦   «         ¦  «         ddd¦  «         n# 1 swxY w Y   |                     ||j        ¦  «         	 t          j                             |¦  «        rt          j        |¦  «         nH#  Y nDxY w# 	 t          j                             |¦  «        rt          j        |¦  «         w w #  Y w xY wxY wdS # t2          $ r Y dS t4          $ r}
t7          d|
› �¦  «         Y d}
~
dS d}
~
ww xY w)z0Play audio using winsound backend (Windows only)Úwin32Fr   NÚnotification_z.wavÚwrS   rP   r‘   TzWinsound error: )r7   r8   Úwinsoundr„   ÚtempfileÚuuidÚ
gettempdirr   ÚpathÚjoinÚuuid4ÚhexÚopenÚsetnchannelsÚsetsampwidthÚsetframeraterš   rY   r›   ÚwriteframesÚtobytesÚ	PlaySoundÚSND_FILENAMEr'   Úunlinkr¥   r¦   rB   )r§   r}   r·   r„   r¸   r¹   Útemp_dirÚtemp_filenameÚwav_filer©   r­   s              r   Úplay_audio_with_winsoundrË   ô   sb  € å
„|�wÒÐØˆuðØ-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-à×&Ò&Ñ(Ô(ˆÝœŸš XÐ/U¸t¿zºz¹|¼|Ô?OÐ/UÐ/UÐ/UÑVÔVˆð	Ø—’˜=¨#Ñ.Ô.ð <°(Ø×%Ò% aÑ(Ô(Ð(Ø×%Ò% aÑ(Ô(Ð(Ø×%Ò% kÑ2Ô2Ð2Ø)¨EÑ1×9Ò9½"¼(ÑCÔC�Ø×$Ò$ [×%8Ò%8Ñ%:Ô%:Ñ;Ô;Ð;ð<ð <ð <ñ <ô <ð <ð <ð <ð <ð <ð <øøøð <ð <ð <ð <ð ×Ò˜}¨hÔ.CÑDÔDÐDðÝ”7—>’> -Ñ0Ô0ð -Ý”I˜mÑ,Ô,Ð,øøðØ�øøøøð	Ý”7—>’> -Ñ0Ô0ð -Ý”I˜mÑ,Ô,Ð,Ð,ð-øðØ�øøøøøøàˆtøÝð ð ð ØˆuˆuÝð ð ð ÝÐ$ Ð$Ð$Ñ%Ô%Ð%Øˆuˆuˆuˆuˆuøøøøðøøøs…   ”AG Á4F Â
B	DÄF ÄD#Ä#F Ä&D#Ä'F Å3E: Å9G Å:E>Å<G ÆF?Æ3F8Æ6F?Æ8F<Æ:F?Æ?G Ç
G7Ç	G7ÇG2Ç2G7c                 ó@  — | dk    rdS t          | ¦  «        }t          |¦  «        dk    rdS t          ¦   «         st          pd}t	          |¦  «         dS t
          t          t          g}|D ]!}	  ||¦  «        r dS Œ# t          $ r Y Œw xY wda	t	          d¦  «         dS )z-Play notification sound with specified volumer   Nzaudio backends unavailableTzall audio backends failed)
r‹   rW   r>   r=   rH   r®   r²   rË   r¦   r;   )r|   r§   rF   Úaudio_backendsÚbackends        r   Úplay_notification_soundrÏ     sÜ   € à�‚{€{Øˆå% fÑ-Ô-€JÝ
ˆ:�„˜!ÒÐØˆå%Ñ'Ô'ð Ý&ÐFÐ*FˆÝ�vÑÔÐØˆå,Õ.IÕKcÐd€NØ!ð ð ˆð	Øˆw�zÑ"Ô"ð Ø��ðøåð 	ð 	ð 	ØˆHð	øøøð "ÐÝÐ.Ñ/Ô/Ð/Ð/Ð/s   Á.A=Á=
B
Â	B
c                 ób   ‡ — ˆ fd„}t          j        |d¬¦  «                             ¦   «          dS )z5Play notification sound asynchronously (non-blocking)c                  ó|   •— 	 t          ‰¦  «         d S # t          $ r} t          d| › �¦  «         Y d } ~ d S d } ~ ww xY w)Nz"Error playing notification sound: )rÏ   r¦   rB   )r­   r|   s    €r   Ú
play_soundz+play_notification_async.<locals>.play_sound2  sd   ø€ ð	<Ý# FÑ+Ô+Ð+Ð+Ð+øÝð 	<ð 	<ð 	<ÝÐ:°qÐ:Ð:Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;øøøøð	<øøøs   ƒ ”
;ž6¶;T)ÚtargetÚdaemonN)Ú	threadingÚThreadÚstart)r|   rÒ   s   ` r   Úplay_notification_asyncrØ   0  sF   ø€ ð<ð <ð <ð <ð <õ Ô˜J¨tÐ4Ñ4Ô4×:Ò:Ñ<Ô<Ð<Ð<Ð<r   c                 ó$   — t          |¦  «         dS )z'Notify about completed video generationN)rØ   )Ú
video_pathr|   s     r   Únotify_video_completionrÛ   :  s   € å˜FÑ#Ô#Ð#Ð#Ð#r   )rL   rI   rN   rK   )N)rI   )NrI   )#Ú__doc__r   r7   rÕ   Úpathlibr   ÚnumpyrY   r   rŠ   Ú_sample_rater•   ÚLockr”   r   r   r5   r6   r<   r=   r;   rA   r2   r9   r>   rH   rˆ   r‹   r®   r²   rË   rÏ   rØ   rÛ   Úvolr   r   r   ú<module>râ      sû  ððð ð 
€	€	€	Ø 
€
€
€
Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð à+.€„
Ð'Ñ (àÐ Ø€ØÐ ØˆiŒnÑÔ€Ø)Ð)Ð)€ð1ð 1ð 1ð
 "˜	Ð"6Ñ7Ô7Ð Ø#˜)Ð$:Ñ;Ô;Ð ØÐ ØÐ ØÐ ØÐ ðð ð ð<ð ð ð ð  ð  ð	ð 	ð 	ð 	ð (*°|ð Vð Vð Vð Vðp%ð %ð %ð 4@ð %ð %ð %ð %ðN 9Eð ð ð ð ð 6Bð  ð  ð  ð  ðD0ð 0ð 0ð 0ð4=ð =ð =ð =ð$ð $ð $ð $ð ð ð €CØÐ˜ÑÔÐÐðð r   