+
    TV-jŒB  ã                   óþ   € R t ^ RIt^ RIt^ RIt^ RIHt ^ RIHtHtH	t	 ^ RI
tRRRRRRRRRRR	R	R
R	RR/tRRRRRR/tR R ltR R ltR$R R lltR R ltR R ltR%R R lltR&R R lltR'R  R! lltR&R" R# lltR# )(a]  Audio I/O utilities using miniaudio.

This module provides functions for reading and writing audio files.
- Reading: Uses miniaudio to support WAV, MP3, FLAC, and Vorbis formats.
           Uses ffmpeg for M4A/AAC, OGG, Opus, and WebM format support.
- Writing: Uses miniaudio for WAV and ffmpeg for MP3, FLAC, OGG, Opus, Vorbis, and WebM encoding.
N)ÚPath)ÚOptionalÚTupleÚUnionÚwavÚmp3ÚflacÚoggÚvorbisÚm4aÚaacÚwebmÚint16ÚSIGNED16Úint32ÚSIGNED32Úfloat32ÚFLOAT32c                ó0   € V ^8„  d   QhR\         R\        /# )é   ÚdataÚreturn)ÚbytesÚstr)Úformats   "Úc/Volumes/fast/ai/experiments/ui-tars-smoke/.venv/lib/python3.14/site-packages/mlx_audio/audio_io.pyÚ__annotate__r   %   s   € ÷ Eñ E¤Eð E¬cñ Eó    c                ó,  € V R,          R8X  d   V R,          R8X  d   R# V R,          R8X  g   V R,          R	8X  g   V R,          R
8X  d   R# V R,          R8X  d   R# V R,          R8X  d   R# V R,          R8X  d   R# V R,          R8X  d   R# \        R4      h)z6Detect audio format from bytes data using magic bytes.ºNé   Ns   RIFF:é   é   Ns   WAVEr   :Né   Ns   ID3:é    r   Ns   ÿûs   ÿúr   s   fLaCr   ó   OggSr
   ºr    r!   Nó   ftypr   ó   Eß£r   z(Unable to detect audio format from bytes)Ú
ValueError)r   s   &r   Ú_detect_format_from_bytesr*   %   sŠ   € àˆB…x�7Ô˜t D�z¨WÔ4ÙØ	ˆb��VÔ	  S¥	¨[Ô 8¸DÀ½IÈÔ<TÙØ	ˆb��WÔ	ÙØ	ˆb��WÔ	ÙØ	ˆc��gÔ	áØ	ˆb�Ð(Ô	(áäÐCÓDÐDr   c                óœ   € V ^8„  d   QhR\         \        \        \        3,          R\        \
        P                  \        \        3,          /# )r   Ú
input_datar   )r   r   r   r   r   ÚnpÚndarrayÚint)r   s   "r   r   r   9   s<   € ÷ |+ñ |+Ü”cœ4¤Ð&Õ'ð|+ä
Œ2�:‰:”sœCÐÕ ñ|+r   c                óö  € \         P                  ! R4      pVf   \        R4      h\         P                  ! R4      pVf   \        R4      h\        V \        4      '       d'   VRRRR	R
RRRR.
p\
        P                  ! VV RR7      pM,VRRRR	R
RR\        V 4      .	p\
        P                  ! VRR7      pVP                  ^ 8w  d'   \        RVP                  P                  4        24      h^ RIpVP                  VP                  P                  4       4      pVP                  R4      '       g   \        R4      hVR,          ^ ,          p\        VP                  RR4      4      p\        VP                  R^4      4      p	\        V \        4      '       d;   VRRRRRRR\        V4      R\        V	4      R.p
\
        P                  ! V
V RR7      pMAVR\        V 4      RRRRR\        V4      R\        V	4      R.p
\
        P                  ! V
RR7      pVP                  ^ 8w  d'   \        RVP                  P                  4        24      h\         P"                  ! VP                  \         P$                  R 7      pWÈV	3# )!a"  Decode audio using ffmpeg (for formats not supported by miniaudio like M4A).

Args:
    input_data: Path to the audio file or raw bytes data.

Returns:
    Tuple of (samples as int16 numpy array, sample_rate, nchannels).

Raises:
    RuntimeError: If ffmpeg is not found or decoding fails.
ÚffmpegNzí
========================================
  ffmpeg not found!
========================================

ffmpeg is required for M4A/AAC/WebM audio decoding.

Install ffmpeg:
  macOS:  brew install ffmpeg
  Ubuntu: sudo apt install ffmpeg
Úffprobez1ffprobe not found (usually installed with ffmpeg)z-vÚquietz-print_formatÚjsonz-show_streamsz-select_streamsza:0ú-iúpipe:0T©ÚinputÚcapture_output)r9   zffprobe failed: ÚstreamszNo audio streams found in fileÚsample_rateiD¬  Úchannelsú-fÚs16lez-acodecÚ	pcm_s16leú-arú-acúpipe:1zffmpeg decoding failed: ©Údtype)ÚshutilÚwhichÚRuntimeErrorÚ
isinstancer   Ú
subprocessÚrunr   Ú
returncodeÚstderrÚdecoder4   ÚloadsÚstdoutÚgetr/   r-   Ú
frombufferr   )r,   Úffmpeg_pathÚffprobe_pathÚ	probe_cmdÚprobe_resultr4   Ú
probe_infoÚstreamr;   Ú	nchannelsÚ
decode_cmdÚdecode_resultÚsampless   &            r   Ú_decode_ffmpegr\   9   sx  € ô —,’,˜xÓ(€KØÒÜð	2ó
ð 	
ô —<’< 	Ó*€LØÒÜÐNÓOÐOä�*œe×$Ò$ð ØØØØØØØØØð
ˆ	ô "—~’~ØØØô
‰ð ØØØØØØØÜ�
‹Oð

ˆ	ô "—~’~ iÀÔEˆà×Ñ !Ô#ÜÐ-¨l×.AÑ.A×.HÑ.HÓ.JÐ-KÐLÓMÐMãà—‘˜L×/Ñ/×6Ñ6Ó8Ó9€JØ�>‰>˜)×$Ò$ÜÐ;Ó<Ð<à˜	Õ" 1Õ%€FÜ�f—j‘j °Ó6Ó7€KÜ�F—J‘J˜z¨1Ó-Ó.€Iô �*œe×$Ò$àØØØØØØØÜ�ÓØÜ�	‹NØð
ˆ
ô #ŸšØØØô
‰ð ØÜ�
‹OØØØØØÜ�ÓØÜ�	‹NØð
ˆ
ô #Ÿš zÀ$ÔGˆà×Ñ 1Ô$ÜÐ5°m×6JÑ6J×6QÑ6QÓ6SÐ5TÐUÓVÐVô �mŠm˜M×0Ñ0¼¿¹ÔA€Gà Ð*Ð*r   c          
      ó¾   € V ^8„  d   QhR\         \        \        \        P                  3,          R\
        R\        R\        \        P                  \        3,          /# )r   ÚfileÚ	always_2drD   r   ©
r   r   r   ÚioÚBytesIOÚboolr   r-   r.   r/   )r   s   "r   r   r   ¸   sS   € ÷ c ñ c Ü
””Tœ2Ÿ:™:Ð%Õ
&ðc äðc ô ðc ô Œ2�:‰:”sˆ?Õñ	c r   c                óÞ  € Rp\        V \        \        34      '       d=   \        V 4      P                  P	                  R4      P                  4       pVR9   d   RpM\        V \        P                  4      '       d`   V P                  ^ 4       V P                  ^4      pV P                  ^ 4       VR,          R8X  g   VR,          R8X  g   VR,          R8X  d   RpV'       dU   \        V \        P                  4      '       d#   V P                  ^ 4       V P                  4       pMT p\        V4      w  rxp	EM²^ R	Ip
\        V \        \        34      '       dM   V
P                  \        V 4      4      pV
P                  \        V 4      VP                  VP                  R
7      pMþ\        V \        P                  4      '       dÈ   V P                  ^ 4       V P                  4       p\!        V4      pVR8X  d   V
P#                  V4      pMYVR8X  d   V
P%                  V4      pM@VR8X  d   V
P'                  V4      pM'VR8X  d   V
P)                  V4      pM\+        RV 24      hV
P-                  VVP                  VP                  R
7      pM\/        R\1        V 4       24      hVP                  pVP                  p	\2        P4                  ! VP6                  \2        P8                  R7      pV	^8”  d   VP;                  RV	4      pVR9   d   VP=                  V4      R,          pMVR8X  d   MVP=                  V4      pV'       d+   VP>                  ^8X  d   VR\2        P@                  3,          pWx3# )a»  Read an audio file using miniaudio (or ffmpeg for M4A/AAC/OGG/Opus/WebM).

Args:
    file: Path to the audio file or a BytesIO object.
    always_2d: If True, always return a 2D array (samples, channels).
    dtype: Data type for the output array. Supports 'float32', 'float64', 'int16'.

Returns:
    Tuple of (audio_data, sample_rate).
    audio_data is a numpy array with shape (samples,) for mono or (samples, channels) for multi-channel.
FÚ.Tr&   r'   r   r%   r(   N)rX   r;   r   r   r   r
   zUnsupported format: zUnsupported file type: rC   g      à@r   :NNN)r   r   r	   Úopusr   éÿÿÿÿ)r   Úfloat64)!rH   r   r   ÚsuffixÚlstripÚlowerra   rb   ÚseekÚreadr\   Ú	miniaudioÚget_file_infoÚdecode_filerX   r;   r*   Úwav_get_infoÚmp3_get_infoÚflac_get_infoÚvorbis_get_infor)   rM   Ú	TypeErrorÚtyper-   Úarrayr[   r   ÚreshapeÚastypeÚndimÚnewaxis)r^   r_   rD   Ú
use_ffmpegÚextÚheaderr,   r[   r;   rX   rn   ÚinfoÚdecodedr   Úfmts   &&&            r   rm   rm   ¸   sÌ  € ð" €JÜ�$œœd˜×$Ò$Ü�4‹j×Ñ×&Ñ& sÓ+×1Ñ1Ó3ˆØÐ7Ô7ØˆJøÜ	�Dœ"Ÿ*™*×	%Ò	%Ø�	‰	�!ŒØ—‘˜2“ˆØ�	‰	�!Œà�3�K˜7Ô"Ø�b�z˜WÔ$Ø�b�zÐ0Ô0àˆJçä�dœBŸJ™J×'Ò'Ø�I‰I�aŒLØŸ™›‰JàˆJÜ*8¸Ó*DÑ'ˆšió 	ä�dœS¤$˜K×(Ò(à×*Ñ*¬3¨t«9Ó5ˆDØ×+Ñ+Ü�D“	ØŸ.™.Ø ×,Ñ,ð ,ó ‰Gô
 ˜œbŸj™j×)Ò)Ø�I‰I�aŒLØ—9‘9“;ˆDä+¨DÓ1ˆCØ�eŒ|Ø ×-Ñ-¨dÓ3‘Ø˜”Ø ×-Ñ-¨dÓ3‘Ø˜”Ø ×.Ñ.¨tÓ4‘Ø˜”Ø ×0Ñ0°Ó6‘ä Ð#7¸°uÐ!=Ó>Ð>Ø×&Ñ&ØØŸ.™.Ø ×,Ñ,ð 'ó ‰Gô Ð5´d¸4³j°\ÐBÓCÐCà×)Ñ)ˆØ×%Ñ%ˆ	ô —(’(˜7Ÿ?™?´"·(±(Ô;ˆð �1„}Ø—/‘/ " iÓ0ˆð Ð&Ô&Ø—.‘. Ó'¨'Õ1‰Ø	�'Ô	Øà—.‘. Ó'ˆ÷ �W—\‘\ QÔ&Ø˜!œRŸZ™Z˜-Õ(ˆàÐÐr   c                ó$   € V ^8„  d   QhR\         /# ©r   r   )rc   )r   s   "r   r   r     s   € ÷ .ñ .¤ñ .r   c                 ó2   € \         P                  ! R4      RJ# )z+Check if ffmpeg is available on the system.r1   N)rE   rF   © r   r   Ú_check_ffmpeg_availabler†     s   € ä�<Š<˜Ó!¨Ð-Ð-r   c                ó$   € V ^8„  d   QhR\         /# rƒ   )r   )r   s   "r   r   r   #  s   € ÷ ñ œ#ñ r   c                 óP   € \         P                  ! R4      p V f   \        R4      hV # )zGet the path to ffmpeg executable.

Returns:
    Path to ffmpeg executable.

Raises:
    RuntimeError: If ffmpeg is not found.
r1   a?  
========================================
  ffmpeg not found!
========================================

ffmpeg is required for MP3/FLAC/WebM encoding and M4A/AAC/WebM decoding.

Install ffmpeg:
  macOS:  brew install ffmpeg
  Ubuntu: sudo apt install ffmpeg

Alternatively, use WAV format which doesn't require ffmpeg.
)rE   rF   rG   )rR   s    r   Ú_get_ffmpeg_pathr‰   #  s3   € ô —,’,˜xÓ(€KØÒÜðLó
ð 	
ð Ðr   c                ó¸   € V ^8„  d   QhR\         P                  R\        R\        R\        \        \
        \        P                  3,          R\        R\        RR/# )	r   r   Ú
sampleraterX   Úoutputr   Úbitrater   N)r-   r.   r/   r   r   r   ra   rb   )r   s   "r   r   r   ?  st   € ÷ NKñ NKÜ
�*‰*ðNKäðNKô ðNKô ”#”tœRŸZ™ZÐ'Õ(ð	NKô
 ðNKô ðNKð 
ñNKr   c           
     ó  € \        4       pV P                  ^8X  d   V P                  4       pMV P                  4       P                  4       pVRRRR\	        V4      R\	        V4      RR.
pVR8X  d   VP                  R	V.4       MTVR
8X  d   VP                  RRR	V.4       M7VR8X  d   VP                  RRR	V.4       MVR9   d   VP                  RR.4       VR8X  d   RpVP                  RV.4       \        V\        P                  4      '       d�   VP                  R4       \        P                  ! VVRR7      p	V	P                  ^ 8w  d'   \        RV	P                  P                  4        24      hVP!                  V	P"                  4       VP%                  ^ 4       R# VP                  \	        V4      4       \        P                  ! VVRR7      p	V	P                  ^ 8w  d'   \        RV	P                  P                  4        24      hR# )a]  Encode audio using ffmpeg.

Args:
    data: Audio data as int16 numpy array (samples,) or (samples, channels)
    samplerate: Sample rate in Hz
    nchannels: Number of channels
    output: Output file path or BytesIO object
    format: Output format (mp3, flac, ogg, opus, vorbis, etc.)
    bitrate: Audio bitrate for lossy formats (default: 128k)
z-yr=   r>   r@   rA   r5   r6   r   z-b:arf   z-c:aÚlibopusr   r	   r
   r   rB   Tr7   zffmpeg failed: N)r	   r
   )r‰   rz   ÚtobytesÚflattenr   ÚextendrH   ra   rb   ÚappendrI   rJ   rK   rG   rL   rM   ÚwriterO   rl   )
r   r‹   rX   rŒ   r   r�   rR   Ú	pcm_bytesÚcmdÚresults
   &&&&&&    r   Ú_encode_ffmpegr˜   ?  sÑ  € ô$ #Ó$€Kð ‡y�y�A„~Ø—L‘L“N‰	à—L‘L“N×*Ñ*Ó,ˆ	ð 	ØØØØÜˆJ‹ØÜˆI‹ØØð€Cð �„Ø�
‰
�F˜GÐ$Õ%Ø	�6Ô	Ø�
‰
�F˜I v¨wÐ7Õ8Ø	�6Ô	Ø�
‰
�F˜I v¨wÐ7Õ8Ø	Ð$Ô	$ð 	�
‰
�F˜FÐ#Ô$ð �ÔØˆà‡J�J��fˆ~Ôä�&œ"Ÿ*™*×%Ò%Ø�
‰
�8ÔÜ—’ØØØô
ˆð
 ×Ñ Ô!Ü °·±×1EÑ1EÓ1GÐ0HÐIÓJÐJØ�‰�V—]‘]Ô#Ø�‰�AŽà�
‰
”3�v“;ÔÜ—’ØØØô
ˆð
 ×Ñ Ô!Ü °·±×1EÑ1EÓ1GÐ0HÐIÓJÐJñ "r   c          
      ó¶   € V ^8„  d   QhR\         \        \        \        P                  3,          R\
        P                  R\        R\        \        ,          RR/# ©r   r^   r   r‹   r   r   N©	r   r   r   ra   rb   r-   r.   r/   r   )r   s   "r   r   r   �  s`   € ÷ sAñ sAÜ
””Tœ2Ÿ:™:Ð%Õ
&ðsAä
�*‰*ðsAô ðsAô ”S�Mð	sAð
 
ñsAr   c                óþ  € ^ RI pVfR   \        V \        \        34      '       d4   \        V 4      P                  P                  R4      P                  4       pMRpVP                  4       p\        V\        P                  4      '       g‰   \        VR4      '       d8   \        VR4      '       g&   \        P                  ! VP                  4       4      pM?\        VR4      '       d   \        P                  ! V4      pM\        P                  ! V4      pVP                  \        P                  \        P                  39   d@   \        P                   ! VRR4      pVR,          P#                  \        P$                  4      pM>VP                  \        P$                  8w  d    VP#                  \        P$                  4      pVP&                  ^8X  d   ^pTpM#VP(                  ^,          pVP+                  4       pVR8X  g   VR	8X  d…   VP-                  4       p\        V \.        P0                  4      '       d%   V P3                  V4       V P5                  ^ 4       R# \7        V R
4      ;_uu_ 4       pVP3                  V4       RRR4       R# VR8X  Ed7   ^ RI
p	V	P                  RVP                  4       4      p
VP9                  RVVVP:                  P<                  V
R7      p\        V \.        P0                  4      '       d¬   ^ RIpVPA                  RRR7      ;_uu_ 4       pVPB                  pRRR4        VPE                  XV4       \7        VR4      ;_uu_ 4       pV P3                  VPG                  4       4       RRR4       V P5                  ^ 4       ^ RI$pVPK                  V4       R# VPE                  \        V 4      V4       R# VR9   dO   \M        4       '       g/   ^ RI'pVPQ                  RVPS                  4        R2\T        ^R7       \W        WWPVR7       R# \Y        RV 24      h  + '       g   i     R# ; i  + '       g   i     EL; i  + '       g   i     Là; i  ^ RI$pTPK                  X4       i ; i)a  Write audio data to a file.

Args:
    file: Path to the output file or a BytesIO object.
    data: Audio data as numpy array. Shape can be (samples,) for mono
          or (samples, channels) for multi-channel.
    samplerate: Sample rate in Hz.
    format: Output format. Supports 'wav', 'flac', 'mp3', 'ogg', 'opus', 'vorbis', 'webm'.
            If None, inferred from file extension.

Note:
    WAV uses miniaudio for encoding.
    MP3, FLAC, OGG, Opus, Vorbis, and WebM use ffmpeg (must be installed: brew install ffmpeg).
Nre   r   ÚtolistÚ	__array__g      ð?iÿ  ÚpcmÚrawÚwbÚhrŒ   )ÚnamerX   r;   Úsample_formatr[   z.wavF)ri   ÚdeleteÚrbzffmpeg is required for z§ encoding but was not found. Install with: brew install ffmpeg (macOS) or sudo apt install ffmpeg (Ubuntu). Falling back will fail - consider using WAV format instead.)Ú
stacklevel©r   zUnsupported output format: g      ð¿)r   r   r	   rf   r
   r   )-rn   rH   r   r   ri   rj   rk   r-   r.   Úhasattrrw   r�   ÚasarrayrD   r   rh   Úclipry   r   rz   Úshaper‘   r�   ra   rb   r”   rl   ÚopenÚDecodedSoundFileÚSampleFormatr   ÚtempfileÚNamedTemporaryFiler£   Úwav_write_filerm   ÚosÚunlinkr†   ÚwarningsÚwarnÚupperÚRuntimeWarningr˜   r)   )r^   r   r‹   r   rn   rX   Úsamples_flatr•   Úfrw   Úsamples_arrayÚsoundr°   ÚtmpÚtmp_pathr³   rµ   s   &&&&             r   r”   r”   �  sS  € ó( ð ‚~Ü�dœS¤$˜K×(Ò(Ü˜$“Z×&Ñ&×-Ñ-¨cÓ2×8Ñ8Ó:‰FàˆFà�\‰\‹^€Fô �dœBŸJ™J×'Ò'ä�4˜×"Ò"¬7°4¸×+EÒ+EÜ—8’8˜DŸK™K›MÓ*‰DÜ�T˜;×'Ò'Ü—:’:˜dÓ#‰Dä—8’8˜D“>ˆDð ‡z�z”b—j‘j¤"§*¡*Ð-Ô-ä�wŠw�t˜T 3Ó'ˆØ�u•×$Ñ$¤R§X¡XÓ.‰Ø	�‰”r—x‘xÔ	Ø�{‰{œ2Ÿ8™8Ó$ˆð ‡y�y�A„~Øˆ	Ø‰à—J‘J˜q•Mˆ	Ø—|‘|“~ˆà�„˜& Eœ/à ×(Ñ(Ó*ˆ	ä�dœBŸJ™J×'Ò'Ø�J‰J�yÔ!Ø�I‰I�aŽLä�d˜D×!Ô! QØ—‘˜	Ô"÷ "Ñ!ð 
�5�Ûð Ÿ™ C¨×)<Ñ)<Ó)>Ó?ˆð ×*Ñ*ØØØ"Ø#×0Ñ0×9Ñ9Ø!ð +ó 
ˆô �dœBŸJ™J×'Ò'ãà×,Ñ,°FÀ5Ð,×IÔIÈSØŸ8™8�÷ Jð$Ø×(Ñ(¨°5Ô9Ü˜( D×)Ô)¨QØ—J‘J˜qŸv™v›xÔ(÷ *à—	‘	˜!”ãà—	‘	˜(Ö#à×$Ñ$¤S¨£Y°Ö6à	ÐCÔ	Cä&×(Ò(Ûà�M‰MØ)¨&¯,©,«.Ð)9ð :Nð Nô Øð ô ô 	�t¨À×HäÐ6°v°hÐ?Ó@Ð@÷e "×!Ð!ú÷, J×IÐIú÷ *×)ûó à—	‘	˜(Õ#ús<   É-P*ÌP>Ì4&Q% Í QÍ:Q% Ð*P;	Ð>Q	ÑQ"	ÑQ% Ñ%Q<c                ó²   € V ^8„  d   QhR\         \        \        \        P                  3,          R\
        R\        \        P                  \        3,          /# )r   r^   r_   r   r`   )r   s   "r   r   r     sC   € ÷ <ñ <Ü
””Tœ2Ÿ:™:Ð%Õ
&ð<äð<ô Œ2�:‰:”sˆ?Õñ<r   c                ó   € \        WRR7      # )zóRead audio file (soundfile-compatible API).

This is a drop-in replacement for soundfile.read().

Args:
    file: Path to audio file or BytesIO object.
    always_2d: If True, always return 2D array.

Returns:
    Tuple of (data, samplerate).
rh   )r_   rD   )rm   )r^   r_   s   &&r   Úsf_readrÁ     s   € ô �°Ô;Ð;r   c          
      ó¶   € V ^8„  d   QhR\         \        \        \        P                  3,          R\
        P                  R\        R\        \        ,          RR/# rš   r›   )r   s   "r   r   r     sR   € ÷ 1ñ 1Ü
””Tœ2Ÿ:™:Ð%Õ
&ð1ä
�*‰*ð1ô ð1ô ”S�Mð	1ð
 
ñ1r   c                ó    € \        WW#R7       R# )a  Write audio file (soundfile-compatible API).

This is a drop-in replacement for soundfile.write().

Args:
    file: Path to output file or BytesIO object.
    data: Audio data as numpy array.
    samplerate: Sample rate in Hz.
    format: Output format (wav, flac, mp3).
r¨   N)r”   )r^   r   r‹   r   s   &&&&r   Úsf_writerÄ     s   € ô  
ˆ$�j×0r   )Frh   )r   Ú128k)N)F)Ú__doc__ra   rE   rI   Úpathlibr   Útypingr   r   r   Únumpyr-   Ú_FORMAT_MAPÚ_SAMPLE_FORMAT_MAPr*   r\   rm   r†   r‰   r˜   r”   rÁ   rÄ   r…   r   r   Ú<module>rÌ      s¨   ðñó 
Û Û Ý ß )Ñ )ã ð 
ˆ5Ø	ˆ5Ø
ˆFØ	ˆ8ØˆhØ	ˆ5Ø	ˆ5Ø
ˆFð	€ð ˆZØˆZØˆyðÐ õEõ(|+÷~c õL.õ
÷8NK÷bsA÷n<÷$1ñ 1r   