ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

static int prepare_data ( SINC_FILTER filter,
SRC_DATA data,
int  half_filter_chan_len 
) [static]

Definition at line 1135 of file src_sinc.c.

Referenced by sinc_hex_vari_process(), sinc_mono_vari_process(), sinc_multichan_vari_process(), sinc_quad_vari_process(), and sinc_stereo_vari_process().

{   int len = 0 ;

    if (filter->b_real_end >= 0)
        return 0 ;  /* Should be terminating. Just return. */

    if (filter->b_current == 0)
    {   /* Initial state. Set up zeros at the start of the buffer and
        ** then load new data after that.
        */
        len = filter->b_len - 2 * half_filter_chan_len ;

        filter->b_current = filter->b_end = half_filter_chan_len ;
        }
    else if (filter->b_end + half_filter_chan_len + filter->channels < filter->b_len)
    {   /*  Load data at current end position. */
        len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ;
        }
    else
    {   /* Move data at end of buffer back to the start of the buffer. */
        len = filter->b_end - filter->b_current ;
        memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len,
                        (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ;

        filter->b_current = half_filter_chan_len ;
        filter->b_end = filter->b_current + len ;

        /* Now load data at current end of buffer. */
        len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ;
        } ;

    len = MIN (filter->in_count - filter->in_used, len) ;
    len -= (len % filter->channels) ;

    if (len < 0 || filter->b_end + len > filter->b_len)
        return SRC_ERR_SINC_PREPARE_DATA_BAD_LEN ;

    memcpy (filter->buffer + filter->b_end, data->data_in + filter->in_used,
                        len * sizeof (filter->buffer [0])) ;

    filter->b_end += len ;
    filter->in_used += len ;

    if (filter->in_used == filter->in_count &&
            filter->b_end - filter->b_current < 2 * half_filter_chan_len && data->end_of_input)
    {   /* Handle the case where all data in the current buffer has been
        ** consumed and this is the last buffer.
        */

        if (filter->b_len - filter->b_end < half_filter_chan_len + 5)
        {   /* If necessary, move data down to the start of the buffer. */
            len = filter->b_end - filter->b_current ;
            memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len,
                            (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ;

            filter->b_current = half_filter_chan_len ;
            filter->b_end = filter->b_current + len ;
            } ;

        filter->b_real_end = filter->b_end ;
        len = half_filter_chan_len + 5 ;

        if (len < 0 || filter->b_end + len > filter->b_len)
            len = filter->b_len - filter->b_end ;

        memset (filter->buffer + filter->b_end, 0, len * sizeof (filter->buffer [0])) ;
        filter->b_end += len ;
        } ;

    return 0 ;
} /* prepare_data */

Generated on Sat May 26 2012 06:00:16 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.