On Fri, Sep 23, 2022 at 10:43 PM Volker Rümelin <vr_qemu@t-online.de> wrote:
> The next patch needs two new rate control functions. The first
> one returns the bytes needed at call time to maintain the
> selected rate. The second one adjusts the bytes actually sent.
>
> Split the audio_rate_get_bytes() function into these two
> functions and reintroduce audio_rate_get_bytes().
>
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
> audio/audio.c | 35 ++++++++++++++++++++++++-----------
> audio/audio_int.h | 2 ++
> 2 files changed, 26 insertions(+), 11 deletions(-)
>
> diff --git a/audio/audio.c b/audio/audio.c
> index 9e55834909..557538a7b7 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -2250,26 +2250,39 @@ void audio_rate_start(RateCtl *rate)
> rate->start_ticks = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
> }
>
> -size_t audio_rate_get_bytes(struct audio_pcm_info *info, RateCtl *rate,
> - size_t bytes_avail)
> +size_t audio_rate_peek_bytes(RateCtl *rate, struct audio_pcm_info *info)
> {
> int64_t now;
> int64_t ticks;
> int64_t bytes;
> - int64_t samples;
> - size_t ret;
> + int64_t frames;
>
> now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
> ticks = now - rate->start_ticks;
> bytes = muldiv64(ticks, info->bytes_per_second,
> NANOSECONDS_PER_SECOND);
> - samples = (bytes - rate->bytes_sent) / info->bytes_per_frame;
> - if (samples < 0 || samples > 65536) {
> - AUD_log(NULL, "Resetting rate control (%" PRId64 " samples)\n",
> samples);
> + frames = (bytes - rate->bytes_sent) / info->bytes_per_frame;
> + if (frames < 0 || frames > 65536) {
> + AUD_log(NULL, "Resetting rate control (%" PRId64 " frames)\n",
> frames);
> audio_rate_start(rate);
> - samples = 0;
> + frames = 0;
> }
>
> - ret = MIN(samples * info->bytes_per_frame, bytes_avail);
> - rate->bytes_sent += ret;
> - return ret;
> + return frames * info->bytes_per_frame;
> +}
> +
> +void audio_rate_add_bytes(RateCtl *rate, size_t bytes_used)
> +{
> + rate->bytes_sent += bytes_used;
> +}
> +
> +size_t audio_rate_get_bytes(struct audio_pcm_info *info, RateCtl *rate,
> + size_t bytes_avail)
> +{
> + size_t bytes;
> +
> + bytes = audio_rate_peek_bytes(rate, info);
> + bytes = MIN(bytes, bytes_avail);
> + audio_rate_add_bytes(rate, bytes);
> +
> + return bytes;
> }
> diff --git a/audio/audio_int.h b/audio/audio_int.h
> index 2a6914d2aa..97e20e8429 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -263,6 +263,8 @@ typedef struct RateCtl {
> } RateCtl;
>
> void audio_rate_start(RateCtl *rate);
> +size_t audio_rate_peek_bytes(RateCtl *rate, struct audio_pcm_info *info);
> +void audio_rate_add_bytes(RateCtl *rate, size_t bytes_used);
> size_t audio_rate_get_bytes(struct audio_pcm_info *info, RateCtl *rate,
> size_t bytes_avail);
>
> --
> 2.35.3
>
>
>
--
Marc-André Lureau