o
    i                     @   sv   d dl mZ d dlmZmZmZ d dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZ G dd	 d	ZdS )
    )BytesIO)IteratorListOptionalN)AudioCodecContext)aformat)Graph)AudioFormat
AudioFrameDtypeFilterc                   @   s   e Zd Z							ddeee  dee dedee dee	 d	ed
ee	 fddZ
edee fddZedee fddZdefddZddedee fddZdd ZdS )StreamReaderNF   filtersdtype	is_planarformatrateto_mono
frame_sizec                 C   st   d| _ d| _t | _d| _t|du |du |du |du gs,|p g }|t||||| || _|| _	d| _
d| _dS )a  
        Create a StreamReader object.

        Args:
            filters: The filters to apply to the audio stream.
            dtype: The data type of the output audio frames.
            is_planar: Whether the output audio frames are planar.
            format: The format of the output audio frames.
            rate: The sample rate of the output audio frames.
            to_mono: Whether to convert the output audio frames to mono.
            frame_size: The frame size of the audio frames.
        Nr   )_codec_context_graphr   bytes_iobytes_per_decode_attemptallappendr   r   r   offsetpacket)selfr   r   r   r   r   r   r    r   Q/home/ubuntu/.local/lib/python3.10/site-packages/audiolab/reader/stream_reader.py__init__   s    
zStreamReader.__init__returnc                 C   s*   | j d u r| jd u rd S | jjj| _ | j S N)r   r   streamcodec_contextr   r   r   r    r%   =   s
   

zStreamReader.codec_contextc                 C   s6   | j d u r| jd u rd S t| jj| j| jd| _ | j S )N)r   r   )r   r   r   r$   r   r   r&   r   r   r    graphE   s
   

zStreamReader.graphframec                 C   s"   | j | |  jt|7  _d S r#   )r   writer   len)r   r(   r   r   r    pushM   s   zStreamReader.pushpartialc                 c   s   |s| j d | jkrd| _ zi| jd tj| jdd}| D ]S}|| _| jjd u r/|s/q!| j	d urB| jjd u sA| j	| jjkrBq!| j
|D ]!}|jt|j|jj |jj  | _	| j| | j E d H  qH| jj|dE d H  q!W d S  tjtjtjtjfy   Y d S w d S )N   r   latin1)metadata_encoding)r,   )r   r   r   seekavopendemuxr   ptsr   r%   decodeintsamplesr$   r   	time_baser'   r+   pullEOFErrorInvalidDataErrorOSErrorPermissionError)r   r,   	containerr   r(   r   r   r    r9   Q   s,   $"zStreamReader.pullc                 C   s*   d | _ d | _t | _d| _d | _d | _d S )Nr   )r   r   r   r   r   r   r   r&   r   r   r    resetl   s   
zStreamReader.reset)NNFNNFr   )F)__name__
__module____qualname__r   r   r   r   boolr	   r6   r!   propertyr   r%   r   r'   bytesr+   r   r
   r9   r?   r   r   r   r    r      s<    

"r   )ior   typingr   r   r   r1   r   audiolab.avr   audiolab.av.graphr   audiolab.av.typingr	   r
   r   r   r   r   r   r   r    <module>   s   