§
    õ»©j  ã                   óî   — d Z ddlZddlZddlZddlmZmZ 	 ddlZdZn# e	$ r dZdZY nw xY w G d„ d¦  «        Z
 e
¦   «         Zded	ed
dfd„Zdeeeef                  d
dfd„Zded
dfd„Zdd„Zdd„ZdS )uï  ThÆ° viá»‡n phÃ¡t tÃ­n hiá»‡u Ã¢m thanh pháº£n há»“i (Audio Feedback) an toÃ n luá»“ng cho AutoPOE2.

Sá»­ dá»¥ng hÃ ng Ä‘á»£i bounded Queue káº¿t há»£p má»™t luá»“ng ná»�n Daemon duy nháº¥t Ä‘á»ƒ xá»­ lÃ½
táº¥t cáº£ cÃ¡c yÃªu cáº§u phÃ¡t tiáº¿ng BÃ­p. Triá»‡t tiÃªu hoÃ n toÃ n tÃ¬nh tráº¡ng rÃ² rá»‰ luá»“ng vÃ´ thá»«a nháº­n
(unmanaged thread leak) do viá»‡c liÃªn tá»¥c gá»�i threading.Thread().start() gÃ¢y ra.
TuÃ¢n thá»§ nghiÃªm ngáº·t chuáº©n tÃ i liá»‡u Google Docstrings theo Rule 16.
é    N)ÚListÚTupleTFc                   ó\   — e Zd ZdZddefd„Zdd„Zdeeeef                  ddfd	„Z	dd
„Z
dS )Ú_AudioDispatcherud   Bá»™ Ä‘iá»�u phá»‘i Ã¢m thanh ná»�n Singleton, thread-safe vÃ  khÃ´ng rÃ² rá»‰ tÃ i nguyÃªn luá»“ng.é   Úmax_queue_sizec                 óº   — t          j        |¬¦  «        | _        t          j        | j        dd¬¦  «        | _        d| _        t          j        ¦   «         | _	        d S )N)ÚmaxsizeTÚAutoPOE2_AudioFeedbackWorker)ÚtargetÚdaemonÚnameF)
ÚqueueÚQueueÚ_queueÚ	threadingÚThreadÚ_worker_loopÚ_threadÚ_startedÚLockÚ_lock)Úselfr   s     ú1C:\Projects\AutoPOE2\src\common\audio_feedback.pyÚ__init__z_AudioDispatcher.__init__   sV   € Ý:?¼+ÈnÐ:]Ñ:]Ô:]ˆŒÝ)2Ô)9ØÔ$¨TÐ8Vð*
ñ *
ô *
ˆŒð ˆŒÝ”^Ñ%Ô%ˆŒ
ˆ
ˆ
ó    ÚreturnNc                 ó¦   — | j         sI| j        5  | j         s | j                             ¦   «          d| _         d d d ¦  «         d S # 1 swxY w Y   d S d S )NT)r   r   r   Ústart)r   s    r   Ú_ensure_startedz _AudioDispatcher._ensure_started!   s§   € ØŒ}ð 	)Ø”ð )ð )Ø”}ð )Ø”L×&Ò&Ñ(Ô(Ð(Ø$(�D”Mð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð )ð )ð	)ð 	)s   �(AÁAÁAÚbeepsc                 óÂ   — t           rt          j        dk    rdS |                      ¦   «          	 | j                             |¦  «         dS # t          j        $ r Y dS w xY w)ud   Ä�Æ°a danh sÃ¡ch ná»‘t bÃ­p [(táº§n sá»‘ Hz, thá»�i lÆ°á»£ng ms)] vÃ o hÃ ng Ä‘á»£i phÃ¡t Ã¢m thanh.ÚntN)Ú_HAS_WINSOUNDÚosr   r    r   Ú
put_nowaitr   ÚFull)r   r!   s     r   Úenqueue_beepsz_AudioDispatcher.enqueue_beeps(   sp   € åð 	¥¤¨4¢ ØˆFØ×ÒÑÔÐð	ØŒK×"Ò" 5Ñ)Ô)Ð)Ð)Ð)øÝŒzð 	ð 	ð 	àˆDˆDð	øøøs   ¯A ÁAÁAc                 óø   — 	 	 | j                              ¦   «         }|D ]2\  }}	 t          �t          j        ||¦  «         Œ## t          $ r Y Œ/w xY w| j                              ¦   «          n# t          $ r Y nw xY wŒz)N)r   ÚgetÚwinsoundÚBeepÚ	ExceptionÚ	task_done)r   r!   ÚfreqÚdurations       r   r   z_AudioDispatcher._worker_loop3   sª   € ð	ð
ØœŸšÑ)Ô)�Ø&+ð ð ‘N�D˜(ðÝ#Ð/Ý$œM¨$°Ñ9Ô9Ð9øøÝ$ð ð ð Ø˜ðøøøà”×%Ò%Ñ'Ô'Ð'Ð'øÝð ð ð Ø�ðøøøð	s4   ƒ A+ ¤AÁ A+ Á
AÁA+ ÁAÁA+ Á+
A8Á7A8)r   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úintr   r    r   r   r(   r   © r   r   r   r      s‘   € € € € € ØnÐnð&ð & sð &ð &ð &ð &ð)ð )ð )ð )ð	 4¨¨c°3¨h¬Ô#8ð 	¸Tð 	ð 	ð 	ð 	ðð ð ð ð ð r   r   r/   r0   r   c                 ó@   — t                                | |fg¦  «         dS )uô   Ä�Æ°a má»™t ná»‘t bÃ­p Ä‘Æ¡n láº» vÃ o hÃ ng Ä‘á»£i phÃ¡t Ã¢m thanh ná»�n (Non-blocking).

    Args:
        freq: Táº§n sá»‘ Ã¢m thanh (Hz), vÃ­ dá»¥: 600, 1200, 1800.
        duration: Thá»�i lÆ°á»£ng phÃ¡t Ã¢m thanh (ms), vÃ­ dá»¥: 100.
    N©Ú_dispatcherr(   )r/   r0   s     r   Úenqueue_beepr;   E   s&   € õ ×Ò  hÐ/Ð0Ñ1Ô1Ð1Ð1Ð1r   r!   c                 ó:   — t                                | ¦  «         dS )uj   Ä�Æ°a danh sÃ¡ch ná»‘t bÃ­p [(táº§n sá»‘ Hz, thá»�i lÆ°á»£ng ms)] vÃ o hÃ ng Ä‘á»£i phÃ¡t Ã¢m thanh ná»�n.Nr9   )r!   s    r   r(   r(   O   s   € å×Ò˜eÑ$Ô$Ð$Ð$Ð$r   Úenabledc                 óz   — | rt                                dg¦  «         dS t                                dg¦  «         dS )u  PhÃ¡t tÃ­n hiá»‡u Ã¢m thanh thÃ´ng bÃ¡o tráº¡ng thÃ¡i Báº­t/Táº¯t cá»§a Bot (Non-blocking).

    PhÃ¡t Ã¢m thanh táº§n sá»‘ cao bÃ¡o hiá»‡u kÃ­ch hoáº¡t vÃ  Ã¢m tráº§m bÃ¡o hiá»‡u vÃ´ hiá»‡u hÃ³a.

    Args:
        enabled: True náº¿u bot vá»«a Ä‘Æ°á»£c báº­t, False náº¿u vá»«a Ä‘Æ°á»£c táº¯t.

    Thread-safety:
        Thread-safe. Non-blocking, Ä‘áº©y tÃ¡c vá»¥ vÃ o hÃ ng Ä‘á»£i ná»�n.

    Example:
        >>> beep_bot_toggle(True)   # Ã‚m bÃ¡o báº­t (1200Hz)
        >>> beep_bot_toggle(False)  # Ã‚m bÃ¡o táº¯t (600Hz)
    )i°  éd   )iX  éx   Nr9   )r=   s    r   Úbeep_bot_togglerA   U   sD   € ð ð 0Ý×!Ò! ; -Ñ0Ô0Ð0Ð0Ð0å×!Ò! : ,Ñ/Ô/Ð/Ð/Ð/r   c                  ó>   — t                                ddg¦  «         dS )uŸ  PhÃ¡t chuá»—i Ã¢m thanh bÃ¡o Ä‘á»™ng kháº©n cáº¥p khi gáº·p sá»± cá»‘ nghiÃªm trá»�ng (Panic Alarm).

    PhÃ¡t 2 ná»‘t cao liÃªn tiáº¿p (1800Hz) Ä‘á»ƒ cáº£nh bÃ¡o tá»©c thÃ¬ ngÆ°á»�i dÃ¹ng khi cÃ³ sá»± cá»‘
    nhÆ° ngáº¯t káº¿t ná»‘i game Ä‘á»™t ngá»™t, vi pháº¡m báº¥t biáº¿n hoáº·c kÃ­ch hoáº¡t Emergency Logout.

    Thread-safety:
        Thread-safe. Non-blocking.

    Example:
        >>> beep_panic()
    )é  r@   )rC   é–   Nr9   r7   r   r   Ú
beep_panicrE   j   s#   € õ ×Ò˜{¨KÐ8Ñ9Ô9Ð9Ð9Ð9r   c                  ó<   — t                                dg¦  «         dS )u]  PhÃ¡t Ã¢m thanh thÃ´ng bÃ¡o nháº¹ khi hoÃ n thÃ nh má»™t tÃ¡c vá»¥ thÃ´ng thÆ°á»�ng.

    PhÃ¹ há»£p cho cÃ¡c sá»± kiá»‡n nhÆ° nháº·t Ä‘Æ°á»£c Ä‘á»“ giÃ¡ trá»‹ cao, hoÃ n thÃ nh map,
    hoáº·c hoÃ n táº¥t chu trÃ¬nh Ä‘á»‹nh danh váº­t pháº©m.

    Thread-safety:
        Thread-safe. Non-blocking.

    Example:
        >>> beep_notification()
    )i„  éP   Nr9   r7   r   r   Úbeep_notificationrH   y   s    € õ ×Ò˜y˜kÑ*Ô*Ð*Ð*Ð*r   r1   )r5   r%   r   r   Útypingr   r   r+   r$   ÚImportErrorr   r:   r6   r;   r(   ÚboolrA   rE   rH   r7   r   r   ú<module>rL      sj  ððð ð 
€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ð Ð ðØ€O€O€OØ€M€MøØð ð ð Ø€HØ€M€M€Mðøøøð
)ð )ð )ð )ð )ñ )ô )ð )ðX ÐÑ Ô €ð2�sð 2 cð 2¨dð 2ð 2ð 2ð 2ð%˜˜e C¨ HœoÔ.ð %°4ð %ð %ð %ð %ð0˜Tð 0 dð 0ð 0ð 0ð 0ð*:ð :ð :ð :ð+ð +ð +ð +ð +ð +s   ˜ Ÿ	+ª+