static void Flush( filter_t *p_filter ) { filter_sys_t *p_sys = p_filter->p_sys; if( p_sys->last_soxr ) { soxr_clear( p_sys->last_soxr ); p_sys->i_last_olen = 0; p_sys->last_soxr = NULL; } }
void DSD2PCM::Reset() { buffer.clear(); buffer_stored = 0; for (int ch = 0; ch < channels; ++ch) { ds[ch].reset(); ns[ch].reset(); } flush_phase = false; soxr_clear(soxr); }
static block_t * SoXR_Resample( filter_t *p_filter, soxr_t soxr, block_t *p_in, size_t i_olen ) { filter_sys_t *p_sys = p_filter->p_sys; size_t i_idone, i_odone; const size_t i_oframesize = p_filter->fmt_out.audio.i_bytes_per_frame; const size_t i_ilen = p_in ? p_in->i_nb_samples : 0; block_t *p_out = i_ilen >= i_olen ? p_in : block_Alloc( i_olen * i_oframesize ); soxr_error_t error = soxr_process( soxr, p_in ? p_in->p_buffer : NULL, i_ilen, &i_idone, p_out->p_buffer, i_olen, &i_odone ); if( error ) { msg_Err( p_filter, "soxr_process failed: %s", soxr_strerror( error ) ); block_Release( p_out ); goto error; } if( unlikely( i_idone < i_ilen ) ) msg_Err( p_filter, "lost %zd of %zd input frames", i_ilen - i_idone, i_idone); p_out->i_buffer = i_odone * i_oframesize; p_out->i_nb_samples = i_odone; p_out->i_length = vlc_tick_from_samples(i_odone, p_filter->fmt_out.audio.i_rate); if( p_in ) { p_sys->i_last_olen = i_olen; p_sys->last_soxr = soxr; } else { soxr_clear( soxr ); p_sys->i_last_olen = 0; p_sys->last_soxr = NULL; } error: if( p_in && p_out != p_in ) block_Release( p_in ); return p_out; }