a
    h,                     @   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 eeee jf Zd.eee eeddd	Zd/eeeee dddZd0dee eejdddZd1e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d2eejeeee ee ee eee	jj dd$
d%d&Z eed'd(d)Z!eeedd*d+Z"G d,d- d-eZ#dS )3    N)BinaryIOOptionalTupleUnion   )Backend)AudioMetaData   )srcformatbuffer_sizereturnc                 C   sb   t j| |d |}||j}|jdkr<t|}|d}n|j}tt	|j
||j|j|j S )Nr   r   )
torchaudioioStreamReaderget_src_stream_infodefault_audio_stream
num_frames_load_audiosizer   intsample_ratenum_channelsbits_per_samplecodecupper)r
   r   r   ssinfowaveformr    r   H/var/www/auris/lib/python3.9/site-packages/torchaudio/_backend/ffmpeg.py
info_audio   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_filter$   s    
r&   ztorchaudio.io.StreamReader)r   filterchannels_firstr   c                 C   sH   | j dd|d |   |  d }|d u r4td|j}|rD|jS |S )Nr"   )Zfilter_descr   zFailed to decode audio.)add_audio_streamZprocess_all_packetsZ
pop_chunksr%   _elemT)r   r'   r(   chunkr   r   r   r    r   ?   s    r   )r
   r#   r   r$   r(   r   r   r   c                 C   sZ   t | dr|dkrd}tj| |d |}t||jj}t|||}	t	||	|}
|
|fS )Nreadvorbisogg)
hasattrr   r   r   r   r   r   r   r&   r   )r
   r#   r   r$   r(   r   r   r   r   r'   r   r   r   r    
load_audioM   s    	r1   )dtyper   c                 C   s\   t jdt jdt jdt jdt jdt jdi}|| }|d u rXtd|  dt	|
  d	|S )
Nu8s16s32Zs64ZfltZdblzNo format found for dtype z; dtype must be one of .)torchZuint8int16int32int64float32float64get
ValueErrorlistkeys)r2   Zdtype_to_formatr   r   r   r    _get_sample_format_   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_endiannessn   s    
rG   )encodingr   r   c                 C   s  |dv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v rdS t d| dkr|sd}|dv rd| | S t d| dkr|dv rdS t d| dkr|dv 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_wavu   sD    
rS   c                 C   s4   | d u s| dkrdS | dkr dS t d|  dd S )NrL   r4   rM   r5   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 u o | kS Nr   )specrV   r   r   r    _type   s    z_parse_save_args.<locals>._typeZwavZambr.   r/   Zflac)rS   rU   )rV   r   rH   rT   rZ   muxerencoderZ
sample_fmtr   rY   r    _parse_save_args   s"    

r]   
urir
   r   r(   r   rH   r   r   compressionr   c	                 C   s   d }	t | dr |d u rRtdn2tj| } t| ddd   }
rR|
d  }	t|	|||\}}}|rp|j	}t
jj| ||d}|j||dt|j|||d |  |d| W d    n1 s0    Y  d S )	Nwritez0'format' is required when saving to file object.r6   r   r"   )r   r   )r   r   r\   Zencoder_formatZcodec_configr   )r0   r%   ospathnormpathstrsplitlowerr]   r+   r   r   StreamWriterr)   r   rA   r2   openZwrite_audio_chunk)r_   r
   r   r(   r   rH   r   r   r`   rV   tokensr[   r\   Zenc_fmtr   r   r   r    
save_audio   s*    


rk   )rH   r   c                 C   s6   dD ]}|| v 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    
ro   c                 C   s.   t d|  }rt|dS | dv r*dS |S )NzPCM_\w(\d+)\w*r   )rm   rl   rK   )researchr   group)rH   r   mr   r   r    _get_bits_per_sample  s
    rt   c                   @   s   e Zd Zedeee eedddZ	edeeee
e
ee eeejef d	d
dZedeejee
ee ee ee eeeejjeef  dd
ddZeeee e
dddZeeee e
dddZdS )FFmpegBackendr	   )r_   r   r   r   c                 C   s,   t | ||}t|j|j|_t|j|_|S rW   )r!   rt   rH   r   ro   )r_   r   r   metadatar   r   r    info  s    zFFmpegBackend.infor   r"   TN)r_   r#   r   	normalizer(   r   r   r   c                 C   s   t | |||||S rW   )r1   )r_   r#   r   rx   r(   r   r   r   r   r    load  s    
zFFmpegBackend.loadr^   c	           	   
   C   sF   t |tjjtd fs*tddt| t| ||||||||	 d S )NzLFFmpeg backend expects non-`None` value for argument `compression` to be of z=type `torchaudio.io.CodecConfig`, but received value of type )
isinstancer   r   CodecConfigtyper>   rk   )	r_   r
   r   r(   r   rH   r   r   r`   r   r   r    save+  s     zFFmpegBackend.save)r_   r   r   c                 C   s   dS NTr   r_   r   r   r   r    
can_decodeH  s    zFFmpegBackend.can_decodec                 C   s   dS r~   r   r   r   r   r    
can_encodeL  s    zFFmpegBackend.can_encode)r	   )r   r"   TTNr	   )TNNNr	   N)__name__
__module____qualname__staticmethod	InputTyper   re   r   r   rw   boolr   r7   Tensorry   r   r   r   r{   floatr}   r   r   r   r   r   r    ru     sT               ru   )r	   )r   r"   T)NT)r   r"   TTNr	   )TNNNr	   N)$rb   rp   rE   typingr   r   r   r   r7   r   backendr   commonr   re   PathLiker   r   r!   r   r&   r   r   r1   r2   rA   rG   rS   rU   r]   r   r{   rk   ro   rt   ru   r   r   r   r    <module>   s               &	?      
&