U
    ~fh                     @  s   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 d dl
mZ ddlmZ ddlmZmZ ddlmZmZ erd dlmZ d	ZG d
d dZdS )    )annotationsN)AnyUnionCallableAsyncGeneratorcast)TYPE_CHECKING   )_legacy_response)numpysounddevice)StreamedBinaryAPIResponseAsyncStreamedBinaryAPIResponsei]  c                   @  sL   e Zd ZdddddZdddd	d
ZdddddZdddddZdS )LocalAudioPlayerNzUnion[Callable[[], bool], None])should_stopc                 C  s   d| _ tj| _|| _d S )N   )channelsnpfloat32dtyper   )selfr    r   E/tmp/pip-unpacked-wheel-rjiviquo/openai/helpers/local_audio_player.py__init__   s    zLocalAudioPlayer.__init__zmUnion[_legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]npt.NDArray[np.float32])responsereturnc                   s   g }t |tjst |tr<|jddD ]}|r&|| q&n*|jdd2 z3 d H W }|rH|| qH6 d|}tj|tj	d
tjd }|dd}|S )Ni   )
chunk_size    )r       @r   )
isinstancer
   ZHttpxBinaryResponseContentr   Z
iter_bytesappendjoinr   Z
frombufferint16astyper   reshape)r   r   chunkschunkZaudio_bytesZaudio_npr   r   r   _tts_response_to_buffer   s     
z(LocalAudioPlayer._tts_response_to_bufferzUnion[npt.NDArray[np.int16], npt.NDArray[np.float32], _legacy_response.HttpxBinaryResponseContent, AsyncStreamedBinaryAPIResponse, StreamedBinaryAPIResponse]None)inputr   c              	     s   t |tjrj|jtjkr@jtjkr@|tjd dj qz|jtjkrXt	d| qzt
d|j n|I d H  t t dddddd fd	d
}tjt| j jd d}|  I d H  W 5 Q R X d S )Nr   r    r   zUnsupported dtype: r   intr   outdataframe_count
_time_info_statusc                   sx   t   }|dks&tjr8 r8j tj||krD|n|} |  | d |< d| |d < |7 d S )Nr   )lencallabler   call_soon_threadsafesetsdCallbackStop)r.   r/   r0   r1   	remainderZvalid_framesZaudio_contenteventidxloopr   r   r   callbackN   s    z'LocalAudioPlayer.play.<locals>.callbackr   )
samplerater=   r   r   )r!   r   Zndarrayr   r$   r   r%   r&   r   r   
ValueErrorr)   asyncioget_event_loopEventr6   OutputStreamSAMPLE_RATEshapewait)r   r+   r=   streamr   r9   r   play5   s&     zLocalAudioPlayer.playzQAsyncGenerator[Union[npt.NDArray[np.float32], npt.NDArray[np.int16], None], None])buffer_streamr   c              	     s   t  t  tjddfdd}ddddd fd	d
}d d t | }tjtj	j
|d  I d H  W 5 Q R X |I d H  d S )N2   )maxsizec                    sP   2 z.3 d H W } | d kr q6 d  j| I d H  q6  d  jd I d H  d S )N)Zrun_in_executorput)buffer)buffer_queuerI   r<   r   r   buffer_producerp   s
    z5LocalAudioPlayer.play_stream.<locals>.buffer_producerr   r,   r   r-   c                   s   d}||k rd ks  t krz`jddd krHj tjd jtjkr~jtj	kr~
tj	d djW n$ tjk
r   d| |d < Y d S X t   }t|| |}  |  | ||| <  |7  ||7 }qd S )Nr   g?)timeoutr   r    )r2   getr4   r5   r6   r7   r   r   r$   r   r%   r&   r   queueEmptymin)r.   r/   r0   r1   Zframes_writtenZremaining_framesZframes_to_write)
buffer_posrN   current_bufferr:   r<   r   r   r   r=   w   s,     z.LocalAudioPlayer.play_stream.<locals>.callbackr   )r>   r   r   r=   )r@   rA   rB   rR   QueueZcreate_taskr6   rC   rD   r   r   rF   )r   rI   rO   r=   Zproducer_taskr   )rU   rN   rI   rV   r:   r<   r   r   play_streamh   s     "!zLocalAudioPlayer.play_stream)N)__name__
__module____qualname__r   r)   rH   rX   r   r   r   r   r      s
    3r   )
__future__r   rR   r@   typingr   r   r   r   r   Ztyping_extensionsr    r
   Z_extrasr   r   r   r6   	_responser   r   Znumpy.typingZnptrD   r   r   r   r   r   <module>   s   