All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] audio: Mixing engine and mixer emulation
@ 2011-01-03 23:05 Michael Walle
  2011-01-04  0:08 ` [Qemu-devel] " malc
  0 siblings, 1 reply; 11+ messages in thread
From: Michael Walle @ 2011-01-03 23:05 UTC (permalink / raw)
  To: malc; +Cc: qemu-devel


Hi,

the SWVoiceIn volume is never used, although there is AUD_set_volume_in() to 
set it. Would it be possible to add support for it? So we could get the mixer 
emulation for capture devices too?

BTW i see you can only attenuate an audio stream with these volume settings 
(you can only set a max value of 255 and the formula is nominal_value * vol / 
255). Would it be possible to support amplification too?


-- 
 Michael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: audio: Mixing engine and mixer emulation
  2011-01-03 23:05 [Qemu-devel] audio: Mixing engine and mixer emulation Michael Walle
@ 2011-01-04  0:08 ` malc
  2011-01-05  0:05   ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle
  0 siblings, 1 reply; 11+ messages in thread
From: malc @ 2011-01-04  0:08 UTC (permalink / raw)
  To: Michael Walle; +Cc: qemu-devel

On Tue, 4 Jan 2011, Michael Walle wrote:

> 
> Hi,
> 
> the SWVoiceIn volume is never used, although there is AUD_set_volume_in() to 
> set it. Would it be possible to add support for it? So we could get the mixer 
> emulation for capture devices too?
> 
> BTW i see you can only attenuate an audio stream with these volume settings 
> (you can only set a max value of 255 and the formula is nominal_value * vol / 
> 255). Would it be possible to support amplification too?

I've never touched this code since writing it way back then, if you cook
up a patch... (This is a reply to both your questions)

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing
  2011-01-04  0:08 ` [Qemu-devel] " malc
@ 2011-01-05  0:05   ` Michael Walle
  2011-01-10 20:43     ` [Qemu-devel] " Jan Kiszka
  2011-01-12 15:44     ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc
  0 siblings, 2 replies; 11+ messages in thread
From: Michael Walle @ 2011-01-05  0:05 UTC (permalink / raw)
  To: qemu-devel; +Cc: Michael Walle

Refactor the volume mixing, so it can be reused for capturing devices.
Additionally, it removes superfluous multiplications with the nominal
volume within the hardware voice code path.

Signed-off-by: Michael Walle <michael@walle.cc>
---
 audio/alsaaudio.c       |    2 +-
 audio/audio.c           |   11 ++++++-----
 audio/audio_int.h       |    2 +-
 audio/dsoundaudio.c     |    4 ++--
 audio/esdaudio.c        |    3 +--
 audio/fmodaudio.c       |    4 ++--
 audio/mixeng.c          |   25 +++++++++++++++++++++++++
 audio/mixeng.h          |    4 ++--
 audio/mixeng_template.h |   39 +++++++--------------------------------
 audio/ossaudio.c        |    3 +--
 audio/paaudio.c         |    2 +-
 audio/spiceaudio.c      |    5 ++---
 audio/winwaveaudio.c    |    3 +--
 13 files changed, 52 insertions(+), 55 deletions(-)

diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
index fef24f6..301a6af 100644
--- a/audio/alsaaudio.c
+++ b/audio/alsaaudio.c
@@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw)
                 }
             }
 
-            hw->conv (dst, src, nread, &nominal_volume);
+            hw->conv (dst, src, nread);
 
             src = advance (src, nread << hwshift);
             dst += nread;
diff --git a/audio/audio.c b/audio/audio.c
index 1707446..1729c0b 100644
--- a/audio/audio.c
+++ b/audio/audio.c
@@ -104,7 +104,7 @@ static struct {
 
 static AudioState glob_audio_state;
 
-struct mixeng_volume nominal_volume = {
+const struct mixeng_volume nominal_volume = {
     .mute = 0,
 #ifdef FLOAT_MIXENG
     .r = 1.0,
@@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
 /*
  * Capture
  */
-static void noop_conv (struct st_sample *dst, const void *src,
-                       int samples, struct mixeng_volume *vol)
+static void noop_conv (struct st_sample *dst, const void *src, int samples)
 {
     (void) src;
     (void) dst;
     (void) samples;
-    (void) vol;
 }
 
 static CaptureVoiceOut *audio_pcm_capture_find_specific (
@@ -956,6 +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
         total += isamp;
     }
 
+    mixeng_volume (sw->buf, ret, &sw->vol);
+
     sw->clip (buf, sw->buf, ret);
     sw->total_hw_samples_acquired += total;
     return ret << sw->info.shift;
@@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size)
     swlim = ((int64_t) dead << 32) / sw->ratio;
     swlim = audio_MIN (swlim, samples);
     if (swlim) {
-        sw->conv (sw->buf, buf, swlim, &sw->vol);
+        sw->conv (sw->buf, buf, swlim);
+        mixeng_volume (sw->buf, swlim, &sw->vol);
     }
 
     while (swlim) {
diff --git a/audio/audio_int.h b/audio/audio_int.h
index d66f2c3..2003f8b 100644
--- a/audio/audio_int.h
+++ b/audio/audio_int.h
@@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver;
 extern struct audio_driver pa_audio_driver;
 extern struct audio_driver spice_audio_driver;
 extern struct audio_driver winwave_audio_driver;
-extern struct mixeng_volume nominal_volume;
+extern const struct mixeng_volume nominal_volume;
 
 void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
 void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c
index e547955..e2d89fd 100644
--- a/audio/dsoundaudio.c
+++ b/audio/dsoundaudio.c
@@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw)
     decr = len1 + len2;
 
     if (p1 && len1) {
-        hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume);
+        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
     }
 
     if (p2 && len2) {
-        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
+        hw->conv (hw->conv_buf, p2, len2);
     }
 
     dsound_unlock_in (dscb, p1, p2, blen1, blen2);
diff --git a/audio/esdaudio.c b/audio/esdaudio.c
index 9a1f2f8..ff97b39 100644
--- a/audio/esdaudio.c
+++ b/audio/esdaudio.c
@@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg)
                 break;
             }
 
-            hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift,
-                      &nominal_volume);
+            hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift);
             wpos = (wpos + chunk) % hw->samples;
             to_grab -= chunk;
         }
diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c
index 7f08e14..c34cf53 100644
--- a/audio/fmodaudio.c
+++ b/audio/fmodaudio.c
@@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw)
     decr = len1 + len2;
 
     if (p1 && blen1) {
-        hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume);
+        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
     }
     if (p2 && len2) {
-        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
+        hw->conv (hw->conv_buf, p2, len2);
     }
 
     fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2);
diff --git a/audio/mixeng.c b/audio/mixeng.c
index 9f1d93f..4a9e8eb 100644
--- a/audio/mixeng.c
+++ b/audio/mixeng.c
@@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int len)
 {
     memset (buf, 0, len * sizeof (struct st_sample));
 }
+
+void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol)
+{
+#ifdef CONFIG_MIXEMU
+    if (vol->mute) {
+        mixeng_clear (buf, len);
+        return;
+    }
+
+    while (len--) {
+#ifdef FLOAT_MIXENG
+        buf->l = buf->l * vol->l;
+        buf->r = buf->r * vol->r;
+#else
+        buf->l = (buf->l * vol->l) >> 32;
+        buf->r = (buf->r * vol->r) >> 32;
+#endif
+        buf += 1;
+    }
+#else
+    (void) buf;
+    (void) len;
+    (void) vol;
+#endif
+}
diff --git a/audio/mixeng.h b/audio/mixeng.h
index 4af1dd9..9de443b 100644
--- a/audio/mixeng.h
+++ b/audio/mixeng.h
@@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t l; };
 struct st_sample { int64_t l; int64_t r; };
 #endif
 
-typedef void (t_sample) (struct st_sample *dst, const void *src,
-                         int samples, struct mixeng_volume *vol);
+typedef void (t_sample) (struct st_sample *dst, const void *src, int samples);
 typedef void (f_sample) (void *dst, const struct st_sample *src, int samples);
 
 extern t_sample *mixeng_conv[2][2][2][3];
@@ -47,5 +46,6 @@ void st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *o
                        int *isamp, int *osamp);
 void st_rate_stop (void *opaque);
 void mixeng_clear (struct st_sample *buf, int len);
+void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol);
 
 #endif  /* mixeng.h */
diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h
index 5617705..a2d0ef8 100644
--- a/audio/mixeng_template.h
+++ b/audio/mixeng_template.h
@@ -31,16 +31,6 @@
 #define HALF (IN_MAX >> 1)
 #endif
 
-#ifdef CONFIG_MIXEMU
-#ifdef FLOAT_MIXENG
-#define VOL(a, b) ((a) * (b))
-#else
-#define VOL(a, b) ((a) * (b)) >> 32
-#endif
-#else
-#define VOL(a, b) a
-#endif
-
 #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T))
 
 #ifdef FLOAT_MIXENG
@@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v)
 #endif
 
 static void glue (glue (conv_, ET), _to_stereo)
-    (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol)
+    (struct st_sample *dst, const void *src, int samples)
 {
     struct st_sample *out = dst;
     IN_T *in = (IN_T *) src;
-#ifdef CONFIG_MIXEMU
-    if (vol->mute) {
-        mixeng_clear (dst, samples);
-        return;
-    }
-#else
-    (void) vol;
-#endif
+
     while (samples--) {
-        out->l = VOL (glue (conv_, ET) (*in++), vol->l);
-        out->r = VOL (glue (conv_, ET) (*in++), vol->r);
+        out->l = glue (conv_, ET) (*in++);
+        out->r = glue (conv_, ET) (*in++);
         out += 1;
     }
 }
 
 static void glue (glue (conv_, ET), _to_mono)
-    (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol)
+    (struct st_sample *dst, const void *src, int samples)
 {
     struct st_sample *out = dst;
     IN_T *in = (IN_T *) src;
-#ifdef CONFIG_MIXEMU
-    if (vol->mute) {
-        mixeng_clear (dst, samples);
-        return;
-    }
-#else
-    (void) vol;
-#endif
+
     while (samples--) {
-        out->l = VOL (glue (conv_, ET) (in[0]), vol->l);
+        out->l = glue (conv_, ET) (in[0]);
         out->r = out->l;
         out += 1;
         in += 1;
@@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono)
 
 #undef ET
 #undef HALF
-#undef VOL
diff --git a/audio/ossaudio.c b/audio/ossaudio.c
index 0439ef5..1fda519 100644
--- a/audio/ossaudio.c
+++ b/audio/ossaudio.c
@@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw)
                            hw->info.align + 1);
                 }
                 read_samples += nread >> hwshift;
-                hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift,
-                          &nominal_volume);
+                hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift);
             }
 
             if (bufs[i].len - nread) {
diff --git a/audio/paaudio.c b/audio/paaudio.c
index ff71dac..9cf685d 100644
--- a/audio/paaudio.c
+++ b/audio/paaudio.c
@@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg)
                 return NULL;
             }
 
-            hw->conv (hw->conv_buf + wpos, buf, chunk, &nominal_volume);
+            hw->conv (hw->conv_buf + wpos, buf, chunk);
             wpos = (wpos + chunk) % hw->samples;
             to_grab -= chunk;
         }
diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
index 373e4c4..a5c0d6b 100644
--- a/audio/spiceaudio.c
+++ b/audio/spiceaudio.c
@@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw)
         len[1] = 0;
     }
 
-    hw->conv (hw->conv_buf + hw->wpos, samples, len[0], &nominal_volume);
+    hw->conv (hw->conv_buf + hw->wpos, samples, len[0]);
 
     if (len[1]) {
-        hw->conv (hw->conv_buf, samples + len[0], len[1],
-                  &nominal_volume);
+        hw->conv (hw->conv_buf, samples + len[0], len[1]);
     }
 
     hw->wpos = (hw->wpos + num_samples) % hw->samples;
diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c
index cdf483b..e5ad3c6 100644
--- a/audio/winwaveaudio.c
+++ b/audio/winwaveaudio.c
@@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw)
         int conv = audio_MIN (left, decr);
         hw->conv (hw->conv_buf + hw->wpos,
                   advance (wave->pcm_buf, wave->rpos << hw->info.shift),
-                  conv,
-                  &nominal_volume);
+                  conv);
 
         wave->rpos = (wave->rpos + conv) % hw->samples;
         hw->wpos = (hw->wpos + conv) % hw->samples;
-- 
1.7.2.3

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing
  2011-01-05  0:05   ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle
@ 2011-01-10 20:43     ` Jan Kiszka
  2011-01-10 20:52       ` malc
  2011-01-11  6:09       ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang
  2011-01-12 15:44     ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc
  1 sibling, 2 replies; 11+ messages in thread
From: Jan Kiszka @ 2011-01-10 20:43 UTC (permalink / raw)
  To: Michael Walle; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 11821 bytes --]

Am 05.01.2011 01:05, Michael Walle wrote:
> Refactor the volume mixing, so it can be reused for capturing devices.
> Additionally, it removes superfluous multiplications with the nominal
> volume within the hardware voice code path.

At least based on tests done with the Musicpal, I see problems with this
patch, volume control still fine here.

Jan

> 
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
>  audio/alsaaudio.c       |    2 +-
>  audio/audio.c           |   11 ++++++-----
>  audio/audio_int.h       |    2 +-
>  audio/dsoundaudio.c     |    4 ++--
>  audio/esdaudio.c        |    3 +--
>  audio/fmodaudio.c       |    4 ++--
>  audio/mixeng.c          |   25 +++++++++++++++++++++++++
>  audio/mixeng.h          |    4 ++--
>  audio/mixeng_template.h |   39 +++++++--------------------------------
>  audio/ossaudio.c        |    3 +--
>  audio/paaudio.c         |    2 +-
>  audio/spiceaudio.c      |    5 ++---
>  audio/winwaveaudio.c    |    3 +--
>  13 files changed, 52 insertions(+), 55 deletions(-)
> 
> diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
> index fef24f6..301a6af 100644
> --- a/audio/alsaaudio.c
> +++ b/audio/alsaaudio.c
> @@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw)
>                  }
>              }
>  
> -            hw->conv (dst, src, nread, &nominal_volume);
> +            hw->conv (dst, src, nread);
>  
>              src = advance (src, nread << hwshift);
>              dst += nread;
> diff --git a/audio/audio.c b/audio/audio.c
> index 1707446..1729c0b 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -104,7 +104,7 @@ static struct {
>  
>  static AudioState glob_audio_state;
>  
> -struct mixeng_volume nominal_volume = {
> +const struct mixeng_volume nominal_volume = {
>      .mute = 0,
>  #ifdef FLOAT_MIXENG
>      .r = 1.0,
> @@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
>  /*
>   * Capture
>   */
> -static void noop_conv (struct st_sample *dst, const void *src,
> -                       int samples, struct mixeng_volume *vol)
> +static void noop_conv (struct st_sample *dst, const void *src, int samples)
>  {
>      (void) src;
>      (void) dst;
>      (void) samples;
> -    (void) vol;
>  }
>  
>  static CaptureVoiceOut *audio_pcm_capture_find_specific (
> @@ -956,6 +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
>          total += isamp;
>      }
>  
> +    mixeng_volume (sw->buf, ret, &sw->vol);
> +
>      sw->clip (buf, sw->buf, ret);
>      sw->total_hw_samples_acquired += total;
>      return ret << sw->info.shift;
> @@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size)
>      swlim = ((int64_t) dead << 32) / sw->ratio;
>      swlim = audio_MIN (swlim, samples);
>      if (swlim) {
> -        sw->conv (sw->buf, buf, swlim, &sw->vol);
> +        sw->conv (sw->buf, buf, swlim);
> +        mixeng_volume (sw->buf, swlim, &sw->vol);
>      }
>  
>      while (swlim) {
> diff --git a/audio/audio_int.h b/audio/audio_int.h
> index d66f2c3..2003f8b 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver;
>  extern struct audio_driver pa_audio_driver;
>  extern struct audio_driver spice_audio_driver;
>  extern struct audio_driver winwave_audio_driver;
> -extern struct mixeng_volume nominal_volume;
> +extern const struct mixeng_volume nominal_volume;
>  
>  void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as);
>  void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len);
> diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c
> index e547955..e2d89fd 100644
> --- a/audio/dsoundaudio.c
> +++ b/audio/dsoundaudio.c
> @@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw)
>      decr = len1 + len2;
>  
>      if (p1 && len1) {
> -        hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume);
> +        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
>      }
>  
>      if (p2 && len2) {
> -        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
> +        hw->conv (hw->conv_buf, p2, len2);
>      }
>  
>      dsound_unlock_in (dscb, p1, p2, blen1, blen2);
> diff --git a/audio/esdaudio.c b/audio/esdaudio.c
> index 9a1f2f8..ff97b39 100644
> --- a/audio/esdaudio.c
> +++ b/audio/esdaudio.c
> @@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg)
>                  break;
>              }
>  
> -            hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift,
> -                      &nominal_volume);
> +            hw->conv (hw->conv_buf + wpos, buf, nread >> hw->info.shift);
>              wpos = (wpos + chunk) % hw->samples;
>              to_grab -= chunk;
>          }
> diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c
> index 7f08e14..c34cf53 100644
> --- a/audio/fmodaudio.c
> +++ b/audio/fmodaudio.c
> @@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw)
>      decr = len1 + len2;
>  
>      if (p1 && blen1) {
> -        hw->conv (hw->conv_buf + hw->wpos, p1, len1, &nominal_volume);
> +        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
>      }
>      if (p2 && len2) {
> -        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
> +        hw->conv (hw->conv_buf, p2, len2);
>      }
>  
>      fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2);
> diff --git a/audio/mixeng.c b/audio/mixeng.c
> index 9f1d93f..4a9e8eb 100644
> --- a/audio/mixeng.c
> +++ b/audio/mixeng.c
> @@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int len)
>  {
>      memset (buf, 0, len * sizeof (struct st_sample));
>  }
> +
> +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol)
> +{
> +#ifdef CONFIG_MIXEMU
> +    if (vol->mute) {
> +        mixeng_clear (buf, len);
> +        return;
> +    }
> +
> +    while (len--) {
> +#ifdef FLOAT_MIXENG
> +        buf->l = buf->l * vol->l;
> +        buf->r = buf->r * vol->r;
> +#else
> +        buf->l = (buf->l * vol->l) >> 32;
> +        buf->r = (buf->r * vol->r) >> 32;
> +#endif
> +        buf += 1;
> +    }
> +#else
> +    (void) buf;
> +    (void) len;
> +    (void) vol;
> +#endif
> +}
> diff --git a/audio/mixeng.h b/audio/mixeng.h
> index 4af1dd9..9de443b 100644
> --- a/audio/mixeng.h
> +++ b/audio/mixeng.h
> @@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t l; };
>  struct st_sample { int64_t l; int64_t r; };
>  #endif
>  
> -typedef void (t_sample) (struct st_sample *dst, const void *src,
> -                         int samples, struct mixeng_volume *vol);
> +typedef void (t_sample) (struct st_sample *dst, const void *src, int samples);
>  typedef void (f_sample) (void *dst, const struct st_sample *src, int samples);
>  
>  extern t_sample *mixeng_conv[2][2][2][3];
> @@ -47,5 +46,6 @@ void st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct st_sample *o
>                         int *isamp, int *osamp);
>  void st_rate_stop (void *opaque);
>  void mixeng_clear (struct st_sample *buf, int len);
> +void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol);
>  
>  #endif  /* mixeng.h */
> diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h
> index 5617705..a2d0ef8 100644
> --- a/audio/mixeng_template.h
> +++ b/audio/mixeng_template.h
> @@ -31,16 +31,6 @@
>  #define HALF (IN_MAX >> 1)
>  #endif
>  
> -#ifdef CONFIG_MIXEMU
> -#ifdef FLOAT_MIXENG
> -#define VOL(a, b) ((a) * (b))
> -#else
> -#define VOL(a, b) ((a) * (b)) >> 32
> -#endif
> -#else
> -#define VOL(a, b) a
> -#endif
> -
>  #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T))
>  
>  #ifdef FLOAT_MIXENG
> @@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v)
>  #endif
>  
>  static void glue (glue (conv_, ET), _to_stereo)
> -    (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol)
> +    (struct st_sample *dst, const void *src, int samples)
>  {
>      struct st_sample *out = dst;
>      IN_T *in = (IN_T *) src;
> -#ifdef CONFIG_MIXEMU
> -    if (vol->mute) {
> -        mixeng_clear (dst, samples);
> -        return;
> -    }
> -#else
> -    (void) vol;
> -#endif
> +
>      while (samples--) {
> -        out->l = VOL (glue (conv_, ET) (*in++), vol->l);
> -        out->r = VOL (glue (conv_, ET) (*in++), vol->r);
> +        out->l = glue (conv_, ET) (*in++);
> +        out->r = glue (conv_, ET) (*in++);
>          out += 1;
>      }
>  }
>  
>  static void glue (glue (conv_, ET), _to_mono)
> -    (struct st_sample *dst, const void *src, int samples, struct mixeng_volume *vol)
> +    (struct st_sample *dst, const void *src, int samples)
>  {
>      struct st_sample *out = dst;
>      IN_T *in = (IN_T *) src;
> -#ifdef CONFIG_MIXEMU
> -    if (vol->mute) {
> -        mixeng_clear (dst, samples);
> -        return;
> -    }
> -#else
> -    (void) vol;
> -#endif
> +
>      while (samples--) {
> -        out->l = VOL (glue (conv_, ET) (in[0]), vol->l);
> +        out->l = glue (conv_, ET) (in[0]);
>          out->r = out->l;
>          out += 1;
>          in += 1;
> @@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono)
>  
>  #undef ET
>  #undef HALF
> -#undef VOL
> diff --git a/audio/ossaudio.c b/audio/ossaudio.c
> index 0439ef5..1fda519 100644
> --- a/audio/ossaudio.c
> +++ b/audio/ossaudio.c
> @@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw)
>                             hw->info.align + 1);
>                  }
>                  read_samples += nread >> hwshift;
> -                hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift,
> -                          &nominal_volume);
> +                hw->conv (hw->conv_buf + bufs[i].add, p, nread >> hwshift);
>              }
>  
>              if (bufs[i].len - nread) {
> diff --git a/audio/paaudio.c b/audio/paaudio.c
> index ff71dac..9cf685d 100644
> --- a/audio/paaudio.c
> +++ b/audio/paaudio.c
> @@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg)
>                  return NULL;
>              }
>  
> -            hw->conv (hw->conv_buf + wpos, buf, chunk, &nominal_volume);
> +            hw->conv (hw->conv_buf + wpos, buf, chunk);
>              wpos = (wpos + chunk) % hw->samples;
>              to_grab -= chunk;
>          }
> diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
> index 373e4c4..a5c0d6b 100644
> --- a/audio/spiceaudio.c
> +++ b/audio/spiceaudio.c
> @@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw)
>          len[1] = 0;
>      }
>  
> -    hw->conv (hw->conv_buf + hw->wpos, samples, len[0], &nominal_volume);
> +    hw->conv (hw->conv_buf + hw->wpos, samples, len[0]);
>  
>      if (len[1]) {
> -        hw->conv (hw->conv_buf, samples + len[0], len[1],
> -                  &nominal_volume);
> +        hw->conv (hw->conv_buf, samples + len[0], len[1]);
>      }
>  
>      hw->wpos = (hw->wpos + num_samples) % hw->samples;
> diff --git a/audio/winwaveaudio.c b/audio/winwaveaudio.c
> index cdf483b..e5ad3c6 100644
> --- a/audio/winwaveaudio.c
> +++ b/audio/winwaveaudio.c
> @@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw)
>          int conv = audio_MIN (left, decr);
>          hw->conv (hw->conv_buf + hw->wpos,
>                    advance (wave->pcm_buf, wave->rpos << hw->info.shift),
> -                  conv,
> -                  &nominal_volume);
> +                  conv);
>  
>          wave->rpos = (wave->rpos + conv) % hw->samples;
>          hw->wpos = (hw->wpos + conv) % hw->samples;


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing
  2011-01-10 20:43     ` [Qemu-devel] " Jan Kiszka
@ 2011-01-10 20:52       ` malc
  2011-01-10 20:54         ` Jan Kiszka
  2011-01-11  6:09       ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang
  1 sibling, 1 reply; 11+ messages in thread
From: malc @ 2011-01-10 20:52 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Michael Walle, qemu-devel

On Mon, 10 Jan 2011, Jan Kiszka wrote:

> Am 05.01.2011 01:05, Michael Walle wrote:
> > Refactor the volume mixing, so it can be reused for capturing devices.
> > Additionally, it removes superfluous multiplications with the nominal
> > volume within the hardware voice code path.
> 
> At least based on tests done with the Musicpal, I see problems with this
> patch, volume control still fine here.

"I see problems" or "I see _no_ problems".

[..snip..]

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing
  2011-01-10 20:52       ` malc
@ 2011-01-10 20:54         ` Jan Kiszka
  0 siblings, 0 replies; 11+ messages in thread
From: Jan Kiszka @ 2011-01-10 20:54 UTC (permalink / raw)
  To: malc; +Cc: Michael Walle, qemu-devel

[-- Attachment #1: Type: text/plain, Size: 543 bytes --]

Am 10.01.2011 21:52, malc wrote:
> On Mon, 10 Jan 2011, Jan Kiszka wrote:
> 
>> Am 05.01.2011 01:05, Michael Walle wrote:
>>> Refactor the volume mixing, so it can be reused for capturing devices.
>>> Additionally, it removes superfluous multiplications with the nominal
>>> volume within the hardware voice code path.
>>
>> At least based on tests done with the Musicpal, I see problems with this
>> patch, volume control still fine here.
> 
> "I see problems" or "I see _no_ problems".

Sorry, "no problem" of course.

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* RE: [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing
  2011-01-10 20:43     ` [Qemu-devel] " Jan Kiszka
  2011-01-10 20:52       ` malc
@ 2011-01-11  6:09       ` Schildbach, Wolfgang
  2011-01-11 22:50         ` Michael Walle
  1 sibling, 1 reply; 11+ messages in thread
From: Schildbach, Wolfgang @ 2011-01-11  6:09 UTC (permalink / raw)
  To: Jan Kiszka, Michael Walle; +Cc: qemu-devel

The fixed point path for scaling in mixeng_volume() seems to be under by
a factor of two, IMHO. The right shift should be by 31, not 32. (Because
the volume, which I assume is a signed 32 bit integer, can be 0.5 at
most).

Does the code work with FLOAT_MIXENG undefined?

- Wolfgang Schildbach


-----Original Message-----
From: qemu-devel-bounces+wschi=dolby.com@nongnu.org
[mailto:qemu-devel-bounces+wschi=dolby.com@nongnu.org] On Behalf Of Jan
Kiszka
Sent: Monday, January 10, 2011 9:44 PM
To: Michael Walle
Cc: qemu-devel@nongnu.org
Subject: [Qemu-devel] Re: [PATCH] audio: split sample conversion and
volumemixing

Am 05.01.2011 01:05, Michael Walle wrote:
> Refactor the volume mixing, so it can be reused for capturing devices.
> Additionally, it removes superfluous multiplications with the nominal 
> volume within the hardware voice code path.

At least based on tests done with the Musicpal, I see problems with this
patch, volume control still fine here.

Jan

> 
> Signed-off-by: Michael Walle <michael@walle.cc>
> ---
>  audio/alsaaudio.c       |    2 +-
>  audio/audio.c           |   11 ++++++-----
>  audio/audio_int.h       |    2 +-
>  audio/dsoundaudio.c     |    4 ++--
>  audio/esdaudio.c        |    3 +--
>  audio/fmodaudio.c       |    4 ++--
>  audio/mixeng.c          |   25 +++++++++++++++++++++++++
>  audio/mixeng.h          |    4 ++--
>  audio/mixeng_template.h |   39
+++++++--------------------------------
>  audio/ossaudio.c        |    3 +--
>  audio/paaudio.c         |    2 +-
>  audio/spiceaudio.c      |    5 ++---
>  audio/winwaveaudio.c    |    3 +--
>  13 files changed, 52 insertions(+), 55 deletions(-)
> 
> diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 
> fef24f6..301a6af 100644
> --- a/audio/alsaaudio.c
> +++ b/audio/alsaaudio.c
> @@ -1094,7 +1094,7 @@ static int alsa_run_in (HWVoiceIn *hw)
>                  }
>              }
>  
> -            hw->conv (dst, src, nread, &nominal_volume);
> +            hw->conv (dst, src, nread);
>  
>              src = advance (src, nread << hwshift);
>              dst += nread;
> diff --git a/audio/audio.c b/audio/audio.c index 1707446..1729c0b 
> 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -104,7 +104,7 @@ static struct {
>  
>  static AudioState glob_audio_state;
>  
> -struct mixeng_volume nominal_volume = {
> +const struct mixeng_volume nominal_volume = {
>      .mute = 0,
>  #ifdef FLOAT_MIXENG
>      .r = 1.0,
> @@ -702,13 +702,11 @@ void audio_pcm_info_clear_buf (struct 
> audio_pcm_info *info, void *buf, int len)
>  /*
>   * Capture
>   */
> -static void noop_conv (struct st_sample *dst, const void *src,
> -                       int samples, struct mixeng_volume *vol)
> +static void noop_conv (struct st_sample *dst, const void *src, int 
> +samples)
>  {
>      (void) src;
>      (void) dst;
>      (void) samples;
> -    (void) vol;
>  }
>  
>  static CaptureVoiceOut *audio_pcm_capture_find_specific ( @@ -956,6 
> +954,8 @@ int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
>          total += isamp;
>      }
>  
> +    mixeng_volume (sw->buf, ret, &sw->vol);
> +
>      sw->clip (buf, sw->buf, ret);
>      sw->total_hw_samples_acquired += total;
>      return ret << sw->info.shift;
> @@ -1037,7 +1037,8 @@ int audio_pcm_sw_write (SWVoiceOut *sw, void
*buf, int size)
>      swlim = ((int64_t) dead << 32) / sw->ratio;
>      swlim = audio_MIN (swlim, samples);
>      if (swlim) {
> -        sw->conv (sw->buf, buf, swlim, &sw->vol);
> +        sw->conv (sw->buf, buf, swlim);
> +        mixeng_volume (sw->buf, swlim, &sw->vol);
>      }
>  
>      while (swlim) {
> diff --git a/audio/audio_int.h b/audio/audio_int.h index 
> d66f2c3..2003f8b 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -211,7 +211,7 @@ extern struct audio_driver esd_audio_driver;  
> extern struct audio_driver pa_audio_driver;  extern struct 
> audio_driver spice_audio_driver;  extern struct audio_driver 
> winwave_audio_driver; -extern struct mixeng_volume nominal_volume;
> +extern const struct mixeng_volume nominal_volume;
>  
>  void audio_pcm_init_info (struct audio_pcm_info *info, struct 
> audsettings *as);  void audio_pcm_info_clear_buf (struct 
> audio_pcm_info *info, void *buf, int len); diff --git 
> a/audio/dsoundaudio.c b/audio/dsoundaudio.c index e547955..e2d89fd 
> 100644
> --- a/audio/dsoundaudio.c
> +++ b/audio/dsoundaudio.c
> @@ -831,11 +831,11 @@ static int dsound_run_in (HWVoiceIn *hw)
>      decr = len1 + len2;
>  
>      if (p1 && len1) {
> -        hw->conv (hw->conv_buf + hw->wpos, p1, len1,
&nominal_volume);
> +        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
>      }
>  
>      if (p2 && len2) {
> -        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
> +        hw->conv (hw->conv_buf, p2, len2);
>      }
>  
>      dsound_unlock_in (dscb, p1, p2, blen1, blen2); diff --git 
> a/audio/esdaudio.c b/audio/esdaudio.c index 9a1f2f8..ff97b39 100644
> --- a/audio/esdaudio.c
> +++ b/audio/esdaudio.c
> @@ -346,8 +346,7 @@ static void *qesd_thread_in (void *arg)
>                  break;
>              }
>  
> -            hw->conv (hw->conv_buf + wpos, buf, nread >>
hw->info.shift,
> -                      &nominal_volume);
> +            hw->conv (hw->conv_buf + wpos, buf, nread >> 
> + hw->info.shift);
>              wpos = (wpos + chunk) % hw->samples;
>              to_grab -= chunk;
>          }
> diff --git a/audio/fmodaudio.c b/audio/fmodaudio.c index 
> 7f08e14..c34cf53 100644
> --- a/audio/fmodaudio.c
> +++ b/audio/fmodaudio.c
> @@ -488,10 +488,10 @@ static int fmod_run_in (HWVoiceIn *hw)
>      decr = len1 + len2;
>  
>      if (p1 && blen1) {
> -        hw->conv (hw->conv_buf + hw->wpos, p1, len1,
&nominal_volume);
> +        hw->conv (hw->conv_buf + hw->wpos, p1, len1);
>      }
>      if (p2 && len2) {
> -        hw->conv (hw->conv_buf, p2, len2, &nominal_volume);
> +        hw->conv (hw->conv_buf, p2, len2);
>      }
>  
>      fmod_unlock_sample (fmd->fmod_sample, p1, p2, blen1, blen2); diff

> --git a/audio/mixeng.c b/audio/mixeng.c index 9f1d93f..4a9e8eb 100644
> --- a/audio/mixeng.c
> +++ b/audio/mixeng.c
> @@ -333,3 +333,28 @@ void mixeng_clear (struct st_sample *buf, int 
> len)  {
>      memset (buf, 0, len * sizeof (struct st_sample));  }
> +
> +void mixeng_volume (struct st_sample *buf, int len, struct 
> +mixeng_volume *vol) { #ifdef CONFIG_MIXEMU
> +    if (vol->mute) {
> +        mixeng_clear (buf, len);
> +        return;
> +    }
> +
> +    while (len--) {
> +#ifdef FLOAT_MIXENG
> +        buf->l = buf->l * vol->l;
> +        buf->r = buf->r * vol->r;
> +#else
> +        buf->l = (buf->l * vol->l) >> 32;
> +        buf->r = (buf->r * vol->r) >> 32; #endif
> +        buf += 1;
> +    }
> +#else
> +    (void) buf;
> +    (void) len;
> +    (void) vol;
> +#endif
> +}
> diff --git a/audio/mixeng.h b/audio/mixeng.h index 4af1dd9..9de443b 
> 100644
> --- a/audio/mixeng.h
> +++ b/audio/mixeng.h
> @@ -33,8 +33,7 @@ struct mixeng_volume { int mute; int64_t r; int64_t 
> l; };  struct st_sample { int64_t l; int64_t r; };  #endif
>  
> -typedef void (t_sample) (struct st_sample *dst, const void *src,
> -                         int samples, struct mixeng_volume *vol);
> +typedef void (t_sample) (struct st_sample *dst, const void *src, int 
> +samples);
>  typedef void (f_sample) (void *dst, const struct st_sample *src, int 
> samples);
>  
>  extern t_sample *mixeng_conv[2][2][2][3]; @@ -47,5 +46,6 @@ void 
> st_rate_flow_mix (void *opaque, struct st_sample *ibuf, struct
st_sample *o
>                         int *isamp, int *osamp);  void st_rate_stop 
> (void *opaque);  void mixeng_clear (struct st_sample *buf, int len);
> +void mixeng_volume (struct st_sample *buf, int len, struct 
> +mixeng_volume *vol);
>  
>  #endif  /* mixeng.h */
> diff --git a/audio/mixeng_template.h b/audio/mixeng_template.h index 
> 5617705..a2d0ef8 100644
> --- a/audio/mixeng_template.h
> +++ b/audio/mixeng_template.h
> @@ -31,16 +31,6 @@
>  #define HALF (IN_MAX >> 1)
>  #endif
>  
> -#ifdef CONFIG_MIXEMU
> -#ifdef FLOAT_MIXENG
> -#define VOL(a, b) ((a) * (b))
> -#else
> -#define VOL(a, b) ((a) * (b)) >> 32
> -#endif
> -#else
> -#define VOL(a, b) a
> -#endif
> -
>  #define ET glue (ENDIAN_CONVERSION, glue (_, IN_T))
>  
>  #ifdef FLOAT_MIXENG
> @@ -109,40 +99,26 @@ static inline IN_T glue (clip_, ET) (int64_t v)  
> #endif
>  
>  static void glue (glue (conv_, ET), _to_stereo)
> -    (struct st_sample *dst, const void *src, int samples, struct
mixeng_volume *vol)
> +    (struct st_sample *dst, const void *src, int samples)
>  {
>      struct st_sample *out = dst;
>      IN_T *in = (IN_T *) src;
> -#ifdef CONFIG_MIXEMU
> -    if (vol->mute) {
> -        mixeng_clear (dst, samples);
> -        return;
> -    }
> -#else
> -    (void) vol;
> -#endif
> +
>      while (samples--) {
> -        out->l = VOL (glue (conv_, ET) (*in++), vol->l);
> -        out->r = VOL (glue (conv_, ET) (*in++), vol->r);
> +        out->l = glue (conv_, ET) (*in++);
> +        out->r = glue (conv_, ET) (*in++);
>          out += 1;
>      }
>  }
>  
>  static void glue (glue (conv_, ET), _to_mono)
> -    (struct st_sample *dst, const void *src, int samples, struct
mixeng_volume *vol)
> +    (struct st_sample *dst, const void *src, int samples)
>  {
>      struct st_sample *out = dst;
>      IN_T *in = (IN_T *) src;
> -#ifdef CONFIG_MIXEMU
> -    if (vol->mute) {
> -        mixeng_clear (dst, samples);
> -        return;
> -    }
> -#else
> -    (void) vol;
> -#endif
> +
>      while (samples--) {
> -        out->l = VOL (glue (conv_, ET) (in[0]), vol->l);
> +        out->l = glue (conv_, ET) (in[0]);
>          out->r = out->l;
>          out += 1;
>          in += 1;
> @@ -174,4 +150,3 @@ static void glue (glue (clip_, ET), _from_mono)
>  
>  #undef ET
>  #undef HALF
> -#undef VOL
> diff --git a/audio/ossaudio.c b/audio/ossaudio.c index 
> 0439ef5..1fda519 100644
> --- a/audio/ossaudio.c
> +++ b/audio/ossaudio.c
> @@ -784,8 +784,7 @@ static int oss_run_in (HWVoiceIn *hw)
>                             hw->info.align + 1);
>                  }
>                  read_samples += nread >> hwshift;
> -                hw->conv (hw->conv_buf + bufs[i].add, p, nread >>
hwshift,
> -                          &nominal_volume);
> +                hw->conv (hw->conv_buf + bufs[i].add, p, nread >> 
> + hwshift);
>              }
>  
>              if (bufs[i].len - nread) { diff --git a/audio/paaudio.c 
> b/audio/paaudio.c index ff71dac..9cf685d 100644
> --- a/audio/paaudio.c
> +++ b/audio/paaudio.c
> @@ -195,7 +195,7 @@ static void *qpa_thread_in (void *arg)
>                  return NULL;
>              }
>  
> -            hw->conv (hw->conv_buf + wpos, buf, chunk,
&nominal_volume);
> +            hw->conv (hw->conv_buf + wpos, buf, chunk);
>              wpos = (wpos + chunk) % hw->samples;
>              to_grab -= chunk;
>          }
> diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c index 
> 373e4c4..a5c0d6b 100644
> --- a/audio/spiceaudio.c
> +++ b/audio/spiceaudio.c
> @@ -268,11 +268,10 @@ static int line_in_run (HWVoiceIn *hw)
>          len[1] = 0;
>      }
>  
> -    hw->conv (hw->conv_buf + hw->wpos, samples, len[0],
&nominal_volume);
> +    hw->conv (hw->conv_buf + hw->wpos, samples, len[0]);
>  
>      if (len[1]) {
> -        hw->conv (hw->conv_buf, samples + len[0], len[1],
> -                  &nominal_volume);
> +        hw->conv (hw->conv_buf, samples + len[0], len[1]);
>      }
>  
>      hw->wpos = (hw->wpos + num_samples) % hw->samples; diff --git 
> a/audio/winwaveaudio.c b/audio/winwaveaudio.c index cdf483b..e5ad3c6 
> 100644
> --- a/audio/winwaveaudio.c
> +++ b/audio/winwaveaudio.c
> @@ -581,8 +581,7 @@ static int winwave_run_in (HWVoiceIn *hw)
>          int conv = audio_MIN (left, decr);
>          hw->conv (hw->conv_buf + hw->wpos,
>                    advance (wave->pcm_buf, wave->rpos <<
hw->info.shift),
> -                  conv,
> -                  &nominal_volume);
> +                  conv);
>  
>          wave->rpos = (wave->rpos + conv) % hw->samples;
>          hw->wpos = (hw->wpos + conv) % hw->samples;

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing
  2011-01-11  6:09       ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang
@ 2011-01-11 22:50         ` Michael Walle
  2011-01-11 23:15           ` malc
  0 siblings, 1 reply; 11+ messages in thread
From: Michael Walle @ 2011-01-11 22:50 UTC (permalink / raw)
  To: Schildbach, Wolfgang; +Cc: Jan Kiszka, qemu-devel


Hi Wolfgang,

> The fixed point path for scaling in mixeng_volume() seems to be under by
> a factor of two, IMHO. The right shift should be by 31, not 32. (Because
> the volume, which I assume is a signed 32 bit integer, can be 0.5 at
> most).
I must admit i just copied the shift from the original define. But the volume 
and the samples are signed 64bit values.

@malc: any comments on this?

> Does the code work with FLOAT_MIXENG undefined?
At least for my input voice, it works with integer arithmetic. 

-- 
  Michael

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing
  2011-01-11 22:50         ` Michael Walle
@ 2011-01-11 23:15           ` malc
  2011-01-12  8:24             ` [Qemu-devel] " Schildbach, Wolfgang
  0 siblings, 1 reply; 11+ messages in thread
From: malc @ 2011-01-11 23:15 UTC (permalink / raw)
  To: Michael Walle; +Cc: Jan Kiszka, Schildbach, Wolfgang, qemu-devel

On Tue, 11 Jan 2011, Michael Walle wrote:

> 
> Hi Wolfgang,
> 
> > The fixed point path for scaling in mixeng_volume() seems to be under by
> > a factor of two, IMHO. The right shift should be by 31, not 32. (Because
> > the volume, which I assume is a signed 32 bit integer, can be 0.5 at
> > most).
> I must admit i just copied the shift from the original define. But the volume 
> and the samples are signed 64bit values.
> 
> @malc: any comments on this?

I don't understand the problem, the result of multiplication is converted
from 32.32 fixed point to integer by shifting right by 32.. It escapes me
how 31 fits here.

> 
> > Does the code work with FLOAT_MIXENG undefined?
> At least for my input voice, it works with integer arithmetic. 
> 
> 

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] RE: [PATCH] audio: split sample conversion and volumemixing
  2011-01-11 23:15           ` malc
@ 2011-01-12  8:24             ` Schildbach, Wolfgang
  0 siblings, 0 replies; 11+ messages in thread
From: Schildbach, Wolfgang @ 2011-01-12  8:24 UTC (permalink / raw)
  To: malc, Michael Walle; +Cc: Jan Kiszka, qemu-devel

Ah, I assumed that the volume would be stored in a 32 bit integer, and
be represented as a signed Q31 fixed point. Sorry for the noise.

- Wolfgang


-----Original Message-----
From: malc [mailto:av1474@comtv.ru] 
Sent: Wednesday, January 12, 2011 12:15 AM
To: Michael Walle
Cc: Schildbach, Wolfgang; Jan Kiszka; qemu-devel@nongnu.org
Subject: Re: [PATCH] audio: split sample conversion and volumemixing

On Tue, 11 Jan 2011, Michael Walle wrote:

> 
> Hi Wolfgang,
> 
> > The fixed point path for scaling in mixeng_volume() seems to be 
> > under by a factor of two, IMHO. The right shift should be by 31, not

> > 32. (Because the volume, which I assume is a signed 32 bit integer, 
> > can be 0.5 at most).
> I must admit i just copied the shift from the original define. But the

> volume and the samples are signed 64bit values.
> 
> @malc: any comments on this?

I don't understand the problem, the result of multiplication is
converted from 32.32 fixed point to integer by shifting right by 32.. It
escapes me how 31 fits here.

> 
> > Does the code work with FLOAT_MIXENG undefined?
> At least for my input voice, it works with integer arithmetic. 
> 
> 

--
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing
  2011-01-05  0:05   ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle
  2011-01-10 20:43     ` [Qemu-devel] " Jan Kiszka
@ 2011-01-12 15:44     ` malc
  1 sibling, 0 replies; 11+ messages in thread
From: malc @ 2011-01-12 15:44 UTC (permalink / raw)
  To: Michael Walle; +Cc: qemu-devel

On Wed, 5 Jan 2011, Michael Walle wrote:

> Refactor the volume mixing, so it can be reused for capturing devices.
> Additionally, it removes superfluous multiplications with the nominal
> volume within the hardware voice code path.

Thanks, applied.

[..snip..]

-- 
mailto:av1474@comtv.ru

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2011-01-12 15:44 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-03 23:05 [Qemu-devel] audio: Mixing engine and mixer emulation Michael Walle
2011-01-04  0:08 ` [Qemu-devel] " malc
2011-01-05  0:05   ` [Qemu-devel] [PATCH] audio: split sample conversion and volume mixing Michael Walle
2011-01-10 20:43     ` [Qemu-devel] " Jan Kiszka
2011-01-10 20:52       ` malc
2011-01-10 20:54         ` Jan Kiszka
2011-01-11  6:09       ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volumemixing Schildbach, Wolfgang
2011-01-11 22:50         ` Michael Walle
2011-01-11 23:15           ` malc
2011-01-12  8:24             ` [Qemu-devel] " Schildbach, Wolfgang
2011-01-12 15:44     ` [Qemu-devel] Re: [PATCH] audio: split sample conversion and volume mixing malc

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.