> > avoids duplicate code in mmap_read/write() and unix_read/write() > > Looks good, but in the name of optimisation I would have expected these > to be inlined...? the compiler is free to do so... p. > > src/modules/alsa/alsa-sink.c | 57 > +++++++++++++++++------------------------- > > src/modules/alsa/alsa-source.c | 35 +++++++++++++------------- > > 2 files changed, 40 insertions(+), 52 deletions(-) > > > > diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c > > index 0d13716..aab7ee7 100644 > > --- a/src/modules/alsa/alsa-sink.c > > +++ b/src/modules/alsa/alsa-sink.c > > @@ -508,10 +508,29 @@ static size_t check_left_to_play(struct userdata *u, > size_t n_bytes, bool on_tim > > return left_to_play; > > } > > > > +static pa_usec_t compute_sleep(struct userdata *u, size_t left_to_play) { > > + size_t input_underrun = pa_sink_process_input_underruns(u->sink, > left_to_play); > > + pa_usec_t sleep_usec = 0; > > + > > + if (u->use_tsched) { > > + pa_usec_t underrun_sleep = > pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec); > > + sleep_usec = PA_BYTES_TO_USEC(left_to_play, &u->sink->sample_spec); > > + > > + if (sleep_usec > u->tsched_watermark_usec) > > + sleep_usec -= u->tsched_watermark_usec; > > + else > > + sleep_usec = 0; > > + > > + sleep_usec = PA_MIN(sleep_usec, underrun_sleep); > > + } > > + > > + return sleep_usec; > > +} > > + > > static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, bool > polled, bool on_timeout) { > > bool work_done = false; > > pa_usec_t max_sleep_usec = 0, process_usec = 0; > > - size_t left_to_play, input_underrun; > > + size_t left_to_play; > > size_t sleep_bytes = 0; > > unsigned j = 0; > > > > @@ -683,22 +702,7 @@ static int mmap_write(struct userdata *u, pa_usec_t > *sleep_usec, bool polled, bo > > } > > > > done: > > - input_underrun = pa_sink_process_input_underruns(u->sink, > left_to_play); > > - > > - if (u->use_tsched) { > > - pa_usec_t underrun_sleep = > pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec); > > - > > - *sleep_usec = PA_BYTES_TO_USEC(left_to_play, > &u->sink->sample_spec); > > - process_usec = u->tsched_watermark_usec; > > - > > - if (*sleep_usec > process_usec) > > - *sleep_usec -= process_usec; > > - else > > - *sleep_usec = 0; > > - > > - *sleep_usec = PA_MIN(*sleep_usec, underrun_sleep); > > - } else > > - *sleep_usec = 0; > > + *sleep_usec = compute_sleep(u, left_to_play); > > > > return work_done ? 1 : 0; > > } > > @@ -706,7 +710,7 @@ done: > > static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, bool > polled, bool on_timeout) { > > bool work_done = false; > > pa_usec_t max_sleep_usec = 0, process_usec = 0; > > - size_t left_to_play, input_underrun; > > + size_t left_to_play; > > unsigned j = 0; > > > > pa_assert(u); > > @@ -837,22 +841,7 @@ static int unix_write(struct userdata *u, pa_usec_t > *sleep_usec, bool polled, bo > > } > > } > > > > - input_underrun = pa_sink_process_input_underruns(u->sink, > left_to_play); > > - > > - if (u->use_tsched) { > > - pa_usec_t underrun_sleep = > pa_bytes_to_usec_round_up(input_underrun, &u->sink->sample_spec); > > - > > - *sleep_usec = PA_BYTES_TO_USEC(left_to_play, > &u->sink->sample_spec); > > - process_usec = u->tsched_watermark_usec; > > - > > - if (*sleep_usec > process_usec) > > - *sleep_usec -= process_usec; > > - else > > - *sleep_usec = 0; > > - > > - *sleep_usec = PA_MIN(*sleep_usec, underrun_sleep); > > - } else > > - *sleep_usec = 0; > > + *sleep_usec = compute_sleep(u, left_to_play); > > > > return work_done ? 1 : 0; > > } > > diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c > > index f82f811..ac88e4b 100644 > > --- a/src/modules/alsa/alsa-source.c > > +++ b/src/modules/alsa/alsa-source.c > > @@ -477,6 +477,21 @@ static size_t check_left_to_record(struct userdata *u, > size_t n_bytes, bool on_t > > return left_to_record; > > } > > > > +static pa_usec_t compute_sleep(struct userdata *u, size_t left_to_record) { > > + pa_usec_t sleep_usec = 0; > > + > > + if (u->use_tsched) { > > + sleep_usec = PA_BYTES_TO_USEC(left_to_record, > &u->source->sample_spec); > > + > > + if (sleep_usec > u->tsched_watermark_usec) > > + sleep_usec -= u->tsched_watermark_usec; > > + else > > + sleep_usec = 0; > > + } > > + > > + return sleep_usec; > > +} > > + > > static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, bool > polled, bool on_timeout) { > > bool work_done = false; > > pa_usec_t max_sleep_usec = 0, process_usec = 0; > > @@ -625,15 +640,7 @@ static int mmap_read(struct userdata *u, pa_usec_t > *sleep_usec, bool polled, boo > > } > > } > > > > - if (u->use_tsched) { > > - *sleep_usec = PA_BYTES_TO_USEC(left_to_record, > &u->source->sample_spec); > > - process_usec = u->tsched_watermark_usec; > > - > > - if (*sleep_usec > process_usec) > > - *sleep_usec -= process_usec; > > - else > > - *sleep_usec = 0; > > - } > > + *sleep_usec = compute_sleep(u, left_to_record); > > > > return work_done ? 1 : 0; > > } > > @@ -755,15 +762,7 @@ static int unix_read(struct userdata *u, pa_usec_t > *sleep_usec, bool polled, boo > > } > > } > > > > - if (u->use_tsched) { > > - *sleep_usec = PA_BYTES_TO_USEC(left_to_record, > &u->source->sample_spec); > > - process_usec = u->tsched_watermark_usec; > > - > > - if (*sleep_usec > process_usec) > > - *sleep_usec -= process_usec; > > - else > > - *sleep_usec = 0; > > - } > > + *sleep_usec = compute_sleep(u, left_to_record); > > > > return work_done ? 1 : 0; > > } > > > > -- Peter Meerwald +43-664-2444418 (mobile)