On Fri, Sep 23, 2022 at 10:43 PM Volker Rümelin 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 > Reviewed-by: Marc-André Lureau > --- > 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