diff mbox series

[v2,14/17] audio: wire up st_rate_frames_out()

Message ID 20230206185237.8358-14-vr_qemu@t-online.de (mailing list archive)
State New, archived
Headers show
Series audio: improve callback interface for audio frontends | expand

Commit Message

Volker Rümelin Feb. 6, 2023, 6:52 p.m. UTC
Wire up the st_rate_frames_out() function and replace
audio_frontend_frames_in() to make audio packet length
calculation exact.

Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
---
 audio/audio.c | 29 ++++++++---------------------
 1 file changed, 8 insertions(+), 21 deletions(-)

Comments

Marc-André Lureau Feb. 22, 2023, 10:50 a.m. UTC | #1
Hi

On Mon, Feb 6, 2023 at 10:53 PM Volker Rümelin <vr_qemu@t-online.de> wrote:
>
> Wire up the st_rate_frames_out() function and replace
> audio_frontend_frames_in() to make audio packet length
> calculation exact.
>
> Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>

Same comments as st_rate_frames_in patches.


> ---
>  audio/audio.c | 29 ++++++++---------------------
>  1 file changed, 8 insertions(+), 21 deletions(-)
>
> diff --git a/audio/audio.c b/audio/audio.c
> index 22c36d6660..dad17e59b8 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -579,7 +579,7 @@ static void audio_pcm_sw_resample_in(SWVoiceIn *sw,
>  static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t buf_len)
>  {
>      HWVoiceIn *hw = sw->hw;
> -    size_t live, frames_out_max, swlim, total_in, total_out;
> +    size_t live, frames_out_max, total_in, total_out;
>
>      live = hw->total_samples_captured - sw->total_hw_samples_acquired;
>      if (!live) {
> @@ -590,12 +590,10 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t buf_len)
>          return 0;
>      }
>
> -    frames_out_max = buf_len / sw->info.bytes_per_frame;
> +    frames_out_max = MIN(buf_len / sw->info.bytes_per_frame,
> +                         sw->resample_buf.size);
>
> -    swlim = (live * sw->ratio) >> 32;
> -    swlim = MIN(swlim, frames_out_max);
> -
> -    audio_pcm_sw_resample_in(sw, live, swlim, &total_in, &total_out);
> +    audio_pcm_sw_resample_in(sw, live, frames_out_max, &total_in, &total_out);
>
>      if (!hw->pcm_ops->volume_in) {
>          mixeng_volume(sw->resample_buf.buffer, total_out, &sw->vol);
> @@ -979,18 +977,6 @@ void AUD_set_active_in (SWVoiceIn *sw, int on)
>      }
>  }
>
> -/**
> - * audio_frontend_frames_in() - returns the number of frames the resampling
> - * code generates from frames_in frames
> - *
> - * @sw: audio recording frontend
> - * @frames_in: number of frames
> - */
> -static size_t audio_frontend_frames_in(SWVoiceIn *sw, size_t frames_in)
> -{
> -    return (int64_t)frames_in * sw->ratio >> 32;
> -}
> -
>  static size_t audio_get_avail (SWVoiceIn *sw)
>  {
>      size_t live;
> @@ -1007,9 +993,9 @@ static size_t audio_get_avail (SWVoiceIn *sw)
>      }
>
>      ldebug (
> -        "%s: get_avail live %zu frontend frames %zu\n",
> +        "%s: get_avail live %zu frontend frames %u\n",
>          SW_NAME (sw),
> -        live, audio_frontend_frames_in(sw, live)
> +        live, st_rate_frames_out(sw->rate, live)
>          );
>
>      return live;
> @@ -1314,8 +1300,9 @@ static void audio_run_in (AudioState *s)
>                  size_t sw_avail = audio_get_avail(sw);
>                  size_t avail;
>
> -                avail = audio_frontend_frames_in(sw, sw_avail);
> +                avail = st_rate_frames_out(sw->rate, sw_avail);
>                  if (avail > 0) {
> +                    avail = MIN(avail, sw->resample_buf.size);
>                      sw->callback.fn(sw->callback.opaque,
>                                      avail * sw->info.bytes_per_frame);
>                  }
> --
> 2.35.3
>


--
Marc-André Lureau
diff mbox series

Patch

diff --git a/audio/audio.c b/audio/audio.c
index 22c36d6660..dad17e59b8 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -579,7 +579,7 @@  static void audio_pcm_sw_resample_in(SWVoiceIn *sw,
 static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t buf_len)
 {
     HWVoiceIn *hw = sw->hw;
-    size_t live, frames_out_max, swlim, total_in, total_out;
+    size_t live, frames_out_max, total_in, total_out;
 
     live = hw->total_samples_captured - sw->total_hw_samples_acquired;
     if (!live) {
@@ -590,12 +590,10 @@  static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t buf_len)
         return 0;
     }
 
-    frames_out_max = buf_len / sw->info.bytes_per_frame;
+    frames_out_max = MIN(buf_len / sw->info.bytes_per_frame,
+                         sw->resample_buf.size);
 
-    swlim = (live * sw->ratio) >> 32;
-    swlim = MIN(swlim, frames_out_max);
-
-    audio_pcm_sw_resample_in(sw, live, swlim, &total_in, &total_out);
+    audio_pcm_sw_resample_in(sw, live, frames_out_max, &total_in, &total_out);
 
     if (!hw->pcm_ops->volume_in) {
         mixeng_volume(sw->resample_buf.buffer, total_out, &sw->vol);
@@ -979,18 +977,6 @@  void AUD_set_active_in (SWVoiceIn *sw, int on)
     }
 }
 
-/**
- * audio_frontend_frames_in() - returns the number of frames the resampling
- * code generates from frames_in frames
- *
- * @sw: audio recording frontend
- * @frames_in: number of frames
- */
-static size_t audio_frontend_frames_in(SWVoiceIn *sw, size_t frames_in)
-{
-    return (int64_t)frames_in * sw->ratio >> 32;
-}
-
 static size_t audio_get_avail (SWVoiceIn *sw)
 {
     size_t live;
@@ -1007,9 +993,9 @@  static size_t audio_get_avail (SWVoiceIn *sw)
     }
 
     ldebug (
-        "%s: get_avail live %zu frontend frames %zu\n",
+        "%s: get_avail live %zu frontend frames %u\n",
         SW_NAME (sw),
-        live, audio_frontend_frames_in(sw, live)
+        live, st_rate_frames_out(sw->rate, live)
         );
 
     return live;
@@ -1314,8 +1300,9 @@  static void audio_run_in (AudioState *s)
                 size_t sw_avail = audio_get_avail(sw);
                 size_t avail;
 
-                avail = audio_frontend_frames_in(sw, sw_avail);
+                avail = st_rate_frames_out(sw->rate, sw_avail);
                 if (avail > 0) {
+                    avail = MIN(avail, sw->resample_buf.size);
                     sw->callback.fn(sw->callback.opaque,
                                     avail * sw->info.bytes_per_frame);
                 }