U
    ·ÜŸj  ã                   @  sº   d dl mZ d dlZd dlZd dlZd dlZd dlmZ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 ddlmZmZ er�d dlmZ dZed	ejd
�ZG dd„ de
e ƒZdS )é    )ÚannotationsN)ÚAnyÚTypeÚUnionÚGenericÚTypeVarÚCallableÚoverload)ÚTYPE_CHECKINGÚLiteralé   )Ú	FileTypesÚFileContent)ÚnumpyÚsounddeviceiÀ]  ÚDType)Úboundc                   @  sŒ   e Zd Zdejddfdddddœdd	„Zd
ddœdd„Zedd
dœdd„ƒZedddœdd„ƒZeddddœdd„ƒZddddœdd„ZdS )Ú
Microphoneé   NÚintzType[DType]zUnion[Callable[[], bool], None]zUnion[float, None])ÚchannelsÚdtypeÚshould_recordÚtimeoutc                 C  s,   || _ || _|| _g | _|| _t|ƒ| _d S ©N)r   r   r   Úbuffer_chunksr   ÚcallableZhas_record_function)Úselfr   r   r   r   © r   ú=/tmp/pip-unpacked-wheel-2qj3ofc_/openai/helpers/microphone.pyÚ__init__   s    zMicrophone.__init__únpt.NDArray[DType]r   )Ú
audio_dataÚreturnc              	   C  sl   t  ¡ }t |d¡�>}| | j¡ | t | j¡j	¡ | 
t¡ | | ¡ ¡ W 5 Q R X | d¡ d|dfS )NÚwr   z	audio.wavz	audio/wav)ÚioÚBytesIOÚwaveÚopenZsetnchannelsr   ZsetsampwidthÚnpr   ÚitemsizeZsetframerateÚSAMPLE_RATEZwriteframesÚtobytesÚseek)r   r"   ÚbufferZwav_filer   r   r   Ú_ndarray_to_wav%   s    

zMicrophone._ndarray_to_wavzLiteral[True])Úreturn_ndarrayr#   c                 Ã  s   d S r   r   ©r   r0   r   r   r   Úrecord/   s    zMicrophone.recordzLiteral[False]c                 Ã  s   d S r   r   r1   r   r   r   r2   2   s    .ÚNonec                 Ã  s   d S r   r   r1   r   r   r   r2   5   s    FzUnion[bool, None]z$Union[npt.NDArray[DType], FileTypes]c              	   ƒ  s´   t  ¡ ‰t  ¡ ‰ g ˆ_t ¡ ‰dddddœ‡ ‡‡‡fdd„}tj|ˆjt	ˆj
d�}|� ˆ  ¡ I d H  W 5 Q R X tˆjƒdkrŽtjˆjdd	�ntjg ˆjd
�}|r¦|S ˆ |¡S d S )Nr!   r   r   )ÚindataÚ_frame_countÚ
_time_infoÚ_statusc                   sz   t  ¡ ˆ }ˆjd k	r |ˆjknd}|r:ˆ ˆ j¡ tj‚tˆjƒrLˆ ¡ nd}|sfˆ ˆ j¡ tj‚ˆj	 
|  ¡ ¡ d S )NFT)ÚtimeÚperf_counterr   Úcall_soon_threadsafeÚsetÚsdZCallbackStopr   r   r   ÚappendÚcopy)r4   r5   r6   r7   Zexecution_timeZreached_recording_timeoutZshould_be_recording©ÚeventÚloopr   Ú
start_timer   r   Úcallback>   s    z#Microphone.record.<locals>.callback)rC   r   Z
samplerater   r   )Zaxis)r   )ÚasyncioÚget_event_loopÚEventr   r8   r9   r<   ZInputStreamr   r+   r   ÚwaitÚlenr)   ÚconcatenateÚarrayr/   )r   r0   rC   ÚstreamZconcatenated_chunksr   r?   r   r2   8   s(    üÿý).)F)	Ú__name__Ú
__module__Ú__qualname__r)   Zint16r    r/   r	   r2   r   r   r   r   r      s   û
r   )Ú
__future__r   r%   r8   r'   rD   Útypingr   r   r   r   r   r   r	   Útyping_extensionsr
   r   Ú_typesr   r   Z_extrasr   r)   r   r<   Znumpy.typingZnptr+   Zgenericr   r   r   r   r   r   Ú<module>   s   $