a
    h5                     @   s   d Z ddlZddlmZmZmZmZ ddlZdeeeej	f e
e
eeee e
ee eeje
f d	dd	Zdeeej	f eje
eee ee ee
 e
ee eeee
f  dd
ddZdS )z&TorchCodec integration for TorchAudio.    N)BinaryIOOptionalTupleUnionT   )	uriframe_offset
num_frames	normalizechannels_firstformatbuffer_sizebackendreturnc              
   C   sF  zddl m} W n. ty> }	 ztd|	W Y d}	~	n
d}	~	0 0 |s\ddl}
|
jdtdd |dkr|ddl}
|
jd	tdd |durddl}
|
jd
tdd |durddl}
|
jdtdd z|| }W n< ty }	 z"td|  d|	 |	W Y d}	~	n
d}	~	0 0 |jj	}|du r tdz|
 }W n6 tyb }	 ztd|	 |	W Y d}	~	n
d}	~	0 0 |j}|dkr||jd kr|r|jd dfnd|jd f}tj|tjd|fS |dd|df }|dkr|r|jd dfnd|jd f}tj|tjd|fS |dkr,|ddd|f }|s>|dd}||fS )ae  Load audio data from source using TorchCodec's AudioDecoder.
    
    .. note::
        
        This function supports the same API as :func:`~torchaudio.load`, and
        relies on TorchCodec's decoding capabilities under the hood. It is
        provided for convenience, but we do recommend that you port your code to
        natively use ``torchcodec``'s ``AudioDecoder`` class for better
        performance:
        https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.decoders.AudioDecoder.
        In TorchAudio 2.9, :func:`~torchaudio.load` will be relying on
        :func:`~torchaudio.load_with_torchcodec`. Note that some parameters of
        :func:`~torchaudio.load`, like ``normalize``, ``buffer_size``, and
        ``backend``, are ignored by :func:`~torchaudio.load_with_torchcodec`.
    
    
    Args:
        uri (path-like object or file-like object):
            Source of audio data. The following types are accepted:
            
            * ``path-like``: File path or URL.
            * ``file-like``: Object with ``read(size: int) -> bytes`` method.
            
        frame_offset (int, optional):
            Number of samples to skip before start reading data.
        num_frames (int, optional):
            Maximum number of samples to read. ``-1`` reads all the remaining samples,
            starting from ``frame_offset``.
        normalize (bool, optional):
            TorchCodec always returns normalized float32 samples. This parameter
            is ignored and a warning is issued if set to False.
            Default: ``True``.
        channels_first (bool, optional):
            When True, the returned Tensor has dimension `[channel, time]`.
            Otherwise, the returned Tensor's dimension is `[time, channel]`.
        format (str or None, optional):
            Format hint for the decoder. May not be supported by all TorchCodec
            decoders. (Default: ``None``)
        buffer_size (int, optional):
            Not used by TorchCodec AudioDecoder. Provided for API compatibility.
        backend (str or None, optional):
            Not used by TorchCodec AudioDecoder. Provided for API compatibility.
            
    Returns:
        (torch.Tensor, int): Resulting Tensor and sample rate.
        Always returns float32 tensors. If ``channels_first=True``, shape is
        `[channel, time]`, otherwise `[time, channel]`.
        
    Raises:
        ImportError: If torchcodec is not available.
        ValueError: If unsupported parameters are used.
        RuntimeError: If TorchCodec fails to decode the audio.
        
    Note:
        - TorchCodec always returns normalized float32 samples, so the ``normalize``
          parameter has no effect.
        - The ``buffer_size`` and ``backend`` parameters are ignored.
        - Not all audio formats supported by torchaudio backends may be supported
          by TorchCodec.
    r   )AudioDecoderz`TorchCodec is required for load_with_torchcodec. Please install torchcodec to use this function.NznTorchCodec AudioDecoder always returns normalized float32 samples. The 'normalize=False' parameter is ignored.   
stacklevelr   zCThe 'buffer_size' parameter is not used by TorchCodec AudioDecoder.z?The 'backend' parameter is not used by TorchCodec AudioDecoder.zCThe 'format' parameter is not supported by TorchCodec AudioDecoder.z"Failed to create AudioDecoder for : z3Unable to determine sample rate from audio metadataz Failed to decode audio samples:    )dtype)Ztorchcodec.decodersr   ImportErrorwarningswarnUserWarning	ExceptionRuntimeErrormetadatasample_rateZget_all_samplesdatashapetorchzerosfloat32	transpose)r   r	   r
   r   r   r   r   r   r   er   decoderr   Zaudio_samplesr    Zempty_shape r(   D/var/www/auris/lib/python3.9/site-packages/torchaudio/_torchcodec.pyload_with_torchcodec	   sz    G,
&
"
"
r*   )r   srcr   r   r   encodingbits_per_sampler   r   compressionr   c
              
   C   s~  zddl m}
 W n. ty> } ztd|W Y d}~n
d}~0 0 |dur`ddl}|jdtdd |durddl}|jdtdd |durddl}|jd	tdd |d
krddl}|jdtdd |durddl}|jdtdd t|tjst	dt
| |jtjkr| }|dkr,t	d| |jdkr^|rJ|d}n|ddd}n8|jdkr|rv|}n|dd}nt	d|j dz|
||d}W n6 ty } ztd| |W Y d}~n
d}~0 0 d}|	dur*t|	ttfrt|	}n$ddl}|jdt
|	 dtdd z|j| |d W n< tyx } z"td|  d| |W Y d}~n
d}~0 0 dS )a  Save audio data to file using TorchCodec's AudioEncoder.

    .. note::
        
        This function supports the same API as :func:`~torchaudio.save`, and
        relies on TorchCodec's encoding capabilities under the hood. It is
        provided for convenience, but we do recommend that you port your code to
        natively use ``torchcodec``'s ``AudioEncoder`` class for better
        performance:
        https://docs.pytorch.org/torchcodec/stable/generated/torchcodec.encoders.AudioEncoder.
        In TorchAudio 2.9, :func:`~torchaudio.save` will be relying on
        :func:`~torchaudio.save_with_torchcodec`. Note that some parameters of
        :func:`~torchaudio.save`, like ``format``, ``encoding``,
        ``bits_per_sample``, ``buffer_size``, and ``backend``, are ignored by
        are ignored by :func:`~torchaudio.save_with_torchcodec`.
    
    This function provides a TorchCodec-based alternative to torchaudio.save
    with the same API. TorchCodec's AudioEncoder provides efficient encoding
    with FFmpeg under the hood.
    
    Args:
        uri (path-like object):
            Path to save the audio file. The file extension determines the format.
            
        src (torch.Tensor):
            Audio data to save. Must be a 1D or 2D tensor with float32 values
            in the range [-1, 1]. If 2D, shape should be [channel, time] when
            channels_first=True, or [time, channel] when channels_first=False.
            
        sample_rate (int):
            Sample rate of the audio data.
            
        channels_first (bool, optional):
            Indicates whether the input tensor has channels as the first dimension.
            If True, expects [channel, time]. If False, expects [time, channel].
            Default: True.
            
        format (str or None, optional):
            Audio format hint. Not used by TorchCodec (format is determined by
            file extension). A warning is issued if provided.
            Default: None.
            
        encoding (str or None, optional):
            Audio encoding. Not fully supported by TorchCodec AudioEncoder.
            A warning is issued if provided. Default: None.
            
        bits_per_sample (int or None, optional):
            Bits per sample. Not directly supported by TorchCodec AudioEncoder.
            A warning is issued if provided. Default: None.
            
        buffer_size (int, optional):
            Not used by TorchCodec AudioEncoder. Provided for API compatibility.
            A warning is issued if not default value. Default: 4096.
            
        backend (str or None, optional):
            Not used by TorchCodec AudioEncoder. Provided for API compatibility.
            A warning is issued if provided. Default: None.
            
        compression (float, int or None, optional):
            Compression level or bit rate. Maps to bit_rate parameter in
            TorchCodec AudioEncoder. Default: None.
            
    Raises:
        ImportError: If torchcodec is not available.
        ValueError: If input parameters are invalid.
        RuntimeError: If TorchCodec fails to encode the audio.
        
    Note:
        - TorchCodec AudioEncoder expects float32 samples in [-1, 1] range.
        - Some parameters (format, encoding, bits_per_sample, buffer_size, backend)
          are not used by TorchCodec but are provided for API compatibility.
        - The output format is determined by the file extension in the uri.
        - TorchCodec uses FFmpeg under the hood for encoding.
    r   )AudioEncoderz`TorchCodec is required for save_with_torchcodec. Please install torchcodec to use this function.NzjThe 'format' parameter is not used by TorchCodec AudioEncoder. Format is determined by the file extension.r   r   zKThe 'encoding' parameter is not fully supported by TorchCodec AudioEncoder.zUThe 'bits_per_sample' parameter is not directly supported by TorchCodec AudioEncoder.r   zCThe 'buffer_size' parameter is not used by TorchCodec AudioEncoder.z?The 'backend' parameter is not used by TorchCodec AudioEncoder.z'Expected src to be a torch.Tensor, got z"sample_rate must be positive, got r   zExpected 1D or 2D tensor, got zD tensor)r   zFailed to create AudioEncoder: zUnsupported compression type z<. TorchCodec AudioEncoder expects int or float for bit_rate.)bit_ratezFailed to save audio to r   )Ztorchcodec.encodersr/   r   r   r   r   
isinstancer"   Tensor
ValueErrortyper   r$   floatndimZ	unsqueezer%   r   r   intZto_file)r   r+   r   r   r   r,   r-   r   r   r.   r/   r&   r   r    encoderr0   r(   r(   r)   save_with_torchcodec   s    W
&

r9   )r   r   TTNr   N)TNNNr   NN)__doc__ostypingr   r   r   r   r"   strPathLiker7   boolr2   r*   r5   r9   r(   r(   r(   r)   <module>   sT           !       