diff mbox series

[v2,03/17] audio: make the resampling code greedy

Message ID 20230206185237.8358-3-vr_qemu@t-online.de
State New
Headers show
Series audio: improve callback interface for audio frontends | expand

Commit Message

Volker Rümelin Feb. 6, 2023, 6:52 p.m. UTC
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>
---
 audio/rate_template.h | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

Comments

Marc-André Lureau Feb. 22, 2023, 10:49 a.m. UTC | #1
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 mbox series

Patch

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 */