Message ID | 20230206185237.8358-3-vr_qemu@t-online.de |
---|---|
State | New |
Headers | show |
Series | audio: improve callback interface for audio frontends | expand |
Hi On Mon, Feb 6, 2023 at 10:52 PM Volker Rümelin <vr_qemu@t-online.de> wrote: > > Read the maximum possible number of audio frames instead of the > minimum necessary number of frames when the audio stream is > downsampled and the output buffer is limited. This makes the > function symmetrical to upsampling when the input buffer is > limited. The maximum possible number of frames is written here. > > With this change it's easier to calculate the exact number of > audio frames the resample function will read or write. These two > functions will be introduced later. > > Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > Signed-off-by: Volker Rümelin <vr_qemu@t-online.de> a bit hard to review, but looks ok Acked-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > audio/rate_template.h | 21 +++++++++++++-------- > 1 file changed, 13 insertions(+), 8 deletions(-) > > diff --git a/audio/rate_template.h b/audio/rate_template.h > index b432719ebb..6648f0d2e5 100644 > --- a/audio/rate_template.h > +++ b/audio/rate_template.h > @@ -40,8 +40,6 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, > int64_t t; > #endif > > - ilast = rate->ilast; > - > istart = ibuf; > iend = ibuf + *isamp; > > @@ -59,15 +57,17 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, > return; > } > > - while (obuf < oend) { > + /* without input samples, there's nothing to do */ > + if (ibuf >= iend) { > + *osamp = 0; > + return; > + } > > - /* Safety catch to make sure we have input samples. */ > - if (ibuf >= iend) { > - break; > - } > + ilast = rate->ilast; > > - /* read as many input samples so that ipos > opos */ > + while (true) { > > + /* read as many input samples so that ipos > opos */ > while (rate->ipos <= (rate->opos >> 32)) { > ilast = *ibuf++; > rate->ipos++; > @@ -78,6 +78,11 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, > } > } > > + /* make sure that the next output sample can be written */ > + if (obuf >= oend) { > + break; > + } > + > icur = *ibuf; > > /* wrap ipos and opos around long before they overflow */ > -- > 2.35.3 > -- Marc-André Lureau
diff --git a/audio/rate_template.h b/audio/rate_template.h index b432719ebb..6648f0d2e5 100644 --- a/audio/rate_template.h +++ b/audio/rate_template.h @@ -40,8 +40,6 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, int64_t t; #endif - ilast = rate->ilast; - istart = ibuf; iend = ibuf + *isamp; @@ -59,15 +57,17 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, return; } - while (obuf < oend) { + /* without input samples, there's nothing to do */ + if (ibuf >= iend) { + *osamp = 0; + return; + } - /* Safety catch to make sure we have input samples. */ - if (ibuf >= iend) { - break; - } + ilast = rate->ilast; - /* read as many input samples so that ipos > opos */ + while (true) { + /* read as many input samples so that ipos > opos */ while (rate->ipos <= (rate->opos >> 32)) { ilast = *ibuf++; rate->ipos++; @@ -78,6 +78,11 @@ void NAME (void *opaque, struct st_sample *ibuf, struct st_sample *obuf, } } + /* make sure that the next output sample can be written */ + if (obuf >= oend) { + break; + } + icur = *ibuf; /* wrap ipos and opos around long before they overflow */