o
    i                     @   s  d dl Z d dlZd dlZd dlmZmZmZ d dlZe	 dkr,ej
ej
edZn(e	 dkr>ej
ej
edZne	 dkrPej
ej
edZned	ej
esaed
e e eZe jgej_e jgej_e je e je e jgej_e jej_e jej_e jej_e ZdZed e Zej Z!de jfddZ"de jfddZ#de jdej$deej$e jf fddZ%dee jee j f dej$deej$ej$f fddZ&dS )    N)ListTupleUnionDarwinzlibrnnoise.dylibWindowszrnnoise.dllLinuxzlibrnnoise.sozUnsupported operating systemzRnNoise library not found: i  i  returnc                   C   s
   t dS )z~
    Create a new RNNoise denoising state.

    Returns:
        ctypes.c_void_p: Pointer to the RNNoise denoising state.
    N)librnnoise_create r   r   E/home/ubuntu/.local/lib/python3.10/site-packages/pyrnnoise/rnnoise.pycreate1   s   
r   statec                 C   s   t |  dS )z
    Destroy an RNNoise denoising state.

    Args:
        state (ctypes.c_void_p): Pointer to the RNNoise denoising state to destroy.
    N)r	   rnnoise_destroy)r   r   r   r   destroy;   s   r   framec                 C   s   |j tjtjfv r| dkr| dkr|d t}|j tks#J |tj}t|}|t	k r;t
|dt	| f}|jttj}t| ||}|td| |fS )aA  
    Process a single frame of audio data with RNNoise.

    Args:
        state (ctypes.c_void_p): Pointer to the RNNoise denoising state.
        frame (np.ndarray): Input audio frame, should be a 1D numpy array.
    Returns:
        Tuple[np.ndarray, ctypes.c_float]: Processed audio frame and speech probability.
    g      g      ?i  r   N)dtypenpfloat32float64minmaxastypeDTYPElen
FRAME_SIZEpadctypesdata_asPOINTERc_floatr	   rnnoise_process_frame)r   r   
frame_sizeptrspeech_probr   r   r   process_mono_frameE   s   *
r%   statesc                 C   sl   |j dkr
t| |S |j dksJ t| |jd ksJ dd t| |D }t| \}}t|t|fS )a  
    Process a frame of audio data with RNNoise, supporting both mono and stereo.

    Args:
        states (Union[ctypes.c_void_p, List[ctypes.c_void_p]]): Pointer to the RNNoise denoising state or a list of states for each channel.
        frame (np.ndarray): Input audio frame, can be 1D (mono) or 2D (stereo).
    Returns:
        Tuple[np.ndarray, np.ndarray]: Processed audio frame and speech probabilities.
          r   c                 S   s   g | ]	\}}t ||qS r   )r%   ).0r   
mono_framer   r   r   
<listcomp>n   s    z!process_frame.<locals>.<listcomp>)ndimr%   r   shapezipr   vstack)r&   r   	processedframesspeech_probsr   r   r   process_frame\   s   

r3   )'r   osplatformtypingr   r   r   numpyr   systempathjoindirname__file__
LIBRNNOISEOSErrorexistsCDLLr	   c_void_pr
   argtypesr   r   r    r!   restypec_intrnnoise_get_frame_sizer   SAMPLE_RATEFRAME_SIZE_MSint16r   r   r   ndarrayr%   r3   r   r   r   r   <module>   sL   






&
