From: Peter Meerwald <p.meerwald@xxxxxxxxxxxxxxxxxx> avoids duplicate code in mmap_read/write() and unix_read/write() Signed-off-by: Peter Meerwald <pmeerw at pmeerw.net> --- 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; } -- 1.9.1