/* Called from thread context */ void pa_source_output_process_rewind(pa_source_output *o, size_t nbytes /* in source sample spec */) { pa_source_output_assert_ref(o); pa_source_output_assert_io_context(o); pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state)); pa_assert(pa_frame_aligned(nbytes, &o->source->sample_spec)); if (nbytes <= 0) return; if (o->process_rewind) { pa_assert(pa_memblockq_get_length(o->thread_info.delay_memblockq) == 0); if (o->thread_info.resampler) nbytes = pa_resampler_result(o->thread_info.resampler, nbytes); pa_log_debug("Have to rewind %lu bytes on implementor.", (unsigned long) nbytes); if (nbytes > 0) o->process_rewind(o, nbytes); if (o->thread_info.resampler) pa_resampler_reset(o->thread_info.resampler); } else pa_memblockq_rewind(o->thread_info.delay_memblockq, nbytes); }
/* Called from thread context */ void pa_source_output_update_max_rewind(pa_source_output *o, size_t nbytes /* in the source's sample spec */) { pa_source_output_assert_ref(o); pa_source_output_assert_io_context(o); pa_assert(PA_SOURCE_OUTPUT_IS_LINKED(o->thread_info.state)); pa_assert(pa_frame_aligned(nbytes, &o->source->sample_spec)); if (o->update_max_rewind) o->update_max_rewind(o, o->thread_info.resampler ? pa_resampler_result(o->thread_info.resampler, nbytes) : nbytes); }
/* Called from output thread context */ static int source_output_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) { struct userdata *u = PA_SOURCE_OUTPUT(obj)->userdata; switch (code) { case SOURCE_OUTPUT_MESSAGE_LATENCY_SNAPSHOT: { size_t length; length = pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq); u->latency_snapshot.send_counter = u->send_counter; u->latency_snapshot.source_output_buffer = u->source_output->thread_info.resampler ? pa_resampler_result(u->source_output->thread_info.resampler, length) : length; u->latency_snapshot.source_latency = pa_source_get_latency_within_thread(u->source_output->source); return 0; } } return pa_source_output_process_msg(obj, code, data, offset, chunk); }