
    iy                         d dl Zd dlmZ d dlmZ d dlZddZ	dej                  defdZdej                  defdZ	 	 	 ddej                  eef   d	ed
ej"                  d   dej"                  d   def
dZy)    N)Pathc                 >   ddl }||dk(  r| S | j                  j                  sJ d       |dk(  r0| t        d| j	                         j                         z  d      z  } | S |dk(  r| j                  d	d
      } | S |dk(  r|j                  |       } | S t        d|       )z"Prevent clipping in torch tensors.r   Nnonetoo late for clippingrescale)\(?   clampGzGz?tanhInvalid mode )torchdtypeis_floating_pointmaxabsr
   r   
ValueError)wavmoder   s      e/Volumes/fast/ai/experiments/voice-extract-mac/.venv/lib/python3.12/site-packages/demucs_mlx/audio.pyprevent_clipr      s    |tv~
99&&?(??&yCswwy}}.22 J 
iit$
 J	 
jjo J =/00    r   r   c                    ||dk(  r| S t        j                  | j                  t         j                        st	        d      |dk(  rGt        t        j                  t        j                  |                   }t        d|z  d      }| |z  } | S |dk(  rt        j                  | dd      } | S |d	k(  rt        j                  |       } | S t        d
|       )z!Prevent clipping in numpy arrays.r   r   r   r         ?r
   r   r   r   r   )np
issubdtyper   floatingAssertionErrorfloatr   r   clipr   r   r   r   max_valscales       r   _prevent_clip_numpyr%      s    |tv~
==BKK0455yrvvc{+,D7NC(Ek J 
ggc5$'
 J	 
ggcl J =/00r   c                 >   ||dk(  r| S |dk(  rHt        j                  t        j                  |             }t        j                  d|z  d      }| |z  } | S |dk(  rt        j                  | dd      } | S |dk(  rt        j
                  |       } | S t        d	|       )
z3Prevent clipping using MLX ops (keeps data on GPU).r   r   r   r   r
   r   r   r   r   )mxr   r   maximumr!   r   r   r"   s       r   _prevent_clip_mlxr)   ,   s    |tv~
y&&%

4'>3/Ek J 
ggc5$'
 J	 
ggcl J =/00r   path
samplerater!   )r   r
   r   r   bits_per_sample)          as_floatc                    ddl }t        |      }|rd}n	|dk(  rdnd}t        | t        j                        rXt        | |      }|j                  dk(  r|}	nt        j                  |d      }	|j                  t        |      |	|||d	k7  
       yt        | t        j                        r| }
t        j                  |
j                  t        j                        rt        |
|      }
|
j                  dk(  r|
}	nt        j                   |
j"                        }	|j                  t        |      |	||d
       yddl}t        | |j&                        rt)        | |      } | j+                         j-                         j/                         }
|
j                  dk(  r|
}	nt        j                   |
j"                        }	|j                  t        |      |	||d
       yt1        dt3        |              )zh
    Save audio file using mlx_audio_io.
    Supports np.ndarray, mlx.core.array, and torch.Tensor.
    r   Nfloat32r-   pcm16)r   r	   )r	   r   r   )encodingr!   FzUnsupported audio type: )mlx_audio_ior   
isinstancer'   arrayr)   ndim	transposesavestrr   ndarrayr   r   r   r%   ascontiguousarrayTr   Tensorr   detachcpunumpy	TypeErrortype)r   r*   r+   r!   r,   r0   macr4   wav_mxaudio_to_savewav_npr   s               r   
save_audiorI   =   s    :D -37 #rxx "3T2 ;;!"MLL8MTM:PTX^P^`	C	$==r{{3(d;F;;!"M00:MTM:uU 	c5<<(s.CZZ\%%'--/F{{a & " 4 4VXX >HHSYzHSXHY6tCykBCCr   )r   )r   r-   F)typingtppathlibr   mlx.corecorer'   rB   r   r   r<   r;   r%   r7   r)   UnionintLiteralboolrI    r   r   <module>rT      s       "RZZ s &288 3 ( GP9; %3DXXc4i(3D3D ZZ BC3D !#

: 6	3D
 3Dr   