U
    ,:%eK/                     @   s  d dl Z d dlZd dlZd dlmZmZmZmZ d dlZd dl	Z	d dl
mZ ddlmZ ddlmZ e	jjdk	r|e	jjjZneZeee eddd	Zd4ee eedddZd5eeeee dddZd6eee eejdddZd7eeeeeee eejef dddZd8eeeeeee eeejef dddZejedddZedd d!Z eeed"d#d$Z!d%d& Z"ee ee ee ee d'd(d)Z#d9eeee j$f ejeeee ee ee edd*	d+d,Z%eed-d.d/Z&eeed"d0d1Z'G d2d3 d3eZ(dS ):    N)BinaryIOOptionalTupleUnion)StreamWriter   )Backend)AudioMetaData)srcformatreturnc                 C   s8   t jj| |}t|d |d |d |d |d  S )Nr   r            )torchops
torchaudioZcompat_infor	   upper)r
   r   i r   Y/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/torchaudio/_backend/ffmpeg.py
info_audio   s    r      )r   buffer_sizer   c                 C   sd   t | |d |}| }||}|jdkr>t|}|d}n|j}tt|j||j	|j
|j S )Nr   r   )StreamReaderFileObjfind_best_audio_streamget_src_stream_info
num_frames_load_audio_fileobjsizer	   intsample_ratenum_channelsbits_per_sampleZ
codec_namer   )r
   r   r   sr   sinfowaveformr   r   r   r   info_audio_fileobj   s    

r'   T)frame_offsetr   convertr   c                 C   s   | dk rt d| |dks&|dk r4t d|| dkrL|dkrL|sLd S d}| dkrh|dkrh|rh|S |dkrd| | | }n
d| }|s|S d||S )	Nr   z>Invalid argument: frame_offset must be non-negative. Found: {}r(   zDInvalid argument: num_frames must be -1 or greater than 0. Found: {}zaformat=sample_fmts=fltpz#atrim=start_sample={}:end_sample={}zatrim=start_sample={}z{},{})RuntimeErrorr   )r)   r   r*   ZaformatZatrimr   r   r   _get_load_filter1   s    
r,   )r$   filterchannels_firstr   c                 C   sT   |   }| |dd|d d  |   |  d }|d kr@td|j}|rP|jS |S )Nr(   r   zFailed to decode audio.)r   add_audio_streamZprocess_all_packetsZ
pop_chunksr+   framesT)r$   r-   r.   r   chunkr&   r   r   r   r   L   s    r   )r
   r)   r   r*   r.   r   r   c                 C   s    t |||}tjj| |||S N)r,   r   r   r   Zcompat_load)r
   r)   r   r*   r.   r   r-   r   r   r   
load_audio[   s    r4   )r
   r)   r   r*   r.   r   r   r   c                 C   sR   |dkrdn|}t | |d |}t|| j}	t|||}
t||
|}||	fS )Nvorbisogg)r   r    r   r   r!   r,   r   )r
   r)   r   r*   r.   r   r   Zdemuxerr$   r!   r-   r&   r   r   r   load_audio_fileobjg   s    	r7   )dtyper   c                 C   s\   t jdt jdt jdt jdt jdt jdi}|| }|d krXtd|  dt	|
  d	|S )
Nu8s16s32Zs64ZfltZdblzNo format found for dtype z; dtype must be one of .)r   Zuint8Zint16Zint32Zint64Zfloat32Zfloat64get
ValueErrorlistkeys)r8   Zdtype_to_formatr   r   r   r   _get_sample_formatx   s"          
rA   )r   c                   C   s   t jdkrdS dS d S )Nlittlelebe)sys	byteorderr   r   r   r   _native_endianness   s    
rG   )encodingr#   r   c                 C   s  |dkrt d| dt }| sJ|s0d| S |dkr<dS d| | S | dkrx|sZd	}|dkrjt d
d| | S | dkr|dkrdS t d| dkr|sd}|dkrd| | S t d| dkr|dkrdS t d| dkr|dkrdS t dt d|  dd S )N>       N@            zInvalid bits_per_sample z for WAV encoding.Zpcm_s16rK   Zpcm_u8Zpcm_sPCM_SrL   z4For WAV signed PCM, 8-bit encoding is not supported.PCM_U)NrK   z7For WAV unsigned PCM, only 8-bit encoding is supported.PCM_FrI   )rI   rJ   Zpcm_fz?For WAV float PCM, only 32- and 64-bit encodings are supported.ULAWZ	pcm_mulawz5For WAV PCM mu-law, only 8-bit encoding is supported.ALAWZpcm_alawz4For WAV PCM A-law, only 8-bit encoding is supported.zWAV encoding z is not supported.)r>   rG   )rH   r#   Z
endiannessr   r   r   _get_encoder_for_wav   sD    
rS   c                 C   s4   | d ks| dkrdS | dkr dS t d|  dd S )NrL   r:   rM   r;   z8FLAC only supports bits_per_sample values of 16 and 24 (z specified).)r>   )bpsr   r   r   _get_flac_sample_fmt   s
    rU   )extr   rH   rT   c                    s~    fdd}|ds|dr2d}t ||}d }nB|drHd}d}d }n,}d }d }|drdt|}|drtt|}|||fS )Nc                    s   | kpd ko | kS r3   r   )specrV   r   r   r   _type   s    z_parse_save_args.<locals>._typeZwavZambr5   r6   Zflac)rS   rU   )rV   r   rH   rT   rY   muxerencoderZ
sample_fmtr   rX   r   _parse_save_args   s"    

r\   	urir
   r!   r.   r   rH   r#   r   r   c              	   C   s   d }t | dr |d krRtdn2tj| } t| ddd   }	rR|	d  }t||||\}
}}|rp|j	}t
| |
|d}|j||dt|j||d |  |d| W 5 Q R X d S )	Nwritez0'format' is required when saving to file object.r<   r   r(   )r   r   )r"   r   r[   Zencoder_formatr   )hasattrr+   ospathnormpathstrsplitlowerr\   r1   r   r/   r   rA   r8   openZwrite_audio_chunk)r^   r
   r!   r.   r   rH   r#   r   rV   tokensrZ   r[   Zenc_fmtr$   r   r   r   
save_audio   s(    



ri   )rH   r   c                 C   s6   dD ]}|| kr|  S q| dkr&dS | dkr2dS | S )N)rN   rO   rP   	PCM_MULAWrQ   PCM_ALAWrR   r   )rH   dstr   r   r   _map_encoding  s    
rm   c                 C   s.   t d|  }rt|dS | dkr*dS |S )NzPCM_\w(\d+)\w*r   )rk   rj   rK   )researchr    group)rH   r#   mr   r   r   _get_bits_per_sample&  s
    rr   c                   @   s   e Zd Zedeeeejf e	e e
edddZedeeeejf e
e
eee	e e
eeje
f d	d
dZedeeeejf eje
ee	e e	e e	e
 e
dd	ddZeeeeejf e	e edddZeeeeejf e	e edddZdS )FFmpegBackendr   )r^   r   r   r   c                 C   sL   t | drt| ||d}nttj| |}t|j|j|_t	|j|_|S )Nread)r   )
r`   r'   r   ra   rb   rc   rr   rH   r#   rm   )r^   r   r   metadatar   r   r   info/  s    
zFFmpegBackend.infor   r(   TN)r^   r)   r   	normalizer.   r   r   r   c                 C   s<   t | drt| ||||||S ttj| |||||S d S )Nrt   )r`   r7   r4   ra   rb   rc   )r^   r)   r   rw   r.   r   r   r   r   r   load9  s    


zFFmpegBackend.loadr]   c              	   C   s   t | ||||||| d S r3   )ri   )r^   r
   r!   r.   r   rH   r#   r   r   r   r   saveP  s    zFFmpegBackend.save)r^   r   r   c                 C   s   dS NTr   r^   r   r   r   r   
can_decodef  s    zFFmpegBackend.can_decodec                 C   s   dS rz   r   r{   r   r   r   
can_encodej  s    zFFmpegBackend.can_encode)r   )r   r(   TTNr   )TNNNr   )__name__
__module____qualname__staticmethodr   r   rd   ra   PathLiker   r    r	   rv   boolr   r   Tensorrx   ry   r|   r}   r   r   r   r   rs   .  sP   (	           $rs   )r   )r   r(   T)NT)r   r(   TTN)r   r(   TTNr   )TNNNr   ))ra   rn   rE   typingr   r   r   r   r   r   Ztorchaudio.ior   backendr   commonr	   
_extensionZ_FFMPEG_EXTr   objectrd   r   r    r'   r   r,   r   r   r4   r7   r8   rA   rG   rS   rU   r\   r   ri   rm   rr   rs   r   r   r   r   <module>   s                    &	?     $